changeset 575:0f13810d4492

Linda API worked. (slightly unreliable)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 23 Oct 2009 15:53:24 +0900
parents 6289230fe821
children cc989924f469
files Renderer/Engine/SceneGraphList.cc Renderer/Engine/SceneGraphList.h Renderer/Engine/SceneGraphRoot.cc Renderer/Engine/SceneGraphRoot.h Renderer/Engine/SgStruct.h Renderer/Engine/lindaapi.cc Renderer/Engine/viewer.cc Renderer/Test/Makefile.def Renderer/Test/dynamic_create.cc
diffstat 9 files changed, 46 insertions(+), 196 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/SceneGraphList.cc	Fri Oct 23 14:02:33 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*!
-  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(const char *obj_name)
-{
-    SgStruct* e = first->next;
-    while (e) {
-	if (strcmp(e->name, obj_name) == 0) return e;
-	e = e->next;
-    }
-    return NULL;
-}
--- a/Renderer/Engine/SceneGraphList.h	Fri Oct 23 14:02:33 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-#ifndef SCENE_GRAPH_LIST
-#define SCENE_GRAPH_LIST
-
-#include <stdlib.h>
-#include "SgStruct.h"
-
-class SceneGraphList : SgStruct {
-public:    
-    SgStruct* first;
-    SgStruct* last;
-    int sgid;
-
-    SceneGraphList () {
-        first = last = this;
-        next = prev = this;
-	sgid = 0;
-    }
-    
-    ~SceneGraphList () {
-    }    
-
-    void addFirst(SgStruct* e);
-    void addLast(SgStruct* e);
-    SgStruct* getFirst();
-    SgStruct* getLast();
-    int remove(SgStruct* e);
-    SgStruct* poll();
-    SgStruct* get(const char *name);    
-};
-
-#endif
--- a/Renderer/Engine/SceneGraphRoot.cc	Fri Oct 23 14:02:33 2009 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Fri Oct 23 15:53:24 2009 +0900
@@ -9,8 +9,11 @@
 //#include "SGList.h"
 #include "Application.h"
 
-int cnt = 0;
+static int cnt = 0;
 static const int SGLIST_LENGTH = 138;
+static int sg_src_size = SGLIST_LENGTH ;
+static int sg_src_id = -1;
+static SceneGraphPtr *sg_src;
 
 
 SceneGraphRoot *sgroot;
@@ -19,10 +22,10 @@
 {
     // SGLIST_LENGTH 決め打ちかぁ、動的生成にする場合上限決めておいた方がいいのかな
     //
-    sg_src = new SceneGraphPtr[SGLIST_LENGTH];
+    sg_src = (SceneGraphPtr*) malloc(sizeof(SceneGraphPtr)*SGLIST_LENGTH);
+
     camera = new Camera(w, h);
     iterator = new SceneGraphIterator;
-    sglist = new SceneGraphList;
     controller = create_controller();
 
     sg_exec_tree = NULL;
@@ -58,7 +61,7 @@
 		cnt--;
     }
 
-    delete [] sg_src;
+    free(sg_src);
     delete camera;
     delete iterator;
     delete controller;
@@ -72,6 +75,17 @@
 void
 SceneGraphRoot::registSceneGraph(SceneGraphPtr sg)
 {
+    int dup;
+    if ((dup = getSgid(sg->name))>=0) { // while...
+	sg_src[dup]->name = 0;
+	// we should remove this. but some one may use it...
+    }
+    if (sg_src_id+1> sg_src_size) {
+	sg_src_size *= 2;
+	sg_src = (SceneGraphPtr*)realloc(sg_src, sg_src_size);
+    }
+    sg->id = ++sg_src_id;
+    sg_src[sg->id] = sg;
 }
 
 void
@@ -117,8 +131,7 @@
 	/* ポリゴン(SceneGraph)生成  */
 	tmp = new SceneGraph(manager, cur);	
 
-	addSceneGraphList(manager, tmp);
-	registSceneGraphList(tmp);
+	registSceneGraph(tmp);
     }
 
     xmlFreeDoc(doc);
@@ -131,7 +144,7 @@
     SceneGraphPtr src;
     SceneGraphPtr p;
 
-    if (id < 0 || id > SGLIST_LENGTH) {
+    if (id < 0 || id > sg_src_size) {
 		return NULL;
     }
 
@@ -146,28 +159,6 @@
     return p;
 }
 
-void
-SceneGraphRoot::registSceneGraphList(SceneGraphPtr sg)
-{
-    /*
-      SceneGraphRoot にメンバ変数 SceneGraphList を持たせておくか
-      SceneGraphList sglist
-      sg->name で検索して、有れば sg_src に追加。
-      sgid は sglist のメンバ変数 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;
-    }
-
-    fprintf(stderr, "error: (%s:%3d) Can't find Scene \"%s\"\n",
-			__FUNCTION__, __LINE__, sg->name);
-}
 
 void
 SceneGraphRoot::createFromXMLmemory(TaskManager *manager, char *data, int len)
@@ -194,22 +185,12 @@
 	/* ポリゴン(SceneGraph)生成  */
 	SceneGraphPtr tmp = new SceneGraph(manager, cur);	
 	
-	addSceneGraphList(manager, tmp);
-	
-	registSceneGraphList(tmp);
+	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
 SceneGraphRoot::createSceneGraph(const char *name)
@@ -217,9 +198,7 @@
     SceneGraphPtr src;
     SceneGraphPtr p;
 
-    // SceneGraphList から name を検索して id 取得
-    SgStruct *e = sglist->get(name);
-    int id = e->id;
+    int id = getSgid(name);
     if (id < 0) {
 	return NULL;
     }
@@ -238,8 +217,19 @@
 int
 SceneGraphRoot::getSgid(const char *name)
 {
-    SgStruct *e = sglist->get(name);
-    return e->id;
+    for(int i =0;i<= sg_src_id; i++) {
+	if (strcmp(name,sg_src[i]->name) )
+	    return i;
+    }
+    return -1;
+}
+
+int
+SceneGraphRoot::getLast()
+{
+    if (sg_src_id>=0)
+	return sg_src[sg_src_id]->id;
+    return -1;
 }
 
 /**
--- a/Renderer/Engine/SceneGraphRoot.h	Fri Oct 23 14:02:33 2009 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Fri Oct 23 15:53:24 2009 +0900
@@ -5,10 +5,6 @@
 #include "SceneGraphArray.h"
 #include "Camera.h"
 #include "SceneGraphIterator.h"
-// #include "Application.h"
-#include "SceneGraphList.h"
-#include "SgStruct.h"
-// #include "TaskManager.h"
 #include <sys/types.h>
 
 typedef struct {
@@ -27,12 +23,10 @@
     /* Variables */
     TaskManager *tmanager;
     
-    // sgid と name を持った SgStruct のリスト
-    SceneGraphList *sglist;
-
     // xml から読み込んだ、オリジナルの SceneGraph
-    SceneGraphPtr *sg_src;
-    int sg_src_length;
+    // Static Singleton
+    // SceneGraphPtr *sg_src;
+    // int sg_src_length;
 
     // move, collision 用の SceneGraph (tree)
     SceneGraphPtr sg_exec_tree;
@@ -96,9 +90,7 @@
     void addNext(SceneGraphPtr sg);
     void allRemove(SceneGraphPtr list);
 
-    int getLast() {
-	return sglist->getLast()->id;
-    }
+    int getLast() ;
 
 };
 
--- a/Renderer/Engine/SgStruct.h	Fri Oct 23 14:02:33 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#ifndef SGSTRUCT
-#define SGSTRUCT
-#include "types.h"
-#include "SceneGraph.h"
-
-class SgStruct {
-public:
-    SgStruct* next;
-    SgStruct* prev;
-    const char *name;
-    int id;
-};
-
-typedef SgStruct *SgStructPtr;
-
-#endif
--- a/Renderer/Engine/lindaapi.cc	Fri Oct 23 14:02:33 2009 +0900
+++ b/Renderer/Engine/lindaapi.cc	Fri Oct 23 15:53:24 2009 +0900
@@ -37,7 +37,7 @@
 static REPLY *reply, *r_end;   /* 受け取り用キュー */
 static int qsize; /* コマンドキューのサイズ */
 static fd_set g_fds;   /* 接続しているタプルスペース群のFD(FileDiscripter)を保持 */
-static int g_max_fds;  /* 監視するFDの最大値 */
+static int g_max_fds = 0;  /* 監視するFDの最大値 */
 
 /* Static Functions */
 static void unix_chkserv(int ps);
@@ -420,6 +420,8 @@
     int i;
     COMMAND *c, *t;
 
+    if (g_max_fds==0) return;
+
     fd_set tmp;
     struct timeval timeout;
     timeout.tv_sec=0;
--- a/Renderer/Engine/viewer.cc	Fri Oct 23 14:02:33 2009 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Oct 23 15:53:24 2009 +0900
@@ -11,6 +11,7 @@
 #include <wchar.h>
 #include "Pad.h"
 #include "Application.h"
+#include "lindaapi.h"
 
 static void post2runLoop(SchedTask *s,void *viewer,void *s1);
 static void post2runDraw(SchedTask *s,void *viewer,void *s1);
@@ -343,6 +344,7 @@
     HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
     viewer->run_loop(task_next);
 
+    psx_sync_n();
 }
 
 void
--- a/Renderer/Test/Makefile.def	Fri Oct 23 14:02:33 2009 +0900
+++ b/Renderer/Test/Makefile.def	Fri Oct 23 15:53:24 2009 +0900
@@ -2,7 +2,7 @@
 CERIUM = ../..
 
 CC      = g++
-CFLAGS  = -O9 -g -Wall -DUSE_MEMLIST=1 -DUSE_MEMHASH=1 # -DDEBUG
+CFLAGS  = -g -Wall -DUSE_MEMLIST=1 -DUSE_MEMHASH=1 # -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I. -I$(CERIUM)/include/Cerium
 LIBS = -L$(CERIUM)/TaskManager -L$(CERIUM)/Renderer/Engine
--- a/Renderer/Test/dynamic_create.cc	Fri Oct 23 14:02:33 2009 +0900
+++ b/Renderer/Test/dynamic_create.cc	Fri Oct 23 15:53:24 2009 +0900
@@ -142,7 +142,7 @@
 static void
 earth_move(SceneGraphPtr node, int screen_w, int screen_h)
 {
-    psx_sync_n();
+    // psx_sync_n();  in viewer::MainLoop
 }
 
 SceneGraphPtr