/** Optimizes the given set of vertices */ XRESULT D3D11VertexBuffer::OptimizeFaces(VERTEX_INDEX* indices, byte* vertices, unsigned int numIndices, unsigned int numVertices, unsigned int stride) { return XR_SUCCESS; unsigned int numFaces = numIndices / 3; DWORD* remap = new DWORD[numFaces]; if(FAILED(D3DXOptimizeFaces(indices, numFaces, numVertices, FALSE, (DWORD *)remap))) { delete[] remap; return XR_FAILED; } // Remap vertices VERTEX_INDEX* ibCopy = new VERTEX_INDEX[numFaces * 3]; memcpy(ibCopy, indices, numFaces * 3 * sizeof(VERTEX_INDEX)); for(unsigned int i=0;i<numFaces;i++) { // Copy the remapped face memcpy( &indices[i * 3], &ibCopy[ remap[i] * 3], 3 * sizeof(VERTEX_INDEX)); } delete[] ibCopy; delete[] remap; return XR_SUCCESS; }
ETOOLS_API HRESULT WINAPI D3DX_OptimizeFaces( LPCVOID pIndices, UINT NumFaces, UINT NumVertices, BOOL Indices32Bit, DWORD * pFaceRemap) { return D3DXOptimizeFaces(pIndices, NumFaces, NumVertices, Indices32Bit, pFaceRemap); }
//-------------------------------------------------------------------------------------- // Optimize grid indices for post-vertex cache //-------------------------------------------------------------------------------------- void GridOptimizeIndices( WORD* pIndexBuffer, int nNumIndex, int nNumVertex ) { // Optimize faces for post-transform cache DWORD* pRemappedFaces = new DWORD [nNumIndex/3]; D3DXOptimizeFaces( pIndexBuffer, nNumIndex/3, nNumVertex, FALSE, pRemappedFaces ); // Allocate temporary index buffer and copy current indices into it WORD* pTmpIndexBuffer = new WORD [nNumIndex]; memcpy( pTmpIndexBuffer, pIndexBuffer, nNumIndex * sizeof( WORD ) ); // Remap triangles for ( int i=0; i < (int)nNumIndex/3; ++i ) { int newFace = (int)pRemappedFaces[i]; for ( int j=0; j < 3; ++j ) { pIndexBuffer[newFace*3+j] = pTmpIndexBuffer[i*3+j]; } } delete[] pTmpIndexBuffer; delete[] pRemappedFaces; }
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 (); } }