# HG changeset patch # User Shinji KONO # Date 1291733986 -32400 # Node ID b9cd0c88b69aec2b2373cf3b030e8ef677d79635 # Parent 153dd7b4b8a6865583378f74105ef1a3b9438937 AllExecute speparation. diff -r 153dd7b4b8a6 -r b9cd0c88b69a Renderer/Engine/Application.h --- 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; }; diff -r 153dd7b4b8a6 -r b9cd0c88b69a Renderer/Engine/SceneGraphRoot.cc --- 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 として呼んでやる diff -r 153dd7b4b8a6 -r b9cd0c88b69a Renderer/Engine/SceneGraphRoot.h --- 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); diff -r 153dd7b4b8a6 -r b9cd0c88b69a Renderer/Engine/viewer.cc --- 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(); diff -r 153dd7b4b8a6 -r b9cd0c88b69a Renderer/Engine/viewerGL.cc --- 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) {