?? shadowvolume.cpp
字號:
DXUTSetCallbackMsgProc( MsgProc );
DXUTSetCallbackKeyboard( KeyboardProc );
DXUTSetCallbackMouse( MouseProc );
DXUTSetCallbackFrameRender( OnFrameRender );
DXUTSetCallbackFrameMove( OnFrameMove );
// This sample requires a stencil buffer. See the callback function for details.
CGrowableArray<D3DFORMAT>* pDSFormats = DXUTGetEnumeration()->GetPossibleDepthStencilFormatList();
pDSFormats->RemoveAll();
pDSFormats->Add( D3DFMT_D24S8 );
pDSFormats->Add( D3DFMT_D24X4S4 );
pDSFormats->Add( D3DFMT_D15S1 );
pDSFormats->Add( D3DFMT_D24FS8 );
// Show the cursor and clip it when in full screen
DXUTSetCursorSettings( true, true );
InitApp();
// Initialize the Scripting engines application domain
InitializeScriptEngine();
// Initialize the scaling and translation for the background meshes
// Hardcode the matrices since we only have two.
D3DXMATRIXA16 m;
D3DXMatrixTranslation( &g_mWorldBack[0], 0.0f, 2.0f, 0.0f );
D3DXMatrixScaling( &g_mWorldBack[1], 0.3f, 0.3f, 0.3f );
D3DXMatrixTranslation( &m, 0.0f, 1.5f, 0.0f );
D3DXMatrixMultiply( &g_mWorldBack[1], &g_mWorldBack[1], &m );
// Initialize DXUT and create the desired Win32 window and Direct3D
// device for the application. Calling each of these functions is optional, but they
// allow you to set several options which control the behavior of the framework.
DXUTInit( true, true, true ); // Parse the command line, handle the default hotkeys, and show msgboxes
DXUTCreateWindow( L"Scripted ShadowVolume" );
DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );
// Pass control to DXUT for handling the message pump and
// dispatching render calls. DXUT will call your FrameMove
// and FrameRender callback when there is idle time between handling window messages.
DXUTMainLoop();
// Perform any application-level cleanup here. Direct3D device resources are released within the
// appropriate callback functions and therefore don't require any cleanup code here.
return DXUTGetExitCode();
}
//--------------------------------------------------------------------------------------
// Initialize the app
//--------------------------------------------------------------------------------------
void InitApp()
{
// Initialize dialogs
g_SettingsDlg.Init( &g_DialogResourceManager );
g_HUD.Init( &g_DialogResourceManager );
g_SampleUI.Init( &g_DialogResourceManager );
g_HUD.SetCallback( OnGUIEvent ); int iY = 10;
g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22, VK_F2 );
g_SampleUI.SetCallback( OnGUIEvent ); iY = 10;
g_SampleUI.AddComboBox( IDC_CHANGESCRIPT, 0, iY += 24, 190, 22, 0, false );
g_SampleUI.GetComboBox( IDC_CHANGESCRIPT )->SetDropHeight( 80 );
g_SampleUI.GetComboBox( IDC_CHANGESCRIPT )->AddItem( L"Not Using Scripts", NULL );
g_SampleUI.GetComboBox( IDC_CHANGESCRIPT )->AddItem( L"Script #1", L"script1.cs" );
g_SampleUI.GetComboBox( IDC_CHANGESCRIPT )->AddItem( L"Script #2", L"script2.cs" );
g_SampleUI.GetComboBox( IDC_CHANGESCRIPT )->AddItem( L"Bad Guy Hacker Script", L"unsecure.cs" );
// Initialize cameras
g_Camera.SetRotateButtons( true, false, false );
g_MCamera.SetButtonMasks( MOUSE_RIGHT_BUTTON, 0, 0 );
g_LCamera.SetButtonMasks( MOUSE_MIDDLE_BUTTON, 0, 0 );
// Initialize the lights
for( int L = 0; L < MAX_NUM_LIGHTS; ++L )
{
D3DXMATRIXA16 m;
D3DXVECTOR4 v;
D3DXMatrixScaling( &g_aLights[L].m_mWorld, 0.1f, 0.1f, 0.1f );
D3DXMatrixTranslation( &m, g_LightInit[L].Position.x,
g_LightInit[L].Position.y,
g_LightInit[L].Position.z );
D3DXMatrixMultiply( &g_aLights[L].m_mWorld, &g_aLights[L].m_mWorld, &m );
g_aLights[L].m_Position = g_LightInit[L].Position;
g_aLights[L].m_Color = g_LightInit[L].Color;
}
}
//--------------------------------------------------------------------------------------
// Returns true if a particular depth-stencil format can be created and used with
// an adapter format and backbuffer format combination.
BOOL IsDepthFormatOk( D3DFORMAT DepthFormat,
D3DFORMAT AdapterFormat,
D3DFORMAT BackBufferFormat )
{
// Verify that the depth format exists
HRESULT hr = DXUTGetD3DObject()->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
DepthFormat );
if( FAILED( hr ) ) return FALSE;
// Verify that the backbuffer format is valid
hr = DXUTGetD3DObject()->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
D3DUSAGE_RENDERTARGET,
D3DRTYPE_SURFACE,
BackBufferFormat );
if( FAILED( hr ) ) return FALSE;
// Verify that the depth format is compatible
hr = DXUTGetD3DObject()->CheckDepthStencilMatch( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
BackBufferFormat,
DepthFormat );
return SUCCEEDED(hr);
}
//--------------------------------------------------------------------------------------
// Called during device initialization, this code checks the device for some
// minimum set of capabilities, and rejects those that don't pass by returning false.
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
{
// Skip backbuffer formats that don't support alpha blending
IDirect3D9* pD3D = DXUTGetD3DObject();
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
return false;
// Must support pixel shader 1.1
if( pCaps->PixelShaderVersion < D3DPS_VERSION( 1, 1 ) )
return false;
// Must support stencil buffer
if( !IsDepthFormatOk( D3DFMT_D24S8,
AdapterFormat,
BackBufferFormat ) &&
!IsDepthFormatOk( D3DFMT_D24X4S4,
AdapterFormat,
BackBufferFormat ) &&
!IsDepthFormatOk( D3DFMT_D15S1,
AdapterFormat,
BackBufferFormat ) &&
!IsDepthFormatOk( D3DFMT_D24FS8,
AdapterFormat,
BackBufferFormat ) )
return false;
return true;
}
//--------------------------------------------------------------------------------------
// This callback function is called immediately before a device is created to allow the
// application to modify the device settings. The supplied pDeviceSettings parameter
// contains the settings that the framework has selected for the new device, and the
// application can make any desired changes directly to this structure. Note however that
// DXUT will not correct invalid device settings so care must be taken
// to return valid device settings, otherwise IDirect3D9::CreateDevice() will fail.
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )
{
// If device doesn't support HW T&L or doesn't support 1.1 vertex shaders in HW
// then switch to SWVP.
if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) )
{
pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
// Debugging vertex shaders requires either REF or software vertex processing
// and debugging pixel shaders requires REF.
#ifdef DEBUG_VS
if( pDeviceSettings->DeviceType != D3DDEVTYPE_REF )
{
pDeviceSettings->BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
pDeviceSettings->BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
pDeviceSettings->BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
#endif
#ifdef DEBUG_PS
pDeviceSettings->DeviceType = D3DDEVTYPE_REF;
#endif
// This sample requires a stencil buffer.
if( IsDepthFormatOk( D3DFMT_D24S8,
pDeviceSettings->AdapterFormat,
pDeviceSettings->pp.BackBufferFormat ) )
pDeviceSettings->pp.AutoDepthStencilFormat = D3DFMT_D24S8;
else
if( IsDepthFormatOk( D3DFMT_D24X4S4,
pDeviceSettings->AdapterFormat,
pDeviceSettings->pp.BackBufferFormat ) )
pDeviceSettings->pp.AutoDepthStencilFormat = D3DFMT_D24X4S4;
else
if( IsDepthFormatOk( D3DFMT_D24FS8,
pDeviceSettings->AdapterFormat,
pDeviceSettings->pp.BackBufferFormat ) )
pDeviceSettings->pp.AutoDepthStencilFormat = D3DFMT_D24FS8;
else
if( IsDepthFormatOk( D3DFMT_D15S1,
pDeviceSettings->AdapterFormat,
pDeviceSettings->pp.BackBufferFormat ) )
pDeviceSettings->pp.AutoDepthStencilFormat = D3DFMT_D15S1;
// For the first device created if its a REF device, optionally display a warning dialog box
static bool s_bFirstTime = true;
if( s_bFirstTime )
{
s_bFirstTime = false;
if( pDeviceSettings->DeviceType == D3DDEVTYPE_REF )
DXUTDisplaySwitchingToREFWarning();
}
return true;
}
// Compute a matrix that scales Mesh to a specified size and centers around origin
void ComputeMeshScaling( CDXUTMesh &Mesh, D3DXMATRIX *pmScalingCenter )
{
LPVOID pVerts = NULL;
D3DXMatrixIdentity( pmScalingCenter );
if( SUCCEEDED( Mesh.GetMesh()->LockVertexBuffer( 0, &pVerts ) ) )
{
D3DXVECTOR3 vCtr;
float fRadius;
if( SUCCEEDED( D3DXComputeBoundingSphere( (const D3DXVECTOR3*)pVerts,
Mesh.GetMesh()->GetNumVertices(),
Mesh.GetMesh()->GetNumBytesPerVertex(),
&vCtr, &fRadius ) ) )
{
D3DXMatrixTranslation( pmScalingCenter, -vCtr.x, -vCtr.y, -vCtr.z );
D3DXMATRIXA16 m;
D3DXMatrixScaling( &m, 1.0f / fRadius,
1.0f / fRadius,
1.0f / fRadius );
D3DXMatrixMultiply( pmScalingCenter, pmScalingCenter, &m );
}
Mesh.GetMesh()->UnlockVertexBuffer();
}
}
//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has been
// created, which will happen during application initialization and windowed/full screen
// toggles. This is the best location to create D3DPOOL_MANAGED resources since these
// resources need to be reloaded whenever the device is destroyed. Resources created
// here should be released in the OnDestroyDevice callback.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
HRESULT hr;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -