www.pudn.com > Chesssource.rar > transform.cpp
#include "stdafx.h"
cTransform::cTransform()
{
m_bBillboard = FALSE;
m_matCombine1 = m_matCombine2 = NULL;
Move( 0.0f, 0.0f, 0.0f );
Rotate( 0.0f, 0.0f, 0.0f );
Scale( 1.0f, 1.0f, 1.0f );
UpdateMatrix();
}
void cTransform::Move( float fXPos, float fYPos, float fZPos )
{
m_fXPos = fXPos;
m_fYPos = fYPos;
m_fZPos = fZPos;
D3DXMatrixTranslation( &m_matTranslation, m_fXPos, m_fYPos, m_fZPos );
}
void cTransform::MoveRel( float fXAdd, float fYAdd, float fZAdd )
{
Move( m_fXPos + fXAdd, m_fYPos + fYAdd, m_fZPos + fZAdd );
}
void cTransform::Rotate( float fXRot, float fYRot, float fZRot )
{
m_fXRotation = fXRot;
m_fYRotation = fYRot;
m_fZRotation = fZRot;
D3DXMatrixRotationYawPitchRoll( &m_matRotation, m_fYRotation, m_fXRotation, m_fZRotation );
}
void cTransform::RotateRel( float fXAdd, float fYAdd, float fZAdd )
{
Rotate( m_fXRotation + fXAdd, m_fYRotation + fYAdd, m_fZRotation + fZAdd );
}
void cTransform::Scale( float fXSca, float fYSca, float fZSca )
{
m_fXScale = fXSca;
m_fYScale = fYSca;
m_fZScale = fZSca;
D3DXMatrixScaling( &m_matScale, fXSca, fYSca, fZSca );
}
void cTransform::ScaleRel( float fXAdd, float fYAdd, float fZAdd )
{
Scale( m_fXScale + fXAdd, m_fYScale + fYAdd, m_fZScale + fZAdd );
}
HRESULT cTransform::UpdateMatrix( cGraphics *pGraphics )
{
D3DXMATRIX matView, matTransposed;
if( m_bBillboard == TRUE )
{
if( pGraphics != NULL && pGraphics->Get3DDevice() != NULL )
{
pGraphics->Get3DDevice()->GetTransform( D3DTS_VIEW, &matView );
D3DXMatrixTranspose( &matTransposed, &matView );
matTransposed._41 = matTransposed._42 = matTransposed._43 = matTransposed._14 = matTransposed._24 = matTransposed._34 = 0.0f;
}
else
{
D3DXMatrixIdentity( &matTransposed );
}
}
D3DXMatrixMultiply( &m_matWorld, &m_matScale, &m_matRotation );
if( m_bBillboard == TRUE )
D3DXMatrixMultiply( &m_matWorld, &m_matWorld, &matTransposed );
D3DXMatrixMultiply( &m_matWorld, &m_matWorld, &m_matTranslation );
if( m_matCombine1 != NULL )
D3DXMatrixMultiply( &m_matWorld, &m_matWorld, m_matCombine1 );
if( m_matCombine2 != NULL )
D3DXMatrixMultiply( &m_matWorld, &m_matWorld, m_matCombine2 );
return S_OK;
}
void cTransform::EnableBillboard( BOOL bEnable )
{
m_bBillboard = bEnable;
}
D3DXMATRIX *cTransform::GetMatrix( cGraphics *pGraphics )
{
UpdateMatrix( pGraphics );
return &m_matWorld;
}
void cTransform::SetCombineMatrix1(D3DXMATRIX *matMatrix)
{
m_matCombine1 = matMatrix;
}
void cTransform::SetCombineMatrix2(D3DXMATRIX *matMatrix)
{
m_matCombine2 = matMatrix;
}
float cTransform::GetXPos()
{
return m_fXPos;
}
float cTransform::GetYPos()
{
return m_fYPos;
}
float cTransform::GetZPos()
{
return m_fZPos;
}
float cTransform::GetXRotation()
{
return m_fXRotation;
}
float cTransform::GetYRotation()
{
return m_fYRotation;
}
float cTransform::GetZRotation()
{
return m_fZRotation;
}
float cTransform::GetXScale()
{
return m_fXScale;
}
float cTransform::GetYScale()
{
return m_fYScale;
}
float cTransform::GetZScale()
{
return m_fZScale;
}