コード例 #1
0
ファイル: D3D11Vertexbuffer.cpp プロジェクト: parav/GD3D11
/** 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;
}
コード例 #2
0
ファイル: CreateDX.cpp プロジェクト: 2asoft/xray
	ETOOLS_API HRESULT WINAPI
		D3DX_OptimizeFaces(
		LPCVOID pIndices,
		UINT NumFaces,
		UINT NumVertices,
		BOOL Indices32Bit,
		DWORD * pFaceRemap)
	{
		return D3DXOptimizeFaces(pIndices, NumFaces, NumVertices, Indices32Bit, pFaceRemap);
	}
コード例 #3
0
ファイル: Grid_Creation11.cpp プロジェクト: KNeal/Oculus
//--------------------------------------------------------------------------------------
// 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;
}
コード例 #4
0
ファイル: OGF_Face_Stripify.cpp プロジェクト: 2asoft/xray
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	();
	}
}