0
|
1 #include <SDL.h>
|
|
2 #include "SgChange.h"
|
|
3 #include "viewer_types.h"
|
|
4 #include "SceneGraph.h"
|
|
5 #include "SceneGraphRoot.h"
|
|
6 #include "scene_graph_pack.h"
|
|
7 #include "sys.h"
|
|
8 #include "Func.h"
|
|
9 #include "error.h"
|
|
10 #include "TaskManager.h"
|
|
11 #include <wchar.h>
|
|
12 #include "Pad.h"
|
|
13 #include "Application.h"
|
|
14 #include "lindaapi.h"
|
|
15
|
|
16 static void post2runLoop(SchedTask *s, void *viewer, void *s1);
|
|
17 static void post2run(SchedTask *s, void *viewer, void *s1);
|
|
18 static void post2runDraw(SchedTask *s, void *viewer, void *s1);
|
|
19 static void post2rendering(SchedTask *s, void *viewer, void *s1);
|
|
20
|
|
21 /* measure for FPS (Frame Per Second) */
|
|
22 extern int start_time;
|
|
23 extern int this_time;
|
|
24 extern int frames;
|
|
25
|
|
26 /* Data Pack sent to Other CPUs (ex. SPE) */
|
|
27 extern RederingData r[2];
|
|
28
|
|
29 void
|
|
30 SgChange::run_init()
|
|
31 {
|
|
32 int width = viewer->width;
|
|
33 int height = viewer->height;
|
|
34 sgroot_A = new SceneGraphRoot(width, height);
|
|
35 sgroot_A->tmanager = viewer->manager;
|
|
36 sgroot_B = new SceneGraphRoot(width, height);
|
|
37 sgroot_B->tmanager = viewer->manager;
|
|
38 }
|
|
39
|
|
40 HTaskPtr
|
|
41 SgChange::initLoop()
|
|
42 {
|
|
43 return viewer->initLoop();
|
|
44 }
|
|
45
|
|
46 void
|
|
47 SgChange::mainLoop()
|
|
48 {
|
|
49 HTaskPtr task_next = initLoop();
|
|
50
|
|
51 task_next->set_post(&post2run, (void *)this, 0);
|
|
52 task_next->spawn();
|
|
53 }
|
|
54
|
|
55
|
|
56
|
|
57 static void
|
|
58 post2run(SchedTask *s, void *sgchange_, void *arg)
|
|
59 {
|
|
60 SgChange *sgchange = (SgChange*)sgchange_;
|
|
61 HTaskPtr task_next = sgchange->manager->create_task(Dummy);
|
|
62 sgchange->run_loop(task_next);
|
|
63 psx_sync_n();
|
|
64 }
|
|
65
|
|
66 static void
|
|
67 post2runLoop(SchedTask *s, void *sgchange_, void *arg)
|
|
68 {
|
|
69 SgChange *sgchange = (SgChange*)sgchange_;
|
|
70 HTaskPtr task_next = sgchange->manager->create_task(Dummy);
|
|
71 sgchange->viewer->light_xyz_stock = sgchange->sgroot_A->getLightVector();
|
|
72 sgchange->pass_draw_tree();
|
|
73 sgchange->run_loop(task_next);
|
|
74
|
|
75 psx_sync_n();
|
|
76 }
|
|
77
|
|
78
|
|
79 void
|
|
80 SgChange::pass_draw_tree()
|
|
81 {
|
|
82 sgroot_B->sg_draw_tree = sgroot_A->sg_exec_tree;
|
|
83 }
|
|
84
|
|
85 void
|
|
86 SgChange::run_loop(HTaskPtr task_next)
|
|
87 {
|
|
88 viewer->dev->clear_screen();
|
|
89
|
|
90 bool quit_flg;
|
|
91 quit_flg = viewer->quit_check();
|
|
92 if (quit_flg == true) {
|
|
93 // this_time = viewer->get_ticks();
|
|
94 viewer->run_finish();
|
|
95 return;
|
|
96 }
|
|
97
|
|
98 viewer->dev->clean_pixels();
|
|
99
|
|
100 for (int i = 1; i <= r[spi].spackList_length; i++) {
|
|
101 r[spi].spackList[i-1].reinit(i*split_screen_h);
|
|
102 }
|
|
103
|
|
104 sgroot_A->updateControllerState();
|
|
105
|
|
106 HTaskPtr loop_task = manager->create_task(Dummy);
|
|
107 loop_task->set_post(post2runLoop, (void *)this, 0);
|
|
108
|
|
109 HTaskPtr draw_task = manager->create_task(Dummy);
|
|
110 draw_task->set_post(post2rendering, (void *)this, 0);
|
|
111
|
|
112 /*
|
|
113 application 側で sgroot に task を生成登録する
|
|
114 引数を渡したりは後でやる。
|
|
115 登録された関数を実行して task を生成登録する。
|
|
116 */
|
|
117 sgroot_A->regist_execute();
|
|
118
|
|
119 //HTaskPtr move_task = manager->create_task(RunMove);
|
|
120 HTaskPtr move_task = manager->create_task(ExecMove);
|
|
121 move_task->set_param(0, (memaddr)this);
|
|
122 move_task->set_param(1, viewer->width);
|
|
123 move_task->set_param(2, viewer->height);
|
|
124
|
|
125 /*
|
|
126 TTaskPtr move_finish = manager->create_task(Dummy);
|
|
127 loop_task->wait_for(move_finish);
|
|
128 move_finish は app の move_task の post_func で実行させてやる
|
|
129 */
|
|
130
|
|
131 /*
|
|
132 描画終了確認用のダミータスク
|
|
133 描画の最後で spwan させる
|
|
134 */
|
|
135 HTaskPtr dummy_task = manager->create_task(Dummy);
|
|
136
|
|
137 draw_finish = dummy_task;
|
|
138
|
|
139 loop_task->wait_for(draw_finish);
|
|
140 // move_task に wait_for ではなく sgroot_A->move_exec_task に wait_for するべき
|
|
141 // どこかで move_exec_task->spawn() しないとな
|
|
142 loop_task->wait_for(sgroot_A->move_exec_task);
|
|
143
|
|
144 //loop_task->wait_for(move_task);
|
|
145
|
|
146
|
|
147 draw_task->spawn();
|
|
148 // この時点で app の task_id を知っていないとダメか
|
|
149 move_task->spawn();
|
|
150 loop_task->spawn();
|
|
151 }
|
|
152
|
|
153 static void
|
|
154 post2rendering(SchedTask *s, void *sgchange_, void *arg)
|
|
155 {
|
|
156 SgChange *sgchange = (SgChange *)sgchange_;
|
|
157 HTaskPtr task_next = sgchange->manager->create_task(Dummy);
|
|
158 sgchange->rendering(task_next);
|
|
159
|
|
160 }
|
|
161
|
|
162 void
|
|
163 SgChange::rendering(HTaskPtr task_next)
|
|
164 {
|
|
165 viewer->common_rendering(task_next, sgroot_B);
|
|
166
|
|
167 task_next->set_post(post2runDraw, (void*)this, 0);
|
|
168 task_next->spawn();
|
|
169 }
|
|
170
|
|
171
|
|
172 static void
|
|
173 post2runDraw(SchedTask *s, void *sgchange_, void *arg)
|
|
174 {
|
|
175 SgChange *sgchange = (SgChange *)sgchange_;
|
|
176 HTaskPtr task_next = sgchange->manager->create_task(Dummy);
|
|
177 sgchange->run_draw(task_next);
|
|
178 }
|
|
179
|
|
180 void
|
|
181 SgChange::run_draw(HTaskPtr task_next) // 引数に post2runLoop を入れるようにする
|
|
182 {
|
|
183 viewer->common_draw(task_next);
|
|
184
|
|
185 this->draw_finish->wait_for(task_next);
|
|
186 task_next->spawn();
|
|
187 this->draw_finish->spawn();
|
|
188
|
|
189 frames++;
|
|
190 }
|
|
191
|
|
192 /* end */
|