Files
TeslaRel410/CODE/RP/MUNGA/MATRIX.HPP
T
CydandClaude Fable 5 fdd9ac9d97 Initial import: Tesla Release 4.10 (Tesla:BattleTech & Tesla:Red Planet)
Archival snapshot of the Virtual World Entertainment Tesla cockpit
software, 1994-1996: MUNGA engine and L4 pod layer source (Borland
C++ 5.0), BT/RP game code, and game content (models, audio, maps,
gauges, Division renderer data). Includes third-party libraries:
Division dVS/DPL graphics, HMI SOS audio, WATTCP networking.

Files are preserved byte-for-byte (.gitattributes disables all
line-ending conversion). README.md documents the layout, target
hardware, and toolchain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:21:58 -05:00

262 lines
6.1 KiB
C++

//===========================================================================//
// File: matrix.hh //
// Project: MUNGA Brick: Math Library //
// Contents: Interface specification for the matrix class //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 11/21/94 JMA Initial coding. //
// 12/01/94 JMA Changed Matrix to Matrix4x4, based both matrix classes on //
// Matrix44Base //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#if !defined(MATRIX_HPP)
# define MATRIX_HPP
# if !defined(SCALAR_HPP)
# include <scalar.hpp>
# endif
class AffineMatrix;
class TransposedMatrix;
class Origin;
class Hinge;
class EulerAngles;
class YawPitchRoll;
class Point3D;
class Quaternion;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ AbstractMatrix4x4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class AbstractMatrix4x4
{
public:
Scalar
entries[16];
#if defined(USE_SIGNATURE)
friend int
Is_Signature_Bad(const volatile AbstractMatrix4x4 *);
#endif
AbstractMatrix4x4&
operator=(const AbstractMatrix4x4& m);
Logical
TestInstance() const;
protected:
AbstractMatrix4x4()
{}
AbstractMatrix4x4&
Transpose(const AbstractMatrix4x4 &m);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Matrix4x4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Matrix4x4:
public AbstractMatrix4x4
{
public:
static const Matrix4x4
Identity;
//
// Constructors
//
Matrix4x4()
{}
Matrix4x4&
BuildIdentity();
Matrix4x4(int)
{BuildIdentity();}
//
// Assignment operators
//
Matrix4x4&
operator=(const Matrix4x4 &m)
{
Check_Pointer(this); Check(&m);
AbstractMatrix4x4::operator=(m); return *this;
}
Matrix4x4&
operator=(const TransposedMatrix &m);
Matrix4x4&
operator=(const AffineMatrix &m);
Matrix4x4&
operator=(const Origin &p);
Matrix4x4&
operator=(const Hinge &hinge);
Matrix4x4&
operator=(const EulerAngles &angles);
Matrix4x4&
operator=(const YawPitchRoll &angles);
Matrix4x4&
BuildRotation(const Quaternion &q);
Matrix4x4&
operator=(const Quaternion &q);
Matrix4x4&
BuildTranslation(const Point3D &p);
Matrix4x4&
operator=(const Point3D &p);
//
// Index operators
// Note that Matrix4x4 is stored in row major format, not column major,
// although they are indexed the same
//
Scalar&
operator ()(size_t Row,size_t Column)
{
Check_Pointer(this); Warn(Row>3); Warn(Column>3);
return entries[(Row<<2)+Column];
}
const Scalar&
operator ()(size_t Row,size_t Column) const
{
Check_Pointer(this); Warn(Row>3); Warn(Column>3);
return entries[(Row<<2)+Column];
}
//
// Matrix4x4 Multiplication
//
Matrix4x4&
Multiply(
const Matrix4x4& Source1,
const Matrix4x4& Source2
);
Matrix4x4&
operator *=(const Matrix4x4& m)
{Matrix4x4 temp(*this); return Multiply(temp,m);}
Matrix4x4&
Multiply(
const Matrix4x4& Source1,
const AffineMatrix &Source2
);
Matrix4x4&
operator *=(const AffineMatrix& m)
{Matrix4x4 temp(*this); return Multiply(temp,m);}
Matrix4x4&
Multiply(
const AffineMatrix &Source1,
const Matrix4x4& Source2
);
Matrix4x4&
Multiply(
const AffineMatrix &Source1,
const AffineMatrix &Source2
);
//
// Matrix4x4 Inversion
//
#if 0
Matrix4x4&
Invert(const Matrix4x4& Source);
Matrix4x4&
Invert()
{Matrix4x4 src(*this); return Invert(src);}
#endif
//
// Viewpoint Calculation
//
Matrix4x4&
SetToProjection(
Scalar Z_Plane,
Scalar Inv_Q,
Scalar Dx,
Scalar Dy,
Scalar Dz
);
Matrix4x4&
SetToPerspectiveProjection(Scalar Distance)
{
Verify(Distance != 0.0);
return SetToProjection(0.0,1.0/Distance,0.0,0.0,-1.0);
}
Matrix4x4&
SetToOrthogonalProjection()
{return SetToProjection(0.0,0.0,0.0,0.0,-1.0);}
friend ostream&
operator <<(
ostream& stream,
const Matrix4x4& Matrix4x4
);
static Logical
TestClass();
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Matrix4x4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class TransposedMatrix:
public AbstractMatrix4x4
{
public:
//
// Constructors
//
TransposedMatrix()
{}
//
// Assignment operators
//
TransposedMatrix&
operator=(const Matrix4x4 &m)
{
Check_Pointer(this); Check(&m);
AbstractMatrix4x4::Transpose(m); return *this;
}
TransposedMatrix&
operator=(const TransposedMatrix &m)
{
Check_Pointer(this); Check(&m);
AbstractMatrix4x4::operator=(m); return *this;
}
TransposedMatrix&
operator=(const AffineMatrix &m);
//
// Index operators
//
Scalar&
operator ()(size_t Row,size_t Column)
{
Check_Pointer(this); Warn(Row>3); Warn(Column>3);
return entries[(Column<<2)+Row];
}
const Scalar&
operator ()(size_t Row,size_t Column) const
{
Check_Pointer(this); Warn(Row>3); Warn(Column>3);
return entries[(Column<<2)+Row];
}
//
// Support Functions
//
friend ostream&
operator <<(
ostream& stream,
const TransposedMatrix& Matrix4x4
);
};
inline Matrix4x4&
Matrix4x4::operator=(const TransposedMatrix &m)
{
Check_Pointer(this); Check(&m);
AbstractMatrix4x4::Transpose(m); return *this;
}
#endif