### changeset 1016:e4e96ab3044d

merge
author yutaka@localhost.localdomain Fri, 05 Nov 2010 22:28:20 +0900 80b18af207c2 (current diff) 58c3cbf6e3dd (diff) 6a2c22cabe10 736a833db108 cda812a1a66b 10 files changed, 187 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
```--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -0,0 +1,162 @@
+/**
+ * SceneGraph が増えてくると動かなくなるかもしれない。
+ * 一応 mainMem とかで動くようになるとは思うけど。
+ * だめだったら、そこら辺が怪しいと思うべき
+ */
+
+#include "CreatePolygonFromSceneGraph.h"
+#include "polygon_pack.h"
+#include "scene_graph_pack.h"
+
+
+#define PP_STORE 13
+
+/**
+ *  ベクトルに行列を乗算する
+ * @param[out] v vector (float[4])
+ * @param[in] m matrix (float[16])
+ */
+static void
+ApplyMatrix(float *v, float *m)
+{
+    float t[4];
+
+    t[0] = v[0];
+    t[1] = v[1];
+    t[2] = v[2];
+    t[3] = v[3];
+
+    for (int i = 0; i < 4; i++) {
+	v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12];
+    }
+}
+
+static void
+ApplyNormalMatrix(float *v, float *m)
+{
+    float t[4];
+
+    t[0] = v[0];
+    t[1] = v[1];
+    t[2] = v[2];
+
+    for (int i = 0; i < 3; i++) {
+        v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8];
+    }
+}
+
+static int
+run(SchedTask *smanager, void *rbuf, void *wbuf)
+{
+    float xyz1[4], xyz2[4], xyz3[4];
+    float normal1[4],normal2[4],normal3[4];
+
+    //coord_xyz, coord_tex, normal, matrix, real_matrix を受け取る
+    float *coord_xyz   = (float)smanager->get_inData(0);
+    float *coord_tex   = (float)smanager->get_inData(1);
+    float *normal      = (float)smanager->get_inData(2);
+    float *matrix      = (float)smanager->get_inData(3);
+    float *real_matrix = (float)smanager->get_inData(4);
+    TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_inData(5);
+
+    for (int i = 0; i < sg->size; i += 3) {
+
+      xyz1[0] = coord_xyz[(i+0)*3];
+      xyz1[1] = coord_xyz[(i+0)*3+1];
+      xyz1[2] = coord_xyz[(i+0)*3+2]*-1.0f;
+      xyz1[3] = 1.0f;
+
+      xyz2[0] = coord_xyz[(i+1)*3];
+      xyz2[1] = coord_xyz[(i+1)*3+1];
+      xyz2[2] = coord_xyz[(i+1)*3+2]*-1.0f;
+      xyz2[3] = 1.0f;
+
+      xyz3[0] = coord_xyz[(i+2)*3];
+      xyz3[1] = coord_xyz[(i+2)*3+1];
+      xyz3[2] = coord_xyz[(i+2)*3+2]*-1.0f;
+      xyz3[3] = 1.0f;
+
+      // matrix = 回転行列*透視変換行列
+      ApplyMatrix(xyz1, matrix);
+      ApplyMatrix(xyz2, matrix);
+      ApplyMatrix(xyz3, matrix);
+
+      xyz1[0] /= xyz1[2];
+      xyz1[1] /= xyz1[2];
+      xyz2[0] /= xyz2[2];
+      xyz2[1] /= xyz2[2];
+      xyz3[0] /= xyz3[2];
+      xyz3[1] /= xyz3[2];
+
+      triangle->ver1.x = xyz1[0];
+      triangle->ver1.y = xyz1[1];
+      triangle->ver1.z = xyz1[2];
+      triangle->ver1.tex_x = coord_tex[(i+0)*3];
+      triangle->ver1.tex_y = coord_tex[(i+0)*3+1];
+
+      triangle->ver2.x = xyz2[0];
+      triangle->ver2.y = xyz2[1];
+      triangle->ver2.z = xyz2[2];
+      triangle->ver2.tex_x = coord_tex[(i+1)*3];
+      triangle->ver2.tex_y = coord_tex[(i+1)*3+1];
+
+      triangle->ver3.x = xyz3[0];
+      triangle->ver3.y = xyz3[1];
+      triangle->ver3.z = xyz3[2];
+      triangle->ver3.tex_x = coord_tex[(i+2)*3];
+      triangle->ver3.tex_y = coord_tex[(i+2)*3+1];
+
+      normal1[0] = sg->normal[(i+0)*3];
+      normal1[1] = sg->normal[(i+0)*3+1];
+      normal1[2] = sg->normal[(i+0)*3+2]*-1.0f;
+      //normal1[3] = 1.0f;
+      normal1[3] = 0.0f;
+
+      normal2[0] = sg->normal[(i+1)*3];
+      normal2[1] = sg->normal[(i+1)*3+1];
+      normal2[2] = sg->normal[(i+1)*3+2]*-1.0f;
+      //normal2[3] = 1.0f;
+      normal2[3] = 0.0f;
+
+      normal3[0] = sg->normal[(i+2)*3];
+      normal3[1] = sg->normal[(i+2)*3+1];
+      normal3[2] = normal[(i+2)*3+2]*-1.0f;
+      //normal3[3] = 1.0f;
+      normal3[3] = 0.0f;
+
+      ApplyNormalMatrix(normal1,real_matrix);
+      ApplyNormalMatrix(normal2,real_matrix);
+      ApplyNormalMatrix(normal3,real_matrix);
+
+      normal1[0] /= normal1[2];
+      normal1[1] /= normal1[2];
+
+      normal2[0] /= normal2[2];
+      normal2[1] /= normal2[2];
+
+      normal3[0] /= normal3[2];
+      normal3[1] /= normal3[2];
+
+      triangle->normal1.x = normal1[0];
+      triangle->normal1.y = normal1[1];
+      triangle->normal1.z = normal1[2];
+
+      triangle->normal2.x = normal2[0];
+      triangle->normal2.y = normal2[1];
+      triangle->normal2.z = normal2[2];
+
+      triangle->normal3.x = normal3[0];
+      triangle->normal3.y = normal3[1];
+      triangle->normal3.z = normal3[2];
+
+      triangle->tex_info.width  = sg->texture_info.t_w;
+      triangle->tex_info.height = sg->texture_info.t_h;
+      triangle->tex_info.scale_max = sg->texture_info.scale_max;
+    }
+    return 0;
+}```
```--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.h	Fri Nov 05 22:28:20 2010 +0900
@@ -0,0 +1,7 @@
+#ifndef INCLUDED_CREATE_POLYGON
+#define INCLUDED_CREATE_POLYGON
+
+
+
+#endif```
```--- a/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc	Fri Nov 05 22:25:33 2010 +0900
+++ b/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -120,7 +120,6 @@
pp->init();
}

-		TrianglePack *triangle = &pp->tri[pp->info.size++];

xyz1[0] = sg->coord_xyz[(i+0)*3];
xyz1[1] = sg->coord_xyz[(i+0)*3+1];
@@ -149,6 +148,8 @@
xyz3[0] /= xyz3[2];
xyz3[1] /= xyz3[2];

+		TrianglePack *triangle = &pp->tri[pp->info.size++];
+
triangle->ver1.x = xyz1[0];
triangle->ver1.y = xyz1[1];
triangle->ver1.z = xyz1[2];```
```--- a/Renderer/Engine/viewer.cc	Fri Nov 05 22:25:33 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -634,6 +634,11 @@
MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo));
collect_matrix(sg, matrix_info, manager);

+  /*
+   * SceneGraph を辿って coord_xyz, coord_tex, normal, matrix, real_matrix 及び、
+   * PolygonPack の TrianglePack (空) を送る。pp->info.size の計算もここで。
+   *
+   */

@@ -706,7 +711,6 @@
}
-

#endif```
```--- a/Renderer/Test/aquarium.cc	Fri Nov 05 22:25:33 2010 +0900
+++ b/Renderer/Test/aquarium.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -32,10 +32,13 @@
return new aquarium();
}

+/*
static void
null_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h)
{
}
+*/
+
static void
null_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree)
{```
```--- a/Renderer/Test/network.cc	Fri Nov 05 22:25:33 2010 +0900
+++ b/Renderer/Test/network.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -32,10 +32,13 @@
return new NetworkGame();
}

+/*
static void
null_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h)
{
}
+*/
+
static void
null_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree)
{```
```--- a/example/HelloWorld/Func.h	Fri Nov 05 22:25:33 2010 +0900
+++ b/example/HelloWorld/Func.h	Fri Nov 05 22:28:20 2010 +0900
@@ -1,6 +1,6 @@
enum {
+    Hello,
RUN_FINISH,
};
```
```--- a/example/HelloWorld/main.cc	Fri Nov 05 22:25:33 2010 +0900
+++ b/example/HelloWorld/main.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -38,7 +38,7 @@
*/

/**
* Select CPU```
```--- a/example/HelloWorld/ppe/Hello.cc	Fri Nov 05 22:25:33 2010 +0900
+++ b/example/HelloWorld/ppe/Hello.cc	Fri Nov 05 22:28:20 2010 +0900
@@ -4,10 +4,10 @@
#include "Func.h"

/* これは必須 */

static int
-run(SchedTask *smanager, void *rbuf, void *wbuf)
+hello(SchedTask *smanager, void *rbuf, void *wbuf)
{
```--- a/example/HelloWorld/ppe/task_init.cc	Fri Nov 05 22:25:33 2010 +0900