2009-05-25 12:28:16 +00:00
|
|
|
#ifndef GRAPHICS_TINYGL_ZMATH_H
|
|
|
|
#define GRAPHICS_TINYGL_ZMATH_H
|
2005-01-12 15:20:02 +00:00
|
|
|
|
2009-05-25 13:19:29 +00:00
|
|
|
namespace TinyGL {
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
#define X _v[0]
|
|
|
|
#define Y _v[1]
|
|
|
|
#define Z _v[2]
|
|
|
|
#define W _v[3]
|
|
|
|
|
2006-05-16 14:52:36 +00:00
|
|
|
// Matrix & Vertex
|
2014-05-28 17:46:33 +01:00
|
|
|
class Vector3 {
|
2014-05-23 15:38:18 +01:00
|
|
|
public:
|
2014-06-07 00:55:08 +02:00
|
|
|
Vector3() { }
|
2014-05-23 15:38:18 +01:00
|
|
|
Vector3(float x, float y, float z);
|
2014-06-04 20:33:47 +02:00
|
|
|
|
2014-05-28 17:46:33 +01:00
|
|
|
void normalize();
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
float getLength() const { return sqrt(_v[0] * _v[0] + _v[1] * _v[1] + _v[2] * _v[2]); }
|
2014-05-28 19:27:00 +01:00
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
static float dot(const Vector3 &a, const Vector3 &b) {
|
2014-06-04 20:33:47 +02:00
|
|
|
return a._v[0] * b._v[0] + a._v[1] * b._v[1] + a._v[2] * b._v[2];
|
2014-05-28 19:27:00 +01:00
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
bool operator==(const Vector3 &other) const {
|
2014-05-28 19:27:00 +01:00
|
|
|
return _v[0] == other._v[0] && _v[1] == other._v[1] && _v[2] == other._v[2];
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
bool operator!=(const Vector3 &other) const {
|
2014-05-28 19:27:00 +01:00
|
|
|
return _v[0] != other._v[0] || _v[1] != other._v[1] || _v[2] != other._v[2];
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector3 operator-() const {
|
2014-05-28 19:27:00 +01:00
|
|
|
return Vector3(-_v[0],-_v[1],-_v[2]);
|
2014-05-28 17:46:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Vector3 operator*(float factor) const {
|
|
|
|
return Vector3(_v[0] * factor, _v[1] * factor, _v[2] * factor);
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector3 operator+(const Vector3 &other) const {
|
|
|
|
return Vector3(_v[0] + other._v[0], _v[1] + other._v[1], _v[2] + other._v[2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector3 operator-(const Vector3 &other) const {
|
|
|
|
return Vector3(_v[0] - other._v[0], _v[1] - other._v[1], _v[2] - other._v[2]);
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector3 &operator*=(float factor) {
|
2014-05-28 17:46:33 +01:00
|
|
|
_v[0] *= factor;
|
|
|
|
_v[1] *= factor;
|
|
|
|
_v[2] *= factor;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector3 &operator+=(float value) {
|
2014-05-28 19:27:00 +01:00
|
|
|
_v[0] += value;
|
|
|
|
_v[1] += value;
|
|
|
|
_v[2] += value;
|
2014-05-28 17:46:33 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector3 &operator-=(float value) {
|
2014-05-28 19:27:00 +01:00
|
|
|
_v[0] -= value;
|
|
|
|
_v[1] -= value;
|
|
|
|
_v[2] -= value;
|
2014-05-28 17:46:33 +01:00
|
|
|
return *this;
|
|
|
|
}
|
2014-06-07 00:55:08 +02:00
|
|
|
|
2014-05-28 17:46:33 +01:00
|
|
|
float _v[3];
|
2014-05-23 15:38:18 +01:00
|
|
|
};
|
|
|
|
|
2014-05-28 17:46:33 +01:00
|
|
|
class Vector4 {
|
2014-05-23 15:38:18 +01:00
|
|
|
public:
|
2014-06-07 00:55:08 +02:00
|
|
|
Vector4() { }
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector4(const Vector3 &vec, float w);
|
2014-05-23 15:38:18 +01:00
|
|
|
Vector4(float x, float y, float z, float w);
|
2014-06-04 20:33:47 +02:00
|
|
|
|
|
|
|
bool operator==(const Vector4 &other) const {
|
2014-05-28 19:27:00 +01:00
|
|
|
return _v[0] == other._v[0] && _v[1] == other._v[1] && _v[2] == other._v[2] && _v[3] == other._v[3];
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
bool operator!=(const Vector4 &other) const {
|
2014-05-28 19:27:00 +01:00
|
|
|
return _v[0] != other._v[0] || _v[1] != other._v[1] || _v[2] != other._v[2] || _v[3] != other._v[3];
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector4 operator-() const {
|
2014-05-28 19:27:00 +01:00
|
|
|
return Vector4(-_v[0],-_v[1],-_v[2],-_v[3]);
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector4 operator*(float factor) const {
|
|
|
|
return Vector4(_v[0] * factor, _v[1] * factor, _v[2] * factor,_v[3] * factor);
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector4 operator+(const Vector4 &other) const {
|
|
|
|
return Vector4(_v[0] + other._v[0], _v[1] + other._v[1], _v[2] + other._v[2], _v[3] + other._v[3]);
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector4 operator-(const Vector4 &other) const {
|
|
|
|
return Vector4(_v[0] - other._v[0], _v[1] - other._v[1], _v[2] - other._v[2], _v[3] - other._v[3]);
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector4 &operator*=(float factor) {
|
2014-05-28 19:27:00 +01:00
|
|
|
_v[0] *= factor;
|
|
|
|
_v[1] *= factor;
|
|
|
|
_v[2] *= factor;
|
|
|
|
_v[3] *= factor;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector4 &operator+=(float value) {
|
2014-05-28 19:27:00 +01:00
|
|
|
_v[0] += value;
|
|
|
|
_v[1] += value;
|
|
|
|
_v[2] += value;
|
|
|
|
_v[3] += value;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2014-06-04 20:33:47 +02:00
|
|
|
Vector4 &operator-=(float value) {
|
2014-05-28 19:27:00 +01:00
|
|
|
_v[0] -= value;
|
|
|
|
_v[1] -= value;
|
|
|
|
_v[2] -= value;
|
|
|
|
_v[3] -= value;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2014-05-28 17:46:33 +01:00
|
|
|
float _v[4];
|
2014-05-23 15:38:18 +01:00
|
|
|
};
|
|
|
|
|
2014-05-28 17:46:33 +01:00
|
|
|
class Matrix4 {
|
2014-05-23 15:38:18 +01:00
|
|
|
public:
|
2014-06-07 00:55:08 +02:00
|
|
|
Matrix4() { }
|
2014-05-28 17:46:33 +01:00
|
|
|
|
|
|
|
bool IsIdentity() const;
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
inline Matrix4 operator+(const Matrix4 &b) const {
|
2014-05-28 17:46:33 +01:00
|
|
|
Matrix4 result;
|
2014-06-04 20:33:47 +02:00
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
for (int j = 0; j < 4; j++) {
|
2014-06-07 21:32:42 +02:00
|
|
|
result._m[i][j] = _m[i][j] + b._m[i][j];
|
2014-05-28 17:46:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
inline Matrix4 operator-(const Matrix4 &b) const {
|
2014-05-28 17:46:33 +01:00
|
|
|
Matrix4 result;
|
2014-06-04 20:33:47 +02:00
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
for (int j = 0; j < 4; j++) {
|
2014-06-07 21:32:42 +02:00
|
|
|
result._m[i][j] = _m[i][j] - b._m[i][j];
|
2014-05-28 17:46:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
inline Matrix4 operator*(const Matrix4 &b) const {
|
2014-05-28 17:46:33 +01:00
|
|
|
Matrix4 result;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
for (int j = 0; j < 4; j++) {
|
2014-06-07 00:55:08 +02:00
|
|
|
float s = 0.0;
|
2014-05-28 17:46:33 +01:00
|
|
|
for (int k = 0; k < 4; k++)
|
2014-06-07 21:32:42 +02:00
|
|
|
s += _m[i][k] * b._m[k][j];
|
|
|
|
result._m[i][j] = s;
|
2014-05-28 17:46:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
2014-05-23 15:38:18 +01:00
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
inline Matrix4 &operator*=(const Matrix4 &b) {
|
|
|
|
Matrix4 a = *this;
|
|
|
|
float s;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
|
s = 0.0;
|
|
|
|
for (int k = 0; k < 4; k++)
|
2014-06-07 21:32:42 +02:00
|
|
|
s += a._m[i][k] * b._m[k][j];
|
|
|
|
this->_m[i][j] = s;
|
2014-06-07 00:55:08 +02:00
|
|
|
}
|
|
|
|
}
|
2014-06-02 01:01:26 +01:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2014-06-07 21:32:42 +02:00
|
|
|
void scale(float x, float y, float z);
|
|
|
|
void translate(float x, float y, float z);
|
2014-06-08 15:20:27 +02:00
|
|
|
void identity();
|
|
|
|
void rotation(float t, int);
|
2014-06-07 21:32:42 +02:00
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
void invert();
|
|
|
|
void transpose();
|
|
|
|
|
2014-05-23 15:38:18 +01:00
|
|
|
Matrix4 transpose() const;
|
|
|
|
Matrix4 inverseOrtho() const;
|
|
|
|
Matrix4 inverse() const;
|
|
|
|
|
2014-06-07 21:32:42 +02:00
|
|
|
static Matrix4 frustrum(float left, float right, float bottom, float top, float nearp, float farp);
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
inline Vector3 transform(const Vector3 &vector) const {
|
|
|
|
return Vector3(
|
|
|
|
vector.X * _m[0][0] + vector.Y * _m[0][1] + vector.Z * _m[0][2] + _m[0][3],
|
|
|
|
vector.X * _m[1][0] + vector.Y * _m[1][1] + vector.Z * _m[1][2] + _m[1][3],
|
|
|
|
vector.X * _m[2][0] + vector.Y * _m[2][1] + vector.Z * _m[2][2] + _m[2][3]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Transform the vector as if this were a 3x3 matrix.
|
|
|
|
inline Vector3 transform3x3(const Vector3 &vector) const {
|
|
|
|
return Vector3(
|
|
|
|
vector.X * _m[0][0] + vector.Y * _m[0][1] + vector.Z * _m[0][2],
|
|
|
|
vector.X * _m[1][0] + vector.Y * _m[1][1] + vector.Z * _m[1][2],
|
|
|
|
vector.X * _m[2][0] + vector.Y * _m[2][1] + vector.Z * _m[2][2]);
|
|
|
|
}
|
|
|
|
|
2014-06-08 15:20:27 +02:00
|
|
|
// Transform the vector as if this were a 3x3 matrix.
|
|
|
|
inline Vector3 transform3x3(const Vector4 &vector) const {
|
|
|
|
return Vector3(
|
|
|
|
vector.X * _m[0][0] + vector.Y * _m[0][1] + vector.Z * _m[0][2],
|
|
|
|
vector.X * _m[1][0] + vector.Y * _m[1][1] + vector.Z * _m[1][2],
|
|
|
|
vector.X * _m[2][0] + vector.Y * _m[2][1] + vector.Z * _m[2][2]);
|
|
|
|
}
|
|
|
|
|
2014-06-07 00:55:08 +02:00
|
|
|
// Transform the vector as if this were a 3x4 matrix.
|
|
|
|
inline Vector4 transform3x4(const Vector4 &vector) const {
|
|
|
|
return Vector4(
|
|
|
|
vector.X * _m[0][0] + vector.Y * _m[0][1] + vector.Z * _m[0][2] + _m[0][3],
|
|
|
|
vector.X * _m[1][0] + vector.Y * _m[1][1] + vector.Z * _m[1][2] + _m[1][3],
|
|
|
|
vector.X * _m[2][0] + vector.Y * _m[2][1] + vector.Z * _m[2][2] + _m[2][3],
|
|
|
|
vector.X * _m[3][0] + vector.Y * _m[3][1] + vector.Z * _m[3][2] + _m[3][3]);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Vector4 transform(const Vector4 &vector) const {
|
|
|
|
return Vector4(
|
|
|
|
vector.X * _m[0][0] + vector.Y * _m[0][1] + vector.Z * _m[0][2] + vector.W * _m[0][3],
|
|
|
|
vector.X * _m[1][0] + vector.Y * _m[1][1] + vector.Z * _m[1][2] + vector.W * _m[1][3],
|
|
|
|
vector.X * _m[2][0] + vector.Y * _m[2][1] + vector.Z * _m[2][2] + vector.W * _m[2][3],
|
|
|
|
vector.X * _m[3][0] + vector.Y * _m[3][1] + vector.Z * _m[3][2] + vector.W * _m[3][3]);
|
|
|
|
}
|
|
|
|
|
2014-05-28 17:46:33 +01:00
|
|
|
float _m[4][4];
|
2014-05-23 15:38:18 +01:00
|
|
|
};
|
|
|
|
|
2009-05-25 13:19:29 +00:00
|
|
|
} // end of namespace TinyGL
|
|
|
|
|
2005-01-12 23:01:37 +00:00
|
|
|
#endif
|