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