Mercurial > hg > Members > e085722 > Cerium
annotate Renderer/Test_/aquarium.cc @ 4:b5b462ac9b3b
Cerium Blender ball_bound
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 29 Nov 2010 16:42:42 +0900 |
parents | |
children |
rev | line source |
---|---|
4
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include <stdio.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 #include <string.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 #include <fcntl.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include <sys/types.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 #include <sys/mman.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 #include <sys/stat.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 #include <unistd.h> |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 #include "SceneGraphRoot.h" |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 #include "lindaapi.h" |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 #include "aquarium.h" |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 #include "aquarium.pb.h" |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 #define GET_SERIAL_ID 65535 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 int aquarium::last_player_id = 0; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 Viewer *aquarium::sgroot; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 linda_t aquarium::linda_addr = { "localhost", 10000 }; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 int aquarium::linda; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 int aquarium::serial_id; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 int aquarium::width; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 int aquarium::start_x; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 char *aquarium::xml_file_name; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 const char *usr_help_str = "Usage: ./aquarium -linda LINDA_SERVER_NAME\n"; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 void TMend(TaskManager *manager); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 extern void task_initialize(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 extern int init(TaskManager *manager, int argc, char *argv[]); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 extern Application * |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 application() { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 return new aquarium(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 /* |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 static void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 null_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 */ |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 static void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 null_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 aquarium::update_last_player_id() { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 last_player_id++; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 if (last_player_id == serial_id) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 last_player_id++; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 aquarium::set_position(SceneGraphPtr node, unsigned char *reply) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 aqua::Position *pos = new aqua::Position(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 pos->ParseFromArray(reply + LINDA_HEADER_SIZE, psx_get_datalength(reply)); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 node->xyz[0] = pos->x() - start_x; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 node->xyz[1] = pos->y(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 node->angle[0] = pos->angle_x(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 node->angle[1] = pos->angle_y(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 delete pos; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 static void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 update_position_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 // LindaServerから座標データを取得してオブジェクトに反映させる。 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 if (!node->resend_flag || node->seq_rd != node->seq) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 unsigned char *reply_rd = psx_reply(node->seq_rd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 if (reply_rd != NULL) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 aquarium::set_position(node, reply_rd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 psx_free(reply_rd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 return; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 unsigned char *reply = psx_reply(node->seq); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 if (reply != NULL) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 // aquarium::set_position(node, reply); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 psx_free(reply); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 node->seq = psx_wait_rd(aquarium::linda, node->id * 10 + 1); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 node->resend_flag = true; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 } else if (node->resend_flag) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 node->seq_rd = psx_rd(aquarium::linda, node->id * 10 + 1); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 node->resend_flag = false; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 SceneGraphPtr |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 create_sg(Viewer *viewer, SceneGraphPtr par, unsigned char *data, int len, int serial_id) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 SceneGraphPtr child = viewer->sgroot->createSceneGraph(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 viewer->sgroot->createFromXMLmemory(viewer->sgroot->tmanager, child, (char *)data, len); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 child->set_move_collision(update_position_move, null_collision); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 child->id = serial_id; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 child->seq = psx_wait_rd(aquarium::linda, serial_id * 10 + 1); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 child->seq_rd = psx_rd(aquarium::linda, serial_id * 10 + 1); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 child->resend_flag = false; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99 par->addChild(child); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 return child; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103 static void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104 check_new_player_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 unsigned char *reply_rd = psx_reply(node->seq_rd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 if (reply_rd != NULL) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
108 unsigned char *xml_data = reply_rd + LINDA_HEADER_SIZE; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
109 int xml_len = psx_get_datalength(reply_rd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
110 create_sg(aquarium::sgroot, node, xml_data, xml_len, aquarium::last_player_id); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
111 psx_free(reply_rd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 aquarium::update_last_player_id(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 int tuple_id = aquarium::last_player_id * 10; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 node->seq_rd = psx_rd(aquarium::linda, tuple_id); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 // printf("rd id: %d\n", aquarium::last_player_id); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 void * |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 file_map(const char *filename, int *size) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 int fd; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122 void *addr; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 struct stat sb; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 if ((fd = open(filename, O_RDONLY)) == -1) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 fprintf(stderr, "Can't open %s\n", filename); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 perror(NULL); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 if (fstat(fd, &sb) == -1) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 fprintf(stderr, "Can't fstat %s\n", filename); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 perror(NULL); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 *size = sb.st_size; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 addr = mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 if (addr == MAP_FAILED) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 perror("mmap error\n"); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 exit(EXIT_FAILURE); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 close(fd); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 return addr; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
144 void callback_free(unsigned char *tuple, void *arg) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 psx_free(tuple); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 aquarium::send_position(SceneGraphPtr node) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 int pos_id = serial_id * 10 + 1; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
151 psx_callback_in(linda, pos_id, callback_free, NULL); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
152 aqua::Position *pos = new aqua::Position(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153 pos->set_x(node->xyz[0] + start_x); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 pos->set_y(node->xyz[1]); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 pos->set_angle_x(node->angle[0]); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 pos->set_angle_y(node->angle[1]); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
157 int size = pos->ByteSize(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 unsigned char *msg = (unsigned char *) sgroot->manager->allocate(sizeof(char) * size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 pos->SerializeToArray(msg, size); // 更新したデータを再度シリアライズ |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 delete pos; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 psx_out(linda, pos_id, msg, size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
163 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
165 my_move(SceneGraphPtr node, void *sgroot_, int w, int h) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
167 SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
168 Pad *pad = sgroot->getController(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169 int flag = 0; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
170 if (pad->right.isHold() || pad->left.isHold()) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171 if (pad->right.isHold()) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
172 node->xyz[0] += 5.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
173 node->angle[1] = 0.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
174 flag = 1; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
175 } else if (pad->left.isHold()) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
176 node->xyz[0] -= 5.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 node->angle[1] = 180.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178 flag = 1; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
180 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
181 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
182 if (pad->down.isHold() || pad->up.isHold() ) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 if (pad->down.isHold()) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 node->xyz[1] += 5.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 flag = 1; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
186 } else if (pad->up.isHold()) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 node->xyz[1] -= 5.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188 flag = 1; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
190 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 /* ここで座標を送信 */ |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 if (flag || node->resend_flag) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 aquarium::send_position(node); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
196 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 aquarium::create_my_sg(Viewer *viewer, SceneGraphPtr par, int screen_w, int screen_h) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
200 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
201 int size; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 void *addr = file_map(xml_file_name, &size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
203 SceneGraphPtr sgp = viewer->createSceneGraph(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 viewer->createFromXMLmemory(sgp, (char *)addr, size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 sgp->set_move_collision(my_move, null_collision); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
206 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 par->addChild(sgp); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 sgp->c_xyz[0] = 0.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209 sgp->c_xyz[1] = 0.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 sgp->c_xyz[2] = 0.0f; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212 int xml_id = serial_id * 10; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 psx_out(linda, xml_id, (unsigned char *)addr, size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 int pos_id = serial_id * 10 + 1; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 aqua::Position *pos = new aqua::Position(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
217 pos->set_x(0.0f + start_x); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
218 pos->set_y(0.0f); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 pos->set_angle_x(0.0f); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
220 pos->set_angle_y(0.0f); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
221 unsigned char *msg = (unsigned char *) viewer->manager->allocate(sizeof(unsigned char *) * size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
222 pos->SerializeToArray(msg, size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
223 psx_out(linda, pos_id, (unsigned char *)msg, pos->ByteSize()); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
224 delete pos; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
225 sgp->seq = 0; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
226 sgp->resend_flag = 0; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
227 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
228 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
229 MainLoopPtr |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
230 aquarium::init(Viewer *sgroot, int screen_w, int screen_h) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
232 this->sgroot = sgroot; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
233 width = screen_w; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
234 linda_connect(); // 接続に合わせて serial_id も取得 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
235 update_screen_scope(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
236 SceneGraphPtr parent = sgroot->createSceneGraph(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
237 parent->set_move_collision(check_new_player_move, null_collision); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
238 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
239 create_my_sg(sgroot, parent, screen_w, screen_h); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
240 update_last_player_id(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
241 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
242 int tuple_id = aquarium::last_player_id * 10; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
243 parent->seq_rd = psx_rd(linda, tuple_id); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
244 sgroot->setSceneData(parent); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
245 return sgroot; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
246 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
247 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
248 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
249 aquarium::linda_connect() { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
250 init_linda(); // セレクタの初期化 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
251 linda = open_linda_java(linda_addr.hostname, linda_addr.port); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
252 // serial_id の取得 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
253 int seq = psx_in(linda, GET_SERIAL_ID); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
254 unsigned char *data = NULL; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
255 do { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
256 psx_sync_n(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
257 data = psx_reply(seq); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 } while (data == NULL); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
259 // data[LINDA_HEADER_SIZE + psx_get_datalength(data)] = '\0'; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
260 serial_id = atoi((char *)data + LINDA_HEADER_SIZE); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
261 psx_free(data); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
262 printf("Get serial_id: %d\n", serial_id); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
263 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
264 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
265 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
266 aquarium::update_screen_scope() { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
267 int seq = psx_in(linda, 1); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
268 unsigned char *data = NULL; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
269 do { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
270 psx_sync_n(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
271 data = psx_reply(seq); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
272 } while (data == NULL); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
273 aqua::Width *w = new aqua::Width(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
274 w->ParseFromArray(data + LINDA_HEADER_SIZE, *(int *)(data + LINDA_DATA_LENGTH_OFFSET)); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
275 start_x = w->width(); // 現在の全長を取得 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
276 w->set_width(start_x + width); // 自分の横幅を足す |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
277 int size = w->ByteSize(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
278 unsigned char *msg = (unsigned char *) sgroot->manager->allocate(sizeof(char) * size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
279 w->SerializeToArray(msg, size); // 更新したデータを再度シリアライズ |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
280 delete w; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
281 psx_out(linda, 1, msg, size); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
282 psx_sync_n(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
283 printf("start_x = %d, width = %d\n", start_x, width); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
284 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
285 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
286 int |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
287 TMmain(TaskManager *manager, int argc, char *argv[]) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
288 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
289 task_initialize(); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
290 manager->set_TMend(TMend); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
291 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
292 for (int i = 0; i < argc; i++) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
293 if (strcmp(argv[i],"-linda") == 0 && i + 1 <= argc) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
294 aquarium::linda_addr.hostname = argv[i+1]; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
295 } else if (strcmp(argv[i],"-port") == 0 && i + 1 <= argc) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
296 aquarium::linda_addr.port = atoi(argv[i+1]); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
297 } else if (strcmp(argv[i],"-xml") == 0 && i + 1 <= argc) { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
298 aquarium::xml_file_name = argv[i+1]; |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
299 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
300 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
301 return init(manager, argc, argv); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
302 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
303 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
304 void |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
305 TMend(TaskManager *manager) |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
306 { |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
307 printf("aquarium end\n"); |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
308 } |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
309 |
b5b462ac9b3b
Cerium Blender ball_bound
Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
310 /* end */ |