Mercurial > hg > Members > kono > Cerium
annotate Renderer/Test/dynamic_create.cc @ 854:6aa20c0dd8f8
may be need ppeManager
author | yutaka@localhost.localdomain |
---|---|
date | Wed, 09 Jun 2010 23:04:09 +0900 |
parents | 8c78d15ea999 |
children |
rev | line source |
---|---|
566 | 1 #include <stdlib.h> |
2 #include <stdio.h> | |
3 #include <string.h> | |
4 #include <fcntl.h> | |
5 #include <sys/types.h> | |
6 #include <sys/mman.h> | |
7 #include <sys/stat.h> | |
8 #include <unistd.h> | |
9 #include <arpa/inet.h> | |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
10 #include <rpc/types.h> |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
11 #include <rpc/xdr.h> |
566 | 12 #include "SceneGraphRoot.h" |
13 #include "lindaapi.h" | |
14 #include "dynamic_create.h" | |
15 | |
16 #define PORT 10000 | |
17 | |
18 #define SERIAL_REGIST_TUPLE_NO 1 | |
19 | |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
20 #define RECV_DATA_SIZE sizeof(float) * 6 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
21 |
566 | 22 typedef struct client_ { |
23 int id; | |
24 SceneGraphPtr sgp; | |
25 struct client_ *next; | |
26 } client_t; | |
27 | |
28 typedef struct { | |
29 int tid; | |
30 int sid; | |
31 int read_id; | |
32 SceneGraphPtr node; | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
33 SceneGraphRoot *sgroot; |
566 | 34 TaskManager *manager; |
35 client_t *clist; | |
36 } callback_arg; | |
37 | |
38 | |
39 void | |
40 client_list_init(TaskManager* manager, client_t *clist) | |
41 { | |
42 clist->id = -1; | |
43 clist->next = clist; | |
44 } | |
45 | |
46 void | |
47 client_list_update(TaskManager *manager, client_t *clist, int id, SceneGraphPtr sgp) | |
48 { | |
49 } | |
50 | |
51 void | |
52 client_list_delete(TaskManager *manager, client_t *clist, int id) | |
53 { | |
54 client_t *c, *prev; | |
55 for (c = clist->next, prev = clist; c->next != clist; c = c->next) { | |
56 if (c->id == id) { | |
57 prev->next = c->next; | |
58 return; | |
59 } | |
60 prev = clist; | |
61 } | |
62 if (c->id == id) { | |
591 | 63 prev->next = c->next; |
64 return; | |
566 | 65 } |
66 } | |
67 | |
68 | |
69 static void | |
656
d0b8860c17f8
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
642
diff
changeset
|
70 earth_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, |
566 | 71 SceneGraphPtr tree) |
72 { | |
73 } | |
74 | |
75 static void | |
656
d0b8860c17f8
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
642
diff
changeset
|
76 moon_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, |
566 | 77 SceneGraphPtr tree) |
78 { | |
79 } | |
80 | |
81 static void | |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
82 set_position(SceneGraphPtr node, unsigned char *reply) { |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
83 char *data = (char *)(reply + LINDA_HEADER_SIZE); |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
84 // XDRの準備 |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
85 XDR xdrs; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
86 xdrmem_create(&xdrs, data, RECV_DATA_SIZE, XDR_DECODE); |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
87 for (int i = 0; i < 3; i++) { |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
88 xdr_float(&xdrs, &node->xyz[i]); |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
89 } |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
90 } |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
91 |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
92 static void |
656
d0b8860c17f8
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
642
diff
changeset
|
93 moon_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) |
566 | 94 { |
656
d0b8860c17f8
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
642
diff
changeset
|
95 SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; |
591 | 96 // LindaServerから座標データを取得してオブジェクトに反映させる。 |
847
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
97 |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
98 if (!node->resend_flag || node->seq_rd != node->seq) { |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
99 unsigned char *reply_rd = psx_reply(node->seq_rd); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
100 if (reply_rd != NULL) { |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
101 set_position(node, reply_rd); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
102 free(reply_rd); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
103 return; |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
104 } |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
105 } |
843
0c7d885f0c92
cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
841
diff
changeset
|
106 unsigned char *reply = psx_reply(node->seq); |
0c7d885f0c92
cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
841
diff
changeset
|
107 if (reply != NULL) { |
0c7d885f0c92
cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
841
diff
changeset
|
108 set_position(node, reply); |
0c7d885f0c92
cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
841
diff
changeset
|
109 free(reply); |
847
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
110 node->seq = psx_wait_rd(sgroot->tid, node->id * 10 + 1); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
111 node->resend_flag = true; |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
112 } else if (node->resend_flag) { |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
113 node->seq_rd = psx_rd(sgroot->tid, node->id * 10 + 1); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
114 node->resend_flag = false; |
591 | 115 } |
566 | 116 } |
117 | |
118 static void | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
119 earth_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) |
566 | 120 { |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
574
diff
changeset
|
121 // psx_sync_n(); in viewer::MainLoop |
566 | 122 } |
123 | |
124 SceneGraphPtr | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
125 create_sg(TaskManager *manager, SceneGraphRoot *sgroot, SceneGraphPtr parent, unsigned char *data, |
656
d0b8860c17f8
remove global variable "sgroot" , add SgChange.{cc, h} SgMain.cc SgRootChange.{cc, h}
hiroki@henri.cr.ie.u-ryukyu.ac.jp
parents:
642
diff
changeset
|
126 int len, int serial_id) |
566 | 127 { |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
579
diff
changeset
|
128 SceneGraphPtr child = sgroot->createSceneGraph(); |
581 | 129 parent->addChild(child); |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
579
diff
changeset
|
130 // 読み込んだオブジェクトは、すべて、child の child になる。 |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
579
diff
changeset
|
131 sgroot->createFromXMLmemory(sgroot->tmanager, child, (char *)data, len); |
581 | 132 child->set_move_collision(moon_move, moon_collision); |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
133 child->id = serial_id; |
847
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
134 child->seq = psx_wait_rd(sgroot->tid, serial_id * 10 + 1); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
135 child->seq_rd = psx_rd(sgroot->tid, serial_id * 10 + 1); |
8c78d15ea999
replace rd() to wait_rd(). and if reply of wait_rd() is NULL, client request one more rd(). for wait_rd() cannot get last changed tuple.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
844
diff
changeset
|
136 child->resend_flag = false; |
581 | 137 return child; |
566 | 138 } |
139 | |
140 | |
141 static void | |
142 callback_get_xml(unsigned char *xml_tuple, void *arg) { | |
143 int xml_len = psx_get_datalength(xml_tuple); | |
144 callback_arg *carg = (callback_arg *)arg; | |
591 | 145 unsigned char *xml_data = xml_tuple + LINDA_HEADER_SIZE; |
566 | 146 SceneGraphPtr sgp; |
147 // ここで create | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
148 sgp = create_sg(carg->manager, carg->sgroot, carg->node, xml_data, xml_len, carg->sid); |
581 | 149 printf("%s size %d loaded\n", sgp->children->name, xml_len); |
566 | 150 client_list_update(carg->manager, carg->clist, carg->sid, sgp); |
151 free(arg); | |
152 free(xml_tuple); | |
153 } | |
154 | |
155 static void | |
591 | 156 callbacker(unsigned char *taple, void *arg) { |
566 | 157 int serial_id, xml_id; |
158 | |
159 unsigned char *data; | |
160 callback_arg *carg = (callback_arg *)arg; | |
161 | |
162 // 最初の4byteデータは使わない | |
601 | 163 data = taple + LINDA_HEADER_SIZE; |
566 | 164 // clientのSerialIDを取得 |
165 serial_id = ntohl(*(int *)data); | |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
166 printf("serial id = %d\n", serial_id); // タプルを解放 |
566 | 167 |
168 // xml fileを取得する もうすでにxml fileが送信済みである事を期待 | |
169 // つまり、送信者がserial_idを送る前にxml fileを送信していなくてはならない | |
170 xml_id = serial_id * 10; | |
171 callback_arg *copy_arg = (callback_arg *)carg->manager->allocate(sizeof(callback_arg)); | |
172 *copy_arg = *carg; | |
173 copy_arg->sid = serial_id; | |
174 psx_callback_in(carg->tid, xml_id, callback_get_xml, (void *)copy_arg); | |
175 | |
176 /* dataは'\0'で終わっている事を期待 (writerで保証する) */ | |
591 | 177 free(taple); |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
178 |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
179 // arg は使い回すらしい。 |
574 | 180 psx_callback_in(carg->tid, carg->read_id, callbacker, arg); |
566 | 181 } |
182 | |
843
0c7d885f0c92
cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
841
diff
changeset
|
183 static const char *linda = "localhost"; |
577 | 184 |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
185 static void |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
186 linda_init(TaskManager *manager, SceneGraphRoot *sgroot, client_t *clist, SceneGraphPtr node) |
566 | 187 { |
188 init_linda(); | |
189 callback_arg *carg = (callback_arg *)manager->allocate(sizeof(callback_arg)); | |
190 | |
579 | 191 carg->tid = open_linda_java(linda, PORT); |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
192 carg->sgroot = sgroot; |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
193 carg->sgroot->tid = carg->tid; |
566 | 194 carg->read_id = SERIAL_REGIST_TUPLE_NO; |
195 carg->node = node; | |
196 carg->manager = manager; | |
197 carg->clist = clist; | |
574 | 198 psx_callback_in(carg->tid, carg->read_id, callbacker, carg); |
566 | 199 } |
200 | |
593
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
201 MainLoopPtr |
566 | 202 dynamic_create::init(Viewer *sgroot, int screen_w, int screen_h) |
203 { | |
204 client_t *clist; | |
205 clist = (client_t *)sgroot->manager->allocate(sizeof(client_t)); | |
206 | |
207 client_list_init(sgroot->manager, clist); | |
208 | |
209 SceneGraphPtr parent; | |
210 parent = sgroot->createSceneGraph(); | |
211 parent->set_move_collision(earth_move, earth_collision); | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
656
diff
changeset
|
212 linda_init(sgroot->manager, sgroot->sgroot, clist, parent); |
566 | 213 |
214 // SceneGraphRoot に、使用する SceneGraph を設定する | |
215 // このとき、ユーザーが記述した SceneGraph の root を渡す。 | |
216 sgroot->setSceneData(parent); | |
217 return sgroot; | |
218 } | |
219 | |
220 extern Application * | |
221 application() { | |
222 return new dynamic_create(); | |
223 } | |
224 | |
225 const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; | |
226 | |
227 extern int init(TaskManager *manager, int argc, char *argv[]); | |
228 extern void task_initialize(); | |
229 static void TMend(TaskManager *manager); | |
230 | |
231 int | |
232 TMmain(TaskManager *manager, int argc, char *argv[]) | |
233 { | |
234 task_initialize(); | |
235 manager->set_TMend(TMend); | |
577 | 236 |
237 for(int i=0;i<argc;i++) { | |
238 if (strcmp(argv[i],"-linda") == 0 && i+1<=argc) { | |
239 linda = argv[i+1]; | |
240 } | |
241 } | |
242 | |
566 | 243 return init(manager, argc, argv); |
244 } | |
245 | |
246 void | |
247 TMend(TaskManager *manager) | |
248 { | |
249 printf("test_nogl end\n"); | |
250 } | |
251 | |
252 /* end */ |