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