Exemplo n.º 1
0
MF_API MFMatrix* MFView_GetLocalToScreen(const MFMatrix& localToWorld, MFMatrix *pOutput)
{
	pOutput->Multiply4x4(localToWorld, MFView_GetWorldToScreenMatrix());

	return pOutput;
}
Exemplo n.º 2
0
MF_API void MFModel_Draw(MFModel *pModel)
{
	MFCALLSTACK;

	MFMatrix *pAnimMats = NULL;

	MFMatrix wts;

	if(pModel->pAnimation)
	{
		pAnimMats = MFAnimation_CalculateMatrices(pModel->pAnimation, &pModel->worldMatrix);
		wts = MFView_GetWorldToScreenMatrix();
	}
	else
	{
		MFView_GetLocalToScreen(pModel->worldMatrix, &wts);
	}

	MFRenderer_SetMatrices(pAnimMats, pAnimMats ? pModel->pAnimation->numBones : 0);
	MFRendererPC_SetWorldToScreenMatrix(wts);
	MFRendererPC_SetModelColour(pModel->modelColour);

	MFMaterial *pMatOverride = (MFMaterial*)MFRenderer_GetRenderStateOverride(MFRS_MaterialOverride);

	if(pMatOverride)
		MFMaterial_SetMaterial(pMatOverride);

	MFModelDataChunk *pChunk = MFModel_GetDataChunk(pModel->pTemplate, MFChunkType_SubObjects);

	if(pChunk)
	{
		MFModelSubObject *pSubobjects = (MFModelSubObject*)pChunk->pData;

		for(int a=0; a<pChunk->count; a++)
		{
			for(int b=0; b<pSubobjects[a].numMeshChunks; b++)
			{
				MFMeshChunk_Generic *pMC = (MFMeshChunk_Generic*)pSubobjects[a].pMeshChunks;

				if(!pMatOverride)
					MFMaterial_SetMaterial(pMC[b].pMaterial);

				if(pModel->pAnimation)
				{
					MFRendererPC_SetNumWeights(pMC[b].maxBlendWeights);
					MFRenderer_SetBatch(pMC[b].pBatchIndices, pMC[b].matrixBatchSize);
				}
				else
					MFRendererPC_SetNumWeights(0);

				MFRenderer_Begin();

				MeshChunkD3DRuntimeData &runtimeData = (MeshChunkD3DRuntimeData&)pMC[b].runtimeData;

				pd3dDevice->SetVertexDeclaration(runtimeData.vertexDecl);
				pd3dDevice->SetStreamSource(0, runtimeData.vertexBuffer, 0, pMC[b].pVertexFormat->pStreams[0].streamStride);
				if(runtimeData.animBuffer)
					pd3dDevice->SetStreamSource(1, runtimeData.animBuffer, 0, pMC[b].pVertexFormat->pStreams[1].streamStride);
				pd3dDevice->SetIndices(runtimeData.indexBuffer);

				pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, pMC[b].numVertices, 0, pMC[b].numIndices/3);
			}
		}
	}
}