📄 mcmachine.cpp
字号:
// MCMachine.cpp: implementation of the CMCMachine class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MCMachine.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMCMachine::CMCMachine()
{
/*
m_pBasis = NULL;
m_pd3dDevice = NULL;
m_nPartType = 0;
m_pModel = NULL;
m_pTag = NULL;
m_nCurFrame = 0;
m_nNextFrame = 0;
m_dwMSPF = 0; // Mill Second Per Frame
m_dwAccTime = 0; // 穿利~
m_finterPolation= 0; // 焊埃俊 静捞绰芭
m_bParentsPosApply = TRUE;
m_wParentsRotateApply = TRUE;
m_pPlayer = NULL;
*/
}
CMCMachine::~CMCMachine()
{
/*
m_pModel = NULL; // Main Scene 何盒俊辑 颇鲍窃.(皋葛府包府窍绰镑 捞扼带啊)
m_pBasis = NULL; // 按眉 颇鲍绰 Basis 磊脚捞 舅酒辑 窃
m_pTag = NULL; // m_pModel俊辑 颇鲍窃
*/
}
/*
HRESULT CMCMachine::CreateParts(LPDIRECT3DDEVICE9 pD3dDevice, DWORD nPartType, CMCModel *pModel, CPlayerMachine *pPlayer)
{
//----------------------------------------------//
// Direct3D Device
//----------------------------------------------//
m_pd3dDevice = pD3dDevice;
//----------------------------------------------//
// PartType
//----------------------------------------------//
m_nPartType = nPartType;
//----------------------------------------------//
// MD3Model
//----------------------------------------------//
m_pModel = pModel;
//----------------------------------------------//
// this甫 啊瘤绊 乐绰 PlayerMachine
//----------------------------------------------//
m_pPlayer = pPlayer;
//----------------------------------------------//
// Tag 林家甫 祈狼甫 困秦 爱绊 乐绰促.
//----------------------------------------------//
m_pTag = m_pModel->GetTag();
//----------------------------------------------//
// Data Init
//----------------------------------------------//
m_vLook = D3DXVECTOR3(0.0f,0.0f,1.0f);
m_vRight = D3DXVECTOR3(1.0f,0.0f,0.0f);
m_vUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
D3DXQuaternionIdentity(&m_quateRotate);
D3DXQuaternionIdentity(&m_quateResult);
D3DXMatrixIdentity(&m_matWorld);
D3DXMatrixIdentity(&m_matScale);
D3DXMatrixIdentity(&m_matTrans);
//----------------------------------------------//
// 冠胶俊 鞘夸茄 何盒
//----------------------------------------------//
DWORD dwFrameNum = m_pModel->GetMD3Header()->iBoneFrameNum; // 关俊 拌魂窍扁 困秦
m_vpBoxVertex = new D3DXVECTOR3[ dwFrameNum * 8 ];
m_vpBoxCenter = new D3DXVECTOR3[ dwFrameNum ];
m_pPlane = new D3DXPLANE[ dwFrameNum * 6 ];
ZeroMemory(m_pPlane,sizeof(D3DXPLANE)*dwFrameNum*6);
ZeroMemory(m_vpBoxVertex,sizeof(D3DXVECTOR3)*dwFrameNum*8 );
ZeroMemory(m_vpBoxCenter,sizeof(D3DXVECTOR3)*dwFrameNum );
D3DXVECTOR3 vMins,vMaxs;
int i;
for(i=0; i<dwFrameNum; i++)
{
vMaxs = m_pModel->GetBoundBox(i)->vMaxs;
vMins = m_pModel->GetBoundBox(i)->vMins;
// 冠胶狼 8谅钎甫 父惦.
this->SetBox(&m_vpBoxVertex[i*8],vMins,vMaxs);
// 乞搁阑 父电促.
D3DXPlaneFromPoints(&m_pPlane[i*6],&m_vpBoxVertex[i*8],&m_vpBoxVertex[i*8+2],&m_vpBoxVertex[i*8+1]); // botton
D3DXPlaneFromPoints(&m_pPlane[i*6+1],&m_vpBoxVertex[i*8+4],&m_vpBoxVertex[i*8+5],&m_vpBoxVertex[i*8+7]); // Top
D3DXPlaneFromPoints(&m_pPlane[i*6+2],&m_vpBoxVertex[i*8+5],&m_vpBoxVertex[i*8+1],&m_vpBoxVertex[i*8+7]); // Right
D3DXPlaneFromPoints(&m_pPlane[i*6+3],&m_vpBoxVertex[i*8],&m_vpBoxVertex[i*8+4],&m_vpBoxVertex[i*8+6]); // Left
D3DXPlaneFromPoints(&m_pPlane[i*6+4],&m_vpBoxVertex[i*8],&m_vpBoxVertex[i*8+5],&m_vpBoxVertex[i*8+4]); // Near
D3DXPlaneFromPoints(&m_pPlane[i*6+5],&m_vpBoxVertex[i*8+6],&m_vpBoxVertex[i*8+7],&m_vpBoxVertex[i*8+3]); // Far
m_vpBoxCenter[i] = ((vMaxs - vMins)/2)+vMins; // 吝缴痢阑 备窃
}
return S_OK;
}
bool CMCMachine::Render(bool bBoxbound/*=false*//*)
{
// 鞘磐傅
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
// tag蔼 盎脚
CMCMachine::TagRender();
// 皋浆甫 罚歹傅
CMCMachine::SetWorldMatrix();
m_pd3dDevice->SetTransform(D3DTS_WORLD,&m_matWorld);
m_pModel->Render(m_nCurFrame,m_nNextFrame,m_finterPolation);
// 官款爹 冠胶甫 弊副搏瘤 八荤.
if(bBoxbound) m_pModel->BoundingBoxRender(m_nCurFrame, m_matWorld);
return true;
}
void CMCMachine::TagRender()
{
D3DXMATRIXA16 matResult;
if(m_pBasis)
{
m_pBasis->TagRender();
m_pBasis->SetWorldMatrix(); // 刚历 海捞胶狼 雀傈苞 谅钎甫 炼钦矫挪促.
D3DTAG *pCurTag = m_pBasis->GetCurTag();
D3DTAG *pNextTag = m_pBasis->GetNextTag();
bool bFind=false;
int i,j;
for(i=0; i<m_pBasis->GetModel()->GetMD3Header()->iTagNum; i++)
{
for(j=0; j<m_pModel->GetMD3Header()->iTagNum; j++)
{
if(!strcmp(pCurTag->szTagName, &m_pTag[j].szTagName[0] ))
{
// 茫疽促
bFind=true;
break;
}
}
if(bFind) break; // 茫疽促搁 for巩阑 弊父倒酒扼~
++pCurTag;
++pNextTag;
}
// 雀傈青纺阑 孽磐聪柯栏肺 父甸绊
D3DXQUATERNION quateCurFrame, quateNextFrame, quateResult;
D3DXQuaternionRotationMatrix(&quateCurFrame, &pCurTag->matTag );
D3DXQuaternionRotationMatrix(&quateNextFrame, &pNextTag->matTag );
// 滴俺狼 孽磐聪柯阑 备搁急屈阑 捞侩秦辑 焊埃茄促.
D3DXQuaternionSlerp(&quateResult,&quateCurFrame, &quateNextFrame, m_pBasis->GetInterPolation());
D3DXQUATERNION quater;
switch(m_wParentsRotateApply)
{
case 0: // 磊扁 磊脚狼 雀傈蔼阑 啊柳促.
quater = m_quateRotate;
break;
case 1: // 何葛狼 雀傈蔼阑 罐绰促.
quater = *m_pBasis->GetRotateQuater();
break;
// case 2: // 何葛狼 雀傈蔼俊 磊扁 磊脚狼 雀傈蔼阑 歹茄促~
// D3DXQuaternionMultiply(&quater,&m_quateRotate,m_pBasis->GetResultQuater());
// break;
}
D3DXQuaternionMultiply(&m_quateResult,&quateResult,&quater);
if(m_bParentsPosApply)
{
D3DXMatrixIdentity(&matResult);
// 付瘤阜栏肺 谅钎蔼 焊埃~
// 鉴辑措肺 x,y,z,1
for(j=12; j<15; j++) // 12 何磐 矫累窍绰 捞蜡绰 4x4狼 12锅掳 = x, 13 = y, 14 = z, 付瘤阜搏 救静聪鳖
{
matResult[j] = pCurTag->matTag[j] + m_pBasis->GetInterPolation() * ( pNextTag->matTag[j] - pCurTag->matTag[j] );
}
// 唱赣瘤蔼 悸泼
//matResult[15] = 1.0f; matResult[3] = matResult[7] = matResult[11] = 0.0f;
}
D3DXMatrixMultiply(&matResult,&matResult, m_pBasis->GetWorldMatrix() ); // 岿靛青纺俊 利侩~
m_matTrans._41 = matResult._41;
m_matTrans._42 = matResult._42;
m_matTrans._43 = matResult._43;
}
else // 何葛啊 绝促搁, 雀傈 孽磐甫 弥辆孽磐肺 颗扁磊.
m_quateResult = m_quateRotate;
m_vLook = D3DXVECTOR3(0,0,1);
m_vUp = D3DXVECTOR3(0,1,0);
m_vRight= D3DXVECTOR3(1,0,0);
CUtility::QuaternionRotateVector(m_quateResult,&m_vLook);
CUtility::QuaternionRotateVector(m_quateResult,&m_vRight);
CUtility::QuaternionRotateVector(m_quateResult,&m_vUp);
}
D3DTAG *CMCMachine::FindTag(char *szTagName)
{
D3DTAG *pCurTag = CMCMachine::GetCurTag();
int i;
for(i=0; i<m_pModel->GetMD3Header()->iTagNum; i++)
{
// 茫绰促.
if(!strcmp(pCurTag->szTagName, szTagName))
{
break;
}
++pCurTag;
}
return pCurTag;
}
//-------------------------------------------------------------------------
// Name. Intersect : 乔欧 盲农..
// D3DXVECTOR3& vDest : 乔欧等 芭府甫 焊辰促.
//-------------------------------------------------------------------------
D3DXVECTOR3 CMCMachine::Intersect( D3DXVECTOR3 vRayOrig, D3DXVECTOR3 vRayDir, float &pDist, D3DXVECTOR3 *pTriangle)
{
// 吝缴痢阑 备茄促.
D3DXVECTOR3 vIntersectPos(0.0f,0.0f,0.0f);
LPDIRECT3DVERTEXBUFFER9 pVB;
LPDIRECT3DINDEXBUFFER9 pIB;
DWORD dwMeshCnt = m_pModel->GetMeshCnt();
CMCMesh *pMesh = m_pModel->GetMesh();
for(int j=0; j<dwMeshCnt; j++,pMesh++) // 皋浆父怒 捣促~
{
pMesh->GetVertexBuffer( &pVB );
pMesh->GetIndexBuffer( &pIB );
WORD* pIndices;
D3DVERTEX* pVertices;
pIB->Lock( 0, 0, (void**)&pIndices, 0 );
pVB->Lock( 0, 0, (void**)&pVertices, 0 );
FLOAT fBary1, fBary2;
FLOAT fDist,fMinDist = 10000.0f;
int nIntersect = 0;
for( DWORD i=0; i<pMesh->m_nFaceCount; i++ )
{
D3DXVECTOR3 v0 = pVertices[pIndices[3*i+0]].p;
D3DXVECTOR3 v1 = pVertices[pIndices[3*i+1]].p;
D3DXVECTOR3 v2 = pVertices[pIndices[3*i+2]].p;
D3DXVec3TransformCoord(&v0,&v0,&m_matWorld);
D3DXVec3TransformCoord(&v1,&v1,&m_matWorld);
D3DXVec3TransformCoord(&v2,&v2,&m_matWorld);
// Check if the pick ray passes through this point
if( CUtility::IntersectTriangle( vRayOrig, vRayDir, v0, v1, v2,
&fDist, &fBary1, &fBary2 ) )
{
nIntersect++;
if( fDist < fMinDist )
{
vIntersectPos = vRayOrig + vRayDir * fDist;
pDist = fMinDist = fDist;
pTriangle[0] = v0;
pTriangle[1] = v1;
pTriangle[2] = v2;
}
}
}
pVB->Unlock();
pIB->Unlock();
}
return vIntersectPos;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -