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