Guest User

anonymous

a guest
Feb 1st, 2011
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. // dxhierarchy.cpp
  2.  
  3. #include "dxhierarchy.h"
  4.  
  5. HRESULT MeshHierarchy::CreateFrame(const char* name, D3DXFRAME** outframe){
  6.     Frame* frame = new Frame;
  7.     memset(frame, 0, sizeof(Frame));
  8.  
  9.     D3DXMatrixIdentity(&frame->TransformationMatrix);
  10.     D3DXMatrixIdentity(&frame->matCombined);
  11.  
  12.     frame->pMeshContainer = 0;
  13.     frame->pFrameSibling = 0;
  14.     frame->pFrameFirstChild = 0;
  15.    
  16.     if(name && strlen(name)){
  17.         frame->Name = new char[strlen(name)+1];
  18.         memcpy(frame->Name, name, strlen(name)+1);
  19.     }
  20.     *outframe = frame;
  21.     return 0;
  22. }
  23.  
  24. HRESULT MeshHierarchy::CreateMeshContainer(const char* name, const D3DXMESHDATA* meshdata,
  25.                        const D3DXMATERIAL* materials, const D3DXEFFECTINSTANCE*, DWORD imat,
  26.                        const DWORD* adjacency, ID3DXSkinInfo* skininfo, D3DXMESHCONTAINER** outmesh){
  27.     MeshContainer* mesh = new MeshContainer;
  28.     memset(mesh, 0, sizeof(MeshContainer));
  29.  
  30.     if(name && strlen(name)){
  31.         mesh->Name = new char[strlen(name)+1];
  32.         memcpy(mesh->Name, name, strlen(name)+1);
  33.     }
  34.  
  35.     mesh->MeshData.Type = D3DXMESHTYPE_MESH;
  36.     DWORD iface = meshdata->pMesh->GetNumFaces();
  37.     mesh->pAdjacency = new DWORD[iface*3];
  38.     memcpy(mesh->pAdjacency, adjacency, sizeof(DWORD)*iface*3);
  39.  
  40.     mesh->MeshData.pMesh = meshdata->pMesh;
  41.     mesh->MeshData.pMesh->AddRef();
  42.     mesh->NumMaterials = max(imat,1);
  43.     mesh->mat = new D3DMATERIAL9[mesh->NumMaterials];
  44.     mesh->tex = new IDirect3DTexture9*[mesh->NumMaterials];
  45.  
  46.     ZeroMemory(mesh->tex, sizeof(IDirect3DTexture9*)*mesh->NumMaterials);
  47.  
  48.     LPDIRECT3DDEVICE9 dxdev;
  49.     meshdata->pMesh->GetDevice(&dxdev);
  50.  
  51.     if(imat>0){
  52.         for(DWORD i = 0; i < imat; i++){
  53.             mesh->tex[i] = 0;  
  54.             mesh->mat[i] = materials[i].MatD3D;
  55.  
  56.             if(materials[i].pTextureFilename) D3DXCreateTextureFromFile(dxdev, materials[i].pTextureFilename, &mesh->tex[i]);                  
  57.         }
  58.     }
  59.     if(skininfo){
  60.         mesh->pSkinInfo = skininfo;
  61.         skininfo->AddRef();
  62.         UINT iBone = skininfo->GetNumBones();
  63.         mesh->boneoff = new D3DXMATRIX[iBone];
  64.             mesh->matCombined = new D3DXMATRIX*[iBone];
  65.         for(UINT i = 0; i < iBone; i++) mesh->boneoff[i] = *mesh->pSkinInfo->GetBoneOffsetMatrix(i);
  66.     }else{
  67.         mesh->pSkinInfo = 0;
  68.         mesh->boneoff = 0;
  69.         mesh->mesh = 0;
  70.         mesh->matCombined = 0;
  71.     }
  72.     dxdev->Release();
  73.     *outmesh = mesh;
  74.     return 0;
  75. }
  76.  
  77. HRESULT MeshHierarchy::DestroyFrame(D3DXFRAME* frame){
  78.     Frame *exframe = (Frame*)frame;
  79.     if(exframe->Name) delete []exframe->Name;
  80.     delete exframe;
  81.     return 0;
  82. }
  83.  
  84. HRESULT MeshHierarchy::DestroyMeshContainer(D3DXMESHCONTAINER* mesh){
  85.     MeshContainer* exmesh = (MeshContainer*)mesh;
  86.     if(!exmesh) return 0;
  87.     if(exmesh->Name) delete []exmesh->Name;
  88.     if(exmesh->mat) delete []exmesh->mat;
  89.     if(exmesh->tex){
  90.         for(UINT i = 0; i < exmesh->NumMaterials; i++)
  91.             if(exmesh->tex[i]) exmesh->tex[i]->Release();
  92.         delete []exmesh->tex;
  93.     }
  94.     if (exmesh->pAdjacency) delete []exmesh->pAdjacency;
  95.     if (exmesh->boneoff) delete []exmesh->boneoff;
  96.     if (exmesh->matCombined) delete []exmesh->matCombined;
  97.     if (exmesh->mesh) exmesh->mesh->Release();
  98.     if (exmesh->MeshData.pMesh) exmesh->MeshData.pMesh->Release();
  99.     if (exmesh->pSkinInfo) exmesh->pSkinInfo->Release();
  100.     delete exmesh;
  101.     exmesh = 0;
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment