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