📄 effectmesh.cpp
字号:
// EffectMesh.cpp: implementation of the CEffectMesh class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "EffectMesh.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CEffectMesh::CEffectMesh()
{
m_pMCTexture = NULL;
m_pMaterials = NULL;
m_pVertexBuffer = NULL;
m_pIndexBuffer = NULL;
m_pTexture = NULL;
}
CEffectMesh::~CEffectMesh()
{
SAFE_DELETE_ARRAY(m_pVertex);
SAFE_DELETE_ARRAY(m_nFace);
SAFE_DELETE_ARRAY(m_nTexIndex);
SAFE_DELETE_ARRAY(m_pMCTexture);
SAFE_DELETE_ARRAY( m_pMaterials );
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pIndexBuffer);
SAFE_RELEASE(m_pTexture);
// m_pTexture = NULL;
}
void CEffectMesh::AddTexture( MCTEXTURE * pTexture, int nCount )
{
if(!m_pMCTexture)
{
m_pMCTexture = new MCTEXTURE*[m_nTexCount];
m_pMaterials = new D3DMATERIAL9[m_nTexCount];
}
m_pMCTexture[nCount] = pTexture;
ZeroMemory( &m_pMaterials[nCount], sizeof(D3DMATERIAL9) );
m_pMaterials[nCount].Diffuse.r = m_pMaterials[nCount].Ambient.r = 1.0f;
m_pMaterials[nCount].Diffuse.g = m_pMaterials[nCount].Ambient.g = 1.0f;
m_pMaterials[nCount].Diffuse.b = m_pMaterials[nCount].Ambient.b = 1.0f;
m_pMaterials[nCount].Diffuse.a = m_pMaterials[nCount].Ambient.a = 1.0f;
}
HRESULT CEffectMesh::CreateVertexIndexBuffer()
{
//------------------------------------------------------------------------------------------//
// Index Buffer
//------------------------------------------------------------------------------------------//
if(FAILED( g_pApp->GetD3dDevice()->CreateIndexBuffer( m_nFaceCount * sizeof(WORD)*3,
D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,
D3DPOOL_DEFAULT, &m_pIndexBuffer,NULL)))
{
OutputDebugString("[角菩] CMD3Mesh::CreateIndexBuffer");
return E_FAIL;
}
WORD *pIndices=NULL;
if( FAILED( m_pIndexBuffer->Lock(0,0, (void **)&pIndices, D3DLOCK_DISCARD) ))
{
return E_FAIL;
}
for(int i=0; i<m_nFaceCount; i++)
{
for(int j=0; j<3; j++)
pIndices[(i*3)+j] = (WORD)m_nFace[(i*3)+abs(j)];
}
m_pIndexBuffer->Unlock();
if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_nVertexCount * sizeof(MCFVFVERTEX),
D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,
MC3FVF_VERTEX,D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL) ))
{
OutputDebugString("[角菩] CMD3Mesh::CreateVertexBuffer");
return E_FAIL;
}
D3DFVFVERTEX *pVertex=NULL;
if( FAILED( m_pVertexBuffer->Lock(0,0, (void **)&pVertex, D3DLOCK_DISCARD) ))
return E_FAIL;
for( i=0; i<m_nVertexCount; i++)
{
pVertex[i].vVector = m_pVertex[i].vVector;
pVertex[i].vNoraml = m_pVertex[i].vNoraml;
pVertex[i].Tex = m_pVertex[i].Tex;
}
if( FAILED( m_pVertexBuffer->Unlock() ) )
return E_FAIL;
return S_OK;
}
HRESULT CEffectMesh::ReleaseVertexIndex()
{
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pIndexBuffer);
return S_OK;
}
HRESULT CEffectMesh::GetVertexData( MCFVFVERTEX ** pVertex, int * nVertexCount )
{
*pVertex = m_pVertex;
nVertexCount = &m_nVertexCount;
return S_OK;
}
HRESULT CEffectMesh::Render( BYTE nAlpha ) // 舅颇 喉坊爹 贸府..
{
if(m_pMCTexture)
{
for( int i=0; i<m_nTexCount; i++)
{
if(FAILED( g_pApp->GetD3dDevice()->SetTexture(i,m_pMCTexture[i]->pTexture) ))
{
OutputDebugString("[Failed] CMD3Mesh::Render / SetTexture \n");
return E_FAIL;
}
}
}else if(m_pTexture) {
for( int i=0; i<m_nTexCount; i++)
{
if(FAILED( g_pApp->GetD3dDevice()->SetTexture(i, m_pTexture) ))
{
OutputDebugString("[Failed] CMD3Mesh::Render / SetTexture \n");
return E_FAIL;
}
}
}else{
// for( int i=0; i<m_nTexCount; i++)
// g_pApp->GetD3dDevice()->SetTexture(i,NULL);
}
g_pApp->GetD3dDevice()->SetStreamSource(0,m_pVertexBuffer,0,sizeof(MCFVFVERTEX) );
g_pApp->GetD3dDevice()->SetFVF(MC3FVF_VERTEX);
g_pApp->GetD3dDevice()->SetIndices(m_pIndexBuffer);
g_pApp->GetD3dDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0, m_nVertexCount,0,m_nFaceCount);
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -