#pragma once struct Tri; class MeshExploder { LPDIRECT3DDEVICE9 device; LPD3DXMESH originalMesh; D3DXMATERIAL* originalMaterials; D3DXEFFECTINSTANCE* originalShaders; wchar_t** materialNames; unsigned int nPieces; LPD3DXMESH* fragmentMeshes; DWORD* fragmentAttribIndices; public: LPD3DXMESH composedMesh; D3DXMATERIAL* composedMaterials; D3DXEFFECTINSTANCE* composedShaders; wchar_t** composedMaterialNames; MeshExploder(LPDIRECT3DDEVICE9 device, LPD3DXMESH originalMesh, D3DXMATERIAL* originalMaterials, wchar_t** materialNames, D3DXEFFECTINSTANCE* originalShaders, unsigned int nPieces); ~MeshExploder(void); //create #nPieces partial meshes //attributes are kept for every face void explode(); //generate atlas for all fragment meshes //attributes are kept void generateAtlas(int atlasSize); //combine all fragment meshes into one //attributes are (original x fragmentIndex) //new material buffer void merge(); void saveFragMeshes(); void saveComposedMesh(LPCSTR name); void saveComposedMeshToOgreXML(LPCSTR name); static void clusterTrisKMeans(Tri* triArray, int nTris, int nClusters, int* clusterLenghts); };