int scene::load(char *p_dir, char *p_file, SCENE_TYPE type) { int ret = 0; switch(type) { case SCENE_B2M: ret = load_b2m(p_dir,p_file); break; case SCENE_3DS: ret = load_3ds(p_dir,p_file); break; case SCENE_TXT: ret = load_txt(p_dir,p_file); break; } load_insert(); return(ret); }
/* init */ int init(void) { int i,num_vertex,width,height; float *vertex; unsigned char *data; float rmax; vec3 min,max; vec4 plane_s = { 1.0, 0.0, 0.0, 0.0 }; vec4 plane_t = { 0.0, 1.0, 0.0, 0.0 }; vec4 plane_r = { 0.0, 0.0, 1.0, 0.0 }; vec4 plane_q = { 0.0, 0.0, 0.0, 1.0 }; GLenum err; err = glewInit(); if (GLEW_OK != err) { fprintf(stderr, "glewInit() error: %s\n", glewGetErrorString(err)); } glClearDepth(1); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_LIGHT0); glPointSize(4); glTexGenfv(GL_S,GL_EYE_PLANE,plane_s); glTexGenfv(GL_T,GL_EYE_PLANE,plane_t); glTexGenfv(GL_R,GL_EYE_PLANE,plane_r); glTexGenfv(GL_Q,GL_EYE_PLANE,plane_q); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); glTexGeni(GL_Q,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,SIZE,SIZE,0,GL_RGB, GL_UNSIGNED_BYTE,NULL); glGenTextures(1,&texture_id); glBindTexture(GL_TEXTURE_2D,texture_id); if((data = load_jpeg("data/ground.jpg",&width,&height))) { glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D,4,width,height,GL_RGBA, GL_UNSIGNED_BYTE,data); free(data); } vertex = load_3ds("data/mesh.3ds",&num_vertex); if(!vertex) return -1; v_set(999999,999999,999999,min); v_set(-999999,-999999,-999999,max); for(i = 0; i < num_vertex; i++) { int j; float *v = &vertex[i << 3]; for(j = 0; j < 3; j++) { if(min[j] > v[j]) min[j] = v[j]; if(max[j] < v[j]) max[j] = v[j]; } } v_add(min,max,min); v_scale(min,0.5,min); for(i = 0; i < num_vertex; i++) { v_sub(&vertex[i << 3],min,&vertex[i << 3]); } for(i = 0, rmax = 0; i < num_vertex; i++) { float r = sqrt(v_dot(&vertex[i << 3],&vertex[i << 3])); if(r > rmax) rmax = r; } rmax = 0.8 / rmax; for(i = 0; i < num_vertex; i++) { v_scale(&vertex[i << 3],rmax,&vertex[i << 3]); } mesh_id = glGenLists(1); glNewList(mesh_id,GL_COMPILE); glBegin(GL_TRIANGLES); for(i = 0; i < num_vertex; i++) { glNormal3fv((float*)&vertex[i << 3] + 3); glVertex3fv((float*)&vertex[i << 3]); } glEnd(); glEndList(); vertex = load_3ds("data/ground.3ds",&num_vertex); if(!vertex) return -1; ground_id = glGenLists(1); glNewList(ground_id,GL_COMPILE); glBegin(GL_TRIANGLES); for(i = 0; i < num_vertex; i++) { glTexCoord2fv((float*)&vertex[i << 3] + 6); glNormal3fv((float*)&vertex[i << 3] + 3); glVertex3fv((float*)&vertex[i << 3]); } glEnd(); glEndList(); image = malloc(SIZE * SIZE * 4); return 0; }
LRESULT CALLBACK winproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { MENUITEMINFO mii; HMENU hMenu = GetMenu(hWnd); OPENFILENAME ofn; char path[MAX_PATH]; HCURSOR hcur; switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case ID_MENU_FILE_OPEN: // wczytywanie pliku memset(&ofn, 0, sizeof(ofn)); memset(path, 0, MAX_PATH); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = path; ofn.nMaxFile = MAX_PATH; ofn.lpstrFilter = "3D Studio R4 (*.3ds)\0*.3ds\0\0"; ofn.lpstrTitle = NULL; ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; ofn.lpstrInitialDir = ".\\"; if (::GetOpenFileName(&ofn)) { CLoader3DS load_3ds(g_Scene); hcur = ::SetCursor(LoadCursor(NULL, IDC_WAIT)); load_3ds.Load(path); if (!g_Scene.SetActiveCamera("Camera01")) g_Scene.SetFirstCamera(); ::SetCursor(hcur); /// ustaw odpowiednio menu systemowe: ::ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_STATE; mii.fState = MFS_ENABLED; ::SetMenuItemInfo(hMenu, ID_MENU_VIEW_ANIMATION, FALSE, &mii); ::SetMenuItemInfo(hMenu, ID_MENU_FILE_CLOSE, FALSE, &mii); /// dopisz do titlebar'u nazwê otwartego pliku: char *foo = new char [strlen(g_lpszNoFileProgName) + strlen(path + ofn.nFileOffset) + 4]; strcpy(foo, g_lpszNoFileProgName); strcat(foo, " - "); strcat(foo, path + ofn.nFileOffset); DELETE_ARRAY(g_lpszProgName); g_lpszProgName = foo; ::SetWindowText(hWnd, g_lpszProgName); /// tutaj poœrednio ustawienie odpowiednie nazwu dla okienka z animacj¹: DELETE_ARRAY(g_WindowParams.szTitle); g_WindowParams.szTitle = strdup(path + ofn.nFileOffset); } break; case ID_MENU_FILE_CLOSE: { g_Scene.Release(); /// wygaœ odpowiednie opcje w menu: ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_STATE; mii.fState = MFS_GRAYED; ::SetMenuItemInfo(hMenu, ID_MENU_VIEW_ANIMATION, FALSE, &mii); ::SetMenuItemInfo(hMenu, ID_MENU_FILE_CLOSE, FALSE, &mii); /// umieœæ w titlebarze sam¹ nazwê aplikacji: DELETE_ARRAY(g_lpszProgName); g_lpszProgName = strdup(g_lpszNoFileProgName); ::SetWindowText(hWnd, g_lpszProgName); } break; case ID_MENU_FILE_EXIT: g_Scene.Release(); ::SendMessage(hWnd, WM_CLOSE, 0, 0); break; case ID_MENU_VIEW_ANIMATION: { if (!DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), MainhWnd, (DLGPROC)SetupDlgProc)) return 0; if (g_WindowParams.szTitle == NULL) g_WindowParams.szTitle = strdup("test"); g_WindowParams.lpfnProc = MainWndProc; g_WindowParams.hInst = g_hInstance; try { if (!g_Scene.SetActiveCamera("Camera01")) g_Scene.SetFirstCamera(); ::EnableWindow(hWnd, FALSE); InitOpenGL(g_WindowParams, hWnd); g_Scene.SetScreenAspect((float)g_WindowParams.nWidth/g_WindowParams.nHeight); //g_Scene.PrintInfo(LOG); g_Scene.PrepareAnimation(); g_Scene.InitTextures(); g_Scene.InitDisplayLists(); PlayAnimation(); g_Scene.DeinitDisplayLists(); g_Scene.DeinitTextures(); DeInitOpenGL(g_WindowParams); ::EnableWindow(hWnd, TRUE); ::SetActiveWindow(hWnd); } catch (CException ex) { if (ex.type == CException::EXCEPTION_STRING) { static char *error_msg = strdup(ex.error_string); fatal_error(error_msg); } else { char buffer[10]; _itoa(ex.error, buffer, 10); fatal_error(buffer); } } catch (...) { fatal_error("Unknown error!"); } } break; case ID_MENU_HELP_ABOUT: ::DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), MainhWnd, (DLGPROC)AboutDlgProc); break; default: break; } break; case WM_DESTROY: ::PostQuitMessage(0); break; case WM_CREATE: ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_STATE; mii.fState = MFS_GRAYED; ::SetMenuItemInfo(hMenu, ID_MENU_VIEW_ANIMATION, FALSE, &mii); ::SetMenuItemInfo(hMenu, ID_MENU_FILE_CLOSE, FALSE, &mii); break; default: return ::DefWindowProc(hWnd, uMsg, wParam, lParam); break; } return 0; }