📄 sdkmesh.cpp
字号:
//--------------------------------------------------------------------------------------
// File: SDKMesh.cpp
//
// The SDK Mesh format (.sdkmesh) is not a recommended file format for games.
// It was designed to meet the specific needs of the SDK samples. Any real-world
// applications should avoid this file format in favor of a destination format that
// meets the specific needs of the application.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#include "DXUT.h"
#include "SDKMesh.h"
#include "SDKMisc.h"
//--------------------------------------------------------------------------------------
void CDXUTSDKMesh::LoadMaterials( ID3D10Device* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials, SDKMESH_CALLBACKS10* pLoaderCallbacks )
{
char strPath[MAX_PATH];
if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile )
{
for( UINT m=0; m<numMaterials; m++ )
{
pMaterials[m].pDiffuseTexture10 = NULL;
pMaterials[m].pNormalTexture10 = NULL;
pMaterials[m].pSpecularTexture10 = NULL;
pMaterials[m].pDiffuseRV10 = NULL;
pMaterials[m].pNormalRV10 = NULL;
pMaterials[m].pSpecularRV10 = NULL;
// load textures
if( pMaterials[m].DiffuseTexture[0] != 0 )
{
pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, pMaterials[m].DiffuseTexture, &pMaterials[m].pDiffuseRV10, pLoaderCallbacks->pContext );
}
if( pMaterials[m].NormalTexture[0] != 0 )
{
pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, pMaterials[m].NormalTexture, &pMaterials[m].pNormalRV10, pLoaderCallbacks->pContext );
}
if( pMaterials[m].SpecularTexture[0] != 0 )
{
pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, pMaterials[m].SpecularTexture, &pMaterials[m].pSpecularRV10, pLoaderCallbacks->pContext );
}
}
}
else
{
for( UINT m=0; m<numMaterials; m++ )
{
pMaterials[m].pDiffuseTexture10 = NULL;
pMaterials[m].pNormalTexture10 = NULL;
pMaterials[m].pSpecularTexture10 = NULL;
pMaterials[m].pDiffuseRV10 = NULL;
pMaterials[m].pNormalRV10 = NULL;
pMaterials[m].pSpecularRV10 = NULL;
// load textures
if( pMaterials[m].DiffuseTexture[0] != 0 )
{
StringCchPrintfA( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture );
if( FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pDiffuseRV10 ) ) )
pMaterials[m].pDiffuseRV10 = (ID3D10ShaderResourceView*)ERROR_RESOURCE_VALUE;
}
if( pMaterials[m].NormalTexture[0] != 0 )
{
StringCchPrintfA( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture );
if( FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pNormalRV10 ) ) )
pMaterials[m].pNormalRV10 = (ID3D10ShaderResourceView*)ERROR_RESOURCE_VALUE;
}
if( pMaterials[m].SpecularTexture[0] != 0 )
{
StringCchPrintfA( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture );
if( FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pSpecularRV10 ) ) )
pMaterials[m].pSpecularRV10 = (ID3D10ShaderResourceView*)ERROR_RESOURCE_VALUE;
}
}
}
}
//--------------------------------------------------------------------------------------
void CDXUTSDKMesh::LoadMaterials( IDirect3DDevice9* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials, SDKMESH_CALLBACKS9* pLoaderCallbacks )
{
char strPath[MAX_PATH];
if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile )
{
for( UINT m=0; m<numMaterials; m++ )
{
pMaterials[m].pDiffuseTexture9 = NULL;
pMaterials[m].pNormalTexture9 = NULL;
pMaterials[m].pSpecularTexture9 = NULL;
pMaterials[m].pDiffuseRV10 = NULL;
pMaterials[m].pNormalRV10 = NULL;
pMaterials[m].pSpecularRV10 = NULL;
// load textures
if( pMaterials[m].DiffuseTexture[0] != 0 )
{
pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, pMaterials[m].DiffuseTexture, &pMaterials[m].pDiffuseTexture9, pLoaderCallbacks->pContext );
}
if( pMaterials[m].NormalTexture[0] != 0 )
{
pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, pMaterials[m].NormalTexture, &pMaterials[m].pNormalTexture9, pLoaderCallbacks->pContext );
}
if( pMaterials[m].SpecularTexture[0] != 0 )
{
pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, pMaterials[m].SpecularTexture, &pMaterials[m].pSpecularTexture9, pLoaderCallbacks->pContext );
}
}
}
else
{
for( UINT m=0; m<numMaterials; m++ )
{
pMaterials[m].pDiffuseTexture9 = NULL;
pMaterials[m].pNormalTexture9 = NULL;
pMaterials[m].pSpecularTexture9 = NULL;
pMaterials[m].pDiffuseRV10 = NULL;
pMaterials[m].pNormalRV10 = NULL;
pMaterials[m].pSpecularRV10 = NULL;
// load textures
if( pMaterials[m].DiffuseTexture[0] != 0 )
{
StringCchPrintfA( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture );
if( FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pDiffuseTexture9 ) ) )
pMaterials[m].pDiffuseTexture9 = (IDirect3DTexture9*)ERROR_RESOURCE_VALUE;
}
if( pMaterials[m].NormalTexture[0] != 0 )
{
StringCchPrintfA( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture );
if( FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pNormalTexture9 ) ) )
pMaterials[m].pNormalTexture9 = (IDirect3DTexture9*)ERROR_RESOURCE_VALUE;
}
if( pMaterials[m].SpecularTexture[0] != 0 )
{
StringCchPrintfA( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture );
if( FAILED(DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, strPath, &pMaterials[m].pSpecularTexture9 ) ) )
pMaterials[m].pSpecularTexture9 = (IDirect3DTexture9*)ERROR_RESOURCE_VALUE;
}
}
}
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTSDKMesh::CreateVertexBuffer( ID3D10Device* pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices, SDKMESH_CALLBACKS10* pLoaderCallbacks )
{
HRESULT hr = S_OK;
pHeader->DataOffset = 0;
//Vertex Buffer
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = (UINT)(pHeader->SizeBytes);
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer )
{
pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB10, bufferDesc, pVertices, pLoaderCallbacks->pContext );
}
else
{
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = pVertices;
hr = pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &pHeader->pVB10 );
}
return hr;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTSDKMesh::CreateIndexBuffer( ID3D10Device* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader, void* pIndices, SDKMESH_CALLBACKS10* pLoaderCallbacks )
{
HRESULT hr = S_OK;
pHeader->DataOffset = 0;
//Index Buffer
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth = (UINT)(pHeader->SizeBytes);
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer )
{
pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB10, bufferDesc, pIndices, pLoaderCallbacks->pContext );
}
else
{
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = pIndices;
hr = pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &pHeader->pIB10 );
}
return hr;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTSDKMesh::CreateVertexBuffer( IDirect3DDevice9* pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices, SDKMESH_CALLBACKS9* pLoaderCallbacks )
{
HRESULT hr = S_OK;
pHeader->DataOffset = 0;
if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer )
{
pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB9, (UINT)pHeader->SizeBytes, D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, pVertices, pLoaderCallbacks->pContext );
}
else
{
hr = pd3dDevice->CreateVertexBuffer( (UINT)pHeader->SizeBytes,
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_DEFAULT,
&pHeader->pVB9,
NULL );
//lock
if( SUCCEEDED(hr) )
{
void* pLockedVerts = NULL;
V_RETURN( pHeader->pVB9->Lock( 0, 0, &pLockedVerts, 0 ) );
CopyMemory( pLockedVerts, pVertices, (size_t)pHeader->SizeBytes );
pHeader->pVB9->Unlock();
}
}
return hr;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTSDKMesh::CreateIndexBuffer( IDirect3DDevice9* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader, void* pIndices, SDKMESH_CALLBACKS9* pLoaderCallbacks )
{
HRESULT hr = S_OK;
pHeader->DataOffset = 0;
D3DFORMAT ibFormat = D3DFMT_INDEX16;
switch( pHeader->IndexType )
{
case IT_16BIT:
ibFormat = D3DFMT_INDEX16;
break;
case IT_32BIT:
ibFormat = D3DFMT_INDEX32;
break;
};
if( pLoaderCallbacks && pLoaderCallbacks->pCreateIndexBuffer )
{
pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB9, (UINT)pHeader->SizeBytes, D3DUSAGE_WRITEONLY, ibFormat, D3DPOOL_DEFAULT, pIndices, pLoaderCallbacks->pContext );
}
else
{
hr = pd3dDevice->CreateIndexBuffer( (UINT)(pHeader->SizeBytes),
D3DUSAGE_WRITEONLY,
ibFormat,
D3DPOOL_DEFAULT,
&pHeader->pIB9,
NULL );
if( SUCCEEDED(hr) )
{
void* pLockedIndices = NULL;
V_RETURN( pHeader->pIB9->Lock( 0, 0, &pLockedIndices, 0 ) );
CopyMemory( pLockedIndices, pIndices, (size_t)(pHeader->SizeBytes) );
pHeader->pIB9->Unlock();
}
}
return hr;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTSDKMesh::CreateFromFile( ID3D10Device *pDev10, IDirect3DDevice9* pDev9,
LPCTSTR szFileName,
bool bOptimize,
bool bCreateAdjacencyIndices,
SDKMESH_CALLBACKS10* pLoaderCallbacks10, SDKMESH_CALLBACKS9* pLoaderCallbacks9 )
{
HRESULT hr = S_OK;
// Find the path for the file
V_RETURN( DXUTFindDXSDKMediaFileCch( m_strPathW, sizeof(m_strPathW) / sizeof(WCHAR), szFileName ) );
// Open the file
m_hFile = CreateFile( m_strPathW, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL );
if( INVALID_HANDLE_VALUE == m_hFile )
return DXUTERR_MEDIANOTFOUND;
// Change the path to just the directory
WCHAR *pLastBSlash = wcsrchr( m_strPathW, L'\\' );
if( pLastBSlash )
*(pLastBSlash + 1) = L'\0';
else
*m_strPathW = L'\0';
WideCharToMultiByte( CP_ACP, 0, m_strPathW, -1, m_strPath, MAX_PATH, NULL, FALSE );
// Get the file size
LARGE_INTEGER FileSize;
GetFileSizeEx( m_hFile, &FileSize );
UINT cBytes = FileSize.LowPart;
// Allocate memory
m_pStaticMeshData = new BYTE[ cBytes ];
if( !m_pStaticMeshData )
{
CloseHandle( m_hFile );
return E_OUTOFMEMORY;
}
// Read in the file
DWORD dwBytesRead;
if( !ReadFile( m_hFile, m_pStaticMeshData, cBytes, &dwBytesRead, NULL ) )
hr = E_FAIL;
CloseHandle( m_hFile );
if( SUCCEEDED(hr) )
{
hr = CreateFromMemory( pDev10,
pDev9,
m_pStaticMeshData,
cBytes,
bOptimize,
bCreateAdjacencyIndices,
false,
pLoaderCallbacks10, pLoaderCallbacks9 );
if( FAILED(hr) )
delete []m_pStaticMeshData;
}
return hr;
}
HRESULT CDXUTSDKMesh::CreateFromMemory( ID3D10Device *pDev10,
IDirect3DDevice9* pDev9,
BYTE* pData,
UINT DataBytes,
bool bOptimize,
bool bCreateAdjacencyIndices,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -