Small but effective optimisations.

Allow inlining the function helps a bit!
This commit is contained in:
Godzil
2020-03-13 01:04:56 +00:00
parent 4f2e327533
commit 5b6b627a43
4 changed files with 25 additions and 7 deletions

View File

@@ -19,6 +19,8 @@
#undef minor #undef minor
#endif #endif
#define FastGet4(_x, _y) (this->data[4 * (_x) + (_y)])
class Matrix class Matrix
{ {
protected: protected:
@@ -46,7 +48,12 @@ public:
bool isInvertible() { return this->determinant() != 0; } bool isInvertible() { return this->determinant() != 0; }
Matrix operator*(const Matrix &b) const; Matrix operator*(const Matrix &b) const;
Tuple operator*(const Tuple &b) const; Tuple operator*(const Tuple &b) const {
return Tuple(b.x * FastGet4(0, 0) + b.y * FastGet4(0, 1) + b.z * FastGet4(0, 2) + b.w * FastGet4(0, 3),
b.x * FastGet4(1, 0) + b.y * FastGet4(1, 1) + b.z * FastGet4(1, 2) + b.w * FastGet4(1, 3),
b.x * FastGet4(2, 0) + b.y * FastGet4(2, 1) + b.z * FastGet4(2, 2) + b.w * FastGet4(2, 3),
b.x * FastGet4(3, 0) + b.y * FastGet4(3, 1) + b.z * FastGet4(3, 2) + b.w * FastGet4(3, 3));
}
}; };
class Matrix4: public Matrix class Matrix4: public Matrix

View File

@@ -44,8 +44,18 @@ public:
void set(double nX, double nY, double nZ) { this->x = nX; this->y = nY; this->z = nZ; }; void set(double nX, double nY, double nZ) { this->x = nX; this->y = nY; this->z = nZ; };
double magnitude(); double magnitude();
Tuple normalise(); Tuple normalise();
double dot(const Tuple &b);
Tuple cross(const Tuple &b) const; double dot(const Tuple &b) {
return this->x * b.x + this->y * b.y + this->z * b.z + this->w * b.w;
}
Tuple cross(const Tuple &b) const {
return Tuple(this->y * b.z - this->z * b.y,
this->z * b.x - this->x * b.z,
this->x * b.y - this->y * b.x,
0);
}
Tuple reflect(const Tuple &normal); Tuple reflect(const Tuple &normal);
}; };

View File

@@ -101,9 +101,10 @@ Matrix Matrix::operator*(const Matrix &b) const
return ret; return ret;
} }
#define FastGet4(_x, _y) (this->data[4 * (_x) + (_y)]) //#define FastGet4(_x, _y) (this->data[4 * (_x) + (_y)])
/* TODO: Check if we can optimise this function. It is called a lot */ /* TODO: Check if we can optimise this function. It is called a lot */
/*
Tuple Matrix::operator*(const Tuple &b) const Tuple Matrix::operator*(const Tuple &b) const
{ {
return Tuple(b.x * FastGet4(0, 0) + b.y * FastGet4(0, 1) + b.z * FastGet4(0, 2) + b.w * FastGet4(0, 3), return Tuple(b.x * FastGet4(0, 0) + b.y * FastGet4(0, 1) + b.z * FastGet4(0, 2) + b.w * FastGet4(0, 3),
@@ -111,7 +112,7 @@ Tuple Matrix::operator*(const Tuple &b) const
b.x * FastGet4(2, 0) + b.y * FastGet4(2, 1) + b.z * FastGet4(2, 2) + b.w * FastGet4(2, 3), b.x * FastGet4(2, 0) + b.y * FastGet4(2, 1) + b.z * FastGet4(2, 2) + b.w * FastGet4(2, 3),
b.x * FastGet4(3, 0) + b.y * FastGet4(3, 1) + b.z * FastGet4(3, 2) + b.w * FastGet4(3, 3)); b.x * FastGet4(3, 0) + b.y * FastGet4(3, 1) + b.z * FastGet4(3, 2) + b.w * FastGet4(3, 3));
} }
*/
Matrix Matrix::identity() Matrix Matrix::identity()
{ {
int i; int i;

View File

@@ -26,7 +26,7 @@ Tuple Tuple::normalise()
return Tuple(this->x / mag, this->y / mag, this->z / mag, this->w / mag); return Tuple(this->x / mag, this->y / mag, this->z / mag, this->w / mag);
} }
/*
double Tuple::dot(const Tuple &b) double Tuple::dot(const Tuple &b)
{ {
return this->x * b.x + this->y * b.y + this->z * b.z + this->w * b.w; return this->x * b.x + this->y * b.y + this->z * b.z + this->w * b.w;
@@ -39,7 +39,7 @@ Tuple Tuple::cross(const Tuple &b) const
this->x * b.y - this->y * b.x, this->x * b.y - this->y * b.x,
0); 0);
} }
*/
Tuple Tuple::reflect(const Tuple &normal) Tuple Tuple::reflect(const Tuple &normal)
{ {
return *this - normal * 2 * this->dot(normal); return *this - normal * 2 * this->dot(normal);