changeset 215:7ca6a2ef5be9

fix SceneGraph Constructor, Destructor
author gongo@gendarme.local
date Sun, 01 Feb 2009 22:14:44 +0900
parents 5bd1425fb561
children 961dec5912ef
files TaskManager/Test/test_render/Button.cpp TaskManager/Test/test_render/Camera.cpp TaskManager/Test/test_render/ChangeLog TaskManager/Test/test_render/Keyboard.cpp TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/SceneGraph.cpp TaskManager/Test/test_render/SceneGraph.h TaskManager/Test/test_render/SceneGraphRoot.cpp TaskManager/Test/test_render/cube_action.cpp TaskManager/Test/test_render/polygon.h TaskManager/Test/test_render/sys.cpp TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp TaskManager/Test/test_render/task/DrawSpan.cpp
diffstat 13 files changed, 169 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Test/test_render/Button.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/Button.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -1,22 +1,21 @@
 #include "Button.h"
 
+/**
+ * ボタン押下時に push, hold, release の状態を変更する
+ * push は押した瞬間にだけ 1 を持つ
+ * hold の状態では 0 を持つ
+ */
 void
 Button::push_work(void)
 {
-#if 0
-    if (hold) {
-	push = 0;
-    } else {
-	push = 1;
-    }
-#else
-    push = (!hold)*1;
-#endif
-
+    push = (!hold);
     hold = 1;
     release = 0;
 }
 
+/**
+ * ボタンを離した時に push, hold, release の状態を変更する
+ */
 void
 Button::release_work(void)
 {
@@ -25,18 +24,30 @@
     release = 1;
 }
 
+/**
+ * @retval 1 ボタンが押された(このフレームのみ)
+ * @retval 0 押されていない
+ */
 int
 Button::isPush(void)
 {
     return push;
 }
 
+/**
+ * @retval 1 ボタンは押され続けている
+ * @retval 0 ボタンは押されていない
+ */
 int
 Button::isHold(void)
 {
     return hold;
 }
 
+/**
+ * @retval 1 ボタンは押されていない
+ * @retval 0 ボタンが押されている
+ */ 
 int
 Button::isRelease(void)
 {
--- a/TaskManager/Test/test_render/Camera.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/Camera.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -174,12 +174,14 @@
     outerProduct(cy, cz, cx);
 
     // view tansform
-    //createViewTransformMatrix(view, cx, cy, cz);
-    //createPerspectiveTransformMatrix(pers, (float)w/(float)h);
-    //createScreenTransformMatrix(screen, (float)w, (float)h);
+#if 1
+    createViewTransformMatrix(view, cx, cy, cz);
+    createPerspectiveTransformMatrix(pers, (float)w/(float)h);
+    createScreenTransformMatrix(screen, (float)w, (float)h);
     
-    //matrix4x4(tmp, view, pers);
-    //matrix4x4(matrix, tmp, screen);
-
+    matrix4x4(tmp, view, pers);
+    matrix4x4(matrix, tmp, screen);
+#else
     get_matrix(matrix, angle, xyz, NULL);
+#endif
 }
--- a/TaskManager/Test/test_render/ChangeLog	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/ChangeLog	Sun Feb 01 22:14:44 2009 +0900
@@ -1,3 +1,30 @@
+2009-02-01  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* SceneGraph.cpp (SceneGraph::SceneGraph)
+	(SceneGraph::SceneGraph, SceneGraph::SceneGraph)
+	(SceneGraph::finalize_original, SceneGraph)
+	(SceneGraph::finalize_copy): add, fix
+	今のところ、SceneGraph の作られ方は
+
+	a1. xml ファイルから生成 (sgid 毎、sg_src[] に格納)
+	a2. ID を指定し、sg_src[id] の SceneGraph を複製
+	a3. xml も ID も指定しない、何も表示しない SceneGraph
+
+	a1 の時はポリゴンデータ(data[])を生成するわけだけど、
+	a2 でも、オリジナルと同じ data[] を持つ必要は(今は)ない。
+	なので、a2 の場合、data[] は a1 と同じ場所を指せば良い。
+	しかし、今までは、SceneGraph::~SceneGraph では
+	どんな SceneGraph でも
+
+	  delete [] data;
+
+	とかやってたので、それならということで
+
+	b1. a1 用の、Desturctor で data[] を delete する finalize_original()
+	b2. a2,a3 用の、data[] を削除しない finalize_copy()
+
+	を用意し、a1,a2,a3 の Consturoctor で、どっちかを設定する。
+
 2009-01-30  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
 	* spe/DrawSpan.cpp (DrawSpan::drawDot1): add
--- a/TaskManager/Test/test_render/Keyboard.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/Keyboard.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -65,4 +65,28 @@
     } else {
 	circle.release_work();
     }
+
+    if (keys[SDLK_k] == SDL_PRESSED) {
+	l1.push_work();
+    } else {
+	l1.release_work();
+    }
+
+    if (keys[SDLK_o] == SDL_PRESSED) {
+	l2.push_work();
+    } else {
+	l2.release_work();
+    }
+
+    if (keys[SDLK_l] == SDL_PRESSED) {
+	r1.push_work();
+    } else {
+	r1.release_work();
+    }
+
+    if (keys[SDLK_o] == SDL_PRESSED) {
+	r2.push_work();
+    } else {
+	r2.release_work();
+    }
 }
--- a/TaskManager/Test/test_render/Makefile.def	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/Makefile.def	Sun Feb 01 22:14:44 2009 +0900
@@ -3,10 +3,10 @@
 # include/library path
 # ex: macosx
 #CERIUM = /Users/gongo/Source/Concurrency/Game_project/Cerium
-#CERIUM = /Users/gongo/Source/hg/Cerium
+CERIUM = /Users/gongo/Source/hg/Cerium
 
 # ex: linux/ps3
-CERIUM = /home/gongo/Cerium
+#CERIUM = /home/gongo/Cerium
 #CERIUM = /Users/tkaito/hg/Game/Cerium
 
 #CERIUM = ../../..
--- a/TaskManager/Test/test_render/SceneGraph.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/SceneGraph.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -95,9 +95,47 @@
 }
 
 
+/**
+ * 何の情報も持ってない SceneGraph の生成
+ * 今のところ、とりあえず木構造の繋がりに使うぐらい
+ */
 SceneGraph::SceneGraph(void)
 {
     init();
+    finalize = &SceneGraph::finalize_copy;
+}
+
+/**
+ * orig のコピーとして SceneGraph を生成する
+ */
+SceneGraph::SceneGraph(SceneGraphPtr orig)
+{
+    init();
+    finalize = &SceneGraph::finalize_copy;
+
+    memcpy(this, orig, sizeof(SceneGraph));
+
+    // コピーしない
+    flag_remove = 0;
+    flag_drawable = 1;
+    frame = 0;    
+}
+
+
+/* construct polygon from xmlNode.  */
+SceneGraph::SceneGraph(xmlNodePtr surface)
+{
+    init();
+
+    size = atoi((char *)xmlGetProp(surface,(xmlChar *)"size"));
+    name = (char *)xmlGetProp(surface,(xmlChar *)"name");
+    parent_name = (char *)xmlGetProp(surface,(xmlChar *)"parent");
+
+    data = new float[size*3*3];
+
+    get_data(surface->children);
+
+    finalize = &SceneGraph::finalize_original;
 }
 
 void
@@ -133,23 +171,28 @@
     frame = 0;
 }
 
-/* construct polygon from xmlNode.  */
-SceneGraph::SceneGraph(xmlNodePtr surface)
+SceneGraph::~SceneGraph(void)
 {
-    init();
-
-    size = atoi((char *)xmlGetProp(surface,(xmlChar *)"size"));
-    name = (char *)xmlGetProp(surface,(xmlChar *)"name");
-    parent_name = (char *)xmlGetProp(surface,(xmlChar *)"parent");
-
-    data = new float[size*3*3];
-
-    get_data(surface->children);
+    (this->*finalize)();
 }
 
-SceneGraph::~SceneGraph(void)
+/**
+ * xml ファイルから生成されたオリジナル SceneGraph なので
+ * polygon data を削除
+ */
+void
+SceneGraph::finalize_original(void)
 {
-    delete [] data;
+    delete [] data;    
+}
+
+/**
+ * SceneGraph ID から生成された、コピー SceneGraph なので
+ * polygon data は削除しない。オリジナルの方で削除する。
+ */
+void
+SceneGraph::finalize_copy(void)
+{
 }
 
 /* XMLファイルからポリゴンを作成  */
@@ -561,14 +604,7 @@
 
 SceneGraphPtr
 SceneGraph::clone(void) {
-    SceneGraphPtr p = new SceneGraph;
-
-    memcpy(p, this, sizeof(SceneGraph));
-
-    // ポリゴンデータはとりあえずそのまま memcpy
-    p->data = new float[p->size*3*3];
-    memcpy(p->data, this->data, sizeof(float)*p->size*3*3);
-
+    SceneGraphPtr p = new SceneGraph(this);
     return p;
 }
 
--- a/TaskManager/Test/test_render/SceneGraph.h	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/SceneGraph.h	Sun Feb 01 22:14:44 2009 +0900
@@ -20,6 +20,7 @@
 public:
     SceneGraph(void);
     SceneGraph(xmlNodePtr surface);
+    SceneGraph(SceneGraphPtr orig);
     ~SceneGraph(void);
 
     // Node がもつ状態変数(というべきか否か
@@ -47,11 +48,19 @@
     // この SceneGraph は描画するものかどうか (0:しない 1:する
     int flag_drawable;
 
+    // anime frame num
+    int frame;
+
     // 関数ポインタ
     move_func move;
     collision_func collision;
 
+    // desutroctor で呼ばれる
+    void (SceneGraph::*finalize)(void);
+
     void init(void);
+    void finalize_original(void);
+    void finalize_copy(void);
     void move_execute(int screen_w, int screen_h);
     void collision_check(int screen_w, int screen_h, SceneGraphPtr tree);
     void all_execute(int screen_w, int screen_h);
--- a/TaskManager/Test/test_render/SceneGraphRoot.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/SceneGraphRoot.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -45,6 +45,7 @@
 {
     for (int i = 0; i < SGLIST_LENGTH; i++) {
 	if (strcmp(sg->name, sglist_table[i]) == 0) {
+	    sg->sgid = i;
 	    sg_src[i] = sg;
 	    return;
 	}
@@ -116,7 +117,6 @@
 
     /* ユーザーにはオリジナルの clone を返す */
     p = src->clone();
-    p->sgid = id;
 
     addNext(p);
 
@@ -131,8 +131,10 @@
 SceneGraphRoot::createSceneGraph(void)
 {
     SceneGraphPtr p = new SceneGraph;
+
     addNext(p);
     p->flag_drawable = 0;
+
     return p;
 }
 
@@ -143,7 +145,7 @@
     SceneGraphPtr t = top; /* top = Camera (090128 現在) */
     CameraPtr camera = (CameraPtr)t;
     
-    //camera->move_execute(screen_w, screen_h);
+    camera->move_execute(screen_w, screen_h);
     camera->update(screen_w, screen_h);
     
     t = camera->children;
--- a/TaskManager/Test/test_render/cube_action.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/cube_action.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -28,16 +28,11 @@
     node->angle[1] += 2.0f * node->stack_xyz[1];
     node->angle[2] += 2.0f * node->stack_xyz[2];
     
-#if 0
-    if (sgroot->controller->circle.isPush()) {
-      cube_split(node);
+    if (node->frame > 10 && sgroot->controller->circle.isPush()) {
+	cube_split(node);
     }
-
-#endif
 }
 
-int time = 0;
-
 static void
 cube_move_right(SceneGraphPtr node, int screen_w, int screen_h)
 {
@@ -56,13 +51,10 @@
     node->angle[0] += 2.0f;
     node->angle[1] += 2.0f * node->stack_xyz[1];
     node->angle[2] += 2.0f * node->stack_xyz[2];
-
-#if 1
-    if (time++ > 10 && sgroot->controller->circle.isPush()) {
-      cube_split(node);
-      time = 0;
+    
+    if (node->frame > 10 && sgroot->controller->circle.isPush()) {
+	cube_split(node);
     }
-#endif
 }
 
 static void
@@ -71,6 +63,12 @@
     SceneGraphPtr p = root->clone();
     root->addBrother(p);
 
+    printf("%d %d\n", root->frame, p->frame);
+    // TODO
+    // 木の作り方変えたらここ消す
+    p->frame = 0;
+    root->frame = 0;
+
     root->set_move_collision(cube_move_left, cube_collision);
     p->set_move_collision(cube_move_right, cube_collision);
     
@@ -97,7 +95,7 @@
     //node->xyz[2] = -300.0f;
 
     if (sgroot->controller->circle.isPush()) {
-      cube_split(node);
+	cube_split(node);
     }
 }
 
--- a/TaskManager/Test/test_render/polygon.h	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/polygon.h	Sun Feb 01 22:14:44 2009 +0900
@@ -31,7 +31,6 @@
     float c_xyz[4];        // center of rotation
     float matrix[16];
     float *anim;
-    int frame;         // anime frame num
     int texture_id; //texture id number
     struct texture_list texture_info;
     
--- a/TaskManager/Test/test_render/sys.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/sys.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -106,17 +106,6 @@
   matrix[13] = txyz[1];
   matrix[14] = txyz[2];
   matrix[15] = 1;
-
-  /* Perspective Transform */
-#if 0
-  float n = 0.0f;
-  float f = 1000.0f;
-  float a = 0.995f / (n-f);
-  float b = 1-((0.995*n)/(n-f));
-      
-  matrix[0] *= a*txyz[2]+b;
-  matrix[5] *= a*txyz[2]+b;
-#endif
   
   float m[16];
 
--- a/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -123,7 +123,7 @@
 		ApplyMatrix(xyz2, sg->matrix);
 		ApplyMatrix(xyz3, sg->matrix);
 
-#if 0
+#if 1
 		xyz1[0] /= xyz1[2];
 		xyz1[1] /= xyz1[2];
 		xyz2[0] /= xyz2[2];
--- a/TaskManager/Test/test_render/task/DrawSpan.cpp	Sun Feb 01 20:46:39 2009 +0900
+++ b/TaskManager/Test/test_render/task/DrawSpan.cpp	Sun Feb 01 22:14:44 2009 +0900
@@ -188,7 +188,7 @@
 DrawSpan::get_rgb(int tx, int ty, uint32 *addr)
 {
     TilePtr tile;
-    //printf("get %p\n", addr);
+
     tile = hash->get(addr);
     return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx];
 }
@@ -416,8 +416,9 @@
 		return js;
 #else
 		set_rgb(tex_addr, wait_tag);
-		ret = j;
-		continue;
+		//ret = j;
+		smanager->dma_wait(wait_tag);
+		//continue;
 #endif
 	    }