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