void GEMesh::loadFromMemory(void* Data, unsigned int SizeOfData) { LPD3DXBUFFER pD3DXMtrlBuffer; D3DXMATERIAL* d3dxMaterials; // load mesh D3DXLoadMeshFromXInMemory(Data, SizeOfData, D3DXMESH_SYSTEMMEM, d3ddev, NULL, &pD3DXMtrlBuffer, NULL, &iNumMaterials, &mMesh); // load materials and textures d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); mMaterials = new D3DMATERIAL9[iNumMaterials]; mTextures = new LPDIRECT3DTEXTURE9[iNumMaterials]; for(DWORD i = 0; i < iNumMaterials; i++) { mMaterials[i] = d3dxMaterials[i].MatD3D; mMaterials[i].Ambient = mMaterials[i].Diffuse; mMaterials[i].Specular = mMaterials[i].Diffuse; mTextures[i] = NULL; if(d3dxMaterials[i].pTextureFilename != NULL && lstrlenA(d3dxMaterials[i].pTextureFilename) > 0) D3DXCreateTextureFromFileA(d3ddev, d3dxMaterials[i].pTextureFilename, &mTextures[i]); } pD3DXMtrlBuffer->Release(); }
// コンストラクタ CMesh::CMesh(LPDIRECT3DDEVICE9 device, string file, CArchiveLoader* archive) : Device(device), Mesh(NULL), NumMaterials(0), Materials(NULL), Textures(NULL), ColorMultiplier(1, 1, 1, 1), ColorAddition(0, 0, 0, 0) { string path=ExtractFilePath(file); // ファイルを読み込む LPD3DXBUFFER buf_materials=NULL; if (archive) { ARCHIVE_ENTRY* e=archive->Find(file); if (e) { D3DXLoadMeshFromXInMemory( e->Data, e->Size, D3DXMESH_SYSTEMMEM, Device, NULL, &buf_materials, NULL, &NumMaterials, &Mesh); } } else { D3DXLoadMeshFromX( file.c_str(), D3DXMESH_SYSTEMMEM, Device, NULL, &buf_materials, NULL, &NumMaterials, &Mesh); } // マテリアルとテクスチャのための配列を確保する D3DXMATERIAL* materials; if (buf_materials) { materials=(D3DXMATERIAL*)buf_materials->GetBufferPointer(); Materials=new D3DMATERIAL9[NumMaterials]; Textures=new LPDIRECT3DTEXTURE9[NumMaterials]; } // マテリアルをコピーし,テクスチャを読み込む for (DWORD i=0; i<NumMaterials; i++ ) { // マテリアルをコピーする Materials[i]=materials[i].MatD3D; // アンビエント色を設定する Materials[i].Ambient=Materials[i].Diffuse; // テクスチャを読み込む Textures[i]=NULL; char* texture_file=materials[i].pTextureFilename; if (texture_file && lstrlen(texture_file)>0) { if (archive) { ARCHIVE_ENTRY* e=archive->Find(path+texture_file); if (!e) continue; D3DXCreateTextureFromFileInMemory( Device, e->Data, e->Size, &Textures[i]); } else { D3DXCreateTextureFromFile( Device, (path+texture_file).c_str(), &Textures[i]); } } } /* // 最適化 DWORD* adjacency=new DWORD[Mesh->GetNumFaces()*3]; HRESULT result; result=Mesh->GenerateAdjacency(0, adjacency); result=Mesh->OptimizeInplace(D3DXMESHOPT_STRIPREORDER, adjacency, NULL, NULL, NULL); delete adjacency; */ // 後片づけ if (buf_materials) buf_materials->Release(); }