aboutsummaryrefslogtreecommitdiff
path: root/samples/DX_APIUsage/Main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'samples/DX_APIUsage/Main.cpp')
-rw-r--r--samples/DX_APIUsage/Main.cpp1118
1 files changed, 581 insertions, 537 deletions
diff --git a/samples/DX_APIUsage/Main.cpp b/samples/DX_APIUsage/Main.cpp
index 803d799..214ac54 100644
--- a/samples/DX_APIUsage/Main.cpp
+++ b/samples/DX_APIUsage/Main.cpp
@@ -1,27 +1,30 @@
//--------------------------------------------------------------------------------------
-// File: GfeSDKDemo_APIUsage_DX.cpp
+// File: SimpleSample11.cpp
//
-// This sample shows a simple example of the Microsoft Direct3D's High-Level
-// Shader Language (HLSL) using the Effect interface.
+// Starting point for new Direct3D 11 Win32 desktop samples. For a more minimal starting
+// point, use the EmptyProject11 sample instead.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include "DXUT.h"
-#include "DXUTcamera.h"
#include "DXUTgui.h"
-#include "DXUTsettingsDlg.h"
+#include "DXUTmisc.h"
+#include "DXUTCamera.h"
+#include "DXUTSettingsDlg.h"
#include "SDKmisc.h"
-#include "SDKMesh.h"
+#include "SDKmesh.h"
#include "resource.h"
-#include <vector>
-#include <future>
#include <fstream>
#include <codecvt>
#include <locale>
#include <array>
+#pragma warning( disable : 4100 )
+
#include <json/json.h>
#include <Shlwapi.h>
+#include <tlhelp32.h>
+#include <Psapi.h>
#ifdef GFESDKDEMO_BUILD_C
#include "GfeSDKWrapper.h"
@@ -32,6 +35,10 @@ using namespace GfeSDK;
#include <gfesdk/bindings/cpp/highlights/highlights_types_cpp.h>
+#include "Splash.h"
+
+using namespace DirectX;
+
void TRACE(const char* format, ...)
{
char buffer[512];
@@ -44,62 +51,53 @@ void TRACE(const char* format, ...)
OutputDebugStringA(buffer);
}
-enum class AppState
-{
- Init,
- LoadResources,
- Main
-};
-
//--------------------------------------------------------------------------------------
// Global variables
//--------------------------------------------------------------------------------------
-CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs
CModelViewerCamera g_Camera; // A model viewing camera
-CDXUTDirectionWidget g_LightControl;
-CD3DSettingsDlg g_D3DSettingsDlg; // Device settings dialog
-CDXUTDialog g_HUD; // manages the 3D
+CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs
+CDXUTTextHelper* g_pTxtHelper = nullptr;
+CDXUTDialog g_HUD; // dialog for standard controls
CDXUTDialog g_SampleUI; // dialog for sample specific controls
-D3DXMATRIXA16 g_mCenterMesh;
-float g_fLightScale;
-int g_nNumActiveLights;
-int g_nActiveLight;
-bool g_bShowHelp = false; // If true, it renders the UI control text
-
-// Direct3D9 resources
-CDXUTTextHelper* g_pTxtHelper = NULL;
+XMMATRIX g_mCenterMesh;
CDXUTSDKMesh g_Mesh11;
-ID3D11InputLayout* g_pVertexLayout11 = NULL;
-ID3D11Buffer* g_pVertexBuffer = NULL;
-ID3D11Buffer* g_pIndexBuffer = NULL;
-ID3D11VertexShader* g_pVertexShader = NULL;
-ID3D11PixelShader* g_pPixelShader = NULL;
-ID3D11SamplerState* g_pSamLinear = NULL;
+ // Direct3D 11 resources
+ID3D11VertexShader* g_pVertexShader11 = nullptr;
+ID3D11PixelShader* g_pPixelShader11 = nullptr;
+ID3D11InputLayout* g_pLayout11 = nullptr;
+ID3D11SamplerState* g_pSamLinear = nullptr;
+//--------------------------------------------------------------------------------------
+// Constant buffers
+//--------------------------------------------------------------------------------------
+#pragma pack(push,1)
struct CB_VS_PER_OBJECT
{
- D3DXMATRIX m_WorldViewProj;
- D3DXMATRIX m_World;
+ XMFLOAT4X4 m_mWorldViewProjection;
+ XMFLOAT4X4 m_mWorld;
+ XMFLOAT4 m_MaterialAmbientColor;
+ XMFLOAT4 m_MaterialDiffuseColor;
};
-UINT g_iCBVSPerObjectBind = 0;
-struct CB_PS_PER_OBJECT
+struct CB_VS_PER_FRAME
{
- D3DXVECTOR4 m_vObjectColor;
+ XMFLOAT3 m_vLightDir;
+ float m_fTime;
+ XMFLOAT4 m_LightDiffuse;
};
-UINT g_iCBPSPerObjectBind = 0;
+#pragma pack(pop)
-struct CB_PS_PER_FRAME
+ID3D11Buffer* g_pcbVSPerObject11 = nullptr;
+ID3D11Buffer* g_pcbVSPerFrame11 = nullptr;
+
+enum class AppState
{
- D3DXVECTOR4 m_vLightDirAmbient;
+ Init,
+ LoadResources,
+ Main
};
-UINT g_iCBPSPerFrameBind = 1;
-
-ID3D11Buffer* g_pcbVSPerObject = NULL;
-ID3D11Buffer* g_pcbPSPerObject = NULL;
-ID3D11Buffer* g_pcbPSPerFrame = NULL;
// Highlights
struct HighlightsDataHolder
@@ -121,6 +119,8 @@ struct HighlightsData
};
GfeSdkWrapper g_highlights;
+std::string g_targetPath;
+int g_targetPid = 0;
NVGSDK_HighlightSignificance g_sigFilter = NVGSDK_HIGHLIGHT_SIGNIFICANCE_NONE;
NVGSDK_HighlightType g_tagFilter = NVGSDK_HIGHLIGHT_TYPE_NONE;
std::wstring_convert<std::codecvt_utf8<wchar_t>> g_converter;
@@ -133,182 +133,270 @@ class SettingsManager
{
public:
- enum class BackgroundColor
- {
- Default,
- Red,
- Blue,
- };
-
- SettingsManager(const std::wstring& configPath)
- : m_color(BackgroundColor::Default),
- m_configPath(configPath)
- {
- LoadConfig();
- }
-
- std::array<float, 4> GetBackgroundColorArray() const
- {
- switch(m_color)
+ enum class BackgroundColor
{
- case BackgroundColor::Red:
- return { 0.25f, 0.10f, 0.10f, 0.55f };
- case BackgroundColor::Blue:
- return { 0.10f, 0.10f, 0.25f, 0.55f };
- case BackgroundColor::Default:
- default:
- return { 0.0f, 0.25f, 0.25f, 0.55f };
+ Default,
+ Red,
+ Blue,
+ };
+
+ SettingsManager(const std::wstring& configPath)
+ : m_color(BackgroundColor::Default),
+ m_configPath(configPath)
+ {
+ LoadConfig();
}
- }
- std::string GetBackgroundColorString() const
- {
- switch(m_color)
+ std::array<float, 4> GetBackgroundColorArray() const
{
- case BackgroundColor::Red:
- return "Red";
- case BackgroundColor::Blue:
- return "Blue";
- case BackgroundColor::Default:
- default:
- return "Default";
+ switch (m_color)
+ {
+ case BackgroundColor::Red:
+ return { 0.25f, 0.10f, 0.10f, 0.55f };
+ case BackgroundColor::Blue:
+ return { 0.10f, 0.10f, 0.25f, 0.55f };
+ case BackgroundColor::Default:
+ default:
+ return { 0.0f, 0.25f, 0.25f, 0.55f };
+ }
}
- }
- void ToggleBackgroundColor()
- {
- switch(m_color)
+ std::string GetBackgroundColorString() const
{
- case BackgroundColor::Default:
- m_color = BackgroundColor::Red;
- break;
- case BackgroundColor::Red:
- m_color = BackgroundColor::Blue;
- break;
- case BackgroundColor::Blue:
- m_color = BackgroundColor::Default;
- break;
- default:
- m_color = BackgroundColor::Default;
+ switch (m_color)
+ {
+ case BackgroundColor::Red:
+ return "Red";
+ case BackgroundColor::Blue:
+ return "Blue";
+ case BackgroundColor::Default:
+ default:
+ return "Default";
+ }
}
- SaveConfig();
- }
+ void ToggleBackgroundColor()
+ {
+ switch (m_color)
+ {
+ case BackgroundColor::Default:
+ m_color = BackgroundColor::Red;
+ break;
+ case BackgroundColor::Red:
+ m_color = BackgroundColor::Blue;
+ break;
+ case BackgroundColor::Blue:
+ m_color = BackgroundColor::Default;
+ break;
+ default:
+ m_color = BackgroundColor::Default;
+ }
- void SaveConfig()
- {
- Json::Value root;
- root["Background"] = GetBackgroundColorString();
+ SaveConfig();
+ }
- std::ofstream f(m_configPath);
- if(!f.good())
+ void SaveConfig()
{
- TRACE("Cannot open config file for saving!");
- return;
- }
+ Json::Value root;
+ root["Background"] = GetBackgroundColorString();
- f << root;
- }
+ std::ofstream f(m_configPath);
+ if (!f.good())
+ {
+ TRACE("Cannot open config file for saving!");
+ return;
+ }
- void LoadConfig()
- {
- std::ifstream f(m_configPath);
- if(!f.good())
- {
- return;
+ f << root;
}
- Json::Value root;
-
- std::string errs;
- Json::CharReaderBuilder builder;
- if(!Json::parseFromStream(builder, f, &root, &errs))
+ void LoadConfig()
{
- TRACE("FAILED to read json file\n");
- return;
- }
+ std::ifstream f(m_configPath);
+ if (!f.good())
+ {
+ return;
+ }
+
+ Json::Value root;
- m_color = BackgroundColorFromString(root["Background"].asString());
- }
+ std::string errs;
+ Json::CharReaderBuilder builder;
+ if (!Json::parseFromStream(builder, f, &root, &errs))
+ {
+ TRACE("FAILED to read json file\n");
+ return;
+ }
+
+ m_color = BackgroundColorFromString(root["Background"].asString());
+ }
private:
- static BackgroundColor BackgroundColorFromString(const std::string& c)
- {
- if(c == "Red") return BackgroundColor::Red;
- if(c == "Blue") return BackgroundColor::Blue;
- if(c == "Default") return BackgroundColor::Default;
+ static BackgroundColor BackgroundColorFromString(const std::string& c)
+ {
+ if (c == "Red") return BackgroundColor::Red;
+ if (c == "Blue") return BackgroundColor::Blue;
+ if (c == "Default") return BackgroundColor::Default;
- return BackgroundColor::Default;
- }
+ return BackgroundColor::Default;
+ }
- const std::wstring m_configPath;
- BackgroundColor m_color;
+ const std::wstring m_configPath;
+ BackgroundColor m_color;
};
std::unique_ptr<SettingsManager> g_settingsManager;
-
AppState g_state = AppState::Init;
//--------------------------------------------------------------------------------------
// Forward declarations
//--------------------------------------------------------------------------------------
-bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext );
-void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext );
-LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
- void* pUserContext );
-void CALLBACK OnKeyboard( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
-void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
-
-bool CALLBACK IsD3D11DeviceAcceptable(const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output, const CD3D11EnumDeviceInfo *DeviceInfo,
- DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
-HRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,
- void* pUserContext );
-HRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain,
- const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
-void CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext );
-void CALLBACK OnD3D11DestroyDevice( void* pUserContext );
-void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime,
- float fElapsedTime, void* pUserContext );
+LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
+ void* pUserContext);
+void CALLBACK OnKeyboard(UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext);
+void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext);
+void CALLBACK OnFrameMove(double fTime, float fElapsedTime, void* pUserContext);
+bool CALLBACK ModifyDeviceSettings(DXUTDeviceSettings* pDeviceSettings, void* pUserContext);
+
+bool CALLBACK IsD3D11DeviceAcceptable(const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output,
+ const CD3D11EnumDeviceInfo *DeviceInfo,
+ DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext);
+HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,
+ void* pUserContext);
+HRESULT CALLBACK OnD3D11ResizedSwapChain(ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain,
+ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext);
+void CALLBACK OnD3D11ReleasingSwapChain(void* pUserContext);
+void CALLBACK OnD3D11DestroyDevice(void* pUserContext);
+void CALLBACK OnD3D11FrameRender(ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime,
+ float fElapsedTime, void* pUserContext);
+void CALLBACK OnQuit(void* pUserContext);
void InitApp();
void RenderText();
void RenderLoadingText();
+static std::string WideToUtf8(std::wstring const& wideStr);
//--------------------------------------------------------------------------------------
// Entry point to the program. Initializes everything and goes into a message processing
// loop. Idle time is used to render the scene.
//--------------------------------------------------------------------------------------
-//int main(void)
-int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
+int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
+ std::wstring exeName;
+ bool link = false;
+
+ LPWSTR *szArgList;
+ int argCount;
+
+ szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
+ if (!szArgList)
+ {
+ TRACE("FAILED to read command line\n");
+ return -1;
+ }
+
+ exeName = PathFindFileName(szArgList[0]);
+ for (int i = 0; i < argCount; i++)
+ {
+ if (std::wstring(szArgList[i]) == L"-link" || std::wstring(szArgList[i]) == L"/link")
+ {
+ link = true;
+ }
+ }
+
+ LocalFree(szArgList);
+
+ if (link)
+ {
+ // Try to find another instance of the app already running, to link to it.
+ DWORD myPid = GetCurrentProcessId();
+ PROCESSENTRY32 entry;
+ entry.dwSize = sizeof(PROCESSENTRY32);
+
+ HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
+
+ if (Process32FirstW(snapshot, &entry) == TRUE)
+ {
+ while (Process32NextW(snapshot, &entry) == TRUE)
+ {
+ if (exeName == entry.szExeFile && entry.th32ProcessID != myPid)
+ {
+ // Found the target to link to
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
+ if (hProcess == NULL)
+ {
+ TRACE("Could not open target process");
+ continue;
+ }
+
+ wchar_t szTargetFileName[MAX_PATH];
+ if (GetModuleFileNameExW(hProcess, NULL, szTargetFileName, MAX_PATH) > 0)
+ {
+ TRACE("Found process to link to!");
+ g_targetPath = WideToUtf8(szTargetFileName);
+ g_targetPid = entry.th32ProcessID;
+ }
+ else
+ {
+ TRACE("Unable to get target path from process handle");
+ }
+
+ CloseHandle(hProcess);
+ }
+ }
+ }
+
+ CloseHandle(snapshot);
+
+ if (g_targetPath.empty() || g_targetPid == 0)
+ {
+ MessageBox(NULL, L"-link passed but cannot find target process", L"Error", MB_OK);
+ return -1;
+ }
+ }
+
// Enable run-time memory check for debug builds.
-#if defined(DEBUG) | defined(_DEBUG)
- _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
+#ifdef _DEBUG
+ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif
- // DXUT will create and use the best device
+ if (ShowSplash(hInstance, IDT_TIMER1, IDB_BITMAP1) == 1)
+ {
+ HideSplash();
+ return 0;
+ }
+
+ // DXUT will create and use the best device
// that is available on the system depending on which D3D callbacks are set below
- // Set DXUT callbacks
- DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );
- DXUTSetCallbackMsgProc( MsgProc );
- DXUTSetCallbackKeyboard( OnKeyboard );
- DXUTSetCallbackFrameMove( OnFrameMove );
+ // Set DXUT callbacks
+ DXUTSetCallbackMsgProc(MsgProc);
+ DXUTSetCallbackKeyboard(OnKeyboard);
+ DXUTSetCallbackFrameMove(OnFrameMove);
+ DXUTSetCallbackDeviceChanging(ModifyDeviceSettings);
- DXUTSetCallbackD3D11DeviceAcceptable( IsD3D11DeviceAcceptable );
- DXUTSetCallbackD3D11DeviceCreated( OnD3D11CreateDevice );
- DXUTSetCallbackD3D11SwapChainResized( OnD3D11ResizedSwapChain );
- DXUTSetCallbackD3D11FrameRender( OnD3D11FrameRender );
- DXUTSetCallbackD3D11SwapChainReleasing( OnD3D11ReleasingSwapChain );
- DXUTSetCallbackD3D11DeviceDestroyed( OnD3D11DestroyDevice );
+ DXUTSetCallbackD3D11DeviceAcceptable(IsD3D11DeviceAcceptable);
+ DXUTSetCallbackD3D11DeviceCreated(OnD3D11CreateDevice);
+ DXUTSetCallbackD3D11SwapChainResized(OnD3D11ResizedSwapChain);
+ DXUTSetCallbackD3D11SwapChainReleasing(OnD3D11ReleasingSwapChain);
+ DXUTSetCallbackD3D11DeviceDestroyed(OnD3D11DestroyDevice);
+ DXUTSetCallbackD3D11FrameRender(OnD3D11FrameRender);
+
+ DXUTSetCallbackQuit(OnQuit);
InitApp();
- DXUTInit( true, true, NULL ); // Parse the command line, show msgboxes on error, no extra command line params
- DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen
- DXUTCreateWindow( L"GfeSDKDemo_DX" );
- DXUTCreateDevice (D3D_FEATURE_LEVEL_9_2, true, 1280, 1024 );
+ DXUTInit(true, true, nullptr); // Parse the command line, show msgboxes on error, no extra command line params
+ DXUTSetCursorSettings(true, true);
+ DXUTCreateWindow(L"SimpleSample11");
+
+ // Only require 10-level hardware, change to D3D_FEATURE_LEVEL_11_0 to require 11-class hardware
+ // Switch to D3D_FEATURE_LEVEL_9_x for 10level9 hardware
+ DXUTCreateDevice(D3D_FEATURE_LEVEL_10_0, true, 1280, 1024);
+
+ HideSplash();
+
DXUTMainLoop(); // Enter into the DXUT render loop
return DXUTGetExitCode();
@@ -326,7 +414,27 @@ void ToggleTagBit(NVGSDK_HighlightType bit)
void HandleOpsNotification()
{
- g_settingsManager->LoadConfig();
+ g_settingsManager->LoadConfig();
+}
+
+std::wstring HK(wchar_t const* str, uint16_t hk_)
+{
+ uint8_t hk = (0xff & hk_);
+ std::wstring ret = std::wstring(str) + L" [";
+
+ if (hk >= VK_F1 && hk <= VK_F12)
+ {
+ ret += L"F" + std::to_wstring(hk - 0x6f);
+ }
+ else if (hk >= VK_NUMPAD0 && hk <= VK_NUMPAD9)
+ {
+ ret += L"N" + std::to_wstring(hk - 0x5f);
+ }
+ else
+ {
+ ret += (wchar_t)hk;
+ }
+ return ret + L"]";
}
//--------------------------------------------------------------------------------------
@@ -334,14 +442,6 @@ void HandleOpsNotification()
//--------------------------------------------------------------------------------------
void InitApp()
{
- TRACE("Initialize Application\n");
-
- D3DXVECTOR3 vLightDir(-1, 1, -1);
- D3DXVec3Normalize(&vLightDir, &vLightDir);
- g_LightControl.SetLightDirection(vLightDir);
-
- // Initialize dialogs
- g_D3DSettingsDlg.Init(&g_DialogResourceManager);
g_HUD.Init(&g_DialogResourceManager);
g_SampleUI.Init(&g_DialogResourceManager);
@@ -397,7 +497,7 @@ void InitApp()
}
for (auto it = g_highlightsConfig.highlightsData[i].namePairsData.begin(); it != g_highlightsConfig.highlightsData[i].namePairsData.end(); ++it)
{
- g_highlightsConfig.highlightsData[i].namePairs.push_back({&it->first[0],&it->second[0]});
+ g_highlightsConfig.highlightsData[i].namePairs.push_back({ &it->first[0],&it->second[0] });
}
g_highlightsConfig.highlights[i].id = g_highlightsConfig.highlightsData[i].id.c_str();
@@ -410,18 +510,23 @@ void InitApp()
int iY = 10;
int const PAD = 26;
- g_HUD.AddButtonCallback([]() {DXUTToggleFullScreen(); }, L"Toggle full screen", 0, iY, 170, 23);
- g_HUD.AddButtonCallback([]() { g_settingsManager->ToggleBackgroundColor(); }, L"Toggle background color", 0, iY += PAD, 170, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnRequestLanguage(); }, L"Get Overlay Language", 0, iY += PAD, 170, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnRequestUserSettings(); }, L"Get User Settings", 0, iY += PAD, 170, 23);
+ int const WIDTH = 240;
+ int const X = -80;
+
+ uint16_t hk = 0x30;
+ g_HUD.AddButtonCallback([]() {DXUTToggleFullScreen(); }, HK(L"Toggle full screen", hk).c_str(), X, iY, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() { g_settingsManager->ToggleBackgroundColor(); }, HK(L"Toggle background color", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnRequestLanguage(); }, HK(L"Get Overlay Language", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnRequestUserSettings(); }, HK(L"Get User Settings", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
iY += 10;
int iY_groups = iY;
- int const GROUP1_X = -250;
- int const GROUP2_X = -30;
+ int const GROUP1_X = X - WIDTH - 10;
+ int const GROUP2_X = X;
- g_HUD.AddButtonCallback([]() {g_highlights.OnOpenGroup(GROUP1_ID); }, L"Open Group 1", GROUP1_X, iY += PAD, 200, 23);
+ hk = 0x40;
+ g_HUD.AddButtonCallback([]() {g_highlights.OnOpenGroup(GROUP1_ID); }, HK(L"Open Group 1", hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
for (size_t i = 0; i < g_highlightsConfig.highlightsData.size(); ++i)
{
HighlightsDataHolder const& holder = g_highlightsConfig.highlightsData[i];
@@ -429,21 +534,24 @@ void InitApp()
{
std::wstring text = std::wstring(L"VIDEO: ") + g_converter.from_bytes(holder.id);
g_HUD.AddButtonCallback([holder]() { g_highlights.OnSaveVideo(holder.id.c_str(), GROUP1_ID, holder.startDelta, holder.endDelta); },
- text.c_str(), GROUP1_X, iY += PAD, 200, 23);
+ HK(text.c_str(), hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
}
else
{
std::wstring text = std::wstring(L"SCREENSHOT: ") + g_converter.from_bytes(holder.id);
- g_HUD.AddButtonCallback([holder]() { g_highlights.OnSaveScreenshot(holder.id.c_str(), GROUP1_ID); }, text.c_str(), GROUP1_X, iY += PAD, 200, 23);
+ g_HUD.AddButtonCallback([holder]() { g_highlights.OnSaveScreenshot(holder.id.c_str(), GROUP1_ID); }, HK(text.c_str(), hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
}
}
- g_HUD.AddButtonCallback([]() {g_highlights.OnOpenSummary(&std::vector<char const*>({ GROUP1_ID })[0], 1, g_sigFilter, g_tagFilter); }, L"Open Group1 Summary", GROUP1_X, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnGetNumHighlights(GROUP1_ID , g_sigFilter, g_tagFilter); }, L"GetNumHighlights in Group1", GROUP1_X, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP1_ID, false); }, L"Close Group 1", GROUP1_X, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP1_ID, true); }, L"Destroy Group 1", GROUP1_X, iY += PAD, 200, 23);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnOpenSummary(&std::vector<char const*>({ GROUP1_ID })[0], 1, g_sigFilter, g_tagFilter); },
+ HK(L"Open Group1 Summary", hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnGetNumHighlights(GROUP1_ID, g_sigFilter, g_tagFilter); }, HK(L"GetNumHighlights in Group1", hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP1_ID, false); }, HK(L"Close Group 1", hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP1_ID, true); }, HK(L"Destroy Group 1", hk).c_str(), GROUP1_X, iY += PAD, WIDTH, 23, ++hk);
+
+ hk = 0x4d;
iY = iY_groups;
- g_HUD.AddButtonCallback([]() {g_highlights.OnOpenGroup(GROUP2_ID); }, L"Open Group 2", GROUP2_X, iY += PAD, 200, 23);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnOpenGroup(GROUP2_ID); }, HK(L"Open Group 2", hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
for (size_t i = 0; i < g_highlightsConfig.highlightsData.size(); ++i)
{
HighlightsDataHolder const& holder = g_highlightsConfig.highlightsData[i];
@@ -451,121 +559,68 @@ void InitApp()
{
std::wstring text = std::wstring(L"VIDEO: ") + g_converter.from_bytes(holder.id);
g_HUD.AddButtonCallback([holder]() { g_highlights.OnSaveVideo(holder.id.c_str(), GROUP2_ID, holder.startDelta, holder.endDelta); },
- text.c_str(), GROUP2_X, iY += PAD, 200, 23);
+ HK(text.c_str(), hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
}
else
{
std::wstring text = std::wstring(L"SCREENSHOT: ") + g_converter.from_bytes(holder.id);
- g_HUD.AddButtonCallback([holder]() { g_highlights.OnSaveScreenshot(holder.id.c_str(), GROUP2_ID); }, text.c_str(), GROUP2_X, iY += PAD, 200, 23);
+ g_HUD.AddButtonCallback([holder]() { g_highlights.OnSaveScreenshot(holder.id.c_str(), GROUP2_ID); },
+ HK(text.c_str(), hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
}
}
- g_HUD.AddButtonCallback([]() {g_highlights.OnOpenSummary(&std::vector<char const*>({ GROUP2_ID })[0], 1, g_sigFilter, g_tagFilter); }, L"Open Group2 Summary", GROUP2_X, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnGetNumHighlights(GROUP2_ID, g_sigFilter, g_tagFilter); }, L"GetNumHighlights in Group2", GROUP2_X, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP2_ID, false); }, L"Close Group 2", GROUP2_X, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP2_ID, true); }, L"Destroy Group 2", GROUP2_X, iY += PAD, 200, 23);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnOpenSummary(&std::vector<char const*>({ GROUP2_ID })[0], 1, g_sigFilter, g_tagFilter); },
+ HK(L"Open Group2 Summary", hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnGetNumHighlights(GROUP2_ID, g_sigFilter, g_tagFilter); }, HK(L"GetNumHighlights in Group2", hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP2_ID, false); }, HK(L"Close Group 2", hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnCloseGroup(GROUP2_ID, true); }, HK(L"Destroy Group 2", hk).c_str(), GROUP2_X, iY += PAD, WIDTH, 23, ++hk);
+ hk = 0x59;
iY += 10;
- g_HUD.AddButtonCallback([]() {g_highlights.OnOpenSummary(&std::vector<char const*>({ GROUP1_ID, GROUP2_ID })[0], 2, g_sigFilter, g_tagFilter); }, L"Open GroupSummary 1 + 2", -30, iY += PAD, 200, 23);
+ g_HUD.AddButtonCallback([]() {g_highlights.OnOpenSummary(&std::vector<char const*>({ GROUP1_ID, GROUP2_ID })[0], 2, g_sigFilter, g_tagFilter); },
+ HK(L"Open GroupSummary 1 + 2", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ hk = 0x6f;
iY += 20;
- g_HUD.AddButtonCallback([]() {g_sigFilter = NVGSDK_HIGHLIGHT_SIGNIFICANCE_NONE; }, L"Clear Significance Filter", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_EXTREMELY_BAD), L"Toggle ExtremelyBad", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_VERY_BAD), L"Toggle VeryBad", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_BAD), L"Toggle Bad", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_NEUTRAL), L"Toggle Neutral", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_GOOD), L"Toggle Good", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_VERY_GOOD), L"Toggle VeryGood", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_EXTREMELY_GOOD), L"Toggle ExtremelyGood", -30, iY += PAD, 200, 23);
-
+ g_HUD.AddButtonCallback([]() {g_sigFilter = NVGSDK_HIGHLIGHT_SIGNIFICANCE_NONE; }, HK(L"Clear Significance Filter", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_EXTREMELY_BAD), HK(L"Toggle ExtremelyBad", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_VERY_BAD), HK(L"Toggle VeryBad", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_BAD), HK(L"Toggle Bad", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_NEUTRAL), HK(L"Toggle Neutral", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_GOOD), HK(L"Toggle Good", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_VERY_GOOD), HK(L"Toggle VeryGood", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleSignificanceBit, NVGSDK_HIGHLIGHT_SIGNIFICANCE_EXTREMELY_GOOD), HK(L"Toggle ExtremelyGood", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+
+ hk = 0x5f;
iY += 10;
- g_HUD.AddButtonCallback([]() {g_tagFilter = NVGSDK_HIGHLIGHT_TYPE_NONE; }, L"Clear Tag Filter", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_MILESTONE), L"Toggle Milestone", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_ACHIEVEMENT), L"Toggle Achievement", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_INCIDENT), L"Toggle Incident", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_STATE_CHANGE), L"Toggle StateChange", -30, iY += PAD, 200, 23);
- g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_UNANNOUNCED), L"Toggle Unannounced", -30, iY += PAD, 200, 23);
-
- g_SampleUI.SetCallback( OnGUIEvent ); iY = 10;
-}
-
-
-//--------------------------------------------------------------------------------------
-// Called right before creating a D3D9 or D3D11 device, allowing the app to modify the device settings as needed
-//--------------------------------------------------------------------------------------
-bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )
-{
- // Uncomment this to get debug information from D3D11
- //pDeviceSettings->d3d11.CreateFlags |= D3D11_CREATE_DEVICE_DEBUG;
-
- // 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( ( DXUT_D3D11_DEVICE == pDeviceSettings->ver &&
- pDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) )
- {
- DXUTDisplaySwitchingToREFWarning( pDeviceSettings->ver );
- }
- }
-
- return true;
-}
-
-
-//--------------------------------------------------------------------------------------
-// Handle updates to the scene. This is called regardless of which D3D API is used
-//--------------------------------------------------------------------------------------
-void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
-{
- // Update the camera's position based on user input
- g_Camera.FrameMove( fElapsedTime );
-
+ g_HUD.AddButtonCallback([]() {g_tagFilter = NVGSDK_HIGHLIGHT_TYPE_NONE; }, HK(L"Clear Tag Filter", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_MILESTONE), HK(L"Toggle Milestone", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_ACHIEVEMENT), HK(L"Toggle Achievement", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_INCIDENT), HK(L"Toggle Incident", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_STATE_CHANGE), HK(L"Toggle StateChange", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+ g_HUD.AddButtonCallback(std::bind(ToggleTagBit, NVGSDK_HIGHLIGHT_TYPE_UNANNOUNCED), HK(L"Toggle Unannounced", hk).c_str(), X, iY += PAD, WIDTH, 23, ++hk);
+
+ g_SampleUI.SetCallback(OnGUIEvent); iY = 10;
}
//--------------------------------------------------------------------------------------
-// Render the help and statistics text
+// Render the help and statistics text.
//--------------------------------------------------------------------------------------
void RenderText()
{
- UINT nBackBufferHeight = ( DXUTIsAppRenderingWithD3D9() ) ? DXUTGetD3D9BackBufferSurfaceDesc()->Height :
- DXUTGetDXGIBackBufferSurfaceDesc()->Height;
+ UINT nBackBufferHeight = DXUTGetDXGIBackBufferSurfaceDesc()->Height;
g_pTxtHelper->Begin();
- g_pTxtHelper->SetInsertionPos( 2, 50 );
- g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
- g_pTxtHelper->DrawTextLine( DXUTGetFrameStats( DXUTIsVsyncEnabled() ) );
- g_pTxtHelper->DrawTextLine( DXUTGetDeviceStats() );
+ g_pTxtHelper->SetInsertionPos(2, 50);
+ g_pTxtHelper->SetForegroundColor(Colors::White);
+ g_pTxtHelper->DrawTextLine(DXUTGetFrameStats(DXUTIsVsyncEnabled()));
+ g_pTxtHelper->DrawTextLine(DXUTGetDeviceStats());
// Settings
g_pTxtHelper->DrawFormattedTextLine(L"Background color: %S", g_settingsManager->GetBackgroundColorString().c_str());
- // Draw help
- if( g_bShowHelp )
- {
- g_pTxtHelper->SetInsertionPos( 2, nBackBufferHeight - 20 * 6 );
- g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) );
- g_pTxtHelper->DrawTextLine( L"Controls:" );
-
- g_pTxtHelper->SetInsertionPos( 20, nBackBufferHeight - 20 * 5 );
- g_pTxtHelper->DrawTextLine( L"Rotate model: Left mouse button\n"
- L"Rotate light: Right mouse button\n"
- L"Rotate camera: Middle mouse button\n"
- L"Zoom camera: Mouse wheel scroll\n" );
-
- g_pTxtHelper->SetInsertionPos( 550, nBackBufferHeight - 20 * 5 );
- g_pTxtHelper->DrawTextLine( L"Hide help: F1\n"
- L"Quit: ESC\n" );
- }
- else
- {
- g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
- g_pTxtHelper->DrawTextLine( L"Press F1 for help" );
- }
-
// Highlights
- g_pTxtHelper->SetForegroundColor(D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));
+ g_pTxtHelper->SetForegroundColor(Colors::White);
g_pTxtHelper->SetInsertionPos(2, 5);
g_pTxtHelper->DrawFormattedTextLine(L"Highlights Permission: %s", g_highlights.GetCurrentPermissionStr());
g_pTxtHelper->DrawFormattedTextLine(L"Last Overlay Event: %s", g_highlights.GetLastOverlayEvent());
@@ -586,223 +641,148 @@ void RenderText()
//--------------------------------------------------------------------------------------
void RenderLoadingText()
{
- UINT nBackBufferHeight = (DXUTIsAppRenderingWithD3D9()) ? DXUTGetD3D9BackBufferSurfaceDesc()->Height :
- DXUTGetDXGIBackBufferSurfaceDesc()->Height;
+ UINT nBackBufferHeight = DXUTGetDXGIBackBufferSurfaceDesc()->Height;
g_pTxtHelper->Begin();
g_pTxtHelper->SetInsertionPos(nBackBufferHeight / 2, 300);
- g_pTxtHelper->SetForegroundColor(D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f));
+ g_pTxtHelper->SetForegroundColor(Colors::White);
g_pTxtHelper->DrawTextLine(L"LOADING...");
g_pTxtHelper->End();
}
-//--------------------------------------------------------------------------------------
-// Handle messages to the application
-//--------------------------------------------------------------------------------------
-LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
- void* pUserContext )
+std::string WideToUtf8(std::wstring const& wideStr)
{
- // Pass messages to dialog resource manager calls so GUI state is updated correctly
- *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
- if( *pbNoFurtherProcessing )
- return 0;
-
- // Pass messages to settings dialog if its active
- if( g_D3DSettingsDlg.IsActive() )
+ int length = WideCharToMultiByte(CP_UTF8, 0, wideStr.c_str(), -1, NULL, 0, NULL, NULL);
+ if (length <= 0)
{
- g_D3DSettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
- return 0;
+ throw std::runtime_error("WideCharToMultiByte failed");
}
- // Give the dialogs a chance to handle the message first
- *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
- if( *pbNoFurtherProcessing )
- return 0;
- *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
- if( *pbNoFurtherProcessing )
- return 0;
-
- g_LightControl.HandleMessages( hWnd, uMsg, wParam, lParam );
+ std::unique_ptr<char[]> outputData(new char[length]);
- // Pass all remaining windows messages to camera so it can respond to user input
- g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );
-
- return 0;
-}
-
-
-//--------------------------------------------------------------------------------------
-// Handle key presses
-//--------------------------------------------------------------------------------------
-void CALLBACK OnKeyboard( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
-{
- if( bKeyDown )
+ length = WideCharToMultiByte(CP_UTF8, 0, wideStr.c_str(), -1, &outputData.get()[0], length, NULL, NULL);
+ if (length <= 0)
{
- switch( nChar )
- {
- case VK_F1:
- g_bShowHelp = !g_bShowHelp; break;
- }
+ throw std::runtime_error("WideCharToMultiByte failed");
}
-}
-
-//--------------------------------------------------------------------------------------
-// Handles the GUI events
-//--------------------------------------------------------------------------------------
-void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext)
-{
- void* pUserData = pControl->GetUserData();
- if (pUserData)
- {
- std::function<void()>* fn = reinterpret_cast<std::function<void()>*>(pUserData);
- (*fn)();
- }
+ return std::string(&outputData.get()[0]);
}
-
//--------------------------------------------------------------------------------------
// Reject any D3D11 devices that aren't acceptable by returning false
//--------------------------------------------------------------------------------------
-bool CALLBACK IsD3D11DeviceAcceptable( const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output, const CD3D11EnumDeviceInfo *DeviceInfo,
- DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
+bool CALLBACK IsD3D11DeviceAcceptable(const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output,
+ const CD3D11EnumDeviceInfo *DeviceInfo,
+ DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext)
{
return true;
}
-//--------------------------------------------------------------------------------------
-// Find and compile the specified shader
-//--------------------------------------------------------------------------------------
-HRESULT CompileShaderFromFile( WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut )
-{
- HRESULT hr = S_OK;
-
- // find the file
- WCHAR str[MAX_PATH];
- V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, szFileName ) );
-
- DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
-#if defined( DEBUG ) || defined( _DEBUG )
- // Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
- // Setting this flag improves the shader debugging experience, but still allows
- // the shaders to be optimized and to run exactly the way they will run in
- // the release configuration of this program.
- dwShaderFlags |= D3DCOMPILE_DEBUG;
-#endif
-
- ID3DBlob* pErrorBlob;
- hr = D3DX11CompileFromFile( str, NULL, NULL, szEntryPoint, szShaderModel,
- dwShaderFlags, 0, NULL, ppBlobOut, &pErrorBlob, NULL );
- if( FAILED(hr) )
- {
- if( pErrorBlob != NULL )
- OutputDebugStringA( (char*)pErrorBlob->GetBufferPointer() );
- SAFE_RELEASE( pErrorBlob );
- return hr;
- }
- SAFE_RELEASE( pErrorBlob );
-
- return S_OK;
-}
-
//--------------------------------------------------------------------------------------
// Create any D3D11 resources that aren't dependant on the back buffer
//--------------------------------------------------------------------------------------
-HRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,
- void* pUserContext )
+HRESULT CALLBACK OnD3D11CreateDevice(ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc,
+ void* pUserContext)
{
HRESULT hr;
- ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext();
- V_RETURN( g_DialogResourceManager.OnD3D11CreateDevice( pd3dDevice, pd3dImmediateContext ) );
- V_RETURN( g_D3DSettingsDlg.OnD3D11CreateDevice( pd3dDevice ) );
- g_pTxtHelper = new CDXUTTextHelper( pd3dDevice, pd3dImmediateContext, &g_DialogResourceManager, 15 );
+ auto pd3dImmediateContext = DXUTGetD3D11DeviceContext();
+ V_RETURN(g_DialogResourceManager.OnD3D11CreateDevice(pd3dDevice, pd3dImmediateContext));
+ g_pTxtHelper = new CDXUTTextHelper(pd3dDevice, pd3dImmediateContext, &g_DialogResourceManager, 15);
- D3DXVECTOR3 vCenter( 0.25767413f, -28.503521f, 111.00689f );
+ XMVECTORF32 vCenter = { 0.25767413f, -28.503521f, 111.00689f };
FLOAT fObjectRadius = 378.15607f;
- D3DXMatrixTranslation( &g_mCenterMesh, -vCenter.x, -vCenter.y, -vCenter.z );
- D3DXMATRIXA16 m;
- D3DXMatrixRotationY( &m, D3DX_PI );
+ g_mCenterMesh = XMMatrixTranslation(-vCenter.f[0], -vCenter.f[1], -vCenter.f[2]);
+ XMMATRIX m = XMMatrixRotationY(XM_PI);
g_mCenterMesh *= m;
- D3DXMatrixRotationX( &m, D3DX_PI / 2.0f );
+ m = XMMatrixRotationX(XM_PI / 2.0f);
g_mCenterMesh *= m;
- // Compile the shaders using the lowest possible profile for broadest feature level support
- ID3DBlob* pVertexShaderBuffer = NULL;
- V_RETURN( CompileShaderFromFile( L"BasicHLSL11_VS.hlsl", "VSMain", "vs_4_0_level_9_1", &pVertexShaderBuffer ) );
+ // Read the HLSL file
+ // You should use the lowest possible shader profile for your shader to enable various feature levels. These
+ // shaders are simple enough to work well within the lowest possible profile, and will run on all feature levels
- ID3DBlob* pPixelShaderBuffer = NULL;
- V_RETURN( CompileShaderFromFile( L"BasicHLSL11_PS.hlsl", "PSMain", "ps_4_0_level_9_1", &pPixelShaderBuffer ) );
+ DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
+#ifdef _DEBUG
+ // Disable optimizations to further improve shader debugging
+ dwShaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+
+ ID3DBlob* pVertexShaderBuffer = nullptr;
+ V_RETURN(DXUTCompileFromFile(L"SimpleSample.hlsl", nullptr, "RenderSceneVS", "vs_4_0_level_9_1", dwShaderFlags, 0,
+ &pVertexShaderBuffer));
+
+ ID3DBlob* pPixelShaderBuffer = nullptr;
+ V_RETURN(DXUTCompileFromFile(L"SimpleSample.hlsl", nullptr, "RenderScenePS", "ps_4_0_level_9_1", dwShaderFlags, 0,
+ &pPixelShaderBuffer));
// Create the shaders
- V_RETURN( pd3dDevice->CreateVertexShader( pVertexShaderBuffer->GetBufferPointer(),
- pVertexShaderBuffer->GetBufferSize(), NULL, &g_pVertexShader ) );
- DXUT_SetDebugName( g_pVertexShader, "VSMain" );
- V_RETURN( pd3dDevice->CreatePixelShader( pPixelShaderBuffer->GetBufferPointer(),
- pPixelShaderBuffer->GetBufferSize(), NULL, &g_pPixelShader ) );
- DXUT_SetDebugName( g_pPixelShader, "PSMain" );
-
- // Create our vertex input layout
+ V_RETURN(pd3dDevice->CreateVertexShader(pVertexShaderBuffer->GetBufferPointer(),
+ pVertexShaderBuffer->GetBufferSize(), nullptr, &g_pVertexShader11));
+ DXUT_SetDebugName(g_pVertexShader11, "RenderSceneVS");
+
+ V_RETURN(pd3dDevice->CreatePixelShader(pPixelShaderBuffer->GetBufferPointer(),
+ pPixelShaderBuffer->GetBufferSize(), nullptr, &g_pPixelShader11));
+ DXUT_SetDebugName(g_pPixelShader11, "RenderScenePS");
+
+ // Create a layout for the object data
const D3D11_INPUT_ELEMENT_DESC layout[] =
{
- { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+ { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
- V_RETURN( pd3dDevice->CreateInputLayout( layout, ARRAYSIZE( layout ), pVertexShaderBuffer->GetBufferPointer(),
- pVertexShaderBuffer->GetBufferSize(), &g_pVertexLayout11 ) );
- DXUT_SetDebugName( g_pVertexLayout11, "Primary" );
-
- SAFE_RELEASE( pVertexShaderBuffer );
- SAFE_RELEASE( pPixelShaderBuffer );
+ V_RETURN(pd3dDevice->CreateInputLayout(layout, ARRAYSIZE(layout), pVertexShaderBuffer->GetBufferPointer(),
+ pVertexShaderBuffer->GetBufferSize(), &g_pLayout11));
+ DXUT_SetDebugName(g_pLayout11, "Primary");
// Load the mesh
- V_RETURN( g_Mesh11.Create( pd3dDevice, L"tiny\\tiny.sdkmesh", true ) );
-
- // Create a sampler state
- D3D11_SAMPLER_DESC SamDesc;
- SamDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
- SamDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
- SamDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
- SamDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
- SamDesc.MipLODBias = 0.0f;
- SamDesc.MaxAnisotropy = 1;
- SamDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
- SamDesc.BorderColor[0] = SamDesc.BorderColor[1] = SamDesc.BorderColor[2] = SamDesc.BorderColor[3] = 0;
- SamDesc.MinLOD = 0;
- SamDesc.MaxLOD = D3D11_FLOAT32_MAX;
- V_RETURN( pd3dDevice->CreateSamplerState( &SamDesc, &g_pSamLinear ) );
- DXUT_SetDebugName( g_pSamLinear, "Primary" );
-
- // Setup constant buffers
- D3D11_BUFFER_DESC Desc;
- Desc.Usage = D3D11_USAGE_DYNAMIC;
- Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- Desc.MiscFlags = 0;
-
- Desc.ByteWidth = sizeof( CB_VS_PER_OBJECT );
- V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbVSPerObject ) );
- DXUT_SetDebugName( g_pcbVSPerObject, "CB_VS_PER_OBJECT" );
-
- Desc.ByteWidth = sizeof( CB_PS_PER_OBJECT );
- V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbPSPerObject ) );
- DXUT_SetDebugName( g_pcbPSPerObject, "CB_PS_PER_OBJECT" );
-
- Desc.ByteWidth = sizeof( CB_PS_PER_FRAME );
- V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbPSPerFrame ) );
- DXUT_SetDebugName( g_pcbPSPerFrame, "CB_PS_PER_FRAME" );
+ V_RETURN(g_Mesh11.Create(pd3dDevice, L"tiny\\tiny.sdkmesh"));
+
+ // No longer need the shader blobs
+ SAFE_RELEASE(pVertexShaderBuffer);
+ SAFE_RELEASE(pPixelShaderBuffer);
+
+ // Create state objects
+ D3D11_SAMPLER_DESC samDesc;
+ ZeroMemory(&samDesc, sizeof(samDesc));
+ samDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
+ samDesc.AddressU = samDesc.AddressV = samDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
+ samDesc.MaxAnisotropy = 1;
+ samDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
+ samDesc.MaxLOD = D3D11_FLOAT32_MAX;
+ V_RETURN(pd3dDevice->CreateSamplerState(&samDesc, &g_pSamLinear));
+ DXUT_SetDebugName(g_pSamLinear, "Linear");
+
+ // Create constant buffers
+ D3D11_BUFFER_DESC cbDesc;
+ ZeroMemory(&cbDesc, sizeof(cbDesc));
+ cbDesc.Usage = D3D11_USAGE_DYNAMIC;
+ cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+ cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+
+ cbDesc.ByteWidth = sizeof(CB_VS_PER_OBJECT);
+ V_RETURN(pd3dDevice->CreateBuffer(&cbDesc, nullptr, &g_pcbVSPerObject11));
+ DXUT_SetDebugName(g_pcbVSPerObject11, "CB_VS_PER_OBJECT");
+
+ cbDesc.ByteWidth = sizeof(CB_VS_PER_FRAME);
+ V_RETURN(pd3dDevice->CreateBuffer(&cbDesc, nullptr, &g_pcbVSPerFrame11));
+ DXUT_SetDebugName(g_pcbVSPerFrame11, "CB_VS_PER_FRAME");
+
+ // Create other render resources here
// Setup the camera's view parameters
- D3DXVECTOR3 vecEye( 0.0f, 0.0f, -100.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 );
+ static const XMVECTORF32 s_vecEye = { 0.0f, 0.0f, -100.0f };
+ static const XMVECTORF32 s_vecAt = { 0.0f, 0.0f, -0.0f };
+
+ g_Camera.SetViewParams(s_vecEye, s_vecAt);
+ g_Camera.SetRadius(fObjectRadius * 3.0f, fObjectRadius * 0.5f, fObjectRadius * 10.0f);
return S_OK;
}
@@ -811,36 +791,43 @@ HRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFA
//--------------------------------------------------------------------------------------
// Create any D3D11 resources that depend on the back buffer
//--------------------------------------------------------------------------------------
-HRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain,
- const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
+HRESULT CALLBACK OnD3D11ResizedSwapChain(ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain,
+ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext)
{
HRESULT hr;
- V_RETURN( g_DialogResourceManager.OnD3D11ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
- V_RETURN( g_D3DSettingsDlg.OnD3D11ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) );
+ V_RETURN(g_DialogResourceManager.OnD3D11ResizedSwapChain(pd3dDevice, pBackBufferSurfaceDesc));
// Setup the camera's projection parameters
- float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;
- g_Camera.SetProjParams( D3DX_PI / 4, fAspectRatio, 2.0f, 4000.0f );
- g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
- g_Camera.SetButtonMasks( MOUSE_MIDDLE_BUTTON, MOUSE_WHEEL, MOUSE_LEFT_BUTTON );
+ float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
+ g_Camera.SetProjParams(XM_PI / 4, fAspectRatio, 2.0f, 10000.0f);
+ g_Camera.SetWindow(pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height);
+ g_Camera.SetButtonMasks(MOUSE_LEFT_BUTTON, MOUSE_WHEEL, MOUSE_MIDDLE_BUTTON);
- g_HUD.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 );
- g_HUD.SetSize( 170, 170 );
- g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width - 170, pBackBufferSurfaceDesc->Height - 300 );
- g_SampleUI.SetSize( 170, 300 );
+ g_HUD.SetLocation(pBackBufferSurfaceDesc->Width - 170, 0);
+ g_HUD.SetSize(170, 170);
+ g_SampleUI.SetLocation(pBackBufferSurfaceDesc->Width - 170, pBackBufferSurfaceDesc->Height - 300);
+ g_SampleUI.SetSize(170, 300);
return S_OK;
}
+static DWORD LastFrameTime = 0;
+DWORD FPSLimit = 60;
//--------------------------------------------------------------------------------------
// Render the scene using the D3D11 device
//--------------------------------------------------------------------------------------
-void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime,
- float fElapsedTime, void* pUserContext )
+void CALLBACK OnD3D11FrameRender(ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime,
+ float fElapsedTime, void* pUserContext)
{
- HRESULT hr;
+ // Limit FPS
+ DWORD currentTime = timeGetTime();
+ if ((currentTime - LastFrameTime) < (1000 / FPSLimit))
+ {
+ Sleep(currentTime - LastFrameTime);
+ }
+ LastFrameTime = currentTime;
g_highlights.OnTick();
@@ -851,44 +838,52 @@ void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext*
return;
case AppState::LoadResources:
RenderLoadingText();
- //g_highlights.Init(g_highlightsConfig);
- g_highlights.Init(g_highlightsConfig.gameName.c_str(), g_highlightsConfig.defaultLocale.c_str(), &g_highlightsConfig.highlights[0], g_highlightsConfig.highlights.size());
+ g_highlights.Init(g_highlightsConfig.gameName.c_str(), g_highlightsConfig.defaultLocale.c_str(), &g_highlightsConfig.highlights[0], g_highlightsConfig.highlights.size(),
+ g_targetPath.c_str(), g_targetPid);
g_state = AppState::Main;
return;
case AppState::Main:
{
- // Clear the render target and depth stencil
- ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView();
+ auto pRTV = DXUTGetD3D11RenderTargetView();
pd3dImmediateContext->ClearRenderTargetView(pRTV, g_settingsManager->GetBackgroundColorArray().data());
- ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView();
+
+ // Clear the depth stencil
+ auto pDSV = DXUTGetD3D11DepthStencilView();
pd3dImmediateContext->ClearDepthStencilView(pDSV, D3D11_CLEAR_DEPTH, 1.0, 0);
- D3DXMATRIX mWorldViewProjection;
- D3DXVECTOR3 vLightDir;
- D3DXMATRIX mWorld;
- D3DXMATRIX mView;
- D3DXMATRIX mProj;
+ // Slowly rotate world
+ XMMATRIX rotMatrix = XMMatrixRotationRollPitchYaw(0.0f, 0.001f, 0.001f);
+ g_mCenterMesh = g_mCenterMesh * rotMatrix;
// Get the projection & view matrix from the camera class
- mProj = *g_Camera.GetProjMatrix();
- mView = *g_Camera.GetViewMatrix();
+ XMMATRIX mWorld = g_mCenterMesh * g_Camera.GetWorldMatrix();
+ XMMATRIX mView = g_Camera.GetViewMatrix();
+ XMMATRIX mProj = g_Camera.GetProjMatrix();
+ XMMATRIX mWorldViewProjection = mWorld * mView * mProj;
- // Get the light direction
- vLightDir = g_LightControl.GetLightDirection();
-
- // Per frame cb update
+ // Set the constant buffers
+ HRESULT hr;
D3D11_MAPPED_SUBRESOURCE MappedResource;
- V(pd3dImmediateContext->Map(g_pcbPSPerFrame, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
- CB_PS_PER_FRAME* pPerFrame = (CB_PS_PER_FRAME*)MappedResource.pData;
- float fAmbient = 0.1f;
- pPerFrame->m_vLightDirAmbient = D3DXVECTOR4(vLightDir.x, vLightDir.y, vLightDir.z, fAmbient);
- pd3dImmediateContext->Unmap(g_pcbPSPerFrame, 0);
-
- pd3dImmediateContext->PSSetConstantBuffers(g_iCBPSPerFrameBind, 1, &g_pcbPSPerFrame);
+ V(pd3dImmediateContext->Map(g_pcbVSPerFrame11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
+ auto pVSPerFrame = reinterpret_cast<CB_VS_PER_FRAME*>(MappedResource.pData);
+ pVSPerFrame->m_vLightDir = XMFLOAT3(0, 0.707f, -0.707f);
+ pVSPerFrame->m_fTime = (float)fTime;
+ pVSPerFrame->m_LightDiffuse = XMFLOAT4(1.f, 1.f, 1.f, 1.f);
+ pd3dImmediateContext->Unmap(g_pcbVSPerFrame11, 0);
+ pd3dImmediateContext->VSSetConstantBuffers(1, 1, &g_pcbVSPerFrame11);
+
+ V(pd3dImmediateContext->Map(g_pcbVSPerObject11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
+ auto pVSPerObject = reinterpret_cast<CB_VS_PER_OBJECT*>(MappedResource.pData);
+ XMStoreFloat4x4(&pVSPerObject->m_mWorldViewProjection, XMMatrixTranspose(mWorldViewProjection));
+ XMStoreFloat4x4(&pVSPerObject->m_mWorld, XMMatrixTranspose(mWorld));
+ pVSPerObject->m_MaterialAmbientColor = XMFLOAT4(0.3f, 0.3f, 0.3f, 1.0f);
+ pVSPerObject->m_MaterialDiffuseColor = XMFLOAT4(0.7f, 0.7f, 0.7f, 1.0f);
+ pd3dImmediateContext->Unmap(g_pcbVSPerObject11, 0);
+ pd3dImmediateContext->VSSetConstantBuffers(0, 1, &g_pcbVSPerObject11);
//Get the mesh
//IA setup
- pd3dImmediateContext->IASetInputLayout(g_pVertexLayout11);
+ pd3dImmediateContext->IASetInputLayout(g_pLayout11);
UINT Strides[1];
UINT Offsets[1];
ID3D11Buffer* pVB[1];
@@ -898,40 +893,15 @@ void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext*
pd3dImmediateContext->IASetVertexBuffers(0, 1, pVB, Strides, Offsets);
pd3dImmediateContext->IASetIndexBuffer(g_Mesh11.GetIB11(0), g_Mesh11.GetIBFormat11(0), 0);
- // Set the shaders
- pd3dImmediateContext->VSSetShader(g_pVertexShader, NULL, 0);
- pd3dImmediateContext->PSSetShader(g_pPixelShader, NULL, 0);
-
- // Set the per object constant data
- mWorld = g_mCenterMesh * *g_Camera.GetWorldMatrix();
- mProj = *g_Camera.GetProjMatrix();
- mView = *g_Camera.GetViewMatrix();
-
- mWorldViewProjection = mWorld * mView * mProj;
-
- // VS Per object
- V(pd3dImmediateContext->Map(g_pcbVSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
- CB_VS_PER_OBJECT* pVSPerObject = (CB_VS_PER_OBJECT*)MappedResource.pData;
- D3DXMatrixTranspose(&pVSPerObject->m_WorldViewProj, &mWorldViewProjection);
- D3DXMatrixTranspose(&pVSPerObject->m_World, &mWorld);
- pd3dImmediateContext->Unmap(g_pcbVSPerObject, 0);
-
- pd3dImmediateContext->VSSetConstantBuffers(g_iCBVSPerObjectBind, 1, &g_pcbVSPerObject);
-
- // PS Per object
- V(pd3dImmediateContext->Map(g_pcbPSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
- CB_PS_PER_OBJECT* pPSPerObject = (CB_PS_PER_OBJECT*)MappedResource.pData;
- pPSPerObject->m_vObjectColor = D3DXVECTOR4(1, 1, 1, 1);
- pd3dImmediateContext->Unmap(g_pcbPSPerObject, 0);
-
- pd3dImmediateContext->PSSetConstantBuffers(g_iCBPSPerObjectBind, 1, &g_pcbPSPerObject);
+ // Set render resources
+ pd3dImmediateContext->IASetInputLayout(g_pLayout11);
+ pd3dImmediateContext->VSSetShader(g_pVertexShader11, nullptr, 0);
+ pd3dImmediateContext->PSSetShader(g_pPixelShader11, nullptr, 0);
+ pd3dImmediateContext->PSSetSamplers(0, 1, &g_pSamLinear);
- //Render
+ // Render objects here...
SDKMESH_SUBSET* pSubset = NULL;
D3D11_PRIMITIVE_TOPOLOGY PrimType;
-
- pd3dImmediateContext->PSSetSamplers(0, 1, &g_pSamLinear);
-
for (UINT subset = 0; subset < g_Mesh11.GetNumSubsets(0); ++subset)
{
// Get the subset
@@ -952,16 +922,29 @@ void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext*
g_SampleUI.OnRender(fElapsedTime);
RenderText();
DXUT_EndPerfEvent();
+
+ static ULONGLONG timefirst = GetTickCount64();
+ if (GetTickCount64() - timefirst > 5000)
+ {
+ OutputDebugString(DXUTGetFrameStats(DXUTIsVsyncEnabled()));
+ OutputDebugString(L"\n");
+ timefirst = GetTickCount64();
+ }
return;
}
}
}
+void CALLBACK OnQuit(void* pUserContext)
+{
+ g_highlights.DeInit();
+ PostQuitMessage(0);
+}
//--------------------------------------------------------------------------------------
// Release D3D11 resources created in OnD3D11ResizedSwapChain
//--------------------------------------------------------------------------------------
-void CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext )
+void CALLBACK OnD3D11ReleasingSwapChain(void* pUserContext)
{
g_DialogResourceManager.OnD3D11ReleasingSwapChain();
}
@@ -970,27 +953,88 @@ void CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext )
//--------------------------------------------------------------------------------------
// Release D3D11 resources created in OnD3D11CreateDevice
//--------------------------------------------------------------------------------------
-void CALLBACK OnD3D11DestroyDevice( void* pUserContext )
+void CALLBACK OnD3D11DestroyDevice(void* pUserContext)
{
g_DialogResourceManager.OnD3D11DestroyDevice();
- g_D3DSettingsDlg.OnD3D11DestroyDevice();
- //CDXUTDirectionWidget::StaticOnD3D11DestroyDevice();
DXUTGetGlobalResourceCache().OnDestroyDevice();
- SAFE_DELETE( g_pTxtHelper );
+ SAFE_DELETE(g_pTxtHelper);
g_Mesh11.Destroy();
- SAFE_RELEASE( g_pVertexLayout11 );
- SAFE_RELEASE( g_pVertexBuffer );
- SAFE_RELEASE( g_pIndexBuffer );
- SAFE_RELEASE( g_pVertexShader );
- SAFE_RELEASE( g_pPixelShader );
- SAFE_RELEASE( g_pSamLinear );
+ SAFE_RELEASE(g_pVertexShader11);
+ SAFE_RELEASE(g_pPixelShader11);
+ SAFE_RELEASE(g_pLayout11);
+ SAFE_RELEASE(g_pSamLinear);
+
+ // Delete additional render resources here...
+
+ SAFE_RELEASE(g_pcbVSPerObject11);
+ SAFE_RELEASE(g_pcbVSPerFrame11);
+}
+
+
+//--------------------------------------------------------------------------------------
+// Called right before creating a D3D device, allowing the app to modify the device settings as needed
+//--------------------------------------------------------------------------------------
+bool CALLBACK ModifyDeviceSettings(DXUTDeviceSettings* pDeviceSettings, void* pUserContext)
+{
+ return true;
+}
+
+
+//--------------------------------------------------------------------------------------
+// Handle updates to the scene. This is called regardless of which D3D API is used
+//--------------------------------------------------------------------------------------
+void CALLBACK OnFrameMove(double fTime, float fElapsedTime, void* pUserContext)
+{
+ // Update the camera's position based on user input
+ g_Camera.FrameMove(fElapsedTime);
+}
+
- SAFE_RELEASE( g_pcbVSPerObject );
- SAFE_RELEASE( g_pcbPSPerObject );
- SAFE_RELEASE( g_pcbPSPerFrame );
+//--------------------------------------------------------------------------------------
+// Handle messages to the application
+//--------------------------------------------------------------------------------------
+LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
+ void* pUserContext)
+{
+ // Pass messages to dialog resource manager calls so GUI state is updated correctly
+ *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc(hWnd, uMsg, wParam, lParam);
+ if (*pbNoFurtherProcessing)
+ return 0;
+
+ // Give the dialogs a chance to handle the message first
+ *pbNoFurtherProcessing = g_HUD.MsgProc(hWnd, uMsg, wParam, lParam);
+ if (*pbNoFurtherProcessing)
+ return 0;
+ *pbNoFurtherProcessing = g_SampleUI.MsgProc(hWnd, uMsg, wParam, lParam);
+ if (*pbNoFurtherProcessing)
+ return 0;
+
+ // Pass all remaining windows messages to camera so it can respond to user input
+ g_Camera.HandleMessages(hWnd, uMsg, wParam, lParam);
+
+ return 0;
}
+//--------------------------------------------------------------------------------------
+// Handle key presses
+//--------------------------------------------------------------------------------------
+void CALLBACK OnKeyboard(UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext)
+{
+}
+
+//--------------------------------------------------------------------------------------
+// Handles the GUI events
+//--------------------------------------------------------------------------------------
+void CALLBACK OnGUIEvent(UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext)
+{
+ void* pUserData = pControl->GetUserData();
+ if (pUserData)
+ {
+ std::function<void()>* fn = reinterpret_cast<std::function<void()>*>(pUserData);
+ (*fn)();
+ }
+}