Mercurial > hg > Game > Cerium
changeset 511:5f6068d1da94 draft
add SceneGraphList
author | aaa |
---|---|
date | Wed, 21 Oct 2009 00:56:51 +0900 |
parents | eae20c3536ba |
children | fa97ba9e3c1a |
files | TaskManager/Test/test_render/SceneGraphList.cc TaskManager/Test/test_render/SceneGraphList.h TaskManager/Test/test_render/SceneGraphRoot.cc TaskManager/Test/test_render/SgStruct.h |
diffstat | 4 files changed, 217 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/test_render/SceneGraphList.cc Wed Oct 21 00:56:51 2009 +0900 @@ -0,0 +1,89 @@ +/*! + MemList は空にならない。最低1個は要素が入っていて + 1個目は特別扱いする。getFirst すると first->next を返す + */ +#include <stdio.h> +#include "SceneGraphList.h" + +/*! + 最初の1個は特別扱いなので、それの後に追加していく + */ +void +SceneGraphList::addFirst(SgStruct* e) +{ + e->prev = first; + e->next = first->next; + first->next->prev = e; + first->next = e; +} + +void +SceneGraphList::addLast(SgStruct* e) +{ + e->next = first; + e->prev = last; + last->next = e; + last = e; +} + +SgStruct* +SceneGraphList::getFirst() +{ + return first->next; +} + +SgStruct* +SceneGraphList::getLast() +{ + return last; +} + +int +SceneGraphList::remove(SgStruct* e) +{ + e->prev->next = e->next; + e->next->prev = e->prev; + + if (first->next == e) { + first->next = e->next; + } + if (last == e) { + last = e->prev; + } + + e->prev = NULL; + e->next = NULL; + + return 1; +} + +/*! + リストの先頭を取得および削除する。リストが空の場合は NULL を返す。 + */ + +SgStruct* +SceneGraphList::poll() +{ + SgStruct* e = first->next; + if (e == this) { + return NULL; + } + remove(e); + return e; +} + +/*! + リスト内の指定された name を持つオブジェクトを返す。 + 見つからなかった場合 NULL を返す。 + */ + +SgStruct* +SceneGraphList::get(char *obj_name) +{ + SgStruct* e = first->next; + while (e) { + if (strcmp(e->name, obj_name) == 0) return e; + e = e->next; + } + return NULL; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/test_render/SceneGraphList.h Wed Oct 21 00:56:51 2009 +0900 @@ -0,0 +1,34 @@ +#ifndef SCENE_GRAPH_LIST +#define SCENE_GRAPH_LIST + +#include <stdlib.h> +#include "SgStruct.h" + +class SceneGraphList : SgStruct { +public: + SgStruct* pool; + SgStruct* first; + SgStruct* last; + int sgid; + + SceneGraphList (SgStruct* ms) { + first = last = this; + next = prev = this; + pool = ms; + sgid = 0; + } + + ~SceneGraphList () { + free(pool); + } + + void addFirst(SgStruct* e); + void addLast(SgStruct* e); + SgStruct* getFirst(); + SgStruct* getLast(); + int remove(SgStruct* e); + SgStruct* poll(); + SgStruct* get(char *name); +}; + +#endif
--- a/TaskManager/Test/test_render/SceneGraphRoot.cc Tue Oct 20 23:26:31 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphRoot.cc Wed Oct 21 00:56:51 2009 +0900 @@ -145,6 +145,84 @@ return p; } +#if 0 +void +SceneGraphRoot::registSceneGraphList(SceneGraphPtr sg) +{ + /* + SceneGraphRoot にメンバ変数 SceneGraphList を持たせておくか + SceneGraphList sglist + */ + if (sglist->get(sg->name)) { + + } + + while (sglist) { + if (strcmp(sg->name, sglist_table[i]) == 0) { + sg->sgid = i; + sg_src[i] = sg; + return; + } + } + + fprintf(stderr, "error: (%s:%3d) Can't find Scene \"%s\"\n", + __FUNCTION__, __LINE__, sg->name); +} + +void +SceneGraphRoot::createFromXMLfile(TaskManager *manager, const char *xmlfile) +{ + xmlDocPtr doc; + xmlNodePtr cur; + SceneGraphPtr tmp; + + /* パース DOM生成 */ + doc = xmlParseMemory(xmlfile); + cur = xmlDocGetRootElement(doc); + + /* ?? */ + xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); + + /* XMLのノードを一つずつ解析 */ + for (cur=cur->children; cur; cur=cur->next) { + /* 扱うのはsurfaceオンリー */ + if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { + continue; + } + + /* ポリゴン(SceneGraph)生成 */ + tmp = new SceneGraph(manager, cur); + + registSceneGraph(tmp); + } + + xmlFreeDoc(doc); +} + +SceneGraphPtr +SceneGraphRoot::createSceneGraph(char *name) +{ + SceneGraphPtr src; + SceneGraphPtr p; + + if (id < 0 || id > SGLIST_LENGTH) { + return NULL; + } + + // SceneGraphList から name を検索して id を返す + + /* オリジナルの SceneGraph */ + src = sg_src[id]; + + /* ユーザーにはオリジナルの clone を返す */ + p = src->clone(); + + addNext(p); + + return p; +} +#endif + /** * 何も表示しない、move,collision もしない SceneGraph を生成 * いずれ、Transform3D 的なものに回す予定
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/test_render/SgStruct.h Wed Oct 21 00:56:51 2009 +0900 @@ -0,0 +1,16 @@ +#ifndef SGSTRUCT +#define SGSTRUCT +#include "types.h" +#include "SceneGraph.h" + +class SgStruct { +public: + SgStruct* next; + SgStruct* prev; + char *name; + int id; +}; + +typedef SgStruct *SgStructPtr; + +#endif