Mercurial > hg > Game > Cerium
comparison TaskManager/Test/test_render/SceneGraphRoot.cc @ 421:6094dfd1f08c draft
comment
author | game@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Thu, 24 Sep 2009 12:35:32 +0900 |
parents | 0d2dc1869cbe |
children | 217258e3d148 |
comparison
equal
deleted
inserted
replaced
420:cd9baead0c39 | 421:6094dfd1f08c |
---|---|
188 list->move_execute(screen_w, screen_h); | 188 list->move_execute(screen_w, screen_h); |
189 list->collision_check(screen_w, screen_h, list); | 189 list->collision_check(screen_w, screen_h, list); |
190 | 190 |
191 list->frame++; | 191 list->frame++; |
192 list = list->next; | 192 list = list->next; |
193 | |
194 if(sg_exec_tree != NULL) { | |
195 return; | |
196 } | |
197 | |
198 /*removeのflagをもとにtreeを形成*/ | |
199 /* spe から送り返されてきた property の配列を見て生成する for()*/ | |
200 for (Property *t = property[0]; is_end(t); t++){ | |
201 SceneGraphPtr s = application->scenegraph_factory(t); // SceneGraphNode を作る | |
202 t->scenegraph = s; // property list には SceneGraphへのポインタが入っている | |
203 application->scenegraph_connector(property[0], s); // add する | |
204 } | |
205 | |
206 | |
207 | |
208 // 現在、allExecute が終わった時点では | |
209 // camera->children が User SceneGraph の root になる | |
210 | |
211 /** | |
212 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
213 * そっちを次の Scene にする | |
214 */ | |
215 | |
216 sg_exec_tree = camera->children; | |
217 } | |
218 | |
219 | |
220 void | |
221 SceneGraphRoot::allExecute(int screen_w, int screen_h) | |
222 { | |
223 SceneGraphPtr list = sg_available_list; | |
224 SceneGraphPtr t = sg_exec_tree; | |
225 SceneGraphPtr cur_parent = camera; | |
226 | |
227 // 前フレームで描画した SceneGraph は削除 | |
228 allRemove(sg_remove_list); | |
229 | |
230 // 前フレームに作られた SceneGraph は描画用に移行 | |
231 // 現フレームでの操作は以下の tree,list には適用されない | |
232 sg_draw_tree = sg_exec_tree; | |
233 sg_remove_list = sg_available_list; | |
234 | |
235 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
236 sg_exec_tree = NULL; | |
237 sg_available_list = NULL; | |
238 | |
239 camera->move_execute(screen_w, screen_h); | |
240 camera->update(screen_w, screen_h); | |
241 | |
242 camera->children = NULL; | |
243 camera->lastChild = NULL; | |
244 | |
245 /*まずは全部動作させる*/ | |
246 while (list) { | |
247 | |
248 list->move_execute(screen_w, screen_h); | |
249 list->collision_check(screen_w, screen_h, list); | |
250 | |
251 list->frame++; | |
252 list = list->next; | |
253 | |
254 } | |
193 | 255 |
194 if(sg_exec_tree != NULL) { | 256 if(sg_exec_tree != NULL) { |
195 return; | 257 return; |
196 } | 258 } |
197 | 259 |
242 */ | 304 */ |
243 | 305 |
244 sg_exec_tree = camera->children; | 306 sg_exec_tree = camera->children; |
245 } | 307 } |
246 | 308 |
247 | |
248 void | |
249 SceneGraphRoot::allExecute(int screen_w, int screen_h) | |
250 { | |
251 SceneGraphPtr list = sg_available_list; | |
252 SceneGraphPtr t = sg_exec_tree; | |
253 SceneGraphPtr cur_parent = camera; | |
254 | |
255 // 前フレームで描画した SceneGraph は削除 | |
256 allRemove(sg_remove_list); | |
257 | |
258 // 前フレームに作られた SceneGraph は描画用に移行 | |
259 // 現フレームでの操作は以下の tree,list には適用されない | |
260 sg_draw_tree = sg_exec_tree; | |
261 sg_remove_list = sg_available_list; | |
262 | |
263 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
264 sg_exec_tree = NULL; | |
265 sg_available_list = NULL; | |
266 | |
267 camera->move_execute(screen_w, screen_h); | |
268 camera->update(screen_w, screen_h); | |
269 | |
270 camera->children = NULL; | |
271 camera->lastChild = NULL; | |
272 | |
273 /*まずは全部動作させる*/ | |
274 while (list) { | |
275 | |
276 list->move_execute(screen_w, screen_h); | |
277 list->collision_check(screen_w, screen_h, list); | |
278 | |
279 list->frame++; | |
280 list = list->next; | |
281 | |
282 } | |
283 | |
284 if(sg_exec_tree != NULL) { | |
285 return; | |
286 } | |
287 | |
288 /*removeのflagをもとにtreeを形成*/ | |
289 while (t) { | |
290 SceneGraphPtr c = NULL; | |
291 if (!t->isRemoved()) { | |
292 c = t->clone(); | |
293 addNext(c); | |
294 cur_parent->addChild(c); | |
295 c->frame = t->frame; | |
296 /*親の回転、座標から、子の回転、座標を算出*/ | |
297 get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix); | |
298 } | |
299 | |
300 if (t->children != NULL && c != NULL) { | |
301 cur_parent = c; | |
302 t = t->children; | |
303 } else if (t->brother != NULL) { | |
304 t = t->brother; | |
305 } else { | |
306 while (t) { | |
307 if (t->brother != NULL) { | |
308 t = t->brother; | |
309 break; | |
310 } else { | |
311 if (t->parent == NULL) { | |
312 t = NULL; | |
313 break; | |
314 } else { | |
315 cur_parent = cur_parent->parent; | |
316 t = t->parent; | |
317 | |
318 } | |
319 } | |
320 } | |
321 } | |
322 } | |
323 | |
324 | |
325 | |
326 // 現在、allExecute が終わった時点では | |
327 // camera->children が User SceneGraph の root になる | |
328 | |
329 /** | |
330 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
331 * そっちを次の Scene にする | |
332 */ | |
333 | |
334 sg_exec_tree = camera->children; | |
335 } | |
336 | |
337 void | 309 void |
338 SceneGraphRoot::allRemove(SceneGraphPtr list) | 310 SceneGraphRoot::allRemove(SceneGraphPtr list) |
339 { | 311 { |
340 SceneGraphPtr p = list; | 312 SceneGraphPtr p = list; |
341 | 313 |