# HG changeset patch # User aaa # Date 1256111728 -32400 # Node ID 997d2a73a758964bd5efc2aa303d2bedf97e8b8f # Parent fab6f20021c99b67335ead17843652e220f2be6c add Application/dynamic_create.cc diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/Application/dynamic_create.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/test_render/Application/dynamic_create.cc Wed Oct 21 16:55:28 2009 +0900 @@ -0,0 +1,73 @@ +#include +#include "SceneGraphRoot.h" + +static void +earth_collision(SceneGraphPtr node, int screen_w, int screen_h, + SceneGraphPtr tree) +{ +} + +static void +moon_collision(SceneGraphPtr node, int screen_w, int screen_h, + SceneGraphPtr tree) +{ +} + +static void +moon_move(SceneGraphPtr node, int screen_w, int screen_h) +{ + node->angle[0] += 3.0f; + node->xyz[1] += 1.0f; +} + + +static void +earth_move(SceneGraphPtr node, int screen_w, int screen_h) +{ + node->angle[1] += 1.0f; + if (node->angle[1] > 360.0f) { + node->angle[1] = 0.0f; + } + + node->xyz[0] += node->stack_xyz[0]; + if ((int)node->xyz[0] > screen_w || (int)node->xyz[0] < 0) { + node->stack_xyz[0] = -node->stack_xyz[0]; + } + + node->xyz[1] += node->stack_xyz[1]; + if ((int)node->xyz[1] > screen_h || (int)node->xyz[1] < 0) { + node->stack_xyz[1] = -node->stack_xyz[1]; + } + + Pad *pad = sgroot->getController(); + if (pad->right.isPush()) { + SceneGraphPtr earth; + sgroot->createFromXMLmemory(sgroot->tmanager, "xml_file/universe.xml"); + earth = sgroot->createSceneGraph("Earth"); + earth->set_move_collision(moon_move, moon_collision); + node->addChild(earth); + } +} + +void +dynamic_init(TaskManager *manager) +{ + SceneGraphPtr earth; + sgroot->tmanager = manager; + +#if 0 + // テスト用に mmap したデータを第2引数に渡す + sgroot->createFromXMLmemory(manager, "xml_file/universe.xml"); + + // sglist に登録されている name から sgid を引き、sg_src[sgid] からコピーして返す + earth = sgroot->createSceneGraph("Earth"); +#else + SceneGraphPtr parent; + parent = sgroot->createSceneGraph(); + parent->set_move_collision(earth_move, earth_collision); +#endif + + // SceneGraphRoot に、使用する SceneGraph を設定する + // このとき、ユーザーが記述した SceneGraph の root を渡す。 + sgroot->setSceneData(parent); +} diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/SceneGraphList.cc --- a/TaskManager/Test/test_render/SceneGraphList.cc Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphList.cc Wed Oct 21 16:55:28 2009 +0900 @@ -78,7 +78,7 @@ */ SgStruct* -SceneGraphList::get(char *obj_name) +SceneGraphList::get(const char *obj_name) { SgStruct* e = first->next; while (e) { diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/SceneGraphList.h --- a/TaskManager/Test/test_render/SceneGraphList.h Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphList.h Wed Oct 21 16:55:28 2009 +0900 @@ -25,7 +25,7 @@ SgStruct* getLast(); int remove(SgStruct* e); SgStruct* poll(); - SgStruct* get(char *name); + SgStruct* get(const char *name); }; #endif diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/SceneGraphRoot.cc --- a/TaskManager/Test/test_render/SceneGraphRoot.cc Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphRoot.cc Wed Oct 21 16:55:28 2009 +0900 @@ -13,6 +13,7 @@ SceneGraphRoot::SceneGraphRoot(float w, float h) { + // SGLIST_LENGTH 決め打ちかぁ、動的生成にする場合上限決めておいた方がいいのかな sg_src = new SceneGraphPtr[SGLIST_LENGTH]; camera = new Camera(w, h); iterator = new SceneGraphIterator; @@ -146,7 +147,7 @@ return p; } -#if 0 +#if 1 void SceneGraphRoot::registSceneGraphList(SceneGraphPtr sg) { @@ -155,11 +156,14 @@ SceneGraphList sglist sg->name で検索して、有れば sg_src に追加。 sgid は sglist のメンバ変数 sgid で管理する感じ - */ - if (sglist->get(sg->name)) { - sg->sgid = sgid; - sg_src[sgid] = sg; - sg->sgid++; + */ + + SgStruct *s = sglist->get(sg->name); + if (s != NULL) { + sg->sgid = sglist->sgid; + s->id = sglist->sgid; + sg_src[sg->sgid] = sg; + sglist->sgid++; return; } @@ -168,14 +172,17 @@ } void -SceneGraphRoot::createFromXMLfile(TaskManager *manager, const char *xmlfile) +SceneGraphRoot::createFromXMLmemory(TaskManager *manager, const char *xmlfile) { xmlDocPtr doc; xmlNodePtr cur; SceneGraphPtr tmp; + // size は取れるはず、テスト用に mmap したデータを使う + int size = 10; /* パース DOM生成 */ - doc = xmlParseMemory(xmlfile); + doc = xmlParseFile(xmlfile); + //doc = xmlParseMemory(xmlfile, size); cur = xmlDocGetRootElement(doc); /* ?? */ @@ -183,18 +190,29 @@ /* XMLのノードを一つずつ解析 */ for (cur=cur->children; cur; cur=cur->next) { - /* 扱うのはsurfaceオンリー */ - if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { - continue; - } + /* 扱うのはsurfaceオンリー */ + if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { + continue; + } - /* ポリゴン(SceneGraph)生成 */ - tmp = new SceneGraph(manager, cur); + /* ポリゴン(SceneGraph)生成 */ + tmp = new SceneGraph(manager, cur); + + addSceneGraphList(manager, tmp); + + registSceneGraphList(tmp); + } + + xmlFreeDoc(doc); +} - registSceneGraph(tmp); - } - - xmlFreeDoc(doc); +/* 生成された SceneGraph のを sglist に登録 */ +void +SceneGraphRoot::addSceneGraphList(TaskManager *manager, SceneGraphPtr tmp) +{ + SgStruct *sg_t = (SgStruct *)manager->allocate(sizeof(SgStruct)); + sg_t->name = tmp->name; + sglist->addLast(sg_t); } SceneGraphPtr @@ -203,12 +221,13 @@ SceneGraphPtr src; SceneGraphPtr p; - if (id < 0 || id > SGLIST_LENGTH) { - return NULL; + // SceneGraphList から name を検索して id 取得 + SgStruct *e = sglist->get(name); + int id = e->id; + if (id < 0) { + return NULL; } - - // SceneGraphList から name を検索して id を返す - + /* オリジナルの SceneGraph */ src = sg_src[id]; diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/SceneGraphRoot.h --- a/TaskManager/Test/test_render/SceneGraphRoot.h Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphRoot.h Wed Oct 21 16:55:28 2009 +0900 @@ -7,6 +7,8 @@ #include "SceneGraphIterator.h" #include "Application.h" #include "SceneGraphList.h" +#include "SgStruct.h" +#include "TaskManager.h" class SceneGraphRoot { public: @@ -15,7 +17,8 @@ ~SceneGraphRoot(void); /* Variables */ - + TaskManager *tmanager; + // sgid と name を持った SgStruct のリスト SceneGraphList *sglist; @@ -53,8 +56,10 @@ */ /* User API */ void createFromXMLfile(TaskManager *manager, const char *); + void createFromXMLmemory(TaskManager *manager, const char *xml); SceneGraphPtr createSceneGraph(int id); SceneGraphPtr createSceneGraph(void); + SceneGraphPtr createSceneGraph(char *name); void setSceneData(SceneGraphPtr sg); Pad *getController(void); SceneGraphIteratorPtr getIterator(void); @@ -73,6 +78,8 @@ /* System API */ void registSceneGraph(SceneGraphPtr sg); + void registSceneGraphList(SceneGraphPtr sg); + void addSceneGraphList(TaskManager *manager, SceneGraphPtr tmp); void addNext(SceneGraphPtr sg); void allRemove(SceneGraphPtr list); }; diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/SgStruct.h --- a/TaskManager/Test/test_render/SgStruct.h Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/Test/test_render/SgStruct.h Wed Oct 21 16:55:28 2009 +0900 @@ -7,7 +7,7 @@ public: SgStruct* next; SgStruct* prev; - char *name; + const char *name; int id; }; diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/Test/test_render/viewer.cc --- a/TaskManager/Test/test_render/viewer.cc Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/Test/test_render/viewer.cc Wed Oct 21 16:55:28 2009 +0900 @@ -107,6 +107,7 @@ extern void boss1_init(TaskManager *manager, int w, int h); extern void init_gaplant(TaskManager *manager, int w, int h); extern void vacuum_init2(TaskManager *manager, int w, int h); +extern void dynamic_init(TaskManager *manager); void Viewer::run_init(TaskManager *manager, const char *xml, int sg_number) @@ -172,7 +173,10 @@ break; case 17: chain_old_init(manager, this->width, this->height); - break; + break; + case 18: + dynamic_init(manager); + break; default: node_init(manager); break; diff -r fab6f20021c9 -r 997d2a73a758 TaskManager/kernel/memory/MemorySegment.h --- a/TaskManager/kernel/memory/MemorySegment.h Wed Oct 21 01:51:00 2009 +0900 +++ b/TaskManager/kernel/memory/MemorySegment.h Wed Oct 21 16:55:28 2009 +0900 @@ -13,5 +13,4 @@ }; typedef MemorySegment *MemorySegmentPtr; - #endif