/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// //@cpp #ifndef S3D_DRV_D3D9_STATE_H #define S3D_DRV_D3D9_STATE_H #include "comp/core/comp_module.h" #include "drv_d3d9_env.h" #include "drv_d3d9_util.h" #include #include /////////////////////////////////////////////////////////////////////////////// // if enabled, states are cached and applied all at once //#define S3D_DRV_D3D9_STATEMGR_APPLYBLOCK // if using S3D_DRV_D3D9_STATEMGR_APPLYBLOCK use memcpy #define S3D_DRV_D3D9_STATEMGR_USE_MEMCPY // disable check if state is already set, usefull for tracking bugs //#define S3D_DRV_D3D9_STATE_NOCHECK /////////////////////////////////////////////////////////////////////////////// #ifndef S3D_DRV_D3D9_STATEMGR_APPLYBLOCK #define S3D_DRV_D3D9_SETSTATEDIRECT(A) (A) #define S3D_DRV_D3D9_ASSIGN(A, B) (A = B) #else #define S3D_DRV_D3D9_SETSTATEDIRECT(A) #ifdef S3D_DRV_D3D9_STATEMGR_USE_MEMCPY #define S3D_DRV_D3D9_ASSIGN(A, B) #else #define S3D_DRV_D3D9_ASSIGN(A, B) (A = B) #endif #endif #ifndef S3D_DRV_D3D9_STATE_NOCHECK #define S3D_DRV_D3D9_STATE_NE(A, B) if((A) != (B)) #else #define S3D_DRV_D3D9_STATE_NE(A, B) #endif /////////////////////////////////////////////////////////////////////////////// //@ D3DX_ALIGN16 struct s3d_CDrvD3d9StateBlk { int m_CullMode; int m_DepthTestMode; BOOL m_DepthWrite; float m_DepthBias; float m_SlopeScaleDepthBias; int m_PaintMode; BOOL m_AlphaBlendEnabled; int m_SrcBlend; int m_DestBlend; int m_BlendOp; BOOL m_SeparateAlphaBlendEnabled; int m_SrcBlendAlpha; int m_DestBlendAlpha; int m_BlendOpAlpha; BOOL m_AlphaTestEnabled; int m_AlphaTestMode; int m_AlphaTestRef; int m_ColorWriteEnabled; BOOL m_StencilEnabled; int m_StencilTestModeFront; int m_StencilTestRef; int m_StencilTestMask; int m_StencilWriteMask; int m_StencilOpFailFront; int m_StencilOpDepthFailFront; int m_StencilOpDepthPassFront; BOOL m_StencilTwoSidedEnabled; int m_StencilTestModeBack; int m_StencilOpFailBack; int m_StencilOpDepthFailBack; int m_StencilOpDepthPassBack; D3DCOLOR m_FogColor; float m_FogDensity; }; //@ typedef const s3d_CDrvD3d9StateBlk &s3d_CDrvD3d9StateBlk_cr; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9StateMgr { public: s3d_CDrvD3d9StateMgr(); void Invalidate(); void Apply( s3d_CDrvD3d9StateBlk_cr StateBlk); void SetCullMode( int CullMode); void SetDepthTestMode( int DepthTestMode); void SetDepthWrite( int DepthWrite); void SetPaintMode( int PaintMode); void SetAlphaBlendEnabled( BOOL AlphaBlendEnabled); void SetSrcBlend( int SrcBlend); void SetDestBlend( int DestBlend); void SetBlendOp( int BlendOp); void SetSeparateAlphaBlendEnabled( BOOL SeparateAlphaBlendEnabled); void SetSrcBlendAlpha( int SrcBlendAlpha); void SetDestBlendAlpha( int DestBlendAlpha); void SetBlendOpAlpha( int BlendOpAlpha); void SetAlphaTestEnabled( BOOL AlphaTestEnabled); void SetAlphaTestMode( int AlphaTestMode); void SetAlphaTestRef( int AlphaTestRef); void SetColorWriteEnabled( int ColorWriteEnabled); void SetDepthBias( float DepthBias, float SlopeScaleDepthBias); void SetStencilEnabled( BOOL StencilEnabled); void SetStencilTwoSidedEnabled( BOOL StencilTwoSidedEnabled); void SetStencilTestModeFront( int StencilTestModeFront); void SetStencilTestModeBack( int StencilTestModeBack); void SetStencilTestRef( int StencilTestRef); void SetStencilTestMask( int StencilTestMask); void SetStencilWriteMask( int StencilWriteMask); void SetStencilOpFailFront( int StencilOpFailFront); void SetStencilOpDepthFailFront( int StencilOpDepthFailFront); void SetStencilOpDepthPassFront( int StencilOpDepthPassFront); void SetStencilOpFailBack( int StencilOpFailBack); void SetStencilOpDepthFailBack( int StencilOpDepthFailBack); void SetStencilOpDepthPassBack( int StencilOpDepthPassBack); void SetFogDensity( float FogDensity); void SetFogColor( const D3DCOLOR &FogColor); private: s3d_CDrvD3d9StateBlk m_StateBlk; s3d_CUtilMsgHandlerPtr m_MsgHandler; s3d_CDrvD3d9Env *m_Env; s3d_CDrvD3d9Device m_D3dDev; friend class s3d_CDrvD3d9GfxEngCLOD; }; /////////////////////////////////////////////////////////////////////////////// //@ class s3d_CDrvD3d9StateUtil { public: //@ static HRESULT SetRenderStateI( LPDIRECT3DDEVICE9 D3dDev, D3DRENDERSTATETYPE State, DWORD Value); //@ static HRESULT SetRenderStateF( LPDIRECT3DDEVICE9 D3dDev, D3DRENDERSTATETYPE State, float Value); //@ static HRESULT SetSamplerStateI( LPDIRECT3DDEVICE9 D3dDev, DWORD Samp, D3DSAMPLERSTATETYPE Type, DWORD Value); //@ static HRESULT SetSamplerStateF( LPDIRECT3DDEVICE9 D3dDev, DWORD Samp, D3DSAMPLERSTATETYPE Type, float Value); //@ static HRESULT SetTextureStageStateI( LPDIRECT3DDEVICE9 D3dDev, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value); //@ static HRESULT SetTextureStageStateF( LPDIRECT3DDEVICE9 D3dDev, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, float Value); }; /////////////////////////////////////////////////////////////////////////////// // Definitions S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetCullMode( int CullMode) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_CullMode, CullMode) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_CullMode, CullMode); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_CULLMODE, CullMode)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetDepthTestMode( int DepthTestMode) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_DepthTestMode, DepthTestMode) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DepthTestMode, DepthTestMode); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_ZFUNC, DepthTestMode)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetDepthWrite( int DepthWrite) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_DepthWrite, DepthWrite) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DepthWrite, DepthWrite); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_ZWRITEENABLE, DepthWrite)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetPaintMode( int PaintMode) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_PaintMode, PaintMode) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_PaintMode, PaintMode); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_FILLMODE, PaintMode)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetAlphaBlendEnabled( BOOL AlphaBlendEnabled) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_AlphaBlendEnabled, AlphaBlendEnabled) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaBlendEnabled, AlphaBlendEnabled); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_ALPHABLENDENABLE, AlphaBlendEnabled)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetSrcBlend( int SrcBlend) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_SrcBlend, SrcBlend) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_SrcBlend, SrcBlend); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_SRCBLEND, SrcBlend)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetDestBlend( int DestBlend) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_DestBlend, DestBlend) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DestBlend, DestBlend); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_DESTBLEND, DestBlend)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetBlendOp( int BlendOp) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_BlendOp, BlendOp) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_BlendOp, BlendOp); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_BLENDOP, BlendOp)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetSeparateAlphaBlendEnabled( BOOL SeparateAlphaBlendEnabled) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_SeparateAlphaBlendEnabled, SeparateAlphaBlendEnabled) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_SeparateAlphaBlendEnabled, SeparateAlphaBlendEnabled); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_SEPARATEALPHABLENDENABLE, SeparateAlphaBlendEnabled)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetSrcBlendAlpha( int SrcBlendAlpha) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_SrcBlendAlpha, SrcBlendAlpha) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_SrcBlendAlpha, SrcBlendAlpha); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_SRCBLENDALPHA, SrcBlendAlpha)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetDestBlendAlpha( int DestBlendAlpha) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_DestBlendAlpha, DestBlendAlpha) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DestBlendAlpha, DestBlendAlpha); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_DESTBLENDALPHA, DestBlendAlpha)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetBlendOpAlpha( int BlendOpAlpha) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_BlendOpAlpha, BlendOpAlpha) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_BlendOpAlpha, BlendOpAlpha); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_BLENDOPALPHA, BlendOpAlpha)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetAlphaTestEnabled( BOOL AlphaTestEnabled) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_AlphaTestEnabled, AlphaTestEnabled) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaTestEnabled, AlphaTestEnabled); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_ALPHATESTENABLE, AlphaTestEnabled)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetAlphaTestMode( int AlphaTestMode) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_AlphaTestMode, AlphaTestMode) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaTestMode, AlphaTestMode); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_ALPHAFUNC, AlphaTestMode)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetAlphaTestRef( int AlphaTestRef) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_AlphaTestRef, AlphaTestRef) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_AlphaTestRef, AlphaTestRef); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_ALPHAREF, AlphaTestRef)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetColorWriteEnabled( int ColorWriteEnabled) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_ColorWriteEnabled, ColorWriteEnabled) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_ColorWriteEnabled, ColorWriteEnabled); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_COLORWRITEENABLE, ColorWriteEnabled)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetDepthBias( float DepthBias, float SlopeScaleDepthBias) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_DepthBias, DepthBias) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_DepthBias, DepthBias); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateF( m_D3dDev, D3DRS_DEPTHBIAS, DepthBias)); } S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_SlopeScaleDepthBias, SlopeScaleDepthBias) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_SlopeScaleDepthBias, SlopeScaleDepthBias); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateF( m_D3dDev, D3DRS_SLOPESCALEDEPTHBIAS, SlopeScaleDepthBias)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilEnabled( BOOL StencilEnabled) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilEnabled, StencilEnabled) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilEnabled, StencilEnabled); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILENABLE, StencilEnabled)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilTwoSidedEnabled( BOOL StencilTwoSidedEnabled) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilTwoSidedEnabled, StencilTwoSidedEnabled) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilTwoSidedEnabled, StencilTwoSidedEnabled); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_TWOSIDEDSTENCILMODE, StencilTwoSidedEnabled)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilTestModeFront( int StencilTestModeFront) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilTestModeFront, StencilTestModeFront) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilTestModeFront, StencilTestModeFront); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILFUNC, StencilTestModeFront)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilTestModeBack( int StencilTestModeBack) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilTestModeBack, StencilTestModeBack) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilTestModeBack, StencilTestModeBack); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_CCW_STENCILFUNC, StencilTestModeBack)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilTestRef( int StencilTestRef) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilTestRef, StencilTestRef) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilTestRef, StencilTestRef); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILREF, StencilTestRef)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilTestMask( int StencilTestMask) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilTestMask, StencilTestMask) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilTestMask, StencilTestMask); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILMASK, StencilTestMask)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilWriteMask( int StencilWriteMask) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilWriteMask, StencilWriteMask) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_StencilWriteMask, StencilWriteMask); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILWRITEMASK, StencilWriteMask)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilOpFailFront( int StencilOpFailFront) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilOpFailFront, StencilOpFailFront) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilOpFailFront, StencilOpFailFront); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILFAIL, StencilOpFailFront)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilOpDepthFailFront( int StencilOpDepthFailFront) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilOpDepthFailFront, StencilOpDepthFailFront) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilOpDepthFailFront, StencilOpDepthFailFront); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILZFAIL, StencilOpDepthFailFront)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilOpDepthPassFront( int StencilOpDepthPassFront) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilOpDepthPassFront, StencilOpDepthPassFront) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilOpDepthPassFront, StencilOpDepthPassFront); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_STENCILPASS, StencilOpDepthPassFront)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilOpFailBack( int StencilOpFailBack) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilOpFailBack, StencilOpFailBack) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilOpFailBack, StencilOpFailBack); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_CCW_STENCILFAIL, StencilOpFailBack)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilOpDepthFailBack( int StencilOpDepthFailBack) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilOpDepthFailBack, StencilOpDepthFailBack) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilOpDepthFailBack, StencilOpDepthFailBack); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_CCW_STENCILZFAIL, StencilOpDepthFailBack)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetStencilOpDepthPassBack( int StencilOpDepthPassBack) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_StencilOpDepthPassBack, StencilOpDepthPassBack) { S3D_DRV_D3D9_ASSIGN( m_StateBlk.m_StencilOpDepthPassBack, StencilOpDepthPassBack); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_CCW_STENCILPASS, StencilOpDepthPassBack)); } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetFogDensity( float FogDensity) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_FogDensity, FogDensity) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_FogDensity, FogDensity); if(m_StateBlk.m_FogDensity > 0) { S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_FOGENABLE, TRUE)); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_FOGTABLEMODE, D3DFOG_EXP)); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateF( m_D3dDev, D3DRS_FOGDENSITY, FogDensity)); } else { S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_FOGENABLE, FALSE)); } } } S3D_DRV_D3D9_INLINE void s3d_CDrvD3d9StateMgr::SetFogColor( const D3DCOLOR &FogColor) { S3D_DRV_D3D9_STATE_NE( m_StateBlk.m_FogColor, FogColor) { S3D_DRV_D3D9_ASSIGN(m_StateBlk.m_FogColor, FogColor); S3D_DRV_D3D9_CHECK( m_Env, s3d_CDrvD3d9StateUtil::SetRenderStateI( m_D3dDev, D3DRS_FOGCOLOR, FogColor)); } } /////////////////////////////////////////////////////////////////////////////// S3D_DRV_D3D9_INLINE HRESULT s3d_CDrvD3d9StateUtil::SetRenderStateI( LPDIRECT3DDEVICE9 D3dDev, D3DRENDERSTATETYPE State, DWORD Value) { if(D3dDev) return D3dDev->SetRenderState(State, Value); else return 0; } S3D_DRV_D3D9_INLINE HRESULT s3d_CDrvD3d9StateUtil::SetRenderStateF( LPDIRECT3DDEVICE9 D3dDev, D3DRENDERSTATETYPE State, float Value) { if(D3dDev) return D3dDev->SetRenderState( State, *reinterpret_cast(&Value)); else return 0; } S3D_DRV_D3D9_INLINE HRESULT s3d_CDrvD3d9StateUtil::SetSamplerStateI( LPDIRECT3DDEVICE9 D3dDev, DWORD Samp, D3DSAMPLERSTATETYPE Type, DWORD Value) { if(D3dDev) return D3dDev->SetSamplerState(Samp, Type, Value); else return 0; } S3D_DRV_D3D9_INLINE HRESULT s3d_CDrvD3d9StateUtil::SetSamplerStateF( LPDIRECT3DDEVICE9 D3dDev, DWORD Samp, D3DSAMPLERSTATETYPE Type, float Value) { if(D3dDev) return D3dDev->SetSamplerState(Samp, Type, *reinterpret_cast(&Value)); else return 0; } S3D_DRV_D3D9_INLINE HRESULT s3d_CDrvD3d9StateUtil::SetTextureStageStateI( LPDIRECT3DDEVICE9 D3dDev, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) { if(D3dDev) return D3dDev->SetTextureStageState(Stage, Type, Value); else return 0; } S3D_DRV_D3D9_INLINE HRESULT s3d_CDrvD3d9StateUtil::SetTextureStageStateF( LPDIRECT3DDEVICE9 D3dDev, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, float Value) { if(D3dDev) return D3dDev->SetTextureStageState(Stage, Type, *reinterpret_cast(&Value)); else return 0; } /////////////////////////////////////////////////////////////////////////////// #endif