diff TaskManager/Test/test_render/SceneGraphRoot.cpp @ 396:d1f1e27d0a12

don't move. separate allExecute from run_loop
author game@henri.cr.ie.u-ryukyu.ac.jp
date Fri, 18 Sep 2009 18:28:56 +0900
parents be8f785a82e9
children a4f690f44842
line wrap: on
line diff
--- a/TaskManager/Test/test_render/SceneGraphRoot.cpp	Thu Sep 17 16:55:18 2009 +0900
+++ b/TaskManager/Test/test_render/SceneGraphRoot.cpp	Fri Sep 18 18:28:56 2009 +0900
@@ -160,6 +160,92 @@
 }
 
 void
+SceneGraphRoot::speExecute(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);	
+    
+    list->frame++; 
+    list = list->next;
+
+    if(sg_exec_tree != NULL) {
+      return;
+    }
+
+    /*removeのflagをもとにtreeを形成*/
+    while (t) {
+	SceneGraphPtr c = NULL;
+	if (!t->isRemoved()) {
+	    c = t->clone();	    
+	    addNext(c);
+	    cur_parent->addChild(c);
+	    c->frame = t->frame;
+            /*親の回転、座標から、子の回転、座標を算出*/
+            get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix);
+        } 
+
+	if (t->children != NULL && c != NULL) {
+	    cur_parent = c;
+	    t = t->children;
+	} else if (t->brother != NULL) {
+	    t = t->brother;
+	} else {
+	    while (t) {
+		if (t->brother != NULL) {
+		    t = t->brother;
+		    break;
+		} else {
+		    if (t->parent == NULL) {
+			t = NULL;
+			break;
+		    } else {
+                        cur_parent = cur_parent->parent;
+                        t = t->parent;
+			
+		    }
+		}
+	    }	    
+	}
+    }
+
+      
+
+    // 現在、allExecute が終わった時点では
+    // camera->children が User SceneGraph の root になる
+
+    /**
+     * NULL じゃなかったら、setSceneData が呼ばれてるから
+     * そっちを次の Scene にする
+     */
+
+    sg_exec_tree = camera->children;
+}
+
+
+void
 SceneGraphRoot::allExecute(int screen_w, int screen_h)
 {
     SceneGraphPtr list = sg_available_list;