Guest User

StateManager.cpp

a guest
Nov 9th, 2023
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.61 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "StateManager.h"
  3.  
  4. //#define StateManager_Assert(a) if (!(a)) puts("assert"#a)
  5. #define StateManager_Assert(a) assert(a)
  6.  
  7. struct SLightData
  8. {
  9. enum
  10. {
  11. LIGHT_NUM = 8,
  12. };
  13. D3DLIGHT8 m_akD3DLight[LIGHT_NUM];
  14. } m_kLightData;
  15.  
  16.  
  17.  
  18. void CStateManager::SetLight(DWORD index, CONST D3DLIGHT8* pLight)
  19. {
  20. assert(index<SLightData::LIGHT_NUM);
  21. m_kLightData.m_akD3DLight[index]=*pLight;
  22.  
  23. m_lpD3DDev->SetLight(index, pLight);
  24. }
  25.  
  26. void CStateManager::GetLight(DWORD index, D3DLIGHT8* pLight)
  27. {
  28. assert(index<8);
  29. *pLight=m_kLightData.m_akD3DLight[index];
  30. }
  31.  
  32. bool CStateManager::BeginScene()
  33. {
  34. m_bScene=true;
  35.  
  36. D3DXMATRIX m4Proj;
  37. D3DXMATRIX m4View;
  38. D3DXMATRIX m4World;
  39. GetTransform(D3DTS_WORLD, &m4World);
  40. GetTransform(D3DTS_PROJECTION, &m4Proj);
  41. GetTransform(D3DTS_VIEW, &m4View);
  42. SetTransform(D3DTS_WORLD, &m4World);
  43. SetTransform(D3DTS_PROJECTION, &m4Proj);
  44. SetTransform(D3DTS_VIEW, &m4View);
  45.  
  46. if (FAILED(m_lpD3DDev->BeginScene()))
  47. return false;
  48. return true;
  49. }
  50.  
  51. void CStateManager::EndScene()
  52. {
  53. m_lpD3DDev->EndScene();
  54. m_bScene=false;
  55. }
  56.  
  57. CStateManager::CStateManager(LPDIRECT3DDEVICE8 lpDevice) : m_lpD3DDev(NULL)
  58. {
  59. m_bScene = false;
  60. m_dwBestMinFilter = D3DTEXF_LINEAR;
  61. m_dwBestMagFilter = D3DTEXF_LINEAR;
  62. SetDevice(lpDevice);
  63. }
  64.  
  65. CStateManager::~CStateManager()
  66. {
  67. if (m_lpD3DDev)
  68. {
  69. m_lpD3DDev->Release();
  70. m_lpD3DDev = NULL;
  71. }
  72. }
  73.  
  74. void CStateManager::SetDevice(LPDIRECT3DDEVICE8 lpDevice)
  75. {
  76. StateManager_Assert(lpDevice);
  77. lpDevice->AddRef();
  78.  
  79. if (m_lpD3DDev)
  80. {
  81. m_lpD3DDev->Release();
  82. m_lpD3DDev = NULL;
  83. }
  84.  
  85. m_lpD3DDev = lpDevice;
  86.  
  87. D3DCAPS8 d3dCaps;
  88. m_lpD3DDev->GetDeviceCaps(&d3dCaps);
  89.  
  90. if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
  91. m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
  92. else
  93. m_dwBestMagFilter = D3DTEXF_LINEAR;
  94.  
  95. if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
  96. m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
  97. else
  98. m_dwBestMinFilter = D3DTEXF_LINEAR;
  99.  
  100. DWORD dwMax = d3dCaps.MaxAnisotropy;
  101. dwMax = dwMax < 4 ? dwMax : 4;
  102.  
  103. for (int i = 0; i < 8; ++i)
  104. m_lpD3DDev->SetTextureStageState(i, D3DTSS_MAXANISOTROPY, dwMax);
  105.  
  106. SetDefaultState();
  107. }
  108.  
  109. void CStateManager::SetBestFiltering(DWORD dwStage)
  110. {
  111. SetTextureStageState(dwStage, D3DTSS_MINFILTER, m_dwBestMinFilter);
  112. SetTextureStageState(dwStage, D3DTSS_MAGFILTER, m_dwBestMagFilter);
  113. SetTextureStageState(dwStage, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  114. }
  115.  
  116. void CStateManager::Restore()
  117. {
  118. int i, j;
  119.  
  120. m_bForce = true;
  121.  
  122. for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; ++i)
  123. SetRenderState(D3DRENDERSTATETYPE(i), m_CurrentState.m_RenderStates[i]);
  124.  
  125. for (i = 0; i < STATEMANAGER_MAX_STAGES; ++i)
  126. for (j = 0; j < STATEMANAGER_MAX_TEXTURESTATES; ++j)
  127. SetTextureStageState(i, D3DTEXTURESTAGESTATETYPE(j), m_CurrentState.m_TextureStates[i][j]);
  128.  
  129. for (i = 0; i < STATEMANAGER_MAX_STAGES; ++i)
  130. SetTexture(i, m_CurrentState.m_Textures[i]);
  131.  
  132. m_bForce = false;
  133. }
  134.  
  135. void CStateManager::SetDefaultState()
  136. {
  137. m_CurrentState.ResetState();
  138. m_CopyState.ResetState();
  139. m_ChipState.ResetState();
  140.  
  141. m_bScene = false;
  142. m_bForce = true;
  143.  
  144. D3DXMATRIX Identity;
  145. D3DXMatrixIdentity(&Identity);
  146.  
  147. SetTransform(D3DTS_WORLD, &Identity);
  148. SetTransform(D3DTS_VIEW, &Identity);
  149. SetTransform(D3DTS_PROJECTION, &Identity);
  150.  
  151. D3DMATERIAL8 DefaultMat;
  152. ZeroMemory(&DefaultMat, sizeof(D3DMATERIAL8));
  153.  
  154. DefaultMat.Diffuse.r = 1.0f;
  155. DefaultMat.Diffuse.g = 1.0f;
  156. DefaultMat.Diffuse.b = 1.0f;
  157. DefaultMat.Diffuse.a = 1.0f;
  158. DefaultMat.Ambient.r = 1.0f;
  159. DefaultMat.Ambient.g = 1.0f;
  160. DefaultMat.Ambient.b = 1.0f;
  161. DefaultMat.Ambient.a = 1.0f;
  162. DefaultMat.Emissive.r = 0.0f;
  163. DefaultMat.Emissive.g = 0.0f;
  164. DefaultMat.Emissive.b = 0.0f;
  165. DefaultMat.Emissive.a = 0.0f;
  166. DefaultMat.Specular.r = 0.0f;
  167. DefaultMat.Specular.g = 0.0f;
  168. DefaultMat.Specular.b = 0.0f;
  169. DefaultMat.Specular.a = 0.0f;
  170. DefaultMat.Power = 0.0f;
  171.  
  172. SetMaterial(&DefaultMat);
  173.  
  174. SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
  175. SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
  176. SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
  177. SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
  178.  
  179. SetRenderState(D3DRS_LINEPATTERN, 0xFFFFFFFF);
  180. SetRenderState(D3DRS_LASTPIXEL, FALSE);
  181. SetRenderState(D3DRS_ALPHAREF, 1);
  182. SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
  183. SetRenderState(D3DRS_ZVISIBLE, FALSE);
  184. SetRenderState(D3DRS_FOGSTART, 0);
  185. SetRenderState(D3DRS_FOGEND, 0);
  186. SetRenderState(D3DRS_FOGDENSITY, 0);
  187. SetRenderState(D3DRS_EDGEANTIALIAS, FALSE);
  188. SetRenderState(D3DRS_ZBIAS, 0);
  189. SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
  190. SetRenderState(D3DRS_AMBIENT, 0x00000000);
  191. SetRenderState(D3DRS_LOCALVIEWER, FALSE);
  192. SetRenderState(D3DRS_NORMALIZENORMALS, FALSE);
  193. SetRenderState(D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
  194. SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
  195. SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, FALSE);
  196. SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE);
  197. SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
  198. SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
  199. SetRenderState(D3DRS_COLORWRITEENABLE, 0xFFFFFFFF);
  200. SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
  201. SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
  202. SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  203. SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  204. SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
  205. SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  206. SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
  207. SetRenderState(D3DRS_FOGENABLE, FALSE);
  208. SetRenderState(D3DRS_FOGCOLOR, 0xFF000000);
  209. SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
  210. SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
  211. SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
  212. SetRenderState(D3DRS_ZENABLE, TRUE);
  213. SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
  214. SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
  215. SetRenderState(D3DRS_DITHERENABLE, TRUE);
  216. SetRenderState(D3DRS_STENCILENABLE, FALSE);
  217. SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
  218. SetRenderState(D3DRS_CLIPPING, TRUE);
  219. SetRenderState(D3DRS_LIGHTING, FALSE);
  220. SetRenderState(D3DRS_SPECULARENABLE, FALSE);
  221. SetRenderState(D3DRS_COLORVERTEX, FALSE);
  222. SetRenderState(D3DRS_WRAP0, 0);
  223. SetRenderState(D3DRS_WRAP1, 0);
  224. SetRenderState(D3DRS_WRAP2, 0);
  225. SetRenderState(D3DRS_WRAP3, 0);
  226. SetRenderState(D3DRS_WRAP4, 0);
  227. SetRenderState(D3DRS_WRAP5, 0);
  228. SetRenderState(D3DRS_WRAP6, 0);
  229. SetRenderState(D3DRS_WRAP7, 0);
  230.  
  231. SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  232. SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  233. SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
  234. SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  235. SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
  236. SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
  237.  
  238. SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
  239. SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  240. SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  241. SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  242. SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  243. SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  244.  
  245. SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
  246. SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  247. SetTextureStageState(2, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  248. SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  249. SetTextureStageState(2, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  250. SetTextureStageState(2, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  251.  
  252. SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE);
  253. SetTextureStageState(3, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  254. SetTextureStageState(3, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  255. SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  256. SetTextureStageState(3, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  257. SetTextureStageState(3, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  258.  
  259. SetTextureStageState(4, D3DTSS_COLOROP, D3DTOP_DISABLE);
  260. SetTextureStageState(4, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  261. SetTextureStageState(4, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  262. SetTextureStageState(4, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  263. SetTextureStageState(4, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  264. SetTextureStageState(4, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  265.  
  266. SetTextureStageState(5, D3DTSS_COLOROP, D3DTOP_DISABLE);
  267. SetTextureStageState(5, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  268. SetTextureStageState(5, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  269. SetTextureStageState(5, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  270. SetTextureStageState(5, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  271. SetTextureStageState(5, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  272.  
  273. SetTextureStageState(6, D3DTSS_COLOROP, D3DTOP_DISABLE);
  274. SetTextureStageState(6, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  275. SetTextureStageState(6, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  276. SetTextureStageState(6, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  277. SetTextureStageState(6, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  278. SetTextureStageState(6, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  279.  
  280. SetTextureStageState(7, D3DTSS_COLOROP, D3DTOP_DISABLE);
  281. SetTextureStageState(7, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  282. SetTextureStageState(7, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  283. SetTextureStageState(7, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  284. SetTextureStageState(7, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  285. SetTextureStageState(7, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  286.  
  287. SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
  288. SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
  289. SetTextureStageState(2, D3DTSS_TEXCOORDINDEX, 2);
  290. SetTextureStageState(3, D3DTSS_TEXCOORDINDEX, 3);
  291. SetTextureStageState(4, D3DTSS_TEXCOORDINDEX, 4);
  292. SetTextureStageState(5, D3DTSS_TEXCOORDINDEX, 5);
  293. SetTextureStageState(6, D3DTSS_TEXCOORDINDEX, 6);
  294. SetTextureStageState(7, D3DTSS_TEXCOORDINDEX, 7);
  295.  
  296. SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  297. SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  298. SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  299.  
  300. SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  301. SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  302. SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  303.  
  304. SetTextureStageState(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  305. SetTextureStageState(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  306. SetTextureStageState(2, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  307.  
  308. SetTextureStageState(3, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  309. SetTextureStageState(3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  310. SetTextureStageState(3, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  311.  
  312. SetTextureStageState(4, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  313. SetTextureStageState(4, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  314. SetTextureStageState(4, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  315.  
  316. SetTextureStageState(5, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  317. SetTextureStageState(5, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  318. SetTextureStageState(5, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  319.  
  320. SetTextureStageState(6, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  321. SetTextureStageState(6, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  322. SetTextureStageState(6, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  323.  
  324. SetTextureStageState(7, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
  325. SetTextureStageState(7, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
  326. SetTextureStageState(7, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
  327.  
  328. SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  329. SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  330. SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  331. SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  332. SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  333. SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  334. SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  335. SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  336. SetTextureStageState(4, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  337. SetTextureStageState(4, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  338. SetTextureStageState(5, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  339. SetTextureStageState(5, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  340. SetTextureStageState(6, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  341. SetTextureStageState(6, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  342. SetTextureStageState(7, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
  343. SetTextureStageState(7, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
  344.  
  345. SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  346. SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  347. SetTextureStageState(2, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  348. SetTextureStageState(3, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  349. SetTextureStageState(4, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  350. SetTextureStageState(5, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  351. SetTextureStageState(6, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  352. SetTextureStageState(7, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
  353.  
  354. SetTexture(0, NULL);
  355. SetTexture(1, NULL);
  356. SetTexture(2, NULL);
  357. SetTexture(3, NULL);
  358. SetTexture(4, NULL);
  359. SetTexture(5, NULL);
  360. SetTexture(6, NULL);
  361. SetTexture(7, NULL);
  362.  
  363. SetPixelShader(0);
  364. SetVertexShader(D3DFVF_XYZ);
  365.  
  366. D3DXVECTOR4 av4Null[STATEMANAGER_MAX_VCONSTANTS];
  367. memset(av4Null, 0, sizeof(av4Null));
  368. SetVertexShaderConstant(0, av4Null, STATEMANAGER_MAX_VCONSTANTS);
  369. SetPixelShaderConstant(0, av4Null, STATEMANAGER_MAX_PCONSTANTS);
  370.  
  371. m_bForce = false;
  372.  
  373. #ifdef _DEBUG
  374. int i, j;
  375. for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; i++)
  376. m_bRenderStateSavingFlag[i] = FALSE;
  377.  
  378. for (j = 0; j < STATEMANAGER_MAX_TRANSFORMSTATES; j++)
  379. m_bTransformSavingFlag[j] = FALSE;
  380.  
  381. for (j = 0; j < STATEMANAGER_MAX_STAGES; ++j)
  382. for (i = 0; i < STATEMANAGER_MAX_TEXTURESTATES; ++i)
  383. m_bTextureStageStateSavingFlag[j][i] = FALSE;
  384. #endif _DEBUG
  385. }
  386.  
  387. // Material
  388. void CStateManager::SaveMaterial()
  389. {
  390. m_CopyState.m_D3DMaterial = m_CurrentState.m_D3DMaterial;
  391. }
  392.  
  393. void CStateManager::SaveMaterial(const D3DMATERIAL8 * pMaterial)
  394. {
  395. // Check that we have set this up before, if not, the default is this.
  396. m_CopyState.m_D3DMaterial = m_CurrentState.m_D3DMaterial;
  397. SetMaterial(pMaterial);
  398. }
  399.  
  400. void CStateManager::RestoreMaterial()
  401. {
  402. SetMaterial(&m_CopyState.m_D3DMaterial);
  403. }
  404.  
  405. void CStateManager::SetMaterial(const D3DMATERIAL8 * pMaterial)
  406. {
  407. m_lpD3DDev->SetMaterial(pMaterial);
  408. m_CurrentState.m_D3DMaterial = *pMaterial;
  409. }
  410.  
  411. void CStateManager::GetMaterial(D3DMATERIAL8 * pMaterial)
  412. {
  413. // Set the renderstate and remember it.
  414. *pMaterial = m_CurrentState.m_D3DMaterial;
  415. }
  416.  
  417. // Renderstates
  418. DWORD CStateManager::GetRenderState(D3DRENDERSTATETYPE Type)
  419. {
  420. return m_CurrentState.m_RenderStates[Type];
  421. }
  422.  
  423. void CStateManager::SaveRenderState(D3DRENDERSTATETYPE Type, DWORD dwValue)
  424. {
  425. #ifdef _DEBUG
  426. if (m_bRenderStateSavingFlag[Type])
  427. {
  428. Tracef(" CStateManager::SaveRenderState - This render state is already saved [%d, %d]\n", Type, dwValue);
  429. StateManager_Assert(!" This render state is already saved!");
  430. }
  431. m_bRenderStateSavingFlag[Type] = TRUE;
  432. #endif _DEBUG
  433.  
  434. // Check that we have set this up before, if not, the default is this.
  435. m_CopyState.m_RenderStates[Type] = m_CurrentState.m_RenderStates[Type];
  436. SetRenderState(Type, dwValue);
  437. }
  438.  
  439. void CStateManager::RestoreRenderState(D3DRENDERSTATETYPE Type)
  440. {
  441. #ifdef _DEBUG
  442. if (!m_bRenderStateSavingFlag[Type])
  443. {
  444. Tracef(" CStateManager::SaveRenderState - This render state was not saved [%d, %d]\n", Type);
  445. StateManager_Assert(!" This render state was not saved!");
  446. }
  447. m_bRenderStateSavingFlag[Type] = FALSE;
  448. #endif _DEBUG
  449.  
  450. SetRenderState(Type, m_CopyState.m_RenderStates[Type]);
  451. }
  452.  
  453. void CStateManager::SetRenderState(D3DRENDERSTATETYPE Type, DWORD Value)
  454. {
  455. if (m_CurrentState.m_RenderStates[Type] == Value)
  456. return;
  457.  
  458. m_lpD3DDev->SetRenderState(Type, Value);
  459. m_CurrentState.m_RenderStates[Type] = Value;
  460. }
  461.  
  462. void CStateManager::GetRenderState(D3DRENDERSTATETYPE Type, DWORD * pdwValue)
  463. {
  464. *pdwValue = m_CurrentState.m_RenderStates[Type];
  465. }
  466.  
  467. // Textures
  468. void CStateManager::SaveTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE8 pTexture)
  469. {
  470. // Check that we have set this up before, if not, the default is this.
  471. m_CopyState.m_Textures[dwStage] = m_CurrentState.m_Textures[dwStage];
  472. SetTexture(dwStage, pTexture);
  473. }
  474.  
  475. void CStateManager::RestoreTexture(DWORD dwStage)
  476. {
  477. SetTexture(dwStage, m_CopyState.m_Textures[dwStage]);
  478. }
  479.  
  480. void CStateManager::SetTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE8 pTexture)
  481. {
  482. if (pTexture == m_CurrentState.m_Textures[dwStage])
  483. return;
  484.  
  485. m_lpD3DDev->SetTexture(dwStage, pTexture);
  486. m_CurrentState.m_Textures[dwStage] = pTexture;
  487. }
  488.  
  489. void CStateManager::GetTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE8 * ppTexture)
  490. {
  491. *ppTexture = m_CurrentState.m_Textures[dwStage];
  492. }
  493.  
  494. // Texture stage states
  495. void CStateManager::SaveTextureStageState(DWORD dwStage,D3DTEXTURESTAGESTATETYPE Type, DWORD dwValue)
  496. {
  497. // Check that we have set this up before, if not, the default is this.
  498. #ifdef _DEBUG
  499. if (m_bTextureStageStateSavingFlag[dwStage][Type])
  500. {
  501. Tracef(" CStateManager::SaveTextureStageState - This texture stage state is already saved [%d, %d]\n", dwStage, Type);
  502. StateManager_Assert(!" This texture stage state is already saved!");
  503. }
  504. m_bTextureStageStateSavingFlag[dwStage][Type] = TRUE;
  505. #endif _DEBUG
  506. m_CopyState.m_TextureStates[dwStage][Type] = m_CurrentState.m_TextureStates[dwStage][Type];
  507. SetTextureStageState(dwStage, Type, dwValue);
  508. }
  509.  
  510. void CStateManager::RestoreTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type)
  511. {
  512. #ifdef _DEBUG
  513. if (!m_bTextureStageStateSavingFlag[dwStage][Type])
  514. {
  515. Tracef(" CStateManager::RestoreTextureStageState - This texture stage state was not saved [%d, %d]\n", dwStage, Type);
  516. StateManager_Assert(!" This texture stage state was not saved!");
  517. }
  518. m_bTextureStageStateSavingFlag[dwStage][Type] = FALSE;
  519. #endif _DEBUG
  520. SetTextureStageState(dwStage, Type, m_CopyState.m_TextureStates[dwStage][Type]);
  521. }
  522.  
  523. void CStateManager::SetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type, DWORD dwValue)
  524. {
  525. if (m_CurrentState.m_TextureStates[dwStage][Type] == dwValue)
  526. return;
  527.  
  528. m_lpD3DDev->SetTextureStageState(dwStage, Type, dwValue);
  529. m_CurrentState.m_TextureStates[dwStage][Type] = dwValue;
  530. }
  531.  
  532. void CStateManager::GetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type, DWORD * pdwValue)
  533. {
  534. *pdwValue = m_CurrentState.m_TextureStates[dwStage][Type];
  535. }
  536.  
  537. // Vertex Shader
  538. void CStateManager::SaveVertexShader(DWORD dwShader)
  539. {
  540. m_CopyState.m_dwVertexShader = m_CurrentState.m_dwVertexShader;
  541. SetVertexShader(dwShader);
  542. }
  543.  
  544. void CStateManager::RestoreVertexShader()
  545. {
  546. SetVertexShader(m_CopyState.m_dwVertexShader);
  547. }
  548.  
  549. void CStateManager::SetVertexShader(DWORD dwShader)
  550. {
  551. if (m_CurrentState.m_dwVertexShader == dwShader)
  552. return;
  553.  
  554. m_lpD3DDev->SetVertexShader(dwShader);
  555. m_CurrentState.m_dwVertexShader = dwShader;
  556. }
  557.  
  558. void CStateManager::GetVertexShader(DWORD * pdwShader)
  559. {
  560. *pdwShader = m_CurrentState.m_dwVertexShader;
  561. }
  562.  
  563. // Pixel Shader
  564. void CStateManager::SavePixelShader(DWORD dwShader)
  565. {
  566. m_CopyState.m_dwPixelShader = m_CurrentState.m_dwPixelShader;
  567. SetPixelShader(dwShader);
  568. }
  569.  
  570. void CStateManager::RestorePixelShader()
  571. {
  572. SetPixelShader(m_CopyState.m_dwPixelShader);
  573. }
  574.  
  575. void CStateManager::SetPixelShader(DWORD dwShader)
  576. {
  577. if (m_CurrentState.m_dwPixelShader == dwShader)
  578. return;
  579.  
  580. m_lpD3DDev->SetPixelShader(dwShader);
  581. m_CurrentState.m_dwPixelShader = dwShader;
  582. }
  583.  
  584. void CStateManager::GetPixelShader(DWORD * pdwShader)
  585. {
  586. *pdwShader = m_CurrentState.m_dwPixelShader;
  587. }
  588.  
  589. // *** These states are cached, but not protected from multiple sends of the same value.
  590. // Transform
  591. void CStateManager::SaveTransform(D3DTRANSFORMSTATETYPE Type, const D3DMATRIX* pMatrix)
  592. {
  593. #ifdef _DEBUG
  594. if (m_bTransformSavingFlag[Type])
  595. {
  596. Tracef(" CStateManager::SaveTransform - This transform is already saved [%d]\n", Type);
  597. StateManager_Assert(!" This trasform is already saved!");
  598. }
  599. m_bTransformSavingFlag[Type] = TRUE;
  600. #endif _DEBUG
  601.  
  602. m_CopyState.m_Matrices[Type] = m_CurrentState.m_Matrices[Type];
  603. SetTransform(Type, (D3DXMATRIX *)pMatrix);
  604. }
  605.  
  606. void CStateManager::RestoreTransform(D3DTRANSFORMSTATETYPE Type)
  607. {
  608. #ifdef _DEBUG
  609. if (!m_bTransformSavingFlag[Type])
  610. {
  611. Tracef(" CStateManager::RestoreTransform - This transform was not saved [%d]\n", Type);
  612. StateManager_Assert(!" This render state was not saved!");
  613. }
  614. m_bTransformSavingFlag[Type] = FALSE;
  615. #endif _DEBUG
  616.  
  617. SetTransform(Type, &m_CopyState.m_Matrices[Type]);
  618. }
  619.  
  620. // Don't cache-check the transform. To much to do
  621. void CStateManager::SetTransform(D3DTRANSFORMSTATETYPE Type, const D3DMATRIX* pMatrix)
  622. {
  623. if (m_bScene)
  624. {
  625. m_lpD3DDev->SetTransform(Type, pMatrix);
  626. }
  627. else
  628. {
  629. assert(D3DTS_VIEW==Type || D3DTS_PROJECTION==Type || D3DTS_WORLD==Type);
  630. }
  631.  
  632. m_CurrentState.m_Matrices[Type] = *pMatrix;
  633. }
  634.  
  635. void CStateManager::GetTransform(D3DTRANSFORMSTATETYPE Type, D3DMATRIX * pMatrix)
  636. {
  637. *pMatrix = m_CurrentState.m_Matrices[Type];
  638. }
  639.  
  640. // SetVertexShaderConstant
  641. void CStateManager::SaveVertexShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
  642. {
  643. DWORD i;
  644.  
  645. for (i = 0; i < dwConstantCount; i++)
  646. {
  647. StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
  648. m_CopyState.m_VertexShaderConstants[dwRegister + i] = m_CurrentState.m_VertexShaderConstants[dwRegister + i];
  649. }
  650.  
  651. SetVertexShaderConstant(dwRegister, pConstantData, dwConstantCount);
  652. }
  653.  
  654. void CStateManager::RestoreVertexShaderConstant(DWORD dwRegister, DWORD dwConstantCount)
  655. {
  656. SetVertexShaderConstant(dwRegister, &m_CopyState.m_VertexShaderConstants[dwRegister], dwConstantCount);
  657. }
  658.  
  659. void CStateManager::SetVertexShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
  660. {
  661. m_lpD3DDev->SetVertexShaderConstant(dwRegister, pConstantData, dwConstantCount);
  662.  
  663. // Set the renderstate and remember it.
  664. for (DWORD i = 0; i < dwConstantCount; i++)
  665. {
  666. StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
  667. m_CurrentState.m_VertexShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
  668. }
  669. }
  670.  
  671. // SetPixelShaderConstant
  672. void CStateManager::SavePixelShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
  673. {
  674. DWORD i;
  675.  
  676. for (i = 0; i < dwConstantCount; i++)
  677. {
  678. StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
  679. m_CopyState.m_PixelShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
  680. }
  681.  
  682. SetPixelShaderConstant(dwRegister, pConstantData, dwConstantCount);
  683. }
  684.  
  685. void CStateManager::RestorePixelShaderConstant(DWORD dwRegister, DWORD dwConstantCount)
  686. {
  687. SetPixelShaderConstant(dwRegister, &m_CopyState.m_PixelShaderConstants[dwRegister], dwConstantCount);
  688. }
  689.  
  690. void CStateManager::SetPixelShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
  691. {
  692. m_lpD3DDev->SetPixelShaderConstant(dwRegister, pConstantData, dwConstantCount);
  693.  
  694. // Set the renderstate and remember it.
  695. for (DWORD i = 0; i < dwConstantCount; i++)
  696. {
  697. StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
  698. m_CurrentState.m_PixelShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
  699. }
  700. }
  701.  
  702. void CStateManager::SaveStreamSource(UINT StreamNumber, LPDIRECT3DVERTEXBUFFER8 pStreamData,UINT Stride)
  703. {
  704. // Check that we have set this up before, if not, the default is this.
  705. m_CopyState.m_StreamData[StreamNumber] = m_CurrentState.m_StreamData[StreamNumber];
  706. SetStreamSource(StreamNumber, pStreamData, Stride);
  707. }
  708.  
  709. void CStateManager::RestoreStreamSource(UINT StreamNumber)
  710. {
  711. SetStreamSource(StreamNumber,
  712. m_CopyState.m_StreamData[StreamNumber].m_lpStreamData,
  713. m_CopyState.m_StreamData[StreamNumber].m_Stride);
  714. }
  715.  
  716. void CStateManager::SetStreamSource(UINT StreamNumber, LPDIRECT3DVERTEXBUFFER8 pStreamData, UINT Stride)
  717. {
  718. CStreamData kStreamData(pStreamData, Stride);
  719. if (m_CurrentState.m_StreamData[StreamNumber] == kStreamData)
  720. return;
  721.  
  722. m_lpD3DDev->SetStreamSource(StreamNumber, pStreamData, Stride);
  723. m_CurrentState.m_StreamData[StreamNumber] = kStreamData;
  724. }
  725.  
  726. void CStateManager::SaveIndices(LPDIRECT3DINDEXBUFFER8 pIndexData, UINT BaseVertexIndex)
  727. {
  728. m_CopyState.m_IndexData = m_CurrentState.m_IndexData;
  729. SetIndices(pIndexData, BaseVertexIndex);
  730. }
  731.  
  732. void CStateManager::RestoreIndices()
  733. {
  734. SetIndices(m_CopyState.m_IndexData.m_lpIndexData, m_CopyState.m_IndexData.m_BaseVertexIndex);
  735. }
  736.  
  737. void CStateManager::SetIndices(LPDIRECT3DINDEXBUFFER8 pIndexData, UINT BaseVertexIndex)
  738. {
  739. CIndexData kIndexData(pIndexData, BaseVertexIndex);
  740.  
  741. if (m_CurrentState.m_IndexData == kIndexData)
  742. return;
  743.  
  744. m_lpD3DDev->SetIndices(pIndexData, BaseVertexIndex);
  745. m_CurrentState.m_IndexData = kIndexData;
  746. }
  747.  
  748. HRESULT CStateManager::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount)
  749. {
  750. return (m_lpD3DDev->DrawPrimitive(PrimitiveType, StartVertex, PrimitiveCount));
  751. }
  752.  
  753. HRESULT CStateManager::DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride)
  754. {
  755. m_CurrentState.m_StreamData[0] = NULL;
  756. return (m_lpD3DDev->DrawPrimitiveUP(PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride));
  757. }
  758.  
  759. HRESULT CStateManager::DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT minIndex, UINT NumVertices, UINT startIndex, UINT primCount)
  760. {
  761. return (m_lpD3DDev->DrawIndexedPrimitive(PrimitiveType, minIndex, NumVertices, startIndex, primCount));
  762. }
  763.  
  764. HRESULT CStateManager::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertexIndices, UINT PrimitiveCount, CONST void * pIndexData, D3DFORMAT IndexDataFormat, CONST void * pVertexStreamZeroData, UINT VertexStreamZeroStride)
  765. {
  766. m_CurrentState.m_IndexData = NULL;
  767. m_CurrentState.m_StreamData[0] = NULL;
  768. return (m_lpD3DDev->DrawIndexedPrimitiveUP(PrimitiveType, MinVertexIndex, NumVertexIndices, PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride));
  769. }
  770.  
Advertisement
Add Comment
Please, Sign In to add comment