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; 
}