changeset 1004:67ff44a08090

add GTaskArray and merge.
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Tue, 26 Oct 2010 17:34:41 +0900
parents 295b3c79fb44 (diff) 61f33945f85d (current diff)
children aebfb7c63260
files Renderer/Engine/GTaskArray.cc Renderer/Engine/GTaskArray.h Renderer/Engine/GTaskArray.o Renderer/Engine/viewer.cc
diffstat 10 files changed, 260 insertions(+), 124 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/GTaskArray.cc	Tue Oct 26 17:34:41 2010 +0900
@@ -0,0 +1,56 @@
+#include "GTaskArray.h"
+
+GTaskArray::GTaskArray()
+{
+    game_task_array = NULL;
+    game_task = NULL;
+
+    task_id = 0;
+    task_num = 0;
+    param_num = 0;
+    inData_num = 0;
+    outData_num = 0;
+}
+
+GTaskArray::~GTaskArray()
+{
+    if (game_task_array !=NULL) {
+      delete game_task_array;
+    }
+    if (game_task !=NULL) {
+      delete game_task;
+    }
+}
+
+void
+GTaskArray::init(int id, int task, int param, int inData, int outData)
+{
+    game_task = 0;
+
+    task_id = id;
+    task_num = task;
+    param_num = param;
+    inData_num = inData;
+    outData_num = outData;
+}
+
+void
+GTaskArray::create_task_array(TaskManager *manager)
+{
+    game_task_array = manager->create_task_array(task_id, task_num, param_num, inData_num, outData_num);
+    game_task = 0;
+}
+
+void
+GTaskArray::next_task_array(int id)
+{
+    game_task = game_task_array->next_task_array(id, game_task);
+}
+
+void
+GTaskArray::finish()
+{
+    game_task_array->spawn_task_array(game_task->next());
+    game_task_array->set_cpu(SPE_ANY);
+    game_task_array->spawn();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/GTaskArray.h	Tue Oct 26 17:34:41 2010 +0900
@@ -0,0 +1,37 @@
+/**
+ * ゲームの TaskArray を管理するクラス
+ * 取りあえず TaskArray 1つでゲームの Task を格納するようにしてみた
+ * TaskArray って何?って人は Cerium/example/hello_array や word_count を参照
+ **/
+
+#ifndef INCLUDED_GTASK_ARRAY
+#define INCLUDED_GTASK_ARRAY
+
+#include "TaskManager.h"
+
+class GTaskArray;
+
+class GTaskArray {
+public:
+    GTaskArray(void);
+    ~GTaskArray(void);
+
+    HTaskPtr game_task_array;
+    TaskPtr game_task;
+    
+    int task_id;
+    int task_num;
+    int param_num;
+    int inData_num;
+    int outData_num;
+
+    void init(int id, int task, int param, int inData, int outData);
+    void create_task_array(TaskManager *manager);
+    void next_task_array(int id);
+    void finish();
+    HTaskPtr get_task_array(){return game_task_array;}
+};
+
+typedef GTaskArray* GTaskArrayPtr;
+
+#endif
Binary file Renderer/Engine/GTaskArray.o has changed
--- a/Renderer/Engine/Makefile.def	Thu Oct 21 21:39:47 2010 +0900
+++ b/Renderer/Engine/Makefile.def	Tue Oct 26 17:34:41 2010 +0900
@@ -5,7 +5,7 @@
 ABIBIT = 32 
 ABI = -m$(ABIBIT)
 CC      = g++
-OPT	= -g -O9 #-DSPE_CREATE_POLYGON_CHECK -DSPE_CREATE_POLYGON=1
+OPT	= -g #-O9 -DSPE_CREATE_POLYGON_CHECK -DSPE_CREATE_POLYGON=1
 CFLAGS  = -Wall $(ABI) $(OPT)  #  -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I.
--- a/Renderer/Engine/SceneGraphRoot.cc	Thu Oct 21 21:39:47 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Tue Oct 26 17:34:41 2010 +0900
@@ -8,6 +8,9 @@
 #include "texture.h"
 #include "Application.h"
 
+//取りあえず動かす用 本来はA pplication 側で定義した post_func で値の更新するべき
+#include "../../../task_dandy/dandy.h"
+
 static int cnt = 0;
 static const int SGLIST_LENGTH = 138;
 static int sg_src_size = SGLIST_LENGTH ;
@@ -41,17 +44,19 @@
     light_sysswitch = 0;
 
     for (int i = 0; i < light_num; i++) {
-      light[i] = new SceneGraph;
-      light[i]->xyz[0] = 0;
-      light[i]->xyz[1] = 0;
-      light[i]->xyz[2] = 0;
+	light[i] = new SceneGraph;
+	light[i]->xyz[0] = 0;
+	light[i]->xyz[1] = 0;
+	light[i]->xyz[2] = 0;
 
-      light_switch[i] = 0;
+	light_switch[i] = 0;
 
     }
 
     move_finish_flag = 0;
 
+    gtask_array = NULL;
+
     // TODO
     //   今はとりあえず camera を Root にしています
     //   今はそれすらもしてません
@@ -63,29 +68,33 @@
     SceneGraphPtr p = sg_available_list;
 
     while (p) {
-		SceneGraphPtr tmp = p->next;
-		delete p;
-		p = tmp;
-		cnt--;
+	SceneGraphPtr tmp = p->next;
+	delete p;
+	p = tmp;
+	cnt--;
     }
 
     p = sg_remove_list;
 
     while (p) {
-		SceneGraphPtr tmp = p->next;
-		delete p;
-		p = tmp;
-		cnt--;
+	SceneGraphPtr tmp = p->next;
+	delete p;
+	p = tmp;
+	cnt--;
     }
 
     free(sg_src);
     delete camera;
     int light_num = 4;
     for (int i = 0; i < light_num; i++) {
-      delete light[i];
+	delete light[i];
     }
     delete iterator;
     delete controller;
+
+    if (gtask_array != NULL) {
+	delete gtask_array;
+    }
 }
 
 /**
@@ -116,13 +125,13 @@
     SceneGraphPtr last = sg_available_list;
 
     if (!last) {
-		sg_available_list = sg;
+	sg_available_list = sg;
     } else {
-		while (last->next) {
-			last = last->next;
-		}
-		last->next = sg;
-		sg->prev = last;
+	while (last->next) {
+	    last = last->next;
+	}
+	last->next = sg;
+	sg->prev = last;
     }
 
     cnt++;
@@ -174,15 +183,15 @@
 
     /* XMLのノードを一つずつ解析  */
     for (cur=cur->children; cur; cur=cur->next) {
-		/* 扱うのはsurfaceオンリー  */
-		if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) {
-			continue;
-		}
-		/* ポリゴン(SceneGraph)生成  */
-		SceneGraphPtr original = new SceneGraph(manager, cur);	
-		registSceneGraph(original);
-		SceneGraphPtr clone = createSceneGraph(original->sgid);
-		node->addChild(clone);
+	/* 扱うのはsurfaceオンリー  */
+	if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) {
+	    continue;
+	}
+	/* ポリゴン(SceneGraph)生成  */
+	SceneGraphPtr original = new SceneGraph(manager, cur);	
+	registSceneGraph(original);
+	SceneGraphPtr clone = createSceneGraph(original->sgid);
+	node->addChild(clone);
     }
     xmlFreeDoc(doc);
 }
@@ -194,8 +203,8 @@
     SceneGraphPtr p;
 
     if (id < 0 || id > sg_src_size) {
-      printf("error: createSceneGraph(int id): id not found.\n");
-      return NULL;
+	printf("error: createSceneGraph(int id): id not found.\n");
+	return NULL;
     }
 
     /* オリジナルの SceneGraph */
@@ -223,8 +232,8 @@
 
     int id = getSgid(name);
     if (id < 0) {
-      printf("error: createSceneGraph(name): name object not found.\n");
-      return NULL;
+	printf("error: createSceneGraph(name): name object not found.\n");
+	return NULL;
     }
     
     /* オリジナルの SceneGraph */
@@ -310,17 +319,17 @@
     list = list->next;
 
     if(sg_exec_tree != NULL) {
-		return;
+	return;
     }
 
     /*removeのflagをもとにtreeを形成*/
     /* spe から送り返されてきた property の配列を見て生成する for()*/
     /*
-    for (Property *t = (Property*)app->property[0]; is_end(t); t++){
-	SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る
-	t->scenegraph = s; // property list には SceneGraphへのポインタが入っている
-	app->scenegraph_connector(property[0], s); // add する
-    } 
+      for (Property *t = (Property*)app->property[0]; is_end(t); t++){
+      SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る
+      t->scenegraph = s; // property list には SceneGraphへのポインタが入っている
+      app->scenegraph_connector(property[0], s); // add する
+      } 
     */   
     
 
@@ -375,21 +384,21 @@
     int light_num = 4;
     for (int i = 0; i < light_num; i++) {
 
-      get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
+	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
       
-      light_vector[i*4] = 0.0f;
-      light_vector[i*4+1] = 0.0f;
-      light_vector[i*4+2] = 0.0f;
-      light_vector[i*4+3] = 1.0f;
+	light_vector[i*4] = 0.0f;
+	light_vector[i*4+1] = 0.0f;
+	light_vector[i*4+2] = 0.0f;
+	light_vector[i*4+3] = 1.0f;
 
-      ApplyMatrix(&light_vector[i*4], light[i]->matrix);
+	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
       
-      light_vector[i*4] /= light_vector[i*4+2];
-      light_vector[i*4+1] /= light_vector[i*4+2];
+	light_vector[i*4] /= light_vector[i*4+2];
+	light_vector[i*4+1] /= light_vector[i*4+2];
 
-      /*SIMD演算のため*/
-      light_vector[i*4+2] *= -1;
-      light_vector[i*4+3] *= -1;
+	/*SIMD演算のため*/
+	light_vector[i*4+2] *= -1;
+	light_vector[i*4+3] *= -1;
 
     }
 
@@ -495,17 +504,17 @@
     int light_num = 4;
     for (int i = 0; i < light_num; i++) {
 
-      get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
+	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
       
-      light_vector[i*4] = 0.0f;
-      light_vector[i*4+1] = 0.0f;
-      light_vector[i*4+2] = 0.0f;
-      light_vector[i*4+3] = 1.0f;
+	light_vector[i*4] = 0.0f;
+	light_vector[i*4+1] = 0.0f;
+	light_vector[i*4+2] = 0.0f;
+	light_vector[i*4+3] = 1.0f;
 
-      ApplyMatrix(&light_vector[i*4], light[i]->matrix);
+	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
       
-      light_vector[i*4] /= light_vector[i*4+2];
-      light_vector[i*4+1] /= light_vector[i*4+2];
+	light_vector[i*4] /= light_vector[i*4+2];
+	light_vector[i*4+1] /= light_vector[i*4+2];
 
     }
    
@@ -516,7 +525,7 @@
 
 /*
   ExecMove task の post func として呼んでやる
- */
+*/
 void
 SceneGraphRoot::move_finish()
 {    
@@ -528,20 +537,20 @@
     int light_num = 4;
     for (int i = 0; i < light_num; i++) {
 
-      get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
+	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
       
-      light_vector[i*4] = 0.0f;
-      light_vector[i*4+1] = 0.0f;
-      light_vector[i*4+2] = 0.0f;
-      light_vector[i*4+3] = 1.0f;
+	light_vector[i*4] = 0.0f;
+	light_vector[i*4+1] = 0.0f;
+	light_vector[i*4+2] = 0.0f;
+	light_vector[i*4+3] = 1.0f;
 
-      ApplyMatrix(&light_vector[i*4], light[i]->matrix);
+	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
       
-      light_vector[i*4] /= light_vector[i*4+2];
-      light_vector[i*4+1] /= light_vector[i*4+2];
+	light_vector[i*4] /= light_vector[i*4+2];
+	light_vector[i*4+1] /= light_vector[i*4+2];
 
-      light_vector[i*4+2] *= -1;
-      light_vector[i*4+3] *= -1;
+	light_vector[i*4+2] *= -1;
+	light_vector[i*4+3] *= -1;
     }    
     
     //sgchange->viewer->light_xyz_stock = getLightVector();
@@ -645,7 +654,7 @@
 SceneGraphRoot::getLight(int id)
 {
 
-  return light[id];
+    return light[id];
 
 }
 
@@ -653,38 +662,38 @@
 float*
 SceneGraphRoot::getLightVector()
 {
-  return light_vector;
+    return light_vector;
 }
 
 int*
 SceneGraphRoot::getLightSwitch()
 {
-  return light_switch;
+    return light_switch;
 }
 
 int
 SceneGraphRoot::getLightSysSwitch()
 {
-  return light_sysswitch;
+    return light_sysswitch;
 }
 
 void
 SceneGraphRoot::OnLightSwitch(int id)
 {
-  light_switch[id] = 1;
+    light_switch[id] = 1;
 }
 
 void
 SceneGraphRoot::OffLightSwitch(int id)
 {
-  light_switch[id] = 0;
+    light_switch[id] = 0;
 }
 
 void
 SceneGraphRoot::OnLightSysSwitch()
 {
 
-  light_sysswitch = 1;
+    light_sysswitch = 1;
 
 }
 
@@ -692,65 +701,83 @@
 SceneGraphRoot::OffLightSysSwitch()
 {
 
-  light_sysswitch = 0;
+    light_sysswitch = 0;
 
 }
 
+void
+SceneGraphRoot::task_array_init(int id, int task_num, int param, int inData_num, int outData_num)
+{
+    gtask_array = new GTaskArray;
+    gtask_array->init(id, task_num, param, inData_num, outData_num);
+}
+
+void
+SceneGraphRoot::create_task_array()
+{
+    gtask_array->create_task_array(this->tmanager);
+}
+
+void
+SceneGraphRoot::task_array_finish()
+{
+    gtask_array->finish();
+}
 
 void
 SceneGraphRoot::set_game_task(int id, void *property, int size, PostFunction post_func)
-{ 
-  HTask *task = sgroot->tmanager->create_task(id);
-  task->set_cpu(SPE_ANY);
-  task->add_inData(property, size);
-  task->add_outData(property, size);
-  task->add_param((memaddr)1);
-  task->set_post(post_func, (void*)property, 0);
-  wait_game_task->wait_for(task);
-  task->spawn();
+{
+    gtask_array->next_task_array(id);
+
+    gtask_array->game_task->set_inData(0, property, size);
+    gtask_array->game_task->set_outData(0, property, size);
+
 }
 
 void
 SceneGraphRoot::set_game_task(int id, void *property, void *pad, int size, PostFunction post_func)
 {
-  HTask *task = sgroot->tmanager->create_task(id);
-  task->set_cpu(SPE_ANY);
-  task->add_inData(property, size);
-  task->add_inData(pad, sizeof(Pad));
-  task->add_outData(property, size);
-  task->set_post(post_func, (void*)property, 0);
-  wait_game_task->wait_for(task);
-  task->spawn();
+    gtask_array->next_task_array(id);
+
+    gtask_array->game_task->set_inData(0, property, size);
+    gtask_array->game_task->set_inData(1, pad, sizeof(Pad));
+    gtask_array->game_task->set_outData(0, property, size);
+
 }
 
 void
 main_task_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h)
 {
-  int size = node->property_size;
-  void *e  = node->propertyptr;
-  int move = node->move_id;
-  PostFunction post_func = node->post_func;
+    int size = node->property_size;
+    void *e  = node->propertyptr;
+    int move = node->move_id;
+    PostFunction post_func = node->post_func;
+    ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr;
+    property->root = node;
 
-  SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
-  sgroottmp->set_game_task(move, (void*)e, size, post_func);
+    SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
+
+    sgroottmp->set_game_task(move, (void*)e, size, post_func);
 }
 
 void
 pad_task_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h)
 {
-  int size = node->property_size;
-  void *e  = node->propertyptr;
-  int move = node->move_id;
-  PostFunction post_func = node->post_func;
+    int size = node->property_size;
+    void *e  = node->propertyptr;
+    int move = node->move_id;
+    PostFunction post_func = node->post_func;
+    ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr;
+    property->root = node;
 
-  SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
-  void *pad = (void*)sgroottmp->getController();
+    SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
+    void *pad = (void*)sgroottmp->getController();
 
-  sgroottmp->set_game_task(move, (void*)e, pad, size, post_func);
+    sgroottmp->set_game_task(move, (void*)e, pad, size, post_func);
 }
 
 void
-SceneGraphRoot::set_move_task(SceneGraphPtr node, int move, void *property, int size, 
+SceneGraphRoot::set_move_task(SceneGraphPtr node, int move, void *property, int size,
 			      PostFunction post_func)
 {
     node->move = main_task_move;
@@ -762,7 +789,7 @@
 
 void
 SceneGraphRoot::set_pad_task(SceneGraphPtr node, int move, void *property, int size,
-			      PostFunction post_func)
+			     PostFunction post_func)
 {
     node->move = pad_task_move;
     node->post_func = post_func;
--- a/Renderer/Engine/SceneGraphRoot.h	Thu Oct 21 21:39:47 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Tue Oct 26 17:34:41 2010 +0900
@@ -5,6 +5,7 @@
 #include "SceneGraphArray.h"
 #include "Camera.h"
 #include "SceneGraphIterator.h"
+#include "GTaskArray.h"
 #include <sys/types.h>
 
 typedef struct {
@@ -106,8 +107,11 @@
     void OnLightSysSwitch();
     void OffLightSysSwitch();
 
-    /* GameTask 生成用 */
-    HTaskPtr wait_game_task;
+    /* GameTaskArray 生成用 */
+    GTaskArrayPtr gtask_array;
+    void task_array_init(int id, int task_num, int param, int inData_num, int outData_num);
+    void create_task_array();
+    void task_array_finish();
     void set_game_task(int id, void *property, int size, PostFunction post_func);
     void set_game_task(int id, void *property, void* pad, int size, PostFunction post_func);
     void set_move_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func);
--- a/Renderer/Engine/viewer.cc	Thu Oct 21 21:39:47 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Tue Oct 26 17:34:41 2010 +0900
@@ -99,7 +99,6 @@
     sgroot = new SceneGraphRoot(this->width, this->height);
     sgroot->tmanager = manager;
 
-
     int light_num = 4;
     int size = sizeof(float)*4*light_num; //xyz+alfa(4) * light_num(4)
     int light_size = size / sizeof(float);
@@ -314,10 +313,17 @@
 
     pixels = dev->flip_screen(pixels);
 
-    /* ここでGameTaskの終了を待つTaskを生成しておく */
-    sgroot->wait_game_task = manager->create_task(Dummy,0,0,0,0);
     sgroot->updateControllerState();
-    sgroot->allExecute(width, height);
+
+    //TaskArray を使うか使わないか
+    if (sgroot->gtask_array != NULL) {
+	sgroot->create_task_array();
+	sgroot->allExecute(width, height);
+	sgroot->task_array_finish();
+    } else {
+	sgroot->allExecute(width, height);	
+    }
+
     light_xyz_stock = sgroot->getLightVector();
     light_switch_stock = sgroot->getLightSwitch();
     light_sysswitch_stock = sgroot->getLightSysSwitch();
@@ -690,13 +696,16 @@
 #else
     
     HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph);
-    HTaskPtr game_task = sgroot->wait_game_task;
     // SceneGraph(木構造) -> PolygonPack
 
     task_create_pp->set_param(0,(memaddr)sgroot->getDrawSceneGraph());
     task_create_pp->set_param(1,(memaddr)r[ppi].ppack);
-    /* GameTaskの終了を待ってからポリゴンを作る */
-    task_create_pp->wait_for(game_task);
+
+    /* GameTask の処理の終了を待ってからポリゴンを作る */
+    if (sgroot->gtask_array != NULL) {
+	HTaskPtr game_task_array = sgroot->gtask_array->get_task_array();
+	task_create_pp->wait_for(game_task_array);
+    }
 
     task_next->wait_for(task_create_pp);
 
@@ -742,7 +751,6 @@
     }
 
     task_create_pp->spawn();
-    game_task->spawn();
 }
 
 
--- a/Renderer/Engine/viewer.h	Thu Oct 21 21:39:47 2010 +0900
+++ b/Renderer/Engine/viewer.h	Tue Oct 26 17:34:41 2010 +0900
@@ -104,6 +104,10 @@
     // void setSceneData(SceneGraph *g);
     virtual void mainLoop();
 
+    void task_array_init(int id, int task_num, int param, int inData_num, int outData_num)
+    {
+      sgroot->task_array_init(id, task_num, param, inData_num, outData_num);
+    }
     void set_game_task(int id, void *property, int size, PostFunction post_func)
     {
       sgroot->set_game_task(id, property, size, post_func);
@@ -112,9 +116,9 @@
     {
       sgroot->set_game_task(id, property, pad, size, post_func);
     }
-    void set_move_task(SceneGraphPtr node, int move_id, void *titlep, int size, PostFunction post_func)
+    void set_move_task(SceneGraphPtr node, int move, void *titlep, int size, PostFunction post_func)
     {
-      sgroot->set_move_task(node, move_id, titlep, size, post_func);
+      sgroot->set_move_task(node, move, titlep, size, post_func);
     }
     void set_pad_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func)
     {
--- a/TaskManager/Makefile.def	Thu Oct 21 21:39:47 2010 +0900
+++ b/TaskManager/Makefile.def	Tue Oct 26 17:34:41 2010 +0900
@@ -29,7 +29,7 @@
 
 ABIBIT = 32
 
-OPT = -g -O9 
+OPT = -g #-O9
 # -DEARLY_TOUCH
 # -g -DTASK_LIST_MAIL -O9
 
--- a/example/hello_array/main.cc	Thu Oct 21 21:39:47 2010 +0900
+++ b/example/hello_array/main.cc	Tue Oct 26 17:34:41 2010 +0900
@@ -46,7 +46,7 @@
     }
     twice_main->spawn_task_array(t->next());
     twice_main->set_cpu(SPE_ANY);
-    twice_main->spawn();    
+    twice_main->spawn();
 }
 
 int