MF_API MFMatrix* MFView_GetLocalToScreen(const MFMatrix& localToWorld, MFMatrix *pOutput) { pOutput->Multiply4x4(localToWorld, MFView_GetWorldToScreenMatrix()); return pOutput; }
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); } } } }