# HG changeset patch # User Shinji KONO # Date 1256280804 -32400 # Node ID 0f13810d449244cf7cf6586fabeb50bfc1dbb568 # Parent 6289230fe82141c37979cc7d194e9ec0cc008b04 Linda API worked. (slightly unreliable) diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/SceneGraphList.cc --- 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 -#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; -} diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/SceneGraphList.h --- 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 -#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 diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/SceneGraphRoot.cc --- 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; } /** diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/SceneGraphRoot.h --- 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 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() ; }; diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/SgStruct.h --- 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 diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/lindaapi.cc --- 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; diff -r 6289230fe821 -r 0f13810d4492 Renderer/Engine/viewer.cc --- 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 #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 diff -r 6289230fe821 -r 0f13810d4492 Renderer/Test/Makefile.def --- 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 diff -r 6289230fe821 -r 0f13810d4492 Renderer/Test/dynamic_create.cc --- 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