changeset 759:bb47827c04c1

fix create_task
author hiroki@henri.cr.ie.u-ryukyu.ac.jp
date Mon, 01 Feb 2010 17:08:36 +0900
parents e615e552efa5
children 24a37fe8419a
files Renderer/Engine/SceneGraphRoot.cc Renderer/Engine/SceneGraphRoot.h Renderer/Engine/SgChange.cc Renderer/Test/create_task.cc
diffstat 4 files changed, 64 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/SceneGraphRoot.cc	Sat Jan 30 19:33:16 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Mon Feb 01 17:08:36 2010 +0900
@@ -411,7 +411,7 @@
         
 	list->frame++; 
         list = list->next;
-    }
+    }    
 
     get_matrix(light->matrix, light->angle, light->xyz, camera->matrix);
 
@@ -426,7 +426,7 @@
     light_vector[1] /= light_vector[2];
    
     if(sg_exec_tree != NULL) {
-		return;
+	return;
     }
 
     /*removeのflagをもとにtreeを形成*/
@@ -480,6 +480,58 @@
 }
 
 void
+SceneGraphRoot::oneExecute(int screen_w, int screen_h)
+{
+    SceneGraphPtr list = sg_available_list;
+    SceneGraphPtr t = sg_exec_tree;
+    SceneGraphPtr cur_parent = camera;
+
+    // 前フレームで描画した SceneGraph は削除
+    allRemove(sg_remove_list);
+
+    // 前フレームに作られた SceneGraph は描画用に移行
+    // 現フレームでの操作は以下の tree,list には適用されない
+    sg_draw_tree = sg_exec_tree;
+    sg_remove_list = sg_available_list;
+
+    // 現フレームで新しく SceneGraph がコピーされるので初期化
+    sg_exec_tree = NULL;
+    sg_available_list = NULL;
+
+    camera->move_execute(screen_w, screen_h);
+    camera->update(screen_w, screen_h);
+
+    camera->children = NULL;
+    camera->lastChild = NULL;
+
+    /* ここから */
+    list->move_execute(screen_w, screen_h);
+    list->collision_check(screen_w, screen_h, list);	
+    /* ここまで exec_task にする */
+    
+    
+    /* ここから下を exec_task の post_func に*/
+    list->frame++; 
+    list = list->next;
+
+    get_matrix(light->matrix, light->angle, light->xyz, camera->matrix);
+
+    light_vector[0] = 0.0f;
+    light_vector[1] = 0.0f;
+    light_vector[2] = 0.0f;
+    light_vector[3] = 1.0f;
+
+    ApplyMatrix(light_vector, light->matrix);
+
+    light_vector[0] /= light_vector[2];
+    light_vector[1] /= light_vector[2];
+   
+    if(sg_exec_tree != NULL) {
+	return;
+    }
+}
+
+void
 SceneGraphRoot::allRemove(SceneGraphPtr list)
 {
     SceneGraphPtr p = list;
--- a/Renderer/Engine/SceneGraphRoot.h	Sat Jan 30 19:33:16 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Mon Feb 01 17:08:36 2010 +0900
@@ -83,6 +83,7 @@
 
     /* Other System API */
     void allExecute(int screen_w, int screen_h);
+    void oneExecute(int screen_w, int screen_h);
     void checkRemove();
     SceneGraphPtr getExecuteSceneGraph();
     SceneGraphPtr getDrawSceneGraph();
--- a/Renderer/Engine/SgChange.cc	Sat Jan 30 19:33:16 2010 +0900
+++ b/Renderer/Engine/SgChange.cc	Mon Feb 01 17:08:36 2010 +0900
@@ -17,7 +17,6 @@
 static void post2runLoop(SchedTask *s, void *viewer, void *s1);
 static void post2run(SchedTask *s, void *viewer, void *s1);
 static void post2runDraw(SchedTask *s, void *viewer, void *s1);
-static void post2runMove(SchedTask *s, void *viewer, void *s1);
 static void post2rendering(SchedTask *s, void *viewer, void *s1);
 
 /* measure for FPS (Frame Per Second) */
@@ -85,12 +84,6 @@
 void
 SgChange::pass_draw_tree()
 {
-    /*
-    SceneGraphRoot *tmp;
-    tmp = sgroot_A;
-    sgroot_A = sgroot_B;
-    sgroot_B = tmp;
-    */
     sgroot_B->sg_draw_tree = sgroot_A->sg_exec_tree;
 }
 
@@ -125,15 +118,10 @@
     HTaskPtr draw_task  = manager->create_task(Dummy);
     draw_task->set_post(post2rendering, (void *)this, 0);
     
-#if 0
-    HTaskPtr move_task  = manager->create_task(Dummy);
-    move_task->set_post(post2runMove, (void *)this, 0);
-#else
     HTaskPtr move_task  = manager->create_task(RunMove);
     move_task->set_param(0, (memaddr)this);
     move_task->set_param(1, viewer->width);
     move_task->set_param(2, viewer->height);
-#endif
 
     HTaskPtr dummy_task = manager->create_task(Dummy);
 
@@ -143,27 +131,12 @@
     loop_task->wait_for(move_task);
 
     draw_task->spawn();
+    // この時点で app の task_id を知っていないとダメか
     move_task->spawn();
     loop_task->spawn();
 }
 
 static void 
-post2runMove(SchedTask *s, void *viewer_, void *arg)
-{    
-    SgChange *viewer = (SgChange *)viewer_;
-    HTaskPtr task_next = viewer->manager->create_task(Dummy);
-    viewer->run_move(task_next);
-}
-
-void
-SgChange::run_move(HTaskPtr task_next)
-{    
-    sgroot_A->updateControllerState();
-    sgroot_A->allExecute(viewer->width, viewer->height);    
-    viewer->light_xyz_stock = sgroot_A->getLightVector();
-}
-
-static void 
 post2rendering(SchedTask *s, void *sgchange_, void *arg)
 {
     SgChange *sgchange = (SgChange *)sgchange_;
--- a/Renderer/Test/create_task.cc	Sat Jan 30 19:33:16 2010 +0900
+++ b/Renderer/Test/create_task.cc	Mon Feb 01 17:08:36 2010 +0900
@@ -5,7 +5,7 @@
 #include "create_task.h"
 #include "types.h"
 #include "Func.h"
-
+#include "SgChange.h"
 
 Property *property, *update_property;
 
@@ -25,7 +25,7 @@
     property_task->add_outData(update_property, sizeof(Property));
     property_task->set_cpu(SPE_ANY);
 
-    property_task->set_post(createSceneGraphFromProperty, update_property, sgroot);
+    property_task->set_post(createSceneGraphFromProperty, (void *)sgroot, 0);
     property_task->spawn();
 }
 
@@ -42,6 +42,7 @@
     SceneGraphPtr node;
 
     node = sgroot->createSceneGraph(update_property->name);
+    //node = sgroot->createSceneGraph("Ball");
     node->set_move_collision(move, collision);
     node->xyz[0] = update_property->xyz[0];
     node->xyz[1] = update_property->xyz[1];
@@ -64,8 +65,12 @@
 }
 
 MainLoopPtr 
-create_task::init(Viewer *sgroot, int screen_w, int screen_h)
+create_task::init(Viewer *viewer, int screen_w, int screen_h)
 {
+    // SgChange を使うための2行
+    SgChange *sgroot = new SgChange(viewer);
+    sgroot->run_init();
+
     property        = (Property *)sgroot->manager->allocate(sizeof(Property));
     update_property = (Property *)sgroot->manager->allocate(sizeof(Property));