Guest User

anonymous

a guest
Feb 1st, 2011
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. // mesh.cpp
  2.  
  3. #include "engine.h"
  4. #include "dxhierarchy.h"
  5.  
  6. void ANIMATION::Load(const char* file){
  7.     MeshHierarchy alloc;
  8.     D3DXLoadMeshHierarchyFromX(file, D3DXMESH_MANAGED, ENGINE::dxdev, &alloc, 0, &root, &ctrl);
  9.  
  10.     firstmesh = 0;
  11.     iBone = 0;
  12.  
  13.     SetupBones((Frame*)root, 0);
  14.     matBone = new D3DXMATRIX[iBone];
  15.     memset(matBone, 0, sizeof(D3DXMATRIX)*iBone);
  16. }
  17.  
  18. void ANIMATION::Play(float elapsedTime, ANIMATION::INSTANCE* inst){
  19.     D3DXMATRIX matWorld;
  20.     ENGINE::effect->e->GetMatrix("matWorld", &matWorld);
  21.     if(inst->ctrl) inst->ctrl->AdvanceTime(elapsedTime, 0);
  22.     UpdateFrames(root, &matWorld);
  23.  
  24.     MeshContainer* mesh = firstmesh;
  25.     if(mesh && mesh->pSkinInfo){
  26.         unsigned Bones = mesh->pSkinInfo->GetNumBones();
  27.  
  28.         for (unsigned i = 0; i < Bones; ++i) D3DXMatrixMultiply(&matBone[i],&mesh->boneoff[i], mesh->matCombined[i]);
  29.  
  30.         void *srcPtr = 0, *destPtr = 0;
  31.         mesh->MeshData.pMesh->LockVertexBuffer(D3DLOCK_READONLY, (void**)&srcPtr);
  32.         mesh->mesh->LockVertexBuffer(0, (void**)&destPtr);
  33.  
  34.         mesh->pSkinInfo->UpdateSkinnedMesh(matBone, 0, srcPtr, destPtr);
  35.  
  36.         mesh->mesh->UnlockVertexBuffer();
  37.         mesh->MeshData.pMesh->UnlockVertexBuffer();
  38.     }
  39. }
  40.  
  41. void ANIMATION::Draw(){
  42.     DrawFrame(root);
  43. }
  44.  
  45. void ANIMATION::Release(){
  46.     ctrl->Release();
  47.     MeshHierarchy alloc;
  48.     D3DXFrameDestroy(root, &alloc);
  49.     delete []matBone;
  50. }
  51.  
  52. void ANIMATION::SetupBones(Frame *frame, D3DXMATRIX* matParent){
  53.     MeshContainer* mesh = (MeshContainer*)frame->pMeshContainer;
  54.  
  55.     if(mesh){
  56.         if(!firstmesh) firstmesh = mesh;
  57.  
  58.         if(mesh->pSkinInfo && mesh->MeshData.pMesh){
  59.             D3DVERTEXELEMENT9 Declaration[MAX_FVF_DECL_SIZE];
  60.             mesh->MeshData.pMesh->GetDeclaration(Declaration);
  61.  
  62.             mesh->MeshData.pMesh->CloneMesh(D3DXMESH_MANAGED, Declaration, ENGINE::dxdev, &mesh->mesh);
  63.             iBone = max(iBone, (int)mesh->pSkinInfo->GetNumBones());
  64.  
  65.             for(unsigned i = 0; i < mesh->pSkinInfo->GetNumBones(); i++){  
  66.                 Frame* tframe = (Frame*)D3DXFrameFind(root, mesh->pSkinInfo->GetBoneName(i));
  67.                 mesh->matCombined[i] = &tframe->matCombined;
  68.             }
  69.  
  70.         }
  71.     }
  72.     if(frame->pFrameSibling) SetupBones((Frame*)frame->pFrameSibling, matParent);
  73.     if(frame->pFrameFirstChild) SetupBones((Frame*)frame->pFrameFirstChild, &frame->matCombined);
  74. }
  75.  
  76. void ANIMATION::UpdateFrames(const D3DXFRAME *frame, const D3DXMATRIX *matParent){
  77.     Frame* cframe = (Frame*)frame;
  78.  
  79.     if(matParent) D3DXMatrixMultiply(&cframe->matCombined, &cframe->TransformationMatrix, matParent);
  80.     else cframe->matCombined = cframe->TransformationMatrix;
  81.  
  82.     if (cframe->pFrameSibling) UpdateFrames(cframe->pFrameSibling, matParent);
  83.     if (cframe->pFrameFirstChild) UpdateFrames(cframe->pFrameFirstChild, &cframe->matCombined);
  84. }
  85.  
  86.  
  87. void ANIMATION::DrawMeshContainer(D3DXMESHCONTAINER* inmesh, D3DXFRAME* inframe){
  88.     Frame* frame = (Frame*)inframe;    
  89.     MeshContainer* mesh = (MeshContainer*)inmesh;
  90.    
  91.     ENGINE::effect->e->SetMatrix("matWorld", &frame->matCombined);
  92.  
  93.     for(unsigned i = 0; i < mesh->NumMaterials; i++){
  94.         ENGINE::dxdev->SetMaterial(&mesh->mat[i]);
  95.         ENGINE::dxdev->SetTexture(0, mesh->tex[i]);
  96.  
  97.         ENGINE::effect->Begin();
  98.         if(mesh->pSkinInfo) mesh->mesh->DrawSubset(i);
  99.         else mesh->MeshData.pMesh->DrawSubset(i);
  100.         ENGINE::effect->End();
  101.     }
  102. }
  103.  
  104. void ANIMATION::DrawFrame(D3DXFRAME* frame){
  105.     D3DXMESHCONTAINER* mesh = frame->pMeshContainer;
  106.     while(mesh){
  107.         DrawMeshContainer(mesh, frame);
  108.         mesh = mesh->pNextMeshContainer;
  109.     }
  110.     if (frame->pFrameSibling) DrawFrame(frame->pFrameSibling);
  111.     if (frame->pFrameFirstChild) DrawFrame(frame->pFrameFirstChild);
  112. }
  113.  
  114. ANIMATION::INSTANCE::INSTANCE(){
  115.     ctrl = 0; track = 0;
  116. }
  117.  
  118. void ANIMATION::INSTANCE::Create(ANIMATION* a){
  119.     a->ctrl->CloneAnimationController(a->ctrl->GetMaxNumAnimationOutputs(), a->ctrl->GetMaxNumAnimationSets(),
  120.         a->ctrl->GetMaxNumTracks(), a->ctrl->GetMaxNumEvents(), &ctrl);
  121.     track = 0;
  122. }
  123. void ANIMATION::INSTANCE::ChangeSet(DWORD index){
  124.     if(ctrl == 0) return;
  125.     if(index >= ctrl->GetMaxNumAnimationSets()) index = 0;
  126.  
  127.     LPD3DXANIMATIONSET set;
  128.     ctrl->GetAnimationSet(index, &set);
  129.     ctrl->SetTrackAnimationSet(track, set);
  130.     set->Release();
  131. }
Advertisement
Add Comment
Please, Sign In to add comment