📄 mtxlib.h
字号:
/* Copyright (C) Steven Woodcock, 2001.
* All rights reserved worldwide.
*
* This software is provided "as is" without express or implied
* warranties. You may freely copy and compile this source into
* applications you distribute provided that the copyright text
* below is included in the resulting source code, for example:
* "Portions Copyright (C) Steven Woodcock, 2001"
*/
//==========================================================
// C++ Matrix Library
// Version: 2.5
// Date: April 22, 2000
// Authors: Dante Treglia II and Mark A. DeLoura
// Thanks to: Miguel Gomez, Stan Melax, Pete Isensee,
// Gabor Nagy, Scott Bilas, James Boer, Eric Lengyel
//==========================================================
#ifndef _MTXLIB_H
#define _MTXLIB_H
#include "stdio.h"
static inline float DegToRad(float a) { return a*0.01745329252f; };
static inline float RadToDeg(float a) { return a*57.29577951f; };
class vector2;
class vector3;
class vector4;
class matrix33;
class matrix44;
////////////////////////////////////////////////////////////
// vector2 class
//
class vector2
{
public:
// Members
float x, y;
public:
// Constructors
// vector2(): x(0), y(0) {};
vector2() {};
vector2(float inX, float inY);
vector2(const vector2 &v);
public:
// Operators
float &operator [] (unsigned int index);
const float &operator [] (unsigned int index) const;
vector2 &operator = (const vector2 &v);
vector2 &operator += (const vector2 &v);
vector2 &operator -= (const vector2 &v);
vector2 &operator *= (float f);
vector2 &operator /= (float f);
friend bool operator == (const vector2 &a, const vector2 &b);
friend bool operator != (const vector2 &a, const vector2 &b);
friend vector2 operator - (const vector2 &a);
friend vector2 operator + (const vector2 &a, const vector2 &b);
friend vector2 operator - (const vector2 &a, const vector2 &b);
friend vector2 operator * (const vector2 &v, float f);
friend vector2 operator * (float f, const vector2 &v);
friend vector2 operator / (const vector2 &v, float f);
//operator float*() {return &x;};
public:
// Methods
void set(float xIn, float yIn);
float length() const;
float lengthSqr() const;
bool isZero() const;
vector2 &normalize();
// Debug
void fprint(FILE* file, char* str) const;
};
////////////////////////////////////////////////////////////
// vector3 class
//
class vector3
{
public:
// Members
float x, y, z;
public:
// Constructors
// vector3(): x(0), y(0), z(0) {};
vector3() {};
vector3(float inX, float inY, float inZ);
vector3(const vector3 &v);
explicit vector3(const vector2 &v);
explicit vector3(const vector4 &v);
public:
// Operators
float &operator [] (unsigned int index);
const float &operator [] (unsigned int index) const;
vector3 &operator = (const vector3 &v);
vector3 &operator = (const vector2 &v);
vector3 &operator += (const vector3 &v);
vector3 &operator -= (const vector3 &v);
vector3 &operator *= (float f);
vector3 &operator /= (float f);
friend bool operator == (const vector3 &a, const vector3 &b);
friend bool operator != (const vector3 &a, const vector3 &b);
friend vector3 operator - (const vector3 &a);
friend vector3 operator + (const vector3 &a, const vector3 &b);
friend vector3 operator - (const vector3 &a, const vector3 &b);
friend vector3 operator * (const vector3 &v, float f);
friend vector3 operator * (float f, const vector3 &v);
friend vector3 operator / (const vector3 &v, float f);
//operator float*() {return &x;};
public:
// Methods
void set(float xIn, float yIn, float zIn);
float length() const;
float lengthSqr() const;
bool isZero() const;
vector3 &normalize();
// Debug
void fprint(FILE* file, char* str) const;
};
////////////////////////////////////////////////////////////
// vector4 class
//
class vector4
{
public:
// Members
float x, y, z, w;
public:
// Constructors
// vector4(): x(0), y(0), z(0), w(0) {};
vector4() {};
vector4(float inX, float inY, float inZ, float inW);
vector4(const vector4 &v);
explicit vector4(const vector3 &v);
explicit vector4(const vector2 &v);
public:
// Operators
float &operator [] (unsigned int index);
const float &operator [] (unsigned int index) const;
vector4 &operator = (const vector4 &v);
vector4 &operator = (const vector3 &v);
vector4 &operator = (const vector2 &v);
vector4 &operator += (const vector4 &v);
vector4 &operator -= (const vector4 &v);
vector4 &operator *= (float f);
vector4 &operator /= (float f);
friend bool operator == (const vector4 &a, const vector4 &b);
friend bool operator != (const vector4 &a, const vector4 &b);
friend vector4 operator - (const vector4 &a);
friend vector4 operator + (const vector4 &a, const vector4 &b);
friend vector4 operator - (const vector4 &a, const vector4 &b);
friend vector4 operator * (const vector4 &v, float f);
friend vector4 operator * (float f, const vector4 &v);
friend vector4 operator / (const vector4 &v, float f);
//operator float*() {return &x;};
public:
// Methods
void set(float xIn, float yIn, float zIn, float wIn);
float length() const;
float lengthSqr() const;
bool isZero() const;
vector4 &normalize();
// Debug
void fprint(FILE* file, char* str) const;
};
////////////////////////////////////////////////////////////
// Miscellaneous vector functions
//
vector2 Normalized(const vector2 &a);
vector3 Normalized(const vector3 &a);
vector4 Normalized(const vector4 &a);
float DotProduct(const vector2 &a, const vector2 &b);
float DotProduct(const vector3 &a, const vector3 &b);
float DotProduct(const vector4 &a, const vector4 &b);
void SwapVec(vector2 &a, vector2 &b);
void SwapVec(vector3 &a, vector3 &b);
void SwapVec(vector4 &a, vector4 &b);
vector3 CrossProduct(const vector3 &a, const vector3 &b);
bool NearlyEquals(const vector2 &a, const vector2 &b, float r);
bool NearlyEquals(const vector3 &a, const vector3 &b, float r);
bool NearlyEquals(const vector4 &a, const vector4 &b, float r);
////////////////////////////////////////////////////////////
// matrix33 class
//
class matrix33
{
public:
// Members
vector3 col[3];
public:
// Constructors
matrix33() {};
matrix33(float v);
matrix33(const matrix33 &m);
matrix33(const vector3 &v0, const vector3 &v1, const vector3 &v2);
public:
// Operators
vector3 &operator [] (unsigned int i);
const vector3 &operator [] (unsigned int i) const;
matrix33 &operator = (const matrix33 &m);
matrix33 &operator += (const matrix33 &m);
matrix33 &operator -= (const matrix33 &m);
matrix33 &operator *= (const matrix33 &m);
matrix33 &operator *= (float f);
matrix33 &operator /= (float f);
friend bool operator == (const matrix33 &a, const matrix33 &b);
friend bool operator != (const matrix33 &a, const matrix33 &b);
friend matrix33 operator + (const matrix33 &a, const matrix33 &b);
friend matrix33 operator - (const matrix33 &a, const matrix33 &b);
friend matrix33 operator * (const matrix33 &a, const matrix33 &b);
friend vector3 operator * (const matrix33 &m, const vector3 &v);
friend vector3 operator * (const vector3 &v, const matrix33 &m);
friend matrix33 operator * (const matrix33 &m, float f);
friend matrix33 operator * (float f, const matrix33 &m);
friend matrix33 operator / (const matrix33 &m, float f);
//operator float*() {return (float*)col[0]; };
public:
// Methods
matrix33 &identity();
matrix33 &transpose();
matrix33 &invert();
// Debug
void fprint(FILE* file, char* str) const;
};
matrix33 IdentityMatrix33();
matrix33 TransposeMatrix33(const matrix33 &m);
matrix33 InvertMatrix33(const matrix33 &m);
matrix33 RotateRadMatrix33(float rad);
matrix33 TranslateMatrix33(float x, float y);
matrix33 ScaleMatrix33(float x, float y, float z = 1.0);
////////////////////////////////////////////////////////////
// matrix44 class
//
class matrix44
{
public:
// Members
vector4 col[4];
public:
// Constructors
matrix44() {};
matrix44(float v);
matrix44(const matrix44 &m);
matrix44(const vector4 &v0, const vector4 &v1,
const vector4 &v2, const vector4 &v3);
explicit matrix44(const matrix33 &m);
public:
// Operators
vector4 &operator [] (unsigned int i);
const vector4 &operator [] (unsigned int i) const;
matrix44 &operator = (const matrix44 &m);
matrix44 &operator = (const matrix33 &m);
matrix44 &operator += (const matrix44 &m);
matrix44 &operator -= (const matrix44 &m);
matrix44 &operator *= (const matrix44 &m);
matrix44 &operator *= (float f);
matrix44 &operator /= (float f);
friend bool operator == (const matrix44 &a, const matrix44 &b);
friend bool operator != (const matrix44 &a, const matrix44 &b);
friend matrix44 operator + (const matrix44 &a, const matrix44 &b);
friend matrix44 operator - (const matrix44 &a, const matrix44 &b);
friend matrix44 operator * (const matrix44 &a, const matrix44 &b);
friend vector3 operator * (const matrix44 &m, const vector3 &v);
friend vector3 operator * (const vector3 &v, const matrix44 &m);
friend vector4 operator * (const matrix44 &m, const vector4 &v);
friend vector4 operator * (const vector4 &v, const matrix44 &m);
friend matrix44 operator * (const matrix44 &m, float f);
friend matrix44 operator * (float f, const matrix44 &m);
friend matrix44 operator / (const matrix44 &m, float f);
//operator float*() {return (float*)col[0]; };
public:
// Methods
matrix44 &identity();
matrix44 &transpose();
matrix44 &invert();
// Debug
void fprint(FILE* file, char* str) const;
};
matrix44 IdentityMatrix44();
matrix44 TransposeMatrix44(const matrix44 &m);
matrix44 InvertMatrix44(const matrix44 &m);
matrix44 RotateRadMatrix44(char axis, float rad);
matrix44 RotateRadMatrix44(const vector3 &axis, float rad);
matrix44 TranslateMatrix44(float x, float y, float z);
matrix44 ScaleMatrix44(float x, float y, float z, float w = 1.0);
matrix44 LookAtMatrix44(const vector3 &camPos, const vector3 &camUp,
const vector3 &target );
matrix44 FrustumMatrix44(float l, float r, float b, float t,
float n, float f);
matrix44 PerspectiveMatrix44(float fovY, float aspect,
float n, float f);
matrix44 OrthoMatrix44(float l, float r, float b, float t,
float n, float f);
matrix44 OrthoNormalMatrix44(const vector3 &xdir,
const vector3 &ydir, const vector3 &zdir);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -