Mercurial > hg > Game > Cerium
changeset 218:c4083e25b9bc draft
fix
author | gongo@localhost.localdomain |
---|---|
date | Wed, 04 Feb 2009 22:54:14 +0900 |
parents | bfdd037aee21 (current diff) 59f4129a9562 (diff) |
children | 335ea3665fcd |
files | TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/SceneGraph.cpp |
diffstat | 12 files changed, 167 insertions(+), 69 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/Button.cpp Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/Button.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/Camera.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/ChangeLog Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/Keyboard.cpp Wed Feb 04 22:54:14 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/SceneGraph.cpp Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraph.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraph.h Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/SceneGraphRoot.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/cube_action.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/polygon.h Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/sys.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/task/CreatePolygonFromSceneGraph.cpp Wed Feb 04 22:54:14 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 Wed Feb 04 22:50:42 2009 +0900 +++ b/TaskManager/Test/test_render/task/DrawSpan.cpp Wed Feb 04 22:54:14 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 }