void CDetail::Optimize () { xr_vector<u16> vec_indices, vec_permute; const int cache = HW.Caps.geometry.dwVertexCache; // Stripify vec_indices.assign (indices,indices+number_indices); vec_permute.resize (number_vertices); int vt_old = xrSimulate(vec_indices,cache); xrStripify (vec_indices,vec_permute,cache,0); int vt_new = xrSimulate(vec_indices,cache); if (vt_new<vt_old) { // Msg ("* DM: %d verts, %d indices, VT: %d/%d",number_vertices,number_indices,vt_old,vt_new); // Copy faces CopyMemory (indices,&*vec_indices.begin(),vec_indices.size()*sizeof(u16)); // Permute vertices xr_vector<fvfVertexIn> verts; verts.assign (vertices,vertices+number_vertices); for(u32 i=0; i<verts.size(); i++) vertices[i]=verts[vec_permute[i]]; } }
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 (); } }