staticmesh.cpp

来自「DirectInput的基本实现 只是基本应用」· C++ 代码 · 共 219 行

CPP
219
字号
#include "StdAfx.h"
#include "staticmesh.h"
#include ".\staticmesh.h"

#define new VNEW

CStaticMesh::CStaticMesh(void) :
m_pDevice(NULL),
m_pMesh(NULL),
m_enBlendType(SBT_OPAQUE)
{
}

CStaticMesh::~CStaticMesh(void)
{
	SAFE_RELEASE(m_pMesh);

	for( DWORD dw = 0; dw < m_dwNumMaterials; ++dw )
	{
		if( m_vecTexture.size() <= dw )
			break;

		if( m_vecTexture[dw] )
			SAFE_RELEASE(m_vecTexture[dw]);
	}

	m_vecMaterial.clear();
	m_vecTexture.clear();
}

bool CStaticMesh::Init(LPDIRECT3DDEVICE9 pDevice, LPCSTR pFileName)
{
	assert( pDevice!=NULL );
	assert( pFileName!=NULL );

	m_pDevice = pDevice;
	strcpy(m_fileName, pFileName);

	LPD3DXBUFFER pXBuffer = NULL;
 
	if( FAILED( D3DXLoadMeshFromX(m_fileName, D3DXMESH_SYSTEMMEM, m_pDevice, NULL,
		&pXBuffer, NULL, &m_dwNumMaterials, &m_pMesh ) ) )
	{
		return false;
	}

	m_vecMaterial.resize( m_dwNumMaterials );
	m_vecTexture.resize( m_dwNumMaterials );

	D3DXMATERIAL *pD3DXMaterial =
		reinterpret_cast<D3DXMATERIAL*>( pXBuffer->GetBufferPointer() );


	for( DWORD dw = 0; dw < m_dwNumMaterials; ++dw )
	{
		m_vecMaterial[dw] = pD3DXMaterial[dw].MatD3D;

		if( FAILED( D3DXCreateTextureFromFile(m_pDevice, pD3DXMaterial[dw].pTextureFilename, 
			&m_vecTexture[dw]) ) )
		{
			m_vecTexture[dw] = NULL;
		}
	}

	pXBuffer->Release();

	return true;
}

void CStaticMesh::Render(const D3DXMATRIX &matWorld)
{
	m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
	//m_pDevice->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
	//m_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
	//m_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);

	switch (m_enBlendType)
	{
	case SBT_OPAQUE:
		{
			m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
		}
		break;
	case SBT_TRANSPARENT_ALPHA:
		{
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
		}
		break;
	case SBT_TRANSPARENT_COLOR:
		{
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR );
		}
		break;
	case SBT_ADD_COLOR:
		{
			m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
		}
		break;
	case SBT_ADD_ALPHA:
		{
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
		}
		break;
	case SBT_MODULATE:
		{
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
		}
		break;
	case SBT_MODULATE2:
		{
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR );
		}
		break;
	case SBT_TRANSPARENT_DIFFUSE:
		{
			m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
			m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

			m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
			m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
			m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE );
		}
		break;
	}

	m_pDevice->SetTransform(D3DTS_WORLD, &matWorld);

	for( DWORD dw = 0; dw < m_dwNumMaterials; ++dw )
	{
		m_pDevice->SetMaterial( &m_vecMaterial[dw] );
		m_pDevice->SetTexture( 0, m_vecTexture[dw] );

		m_pMesh->DrawSubset( dw );
	}

	m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
	m_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
	//m_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
}

HRESULT CStaticMesh::SetTextureFromFile(DWORD dwID, LPCSTR pFileName)
{
	HRESULT retResult;

	if(m_vecTexture.size() <= dwID)
		return E_FAIL;

	SAFE_RELEASE(m_vecTexture[dwID]);

	string tempName(pFileName);
	ChangeFileNameToDDS( tempName );
	if( FAILED( retResult = D3DXCreateTextureFromFile(m_pDevice, tempName.c_str(), 
		&m_vecTexture[dwID]) ) )
	{
		if( FAILED( retResult = D3DXCreateTextureFromFile(m_pDevice, pFileName, 
			&m_vecTexture[dwID]) ) )
		{
			m_vecTexture[dwID] = NULL;
			return retResult;
		}
	}

	return S_OK;
}

void CStaticMesh::SetTexture(DWORD dwID, LPDIRECT3DTEXTURE9 pTexture)
{
	if(m_vecTexture.size() <= dwID)
		return;

	m_vecTexture[dwID] = pTexture;
}

HRESULT CStaticMesh::Optimize(void)
{
	return E_NOTIMPL;
}

LPD3DXMESH CStaticMesh::GetSysMemMesh(void)
{
	return m_pMesh;
}

HRESULT CStaticMesh::SetFVF(DWORD dwFVF)
{
	LPD3DXMESH pTempMesh = NULL;

	if( m_pMesh )
	{
		if( FAILED( m_pMesh->CloneMeshFVF( D3DXMESH_SYSTEMMEM, dwFVF, m_pDevice, &pTempMesh ) ) )
			return E_FAIL;
	}

	SAFE_RELEASE( m_pMesh );

	if( pTempMesh ) m_pMesh = pTempMesh;

	// 计算法线
	if( m_pMesh )
		D3DXComputeNormals( m_pMesh, NULL );

	return S_OK;
}

LPDIRECT3DTEXTURE9 *CStaticMesh::GetTexture(DWORD dwID)
{
	if(dwID >= m_vecTexture.size())
		return NULL;

	m_vecTexture[dwID]->AddRef();
	return &m_vecTexture[dwID];
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?