📄 dxutmisc.cpp
字号:
case 1:
default:
pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
break;
}
}
//--------------------------------------------------------------------------------------
void WINAPI DXUTConvertDeviceSettings9to10( DXUTD3D9DeviceSettings* pIn, DXUTD3D10DeviceSettings* pOut )
{
pOut->AdapterOrdinal = pIn->AdapterOrdinal;
if( pIn->DeviceType == D3DDEVTYPE_HAL )
pOut->DriverType = D3D10_DRIVER_TYPE_HARDWARE;
else if( pIn->DeviceType == D3DDEVTYPE_REF )
pOut->DriverType = D3D10_DRIVER_TYPE_REFERENCE;
else if( pIn->DeviceType == D3DDEVTYPE_NULLREF )
pOut->DriverType = D3D10_DRIVER_TYPE_NULL;
pOut->Output = 0;
pOut->sd.BufferDesc.Width = pIn->pp.BackBufferWidth;
pOut->sd.BufferDesc.Height = pIn->pp.BackBufferHeight;
pOut->sd.BufferDesc.RefreshRate.Numerator = pIn->pp.FullScreen_RefreshRateInHz;
pOut->sd.BufferDesc.RefreshRate.Denominator = 1;
pOut->sd.BufferDesc.Format = ConvertFormatD3D9ToDXGI( pIn->pp.BackBufferFormat );
if( pIn->pp.MultiSampleType == D3DMULTISAMPLE_NONMASKABLE )
{
pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleQuality;
pOut->sd.SampleDesc.Quality = 0;
}
else
{
pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleType;
pOut->sd.SampleDesc.Quality = pIn->pp.MultiSampleQuality;
}
pOut->sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
pOut->sd.BufferCount = pIn->pp.BackBufferCount;
pOut->sd.OutputWindow = pIn->pp.hDeviceWindow;
pOut->sd.Windowed = pIn->pp.Windowed;
#if defined(DEBUG) || defined(_DEBUG)
pOut->CreateFlags = D3D10_CREATE_DEVICE_DEBUG;
#else
pOut->CreateFlags = 0;
#endif
switch( pIn->pp.PresentationInterval )
{
case D3DPRESENT_INTERVAL_IMMEDIATE: pOut->SyncInterval = 0; break;
case D3DPRESENT_INTERVAL_ONE: pOut->SyncInterval = 1; break;
case D3DPRESENT_INTERVAL_TWO: pOut->SyncInterval = 2; break;
case D3DPRESENT_INTERVAL_THREE: pOut->SyncInterval = 3; break;
case D3DPRESENT_INTERVAL_FOUR: pOut->SyncInterval = 4; break;
case D3DPRESENT_INTERVAL_DEFAULT:
default:
pOut->SyncInterval = 1;
break;
}
pOut->PresentFlags = 0;
}
DXGI_FORMAT WINAPI ConvertFormatD3D9ToDXGI( D3DFORMAT fmt )
{
switch( fmt )
{
case D3DFMT_UNKNOWN: return DXGI_FORMAT_UNKNOWN;
case D3DFMT_R8G8B8:
case D3DFMT_A8R8G8B8:
case D3DFMT_X8R8G8B8: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DFMT_R5G6B5: return DXGI_FORMAT_B5G6R5_UNORM;
case D3DFMT_X1R5G5B5:
case D3DFMT_A1R5G5B5: return DXGI_FORMAT_B5G5R5A1_UNORM;
case D3DFMT_A4R4G4B4: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DFMT_R3G3B2: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DFMT_A8: return DXGI_FORMAT_A8_UNORM;
case D3DFMT_A8R3G3B2: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DFMT_X4R4G4B4: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DFMT_A2B10G10R10: return DXGI_FORMAT_R10G10B10A2_UNORM;
case D3DFMT_A8B8G8R8:
case D3DFMT_X8B8G8R8: return DXGI_FORMAT_B8G8R8A8_UNORM;
case D3DFMT_G16R16: return DXGI_FORMAT_R16G16_UNORM;
case D3DFMT_A2R10G10B10: return DXGI_FORMAT_R10G10B10A2_UNORM;
case D3DFMT_A16B16G16R16: return DXGI_FORMAT_R16G16B16A16_UNORM;
case D3DFMT_R16F: return DXGI_FORMAT_R16_FLOAT;
case D3DFMT_G16R16F: return DXGI_FORMAT_R16G16_FLOAT;
case D3DFMT_A16B16G16R16F: return DXGI_FORMAT_R16G16B16A16_FLOAT;
case D3DFMT_R32F: return DXGI_FORMAT_R32_FLOAT;
case D3DFMT_G32R32F: return DXGI_FORMAT_R32G32_FLOAT;
case D3DFMT_A32B32G32R32F: return DXGI_FORMAT_R32G32B32A32_FLOAT;
}
return DXGI_FORMAT_UNKNOWN;
}
D3DFORMAT WINAPI ConvertFormatDXGIToD3D9( DXGI_FORMAT fmt )
{
switch( fmt )
{
case DXGI_FORMAT_UNKNOWN: return D3DFMT_UNKNOWN;
case DXGI_FORMAT_R8G8B8A8_UNORM: return D3DFMT_A8R8G8B8;
case DXGI_FORMAT_B5G6R5_UNORM: return D3DFMT_R5G6B5;
case DXGI_FORMAT_B5G5R5A1_UNORM: return D3DFMT_A1R5G5B5;
case DXGI_FORMAT_A8_UNORM: return D3DFMT_A8;
case DXGI_FORMAT_R10G10B10A2_UNORM: return D3DFMT_A2B10G10R10;
case DXGI_FORMAT_B8G8R8A8_UNORM: return D3DFMT_A8B8G8R8;
case DXGI_FORMAT_R16G16_UNORM: return D3DFMT_G16R16;
case DXGI_FORMAT_R16G16B16A16_UNORM: return D3DFMT_A16B16G16R16;
case DXGI_FORMAT_R16_FLOAT: return D3DFMT_R16F;
case DXGI_FORMAT_R16G16_FLOAT: return D3DFMT_G16R16F;
case DXGI_FORMAT_R16G16B16A16_FLOAT: return D3DFMT_A16B16G16R16F;
case DXGI_FORMAT_R32_FLOAT: return D3DFMT_R32F;
case DXGI_FORMAT_R32G32_FLOAT: return D3DFMT_G32R32F;
case DXGI_FORMAT_R32G32B32A32_FLOAT: return D3DFMT_A32B32G32R32F;
}
return D3DFMT_UNKNOWN;
}
//--------------------------------------------------------------------------------------
IDirect3DDevice9* WINAPI DXUTCreateRefDevice9( HWND hWnd, bool bNullRef )
{
HRESULT hr;
IDirect3D9* pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION );
if( NULL == pD3D )
return NULL;
D3DDISPLAYMODE Mode;
pD3D->GetAdapterDisplayMode(0, &Mode);
D3DPRESENT_PARAMETERS pp;
ZeroMemory( &pp, sizeof(D3DPRESENT_PARAMETERS) );
pp.BackBufferWidth = 1;
pp.BackBufferHeight = 1;
pp.BackBufferFormat = Mode.Format;
pp.BackBufferCount = 1;
pp.SwapEffect = D3DSWAPEFFECT_COPY;
pp.Windowed = TRUE;
pp.hDeviceWindow = hWnd;
IDirect3DDevice9* pd3dDevice = NULL;
hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, bNullRef ? D3DDEVTYPE_NULLREF : D3DDEVTYPE_REF,
hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &pd3dDevice );
SAFE_RELEASE( pD3D );
return pd3dDevice;
}
//--------------------------------------------------------------------------------------
ID3D10Device* WINAPI DXUTCreateRefDevice10( bool bNullRef )
{
HRESULT hr = S_OK;
ID3D10Device* pDevice = NULL;
hr = DXUT_Dynamic_D3D10CreateDevice(
NULL,
bNullRef ? D3D10_DRIVER_TYPE_NULL : D3D10_DRIVER_TYPE_REFERENCE,
0,
0,
D3D10_SDK_VERSION,
&pDevice);
return pDevice;
}
//--------------------------------------------------------------------------------------
// Helper function to launch the Media Center UI after the program terminates
//--------------------------------------------------------------------------------------
bool DXUTReLaunchMediaCenter()
{
// Get the path to Media Center
WCHAR szExpandedPath[MAX_PATH];
if( !ExpandEnvironmentStrings( L"%SystemRoot%\\ehome\\ehshell.exe", szExpandedPath, MAX_PATH) )
return false;
// Skip if ehshell.exe doesn't exist
if( GetFileAttributes( szExpandedPath ) == 0xFFFFFFFF )
return false;
// Launch ehshell.exe
INT_PTR result = (INT_PTR)ShellExecute( NULL, TEXT("open"), szExpandedPath, NULL, NULL, SW_SHOWNORMAL);
return (result > 32);
}
typedef DWORD (WINAPI* LPXINPUTGETSTATE)(DWORD dwUserIndex, XINPUT_STATE* pState );
typedef DWORD (WINAPI* LPXINPUTSETSTATE)(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration );
typedef DWORD (WINAPI* LPXINPUTGETCAPABILITIES)( DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities );
typedef void (WINAPI* LPXINPUTENABLE)(BOOL bEnable);
//--------------------------------------------------------------------------------------
// Does extra processing on XInput data to make it slightly more convenient to use
//--------------------------------------------------------------------------------------
HRESULT DXUTGetGamepadState( DWORD dwPort, DXUT_GAMEPAD* pGamePad, bool bThumbstickDeadZone, bool bSnapThumbstickToCardinals )
{
if( dwPort >= DXUT_MAX_CONTROLLERS || pGamePad == NULL )
return E_FAIL;
static LPXINPUTGETSTATE s_pXInputGetState = NULL;
static LPXINPUTGETCAPABILITIES s_pXInputGetCapabilities = NULL;
if( NULL == s_pXInputGetState || NULL == s_pXInputGetCapabilities )
{
HINSTANCE hInst = LoadLibrary( XINPUT_DLL );
if( hInst )
{
s_pXInputGetState = (LPXINPUTGETSTATE)GetProcAddress( hInst, "XInputGetState" );
s_pXInputGetCapabilities = (LPXINPUTGETCAPABILITIES)GetProcAddress( hInst, "XInputGetCapabilities" );
}
}
if( s_pXInputGetState == NULL )
return E_FAIL;
XINPUT_STATE InputState;
DWORD dwResult = s_pXInputGetState( dwPort, &InputState );
// Track insertion and removals
BOOL bWasConnected = pGamePad->bConnected;
pGamePad->bConnected = (dwResult == ERROR_SUCCESS);
pGamePad->bRemoved = ( bWasConnected && !pGamePad->bConnected );
pGamePad->bInserted = ( !bWasConnected && pGamePad->bConnected );
// Don't update rest of the state if not connected
if( !pGamePad->bConnected )
return S_OK;
// Store the capabilities of the device
if( pGamePad->bInserted )
{
ZeroMemory( pGamePad, sizeof(DXUT_GAMEPAD) );
pGamePad->bConnected = true;
pGamePad->bInserted = true;
if( s_pXInputGetCapabilities )
s_pXInputGetCapabilities( dwPort, XINPUT_DEVTYPE_GAMEPAD, &pGamePad->caps );
}
// Copy gamepad to local structure (assumes that XINPUT_GAMEPAD at the front in CONTROLER_STATE)
memcpy( pGamePad, &InputState.Gamepad, sizeof(XINPUT_GAMEPAD) );
if( bSnapThumbstickToCardinals )
{
// Apply deadzone to each axis independantly to slightly snap to up/down/left/right
if( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE )
pGamePad->sThumbLX = 0;
if( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE )
pGamePad->sThumbLY = 0;
if( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE )
pGamePad->sThumbRX = 0;
if( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE )
pGamePad->sThumbRY = 0;
}
else if( bThumbstickDeadZone )
{
// Apply deadzone if centered
if( (pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) &&
(pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) )
{
pGamePad->sThumbLX = 0;
pGamePad->sThumbLY = 0;
}
if( (pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) &&
(pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) )
{
pGamePad->sThumbRX = 0;
pGamePad->sThumbRY = 0;
}
}
// Convert [-1,+1] range
pGamePad->fThumbLX = pGamePad->sThumbLX / 32767.0f;
pGamePad->fThumbLY = pGamePad->sThumbLY / 32767.0f;
pGamePad->fThumbRX = pGamePad->sThumbRX / 32767.0f;
pGamePad->fThumbRY = pGamePad->sThumbRY / 32767.0f;
// Get the boolean buttons that have been pressed since the last call.
// Each button is represented by one bit.
pGamePad->wPressedButtons = ( pGamePad->wLastButtons ^ pGamePad->wButtons ) & pGamePad->wButtons;
pGamePad->wLastButtons = pGamePad->wButtons;
// Figure out if the left trigger has been pressed or released
bool bPressed = ( pGamePad->bLeftTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD );
pGamePad->bPressedLeftTrigger = ( bPressed ) ? !pGamePad->bLastLeftTrigger : false;
pGamePad->bLastLeftTrigger = bPressed;
// Figure out if the right trigger has been pressed or released
bPressed = ( pGamePad->bRightTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD );
pGamePad->bPressedRightTrigger = ( bPressed ) ? !pGamePad->bLastRightTrigge
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -