/Irrlicht/CD3D8MaterialRenderer.h

http://myjeh.googlecode.com/ · C++ Header · 588 lines · 444 code · 118 blank · 26 comment · 61 complexity · 0dcddbfd4fa1feb09c75f6f3f567d555 MD5 · raw file

  1. // Copyright (C) 2002-2010 Nikolaus Gebhardt
  2. // This file is part of the "Irrlicht Engine".
  3. // For conditions of distribution and use, see copyright notice in irrlicht.h
  4. #ifndef __C_D3D8_MATERIAL_RENDERER_H_INCLUDED__
  5. #define __C_D3D8_MATERIAL_RENDERER_H_INCLUDED__
  6. #include "IrrCompileConfig.h"
  7. #ifdef _IRR_WINDOWS_API_
  8. #ifdef _IRR_COMPILE_WITH_DIRECT3D_8_
  9. #include <d3d8.h>
  10. #include "IMaterialRenderer.h"
  11. namespace irr
  12. {
  13. namespace video
  14. {
  15. D3DMATRIX UnitMatrixD3D8;
  16. D3DMATRIX SphereMapMatrixD3D8;
  17. //! Base class for all internal D3D8 material renderers
  18. class CD3D8MaterialRenderer : public IMaterialRenderer
  19. {
  20. public:
  21. //! Constructor
  22. CD3D8MaterialRenderer(IDirect3DDevice8* d3ddev, video::IVideoDriver* driver)
  23. : pID3DDevice(d3ddev), Driver(driver)
  24. {
  25. }
  26. protected:
  27. IDirect3DDevice8* pID3DDevice;
  28. video::IVideoDriver* Driver;
  29. };
  30. //! Solid material renderer
  31. class CD3D8MaterialRenderer_SOLID : public CD3D8MaterialRenderer
  32. {
  33. public:
  34. CD3D8MaterialRenderer_SOLID(IDirect3DDevice8* p, video::IVideoDriver* d)
  35. : CD3D8MaterialRenderer(p, d) {}
  36. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  37. bool resetAllRenderstates, IMaterialRendererServices* services)
  38. {
  39. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  40. {
  41. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  42. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  43. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  44. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  45. }
  46. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
  47. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  48. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  49. }
  50. };
  51. //! Generic Texture Blend
  52. class CD3D8MaterialRenderer_ONETEXTURE_BLEND : public CD3D8MaterialRenderer
  53. {
  54. public:
  55. CD3D8MaterialRenderer_ONETEXTURE_BLEND(IDirect3DDevice8* p, video::IVideoDriver* d)
  56. : CD3D8MaterialRenderer(p, d) {}
  57. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  58. bool resetAllRenderstates, IMaterialRendererServices* services)
  59. {
  60. if (material.MaterialType != lastMaterial.MaterialType ||
  61. material.MaterialTypeParam != lastMaterial.MaterialTypeParam ||
  62. resetAllRenderstates)
  63. {
  64. E_BLEND_FACTOR srcFact,dstFact;
  65. E_MODULATE_FUNC modulate;
  66. u32 alphaSource;
  67. unpack_texureBlendFunc ( srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam );
  68. if (srcFact == EBF_SRC_COLOR && dstFact == EBF_ZERO)
  69. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  70. else
  71. {
  72. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  73. pID3DDevice->SetRenderState(D3DRS_SRCBLEND, getD3DBlend ( srcFact ) );
  74. pID3DDevice->SetRenderState(D3DRS_DESTBLEND, getD3DBlend ( dstFact ) );
  75. }
  76. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, getD3DModulate ( modulate ) );
  77. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  78. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  79. if ( alphaSource && (textureBlendFunc_hasAlpha ( srcFact ) || textureBlendFunc_hasAlpha ( dstFact ) ))
  80. {
  81. if (alphaSource==EAS_VERTEX_COLOR)
  82. {
  83. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
  84. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
  85. }
  86. else if (alphaSource==EAS_TEXTURE)
  87. {
  88. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
  89. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
  90. }
  91. else
  92. {
  93. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
  94. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
  95. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
  96. }
  97. }
  98. else
  99. {
  100. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
  101. }
  102. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
  103. }
  104. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  105. }
  106. //! Returns if the material is transparent.
  107. virtual bool isTransparent() const
  108. {
  109. return true;
  110. }
  111. private:
  112. u32 getD3DBlend ( E_BLEND_FACTOR factor ) const
  113. {
  114. u32 r = 0;
  115. switch ( factor )
  116. {
  117. case EBF_ZERO: r = D3DBLEND_ZERO; break;
  118. case EBF_ONE: r = D3DBLEND_ONE; break;
  119. case EBF_DST_COLOR: r = D3DBLEND_DESTCOLOR; break;
  120. case EBF_ONE_MINUS_DST_COLOR: r = D3DBLEND_INVDESTCOLOR; break;
  121. case EBF_SRC_COLOR: r = D3DBLEND_SRCCOLOR; break;
  122. case EBF_ONE_MINUS_SRC_COLOR: r = D3DBLEND_INVSRCCOLOR; break;
  123. case EBF_SRC_ALPHA: r = D3DBLEND_SRCALPHA; break;
  124. case EBF_ONE_MINUS_SRC_ALPHA: r = D3DBLEND_INVSRCALPHA; break;
  125. case EBF_DST_ALPHA: r = D3DBLEND_DESTALPHA; break;
  126. case EBF_ONE_MINUS_DST_ALPHA: r = D3DBLEND_INVDESTALPHA; break;
  127. case EBF_SRC_ALPHA_SATURATE: r = D3DBLEND_SRCALPHASAT; break;
  128. }
  129. return r;
  130. }
  131. u32 getD3DModulate ( E_MODULATE_FUNC func ) const
  132. {
  133. u32 r = D3DTOP_MODULATE;
  134. switch ( func )
  135. {
  136. case EMFN_MODULATE_1X: r = D3DTOP_MODULATE; break;
  137. case EMFN_MODULATE_2X: r = D3DTOP_MODULATE2X; break;
  138. case EMFN_MODULATE_4X: r = D3DTOP_MODULATE4X; break;
  139. }
  140. return r;
  141. }
  142. };
  143. //! Solid 2 layer material renderer
  144. class CD3D8MaterialRenderer_SOLID_2_LAYER : public CD3D8MaterialRenderer
  145. {
  146. public:
  147. CD3D8MaterialRenderer_SOLID_2_LAYER(IDirect3DDevice8* p, video::IVideoDriver* d)
  148. : CD3D8MaterialRenderer(p, d) {}
  149. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  150. bool resetAllRenderstates, IMaterialRendererServices* services)
  151. {
  152. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  153. {
  154. pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  155. pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  156. pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  157. pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
  158. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BLENDDIFFUSEALPHA);
  159. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  160. }
  161. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  162. }
  163. };
  164. //! Transparent add color material renderer
  165. class CD3D8MaterialRenderer_TRANSPARENT_ADD_COLOR : public CD3D8MaterialRenderer
  166. {
  167. public:
  168. CD3D8MaterialRenderer_TRANSPARENT_ADD_COLOR(IDirect3DDevice8* p, video::IVideoDriver* d)
  169. : CD3D8MaterialRenderer(p, d) {}
  170. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  171. bool resetAllRenderstates, IMaterialRendererServices* services)
  172. {
  173. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  174. {
  175. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  176. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  177. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  178. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  179. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
  180. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  181. pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
  182. pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
  183. }
  184. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  185. }
  186. //! Returns if the material is transparent.
  187. virtual bool isTransparent() const
  188. {
  189. return true;
  190. }
  191. };
  192. //! Transparent vertex alpha material renderer
  193. class CD3D8MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public CD3D8MaterialRenderer
  194. {
  195. public:
  196. CD3D8MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(IDirect3DDevice8* p, video::IVideoDriver* d)
  197. : CD3D8MaterialRenderer(p, d) {}
  198. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  199. bool resetAllRenderstates, IMaterialRendererServices* services)
  200. {
  201. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  202. {
  203. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  204. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  205. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  206. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
  207. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
  208. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
  209. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  210. pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
  211. pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
  212. }
  213. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  214. }
  215. //! Returns if the material is transparent.
  216. virtual bool isTransparent() const
  217. {
  218. return true;
  219. }
  220. };
  221. //! Transparent alpha channel material renderer
  222. class CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public CD3D8MaterialRenderer
  223. {
  224. public:
  225. CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(IDirect3DDevice8* p, video::IVideoDriver* d)
  226. : CD3D8MaterialRenderer(p, d) {}
  227. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  228. bool resetAllRenderstates, IMaterialRendererServices* services)
  229. {
  230. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates
  231. || material.MaterialTypeParam != lastMaterial.MaterialTypeParam )
  232. {
  233. pID3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
  234. pID3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  235. pID3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
  236. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
  237. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
  238. pID3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
  239. pID3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
  240. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  241. pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  242. pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
  243. pID3DDevice->SetRenderState(D3DRS_ALPHAREF, core::floor32(material.MaterialTypeParam * 255.f));
  244. pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
  245. pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
  246. }
  247. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  248. }
  249. virtual void OnUnsetMaterial()
  250. {
  251. pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
  252. }
  253. //! Returns if the material is transparent.
  254. virtual bool isTransparent() const
  255. {
  256. return true;
  257. }
  258. };
  259. //! Transparent alpha channel material renderer
  260. class CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public CD3D8MaterialRenderer
  261. {
  262. public:
  263. CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(IDirect3DDevice8* p, video::IVideoDriver* d)
  264. : CD3D8MaterialRenderer(p, d) {}
  265. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  266. bool resetAllRenderstates, IMaterialRendererServices* services)
  267. {
  268. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  269. {
  270. pID3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
  271. pID3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  272. pID3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT );
  273. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
  274. pID3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
  275. pID3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
  276. pID3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
  277. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  278. // 127 is required by EMT_TRANSPARENT_ALPHA_CHANNEL_REF
  279. pID3DDevice->SetRenderState(D3DRS_ALPHAREF, 127);
  280. pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
  281. pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
  282. }
  283. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  284. }
  285. virtual void OnUnsetMaterial()
  286. {
  287. pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
  288. }
  289. //! Returns if the material is transparent. The scene managment needs to know this
  290. //! for being able to sort the materials by opaque and transparent.
  291. virtual bool isTransparent() const
  292. {
  293. return false; // this material is not really transparent because it does no blending.
  294. }
  295. };
  296. //! material renderer for all kinds of linghtmaps
  297. class CD3D8MaterialRenderer_LIGHTMAP : public CD3D8MaterialRenderer
  298. {
  299. public:
  300. CD3D8MaterialRenderer_LIGHTMAP(IDirect3DDevice8* p, video::IVideoDriver* d)
  301. : CD3D8MaterialRenderer(p, d) {}
  302. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  303. bool resetAllRenderstates, IMaterialRendererServices* services)
  304. {
  305. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  306. {
  307. if (material.MaterialType >= EMT_LIGHTMAP_LIGHTING)
  308. {
  309. // with lighting
  310. pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  311. pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  312. pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  313. }
  314. else
  315. {
  316. pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  317. pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  318. }
  319. pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  320. pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
  321. if (material.MaterialType == EMT_LIGHTMAP_ADD)
  322. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);
  323. else
  324. if (material.MaterialType == EMT_LIGHTMAP_M4 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M4)
  325. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE4X);
  326. else
  327. if (material.MaterialType == EMT_LIGHTMAP_M2 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M2)
  328. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE2X);
  329. else
  330. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
  331. pID3DDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  332. pID3DDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
  333. pID3DDevice->SetTextureStageState (1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  334. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  335. }
  336. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  337. }
  338. };
  339. //! material renderer for detail maps
  340. class CD3D8MaterialRenderer_DETAIL_MAP : public CD3D8MaterialRenderer
  341. {
  342. public:
  343. CD3D8MaterialRenderer_DETAIL_MAP(IDirect3DDevice8* p, video::IVideoDriver* d)
  344. : CD3D8MaterialRenderer(p, d) {}
  345. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  346. bool resetAllRenderstates, IMaterialRendererServices* services)
  347. {
  348. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  349. {
  350. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  351. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  352. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  353. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  354. pID3DDevice->SetTextureStageState (1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED);
  355. pID3DDevice->SetTextureStageState (1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  356. pID3DDevice->SetTextureStageState (1, D3DTSS_COLORARG2, D3DTA_CURRENT);
  357. pID3DDevice->SetTextureStageState (1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  358. pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
  359. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  360. }
  361. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  362. }
  363. };
  364. //! sphere map material renderer
  365. class CD3D8MaterialRenderer_SPHERE_MAP : public CD3D8MaterialRenderer
  366. {
  367. public:
  368. CD3D8MaterialRenderer_SPHERE_MAP(IDirect3DDevice8* p, video::IVideoDriver* d)
  369. : CD3D8MaterialRenderer(p, d) {}
  370. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  371. bool resetAllRenderstates, IMaterialRendererServices* services)
  372. {
  373. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  374. {
  375. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  376. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  377. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  378. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  379. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
  380. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  381. pID3DDevice->SetTransform( D3DTS_TEXTURE0, &SphereMapMatrixD3D8 );
  382. pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
  383. pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL );
  384. }
  385. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  386. }
  387. virtual void OnUnsetMaterial()
  388. {
  389. pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
  390. pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0);
  391. pID3DDevice->SetTransform( D3DTS_TEXTURE0, &UnitMatrixD3D8 );
  392. }
  393. };
  394. //! reflection 2 layer material renderer
  395. class CD3D8MaterialRenderer_REFLECTION_2_LAYER : public CD3D8MaterialRenderer
  396. {
  397. public:
  398. CD3D8MaterialRenderer_REFLECTION_2_LAYER(IDirect3DDevice8* p, video::IVideoDriver* d)
  399. : CD3D8MaterialRenderer(p, d) {}
  400. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  401. bool resetAllRenderstates, IMaterialRendererServices* services)
  402. {
  403. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  404. {
  405. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  406. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  407. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  408. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  409. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
  410. pID3DDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  411. pID3DDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
  412. pID3DDevice->SetTransform( D3DTS_TEXTURE1, &SphereMapMatrixD3D8 );
  413. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
  414. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  415. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  416. }
  417. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  418. }
  419. virtual void OnUnsetMaterial()
  420. {
  421. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
  422. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1);
  423. pID3DDevice->SetTransform( D3DTS_TEXTURE1, &UnitMatrixD3D8 );
  424. }
  425. };
  426. //! reflection 2 layer material renderer
  427. class CD3D8MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public CD3D8MaterialRenderer
  428. {
  429. public:
  430. CD3D8MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(IDirect3DDevice8* p, video::IVideoDriver* d)
  431. : CD3D8MaterialRenderer(p, d) {}
  432. virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
  433. bool resetAllRenderstates, IMaterialRendererServices* services)
  434. {
  435. if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
  436. {
  437. pID3DDevice->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  438. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  439. pID3DDevice->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  440. pID3DDevice->SetTextureStageState (0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  441. pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);
  442. pID3DDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  443. pID3DDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
  444. pID3DDevice->SetTransform( D3DTS_TEXTURE1, &SphereMapMatrixD3D8 );
  445. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
  446. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  447. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  448. pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  449. pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  450. pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
  451. }
  452. services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
  453. }
  454. virtual void OnUnsetMaterial()
  455. {
  456. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
  457. pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1);
  458. pID3DDevice->SetTransform( D3DTS_TEXTURE1, &UnitMatrixD3D8 );
  459. }
  460. //! Returns if the material is transparent.
  461. virtual bool isTransparent() const
  462. {
  463. return true;
  464. }
  465. };
  466. } // end namespace video
  467. } // end namespace irr
  468. #endif
  469. #endif
  470. #endif