changeset 1039:b9cd0c88b69a

AllExecute speparation.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 07 Dec 2010 23:59:46 +0900
parents 153dd7b4b8a6
children 283b15633c0f
files Renderer/Engine/Application.h Renderer/Engine/SceneGraphRoot.cc Renderer/Engine/SceneGraphRoot.h Renderer/Engine/viewer.cc Renderer/Engine/viewerGL.cc
diffstat 5 files changed, 80 insertions(+), 181 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/Application.h	Tue Dec 07 16:38:08 2010 +0900
+++ b/Renderer/Engine/Application.h	Tue Dec 07 23:59:46 2010 +0900
@@ -15,7 +15,7 @@
     Application();
     virtual ~Application();
 
-    virtual void app_main(Viewer *viewer){};
+    virtual bool app_main(Viewer *viewer){ return 1; /* use all execute */ };
     virtual HTaskPtr application_task(HTaskPtr next, Viewer* viewer){return next;};
     virtual MainLoopPtr init(Viewer *viewer, int w, int h)  = 0;
 };
--- a/Renderer/Engine/SceneGraphRoot.cc	Tue Dec 07 16:38:08 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Tue Dec 07 23:59:46 2010 +0900
@@ -283,101 +283,10 @@
     return p;
 }
 
-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を形成*/
-    /* spe から送り返されてきた property の配列を見て生成する for()*/
-    /*
-      for (Property *t = (Property*)app->property[0]; is_end(t); t++){
-      SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る
-      t->scenegraph = s; // property list には SceneGraphへのポインタが入っている
-      app->scenegraph_connector(property[0], s); // add する
-      } 
-    */   
-    
-
-    // 現在、allExecute が終わった時点では
-    // camera->children が User SceneGraph の root になる
-
-    /**
-     * NULL じゃなかったら、setSceneData が呼ばれてるから
-     * そっちを次の Scene にする
-     */
-
-    sg_exec_tree = camera->children;
-}
-
-
 
 void
-SceneGraphRoot::allExecute(int screen_w, int screen_h)
+SceneGraphRoot::lightCalc()
 {
-    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;
-
-    /*まずは全部動作させる*/
-    while (list) {
-
-        list->move_execute(screen_w, screen_h);
-        list->collision_check(screen_w, screen_h, list);	
-        
-	list->frame++; 
-        list = list->next;
-    }    
-
     int light_num = 4;
     for (int i = 0; i < light_num; i++) {
 
@@ -398,12 +307,71 @@
 	light_vector[i*4+3] *= -1;
 
     }
+}
 
-   
+void
+SceneGraphRoot::flip()
+{
+    // 前フレームで描画した 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;
+}
+
+void
+SceneGraphRoot::allExecute(int screen_w, int screen_h)
+{
+    SceneGraphPtr list = sg_available_list;
+
+    flip();
+
+    camera->move_execute(screen_w, screen_h);
+    camera->update(screen_w, screen_h);
+
+    camera->children = NULL;
+    camera->lastChild = NULL;
+
+    /*まずは全部動作させる*/
+    while (list) {
+
+        list->move_execute(screen_w, screen_h);
+        list->collision_check(screen_w, screen_h, list);	
+        
+	list->frame++; 
+        list = list->next;
+    }    
+
+    lightCalc();
+
     if(sg_exec_tree != NULL) {
 	return;
     }
 
+    copyTree(sg_draw_tree, camera);
+
+    // 現在、allExecute が終わった時点では
+    // camera->children が User SceneGraph の root になる
+
+    /**
+     * NULL じゃなかったら、setSceneData が呼ばれてるから
+     * そっちを次の Scene にする
+     */
+
+    sg_exec_tree = camera->children;
+}
+   
+void
+SceneGraphRoot::copyTree(SceneGraphPtr t, SceneGraphPtr cur_parent)
+{
+    // SceneGraphPtr t = sg_draw_tree;
+
     /*removeのflagをもとにtreeを形成*/
     while (t) {
 	SceneGraphPtr c = NULL;
@@ -443,82 +411,8 @@
 	}
     }
 
-      
-
-    // 現在、allExecute が終わった時点では
-    // camera->children が User SceneGraph の root になる
-
-    /**
-     * NULL じゃなかったら、setSceneData が呼ばれてるから
-     * そっちを次の Scene にする
-     */
-
-    sg_exec_tree = camera->children;
 }
 
-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);
-    // ここで move_execute から実行される move_task の処理が終わるまで待ちたい
-    //while(move_finish_flag == 0) {}
-    //move_finish_flag = 0;
-
-    list->create_sg_execute();
-    
-    list->collision_check(screen_w, screen_h, list);	
-    /* ここまで exec_task にする */
-    
-    
-    /* ここから下を exec_task の post_func に*/
-    list->frame++; 
-    list = list->next;
-
-
-    int light_num = 4;
-    for (int i = 0; i < light_num; i++) {
-
-	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
-      
-	light_vector[i*4] = 0.0f;
-	light_vector[i*4+1] = 0.0f;
-	light_vector[i*4+2] = 0.0f;
-	light_vector[i*4+3] = 1.0f;
-
-	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
-      
-	light_vector[i*4] /= light_vector[i*4+2];
-	light_vector[i*4+1] /= light_vector[i*4+2];
-
-    }
-   
-    if(sg_exec_tree != NULL) {
-	return;
-    }
-}
 
 /*
   ExecMove task の post func として呼んでやる
--- a/Renderer/Engine/SceneGraphRoot.h	Tue Dec 07 16:38:08 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Tue Dec 07 23:59:46 2010 +0900
@@ -121,7 +121,11 @@
 
     /* Other System API */
     void allExecute(int screen_w, int screen_h);
-    void oneExecute(int screen_w, int screen_h);
+    void lightCalc();
+    void flip();
+    void copyTree(SceneGraphPtr from, SceneGraphPtr to);
+
+    // void oneExecute(int screen_w, int screen_h);
     void checkRemove();
     SceneGraphPtr getExecuteSceneGraph();
     SceneGraphPtr getDrawSceneGraph();
@@ -132,8 +136,8 @@
     int* getLightSwitch();
     int getLightSysSwitch();
 
-    void speExecute(int screen_w, int screen_h);
-    void speExecute(int screen_w, int screen_h, Application *app);
+    // void speExecute(int screen_w, int screen_h);
+    // void speExecute(int screen_w, int screen_h, Application *app);
 
     /* System API */
     void registSceneGraph(SceneGraphPtr sg);
--- a/Renderer/Engine/viewer.cc	Tue Dec 07 16:38:08 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Tue Dec 07 23:59:46 2010 +0900
@@ -315,15 +315,15 @@
 
     pixels = dev->flip_screen(pixels);
     sgroot->updateControllerState();
-    app->app_main(this);
-
-    //TaskArray を使うか使わないか
-    if (sgroot->gtask_array != NULL) {
-	sgroot->create_task_array();
-	sgroot->allExecute(width, height);
-	sgroot->task_array_finish();
-    } else {
-	sgroot->allExecute(width, height);	
+    if (app->app_main(this)) {
+	//TaskArray を使うか使わないか
+	if (sgroot->gtask_array != NULL) {
+	    sgroot->create_task_array();
+	    sgroot->allExecute(width, height);
+	    sgroot->task_array_finish();
+	} else {
+	    sgroot->allExecute(width, height);	
+	}
     }
 
     light_xyz_stock = sgroot->getLightVector();
--- a/Renderer/Engine/viewerGL.cc	Tue Dec 07 16:38:08 2010 +0900
+++ b/Renderer/Engine/viewerGL.cc	Tue Dec 07 23:59:46 2010 +0900
@@ -15,7 +15,7 @@
       v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12];
     }
 }
-
+#if 0
 static void
 ApplyNormalMatrix(float *v, float *m)
 {
@@ -29,6 +29,7 @@
       v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8];
     }
 }
+#endif
 
 ViewerGL::ViewerGL(TaskManager *m, int b, int w, int h, int _num)
 {