Mercurial > hg > Game > Cerium
diff Renderer/Engine/SceneGraphRoot.cc @ 1042:d0bb27bf985b draft
AllExecute speparation.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 07 Dec 2010 23:59:46 +0900 |
parents | a9581a9df440 |
children | a4d00a3c4fb7 |
line wrap: on
line diff
--- 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 として呼んでやる