Mercurial > hg > Game > Cerium
annotate Renderer/Engine/SceneGraphRoot.cc @ 759:45f7ab7101ea draft
first of all commit, not work Rendering/Test/create_task
author | hiroki |
---|---|
date | Thu, 04 Feb 2010 14:46:09 +0900 |
parents | 77f936380930 |
children | c0a8af52fa43 |
rev | line source |
---|---|
539 | 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" | |
539 | 11 |
575
341f1f881a9b
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
341f1f881a9b
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 ; |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
15 static int sg_src_id = -1; |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
16 static SceneGraphPtr *sg_src; |
562 | 17 |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
18 |
558 | 19 SceneGraphRoot *sgroot; |
20 | |
539 | 21 SceneGraphRoot::SceneGraphRoot(float w, float h) |
22 { | |
562 | 23 // SGLIST_LENGTH 決め打ちかぁ、動的生成にする場合上限決めておいた方がいいのかな |
24 // | |
575
341f1f881a9b
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); |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
26 |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
27 camera = new Camera(w, h, this); |
747 | 28 light = new SceneGraph; |
539 | 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 | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
39 screen_w = (int)w; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
40 screen_h = (int)h; |
747 | 41 //int size = 4; |
42 //light_vector = (float*)malloc(sizeof(float)*size); | |
43 | |
44 light->xyz[0] = 0; | |
45 light->xyz[1] = 0; | |
46 light->xyz[2] = 0; | |
47 | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
48 move_finish_flag = 0; |
539 | 49 // TODO |
50 // 今はとりあえず camera を Root にしています | |
51 // 今はそれすらもしてません | |
52 //sg_exec_tree = camera; | |
53 } | |
54 | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
55 SceneGraphRoot::~SceneGraphRoot() |
539 | 56 { |
57 SceneGraphPtr p = sg_available_list; | |
58 | |
59 while (p) { | |
60 SceneGraphPtr tmp = p->next; | |
61 delete p; | |
62 p = tmp; | |
63 cnt--; | |
64 } | |
65 | |
66 p = sg_remove_list; | |
67 | |
68 while (p) { | |
69 SceneGraphPtr tmp = p->next; | |
70 delete p; | |
71 p = tmp; | |
72 cnt--; | |
73 } | |
74 | |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
75 free(sg_src); |
539 | 76 delete camera; |
597 | 77 delete light; |
539 | 78 delete iterator; |
79 delete controller; | |
80 } | |
81 | |
82 /** | |
83 * xml ファイルから生成された SceneGraph を sg_src に登録する。 | |
84 * | |
85 * @param sg SceneGraph created by xmlfile | |
86 */ | |
87 void | |
88 SceneGraphRoot::registSceneGraph(SceneGraphPtr sg) | |
89 { | |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
90 int dup; |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
91 if ((dup = getSgid(sg->name))>=0) { // while... |
576 | 92 sg_src[dup]->name = ""; |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
93 // we should remove this. but some one may use it... |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
94 } |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
95 if (sg_src_id+1> sg_src_size) { |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
96 sg_src_size *= 2; |
582 | 97 sg_src = (SceneGraphPtr*)realloc(sg_src, sg_src_size*sizeof(SceneGraphPtr)); |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
98 } |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
99 sg->sgid = ++sg_src_id; |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
100 sg_src[sg->sgid] = sg; |
539 | 101 } |
102 | |
103 void | |
104 SceneGraphRoot::addNext(SceneGraphPtr sg) | |
105 { | |
106 SceneGraphPtr last = sg_available_list; | |
107 | |
108 if (!last) { | |
109 sg_available_list = sg; | |
110 } else { | |
111 while (last->next) { | |
112 last = last->next; | |
113 } | |
114 last->next = sg; | |
115 sg->prev = last; | |
116 } | |
117 | |
118 cnt++; | |
119 } | |
120 | |
121 /* XMLファイルからポリゴンを作成 */ | |
122 void | |
123 SceneGraphRoot::createFromXMLfile(TaskManager *manager, const char *xmlfile) | |
124 { | |
125 xmlDocPtr doc; | |
126 xmlNodePtr cur; | |
127 SceneGraphPtr tmp; | |
562 | 128 |
539 | 129 /* パース DOM生成 */ |
130 doc = xmlParseFile(xmlfile); | |
131 cur = xmlDocGetRootElement(doc); | |
132 | |
133 /* ?? */ | |
134 xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); | |
135 | |
136 /* XMLのノードを一つずつ解析 */ | |
137 for (cur=cur->children; cur; cur=cur->next) { | |
562 | 138 /* 扱うのはsurfaceオンリー */ |
139 if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { | |
140 continue; | |
141 } | |
539 | 142 |
562 | 143 /* ポリゴン(SceneGraph)生成 */ |
144 tmp = new SceneGraph(manager, cur); | |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
145 registSceneGraph(tmp); |
539 | 146 } |
147 xmlFreeDoc(doc); | |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
148 } |
562 | 149 |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
150 void |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
151 SceneGraphRoot::createFromXMLmemory(TaskManager *manager, SceneGraph *node, char *data, int len) |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
152 { |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
153 xmlDocPtr doc; |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
154 xmlNodePtr cur; |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
155 |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
156 // size は取れるはず、テスト用に mmap したデータを使う |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
157 /* パース DOM生成 */ |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
158 |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
159 doc = xmlParseMemory(data, len); |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
160 cur = xmlDocGetRootElement(doc); |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
161 |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
162 /* ?? */ |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
163 xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
164 |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
165 /* XMLのノードを一つずつ解析 */ |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
166 for (cur=cur->children; cur; cur=cur->next) { |
586 | 167 /* 扱うのはsurfaceオンリー */ |
168 if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { | |
169 continue; | |
170 } | |
171 /* ポリゴン(SceneGraph)生成 */ | |
172 SceneGraphPtr original = new SceneGraph(manager, cur); | |
173 registSceneGraph(original); | |
174 SceneGraphPtr clone = createSceneGraph(original->sgid); | |
175 node->addChild(clone); | |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
176 } |
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
177 xmlFreeDoc(doc); |
539 | 178 } |
179 | |
180 SceneGraphPtr | |
181 SceneGraphRoot::createSceneGraph(int id) | |
182 { | |
183 SceneGraphPtr src; | |
184 SceneGraphPtr p; | |
185 | |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
186 if (id < 0 || id > sg_src_size) { |
539 | 187 return NULL; |
188 } | |
189 | |
190 /* オリジナルの SceneGraph */ | |
562 | 191 src = sg_src[id]; |
539 | 192 |
193 /* ユーザーにはオリジナルの clone を返す */ | |
194 p = src->clone(); | |
195 | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
196 /* move, collision に sgroot を渡したいのでここで sgroot を渡しておく*/ |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
197 p->sgroot = (void *)this; |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
198 |
539 | 199 addNext(p); |
200 | |
201 return p; | |
202 } | |
203 | |
562 | 204 |
205 | |
206 | |
207 SceneGraphPtr | |
208 SceneGraphRoot::createSceneGraph(const char *name) | |
209 { | |
210 SceneGraphPtr src; | |
211 SceneGraphPtr p; | |
212 | |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
213 int id = getSgid(name); |
562 | 214 if (id < 0) { |
215 return NULL; | |
216 } | |
217 | |
218 /* オリジナルの SceneGraph */ | |
219 src = sg_src[id]; | |
220 | |
221 /* ユーザーにはオリジナルの clone を返す */ | |
222 p = src->clone(); | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
223 |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
224 /* move, collision に sgroot を渡したいのでここで sgroot を渡しておく*/ |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
225 p->sgroot = (void *)this; |
562 | 226 |
227 addNext(p); | |
228 | |
229 return p; | |
230 } | |
231 | |
232 int | |
233 SceneGraphRoot::getSgid(const char *name) | |
234 { | |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
235 for(int i =0;i<= sg_src_id; i++) { |
576 | 236 if (sg_src[i] && strcmp(name,sg_src[i]->name) == 0) |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
237 return i; |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
238 } |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
239 return -1; |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
240 } |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
241 |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
242 int |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
243 SceneGraphRoot::getLast() |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
244 { |
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
245 if (sg_src_id>=0) |
580
ec9dd24c2dc8
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
576
diff
changeset
|
246 return sg_src[sg_src_id]->sgid; |
575
341f1f881a9b
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
565
diff
changeset
|
247 return -1; |
562 | 248 } |
249 | |
539 | 250 /** |
251 * 何も表示しない、move,collision もしない SceneGraph を生成 | |
252 * いずれ、Transform3D 的なものに回す予定 | |
253 */ | |
254 SceneGraphPtr | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
255 SceneGraphRoot::createSceneGraph() |
539 | 256 { |
257 SceneGraphPtr p = new SceneGraph; | |
258 | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
259 /* move, collision に sgroot を渡したいのでここで sgroot を渡しておく*/ |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
260 p->sgroot = (void *)this; |
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
261 |
539 | 262 addNext(p); |
263 p->flag_drawable = 0; | |
264 | |
265 return p; | |
266 } | |
267 | |
268 void | |
269 SceneGraphRoot::speExecute(int screen_w, int screen_h) | |
270 { | |
271 | |
272 SceneGraphPtr list = sg_available_list; | |
273 // SceneGraphPtr t = sg_exec_tree; | |
274 // SceneGraphPtr cur_parent = camera; | |
275 | |
276 // 前フレームで描画した SceneGraph は削除 | |
277 allRemove(sg_remove_list); | |
278 | |
279 // 前フレームに作られた SceneGraph は描画用に移行 | |
280 // 現フレームでの操作は以下の tree,list には適用されない | |
281 sg_draw_tree = sg_exec_tree; | |
282 sg_remove_list = sg_available_list; | |
283 | |
284 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
285 sg_exec_tree = NULL; | |
286 sg_available_list = NULL; | |
287 | |
288 camera->move_execute(screen_w, screen_h); | |
289 camera->update(screen_w, screen_h); | |
290 | |
291 camera->children = NULL; | |
292 camera->lastChild = NULL; | |
293 | |
294 list->move_execute(screen_w, screen_h); | |
295 list->collision_check(screen_w, screen_h, list); | |
296 | |
297 list->frame++; | |
298 list = list->next; | |
299 | |
300 if(sg_exec_tree != NULL) { | |
301 return; | |
302 } | |
303 | |
304 /*removeのflagをもとにtreeを形成*/ | |
305 /* spe から送り返されてきた property の配列を見て生成する for()*/ | |
306 /* | |
562 | 307 for (Property *t = (Property*)app->property[0]; is_end(t); t++){ |
308 SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る | |
309 t->scenegraph = s; // property list には SceneGraphへのポインタが入っている | |
310 app->scenegraph_connector(property[0], s); // add する | |
311 } | |
312 */ | |
313 | |
314 | |
315 // 現在、allExecute が終わった時点では | |
316 // camera->children が User SceneGraph の root になる | |
317 | |
318 /** | |
319 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
320 * そっちを次の Scene にする | |
321 */ | |
322 | |
323 sg_exec_tree = camera->children; | |
324 } | |
325 | |
326 void | |
327 SceneGraphRoot::speExecute(int screen_w, int screen_h, Application *app) | |
328 { | |
329 // SceneGraphPtr t = sg_exec_tree; | |
330 // SceneGraphPtr cur_parent = camera; | |
331 | |
332 // 前フレームで描画した SceneGraph は削除 | |
333 allRemove(sg_remove_list); | |
334 | |
335 // 前フレームに作られた SceneGraph は描画用に移行 | |
336 // 現フレームでの操作は以下の tree,list には適用されない | |
337 sg_draw_tree = sg_exec_tree; | |
338 sg_remove_list = sg_available_list; | |
339 | |
340 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
341 sg_exec_tree = NULL; | |
342 sg_available_list = NULL; | |
343 | |
344 camera->move_execute(screen_w, screen_h); | |
345 camera->update(screen_w, screen_h); | |
346 | |
347 camera->children = NULL; | |
348 camera->lastChild = NULL; | |
349 | |
350 | |
351 if(sg_exec_tree != NULL) { | |
352 return; | |
353 } | |
354 | |
355 /*removeのflagをもとにtreeを形成*/ | |
356 /* spe から送り返されてきた property の配列を見て生成する for()*/ | |
357 /* Application内に移動 */ | |
358 | |
359 // app->property_ope(sg_available_list); | |
360 | |
361 /* | |
362 for (Property *t = (Property *)properties[0]; is_end(t); t++){ | |
363 SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る | |
364 t->scenegraph = s; // property list には SceneGraphへのポインタが入っている | |
365 app->scenegraph_connector(property[0], s); // add する | |
366 } | |
539 | 367 */ |
562 | 368 |
369 | |
539 | 370 |
371 // 現在、allExecute が終わった時点では | |
372 // camera->children が User SceneGraph の root になる | |
373 | |
374 /** | |
375 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
376 * そっちを次の Scene にする | |
377 */ | |
378 | |
379 sg_exec_tree = camera->children; | |
380 } | |
381 | |
382 | |
383 void | |
384 SceneGraphRoot::allExecute(int screen_w, int screen_h) | |
385 { | |
386 SceneGraphPtr list = sg_available_list; | |
387 SceneGraphPtr t = sg_exec_tree; | |
388 SceneGraphPtr cur_parent = camera; | |
389 | |
390 // 前フレームで描画した SceneGraph は削除 | |
391 allRemove(sg_remove_list); | |
392 | |
393 // 前フレームに作られた SceneGraph は描画用に移行 | |
394 // 現フレームでの操作は以下の tree,list には適用されない | |
395 sg_draw_tree = sg_exec_tree; | |
396 sg_remove_list = sg_available_list; | |
397 | |
398 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
399 sg_exec_tree = NULL; | |
400 sg_available_list = NULL; | |
401 | |
402 camera->move_execute(screen_w, screen_h); | |
403 camera->update(screen_w, screen_h); | |
404 | |
405 camera->children = NULL; | |
406 camera->lastChild = NULL; | |
407 | |
408 /*まずは全部動作させる*/ | |
409 while (list) { | |
410 | |
411 list->move_execute(screen_w, screen_h); | |
412 list->collision_check(screen_w, screen_h, list); | |
413 | |
653
7a311860a76e
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
597
diff
changeset
|
414 list->frame++; |
539 | 415 list = list->next; |
758 | 416 } |
539 | 417 |
747 | 418 get_matrix(light->matrix, light->angle, light->xyz, camera->matrix); |
419 | |
420 light_vector[0] = 0.0f; | |
421 light_vector[1] = 0.0f; | |
422 light_vector[2] = 0.0f; | |
423 light_vector[3] = 1.0f; | |
424 | |
425 ApplyMatrix(light_vector, light->matrix); | |
426 | |
427 light_vector[0] /= light_vector[2]; | |
428 light_vector[1] /= light_vector[2]; | |
429 | |
539 | 430 if(sg_exec_tree != NULL) { |
758 | 431 return; |
539 | 432 } |
433 | |
434 /*removeのflagをもとにtreeを形成*/ | |
435 while (t) { | |
751
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
436 SceneGraphPtr c = NULL; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
437 if (!t->isRemoved()) { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
438 c = t->clone(); |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
439 addNext(c); |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
440 cur_parent->addChild(c); |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
441 c->frame = t->frame; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
442 /*親の回転、座標から、子の回転、座標を算出*/ |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
443 get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix); |
747 | 444 /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ |
751
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
445 get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix); |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
446 } |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
447 |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
448 if (t->children != NULL && c != NULL) { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
449 cur_parent = c; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
450 t = t->children; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
451 } else if (t->brother != NULL) { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
452 t = t->brother; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
453 } else { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
454 while (t) { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
455 if (t->brother != NULL) { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
456 t = t->brother; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
457 break; |
539 | 458 } else { |
751
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
459 if (t->parent == NULL) { |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
460 t = NULL; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
461 break; |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
462 } else { |
539 | 463 cur_parent = cur_parent->parent; |
464 t = t->parent; | |
751
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
465 } |
539 | 466 } |
751
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
467 } |
1666dba6f6d9
rendering, move_coll parallel running
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
747
diff
changeset
|
468 } |
539 | 469 } |
470 | |
471 | |
472 | |
473 // 現在、allExecute が終わった時点では | |
474 // camera->children が User SceneGraph の root になる | |
475 | |
476 /** | |
477 * NULL じゃなかったら、setSceneData が呼ばれてるから | |
478 * そっちを次の Scene にする | |
479 */ | |
480 | |
481 sg_exec_tree = camera->children; | |
482 } | |
483 | |
484 void | |
758 | 485 SceneGraphRoot::oneExecute(int screen_w, int screen_h) |
486 { | |
487 SceneGraphPtr list = sg_available_list; | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
488 //SceneGraphPtr t = sg_exec_tree; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
489 //SceneGraphPtr cur_parent = camera; |
758 | 490 |
491 // 前フレームで描画した SceneGraph は削除 | |
492 allRemove(sg_remove_list); | |
493 | |
494 // 前フレームに作られた SceneGraph は描画用に移行 | |
495 // 現フレームでの操作は以下の tree,list には適用されない | |
496 sg_draw_tree = sg_exec_tree; | |
497 sg_remove_list = sg_available_list; | |
498 | |
499 // 現フレームで新しく SceneGraph がコピーされるので初期化 | |
500 sg_exec_tree = NULL; | |
501 sg_available_list = NULL; | |
502 | |
503 camera->move_execute(screen_w, screen_h); | |
504 camera->update(screen_w, screen_h); | |
505 | |
506 camera->children = NULL; | |
507 camera->lastChild = NULL; | |
508 | |
509 /* ここから */ | |
510 list->move_execute(screen_w, screen_h); | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
511 // ここで move_execute から実行される move_task の処理が終わるまで待ちたい |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
512 //while(move_finish_flag == 0) {} |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
513 //move_finish_flag = 0; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
514 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
515 list->create_sg_execute(); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
516 |
758 | 517 list->collision_check(screen_w, screen_h, list); |
518 /* ここまで exec_task にする */ | |
519 | |
520 | |
521 /* ここから下を exec_task の post_func に*/ | |
522 list->frame++; | |
523 list = list->next; | |
524 | |
525 get_matrix(light->matrix, light->angle, light->xyz, camera->matrix); | |
526 | |
527 light_vector[0] = 0.0f; | |
528 light_vector[1] = 0.0f; | |
529 light_vector[2] = 0.0f; | |
530 light_vector[3] = 1.0f; | |
531 | |
532 ApplyMatrix(light_vector, light->matrix); | |
533 | |
534 light_vector[0] /= light_vector[2]; | |
535 light_vector[1] /= light_vector[2]; | |
536 | |
537 if(sg_exec_tree != NULL) { | |
538 return; | |
539 } | |
540 } | |
541 | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
542 /* |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
543 ExecMove task の post func として呼んでやる |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
544 */ |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
545 void |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
546 SceneGraphRoot::move_finish() |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
547 { |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
548 list->collision_check(screen_w, screen_h, list); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
549 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
550 list->frame++; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
551 //list = list->next; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
552 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
553 get_matrix(light->matrix, light->angle, light->xyz, camera->matrix); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
554 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
555 light_vector[0] = 0.0f; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
556 light_vector[1] = 0.0f; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
557 light_vector[2] = 0.0f; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
558 light_vector[3] = 1.0f; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
559 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
560 ApplyMatrix(light_vector, light->matrix); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
561 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
562 light_vector[0] /= light_vector[2]; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
563 light_vector[1] /= light_vector[2]; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
564 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
565 //sgchange->viewer->light_xyz_stock = getLightVector(); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
566 } |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
567 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
568 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
569 void |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
570 SceneGraphRoot::appTaskRegist(regist_func new_register) |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
571 { |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
572 this->regist = new_register; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
573 } |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
574 |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
575 void |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
576 SceneGraphRoot::regist_execute() |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
577 { |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
578 (*regist)(this); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
579 } |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
580 |
758 | 581 void |
539 | 582 SceneGraphRoot::allRemove(SceneGraphPtr list) |
583 { | |
584 SceneGraphPtr p = list; | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
585 |
539 | 586 while (p) { |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
587 SceneGraphPtr p1 = p->next; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
588 delete p; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
589 p = p1; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
590 cnt--; |
539 | 591 } |
592 } | |
593 | |
594 void | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
595 SceneGraphRoot::checkRemove() |
539 | 596 { |
597 SceneGraphPtr p = sg_available_list; | |
598 SceneGraphPtr p1; | |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
599 |
539 | 600 while (p) { |
759
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
601 p1 = p->next; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
602 if (p->isRemoved()) { |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
603 sg_exec_tree = p->realRemoveFromTree(sg_exec_tree); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
604 sg_available_list = p->realRemoveFromList(sg_available_list); |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
605 } |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
606 delete p; |
45f7ab7101ea
first of all commit, not work Rendering/Test/create_task
hiroki
parents:
758
diff
changeset
|
607 p = p1; |
539 | 608 } |
609 } | |
610 | |
611 SceneGraphPtr | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
612 SceneGraphRoot::getExecuteSceneGraph() |
539 | 613 { |
614 return sg_exec_tree; | |
615 } | |
616 | |
617 SceneGraphPtr | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
618 SceneGraphRoot::getDrawSceneGraph() |
539 | 619 { |
620 return sg_draw_tree; | |
621 } | |
622 | |
623 void | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
624 SceneGraphRoot::updateControllerState() |
539 | 625 { |
626 controller->check(); | |
627 } | |
628 | |
629 void | |
630 SceneGraphRoot::setSceneData(SceneGraphPtr sg) | |
631 { | |
632 sg_exec_tree = sg; | |
633 } | |
634 | |
635 Pad* | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
636 SceneGraphRoot::getController() |
539 | 637 { |
638 return controller; | |
639 } | |
640 | |
641 SceneGraphIteratorPtr | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
642 SceneGraphRoot::getIterator() |
539 | 643 { |
644 iterator->set(sg_remove_list); | |
645 return iterator; | |
646 } | |
647 | |
648 SceneGraphIteratorPtr | |
649 SceneGraphRoot::getIterator(SceneGraphPtr list) | |
650 { | |
651 iterator->set(list); | |
652 return iterator; | |
653 } | |
654 | |
655 CameraPtr | |
541
1a31b8820a4d
Cerium Rendering Library
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
539
diff
changeset
|
656 SceneGraphRoot::getCamera() |
539 | 657 { |
658 return camera; | |
659 } | |
597 | 660 |
747 | 661 |
662 SceneGraphPtr | |
597 | 663 SceneGraphRoot::getLight() |
664 { | |
665 | |
666 return light; | |
667 | |
668 } | |
747 | 669 |
670 | |
671 float* | |
672 SceneGraphRoot::getLightVector() | |
673 { | |
674 return light_vector; | |
675 } |