/** Optimizes the given set of vertices */ XRESULT D3D11VertexBuffer::OptimizeVertices(VERTEX_INDEX* indices, byte* vertices, unsigned int numIndices, unsigned int numVertices, unsigned int stride) { return XR_SUCCESS; DWORD* remap = new DWORD[numVertices]; if(FAILED(D3DXOptimizeVertices(indices, numIndices / 3, numVertices, FALSE, (DWORD *)remap))) { delete[] remap; return XR_FAILED; } // Remap vertices byte* vxCopy = new byte[numVertices * stride]; memcpy(vxCopy, vertices, numVertices * stride); for(unsigned int i=0;i<numVertices;i++) { // Assign the vertex at remap[i] to its new vertex memcpy(vertices + remap[i] * stride, vxCopy + i * stride, stride); } for(unsigned int i=0;i<numIndices;i++) { // Remap the indices. indices[i] = (VERTEX_INDEX)remap[indices[i]]; } delete[] vxCopy; delete[] remap; return XR_SUCCESS; }
//-------------------------------------------------------------------------------------- // Optimize grid vertices and indices for pre-vertex cache //-------------------------------------------------------------------------------------- void GridOptimizeVertices( WORD* pIndexBuffer, void *pVertexBuffer, DWORD dwVertexSize, int nNumIndex, int nNumVertex ) { // Optimize vertices for pre-transform cache DWORD* pRemappedVertices = new DWORD [nNumVertex]; D3DXOptimizeVertices( pIndexBuffer, nNumIndex/3, nNumVertex, FALSE, pRemappedVertices ); // Allocate temporary vertex buffer and copy current vertices into it BYTE* pTmpVertexBuffer = new BYTE [nNumVertex * dwVertexSize]; memcpy( pTmpVertexBuffer, (BYTE *)pVertexBuffer, nNumVertex*dwVertexSize ); // Remap vertices for ( int i=0; i < (int)nNumVertex; ++i ) { int newVertexIndex = (int)pRemappedVertices[i]; memcpy( (BYTE *)pVertexBuffer+newVertexIndex*dwVertexSize, (BYTE *)pTmpVertexBuffer + (i*dwVertexSize), dwVertexSize ); } // Remap indices for ( int i=0; i < (int)nNumIndex; ++i ) { pIndexBuffer[i] = (WORD)pRemappedVertices[pIndexBuffer[i]]; } delete[] pTmpVertexBuffer; delete[] pRemappedVertices; }
ETOOLS_API HRESULT WINAPI D3DX_OptimizeVertices( LPCVOID pIndices, UINT NumFaces, UINT NumVertices, BOOL Indices32Bit, DWORD * pVertexRemap) { return D3DXOptimizeVertices(pIndices, NumFaces, NumVertices, Indices32Bit, pVertexRemap); }
void OGF::Stripify () { if (progressive_test()) return; // Mesh already progressive - don't stripify it // fast verts if (fast_path_data.vertices.size() && fast_path_data.faces.size()) /* try { xr_vector<u16> indices,permute; // Stripify u16* F = (u16*)&*x_faces.begin(); indices.assign (F,F+(x_faces.size()*3) ); permute.resize (x_vertices.size() ); xrStripify (indices,permute,c_vCacheSize,0); // Copy faces CopyMemory (&*x_faces.begin(),&*indices.begin(),(u32)indices.size()*sizeof(u16)); // Permute vertices vec_XV temp_list = x_vertices; for(u32 i=0; i<temp_list.size(); i++) x_vertices[i]=temp_list[permute[i]]; } catch (...) { clMsg ("ERROR: [fast-vert] Stripifying failed. Dump below."); DumpFaces (); */ { // alternative stripification - faces { DWORD* remap = xr_alloc<DWORD> (fast_path_data.faces.size()); HRESULT rhr = D3DXOptimizeFaces (&fast_path_data.faces.front(),fast_path_data.faces.size(),fast_path_data.vertices.size(),FALSE,remap); R_CHK (rhr); vecOGF_F _source = fast_path_data.faces; for (u32 it=0; it<_source.size(); it++) fast_path_data.faces[it] = _source[remap[it]]; xr_free (remap); } // alternative stripification - vertices { DWORD* remap = xr_alloc<DWORD> (fast_path_data.vertices.size()); HRESULT rhr = D3DXOptimizeVertices (&fast_path_data.faces.front(),fast_path_data.faces.size(),fast_path_data.vertices.size(),FALSE,remap); R_CHK (rhr); vec_XV _source = fast_path_data.vertices; for(u32 it=0; it<_source.size(); it++) fast_path_data.vertices[remap[it]] = _source[it]; for(u32 it=0; it<fast_path_data.faces.size(); it++) for (u32 j=0; j<3; j++) fast_path_data.faces[it].v[j]= (u16)remap[fast_path_data.faces[it].v[j]]; xr_free (remap); } } // normal verts try { xr_vector<u16> indices,permute; // Stripify u16* F = (u16*)&*data.faces.begin(); indices.assign (F,F+(data.faces.size()*3)); permute.resize (data.vertices.size()); xrStripify (indices,permute,c_vCacheSize,0); // Copy faces CopyMemory (&*data.faces.begin(),&*indices.begin(),(u32)indices.size()*sizeof(u16)); // Permute vertices vecOGF_V temp_list = data.vertices; for(u32 i=0; i<temp_list.size(); i++) data.vertices[i]=temp_list[permute[i]]; } catch (...) { clMsg ("ERROR: [slow-vert] Stripifying failed. Dump below."); DumpFaces (); } }