Mercurial > hg > old > magoroku_racing
diff gSprite.cc @ 128:d9e3137e70a0
xml name change
author | e085768 |
---|---|
date | Thu, 07 Jul 2011 16:10:21 +0900 |
parents | 030394675d8e |
children | d88dfd3d46c5 |
line wrap: on
line diff
--- a/gSprite.cc Wed Jul 06 21:46:37 2011 +0900 +++ b/gSprite.cc Thu Jul 07 16:10:21 2011 +0900 @@ -12,6 +12,8 @@ #include "gSprite.h" #include <stdbool.h> +#include "camera.h" + #define DEFOBJ 100 #define SPRITE_COL 0x4f #define SCREEN_HALF_W 320 @@ -26,32 +28,57 @@ extern Viewer *droot; -/*static*/ SceneGraphPtr root; +/*static*/ SceneGraphPtr root; static float my_scale = 5; +static FVECTOR cameraMan = { 0, 0, 0, 1 }; -//SgoexCerium.ccより +FVECTOR def_cameraMan = { 0, 0, 0, 1 }; + +void set_cameraMan( void ); + +// SgoexCerium.ccより void flip() { - CameraPtr camera = droot->sgroot->getCamera(); + CameraPtr camera = droot->sgroot->getCamera(); - droot->sgroot->flip(); + droot->sgroot->flip(); // 前フレームで描画した SceneGraph は削除 + // 前フレームに作られた SceneGraph は描画用に移行 + // 現フレームで新しく SceneGraph がコピーされるので初期化 + droot->sgroot->lightCalc(); + // rootって変数にカメラの位置設定してるんかな? + // じゃあ camera ってなによ root = droot->createSceneGraph(); - //root->xyz[0] = screen_w/2; - //root->xyz[1] = screen_h/2;; - root->xyz[0] = 0; - root->xyz[1] = 0; - root->xyz[2] = 0; - //root->xyz[2] = 30.0f; + + root->xyz[0] = 0; + root->xyz[1] = 0; + + set_cameraMan( ); + + // カメラの設定は後回しにします意味わからん + // magoroku_camera + + CAMERA mc = get_MagorokuCamera(); + + for( int i = 0; i < 4; i ++ ){ + root->xyz[i] = mc.xyz[i]; + root->angle[i] = mc.angle[i]; + + camera->zd[i] = mc.zd[i]; + camera->yd[i] = mc.yd[i]; + } + /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(root->matrix, root->angle, root->xyz, camera->matrix); + /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ get_matrix(root->real_matrix, root->angle, root->xyz, camera->real_matrix); + //出力して、次のものを出力するための準備 droot->setSceneData(root); } @@ -62,14 +89,50 @@ return root; } -/*void -gSprite_DefSprite(int number, int tx, int ty, int tw, int th) +/* + n==0 retrun x + n==1 return y + n==2 return z + n==3 ? +*/ +float get_cameraPos( int n ) +{ + float num; + + if( n > -1 && n < 4 ) num = root->xyz[n]; + else num = 0; + + return num; +} + +// カメラの位置設定 +void set_cameraMan( void ) { - sptable[number].tx = tx; - sptable[number].ty = ty; - sptable[number].tw = tw; - sptable[number].th = th; -}*/ + printf("camera_x = %f, cameraMan_x = %f\n",root->xyz[0], cameraMan[0]); + + // window_posの略 + FVECTOR wp = {0,0, 1000, 1}; + + for( int i = 0; i < 3; i ++ ){ + root->xyz[i] = -cameraMan[i] + wp[i]; + } + /* + root->xyz[0] = - cameraMan[0];//pos[0]; + root->xyz[1] = - cameraMan[1];//pos[1]; + root->xyz[2] = - cameraMan[2] - 1000;//pos[2] - 500; + */ + + printf("camera_x = %f, cameraMan_x = %f\n",root->xyz[0], cameraMan[0]); +} + +// カメラの位置を引数のヤツに追従する +// cameraManって変数に数値をコピーさせてるだけですけどね +void set_cameraPos( FVECTOR newCameraMan ) +{ + for( int i = 0; i < 4; i ++ ){ + cameraMan[i] = newCameraMan[i]; + } +} void gSprite_DefSprite(int number, const char *name, float w, float h, int color)//, OBJECT *obj) @@ -85,26 +148,7 @@ m->texture = (int *)name; } -/*void - gSprite_PutSprite(int number, int x, int y) - { - ps2utilSprite *p = &sp[sp_counter]; - - ps2util_sprite_Set_basicAttribute( - p, - (unsigned short)x, (unsigned short)y, - (unsigned short)sptable[number].tw*2, (unsigned short)sptable[number].th*2, - (unsigned short)sptable[number].tx, (unsigned short)sptable[number].ty, - (unsigned short)sptable[number].tw, (unsigned short)sptable[number].th, - SPRITE_PRIO_FOREGROUND); - - ps2util_sprite_Request(p); - sp_counter++; - }*/ - - -//void gSprite_PutSprite(int number, short x, short y, int zorder) -void gSprite_PutSprite(int number, int x, int y, int z) +void gSprite_PutSprite(bool ScreenPos, int number, int x, int y, int z, int test) { SpriteTable *m = &sptable[number]; @@ -130,15 +174,24 @@ // object->xyz[2] += zorder * 0.01; */ - + object->xyz[0] = x; object->xyz[1] = y; object->xyz[2] = z; - + + // 画面からの座標で表示したい場合 + if( ScreenPos == true ){ + for( int i = 0; i < 3; i ++ ){ + object->xyz[i] -= get_cameraPos(i); + } + } + root->addChild(object); float scale[] = {my_scale,my_scale,1}; //float c_xyz[] = {0,0,0}; + + //float c_xyz[] = {0,0,0}; //scale_matrix(object->matrix, scale, c_xyz); /*親の回転、座標から、子の回転、座標を算出*/ @@ -150,29 +203,88 @@ } -/*void - gSprite_PutSpriteEx(int number, int x, int y, float w, float h) - { - ps2utilSprite *p = &sp[sp_counter]; +// 制作途中 +void gSprite_PutObject(bool ScreenPos, OBJECT *obj) +{ + SpriteTable *m = &sptable[100]; + + char *name = (char *) m->texture; + if (!name) { + printf("PutSprite %d unknown\n",100); + return; + } + + SceneGraphPtr sgObj = droot->createSceneGraph(name); + + for( int i = 0; i < 4; i ++ ){ + sgObj->xyz[i] = obj->xyz[i]; + + for( int j = 0; j < 4; j ++ ){ + // sgObj->matrix[(i*4)+j] = obj->transfer[i][j]; + } + + sgObj->stack_angle[i] = obj->angle[i]; + } + + // memcpy( sgObj->matrix, obj->transfer, sizeof(FMATRIX) ); + + + printf("sgObj->x = %f\n", sgObj->xyz[0]); + printf("sgObj->y = %f\n", sgObj->xyz[1]); + printf("sgObj->z = %f\n", sgObj->xyz[2]); + printf("sgObj->3 = %f\n", sgObj->xyz[3]); + + printf("obj->x = %f\n", obj->xyz[0]); + printf("obj->y = %f\n", obj->xyz[1]); + printf("obj->z = %f\n", obj->xyz[2]); + printf("obj->3 = %f\n", obj->xyz[3]); + - ps2util_sprite_Set_basicAttribute( - p, - (unsigned short)x, (unsigned short)y, - (unsigned short)sptable[number].tw*w, (unsigned short)sptable[number].th*h, - (unsigned short)sptable[number].tx, (unsigned short)sptable[number].ty, - (unsigned short)sptable[number].tw, (unsigned short)sptable[number].th, - SPRITE_PRIO_FOREGROUND); + /* + // 画面からの座標で表示したい場合 + if( ScreenPos == true ){ + for( int i = 0; i < 3; i ++ ){ + Sgobj->xyz[i] -= get_cameraPos(i); + } + } + */ + + + root->addChild(sgObj); - ps2util_sprite_Request(p); - sp_counter++; + float scale[] = {my_scale,my_scale,1}; + + SceneGraphPtr wheel1 = droot->createSceneGraph("Cylinder.006"); + for( int i = 0; i < 3; i ++ ){ + wheel1->xyz[i] = sgObj->xyz[i]; } -*/ + root->addChild(wheel1); + //object->addChild(wheel1); + + /*親の回転、座標から、子の回転、座標を算出*/ + get_matrix_scale(wheel1->matrix, wheel1->angle, wheel1->xyz, scale, root->matrix); + + /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ + get_matrix(wheel1->real_matrix, wheel1->angle, wheel1->xyz, root->real_matrix); + + + + + + /*親の回転、座標から、子の回転、座標を算出*/ + get_matrix_scale(sgObj->matrix, sgObj->angle, sgObj->xyz, scale, root->matrix); + + /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ + get_matrix(sgObj->real_matrix, sgObj->angle, sgObj->xyz, root->real_matrix); + +} + void -gSprite_PutSpriteEx(int number, int x, int y, int z, float scalex, float scaley, float angle) +gSprite_PutSpriteEx(bool ScreenPos,int number, int x, int y, int z, float scalex, float scaley, float angle) { if (1) { - gSprite_PutSprite(number, x, y, z); + gSprite_PutSprite(ScreenPos,number, x, y, z, 0); return; } @@ -202,53 +314,50 @@ } - - - -//ここいらはどうやら、スプライトを取得する部分。 -/* - static void - gSprite_Init_Png(const char *texname) - { - if (!(sprite_tex = read_png_file(texname))) { - fprintf(stderr, - "cannot creat texture - init_png().\n"); - fflush(stderr); - exit(EXIT_FAILURE); - } + //ここいらはどうやら、スプライトを取得する部分。 + /* + static void + gSprite_Init_Png(const char *texname) + { + if (!(sprite_tex = read_png_file(texname))) { + fprintf(stderr, + "cannot creat texture - init_png().\n"); + fflush(stderr); + exit(EXIT_FAILURE); + } - if (ps2util_tex_Set(sprite_tex) == -1) { - fprintf(stderr, - "cannot set texture - init_png().\n"); - fflush(stderr); - exit(EXIT_FAILURE); - } + if (ps2util_tex_Set(sprite_tex) == -1) { + fprintf(stderr, + "cannot set texture - init_png().\n"); + fflush(stderr); + exit(EXIT_FAILURE); + } - } -*/ + } + */ - /* -static void -gSprite_Create() -{ - int i; + /* + static void + gSprite_Create() + { + int i; - for (i=0; i<DEFOBJ; i++) { + for (i=0; i<DEFOBJ; i++) { if (ps2util_sprite_Create(&sp[i], sprite_tex) == -1) { - fprintf(stderr, - "cannot create sprite No.%d - create_sprite()\n", i); - fflush(stderr); - exit(EXIT_FAILURE); + fprintf(stderr, + "cannot create sprite No.%d - create_sprite()\n", i); + fflush(stderr); + exit(EXIT_FAILURE); } ps2util_sprite_Unuse_alpha(&sp[i]); - } + } - flag_spriteInited = false; + flag_spriteInited = false; -} -*/ + } + */ void @@ -270,7 +379,6 @@ droot->createFromXMLfile("xml_file/select_corse_1.xml"); droot->createFromXMLfile("xml_file/select_corse_2.xml"); - ps2util_graphic_Init(); //gSprite_Init_Png("img/main2.png"); //gSprite_Create(); // スプライト生成 @@ -278,7 +386,8 @@ // testCoeler int tc = 1; - gSprite_DefSprite( TITLE, "title", 512, 666, tc); // タイトル + + gSprite_DefSprite( TITLE, "title", 512, 666, tc); // タイトル gSprite_DefSprite( SELECT, "select", 33, 33, tc); // 選択マーク gSprite_DefSprite( SP_METER, "sp_meter", 106, 34, tc); // スピードメーター gSprite_DefSprite( R_ARROW, "r_arrow", 18, 20, tc); // 右矢印 @@ -296,7 +405,6 @@ } - static void gSprite_Clear() { @@ -324,3 +432,27 @@ gSprite_PutSprite_Pause() { } + +// xmlファイルから読み込み +void call_createFromXMLfile( char *filename ) +{ + droot->createFromXMLfile(filename); +} + +// createScenGraphe()する +OBJECT* call_createSceneGraph( char *filename ) +{ + OBJECT *obj; + obj = droot->createSceneGraph(filename); + + return obj; +} + +// createScenGraphe()する +OBJECT* call_createSceneGraph( void ) +{ + OBJECT *obj; + obj = droot->createSceneGraph(); + + return obj; +}