Mercurial > hg > Members > kono > Cerium
annotate Renderer/Engine/SceneGraphRoot.cc @ 597:5c5cd31b9d43
add Light Object
author | yutaka@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Thu, 05 Nov 2009 20:17:59 +0900 |
parents | e3e6f6fbbfc4 |
children | d0b8860c17f8 |
rev | line source |
---|---|
507 | 1 #include <SDL.h> |
2 #include <SDL_image.h> | |
3 #include <libxml/parser.h> | |
4 #include "SceneGraphRoot.h" | |
5 #include "xml.h" | |
6 #include "sys.h" | |
7 #include "TextureHash.h" | |
8 #include "texture.h" | |
562 | 9 //#include "SGList.h" |
10 #include "Application.h" | |
507 | 11 |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
12 static int cnt = 0; |
562 | 13 static const int SGLIST_LENGTH = 138; |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
14 static int sg_src_size = SGLIST_LENGTH ; |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
15 static int sg_src_id = -1; |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
16 static SceneGraphPtr *sg_src; |
562 | 17 |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
18 |
558 | 19 SceneGraphRoot *sgroot; |
20 | |
507 | 21 SceneGraphRoot::SceneGraphRoot(float w, float h) |
22 { | |
562 | 23 // SGLIST_LENGTH 決め打ちかぁ、動的生成にする場合上限決めておいた方がいいのかな |
24 // | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
25 sg_src = (SceneGraphPtr*) malloc(sizeof(SceneGraphPtr)*SGLIST_LENGTH); |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
26 |
507 | 27 camera = new Camera(w, h); |
597 | 28 light = new Light(w, h); |
507 | 29 iterator = new SceneGraphIterator; |
30 controller = create_controller(); | |
31 | |
32 sg_exec_tree = NULL; | |
33 sg_draw_tree = NULL; | |
34 sg_available_list = NULL; | |
35 sg_remove_list = NULL; | |
36 | |
562 | 37 sgroot = this; |
38 | |
507 | 39 // TODO |
40 // 今はとりあえず camera を Root にしています | |
41 // 今はそれすらもしてません | |
42 //sg_exec_tree = camera; | |
43 } | |
44 | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
45 SceneGraphRoot::~SceneGraphRoot() |
507 | 46 { |
47 SceneGraphPtr p = sg_available_list; | |
48 | |
49 while (p) { | |
50 SceneGraphPtr tmp = p->next; | |
51 delete p; | |
52 p = tmp; | |
53 cnt--; | |
54 } | |
55 | |
56 p = sg_remove_list; | |
57 | |
58 while (p) { | |
59 SceneGraphPtr tmp = p->next; | |
60 delete p; | |
61 p = tmp; | |
62 cnt--; | |
63 } | |
64 | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
65 free(sg_src); |
507 | 66 delete camera; |
597 | 67 delete light; |
507 | 68 delete iterator; |
69 delete controller; | |
70 } | |
71 | |
72 /** | |
73 * xml ファイルから生成された SceneGraph を sg_src に登録する。 | |
74 * | |
75 * @param sg SceneGraph created by xmlfile | |
76 */ | |
77 void | |
78 SceneGraphRoot::registSceneGraph(SceneGraphPtr sg) | |
79 { | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
80 int dup; |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
81 if ((dup = getSgid(sg->name))>=0) { // while... |
576 | 82 sg_src[dup]->name = ""; |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
83 // we should remove this. but some one may use it... |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
84 } |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
85 if (sg_src_id+1> sg_src_size) { |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
86 sg_src_size *= 2; |
582 | 87 sg_src = (SceneGraphPtr*)realloc(sg_src, sg_src_size*sizeof(SceneGraphPtr)); |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
88 } |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
89 sg->sgid = ++sg_src_id; |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
90 sg_src[sg->sgid] = sg; |
507 | 91 } |
92 | |
93 void | |
94 SceneGraphRoot::addNext(SceneGraphPtr sg) | |
95 { | |
96 SceneGraphPtr last = sg_available_list; | |
97 | |
98 if (!last) { | |
99 sg_available_list = sg; | |
100 } else { | |
101 while (last->next) { | |
102 last = last->next; | |
103 } | |
104 last->next = sg; | |
105 sg->prev = last; | |
106 } | |
107 | |
108 cnt++; | |
109 } | |
110 | |
111 /* XMLファイルからポリゴンを作成 */ | |
112 void | |
113 SceneGraphRoot::createFromXMLfile(TaskManager *manager, const char *xmlfile) | |
114 { | |
115 xmlDocPtr doc; | |
116 xmlNodePtr cur; | |
117 SceneGraphPtr tmp; | |
562 | 118 |
507 | 119 /* パース DOM生成 */ |
120 doc = xmlParseFile(xmlfile); | |
121 cur = xmlDocGetRootElement(doc); | |
122 | |
123 /* ?? */ | |
124 xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); | |
125 | |
126 /* XMLのノードを一つずつ解析 */ | |
127 for (cur=cur->children; cur; cur=cur->next) { | |
562 | 128 /* 扱うのはsurfaceオンリー */ |
129 if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { | |
130 continue; | |
131 } | |
507 | 132 |
562 | 133 /* ポリゴン(SceneGraph)生成 */ |
134 tmp = new SceneGraph(manager, cur); | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
135 registSceneGraph(tmp); |
507 | 136 } |
137 xmlFreeDoc(doc); | |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
138 } |
562 | 139 |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
140 void |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
141 SceneGraphRoot::createFromXMLmemory(TaskManager *manager, SceneGraph *node, char *data, int len) |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
142 { |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
143 xmlDocPtr doc; |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
144 xmlNodePtr cur; |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
145 |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
146 // size は取れるはず、テスト用に mmap したデータを使う |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
147 /* パース DOM生成 */ |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
148 |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
149 doc = xmlParseMemory(data, len); |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
150 cur = xmlDocGetRootElement(doc); |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
151 |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
152 /* ?? */ |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
153 xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
154 |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
155 /* XMLのノードを一つずつ解析 */ |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
156 for (cur=cur->children; cur; cur=cur->next) { |
586 | 157 /* 扱うのはsurfaceオンリー */ |
158 if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { | |
159 continue; | |
160 } | |
161 /* ポリゴン(SceneGraph)生成 */ | |
162 SceneGraphPtr original = new SceneGraph(manager, cur); | |
163 registSceneGraph(original); | |
164 SceneGraphPtr clone = createSceneGraph(original->sgid); | |
165 node->addChild(clone); | |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
166 } |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
167 xmlFreeDoc(doc); |
507 | 168 } |
169 | |
170 SceneGraphPtr | |
171 SceneGraphRoot::createSceneGraph(int id) | |
172 { | |
173 SceneGraphPtr src; | |
174 SceneGraphPtr p; | |
175 | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
176 if (id < 0 || id > sg_src_size) { |
507 | 177 return NULL; |
178 } | |
179 | |
180 /* オリジナルの SceneGraph */ | |
562 | 181 src = sg_src[id]; |
507 | 182 |
183 /* ユーザーにはオリジナルの clone を返す */ | |
184 p = src->clone(); | |
185 | |
186 addNext(p); | |
187 | |
188 return p; | |
189 } | |
190 | |
562 | 191 |
192 | |
193 | |
194 SceneGraphPtr | |
195 SceneGraphRoot::createSceneGraph(const char *name) | |
196 { | |
197 SceneGraphPtr src; | |
198 SceneGraphPtr p; | |
199 | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
200 int id = getSgid(name); |
562 | 201 if (id < 0) { |
202 return NULL; | |
203 } | |
204 | |
205 /* オリジナルの SceneGraph */ | |
206 src = sg_src[id]; | |
207 | |
208 /* ユーザーにはオリジナルの clone を返す */ | |
209 p = src->clone(); | |
210 | |
211 addNext(p); | |
212 | |
213 return p; | |
214 } | |
215 | |
216 int | |
217 SceneGraphRoot::getSgid(const char *name) | |
218 { | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
219 for(int i =0;i<= sg_src_id; i++) { |
576 | 220 if (sg_src[i] && strcmp(name,sg_src[i]->name) == 0) |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
221 return i; |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
222 } |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
223 return -1; |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
224 } |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
225 |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
226 int |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
227 SceneGraphRoot::getLast() |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
228 { |
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
229 if (sg_src_id>=0) |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
230 return sg_src[sg_src_id]->sgid; |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
231 return -1; |
562 | 232 } |
233 | |
507 | 234 /** |
235 * 何も表示しない、move,collision もしない SceneGraph を生成 | |
236 * いずれ、Transform3D 的なものに回す予定 | |
237 */ | |
238 SceneGraphPtr | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
239 SceneGraphRoot::createSceneGraph() |
507 | 240 { |
241 SceneGraphPtr p = new SceneGraph; | |
242 | |
243 addNext(p); | |
244 p->flag_drawable = 0; | |
245 | |
246 return p; | |
247 } | |
248 | |
249 void | |
250 SceneGraphRoot::speExecute(int screen_w, int screen_h) | |
251 { | |
252 | |
253 SceneGraphPtr list = sg_available_list; | |
254 // SceneGraphPtr t = sg_exec_tree; | |
255 // SceneGraphPtr cur_parent = camera; | |
256 | |
257 // 前フレームで描画した SceneGraph は削除 | |
258 allRemove(sg_remove_list); | |
259 | |
260 // 前フレームに作られた SceneGraph は描画用に移行 | |
261 // 現フレームでの操作は以下の tree,list には適用されない | |
262 sg_draw_tree = sg_exec_tree; | |
263 sg_remove_list = sg_available_list; | |
264 | |
265 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
266 sg_exec_tree = NULL; | |
267 sg_available_list = NULL; | |
268 | |
269 camera->move_execute(screen_w, screen_h); | |
270 camera->update(screen_w, screen_h); | |
271 | |
272 camera->children = NULL; | |
273 camera->lastChild = NULL; | |
274 | |
275 list->move_execute(screen_w, screen_h); | |
276 list->collision_check(screen_w, screen_h, list); | |
277 | |
278 list->frame++; | |
279 list = list->next; | |
280 | |
281 if(sg_exec_tree != NULL) { | |
282 return; | |
283 } | |
284 | |
285 /*removeのflagをもとにtreeを形成*/ | |
286 /* spe から送り返されてきた property の配列を見て生成する for()*/ | |
287 /* | |
562 | 288 for (Property *t = (Property*)app->property[0]; is_end(t); t++){ |
289 SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る | |
290 t->scenegraph = s; // property list には SceneGraphへのポインタが入っている | |
291 app->scenegraph_connector(property[0], s); // add する | |
292 } | |
293 */ | |
294 | |
295 | |
296 // 現在、allExecute が終わった時点では | |
297 // camera->children が User SceneGraph の root になる | |
298 | |
299 /** | |
300 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
301 * そっちを次の Scene にする | |
302 */ | |
303 | |
304 sg_exec_tree = camera->children; | |
305 } | |
306 | |
307 void | |
308 SceneGraphRoot::speExecute(int screen_w, int screen_h, Application *app) | |
309 { | |
310 // SceneGraphPtr t = sg_exec_tree; | |
311 // SceneGraphPtr cur_parent = camera; | |
312 | |
313 // 前フレームで描画した SceneGraph は削除 | |
314 allRemove(sg_remove_list); | |
315 | |
316 // 前フレームに作られた SceneGraph は描画用に移行 | |
317 // 現フレームでの操作は以下の tree,list には適用されない | |
318 sg_draw_tree = sg_exec_tree; | |
319 sg_remove_list = sg_available_list; | |
320 | |
321 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
322 sg_exec_tree = NULL; | |
323 sg_available_list = NULL; | |
324 | |
325 camera->move_execute(screen_w, screen_h); | |
326 camera->update(screen_w, screen_h); | |
327 | |
328 camera->children = NULL; | |
329 camera->lastChild = NULL; | |
330 | |
331 | |
332 if(sg_exec_tree != NULL) { | |
333 return; | |
334 } | |
335 | |
336 /*removeのflagをもとにtreeを形成*/ | |
337 /* spe から送り返されてきた property の配列を見て生成する for()*/ | |
338 /* Application内に移動 */ | |
339 | |
340 // app->property_ope(sg_available_list); | |
341 | |
342 /* | |
343 for (Property *t = (Property *)properties[0]; is_end(t); t++){ | |
344 SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る | |
345 t->scenegraph = s; // property list には SceneGraphへのポインタが入っている | |
346 app->scenegraph_connector(property[0], s); // add する | |
347 } | |
507 | 348 */ |
562 | 349 |
350 | |
507 | 351 |
352 // 現在、allExecute が終わった時点では | |
353 // camera->children が User SceneGraph の root になる | |
354 | |
355 /** | |
356 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
357 * そっちを次の Scene にする | |
358 */ | |
359 | |
360 sg_exec_tree = camera->children; | |
361 } | |
362 | |
363 | |
364 void | |
365 SceneGraphRoot::allExecute(int screen_w, int screen_h) | |
366 { | |
367 SceneGraphPtr list = sg_available_list; | |
368 SceneGraphPtr t = sg_exec_tree; | |
369 SceneGraphPtr cur_parent = camera; | |
370 | |
371 // 前フレームで描画した SceneGraph は削除 | |
372 allRemove(sg_remove_list); | |
373 | |
374 // 前フレームに作られた SceneGraph は描画用に移行 | |
375 // 現フレームでの操作は以下の tree,list には適用されない | |
376 sg_draw_tree = sg_exec_tree; | |
377 sg_remove_list = sg_available_list; | |
378 | |
379 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
380 sg_exec_tree = NULL; | |
381 sg_available_list = NULL; | |
382 | |
383 camera->move_execute(screen_w, screen_h); | |
384 camera->update(screen_w, screen_h); | |
385 | |
386 camera->children = NULL; | |
387 camera->lastChild = NULL; | |
388 | |
389 /*まずは全部動作させる*/ | |
390 while (list) { | |
391 | |
392 list->move_execute(screen_w, screen_h); | |
393 list->collision_check(screen_w, screen_h, list); | |
394 | |
395 list->frame++; | |
396 list = list->next; | |
397 | |
398 } | |
399 | |
400 if(sg_exec_tree != NULL) { | |
401 return; | |
402 } | |
403 | |
404 /*removeのflagをもとにtreeを形成*/ | |
405 while (t) { | |
406 SceneGraphPtr c = NULL; | |
407 if (!t->isRemoved()) { | |
408 c = t->clone(); | |
409 addNext(c); | |
410 cur_parent->addChild(c); | |
411 c->frame = t->frame; | |
412 /*親の回転、座標から、子の回転、座標を算出*/ | |
413 get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix); | |
414 } | |
415 | |
416 if (t->children != NULL && c != NULL) { | |
417 cur_parent = c; | |
418 t = t->children; | |
419 } else if (t->brother != NULL) { | |
420 t = t->brother; | |
421 } else { | |
422 while (t) { | |
423 if (t->brother != NULL) { | |
424 t = t->brother; | |
425 break; | |
426 } else { | |
427 if (t->parent == NULL) { | |
428 t = NULL; | |
429 break; | |
430 } else { | |
431 cur_parent = cur_parent->parent; | |
432 t = t->parent; | |
433 | |
434 } | |
435 } | |
436 } | |
437 } | |
438 } | |
439 | |
440 | |
441 | |
442 // 現在、allExecute が終わった時点では | |
443 // camera->children が User SceneGraph の root になる | |
444 | |
445 /** | |
446 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
447 * そっちを次の Scene にする | |
448 */ | |
449 | |
450 sg_exec_tree = camera->children; | |
451 } | |
452 | |
453 void | |
454 SceneGraphRoot::allRemove(SceneGraphPtr list) | |
455 { | |
456 SceneGraphPtr p = list; | |
457 | |
458 while (p) { | |
459 SceneGraphPtr p1 = p->next; | |
460 delete p; | |
461 p = p1; | |
462 cnt--; | |
463 } | |
464 } | |
465 | |
466 void | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
467 SceneGraphRoot::checkRemove() |
507 | 468 { |
469 SceneGraphPtr p = sg_available_list; | |
470 SceneGraphPtr p1; | |
471 | |
472 while (p) { | |
473 p1 = p->next; | |
474 if (p->isRemoved()) { | |
475 sg_exec_tree = p->realRemoveFromTree(sg_exec_tree); | |
476 sg_available_list = p->realRemoveFromList(sg_available_list); | |
477 } | |
478 delete p; | |
479 p = p1; | |
480 } | |
481 } | |
482 | |
483 SceneGraphPtr | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
484 SceneGraphRoot::getExecuteSceneGraph() |
507 | 485 { |
486 return sg_exec_tree; | |
487 } | |
488 | |
489 SceneGraphPtr | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
490 SceneGraphRoot::getDrawSceneGraph() |
507 | 491 { |
492 return sg_draw_tree; | |
493 } | |
494 | |
495 void | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
496 SceneGraphRoot::updateControllerState() |
507 | 497 { |
498 controller->check(); | |
499 } | |
500 | |
501 void | |
502 SceneGraphRoot::setSceneData(SceneGraphPtr sg) | |
503 { | |
504 sg_exec_tree = sg; | |
505 } | |
506 | |
507 Pad* | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
508 SceneGraphRoot::getController() |
507 | 509 { |
510 return controller; | |
511 } | |
512 | |
513 SceneGraphIteratorPtr | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
514 SceneGraphRoot::getIterator() |
507 | 515 { |
516 iterator->set(sg_remove_list); | |
517 return iterator; | |
518 } | |
519 | |
520 SceneGraphIteratorPtr | |
521 SceneGraphRoot::getIterator(SceneGraphPtr list) | |
522 { | |
523 iterator->set(list); | |
524 return iterator; | |
525 } | |
526 | |
527 CameraPtr | |
509
8148c81d2660
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
528 SceneGraphRoot::getCamera() |
507 | 529 { |
530 return camera; | |
531 } | |
597 | 532 |
533 LightPtr | |
534 SceneGraphRoot::getLight() | |
535 { | |
536 | |
537 return light; | |
538 | |
539 } |