comparison Renderer/Engine/SceneGraphRoot.cc @ 1042:d0bb27bf985b draft

AllExecute speparation.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 07 Dec 2010 23:59:46 +0900
parents a9581a9df440
children a4d00a3c4fb7
comparison
equal deleted inserted replaced
1038:ac072799d994 1042:d0bb27bf985b
281 p->flag_drawable = 0; 281 p->flag_drawable = 0;
282 282
283 return p; 283 return p;
284 } 284 }
285 285
286 void 286
287 SceneGraphRoot::speExecute(int screen_w, int screen_h) 287 void
288 { 288 SceneGraphRoot::lightCalc()
289 289 {
290 SceneGraphPtr list = sg_available_list; 290 int light_num = 4;
291 // SceneGraphPtr t = sg_exec_tree; 291 for (int i = 0; i < light_num; i++) {
292 // SceneGraphPtr cur_parent = camera; 292
293 293 get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
294
295 light_vector[i*4] = 0.0f;
296 light_vector[i*4+1] = 0.0f;
297 light_vector[i*4+2] = 0.0f;
298 light_vector[i*4+3] = 1.0f;
299
300 ApplyMatrix(&light_vector[i*4], light[i]->matrix);
301
302 light_vector[i*4] /= light_vector[i*4+2];
303 light_vector[i*4+1] /= light_vector[i*4+2];
304
305 /*SIMD演算のため*/
306 light_vector[i*4+2] *= -1;
307 light_vector[i*4+3] *= -1;
308
309 }
310 }
311
312 void
313 SceneGraphRoot::flip()
314 {
294 // 前フレームで描画した SceneGraph は削除 315 // 前フレームで描画した SceneGraph は削除
295 allRemove(sg_remove_list); 316 allRemove(sg_remove_list);
296 317
297 // 前フレームに作られた SceneGraph は描画用に移行 318 // 前フレームに作られた SceneGraph は描画用に移行
298 // 現フレームでの操作は以下の tree,list には適用されない 319 // 現フレームでの操作は以下の tree,list には適用されない
300 sg_remove_list = sg_available_list; 321 sg_remove_list = sg_available_list;
301 322
302 // 現フレームで新しく SceneGraph がコピーされるので初期化 323 // 現フレームで新しく SceneGraph がコピーされるので初期化
303 sg_exec_tree = NULL; 324 sg_exec_tree = NULL;
304 sg_available_list = NULL; 325 sg_available_list = NULL;
305 326 }
306 camera->move_execute(screen_w, screen_h);
307 camera->update(screen_w, screen_h);
308
309 camera->children = NULL;
310 camera->lastChild = NULL;
311
312 list->move_execute(screen_w, screen_h);
313 list->collision_check(screen_w, screen_h, list);
314
315 list->frame++;
316 list = list->next;
317
318 if(sg_exec_tree != NULL) {
319 return;
320 }
321
322 /*removeのflagをもとにtreeを形成*/
323 /* spe から送り返されてきた property の配列を見て生成する for()*/
324 /*
325 for (Property *t = (Property*)app->property[0]; is_end(t); t++){
326 SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る
327 t->scenegraph = s; // property list には SceneGraphへのポインタが入っている
328 app->scenegraph_connector(property[0], s); // add する
329 }
330 */
331
332
333 // 現在、allExecute が終わった時点では
334 // camera->children が User SceneGraph の root になる
335
336 /**
337 * NULL じゃなかったら、setSceneData が呼ばれてるから
338 * そっちを次の Scene にする
339 */
340
341 sg_exec_tree = camera->children;
342 }
343
344
345 327
346 void 328 void
347 SceneGraphRoot::allExecute(int screen_w, int screen_h) 329 SceneGraphRoot::allExecute(int screen_w, int screen_h)
348 { 330 {
349 SceneGraphPtr list = sg_available_list; 331 SceneGraphPtr list = sg_available_list;
350 SceneGraphPtr t = sg_exec_tree; 332
351 SceneGraphPtr cur_parent = camera; 333 flip();
352
353 // 前フレームで描画した SceneGraph は削除
354 allRemove(sg_remove_list);
355
356 // 前フレームに作られた SceneGraph は描画用に移行
357 // 現フレームでの操作は以下の tree,list には適用されない
358 sg_draw_tree = sg_exec_tree;
359 sg_remove_list = sg_available_list;
360
361 // 現フレームで新しく SceneGraph がコピーされるので初期化
362 sg_exec_tree = NULL;
363 sg_available_list = NULL;
364 334
365 camera->move_execute(screen_w, screen_h); 335 camera->move_execute(screen_w, screen_h);
366 camera->update(screen_w, screen_h); 336 camera->update(screen_w, screen_h);
367 337
368 camera->children = NULL; 338 camera->children = NULL;
376 346
377 list->frame++; 347 list->frame++;
378 list = list->next; 348 list = list->next;
379 } 349 }
380 350
381 int light_num = 4; 351 lightCalc();
382 for (int i = 0; i < light_num; i++) { 352
383
384 get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
385
386 light_vector[i*4] = 0.0f;
387 light_vector[i*4+1] = 0.0f;
388 light_vector[i*4+2] = 0.0f;
389 light_vector[i*4+3] = 1.0f;
390
391 ApplyMatrix(&light_vector[i*4], light[i]->matrix);
392
393 light_vector[i*4] /= light_vector[i*4+2];
394 light_vector[i*4+1] /= light_vector[i*4+2];
395
396 /*SIMD演算のため*/
397 light_vector[i*4+2] *= -1;
398 light_vector[i*4+3] *= -1;
399
400 }
401
402
403 if(sg_exec_tree != NULL) { 353 if(sg_exec_tree != NULL) {
404 return; 354 return;
405 } 355 }
356
357 copyTree(sg_draw_tree, camera);
358
359 // 現在、allExecute が終わった時点では
360 // camera->children が User SceneGraph の root になる
361
362 /**
363 * NULL じゃなかったら、setSceneData が呼ばれてるから
364 * そっちを次の Scene にする
365 */
366
367 sg_exec_tree = camera->children;
368 }
369
370 void
371 SceneGraphRoot::copyTree(SceneGraphPtr t, SceneGraphPtr cur_parent)
372 {
373 // SceneGraphPtr t = sg_draw_tree;
406 374
407 /*removeのflagをもとにtreeを形成*/ 375 /*removeのflagをもとにtreeを形成*/
408 while (t) { 376 while (t) {
409 SceneGraphPtr c = NULL; 377 SceneGraphPtr c = NULL;
410 if (!t->isRemoved()) { 378 if (!t->isRemoved()) {
441 } 409 }
442 } 410 }
443 } 411 }
444 } 412 }
445 413
446 414 }
447 415
448 // 現在、allExecute が終わった時点では
449 // camera->children が User SceneGraph の root になる
450
451 /**
452 * NULL じゃなかったら、setSceneData が呼ばれてるから
453 * そっちを次の Scene にする
454 */
455
456 sg_exec_tree = camera->children;
457 }
458
459 void
460 SceneGraphRoot::oneExecute(int screen_w, int screen_h)
461 {
462 SceneGraphPtr list = sg_available_list;
463 //SceneGraphPtr t = sg_exec_tree;
464 //SceneGraphPtr cur_parent = camera;
465
466 // 前フレームで描画した SceneGraph は削除
467 allRemove(sg_remove_list);
468
469 // 前フレームに作られた SceneGraph は描画用に移行
470 // 現フレームでの操作は以下の tree,list には適用されない
471 sg_draw_tree = sg_exec_tree;
472 sg_remove_list = sg_available_list;
473
474 // 現フレームで新しく SceneGraph がコピーされるので初期化
475 sg_exec_tree = NULL;
476 sg_available_list = NULL;
477
478 camera->move_execute(screen_w, screen_h);
479 camera->update(screen_w, screen_h);
480
481 camera->children = NULL;
482 camera->lastChild = NULL;
483
484 /* ここから */
485 list->move_execute(screen_w, screen_h);
486 // ここで move_execute から実行される move_task の処理が終わるまで待ちたい
487 //while(move_finish_flag == 0) {}
488 //move_finish_flag = 0;
489
490 list->create_sg_execute();
491
492 list->collision_check(screen_w, screen_h, list);
493 /* ここまで exec_task にする */
494
495
496 /* ここから下を exec_task の post_func に*/
497 list->frame++;
498 list = list->next;
499
500
501 int light_num = 4;
502 for (int i = 0; i < light_num; i++) {
503
504 get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
505
506 light_vector[i*4] = 0.0f;
507 light_vector[i*4+1] = 0.0f;
508 light_vector[i*4+2] = 0.0f;
509 light_vector[i*4+3] = 1.0f;
510
511 ApplyMatrix(&light_vector[i*4], light[i]->matrix);
512
513 light_vector[i*4] /= light_vector[i*4+2];
514 light_vector[i*4+1] /= light_vector[i*4+2];
515
516 }
517
518 if(sg_exec_tree != NULL) {
519 return;
520 }
521 }
522 416
523 /* 417 /*
524 ExecMove task の post func として呼んでやる 418 ExecMove task の post func として呼んでやる
525 */ 419 */
526 void 420 void