changeset 1254:34944900f266 draft

minor fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Nov 2011 16:56:11 +0900
parents 7ee76065ec12
children 39016616cc26
files Renderer/Engine/Camera.cc Renderer/Engine/ChangeLog Renderer/Engine/SceneGraph.cc Renderer/Engine/SceneGraphRoot.cc Renderer/Engine/SceneGraphRoot.h Renderer/Engine/matrix_calc.cc Renderer/Engine/viewer.cc
diffstat 7 files changed, 106 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/Camera.cc	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/Camera.cc	Fri Nov 18 16:56:11 2011 +0900
@@ -176,9 +176,9 @@
     float cx[4], cy[4], cz[4], p[4];
     float tm[16];
 
-    radx = angle[0]*3.14/180;
-    rady = angle[1]*3.14/180;
-    radz = angle[2]*3.14/180;
+    radx = angle[0]*M_PI/180;
+    rady = angle[1]*M_PI/180;
+    radz = angle[2]*M_PI/180;
 
     float sinx = sin(radx);
     float cosx = cos(radx);
--- a/Renderer/Engine/ChangeLog	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/ChangeLog	Fri Nov 18 16:56:11 2011 +0900
@@ -1,3 +1,14 @@
+2011-9-7  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>
+
+	allExecute 使わない方の Camera の処理をしないとだめ。
+
+	    Camera のbrother ===> sprite
+	    Camera のchildren ===> sceneGraph
+
+	じゃないの? Camera に座標と行列をcopyする必要があると思われる。
+
+	matrix/real_matrix は重複っぽい。そもそも、なんで別なんだ? 普通は同じ値?
+
 2011-2-14 Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
 
 	CreatePolygonFromScenenGraph を SPEで動くようにTask化。もうできるのはわかっているけど
@@ -25,16 +36,16 @@
 2009-12-19  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>
 
 	SgChange/viewer は大域変数使いすぎ。禁止って言ったのに。
-        linda api は、federated linda 対応でないものが使われている。
-        対応したものは、どこにあるんだろう?
+	linda api は、federated linda 対応でないものが使われている。
+	対応したものは、どこにあるんだろう?
 
-        他の例題いじるのは、自分の例題を動かしてからにして欲しい。
+	他の例題いじるのは、自分の例題を動かしてからにして欲しい。
 
-        まぁねぇ。Pipeline execution するのに、sgpack とかも Pipeline buffer
-        にするのは気づかないものなんだろうな... なくても、動かないことは
-        ないのか。
+	まぁねぇ。Pipeline execution するのに、sgpack とかも Pipeline buffer
+	にするのは気づかないものなんだろうな... なくても、動かないことは
+	ないのか。
 
-        viewer.cc の大域変数を落すところから始めるべきか?
+	viewer.cc の大域変数を落すところから始めるべきか?
 
 2009-11-15  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>
 
@@ -80,7 +91,7 @@
 	       ---------------------------------------
 	data = |   vertex   |   normal   |  texture  | sizeof(data) = size*3
 	       ---------------------------------------
-                \  size    / \   size   / \  size   /
+		\  size    / \   size   / \  size   /
 
 	てな感じで、SceneGraph->data の中に 3 つ入ってたわけです。
 	これだと、アクセスする時にどれがどれかわからんくなるし、
--- a/Renderer/Engine/SceneGraph.cc	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/SceneGraph.cc	Fri Nov 18 16:56:11 2011 +0900
@@ -135,6 +135,10 @@
       matrix[i]      = 0;
       real_matrix[i] = 0;
     }
+    for (int i = 0; i < 4; i++) {
+      matrix[i*4+i]      = 1;
+      real_matrix[i*4+i] = 1;
+    }
 
 
     finalize = &SceneGraph::finalize_copy;
--- a/Renderer/Engine/SceneGraphRoot.cc	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Fri Nov 18 16:56:11 2011 +0900
@@ -172,7 +172,7 @@
     width_shift += text->seq;
     root->addChild(text);
     get_matrix_scale(text->matrix, text->angle, text->xyz, scale, root->matrix);
-    get_matrix(text->real_matrix, text->angle, text->xyz, root->real_matrix);
+    // get_matrix(text->real_matrix, text->angle, text->xyz, root->real_matrix);
     i += len;
   }
 }
@@ -478,7 +478,7 @@
 	    /*親の回転、座標から、子の回転、座標を算出*/
 	    get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix);
 	    /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/
-	    get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix);
+	    // get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix);
 	    //get_matrix(c->real_matrix, c->angle, c->xyz, camera->real_matrix);
 
 	} 
@@ -508,6 +508,15 @@
 
 }
 
+
+void
+SceneGraphRoot::void treeApply(int screen_w, int screen_h)
+{
+    // don't calcurate sg_draw_tree's brother
+    transTree(sg_draw_tree->children, camera);
+}
+
+
 /**
  *     破壊的に変換行列の親子関係を計算する
  */
@@ -523,7 +532,7 @@
 	    /*親の回転、座標から、子の回転、座標を算出*/
 	    matrix4x4(t->matrix,t->matrix,cur_parent->matrix);
 	    /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/
-	    matrix4x4(t->real_matrix,t->real_matrix,cur_parent->real_matrix);
+	    // matrix4x4(t->real_matrix,t->real_matrix,cur_parent->real_matrix);
 	} 
 	
 	if (t->children != NULL && c != NULL) {
--- a/Renderer/Engine/SceneGraphRoot.h	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Fri Nov 18 16:56:11 2011 +0900
@@ -124,6 +124,7 @@
 
     /* Other System API */
     void allExecute(int screen_w, int screen_h);
+    void treeApply(int screen_w, int screen_h);
     void lightCalc();
     void flip();
     void copyTree(SceneGraphPtr from, SceneGraphPtr to);
--- 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);
--- a/Renderer/Engine/viewer.cc	Wed Nov 16 12:39:07 2011 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Nov 18 16:56:11 2011 +0900
@@ -293,6 +293,8 @@
 	} else {
 	    sgroot->allExecute(width, height);	
 	}
+    } else {
+	sgroot->treeApply(width, height);	
     }
 
     light_xyz_stock = sgroot->getLightVector();