Mercurial > hg > Members > kono > Cerium
comparison Renderer/Test/dynamic_create.cc @ 566:006c4e9e6acb
merge
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 22 Oct 2009 23:49:34 +0900 |
parents | |
children | 6289230fe821 |
comparison
equal
deleted
inserted
replaced
565:2e1b6c5e4f8f | 566:006c4e9e6acb |
---|---|
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> | |
10 #include "SceneGraphRoot.h" | |
11 #include "lindaapi.h" | |
12 #include "dynamic_create.h" | |
13 | |
14 #define PORT 10000 | |
15 | |
16 #define SERIAL_REGIST_TUPLE_NO 1 | |
17 | |
18 /* | |
19 typedef struct { | |
20 caddr_t file_mmap; | |
21 off_t size; | |
22 } st_mmap_t; | |
23 */ | |
24 | |
25 typedef struct client_ { | |
26 int id; | |
27 SceneGraphPtr sgp; | |
28 struct client_ *next; | |
29 } client_t; | |
30 | |
31 typedef struct { | |
32 int tid; | |
33 int sid; | |
34 int read_id; | |
35 SceneGraphPtr node; | |
36 TaskManager *manager; | |
37 client_t *clist; | |
38 } callback_arg; | |
39 | |
40 | |
41 void | |
42 client_list_init(TaskManager* manager, client_t *clist) | |
43 { | |
44 clist->id = -1; | |
45 clist->next = clist; | |
46 } | |
47 | |
48 void | |
49 client_list_update(TaskManager *manager, client_t *clist, int id, SceneGraphPtr sgp) | |
50 { | |
51 //client_t *c; | |
52 // for (c = clist->next; c != clist; c = c->next) { | |
53 // if (c->id == id) { | |
54 // c->sgp = sgp; | |
55 // return; | |
56 // } | |
57 // } | |
58 | |
59 // c->next = (client_t *)manager->allocate(sizeof(client_t)); | |
60 // c->next->id = id; | |
61 // c->next->sgp = sgp; | |
62 // c->next->next = clist; | |
63 } | |
64 | |
65 void | |
66 client_list_delete(TaskManager *manager, client_t *clist, int id) | |
67 { | |
68 client_t *c, *prev; | |
69 for (c = clist->next, prev = clist; c->next != clist; c = c->next) { | |
70 if (c->id == id) { | |
71 prev->next = c->next; | |
72 return; | |
73 } | |
74 prev = clist; | |
75 } | |
76 if (c->id == id) { | |
77 prev->next = c->next; | |
78 return; | |
79 } | |
80 } | |
81 | |
82 int | |
83 fix_byte(int size,int fix_byte_size) | |
84 { | |
85 size = (size/fix_byte_size)*fix_byte_size + ((size%fix_byte_size)!= 0)*fix_byte_size; | |
86 | |
87 return size; | |
88 } | |
89 | |
90 st_mmap_t | |
91 my_mmap(char *filename) | |
92 { | |
93 int fd = -1; | |
94 int map = MAP_PRIVATE; | |
95 st_mmap_t st_mmap; | |
96 struct stat sb; | |
97 | |
98 if ((fd = open(filename, O_RDONLY, 0666)) == 0 ) { | |
99 fprintf(stderr, "Can't open %s\n", filename); | |
100 } | |
101 | |
102 if (fstat(fd, &sb)) { | |
103 fprintf(stderr, "Can't fstat %s\n", filename); | |
104 } | |
105 | |
106 printf("file size %d\n", (int)sb.st_size); | |
107 | |
108 st_mmap.size = fix_byte(sb.st_size, 4096); | |
109 | |
110 printf("fix 4096byte file size %d\n", (int)st_mmap.size); | |
111 | |
112 st_mmap.file_mmap = (char *)mmap(NULL, st_mmap.size, PROT_READ, map, fd, (off_t)0); | |
113 if (st_mmap.file_mmap == (caddr_t)-1) { | |
114 fprintf(stderr, "Can't mmap file\n"); | |
115 perror(NULL); | |
116 exit(0); | |
117 } | |
118 | |
119 return st_mmap; | |
120 } | |
121 | |
122 static void | |
123 earth_collision(SceneGraphPtr node, int screen_w, int screen_h, | |
124 SceneGraphPtr tree) | |
125 { | |
126 } | |
127 | |
128 static void | |
129 moon_collision(SceneGraphPtr node, int screen_w, int screen_h, | |
130 SceneGraphPtr tree) | |
131 { | |
132 } | |
133 | |
134 static void | |
135 moon_move(SceneGraphPtr node, int screen_w, int screen_h) | |
136 { | |
137 //node->angle[0] += 3.0f; | |
138 node->xyz[1] += 1.0f; | |
139 } | |
140 | |
141 | |
142 static void | |
143 earth_move(SceneGraphPtr node, int screen_w, int screen_h) | |
144 { | |
145 psx_sync_n(); | |
146 } | |
147 | |
148 SceneGraphPtr | |
149 create_sg(TaskManager *manager, SceneGraphPtr node, unsigned char *data, int len, int serial_id) | |
150 { | |
151 SceneGraphPtr object; | |
152 | |
153 sgroot->createFromXMLmemory(sgroot->tmanager, (char *)data, len); | |
154 object = sgroot->createSceneGraph(sgroot->getLast()); | |
155 object->id = serial_id; | |
156 object->set_move_collision(moon_move, moon_collision); | |
157 node->addChild(object); | |
158 | |
159 return object; | |
160 } | |
161 | |
162 void | |
163 del_callback(unsigned char *data, void *arg) | |
164 { | |
165 free(data); | |
166 } | |
167 | |
168 void | |
169 psx_del(int t, int id) | |
170 { | |
171 psx_callback_in(t, id, del_callback, NULL); | |
172 } | |
173 | |
174 static void | |
175 callback_get_xml(unsigned char *xml_tuple, void *arg) { | |
176 int xml_len = psx_get_datalength(xml_tuple); | |
177 callback_arg *carg = (callback_arg *)arg; | |
178 unsigned char *xml_data = xml_tuple+LINDA_HEADER_SIZE; | |
179 SceneGraphPtr sgp; | |
180 // ここで create | |
181 sgp = create_sg(carg->manager, carg->node, xml_data, xml_len, carg->sid); | |
182 client_list_update(carg->manager, carg->clist, carg->sid, sgp); | |
183 free(arg); | |
184 free(xml_tuple); | |
185 } | |
186 | |
187 static void | |
188 callbacker(unsigned char *tuple, void *arg) { | |
189 int serial_id, xml_id; | |
190 | |
191 unsigned char *data; | |
192 callback_arg *carg = (callback_arg *)arg; | |
193 | |
194 // 最初の4byteデータは使わない | |
195 data = tuple+LINDA_HEADER_SIZE; | |
196 // clientのSerialIDを取得 | |
197 serial_id = ntohl(*(int *)data); | |
198 | |
199 // タプルを解放 | |
200 psx_del(carg->tid, SERIAL_REGIST_TUPLE_NO); | |
201 | |
202 // xml fileを取得する もうすでにxml fileが送信済みである事を期待 | |
203 // つまり、送信者がserial_idを送る前にxml fileを送信していなくてはならない | |
204 xml_id = serial_id * 10; | |
205 callback_arg *copy_arg = (callback_arg *)carg->manager->allocate(sizeof(callback_arg)); | |
206 *copy_arg = *carg; | |
207 copy_arg->sid = serial_id; | |
208 psx_callback_in(carg->tid, xml_id, callback_get_xml, (void *)copy_arg); | |
209 | |
210 /* dataは'\0'で終わっている事を期待 (writerで保証する) */ | |
211 //printf("get data[%d]: `%s'\n", len, data); | |
212 free(tuple); | |
213 | |
214 psx_callback_wait_rd(carg->tid, carg->read_id, callbacker, arg); | |
215 } | |
216 | |
217 void | |
218 linda_init(TaskManager *manager, client_t *clist, SceneGraphPtr node) | |
219 { | |
220 init_linda(); | |
221 callback_arg *carg = (callback_arg *)manager->allocate(sizeof(callback_arg)); | |
222 | |
223 carg->tid = open_linda_java("localhost", PORT); | |
224 carg->read_id = SERIAL_REGIST_TUPLE_NO; | |
225 carg->node = node; | |
226 carg->manager = manager; | |
227 carg->clist = clist; | |
228 psx_callback_wait_rd(carg->tid, carg->read_id, callbacker, carg); | |
229 } | |
230 | |
231 MainLoopPtr | |
232 dynamic_create::init(Viewer *sgroot, int screen_w, int screen_h) | |
233 { | |
234 //SceneGraphPtr earth; | |
235 client_t *clist; | |
236 clist = (client_t *)sgroot->manager->allocate(sizeof(client_t)); | |
237 | |
238 client_list_init(sgroot->manager, clist); | |
239 | |
240 SceneGraphPtr parent; | |
241 parent = sgroot->createSceneGraph(); | |
242 parent->set_move_collision(earth_move, earth_collision); | |
243 parent->xyz[0] += 300; | |
244 | |
245 linda_init(sgroot->manager, clist, parent); | |
246 | |
247 // SceneGraphRoot に、使用する SceneGraph を設定する | |
248 // このとき、ユーザーが記述した SceneGraph の root を渡す。 | |
249 sgroot->setSceneData(parent); | |
250 return sgroot; | |
251 } | |
252 | |
253 extern Application * | |
254 application() { | |
255 return new dynamic_create(); | |
256 } | |
257 | |
258 const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; | |
259 | |
260 extern int init(TaskManager *manager, int argc, char *argv[]); | |
261 extern void task_initialize(); | |
262 static void TMend(TaskManager *manager); | |
263 | |
264 int | |
265 TMmain(TaskManager *manager, int argc, char *argv[]) | |
266 { | |
267 task_initialize(); | |
268 manager->set_TMend(TMend); | |
269 return init(manager, argc, argv); | |
270 | |
271 } | |
272 | |
273 void | |
274 TMend(TaskManager *manager) | |
275 { | |
276 printf("test_nogl end\n"); | |
277 } | |
278 | |
279 /* end */ | |
280 |