Mercurial > hg > Members > e085722 > Cerium
comparison Renderer/Engine/SgChange.cc @ 0:04e28d8d3c6f
first commit
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Nov 2010 01:23:25 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:04e28d8d3c6f |
---|---|
1 #include <SDL.h> | |
2 #include "SgChange.h" | |
3 #include "viewer_types.h" | |
4 #include "SceneGraph.h" | |
5 #include "SceneGraphRoot.h" | |
6 #include "scene_graph_pack.h" | |
7 #include "sys.h" | |
8 #include "Func.h" | |
9 #include "error.h" | |
10 #include "TaskManager.h" | |
11 #include <wchar.h> | |
12 #include "Pad.h" | |
13 #include "Application.h" | |
14 #include "lindaapi.h" | |
15 | |
16 static void post2runLoop(SchedTask *s, void *viewer, void *s1); | |
17 static void post2run(SchedTask *s, void *viewer, void *s1); | |
18 static void post2runDraw(SchedTask *s, void *viewer, void *s1); | |
19 static void post2rendering(SchedTask *s, void *viewer, void *s1); | |
20 | |
21 /* measure for FPS (Frame Per Second) */ | |
22 extern int start_time; | |
23 extern int this_time; | |
24 extern int frames; | |
25 | |
26 /* Data Pack sent to Other CPUs (ex. SPE) */ | |
27 extern RederingData r[2]; | |
28 | |
29 void | |
30 SgChange::run_init() | |
31 { | |
32 int width = viewer->width; | |
33 int height = viewer->height; | |
34 sgroot_A = new SceneGraphRoot(width, height); | |
35 sgroot_A->tmanager = viewer->manager; | |
36 sgroot_B = new SceneGraphRoot(width, height); | |
37 sgroot_B->tmanager = viewer->manager; | |
38 } | |
39 | |
40 HTaskPtr | |
41 SgChange::initLoop() | |
42 { | |
43 return viewer->initLoop(); | |
44 } | |
45 | |
46 void | |
47 SgChange::mainLoop() | |
48 { | |
49 HTaskPtr task_next = initLoop(); | |
50 | |
51 task_next->set_post(&post2run, (void *)this, 0); | |
52 task_next->spawn(); | |
53 } | |
54 | |
55 | |
56 | |
57 static void | |
58 post2run(SchedTask *s, void *sgchange_, void *arg) | |
59 { | |
60 SgChange *sgchange = (SgChange*)sgchange_; | |
61 HTaskPtr task_next = sgchange->manager->create_task(Dummy); | |
62 sgchange->run_loop(task_next); | |
63 psx_sync_n(); | |
64 } | |
65 | |
66 static void | |
67 post2runLoop(SchedTask *s, void *sgchange_, void *arg) | |
68 { | |
69 SgChange *sgchange = (SgChange*)sgchange_; | |
70 HTaskPtr task_next = sgchange->manager->create_task(Dummy); | |
71 sgchange->viewer->light_xyz_stock = sgchange->sgroot_A->getLightVector(); | |
72 sgchange->pass_draw_tree(); | |
73 sgchange->run_loop(task_next); | |
74 | |
75 psx_sync_n(); | |
76 } | |
77 | |
78 | |
79 void | |
80 SgChange::pass_draw_tree() | |
81 { | |
82 sgroot_B->sg_draw_tree = sgroot_A->sg_exec_tree; | |
83 } | |
84 | |
85 void | |
86 SgChange::run_loop(HTaskPtr task_next) | |
87 { | |
88 viewer->dev->clear_screen(); | |
89 | |
90 bool quit_flg; | |
91 quit_flg = viewer->quit_check(); | |
92 if (quit_flg == true) { | |
93 // this_time = viewer->get_ticks(); | |
94 viewer->run_finish(); | |
95 return; | |
96 } | |
97 | |
98 viewer->dev->clean_pixels(); | |
99 | |
100 for (int i = 1; i <= r[spi].spackList_length; i++) { | |
101 r[spi].spackList[i-1].reinit(i*split_screen_h); | |
102 } | |
103 | |
104 sgroot_A->updateControllerState(); | |
105 | |
106 HTaskPtr loop_task = manager->create_task(Dummy); | |
107 loop_task->set_post(post2runLoop, (void *)this, 0); | |
108 | |
109 HTaskPtr draw_task = manager->create_task(Dummy); | |
110 draw_task->set_post(post2rendering, (void *)this, 0); | |
111 | |
112 /* | |
113 application 側で sgroot に task を生成登録する | |
114 引数を渡したりは後でやる。 | |
115 登録された関数を実行して task を生成登録する。 | |
116 */ | |
117 sgroot_A->regist_execute(); | |
118 | |
119 //HTaskPtr move_task = manager->create_task(RunMove); | |
120 HTaskPtr move_task = manager->create_task(ExecMove); | |
121 move_task->set_param(0, (memaddr)this); | |
122 move_task->set_param(1, viewer->width); | |
123 move_task->set_param(2, viewer->height); | |
124 | |
125 /* | |
126 TTaskPtr move_finish = manager->create_task(Dummy); | |
127 loop_task->wait_for(move_finish); | |
128 move_finish は app の move_task の post_func で実行させてやる | |
129 */ | |
130 | |
131 /* | |
132 描画終了確認用のダミータスク | |
133 描画の最後で spwan させる | |
134 */ | |
135 HTaskPtr dummy_task = manager->create_task(Dummy); | |
136 | |
137 draw_finish = dummy_task; | |
138 | |
139 loop_task->wait_for(draw_finish); | |
140 // move_task に wait_for ではなく sgroot_A->move_exec_task に wait_for するべき | |
141 // どこかで move_exec_task->spawn() しないとな | |
142 loop_task->wait_for(sgroot_A->move_exec_task); | |
143 | |
144 //loop_task->wait_for(move_task); | |
145 | |
146 | |
147 draw_task->spawn(); | |
148 // この時点で app の task_id を知っていないとダメか | |
149 move_task->spawn(); | |
150 loop_task->spawn(); | |
151 } | |
152 | |
153 static void | |
154 post2rendering(SchedTask *s, void *sgchange_, void *arg) | |
155 { | |
156 SgChange *sgchange = (SgChange *)sgchange_; | |
157 HTaskPtr task_next = sgchange->manager->create_task(Dummy); | |
158 sgchange->rendering(task_next); | |
159 | |
160 } | |
161 | |
162 void | |
163 SgChange::rendering(HTaskPtr task_next) | |
164 { | |
165 viewer->common_rendering(task_next, sgroot_B); | |
166 | |
167 task_next->set_post(post2runDraw, (void*)this, 0); | |
168 task_next->spawn(); | |
169 } | |
170 | |
171 | |
172 static void | |
173 post2runDraw(SchedTask *s, void *sgchange_, void *arg) | |
174 { | |
175 SgChange *sgchange = (SgChange *)sgchange_; | |
176 HTaskPtr task_next = sgchange->manager->create_task(Dummy); | |
177 sgchange->run_draw(task_next); | |
178 } | |
179 | |
180 void | |
181 SgChange::run_draw(HTaskPtr task_next) // 引数に post2runLoop を入れるようにする | |
182 { | |
183 viewer->common_draw(task_next); | |
184 | |
185 this->draw_finish->wait_for(task_next); | |
186 task_next->spawn(); | |
187 this->draw_finish->spawn(); | |
188 | |
189 frames++; | |
190 } | |
191 | |
192 /* end */ |