Files
firestorm/Gameleap/code/mw4/Code/MW4/AngleAxis.hpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
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.
2026-06-24 21:28:16 -05:00

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