Mercurial > hg > Members > kono > Cerium
comparison Renderer/test_render/SceneGraphRoot.cpp @ 283:55ea4465b1a2
fix test_render
author | e065746@localhost.localdomain |
---|---|
date | Fri, 05 Jun 2009 16:49:12 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
282:ef061be0baff | 283:55ea4465b1a2 |
---|---|
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" | |
9 #include "SGList.h" | |
10 | |
11 int cnt = 0; | |
12 | |
13 SceneGraphRoot::SceneGraphRoot(float w, float h) | |
14 { | |
15 sg_src = new SceneGraphPtr[SGLIST_LENGTH]; | |
16 camera = new Camera(w, h); | |
17 iterator = new SceneGraphIterator; | |
18 controller = create_controller(); | |
19 | |
20 sg_exec_tree = NULL; | |
21 sg_draw_tree = NULL; | |
22 sg_available_list = NULL; | |
23 sg_remove_list = NULL; | |
24 | |
25 // TODO | |
26 // 今はとりあえず camera を Root にしています | |
27 // 今はそれすらもしてません | |
28 //sg_exec_tree = camera; | |
29 } | |
30 | |
31 SceneGraphRoot::~SceneGraphRoot(void) | |
32 { | |
33 SceneGraphPtr p = sg_available_list; | |
34 | |
35 while (p) { | |
36 SceneGraphPtr tmp = p->next; | |
37 delete p; | |
38 p = tmp; | |
39 cnt--; | |
40 } | |
41 | |
42 p = sg_remove_list; | |
43 | |
44 while (p) { | |
45 SceneGraphPtr tmp = p->next; | |
46 delete p; | |
47 p = tmp; | |
48 cnt--; | |
49 } | |
50 | |
51 delete [] sg_src; | |
52 delete camera; | |
53 delete iterator; | |
54 delete controller; | |
55 } | |
56 | |
57 /** | |
58 * xml ファイルから生成された SceneGraph を sg_src に登録する。 | |
59 * | |
60 * @param sg SceneGraph created by xmlfile | |
61 */ | |
62 void | |
63 SceneGraphRoot::registSceneGraph(SceneGraphPtr sg) | |
64 { | |
65 for (int i = 0; i < SGLIST_LENGTH; i++) { | |
66 if (strcmp(sg->name, sglist_table[i]) == 0) { | |
67 sg->sgid = i; | |
68 sg_src[i] = sg; | |
69 return; | |
70 } | |
71 } | |
72 | |
73 fprintf(stderr, "error: (%s:%3d) Can't find Scene \"%s\"\n", | |
74 __FUNCTION__, __LINE__, sg->name); | |
75 } | |
76 | |
77 void | |
78 SceneGraphRoot::addNext(SceneGraphPtr sg) | |
79 { | |
80 SceneGraphPtr last = sg_available_list; | |
81 | |
82 if (!last) { | |
83 sg_available_list = sg; | |
84 } else { | |
85 while (last->next) { | |
86 last = last->next; | |
87 } | |
88 last->next = sg; | |
89 sg->prev = last; | |
90 } | |
91 | |
92 cnt++; | |
93 } | |
94 | |
95 /* XMLファイルからポリゴンを作成 */ | |
96 void | |
97 SceneGraphRoot::createFromXMLfile(const char *xmlfile) | |
98 { | |
99 xmlDocPtr doc; | |
100 xmlNodePtr cur; | |
101 SceneGraphPtr tmp; | |
102 | |
103 /* パース DOM生成 */ | |
104 doc = xmlParseFile(xmlfile); | |
105 cur = xmlDocGetRootElement(doc); | |
106 | |
107 /* ?? */ | |
108 xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); | |
109 | |
110 /* XMLのノードを一つずつ解析 */ | |
111 for (cur=cur->children; cur; cur=cur->next) { | |
112 /* 扱うのはsurfaceオンリー */ | |
113 if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { | |
114 continue; | |
115 } | |
116 | |
117 /* ポリゴン(SceneGraph)生成 */ | |
118 tmp = new SceneGraph(cur); | |
119 | |
120 registSceneGraph(tmp); | |
121 } | |
122 | |
123 xmlFreeDoc(doc); | |
124 } | |
125 | |
126 SceneGraphPtr | |
127 SceneGraphRoot::createSceneGraph(int id) | |
128 { | |
129 SceneGraphPtr src; | |
130 SceneGraphPtr p; | |
131 | |
132 if (id < 0 || id > SGLIST_LENGTH) { | |
133 return NULL; | |
134 } | |
135 | |
136 /* オリジナルの SceneGraph */ | |
137 src = sg_src[id]; | |
138 | |
139 /* ユーザーにはオリジナルの clone を返す */ | |
140 p = src->clone(); | |
141 | |
142 addNext(p); | |
143 | |
144 return p; | |
145 } | |
146 | |
147 /** | |
148 * 何も表示しない、move,collision もしない SceneGraph を生成 | |
149 * いずれ、Transform3D 的なものに回す予定 | |
150 */ | |
151 SceneGraphPtr | |
152 SceneGraphRoot::createSceneGraph(void) | |
153 { | |
154 SceneGraphPtr p = new SceneGraph; | |
155 | |
156 addNext(p); | |
157 p->flag_drawable = 0; | |
158 | |
159 return p; | |
160 } | |
161 | |
162 void | |
163 SceneGraphRoot::allExecute(int screen_w, int screen_h) | |
164 { | |
165 SceneGraphPtr list = sg_available_list; | |
166 SceneGraphPtr t = sg_exec_tree; | |
167 SceneGraphPtr cur_parent = camera; | |
168 | |
169 // 前フレームで描画した SceneGraph は削除 | |
170 allRemove(sg_remove_list); | |
171 | |
172 // 前フレームに作られた SceneGraph は描画用に移行 | |
173 // 現フレームでの操作は以下の tree,list には適用されない | |
174 sg_draw_tree = sg_exec_tree; | |
175 sg_remove_list = sg_available_list; | |
176 | |
177 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
178 sg_exec_tree = NULL; | |
179 sg_available_list = NULL; | |
180 | |
181 camera->move_execute(screen_w, screen_h); | |
182 camera->update(screen_w, screen_h); | |
183 | |
184 camera->children = NULL; | |
185 camera->lastChild = NULL; | |
186 | |
187 while (t) { | |
188 SceneGraphPtr c = t->clone(); | |
189 | |
190 addNext(c); | |
191 cur_parent->addChild(c); | |
192 c->frame = t->frame; | |
193 | |
194 c->move_execute(screen_w, screen_h); | |
195 c->collision_check(screen_w, screen_h, list); | |
196 | |
197 if (c->isRemoved()) { | |
198 sg_exec_tree = c->realRemoveFromTree(cur_parent); | |
199 sg_available_list = c->realRemoveFromList(sg_available_list); | |
200 delete c; | |
201 cnt--; | |
202 t->children = NULL; | |
203 t->parent = cur_parent; | |
204 } else { | |
205 c->frame++; | |
206 get_matrix(c->matrix, c->angle, c->xyz, c->parent->matrix); | |
207 } | |
208 | |
209 if (t->children != NULL) { | |
210 cur_parent = c; | |
211 t = t->children; | |
212 } else if (t->brother != NULL) { | |
213 cur_parent = c->parent; | |
214 t = t->brother; | |
215 } else { | |
216 while (t) { | |
217 if (t->brother != NULL) { | |
218 cur_parent = t->parent; | |
219 t = t->brother; | |
220 break; | |
221 } else { | |
222 if (t->parent == NULL) { | |
223 t = NULL; | |
224 break; | |
225 } else { | |
226 t = t->parent; | |
227 } | |
228 } | |
229 } | |
230 } | |
231 } | |
232 | |
233 // 現在、allExecute が終わった時点では | |
234 // camera->children が User SceneGraph の root になる | |
235 sg_exec_tree = camera->children; | |
236 } | |
237 | |
238 void | |
239 SceneGraphRoot::allRemove(SceneGraphPtr list) | |
240 { | |
241 SceneGraphPtr p = list; | |
242 | |
243 while (p) { | |
244 SceneGraphPtr p1 = p->next; | |
245 delete p; | |
246 p = p1; | |
247 cnt--; | |
248 } | |
249 } | |
250 | |
251 void | |
252 SceneGraphRoot::checkRemove(void) | |
253 { | |
254 SceneGraphPtr p = sg_available_list; | |
255 SceneGraphPtr p1; | |
256 | |
257 while (p) { | |
258 p1 = p->next; | |
259 if (p->isRemoved()) { | |
260 sg_exec_tree = p->realRemoveFromTree(sg_exec_tree); | |
261 sg_available_list = p->realRemoveFromList(sg_available_list); | |
262 } | |
263 delete p; | |
264 p = p1; | |
265 } | |
266 } | |
267 | |
268 SceneGraphPtr | |
269 SceneGraphRoot::getExecuteSceneGraph(void) | |
270 { | |
271 return sg_exec_tree; | |
272 } | |
273 | |
274 SceneGraphPtr | |
275 SceneGraphRoot::getDrawSceneGraph(void) | |
276 { | |
277 return sg_draw_tree; | |
278 } | |
279 | |
280 void | |
281 SceneGraphRoot::updateControllerState(void) | |
282 { | |
283 controller->check(); | |
284 } | |
285 | |
286 void | |
287 SceneGraphRoot::setSceneData(SceneGraphPtr sg) | |
288 { | |
289 sg_exec_tree = sg; | |
290 } | |
291 | |
292 Pad* | |
293 SceneGraphRoot::getController(void) | |
294 { | |
295 return controller; | |
296 } | |
297 | |
298 SceneGraphIteratorPtr | |
299 SceneGraphRoot::getIterator(void) | |
300 { | |
301 iterator->set(sg_remove_list); | |
302 return iterator; | |
303 } | |
304 | |
305 SceneGraphIteratorPtr | |
306 SceneGraphRoot::getIterator(SceneGraphPtr list) | |
307 { | |
308 iterator->set(list); | |
309 return iterator; | |
310 } | |
311 | |
312 CameraPtr | |
313 SceneGraphRoot::getCamera(void) | |
314 { | |
315 return camera; | |
316 } |