コード例 #1
0
ファイル: r8_draw.cpp プロジェクト: vpa1977/lock_free_mt
void
CRenderDX8::DrawVB(
		const CMatrix& in_M,
		unsigned long in_VBHandle,
		unsigned long in_PSHandle,
		unsigned long in_FirstVertex,
		unsigned long in_PrimitiveType,
		unsigned long in_PrimitiveCount
)
{
	assert(m_pD3D8Device);

	CVBInfoMapIterator It = m_VBMap.find( in_VBHandle );
	assert( It != m_VBMap.end() );

	if(It->second.m_pVB)
	{
		unsigned long NVerticesUsed = GetNVerticesUsed(in_PrimitiveType,in_PrimitiveCount);
		long testCount = It->second.m_NVertices;
		assert( in_FirstVertex+NVerticesUsed <= It->second.m_NVertices );

		HRESULT Res;
		{
			// TODO: Move to "once-per-frame" render settings
			Res = m_pD3D8Device->SetRenderState(D3DRS_COLORVERTEX,TRUE);
			assert(Res==D3D_OK);
			Res = m_pD3D8Device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_COLOR1);
			assert(Res==D3D_OK);
			Res = m_pD3D8Device->SetRenderState(D3DRS_SPECULARMATERIALSOURCE,D3DMCS_COLOR2);
			assert(Res==D3D_OK);
			Res = m_pD3D8Device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_COLOR1);
			assert(Res==D3D_OK);
			Res = m_pD3D8Device->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
			assert(Res==D3D_OK);
		}

		Res = m_pD3D8Device->SetTransform( D3DTS_WORLD, (const D3DMATRIX*)&in_M );
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetStreamSource(0,It->second.m_pVB,It->second.m_VertexSize);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetVertexShader( It->second.m_FVF );
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->BeginScene();
		assert(Res==D3D_OK);

		unsigned long NPasses = m_PixelShaderManager.UsePixelShader(in_PSHandle);
		assert(NPasses>0);
		for(unsigned long i=0; i<NPasses; ++i)
		{
			m_PixelShaderManager.ApplyPixelShaderPass(i);
			Res = m_pD3D8Device->DrawPrimitive( ConvertPrimitiveType(in_PrimitiveType), in_FirstVertex, in_PrimitiveCount );
			assert(Res==D3D_OK);
		}

		Res = m_pD3D8Device->EndScene();
		assert(Res==D3D_OK);
	}

}
コード例 #2
0
ファイル: devicedx8.cpp プロジェクト: skopp/rush
bool JRenderServer::Draw( int firstIdx, int numIdx, int firstVert, int numVert, PrimitiveType primType )
{
    if (numVert == 0) return false;
    bool bIndexed   = true; 
    int numPri      = 0;
    if (numIdx == 0)
    {
        numPri = GetNumPrimitives( primType, numVert );
        bIndexed = false;
    }
    else
    {
        numPri = GetNumPrimitives( primType, numIdx );
    }

    if (primType == PrimitiveType_QuadList)
    {
        numPri      = numVert/2;
        bIndexed    = true;
        firstIdx    = 0;
        SetIB( m_QuadIB, firstVert );
    }

    HRESULT hRes = m_pDevice->BeginScene();
    if (hRes != S_OK) return false;
    if (bIndexed)
    {
        hRes = m_pDevice->DrawIndexedPrimitive( ConvertPrimitiveType( primType ), 0, numVert, firstIdx, numPri );
    }
    else
    {
        hRes = m_pDevice->DrawPrimitive( ConvertPrimitiveType( primType ), firstVert, numPri );
    }
    hRes = m_pDevice->EndScene();

    if (hRes != S_OK) return false;
    return (hRes == S_OK);
} // JRenderServer::Draw
コード例 #3
0
ファイル: r8_draw.cpp プロジェクト: vpa1977/lock_free_mt
void
CRenderDX8::DrawVB(
		const CMatrix& in_M,
		unsigned long in_VBHandle,
		unsigned long in_FirstVertex,
		unsigned long in_PrimitiveType,
		unsigned long in_PrimitiveCount
)
{
	assert(m_pD3D8Device);
//CLog::Print("in_PrimitiveCount=%lu\n",in_PrimitiveCount);

	CVBInfoMapIterator It = m_VBMap.find( in_VBHandle );
	assert( It != m_VBMap.end() );

	if(It->second.m_pVB)
	{
		unsigned long NVerticesUsed = GetNVerticesUsed(in_PrimitiveType,in_PrimitiveCount);
		assert( in_FirstVertex+NVerticesUsed <= It->second.m_NVertices );

		HRESULT Res;
		Res = m_pD3D8Device->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE/*D3DZB_FALSE*/);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW/*D3DCULL_NONE*/);
		assert(Res==D3D_OK);

		bool bEnabeLighting = 0!=(It->second.m_FVF&D3DFVF_NORMAL);
		Res = m_pD3D8Device->SetRenderState(D3DRS_LIGHTING,bEnabeLighting?TRUE:FALSE);
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->SetRenderState(D3DRS_COLORVERTEX,TRUE);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_COLOR1);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetRenderState(D3DRS_SPECULARMATERIALSOURCE,D3DMCS_COLOR2);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_COLOR1);
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->SetTransform( D3DTS_WORLD, (const D3DMATRIX*)&in_M );
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->BeginScene();
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->SetStreamSource(0,It->second.m_pVB,It->second.m_VertexSize);
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->SetVertexShader( It->second.m_FVF );
		assert(Res==D3D_OK);
		Res = m_pD3D8Device->DrawPrimitive( ConvertPrimitiveType(in_PrimitiveType), in_FirstVertex, in_PrimitiveCount );
		assert(Res==D3D_OK);

		Res = m_pD3D8Device->EndScene();
		assert(Res==D3D_OK);
	}
}
コード例 #4
0
ファイル: r8_draw.cpp プロジェクト: vpa1977/lock_free_mt
void
CRenderDX8::FillGeometries(
	const std::vector< CRenderable_BoneRemap >& in_rAbstractBoneRemaps,
	std::vector< CRenderable_BoneRemapDX8 >& in_rRenderBoneRemaps
)
{
	assert( in_rAbstractBoneRemaps.size() != in_rRenderBoneRemaps.size() );

	assert( in_rRenderBoneRemaps.empty() );
	in_rRenderBoneRemaps.resize( in_rAbstractBoneRemaps.size() );

	std::vector< CRenderable_BoneRemap >::const_iterator ItSrc=in_rAbstractBoneRemaps.begin();
	std::vector< CRenderable_BoneRemapDX8 >::iterator ItDst=in_rRenderBoneRemaps.begin();
	for( ; ItSrc!=in_rAbstractBoneRemaps.end() && ItDst!=in_rRenderBoneRemaps.end(); ++ItSrc,++ItDst ) {
		const CRenderable_BoneRemap& rSrcRemap = *ItSrc;
		CRenderable_BoneRemapDX8& rDstRemap = *ItDst;

		rDstRemap.m_UsedBones = rSrcRemap.m_UsedBones;

		assert( rDstRemap.m_Geometries.empty() );
		rDstRemap.m_Geometries.resize( rSrcRemap.m_Geometries.size() );

		std::vector< CRenderable_AbstractGeometry >::const_iterator ItSrcGeom=rSrcRemap.m_Geometries.begin();
		std::vector< CRenderable_GeometryDX8 >::iterator ItDstGeom=rDstRemap.m_Geometries.begin();
		for( ; ItSrcGeom!=rSrcRemap.m_Geometries.end() && ItDstGeom!=rDstRemap.m_Geometries.end(); ++ItSrcGeom,++ItDstGeom ) {

			const CRenderable_AbstractGeometry& rGeometrySrc = *ItSrcGeom;
			CRenderable_GeometryDX8& rGeometryDst = *ItDstGeom;

			// fill in render calls
			rGeometryDst.m_RenderCalls.resize( rGeometrySrc.m_RenderCalls.size() );
			std::vector< CRenderable_AbstractRenderCall >::const_iterator ItSrcRC = rGeometrySrc.m_RenderCalls.begin();
			std::vector< CRenderable_RenderCallDX8 >::iterator ItDstRC = rGeometryDst.m_RenderCalls.begin();
			for( ; ItSrcRC!=rGeometrySrc.m_RenderCalls.end() && ItDstRC!=rGeometryDst.m_RenderCalls.end(); ++ItSrcRC,++ItDstRC ) {
				const CRenderable_AbstractRenderCall& rSrcRC = *ItSrcRC;
				CRenderable_RenderCallDX8& rDstRC = *ItDstRC;
				rDstRC.m_VB = rSrcRC.m_VB;
				rDstRC.m_BaseVertex = rSrcRC.m_BaseVertex;
				rDstRC.m_IB = rSrcRC.m_IB;
				rDstRC.m_BaseVertexIndex = rSrcRC.m_BaseVertexIndex;
				rDstRC.m_NPrimitives = rSrcRC.m_NPrimitives;
				rDstRC.m_PrimitiveType = ConvertPrimitiveType(rSrcRC.m_PrimitiveType);
			}

			// create index buffers
			rGeometryDst.m_IndexBuffers.resize( rGeometrySrc.m_IndexBuffers.size() );
			std::vector< CRenderable_AbstractIndexBuffer >::const_iterator ItSrcIB = rGeometrySrc.m_IndexBuffers.begin();
			std::vector< CRenderable_IndexBufferDX8 >::iterator ItDstIB = rGeometryDst.m_IndexBuffers.begin();
			for( ; ItSrcIB!=rGeometrySrc.m_IndexBuffers.end() && ItDstIB!=rGeometryDst.m_IndexBuffers.end(); ++ItSrcIB,++ItDstIB ) {
				const CRenderable_AbstractIndexBuffer& rSrcIB = *ItSrcIB;
				CRenderable_IndexBufferDX8& rDstIB = *ItDstIB;
			
				unsigned long TrueDataSize = rSrcIB.m_IndexData.size()*sizeof(long);
				assert(TrueDataSize > 0);
				unsigned long UsageWriteOnly = D3DUSAGE_WRITEONLY;
				unsigned long UsageVertexProcessing = (m_VertexProcessType==RVP_SOFTWARE) ? D3DUSAGE_SOFTWAREPROCESSING : 0;
				unsigned long Usage = UsageWriteOnly | UsageVertexProcessing;
				HRESULT Res = m_pD3D8Device->CreateIndexBuffer( rSrcIB.m_IndexData.size() *sizeof(DWORD),
											Usage, D3DFMT_INDEX32,
											D3DPOOL_DEFAULT, &rDstIB.m_pIB ) ;
				// fill in
				BYTE* pData = NULL;
				Res = rDstIB.m_pIB->Lock( 0, TrueDataSize, &pData, 0 );
				assert( Res == D3D_OK );
				assert( pData != NULL );
				memcpy( pData, &(rSrcIB.m_IndexData[0]), TrueDataSize );
				Res = rDstIB.m_pIB->Unlock();
				assert( Res == D3D_OK );
				//
				
			}


			// create and fill vertex buffers
			rGeometryDst.m_VertexBuffers.resize( rGeometrySrc.m_VertexBuffers.size() );
			std::vector< CRenderable_AbstractVertexBuffer >::const_iterator ItSrcVB = rGeometrySrc.m_VertexBuffers.begin();
			std::vector< CRenderable_VertexBufferDX8 >::iterator ItDstVB = rGeometryDst.m_VertexBuffers.begin();
			for( ; ItSrcVB!=rGeometrySrc.m_VertexBuffers.end() && ItDstVB!=rGeometryDst.m_VertexBuffers.end(); ++ItSrcVB,++ItDstVB ) {
				const CRenderable_AbstractVertexBuffer& rSrcVB = *ItSrcVB;
				CRenderable_VertexBufferDX8& rDstVB = *ItDstVB;
				unsigned long FVF = 0;
				unsigned long VertexSize = 0;
				CalcFVFandVertexSize( rSrcVB.m_VertexFormat, FVF, VertexSize );
				assert( VertexSize >= 3*sizeof(float) );
				unsigned long NVertices = (unsigned long)rSrcVB.m_VertexData.size() / VertexSize;
				unsigned long TrueDataSize = VertexSize*NVertices;
				unsigned long UsageWriteOnly = D3DUSAGE_WRITEONLY;
				unsigned long UsageVertexProcessing = (m_VertexProcessType==RVP_SOFTWARE) ? D3DUSAGE_SOFTWAREPROCESSING : 0;
				unsigned long Usage = UsageWriteOnly | UsageVertexProcessing;
				HRESULT Res = m_pD3D8Device->CreateVertexBuffer(
					TrueDataSize,
					Usage,
					FVF,
					D3DPOOL_MANAGED,
					&(rDstVB.m_pVB)
				);
				assert( Res == D3D_OK );
				assert( rDstVB.m_pVB != NULL );
				// fill in
				BYTE* pData = NULL;
				Res = rDstVB.m_pVB->Lock( 0, TrueDataSize, &pData, 0 );
				assert( Res == D3D_OK );
				assert( pData != NULL );
				memcpy( pData, &(rSrcVB.m_VertexData[0]), TrueDataSize );
				Res = rDstVB.m_pVB->Unlock();
				assert( Res == D3D_OK );
				//
				rDstVB.m_FVF = FVF;
				rDstVB.m_NVertices = NVertices;
				rDstVB.m_VertexSize = VertexSize;
			}
		}
	}
}