Mercurial > hg > Game > Cerium
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 |