Mercurial > hg > Game > Cerium
view TaskManager/Test/test_render/Application/Chain.cc @ 529:3527ba243767 draft
modify applications not using SGid but SGname.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 22 Oct 2009 16:47:49 +0900 |
parents | 413667c70a1d |
children |
line wrap: on
line source
#include <iostream> #include <math.h> #include "SceneGraphRoot.h" #include "SceneGraph.h" #include "TaskManager.h" #include "Func.h" #include "Chain.h" #include "Application.h" #define FALSE 0 #define TRUE !FALSE #define CHAIN_LEN 50 static double chain_width = 10; static void post2propertyLoop(void *chain); /* SceneGraph の property */ //ChainPropertyPtr c_properties[2]; //ChainPropertyPtr c_property; //void createSceneGraphFromProperty(ChainPropertyPtr p) ; void createSceneGraphFromProperty(void* p) ; void Chain::init_chain_vars(ChainPropertyPtr cv) { cv->x = 0, cv->y = 0, cv->next_x = 0, cv->next_y = 0; cv->vx = 0, cv->vy = 0, cv->next_vx = 0, cv->next_vy = 0; cv->can_move = TRUE; } void set_vector(ChainPropertyPtr p, SceneGraphPtr sg) { sg->xyz[0] = p->next_x; sg->xyz[1] = p->next_y; sg->xyz[2] = 0.0f; sg->angle[0] = p->angle[0]; sg->angle[1] = p->angle[1]; sg->angle[2] = p->angle[2]; } #if 0 static void chain_move_ope(SceneGraphPtr node, int screen_w, int screen_h) { Pad *pad = sgroot->getController(); if (pad->circle.isHold()) { property[CHAIN_LEN-1].can_move = FALSE; if (pad->left.isHold()) { property[CHAIN_LEN-1].x += -5.0; } else if (pad->right.isHold()) { property[CHAIN_LEN-1].x += 5.0; } if (pad->up.isHold()) { property[CHAIN_LEN-1].y += -5.0; } else if (pad->down.isHold()) { property[CHAIN_LEN-1].y += 5.0; } } else { property[CHAIN_LEN-1].can_move = TRUE; } } #endif void Chain::chain_switch() { HTaskPtr chain_cal; ChainPropertyPtr output; // SceneGraph の切り替えもここでやる if (property == properties[0]) { property = (ChainPropertyPtr)properties[1]; output = (ChainPropertyPtr)properties[0]; }else{ property = (ChainPropertyPtr)properties[0]; output = (ChainPropertyPtr)properties[1]; } chain_cal = manager->create_task(CHAINCAL_TASK); chain_cal->add_inData(property, sizeof(ChainProperty)*CHAIN_LEN); chain_cal->add_outData(output, sizeof(ChainProperty)*CHAIN_LEN); chain_cal->set_post(post2propertyLoop, (void *)sg_available_list); chain_cal->spawn(); } void Chain::chain_collision(SceneGraphPtr sg, int w, int h, SceneGraphPtr osg) { } void createSceneGraphFromProperty(void* p) { ChainPropertyPtr chain_p = (ChainPropertyPtr)p; SceneGraphPtr chain_copy = sgroot->createSceneGraph("CHAIN"); chain_copy->propertyptr = (void*)chain_p; chain_copy->property_size = sizeof(ChainProperty); set_vector(chain_p, chain_copy); chain_p->parent->addChild(chain_copy); } void Chain::apply_property(void *p, SceneGraphPtr sgptr) { ChainPropertyPtr cp = (ChainPropertyPtr)p; sgptr->xyz[0] = cp->xyz[0]; sgptr->xyz[1] = cp->xyz[1]; sgptr->xyz[2] = cp->xyz[2]; sgptr->angle[0] = cp->angle[0]; sgptr->angle[1] = cp->angle[1]; sgptr->angle[2] = cp->angle[2]; cp->frame++; sgptr->frame = cp->frame; } SceneGraphPtr Chain::scenegraph_factory(void *p) { ChainPropertyPtr cp = (ChainPropertyPtr)p; SceneGraphPtr sgptr = (SceneGraphPtr)cp->scenegraph; apply_property(p, sgptr); return sgptr; } void Chain::scenegraph_connector(void *p, SceneGraphPtr sg) { ChainPropertyPtr cp = (ChainPropertyPtr)p; SceneGraphPtr last = sg_available_list; if (!last) { sg_available_list = sg; } else { while (last->next) { last = last->next; } last->next = sg; sg->prev = last; } ChainPropertyPtr p_curent = (ChainPropertyPtr)sg->propertyptr; // parent_id が 0 , NULL だったらどうすんだ? // そこで試合終了じゃね? // if ( p_curent_id->parent_id == 0) return -1; ChainProperty p_parent = cp[p_curent->parent_id]; SceneGraphPtr s_parent = (SceneGraphPtr)p_parent.scenegraph; /* childrenのリストの最後に加える (brother として)*/ if (s_parent->lastChild != NULL) { SceneGraphPtr last_child = s_parent->lastChild; last_child->brother = sg; } s_parent->lastChild = sg; if (s_parent->children == NULL) { s_parent->children = sg; } sg->parent = s_parent; } int is_end(ChainPropertyPtr t) { // どうやって終了させよう? // property の個数を保持する必要がある? // or for文ではなくて、条件にする return 0; } void Chain::property_loop() { for (ChainPropertyPtr t = &property[0]; is_end(t); t++){ SceneGraphPtr sg = scenegraph_factory(t); // SceneGraphNode を作る t->scenegraph = (void *)sg; // property list には SceneGraphへのポインタが入っている scenegraph_connector((void *)properties[0], sg); // add する } } void post2propertyLoop(void *chain_) { Application *chain = (Application *)chain_; //chain->property_loop(chain->sg_available_list); chain->property_loop(); } void Chain::property_ope(SceneGraphPtr sg_available_list_) { sg_available_list = sg_available_list_; chain_switch(); } void Chain::init(TaskManager *manager_, int w, int h) { SceneGraphPtr root_chain, chain; //ChainProperty r; manager = manager_; // 未実装 char *data = {"1"}; int len = 0; sgroot->createFromXMLfile(manager, "xml_file/chain.xml"); /* SPE に送る property の配列の領域確保 */ properties[0] = (ChainPropertyPtr)manager->allocate(sizeof(ChainProperty)*CHAIN_LEN); properties[1] = (ChainPropertyPtr)manager->allocate(sizeof(ChainProperty)*CHAIN_LEN); property = properties[0]; root_chain = sgroot->createSceneGraph("CHAIN"); init_chain_vars(&property[0]); property[0].next_x = w / 2; property[0].next_y = 0.0; property[0].angle[0] = 0; property[0].angle[1] = 0; property[0].angle[2] = 0; set_vector(&property[0], root_chain); for(int i = 1; i < CHAIN_LEN; i++) { chain = sgroot->createSceneGraph("CHAIN"); property[i].id = i; init_chain_vars(&property[i]); property[i].x = 0; property[i].y = chain_width * i; set_vector(&property[i], chain); property[i].angle[1] = -90 * (i % 2); chain->propertyptr = &property[i]; chain->property_size = sizeof(ChainProperty); root_chain->addChild(chain); property[i].parent = root_chain; property[i].parent_id = 0; } property[0].can_move = FALSE; sgroot->setSceneData(root_chain); }