changeset 530:18446bce1b8b

add SceneGraphList
author aaa
date Wed, 21 Oct 2009 00:56:51 +0900
parents fb8ed646feb8
children fab6f20021c9
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