Mercurial > hg > Game > Cerium
changeset 1260:fde4e3de9806 draft
merge
author | Daichi Toma <toma@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 19 Nov 2011 07:42:21 +0900 |
parents | 52667b4c31e0 (current diff) 880f989ce52a (diff) |
children | 800e6e7abc59 |
files | |
diffstat | 12 files changed, 227 insertions(+), 82 deletions(-) [+] |
line wrap: on
line diff
--- a/Renderer/Engine/Camera.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/Camera.cc Sat Nov 19 07:42:21 2011 +0900 @@ -176,9 +176,9 @@ float cx[4], cy[4], cz[4], p[4]; float tm[16]; - radx = angle[0]*3.14/180; - rady = angle[1]*3.14/180; - radz = angle[2]*3.14/180; + radx = angle[0]*M_PI/180; + rady = angle[1]*M_PI/180; + radz = angle[2]*M_PI/180; float sinx = sin(radx); float cosx = cos(radx);
--- a/Renderer/Engine/ChangeLog Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/ChangeLog Sat Nov 19 07:42:21 2011 +0900 @@ -1,3 +1,14 @@ +2011-9-7 Shinji Kono <kono@ie.u-ryukyu.ac.jp> + + allExecute 使わない方の Camera の処理をしないとだめ。 + + Camera のbrother ===> sprite + Camera のchildren ===> sceneGraph + + じゃないの? Camera に座標と行列をcopyする必要があると思われる。 + + matrix/real_matrix は重複っぽい。そもそも、なんで別なんだ? 普通は同じ値? + 2011-2-14 Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp> CreatePolygonFromScenenGraph を SPEで動くようにTask化。もうできるのはわかっているけど @@ -25,16 +36,16 @@ 2009-12-19 Shinji Kono <kono@ie.u-ryukyu.ac.jp> SgChange/viewer は大域変数使いすぎ。禁止って言ったのに。 - linda api は、federated linda 対応でないものが使われている。 - 対応したものは、どこにあるんだろう? + linda api は、federated linda 対応でないものが使われている。 + 対応したものは、どこにあるんだろう? - 他の例題いじるのは、自分の例題を動かしてからにして欲しい。 + 他の例題いじるのは、自分の例題を動かしてからにして欲しい。 - まぁねぇ。Pipeline execution するのに、sgpack とかも Pipeline buffer - にするのは気づかないものなんだろうな... なくても、動かないことは - ないのか。 + まぁねぇ。Pipeline execution するのに、sgpack とかも Pipeline buffer + にするのは気づかないものなんだろうな... なくても、動かないことは + ないのか。 - viewer.cc の大域変数を落すところから始めるべきか? + viewer.cc の大域変数を落すところから始めるべきか? 2009-11-15 Shinji Kono <kono@ie.u-ryukyu.ac.jp> @@ -80,7 +91,7 @@ --------------------------------------- data = | vertex | normal | texture | sizeof(data) = size*3 --------------------------------------- - \ size / \ size / \ size / + \ size / \ size / \ size / てな感じで、SceneGraph->data の中に 3 つ入ってたわけです。 これだと、アクセスする時にどれがどれかわからんくなるし、
--- a/Renderer/Engine/Makefile Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/Makefile Sat Nov 19 07:42:21 2011 +0900 @@ -26,7 +26,7 @@ FORCE: -mkdir -p ../../include/Cerium - rsync `find . -name Test -prune -or -name spe -prune -or -name task -prune -or -name '*.h' -print` ../../include/Cerium + rsync `find . -name Test -prune -or -name spe -prune -or -name task -prune -or -name '*.h' -print|sed -e 's-^./--'` ../../include/Cerium clean:
--- a/Renderer/Engine/SceneGraph.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/SceneGraph.cc Sat Nov 19 07:42:21 2011 +0900 @@ -135,6 +135,10 @@ matrix[i] = 0; real_matrix[i] = 0; } + for (int i = 0; i < 4; i++) { + matrix[i*4+i] = 1; + real_matrix[i*4+i] = 1; + } finalize = &SceneGraph::finalize_copy; @@ -210,8 +214,13 @@ if (size % 3 != 0) { printf("vertex size is error. size %% 3 = %lld\n", size % 3); } - + /* + * MAX_SIZE_TRIANGLE:128 + */ if (size > 0) { + /* size/3 : 三角形の数? + * MAX_SIZE_TRIANGLE : 128 + */ pp_num = (size/3 + MAX_SIZE_TRIANGLE - 1) / MAX_SIZE_TRIANGLE; pp = (PolygonPack*)manager->allocate(sizeof(PolygonPack)*pp_num); } else { @@ -225,6 +234,7 @@ } + SceneGraph::SceneGraph(TaskManager *manager,const char *font,int pixels,Uint32 color,const char *string_name) { init();
--- a/Renderer/Engine/SceneGraphRoot.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/SceneGraphRoot.cc Sat Nov 19 07:42:21 2011 +0900 @@ -141,14 +141,14 @@ /*文字列の生成*/ void -SceneGraphRoot::createStringFont(TaskManager *manager, SceneGraphPtr root, +SceneGraphRoot::createStringFont(TaskManager *manager, SceneGraphPtr root, const char *string,int pixels,int screen_w, int screen_h,Uint32 color) { SceneGraphPtr text; float width_shift = 0; int i; - int length = strlen(string); + int length = strlen(string); for (i = 0; i < length;) { int len = 0; unsigned char initial = string[i]; @@ -172,7 +172,7 @@ width_shift += text->seq; root->addChild(text); get_matrix_scale(text->matrix, text->angle, text->xyz, scale, root->matrix); - get_matrix(text->real_matrix, text->angle, text->xyz, root->real_matrix); + // get_matrix(text->real_matrix, text->angle, text->xyz, root->real_matrix); i += len; } } @@ -204,7 +204,11 @@ xmlNodePtr cur; SceneGraphPtr tmp; - /* パース DOM生成 */ + /* パース DOM生成 + xmlParseFile:ファイルに含まれるXML文書を分析する + xmlDocGetRootElement:ドキュメントルートを指定する。 + よって、以下のcurにはドキュメントルートの位置が入っている + */ doc = xmlParseFile(xmlfile); cur = xmlDocGetRootElement(doc); @@ -213,24 +217,78 @@ /* XMLのノードを一つずつ解析 */ for (cur=cur->children; cur; cur=cur->next) { - /* 扱うのはsurfaceオンリー */ - if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { - continue; - } + /*初期化:curをドキュメントルートの一個下に設定 + 継続条件:curが真である + 再初期化:次のノードへ + */ - /* ポリゴン(SceneGraph)生成 */ - tmp = new SceneGraph(manager, cur); + /* 扱うのはsurfaceオンリーなので、ノードの名前がsurfaceでないなら + 以下の処理を行なわずにスキップする + */ + if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { + continue; + } + + /* ポリゴン(SceneGraph)生成 + SceneGraph:SceneGraph.cc、L186 + */ + tmp = new SceneGraph(manager, cur); + + //シーングラフを登録 registSceneGraph(tmp); } + //解放 xmlFreeDoc(doc); } void +SceneGraphRoot::createFromCOLLADAfile(TaskManager *manager, const char *xmlColladafile) +{ + /*make parse dom*/ + xmlDocPtr doc; + xmlNodePtr cur,cur_images,cur_effects,cur_geometries,cur_visual_scenes; + SceneGraphPtr tmp; + + doc = xmlParseFile(xmlColladafile); + cur = xmlDocGetRootElement(doc); + + /*エラー処理……だけど何書けばいいのか謎。とりあえず-1返してみる*/ + if(xmlStrcmp(cur->name, (xmlChar*)"COLLADA")){ + return ; + }; + + /* node analyze */ + for(cur=cur->children; cur_images; cur_images=cur_images->next){ + + if(xmlStrcmp(cur->name,(xmlChar*)"library_imeges") != 0){ + cur_images = cur; + continue; + } + if(xmlStrcmp(cur->name,(xmlChar*)"library_effects") != 0){ + cur_effects = cur; + continue; + } + if(xmlStrcmp(cur->name,(xmlChar*)"library_geometries") != 0){ + cur_geometries = cur; + continue; + } + if(xmlStrcmp(cur->name,(xmlChar*)"library_visual_scenes")!=0){ + cur_visual_scenes = cur; + continue; + } + + tmp = new SceneGraph(manager, cur); + registSceneGraph(tmp); + } + xmlFreeDoc(doc); +} + +void SceneGraphRoot::createFromXMLmemory(TaskManager *manager, SceneGraph *node, char *data, int len) { xmlDocPtr doc; xmlNodePtr cur; - + // size は取れるはず、テスト用に mmap したデータを使う /* パース DOM生成 */ @@ -247,7 +305,7 @@ continue; } /* ポリゴン(SceneGraph)生成 */ - SceneGraphPtr original = new SceneGraph(manager, cur); + SceneGraphPtr original = new SceneGraph(manager, cur); registSceneGraph(original); SceneGraphPtr clone = createSceneGraph(original->sgid); node->addChild(clone); @@ -294,13 +352,13 @@ printf("error: createSceneGraph(name): name object not found.\n"); return NULL; } - + /* オリジナルの SceneGraph */ src = sg_src[id]; /* ユーザーにはオリジナルの clone を返す */ p = src->clone(this->tmanager); - + /* move, collision に sgroot を渡したいのでここで sgroot を渡しておく*/ p->sgroot = (void *)this; @@ -312,7 +370,7 @@ int SceneGraphRoot::getSgid(const char *name) { - return sgid_hash.get_sgid(name); + return sgid_hash.get_sgid(name); } int @@ -349,14 +407,14 @@ for (int i = 0; i < light_num; i++) { 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; 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]; @@ -400,11 +458,11 @@ while (list) { list->move_execute(screen_w, screen_h); - list->collision_check(screen_w, screen_h, list); - - list->frame++; + list->collision_check(screen_w, screen_h, list); + + list->frame++; list = list->next; - } + } lightCalc(); @@ -424,7 +482,7 @@ sg_exec_tree = camera->children; } - + void SceneGraphRoot::copyTree(SceneGraphPtr t, SceneGraphPtr cur_parent) { @@ -441,11 +499,11 @@ /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ - get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix); + // get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix); //get_matrix(c->real_matrix, c->angle, c->xyz, camera->real_matrix); - } - + } + if (t->children != NULL && c != NULL) { cur_parent = c; t = t->children; @@ -465,12 +523,21 @@ t = t->parent; } } - } + } } } } + +void +SceneGraphRoot::treeApply(int screen_w, int screen_h) +{ + // don't calcurate sg_draw_tree's brother + transTree(sg_draw_tree->children, camera); +} + + /** * 破壊的に変換行列の親子関係を計算する */ @@ -486,9 +553,8 @@ /*親の回転、座標から、子の回転、座標を算出*/ matrix4x4(t->matrix,t->matrix,cur_parent->matrix); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ - matrix4x4(t->real_matrix,t->real_matrix,cur_parent->real_matrix); + // matrix4x4(t->real_matrix,t->real_matrix,cur_parent->real_matrix); } - if (t->children != NULL && c != NULL) { cur_parent = t; t = t->children; @@ -508,7 +574,7 @@ t = t->parent; } } - } + } } } @@ -519,31 +585,31 @@ */ void SceneGraphRoot::move_finish() -{ - list->collision_check(screen_w, screen_h, list); +{ + list->collision_check(screen_w, screen_h, list); - list->frame++; + list->frame++; //list = list->next; 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); - + 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); - + 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; - } - + } + //sgchange->viewer->light_xyz_stock = getLightVector(); } @@ -564,7 +630,7 @@ SceneGraphRoot::allRemove(SceneGraphPtr list) { SceneGraphPtr p = list; - + while (p) { SceneGraphPtr p1 = p->next; delete p; @@ -578,7 +644,7 @@ { SceneGraphPtr p = sg_available_list; SceneGraphPtr p1; - + while (p) { p1 = p->next; if (p->isRemoved()) { @@ -604,7 +670,7 @@ if (!t->isRemoved()) { if (t->name) printf("name: %s ",t->name); printf("x=%g y=%g z=%g\n",t->xyz[0],t->xyz[1],t->xyz[2]); - } + } if (t->children != NULL) { t = t->children; } else if (t->brother != NULL) { @@ -622,7 +688,7 @@ t = t->parent; } } - } + } } } }
--- a/Renderer/Engine/SceneGraphRoot.h Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/SceneGraphRoot.h Sat Nov 19 07:42:21 2011 +0900 @@ -91,6 +91,7 @@ void createStringFont(TaskManager *manager, SceneGraphPtr root,const char *string, int pixeles, int screen_w,int screen_h, Uint32 color); void createFont(TaskManager *manager,const char *font,int pixels,Uint32 color,const char *filename, int len, char **obj_name); void createFromXMLfile(TaskManager *manager, const char *); + void createFromCOLLADAfile(TaskManager *manager, const char *); void createFromXMLmemory(TaskManager *manager, SceneGraph * node, char *data, int len); SceneGraphPtr createSceneGraph(int id); SceneGraphPtr createSceneGraph(); @@ -123,6 +124,7 @@ /* Other System API */ void allExecute(int screen_w, int screen_h); + void treeApply(int screen_w, int screen_h); void lightCalc(); void flip(); void copyTree(SceneGraphPtr from, SceneGraphPtr to);
--- a/Renderer/Engine/matrix_calc.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/matrix_calc.cc Sat Nov 19 07:42:21 2011 +0900 @@ -5,12 +5,6 @@ #include "matrix_calc.h" using namespace std; -void noMoreMemory() -{ - cout << "can't allocate memory\n"; - exit(1); -} - void transMatrix(float *m0, float *m1, float *v) { @@ -40,17 +34,16 @@ for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { - m[i*4+j] = m1[j*4+i]; + m0[i*4+j] = m[i*4+j] = m1[j*4+i]; } } - m[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]); - m[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]); - m[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]); - m[3] = m[7] = m[11] = 0.0f; - m[15] = 1.0f; + m0[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]); + m0[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]); + m0[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]); + m0[3] = m0[7] = m0[11] = 0.0f; + m0[15] = 1.0f; - memcpy(m0, m, sizeof(float)*16); } /** @@ -67,6 +60,7 @@ } } + /** * ベクトルの正規化 * @@ -117,13 +111,14 @@ { float t[16]; + // こういう小細工よりベクタ使った方が良いんだが for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { + for (int j = i+1; j < 4; j++) { + float tmp = t[j*4+i]; t[i*4+j] = m1[j*4+i]; + m1[j*4+i] = tmp; } } - - memcpy(m0, t, sizeof(float)*16); } /** @@ -149,6 +144,17 @@ } } +void matrix4x4R(float xyz[16], float xyz1[16], float xyz2[16]) +{ + for(int t=0; t<16; t+=4) + { + for(int i=0; i<4; i++) + { + xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i]; + } + } +} + /** * c_xyz を中心に sacle 倍する */ @@ -185,9 +191,9 @@ get_matrix( float *matrix, float *rxyz, float *txyz, float *stack) { float radx,rady,radz; - radx = rxyz[0]*3.141562/180; - rady = rxyz[1]*3.141562/180; - radz = rxyz[2]*3.141562/180; + radx = rxyz[0]*M_PI/180; + rady = rxyz[1]*M_PI/180; + radz = rxyz[2]*M_PI/180; float sinx = sin(radx); float cosx = cos(radx); @@ -228,9 +234,9 @@ get_matrix_scale( float *matrix, float *rxyz, float *txyz, float *scale, float *stack) { float radx,rady,radz; - radx = rxyz[0]*3.14/180; - rady = rxyz[1]*3.14/180; - radz = rxyz[2]*3.14/180; + radx = rxyz[0]*M_PI/180; + rady = rxyz[1]*M_PI/180; + radz = rxyz[2]*M_PI/180; float sinx = sin(radx)*scale[0]; float cosx = cos(radx)*scale[0]; @@ -267,9 +273,43 @@ } +void +rotate_matrix( float m[16], float rxyz[4] ) +{ + float radx,rady,radz; + radx = rxyz[0]*M_PI/180; + rady = rxyz[1]*M_PI/180; + radz = rxyz[2]*M_PI/180; + + float sinx = sin(radx); + float cosx = cos(radx); + float siny = sin(rady); + float cosy = cos(rady); + float sinz = sin(radz); + float cosz = cos(radz); + + /* View Transform */ + m[0] = cosz*cosy+sinz*sinx*siny; + m[1] = sinz*cosx; + m[2] = -cosz*siny+sinz*sinx*cosy; + m[3] = 0; + m[4] = -sinz*cosy+cosz*sinx*siny; + m[5] = cosz*cosx; + m[6] = sinz*siny+cosz*sinx*cosy; + m[7] = 0; + m[8] = cosx*siny; + m[9] = -sinx; + m[10] = cosx*cosy; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 1; +} + void rotate_x(float *xyz, float r) { - float rad = r*3.14/180; + float rad = r*M_PI/180; xyz[0] = xyz[0]; xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad); @@ -278,7 +318,7 @@ void rotate_y(float *xyz, float r) { - float rad = r*3.14/180; + float rad = r*M_PI/180; xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad); xyz[1] = xyz[1]; @@ -287,7 +327,7 @@ void rotate_z(float *xyz, float r) { - float rad = r*3.14/180; + float rad = r*M_PI/180; xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad); xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad);
--- a/Renderer/Engine/polygon.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/polygon.cc Sat Nov 19 07:42:21 2011 +0900 @@ -56,8 +56,12 @@ TrianglePackPtr tri = pp[i].tri; // TrianglePack の size のチェック + int tri_size = (count < MAX_SIZE_TRIANGLE) ? count : MAX_SIZE_TRIANGLE ; + + //それを構造体に登録 pp[i].info.size = tri_size; + for (int j = 0; j < tri_size; j++) {
--- a/Renderer/Engine/task/DrawSpan.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/task/DrawSpan.cc Sat Nov 19 07:42:21 2011 +0900 @@ -65,8 +65,7 @@ static int drawLine1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag); // static void drawLine2(SchedTask *smanager, SpanPtr span, int startx, int endx, int js, int wait_tag); -static int getDrawParam(SchedTask *smanager, Gptr g, SpanPtr span, int localy, int startx, - int endx, int index, int j, DrawParamPtr param); +//static int getDrawParam(SchedTask *smanager, Gptr g, SpanPtr span, int localy, int startx, int endx, int index, int j, DrawParamPtr param); static int infinity_light_calc(int color,float normal_x, float normal_y, float normal_z, SchedTask *smanager,int x, int y, float z, int world_x, int world_y, float world_z); @@ -469,7 +468,7 @@ return ret; } - +#if 0 static int getDrawParam(SchedTask *smanager, Gptr g, SpanPtr span, int localy, int startx, int endx, int index, int j, DrawParamPtr param) { @@ -536,6 +535,7 @@ return 1; } +#endif static int infinity_light_calc(int color,float normal_x, float normal_y,
--- a/Renderer/Engine/viewer.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Engine/viewer.cc Sat Nov 19 07:42:21 2011 +0900 @@ -293,6 +293,8 @@ } else { sgroot->allExecute(width, height); } + } else { + sgroot->treeApply(width, height); } light_xyz_stock = sgroot->getLightVector();
--- a/Renderer/Test/xml_file/Ball.xml Sat Nov 19 07:41:45 2011 +0900 +++ b/Renderer/Test/xml_file/Ball.xml Sat Nov 19 07:42:21 2011 +0900 @@ -4345,4 +4345,4 @@ vLPuT//Z </image> </surface> -</OBJECT-3D> \ No newline at end of file +</OBJECT-3D>
--- a/example/Prime/ppe/Prime.cc Sat Nov 19 07:41:45 2011 +0900 +++ b/example/Prime/ppe/Prime.cc Sat Nov 19 07:42:21 2011 +0900 @@ -11,7 +11,11 @@ { long start = (long)smanager->get_param(0); /* 素数判定の開始地点 */ long end = (long)smanager->get_param(1); /* 素数判定の終了地点 */ +<<<<<<< local + long range = end - start; /* 判定する範囲 */ +======= long range = end - start; /* 判定する範囲 */ +>>>>>>> other /* 判定結果を収める配列を受け取る */ bool *output = (bool*)smanager->get_output(wbuf, 0); @@ -22,10 +26,16 @@ } +<<<<<<< local + for (int i = start, index = 0; i < end; i++, index++) { + int limit = (int)sqrt((double) i); /* 割る数の最大値を求める */ + for (int j = 2; j <= limit; j++) { +======= for (long i = start, index = 0; i < end; i++, index++) { long limit = (long)sqrt((double) i); /* 割る数の最大値を求める */ for (long j = 2; j <= limit; j++) { +>>>>>>> other /* 割り切れた場合、0を代入し素数じゃないという判定を下す */ if (i % j == 0) { output[index] = false;