Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
/* 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;
}
Exemplo n.º 3
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;
}