changeset 534:997d2a73a758

add Application/dynamic_create.cc
author aaa
date Wed, 21 Oct 2009 16:55:28 +0900
parents fab6f20021c9
children f8d56635efb8
files TaskManager/Test/test_render/Application/dynamic_create.cc TaskManager/Test/test_render/SceneGraphList.cc TaskManager/Test/test_render/SceneGraphList.h TaskManager/Test/test_render/SceneGraphRoot.cc TaskManager/Test/test_render/SceneGraphRoot.h TaskManager/Test/test_render/SgStruct.h TaskManager/Test/test_render/viewer.cc TaskManager/kernel/memory/MemorySegment.h
diffstat 8 files changed, 131 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- /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 <stdlib.h>
+#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);
+}
--- 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) {
--- 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
--- 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];
 
--- 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);
 };
--- 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;
 };
 
--- 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;
--- 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