251 lines
No EOL
10 KiB
C++
251 lines
No EOL
10 KiB
C++
#include "StdAfx.h"
|
|
#include "AxisLockRenderObject.h"
|
|
#include "AxisRenderObject.h"
|
|
#include "EtMatrixEx.h"
|
|
#include "TEtWorldProp.h"
|
|
#include "Renderbase.h"
|
|
#include "EtWorldSector.h"
|
|
#include "TEtWorldSoundEnvi.h"
|
|
|
|
CAxisLockRenderObject::CAxisLockRenderObject( CTEtWorldSoundEnvi *pEnvi )
|
|
{
|
|
CAxisRenderObject::s_nRefCount++;
|
|
|
|
m_fScale = 50.f;
|
|
CAxisRenderObject::m_nSelectAxis = -1;
|
|
m_pEnvi = pEnvi;
|
|
}
|
|
|
|
CAxisLockRenderObject::~CAxisLockRenderObject()
|
|
{
|
|
CAxisRenderObject::s_nRefCount--;
|
|
if( CAxisRenderObject::s_nRefCount == 0 ) {
|
|
Destroy();
|
|
}
|
|
}
|
|
|
|
void CAxisLockRenderObject::Initialize()
|
|
{
|
|
if( CAxisRenderObject::m_bInitialize == true ) return;
|
|
CAxisRenderObject::m_bInitialize = true;
|
|
|
|
float fLength = CAxisRenderObject::s_fAxisLength - CAxisRenderObject::s_fAxisPos;
|
|
|
|
CAxisRenderObject::m_nPrimitiveCount[0] = CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pAxis[0], 0xFFFF0000, CAxisRenderObject::s_fAxisRadius, fLength, 10, 0, CAxisRenderObject::s_fAxisPos );
|
|
CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pAxisBack[0], 0xFFFF0000, CAxisRenderObject::s_fAxisRadius, 0.f, 10, 0, CAxisRenderObject::s_fAxisPos );
|
|
CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pSelect[0], 0x80EEEE20, CAxisRenderObject::s_fAxisRadius + 2.f, fLength + 2.f, 10, 0, CAxisRenderObject::s_fAxisPos );
|
|
|
|
CAxisRenderObject::m_nPrimitiveCount[1] = CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pAxis[1], 0xFF00FF00, CAxisRenderObject::s_fAxisRadius, fLength, 10, 1, CAxisRenderObject::s_fAxisPos );
|
|
CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pAxisBack[1], 0xFF00FF00, CAxisRenderObject::s_fAxisRadius, 0.f, 10, 1, CAxisRenderObject::s_fAxisPos );
|
|
CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pSelect[1], 0x80EEEE20, CAxisRenderObject::s_fAxisRadius + 2.f, fLength + 2.f, 10, 1, CAxisRenderObject::s_fAxisPos );
|
|
|
|
CAxisRenderObject::m_nPrimitiveCount[2] = CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pAxis[2], 0xFF0000FF, CAxisRenderObject::s_fAxisRadius, fLength, 10, 2, CAxisRenderObject::s_fAxisPos );
|
|
CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pAxisBack[2], 0xFF0000FF, CAxisRenderObject::s_fAxisRadius, 0.f, 10, 2, CAxisRenderObject::s_fAxisPos );
|
|
CAxisRenderObject::CreateCone( &CAxisRenderObject::m_pSelect[2], 0x80EEEE20, CAxisRenderObject::s_fAxisRadius + 2.f, fLength + 2.f, 10, 2, CAxisRenderObject::s_fAxisPos );
|
|
}
|
|
|
|
void CAxisLockRenderObject::Destroy()
|
|
{
|
|
for( int i=0; i<3; i++ ) {
|
|
SAFE_DELETEA( CAxisRenderObject::m_pAxis[i] );
|
|
SAFE_DELETEA( CAxisRenderObject::m_pAxisBack[i] );
|
|
SAFE_DELETEA( CAxisRenderObject::m_pSelect[i] );
|
|
}
|
|
CAxisRenderObject::m_bInitialize = false;
|
|
}
|
|
|
|
void CAxisLockRenderObject::Render()
|
|
{
|
|
DrawAxis();
|
|
}
|
|
|
|
void CAxisLockRenderObject::GetExtent( EtVector3 &Origin, EtVector3 &Extent )
|
|
{
|
|
Origin = EtVector3( m_WorldMat._41, m_WorldMat._42, m_WorldMat._43 );
|
|
Extent = EtVector3( m_WorldMat._41, m_WorldMat._42, m_WorldMat._43 );
|
|
}
|
|
|
|
void CAxisLockRenderObject::DrawAxis()
|
|
{
|
|
DWORD dwLightFlag, dwCullMode;
|
|
|
|
GetEtDevice()->GetRenderState( D3DRS_LIGHTING, &dwLightFlag );
|
|
GetEtDevice()->GetRenderState( D3DRS_CULLMODE, &dwCullMode );
|
|
|
|
GetEtDevice()->SetRenderState( D3DRS_LIGHTING, FALSE );
|
|
GetEtDevice()->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
|
|
|
|
D3DXMATRIX mat, matScale;
|
|
mat = m_WorldMat;
|
|
|
|
D3DXMatrixScaling( &matScale, m_fScale, m_fScale, m_fScale );
|
|
D3DXMatrixMultiply( &mat, &matScale, &mat );
|
|
GetEtDevice()->SetWorldTransform( &mat );
|
|
GetEtDevice()->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE );
|
|
GetEtDevice()->SetVertexShader( NULL );
|
|
GetEtDevice()->SetPixelShader( NULL );
|
|
|
|
for( DWORD i=0; i<3; i++ ) {
|
|
GetEtDevice()->DrawPrimitiveUP( PT_TRIANGLEFAN, CAxisRenderObject::m_nPrimitiveCount[i], CAxisRenderObject::m_pAxis[i], sizeof(CAxisRenderObject::VertexFormat) );
|
|
GetEtDevice()->DrawPrimitiveUP( PT_TRIANGLEFAN, CAxisRenderObject::m_nPrimitiveCount[i], CAxisRenderObject::m_pAxisBack[i], sizeof(CAxisRenderObject::VertexFormat) );
|
|
if( CAxisRenderObject::m_nSelectAxis == i ) {
|
|
DWORD dwAlphaBlend;
|
|
DWORD dwBlendOP, dwSrcBlend, dwDestBlend;
|
|
|
|
GetEtDevice()->GetRenderState( D3DRS_ALPHABLENDENABLE, &dwAlphaBlend );
|
|
GetEtDevice()->GetRenderState( D3DRS_BLENDOP, &dwBlendOP );
|
|
GetEtDevice()->GetRenderState( D3DRS_SRCBLEND, &dwSrcBlend );
|
|
GetEtDevice()->GetRenderState( D3DRS_DESTBLEND, &dwDestBlend );
|
|
|
|
GetEtDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
|
|
GetEtDevice()->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
|
|
GetEtDevice()->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
|
GetEtDevice()->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
|
|
|
GetEtDevice()->DrawPrimitiveUP( PT_TRIANGLEFAN, CAxisRenderObject::m_nPrimitiveCount[i], CAxisRenderObject::m_pSelect[i], sizeof(CAxisRenderObject::VertexFormat) );
|
|
|
|
GetEtDevice()->SetRenderState( D3DRS_ALPHABLENDENABLE, dwAlphaBlend );
|
|
GetEtDevice()->SetRenderState( D3DRS_BLENDOP, dwBlendOP );
|
|
GetEtDevice()->SetRenderState( D3DRS_SRCBLEND, dwSrcBlend );
|
|
GetEtDevice()->SetRenderState( D3DRS_DESTBLEND, dwDestBlend );
|
|
}
|
|
}
|
|
|
|
GetEtDevice()->SetRenderState( D3DRS_LIGHTING, dwLightFlag );
|
|
GetEtDevice()->SetRenderState( D3DRS_CULLMODE, dwCullMode );
|
|
|
|
DWORD dwDiffuse;
|
|
|
|
EtVector3 vPos[2];
|
|
|
|
vPos[0] = EtVector3( 0.f, 0.f, 0.f );
|
|
vPos[1] = EtVector3( CAxisRenderObject::s_fAxisPos, 0, 0 );
|
|
dwDiffuse = ( CAxisRenderObject::m_nSelectAxis == 0 ) ? 0xFFFFFF20 : 0xFFFF0000;
|
|
EtVec3TransformCoord( &vPos[0], &vPos[0], &mat );
|
|
EtVec3TransformCoord( &vPos[1], &vPos[1], &mat );
|
|
EternityEngine::DrawLine3D( vPos[0], vPos[1], dwDiffuse );
|
|
|
|
vPos[0] = EtVector3( 0.f, 0.f, 0.f );
|
|
vPos[1] = EtVector3( 0, CAxisRenderObject::s_fAxisPos, 0 );
|
|
dwDiffuse = ( CAxisRenderObject::m_nSelectAxis == 1 ) ? 0xFFFFFF20 : 0xFF00FF00;
|
|
EtVec3TransformCoord( &vPos[0], &vPos[0], &mat );
|
|
EtVec3TransformCoord( &vPos[1], &vPos[1], &mat );
|
|
EternityEngine::DrawLine3D( vPos[0], vPos[1], dwDiffuse );
|
|
|
|
dwDiffuse = ( CAxisRenderObject::m_nSelectAxis == 2 ) ? 0xFFFFFF20 : 0xFF0000FF;
|
|
vPos[0] = EtVector3( 0.f, 0.f, 0.f );
|
|
vPos[1] = EtVector3( 0.f, 0.f, CAxisRenderObject::s_fAxisPos );
|
|
EtVec3TransformCoord( &vPos[0], &vPos[0], &mat );
|
|
EtVec3TransformCoord( &vPos[1], &vPos[1], &mat );
|
|
EternityEngine::DrawLine3D( vPos[0], vPos[1], dwDiffuse );
|
|
}
|
|
|
|
int CAxisLockRenderObject::CheckAxis( EtVector3 &vOrig, EtVector3 &vDir, EtVector3 &vOffset )
|
|
{
|
|
if( m_pEnvi == NULL ) return -1;
|
|
SAABox Box;
|
|
float fDistX, fDistY, fDistZ;
|
|
|
|
|
|
CAxisRenderObject::m_nSelectAxis = -1;
|
|
|
|
EtVector3 vPos;
|
|
vPos = *m_pEnvi->GetPosition() + vOffset;
|
|
Box.Min.x = vPos.x;
|
|
Box.Min.y = vPos.y - ( CAxisRenderObject::s_fAxisRadius * m_fScale );
|
|
Box.Min.z = vPos.z - ( CAxisRenderObject::s_fAxisRadius * m_fScale );
|
|
Box.Max.x = Box.Min.x + ( CAxisRenderObject::s_fAxisLength * m_fScale );
|
|
Box.Max.y = Box.Min.y + ( CAxisRenderObject::s_fAxisRadius * 2.f * m_fScale );
|
|
Box.Max.z = Box.Min.z + ( CAxisRenderObject::s_fAxisRadius * 2.f * m_fScale );
|
|
|
|
if( TestLineToBox( vOrig, vDir, Box, fDistX ) == true ) CAxisRenderObject::m_nSelectAxis = 0;
|
|
|
|
Box.Min.x = vPos.x - ( CAxisRenderObject::s_fAxisRadius * m_fScale );
|
|
Box.Min.y = vPos.y;
|
|
Box.Min.z = vPos.z - ( CAxisRenderObject::s_fAxisRadius * m_fScale );
|
|
Box.Max.x = Box.Min.x + ( CAxisRenderObject::s_fAxisRadius * 2.f * m_fScale );
|
|
Box.Max.y = Box.Min.y + ( CAxisRenderObject::s_fAxisLength * m_fScale );
|
|
Box.Max.z = Box.Min.z + ( CAxisRenderObject::s_fAxisRadius * 2.f * m_fScale );
|
|
|
|
if( TestLineToBox( vOrig, vDir, Box, fDistY ) == true ) {
|
|
if( CAxisRenderObject::m_nSelectAxis == -1 ) CAxisRenderObject::m_nSelectAxis = 1;
|
|
else if( CAxisRenderObject::m_nSelectAxis == 0 && fDistY < fDistX )
|
|
CAxisRenderObject::m_nSelectAxis = 1;
|
|
}
|
|
|
|
Box.Min.x = vPos.x - ( CAxisRenderObject::s_fAxisRadius * m_fScale );
|
|
Box.Min.y = vPos.y - ( CAxisRenderObject::s_fAxisRadius * m_fScale );
|
|
Box.Min.z = vPos.z;
|
|
Box.Max.x = Box.Min.x + ( CAxisRenderObject::s_fAxisRadius * 2.f * m_fScale );
|
|
Box.Max.y = Box.Min.y + ( CAxisRenderObject::s_fAxisRadius * 2.f * m_fScale );
|
|
Box.Max.z = Box.Min.z + ( CAxisRenderObject::s_fAxisLength * m_fScale );
|
|
|
|
if( TestLineToBox( vOrig, vDir, Box, fDistZ ) == true ) {
|
|
if( CAxisRenderObject::m_nSelectAxis == -1 ) CAxisRenderObject::m_nSelectAxis = 2;
|
|
else if( CAxisRenderObject::m_nSelectAxis == 0 && fDistZ < fDistX ) CAxisRenderObject::m_nSelectAxis = 2;
|
|
else if( CAxisRenderObject::m_nSelectAxis == 1 && fDistZ < fDistY ) CAxisRenderObject::m_nSelectAxis = 2;
|
|
}
|
|
|
|
SSphere Sphere;
|
|
Sphere.Center = *m_pEnvi->GetPosition() + vOffset;
|
|
Sphere.fRadius = m_pEnvi->GetRange();
|
|
if( TestLineToSphere( vOrig, vDir, Sphere ) == true ) {
|
|
if( CAxisRenderObject::m_nSelectAxis == -1 ) CAxisRenderObject::m_nSelectAxis = 3;
|
|
}
|
|
|
|
if( CAxisRenderObject::m_nSelectAxis == -1 ) {
|
|
CGlobalValue::GetInstance().m_bControlAxis = false;
|
|
CGlobalValue::GetInstance().m_nSelectAxis = -1;
|
|
}
|
|
else {
|
|
CGlobalValue::GetInstance().m_bControlAxis = true;
|
|
CGlobalValue::GetInstance().m_nSelectAxis = CAxisRenderObject::m_nSelectAxis;
|
|
}
|
|
return CAxisRenderObject::m_nSelectAxis;
|
|
|
|
}
|
|
|
|
|
|
void CAxisLockRenderObject::MoveAxis( int nX, int nY )
|
|
{
|
|
if( !m_pEnvi ) return;
|
|
EtMatrix matView = *(*CRenderBase::GetInstance().GetLastUpdateCamera());
|
|
|
|
EtVector3 vVec, vAxis;
|
|
EtVector3 *pPos = m_pEnvi->GetPosition();
|
|
|
|
static float fSpeed = 5.f;
|
|
switch( CAxisRenderObject::m_nSelectAxis ) {
|
|
case 0:
|
|
vAxis = CRenderBase::GetInstance().GetLastUpdateCamera()->m_vXAxis;
|
|
*pPos += ( vAxis * (float)nX * fSpeed );
|
|
|
|
vAxis = CRenderBase::GetInstance().GetLastUpdateCamera()->m_vZAxis;
|
|
vAxis.y = 0.f;
|
|
EtVec3Normalize( &vAxis, &vAxis );
|
|
*pPos += ( vAxis * (float)-nY * fSpeed );
|
|
break;
|
|
case 1:
|
|
vAxis = EtVector3( 0.f, 1.f, 0.f );
|
|
*pPos += ( vAxis * (float)-nY * fSpeed );
|
|
break;
|
|
case 2:
|
|
vAxis = CRenderBase::GetInstance().GetLastUpdateCamera()->m_vXAxis;
|
|
*pPos += ( vAxis * (float)nX * fSpeed );
|
|
|
|
vAxis = CRenderBase::GetInstance().GetLastUpdateCamera()->m_vZAxis;
|
|
vAxis.y = 0.f;
|
|
EtVec3Normalize( &vAxis, &vAxis );
|
|
*pPos += ( vAxis * (float)-nY * fSpeed );
|
|
break;
|
|
case 3:
|
|
{
|
|
vAxis = CRenderBase::GetInstance().GetLastUpdateCamera()->m_vXAxis;
|
|
*pPos += ( vAxis * (float)nX * fSpeed );
|
|
|
|
vAxis = CRenderBase::GetInstance().GetLastUpdateCamera()->m_vYAxis;
|
|
*pPos += ( vAxis * (float)-nY * fSpeed );
|
|
}
|
|
break;
|
|
}
|
|
} |