diff Renderer/Engine/viewer.cc @ 860:649e4cb84683

Still on the way
author yutaka@localhost.localdomain
date Fri, 18 Jun 2010 01:30:06 +0900
parents f7276b509710
children 000a8b63ad9a
line wrap: on
line diff
--- a/Renderer/Engine/viewer.cc	Thu Jun 17 04:46:25 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Jun 18 01:30:06 2010 +0900
@@ -437,8 +437,99 @@
 }
 
 void
+Viewer::create_pp_task(SceneGraphPtr sg, PolygonPackPtr pp_cur, HTaskPtr create_pp_wait,
+		       int &pp_index, int &sg_index, int tri_num) 
+{
+
+    HTaskPtr create_pp = manager->create_task(CreatePolygon);
+    create_pp->set_inData(0, &sg->tri_pack[sg_index], sizeof(TrianglePack)*tri_num);
+    create_pp->set_inData(1, sg->texture_info, sizeof(texture_list));
+    create_pp->set_inData(2, sg->sg_matrix, sizeof(float)*32); //わーい、マジックナンバー
+    create_pp->set_outData(0, &pp_cur->tri[pp_index], sizeof(TrianglePack)*tri_num);
+    create_pp->set_param(0, (memaddr)tri_num);
+    //create_pp->set_cpu(SPE_ANY);
+    create_pp_wait->wait_for(create_pp);
+    create_pp->spawn();
+
+    pp_index += tri_num;
+    sg_index += tri_num;
+}
+
+
+void
 Viewer::common_rendering(HTaskPtr task_next, SceneGraphRoot *sgroot)
 {
+
+#if SPE_CREATE_POLYGON
+
+  SceneGraphPtr sg = sgroot->getDrawSceneGraph();
+  PolygonPackPtr pp_cur = ppack;
+  HTaskPtr create_pp_wait = manager->create_task(Dummy);
+  int pp_index = 0;
+
+  while (sg) {
+    
+    if (sg->flag_drawable) {
+
+      int sum_size = sg->size;
+      int tri_cur_num = MAX_SIZE_TRIANGLE;
+      int sg_index = 0;
+
+      while (sum_size) {
+	
+	  tri_cur_num -= sg->size/3;
+	
+	  if (tri_cur_num < 0) {
+	    
+	      tri_cur_num = MAX_SIZE_TRIANGLE;
+	      create_pp_task(sg, pp_cur, create_pp_wait,
+			     pp_index, sg_index, tri_cur_num);
+	     
+	      PolygonPackPtr next = (PolygonPackPtr)manager->allocate(sizeof(PolygonPack));
+	      
+	      pp_cur->next = next;
+	      pp_cur       = next;
+	      pp_index = 0;
+	      
+	  } else {
+	  
+	      create_pp_task(sg, pp_cur, create_pp_wait,
+			     pp_index, sg_index, tri_cur_num);
+
+	  }
+
+	  sum_size -= tri_cur_num*3;
+
+      }
+      
+      
+    }
+    
+    
+    
+    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;
+	  }
+	}
+      }
+    } 
+  }
+    
+#else
+
     HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph);
     
     // SceneGraph(木構造) -> PolygonPack
@@ -487,8 +578,10 @@
         task_create_sp->spawn();
     }
 
+    task_create_pp->spawn();
 
-    task_create_pp->spawn();
+#endif
+
 }
 
 HTaskPtr
@@ -568,7 +661,7 @@
         int rangey = (starty + split_screen_h - 1 > this->height)
             ? this->height - starty + 1 : split_screen_h;
 
-#if 1
+#if 0
 
 	if(spack->info.size > 0) {