Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Demos / DX11ClothDemo / DXUT / Optional / SDKmisc.h
1 //--------------------------------------------------------------------------------------\r
2 // File: SDKMisc.h\r
3 //\r
4 // Various helper functionality that is shared between SDK samples\r
5 //\r
6 // Copyright (c) Microsoft Corporation. All rights reserved\r
7 //--------------------------------------------------------------------------------------\r
8 #pragma once\r
9 #ifndef SDKMISC_H\r
10 #define SDKMISC_H\r
11 \r
12 \r
13 //-----------------------------------------------------------------------------\r
14 // Resource cache for textures, fonts, meshs, and effects.  \r
15 // Use DXUTGetGlobalResourceCache() to access the global cache\r
16 //-----------------------------------------------------------------------------\r
17 \r
18 enum DXUTCACHE_SOURCELOCATION\r
19 {\r
20     DXUTCACHE_LOCATION_FILE,\r
21     DXUTCACHE_LOCATION_RESOURCE\r
22 };\r
23 \r
24 struct DXUTCache_Texture\r
25 {\r
26     DXUTCACHE_SOURCELOCATION Location;\r
27     WCHAR   wszSource[MAX_PATH];\r
28     HMODULE hSrcModule;\r
29     UINT Width;\r
30     UINT Height;\r
31     UINT Depth;\r
32     UINT MipLevels;\r
33     UINT MiscFlags;\r
34     union\r
35     {\r
36         DWORD Usage9;\r
37         D3D11_USAGE Usage11;\r
38     };\r
39     union\r
40     {\r
41         D3DFORMAT Format9;\r
42         DXGI_FORMAT Format;\r
43     };\r
44     union\r
45     {\r
46         D3DPOOL Pool9;\r
47         UINT CpuAccessFlags;\r
48     };\r
49     union\r
50     {\r
51         D3DRESOURCETYPE Type9;\r
52         UINT BindFlags;\r
53     };\r
54     IDirect3DBaseTexture9* pTexture9;\r
55     ID3D11ShaderResourceView* pSRV11;\r
56 \r
57             DXUTCache_Texture()\r
58             {\r
59                 pTexture9 = NULL;\r
60                 pSRV11 = NULL;\r
61             }\r
62 };\r
63 \r
64 struct DXUTCache_Font : public D3DXFONT_DESC\r
65 {\r
66     ID3DXFont* pFont;\r
67 };\r
68 \r
69 struct DXUTCache_Effect\r
70 {\r
71     DXUTCACHE_SOURCELOCATION Location;\r
72     WCHAR wszSource[MAX_PATH];\r
73     HMODULE hSrcModule;\r
74     DWORD dwFlags;\r
75     ID3DXEffect* pEffect;\r
76 };\r
77 \r
78 \r
79 class CDXUTResourceCache\r
80 {\r
81 public:\r
82                             ~CDXUTResourceCache();\r
83 \r
84     HRESULT                 CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,\r
85                                                    LPDIRECT3DTEXTURE9* ppTexture );\r
86     HRESULT                 CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCSTR pSrcFile,\r
87                                                    LPDIRECT3DTEXTURE9* ppTexture );\r
88     HRESULT                 CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCTSTR pSrcFile,\r
89                                                    ID3D11ShaderResourceView** ppOutputRV, bool bSRGB=false );\r
90     HRESULT                 CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCSTR pSrcFile,\r
91                                                    ID3D11ShaderResourceView** ppOutputRV, bool bSRGB=false );\r
92     HRESULT                 CreateTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width,\r
93                                                      UINT Height, UINT MipLevels, DWORD Usage, D3DFORMAT Format,\r
94                                                      D3DPOOL Pool, DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey,\r
95                                                      D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,\r
96                                                      LPDIRECT3DTEXTURE9* ppTexture );\r
97     HRESULT                 CreateTextureFromFileEx( ID3D11Device* pDevice, ID3D11DeviceContext* pContext, LPCTSTR pSrcFile,\r
98                                                      D3DX11_IMAGE_LOAD_INFO* pLoadInfo, ID3DX11ThreadPump* pPump,\r
99                                                      ID3D11ShaderResourceView** ppOutputRV, bool bSRGB );\r
100     HRESULT                 CreateTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
101                                                        LPCTSTR pSrcResource, LPDIRECT3DTEXTURE9* ppTexture );\r
102     HRESULT                 CreateTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
103                                                          LPCTSTR pSrcResource, UINT Width, UINT Height, UINT MipLevels,\r
104                                                          DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,\r
105                                                          DWORD MipFilter, D3DCOLOR ColorKey, D3DXIMAGE_INFO* pSrcInfo,\r
106                                                          PALETTEENTRY* pPalette, LPDIRECT3DTEXTURE9* ppTexture );\r
107     HRESULT                 CreateCubeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,\r
108                                                        LPDIRECT3DCUBETEXTURE9* ppCubeTexture );\r
109     HRESULT                 CreateCubeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Size,\r
110                                                          UINT MipLevels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool,\r
111                                                          DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey,\r
112                                                          D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,\r
113                                                          LPDIRECT3DCUBETEXTURE9* ppCubeTexture );\r
114     HRESULT                 CreateCubeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
115                                                            LPCTSTR pSrcResource,\r
116                                                            LPDIRECT3DCUBETEXTURE9* ppCubeTexture );\r
117     HRESULT                 CreateCubeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
118                                                              LPCTSTR pSrcResource, UINT Size, UINT MipLevels,\r
119                                                              DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,\r
120                                                              DWORD MipFilter, D3DCOLOR ColorKey,\r
121                                                              D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,\r
122                                                              LPDIRECT3DCUBETEXTURE9* ppCubeTexture );\r
123     HRESULT                 CreateVolumeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,\r
124                                                          LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture );\r
125     HRESULT                 CreateVolumeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width,\r
126                                                            UINT Height, UINT Depth, UINT MipLevels, DWORD Usage,\r
127                                                            D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,\r
128                                                            DWORD MipFilter, D3DCOLOR ColorKey,\r
129                                                            D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,\r
130                                                            LPDIRECT3DVOLUMETEXTURE9* ppTexture );\r
131     HRESULT                 CreateVolumeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
132                                                              LPCTSTR pSrcResource,\r
133                                                              LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture );\r
134     HRESULT                 CreateVolumeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
135                                                                LPCTSTR pSrcResource, UINT Width, UINT Height,\r
136                                                                UINT Depth, UINT MipLevels, DWORD Usage,\r
137                                                                D3DFORMAT Format, D3DPOOL Pool, DWORD Filter,\r
138                                                                DWORD MipFilter, D3DCOLOR ColorKey,\r
139                                                                D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette,\r
140                                                                LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture );\r
141     HRESULT                 CreateFont( LPDIRECT3DDEVICE9 pDevice, UINT Height, UINT Width, UINT Weight,\r
142                                         UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision,\r
143                                         DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT* ppFont );\r
144     HRESULT CreateFontIndirect( LPDIRECT3DDEVICE9 pDevice, CONST D3DXFONT_DESC *pDesc, LPD3DXFONT *ppFont );\r
145     HRESULT                 CreateEffectFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile,\r
146                                                   const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags,\r
147                                                   LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT* ppEffect,\r
148                                                   LPD3DXBUFFER* ppCompilationErrors );\r
149     HRESULT                 CreateEffectFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule,\r
150                                                       LPCTSTR pSrcResource, const D3DXMACRO* pDefines,\r
151                                                       LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool,\r
152                                                       LPD3DXEFFECT* ppEffect, LPD3DXBUFFER* ppCompilationErrors );\r
153 \r
154 public:\r
155     HRESULT                 OnCreateDevice( IDirect3DDevice9* pd3dDevice );\r
156     HRESULT                 OnResetDevice( IDirect3DDevice9* pd3dDevice );\r
157     HRESULT                 OnLostDevice();\r
158     HRESULT                 OnDestroyDevice();\r
159 \r
160 protected:\r
161     friend CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache();\r
162     friend HRESULT WINAPI   DXUTInitialize3DEnvironment();\r
163     friend HRESULT WINAPI   DXUTReset3DEnvironment();\r
164     friend void WINAPI      DXUTCleanup3DEnvironment( bool bReleaseSettings );\r
165 \r
166                             CDXUTResourceCache()\r
167                             {\r
168                             }\r
169 \r
170     CGrowableArray <DXUTCache_Texture> m_TextureCache;\r
171     CGrowableArray <DXUTCache_Effect> m_EffectCache;\r
172     CGrowableArray <DXUTCache_Font> m_FontCache;\r
173 };\r
174 \r
175 CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache();\r
176 \r
177 \r
178 //--------------------------------------------------------------------------------------\r
179 // Manages the insertion point when drawing text\r
180 //--------------------------------------------------------------------------------------\r
181 class CDXUTDialogResourceManager;\r
182 class CDXUTTextHelper\r
183 {\r
184 public:\r
185             CDXUTTextHelper( ID3DXFont* pFont9 = NULL, ID3DXSprite* pSprite9 = NULL,\r
186                              int nLineHeight = 15 );\r
187                         CDXUTTextHelper( ID3D11Device* pd3d11Device, ID3D11DeviceContext* pd3dDeviceContext, CDXUTDialogResourceManager* pManager, int nLineHeight );\r
188             ~CDXUTTextHelper();\r
189 \r
190     void    Init( ID3DXFont* pFont9 = NULL, ID3DXSprite* pSprite9 = NULL, \r
191                   int nLineHeight = 15 );\r
192 \r
193     void    SetInsertionPos( int x, int y )\r
194     {\r
195         m_pt.x = x; m_pt.y = y;\r
196     }\r
197     void    SetForegroundColor( D3DXCOLOR clr )\r
198     {\r
199         m_clr = clr;\r
200     }\r
201 \r
202     void    Begin();\r
203     HRESULT DrawFormattedTextLine( const WCHAR* strMsg, ... );\r
204     HRESULT DrawTextLine( const WCHAR* strMsg );\r
205     HRESULT DrawFormattedTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg, ... );\r
206     HRESULT DrawTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg );\r
207     void    End();\r
208 \r
209 protected:\r
210     ID3DXFont* m_pFont9;\r
211     ID3DXSprite* m_pSprite9;\r
212     D3DXCOLOR m_clr;\r
213     POINT m_pt;\r
214     int m_nLineHeight;\r
215 \r
216         // D3D11 font \r
217         ID3D11Device* m_pd3d11Device;\r
218         ID3D11DeviceContext* m_pd3d11DeviceContext;\r
219         CDXUTDialogResourceManager* m_pManager;\r
220 };\r
221 \r
222 \r
223 //--------------------------------------------------------------------------------------\r
224 // Manages a persistent list of lines and draws them using ID3DXLine\r
225 //--------------------------------------------------------------------------------------\r
226 class CDXUTLineManager\r
227 {\r
228 public:\r
229             CDXUTLineManager();\r
230             ~CDXUTLineManager();\r
231 \r
232     HRESULT OnCreatedDevice( IDirect3DDevice9* pd3dDevice );\r
233     HRESULT OnResetDevice();\r
234     HRESULT OnRender();\r
235     HRESULT OnLostDevice();\r
236     HRESULT OnDeletedDevice();\r
237 \r
238     HRESULT AddLine( int* pnLineID, D3DXVECTOR2* pVertexList, DWORD dwVertexListCount, D3DCOLOR Color, float fWidth,\r
239                      float fScaleRatio, bool bAntiAlias );\r
240     HRESULT AddRect( int* pnLineID, RECT rc, D3DCOLOR Color, float fWidth, float fScaleRatio, bool bAntiAlias );\r
241     HRESULT RemoveLine( int nLineID );\r
242     HRESULT RemoveAllLines();\r
243 \r
244 protected:\r
245     struct LINE_NODE\r
246     {\r
247         int nLineID;\r
248         D3DCOLOR Color;\r
249         float fWidth;\r
250         bool bAntiAlias;\r
251         float fScaleRatio;\r
252         D3DXVECTOR2* pVertexList;\r
253         DWORD dwVertexListCount;\r
254     };\r
255 \r
256     CGrowableArray <LINE_NODE*> m_LinesList;\r
257     IDirect3DDevice9* m_pd3dDevice;\r
258     ID3DXLine* m_pD3DXLine;\r
259 };\r
260 \r
261 \r
262 //--------------------------------------------------------------------------------------\r
263 // Shared code for samples to ask user if they want to use a REF device or quit\r
264 //--------------------------------------------------------------------------------------\r
265 void WINAPI DXUTDisplaySwitchingToREFWarning( DXUTDeviceVersion ver );\r
266 \r
267 //--------------------------------------------------------------------------------------\r
268 // Tries to finds a media file by searching in common locations\r
269 //--------------------------------------------------------------------------------------\r
270 HRESULT WINAPI DXUTFindDXSDKMediaFileCch( __in_ecount(cchDest) WCHAR* strDestPath,\r
271                                          int cchDest, \r
272                                          __in LPCWSTR strFilename );\r
273 HRESULT WINAPI DXUTSetMediaSearchPath( LPCWSTR strPath );\r
274 LPCWSTR WINAPI DXUTGetMediaSearchPath();\r
275 \r
276 \r
277 //--------------------------------------------------------------------------------------\r
278 // Returns a view matrix for rendering to a face of a cubemap.\r
279 //--------------------------------------------------------------------------------------\r
280 D3DXMATRIX WINAPI DXUTGetCubeMapViewMatrix( DWORD dwFace );\r
281 \r
282 \r
283 //--------------------------------------------------------------------------------------\r
284 // Simple helper stack class\r
285 //--------------------------------------------------------------------------------------\r
286 template <class T> class CDXUTStack\r
287 {\r
288 private:\r
289     UINT m_MemorySize;\r
290     UINT m_NumElements;\r
291     T* m_pData;\r
292 \r
293     bool    EnsureStackSize( UINT64 iElements )\r
294     {\r
295         if( m_MemorySize > iElements )\r
296             return true;\r
297 \r
298         T* pTemp = new T[ ( size_t )( iElements * 2 + 256 ) ];\r
299         if( !pTemp )\r
300             return false;\r
301 \r
302         if( m_NumElements )\r
303         {\r
304             CopyMemory( pTemp, m_pData, ( size_t )( m_NumElements * sizeof( T ) ) );\r
305         }\r
306 \r
307         if( m_pData ) delete []m_pData;\r
308         m_pData = pTemp;\r
309         return true;\r
310     }\r
311 \r
312 public:\r
313             CDXUTStack()\r
314             {\r
315                 m_pData = NULL; m_NumElements = 0; m_MemorySize = 0;\r
316             }\r
317             ~CDXUTStack()\r
318             {\r
319                 if( m_pData ) delete []m_pData;\r
320             }\r
321 \r
322     UINT    GetCount()\r
323     {\r
324         return m_NumElements;\r
325     }\r
326     T       GetAt( UINT i )\r
327     {\r
328         return m_pData[i];\r
329     }\r
330     T       GetTop()\r
331     {\r
332         if( m_NumElements < 1 )\r
333             return NULL;\r
334 \r
335         return m_pData[ m_NumElements - 1 ];\r
336     }\r
337 \r
338     T       GetRelative( INT i )\r
339     {\r
340         INT64 iVal = m_NumElements - 1 + i;\r
341         if( iVal < 0 )\r
342             return NULL;\r
343         return m_pData[ iVal ];\r
344     }\r
345 \r
346     bool    Push( T pElem )\r
347     {\r
348         if( !EnsureStackSize( m_NumElements + 1 ) )\r
349             return false;\r
350 \r
351         m_pData[m_NumElements] = pElem;\r
352         m_NumElements++;\r
353 \r
354         return true;\r
355     }\r
356 \r
357     T       Pop()\r
358     {\r
359         if( m_NumElements < 1 )\r
360             return NULL;\r
361 \r
362         m_NumElements --;\r
363         return m_pData[m_NumElements];\r
364     }\r
365 };\r
366 \r
367 \r
368 #endif\r