www.pudn.com > 3ds-load.rar > GameWnd.cpp


// GameWnd.cpp: implementation of the CGameWnd class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "GameWnd.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
//bool	CGameWnd::m_bKeys[256] = {0}; 
bool	CGameWnd::m_bActive = true; 
HWND	CGameWnd::m_hWnd; 
// CCamera CGameWnd::m_Camera; 
CGameWnd::CGameWnd() 
{ 
	m_bFullscreen = FALSE; 
	m_hDC = NULL; 
	m_hRC = NULL; 
	m_hWnd = NULL; 
//	m_Scene.Init(); 
} 
 
CGameWnd::~CGameWnd() 
{ 
 
} 
 
GLvoid CGameWnd::ReSizeGLScene(GLsizei width, GLsizei height) 
{ 
	if (height==0)										// Prevent A Divide By Zero By 
	{ 
		height=1;										// Making Height Equal One 
	} 
 
	glViewport(0,0,width,height);						// Reset The Current Viewport 
 
	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix 
	glLoadIdentity();									// Reset The Projection Matrix 
 
	// Calculate The Aspect Ratio Of The Window 
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,5.0f,20000.0f); 
 
	glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix 
	glLoadIdentity(); 
} 
 
 
 
 
int CGameWnd::DrawGLScene(GLvoid) 
{ 
	m_Scene.Draw(); 
	 
//	glTranslatef (0.0, 0.0, -10.0); 
//	auxSolidTeapot(1.5); 
//	glTranslatef (0.0, 0.0, -100.0); 
//	glBindTexture(GL_TEXTURE_2D, m_Txt1.GetTxtID()); 
//	m_md2.Animate(); 
 
	return TRUE; 
} 
 
GLvoid CGameWnd::KillGLWindow(GLvoid) 
{ 
	if (m_bFullscreen)										// Are We In Fullscreen Mode? 
	{ 
		ChangeDisplaySettings(NULL,0);					// If So Switch Back To The Desktop 
		ShowCursor(TRUE);								// Show Mouse Pointer 
	} 
 
	if (m_hRC)											// Do We Have A Rendering Context? 
	{ 
		if (!wglMakeCurrent(NULL,NULL))					// Are We Able To Release The DC And RC Contexts? 
		{ 
			MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); 
		} 
 
		if (!wglDeleteContext(m_hRC))						// Are We Able To Delete The RC? 
		{ 
			MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); 
		} 
		m_hRC=NULL;										// Set RC To NULL 
	} 
 
	if (m_hDC && !ReleaseDC(m_hWnd,m_hDC))					// Are We Able To Release The DC 
	{ 
		MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); 
		m_hDC=NULL;										// Set DC To NULL 
	} 
 
	if (m_hWnd && !DestroyWindow(m_hWnd))					// Are We Able To Destroy The Window? 
	{ 
		MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); 
		m_hWnd=NULL;										// Set hWnd To NULL 
	} 
 
	if (!UnregisterClass("OpenGL",GetModuleHandle(NULL)))			// Are We Able To Unregister Class 
	{ 
		MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); 
//		hInstance=NULL;									// Set hInstance To NULL 
	} 
} 
 
BOOL CGameWnd::CreateGLWindow(char *title, int width, int height, int bits, bool fullscreenflag) 
{ 
	GLuint		PixelFormat;			// Holds The Results After Searching For A Match 
	WNDCLASS	wc;						// Windows Class Structure 
	DWORD		dwExStyle;				// Window Extended Style 
	DWORD		dwStyle;				// Window Style 
	RECT		WindowRect;				// Grabs Rectangle Upper Left / Lower Right Values 
	WindowRect.left=(long)0;			// Set Left Value To 0 
	WindowRect.right=(long)width;		// Set Right Value To Requested Width 
	WindowRect.top=(long)0;				// Set Top Value To 0 
	WindowRect.bottom=(long)height;		// Set Bottom Value To Requested Height 
 
	m_bFullscreen=fullscreenflag;			// Set The Global Fullscreen Flag 
 
//	hInstance			= GetModuleHandle(NULL);				// Grab An Instance For Our Window 
	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	// Redraw On Size, And Own DC For Window. 
	wc.lpfnWndProc		= (WNDPROC) WndProc;					// WndProc Handles Messages 
	wc.cbClsExtra		= 0;									// No Extra Window Data 
	wc.cbWndExtra		= 0;									// No Extra Window Data 
	wc.hInstance		= GetModuleHandle(NULL);							// Set The Instance 
	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			// Load The Default Icon 
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			// Load The Arrow Pointer 
	wc.hbrBackground	= NULL;									// No Background Required For GL 
	wc.lpszMenuName		= NULL;									// We Don't Want A Menu 
	wc.lpszClassName	= "OpenGL";								// Set The Class Name 
 
	if (!RegisterClass(&wc))									// Attempt To Register The Window Class 
	{ 
		MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;											// Return FALSE 
	} 
	 
	if (m_bFullscreen)												// Attempt Fullscreen Mode? 
	{ 
		DEVMODE dmScreenSettings;								// Device Mode 
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));	// Makes Sure Memory's Cleared 
		dmScreenSettings.dmSize=sizeof(dmScreenSettings);		// Size Of The Devmode Structure 
		dmScreenSettings.dmPelsWidth	= width;				// Selected Screen Width 
		dmScreenSettings.dmPelsHeight	= height;				// Selected Screen Height 
		dmScreenSettings.dmBitsPerPel	= bits;					// Selected Bits Per Pixel 
		dmScreenSettings.dmDisplayFrequency = 85; 
		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY; 
 
		// Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. 
		if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) 
		{ 
			// If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode. 
			if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) 
			{ 
				m_bFullscreen=FALSE;		// Windowed Mode Selected.  Fullscreen = FALSE 
			} 
			else 
			{ 
				// Pop Up A Message Box Letting User Know The Program Is Closing. 
				MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP); 
				return FALSE;									// Return FALSE 
			} 
		} 
	} 
	ShowCursor(FALSE);	 
	if (m_bFullscreen)												// Are We Still In Fullscreen Mode? 
	{ 
		dwExStyle=WS_EX_APPWINDOW;								// Window Extended Style 
		dwStyle=WS_POPUP;										// Windows Style											// Hide Mouse Pointer 
	} 
	else 
	{ 
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// Window Extended Style 
		dwStyle=WS_OVERLAPPEDWINDOW;							// Windows Style 
	} 
 
	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		// Adjust Window To True Requested Size 
 
	// Create The Window 
	if (!(m_hWnd=CreateWindowEx(	dwExStyle,							// Extended Style For The Window 
								"OpenGL",							// Class Name 
								title,								// Window Title 
								dwStyle |							// Defined Window Style 
								WS_CLIPSIBLINGS |					// Required Window Style 
								WS_CLIPCHILDREN,					// Required Window Style 
								0, 0,								// Window Position 
								WindowRect.right-WindowRect.left,	// Calculate Window Width 
								WindowRect.bottom-WindowRect.top,	// Calculate Window Height 
								NULL,								// No Parent Window 
								NULL,								// No Menu 
								GetModuleHandle(NULL),							// Instance 
								NULL)))								// Dont Pass Anything To WM_CREATE 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	static	PIXELFORMATDESCRIPTOR pfd=				// pfd Tells Windows How We Want Things To Be 
	{ 
		sizeof(PIXELFORMATDESCRIPTOR),				// Size Of This Pixel Format Descriptor 
		1,											// Version Number 
		PFD_DRAW_TO_WINDOW |						// Format Must Support Window 
		PFD_SUPPORT_OPENGL |						// Format Must Support OpenGL 
		PFD_DOUBLEBUFFER,							// Must Support Double Buffering 
		PFD_TYPE_RGBA,								// Request An RGBA Format 
		bits,										// Select Our Color Depth 
		0, 0, 0, 0, 0, 0,							// Color Bits Ignored 
		0,											// No Alpha Buffer 
		0,											// Shift Bit Ignored 
		0,											// No Accumulation Buffer 
		0, 0, 0, 0,									// Accumulation Bits Ignored 
		16,											// 16Bit Z-Buffer (Depth Buffer)   
		0,											// No Stencil Buffer 
		0,											// No Auxiliary Buffer 
		PFD_MAIN_PLANE,								// Main Drawing Layer 
		0,											// Reserved 
		0, 0, 0										// Layer Masks Ignored 
	}; 
	 
	if (!(m_hDC=GetDC(m_hWnd)))							// Did We Get A Device Context? 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	if (!(PixelFormat=ChoosePixelFormat(m_hDC,&pfd)))	// Did Windows Find A Matching Pixel Format? 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	if(!SetPixelFormat(m_hDC,PixelFormat,&pfd))		// Are We Able To Set The Pixel Format? 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	if (!(m_hRC=wglCreateContext(m_hDC)))				// Are We Able To Get A Rendering Context? 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	if(!wglMakeCurrent(m_hDC,m_hRC))					// Try To Activate The Rendering Context 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	ShowWindow(m_hWnd,SW_SHOW);						// Show The Window 
	SetForegroundWindow(m_hWnd);						// Slightly Higher Priority 
	SetFocus(m_hWnd);									// Sets Keyboard Focus To The Window 
	ReSizeGLScene(width, height);					// Set Up Our Perspective GL Screen 
 
	if (!InitGL())									// Initialize Our Newly Created GL Window 
	{ 
		KillGLWindow();								// Reset The Display 
		MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
		return FALSE;								// Return FALSE 
	} 
 
	return TRUE; 
} 
 
LRESULT CGameWnd::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
	LONG    lRet = 0;  
	switch (uMsg)									// Check For Windows Messages 
	{ 
		case WM_ACTIVATE:							// Watch For Window Activate Message 
			if (LOWORD(wParam))					// Check Minimization State 
			{ 
				m_bActive=TRUE;						// Program Is Active 
			} 
			else 
			{ 
				m_bActive=FALSE;						// Program Is No Longer Active 
			} 
			break; 
		case WM_SYSCOMMAND:							// Intercept System Commands 
			switch (wParam)							// Check System Calls 
			{ 
				case SC_SCREENSAVE:					// Screensaver Trying To Start? 
				case SC_MONITORPOWER:				// Monitor Trying To Enter Powersave? 
				return 0;							// Prevent From Happening 
			} 
			break;									// Exit 
		case WM_CLOSE:								// Did We Receive A Close Message? 
		{ 
			PostQuitMessage(0);						// Send A Quit Message 
										// Jump Back 
		} 
		break; 
		case WM_KEYDOWN:							// Is A Key Being Held Down? 
			switch(wParam) 
			{								// Check if we hit a key 
				case VK_ESCAPE:								// If we hit the escape key 
					PostQuitMessage(0);						// Send a QUIT message to the window 
					break; 
				case 76: 
				{ 
					static bool bRenderMode = true; 
					if(!bRenderMode) 				 
					{ 
						// Render the triangles in fill mode		 
						glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);	 
					} 
					else  
					{ 
						// Render the triangles in wire frame mode 
						glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);	 
					} 
					bRenderMode = !bRenderMode; 
				} 
			} 
			break; 
			case WM_SIZE:								// Resize The OpenGL Window 
				ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height 
				break; 
			default:											// Return by default 
				lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);  
				break;  
	} 
	return lRet;	 
} 
 
int CGameWnd::InitGL(GLvoid) 
{ 
	 
//	m_md2.Load("Models/Unit01/tris03.md2"); 
/*	m_md2.Load("Models/Unit01/tris02.md2"); 
	m_Txt.LoadGLTextures("Models/Unit01/unit03.bmp"); 
	m_Txt1.LoadGLTextures("Models/Unit01/test02.bmp"); 
	glEnable(GL_TEXTURE_2D); 
*/ 
//	m_Camera.PositionCamera(0, 1.5f, 6,   0, 1.5f, 0,   0, 1, 0); 
//	m_Camera.PositionCamera( 280, 35, 225,  281, 35, 225,  0, 1, 0); 
/*	GLfloat light_position[] = { 0.0, 0.0, -110.0, 0.0 }; 
	glLightfv(GL_LIGHT0, GL_POSITION, light_position); 
	glEnable(GL_LIGHTING); 
	glEnable(GL_LIGHT0); 
	glDepthFunc(GL_LESS); 
*/ 
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background 
	glShadeModel(GL_SMOOTH);							// Enable Smooth Shading 
//	glShadeModel(GL_FLAT); 
	glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST ); 
//	glCullFace(GL_BACK); 
//	glEnable(GL_CULL_FACE); 
 
	glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); 
 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 
	/////////////////////////////////////////// 
//	glAlphaFunc(GL_GEQUAL,0.1f); 
	glBlendFunc(GL_SRC_ALPHA,GL_ONE); //字体显示要求,不能少 
	glDepthFunc(GL_LEQUAL); 
	glReadBuffer(GL_FRONT); 
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //不能去掉,否则会非法操作,不知为什么 
 
	float fogColor[4] = {1.0f, 1.0f, 1.0f, 1.0f}; 
	glDisable(GL_FOG);						// Turn on fog 
	glFogi(GL_FOG_MODE, GL_LINEAR);			// Set the fog mode to LINEAR (Important) 
	glFogfv(GL_FOG_COLOR, fogColor);		// Give OpenGL our fog color 
	glFogf(GL_FOG_START, 0.0);				// Set the start position for the depth at 0 
	glFogf(GL_FOG_END, 30.0);				// Set the end position for the detph at 50 
	// Now we tell OpenGL that we are using our fog extension for per vertex 
	// fog calculations.  For each vertex that needs fog applied to it we must 
	// use the glFogCoordfEXT() function with a depth value passed in. 
	// These flags are defined in main.h and are not apart of the normal opengl headers. 
	glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); 
 
	glActiveTextureARB		= (PFNGLACTIVETEXTUREARBPROC)		wglGetProcAddress("glActiveTextureARB"); 
	glMultiTexCoord2fARB	= (PFNGLMULTITEXCOORD2FARBPROC)		wglGetProcAddress("glMultiTexCoord2fARB"); 
 
	// We should have our multitexturing functions defined and ready to go now, but let's make sure 
	// that the current version of OpenGL is installed on the machine.  If the extension functions 
	// could not be found, our function pointers will be NULL. 
	if(!glActiveTextureARB || !glMultiTexCoord2fARB) 
	{ 
		// Print an error message and quit. 
		MessageBox(NULL, "Your current setup does not support multitexturing", "Error", MB_OK); 
		PostQuitMessage(0); 
	} 
	m_Scene.Init(); 
	return TRUE; 
}