diff options
Diffstat (limited to 'libraries/irrlicht-1.8/source/Irrlicht/CD3D9MaterialRenderer.h')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/CD3D9MaterialRenderer.h | 1230 |
1 files changed, 615 insertions, 615 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CD3D9MaterialRenderer.h b/libraries/irrlicht-1.8/source/Irrlicht/CD3D9MaterialRenderer.h index 1653661..5890a39 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/CD3D9MaterialRenderer.h +++ b/libraries/irrlicht-1.8/source/Irrlicht/CD3D9MaterialRenderer.h | |||
@@ -1,615 +1,615 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt | 1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt |
2 | // This file is part of the "Irrlicht Engine". | 2 | // This file is part of the "Irrlicht Engine". |
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h |
4 | 4 | ||
5 | #ifndef __C_D3D9_MATERIAL_RENDERER_H_INCLUDED__ | 5 | #ifndef __C_D3D9_MATERIAL_RENDERER_H_INCLUDED__ |
6 | #define __C_D3D9_MATERIAL_RENDERER_H_INCLUDED__ | 6 | #define __C_D3D9_MATERIAL_RENDERER_H_INCLUDED__ |
7 | 7 | ||
8 | #include "IrrCompileConfig.h" | 8 | #include "IrrCompileConfig.h" |
9 | #ifdef _IRR_WINDOWS_ | 9 | #ifdef _IRR_WINDOWS_ |
10 | 10 | ||
11 | #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_ | 11 | #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_ |
12 | #if defined(__BORLANDC__) || defined (__BCPLUSPLUS__) | 12 | #if defined(__BORLANDC__) || defined (__BCPLUSPLUS__) |
13 | #include "irrMath.h" // needed by borland for sqrtf define | 13 | #include "irrMath.h" // needed by borland for sqrtf define |
14 | #endif | 14 | #endif |
15 | #include <d3d9.h> | 15 | #include <d3d9.h> |
16 | 16 | ||
17 | #include "IMaterialRenderer.h" | 17 | #include "IMaterialRenderer.h" |
18 | 18 | ||
19 | namespace irr | 19 | namespace irr |
20 | { | 20 | { |
21 | namespace video | 21 | namespace video |
22 | { | 22 | { |
23 | 23 | ||
24 | namespace | 24 | namespace |
25 | { | 25 | { |
26 | D3DMATRIX UnitMatrixD3D9; | 26 | D3DMATRIX UnitMatrixD3D9; |
27 | D3DMATRIX SphereMapMatrixD3D9; | 27 | D3DMATRIX SphereMapMatrixD3D9; |
28 | inline void setTextureColorStage(IDirect3DDevice9* dev, DWORD i, | 28 | inline void setTextureColorStage(IDirect3DDevice9* dev, DWORD i, |
29 | DWORD arg1, DWORD op, DWORD arg2) | 29 | DWORD arg1, DWORD op, DWORD arg2) |
30 | { | 30 | { |
31 | dev->SetTextureStageState(i, D3DTSS_COLOROP, op); | 31 | dev->SetTextureStageState(i, D3DTSS_COLOROP, op); |
32 | dev->SetTextureStageState(i, D3DTSS_COLORARG1, arg1); | 32 | dev->SetTextureStageState(i, D3DTSS_COLORARG1, arg1); |
33 | dev->SetTextureStageState(i, D3DTSS_COLORARG2, arg2); | 33 | dev->SetTextureStageState(i, D3DTSS_COLORARG2, arg2); |
34 | } | 34 | } |
35 | inline void setTextureColorStage(IDirect3DDevice9* dev, DWORD i, DWORD arg1) | 35 | inline void setTextureColorStage(IDirect3DDevice9* dev, DWORD i, DWORD arg1) |
36 | { | 36 | { |
37 | dev->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1); | 37 | dev->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1); |
38 | dev->SetTextureStageState(i, D3DTSS_COLORARG1, arg1); | 38 | dev->SetTextureStageState(i, D3DTSS_COLORARG1, arg1); |
39 | } | 39 | } |
40 | 40 | ||
41 | inline void setTextureAlphaStage(IDirect3DDevice9* dev, DWORD i, | 41 | inline void setTextureAlphaStage(IDirect3DDevice9* dev, DWORD i, |
42 | DWORD arg1, DWORD op, DWORD arg2) | 42 | DWORD arg1, DWORD op, DWORD arg2) |
43 | { | 43 | { |
44 | dev->SetTextureStageState(i, D3DTSS_ALPHAOP, op); | 44 | dev->SetTextureStageState(i, D3DTSS_ALPHAOP, op); |
45 | dev->SetTextureStageState(i, D3DTSS_ALPHAARG1, arg1); | 45 | dev->SetTextureStageState(i, D3DTSS_ALPHAARG1, arg1); |
46 | dev->SetTextureStageState(i, D3DTSS_ALPHAARG2, arg2); | 46 | dev->SetTextureStageState(i, D3DTSS_ALPHAARG2, arg2); |
47 | } | 47 | } |
48 | inline void setTextureAlphaStage(IDirect3DDevice9* dev, DWORD i, DWORD arg1) | 48 | inline void setTextureAlphaStage(IDirect3DDevice9* dev, DWORD i, DWORD arg1) |
49 | { | 49 | { |
50 | dev->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); | 50 | dev->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); |
51 | dev->SetTextureStageState(i, D3DTSS_ALPHAARG1, arg1); | 51 | dev->SetTextureStageState(i, D3DTSS_ALPHAARG1, arg1); |
52 | } | 52 | } |
53 | } // anonymous namespace | 53 | } // anonymous namespace |
54 | 54 | ||
55 | //! Base class for all internal D3D9 material renderers | 55 | //! Base class for all internal D3D9 material renderers |
56 | class CD3D9MaterialRenderer : public IMaterialRenderer | 56 | class CD3D9MaterialRenderer : public IMaterialRenderer |
57 | { | 57 | { |
58 | public: | 58 | public: |
59 | 59 | ||
60 | //! Constructor | 60 | //! Constructor |
61 | CD3D9MaterialRenderer(IDirect3DDevice9* d3ddev, video::IVideoDriver* driver) | 61 | CD3D9MaterialRenderer(IDirect3DDevice9* d3ddev, video::IVideoDriver* driver) |
62 | : pID3DDevice(d3ddev), Driver(driver) | 62 | : pID3DDevice(d3ddev), Driver(driver) |
63 | { | 63 | { |
64 | } | 64 | } |
65 | 65 | ||
66 | //! sets a variable in the shader. | 66 | //! sets a variable in the shader. |
67 | //! \param vertexShader: True if this should be set in the vertex shader, false if | 67 | //! \param vertexShader: True if this should be set in the vertex shader, false if |
68 | //! in the pixel shader. | 68 | //! in the pixel shader. |
69 | //! \param name: Name of the variable | 69 | //! \param name: Name of the variable |
70 | //! \param floats: Pointer to array of floats | 70 | //! \param floats: Pointer to array of floats |
71 | //! \param count: Amount of floats in array. | 71 | //! \param count: Amount of floats in array. |
72 | virtual bool setVariable(bool vertexShader, const c8* name, const f32* floats, int count) | 72 | virtual bool setVariable(bool vertexShader, const c8* name, const f32* floats, int count) |
73 | { | 73 | { |
74 | os::Printer::log("Invalid material to set variable in."); | 74 | os::Printer::log("Invalid material to set variable in."); |
75 | return false; | 75 | return false; |
76 | } | 76 | } |
77 | 77 | ||
78 | //! Bool interface for the above. | 78 | //! Bool interface for the above. |
79 | virtual bool setVariable(bool vertexShader, const c8* name, const bool* bools, int count) | 79 | virtual bool setVariable(bool vertexShader, const c8* name, const bool* bools, int count) |
80 | { | 80 | { |
81 | os::Printer::log("Invalid material to set variable in."); | 81 | os::Printer::log("Invalid material to set variable in."); |
82 | return false; | 82 | return false; |
83 | } | 83 | } |
84 | 84 | ||
85 | //! Int interface for the above. | 85 | //! Int interface for the above. |
86 | virtual bool setVariable(bool vertexShader, const c8* name, const s32* ints, int count) | 86 | virtual bool setVariable(bool vertexShader, const c8* name, const s32* ints, int count) |
87 | { | 87 | { |
88 | os::Printer::log("Invalid material to set variable in."); | 88 | os::Printer::log("Invalid material to set variable in."); |
89 | return false; | 89 | return false; |
90 | } | 90 | } |
91 | 91 | ||
92 | protected: | 92 | protected: |
93 | 93 | ||
94 | IDirect3DDevice9* pID3DDevice; | 94 | IDirect3DDevice9* pID3DDevice; |
95 | video::IVideoDriver* Driver; | 95 | video::IVideoDriver* Driver; |
96 | }; | 96 | }; |
97 | 97 | ||
98 | 98 | ||
99 | //! Solid material renderer | 99 | //! Solid material renderer |
100 | class CD3D9MaterialRenderer_SOLID : public CD3D9MaterialRenderer | 100 | class CD3D9MaterialRenderer_SOLID : public CD3D9MaterialRenderer |
101 | { | 101 | { |
102 | public: | 102 | public: |
103 | 103 | ||
104 | CD3D9MaterialRenderer_SOLID(IDirect3DDevice9* p, video::IVideoDriver* d) | 104 | CD3D9MaterialRenderer_SOLID(IDirect3DDevice9* p, video::IVideoDriver* d) |
105 | : CD3D9MaterialRenderer(p, d) {} | 105 | : CD3D9MaterialRenderer(p, d) {} |
106 | 106 | ||
107 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 107 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
108 | bool resetAllRenderstates, IMaterialRendererServices* services) | 108 | bool resetAllRenderstates, IMaterialRendererServices* services) |
109 | { | 109 | { |
110 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 110 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
111 | 111 | ||
112 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 112 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
113 | { | 113 | { |
114 | setTextureColorStage(pID3DDevice, 0, | 114 | setTextureColorStage(pID3DDevice, 0, |
115 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 115 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
116 | } | 116 | } |
117 | 117 | ||
118 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 118 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
119 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 119 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
120 | } | 120 | } |
121 | }; | 121 | }; |
122 | 122 | ||
123 | //! Generic Texture Blend | 123 | //! Generic Texture Blend |
124 | class CD3D9MaterialRenderer_ONETEXTURE_BLEND : public CD3D9MaterialRenderer | 124 | class CD3D9MaterialRenderer_ONETEXTURE_BLEND : public CD3D9MaterialRenderer |
125 | { | 125 | { |
126 | public: | 126 | public: |
127 | 127 | ||
128 | CD3D9MaterialRenderer_ONETEXTURE_BLEND(IDirect3DDevice9* p, video::IVideoDriver* d) | 128 | CD3D9MaterialRenderer_ONETEXTURE_BLEND(IDirect3DDevice9* p, video::IVideoDriver* d) |
129 | : CD3D9MaterialRenderer(p, d) {} | 129 | : CD3D9MaterialRenderer(p, d) {} |
130 | 130 | ||
131 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 131 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
132 | bool resetAllRenderstates, IMaterialRendererServices* services) | 132 | bool resetAllRenderstates, IMaterialRendererServices* services) |
133 | { | 133 | { |
134 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 134 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
135 | 135 | ||
136 | if (material.MaterialType != lastMaterial.MaterialType || | 136 | if (material.MaterialType != lastMaterial.MaterialType || |
137 | material.MaterialTypeParam != lastMaterial.MaterialTypeParam || | 137 | material.MaterialTypeParam != lastMaterial.MaterialTypeParam || |
138 | resetAllRenderstates) | 138 | resetAllRenderstates) |
139 | { | 139 | { |
140 | 140 | ||
141 | E_BLEND_FACTOR srcFact,dstFact; | 141 | E_BLEND_FACTOR srcFact,dstFact; |
142 | E_MODULATE_FUNC modulate; | 142 | E_MODULATE_FUNC modulate; |
143 | u32 alphaSource; | 143 | u32 alphaSource; |
144 | unpack_textureBlendFunc ( srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam ); | 144 | unpack_textureBlendFunc ( srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam ); |
145 | 145 | ||
146 | if (srcFact == EBF_SRC_COLOR && dstFact == EBF_ZERO) | 146 | if (srcFact == EBF_SRC_COLOR && dstFact == EBF_ZERO) |
147 | { | 147 | { |
148 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 148 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
149 | } | 149 | } |
150 | else | 150 | else |
151 | { | 151 | { |
152 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); | 152 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); |
153 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, getD3DBlend ( srcFact ) ); | 153 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, getD3DBlend ( srcFact ) ); |
154 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, getD3DBlend ( dstFact ) ); | 154 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, getD3DBlend ( dstFact ) ); |
155 | } | 155 | } |
156 | 156 | ||
157 | setTextureColorStage(pID3DDevice, 0, | 157 | setTextureColorStage(pID3DDevice, 0, |
158 | D3DTA_TEXTURE, getD3DModulate(modulate), D3DTA_DIFFUSE); | 158 | D3DTA_TEXTURE, getD3DModulate(modulate), D3DTA_DIFFUSE); |
159 | 159 | ||
160 | if ( textureBlendFunc_hasAlpha ( srcFact ) || textureBlendFunc_hasAlpha ( dstFact ) ) | 160 | if ( textureBlendFunc_hasAlpha ( srcFact ) || textureBlendFunc_hasAlpha ( dstFact ) ) |
161 | { | 161 | { |
162 | if (alphaSource==EAS_VERTEX_COLOR) | 162 | if (alphaSource==EAS_VERTEX_COLOR) |
163 | { | 163 | { |
164 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); | 164 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); |
165 | } | 165 | } |
166 | else if (alphaSource==EAS_TEXTURE) | 166 | else if (alphaSource==EAS_TEXTURE) |
167 | { | 167 | { |
168 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); | 168 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); |
169 | } | 169 | } |
170 | else | 170 | else |
171 | { | 171 | { |
172 | setTextureAlphaStage(pID3DDevice, 0, | 172 | setTextureAlphaStage(pID3DDevice, 0, |
173 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 173 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
174 | } | 174 | } |
175 | } | 175 | } |
176 | 176 | ||
177 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 177 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
178 | 178 | ||
179 | } | 179 | } |
180 | } | 180 | } |
181 | 181 | ||
182 | //! Returns if the material is transparent. | 182 | //! Returns if the material is transparent. |
183 | /** The scene management needs to know this for being able to sort the | 183 | /** The scene management needs to know this for being able to sort the |
184 | materials by opaque and transparent. | 184 | materials by opaque and transparent. |
185 | The return value could be optimized, but we'd need to know the | 185 | The return value could be optimized, but we'd need to know the |
186 | MaterialTypeParam for it. */ | 186 | MaterialTypeParam for it. */ |
187 | virtual bool isTransparent() const | 187 | virtual bool isTransparent() const |
188 | { | 188 | { |
189 | return true; | 189 | return true; |
190 | } | 190 | } |
191 | 191 | ||
192 | private: | 192 | private: |
193 | 193 | ||
194 | u32 getD3DBlend ( E_BLEND_FACTOR factor ) const | 194 | u32 getD3DBlend ( E_BLEND_FACTOR factor ) const |
195 | { | 195 | { |
196 | u32 r = 0; | 196 | u32 r = 0; |
197 | switch ( factor ) | 197 | switch ( factor ) |
198 | { | 198 | { |
199 | case EBF_ZERO: r = D3DBLEND_ZERO; break; | 199 | case EBF_ZERO: r = D3DBLEND_ZERO; break; |
200 | case EBF_ONE: r = D3DBLEND_ONE; break; | 200 | case EBF_ONE: r = D3DBLEND_ONE; break; |
201 | case EBF_DST_COLOR: r = D3DBLEND_DESTCOLOR; break; | 201 | case EBF_DST_COLOR: r = D3DBLEND_DESTCOLOR; break; |
202 | case EBF_ONE_MINUS_DST_COLOR: r = D3DBLEND_INVDESTCOLOR; break; | 202 | case EBF_ONE_MINUS_DST_COLOR: r = D3DBLEND_INVDESTCOLOR; break; |
203 | case EBF_SRC_COLOR: r = D3DBLEND_SRCCOLOR; break; | 203 | case EBF_SRC_COLOR: r = D3DBLEND_SRCCOLOR; break; |
204 | case EBF_ONE_MINUS_SRC_COLOR: r = D3DBLEND_INVSRCCOLOR; break; | 204 | case EBF_ONE_MINUS_SRC_COLOR: r = D3DBLEND_INVSRCCOLOR; break; |
205 | case EBF_SRC_ALPHA: r = D3DBLEND_SRCALPHA; break; | 205 | case EBF_SRC_ALPHA: r = D3DBLEND_SRCALPHA; break; |
206 | case EBF_ONE_MINUS_SRC_ALPHA: r = D3DBLEND_INVSRCALPHA; break; | 206 | case EBF_ONE_MINUS_SRC_ALPHA: r = D3DBLEND_INVSRCALPHA; break; |
207 | case EBF_DST_ALPHA: r = D3DBLEND_DESTALPHA; break; | 207 | case EBF_DST_ALPHA: r = D3DBLEND_DESTALPHA; break; |
208 | case EBF_ONE_MINUS_DST_ALPHA: r = D3DBLEND_INVDESTALPHA; break; | 208 | case EBF_ONE_MINUS_DST_ALPHA: r = D3DBLEND_INVDESTALPHA; break; |
209 | case EBF_SRC_ALPHA_SATURATE: r = D3DBLEND_SRCALPHASAT; break; | 209 | case EBF_SRC_ALPHA_SATURATE: r = D3DBLEND_SRCALPHASAT; break; |
210 | } | 210 | } |
211 | return r; | 211 | return r; |
212 | } | 212 | } |
213 | 213 | ||
214 | u32 getD3DModulate ( E_MODULATE_FUNC func ) const | 214 | u32 getD3DModulate ( E_MODULATE_FUNC func ) const |
215 | { | 215 | { |
216 | u32 r = D3DTOP_MODULATE; | 216 | u32 r = D3DTOP_MODULATE; |
217 | switch ( func ) | 217 | switch ( func ) |
218 | { | 218 | { |
219 | case EMFN_MODULATE_1X: r = D3DTOP_MODULATE; break; | 219 | case EMFN_MODULATE_1X: r = D3DTOP_MODULATE; break; |
220 | case EMFN_MODULATE_2X: r = D3DTOP_MODULATE2X; break; | 220 | case EMFN_MODULATE_2X: r = D3DTOP_MODULATE2X; break; |
221 | case EMFN_MODULATE_4X: r = D3DTOP_MODULATE4X; break; | 221 | case EMFN_MODULATE_4X: r = D3DTOP_MODULATE4X; break; |
222 | } | 222 | } |
223 | return r; | 223 | return r; |
224 | } | 224 | } |
225 | 225 | ||
226 | bool transparent; | 226 | bool transparent; |
227 | 227 | ||
228 | }; | 228 | }; |
229 | 229 | ||
230 | 230 | ||
231 | 231 | ||
232 | //! Solid 2 layer material renderer | 232 | //! Solid 2 layer material renderer |
233 | class CD3D9MaterialRenderer_SOLID_2_LAYER : public CD3D9MaterialRenderer | 233 | class CD3D9MaterialRenderer_SOLID_2_LAYER : public CD3D9MaterialRenderer |
234 | { | 234 | { |
235 | public: | 235 | public: |
236 | 236 | ||
237 | CD3D9MaterialRenderer_SOLID_2_LAYER(IDirect3DDevice9* p, video::IVideoDriver* d) | 237 | CD3D9MaterialRenderer_SOLID_2_LAYER(IDirect3DDevice9* p, video::IVideoDriver* d) |
238 | : CD3D9MaterialRenderer(p, d) {} | 238 | : CD3D9MaterialRenderer(p, d) {} |
239 | 239 | ||
240 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 240 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
241 | bool resetAllRenderstates, IMaterialRendererServices* services) | 241 | bool resetAllRenderstates, IMaterialRendererServices* services) |
242 | { | 242 | { |
243 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 243 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
244 | 244 | ||
245 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 245 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
246 | { | 246 | { |
247 | setTextureColorStage(pID3DDevice, 0, D3DTA_TEXTURE); | 247 | setTextureColorStage(pID3DDevice, 0, D3DTA_TEXTURE); |
248 | 248 | ||
249 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); | 249 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); |
250 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BLENDDIFFUSEALPHA); | 250 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BLENDDIFFUSEALPHA); |
251 | 251 | ||
252 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 252 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
253 | } | 253 | } |
254 | } | 254 | } |
255 | }; | 255 | }; |
256 | 256 | ||
257 | 257 | ||
258 | //! Transparent add color material renderer | 258 | //! Transparent add color material renderer |
259 | class CD3D9MaterialRenderer_TRANSPARENT_ADD_COLOR : public CD3D9MaterialRenderer | 259 | class CD3D9MaterialRenderer_TRANSPARENT_ADD_COLOR : public CD3D9MaterialRenderer |
260 | { | 260 | { |
261 | public: | 261 | public: |
262 | 262 | ||
263 | CD3D9MaterialRenderer_TRANSPARENT_ADD_COLOR(IDirect3DDevice9* p, video::IVideoDriver* d) | 263 | CD3D9MaterialRenderer_TRANSPARENT_ADD_COLOR(IDirect3DDevice9* p, video::IVideoDriver* d) |
264 | : CD3D9MaterialRenderer(p, d) {} | 264 | : CD3D9MaterialRenderer(p, d) {} |
265 | 265 | ||
266 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 266 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
267 | bool resetAllRenderstates, IMaterialRendererServices* services) | 267 | bool resetAllRenderstates, IMaterialRendererServices* services) |
268 | { | 268 | { |
269 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 269 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
270 | 270 | ||
271 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 271 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
272 | { | 272 | { |
273 | setTextureColorStage(pID3DDevice, 0, | 273 | setTextureColorStage(pID3DDevice, 0, |
274 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 274 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
275 | 275 | ||
276 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 276 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
277 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); | 277 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); |
278 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); | 278 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); |
279 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR); | 279 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR); |
280 | } | 280 | } |
281 | } | 281 | } |
282 | 282 | ||
283 | //! Returns if the material is transparent. The scene management needs to know this | 283 | //! Returns if the material is transparent. The scene management needs to know this |
284 | //! for being able to sort the materials by opaque and transparent. | 284 | //! for being able to sort the materials by opaque and transparent. |
285 | virtual bool isTransparent() const | 285 | virtual bool isTransparent() const |
286 | { | 286 | { |
287 | return true; | 287 | return true; |
288 | } | 288 | } |
289 | }; | 289 | }; |
290 | 290 | ||
291 | 291 | ||
292 | //! Transparent vertex alpha material renderer | 292 | //! Transparent vertex alpha material renderer |
293 | class CD3D9MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public CD3D9MaterialRenderer | 293 | class CD3D9MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public CD3D9MaterialRenderer |
294 | { | 294 | { |
295 | public: | 295 | public: |
296 | 296 | ||
297 | CD3D9MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(IDirect3DDevice9* p, video::IVideoDriver* d) | 297 | CD3D9MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(IDirect3DDevice9* p, video::IVideoDriver* d) |
298 | : CD3D9MaterialRenderer(p, d) {} | 298 | : CD3D9MaterialRenderer(p, d) {} |
299 | 299 | ||
300 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 300 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
301 | bool resetAllRenderstates, IMaterialRendererServices* services) | 301 | bool resetAllRenderstates, IMaterialRendererServices* services) |
302 | { | 302 | { |
303 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 303 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
304 | 304 | ||
305 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 305 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
306 | { | 306 | { |
307 | setTextureColorStage(pID3DDevice, 0, | 307 | setTextureColorStage(pID3DDevice, 0, |
308 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 308 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
309 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); | 309 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); |
310 | 310 | ||
311 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 311 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
312 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); | 312 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); |
313 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); | 313 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); |
314 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); | 314 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); |
315 | } | 315 | } |
316 | } | 316 | } |
317 | 317 | ||
318 | //! Returns if the material is transparent. The scene managment needs to know this | 318 | //! Returns if the material is transparent. The scene managment needs to know this |
319 | //! for being able to sort the materials by opaque and transparent. | 319 | //! for being able to sort the materials by opaque and transparent. |
320 | virtual bool isTransparent() const | 320 | virtual bool isTransparent() const |
321 | { | 321 | { |
322 | return true; | 322 | return true; |
323 | } | 323 | } |
324 | }; | 324 | }; |
325 | 325 | ||
326 | 326 | ||
327 | //! Transparent alpha channel material renderer | 327 | //! Transparent alpha channel material renderer |
328 | class CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public CD3D9MaterialRenderer | 328 | class CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public CD3D9MaterialRenderer |
329 | { | 329 | { |
330 | public: | 330 | public: |
331 | 331 | ||
332 | CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(IDirect3DDevice9* p, video::IVideoDriver* d) | 332 | CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(IDirect3DDevice9* p, video::IVideoDriver* d) |
333 | : CD3D9MaterialRenderer(p, d) {} | 333 | : CD3D9MaterialRenderer(p, d) {} |
334 | 334 | ||
335 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 335 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
336 | bool resetAllRenderstates, IMaterialRendererServices* services) | 336 | bool resetAllRenderstates, IMaterialRendererServices* services) |
337 | { | 337 | { |
338 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 338 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
339 | 339 | ||
340 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates | 340 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates |
341 | || material.MaterialTypeParam != lastMaterial.MaterialTypeParam ) | 341 | || material.MaterialTypeParam != lastMaterial.MaterialTypeParam ) |
342 | { | 342 | { |
343 | setTextureColorStage(pID3DDevice, 0, | 343 | setTextureColorStage(pID3DDevice, 0, |
344 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); | 344 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); |
345 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); | 345 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); |
346 | 346 | ||
347 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 347 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
348 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); | 348 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); |
349 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); | 349 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); |
350 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); | 350 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); |
351 | 351 | ||
352 | pID3DDevice->SetRenderState(D3DRS_ALPHAREF, core::floor32(material.MaterialTypeParam * 255.f)); | 352 | pID3DDevice->SetRenderState(D3DRS_ALPHAREF, core::floor32(material.MaterialTypeParam * 255.f)); |
353 | pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); | 353 | pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); |
354 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); | 354 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); |
355 | } | 355 | } |
356 | } | 356 | } |
357 | 357 | ||
358 | virtual void OnUnsetMaterial() | 358 | virtual void OnUnsetMaterial() |
359 | { | 359 | { |
360 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); | 360 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); |
361 | } | 361 | } |
362 | 362 | ||
363 | //! Returns if the material is transparent. The scene managment needs to know this | 363 | //! Returns if the material is transparent. The scene managment needs to know this |
364 | //! for being able to sort the materials by opaque and transparent. | 364 | //! for being able to sort the materials by opaque and transparent. |
365 | virtual bool isTransparent() const | 365 | virtual bool isTransparent() const |
366 | { | 366 | { |
367 | return true; | 367 | return true; |
368 | } | 368 | } |
369 | }; | 369 | }; |
370 | 370 | ||
371 | 371 | ||
372 | 372 | ||
373 | //! Transparent alpha channel material renderer | 373 | //! Transparent alpha channel material renderer |
374 | class CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public CD3D9MaterialRenderer | 374 | class CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public CD3D9MaterialRenderer |
375 | { | 375 | { |
376 | public: | 376 | public: |
377 | 377 | ||
378 | CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(IDirect3DDevice9* p, video::IVideoDriver* d) | 378 | CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(IDirect3DDevice9* p, video::IVideoDriver* d) |
379 | : CD3D9MaterialRenderer(p, d) {} | 379 | : CD3D9MaterialRenderer(p, d) {} |
380 | 380 | ||
381 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 381 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
382 | bool resetAllRenderstates, IMaterialRendererServices* services) | 382 | bool resetAllRenderstates, IMaterialRendererServices* services) |
383 | { | 383 | { |
384 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 384 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
385 | 385 | ||
386 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 386 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
387 | { | 387 | { |
388 | setTextureColorStage(pID3DDevice, 0, | 388 | setTextureColorStage(pID3DDevice, 0, |
389 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); | 389 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); |
390 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); | 390 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); |
391 | 391 | ||
392 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 392 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
393 | 393 | ||
394 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 394 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
395 | 395 | ||
396 | // 127 is required by EMT_TRANSPARENT_ALPHA_CHANNEL_REF | 396 | // 127 is required by EMT_TRANSPARENT_ALPHA_CHANNEL_REF |
397 | pID3DDevice->SetRenderState(D3DRS_ALPHAREF, 127); | 397 | pID3DDevice->SetRenderState(D3DRS_ALPHAREF, 127); |
398 | pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); | 398 | pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); |
399 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); | 399 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); |
400 | } | 400 | } |
401 | } | 401 | } |
402 | 402 | ||
403 | virtual void OnUnsetMaterial() | 403 | virtual void OnUnsetMaterial() |
404 | { | 404 | { |
405 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); | 405 | pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); |
406 | } | 406 | } |
407 | 407 | ||
408 | //! Returns if the material is transparent. The scene managment needs to know this | 408 | //! Returns if the material is transparent. The scene managment needs to know this |
409 | //! for being able to sort the materials by opaque and transparent. | 409 | //! for being able to sort the materials by opaque and transparent. |
410 | virtual bool isTransparent() const | 410 | virtual bool isTransparent() const |
411 | { | 411 | { |
412 | return false; // this material is not really transparent because it does no blending. | 412 | return false; // this material is not really transparent because it does no blending. |
413 | } | 413 | } |
414 | }; | 414 | }; |
415 | 415 | ||
416 | 416 | ||
417 | //! material renderer for all kinds of lightmaps | 417 | //! material renderer for all kinds of lightmaps |
418 | class CD3D9MaterialRenderer_LIGHTMAP : public CD3D9MaterialRenderer | 418 | class CD3D9MaterialRenderer_LIGHTMAP : public CD3D9MaterialRenderer |
419 | { | 419 | { |
420 | public: | 420 | public: |
421 | 421 | ||
422 | CD3D9MaterialRenderer_LIGHTMAP(IDirect3DDevice9* p, video::IVideoDriver* d) | 422 | CD3D9MaterialRenderer_LIGHTMAP(IDirect3DDevice9* p, video::IVideoDriver* d) |
423 | : CD3D9MaterialRenderer(p, d) {} | 423 | : CD3D9MaterialRenderer(p, d) {} |
424 | 424 | ||
425 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 425 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
426 | bool resetAllRenderstates, IMaterialRendererServices* services) | 426 | bool resetAllRenderstates, IMaterialRendererServices* services) |
427 | { | 427 | { |
428 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 428 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
429 | 429 | ||
430 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 430 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
431 | { | 431 | { |
432 | if (material.MaterialType >= EMT_LIGHTMAP_LIGHTING) | 432 | if (material.MaterialType >= EMT_LIGHTMAP_LIGHTING) |
433 | { | 433 | { |
434 | // with lighting | 434 | // with lighting |
435 | setTextureColorStage(pID3DDevice, 0, | 435 | setTextureColorStage(pID3DDevice, 0, |
436 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 436 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
437 | } | 437 | } |
438 | else | 438 | else |
439 | { | 439 | { |
440 | setTextureColorStage(pID3DDevice, 0, D3DTA_TEXTURE); | 440 | setTextureColorStage(pID3DDevice, 0, D3DTA_TEXTURE); |
441 | } | 441 | } |
442 | 442 | ||
443 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); | 443 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); |
444 | 444 | ||
445 | setTextureColorStage(pID3DDevice, 1, | 445 | setTextureColorStage(pID3DDevice, 1, |
446 | D3DTA_TEXTURE, | 446 | D3DTA_TEXTURE, |
447 | (material.MaterialType == EMT_LIGHTMAP_ADD)? | 447 | (material.MaterialType == EMT_LIGHTMAP_ADD)? |
448 | D3DTOP_ADD: | 448 | D3DTOP_ADD: |
449 | (material.MaterialType == EMT_LIGHTMAP_M4 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M4)? | 449 | (material.MaterialType == EMT_LIGHTMAP_M4 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M4)? |
450 | D3DTOP_MODULATE4X: | 450 | D3DTOP_MODULATE4X: |
451 | (material.MaterialType == EMT_LIGHTMAP_M2 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M2)? | 451 | (material.MaterialType == EMT_LIGHTMAP_M2 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M2)? |
452 | D3DTOP_MODULATE2X: | 452 | D3DTOP_MODULATE2X: |
453 | D3DTOP_MODULATE, | 453 | D3DTOP_MODULATE, |
454 | D3DTA_CURRENT); | 454 | D3DTA_CURRENT); |
455 | 455 | ||
456 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 456 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
457 | } | 457 | } |
458 | } | 458 | } |
459 | }; | 459 | }; |
460 | 460 | ||
461 | 461 | ||
462 | 462 | ||
463 | //! material renderer for detail maps | 463 | //! material renderer for detail maps |
464 | class CD3D9MaterialRenderer_DETAIL_MAP : public CD3D9MaterialRenderer | 464 | class CD3D9MaterialRenderer_DETAIL_MAP : public CD3D9MaterialRenderer |
465 | { | 465 | { |
466 | public: | 466 | public: |
467 | 467 | ||
468 | CD3D9MaterialRenderer_DETAIL_MAP(IDirect3DDevice9* p, video::IVideoDriver* d) | 468 | CD3D9MaterialRenderer_DETAIL_MAP(IDirect3DDevice9* p, video::IVideoDriver* d) |
469 | : CD3D9MaterialRenderer(p, d) {} | 469 | : CD3D9MaterialRenderer(p, d) {} |
470 | 470 | ||
471 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 471 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
472 | bool resetAllRenderstates, IMaterialRendererServices* services) | 472 | bool resetAllRenderstates, IMaterialRendererServices* services) |
473 | { | 473 | { |
474 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 474 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
475 | 475 | ||
476 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 476 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
477 | { | 477 | { |
478 | setTextureColorStage(pID3DDevice, 0, | 478 | setTextureColorStage(pID3DDevice, 0, |
479 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 479 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
480 | setTextureColorStage(pID3DDevice, 1, | 480 | setTextureColorStage(pID3DDevice, 1, |
481 | D3DTA_TEXTURE, D3DTOP_ADDSIGNED, D3DTA_CURRENT); | 481 | D3DTA_TEXTURE, D3DTOP_ADDSIGNED, D3DTA_CURRENT); |
482 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); | 482 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); |
483 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 483 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
484 | } | 484 | } |
485 | } | 485 | } |
486 | }; | 486 | }; |
487 | 487 | ||
488 | 488 | ||
489 | //! sphere map material renderer | 489 | //! sphere map material renderer |
490 | class CD3D9MaterialRenderer_SPHERE_MAP : public CD3D9MaterialRenderer | 490 | class CD3D9MaterialRenderer_SPHERE_MAP : public CD3D9MaterialRenderer |
491 | { | 491 | { |
492 | public: | 492 | public: |
493 | 493 | ||
494 | CD3D9MaterialRenderer_SPHERE_MAP(IDirect3DDevice9* p, video::IVideoDriver* d) | 494 | CD3D9MaterialRenderer_SPHERE_MAP(IDirect3DDevice9* p, video::IVideoDriver* d) |
495 | : CD3D9MaterialRenderer(p, d) {} | 495 | : CD3D9MaterialRenderer(p, d) {} |
496 | 496 | ||
497 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 497 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
498 | bool resetAllRenderstates, IMaterialRendererServices* services) | 498 | bool resetAllRenderstates, IMaterialRendererServices* services) |
499 | { | 499 | { |
500 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 500 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
501 | 501 | ||
502 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 502 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
503 | { | 503 | { |
504 | setTextureColorStage(pID3DDevice, 0, | 504 | setTextureColorStage(pID3DDevice, 0, |
505 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 505 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
506 | 506 | ||
507 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); | 507 | pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); |
508 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 508 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
509 | 509 | ||
510 | pID3DDevice->SetTransform( D3DTS_TEXTURE0, &SphereMapMatrixD3D9 ); | 510 | pID3DDevice->SetTransform( D3DTS_TEXTURE0, &SphereMapMatrixD3D9 ); |
511 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); | 511 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); |
512 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL ); | 512 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL ); |
513 | } | 513 | } |
514 | } | 514 | } |
515 | 515 | ||
516 | virtual void OnUnsetMaterial() | 516 | virtual void OnUnsetMaterial() |
517 | { | 517 | { |
518 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); | 518 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); |
519 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0); | 519 | pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0); |
520 | pID3DDevice->SetTransform( D3DTS_TEXTURE0, &UnitMatrixD3D9 ); | 520 | pID3DDevice->SetTransform( D3DTS_TEXTURE0, &UnitMatrixD3D9 ); |
521 | } | 521 | } |
522 | }; | 522 | }; |
523 | 523 | ||
524 | 524 | ||
525 | //! reflection 2 layer material renderer | 525 | //! reflection 2 layer material renderer |
526 | class CD3D9MaterialRenderer_REFLECTION_2_LAYER : public CD3D9MaterialRenderer | 526 | class CD3D9MaterialRenderer_REFLECTION_2_LAYER : public CD3D9MaterialRenderer |
527 | { | 527 | { |
528 | public: | 528 | public: |
529 | 529 | ||
530 | CD3D9MaterialRenderer_REFLECTION_2_LAYER(IDirect3DDevice9* p, video::IVideoDriver* d) | 530 | CD3D9MaterialRenderer_REFLECTION_2_LAYER(IDirect3DDevice9* p, video::IVideoDriver* d) |
531 | : CD3D9MaterialRenderer(p, d) {} | 531 | : CD3D9MaterialRenderer(p, d) {} |
532 | 532 | ||
533 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 533 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
534 | bool resetAllRenderstates, IMaterialRendererServices* services) | 534 | bool resetAllRenderstates, IMaterialRendererServices* services) |
535 | { | 535 | { |
536 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 536 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
537 | 537 | ||
538 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 538 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
539 | { | 539 | { |
540 | setTextureColorStage(pID3DDevice, 0, | 540 | setTextureColorStage(pID3DDevice, 0, |
541 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 541 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
542 | 542 | ||
543 | setTextureColorStage(pID3DDevice, 1, | 543 | setTextureColorStage(pID3DDevice, 1, |
544 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); | 544 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); |
545 | 545 | ||
546 | pID3DDevice->SetTransform( D3DTS_TEXTURE1, &SphereMapMatrixD3D9 ); | 546 | pID3DDevice->SetTransform( D3DTS_TEXTURE1, &SphereMapMatrixD3D9 ); |
547 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); | 547 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); |
548 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); | 548 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); |
549 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); | 549 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); |
550 | } | 550 | } |
551 | } | 551 | } |
552 | 552 | ||
553 | virtual void OnUnsetMaterial() | 553 | virtual void OnUnsetMaterial() |
554 | { | 554 | { |
555 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); | 555 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); |
556 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1); | 556 | pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1); |
557 | pID3DDevice->SetTransform( D3DTS_TEXTURE1, &UnitMatrixD3D9 ); | 557 | pID3DDevice->SetTransform( D3DTS_TEXTURE1, &UnitMatrixD3D9 ); |
558 | } | 558 | } |
559 | }; | 559 | }; |
560 | 560 | ||
561 | 561 | ||
562 | //! reflection 2 layer material renderer | 562 | //! reflection 2 layer material renderer |
563 | class CD3D9MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public CD3D9MaterialRenderer | 563 | class CD3D9MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public CD3D9MaterialRenderer |
564 | { | 564 | { |
565 | public: | 565 | public: |
566 | 566 | ||
567 | CD3D9MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(IDirect3DDevice9* p, video::IVideoDriver* d) | 567 | CD3D9MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(IDirect3DDevice9* p, video::IVideoDriver* d) |
568 | : CD3D9MaterialRenderer(p, d) {} | 568 | : CD3D9MaterialRenderer(p, d) {} |
569 | 569 | ||
570 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, | 570 | virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, |
571 | bool resetAllRenderstates, IMaterialRendererServices* services) | 571 | bool resetAllRenderstates, IMaterialRendererServices* services) |
572 | { | 572 | { |
573 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); | 573 | services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); |
574 | 574 | ||
575 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) | 575 | if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) |
576 | { | 576 | { |
577 | setTextureColorStage(pID3DDevice, 0, | 577 | setTextureColorStage(pID3DDevice, 0, |
578 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); | 578 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); |
579 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); | 579 | setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); |
580 | setTextureColorStage(pID3DDevice, 1, | 580 | setTextureColorStage(pID3DDevice, 1, |
581 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); | 581 | D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); |
582 | setTextureAlphaStage(pID3DDevice, 1, D3DTA_CURRENT); | 582 | setTextureAlphaStage(pID3DDevice, 1, D3DTA_CURRENT); |
583 | 583 | ||
584 | pID3DDevice->SetTransform(D3DTS_TEXTURE1, &SphereMapMatrixD3D9 ); | 584 | pID3DDevice->SetTransform(D3DTS_TEXTURE1, &SphereMapMatrixD3D9 ); |
585 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); | 585 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); |
586 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); | 586 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); |
587 | 587 | ||
588 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); | 588 | pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); |
589 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); | 589 | pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); |
590 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); | 590 | pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); |
591 | } | 591 | } |
592 | } | 592 | } |
593 | 593 | ||
594 | virtual void OnUnsetMaterial() | 594 | virtual void OnUnsetMaterial() |
595 | { | 595 | { |
596 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); | 596 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); |
597 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); | 597 | pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); |
598 | pID3DDevice->SetTransform(D3DTS_TEXTURE1, &UnitMatrixD3D9); | 598 | pID3DDevice->SetTransform(D3DTS_TEXTURE1, &UnitMatrixD3D9); |
599 | } | 599 | } |
600 | 600 | ||
601 | //! Returns if the material is transparent. The scene managment needs to know this | 601 | //! Returns if the material is transparent. The scene managment needs to know this |
602 | //! for being able to sort the materials by opaque and transparent. | 602 | //! for being able to sort the materials by opaque and transparent. |
603 | virtual bool isTransparent() const | 603 | virtual bool isTransparent() const |
604 | { | 604 | { |
605 | return true; | 605 | return true; |
606 | } | 606 | } |
607 | }; | 607 | }; |
608 | 608 | ||
609 | } // end namespace video | 609 | } // end namespace video |
610 | } // end namespace irr | 610 | } // end namespace irr |
611 | 611 | ||
612 | #endif | 612 | #endif |
613 | #endif | 613 | #endif |
614 | #endif | 614 | #endif |
615 | 615 | ||