Mercurial > hg > Members > kono > Cerium
annotate Renderer/Test/dynamic_create.cc @ 642:000a3bd205d1
minor fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 21 Nov 2009 10:12:25 +0900 |
parents | 529188ae604d |
children | d0b8860c17f8 |
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 /* |
23 typedef struct { | |
24 caddr_t file_mmap; | |
25 off_t size; | |
26 } st_mmap_t; | |
27 */ | |
28 | |
29 typedef struct client_ { | |
30 int id; | |
31 SceneGraphPtr sgp; | |
32 struct client_ *next; | |
33 } client_t; | |
34 | |
35 typedef struct { | |
36 int tid; | |
37 int sid; | |
38 int read_id; | |
39 SceneGraphPtr node; | |
40 TaskManager *manager; | |
41 client_t *clist; | |
42 } callback_arg; | |
43 | |
44 | |
45 void | |
46 client_list_init(TaskManager* manager, client_t *clist) | |
47 { | |
48 clist->id = -1; | |
49 clist->next = clist; | |
50 } | |
51 | |
52 void | |
53 client_list_update(TaskManager *manager, client_t *clist, int id, SceneGraphPtr sgp) | |
54 { | |
55 } | |
56 | |
57 void | |
58 client_list_delete(TaskManager *manager, client_t *clist, int id) | |
59 { | |
60 client_t *c, *prev; | |
61 for (c = clist->next, prev = clist; c->next != clist; c = c->next) { | |
62 if (c->id == id) { | |
63 prev->next = c->next; | |
64 return; | |
65 } | |
66 prev = clist; | |
67 } | |
68 if (c->id == id) { | |
591 | 69 prev->next = c->next; |
70 return; | |
566 | 71 } |
72 } | |
73 | |
74 | |
75 static void | |
76 earth_collision(SceneGraphPtr node, int screen_w, int screen_h, | |
77 SceneGraphPtr tree) | |
78 { | |
79 } | |
80 | |
81 static void | |
82 moon_collision(SceneGraphPtr node, int screen_w, int screen_h, | |
83 SceneGraphPtr tree) | |
84 { | |
85 } | |
86 | |
87 static void | |
88 moon_move(SceneGraphPtr node, int screen_w, int screen_h) | |
89 { | |
591 | 90 // LindaServerから座標データを取得してオブジェクトに反映させる。 |
600 | 91 unsigned char *reply = psx_reply(node->seq); |
591 | 92 if (reply != NULL) { |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
93 char *data = (char *)(reply + LINDA_HEADER_SIZE); |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
94 // XDRの準備 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
95 XDR xdrs; |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
96 xdrmem_create(&xdrs, data, RECV_DATA_SIZE, XDR_DECODE); |
600 | 97 // ntoh_float(&data[0]); ntoh_float(&data[1]); |
591 | 98 for (int i = 0; i < 3; i++) { |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
99 xdr_float(&xdrs, &node->xyz[i]); |
591 | 100 } |
593
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
101 node->seq = psx_wait_rd(sgroot->tid, node->id * 10 + 1); |
591 | 102 } |
566 | 103 } |
104 | |
105 | |
106 static void | |
107 earth_move(SceneGraphPtr node, int screen_w, int screen_h) | |
108 { | |
575
0f13810d4492
Linda API worked. (slightly unreliable)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
574
diff
changeset
|
109 // psx_sync_n(); in viewer::MainLoop |
566 | 110 } |
111 | |
112 SceneGraphPtr | |
581 | 113 create_sg(TaskManager *manager, SceneGraphPtr parent, unsigned char *data, int len, int serial_id) |
566 | 114 { |
580
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
579
diff
changeset
|
115 SceneGraphPtr child = sgroot->createSceneGraph(); |
581 | 116 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
|
117 // 読み込んだオブジェクトは、すべて、child の child になる。 |
da82a47ece92
add all object in file in dynamic_create
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
579
diff
changeset
|
118 sgroot->createFromXMLmemory(sgroot->tmanager, child, (char *)data, len); |
581 | 119 child->set_move_collision(moon_move, moon_collision); |
591 | 120 child->id = serial_id; |
593
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
121 child->seq = psx_wait_rd(sgroot->tid, serial_id * 10 + 1); |
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
122 |
581 | 123 return child; |
566 | 124 } |
125 | |
126 | |
127 static void | |
128 callback_get_xml(unsigned char *xml_tuple, void *arg) { | |
129 int xml_len = psx_get_datalength(xml_tuple); | |
130 callback_arg *carg = (callback_arg *)arg; | |
591 | 131 unsigned char *xml_data = xml_tuple + LINDA_HEADER_SIZE; |
566 | 132 SceneGraphPtr sgp; |
133 // ここで create | |
581 | 134 // fwrite(xml_data, 1, 10, stdout); |
566 | 135 sgp = create_sg(carg->manager, carg->node, xml_data, xml_len, carg->sid); |
581 | 136 printf("%s size %d loaded\n", sgp->children->name, xml_len); |
566 | 137 client_list_update(carg->manager, carg->clist, carg->sid, sgp); |
138 free(arg); | |
139 free(xml_tuple); | |
140 } | |
141 | |
142 static void | |
591 | 143 callbacker(unsigned char *taple, void *arg) { |
566 | 144 int serial_id, xml_id; |
145 | |
146 unsigned char *data; | |
147 callback_arg *carg = (callback_arg *)arg; | |
148 | |
149 // 最初の4byteデータは使わない | |
601 | 150 data = taple + LINDA_HEADER_SIZE; |
566 | 151 // clientのSerialIDを取得 |
152 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
|
153 printf("serial id = %d\n", serial_id); // タプルを解放 |
574 | 154 //psx_del(carg->tid, SERIAL_REGIST_TUPLE_NO); |
566 | 155 |
156 // xml fileを取得する もうすでにxml fileが送信済みである事を期待 | |
157 // つまり、送信者がserial_idを送る前にxml fileを送信していなくてはならない | |
158 xml_id = serial_id * 10; | |
159 callback_arg *copy_arg = (callback_arg *)carg->manager->allocate(sizeof(callback_arg)); | |
160 *copy_arg = *carg; | |
161 copy_arg->sid = serial_id; | |
162 psx_callback_in(carg->tid, xml_id, callback_get_xml, (void *)copy_arg); | |
163 | |
164 /* dataは'\0'で終わっている事を期待 (writerで保証する) */ | |
165 //printf("get data[%d]: `%s'\n", len, data); | |
591 | 166 free(taple); |
566 | 167 |
574 | 168 psx_callback_in(carg->tid, carg->read_id, callbacker, arg); |
566 | 169 } |
170 | |
642 | 171 static char const *linda = "localhost"; |
577 | 172 |
566 | 173 void |
174 linda_init(TaskManager *manager, client_t *clist, SceneGraphPtr node) | |
175 { | |
176 init_linda(); | |
177 callback_arg *carg = (callback_arg *)manager->allocate(sizeof(callback_arg)); | |
178 | |
579 | 179 carg->tid = open_linda_java(linda, PORT); |
591 | 180 sgroot->tid = carg->tid; |
566 | 181 carg->read_id = SERIAL_REGIST_TUPLE_NO; |
182 carg->node = node; | |
183 carg->manager = manager; | |
184 carg->clist = clist; | |
574 | 185 psx_callback_in(carg->tid, carg->read_id, callbacker, carg); |
566 | 186 } |
187 | |
593
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
188 MainLoopPtr |
566 | 189 dynamic_create::init(Viewer *sgroot, int screen_w, int screen_h) |
190 { | |
191 //SceneGraphPtr earth; | |
192 client_t *clist; | |
193 clist = (client_t *)sgroot->manager->allocate(sizeof(client_t)); | |
194 | |
195 client_list_init(sgroot->manager, clist); | |
196 | |
197 SceneGraphPtr parent; | |
198 parent = sgroot->createSceneGraph(); | |
199 parent->set_move_collision(earth_move, earth_collision); | |
593
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
200 // parent->xyz[0] += 300; |
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
201 // parent->xyz[1] += 300; |
566 | 202 linda_init(sgroot->manager, clist, parent); |
203 | |
204 // SceneGraphRoot に、使用する SceneGraph を設定する | |
205 // このとき、ユーザーが記述した SceneGraph の root を渡す。 | |
206 sgroot->setSceneData(parent); | |
207 return sgroot; | |
208 } | |
209 | |
210 extern Application * | |
211 application() { | |
212 return new dynamic_create(); | |
213 } | |
214 | |
215 const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; | |
216 | |
217 extern int init(TaskManager *manager, int argc, char *argv[]); | |
218 extern void task_initialize(); | |
219 static void TMend(TaskManager *manager); | |
220 | |
221 int | |
222 TMmain(TaskManager *manager, int argc, char *argv[]) | |
223 { | |
224 task_initialize(); | |
225 manager->set_TMend(TMend); | |
577 | 226 |
227 for(int i=0;i<argc;i++) { | |
228 if (strcmp(argv[i],"-linda") == 0 && i+1<=argc) { | |
229 linda = argv[i+1]; | |
230 } | |
231 } | |
232 | |
566 | 233 return init(manager, argc, argv); |
234 } | |
235 | |
236 void | |
237 TMend(TaskManager *manager) | |
238 { | |
239 printf("test_nogl end\n"); | |
240 } | |
241 | |
242 /* end */ | |
243 |