# HG changeset patch # User hiroki@henri.cr.ie.u-ryukyu.ac.jp # Date 1265011716 -32400 # Node ID bb47827c04c167400b88f04d6b05b7bec237952a # Parent e615e552efa530d4faac423b741db8b867b6ab7b fix create_task diff -r e615e552efa5 -r bb47827c04c1 Renderer/Engine/SceneGraphRoot.cc --- 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; diff -r e615e552efa5 -r bb47827c04c1 Renderer/Engine/SceneGraphRoot.h --- a/Renderer/Engine/SceneGraphRoot.h Sat Jan 30 19:33:16 2010 +0900 +++ b/Renderer/Engine/SceneGraphRoot.h Mon Feb 01 17:08:36 2010 +0900 @@ -83,6 +83,7 @@ /* Other System API */ void allExecute(int screen_w, int screen_h); + void oneExecute(int screen_w, int screen_h); void checkRemove(); SceneGraphPtr getExecuteSceneGraph(); SceneGraphPtr getDrawSceneGraph(); diff -r e615e552efa5 -r bb47827c04c1 Renderer/Engine/SgChange.cc --- a/Renderer/Engine/SgChange.cc Sat Jan 30 19:33:16 2010 +0900 +++ b/Renderer/Engine/SgChange.cc Mon Feb 01 17:08:36 2010 +0900 @@ -17,7 +17,6 @@ static void post2runLoop(SchedTask *s, void *viewer, void *s1); static void post2run(SchedTask *s, void *viewer, void *s1); static void post2runDraw(SchedTask *s, void *viewer, void *s1); -static void post2runMove(SchedTask *s, void *viewer, void *s1); static void post2rendering(SchedTask *s, void *viewer, void *s1); /* measure for FPS (Frame Per Second) */ @@ -85,12 +84,6 @@ void SgChange::pass_draw_tree() { - /* - SceneGraphRoot *tmp; - tmp = sgroot_A; - sgroot_A = sgroot_B; - sgroot_B = tmp; - */ sgroot_B->sg_draw_tree = sgroot_A->sg_exec_tree; } @@ -125,15 +118,10 @@ HTaskPtr draw_task = manager->create_task(Dummy); draw_task->set_post(post2rendering, (void *)this, 0); -#if 0 - HTaskPtr move_task = manager->create_task(Dummy); - move_task->set_post(post2runMove, (void *)this, 0); -#else HTaskPtr move_task = manager->create_task(RunMove); move_task->set_param(0, (memaddr)this); move_task->set_param(1, viewer->width); move_task->set_param(2, viewer->height); -#endif HTaskPtr dummy_task = manager->create_task(Dummy); @@ -143,27 +131,12 @@ loop_task->wait_for(move_task); draw_task->spawn(); + // この時点で app の task_id を知っていないとダメか move_task->spawn(); loop_task->spawn(); } static void -post2runMove(SchedTask *s, void *viewer_, void *arg) -{ - SgChange *viewer = (SgChange *)viewer_; - HTaskPtr task_next = viewer->manager->create_task(Dummy); - viewer->run_move(task_next); -} - -void -SgChange::run_move(HTaskPtr task_next) -{ - sgroot_A->updateControllerState(); - sgroot_A->allExecute(viewer->width, viewer->height); - viewer->light_xyz_stock = sgroot_A->getLightVector(); -} - -static void post2rendering(SchedTask *s, void *sgchange_, void *arg) { SgChange *sgchange = (SgChange *)sgchange_; diff -r e615e552efa5 -r bb47827c04c1 Renderer/Test/create_task.cc --- a/Renderer/Test/create_task.cc Sat Jan 30 19:33:16 2010 +0900 +++ b/Renderer/Test/create_task.cc Mon Feb 01 17:08:36 2010 +0900 @@ -5,7 +5,7 @@ #include "create_task.h" #include "types.h" #include "Func.h" - +#include "SgChange.h" Property *property, *update_property; @@ -25,7 +25,7 @@ property_task->add_outData(update_property, sizeof(Property)); property_task->set_cpu(SPE_ANY); - property_task->set_post(createSceneGraphFromProperty, update_property, sgroot); + property_task->set_post(createSceneGraphFromProperty, (void *)sgroot, 0); property_task->spawn(); } @@ -42,6 +42,7 @@ SceneGraphPtr node; node = sgroot->createSceneGraph(update_property->name); + //node = sgroot->createSceneGraph("Ball"); node->set_move_collision(move, collision); node->xyz[0] = update_property->xyz[0]; node->xyz[1] = update_property->xyz[1]; @@ -64,8 +65,12 @@ } MainLoopPtr -create_task::init(Viewer *sgroot, int screen_w, int screen_h) +create_task::init(Viewer *viewer, int screen_w, int screen_h) { + // SgChange を使うための2行 + SgChange *sgroot = new SgChange(viewer); + sgroot->run_init(); + property = (Property *)sgroot->manager->allocate(sizeof(Property)); update_property = (Property *)sgroot->manager->allocate(sizeof(Property));