Mercurial > hg > Game > Cerium
comparison TaskManager/Test/test_render/Application/chain.cc @ 405:2c592936bbdf draft
make Application sub directory
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 23 Sep 2009 12:36:36 +0900 |
parents | TaskManager/Test/test_render/chain.cc@0d2dc1869cbe |
children | b40a9b901d71 |
comparison
equal
deleted
inserted
replaced
404:0d2dc1869cbe | 405:2c592936bbdf |
---|---|
1 #include <iostream> | |
2 #include <math.h> | |
3 #include "SceneGraphRoot.h" | |
4 #include "SceneGraph.h" | |
5 #include "SGList.h" | |
6 #include "TaskManager.h" | |
7 #include "Func.h" | |
8 | |
9 #define FALSE 0 | |
10 #define TRUE !FALSE | |
11 #define CHAIN_LEN 50 | |
12 | |
13 static double chain_width = 10; | |
14 | |
15 typedef struct { | |
16 double x, y, next_x, next_y; | |
17 double vx, vy, next_vx, next_vy; | |
18 double angle[3]; | |
19 int can_move; | |
20 SceneGraphPtr parent; | |
21 int id; | |
22 //int parent; | |
23 } CHAIN_VARS; | |
24 | |
25 /* SceneGraph の property */ | |
26 CHAIN_VARS* properties[2]; | |
27 CHAIN_VARS* property; | |
28 | |
29 | |
30 //void createSceneGraphFromProperty(CHAIN_VARS* p) ; | |
31 void createSceneGraphFromProperty(void* p) ; | |
32 | |
33 void | |
34 init_chain_vars(CHAIN_VARS *cv) { | |
35 cv->x = 0, cv->y = 0, cv->next_x = 0, cv->next_y = 0; | |
36 cv->vx = 0, cv->vy = 0, cv->next_vx = 0, cv->next_vy = 0; | |
37 cv->can_move = TRUE; | |
38 } | |
39 | |
40 void | |
41 set_vector(CHAIN_VARS *p, SceneGraphPtr sg) { | |
42 sg->xyz[0] = p->next_x; | |
43 sg->xyz[1] = p->next_y; | |
44 sg->xyz[2] = 0.0f; | |
45 sg->angle[0] = p->angle[0]; | |
46 sg->angle[1] = p->angle[1]; | |
47 sg->angle[2] = p->angle[2]; | |
48 } | |
49 | |
50 | |
51 static void | |
52 chain_move_ope(SceneGraphPtr node, int screen_w, int screen_h) | |
53 { | |
54 Pad *pad = sgroot->getController(); | |
55 | |
56 if (pad->circle.isHold()) { | |
57 property[CHAIN_LEN-1].can_move = FALSE; | |
58 if (pad->left.isHold()) { | |
59 property[CHAIN_LEN-1].x += -5.0; | |
60 } else if (pad->right.isHold()) { | |
61 property[CHAIN_LEN-1].x += 5.0; | |
62 } | |
63 | |
64 if (pad->up.isHold()) { | |
65 property[CHAIN_LEN-1].y += -5.0; | |
66 } else if (pad->down.isHold()) { | |
67 property[CHAIN_LEN-1].y += 5.0; | |
68 } | |
69 } else { | |
70 property[CHAIN_LEN-1].can_move = TRUE; | |
71 } | |
72 } | |
73 | |
74 void | |
75 chain_move(TaskManager *manager, SceneGraphPtr sg, int w, int h) | |
76 { | |
77 int id = sg->id; | |
78 //CHAIN_VARS* p = (CHAIN_VARS*)sg->propertyptr; | |
79 HTaskPtr chain_cal; | |
80 CHAIN_VARS* output; | |
81 | |
82 // SceneGraph の切り替えもここでやる | |
83 if (property == properties[0]) { | |
84 property = properties[1]; | |
85 output = properties[0]; | |
86 }else{ | |
87 property = properties[0]; | |
88 output = properties[1]; | |
89 } | |
90 chain_cal = manager->create_task(CHAINCAL_TASK); | |
91 chain_cal->add_inData(property, sizeof(CHAIN_VARS)*CHAIN_LEN); | |
92 chain_cal->add_param(id); | |
93 chain_cal->add_outData(output, sizeof(CHAIN_VARS)*CHAIN_LEN); | |
94 chain_cal->set_post(createSceneGraphFromProperty, (void*)id); | |
95 chain_cal->spawn(); | |
96 | |
97 } | |
98 | |
99 void | |
100 chain_collision(SceneGraphPtr sg, int w, int h, SceneGraphPtr osg) | |
101 { | |
102 | |
103 } | |
104 | |
105 void | |
106 createSceneGraphFromProperty(void* p) | |
107 { | |
108 CHAIN_VARS* chain_p = (CHAIN_VARS*)p; | |
109 SceneGraphPtr chain_copy = sgroot->createSceneGraph(CHAIN); | |
110 chain_copy->propertyptr = (void*)chain_p; | |
111 chain_copy->property_size = sizeof(CHAIN_VARS); | |
112 set_vector(chain_p, chain_copy); | |
113 chain_p->parent->addChild(chain_copy); | |
114 } | |
115 | |
116 void | |
117 chain_init(TaskManager *manager, int w, int h) | |
118 { | |
119 SceneGraphPtr root_chain, chain; | |
120 CHAIN_VARS rcv; | |
121 | |
122 HTaskPtr chain_init; | |
123 | |
124 | |
125 sgroot->createFromXMLfile(manager, "xml_file/chain.xml"); | |
126 | |
127 /* SPE に送る property の配列の領域確保 */ | |
128 properties[0] = (CHAIN_VARS*)manager->allocate(sizeof(CHAIN_VARS)*CHAIN_LEN); | |
129 properties[1] = (CHAIN_VARS*)manager->allocate(sizeof(CHAIN_VARS)*CHAIN_LEN); | |
130 property = properties[0]; | |
131 | |
132 root_chain = sgroot->createSceneGraph(CHAIN); | |
133 // set_move_collision()ではだめ | |
134 root_chain->set_move_collision(chain_move_ope, chain_collision); | |
135 init_chain_vars(&rcv); | |
136 rcv.next_x = w / 2; | |
137 rcv.next_y = 0.0; | |
138 rcv.angle[0] = 0; | |
139 rcv.angle[1] = 0; | |
140 rcv.angle[2] = 0; | |
141 | |
142 set_vector(&rcv, root_chain); | |
143 | |
144 for(int i = 0; i < CHAIN_LEN; i++) { | |
145 chain = sgroot->createSceneGraph(CHAIN); | |
146 property[i].id = i; | |
147 init_chain_vars(&property[i]); | |
148 property[i].x = 0; | |
149 property[i].y = chain_width * i; | |
150 set_vector(&property[i], chain); | |
151 property->angle[1] = -90 * (i % 2); | |
152 //chain->set_move_collision(chain_move, chain_collision); | |
153 chain->propertyptr = &property[i]; | |
154 chain->property_size = sizeof(CHAIN_VARS); | |
155 root_chain->addChild(chain); | |
156 property[i].parent = root_chain; | |
157 } | |
158 property[0].can_move = FALSE; | |
159 | |
160 // property を SPU の共有領域へコピーする | |
161 chain_init = manager->create_task(CHAININIT_TASK); | |
162 chain_init->add_inData(property, sizeof(CHAIN_VARS)*CHAIN_LEN); | |
163 chain_init->add_param(CHAIN_LEN); | |
164 chain_init->set_cpu(SPE_0); | |
165 chain_init->set_post(createSceneGraphFromProperty, (void*)property); | |
166 chain_init->spawn(); | |
167 | |
168 sgroot->setSceneData(root_chain); | |
169 } | |
170 |