changeset 1022:43808a098020

merge
author yutaka@localhost.localdomain
date Sun, 07 Nov 2010 22:11:04 +0900
parents f8e9c985e2a8 (current diff) 360f8eba78f1 (diff)
children 5245cf19775d
files
diffstat 2 files changed, 124 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Sun Nov 07 22:10:29 2010 +0900
+++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Sun Nov 07 22:11:04 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	Sun Nov 07 22:10:29 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Sun Nov 07 22:11:04 2010 +0900
@@ -627,59 +627,116 @@
 
 }
 
+/* flag_drawable な Scenegraph の総数を求める */
+int
+sg_drawable_num(SceneGraphPtr scenegraph)
+{
+  SceneGraphPtr sg = scenegraph;
+
+  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;
 
-  //HTaskPtr phase_wait = manager->create_task(Dummy);
+  PolygonPackPtr pp = (PolygonPackPtr)manager->allocate(sizeof(PolygonPack));
+
+  int sg_num = sg_drawable_num(sg);
+  int sg_division = sg_num / spe_num;
+  int residue = sg_num % spe_num;
 
-  for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
-
-    printf("list_length %d \n", t->list_length);
-
-    int alloc_size = 16*1024;
+  HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num);
+  Task **pptask = (Task**)manager->allocate(sizeof(Task*)*spe_num);
+  
+  for (int k = 0; k < spe_num-1; k++) {
+    task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_division,4,6,1);
+    pptask[k] = 0;
+  }
+  
+  task_array[spe_num] = manager->create_task_array(CreatePolygonFromSceneGraph,
+						   sg_division+residue,4,6,1);
+  pptask[spe_num] = 0;
 
-    if (t->coord_pack_size < alloc_size) {
-      alloc_size = t->coord_pack_size;
-    }
-
+  int count= 0;
+  int k = 0;
 
-    int division_num = (t->coord_pack_size + alloc_size - 1) / alloc_size;
-    int phase_num = (division_num + spe_num -1) / spe_num;
-    int cur_point = 0;
-
-    for (int i = 0; i < phase_num; i++) {
+  while (sg) {
+    if (sg->flag_drawable) {
+      if(count < spe_num * sg_division) {
+	k %= spe_num-1;
+      } else {
+	k = spe_num;
+      }
+      pptask[k] = task_array[k]->next_task_array(CreatePolygonFromSceneGraph,pptask[k]);
+      pptask[k]->set_inData(0, &sg->coord_xyz, sizeof(float)*sg->size/3);
+      pptask[k]->set_inData(1, &sg->coord_tex, sizeof(float)*sg->size/3);
+      pptask[k]->set_inData(2, &sg->normal   , sizeof(float)*sg->size/3);
+      pptask[k]->set_inData(3, &sg->matrix   , sizeof(float)*12);
+      pptask[k]->set_inData(4, &sg->real_matrix, sizeof(float)*8);
+      pptask[k]->set_inData(5, &sg->texture_info.pixels, sizeof(uint32));
+	
+      pptask[k]->set_param(0,(memaddr)sg->size);
+      pptask[k]->set_param(1,(memaddr)sg->texture_info.t_w);
+      pptask[k]->set_param(2,(memaddr)sg->texture_info.t_h);
+      pptask[k]->set_param(3,(memaddr)sg->texture_info.scale_max);
       
-      HTaskPtr alloc_wait = manager->create_task(Dummy);
-      coord_allocate(cur_point, t->coord_pack, spe_num,
-		     alloc_size, alloc_wait, manager);
-
-
-      for (MatrixList* u = t->first; u != NULL; u = u->next) {
-
-	//HTaskPtr free_wait = manager->create_task(Dummy);
-	
-	//phase_wait = manager->create_task(Dummy);
-	
+      pptask[k]->set_outData(0, &pp->tri[pp->info.size++], sizeof(TrianglePack));
+    }
+    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;
+	  }
+	}
       }
-
-      coord_free(spe_num, manager, alloc_wait);
-      alloc_wait->spawn();
     }
+    count++;
   }
 
-  printf("-----------------------\n");
-  //return create_pp_wait;
-
 }
 
 void
@@ -699,7 +756,8 @@
 
   
 #else
-    
+    //SceneGraphPtr sg = sgroot->getDrawSceneGraph();
+    //printf("sg->size = %lld\n", sg->size);
     HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph);
     // SceneGraph(木構造) -> PolygonPack