Mercurial > hg > Game > Cerium
annotate TaskManager/Test/test_render/chain.cpp @ 395:208ba3551474 draft
chain on SPE
author | game@localhost.localdomain |
---|---|
date | Thu, 17 Sep 2009 16:55:18 +0900 |
parents | 3d1e86396d16 |
children | 0b623693e6ec |
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; | |
22 //int parent; | |
375 | 23 } CHAIN_VARS; |
24 | |
395 | 25 /* SceneGraph の property */ |
26 CHAIN_VARS* property; | |
27 | |
375 | 28 CHAIN_VARS cv[CHAIN_LEN]; |
29 | |
395 | 30 void createSceneGraphFromProperty(CHAIN_VARS* p) ; |
31 | |
375 | 32 void |
33 init_chain_vars(CHAIN_VARS *cv) { | |
34 cv->x = 0, cv->y = 0, cv->next_x = 0, cv->next_y = 0; | |
35 cv->vx = 0, cv->vy = 0, cv->next_vx = 0, cv->next_vy = 0; | |
36 cv->can_move = TRUE; | |
37 } | |
38 | |
39 void | |
395 | 40 set_vector(CHAIN_VARS *p, SceneGraphPtr sg) { |
41 sg->xyz[0] = p->next_x; | |
42 sg->xyz[1] = p->next_y; | |
375 | 43 sg->xyz[2] = 0.0f; |
395 | 44 sg->angle[0] = p->angle[0]; |
45 sg->angle[1] = p->angle[1]; | |
46 sg->angle[2] = p->angle[2]; | |
375 | 47 } |
48 | |
49 | |
50 static void | |
51 chain_move_ope(SceneGraphPtr node, int screen_w, int screen_h) | |
52 { | |
53 Pad *pad = sgroot->getController(); | |
54 | |
55 if (pad->circle.isHold()) { | |
395 | 56 property[CHAIN_LEN-1].can_move = FALSE; |
375 | 57 if (pad->left.isHold()) { |
395 | 58 property[CHAIN_LEN-1].x += -5.0; |
375 | 59 } else if (pad->right.isHold()) { |
395 | 60 property[CHAIN_LEN-1].x += 5.0; |
375 | 61 } |
62 | |
63 if (pad->up.isHold()) { | |
395 | 64 property[CHAIN_LEN-1].y += -5.0; |
375 | 65 } else if (pad->down.isHold()) { |
395 | 66 property[CHAIN_LEN-1].y += 5.0; |
375 | 67 } |
68 } else { | |
395 | 69 property[CHAIN_LEN-1].can_move = TRUE; |
375 | 70 } |
71 } | |
72 | |
73 void | |
74 chain_move(SceneGraphPtr sg, int w, int h) | |
75 { | |
76 int id = sg->id; | |
395 | 77 CHAIN_VARS* p = (CHAIN_VARS*)sg->propertyptr; |
382 | 78 if(id == 0) { |
395 | 79 HTaskPtr chain_cal; |
80 chain_cal = manager->create_task(CHAINCAL_TASK); | |
81 chain_cal->add_inData(&property[CHAIN_LEN-1], sizeof(CHAIN_VARS)); | |
82 chain_cal->add_param(id); | |
83 chain_cal->add_outData(property, sizeof(CHAIN_VARS)*CHAIN_LEN); | |
84 chain_cal->spawn(); | |
85 createSceneGraphFromProperty(p); | |
375 | 86 } |
395 | 87 |
375 | 88 } |
89 | |
90 void | |
91 chain_collision(SceneGraphPtr sg, int w, int h, SceneGraphPtr osg) | |
92 { | |
93 | |
94 } | |
95 | |
395 | 96 void |
97 createSceneGraphFromProperty(CHAIN_VARS* p) | |
98 { | |
99 SceneGraphPtr chain_copy; | |
100 chain_copy = sgroot->createSceneGraph(CHAIN); | |
101 chain_copy->propertyptr = (void*)p; | |
102 set_vector(p, chain_copy); | |
103 p->parent->addChild(chain_copy); | |
104 } | |
105 | |
375 | 106 void |
107 chain_init(int w, int h) | |
108 { | |
109 SceneGraphPtr root_chain, chain; | |
110 CHAIN_VARS rcv; | |
111 | |
395 | 112 HTaskPtr chain_init; |
113 | |
375 | 114 sgroot->createFromXMLfile("xml_file/chain.xml"); |
115 | |
395 | 116 /* SPE に送る property の配列の領域確保 */ |
117 property = (CHAIN_VARS*)manager->allocate(sizeof(CHAIN_VARS)*CHAIN_LEN); | |
118 | |
375 | 119 root_chain = sgroot->createSceneGraph(CHAIN); |
120 root_chain->set_move_collision(chain_move_ope, chain_collision); | |
121 init_chain_vars(&rcv); | |
122 rcv.next_x = w / 2; | |
123 rcv.next_y = 0.0; | |
395 | 124 rcv.angle[0] = 0; |
125 rcv.angle[1] = 0; | |
126 rcv.angle[2] = 0; | |
127 | |
375 | 128 set_vector(&rcv, root_chain); |
129 | |
130 for(int i = 0; i < CHAIN_LEN; i++) { | |
131 chain = sgroot->createSceneGraph(CHAIN); | |
395 | 132 property[i].id = i; |
133 init_chain_vars(&property[i]); | |
134 property[i].x = 0; | |
135 property[i].y = chain_width * i; | |
136 set_vector(&property[i], chain); | |
137 property->angle[1] = -90 * (i % 2); | |
375 | 138 chain->set_move_collision(chain_move, chain_collision); |
139 | |
140 root_chain->addChild(chain); | |
395 | 141 property[i].parent = root_chain; |
375 | 142 } |
382 | 143 cv[0].can_move = FALSE; |
375 | 144 |
395 | 145 // property を SPU の共有領域へコピーする |
146 chain_init = manager->create_task(CHAININIT_TASK); | |
147 chain_init->add_inData(property, sizeof(CHAIN_VARS)*CHAIN_LEN); | |
148 chain_init->add_param(CHAIN_LEN); | |
149 chain_init->set_cpu(SPE_0); | |
150 | |
151 | |
375 | 152 sgroot->setSceneData(root_chain); |
153 } | |
395 | 154 |