Small but effective optimisations.
Allow inlining the function helps a bit!
This commit is contained in:
@@ -19,6 +19,8 @@
|
||||
#undef minor
|
||||
#endif
|
||||
|
||||
#define FastGet4(_x, _y) (this->data[4 * (_x) + (_y)])
|
||||
|
||||
class Matrix
|
||||
{
|
||||
protected:
|
||||
@@ -46,7 +48,12 @@ public:
|
||||
bool isInvertible() { return this->determinant() != 0; }
|
||||
|
||||
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
|
||||
|
||||
@@ -44,8 +44,18 @@ public:
|
||||
void set(double nX, double nY, double nZ) { this->x = nX; this->y = nY; this->z = nZ; };
|
||||
double magnitude();
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
@@ -101,9 +101,10 @@ Matrix Matrix::operator*(const Matrix &b) const
|
||||
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 */
|
||||
/*
|
||||
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),
|
||||
@@ -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(3, 0) + b.y * FastGet4(3, 1) + b.z * FastGet4(3, 2) + b.w * FastGet4(3, 3));
|
||||
}
|
||||
|
||||
*/
|
||||
Matrix Matrix::identity()
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -26,7 +26,7 @@ Tuple Tuple::normalise()
|
||||
|
||||
return Tuple(this->x / mag, this->y / mag, this->z / mag, this->w / mag);
|
||||
}
|
||||
|
||||
/*
|
||||
double Tuple::dot(const Tuple &b)
|
||||
{
|
||||
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,
|
||||
0);
|
||||
}
|
||||
|
||||
*/
|
||||
Tuple Tuple::reflect(const Tuple &normal)
|
||||
{
|
||||
return *this - normal * 2 * this->dot(normal);
|
||||
|
||||
Reference in New Issue
Block a user