www.pudn.com > Chesssource.rar > Object.cpp
#include "stdafx.h"
cObject::cObject()
{
m_pGraphics = NULL;
m_pMesh = NULL;
}
cObject::~cObject()
{
Free();
}
BOOL cObject::Create( cGraphics *pGraphics, cMesh *pMesh )
{
if(( m_pGraphics = pGraphics ) == NULL )
return FALSE;
m_pMesh = pMesh;
Move( 0.0f, 0.0f, 0.0f );
Rotate( 0.0f, 0.0f, 0.0f );
Scale( 1.0f, 1.0f, 1.0f );
return TRUE;
}
void cObject::Free()
{
m_pGraphics = NULL;
m_pMesh = NULL;
}
BOOL cObject::EnableBillboard( BOOL bEnable )
{
m_pPos.EnableBillboard( bEnable );
return TRUE;
}
BOOL cObject::AttachToObject( cObject *pObject, char *strFrameName )
{
sFrame *pFrame;
if( pObject == NULL || pObject->m_pMesh == NULL )
{
m_pPos.SetCombineMatrix1( NULL );
m_pPos.SetCombineMatrix2( NULL );
}
else
{
pFrame = pObject->m_pMesh->GetFrame( strFrameName );
if(pFrame == NULL )
{
m_pPos.SetCombineMatrix1( NULL );
m_pPos.SetCombineMatrix2( NULL );
}
else
{
m_pPos.SetCombineMatrix1( &pFrame->m_matCombined );
m_pPos.SetCombineMatrix2( pObject->m_pPos.GetMatrix() );
}
}
return TRUE;
}
void cObject::Move( float fXPos, float fYPos, float fZPos )
{
m_pPos.Move( fXPos, fYPos, fZPos );
}
void cObject::MoveRel( float fXAdd, float fYAdd, float fZAdd )
{
m_pPos.MoveRel( fXAdd, fYAdd, fZAdd );
}
void cObject::Rotate( float fXRot, float fYRot, float fZRot )
{
m_pPos.Rotate( fXRot, fYRot, fZRot );
}
void cObject::RotateRel( float fXAdd, float fYAdd, float fZAdd )
{
m_pPos.RotateRel( fXAdd, fYAdd, fZAdd );
}
void cObject::Scale( float fXSca, float fYSca, float fZSca )
{
m_pPos.Scale( fXSca, fYSca, fZSca );
}
void cObject::ScaleRel( float fXAdd, float fYAdd, float fZAdd )
{
m_pPos.ScaleRel( fXAdd, fYAdd, fZAdd );
}
D3DXMATRIX *cObject::GetMatrix()
{
return m_pPos.GetMatrix();
}
BOOL cObject::SetMesh( cMesh *pMesh )
{
m_pMesh = pMesh;
return TRUE;
}
cMesh *cObject::GetMesh()
{
return m_pMesh;
}
float cObject::GetXPos()
{
return m_pPos.GetXPos();
}
float cObject::GetYPos()
{
return m_pPos.GetYPos();
}
float cObject::GetZPos()
{
return m_pPos.GetZPos();
}
float cObject::GetXRotation()
{
return m_pPos.GetXRotation();
}
float cObject::GetYRotation()
{
return m_pPos.GetYRotation();
}
float cObject::GetZRotation()
{
return m_pPos.GetZRotation();
}
float cObject::GetXScale()
{
return m_pPos.GetXScale();
}
float cObject::GetYScale()
{
return m_pPos.GetYScale();
}
float cObject::GetZScale()
{
return m_pPos.GetZScale();
}
BOOL cObject::Update()
{
m_pPos.UpdateMatrix( m_pGraphics );
return TRUE;
}
BOOL cObject::Render( BOOL bTex )
{
D3DXMATRIX matMatrix;
if( m_pGraphics == NULL || m_pMesh == NULL /*|| m_pMesh->GetParentFrame == NULL || m_pMesh->GetParentMesh() == NULL*/ )
return FALSE;
Update();
D3DXMatrixIdentity( &matMatrix );
UpdateFrame( m_pMesh->GetParentFrame(), &matMatrix );
m_pMesh->GetParentMesh()->CopyFrameToBoneMatrices();
DrawFrame( m_pMesh->GetParentFrame(), bTex );
return TRUE;
}
void cObject::UpdateFrame( sFrame *pFrame, D3DXMATRIX *matMatrix )
{
if( pFrame == NULL )
return;
D3DXMatrixMultiply( &pFrame->m_matCombined, &pFrame->m_matOriginal, matMatrix );
UpdateFrame( pFrame->m_pChild, &pFrame->m_matCombined );
UpdateFrame( pFrame->m_pSibling, matMatrix );
}
void cObject::DrawFrame( sFrame *pFrame, BOOL bTex )
{
sFrameMeshList *pList;
sMesh *pMesh;
D3DXMATRIX matWorld;
DWORD i;
D3DXMatrixIdentity( &matWorld );
if( pFrame == NULL )
return;
if(( pList = pFrame->m_pMeshList ) != NULL )
{
while( pList != NULL )
{
if(( pMesh = pList->m_pMesh ) != NULL )
{
if( pMesh->m_dwNumBones && pMesh->m_pSkinMesh != NULL )
{
void *SrcPtr, *DestPtr;
pMesh->m_pMesh->LockVertexBuffer( D3DLOCK_READONLY, (void**)&SrcPtr );
pMesh->m_pMesh->LockVertexBuffer( 0, (void**)&DestPtr );
pMesh->m_pSkinInfo->UpdateSkinnedMesh( pMesh->m_matMatrices, NULL, SrcPtr, DestPtr );
pMesh->m_pSkinMesh->UnlockVertexBuffer();
pMesh->m_pMesh->UnlockVertexBuffer();
m_pGraphics->Get3DDevice()->SetTransform( D3DTS_WORLD, m_pPos.GetMatrix());
}
else
{
//D3DXMatrixMultiply( &matWorld, &pFrame->m_matCombined, m_pPos.GetMatrix());
m_pGraphics->Get3DDevice()->SetTransform( D3DTS_WORLD, m_pPos.GetMatrix() );
}
for( i=0; im_dwNumMaterials; i++ )
{
if( pMesh->m_pmatMaterials[i].Diffuse.a != 0.0f )
{
m_pGraphics->Get3DDevice()->SetMaterial( &pMesh->m_pmatMaterials[i] );
if( !bTex )
m_pGraphics->Get3DDevice()->SetTexture( 0, pMesh->m_pTextures[i] );
else
m_pGraphics->Get3DDevice()->SetTexture( 0, pMesh->m_pTextures[i+1] );
if( pMesh->m_pmatMaterials[i].Diffuse.a != 1.0f )
m_pGraphics->EnableAlphaBlending( TRUE, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
if( pMesh->m_pSkinMesh != NULL )
pMesh->m_pSkinMesh->DrawSubset(i);
else
pMesh->m_pMesh->DrawSubset(i);
if( pMesh->m_pmatMaterials[i].Diffuse.a != 1.0f )
m_pGraphics->EnableAlphaBlending( FALSE );
}
}
}
pList = pList->m_pNext;
}
}
DrawFrame( pFrame->m_pChild, bTex );
DrawFrame( pFrame->m_pSibling, bTex );
}