diff Renderer/Engine/matrix_calc.cc @ 1254:34944900f266 draft

minor fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Nov 2011 16:56:11 +0900
parents 636dfdc30176
children 880f989ce52a
line wrap: on
line diff
--- a/Renderer/Engine/matrix_calc.cc	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/matrix_calc.cc	Fri Nov 18 16:56:11 2011 +0900
@@ -5,12 +5,6 @@
 #include "matrix_calc.h"
 using namespace std;
 
-void noMoreMemory()
-{
-  cout << "can't allocate memory\n";
-  exit(1);
-}
-
 void
 transMatrix(float *m0, float *m1, float *v)
 {
@@ -40,17 +34,16 @@
 
     for (int i = 0; i < 4; i++) {
 	for (int j = 0; j < 4; j++) {
-	    m[i*4+j] = m1[j*4+i];
+	    m0[i*4+j] = m[i*4+j] = m1[j*4+i];
 	}
     }
 
-    m[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]);
-    m[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]);
-    m[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]);
-    m[3] = m[7] = m[11] = 0.0f;
-    m[15] = 1.0f;
+    m0[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]);
+    m0[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]);
+    m0[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]);
+    m0[3] = m0[7] = m0[11] = 0.0f;
+    m0[15] = 1.0f;
 
-    memcpy(m0, m, sizeof(float)*16);
 }
 
 /**
@@ -67,6 +60,7 @@
     }
 }
 
+
 /**
  * ベクトルの正規化
  *
@@ -117,13 +111,14 @@
 {
     float t[16];
 
+    // こういう小細工よりベクタ使った方が良いんだが
     for (int i = 0; i < 4; i++) {
-	for (int j = 0; j < 4; j++) {
+	for (int j = i+1; j < 4; j++) {
+	    float tmp = t[j*4+i];
 	    t[i*4+j] = m1[j*4+i];
+	    m1[j*4+i] = tmp;
 	}
     }
-
-    memcpy(m0, t, sizeof(float)*16);
 }
 
 /**
@@ -149,6 +144,17 @@
     }
 }
 
+void matrix4x4R(float &xyz[16], float &xyz1[16], float &xyz2[16]) 
+{
+  for(int t=0; t<16; t+=4)
+    {
+      for(int i=0; i<4; i++)
+	{
+	  xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i];
+	}
+    }
+}
+
 /**
  *   c_xyz を中心に sacle 倍する
  */
@@ -185,9 +191,9 @@
 get_matrix( float *matrix, float *rxyz, float *txyz, float *stack)
 {
   float radx,rady,radz;
-  radx = rxyz[0]*3.141562/180;
-  rady = rxyz[1]*3.141562/180;
-  radz = rxyz[2]*3.141562/180;
+  radx = rxyz[0]*M_PI/180;
+  rady = rxyz[1]*M_PI/180;
+  radz = rxyz[2]*M_PI/180;
 
   float sinx = sin(radx);
   float cosx = cos(radx);
@@ -228,9 +234,9 @@
 get_matrix_scale( float *matrix, float *rxyz, float *txyz, float *scale, float *stack)
 {
   float radx,rady,radz;
-  radx = rxyz[0]*3.14/180;
-  rady = rxyz[1]*3.14/180;
-  radz = rxyz[2]*3.14/180;
+  radx = rxyz[0]*M_PI/180;
+  rady = rxyz[1]*M_PI/180;
+  radz = rxyz[2]*M_PI/180;
 
   float sinx = sin(radx)*scale[0];
   float cosx = cos(radx)*scale[0];
@@ -267,9 +273,43 @@
 
 }
 
+void
+rotate_matrix( float &m[16], float &rxyz[4] )
+{
+  float radx,rady,radz;
+  radx = rxyz[0]*M_PI/180;
+  rady = rxyz[1]*M_PI/180;
+  radz = rxyz[2]*M_PI/180;
+
+  float sinx = sin(radx);
+  float cosx = cos(radx);
+  float siny = sin(rady);
+  float cosy = cos(rady);
+  float sinz = sin(radz);
+  float cosz = cos(radz);
+
+  /* View Transform */
+  m[0] = cosz*cosy+sinz*sinx*siny;
+  m[1] = sinz*cosx;
+  m[2] = -cosz*siny+sinz*sinx*cosy;
+  m[3] = 0;
+  m[4] = -sinz*cosy+cosz*sinx*siny;
+  m[5] = cosz*cosx;
+  m[6] = sinz*siny+cosz*sinx*cosy;
+  m[7] = 0;
+  m[8] = cosx*siny;
+  m[9] = -sinx;
+  m[10] = cosx*cosy;
+  m[11] = 0;
+  m[12] = 0;
+  m[13] = 0;
+  m[14] = 0;
+  m[15] = 1;
+}
+
 void rotate_x(float *xyz, float r)
 {
-  float rad = r*3.14/180;
+  float rad = r*M_PI/180;
 
   xyz[0] = xyz[0];
   xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad);
@@ -278,7 +318,7 @@
 
 void rotate_y(float *xyz, float r)
 {
-  float rad = r*3.14/180;
+  float rad = r*M_PI/180;
 
   xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad);
   xyz[1] = xyz[1];
@@ -287,7 +327,7 @@
 
 void rotate_z(float *xyz, float r)
 {
-  float rad = r*3.14/180;
+  float rad = r*M_PI/180;
 
   xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad);
   xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad);