Ejemplo n.º 1
0
/** 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;
}
Ejemplo n.º 2
0
//--------------------------------------------------------------------------------------
// 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;
}
Ejemplo n.º 3
0
	ETOOLS_API HRESULT WINAPI
		D3DX_OptimizeVertices(
		LPCVOID pIndices,
		UINT NumFaces,
		UINT NumVertices,
		BOOL Indices32Bit,
		DWORD * pVertexRemap)
	{
		return D3DXOptimizeVertices(pIndices, NumFaces, NumVertices, Indices32Bit, pVertexRemap);
	}
Ejemplo n.º 4
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	();
	}
}