350
|
1 /**
|
351
|
2 * 前もって collision する対象を task の global に登録しておく task が必要
|
|
3 * SceneGraph を読み込んで
|
|
4 * 衝突判定を行う node を確保する
|
|
5 * node の型に対応する collision 関数を呼び出す
|
|
6 * 新しい SceneGraoh を生成する
|
|
7 * 登録してある global を解放する task を用意する
|
|
8 *
|
350
|
9 */
|
|
10
|
|
11 // #define DEBUG
|
|
12 #include "error.h"
|
|
13 #include "scene_graph_pack.h"
|
|
14
|
351
|
15 // 本来は tasks.xml に書く
|
|
16 SchedDefineTask(SceneGraphCollision);
|
350
|
17
|
351
|
18 int
|
|
19 move::run(void *rbuf, void *wbuf)
|
|
20 {
|
|
21 __debug_spe("SceneGraphCollision\n");
|
350
|
22
|
351
|
23 SceneGraphPackPtr cur = (SceneGraphPack*) rbuf;
|
|
24 int collision_task_id = cur->collision_task;
|
|
25 // next は Mainmemory 上のアドレス
|
|
26 SceneGraphPackPtr next =
|
|
27 (SceneGraphPackPtr)smanager->allocate(sizeof(SceneGraphPack));
|
350
|
28
|
351
|
29 if (smanager->call_task(collision_task_id, (void*)cur, (void*)next)) {
|
|
30 // 次の状態があって、新しく node を確保してそこを確保する
|
|
31 smanager->write(cur, next, sizeof(SceneGraphPack));
|
|
32 } else {
|
|
33 // この node は消滅
|
|
34 smanager->free(next);
|
|
35 }
|
350
|
36
|
|
37 return 0;
|
351
|
38 }
|