Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
150 lines
3.7 KiB
C++
150 lines
3.7 KiB
C++
//===========================================================================//
|
|
// File: AngleAxis.hpp
|
|
// Project: MechWarrior 4
|
|
// Contents:
|
|
// AngleAxis class for animation. This is just an unlimited rotation
|
|
// quaternion
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 07/01/98 JSE Initial coding,
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Fasa Interactive, Inc.
|
|
// All Rights reserved worldwide
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL
|
|
//===========================================================================//
|
|
|
|
#pragma once
|
|
|
|
#include "MW4AnimationSystem.hpp"
|
|
|
|
namespace MW4Animation {class AngleAxis;}
|
|
|
|
#if !defined(Spew)
|
|
void
|
|
Spew(
|
|
const char* group,
|
|
const MW4Animation::AngleAxis &angle
|
|
);
|
|
#endif
|
|
|
|
namespace MW4Animation {
|
|
|
|
//===========================================================================//
|
|
// This is my angleaxis routines
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AngleAxis ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
//##########################################################################
|
|
//######################### AnglelAxis ###############################
|
|
//##########################################################################
|
|
// This class is like a quaternion, except that it stores rotations over
|
|
// PI
|
|
|
|
class AngleAxis {
|
|
public:
|
|
Stuff::UnitVector3D axis;
|
|
Stuff::Scalar angle;
|
|
|
|
AngleAxis() {}
|
|
AngleAxis(const Stuff::UnitVector3D& axis,Stuff::Scalar angle)
|
|
{this->axis=axis;this->angle=angle;}
|
|
|
|
AngleAxis&
|
|
operator=(const AngleAxis &ang)
|
|
{
|
|
Check_Pointer(this); Check_Pointer(&ang);
|
|
axis = ang.axis; angle = ang.angle; return *this;
|
|
}
|
|
|
|
AngleAxis&
|
|
operator=(const Stuff::UnitQuaternion &quat)
|
|
{
|
|
Stuff::Scalar omega,s;
|
|
Stuff::UnitQuaternion qn = quat;
|
|
qn.Normalize();
|
|
omega = (Stuff::Scalar)acos(qn.w);
|
|
angle = 2.0f*omega;
|
|
s = (Stuff::Scalar)sin(omega);
|
|
if (!Stuff::Small_Enough(s))
|
|
{
|
|
axis.x = qn.x/s;
|
|
axis.y = qn.x/s;
|
|
axis.z = qn.x/s;
|
|
}
|
|
else
|
|
{
|
|
axis = Stuff::Point3D(0.0f,0.0f,0.0f);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
|
|
static
|
|
Stuff::UnitQuaternion
|
|
AngleAxisToQuaternion(AngleAxis& angl)
|
|
{
|
|
Stuff::UnitQuaternion q;
|
|
Stuff::Scalar omega,s;
|
|
omega = angl.angle*0.5f;
|
|
s = (Stuff::Scalar)sin(omega);
|
|
q.x = s*angl.axis.x;
|
|
q.y = s*angl.axis.y;
|
|
q.z = s*angl.axis.z;
|
|
q.w = (Stuff::Scalar)cos(omega);
|
|
return q;
|
|
}
|
|
|
|
int GetNumRevs()
|
|
{return int(angle/Stuff::Two_Pi);}
|
|
|
|
void SetNumRevs(int num)
|
|
{angle += Stuff::Scalar(num)*Stuff::Two_Pi;}
|
|
|
|
void MakeLessThan180()
|
|
{
|
|
Stuff::Scalar temp_ang;
|
|
MakeAngPos();
|
|
temp_ang = angle;
|
|
while (temp_ang > Stuff::Two_Pi)
|
|
{
|
|
temp_ang -= Stuff::Two_Pi;
|
|
}
|
|
|
|
if (fabs(temp_ang) > Stuff::Pi)
|
|
{
|
|
temp_ang -= Stuff::Two_Pi;
|
|
}
|
|
angle = temp_ang;
|
|
MakeAngPos();
|
|
|
|
}
|
|
|
|
void MakeAngPos()
|
|
{
|
|
if (angle < 0.0f)
|
|
{
|
|
angle = -angle;
|
|
axis.x = -axis.x;
|
|
axis.y = -axis.y;
|
|
axis.z = -axis.z;
|
|
}
|
|
}
|
|
|
|
#if !defined(Spew)
|
|
friend void
|
|
::Spew(
|
|
const char* group,
|
|
const AngleAxis& angles
|
|
)
|
|
{
|
|
SPEW((group, "<+"));
|
|
Spew(group, angles.axis);
|
|
SPEW((group, "><%f>+", angles.angle));
|
|
}
|
|
#endif
|
|
};
|
|
}
|
|
|