source: GTP/trunk/App/Demos/Geom/Shark3D/src/drv_d3d9_state.h @ 2236

Revision 2236, 23.6 KB checked in by gumbau, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14//@cpp
15#ifndef S3D_DRV_D3D9_STATE_H
16#define S3D_DRV_D3D9_STATE_H
17
18#include "comp/core/comp_module.h"
19#include "drv_d3d9_env.h"
20#include "drv_d3d9_util.h"
21#include <d3d9.h>
22#include <d3dx9.h>
23
24///////////////////////////////////////////////////////////////////////////////
25
26// if enabled, states are cached and applied all at once
27//#define S3D_DRV_D3D9_STATEMGR_APPLYBLOCK
28
29// if using S3D_DRV_D3D9_STATEMGR_APPLYBLOCK use memcpy
30#define S3D_DRV_D3D9_STATEMGR_USE_MEMCPY
31
32// disable check if state is already set, usefull for tracking bugs
33//#define S3D_DRV_D3D9_STATE_NOCHECK
34
35///////////////////////////////////////////////////////////////////////////////
36
37#ifndef S3D_DRV_D3D9_STATEMGR_APPLYBLOCK
38    #define S3D_DRV_D3D9_SETSTATEDIRECT(A) (A)
39    #define S3D_DRV_D3D9_ASSIGN(A, B) (A = B)
40#else
41    #define S3D_DRV_D3D9_SETSTATEDIRECT(A)
42    #ifdef S3D_DRV_D3D9_STATEMGR_USE_MEMCPY
43        #define S3D_DRV_D3D9_ASSIGN(A, B)
44    #else
45        #define S3D_DRV_D3D9_ASSIGN(A, B) (A = B)
46    #endif
47#endif
48
49#ifndef S3D_DRV_D3D9_STATE_NOCHECK
50    #define S3D_DRV_D3D9_STATE_NE(A, B) if((A) != (B))
51#else
52    #define S3D_DRV_D3D9_STATE_NE(A, B)
53#endif
54
55///////////////////////////////////////////////////////////////////////////////
56
57//@
58D3DX_ALIGN16 struct s3d_CDrvD3d9StateBlk
59{
60    int m_CullMode;
61    int m_DepthTestMode;
62    BOOL m_DepthWrite;
63    float m_DepthBias;
64    float m_SlopeScaleDepthBias;
65    int m_PaintMode;
66
67    BOOL m_AlphaBlendEnabled;
68    int m_SrcBlend;
69    int m_DestBlend;
70    int m_BlendOp;
71    BOOL m_SeparateAlphaBlendEnabled;
72    int m_SrcBlendAlpha;
73    int m_DestBlendAlpha;
74    int m_BlendOpAlpha;
75
76    BOOL m_AlphaTestEnabled;
77    int m_AlphaTestMode;
78    int m_AlphaTestRef;
79
80    int m_ColorWriteEnabled;
81
82    BOOL m_StencilEnabled;
83    int m_StencilTestModeFront;
84    int m_StencilTestRef;
85    int m_StencilTestMask;
86    int m_StencilWriteMask;
87    int m_StencilOpFailFront;
88    int m_StencilOpDepthFailFront;
89    int m_StencilOpDepthPassFront;
90    BOOL m_StencilTwoSidedEnabled;
91    int m_StencilTestModeBack;
92    int m_StencilOpFailBack;
93    int m_StencilOpDepthFailBack;
94    int m_StencilOpDepthPassBack;
95    D3DCOLOR m_FogColor;
96    float m_FogDensity;
97};
98
99 //@
100typedef const s3d_CDrvD3d9StateBlk &s3d_CDrvD3d9StateBlk_cr;
101
102///////////////////////////////////////////////////////////////////////////////
103
104//@
105class s3d_CDrvD3d9StateMgr
106{
107public:
108    s3d_CDrvD3d9StateMgr();
109   
110    void Invalidate();
111    void Apply(
112            s3d_CDrvD3d9StateBlk_cr StateBlk);
113
114    void SetCullMode(
115            int CullMode);
116   
117    void SetDepthTestMode(
118            int DepthTestMode);
119    void SetDepthWrite(
120            int DepthWrite);
121
122    void SetPaintMode(
123            int PaintMode);
124
125    void SetAlphaBlendEnabled(
126            BOOL AlphaBlendEnabled);
127    void SetSrcBlend(
128            int SrcBlend);
129    void SetDestBlend(
130            int DestBlend);
131    void SetBlendOp(
132            int BlendOp);
133    void SetSeparateAlphaBlendEnabled(
134            BOOL SeparateAlphaBlendEnabled);
135    void SetSrcBlendAlpha(
136            int SrcBlendAlpha);
137    void SetDestBlendAlpha(
138            int DestBlendAlpha);
139    void SetBlendOpAlpha(
140            int BlendOpAlpha);
141
142    void SetAlphaTestEnabled(
143            BOOL AlphaTestEnabled);
144    void SetAlphaTestMode(
145            int AlphaTestMode);
146    void SetAlphaTestRef(
147            int AlphaTestRef);
148    void SetColorWriteEnabled(
149            int ColorWriteEnabled);
150    void SetDepthBias(
151            float DepthBias, float SlopeScaleDepthBias);
152   
153    void SetStencilEnabled(
154            BOOL StencilEnabled);
155    void SetStencilTwoSidedEnabled(
156            BOOL StencilTwoSidedEnabled);
157    void SetStencilTestModeFront(
158            int StencilTestModeFront);
159    void SetStencilTestModeBack(
160            int StencilTestModeBack);
161    void SetStencilTestRef(
162            int StencilTestRef);
163    void SetStencilTestMask(
164            int StencilTestMask);
165    void SetStencilWriteMask(
166            int StencilWriteMask);
167    void SetStencilOpFailFront(
168            int StencilOpFailFront);
169    void SetStencilOpDepthFailFront(
170            int StencilOpDepthFailFront);
171    void SetStencilOpDepthPassFront(
172            int StencilOpDepthPassFront);
173    void SetStencilOpFailBack(
174            int StencilOpFailBack);
175    void SetStencilOpDepthFailBack(
176            int StencilOpDepthFailBack);
177    void SetStencilOpDepthPassBack(
178            int StencilOpDepthPassBack);
179
180    void SetFogDensity(
181            float FogDensity);
182    void SetFogColor(
183            const D3DCOLOR &FogColor);
184
185private:
186    s3d_CDrvD3d9StateBlk m_StateBlk;
187    s3d_CUtilMsgHandlerPtr m_MsgHandler;
188    s3d_CDrvD3d9Env *m_Env;
189    s3d_CDrvD3d9Device m_D3dDev;
190
191    friend class s3d_CDrvD3d9GfxEngCLOD;
192};
193
194///////////////////////////////////////////////////////////////////////////////
195
196//@
197class s3d_CDrvD3d9StateUtil
198{
199public:
200
201    //@
202    static HRESULT SetRenderStateI(
203            LPDIRECT3DDEVICE9 D3dDev,
204            D3DRENDERSTATETYPE State, DWORD Value);
205
206    //@
207    static HRESULT SetRenderStateF(
208            LPDIRECT3DDEVICE9 D3dDev,
209            D3DRENDERSTATETYPE State, float Value);
210
211    //@
212    static HRESULT SetSamplerStateI(
213            LPDIRECT3DDEVICE9 D3dDev,
214            DWORD Samp, D3DSAMPLERSTATETYPE Type, DWORD Value);
215
216    //@
217    static HRESULT SetSamplerStateF(
218            LPDIRECT3DDEVICE9 D3dDev,
219            DWORD Samp, D3DSAMPLERSTATETYPE Type, float Value);
220
221    //@
222    static HRESULT SetTextureStageStateI(
223            LPDIRECT3DDEVICE9 D3dDev,
224            DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value);
225
226    //@
227    static HRESULT SetTextureStageStateF(
228            LPDIRECT3DDEVICE9 D3dDev,
229            DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, float Value);
230};
231
232///////////////////////////////////////////////////////////////////////////////
233// Definitions
234
235S3D_DRV_D3D9_INLINE
236void s3d_CDrvD3d9StateMgr::SetCullMode(
237        int CullMode)
238{
239    S3D_DRV_D3D9_STATE_NE(
240            m_StateBlk.m_CullMode, CullMode)
241    {
242        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_CullMode, CullMode);
243        S3D_DRV_D3D9_CHECK(
244            m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
245                m_D3dDev, D3DRS_CULLMODE, CullMode));
246    }
247}
248
249S3D_DRV_D3D9_INLINE
250void s3d_CDrvD3d9StateMgr::SetDepthTestMode(
251        int DepthTestMode)
252{
253    S3D_DRV_D3D9_STATE_NE(
254            m_StateBlk.m_DepthTestMode, DepthTestMode)
255    {
256        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DepthTestMode, DepthTestMode);
257        S3D_DRV_D3D9_CHECK(
258                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
259                    m_D3dDev, D3DRS_ZFUNC, DepthTestMode));
260    }
261}
262
263S3D_DRV_D3D9_INLINE
264void s3d_CDrvD3d9StateMgr::SetDepthWrite(
265        int DepthWrite)
266{
267    S3D_DRV_D3D9_STATE_NE(
268            m_StateBlk.m_DepthWrite, DepthWrite)
269    {
270        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DepthWrite, DepthWrite);
271        S3D_DRV_D3D9_CHECK(
272                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
273                    m_D3dDev, D3DRS_ZWRITEENABLE, DepthWrite));
274    }
275}
276
277S3D_DRV_D3D9_INLINE
278void s3d_CDrvD3d9StateMgr::SetPaintMode(
279        int PaintMode)
280{
281    S3D_DRV_D3D9_STATE_NE(
282            m_StateBlk.m_PaintMode, PaintMode)
283    {
284        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_PaintMode, PaintMode);
285        S3D_DRV_D3D9_CHECK(
286                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
287                    m_D3dDev, D3DRS_FILLMODE, PaintMode));
288    }
289}
290
291S3D_DRV_D3D9_INLINE
292void s3d_CDrvD3d9StateMgr::SetAlphaBlendEnabled(
293        BOOL AlphaBlendEnabled)
294{
295    S3D_DRV_D3D9_STATE_NE(
296            m_StateBlk.m_AlphaBlendEnabled, AlphaBlendEnabled)
297    {
298        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaBlendEnabled, AlphaBlendEnabled);
299        S3D_DRV_D3D9_CHECK(
300                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
301                    m_D3dDev, D3DRS_ALPHABLENDENABLE, AlphaBlendEnabled));
302    }
303}
304
305S3D_DRV_D3D9_INLINE
306void s3d_CDrvD3d9StateMgr::SetSrcBlend(
307        int SrcBlend)
308{
309    S3D_DRV_D3D9_STATE_NE(
310            m_StateBlk.m_SrcBlend, SrcBlend)
311    {
312        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_SrcBlend, SrcBlend);
313        S3D_DRV_D3D9_CHECK(
314                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
315                    m_D3dDev, D3DRS_SRCBLEND, SrcBlend));
316    }
317}
318
319S3D_DRV_D3D9_INLINE
320void s3d_CDrvD3d9StateMgr::SetDestBlend(
321        int DestBlend)
322{
323    S3D_DRV_D3D9_STATE_NE(
324            m_StateBlk.m_DestBlend, DestBlend)
325    {
326        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DestBlend, DestBlend);
327        S3D_DRV_D3D9_CHECK(
328                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
329                    m_D3dDev, D3DRS_DESTBLEND, DestBlend));
330    }
331}
332
333S3D_DRV_D3D9_INLINE
334void s3d_CDrvD3d9StateMgr::SetBlendOp(
335        int BlendOp)
336{
337    S3D_DRV_D3D9_STATE_NE(
338            m_StateBlk.m_BlendOp, BlendOp)
339    {
340        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_BlendOp, BlendOp);
341        S3D_DRV_D3D9_CHECK(
342                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
343                    m_D3dDev, D3DRS_BLENDOP, BlendOp));
344    }
345}
346
347S3D_DRV_D3D9_INLINE
348void s3d_CDrvD3d9StateMgr::SetSeparateAlphaBlendEnabled(
349        BOOL SeparateAlphaBlendEnabled)
350{
351    S3D_DRV_D3D9_STATE_NE(
352            m_StateBlk.m_SeparateAlphaBlendEnabled, SeparateAlphaBlendEnabled)
353    {
354        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_SeparateAlphaBlendEnabled,
355                    SeparateAlphaBlendEnabled);
356        S3D_DRV_D3D9_CHECK(
357                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
358                    m_D3dDev, D3DRS_SEPARATEALPHABLENDENABLE,
359                    SeparateAlphaBlendEnabled));
360    }
361}
362
363S3D_DRV_D3D9_INLINE
364void s3d_CDrvD3d9StateMgr::SetSrcBlendAlpha(
365        int SrcBlendAlpha)
366{
367    S3D_DRV_D3D9_STATE_NE(
368            m_StateBlk.m_SrcBlendAlpha, SrcBlendAlpha)
369    {
370        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_SrcBlendAlpha, SrcBlendAlpha);
371        S3D_DRV_D3D9_CHECK(
372                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
373                    m_D3dDev, D3DRS_SRCBLENDALPHA, SrcBlendAlpha));
374    }
375}
376
377S3D_DRV_D3D9_INLINE
378void s3d_CDrvD3d9StateMgr::SetDestBlendAlpha(
379        int DestBlendAlpha)
380{
381    S3D_DRV_D3D9_STATE_NE(
382            m_StateBlk.m_DestBlendAlpha, DestBlendAlpha)
383    {
384        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DestBlendAlpha, DestBlendAlpha);
385        S3D_DRV_D3D9_CHECK(
386                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
387                    m_D3dDev, D3DRS_DESTBLENDALPHA, DestBlendAlpha));
388    }
389}
390
391S3D_DRV_D3D9_INLINE
392void s3d_CDrvD3d9StateMgr::SetBlendOpAlpha(
393        int BlendOpAlpha)
394{
395    S3D_DRV_D3D9_STATE_NE(
396            m_StateBlk.m_BlendOpAlpha, BlendOpAlpha)
397    {
398        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_BlendOpAlpha, BlendOpAlpha);
399        S3D_DRV_D3D9_CHECK(
400                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
401                    m_D3dDev, D3DRS_BLENDOPALPHA, BlendOpAlpha));
402    }
403}
404
405S3D_DRV_D3D9_INLINE
406void s3d_CDrvD3d9StateMgr::SetAlphaTestEnabled(
407        BOOL AlphaTestEnabled)
408{
409    S3D_DRV_D3D9_STATE_NE(
410            m_StateBlk.m_AlphaTestEnabled, AlphaTestEnabled)
411    {
412        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaTestEnabled, AlphaTestEnabled);
413        S3D_DRV_D3D9_CHECK(
414                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
415                    m_D3dDev, D3DRS_ALPHATESTENABLE, AlphaTestEnabled));
416    }
417}
418
419S3D_DRV_D3D9_INLINE
420void s3d_CDrvD3d9StateMgr::SetAlphaTestMode(
421        int AlphaTestMode)
422{
423    S3D_DRV_D3D9_STATE_NE(
424            m_StateBlk.m_AlphaTestMode, AlphaTestMode)
425    {
426        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaTestMode, AlphaTestMode);
427        S3D_DRV_D3D9_CHECK(
428                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
429                    m_D3dDev, D3DRS_ALPHAFUNC, AlphaTestMode));
430    }
431}
432
433S3D_DRV_D3D9_INLINE
434void s3d_CDrvD3d9StateMgr::SetAlphaTestRef(
435        int AlphaTestRef)
436{
437    S3D_DRV_D3D9_STATE_NE(
438            m_StateBlk.m_AlphaTestRef, AlphaTestRef)
439    {
440        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaTestRef, AlphaTestRef);
441        S3D_DRV_D3D9_CHECK(
442                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
443                    m_D3dDev, D3DRS_ALPHAREF, AlphaTestRef));
444    }
445}
446
447S3D_DRV_D3D9_INLINE
448void s3d_CDrvD3d9StateMgr::SetColorWriteEnabled(
449        int ColorWriteEnabled)
450{
451    S3D_DRV_D3D9_STATE_NE(
452            m_StateBlk.m_ColorWriteEnabled, ColorWriteEnabled)
453    {
454        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_ColorWriteEnabled, ColorWriteEnabled);
455        S3D_DRV_D3D9_CHECK(
456                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
457                    m_D3dDev, D3DRS_COLORWRITEENABLE, ColorWriteEnabled));
458    }
459}
460
461S3D_DRV_D3D9_INLINE
462void s3d_CDrvD3d9StateMgr::SetDepthBias(
463        float DepthBias, float SlopeScaleDepthBias)
464{
465    S3D_DRV_D3D9_STATE_NE(
466            m_StateBlk.m_DepthBias, DepthBias)
467    {
468        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DepthBias, DepthBias);
469        S3D_DRV_D3D9_CHECK(
470                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateF(
471                    m_D3dDev, D3DRS_DEPTHBIAS, DepthBias));
472    }
473    S3D_DRV_D3D9_STATE_NE(
474            m_StateBlk.m_SlopeScaleDepthBias, SlopeScaleDepthBias)
475    {
476        S3D_DRV_D3D9_ASSIGN(
477                m_StateBlk.m_SlopeScaleDepthBias, SlopeScaleDepthBias);
478        S3D_DRV_D3D9_CHECK(
479                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateF(
480                    m_D3dDev, D3DRS_SLOPESCALEDEPTHBIAS, SlopeScaleDepthBias));
481    }
482}
483
484S3D_DRV_D3D9_INLINE
485void s3d_CDrvD3d9StateMgr::SetStencilEnabled(
486        BOOL StencilEnabled)
487{
488    S3D_DRV_D3D9_STATE_NE(
489            m_StateBlk.m_StencilEnabled, StencilEnabled)
490    {
491        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilEnabled, StencilEnabled);
492        S3D_DRV_D3D9_CHECK(
493                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
494                    m_D3dDev, D3DRS_STENCILENABLE, StencilEnabled));
495    }
496}
497
498S3D_DRV_D3D9_INLINE
499void s3d_CDrvD3d9StateMgr::SetStencilTwoSidedEnabled(
500        BOOL StencilTwoSidedEnabled)
501{
502    S3D_DRV_D3D9_STATE_NE(
503            m_StateBlk.m_StencilTwoSidedEnabled, StencilTwoSidedEnabled)
504    {
505        S3D_DRV_D3D9_ASSIGN(
506                m_StateBlk.m_StencilTwoSidedEnabled, StencilTwoSidedEnabled);
507        S3D_DRV_D3D9_CHECK(
508                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
509                    m_D3dDev, D3DRS_TWOSIDEDSTENCILMODE,
510                            StencilTwoSidedEnabled));
511    }
512}
513
514S3D_DRV_D3D9_INLINE
515void s3d_CDrvD3d9StateMgr::SetStencilTestModeFront(
516        int StencilTestModeFront)
517{
518    S3D_DRV_D3D9_STATE_NE(
519            m_StateBlk.m_StencilTestModeFront, StencilTestModeFront)
520    {
521        S3D_DRV_D3D9_ASSIGN(
522                m_StateBlk.m_StencilTestModeFront, StencilTestModeFront);
523        S3D_DRV_D3D9_CHECK(
524                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
525                    m_D3dDev, D3DRS_STENCILFUNC, StencilTestModeFront));
526    }
527}
528
529S3D_DRV_D3D9_INLINE
530void s3d_CDrvD3d9StateMgr::SetStencilTestModeBack(
531        int StencilTestModeBack)
532{
533    S3D_DRV_D3D9_STATE_NE(
534            m_StateBlk.m_StencilTestModeBack, StencilTestModeBack)
535    {
536        S3D_DRV_D3D9_ASSIGN(
537                m_StateBlk.m_StencilTestModeBack, StencilTestModeBack);
538        S3D_DRV_D3D9_CHECK(
539                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
540                    m_D3dDev, D3DRS_CCW_STENCILFUNC, StencilTestModeBack));
541    }
542}
543
544S3D_DRV_D3D9_INLINE
545void s3d_CDrvD3d9StateMgr::SetStencilTestRef(
546        int StencilTestRef)
547{
548    S3D_DRV_D3D9_STATE_NE(
549            m_StateBlk.m_StencilTestRef, StencilTestRef)
550    {
551        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilTestRef, StencilTestRef);
552        S3D_DRV_D3D9_CHECK(
553                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
554                    m_D3dDev, D3DRS_STENCILREF, StencilTestRef));
555    }
556}
557
558S3D_DRV_D3D9_INLINE
559void s3d_CDrvD3d9StateMgr::SetStencilTestMask(
560        int StencilTestMask)
561{
562    S3D_DRV_D3D9_STATE_NE(
563            m_StateBlk.m_StencilTestMask, StencilTestMask)
564    {
565        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilTestMask, StencilTestMask);
566        S3D_DRV_D3D9_CHECK(
567                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
568                    m_D3dDev, D3DRS_STENCILMASK, StencilTestMask));
569    }
570}
571
572S3D_DRV_D3D9_INLINE
573void s3d_CDrvD3d9StateMgr::SetStencilWriteMask(
574        int StencilWriteMask)
575{
576    S3D_DRV_D3D9_STATE_NE(
577            m_StateBlk.m_StencilWriteMask, StencilWriteMask)
578    {
579        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilWriteMask, StencilWriteMask);
580        S3D_DRV_D3D9_CHECK(
581                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
582                    m_D3dDev, D3DRS_STENCILWRITEMASK, StencilWriteMask));
583    }
584}
585
586S3D_DRV_D3D9_INLINE
587void s3d_CDrvD3d9StateMgr::SetStencilOpFailFront(
588        int StencilOpFailFront)
589{
590    S3D_DRV_D3D9_STATE_NE(
591            m_StateBlk.m_StencilOpFailFront, StencilOpFailFront)
592    {
593        S3D_DRV_D3D9_ASSIGN(
594                m_StateBlk.m_StencilOpFailFront, StencilOpFailFront);
595        S3D_DRV_D3D9_CHECK(
596                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
597                    m_D3dDev, D3DRS_STENCILFAIL, StencilOpFailFront));
598    }
599}
600
601S3D_DRV_D3D9_INLINE
602void s3d_CDrvD3d9StateMgr::SetStencilOpDepthFailFront(
603        int StencilOpDepthFailFront)
604{
605    S3D_DRV_D3D9_STATE_NE(
606            m_StateBlk.m_StencilOpDepthFailFront, StencilOpDepthFailFront)
607    {
608        S3D_DRV_D3D9_ASSIGN(
609                m_StateBlk.m_StencilOpDepthFailFront,
610                        StencilOpDepthFailFront);
611        S3D_DRV_D3D9_CHECK(
612                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
613                    m_D3dDev, D3DRS_STENCILZFAIL, StencilOpDepthFailFront));
614    }
615}
616
617S3D_DRV_D3D9_INLINE
618void s3d_CDrvD3d9StateMgr::SetStencilOpDepthPassFront(
619        int StencilOpDepthPassFront)
620{
621    S3D_DRV_D3D9_STATE_NE(
622            m_StateBlk.m_StencilOpDepthPassFront, StencilOpDepthPassFront)
623    {
624        S3D_DRV_D3D9_ASSIGN(
625                m_StateBlk.m_StencilOpDepthPassFront,
626                        StencilOpDepthPassFront);
627        S3D_DRV_D3D9_CHECK(
628                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
629                    m_D3dDev, D3DRS_STENCILPASS, StencilOpDepthPassFront));
630    }
631}
632
633S3D_DRV_D3D9_INLINE
634void s3d_CDrvD3d9StateMgr::SetStencilOpFailBack(
635        int StencilOpFailBack)
636{
637    S3D_DRV_D3D9_STATE_NE(
638            m_StateBlk.m_StencilOpFailBack, StencilOpFailBack)
639    {
640        S3D_DRV_D3D9_ASSIGN(
641                m_StateBlk.m_StencilOpFailBack, StencilOpFailBack);
642        S3D_DRV_D3D9_CHECK(
643                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
644                    m_D3dDev, D3DRS_CCW_STENCILFAIL, StencilOpFailBack));
645    }
646}
647
648S3D_DRV_D3D9_INLINE
649void s3d_CDrvD3d9StateMgr::SetStencilOpDepthFailBack(
650        int StencilOpDepthFailBack)
651{
652    S3D_DRV_D3D9_STATE_NE(
653            m_StateBlk.m_StencilOpDepthFailBack, StencilOpDepthFailBack)
654    {
655        S3D_DRV_D3D9_ASSIGN(
656                m_StateBlk.m_StencilOpDepthFailBack, StencilOpDepthFailBack);
657        S3D_DRV_D3D9_CHECK(
658                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
659                    m_D3dDev, D3DRS_CCW_STENCILZFAIL, StencilOpDepthFailBack));
660    }
661}
662
663S3D_DRV_D3D9_INLINE
664void s3d_CDrvD3d9StateMgr::SetStencilOpDepthPassBack(
665        int StencilOpDepthPassBack)
666{
667    S3D_DRV_D3D9_STATE_NE(
668            m_StateBlk.m_StencilOpDepthPassBack, StencilOpDepthPassBack)
669    {
670        S3D_DRV_D3D9_ASSIGN(
671                m_StateBlk.m_StencilOpDepthPassBack, StencilOpDepthPassBack);
672        S3D_DRV_D3D9_CHECK(
673                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
674                    m_D3dDev, D3DRS_CCW_STENCILPASS, StencilOpDepthPassBack));
675    }
676}
677
678S3D_DRV_D3D9_INLINE
679void s3d_CDrvD3d9StateMgr::SetFogDensity(
680        float FogDensity)
681{
682    S3D_DRV_D3D9_STATE_NE(
683            m_StateBlk.m_FogDensity, FogDensity)
684    {
685        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_FogDensity, FogDensity);
686        if(m_StateBlk.m_FogDensity > 0)
687        {
688            S3D_DRV_D3D9_CHECK(
689                    m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
690                        m_D3dDev, D3DRS_FOGENABLE, TRUE));
691            S3D_DRV_D3D9_CHECK(
692                    m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
693                        m_D3dDev, D3DRS_FOGTABLEMODE, D3DFOG_EXP));
694            S3D_DRV_D3D9_CHECK(
695                    m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateF(
696                        m_D3dDev, D3DRS_FOGDENSITY, FogDensity));
697        }
698        else
699        {
700            S3D_DRV_D3D9_CHECK(
701                    m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
702                        m_D3dDev, D3DRS_FOGENABLE, FALSE));
703        }
704    }
705}
706
707S3D_DRV_D3D9_INLINE
708void s3d_CDrvD3d9StateMgr::SetFogColor(
709        const D3DCOLOR &FogColor)
710{
711    S3D_DRV_D3D9_STATE_NE(
712            m_StateBlk.m_FogColor, FogColor)
713    {
714        S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_FogColor, FogColor);
715        S3D_DRV_D3D9_CHECK(
716                m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI(
717                    m_D3dDev, D3DRS_FOGCOLOR, FogColor));
718    }
719}
720
721///////////////////////////////////////////////////////////////////////////////
722
723S3D_DRV_D3D9_INLINE
724HRESULT s3d_CDrvD3d9StateUtil::SetRenderStateI(
725        LPDIRECT3DDEVICE9 D3dDev, D3DRENDERSTATETYPE State, DWORD Value)
726{
727    if(D3dDev)
728        return D3dDev->SetRenderState(State, Value);
729    else
730        return 0;
731}
732
733S3D_DRV_D3D9_INLINE
734HRESULT s3d_CDrvD3d9StateUtil::SetRenderStateF(
735        LPDIRECT3DDEVICE9 D3dDev, D3DRENDERSTATETYPE State, float Value)
736{
737    if(D3dDev)
738        return D3dDev->SetRenderState(
739                State, *reinterpret_cast<DWORD*>(&Value));
740    else
741        return 0;
742}
743
744S3D_DRV_D3D9_INLINE
745HRESULT s3d_CDrvD3d9StateUtil::SetSamplerStateI(
746        LPDIRECT3DDEVICE9 D3dDev,
747        DWORD Samp, D3DSAMPLERSTATETYPE Type, DWORD Value)
748{
749    if(D3dDev)
750        return D3dDev->SetSamplerState(Samp, Type, Value);
751    else
752        return 0;
753}
754
755S3D_DRV_D3D9_INLINE
756HRESULT s3d_CDrvD3d9StateUtil::SetSamplerStateF(
757        LPDIRECT3DDEVICE9 D3dDev,
758        DWORD Samp, D3DSAMPLERSTATETYPE Type, float Value)
759{
760    if(D3dDev)
761        return D3dDev->SetSamplerState(Samp, Type,
762                *reinterpret_cast<DWORD*>(&Value));
763    else
764        return 0;
765}
766
767S3D_DRV_D3D9_INLINE
768HRESULT s3d_CDrvD3d9StateUtil::SetTextureStageStateI(
769        LPDIRECT3DDEVICE9 D3dDev,
770        DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value)
771{
772    if(D3dDev)
773        return D3dDev->SetTextureStageState(Stage, Type, Value);
774    else
775        return 0;
776}
777
778S3D_DRV_D3D9_INLINE
779HRESULT s3d_CDrvD3d9StateUtil::SetTextureStageStateF(
780        LPDIRECT3DDEVICE9 D3dDev,
781        DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, float Value)
782{
783    if(D3dDev)
784        return D3dDev->SetTextureStageState(Stage, Type,
785                *reinterpret_cast<DWORD*>(&Value));
786    else
787        return 0;
788}
789
790///////////////////////////////////////////////////////////////////////////////
791
792#endif
Note: See TracBrowser for help on using the repository browser.