virtual void onPostUpdate(grp::ISkeleton* skeleton)
	{
		int value = g_SampleUI.GetSlider(IDC_SLIDER_ARM)->GetValue();
		float arm_scale = 0.75f + value / 200.0f;
		value = g_SampleUI.GetSlider(IDC_SLIDER_LEG)->GetValue();
		float leg_scale = 0.75f + value / 200.0f;
		value = g_SampleUI.GetSlider(IDC_SLIDER_BODY)->GetValue();
		float body_scale = 0.75f + value / 200.0f;

		set_bone_scale(skeleton, L"Bip L UpperArm", arm_scale);
		set_bone_scale(skeleton, L"Bip L Forearm", arm_scale);
		set_bone_scale(skeleton, L"Bip R UpperArm", arm_scale);
		set_bone_scale(skeleton, L"Bip R Forearm", arm_scale);
		
		set_bone_scale(skeleton, L"Bip L Thigh", leg_scale);
		set_bone_scale(skeleton, L"Bip R Thigh", leg_scale);
		set_bone_scale(skeleton, L"Bip L Calf", leg_scale);
		set_bone_scale(skeleton, L"Bip R Calf", leg_scale);
		
		set_bone_scale(skeleton, L"Bip Pelvis", body_scale);
		set_bone_scale(skeleton, L"Bip Spine", body_scale);
		set_bone_scale(skeleton, L"Bip Spine1", body_scale);
		set_bone_scale(skeleton, L"Bip Spine2", body_scale);
		set_bone_scale(skeleton, L"Bip Spine3", body_scale);
	}
Example #2
0
//--------------------------------------------------------------------------------------
// This callback function will be called at the end of every frame to perform all the 
// rendering calls for the scene, and it will also be called if the window needs to be 
// repainted. After this function has returned, DXUT will call 
// IDirect3DDevice9::Present to display the contents of the next buffer in the swap chain
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    // If the settings dialog is being shown, then
    // render it instead of rendering the app's scene
    if( g_SettingsDlg.IsActive() )
    {
        g_SettingsDlg.OnRender( fElapsedTime );
        return;
    }

    HRESULT hr;

    // Clear the render target and the zbuffer 
    V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 50, 50, 50 ), 1.0f, 0 ) );

    // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        // Get the projection & view matrix from the camera class
        D3DXMATRIXA16 mViewProjection = ( *g_Camera.GetViewMatrix() ) * ( *g_Camera.GetProjMatrix() );

        g_Skybox.SetDrawSH( false );
        g_Skybox.Render( &mViewProjection, 1.0f, 1.0f );

        V( g_pEffect->SetMatrix( "g_mViewProjection", &mViewProjection ) );
        V( g_pEffect->SetFloat( "g_fTime", ( float )fTime ) );

        // Set the amount of transmitted light per color channel
        D3DXVECTOR3 vColorTransmit;
        vColorTransmit.x = g_SampleUI.GetSlider( IDC_RED_TRANSMIT_SLIDER )->GetValue() / 1000.0f;
        vColorTransmit.y = g_SampleUI.GetSlider( IDC_GREEN_TRANSMIT_SLIDER )->GetValue() / 1000.0f;
        vColorTransmit.z = g_SampleUI.GetSlider( IDC_BLUE_TRANSMIT_SLIDER )->GetValue() / 1000.0f;
        V( g_pEffect->SetFloatArray( "g_vColorTransmit", vColorTransmit, 3 ) );

        // for Cubic degree rendering
        V( g_pEffect->SetFloat( "g_fLightIntensity", g_fLightIntensity ) );
        V( g_pEffect->SetFloatArray( "g_vLightDirection", g_vLightDirection, 3 * sizeof( float ) ) );
        V( g_pEffect->SetFloatArray( "g_vLightCoeffsR", m_fRLC, 4 * sizeof( float ) ) );
        V( g_pEffect->SetFloatArray( "g_vLightCoeffsG", m_fGLC, 4 * sizeof( float ) ) );
        V( g_pEffect->SetFloatArray( "g_vLightCoeffsB", m_fBLC, 4 * sizeof( float ) ) );

        pd3dDevice->SetRenderState( D3DRS_FILLMODE, g_bWireFrame ? D3DFILL_WIREFRAME : D3DFILL_SOLID );

        DrawFrame( pd3dDevice, g_pFrameRoot );

        DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); // These events are to help PIX identify what the code is doing
        RenderText();
        V( g_HUD.OnRender( fElapsedTime ) );
        V( g_SampleUI.OnRender( fElapsedTime ) );
        V( g_LightControl.OnRender9( D3DXCOLOR( 1, 1, 1, 1 ), ( D3DXMATRIX* )g_Camera.GetViewMatrix(),
                                     ( D3DXMATRIX* )g_Camera.GetProjMatrix(), g_Camera.GetEyePt() ) );
        DXUT_EndPerfEvent();

        V( pd3dDevice->EndScene() );
    }
}
Example #3
0
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{

    switch( nControlID )
    {
        case IDC_TOGGLEFULLSCREEN:
            DXUTToggleFullScreen(); break;
        case IDC_TOGGLEREF:
            DXUTToggleREF(); break;
        case IDC_CHANGEDEVICE:
            g_SettingsDlg.SetActive( !g_SettingsDlg.IsActive() ); break;

        case IDC_ENABLE_PRESHADER:
        {
            g_bEnablePreshader = g_SampleUI.GetCheckBox( IDC_ENABLE_PRESHADER )->GetChecked();

            if( DXUTGetD3D9Device() != NULL )
            {
                OnLostDevice( NULL );
                OnDestroyDevice( NULL );
                OnCreateDevice( DXUTGetD3D9Device(), DXUTGetD3D9BackBufferSurfaceDesc(), NULL );
                OnResetDevice( DXUTGetD3D9Device(), DXUTGetD3D9BackBufferSurfaceDesc(), NULL );
            }
            break;
        }

        case IDC_ACTIVE_LIGHT:
            if( !g_LightControl[g_nActiveLight].IsBeingDragged() )
            {
                g_nActiveLight++;
                g_nActiveLight %= g_nNumActiveLights;
            }
            break;

        case IDC_NUM_LIGHTS:
            if( !g_LightControl[g_nActiveLight].IsBeingDragged() )
            {
                WCHAR sz[100];
                swprintf_s( sz, 100, L"# Lights: %d", g_SampleUI.GetSlider( IDC_NUM_LIGHTS )->GetValue() );
                g_SampleUI.GetStatic( IDC_NUM_LIGHTS_STATIC )->SetText( sz );

                g_nNumActiveLights = g_SampleUI.GetSlider( IDC_NUM_LIGHTS )->GetValue();
                g_nActiveLight %= g_nNumActiveLights;
            }
            break;

        case IDC_LIGHT_SCALE:
            g_fLightScale = ( float )( g_SampleUI.GetSlider( IDC_LIGHT_SCALE )->GetValue() * 0.10f );

            WCHAR sz[100];
            swprintf_s( sz, 100, L"Light scale: %0.2f", g_fLightScale );
            g_SampleUI.GetStatic( IDC_LIGHT_SCALE_STATIC )->SetText( sz );
            break;
    }

}
Example #4
0
void setVisibleCustomControls(bool visible) {
    hud.GetStatic(IDC_THRESHOLD_LABEL)->SetVisible(visible);
    hud.GetSlider(IDC_THRESHOLD)->SetVisible(visible);
    hud.GetStatic(IDC_MAX_SEARCH_STEPS_LABEL)->SetVisible(visible);
    hud.GetSlider(IDC_MAX_SEARCH_STEPS)->SetVisible(visible);
    hud.GetStatic(IDC_MAX_SEARCH_STEPS_DIAG_LABEL)->SetVisible(visible);
    hud.GetSlider(IDC_MAX_SEARCH_STEPS_DIAG)->SetVisible(visible);
    hud.GetStatic(IDC_CORNER_ROUNDING_LABEL)->SetVisible(visible);
    hud.GetSlider(IDC_CORNER_ROUNDING)->SetVisible(visible);
}
Example #5
0
void initApp() {
    hud.Init(&dialogResourceManager);

    hud.SetCallback(onGUIEvent); int iY = 10;
    hud.AddButton(IDC_TOGGLE_FULLSCREEN, L"Toggle full screen", 35, iY, HUD_WIDTH, 22);

    iY += 24;

    hud.AddComboBox(IDC_PRESET, 35, iY += 24, HUD_WIDTH, 22, 0, false);
    hud.GetComboBox(IDC_PRESET)->AddItem(L"SMAA Low", (LPVOID) 0);
    hud.GetComboBox(IDC_PRESET)->AddItem(L"SMAA Medium", (LPVOID) 1);
    hud.GetComboBox(IDC_PRESET)->AddItem(L"SMAA High", (LPVOID) 2);
    hud.GetComboBox(IDC_PRESET)->AddItem(L"SMAA Ultra", (LPVOID) 3);
    hud.GetComboBox(IDC_PRESET)->AddItem(L"SMAA Custom", (LPVOID) 4);
    hud.GetComboBox(IDC_PRESET)->SetSelectedByData((LPVOID) 2);

    hud.AddComboBox(IDC_DETECTION_MODE, 35, iY += 24, HUD_WIDTH, 22, 0, false);
    hud.GetComboBox(IDC_DETECTION_MODE)->AddItem(L"Luma edge det.", (LPVOID) 0);
    hud.GetComboBox(IDC_DETECTION_MODE)->AddItem(L"Color edge det.", (LPVOID) 1);
    hud.GetComboBox(IDC_DETECTION_MODE)->AddItem(L"Depth edge det.", (LPVOID) 2);

    hud.AddCheckBox(IDC_ANTIALIASING, L"SMAA Anti-Aliasing", 35, iY += 24, HUD_WIDTH, 22, true);
    hud.AddCheckBox(IDC_PROFILE, L"Profile", 35, iY += 24, 125, 22, false);
    wstringstream s;
    s << L"Threshold: " << commandlineOptions.threshold;
    hud.AddStatic(IDC_THRESHOLD_LABEL, s.str().c_str(), 35, iY += 24, HUD_WIDTH, 22);
    hud.AddSlider(IDC_THRESHOLD, 35, iY += 24, HUD_WIDTH, 22, 0, 100, int(100.0f * commandlineOptions.threshold / 0.5f));
    hud.GetStatic(IDC_THRESHOLD_LABEL)->SetVisible(false);
    hud.GetSlider(IDC_THRESHOLD)->SetVisible(false);

    s = wstringstream();
    s << L"Max Search Steps: " << commandlineOptions.searchSteps;
    hud.AddStatic(IDC_MAX_SEARCH_STEPS_LABEL, s.str().c_str(), 35, iY += 24, HUD_WIDTH, 22);
    hud.AddSlider(IDC_MAX_SEARCH_STEPS, 35, iY += 24, HUD_WIDTH, 22, 0, 100, int(100.0f * commandlineOptions.searchSteps / 98.0f));
    hud.GetStatic(IDC_MAX_SEARCH_STEPS_LABEL)->SetVisible(false);
    hud.GetSlider(IDC_MAX_SEARCH_STEPS)->SetVisible(false);

    s = wstringstream();
    s << L"Max Diag. Search Steps: " << commandlineOptions.diagSearchSteps;
    hud.AddStatic(IDC_MAX_SEARCH_STEPS_DIAG_LABEL, s.str().c_str(), 35, iY += 24, HUD_WIDTH, 22);
    hud.AddSlider(IDC_MAX_SEARCH_STEPS_DIAG, 35, iY += 24, HUD_WIDTH, 22, 0, 100, int(100.0f * commandlineOptions.diagSearchSteps / 20.0f));
    hud.GetStatic(IDC_MAX_SEARCH_STEPS_DIAG_LABEL)->SetVisible(false);
    hud.GetSlider(IDC_MAX_SEARCH_STEPS_DIAG)->SetVisible(false);

    s = wstringstream();
    s << L"Corner Rounding: " << commandlineOptions.cornerRounding;
    hud.AddStatic(IDC_CORNER_ROUNDING_LABEL, s.str().c_str(), 35, iY += 24, HUD_WIDTH, 22);
    hud.AddSlider(IDC_CORNER_ROUNDING, 35, iY += 24, HUD_WIDTH, 22, 0, 100, int(100.0f * commandlineOptions.cornerRounding / 100.0f));
    hud.GetStatic(IDC_CORNER_ROUNDING_LABEL)->SetVisible(false);
    hud.GetSlider(IDC_CORNER_ROUNDING)->SetVisible(false);
	
}
Example #6
0
void setAnimationWeight()
{
	if (g_model == NULL)
	{
		return;
	}
#define SET_ANIMATION_WEIGHT(a, w)	\
	{\
		grp::IAnimation* animation = g_model->findAnimation(a);\
		if (animation != NULL)\
		{\
			animation->setWeight(w);\
		}\
	}

	float weight = g_SampleUI.GetSlider(IDC_SLIDER_WEIGHT)->GetValue() / 100.0f;
	if (weight < 0.5f)
	{
		SET_ANIMATION_WEIGHT(L"fight", 2 * (0.5f - weight));
		SET_ANIMATION_WEIGHT(L"walk", 2 * weight);
		SET_ANIMATION_WEIGHT(L"run", 0.0f);
		g_fCurSpeed = weight * WALK_SPEED * 2;
	}
	else
	{
		SET_ANIMATION_WEIGHT(L"fight", 0.0f);
		SET_ANIMATION_WEIGHT(L"walk", 2 * (1.0f - weight));
		SET_ANIMATION_WEIGHT(L"run", 2 * (weight - 0.5f));
		g_fCurSpeed = 2 * (WALK_SPEED * (1.0f - weight) + RUN_SPEED * (weight - 0.5f));
	}
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, 
                          void* pUserContext )
{
    if( g_bGuiVisible )
    {
        switch( nControlID )
        {
            case IDC_TOGGLEFULLSCREEN:
                DXUTToggleFullScreen(); break;
            case IDC_TOGGLEREF:
                DXUTToggleREF(); break;
            case IDC_CHANGEDEVICE:
                g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break;
            case IDC_SUNWIDTH_SLIDER:
                WCHAR temp[64];
                int iVal = g_HUD.GetSlider( IDC_SUNWIDTH_SLIDER )->GetValue();

                g_fSunWidth = ( float( iVal ) / 100.0f ) * 3.0f;
                swprintf_s( temp, L"SunWidth = %2.2f", g_fSunWidth );
                g_HUD.GetStatic( IDC_SUNWIDTH_TEXT )->SetText( temp );

                break;
        }
    }
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext)
{

	switch(nControlID)
	{
	case IDC_SLIDER_TIMESCALE:
		{
			int iValue = g_SampleUI.GetSlider(IDC_SLIDER_TIMESCALE)->GetValue();
			if (iValue < 50)
			{
				g_fTimeScale = iValue / 50.0f;
			}
			else
			{
				g_fTimeScale = iValue / 10.0f - 4.0f;
			}
		}
		break;

	case IDC_SLIDER_WEIGHT:
		{
			if (g_model == NULL)
			{
				break;
			}
			setAnimationWeight();
			break;
		}
	}
}
Example #9
0
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
    switch( nControlID )
    {
        case IDC_TOGGLEFULLSCREEN:
            DXUTToggleFullScreen(); break;
        case IDC_TOGGLEREF:
            DXUTToggleREF(); break;
        case IDC_CHANGEDEVICE:
            g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break;
        case IDC_TOGGLEWARP:
            DXUTToggleWARP(); break;
        case IDC_TOGGLESPIN:
        {
            g_bSpinning = g_SampleUI.GetCheckBox( IDC_TOGGLESPIN )->GetChecked();
            break;
        }

        case IDC_EXPLODE_SCALE:
        {
            WCHAR sz[100];
            g_fExplode = ( float )( g_SampleUI.GetSlider( IDC_EXPLODE_SCALE )->GetValue() * 0.01f );
            swprintf_s( sz, 100, L"Explode Amount: %0.2f", g_fExplode );
            g_SampleUI.GetStatic( IDC_EXPLODE_STATIC )->SetText( sz );
            g_pExplodeVariable->SetFloat( g_fExplode );
            break;
        }
    }
}
Example #10
0
//--------------------------------------------------------------------------------------
void UpdateLightingEnvironment()
{
    // Gather lighting options from the HUD
    g_vLightDirection = g_LightControl.GetLightDirection();
    g_fLightIntensity = g_SampleUI.GetSlider( IDC_LIGHT_SLIDER )->GetValue() / 100.0f;
    g_fEnvIntensity = g_SampleUI.GetSlider( IDC_ENV_SLIDER )->GetValue() / 1000.0f;

    // Create the spotlight
    D3DXSHEvalConeLight( D3DXSH_MAXORDER, &g_vLightDirection, D3DX_PI / 8.0f,
                         g_fLightIntensity, g_fLightIntensity, g_fLightIntensity,
                         m_fRLC, m_fGLC, m_fBLC );

    float fSkybox[3][D3DXSH_MAXORDER*D3DXSH_MAXORDER];

    // Scale the light probe environment contribution based on input options    
    D3DXSHScale( fSkybox[0], D3DXSH_MAXORDER, g_fSkyBoxLightSH[0], g_fEnvIntensity );
    D3DXSHScale( fSkybox[1], D3DXSH_MAXORDER, g_fSkyBoxLightSH[1], g_fEnvIntensity );
    D3DXSHScale( fSkybox[2], D3DXSH_MAXORDER, g_fSkyBoxLightSH[2], g_fEnvIntensity );

    // Combine the environment and the spotlight
    D3DXSHAdd( m_fRLC, D3DXSH_MAXORDER, m_fRLC, fSkybox[0] );
    D3DXSHAdd( m_fGLC, D3DXSH_MAXORDER, m_fGLC, fSkybox[1] );
    D3DXSHAdd( m_fBLC, D3DXSH_MAXORDER, m_fBLC, fSkybox[2] );
}
Example #11
0
//--------------------------------------------------------------------------------------
// This callback function will be called once at the beginning of every frame. This is the
// best location for your application to handle updates to the scene, but is not 
// intended to contain actual rendering calls, which should instead be placed in the 
// OnFrameRender callback.  
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{
    // Update the camera's position based on user input 
    g_Camera.FrameMove( fElapsedTime );

    UpdateLightingEnvironment();

    if( g_pAnimController != NULL )
    {
        g_pAnimController->SetTrackSpeed( 0, g_SampleUI.GetSlider( IDC_ANIMATION_SPEED )->GetValue() / 1000.0f );
        g_pAnimController->AdvanceTime( fElapsedTime, NULL );
    }

    UpdateFrameMatrices( g_pFrameRoot, g_Camera.GetWorldMatrix() );
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl,
						 void* pUserContext)
{
	switch (nControlID)
	{
	case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break;

	case IDC_TOGGLEREF:        DXUTToggleREF(); break;

	case IDC_CHANGEDEVICE:     g_D3DSettingsDlg.SetActive(
			!g_D3DSettingsDlg.IsActive()); break;

	case IDC_DIFF_STEPS:
		g_vsObj->diffSteps = g_SampleUI.GetSlider(IDC_DIFF_STEPS)->GetValue();
		WCHAR sz[100];
		StringCchPrintf(sz, 100, L"Diffusion steps: %d", g_vsObj->diffSteps);
		g_SampleUI.GetStatic(IDC_DIFF_STEPS_STATIC)->SetText(sz);
		break;
	}
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
    switch( nControlID )
    {
            // Standard DXUT controls
        case IDC_TOGGLEFULLSCREEN:
            DXUTToggleFullScreen(); break;
        case IDC_TOGGLEREF:
            DXUTToggleREF(); break;
        case IDC_CHANGEDEVICE:
            g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break;

            // Custom app controls
        case IDC_PATCH_SUBDIVS:
        {
            g_fSubdivs = g_SampleUI.GetSlider( IDC_PATCH_SUBDIVS )->GetValue() / 10.0f;

            WCHAR sz[100];
            swprintf_s( sz, L"Patch Divisions: %2.1f", g_fSubdivs );
            g_SampleUI.GetStatic( IDC_PATCH_SUBDIVS_STATIC )->SetText( sz );
        }
            break;
        case IDC_TOGGLE_LINES:
            g_bDrawWires = g_SampleUI.GetCheckBox( IDC_TOGGLE_LINES )->GetChecked();
            break;
        case IDC_PARTITION_INTEGER:
            g_iPartitionMode = PARTITION_INTEGER;
            break;
        case IDC_PARTITION_FRAC_EVEN:
            g_iPartitionMode = PARTITION_FRACTIONAL_EVEN;
            break;
        case IDC_PARTITION_FRAC_ODD:
            g_iPartitionMode = PARTITION_FRACTIONAL_ODD;
            break;
    }
}
Example #14
0
//--------------------------------------------------------------------------------------
// This function loads a new technique and all device objects it requires.
//--------------------------------------------------------------------------------------
HRESULT LoadTechniqueObjects( const char* szMedia )
{
    HRESULT hr = S_OK;

    if( NULL == g_pEffect )
        return D3DERR_INVALIDCALL;

    IDirect3DTexture9* pTexture = NULL;
    IDirect3DCubeTexture9* pCubeTexture = NULL;

    IDirect3DDevice9* pDevice = DXUTGetD3D9Device();

    WCHAR strFileName[MAX_PATH+1] = {0};
    WCHAR strPath[MAX_PATH+1] = {0};
    char strTechnique[MAX_PATH] = {0};

    // Make sure the technique works
    char* strComboTech = ( char* )g_SampleUI.GetComboBox( IDC_TECHNIQUE )->GetSelectedData();
    strcpy_s( strTechnique, MAX_PATH, strComboTech );
    bool bLDPRT = ( strTechnique && ( 0 == strcmp( strTechnique, "LDPRT" ) ) );

    // If we're not a signed format, make sure we use a technnique that will unbias
    if( D3DFMT_Q16W16V16U16 != g_fmtTexture && D3DFMT_Q8W8V8U8 != g_fmtTexture )
        strcat_s( strTechnique, MAX_PATH, "_Unbias" );

    D3DXHANDLE hTechnique = g_pEffect->GetTechniqueByName( strTechnique );
    V_RETURN( g_pEffect->SetTechnique( hTechnique ) );

    // Enable/disable LDPRT-only items
    g_SampleUI.GetStatic( IDC_ENV_LABEL )->SetEnabled( bLDPRT );
    g_SampleUI.GetSlider( IDC_ENV_SLIDER )->SetEnabled( bLDPRT );
    g_SampleUI.GetSlider( IDC_RED_TRANSMIT_SLIDER )->SetEnabled( bLDPRT );
    g_SampleUI.GetSlider( IDC_GREEN_TRANSMIT_SLIDER )->SetEnabled( bLDPRT );
    g_SampleUI.GetSlider( IDC_BLUE_TRANSMIT_SLIDER )->SetEnabled( bLDPRT );
    g_SampleUI.GetStatic( IDC_RED_TRANSMIT_LABEL )->SetEnabled( bLDPRT );
    g_SampleUI.GetStatic( IDC_GREEN_TRANSMIT_LABEL )->SetEnabled( bLDPRT );
    g_SampleUI.GetStatic( IDC_BLUE_TRANSMIT_LABEL )->SetEnabled( bLDPRT );

    // Load the mesh
    swprintf_s( strFileName, MAX_PATH, TEXT( "media\\%S" ), szMedia );
    V_RETURN( LoadLDPRTData( pDevice, strFileName ) );

    // Albedo texture
    swprintf_s( strFileName, MAX_PATH, TEXT( "media\\%SAlbedo.dds" ), szMedia );
    DXUTFindDXSDKMediaFileCch( strPath, MAX_PATH, strFileName );
    V( D3DXCreateTextureFromFile( pDevice, strPath, &pTexture ) );
    g_pEffect->SetTexture( "Albedo", pTexture );
    SAFE_RELEASE( pTexture );

    // Normal map 
    swprintf_s( strFileName, MAX_PATH, TEXT( "media\\%SNormalMap.dds" ), szMedia );
    DXUTFindDXSDKMediaFileCch( strPath, MAX_PATH, strFileName );
    V( D3DXCreateTextureFromFileEx( pDevice, strPath, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0,
                                    g_fmtTexture, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0,
                                    NULL, NULL, &pTexture ) );
    g_pEffect->SetTexture( "NormalMap", pTexture );
    SAFE_RELEASE( pTexture );

    // Spherical harmonic basic functions
    char* pNames[4] = {"YlmCoeff0","YlmCoeff4","YlmCoeff8","YlmCoeff12"};
    for( int i = 0; i < 4; i++ )
    {
        D3DXCreateCubeTexture( pDevice, 32, 1, 0, g_fmtCubeMap, D3DPOOL_MANAGED, &pCubeTexture );
        D3DXFillCubeTexture( pCubeTexture, myFillBF, ( LPVOID )( INT_PTR )( i * 4 ) );
        g_pEffect->SetTexture( pNames[i], pCubeTexture );
        SAFE_RELEASE( pCubeTexture );
    }

    return S_OK;
}
Example #15
0
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext)
{

	switch(nControlID)
	{
	case IDC_SLIDER_TIMESCALE:
		{
			int iValue = g_SampleUI.GetSlider(IDC_SLIDER_TIMESCALE)->GetValue();
			if (iValue < 50)
			{
				g_fTimeScale = iValue / 50.0f;
			}
			else
			{
				g_fTimeScale = iValue / 10.0f - 4.0f;
			}
		}
		break;

	case IDC_SLIDER_WEIGHT:
		{
			if (g_model == NULL)
			{
				break;
			}
			setAnimationWeight();
			break;
		}

	case IDC_BUTTON_ATTACK:
		if (g_model != NULL)
		{
			grp::IAnimation* fight = g_model->findAnimation(L"fight");
			if (fight != NULL && fight->getWeight() == 1.0f)
			{
				g_model->playAnimation(L"attack", grp::ANIMATION_SINGLE);
			}
			else
			{
				g_model->playAnimation(L"attack_up", grp::ANIMATION_SINGLE);
			}
		}
		break;
	case IDC_CHECK_RAGDOLL:
		if (g_SampleUI.GetCheckBox(IDC_CHECK_RAGDOLL)->GetChecked())
		{
			g_character->createRagdoll(g_model->getTransform());
		}
		else
		{
			g_character->destroyRagdoll();
		}
		break;
	case IDC_CHECK_GPU_SKINNING:
		{
			bool enable = g_SampleUI.GetCheckBox(IDC_CHECK_GPU_SKINNING)->GetChecked();
			g_character->setGpuSkinning(enable);
		}
		break;
	}
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext)
{
    switch (nControlID)
    {
        case IDC_TOGGLEFULLSCREEN:   DXUTToggleFullScreen(); break;
        case IDC_TOGGLEREF:          DXUTToggleREF();        break;
           
        case IDC_CHANGEDEVICE:
        {
            g_SettingsDlg.SetActive(!g_SettingsDlg.IsActive()); 
            break;
        }
        case IDC_CHANGESCENE:
        {
            CDXUTComboBox* pComboBox = (CDXUTComboBox*) pControl;
            g_CurrentSceneId = pComboBox->GetSelectedIndex();
            break;
        }
        case IDC_BLUR_AO:
        {
            g_BlurAO = g_HUD.GetCheckBox(nControlID)->GetChecked();
            break;
        }
        case IDC_DEINTERLEAVE:
        {
            g_UseDeinterleavedTexturing = g_HUD.GetCheckBox(nControlID)->GetChecked();
            break;
        }
        case IDC_RANDOMIZE:
        {
            g_RandomizeSamples = g_HUD.GetCheckBox(nControlID)->GetChecked();
            break;
        }
        case IDC_RADIUS_SLIDER:
        {
            g_AOParams.Radius = (float) g_HUD.GetSlider(IDC_RADIUS_SLIDER)->GetValue() * MAX_RADIUS_MULT / 100.0f;

            WCHAR sz[100];
            StringCchPrintf(sz, 100, UI_RADIUS_MULT L"%0.2f", g_AOParams.Radius); 
            g_HUD.GetStatic(IDC_RADIUS_STATIC)->SetText(sz);

            break;
        }
        case IDC_BIAS_SLIDER:
        {
            g_AOParams.Bias = (float) g_HUD.GetSlider(IDC_BIAS_SLIDER)->GetValue() / 1000.f;

            WCHAR sz[100];
            StringCchPrintf(sz, 100, UI_AO_BIAS L"%g", g_AOParams.Bias); 
            g_HUD.GetStatic(IDC_BIAS_STATIC)->SetText(sz);

            break;
        }
        case IDC_EXPONENT_SLIDER: 
        {
            g_AOParams.PowerExponent = (float)g_HUD.GetSlider(IDC_EXPONENT_SLIDER)->GetValue() / 100.0f;

            WCHAR sz[100];
            StringCchPrintf(sz, 100, UI_POW_EXPONENT L"%0.2f", g_AOParams.PowerExponent);
            g_HUD.GetStatic(IDC_EXPONENT_STATIC)->SetText(sz);

            break;
        }
        case IDC_BLUR_SHARPNESS_SLIDER: 
        {
            g_AOParams.Blur.Sharpness = (float)g_HUD.GetSlider(IDC_BLUR_SHARPNESS_SLIDER)->GetValue() / 100.0f;

            WCHAR sz[100];
            StringCchPrintf(sz, 100, UI_BLUR_SHARPNESS L"%0.2f", g_AOParams.Blur.Sharpness);
            g_HUD.GetStatic(IDC_BLUR_SHARPNESS_STATIC)->SetText(sz);

            break;
        }
        case IDC_PER_PIXEL_AO:
        {
            g_AOParams.Output.MSAAMode = GFSDK_SSAO_PER_PIXEL_AO;
            break;
        }
        case IDC_PER_SAMPLE_AO:
        {
            g_AOParams.Output.MSAAMode = GFSDK_SSAO_PER_SAMPLE_AO;
            break;
        }
        case IDC_1xMSAA:
        case IDC_2xMSAA:
        case IDC_4xMSAA:
        case IDC_8xMSAA:
        {
            g_RenderTargetsDirty = true;
            g_MSAACurrentSettings = nControlID - IDC_1xMSAA;
            assert(g_MSAACurrentSettings >= MSAA_MODE_1X);
            assert(g_MSAACurrentSettings <= MSAA_MODE_8X);
            break;
        }
    }
}
Example #17
0
//--------------------------------------------------------------------------------------
// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)
// and aren't tied to the back buffer size 
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                     void* pUserContext )
{
    HRESULT hr;

    V_RETURN( g_DialogResourceManager.OnD3D9CreateDevice( pd3dDevice ) );
    V_RETURN( g_D3DSettingsDlg.OnD3D9CreateDevice( pd3dDevice ) );

    // Initialize the font
    V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
                              OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                              L"Arial", &g_pFont9 ) );

    // Load the mesh
    V_RETURN( LoadMesh( pd3dDevice, L"tiny\\tiny.x", &g_pMesh9 ) );

    g_SampleUI.GetStatic( IDC_NUM_LIGHTS_STATIC )->SetVisible( true );
    g_SampleUI.GetSlider( IDC_NUM_LIGHTS )->SetVisible( true );
    g_SampleUI.GetButton( IDC_ACTIVE_LIGHT )->SetVisible( true );

    D3DXVECTOR3* pData;
    D3DXVECTOR3 vCenter;
    FLOAT fObjectRadius;
    V( g_pMesh9->LockVertexBuffer( 0, ( LPVOID* )&pData ) );
    V( D3DXComputeBoundingSphere( pData, g_pMesh9->GetNumVertices(),
                                  D3DXGetFVFVertexSize( g_pMesh9->GetFVF() ), &vCenter, &fObjectRadius ) );
    V( g_pMesh9->UnlockVertexBuffer() );

    D3DXMatrixTranslation( &g_mCenterMesh, -vCenter.x, -vCenter.y, -vCenter.z );
    D3DXMATRIXA16 m;
    D3DXMatrixRotationY( &m, D3DX_PI );
    g_mCenterMesh *= m;
    D3DXMatrixRotationX( &m, D3DX_PI / 2.0f );
    g_mCenterMesh *= m;

    V_RETURN( CDXUTDirectionWidget::StaticOnD3D9CreateDevice( pd3dDevice ) );
    for( int i = 0; i < MAX_LIGHTS; i++ )
        g_LightControl[i].SetRadius( fObjectRadius );

    // Read the D3DX effect file
    WCHAR str[MAX_PATH];
    DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE | D3DXSHADER_NO_PRESHADER | D3DXFX_LARGEADDRESSAWARE;
#ifdef DEBUG_VS
        dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
    #endif
#ifdef DEBUG_PS
        dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
    #endif
    V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL.fx" ) );
    V_RETURN( D3DXCreateEffectFromFile( pd3dDevice, str, NULL, NULL, dwShaderFlags, NULL, &g_pEffect9, NULL ) );

    // Create the mesh texture from a file
    V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"tiny\\tiny_skin.dds" ) );

    V_RETURN( D3DXCreateTextureFromFileEx( pd3dDevice, str, D3DX_DEFAULT, D3DX_DEFAULT,
                                           D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
                                           D3DX_DEFAULT, D3DX_DEFAULT, 0,
                                           NULL, NULL, &g_pMeshTexture9 ) );

    // Set effect variables as needed
    D3DXCOLOR colorMtrlDiffuse( 1.0f, 1.0f, 1.0f, 1.0f );
    D3DXCOLOR colorMtrlAmbient( 0.35f, 0.35f, 0.35f, 0 );

    D3DXHANDLE hMaterialAmbientColor = g_pEffect9->GetParameterByName( NULL, "g_MaterialAmbientColor" );
    D3DXHANDLE hMaterialDiffuseColor = g_pEffect9->GetParameterByName( NULL, "g_MaterialDiffuseColor" );
    D3DXHANDLE hMeshTexture = g_pEffect9->GetParameterByName( NULL, "g_MeshTexture" );

    V_RETURN( g_pEffect9->SetValue( hMaterialAmbientColor, &colorMtrlAmbient, sizeof( D3DXCOLOR ) ) );
    V_RETURN( g_pEffect9->SetValue( hMaterialDiffuseColor, &colorMtrlDiffuse, sizeof( D3DXCOLOR ) ) );
    V_RETURN( g_pEffect9->SetTexture( hMeshTexture, g_pMeshTexture9 ) );

    g_hLightDir = g_pEffect9->GetParameterByName( NULL, "g_LightDir" );
    g_hLightDiffuse = g_pEffect9->GetParameterByName( NULL, "g_LightDiffuse" );
    g_hmWorldViewProjection = g_pEffect9->GetParameterByName( NULL, "g_mWorldViewProjection" );
    g_hmWorld = g_pEffect9->GetParameterByName( NULL, "g_mWorld" );
    g_hMaterialDiffuseColor = g_pEffect9->GetParameterByName( NULL, "g_MaterialDiffuseColor" );
    g_hfTime = g_pEffect9->GetParameterByName( NULL, "g_fTime" );
    g_hnNumLights = g_pEffect9->GetParameterByName( NULL, "g_nNumLights" );
    g_hRenderSceneWithTexture1Light = g_pEffect9->GetTechniqueByName( "RenderSceneWithTexture1Light" );
    g_hRenderSceneWithTexture2Light = g_pEffect9->GetTechniqueByName( "RenderSceneWithTexture2Light" );
    g_hRenderSceneWithTexture3Light = g_pEffect9->GetTechniqueByName( "RenderSceneWithTexture3Light" );

    // Setup the camera's view parameters
    D3DXVECTOR3 vecEye( 0.0f, 0.0f, -15.0f );
    D3DXVECTOR3 vecAt ( 0.0f, 0.0f, -0.0f );
    g_Camera.SetViewParams( &vecEye, &vecAt );
    g_Camera.SetRadius( fObjectRadius * 3.0f, fObjectRadius * 0.5f, fObjectRadius * 10.0f );

    return S_OK;
}
Example #18
0
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
	float val;
	wchar_t str[512];
	FILE* file2;
	LPCWSTR ttext;

    switch( nControlID )
    {
		//main menu
        case IDC_TOGGLEFULLSCREEN:
            DXUTToggleFullScreen(); 
			break;
		
		case IDC_SAVEFILE_BTN:

			swprintf(str,L"./%s",g_HUD.GetEditBox( IDC_SAVEFILE )->GetText());
			manipulator->SaveConfig(str);

			break;

		case IDC_NEWFILE_BTN:

			swprintf(str,L"./%s",g_HUD.GetEditBox( IDC_NEWFILE )->GetText());

			file2 = _wfopen(str,L"w+");
			fclose(file2);

			IniWrite(str,L"manipulator",L"chainsize",L"1");

			IniWrite(str,L"chain_0",L"coefficient",L"0.8");
			IniWrite(str,L"chain_0",L"direction",L"1.00");
			IniWrite(str,L"chain_0",L"displace",L"-1.57");
			IniWrite(str,L"chain_0",L"length",L"90.00");
			IniWrite(str,L"chain_0",L"width",L"10.00");
			IniWrite(str,L"chain_0",L"initangle",L"0.00 0.00");
			IniWrite(str,L"chain_0",L"angle_restrict_phi",L"-3.14 3.14");
			IniWrite(str,L"chain_0",L"angle_restrict_theta",L"-3.14 3.14");
			IniWrite(str,L"chain_0",L"parent_index",L"-1");
			IniWrite(str,L"chain_0",L"model",L"");
			IniWrite(str,L"chain_0",L"offset",L"0 0 0");
			IniWrite(str,L"chain_0",L"mass",L"100.00");
			IniWrite(str,L"chain_0",L"tilt",L"0");
			IniWrite(str,L"chain_0",L"pressure",L"0");
			IniWrite(str,L"chain_0",L"laser",L"0");

			manipulator->Release();
			manipulator->Create(DXUTGetD3D9Device(), str);

			MessageBox(0,L"Создана новая конфигурация манипулятора",L"",0);

			OnChainSelect(-1);
			break;

		case IDC_LOADFILE_BTN:

			manipulator->Release();

			swprintf(str,L"./%s",g_HUD.GetEditBox( IDC_LOADFILE )->GetText());
			manipulator->Create(DXUTGetD3D9Device(), str);

			MessageBox(0,L"Манипулятор загружен из файла",L"",0);
			OnChainSelect(-1);
			break;

			
		//dialog menu
		case IDC_ADDCHAIN:
			manipulator->AddChain(DXUTGetD3D9Device());
			break;

		case IDC_REMOVECHAIN:
			manipulator->RemoveChain();
			break;

		case IDC_WIDTH:
			switch( nEvent )
            {
				case EVENT_EDITBOX_STRING:
                {
					float fWidth;
					LPCWSTR text = (( CDXUTEditBox* )pControl )->GetText();
					swscanf(text, L"%f", &fWidth);

					g_SampleUI.GetSlider(IDC_WIDTH_SLIDER)->SetValue(fWidth);

					manipulator->cube[manipulator->selectedChain]->SetWidth(fWidth);
					break;
				}
			}
			break;

		case IDC_WIDTH_SLIDER:

			val = (float)( ( CDXUTSlider* )pControl )->GetValue();
            manipulator->cube[manipulator->selectedChain]->SetWidth(val);

			swprintf(str,L"%.2f",val);
			g_SampleUI.GetEditBox( IDC_WIDTH )->SetText(str);

            break;

		case IDC_LENGTH:
			switch( nEvent )
            {
				case EVENT_EDITBOX_STRING:
                {
					float fLength;
					LPCWSTR text = (( CDXUTEditBox* )pControl )->GetText();
					swscanf(text, L"%f", &fLength);

					g_SampleUI.GetSlider(IDC_LENGTH_SLIDER)->SetValue(fLength);

					manipulator->cube[manipulator->selectedChain]->SetLength(fLength);
					break;
				}
			}
			break;

		case IDC_LENGTH_SLIDER:

			val = (float)( ( CDXUTSlider* )pControl )->GetValue();
            manipulator->cube[manipulator->selectedChain]->SetLength(val);

			swprintf(str,L"%.2f",val);
			g_SampleUI.GetEditBox( IDC_LENGTH )->SetText(str);

            break;

		case IDC_ANGLE_RESTRICT_XL:
		case IDC_ANGLE_RESTRICT_XU:
		case IDC_ANGLE_RESTRICT_YL:
		case IDC_ANGLE_RESTRICT_YU:
		switch( nEvent )
        {
			case EVENT_EDITBOX_STRING:
            {
				LPCWSTR text = (( CDXUTEditBox* )pControl )->GetText();
				swscanf(text, L"%f", &val);

				if(pControl->GetID() == IDC_ANGLE_RESTRICT_XL)
						manipulator->cube[manipulator->selectedChain]->restrictAngleX.x = val;
				else if(pControl->GetID() == IDC_ANGLE_RESTRICT_XU)
						manipulator->cube[manipulator->selectedChain]->restrictAngleX.y = val;
				else if(pControl->GetID() == IDC_ANGLE_RESTRICT_YL)
						manipulator->cube[manipulator->selectedChain]->restrictAngleY.x = val;
				else if(pControl->GetID() == IDC_ANGLE_RESTRICT_YU)
						manipulator->cube[manipulator->selectedChain]->restrictAngleY.y = val;
				break;
			}
		}
		break;

		case IDC_ANGLE_RESTRICT_XL_BTN:
			swprintf(str,L"%.2f", manipulator->cube[manipulator->selectedChain]->vAngle.x);	
			g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_XL )->SetText(str);
			manipulator->cube[manipulator->selectedChain]->restrictAngleX.x = manipulator->cube[manipulator->selectedChain]->vAngle.x;
			break;
		case IDC_ANGLE_RESTRICT_XU_BTN:
			swprintf(str,L"%.2f", manipulator->cube[manipulator->selectedChain]->vAngle.x);	
			g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_XU )->SetText(str);
			manipulator->cube[manipulator->selectedChain]->restrictAngleX.y = manipulator->cube[manipulator->selectedChain]->vAngle.x;
			break;
		case IDC_ANGLE_RESTRICT_YL_BTN:
			swprintf(str,L"%.2f", manipulator->cube[manipulator->selectedChain]->vAngle.y);	
			g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_YL )->SetText(str);
			manipulator->cube[manipulator->selectedChain]->restrictAngleY.x = manipulator->cube[manipulator->selectedChain]->vAngle.y;
			break;
		case IDC_ANGLE_RESTRICT_YU_BTN:
			swprintf(str,L"%.2f", manipulator->cube[manipulator->selectedChain]->vAngle.y);	
			g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_YU )->SetText(str);
			manipulator->cube[manipulator->selectedChain]->restrictAngleY.y = manipulator->cube[manipulator->selectedChain]->vAngle.y;
			break;


		case IDC_OFFSET_X:
		case IDC_OFFSET_Y:
		case IDC_OFFSET_Z:
			switch( nEvent )
            {
				case EVENT_EDITBOX_STRING:
                {
					LPCWSTR text = (( CDXUTEditBox* )pControl )->GetText();
					swscanf(text, L"%f", &val);

					if(pControl->GetID() == IDC_OFFSET_X)
						manipulator->cube[manipulator->selectedChain]->vOffset.x = val;
					else if(pControl->GetID() == IDC_OFFSET_Y)
							manipulator->cube[manipulator->selectedChain]->vOffset.y = val;
					else if(pControl->GetID() == IDC_OFFSET_Z)
							manipulator->cube[manipulator->selectedChain]->vOffset.z = val;

					break;
				}
			}
			break;


		case IDC_DISPLACE:
			ttext = (( CDXUTEditBox* )pControl )->GetText();
			swscanf(ttext, L"%f", &val);
			manipulator->cube[manipulator->selectedChain]->fDisplace = val;
			break;

		case IDC_DIRECTION:
			ttext = (( CDXUTEditBox* )pControl )->GetText();
			swscanf(ttext, L"%f", &val);
			manipulator->cube[manipulator->selectedChain]->fDirection = val;
			break;

		case IDC_COEFFICIENT:
			ttext = (( CDXUTEditBox* )pControl )->GetText();
			swscanf(ttext, L"%f", &val);
			manipulator->cube[manipulator->selectedChain]->fCoefficient = val;
			break;

		case IDC_MASS:
			ttext = (( CDXUTEditBox* )pControl )->GetText();
			swscanf(ttext, L"%f", &val);
			manipulator->cube[manipulator->selectedChain]->fMass = val;
			break;

		case IDC_TILT:
			manipulator->cube[manipulator->selectedChain]->bTilt = ((CDXUTCheckBox*)pControl )->GetChecked();
			break;

		case IDC_PRESSURE:
			manipulator->cube[manipulator->selectedChain]->bPressure = ((CDXUTCheckBox*)pControl )->GetChecked();
			break;

		case IDC_LASER:
			manipulator->cube[manipulator->selectedChain]->bLaser = ((CDXUTCheckBox*)pControl )->GetChecked();
			break;


		case IDC_CMD:
			switch( nEvent )
            {
				case EVENT_EDITBOX_STRING:
					ttext = (( CDXUTEditBox* )pControl )->GetText();
					CMDProcess(ttext);
					(( CDXUTEditBox* )pControl )->SetText(L"");
					break;

				case EVENT_EDITBOX_CHANGE:
				break;
			}
			
			break;

    }
}
Example #19
0
//------------------------------------------------------------------------
// Name: OnChainSelect
// Desc: event handler for select one of chains
//------------------------------------------------------------------------
HRESULT OnChainSelect(int iID)
{
	if(iID >= 0)
	{
		wchar_t str[256];
		cprimitive* chain = manipulator->cube[iID];
		
		g_SampleUI.SetVisible(true);

		swprintf(str,L"You picked chain # %d",iID);
		g_SampleUI.GetStatic( IDC_OBJNAME )->SetText(str);

		g_SampleUI.GetSlider(IDC_WIDTH_SLIDER)->SetValue(chain->fWidth);

		swprintf(str,L"%.2f",chain->fWidth);
		g_SampleUI.GetEditBox( IDC_WIDTH )->SetText(str);

		g_SampleUI.GetSlider(IDC_LENGTH_SLIDER)->SetValue(chain->fLength);

		swprintf(str,L"%.2f",chain->fLength);
		g_SampleUI.GetEditBox( IDC_LENGTH )->SetText(str);

		swprintf(str,L"%.2f",chain->restrictAngleX.x);
		g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_XL )->SetText(str);
		swprintf(str,L"%.2f",chain->restrictAngleX.y);
		g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_XU )->SetText(str);
		swprintf(str,L"%.2f",chain->restrictAngleY.x);
		g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_YL )->SetText(str);
		swprintf(str,L"%.2f",chain->restrictAngleY.y);
		g_SampleUI.GetEditBox( IDC_ANGLE_RESTRICT_YU )->SetText(str);

		swprintf(str,L"%.2f",chain->vOffset.x);
		g_SampleUI.GetEditBox( IDC_OFFSET_X )->SetText(str);
		swprintf(str,L"%.2f",chain->vOffset.y);
		g_SampleUI.GetEditBox( IDC_OFFSET_Y )->SetText(str);
		swprintf(str,L"%.2f",chain->vOffset.z);
		g_SampleUI.GetEditBox( IDC_OFFSET_Z )->SetText(str);

		swprintf(str,L"%.2f",chain->fDisplace);
		g_SampleUI.GetEditBox( IDC_DISPLACE )->SetText(str);
		swprintf(str,L"%.2f",chain->fDirection);
		g_SampleUI.GetEditBox( IDC_DIRECTION )->SetText(str);
		swprintf(str,L"%.2f",chain->fCoefficient);
		g_SampleUI.GetEditBox( IDC_COEFFICIENT )->SetText(str);
		swprintf(str,L"%.2f",chain->fMass);
		g_SampleUI.GetEditBox( IDC_MASS )->SetText(str);

		g_SampleUI.GetCheckBox( IDC_TILT )->SetChecked(chain->bTilt);
		g_SampleUI.GetCheckBox( IDC_PRESSURE )->SetChecked(chain->bPressure);
		g_SampleUI.GetCheckBox( IDC_LASER )->SetChecked(chain->bLaser);


		swprintf(str,L"X: %.2f",chain->vAngle.x);
		g_SampleUI.GetStatic( IDC_STATIC7 )->SetText(str);
		swprintf(str,L"Y: %.2f",chain->vAngle.y);
		g_SampleUI.GetStatic( IDC_STATIC8 )->SetText(str);
	}
	else
	{
		g_SampleUI.SetVisible(false);
	}

	return S_OK;
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT nEvent, INT nControlID, CDXUTControl* /*pControl*/, void* /*pUserContext*/)
{
    switch (nControlID)
    {
    case IDC_TOGGLEFULLSCREEN:
        DXUTToggleFullScreen(); break;
    case IDC_TOGGLEWARP:
        DXUTToggleWARP(); break;
    case IDC_CHANGEDEVICE:
        g_D3DSettingsDlg.SetActive(!g_D3DSettingsDlg.IsActive()); break;
        break;
        break;
    case IDC_FIT_TO_CASCADE:
        g_CascadedShadow.m_eSelectedCascadesFit =
            (FIT_PROJECTION_TO_CASCADES)PtrToUlong(g_FitToCascadesCombo->GetSelectedData());
        break;
    case IDC_FIT_TO_NEARFAR:
    {
        g_CascadedShadow.m_eSelectedNearFarFit =
            (FIT_TO_NEAR_FAR)PtrToUlong(g_FitToNearFarCombo->GetSelectedData());
        if (g_CascadedShadow.m_eSelectedNearFarFit == FIT_NEARFAR_PANCAKING)
        {
            g_CascadedShadow.m_eSelectedCascadeSelection = CASCADE_SELECTION_INTERVAL;
            g_CascadeSelectionCombo->SetSelectedByData(ULongToPtr(CASCADE_SELECTION_INTERVAL));
        }
    }
    break;
    case IDC_CASCADE_SELECT:
    {
        static int iSaveLastCascadeValue = 100;
        if ((CASCADE_SELECTION)PtrToUlong(g_CascadeSelectionCombo->GetSelectedData()) == CASCADE_SELECTION_MAP)
        {
            if ((FIT_TO_NEAR_FAR)PtrToUlong(g_FitToNearFarCombo->GetSelectedData()) == FIT_NEARFAR_PANCAKING)
            {
                g_FitToNearFarCombo->SetSelectedByData(ULongToPtr(FIT_NEARFAR_SCENE_AABB));
                g_CascadedShadow.m_eSelectedNearFarFit = FIT_NEARFAR_SCENE_AABB;
            }
            g_CascadedShadow.m_iCascadePartitionsZeroToOne[g_CascadeConfig.m_nCascadeLevels - 1] = iSaveLastCascadeValue;
        }
        else
        {
            iSaveLastCascadeValue = g_CascadedShadow.m_iCascadePartitionsZeroToOne[g_CascadeConfig.m_nCascadeLevels - 1];
            g_CascadedShadow.m_iCascadePartitionsZeroToOne[g_CascadeConfig.m_nCascadeLevels - 1] = 100;
        }
        g_CascadedShadow.m_eSelectedCascadeSelection =
            (CASCADE_SELECTION)PtrToUlong(g_CascadeSelectionCombo->GetSelectedData());

        g_HUD.GetSlider(IDC_CASCADELEVEL1 + g_CascadeConfig.m_nCascadeLevels - 1)->SetValue(
            g_CascadedShadow.m_iCascadePartitionsZeroToOne[g_CascadeConfig.m_nCascadeLevels - 1]);
        WCHAR label[16];
        swprintf_s(label, L"L%d: %d", g_CascadeConfig.m_nCascadeLevels,
            g_CascadedShadow.m_iCascadePartitionsZeroToOne[g_CascadeConfig.m_nCascadeLevels - 1]);
        g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + g_CascadeConfig.m_nCascadeLevels - 1)->SetText(label);

    }
    break;
    case IDC_MOVE_LIGHT_IN_TEXEL_INC:
        g_bMoveLightTexelSize = !g_bMoveLightTexelSize;
        g_CascadedShadow.m_bMoveLightTexelSize = g_bMoveLightTexelSize;
        break;

    case IDC_TOGGLEVISUALIZECASCADES:
        g_bVisualizeCascades = !g_bVisualizeCascades;
        break;

    case IDC_PCF_SIZE:
    {
        INT PCFSize = g_HUD.GetSlider(IDC_PCF_SIZE)->GetValue();
        PCFSize *= 2;
        PCFSize -= 1;
        WCHAR desc[256];
        swprintf_s(desc, L"PCF Blur: %d ", PCFSize);
        g_HUD.GetStatic(IDC_PCF_SIZETEXT)->SetText(desc);
        g_CascadedShadow.m_iPCFBlurSize = PCFSize;
    }
    break;
    case IDC_PCF_OFFSET_SIZE:
    {
        INT offset = g_HUD.GetSlider(IDC_PCF_OFFSET_SIZE)->GetValue();
        FLOAT useoffset = (FLOAT)offset * 0.001f;
        WCHAR desc[256];
        swprintf_s(desc, L" Offset: %0.03f", useoffset);
        g_HUD.GetStatic(IDC_PCF_OFFSET_SIZETEXT)->SetText(desc);
        g_CascadedShadow.m_fPCFOffset = useoffset;
    }
    break;

    case IDC_BLEND_BETWEEN_MAPS_CHECK:
        if (g_HUD.GetCheckBox(IDC_BLEND_BETWEEN_MAPS_CHECK)->GetChecked())
            g_CascadedShadow.m_iBlurBetweenCascades = 1;
        else
            g_CascadedShadow.m_iBlurBetweenCascades = 0;
        break;

    case IDC_BLEND_MAPS_SLIDER:
    {
        INT val = g_HUD.GetSlider(IDC_BLEND_MAPS_SLIDER)->GetValue();
        g_CascadedShadow.m_fBlurBetweenCascadesAmount = (float)val * 0.005f;
        WCHAR dta[256];
        swprintf_s(dta, L"Cascade Blur %0.03f", g_CascadedShadow.m_fBlurBetweenCascadesAmount);
        g_HUD.GetCheckBox(IDC_BLEND_BETWEEN_MAPS_CHECK)->SetText(dta);
    }
    break;

    case IDC_TOGGLE_DERIVATIVE_OFFSET:
    {
        if (g_CascadedShadow.m_iDerivativeBasedOffset == 0)
            g_CascadedShadow.m_iDerivativeBasedOffset = 1;
        else
            g_CascadedShadow.m_iDerivativeBasedOffset = 0;

    }
    break;
    case IDC_BUFFER_SIZE:
    {
        INT value = 32 * g_HUD.GetSlider(IDC_BUFFER_SIZE)->GetValue();
        INT max = 8192 / g_CascadeConfig.m_nCascadeLevels;
        if (value > max)
        {
            value = max;
            g_HUD.GetSlider(IDC_BUFFER_SIZE)->SetValue(value / 32);
        }
        WCHAR desc[256];
        swprintf_s(desc, L"Texture Size: %d ", value);
        g_HUD.GetStatic(IDC_BUFFER_SIZETEXT)->SetText(desc);

        //Only tell the app to recreate buffers once the user is through moving the slider. 
        if (nEvent == EVENT_SLIDER_VALUE_CHANGED_UP)
        {
            g_CascadeConfig.m_iBufferSize = value;
        }
    }
    break;
    case IDC_SELECTED_SCENE:
    {
        SCENE_SELECTION ss = (SCENE_SELECTION)PtrToUlong(g_SceneSelectCombo->GetSelectedData());
        if (ss == POWER_PLANT_SCENE)
        {
            g_pSelectedMesh = &g_MeshPowerPlant;
        }
        else if (ss == TEST_SCENE)
        {
            g_pSelectedMesh = &g_MeshTestScene;
        }
        DestroyD3DComponents();
        CreateD3DComponents(DXUTGetD3D11Device());
        UpdateViewerCameraNearFar();
    }
    case IDC_SELECTED_CAMERA:
    {
        g_CascadedShadow.m_eSelectedCamera = (CAMERA_SELECTION)
            (g_CameraSelectCombo->GetSelectedIndex());

        if (g_CascadedShadow.m_eSelectedCamera < 1)
        {
            g_pActiveCamera = &g_ViewerCamera;
        }
        else
        {
            g_pActiveCamera = &g_LightCamera;
        }
    }
    break;
    case IDC_CASCADELEVELS:
    {
        INT ind = 1 + g_CascadeLevelsCombo->GetSelectedIndex();
        g_CascadeConfig.m_nCascadeLevels = ind;
        for (INT index = 0; index < ind; ++index)
        {
            g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + index)->SetVisible(true);
            g_HUD.GetSlider(IDC_CASCADELEVEL1 + index)->SetVisible(true);
        }
        for (int index = ind; index < MAX_CASCADES; ++index)
        {
            g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + index)->SetVisible(false);
            g_HUD.GetSlider(IDC_CASCADELEVEL1 + index)->SetVisible(false);
        }
        INT value = 32 * g_HUD.GetSlider(IDC_BUFFER_SIZE)->GetValue();
        INT max = 8192 / g_CascadeConfig.m_nCascadeLevels;
        if (value > max)
        {
            WCHAR desc[256];
            value = max;

            swprintf_s(desc, L"Texture Size: %d ", value);
            g_HUD.GetStatic(IDC_BUFFER_SIZETEXT)->SetText(desc);
            g_HUD.GetSlider(IDC_BUFFER_SIZE)->SetValue(value / 32);
            g_CascadeConfig.m_iBufferSize = value;
        }

        // update the selected camera based on these changes.
        INT selected = g_CameraSelectCombo->GetSelectedIndex();
        WCHAR dta[60];
        g_CameraSelectCombo->RemoveAllItems();
        swprintf_s(dta, L"Eye Camera %ld", EYE_CAMERA + 1);
        g_CameraSelectCombo->AddItem(dta, ULongToPtr(EYE_CAMERA));
        swprintf_s(dta, L"Light Camera %ld", LIGHT_CAMERA + 1);
        g_CameraSelectCombo->AddItem(dta, ULongToPtr(LIGHT_CAMERA));
        for (int index = 0; index < g_CascadeConfig.m_nCascadeLevels; ++index)
        {
            swprintf_s(dta, L"Cascade Cam %d", index + 1);
            g_CameraSelectCombo->AddItem(dta, ULongToPtr(ORTHO_CAMERA1 + index));
        }
        if (selected - 1 >= ind)
        {
            selected = ind + 1;
        }
        g_CameraSelectCombo->SetSelectedByIndex(selected);

        g_CascadedShadow.m_eSelectedCamera = (CAMERA_SELECTION)
            (g_CameraSelectCombo->GetSelectedIndex());

        if (g_CascadedShadow.m_eSelectedCamera < 1)
        {
            g_pActiveCamera = &g_ViewerCamera;
        }
        else
        {
            g_pActiveCamera = &g_LightCamera;
        }
    }
    break;
    case IDC_DEPTHBUFFERFORMAT:
    {
        SHADOW_TEXTURE_FORMAT sbt = (SHADOW_TEXTURE_FORMAT)PtrToUlong(g_DepthBufferFormatCombo->GetSelectedData());
        g_CascadeConfig.m_ShadowBufferFormat = sbt;
    }
    break;
    case IDC_CASCADELEVEL1:
    case IDC_CASCADELEVEL2:
    case IDC_CASCADELEVEL3:
    case IDC_CASCADELEVEL4:
    case IDC_CASCADELEVEL5:
    case IDC_CASCADELEVEL6:
    case IDC_CASCADELEVEL7:
    case IDC_CASCADELEVEL8:
    {
        INT ind = nControlID - IDC_CASCADELEVEL1;
        INT move = g_HUD.GetSlider(nControlID)->GetValue();
        CDXUTSlider* selecteSlider;
        CDXUTStatic* selectedStatic;
        WCHAR label[16];
        for (int index = 0; index < ind; ++index)
        {
            selecteSlider = g_HUD.GetSlider(IDC_CASCADELEVEL1 + index);
            INT sVal = selecteSlider->GetValue();
            if (move < sVal)
            {
                selecteSlider->SetValue(move);
                selectedStatic = g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + index);
                swprintf_s(label, L"L%d: %d", index + 1, move);
                selectedStatic->SetText(label);
                g_CascadedShadow.m_iCascadePartitionsZeroToOne[index] = move;
            }
        }
        for (int index = ind; index < MAX_CASCADES; ++index)
        {
            selecteSlider = g_HUD.GetSlider(IDC_CASCADELEVEL1 + index);
            INT sVal = selecteSlider->GetValue();
            if (move >= sVal)
            {
                selecteSlider->SetValue(move);
                selectedStatic = g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + index);
                swprintf_s(label, L"L%d: %d", index + 1, move);
                selectedStatic->SetText(label);
                g_CascadedShadow.m_iCascadePartitionsZeroToOne[index] = move;
            }
        }


    }
    break;
    }

}
Example #21
0
void CALLBACK onGUIEvent(UINT event, int controlId, CDXUTControl* control, void *userContext) {
    switch(controlId) {
        case IDC_TOGGLE_FULLSCREEN:
            DXUTToggleFullScreen();
            break;
        case IDC_PRESET:
            if (event == EVENT_COMBOBOX_SELECTION_CHANGED) {
                SMAA::Preset selected;
                selected = SMAA::Preset(int(hud.GetComboBox(IDC_PRESET)->GetSelectedData()));
                onLostDevice(NULL);
                onResetDevice(DXUTGetD3D9Device(), DXUTGetD3D9BackBufferSurfaceDesc(), NULL);
            }
            break;
        case IDC_ANTIALIASING:
            if (event == EVENT_CHECKBOX_CHANGED)
                timer->reset();
            break;
        case IDC_PROFILE:
            if (event == EVENT_CHECKBOX_CHANGED) {
                timer->reset();
                timer->setEnabled(hud.GetCheckBox(IDC_PROFILE)->GetChecked());
            }
            break;
        case IDC_THRESHOLD:
            if (event == EVENT_SLIDER_VALUE_CHANGED) {
                CDXUTSlider *slider = 	hud.GetSlider(IDC_THRESHOLD);
                int min, max;
                slider->GetRange(min, max);

                float scale = float(slider->GetValue()) / (max - min);
                smaa->setThreshold(scale * 0.5f);
            
                wstringstream s;
                s << L"Threshold: " << scale * 0.5f;
                hud.GetStatic(IDC_THRESHOLD_LABEL)->SetText(s.str().c_str());
            }
            break;
        case IDC_MAX_SEARCH_STEPS:
            if (event == EVENT_SLIDER_VALUE_CHANGED) {
                CDXUTSlider *slider = 	hud.GetSlider(IDC_MAX_SEARCH_STEPS);
                int min, max;
                slider->GetRange(min, max);

                float scale = float(slider->GetValue()) / (max - min);
                smaa->setMaxSearchSteps(int(round(scale * 98.0f)));

                wstringstream s;
                s << L"Max Search Steps: " << int(round(scale * 98.0f));
                hud.GetStatic(IDC_MAX_SEARCH_STEPS_LABEL)->SetText(s.str().c_str());
            }
            break;
        case IDC_MAX_SEARCH_STEPS_DIAG:
            if (event == EVENT_SLIDER_VALUE_CHANGED) {
                CDXUTSlider *slider = 	hud.GetSlider(IDC_MAX_SEARCH_STEPS_DIAG);
                int min, max;
                slider->GetRange(min, max);

                float scale = float(slider->GetValue()) / (max - min);
                smaa->setMaxSearchStepsDiag(int(round(scale * 20.0f)));

                wstringstream s;
                s << L"Max Diag. Search Steps: " << int(round(scale * 20.0f));
                hud.GetStatic(IDC_MAX_SEARCH_STEPS_DIAG_LABEL)->SetText(s.str().c_str());
            }
            break;
        case IDC_CORNER_ROUNDING:
            if (event == EVENT_SLIDER_VALUE_CHANGED) {
                CDXUTSlider *slider = 	hud.GetSlider(IDC_CORNER_ROUNDING);
                int min, max;
                slider->GetRange(min, max);

                float scale = float(slider->GetValue()) / (max - min);
                smaa->setCornerRounding(scale * 100.0f);

                wstringstream s;
                s << L"Corner Rounding: " << scale * 100.0f;
                hud.GetStatic(IDC_CORNER_ROUNDING_LABEL)->SetText(s.str().c_str());
            }
            break;
    }
}
Example #22
0
// Handles the GUI events
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
    switch( nControlID )
    {
        case IDC_TOGGLEFULLSCREEN:
		{
            DXUTToggleFullScreen();
			break;
		}
        case IDC_TOGGLEREF:
		{
            DXUTToggleREF();
			break;
		}
        case IDC_CHANGEDEVICE:
		{
            gD3DSettingsDlg.SetActive( !gD3DSettingsDlg.IsActive() );
			break;
		}
        case IDC_TEXT:
        case IDC_EXPOSURE:
        {
            gLog2Exposure = (gSampleUI.GetSlider(IDC_EXPOSURE)->GetValue() / 100.0f - 0.5f) * 33.33333;
			WCHAR wstr[MAX_PATH];
			swprintf_s(wstr, MAX_PATH, 
				L"Texture Size: %d x %d\n" 
                L"logRGB L1: %.2f%%\n"
                //L"logRGB RMSE: %.4f\n"
                //L"Relative error: %.2f%%\n"
                //L"mPSNR: %.2f%%\n"
                L"Exposure: %.2f\n"
				L"Compression Time: %0.2f ms\n"
				L"Compression Rate: %0.2f Mp/s\n", 
				gTexWidth, gTexHeight,
                gError, gLog2Exposure,
				gCompTime, gCompRate);
			gSampleUI.GetStatic(IDC_TEXT)->SetText(wstr);
			break;
		}
		case IDC_MT:
		{
			// Shut down all previous threading abilities.
			DestroyThreads();
			
			gMultithreaded = gSampleUI.GetCheckBox(IDC_MT)->GetChecked();
					
			if (gMultithreaded)
			{
				InitWin32Threads();
			}

			// Recompress the texture.
			RecompressTexture();
			gSampleUI.SendEvent(IDC_TEXT, true, gSampleUI.GetStatic(IDC_TEXT));

			break;
		}
		case IDC_PROFILE:
		{ 
			gCompressionFunc = (CompressionFunc*)gSampleUI.GetComboBox(IDC_PROFILE)->GetSelectedData();

			// Recompress the texture.
			RecompressTexture();
			gSampleUI.SendEvent(IDC_TEXT, true, gSampleUI.GetStatic(IDC_TEXT));

			break;
		}
		case IDC_LOAD_TEXTURE:
		{
			// Store the current working directory.
			TCHAR workingDirectory[MAX_PATH];
			GetCurrentDirectory(MAX_PATH, workingDirectory);

			// Open a file dialog.
			OPENFILENAME openFileName;
			WCHAR file[MAX_PATH];
			file[0] = 0;
			ZeroMemory(&openFileName, sizeof(OPENFILENAME));
			openFileName.lStructSize = sizeof(OPENFILENAME);
			openFileName.lpstrFile = file;
			openFileName.nMaxFile = MAX_PATH;
			openFileName.lpstrFilter = L"DDS\0*.dds\0\0";
			openFileName.nFilterIndex = 1;
			openFileName.lpstrInitialDir = NULL;
			openFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
			if(GetOpenFileName(&openFileName))
			{
				//CreateTextures(openFileName.lpstrFile);
                SAFE_RELEASE(gUncompressedSRV);
                LoadTexture(openFileName.lpstrFile);
			}

			// Restore the working directory. GetOpenFileName changes the current working directory which causes problems with relative paths to assets.
			SetCurrentDirectory(workingDirectory);

            RecompressTexture();
			gSampleUI.SendEvent(IDC_TEXT, true, gSampleUI.GetStatic(IDC_TEXT));
			
			break;
		}
		case IDC_RECOMPRESS:
		{
			// Recompress the texture.
			RecompressTexture();
			gSampleUI.SendEvent(IDC_TEXT, true, gSampleUI.GetStatic(IDC_TEXT));

			break;
		}
		case IDC_SAVE_TEXTURE:
		{
			// Store the current working directory.
			TCHAR workingDirectory[MAX_PATH];
			GetCurrentDirectory(MAX_PATH, workingDirectory);

			// Open a file dialog.
			OPENFILENAME openFileName;
			WCHAR file[MAX_PATH];
			file[0] = 0;
			ZeroMemory(&openFileName, sizeof(OPENFILENAME));
			openFileName.lStructSize = sizeof(OPENFILENAME);
			openFileName.lpstrFile = file;
			openFileName.nMaxFile = MAX_PATH;
			openFileName.lpstrFilter = L"DDS\0*.dds\0\0";
			openFileName.lpstrDefExt = L"dds";
			openFileName.nFilterIndex = 1;
			openFileName.lpstrInitialDir = NULL;
			openFileName.Flags = OFN_PATHMUSTEXIST;
            
			if(GetSaveFileName(&openFileName))
			{
				SaveTexture(gCompressedSRV,openFileName.lpstrFile);
			}

			// Restore the working directory. GetOpenFileName changes the current working directory which causes problems with relative paths to assets.
			SetCurrentDirectory(workingDirectory);

			break;
		}
		case IDC_IMAGEVIEW:
		{
			gImageView = (EImageView)(INT_PTR)gSampleUI.GetComboBox(IDC_IMAGEVIEW)->GetSelectedData();

			break;
		}
	}
}
Example #23
0
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext)
{
    switch( nControlID )
    {
    case IDC_CHANGEDEVICE:
        g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() );
        break;
    case IDC_LIGHT_SIZE:
        break;
    case IDC_SHADOW_ALGORITHM:
        OldShadowAlgorithm = ShadowAlgorithm;
        ShadowAlgorithm = ((CDXUTComboBox*)pControl)->GetSelectedIndex();
        break;
	case IDC_LIGHT_ZN:
        //g_Widget.SetLightZn( (float)g_SampleUI.GetSlider(IDC_LIGHT_ZN)->GetValue()/2 );
		break;
	case IDC_LIGHT_ZF:
        //g_Widget.SetLightZf( (float)g_SampleUI.GetSlider(IDC_LIGHT_ZF)->GetValue()+30 );
		break;
	case IDC_LIGHT_FOV:
        //g_Widget.SetLightFov((float)g_SampleUI.GetSlider(IDC_LIGHT_FOV)->GetValue()/10);
		break;
	case IDC_fDefaultDepthBias:
		g_fDefaultDepthBias = (float)g_SampleUI.GetSlider(IDC_fDefaultDepthBias)->GetValue()/100;
		break;
	case IDC_fDepthBiasHammer:
		g_fDepthBiasHammer = (float)g_SampleUI.GetSlider(IDC_fDepthBiasHammer)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasLeftForearm:
		g_fDepthBiasLeftForearm = (float)g_SampleUI.GetSlider(IDC_fDepthBiasLeftForearm)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasRightForearm:
		g_fDepthBiasRightForearm = (float)g_SampleUI.GetSlider(IDC_fDepthBiasRightForearm)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasLeftShoulder:
		g_fDepthBiasLeftShoulder = (float)g_SampleUI.GetSlider(IDC_fDepthBiasLeftShoulder)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasRightShoulder:
		g_fDepthBiasRightShoulder = (float)g_SampleUI.GetSlider(IDC_fDepthBiasRightShoulder)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasBlackPlate:
		g_fDepthBiasBlackPlate = (float)g_SampleUI.GetSlider(IDC_fDepthBiasBlackPlate)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasHelmet:
		g_fDepthBiasHelmet = (float)g_SampleUI.GetSlider(IDC_fDepthBiasHelmet)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasEyes:
		g_fDepthBiasEyes = (float)g_SampleUI.GetSlider(IDC_fDepthBiasEyes)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasBelt:
		g_fDepthBiasBelt = (float)g_SampleUI.GetSlider(IDC_fDepthBiasBelt)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasLeftThigh:
		g_fDepthBiasLeftThigh = (float)g_SampleUI.GetSlider(IDC_fDepthBiasLeftThigh)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasRightThigh:
		g_fDepthBiasRightThigh = (float)g_SampleUI.GetSlider(IDC_fDepthBiasRightThigh)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasLeftShin:
		g_fDepthBiasLeftShin = (float)g_SampleUI.GetSlider(IDC_fDepthBiasLeftShin)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasRightShin:
		g_fDepthBiasRightShin = (float)g_SampleUI.GetSlider(IDC_fDepthBiasRightShin)->GetValue()/4000.0;
		break;
	case IDC_fDepthBiasObject0:
		g_fDepthBiasObject0 = (float)g_SampleUI.GetSlider(IDC_fDepthBiasObject0)->GetValue()/4000.0;
		break;
	case IDC_NUM_LIGHT_SAMPLE:
		g_nNumLightSample = 2*(int)g_SampleUI.GetSlider(IDC_NUM_LIGHT_SAMPLE)->GetValue();
		break;
	case IDC_BIAS_3RD_DEPTH:
		g_f3rdDepthDelta = (float)g_SampleUI.GetSlider(IDC_BIAS_3RD_DEPTH)->GetValue()/100;
		break;
	case IDC_BIAS_1ST_DEPTH:
		g_f1stDepthDelta = (float)g_SampleUI.GetSlider(IDC_BIAS_3RD_DEPTH)->GetValue()/500;
		break;
    }    
}
Example #24
0
//--------------------------------------------------------------------------------------
// Create any D3D10 resources that aren't dependant on the back buffer
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnD3D10CreateDevice(ID3D10Device* pDev10, const DXGI_SURFACE_DESC *pBackBufferSurfaceDesc, void* pUserContext)
{
	HRESULT hr;

	g_pSkyBox    = new S3UTSkybox();
	//g_pEnvMap    = new HDRCubeTexture;

    V_RETURN(DXUTSetMediaSearchPath(L"..\\Source\\SoftShadows"));
    V_RETURN(g_DialogResourceManager.OnD3D10CreateDevice(pDev10));
    V_RETURN(g_D3DSettingsDlg.OnD3D10CreateDevice(pDev10));
    V_RETURN(D3DX10CreateFont(pDev10, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial", &g_pFont10));

    g_SampleUI.GetSlider(IDC_LIGHT_SIZE)->SetValue((int)(g_fFilterSize * 200.0));
	g_SampleUI.GetComboBox(IDC_SHADOW_ALGORITHM)->SetSelectedByIndex(ssmap.bAccurateShadow == true ? 0 : 1);

    switch( ShadowAlgorithm )
    {
    case    STANDARD_BP:
        	g_ABP.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    case    BP_MSSM_KERNEL:
	        g_BPMSSMKernel.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    case    STD_VSM:
	        g_StdVSM.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    case    MIP_VSM:
	        g_MipVSM.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    case    HIR_BP:
        	g_HBP.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    case    BP_GI:
        	g_BPGI.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    case    STD_PCSS:
        	g_PCSS.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
            break;
    default:
            break;
    }

	g_NoShadow.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
	g_Final.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
	g_GBuffer.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);
	g_ScrQuadRender.OnD3D10CreateDevice(g_ABP.m_pEffect,pDev10,pBackBufferSurfaceDesc,pUserContext);
	ssmap.OnD3D10CreateDevice(pDev10,pBackBufferSurfaceDesc,pUserContext);

	g_Widget.OnD3D10CreateDevice( pDev10,pBackBufferSurfaceDesc,pUserContext );
	g_Blender.OnD3D10CreateDevice( pDev10,pBackBufferSurfaceDesc,pUserContext );

    V_RETURN(D3DX10CreateSprite(pDev10, 512, &g_pSprite10));
	{//must be after g_ABP create a device,because they uses the members of g_ABP
		static const D3D10_INPUT_ELEMENT_DESC scenemeshlayout[] =
		{
			{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
			{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
			{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D10_INPUT_PER_VERTEX_DATA, 0 },
		};
		if (g_MeshLight.Create(pDev10, L"arrow.x", (D3D10_INPUT_ELEMENT_DESC*)scenemeshlayout, 3) != S_OK)
		{
			MessageBox(DXUTGetHWND(), L"Could not load geometry from arrow.x", L"Error", MB_OK);
			exit(0);
		}
		D3D10_PASS_DESC PassDesc;
		V_RETURN(g_NoShadow.m_pEffect->GetTechniqueByName("RenderAcc")->GetPassByIndex(0)->GetDesc(&PassDesc));
		V_RETURN(pDev10->CreateInputLayout(scenemeshlayout, 3, PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &g_pMaxLayout));
	}

    LoadNewModel();

	//V_RETURN( DXUTFindDXSDKMediaFileCch( g_EnvMapFilePath, MAX_PATH_STR, g_DefaultEnvMapName[0] ) );
    //g_pEnvMap->OnCreateDevice(pDev10, g_EnvMapFilePath, DXGI_FORMAT_R8G8B8A8_UNORM);
	g_pSkyBox->OnCreateDevice( pDev10 );
   // g_pSkyBox->SetTexture( g_pEnvMap->m_TextureRV );

	g_pFloatBufferSurfaceDesc.SampleDesc.Count   = pBackBufferSurfaceDesc->SampleDesc.Count;
    g_pFloatBufferSurfaceDesc.SampleDesc.Quality = pBackBufferSurfaceDesc->SampleDesc.Quality;



    D3DXVECTOR3 vTmp = D3DXVECTOR3(1, 2, 3);
    D3DXVec3Normalize(&g_vLightDir, &vTmp);

    SAFE_RELEASE(g_pRenderState);
    D3D10_RASTERIZER_DESC RasterizerState;
    RasterizerState.FillMode = D3D10_FILL_SOLID;
    RasterizerState.CullMode = D3D10_CULL_FRONT;
    RasterizerState.FrontCounterClockwise = true;
    RasterizerState.DepthBias = false;
    RasterizerState.DepthBiasClamp = 0.1;
    RasterizerState.SlopeScaledDepthBias = 0;
    RasterizerState.DepthClipEnable = true;
    RasterizerState.ScissorEnable = false;
    RasterizerState.MultisampleEnable = false;
    RasterizerState.AntialiasedLineEnable = false;
    V(pDev10->CreateRasterizerState(&RasterizerState, &g_pRenderState));

    SAFE_RELEASE(g_pDSState);
    D3D10_DEPTH_STENCIL_DESC DSState;
    ZeroMemory(&DSState, sizeof(DSState));
    DSState.DepthEnable = true;
    DSState.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ALL;
    DSState.DepthFunc = D3D10_COMPARISON_LESS_EQUAL;
    V(pDev10->CreateDepthStencilState(&DSState, &g_pDSState));


	//light management
	for( int light_idx = 0; light_idx < NUM_LIGHT; ++light_idx )
	{
		g_pLightLumiBuffer[light_idx] = new RenderObject( "RenderScreenPixelPos" );
		g_pLightLumiBuffer[light_idx] ->OnD3D10CreateDevice( NULL,pDev10, pBackBufferSurfaceDesc, pUserContext);
	}

		g_pBlendBuffer = new RenderObject( "RenderScreenPixelPos" );
		g_pBlendBuffer->OnD3D10CreateDevice( NULL,pDev10, pBackBufferSurfaceDesc, pUserContext);
		g_pWidgetBuffer = new RenderObject( "RenderScreenPixelPos" );//fake tech name,we dont want to use it. We only want to utilize its buffers
		g_pWidgetBuffer->OnD3D10CreateDevice( NULL,pDev10, pBackBufferSurfaceDesc, pUserContext);
//--------------------------------------------------------------------------------------------------------

    return S_OK;
}
//--------------------------------------------------------------------------------------
// Handles the GUI events
//--------------------------------------------------------------------------------------
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
{
    switch( nControlID )
    {
        case IDC_TOGGLEFULLSCREEN:
            DXUTToggleFullScreen(); break;
        case IDC_TOGGLEREF:
            DXUTToggleREF(); break;
        case IDC_CHANGEDEVICE:
            g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break;

		case IDC_DISPLACEMENTLVL:
        {
            displacement_level = g_SampleUI.GetSlider( IDC_DISPLACEMENTLVL )->GetValue()/ 100.0f;
			tessplane.setdislvl(displacement_level);
            WCHAR sz[100];
            swprintf_s( sz, L"Displacement Level: %2.1f", displacement_level );
            g_SampleUI.GetStatic( IDC_DISPLACEMENTLVL_STATIC )->SetText( sz );
        }
            break;

		case IDC_TESSLVL:
        {
            tess_lvl = g_SampleUI.GetSlider( IDC_TESSLVL )->GetValue();
			tessplane.setTesslvl(tess_lvl);
			tesscube.set_tesslvl(tess_lvl);
			fuse.set_tesslvl(tess_lvl);
            WCHAR sz[100];
            swprintf_s( sz, L"Tesselation Level: %2.1f", tess_lvl );
            g_SampleUI.GetStatic( IDC_TESSLVL_STATIC )->SetText( sz );
        }
            break;
		case IDC_TOGGLEBUILDING:
			show_buildings = g_SampleUI.GetCheckBox( IDC_TOGGLEBUILDING )->GetChecked();
			break;
		case IDC_TOGGLEWIRE:
			tessplane.toggleWire(g_SampleUI.GetCheckBox( IDC_TOGGLEWIRE )->GetChecked());
			tesscube.toggleWire(g_SampleUI.GetCheckBox( IDC_TOGGLEWIRE )->GetChecked());
			fuse.toggleWire(g_SampleUI.GetCheckBox( IDC_TOGGLEWIRE )->GetChecked());
            break;
		case IDC_TOGGLEDT:
			tessplane.toggleDT(g_SampleUI.GetCheckBox( IDC_TOGGLEDT )->GetChecked());
            break;
        case IDC_PARTITION_INTEGER:
			tessplane.settessmethod(0);
			tesscube.settessmethod(0);
			fuse.settessmethod(0);
            break;
        case IDC_PARTITION_FRAC_EVEN:
			tessplane.settessmethod(1);
			tesscube.settessmethod(1);
			fuse.settessmethod(1);
            break;
        case IDC_PARTITION_FRAC_ODD:
			tesscube.settessmethod(2);
			tessplane.settessmethod(2);
			fuse.settessmethod(2);
            break;
    }

}
//--------------------------------------------------------------------------------------
// Initialize the app 
//--------------------------------------------------------------------------------------
void InitApp()
{

    g_CascadeConfig.m_nCascadeLevels = 3;
    g_CascadeConfig.m_iBufferSize = 1024;


    g_CascadedShadow.m_iCascadePartitionsZeroToOne[0] = 5;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[1] = 15;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[2] = 60;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[3] = 100;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[4] = 100;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[5] = 100;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[6] = 100;
    g_CascadedShadow.m_iCascadePartitionsZeroToOne[7] = 100;


    // Pick some arbitrary intervals for the Cascade Maps
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[0] = 2;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[1] = 4;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[2] = 6;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[3] = 9;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[4] = 13;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[5] = 26;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[6] = 36;
    //g_CascadedShadow.m_iCascadePartitionsZeroToOne[7] = 70;

    g_CascadedShadow.m_iCascadePartitionsMax = 100;
    // Initialize dialogs
    g_D3DSettingsDlg.Init(&g_DialogResourceManager);
    g_HUD.Init(&g_DialogResourceManager);
    g_SampleUI.Init(&g_DialogResourceManager);

    g_HUD.SetCallback(OnGUIEvent); INT iY = 10;

    // Add tons of GUI stuff
    g_HUD.AddButton(IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 0, iY, 170, 23);
    g_HUD.AddButton(IDC_TOGGLEWARP, L"Toggle WARP (F3)", 0, iY += 26, 170, 23, VK_F3);
    g_HUD.AddButton(IDC_CHANGEDEVICE, L"Change device (F2)", 0, iY += 26, 170, 23, VK_F2);
    g_HUD.AddCheckBox(IDC_TOGGLEVISUALIZECASCADES, L"Visualize Cascades", 0, iY += 26, 170, 23, g_bVisualizeCascades, VK_F8);

    g_HUD.AddComboBox(IDC_DEPTHBUFFERFORMAT, 0, iY += 26, 170, 23, VK_F10, false, &g_DepthBufferFormatCombo);
    g_DepthBufferFormatCombo->AddItem(L"32 bit Buffer", ULongToPtr(CASCADE_DXGI_FORMAT_R32_TYPELESS));
    g_DepthBufferFormatCombo->AddItem(L"16 bit Buffer", ULongToPtr(CASCADE_DXGI_FORMAT_R16_TYPELESS));
    g_DepthBufferFormatCombo->AddItem(L"24 bit Buffer", ULongToPtr(CASCADE_DXGI_FORMAT_R24G8_TYPELESS));

    SHADOW_TEXTURE_FORMAT sbt = (SHADOW_TEXTURE_FORMAT)PtrToUlong(g_DepthBufferFormatCombo->GetSelectedData());
    g_CascadeConfig.m_ShadowBufferFormat = sbt;

    WCHAR desc[256];
    swprintf_s(desc, L"Texture Size: %d ", g_CascadeConfig.m_iBufferSize);

    g_HUD.AddStatic(IDC_BUFFER_SIZETEXT, desc, 0, iY + 26, 30, 10);
    g_HUD.AddSlider(IDC_BUFFER_SIZE, 0, iY += 46, 128, 15, 1, 128, g_CascadeConfig.m_iBufferSize / 32);

    g_HUD.AddStatic(IDC_PCF_SIZETEXT, L"PCF Blur: 3", 0, iY + 16, 30, 10);
    g_HUD.AddSlider(IDC_PCF_SIZE, 90, iY += 20, 64, 15, 1, 16, g_CascadedShadow.m_iPCFBlurSize / 2 + 1);

    swprintf_s(desc, L" Offset: %0.03f", g_CascadedShadow.m_fPCFOffset);
    g_HUD.AddStatic(IDC_PCF_OFFSET_SIZETEXT, desc, 0, iY + 16, 30, 10);
    g_HUD.AddSlider(IDC_PCF_OFFSET_SIZE, 115, iY += 20, 50, 15, 0, 50, (INT)(g_CascadedShadow.m_fPCFOffset * 1000.0f));

    swprintf_s(desc, L"Cascade Blur %0.03f", g_CascadedShadow.m_fBlurBetweenCascadesAmount);
    bool bValue;
    if (g_CascadedShadow.m_iBlurBetweenCascades == 0) bValue = false;
    else bValue = true;

    g_HUD.AddCheckBox(IDC_BLEND_BETWEEN_MAPS_CHECK, desc, 0, iY + 15, 170, 23, bValue);
    g_HUD.AddSlider(IDC_BLEND_MAPS_SLIDER, 40, iY + 33, 100, 15, 0, 100, (INT)
        (g_CascadedShadow.m_fBlurBetweenCascadesAmount * 2000.0f));
    iY += 26;

    if (g_CascadedShadow.m_iDerivativeBasedOffset == 0) bValue = false;
    else bValue = true;
    g_HUD.AddCheckBox(IDC_TOGGLE_DERIVATIVE_OFFSET, L"DDX, DDY offset", 0, iY += 26, 170, 23, bValue);


    WCHAR dta[60];

    g_HUD.AddComboBox(IDC_SELECTED_SCENE, 0, iY += 26, 170, 23, VK_F8, false, &g_SceneSelectCombo);
    g_SceneSelectCombo->AddItem(L"Power Plant", ULongToPtr(POWER_PLANT_SCENE));
    g_SceneSelectCombo->AddItem(L"Test Scene", ULongToPtr(TEST_SCENE));


    g_HUD.AddComboBox(IDC_SELECTED_CAMERA, 0, iY += 26, 170, 23, VK_F9, false, &g_CameraSelectCombo);
    swprintf_s(dta, L"Eye Camera %ld", EYE_CAMERA + 1);
    g_CameraSelectCombo->AddItem(dta, ULongToPtr(EYE_CAMERA));
    swprintf_s(dta, L"Light Camera %ld", LIGHT_CAMERA + 1);
    g_CameraSelectCombo->AddItem(dta, ULongToPtr(LIGHT_CAMERA));
    for (int index = 0; index < g_CascadeConfig.m_nCascadeLevels; ++index)
    {
        swprintf_s(dta, L"Cascade Cam %d", index + 1);
        g_CameraSelectCombo->AddItem(dta, ULongToPtr(ORTHO_CAMERA1 + index));
    }

    g_HUD.AddCheckBox(IDC_MOVE_LIGHT_IN_TEXEL_INC, L"Fit Light to Texels",
        0, iY += 26, 170, 23, g_bMoveLightTexelSize, VK_F8);
    g_CascadedShadow.m_bMoveLightTexelSize = g_bMoveLightTexelSize;
    g_HUD.AddComboBox(IDC_FIT_TO_CASCADE, 0, iY += 26, 170, 23, VK_F9, false, &g_FitToCascadesCombo);
    g_FitToCascadesCombo->AddItem(L"Fit Scene", ULongToPtr(FIT_TO_SCENE));
    g_FitToCascadesCombo->AddItem(L"Fit Cascades", ULongToPtr(FIT_TO_CASCADES));
    g_CascadedShadow.m_eSelectedCascadesFit = FIT_TO_SCENE;

    g_HUD.AddComboBox(IDC_FIT_TO_NEARFAR, 0, iY += 26, 170, 23, VK_F9, false, &g_FitToNearFarCombo);
    g_FitToNearFarCombo->AddItem(L"AABB/Scene NearFar", ULongToPtr(FIT_NEARFAR_SCENE_AABB));
    g_FitToNearFarCombo->AddItem(L"Pancaking", ULongToPtr(FIT_NEARFAR_PANCAKING));
    g_FitToNearFarCombo->AddItem(L"0:1 NearFar", ULongToPtr(FIT_NEARFAR_ZERO_ONE));
    g_FitToNearFarCombo->AddItem(L"AABB NearFar", ULongToPtr(FIT_NEARFAR_AABB));
    g_CascadedShadow.m_eSelectedNearFarFit = FIT_NEARFAR_SCENE_AABB;

    g_HUD.AddComboBox(IDC_CASCADE_SELECT, 0, iY += 26, 170, 23, VK_F9, false, &g_CascadeSelectionCombo);
    g_CascadeSelectionCombo->AddItem(L"Map Selection", ULongToPtr(CASCADE_SELECTION_MAP));
    g_CascadeSelectionCombo->AddItem(L"Interval Selection", ULongToPtr(CASCADE_SELECTION_INTERVAL));

    g_CascadedShadow.m_eSelectedCascadeSelection = CASCADE_SELECTION_MAP;

    g_HUD.AddComboBox(IDC_CASCADELEVELS, 0, iY += 26, 170, 23, VK_F11, false, &g_CascadeLevelsCombo);

    swprintf_s(dta, L"%d Level", 1);
    g_CascadeLevelsCombo->AddItem(dta, ULongToPtr(L1COMBO + 1));
    for (INT index = 1; index < MAX_CASCADES; ++index)
    {
        swprintf_s(dta, L"%d Levels", index + 1);
        g_CascadeLevelsCombo->AddItem(dta, ULongToPtr(L1COMBO + index));
    }

    g_CascadeLevelsCombo->SetSelectedByIndex(g_CascadeConfig.m_nCascadeLevels - 1);

    INT sp = 12;
    iY += 20;
    WCHAR label[16];
    // Color the cascade labels similar to the visualization.
    D3DCOLOR tcolors[] =
    {
        0xFFFF0000,
        0xFF00FF00,
        0xFF0000FF,
        0xFFFF00FF,
        0xFFFFFF00,
        0xFFFFFFFF,
        0xFF00AAFF,
        0xFFAAFFAA
    };

    for (INT index = 0; index < MAX_CASCADES; ++index)
    {
        swprintf_s(label, L"L%d: %d", (index + 1), g_CascadedShadow.m_iCascadePartitionsZeroToOne[index]);
        g_HUD.AddStatic(index + IDC_CASCADELEVEL1TEXT, label, 0, iY + sp, 30, 10);
        g_HUD.GetStatic(index + IDC_CASCADELEVEL1TEXT)->SetTextColor(tcolors[index]);
        g_HUD.AddSlider(index + IDC_CASCADELEVEL1, 50, iY += 15, 100, 15, 0, 100, g_CascadedShadow.m_iCascadePartitionsZeroToOne[index]);
    }

    for (INT index = 0; index < g_CascadeConfig.m_nCascadeLevels; ++index)
    {
        g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + index)->SetVisible(true);
        g_HUD.GetSlider(IDC_CASCADELEVEL1 + index)->SetVisible(true);
    }
    for (int index = g_CascadeConfig.m_nCascadeLevels; index < MAX_CASCADES; ++index)
    {
        g_HUD.GetStatic(IDC_CASCADELEVEL1TEXT + index)->SetVisible(false);
        g_HUD.GetSlider(IDC_CASCADELEVEL1 + index)->SetVisible(false);
    }

    g_SampleUI.SetCallback(OnGUIEvent); iY = 10;
}