/******************************************************************* * Main Window Procedure - handles application events *******************************************************************/ LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { //any user input messages sent to game engine case WM_INPUT: { HRAWINPUT in = *((HRAWINPUT*) &lParam); //get raw input data buffer size UINT dbSize; GetRawInputData(in, RID_INPUT, NULL, &dbSize,sizeof(RAWINPUTHEADER) ); //allocate memory for raw input data and get data unsigned char* pData = new unsigned char[dbSize]; GetRawInputData(in, RID_INPUT, pData, &dbSize, sizeof(RAWINPUTHEADER) ); RAWINPUT* pInput = (RAWINPUT*) pData; //Handle Keyboard Input //************************************************************************** if (pInput->header.dwType == RIM_TYPEKEYBOARD) { switch( pInput->data.keyboard.Message ) { //key up case WM_KEYDOWN: { switch (pInput->data.keyboard.VKey) { case 'W' : camera.HandleInputMessage(0); break; case 'S' : camera.HandleInputMessage(1); break; case 'A' : camera.HandleInputMessage(2); break; case 'D' : camera.HandleInputMessage(3); break; case 'T' : { //toggle technique if ( ++currTech > 5 ) currTech = 3; renderer.SetTechnique( currTech ); } break; case 'Y' : { renderer.ToggleShadowMapSize(); doubleSizedShadowMap = !doubleSizedShadowMap; } break; case 'U' : { if ( ++shadowMapTechnique > 1 ) shadowMapTechnique = 0; renderer.SetShadowMapTechnique( shadowMapTechnique ); } break; case 107 : { smBias += 0.0005f; renderer.SetShadowMapBias(smBias); } break; case 109 : { smBias -= 0.0005f; renderer.SetShadowMapBias(smBias); } break; }; } break; case WM_KEYUP : { switch (pInput->data.keyboard.VKey) { case 'W' : camera.HandleInputMessage(4); break; case 'S' : camera.HandleInputMessage(5); break; case 'A' : camera.HandleInputMessage(6); break; case 'D' : camera.HandleInputMessage(7); break; }; } break; } //set window text std::stringstream titleMsg; titleMsg << "Shadow Mapping :: "; if (shadowMapTechnique == 0 ) titleMsg << "Front Face SM, "; else titleMsg << "Back Face SM, "; if ( currTech == 2 ) titleMsg << "Point Sampling, "; else if ( currTech == 3 ) titleMsg << "PCF 1-Tap, "; else if ( currTech == 4 ) titleMsg << "PCF 16-Tap, "; if ( !doubleSizedShadowMap ) titleMsg << "Shadow Map Size = 800x600, "; else titleMsg << "Shadow Map Size = 1600*1200, "; titleMsg << "Shadow Map Bias = "; titleMsg << smBias; wchar_t msg[255]; swprintf_s( msg, 255, L"%S", titleMsg.str().c_str()); SetWindowText(hWnd, msg ); } // Handle Mouse Input //************************************************************************** else if (pInput->header.dwType == RIM_TYPEMOUSE) { camera.AdjustOrientation( 0.005f * pInput->data.mouse.lLastX, 0.005f * pInput->data.mouse.lLastY ); } //delete input message and return delete [] pData; } break; //close button event case WM_DESTROY : PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam); }