📄 mcmesh.cpp
字号:
// MCMesh.cpp: implementation of the CMCMesh class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
char* strDamageName[] =
{
_T("迫厕摹"),
_T("窍冠"),
_T("颊"),
_T("公腑包例"),
_T("辆酒府"),
_T("缔厕摹"),
_T("菊厕摹"),
};
CMCMesh::CMCMesh()
{
m_pTexture = NULL;
m_pVertexBuffer = NULL;
m_pIndexBuffer = NULL;
m_bRender = FALSE;
m_nDamage = 0;
m_nParts = 0;
for(int i=0;i<MAX_BONEANI;i++)
{
m_vlAniMation[i].clear();
m_pBoundBox[i] = NULL;
m_nMaxFrame[i] = 0;
}
m_pD3DXMesh = NULL;
D3DXMatrixIdentity(&m_matWorld);
}
CMCMesh::~CMCMesh()
{
for(int i=0;i<MAX_BONEANI;i++)
{
m_vlAniMation[i].clear();
SAFE_DELETE_ARRAY(m_pBoundBox[i]);
}
SAFE_DELETE_ARRAY(m_pMCVertex);
SAFE_DELETE_ARRAY(m_nFace);
SAFE_DELETE_ARRAY(m_nTexIndex);
SAFE_DELETE_ARRAY(m_pTexture);
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pIndexBuffer);
SAFE_RELEASE(m_pD3DXMesh);
}
void CMCMesh::AddTexture( MCTEXTURE * pTexture, int nCount )
{
if(!m_pTexture)
m_pTexture = new MCTEXTURE*[m_nTexCount];
m_pTexture[nCount] = pTexture;
}
void CMCMesh::AddAniMatrix( CMCAni * pAni, BYTE nIndex )
{
m_vlAniMation[nIndex].push_back(pAni);
}
HRESULT CMCMesh::CreateVertexIndexBuffer()
{
OutputDebugString("\n[角菩] CMCMesh::CreateVertexIndexBuffer 捞逞 捞惑茄逞捞促..");
return E_FAIL;
}
HRESULT CMCMesh::CreateVertexIndexBufferEx()
{
if(!m_bRender)
return S_OK;
if(m_pIndexBuffer)
return S_OK;
CMCAni * pAni = NULL;
for( int i=0;i<MAX_BONEANI;i++)
{
if(m_vlAniMation[i].size() >0 )
{
pAni = m_vlAniMation[i][0];
}
}
if(!pAni)
return S_OK;
OutputDebugString("[Start] CMCMeshEx CMD3Mesh::CreateIndexVertexBuffer\n");
//------------------------------------------------------------------------------------------//
// Index Buffer
//------------------------------------------------------------------------------------------//
// if(FAILED( g_pApp->GetD3dDevice()->CreateIndexBuffer( m_nFaceCount * sizeof(WORD)*3, // 捞犯霸 镜瘤滴 葛福摆促.. 青纺风 贸府 窍绰 规侥捞恭..
// 0,D3DFMT_INDEX16,
// D3DPOOL_DEFAULT, &m_pIndexBuffer,NULL)))
if(FAILED( g_pApp->GetD3dDevice()->CreateIndexBuffer( m_nFaceCount * sizeof(WORD)*3,
D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,
D3DPOOL_DEFAULT, &m_pIndexBuffer,NULL)))
{
OutputDebugString("[角菩] CMCMeshEx CMD3Mesh::CreateIndexBuffer\n");
return E_FAIL;
}
WORD *pIndices=NULL;
if( FAILED( m_pIndexBuffer->Lock(0,0, (void **)&pIndices, D3DLOCK_DISCARD) ))
{
return E_FAIL;
}
for( i=0; i<m_nFaceCount; i++)
{
// for(int j=0; j<3; j++)
// pIndices[(i*3)+j] = (WORD)m_nFace[(i*3)+abs(j-2)];
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),
// 0,
// MC3FVF_VERTEX,D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL) ))
if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_nVertexCount * sizeof(MCFVFVERTEX),
D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,
MC3FVF_VERTEX,D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL) ))
{
OutputDebugString("[角菩] CMCMeshEx CMD3Mesh::CreateVertexBuffer\n");
return E_FAIL;
}
MCFVFVERTEX *pVertex=NULL;
if( FAILED( m_pVertexBuffer->Lock(0,0, (void **)&pVertex, D3DLOCK_DISCARD) ))
return E_FAIL;
for( i=0; i<m_nVertexCount; i++)
{
D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
//D3DXVec3TransformCoord(&vVector,&vVector,&m_matLocalTM); // 捞逞篮 救持绢滴 搭芭 鞍促.. 青纺贸府 规侥俊绰 救付廉..
pVertex[i].vVector = vVector;
pVertex[i].vNoraml = m_pMCVertex[i].vNoraml;
pVertex[i].Tex = m_pMCVertex[i].Tex;
}
if( FAILED( m_pVertexBuffer->Unlock() ) )
return E_FAIL;
D3DXVECTOR3 vMaxs;
D3DXVECTOR3 vMins;
for( i=0; i<m_nVertexCount; i++)
{
D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
if( i==0 ){
vMaxs.x = vVector.x;
vMaxs.y = vVector.y;
vMaxs.z = vVector.z;
vMins.x = vVector.x;
vMins.y = vVector.y;
vMins.z = vVector.z;
}else{
if( vVector.x > vMaxs.x )
vMaxs.x = vVector.x;
if( vVector.y > vMaxs.y )
vMaxs.y = vVector.y;
if( vVector.z > vMaxs.z )
vMaxs.z = vVector.z;
if( vVector.x < vMins.x )
vMins.x = vVector.x;
if( vVector.y < vMins.y )
vMins.y = vVector.y;
if( vVector.z < vMins.z )
vMins.z = vVector.z;
}
}
// 官款爹 冠胶甫 D3DXMesh 滚傈(??)档 父甸绢敌促.
SAFE_RELEASE(m_pD3DXMesh);
D3DXVECTOR3 vSize = vMaxs - vMins;
D3DXCreateBox(g_pApp->GetD3dDevice(),fabs(vSize.x),fabs(vSize.y),fabs(vSize.z),&m_pD3DXMesh,NULL);
assert(m_pD3DXMesh);
for( i=0; i<7; i++)
{
if(strstr(m_szName, strDamageName[i]))
{
m_nDamage = 3;
return S_OK;
}
}
if(!strcmp(m_szName, "赣府"))
m_nDamage = 1;
else
m_nDamage = 2;
return S_OK;
}
HRESULT CMCMesh::CreateBoundBox( BYTE nIndex )
{
if(!m_bRender)
return S_OK;
// 官款爹 冠胶 父甸扁..
SAFE_DELETE_ARRAY(m_pBoundBox[nIndex]);
m_pBoundBox[nIndex] = new MD3BOUNDBOX[m_nMaxFrame[nIndex]];
for(int nFrame=0; nFrame<m_nMaxFrame[nIndex]; nFrame++)
{
CMCAni * pAni = m_vlAniMation[nIndex][nFrame];
for( int i=0; i<m_nVertexCount; i++)
{
D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
D3DXVec3TransformCoord(&vVector,&vVector,&pAni->m_matWorldTM);
if( i==0 ){
m_pBoundBox[nIndex][nFrame].vMaxs.x = vVector.x;
m_pBoundBox[nIndex][nFrame].vMaxs.y = vVector.y;
m_pBoundBox[nIndex][nFrame].vMaxs.z = vVector.z;
m_pBoundBox[nIndex][nFrame].vMins.x = vVector.x;
m_pBoundBox[nIndex][nFrame].vMins.y = vVector.y;
m_pBoundBox[nIndex][nFrame].vMins.z = vVector.z;
}else{
if( vVector.x > m_pBoundBox[nIndex][nFrame].vMaxs.x )
m_pBoundBox[nIndex][nFrame].vMaxs.x = vVector.x;
if( vVector.y > m_pBoundBox[nIndex][nFrame].vMaxs.y )
m_pBoundBox[nIndex][nFrame].vMaxs.y = vVector.y;
if( vVector.z > m_pBoundBox[nIndex][nFrame].vMaxs.z )
m_pBoundBox[nIndex][nFrame].vMaxs.z = vVector.z;
if( vVector.x < m_pBoundBox[nIndex][nFrame].vMins.x )
m_pBoundBox[nIndex][nFrame].vMins.x = vVector.x;
if( vVector.y < m_pBoundBox[nIndex][nFrame].vMins.y )
m_pBoundBox[nIndex][nFrame].vMins.y = vVector.y;
if( vVector.z < m_pBoundBox[nIndex][nFrame].vMins.z )
m_pBoundBox[nIndex][nFrame].vMins.z = vVector.z;
}
}
m_pBoundBox[nIndex][nFrame].Position = ((m_pBoundBox[nIndex][nFrame].vMaxs-m_pBoundBox[nIndex][nFrame].vMins)/(float)2.0)+
m_pBoundBox[nIndex][nFrame].vMins;
m_pBoundBox[nIndex][nFrame].scale = D3DXVec3Length(&(m_pBoundBox[nIndex][nFrame].Position-m_pBoundBox[nIndex][nFrame].vMins));
memcpy(m_pBoundBox[nIndex][nFrame].name,m_szName,sizeof(m_pBoundBox[nIndex][nFrame].name));
}
return S_OK;
}
HRESULT CMCMesh::ReleaseVertexIndex()
{
//SAFE_DELETE_ARRAY(m_pBoundBox);
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pIndexBuffer);
SAFE_RELEASE(m_pD3DXMesh);
for(int i=0;i<MAX_BONEANI;i++)
SAFE_DELETE_ARRAY(m_pBoundBox[i]);
return S_OK;
}
HRESULT CMCMesh::UpdateAnimation(UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
if(!m_pVertexBuffer)
return S_OK;
MCFVFVERTEX *pVertex=NULL;
if( FAILED( m_pVertexBuffer->Lock(0,0, (void **)&pVertex, D3DLOCK_DISCARD) ))
return E_FAIL;
// 谅钎 焊埃.. 局聪 青纺 焊埃.. 焊埃过阑 青纺风父 窍绰 规过阑 舅酒 焊技..
CMCAni * pCurrAni = m_vlAniMation[nIndex][nCurFrame];
CMCAni * pNextAni = m_vlAniMation[nIndex][nNextFrame];
if( pCurrAni == NULL || pNextAni == NULL )
{ return E_FAIL; }
D3DXVECTOR3 vCurrVector;
D3DXVECTOR3 vNextVector;
for(int i=0; i<m_nVertexCount; i++)
{
D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
D3DXVec3TransformCoord(&vCurrVector,&vVector,&pCurrAni->m_matWorldTM);
D3DXVec3TransformCoord(&vNextVector,&vVector,&pNextAni->m_matWorldTM);
pVertex[i].vVector = vCurrVector + fInterPolation * (vNextVector-vCurrVector);
//pVertex[i].vVector = vCurrVector;
}
if( FAILED( m_pVertexBuffer->Unlock() ) )
return E_FAIL;
return S_OK;
}
HRESULT CMCMesh::UpdateAnimationEx(UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
return S_OK;
}
HRESULT CMCMesh::Render(UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
if(!m_bRender)
return S_OK;
if(!m_pVertexBuffer)
return S_OK;
if(FAILED(UpdateAnimation( nCurFrame, nNextFrame, fInterPolation, nIndex )))
return E_FAIL;
for( int i=0; i<m_nTexCount; i++)
{
if(FAILED( g_pApp->GetD3dDevice()->SetTexture(i,m_pTexture[i]->pTexture) ))
{
OutputDebugString("[Failed] CMD3Mesh::Render / SetTexture \n");
return E_FAIL;
}
}
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;
}
HRESULT CMCMesh::RenderEx(D3DXMATRIX matWorld, UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
if(!m_bRender)
return S_OK;
if(!m_pVertexBuffer)
return S_OK;
CMCAni * pCurrAni = m_vlAniMation[nIndex][nCurFrame];
//CMCAni * pNextAni = pCurrAni;
CMCAni * pNextAni = m_vlAniMation[nIndex][nNextFrame];
// 局聪 青纺 焊埃..
D3DXVECTOR3 vCurrVector;
D3DXVECTOR3 vNextVector;
D3DXQUATERNION quateCurFrame, quateNextFrame, quateResult;
D3DXQuaternionRotationMatrix(&quateCurFrame, &pCurrAni->m_matWorldTM );
D3DXQuaternionRotationMatrix(&quateNextFrame, &pNextAni->m_matWorldTM );
D3DXQuaternionSlerp(&quateResult,&quateCurFrame, &quateNextFrame, fInterPolation );
// 谅钎 焊埃..
D3DXVECTOR3 vPosCurFrame, vPosNextFrame, vPosResult;
vPosCurFrame = D3DXVECTOR3(pCurrAni->m_matWorldTM._41,pCurrAni->m_matWorldTM._42,pCurrAni->m_matWorldTM._43);
vPosNextFrame = D3DXVECTOR3(pNextAni->m_matWorldTM._41,pNextAni->m_matWorldTM._42,pNextAni->m_matWorldTM._43);
D3DXVec3Lerp(&vPosResult,&vPosCurFrame,&vPosNextFrame,fInterPolation);
D3DXMATRIX matRotate;
D3DXMatrixRotationQuaternion(&matRotate,&quateResult); // 概飘腐胶肺
D3DXMATRIX matTrans;
D3DXMatrixTranslation(&matTrans, vPosResult.x, vPosResult.y, vPosResult.z);
//D3DXMatrixTranslation(&matTrans, vPosResult);
// D3DXMatrixRotationQuaternion(&matTrans,&m_quateResult); // 概飘腐胶肺
m_matWorld = matRotate * matTrans * matWorld;
g_pApp->GetD3dDevice()->SetTransform(D3DTS_WORLD,&m_matWorld);
for( int i=0; i<m_nTexCount; i++)
{
if(FAILED( g_pApp->GetD3dDevice()->SetTexture(i,m_pTexture[i]->pTexture) ))
{
OutputDebugString("[Failed] CMD3Mesh::Render / SetTexture \n");
return E_FAIL;
}
}
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;
}
void CMCMesh::BoundingBoxRender(DWORD dwCurFrame, D3DXMATRIX& matWorld, BYTE nIndex )
{
LPD3DXMESH pBoxMesh;
MD3BOUNDBOX *pBox = &m_pBoundBox[nIndex][dwCurFrame];
D3DVECTOR vSize = pBox->vMaxs - pBox->vMins;
D3DXCreateBox(g_pApp->GetD3dDevice(),vSize.x,vSize.y,vSize.z,&pBoxMesh,NULL);
DWORD Temp[3];
g_pApp->GetD3dDevice()->GetRenderState(D3DRS_ZENABLE, &Temp[0]);
g_pApp->GetD3dDevice()->GetRenderState(D3DRS_FILLMODE, &Temp[1]);
g_pApp->GetD3dDevice()->GetRenderState(D3DRS_CULLMODE, &Temp[2]);
g_pApp->GetD3dDevice()->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
g_pApp->GetD3dDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
g_pApp->GetD3dDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
D3DXMATRIXA16 matResult;
D3DVECTOR vLastPos;
// 吝缴痢阑 备秦辑 vMin蔼 父怒 框流牢促.
// D3DXCreateBox 窃荐绰 盔痢(0,0,0)阑 吝缴栏肺 冠胶甫 积己 窍扁 锭巩俊
// 谅钎蔼捞 嘎瘤 臼扁 锭巩捞促.
vLastPos.x = (vSize.x/2)+(pBox->vMins.x);
vLastPos.y = (vSize.y/2)+(pBox->vMins.y);
vLastPos.z = (vSize.z/2)+(pBox->vMins.z);
D3DXMatrixTranslation(&matResult,vLastPos.x,vLastPos.y,vLastPos.z);
// 葛胆狼 概飘腐胶客 利侩矫挪促.
D3DXMatrixMultiply(&matResult, &matResult, &matWorld);
g_pApp->GetD3dDevice()->SetTransform(D3DTS_WORLD,&matResult);
pBoxMesh->DrawSubset(0);
g_pApp->GetD3dDevice()->SetRenderState(D3DRS_ZENABLE, Temp[0]);
g_pApp->GetD3dDevice()->SetRenderState(D3DRS_FILLMODE, Temp[1]);
g_pApp->GetD3dDevice()->SetRenderState(D3DRS_CULLMODE, Temp[2]);
SAFE_RELEASE(pBoxMesh);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -