Mercurial > hg > Game > Cerium
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;