DragonNest/GameCommon/MAStaticLookMovement.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

120 lines
3.2 KiB
C++

#include "Stdafx.h"
#include "MAStaticLookMovement.h"
#include "DnActor.h"
MAStaticLookMovement::MAStaticLookMovement()
:MAStaticMovement()
,m_vTargetLookVec( 0.f, 0.f )
,m_LastLookTargetTime(0)
{
}
void MAStaticLookMovement::Look( EtVector2 &vVec, bool bForceRotate )
{
if( bForceRotate ) {
if( EtVec2LengthSq( &vVec ) > 0.f ) {
m_pMatExWorld->m_vZAxis = EtVector3( vVec.x, 0.f, vVec.y );
EtVec3Normalize( &m_pMatExWorld->m_vZAxis, &m_pMatExWorld->m_vZAxis );
m_pMatExWorld->MakeUpCartesianByZAxis();
}
m_vTargetLookVec = EtVector2( 0.f, 0.f );
}
else {
m_vTargetLookVec = vVec;
}
}
EtVector3 *MAStaticLookMovement::GetLookDir()
{
return &m_pMatExWorld->m_vZAxis;
}
void MAStaticLookMovement::LookTarget( DnActorHandle &hActor )
{
m_hLookTarget = hActor;
if ( m_hLookTarget )
{
OnBeginLook();
}
else
{
OnEndLook();
}
}
void MAStaticLookMovement::ResetLook()
{
m_hLookTarget.Identity();
m_vTargetLookVec = EtVector2( 0.f, 0.f );
}
DnActorHandle MAStaticLookMovement::GetLookTarget()
{
return m_hLookTarget;
}
void MAStaticLookMovement::Process( LOCAL_TIME LocalTime, float fDelta )
{
m_pActor->SetPrevPosition( m_pMatExWorld->m_vPosition );
EtVector3 *vDist = m_pActor->GetAniDistance();
m_pMatExWorld->m_vPosition += m_pMatExWorld->m_vXAxis * vDist->x;
m_pMatExWorld->m_vPosition += m_pMatExWorld->m_vYAxis * vDist->y;
m_pMatExWorld->m_vPosition += m_pMatExWorld->m_vZAxis * vDist->z;
m_pActor->SetStaticPosition( m_pMatExWorld->m_vPosition );
// Look ó¸®
if( m_hLookTarget ) {
EtVector2 vLook;
vLook.x = m_hLookTarget->GetPosition()->x - m_pMatExWorld->m_vPosition.x;
vLook.y = m_hLookTarget->GetPosition()->z - m_pMatExWorld->m_vPosition.z;
if( EtVec2LengthSq( &vLook ) > 0.f ) {
EtVec2Normalize( &vLook, &vLook );
float fDot = EtVec2Dot( &vLook, &EtVec3toVec2( m_pMatExWorld->m_vZAxis ) );
if( fDot >= 1.f ) fDot = 1.f;
float fAngle = EtToDegree( EtAcos( fDot ) );
bool bForceLook = true;
if( fAngle > m_pActor->GetRotateAngleSpeed() * fDelta ) bForceLook = false;
m_pActor->Look( vLook, bForceLook );
if ( bForceLook )
{
OnEndLook();
}
m_LastLookTargetTime = LocalTime;
}
}
// Look ó¸®
if( EtVec2LengthSq( &m_vTargetLookVec ) > 0.f ) {
float fDot = D3DXVec2Dot( &m_vTargetLookVec, &EtVec3toVec2( m_pMatExWorld->m_vZAxis ) );
if( fDot >= 1.f ) fDot = 1.f;
float fAngle = EtToDegree( EtAcos(fDot) );
float fAngleSpeed = m_pActor->GetRotateAngleSpeed() * fDelta;
if( fAngle > fAngleSpeed ) {
EtVector3 vCrossVec;
D3DXVec3Cross( &vCrossVec, &EtVec2toVec3( m_vTargetLookVec ), &m_pMatExWorld->m_vZAxis );
if( vCrossVec.y > 0.f )
m_pMatExWorld->RotateYaw( fAngleSpeed );
else m_pMatExWorld->RotateYaw( -fAngleSpeed );
fDot = D3DXVec2Dot( &m_vTargetLookVec, &EtVec3toVec2( m_pMatExWorld->m_vZAxis ) );
if( fDot >= 1.f ) fDot = 1.f;
fAngle = EtToDegree( EtAcos(fDot) );
if( fAngle <= fAngleSpeed ) {
m_pMatExWorld->m_vZAxis = EtVec2toVec3( m_vTargetLookVec );
m_pMatExWorld->MakeUpCartesianByZAxis();
m_vTargetLookVec = EtVector2( 0.f, 0.f );
}
}
else {
m_pMatExWorld->m_vZAxis = EtVec2toVec3( m_vTargetLookVec );
m_pMatExWorld->MakeUpCartesianByZAxis();
m_vTargetLookVec = EtVector2( 0.f, 0.f );
}
}
}