Advertisement
expired6978

Blending

Oct 25th, 2014
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.57 KB | None | 0 0
  1. void CDXNifMesh::Pass(LPDIRECT3DDEVICE9 pDevice, UInt32 iPass, CDXShader * shader)
  2. {
  3.     ID3DXEffect * effect = shader->GetEffect();
  4.     if (m_material) {
  5.         effect->SetValue(shader->m_hSpecular, m_material->GetSpecularColor(), sizeof(D3DXVECTOR3));
  6.         effect->SetValue(shader->m_hAmbient, m_material->GetAmbientColor(), sizeof(D3DXVECTOR3));
  7.         effect->SetValue(shader->m_hDiffuse, m_material->GetDiffuseColor(), sizeof(D3DXVECTOR3));
  8.  
  9.         UInt32 alphaFunc = mappedTestFunctions[m_material->GetTestMode()];
  10.         UInt32 srcBlend = mappedAlphaFunctions[m_material->GetSrcBlendMode()];
  11.         UInt32 destBlend = mappedAlphaFunctions[m_material->GetDestBlendMode()];
  12.  
  13.         bool isDoubleSided = (m_material->GetShaderFlags2() & BSShaderProperty::kSLSF2_Double_Sided) == BSShaderProperty::kSLSF2_Double_Sided;
  14.         bool zBufferTest = (m_material->GetShaderFlags1() & BSShaderProperty::kSLSF1_ZBuffer_Test) == BSShaderProperty::kSLSF1_ZBuffer_Test;
  15.         bool zBufferWrite = (m_material->GetShaderFlags2() & BSShaderProperty::kSLSF2_ZBuffer_Write) == BSShaderProperty::kSLSF2_ZBuffer_Write;
  16.  
  17.         pDevice->SetRenderState(D3DRS_ZENABLE, zBufferTest ? TRUE : FALSE);
  18.         pDevice->SetRenderState(D3DRS_ZWRITEENABLE, zBufferWrite ? TRUE : FALSE);
  19.         pDevice->SetRenderState(D3DRS_CULLMODE, isDoubleSided ? D3DCULL_NONE : D3DCULL_CCW);
  20.         pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
  21.         pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, m_material->GetAlphaBlending() ? TRUE : FALSE);
  22.         pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, m_material->GetAlphaTesting() ? TRUE : FALSE);
  23.         pDevice->SetRenderState(D3DRS_ALPHAREF, m_material->GetAlphaThreshold());
  24.         pDevice->SetRenderState(D3DRS_ALPHAFUNC, alphaFunc);
  25.         pDevice->SetRenderState(D3DRS_SRCBLEND, srcBlend);
  26.         pDevice->SetRenderState(D3DRS_DESTBLEND, destBlend);
  27.     }
  28.     effect->CommitChanges();
  29.  
  30.     CDXMesh::Pass(pDevice, iPass, shader);
  31. }
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38. #include "CDXMaterial.h"
  39.  
  40. CDXMaterial::CDXMaterial()
  41. {
  42.     m_diffuseTexture = NULL;
  43.     m_specularColor = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
  44.     m_diffuseColor = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
  45.     m_ambientColor = D3DXVECTOR3(1.0f, 1.0f, 1.0f);
  46.     m_alphaThreshold = 0;
  47.     m_shaderFlags1 = 0;
  48.     m_shaderFlags2 = 0;
  49.     SetAlphaBlending(false);
  50.     SetSrcBlendMode(ALPHA_SRCALPHA);
  51.     SetDestBlendMode(ALPHA_INVSRCALPHA);
  52.     SetTestMode(TEST_ALWAYS);
  53. }
  54.  
  55. CDXMaterial::~CDXMaterial()
  56. {
  57.    
  58. }
  59.  
  60. void CDXMaterial::Release()
  61. {
  62.     SetDiffuseTexture(NULL);
  63. }
  64.  
  65. void CDXMaterial::SetDiffuseTexture(LPDIRECT3DBASETEXTURE9 texture)
  66. {
  67.     if(m_diffuseTexture)
  68.         m_diffuseTexture->Release();
  69.     m_diffuseTexture = texture;
  70.     if(m_diffuseTexture)
  71.         m_diffuseTexture->AddRef();
  72. }
  73.  
  74. void CDXMaterial::SetAlphaBlending(bool bAlpha)
  75. {
  76.     SetBit(bAlpha, ALPHA_BLEND_MASK);
  77. }
  78.  
  79. bool CDXMaterial::GetAlphaBlending() const
  80. {
  81.     return GetBit(ALPHA_BLEND_MASK);
  82. }
  83.  
  84. void CDXMaterial::SetSrcBlendMode(AlphaFunction eSrcBlend)
  85. {
  86.     SetField((UInt16)(eSrcBlend), SRC_BLEND_MASK, SRC_BLEND_POS);
  87. }
  88.  
  89. CDXMaterial::AlphaFunction CDXMaterial::GetSrcBlendMode() const
  90. {
  91.     return (CDXMaterial::AlphaFunction)GetField(SRC_BLEND_MASK, SRC_BLEND_POS);
  92. }
  93.  
  94. void CDXMaterial::SetDestBlendMode(AlphaFunction eDestBlend)
  95. {
  96.     SetField((UInt16)(eDestBlend), DEST_BLEND_MASK, DEST_BLEND_POS);
  97. }
  98.  
  99. CDXMaterial::AlphaFunction CDXMaterial::GetDestBlendMode() const
  100. {
  101.     return (CDXMaterial::AlphaFunction)GetField(DEST_BLEND_MASK, DEST_BLEND_POS);
  102. }
  103.  
  104. void CDXMaterial::SetAlphaTesting(bool bAlpha)
  105. {
  106.     SetBit(bAlpha, TEST_ENABLE_MASK);
  107. }
  108. //---------------------------------------------------------------------------
  109. bool CDXMaterial::GetAlphaTesting() const
  110. {
  111.     return GetBit(TEST_ENABLE_MASK);
  112. }
  113. //---------------------------------------------------------------------------
  114. void CDXMaterial::SetTestMode(TestFunction eTestFunc)
  115. {
  116.     SetField((UInt16)(eTestFunc), TEST_FUNC_MASK, TEST_FUNC_POS);
  117. }
  118. //---------------------------------------------------------------------------
  119. CDXMaterial::TestFunction CDXMaterial::GetTestMode() const
  120. {
  121.     return (CDXMaterial::TestFunction) GetField(TEST_FUNC_MASK, TEST_FUNC_POS);
  122. }
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134. #ifndef __CDXMATERIAL__
  135. #define __CDXMATERIAL__
  136.  
  137. #pragma once
  138.  
  139. #include <d3dx9.h>
  140.  
  141. #define DeclareFlags(type) \
  142.     private: \
  143.     type m_uFlags; \
  144.     void SetField(type uVal, type uMask, type uPos) \
  145.         { \
  146.         m_uFlags = (m_uFlags & ~uMask) | (uVal << uPos); \
  147.         } \
  148.         type GetField(type uMask, type uPos) const \
  149.         { \
  150.         return (m_uFlags & uMask) >> uPos; \
  151.         } \
  152.         void SetBit(bool bVal, type uMask) \
  153.         { \
  154.         if (bVal) \
  155.             { \
  156.             m_uFlags |= uMask; \
  157.             } \
  158.             else \
  159.             { \
  160.             m_uFlags &= ~uMask; \
  161.             } \
  162.         }\
  163.         bool GetBit(type uMask) const \
  164.         { \
  165.         return (m_uFlags & uMask) != 0; \
  166.         }
  167.  
  168. static UInt32 mappedAlphaFunctions[] = {
  169.     D3DBLEND_ONE,
  170.     D3DBLEND_ZERO,
  171.     D3DBLEND_SRCCOLOR,
  172.     D3DBLEND_INVSRCCOLOR,
  173.     D3DBLEND_DESTCOLOR,
  174.     D3DBLEND_INVDESTCOLOR,
  175.     D3DBLEND_SRCALPHA,
  176.     D3DBLEND_INVSRCALPHA,
  177.     D3DBLEND_DESTALPHA,
  178.     D3DBLEND_INVDESTALPHA,
  179.     D3DBLEND_SRCALPHASAT
  180. };
  181.  
  182. static UInt32 mappedTestFunctions[] = {
  183.     D3DCMP_ALWAYS,
  184.     D3DCMP_LESS,
  185.     D3DCMP_EQUAL,
  186.     D3DCMP_LESSEQUAL,
  187.     D3DCMP_GREATER,
  188.     D3DCMP_NOTEQUAL,
  189.     D3DCMP_GREATEREQUAL,
  190.     D3DCMP_NEVER,
  191. };
  192.  
  193. class CDXMaterial
  194. {
  195. public:
  196.     CDXMaterial::CDXMaterial();
  197.     CDXMaterial::~CDXMaterial();
  198.  
  199.     void Release();
  200.  
  201.     void SetDiffuseTexture(LPDIRECT3DBASETEXTURE9 texture);
  202.     LPDIRECT3DBASETEXTURE9 GetDiffuseTexture() const { return m_diffuseTexture; }
  203.  
  204.     void SetDiffuseColor(D3DXVECTOR3 color) { m_diffuseColor = color; }
  205.     void SetSpecularColor(D3DXVECTOR3 color) { m_specularColor = color; }
  206.     void SetAmbientColor(D3DXVECTOR3 color) { m_ambientColor = color; }
  207.  
  208.     D3DXVECTOR3 & GetDiffuseColor() { return m_diffuseColor; }
  209.     D3DXVECTOR3 & GetSpecularColor() { return m_specularColor; }
  210.     D3DXVECTOR3 & GetAmbientColor() { return m_ambientColor; }
  211.  
  212.     UInt32 GetShaderFlags1() const { return m_shaderFlags1; }
  213.     UInt32 GetShaderFlags2() const { return m_shaderFlags2; }
  214.  
  215.     void SetShaderFlags1(UInt32 flags) { m_shaderFlags1 = flags; }
  216.     void SetShaderFlags2(UInt32 flags) { m_shaderFlags2 = flags; }
  217.  
  218.     void SetFlags(UInt16 flags) { m_uFlags = flags; }
  219.  
  220.     enum AlphaFunction
  221.     {
  222.         ALPHA_ONE,
  223.         ALPHA_ZERO,
  224.         ALPHA_SRCCOLOR,
  225.         ALPHA_INVSRCCOLOR,
  226.         ALPHA_DESTCOLOR,
  227.         ALPHA_INVDESTCOLOR,
  228.         ALPHA_SRCALPHA,
  229.         ALPHA_INVSRCALPHA,
  230.         ALPHA_DESTALPHA,
  231.         ALPHA_INVDESTALPHA,
  232.         ALPHA_SRCALPHASAT,
  233.         ALPHA_MAX_MODES
  234.     };
  235.  
  236.     enum
  237.     {
  238.         ALPHA_BLEND_MASK          = 0x0001,
  239.         SRC_BLEND_MASK      = 0x001e,
  240.         SRC_BLEND_POS       = 1,
  241.         DEST_BLEND_MASK     = 0x01e0,
  242.         DEST_BLEND_POS      = 5,
  243.         TEST_ENABLE_MASK    = 0x0200,
  244.         TEST_FUNC_MASK      = 0x1c00,
  245.         TEST_FUNC_POS       = 10,
  246.         ALPHA_NOSORTER_MASK = 0x2000
  247.     };
  248.  
  249.     enum TestFunction
  250.     {
  251.         TEST_ALWAYS,
  252.         TEST_LESS,
  253.         TEST_EQUAL,
  254.         TEST_LESSEQUAL,
  255.         TEST_GREATER,
  256.         TEST_NOTEQUAL,
  257.         TEST_GREATEREQUAL,
  258.         TEST_NEVER,
  259.         TEST_MAX_MODES
  260.     };
  261.  
  262.     void SetAlphaBlending(bool bAlpha);
  263.     bool GetAlphaBlending() const;
  264.  
  265.     void SetSrcBlendMode(AlphaFunction eSrcBlend);
  266.     AlphaFunction GetSrcBlendMode() const;
  267.  
  268.     void SetDestBlendMode(AlphaFunction eDestBlend);
  269.     AlphaFunction GetDestBlendMode() const;
  270.  
  271.     void SetAlphaTesting(bool bAlpha);
  272.     bool GetAlphaTesting() const;
  273.  
  274.     void SetTestMode(TestFunction eTestFunc);
  275.     TestFunction GetTestMode() const;
  276.  
  277.  
  278.     void SetAlphaThreshold(UInt8 thresh) { m_alphaThreshold = thresh; }
  279.     UInt8 GetAlphaThreshold() const { return m_alphaThreshold; }
  280.  
  281. protected:
  282.     LPDIRECT3DBASETEXTURE9 m_diffuseTexture;
  283.  
  284.     D3DXVECTOR3 m_specularColor;
  285.     D3DXVECTOR3 m_diffuseColor;
  286.     D3DXVECTOR3 m_ambientColor;
  287.     DeclareFlags(UInt16);
  288.     UInt32  m_shaderFlags1;
  289.     UInt32  m_shaderFlags2;
  290.     UInt8   m_alphaThreshold;
  291. };
  292.  
  293. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement