diff mbox

[Branch,~glmark2-dev/glmark2/trunk] Rev 16: Add Matrix4f::perspective(), Matrix4f::identity() and copy constructor.

Message ID 20110721123631.17019.49056.launchpad@loganberry.canonical.com
State Accepted
Headers show

Commit Message

Alexandros Frantzis July 21, 2011, 12:36 p.m. UTC
------------------------------------------------------------
revno: 16
committer: Alexandros Frantzis <alf82@freemail.gr>
timestamp: Thu 2010-07-08 15:51:29 +0300
message:
  Add Matrix4f::perspective(), Matrix4f::identity() and copy constructor.
modified:
  matrix.cpp
  matrix.h


--
lp:glmark2
https://code.launchpad.net/~glmark2-dev/glmark2/trunk

You are subscribed to branch lp:glmark2.
To unsubscribe from this branch go to https://code.launchpad.net/~glmark2-dev/glmark2/trunk/+edit-subscription
diff mbox

Patch

=== modified file 'matrix.cpp'
--- matrix.cpp	2010-07-08 08:07:56 +0000
+++ matrix.cpp	2010-07-08 12:51:29 +0000
@@ -94,9 +94,9 @@ 
 Matrix4f &Matrix4f::transpose()
 {
    GLfloat t[16] = {
-      m[0], m[4], m[8],  m[12], 
-      m[1], m[5], m[9],  m[13], 
-      m[2], m[6], m[10], m[14], 
+      m[0], m[4], m[8],  m[12],
+      m[1], m[5], m[9],  m[13],
+      m[2], m[6], m[10], m[14],
       m[3], m[7], m[11], m[15]};
 
    memcpy(m, t, sizeof(m));
@@ -104,6 +104,56 @@ 
    return *this;
 }
 
+/**
+ * Makes this matrix an identity matrix.
+ *
+ * @return reference to the matrix
+ */
+Matrix4f &Matrix4f::identity()
+{
+   m[0] = 1.0; m[4] = 0.0; m[8] = 0.0;  m[12] = 0.0;
+   m[1] = 0.0; m[5] = 1.0; m[9] = 0.0;  m[13] = 0.0;
+   m[2] = 0.0; m[6] = 0.0; m[10] = 1.0; m[14] = 0.0;
+   m[3] = 0.0; m[7] = 0.0; m[11] = 0.0; m[15] = 1.0;
+
+   return *this;
+}
+
+/**
+ * Makes this matrix a perspective projection matrix.
+ *
+ * @param fovy field of view angle in degrees in the y direction
+ * @param aspect aspect ratio of view
+ * @param zNear the distance from the viewer to the near clipping plane
+ * @param zFar the distance from the viewer to the far clipping plane
+ *
+ * @return reference to the matrix
+ */
+Matrix4f &Matrix4f::perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)
+{
+    GLfloat sine, cotangent, deltaZ;
+    GLfloat radians = fovy / 2 * M_PI / 180;
+
+    deltaZ = zFar - zNear;
+    sine = sin(radians);
+
+    if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {
+       return *this;
+    }
+
+    cotangent = cos(radians) / sine;
+
+    identity();
+    m[0] = cotangent / aspect;
+    m[5] = cotangent;
+    m[10] = -(zFar + zNear) / deltaZ;
+    m[11] = -1;
+    m[14] = -2 * zNear * zFar / deltaZ;
+    m[15] = 0;
+
+    return *this;
+}
+
 /** 
  * Creates an empty matrix.
  *
@@ -116,6 +166,11 @@ 
     m[15] = 1.0;
 }
 
+Matrix4f::Matrix4f(Matrix4f &mat)
+{
+   memcpy(m, mat.m, sizeof(m));
+}
+
 /** 
  * Creates a matrix with specified values in the diagonal.
  * 
@@ -141,7 +196,6 @@ 
  */
 void Matrix4f::display(const char *str)
 {
-   return;
    int r;
    if (str != NULL)
       printf("%s\n", str);

=== modified file 'matrix.h'
--- matrix.h	2010-07-08 08:07:56 +0000
+++ matrix.h	2010-07-08 12:51:29 +0000
@@ -13,11 +13,14 @@ 
     GLfloat m[16];
 
     Matrix4f();
+    Matrix4f(Matrix4f &mat);
     Matrix4f(GLfloat x, GLfloat y, GLfloat z);
 
     Matrix4f &translate(GLfloat x, GLfloat y, GLfloat z);
     Matrix4f &rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
     Matrix4f &transpose();
+    Matrix4f &perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar);
+    Matrix4f &identity();
 
     Matrix4f &operator*=(const Matrix4f &pM);