diff Renderer/Engine/SceneGraphRoot.cc @ 758:77f936380930 draft

fix create_task
author hiroki@henri.cr.ie.u-ryukyu.ac.jp
date Mon, 01 Feb 2010 17:08:36 +0900
parents 1666dba6f6d9
children 45f7ab7101ea
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;