www.pudn.com > zfxcengine-0.1.0.zip > ceRenderJob_D3D9.cpp
#include "Render/RenderD3D9/ceRenderJob_D3D9.h"
#include "Core/ceMemManager.h"
namespace ZFXCE {
namespace Render {
ceRenderJobD3D9::ceRenderJobD3D9(void):/*m_vTranslation(0,0,0), m_fScale(1.0f), m_fAngleX(1.0f), m_fAngleY(1.0f),
m_fAngleZ(1.0f),*/ m_VertexBuffer(-1), m_IndexBuffer(-1),
m_Win(NULL)
{
PUSH_FUNCTION;
m_d3dViewport.X = 0;
m_d3dViewport.Y = 0;
m_d3dViewport.Width = 800;
m_d3dViewport.Height = 600;
m_d3dViewport.MinZ = 0.0f;
m_d3dViewport.MaxZ = 1.0f;
/* for(int t=0; t < CE_RS_TEXUNITMAX; t++)
m_Textures[t] = -1;*/
D3DXMatrixIdentity(&m_matWorld);
ceVertexPipeState VPState;
ceFragmentPipeState FPState;
SetPass(0, VPState, FPState);
}
///////////////////////////////////////////////////////////////
ceRenderJobD3D9::~ceRenderJobD3D9(void)
{
PUSH_FUNCTION;
m_Passes.clear();
}
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetModelViewMatrix(const ceMatrix& m)
{
PUSH_FUNCTION;
memcpy(&m_matWorld, &m, sizeof(ceMatrix) );
}
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetRotation(FLOAT fAngleX, FLOAT fAngleY, FLOAT fAngleZ)
{
PUSH_FUNCTION;
D3DXMatrixRotationX(&m_matWorld, fAngleX);
D3DXMatrixRotationY(&m_matWorld, fAngleY);
D3DXMatrixRotationZ(&m_matWorld, fAngleZ);
}
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetScale(FLOAT XScale, FLOAT YScale, FLOAT ZScale)
{
PUSH_FUNCTION;
m_matWorld._11 = XScale;
m_matWorld._22 = YScale;
m_matWorld._33 = ZScale;
//m_fScale = fScale;
}
///////////////////////////////////////////////////////////////
/* void ceRenderJobD3D9::SetTexture(INT ID, UINT Unit)
{
if(Unit >= 0 && Unit < CE_RS_TEXUNITMAX)
{
m_Textures[Unit] = ID;
}
else
return;
}*/
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetTranslation(FLOAT fX, FLOAT fY, FLOAT fZ)
{
PUSH_FUNCTION;
m_matWorld._41 = fX;
m_matWorld._42 = fY;
m_matWorld._43 = fZ;
}
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetTranslation(const ceVec3f& v)
{
PUSH_FUNCTION;
m_matWorld._41 = v.x;
m_matWorld._42 = v.y;
m_matWorld._43 = v.z;
}
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetViewport(const ceViewport& v)
{
PUSH_FUNCTION;
m_d3dViewport.X = v.m_uiX;
m_d3dViewport.Y = v.m_uiX;
m_d3dViewport.Width = v.m_uiWidth;
m_d3dViewport.Height = v.m_uiHeight;
}
///////////////////////////////////////////////////////////////
D3DBLEND ceRenderJobD3D9::ConvertBlending(ceBlendOptions b)
{
PUSH_FUNCTION;
switch (b)
{
case CE_RS_BLENDOPT_ZERO: return D3DBLEND_ZERO;
case CE_RS_BLENDOPT_ONE: return D3DBLEND_ONE;
case CE_RS_BLENDOPT_SRC_COLOR: return D3DBLEND_SRCCOLOR;
case CE_RS_BLENDOPT_ONE_MINUS_SRC_COLOR: return D3DBLEND_INVSRCCOLOR;
case CE_RS_BLENDOPT_SRC_ALPHA: return D3DBLEND_SRCALPHA;
case CE_RS_BLENDOPT_ONE_MINUS_SRC_ALPHA: return D3DBLEND_INVSRCALPHA;
case CE_RS_BLENDOPT_DST_ALPHA: return D3DBLEND_DESTALPHA;
case CE_RS_BLENDOPT_ONE_MINUS_DST_ALPHA: return D3DBLEND_INVDESTALPHA;
case CE_RS_BLENDOPT_DST_COLOR: return D3DBLEND_DESTCOLOR;
case CE_RS_BLENDOPT_ONE_MINUS_DST_COLOR: return D3DBLEND_INVDESTCOLOR;
}
return D3DBLEND_ONE;
}
///////////////////////////////////////////////////////////////
D3DCMPFUNC ceRenderJobD3D9::ConvertCompareFunctions(ceCompareFunctions fnc)
{
PUSH_FUNCTION;
switch(fnc)
{
case CE_RS_CMP_NEVER: return D3DCMP_NEVER;
case CE_RS_CMP_LESS: return D3DCMP_LESS;
case CE_RS_CMP_EQUAL: return D3DCMP_EQUAL;
case CE_RS_CMP_LESSEQUAL: return D3DCMP_LESSEQUAL;
case CE_RS_CMP_GREATER: return D3DCMP_GREATER;
case CE_RS_CMP_NOTEQUAL: return D3DCMP_NOTEQUAL;
case CE_RS_CMP_GREATEREQUAL: return D3DCMP_GREATEREQUAL;
case CE_RS_CMP_ALWAYS: return D3DCMP_ALWAYS;
}
return D3DCMP_LESSEQUAL;
}
///////////////////////////////////////////////////////////////
D3DSTENCILOP ceRenderJobD3D9::ConvertStencilOperation(ceStencilOperations op)
{
PUSH_FUNCTION;
switch(op)
{
case CE_RS_STENCILOPT_KEEP: return D3DSTENCILOP_KEEP;
case CE_RS_STENCILOPT_ZERO: return D3DSTENCILOP_ZERO;
case CE_RS_STENCILOPT_INVERT: return D3DSTENCILOP_INVERT;
case CE_RS_STENCILOPT_INCR: return D3DSTENCILOP_INCR;
case CE_RS_STENCILOPT_DECR: return D3DSTENCILOP_DECR;
case CE_RS_STENCILOPT_REPLACE: return D3DSTENCILOP_REPLACE;
}
return D3DSTENCILOP_KEEP;
POP_FUNCTION;
}
///////////////////////////////////////////////////////////////
void ceRenderJobD3D9::SetPass(UINT Pass, const ceVertexPipeState& VPState, const ceFragmentPipeState& PPState)
{
PUSH_FUNCTION;
SRenderPass *pass = NULL;
if (Pass >= m_Passes.size())
m_Passes.resize(Pass+1);
pass = &m_Passes[Pass];
// VERTEX PIPE STATE
// Cullmode übernehmen
switch(VPState.CullMode)
{
case CE_RS_CULL_NONE:
pass->CullMode = D3DCULL_NONE;
break;
case CE_RS_CULL_CW:
pass->CullMode = D3DCULL_CW;
break;
case CE_RS_CULL_CCW:
pass->CullMode = D3DCULL_CCW;
break;
}
// FRAGMENT PIPE STATE
if(PPState.AlphaBlending)
{
pass->bAlphablending = TRUE;
pass->SourceBlendMode = ConvertBlending(PPState.BlendingSrc);
pass->DestBlendMode = ConvertBlending(PPState.BlendingDst);
}
if(PPState.AlphaTesting)
{
pass->bAlphaTesting = TRUE;
pass->dwAlphaRefValue = PPState.AlphaRefValue;
pass->ATCompareFunction = ConvertCompareFunctions(PPState.AlphaFunc);
}
pass->bColorWrites = PPState.ColorWrites;
switch(PPState.PolygonFillMode)
{
case CE_RS_FILLMODE_POINT:
pass->FillMode = D3DFILL_POINT;
break;
case CE_RS_FILLMODE_WIREFRAME:
pass->FillMode = D3DFILL_WIREFRAME;
break;
case CE_RS_FILLMODE_SOLID:
pass->FillMode = D3DFILL_SOLID;
break;
}
pass->bDepthTest = PPState.DepthTest;
pass->ZFunction = ConvertCompareFunctions(PPState.DepthFunc);
pass->bDepthWrites = PPState.DepthWrites;
PPState.StencilTest;
if(PPState.StencilTest)
{
pass->bStencilTest = TRUE;
pass->bTwoSidedStencil = PPState.UseTwoSidedStenciling;
for(UINT i=0; i < 2; i++)
{
pass->StencilFail[i] = ConvertStencilOperation(PPState.StencilFail[i]);
pass->StencilZFail[i] = ConvertStencilOperation(PPState.StencilZFail[i]);
pass->StencilZPass[i] = ConvertStencilOperation(PPState.StencilZPass[i]);
pass->StencilCompareFunction[i] = ConvertCompareFunctions(PPState.StencilFunc[i]);
pass->dwStencilMask[i] = PPState.StencilMask[i];
pass->dwStencilRef[i] = PPState.StencilRef[i];
pass->dwStencilWriteMask[i] = PPState.StencilWriteMask[i];
}
}
}
INT ceRenderJobD3D9::GetVertexBufferID(void) const
{
PUSH_FUNCTION;
return m_VertexBuffer;
}
ceVertexDescription* ceRenderJobD3D9::GetVertexDescription(void)
{
PUSH_FUNCTION;
return NULL;
}
//////////////////////////////////////////////////////////////////////////////////
D3DTEXTUREOP ceRenderJobD3D9::ConvertTextureCombineMethod(ceTexOperation op)
{
PUSH_FUNCTION;
switch(op)
{
case CE_RS_TEXOP_DISABLE: return D3DTOP_DISABLE;
case CE_RS_TEXOP_REPLACE: return D3DTOP_SELECTARG1;
case CE_RS_TEXOP_MODULATE: return D3DTOP_MODULATE;
case CE_RS_TEXOP_ADD: return D3DTOP_ADD;
case CE_RS_TEXOP_ADDSIGNED: return D3DTOP_ADDSIGNED;
case CE_RS_TEXOP_SUBTRACT: return D3DTOP_SUBTRACT;
case CE_RS_TEXOP_INTERPOLATE: return D3DTOP_LERP;
case CE_RS_TEXOP_DP3: return D3DTOP_DOTPRODUCT3;
default:
cout << "Unsupported Combine Method: " << (int)op << endl;
break;
}
return D3DTOP_DISABLE;
}
/* D3DTOP_DISABLE = 1,
D3DTOP_SELECTARG1 = 2,
D3DTOP_SELECTARG2 = 3,
D3DTOP_MODULATE = 4,
D3DTOP_MODULATE2X = 5,
D3DTOP_MODULATE4X = 6,
D3DTOP_ADD = 7,
D3DTOP_ADDSIGNED = 8,
D3DTOP_ADDSIGNED2X = 9,
D3DTOP_SUBTRACT = 10,
D3DTOP_ADDSMOOTH = 11,
D3DTOP_BLENDDIFFUSEALPHA = 12,
D3DTOP_BLENDTEXTUREALPHA = 13,
D3DTOP_BLENDFACTORALPHA = 14,
D3DTOP_BLENDTEXTUREALPHAPM = 15,
D3DTOP_BLENDCURRENTALPHA = 16,
D3DTOP_PREMODULATE = 17,
D3DTOP_MODULATEALPHA_ADDCOLOR = 18,
D3DTOP_MODULATECOLOR_ADDALPHA = 19,
D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20,
D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21,
D3DTOP_BUMPENVMAP = 22,
D3DTOP_BUMPENVMAPLUMINANCE = 23,
D3DTOP_DOTPRODUCT3 = 24,
D3DTOP_MULTIPLYADD = 25,
D3DTOP_LERP = 26,
D3DTOP_FORCE_DWORD = 0x7fffffff*/
//////////////////////////////////////////////////////////////////////////////////
DWORD ceRenderJobD3D9::ConvertTextureCombineSource(ceTexOperation src)
{
PUSH_FUNCTION;
switch(src)
{
case CE_RS_TEXOP_DISABLE: return D3DTA_CONSTANT;
case CE_RS_TEXOP_SRC_TEXTURE: return D3DTA_TEXTURE;
case CE_RS_TEXOP_SRC_DIFFUSECOLOR: return D3DTA_DIFFUSE;
case CE_RS_TEXOP_SRC_PREVIOUSTEXUNIT: return D3DTA_CURRENT;
default:
//cout << "Unsupported Combine Source: " << (int)src << endl;
break;
}
return D3DTA_TEXTURE;
}
/* //////////////////////////////////////////////////////////////////////////////////
D3DTEXTUREOP ceRenderJobD3D9::ConvertTextureCombineOperands(ceBlendOptions opd)
{
switch(opd)
{
case CE_RS_BLENDOPT_SRC_COLOR: return GL_SRC_COLOR;
case CE_RS_BLENDOPT_ONE_MINUS_SRC_COLOR: return GL_ONE_MINUS_SRC_COLOR;
case CE_RS_BLENDOPT_SRC_ALPHA: return GL_SRC_ALPHA;
case CE_RS_BLENDOPT_ONE_MINUS_SRC_ALPHA: return GL_ONE_MINUS_SRC_ALPHA;
cout << "Unsupported Operand: " << (int) opd << endl;
break;
}
return GL_SRC_COLOR;
}
*/
//////////////////////////////////////////////////////////////////////////////////
void ceRenderJobD3D9::ConvertTextureStatesForPass(const ceTexState& TexState, SRenderPass *p)
{
PUSH_FUNCTION;
memcpy(&p->TextureIDs[0], &TexState.TextureIDs[0], sizeof(INT) * CE_RS_TEXUNITMAX);
// Now convert texture filters and texture blending ops
for(UINT f=0; f < CE_RS_TEXUNITMAX; f++)
{
p->TextureFilters[f] = TexState.TextureFilters[f];
if (1.0f == TexState.TextureScalingColor)
p->TextureScalingColor = D3DTOP_MODULATE;
else if (2.0f == TexState.TextureScalingColor)
p->TextureScalingColor = D3DTOP_MODULATE2X;
else if (4.0f == TexState.TextureScalingColor)
p->TextureScalingColor = D3DTOP_MODULATE4X;
// for rgb
p->TextureCombineMethod[f][0] = ConvertTextureCombineMethod(TexState.TextureCombineMethod[f][0]);
// for alpha
p->TextureCombineMethod[f][1] = ConvertTextureCombineMethod(TexState.TextureCombineMethod[f][1]);
// Now the sources
// RGB
if (CE_RS_TEXOP_INTERPOLATE != TexState.TextureCombineMethod[f][0])
{
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG1] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG0]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG2] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG1]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG0] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG2]);
}
else
{
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG1] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG2]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG2] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG0]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG0] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_COLORARG1]);
}
// ALPHA
if (CE_RS_TEXOP_INTERPOLATE != TexState.TextureCombineMethod[f][0])
{
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG1] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG0]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG2] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG1]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG0] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG2]);
}
else
{
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG1] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG2]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG2] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG0]);
p->TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG0] = ConvertTextureCombineSource(TexState.TextureCombineSources[f][CE_RS_TEXCOMBINE_ALPHAARG1]);
}
// Now the operands
/* // RGB
p->TextureCombineOperands[f][CE_RS_TEXOPD_RGB0] = ConvertTextureCombineOperands(TexState.TextureCombineOperands[f][CE_RS_TEXOPD_RGB0]);
p->TextureCombineOperands[f][CE_RS_TEXOPD_RGB1] = ConvertTextureCombineOperands(TexState.TextureCombineOperands[f][CE_RS_TEXOPD_RGB1]);
p->TextureCombineOperands[f][CE_RS_TEXOPD_RGB2] = ConvertTextureCombineOperands(TexState.TextureCombineOperands[f][CE_RS_TEXOPD_RGB2]);
// Alpha
p->TextureCombineOperands[f][CE_RS_TEXOPD_ALPHA0] = ConvertTextureCombineOperands(TexState.TextureCombineOperands[f][CE_RS_TEXOPD_ALPHA0]);
p->TextureCombineOperands[f][CE_RS_TEXOPD_ALPHA1] = ConvertTextureCombineOperands(TexState.TextureCombineOperands[f][CE_RS_TEXOPD_ALPHA1]);
p->TextureCombineOperands[f][CE_RS_TEXOPD_ALPHA2] = ConvertTextureCombineOperands(TexState.TextureCombineOperands[f][CE_RS_TEXOPD_ALPHA2]);
*/ }
}
void ceRenderJobD3D9::SetTextureStates(const UINT Pass, const ceTexState& TexState)
{
PUSH_FUNCTION;
// int i;
SRenderPass *pass = NULL;
if (Pass >= m_Passes.size())
m_Passes.resize(Pass+1);
pass = &m_Passes[Pass];
ConvertTextureStatesForPass(TexState, pass);
}
///////////////////////////////////////////////////////////////
} // namespace Render
} // namespace ZFXCE