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