Esempio n. 1
0
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]];
	}
}
Esempio n. 2
0
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	();
	}
}