Mercurial > hg > Members > kono > Cerium
view Renderer/Test/property_chain.cc @ 771:720720e4e8df
fix Test/property_chain
author | hiroki |
---|---|
date | Sun, 14 Feb 2010 18:56:08 +0900 |
parents | aed3d2501c38 |
children | e53ae444ac6f |
line wrap: on
line source
#include <math.h> #include <stdlib.h> #include "SceneGraphRoot.h" #include "MainLoop.h" #include "property_chain.h" #include "types.h" #include "Func.h" #include "sys.h" #include "SgChange.h" #define FALSE 0 #define TRUE !FALSE static const int PROPERTY_LENGTH = 51; static double m = 100.0; static double k = 7000.0; static double g = 9.8; static double dt = 0.003; static double chain_width = 10; static double safe = 0.995; typedef struct { double x, y, next_x, next_y; double vx, vy, next_vx, next_vy; int can_move; } CHAIN_VARS; typedef struct { float xyz[3]; float angle[3]; float stack_xyz[3]; float next_xyz[3]; float v_xyz[3]; int property_index; int parent_index; int have_parent; int can_move; memaddr parent; memaddr children; memaddr node; const char *name; } *PropertyPtr, Property; Property *property, *update_property; // prototype static void collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree); static void move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h); static void createSceneGraphFromProperty(SchedTask *s, void *sgroot, void *arg1); static void set_property(Property *p, SceneGraphPtr sg, int index); static void apply_property(SceneGraphPtr sg, Property *p); static void regist_task(SceneGraphRoot *sgroot); static void set_relation(SceneGraphPtr parent, SceneGraphPtr child); static void init_chain(Property *p) { for (int i = 0; i < 3; i++) { p->xyz[i] = 0; p->angle[i] = 0; p->stack_xyz[i] = 0; p->next_xyz[i] = 0; p->v_xyz[i] = 0; } p->property_index = 0; p->parent_index = 0; p->have_parent = 0; p->can_move = TRUE; p->parent = NULL; p->children = NULL; p->node = NULL; } static void move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; HTaskPtr property_task = sgroot->move_exec_task; property_task->add_inData(property, sizeof(Property)*PROPERTY_LENGTH); property_task->add_outData(update_property, sizeof(Property)*PROPERTY_LENGTH); property_task->set_cpu(SPE_ANY); property_task->set_post(createSceneGraphFromProperty, (void *)sgroot, 0); property_task->spawn(); } static void collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree) { } static void createSceneGraphFromProperty(SchedTask *s, void *sgroot_, void *arg1) { SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; SceneGraphPtr camera = sgroot->camera; SceneGraphPtr p_node; // ここが allExecute の tree をたどって clone して行くところに相当する Property *p; for (int i = 0; i < PROPERTY_LENGTH; i++) { p = &update_property[i]; SceneGraphPtr node = sgroot->createSceneGraph(p->name); if (strcmp(node->name, "Earth") == 0) { node->set_move_collision(move, collision); } apply_property(node, p); } for (int j = 0; j < PROPERTY_LENGTH; j++) { p = &update_property[j]; p_node = (SceneGraphPtr)p->node; if (p->have_parent) { SceneGraphPtr parent = (SceneGraphPtr)update_property[p->parent_index].node; parent->addChild(p_node); get_matrix(p_node->matrix, p_node->angle, p_node->xyz, parent->matrix); get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, parent->real_matrix); } else { get_matrix(p_node->matrix, p_node->angle, p_node->xyz, camera->matrix); get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, camera->real_matrix); } } sgroot->setSceneData((SceneGraphPtr)update_property[0].node); Property *tmp = property; property = update_property; update_property = tmp; sgroot->move_finish(); } static void apply_property(SceneGraphPtr node, Property *p) { for (int i = 0; i < 3; i++) { node->xyz[i] = p->xyz[i]; node->angle[i] = p->angle[i]; node->stack_xyz[i] = p->stack_xyz[i]; } p->node = (memaddr)node; node->property = (memaddr)p; } /* ここで必要な値をプロパティに格納 */ static void set_property(Property *p, SceneGraphPtr node, int index) { for (int i = 0; i < 3; i++) { p->xyz[i] = node->xyz[i]; p->angle[i] = node->angle[i]; p->stack_xyz[i] = node->stack_xyz[i]; } p->parent = (memaddr)node->parent; p->children = (memaddr)node->children; p->name = node->name; p->property_index = index; p->node = (memaddr)node; node->property = (memaddr)p; } static void regist_task(SceneGraphRoot *sgroot) { TaskManager *manager = sgroot->tmanager; HTaskPtr task = manager->create_task(UniverseTask); // sgroot->setExecTask(task); とやるべき? sgroot->move_exec_task = task; } static void set_relation(SceneGraphPtr parent, SceneGraphPtr child) { /* child->property->parent_index = parent->property->property_index; child->property->have_parent = 1; */ Property *p = (Property *)parent->property; Property *c = (Property *)child->property; p->children = (memaddr)child; c->parent = (memaddr)parent; c->parent_index = p->property_index; c->have_parent = 1; } MainLoopPtr property_universe::init(Viewer *viewer, int screen_w, int screen_h) { // SgChange を使うための2行 SgChange *sgroot = new SgChange(viewer); sgroot->run_init(); // 上で書いた regist_task() を登録 // sgroot->appTaskRegist(regist_task); がいいかな sgroot->sgroot_A->appTaskRegist(regist_task); int root_obj_index = 0; property = (Property *)sgroot->manager->allocate(sizeof(Property)*PROPERTY_LENGTH); update_property = (Property *)sgroot->manager->allocate(sizeof(Property)*PROPERTY_LENGTH); // property の初期化 application ごとに固有 for(int i = 0; i < PROPERTY_LENGTH; i++) { init_chain(property[i]); } SceneGraphPtr root_chain, chain; sgroot->createFromXMLfile("xml_file/chain.xml"); root_chain = sgroot->createSceneGraph("CHAIN"); root_chain->xyz[0] = screen_w / 2; root_chain->xyz[1] = 0.0f; root_chain->set_move_collision(move, colliison); set_property(&property[0], root_chain, 0); for (int i = 1; i < PROPERTY_LENGTH; i++) { chain = sgroot->createSceneGraph("CHAIN"); chain->xyz[0] = 0; chain->xyz[1] = chain_width * i; chain->angle[1] = -90 * (i % 2); root_chain->addChild(chain); set_property(&property[i], chain, i); set_relation(root_chain, chain); } // root の set_property は SceneGraph を作成してから実行 // addChild したら set_relation しないとだめ、あんまりにもあんまり /* apply_property は post_func の createSceneGraphFromProperty 中で使う apply_property は sgroot に持たせてもいいと思います○ */ sgroot->setSceneData(root_chain); return sgroot; } extern Application * application() { return new property_universe(); } const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; extern int init(TaskManager *manager, int argc, char *argv[]); extern void task_initialize(); static void TMend(TaskManager *manager); int TMmain(TaskManager *manager, int argc, char *argv[]) { task_initialize(); manager->set_TMend(TMend); return init(manager, argc, argv); } void TMend(TaskManager *manager) { printf("test_nogl end\n"); } /* end */