Graphics Reference
In-Depth Information
//if using hw, just copy the mesh
if(g_bUseHWNPatches)
{
hr = g_pMeshSysMem->CloneMeshFVF(D3DXMESH_WRITEONLY |
D3DXMESH_NPATCHES | (g_pMeshSysMem->GetOptions() & D3DXMESH_32BIT),
g_pMeshSysMem->GetFVF(), pd3dDevice, &pMeshTemp);
if(FAILED(hr))
return hr;
}
else //Tesselate the mesh in software
{
//Create an enhanced version of the mesh, will be in sysmem since
//source is
hr = D3DXTessellateNPatches(g_pMeshSysMem, (DWORD*)g_
pbufAdjacency->GetBufferPointer(), (float)dwNewNumSegs, FALSE,
&pMeshEnhancedSysMem, NULL);
if(FAILED(hr))
{
//If the tessellate failed, there might have been more
//triangles or vertices than can fit into a 16bit mesh,
//so try cloning to 32bit before tessellation
hr = g_pMeshSysMem->CloneMeshFVF(D3DXMESH_SYSTEMMEM |
D3DXMESH_32BIT, g_pMeshSysMem->GetFVF(), pd3dDevice, &pMeshTemp);
if(FAILED(hr))
return hr;
hr = D3DXTessellateNPatches(pMeshTemp,
(DWORD*)g_pbufAdjacency->GetBufferPointer(), (float)dwNewNumSegs, FALSE,
&pMeshEnhancedSysMem, NULL);
if(FAILED(hr))
{
pMeshTemp->Release();
return hr;
}
pMeshTemp->Release();
}
//Make a video memory version of the mesh
//Only set WRITEONLY if it doesn't use 32bit indices, because
//those often need to be emulated, which means that D3DX needs
//read-access.
DWORD dwMeshEnhancedFlags = pMeshEnhancedSysMem->GetOptions() &
D3DXMESH_32BIT;
if((dwMeshEnhancedFlags & D3DXMESH_32BIT) = = 0)
dwMeshEnhancedFlags | = D3DXMESH_WRITEONLY;
hr = pMeshEnhancedSysMem->CloneMeshFVF(dwMeshEnhancedFlags,
g_pMeshSysMem->GetFVF(), pd3dDevice, &pMeshTemp);
if(FAILED(hr))
{
SAFE_RELEASE(pMeshEnhancedSysMem);
return hr;
}
//Latch in the enhanced mesh
SAFE_RELEASE(pMeshEnhancedSysMem);
}
Search WWH ::




Custom Search