Browse Source

Small but effective optimisations.

Allow inlining the function helps a bit!
Godzil 4 years ago
parent
commit
5b6b627a43
4 changed files with 25 additions and 7 deletions
  1. 8 1
      source/include/matrix.h
  2. 12 2
      source/include/tuple.h
  3. 3 2
      source/matrix.cpp
  4. 2 2
      source/tuple.cpp

+ 8 - 1
source/include/matrix.h

@@ -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

+ 12 - 2
source/include/tuple.h

@@ -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);
 };
 

+ 3 - 2
source/matrix.cpp

@@ -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;

+ 2 - 2
source/tuple.cpp

@@ -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);