Add quaternion commands to Actor. These are always additive.
This commit is contained in:
+33
-1
@@ -15,6 +15,7 @@
|
|||||||
#include "RageDisplay.h"
|
#include "RageDisplay.h"
|
||||||
#include "PrefsManager.h"
|
#include "PrefsManager.h"
|
||||||
#include "RageUtil.h"
|
#include "RageUtil.h"
|
||||||
|
#include "RageMath.h"
|
||||||
#include "GameConstantsAndTypes.h"
|
#include "GameConstantsAndTypes.h"
|
||||||
#include "RageLog.h"
|
#include "RageLog.h"
|
||||||
|
|
||||||
@@ -72,6 +73,7 @@ void Actor::BeginDraw() // set the world matrix and calculate actor properties
|
|||||||
m_temp = m_current;
|
m_temp = m_current;
|
||||||
|
|
||||||
|
|
||||||
|
/* XXX: recheck rotations in here (all in degrees?) */
|
||||||
//
|
//
|
||||||
// set temporary drawing properties based on Effects
|
// set temporary drawing properties based on Effects
|
||||||
//
|
//
|
||||||
@@ -164,13 +166,22 @@ void Actor::BeginDraw() // set the world matrix and calculate actor properties
|
|||||||
DISPLAY->Translate( m_temp.pos.x, m_temp.pos.y, m_temp.pos.z );
|
DISPLAY->Translate( m_temp.pos.x, m_temp.pos.y, m_temp.pos.z );
|
||||||
DISPLAY->Scale( m_temp.scale.x, m_temp.scale.y, m_temp.scale.z );
|
DISPLAY->Scale( m_temp.scale.x, m_temp.scale.y, m_temp.scale.z );
|
||||||
|
|
||||||
|
/* The only time rotation and quat should normally be used simultaneously
|
||||||
|
* is for m_baseRotation. */
|
||||||
if( m_temp.rotation.x != 0 )
|
if( m_temp.rotation.x != 0 )
|
||||||
DISPLAY->RotateX( m_temp.rotation.x );
|
DISPLAY->RotateX( m_temp.rotation.x );
|
||||||
if( m_temp.rotation.y != 0 )
|
if( m_temp.rotation.y != 0 )
|
||||||
DISPLAY->RotateY( m_temp.rotation.y );
|
DISPLAY->RotateY( m_temp.rotation.y );
|
||||||
if( m_temp.rotation.z != 0 )
|
if( m_temp.rotation.z != 0 )
|
||||||
DISPLAY->RotateZ( m_temp.rotation.z );
|
DISPLAY->RotateZ( m_temp.rotation.z );
|
||||||
|
|
||||||
|
if( m_temp.quat.x != 0 || m_temp.quat.y != 0 || m_temp.quat.z != 0 || m_temp.quat.w != 1 )
|
||||||
|
{
|
||||||
|
RageMatrix mat;
|
||||||
|
RageMatrixFromQuat( &mat, m_temp.quat );
|
||||||
|
|
||||||
|
DISPLAY->MultMatrix(mat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::EndDraw()
|
void Actor::EndDraw()
|
||||||
@@ -610,6 +621,21 @@ static CString GetParam( const CStringArray& sParams, int iIndex, int& iMaxIndex
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Actor::AddRotationH( float rot )
|
||||||
|
{
|
||||||
|
RageQuatMultiply( &DestTweenState().quat, DestTweenState().quat, RageQuatFromH(rot) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Actor::AddRotationP( float rot )
|
||||||
|
{
|
||||||
|
RageQuatMultiply( &DestTweenState().quat, DestTweenState().quat, RageQuatFromP(rot) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Actor::AddRotationR( float rot )
|
||||||
|
{
|
||||||
|
RageQuatMultiply( &DestTweenState().quat, DestTweenState().quat, RageQuatFromR(rot) );
|
||||||
|
}
|
||||||
|
|
||||||
void Actor::Command( CString sCommandString )
|
void Actor::Command( CString sCommandString )
|
||||||
{
|
{
|
||||||
// OPTIMIZATION OPPORTUNITY: sCommandString could be parsed more efficiently.
|
// OPTIMIZATION OPPORTUNITY: sCommandString could be parsed more efficiently.
|
||||||
@@ -664,6 +690,9 @@ void Actor::Command( CString sCommandString )
|
|||||||
else if( sName=="rotationx" ) SetRotationX( fParam(1) );
|
else if( sName=="rotationx" ) SetRotationX( fParam(1) );
|
||||||
else if( sName=="rotationy" ) SetRotationY( fParam(1) );
|
else if( sName=="rotationy" ) SetRotationY( fParam(1) );
|
||||||
else if( sName=="rotationz" ) SetRotationZ( fParam(1) );
|
else if( sName=="rotationz" ) SetRotationZ( fParam(1) );
|
||||||
|
else if( sName=="heading" ) AddRotationH( fParam(1) );
|
||||||
|
else if( sName=="pitch" ) AddRotationP( fParam(1) );
|
||||||
|
else if( sName=="roll" ) AddRotationR( fParam(1) );
|
||||||
else if( sName=="shadowlength" ) SetShadowLength( fParam(1) );
|
else if( sName=="shadowlength" ) SetShadowLength( fParam(1) );
|
||||||
else if( sName=="horizalign" ) SetHorizAlign( sParam(1) );
|
else if( sName=="horizalign" ) SetHorizAlign( sParam(1) );
|
||||||
else if( sName=="vertalign" ) SetVertAlign( sParam(1) );
|
else if( sName=="vertalign" ) SetVertAlign( sParam(1) );
|
||||||
@@ -731,6 +760,7 @@ void Actor::TweenState::Init()
|
|||||||
{
|
{
|
||||||
pos = RageVector3( 0, 0, 0 );
|
pos = RageVector3( 0, 0, 0 );
|
||||||
rotation = RageVector3( 0, 0, 0 );
|
rotation = RageVector3( 0, 0, 0 );
|
||||||
|
quat = RageVector4( 0, 0, 0, 1 );
|
||||||
scale = RageVector3( 1, 1, 1 );
|
scale = RageVector3( 1, 1, 1 );
|
||||||
for(int i=0; i<4; i++)
|
for(int i=0; i<4; i++)
|
||||||
diffuse[i] = RageColor( 1, 1, 1, 1 );
|
diffuse[i] = RageColor( 1, 1, 1, 1 );
|
||||||
@@ -742,6 +772,8 @@ void Actor::TweenState::MakeWeightedAverage( TweenState& average_out, const Twee
|
|||||||
average_out.pos = ts1.pos + (ts2.pos - ts1.pos )*fPercentBetween;
|
average_out.pos = ts1.pos + (ts2.pos - ts1.pos )*fPercentBetween;
|
||||||
average_out.scale = ts1.scale + (ts2.scale - ts1.scale )*fPercentBetween;
|
average_out.scale = ts1.scale + (ts2.scale - ts1.scale )*fPercentBetween;
|
||||||
average_out.rotation = ts1.rotation+ (ts2.rotation - ts1.rotation)*fPercentBetween;
|
average_out.rotation = ts1.rotation+ (ts2.rotation - ts1.rotation)*fPercentBetween;
|
||||||
|
RageQuatSlerp(&average_out.quat, ts1.quat, ts2.quat, fPercentBetween);
|
||||||
|
|
||||||
for(int i=0; i<4; i++)
|
for(int i=0; i<4; i++)
|
||||||
average_out.diffuse[i] = ts1.diffuse[i]+ (ts2.diffuse[i] - ts1.diffuse[i])*fPercentBetween;
|
average_out.diffuse[i] = ts1.diffuse[i]+ (ts2.diffuse[i] - ts1.diffuse[i])*fPercentBetween;
|
||||||
average_out.glow = ts1.glow + (ts2.glow - ts1.glow )*fPercentBetween;
|
average_out.glow = ts1.glow + (ts2.glow - ts1.glow )*fPercentBetween;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ public:
|
|||||||
// start and end position for tweening
|
// start and end position for tweening
|
||||||
RageVector3 pos;
|
RageVector3 pos;
|
||||||
RageVector3 rotation;
|
RageVector3 rotation;
|
||||||
|
RageVector4 quat;
|
||||||
RageVector3 scale;
|
RageVector3 scale;
|
||||||
RageColor diffuse[4];
|
RageColor diffuse[4];
|
||||||
RageColor glow;
|
RageColor glow;
|
||||||
@@ -113,6 +114,9 @@ public:
|
|||||||
virtual void SetRotationX( float rot ) { DestTweenState().rotation.x = rot; }
|
virtual void SetRotationX( float rot ) { DestTweenState().rotation.x = rot; }
|
||||||
virtual void SetRotationY( float rot ) { DestTweenState().rotation.y = rot; }
|
virtual void SetRotationY( float rot ) { DestTweenState().rotation.y = rot; }
|
||||||
virtual void SetRotationZ( float rot ) { DestTweenState().rotation.z = rot; }
|
virtual void SetRotationZ( float rot ) { DestTweenState().rotation.z = rot; }
|
||||||
|
virtual void AddRotationH( float rot );
|
||||||
|
virtual void AddRotationP( float rot );
|
||||||
|
virtual void AddRotationR( float rot );
|
||||||
|
|
||||||
virtual void SetDiffuse( RageColor c ) { for(int i=0; i<4; i++) DestTweenState().diffuse[i] = c; };
|
virtual void SetDiffuse( RageColor c ) { for(int i=0; i<4; i++) DestTweenState().diffuse[i] = c; };
|
||||||
virtual void SetDiffuses( int i, RageColor c ) { DestTweenState().diffuse[i] = c; };
|
virtual void SetDiffuses( int i, RageColor c ) { DestTweenState().diffuse[i] = c; };
|
||||||
|
|||||||
Reference in New Issue
Block a user