📄 d3dapp.cpp
字号:
if( dwNewAdapter != dwOldAdapter || dwNewDevice != dwOldDevice ||
dwNewMode != dwOldMode || bNewWindowed != bOldWindowed ||
NewMultiSampleTypeWindowed != OldMultiSampleTypeWindowed ||
NewMultiSampleTypeFullscreen != OldMultiSampleTypeFullscreen )
{
pd3dApp->m_dwAdapter = dwNewAdapter;
pAdapter = &pd3dApp->m_Adapters[dwNewAdapter];
pAdapter->dwCurrentDevice = dwNewDevice;
pAdapter->devices[dwNewDevice].dwCurrentMode = dwNewMode;
pAdapter->devices[dwNewDevice].bWindowed = bNewWindowed;
pAdapter->devices[dwNewDevice].MultiSampleTypeWindowed = NewMultiSampleTypeWindowed;
pAdapter->devices[dwNewDevice].MultiSampleTypeFullscreen = NewMultiSampleTypeFullscreen;
EndDialog( hDlg, IDOK );
}
else
EndDialog( hDlg, IDCANCEL );
return TRUE;
}
else if( IDCANCEL == LOWORD(wParam) )
{
// Handle the case when the user hits the Cancel button
EndDialog( hDlg, IDCANCEL );
return TRUE;
}
else if( CBN_SELENDOK == HIWORD(wParam) )
{
if( LOWORD(wParam) == IDC_ADAPTER_COMBO )
{
dwNewAdapter = ComboBox_GetCurSel( hwndAdapterList );
pAdapter = &pd3dApp->m_Adapters[dwNewAdapter];
dwNewDevice = pAdapter->dwCurrentDevice;
dwNewMode = pAdapter->devices[dwNewDevice].dwCurrentMode;
bNewWindowed = pAdapter->devices[dwNewDevice].bWindowed;
}
else if( LOWORD(wParam) == IDC_DEVICE_COMBO )
{
pAdapter = &pd3dApp->m_Adapters[dwNewAdapter];
dwNewDevice = ComboBox_GetCurSel( hwndDeviceList );
dwNewMode = pAdapter->devices[dwNewDevice].dwCurrentMode;
bNewWindowed = pAdapter->devices[dwNewDevice].bWindowed;
}
else if( LOWORD(wParam) == IDC_FULLSCREENMODES_COMBO )
{
dwNewMode = ComboBox_GetCurSel( hwndFullscreenModeList );
}
else if( LOWORD(wParam) == IDC_MULTISAMPLE_COMBO )
{
DWORD dwItem = ComboBox_GetCurSel( hwndMultiSampleList );
if( bNewWindowed )
NewMultiSampleTypeWindowed = (D3DMULTISAMPLE_TYPE)ComboBox_GetItemData( hwndMultiSampleList, dwItem );
else
NewMultiSampleTypeFullscreen = (D3DMULTISAMPLE_TYPE)ComboBox_GetItemData( hwndMultiSampleList, dwItem );
}
}
// Keep the UI current
bUpdateDlgControls = TRUE;
}
// Update the dialog controls
if( bUpdateDlgControls )
{
// Reset the content in each of the combo boxes
ComboBox_ResetContent( hwndAdapterList );
ComboBox_ResetContent( hwndDeviceList );
ComboBox_ResetContent( hwndFullscreenModeList );
ComboBox_ResetContent( hwndMultiSampleList );
pAdapter = &pd3dApp->m_Adapters[dwNewAdapter];
pDevice = &pAdapter->devices[dwNewDevice];
// Add a list of adapters to the adapter combo box
for( DWORD a=0; a < pd3dApp->m_dwNumAdapters; a++ )
{
// Add device name to the combo box
DWORD dwItem = ComboBox_AddString( hwndAdapterList,
pd3dApp->m_Adapters[a].d3dAdapterIdentifier.Description );
// Set the item data to identify this adapter
ComboBox_SetItemData( hwndAdapterList, dwItem, a );
// Set the combobox selection on the current adapater
if( a == dwNewAdapter )
ComboBox_SetCurSel( hwndAdapterList, dwItem );
}
// Add a list of devices to the device combo box
for( DWORD d=0; d < pAdapter->dwNumDevices; d++ )
{
// Add device name to the combo box
DWORD dwItem = ComboBox_AddString( hwndDeviceList,
pAdapter->devices[d].strDesc );
// Set the item data to identify this device
ComboBox_SetItemData( hwndDeviceList, dwItem, d );
// Set the combobox selection on the current device
if( d == dwNewDevice )
ComboBox_SetCurSel( hwndDeviceList, dwItem );
}
// Add a list of modes to the mode combo box
for( DWORD m=0; m < pDevice->dwNumModes; m++ )
{
DWORD BitDepth = 16;
if( pDevice->modes[m].Format == D3DFMT_X8R8G8B8 ||
pDevice->modes[m].Format == D3DFMT_A8R8G8B8 ||
pDevice->modes[m].Format == D3DFMT_R8G8B8 )
{
BitDepth = 32;
}
// Add mode desc to the combo box
TCHAR strMode[80];
_stprintf( strMode, _T("%ld x %ld x %ld"), pDevice->modes[m].Width,
pDevice->modes[m].Height,
BitDepth );
DWORD dwItem = ComboBox_AddString( hwndFullscreenModeList, strMode );
// Set the item data to identify this mode
ComboBox_SetItemData( hwndFullscreenModeList, dwItem, m );
// Set the combobox selection on the current mode
if( m == dwNewMode )
ComboBox_SetCurSel( hwndFullscreenModeList, dwItem );
}
// Add a list of multisample modes to the multisample combo box
for( m=0; m <= 16; m++ )
{
TCHAR strDesc[50];
D3DFORMAT fmt;
if( bNewWindowed )
fmt = pd3dApp->m_Adapters[dwNewAdapter].d3ddmDesktop.Format;
else
fmt = pDevice->modes[dwNewMode].Format;
if ( m == 1 ) // 1 is not a valid multisample type
continue;
if( SUCCEEDED( pd3dApp->m_pD3D->CheckDeviceMultiSampleType( dwNewAdapter,
pDevice->DeviceType, fmt, bNewWindowed, (D3DMULTISAMPLE_TYPE)m ) ) )
{
if( m == 0 )
lstrcpy( strDesc, _T("none") );
else
wsprintf( strDesc, _T("%d samples"), m );
// Add device name to the combo box
DWORD dwItem = ComboBox_AddString( hwndMultiSampleList, strDesc );
// Set the item data to identify this multisample type
ComboBox_SetItemData( hwndMultiSampleList, dwItem, m );
// Set the combobox selection on the current multisample type
if( bNewWindowed )
{
if( (D3DMULTISAMPLE_TYPE)m == NewMultiSampleTypeWindowed || m == 0 )
ComboBox_SetCurSel( hwndMultiSampleList, dwItem );
}
else
{
if( (D3DMULTISAMPLE_TYPE)m == NewMultiSampleTypeFullscreen || m == 0 )
ComboBox_SetCurSel( hwndMultiSampleList, dwItem );
}
}
}
DWORD dwItem = ComboBox_GetCurSel( hwndMultiSampleList );
if( bNewWindowed )
NewMultiSampleTypeWindowed = (D3DMULTISAMPLE_TYPE)ComboBox_GetItemData( hwndMultiSampleList, dwItem );
else
NewMultiSampleTypeFullscreen = (D3DMULTISAMPLE_TYPE)ComboBox_GetItemData( hwndMultiSampleList, dwItem );
EnableWindow( hwndMultiSampleList, ComboBox_GetCount( hwndMultiSampleList ) > 1);
EnableWindow( hwndWindowedRadio, pDevice->bCanDoWindowed );
if( bNewWindowed )
{
Button_SetCheck( hwndWindowedRadio, TRUE );
Button_SetCheck( hwndFullscreenRadio, FALSE );
EnableWindow( hwndFullscreenModeList, FALSE );
}
else
{
Button_SetCheck( hwndWindowedRadio, FALSE );
Button_SetCheck( hwndFullscreenRadio, TRUE );
EnableWindow( hwndFullscreenModeList, TRUE );
}
return TRUE;
}
return FALSE;
}
//-----------------------------------------------------------------------------
// Name: Run()
// Desc:
//-----------------------------------------------------------------------------
INT CD3DApplication::Run()
{
// Load keyboard accelerators
HACCEL hAccel = LoadAccelerators( NULL, MAKEINTRESOURCE(IDR_MAIN_ACCEL) );
// Now we're ready to recieve and process Windows messages.
BOOL bGotMsg;
MSG msg;
msg.message = WM_NULL;
PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
while( WM_QUIT != msg.message )
{
// Use PeekMessage() if the app is active, so we can use idle time to
// render the scene. Else, use GetMessage() to avoid eating CPU time.
if( m_bActive )
bGotMsg = PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE );
else
bGotMsg = GetMessage( &msg, NULL, 0U, 0U );
if( bGotMsg )
{
// Translate and dispatch the message
if( 0 == TranslateAccelerator( m_hWnd, hAccel, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
else
{
// Render a frame during idle time (no messages are waiting)
if( m_bActive && m_bReady )
{
if( FAILED( Render3DEnvironment() ) )
SendMessage( m_hWnd, WM_CLOSE, 0, 0 );
}
}
}
return (INT)msg.wParam;
}
//-----------------------------------------------------------------------------
// Name: Render3DEnvironment()
// Desc: Draws the scene.
//-----------------------------------------------------------------------------
HRESULT CD3DApplication::Render3DEnvironment()
{
HRESULT hr;
// Test the cooperative level to see if it's okay to render
if( FAILED( hr = m_pd3dDevice->TestCooperativeLevel() ) )
{
// If the device was lost, do not render until we get it back
if( D3DERR_DEVICELOST == hr )
return S_OK;
// Check if the device needs to be resized.
if( D3DERR_DEVICENOTRESET == hr )
{
// If we are windowed, read the desktop mode and use the same format for
// the back buffer
if( m_bWindowed )
{
D3DAdapterInfo* pAdapterInfo = &m_Adapters[m_dwAdapter];
m_pD3D->GetAdapterDisplayMode( m_dwAdapter, &pAdapterInfo->d3ddmDesktop );
m_d3dpp.BackBufferFormat = pAdapterInfo->d3ddmDesktop.Format;
}
if( FAILED( hr = Resize3DEnvironment() ) )
return hr;
}
return hr;
}
// Get the app's time, in seconds. Skip rendering if no time elapsed
FLOAT fAppTime = DXUtil_Timer( TIMER_GETAPPTIME );
FLOAT fElapsedAppTime = DXUtil_Timer( TIMER_GETELAPSEDTIME );
if( ( 0.0f == fElapsedAppTime ) && m_bFrameMoving )
return S_OK;
// FrameMove (animate) the scene
if( m_bFrameMoving || m_bSingleStep )
{
// Store the time for the app
m_fTime = fAppTime;
m_fElapsedTime = fElapsedAppTime;
// Frame move the scene
if( FAILED( hr = FrameMove() ) )
return hr;
m_bSingleStep = FALSE;
}
// Render the scene as normal
if( FAILED( hr = Render() ) )
return hr;
// Keep track of the frame count
{
static FLOAT fLastTime = 0.0f;
static DWORD dwFrames = 0L;
FLOAT fTime = DXUtil_Timer( TIMER_GETABSOLUTETIME );
++dwFrames;
// Update the scene stats once per second
if( fTime - fLastTime > 1.0f )
{
m_fFPS = dwFrames / (fTime - fLastTime);
fLastTime = fTime;
dwFrames = 0L;
// Get adapter's current mode so we can report
// bit depth (back buffer depth may be unknown)
D3DDISPLAYMODE mode;
m_pD3D->GetAdapterDisplayMode(m_dwAdapter, &mode);
_stprintf( m_strFrameStats, _T("%.02f fps (%dx%dx%d)"), m_fFPS,
m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height,
mode.Format==D3DFMT_X8R8G8B8?32:16 );
D3DAdapterInfo* pAdapterInfo = &m_Adapters[m_dwAdapter];
D3DDeviceInfo* pDeviceInfo = &pAdapterInfo->devices[pAdapterInfo->dwCurrentDevice];
D3DModeInfo* pModeInfo = &pDeviceInfo->modes[pDeviceInfo->dwCurrentMode];
if( m_bUseDepthBuffer )
{
switch( pModeInfo->DepthStencilFormat )
{
case D3DFMT_D16:
lstrcat( m_strFrameStats, _T(" (D16)") );
break;
case D3DFMT_D15S1:
lstrcat( m_strFrameStats, _T(" (D15S1)") );
break;
case D3DFMT_D24X8:
lstrcat( m_strFrameStats, _T(" (D24X8)") );
break;
case D3DFMT_D24S8:
lstrcat( m_str
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -