changeset 1018:736a833db108

sg_drawable_num add. CreatePolygonFromSceneGraph not done.
author tkaito
date Sun, 07 Nov 2010 02:53:05 +0900
parents e4e96ab3044d
children f20ca98d47c6
files Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Renderer/Engine/viewer.cc
diffstat 2 files changed, 105 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Fri Nov 05 22:28:20 2010 +0900
+++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Sun Nov 07 02:53:05 2010 +0900
@@ -8,7 +8,7 @@
 #include "polygon_pack.h"
 #include "scene_graph_pack.h"
 
-SchedDefineTask(CreatePolygonFromSceneGraph);
+SchedDefineTask1(CreatePolygonFromSceneGraph, createPolygonFromSceneGraph);
 
 #define SG_PACK_LOAD 10
 #define SG_NODE_LOAD 11
@@ -50,20 +50,29 @@
 }
 
 static int 
-run(SchedTask *smanager, void *rbuf, void *wbuf)
+createPolygonFromSceneGraph(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);
+    float *coord_xyz   = (float*)smanager->get_input(rbuf, 0);
+    float *coord_tex   = (float*)smanager->get_input(rbuf, 1);
+    float *normal      = (float*)smanager->get_input(rbuf, 2);
+    float *matrix      = (float*)smanager->get_input(rbuf, 3);
+    float *real_matrix = (float*)smanager->get_input(rbuf, 4);
+    uint32 *pixels     = (uint32*)smanager->get_input(rbuf, 5);
+    //TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_input(rbuf, 6);
 
-    for (int i = 0; i < sg->size; i += 3) {
+    int sg_size   = (int)smanager->get_param(0);
+    int width     = (int)smanager->get_param(1);
+    int height    = (int)smanager->get_param(2);
+    int scale_max = (int)smanager->get_param(3);
+
+    // triangle を書き戻す
+    TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_output(wbuf, 0);
+
+    for (int i = 0; i < sg_size; i += 3) {
       
       xyz1[0] = coord_xyz[(i+0)*3];
       xyz1[1] = coord_xyz[(i+0)*3+1];
@@ -110,20 +119,20 @@
       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[0] = normal[(i+0)*3];
+      normal1[1] = normal[(i+0)*3+1];
+      normal1[2] = 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[0] = normal[(i+1)*3];
+      normal2[1] = normal[(i+1)*3+1];
+      normal2[2] = 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[0] = normal[(i+2)*3];
+      normal3[1] = normal[(i+2)*3+1];
       normal3[2] = normal[(i+2)*3+2]*-1.0f;
       //normal3[3] = 1.0f;
       normal3[3] = 0.0f;
@@ -153,10 +162,10 @@
       triangle->normal3.y = normal3[1];
       triangle->normal3.z = normal3[2];
       
-      triangle->tex_info.addr   = sg->texture_info.pixels;
-      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;
+      triangle->tex_info.addr   = pixels;
+      triangle->tex_info.width  = width;
+      triangle->tex_info.height = height;
+      triangle->tex_info.scale_max = scale_max;
     }
     return 0;
 }
--- a/Renderer/Engine/viewer.cc	Fri Nov 05 22:28:20 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Sun Nov 07 02:53:05 2010 +0900
@@ -627,21 +627,89 @@
 
 }
 
+/* flag_drawable な Scenegraph の総数を求める */
+int
+sg_drawable_num(SceneGraphPtr sg)
+{
+  int sg_count = 0;
+  while (sg) {
+    if (sg->flag_drawable) {
+      sg_count++;
+    }
+    if (sg->children != NULL) {
+      sg = sg->children;
+    } else if (sg->brother != NULL) {
+      sg = sg->brother;
+    } else {
+      while (sg) {
+	if (sg->brother != NULL) {
+	  sg = sg->brother;
+	  break;
+	} else {
+	  if (sg->parent == NULL) {
+	    sg = NULL;
+	    break;
+	  } else {
+	    sg = sg->parent;
+	  }
+	}
+      }
+    }  
+  }
+  return sg_count;
+}
+
 void
 create_pp_task(SceneGraphPtr sg, TaskManager *manager, int spe_num, HTaskPtr task_next)
 {
 
-  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 の計算もここで。
    * 
    */
+  //int spe_num = 6;
+
+  HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num);
+  Task **pp = (Task**)manager->allocate(sizeof(Task*)*spe_num);
+
+  int sg_num = sg_drawable_num(sg);
+
+  for (int k = 0; k < spe_num; k++) {
+    task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_num,4,6,1);
+    pp[k] = 0;
+  }
+
+  while (sg) {
+    if (sg->flag_drawable) {
+	
+    }
+    if (sg->children != NULL) {
+      sg = sg->children;
+    } else if (sg->brother != NULL) {
+      sg = sg->brother;
+    } else {
+      while (sg) {
+	if (sg->brother != NULL) {
+	  sg = sg->brother;
+	  break;
+	} else {
+	  if (sg->parent == NULL) {
+	    sg = NULL;
+	    break;
+	  } else {
+	    sg = sg->parent;
+	  }
+	}
+      }
+    }  
+  }
+
+  //MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo));
+  //collect_matrix(sg, matrix_info, manager);
 
   //HTaskPtr phase_wait = manager->create_task(Dummy);
-
+  /*
   for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
 
     printf("list_length %d \n", t->list_length);
@@ -679,7 +747,7 @@
 
   printf("-----------------------\n");
   //return create_pp_wait;
-
+  */
 }
 
 void
@@ -699,7 +767,8 @@
 
   
 #else
-    
+    //SceneGraphPtr sg = sgroot->getDrawSceneGraph();
+    //printf("sg->size = %lld\n", sg->size);
     HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph);
     // SceneGraph(木構造) -> PolygonPack