Mercurial > hg > old > magoroku_racing.bad
view ps2util.cc @ 131:2cc2796b3681
move car
author | e085768 |
---|---|
date | Thu, 21 Jul 2011 00:04:08 +0900 |
parents | 586d68c42c5d |
children | 00d7de7fe9df |
line wrap: on
line source
/* ps2util.c */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include "libps2.h" #include "ps2util.h" #include "name_dictionary.h" #include "matrix_calc.h" #include "gSprite.h" /* たぶん、本当は読み込んだ xml file から情報を取得するとかそんなんだと思う どんな処理か分からないので、とりあえず、初期化している。 */ OBJECT *ps2util_obj_Create_fromXML(const char *filename) { OBJECT *body; //body->matrix = { {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} }; /* body->xyz = {0,0,0,0}; body->angle = {0,0,0,0}; body->transfer = { {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} }; body->*name = filename; body->*free_me = NULL; */ return body; } void ps2util_obj_Set_effect(OBJECT *body, int def) { //none } // ベクトル v1 をベクトル v2 にコピーする void ps2_vu0_copy_vector(FVECTOR directionA, FVECTOR directionB) { memcpy(directionA, directionB, sizeof(FVECTOR)); } void ps2util_obj_Renew_transMatrix(OBJECT *car){ //none } /* ps2 内の texture.c から */ /* TEXTURE* read_png_file(const char *texname) { printf("trace\n"); //とりあえず戻り値を返してエラーをどうにか TEXTURE* tex; return tex; } */ int ps2util_tex_Set(OBJECT* tex) { return -1; } int ps2util_sprite_Create(ps2utilSprite *Sp, OBJECT *sprite_tex) { return -1; } void ps2util_obj_Set_texture(OBJECT* car_body, OBJECT *tex) { //none } // 与えられた行列を単位行列に変換する void ps2_vu0_unit_matrix(FMATRIX m) { m[0][1] = m[0][2] = m[0][3] = 0; m[1][0] = m[1][2] = m[1][3] = 0; m[2][0] = m[2][1] = m[2][3] = 0; m[3][0] = m[3][1] = m[3][2] = 0; m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0; } /* Y軸を中心とした行列の回転 回転角 rx より X 軸を中心とした回転マトリックスを求めて、マトリックス m1 に左側から乗算して、その結果をマトリックス m0 に与える。 X 軸だけでなく Y 軸、Z 軸を中心とした関数もある。また3ついっんに回転させる関数もある。 */ void ps2_vu0_rot_matrix_y(FMATRIX result, FMATRIX m, float radian) { // 回転行列を作ってかけてやれば良い m[0][1] = m[0][2] = m[0][3] = 0; m[1][0] = m[1][2] = m[1][3] = 0; m[2][0] = m[2][1] = m[2][3] = 0; m[3][0] = m[3][1] = m[3][2] = 0; m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0; // /* m[0][0] = sinf(radian); m[2][2] = sinf(radian); m[0][2] = -cosf(radian); m[2][0] = cosf(radian); */ m[0][0] = cosf(radian); m[2][2] = cosf(radian); m[0][2] = -sinf(radian); m[2][0] = sinf(radian); FMATRIX m1;// = m; memcpy(&m1, m, sizeof(FMATRIX)); ps2_vu0_mul_matrix(result, m1, m); } // ベクトルの計算 // マトリックス m にベクトルを右から乗算して result に与える void ps2_vu0_apply_matrix(FVECTOR result, FMATRIX m, FVECTOR v) { result[0] = m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3]; result[1] = m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3]; result[2] = m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3]; result[3] = m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]; } void ps2_vu0_scale_vector(FVECTOR mov, FVECTOR car_direction, float car_speed) { mov[0] = car_direction[0] * car_speed; mov[1] = car_direction[1] * car_speed; mov[2] = car_direction[2] * car_speed; mov[3] = car_direction[3]; } // ベクトル v1 の各要素とベクトル v2 の各要素を各々加算してv0に与える // v0 = v1+v2 void ps2_vu0_add_vector(FVECTOR result, FVECTOR v0, FVECTOR v1) { result[0] = v0[0] + v1[0]; result[1] = v0[1] + v1[1]; result[2] = v0[2] + v1[2]; // result[3] = v0[3] + v1[3]; result[3] = v0[3]; } // 外積 void ps2_vu0_outer_product(FVECTOR result, FVECTOR v0, FVECTOR v1) { result[0] = v0[1] * v1[2] - v0[2] * v1[1] ; result[1] = v0[0] * v1[2] - v0[2] * v1[0] ; result[2] = v0[0] * v1[1] - v0[1] * v1[0] ; result[3] = 1; } // 内積 float ps2_vu0_inner_product(FVECTOR v0, FVECTOR v1) { return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2]; } void ps2_vu0_mul_matrix(FMATRIX result, FMATRIX m0, FMATRIX m1) { result[0][0] = m0[0][0] * m1[0][0] + m0[0][1] * m1[1][0] + m0[0][2] * m1[2][0] + m0[0][3] * m1[3][0]; result[0][1] = m0[0][0] * m1[0][1] + m0[0][1] * m1[1][1] + m0[0][2] * m1[2][1] + m0[0][3] * m1[3][1]; result[0][2] = m0[0][0] * m1[0][2] + m0[0][1] * m1[1][2] + m0[0][2] * m1[2][2] + m0[0][3] * m1[3][2]; result[0][3] = m0[0][0] * m1[0][3] + m0[0][1] * m1[1][3] + m0[0][2] * m1[2][3] + m0[0][3] * m1[3][3]; result[1][0] = m0[1][0] * m1[0][0] + m0[1][1] * m1[1][0] + m0[1][2] * m1[2][0] + m0[1][3] * m1[3][0]; result[1][1] = m0[1][0] * m1[0][1] + m0[1][1] * m1[1][1] + m0[1][2] * m1[2][1] + m0[1][3] * m1[3][1]; result[1][2] = m0[1][0] * m1[0][2] + m0[1][1] * m1[1][2] + m0[1][2] * m1[2][2] + m0[1][3] * m1[3][2]; result[1][3] = m0[1][0] * m1[0][3] + m0[1][1] * m1[1][3] + m0[1][2] * m1[2][3] + m0[1][3] * m1[3][3]; result[2][0] = m0[2][0] * m1[0][0] + m0[2][1] * m1[1][0] + m0[2][2] * m1[2][0] + m0[2][3] * m1[3][0]; result[2][1] = m0[2][0] * m1[0][1] + m0[2][1] * m1[1][1] + m0[2][2] * m1[2][1] + m0[2][3] * m1[3][1]; result[2][2] = m0[2][0] * m1[0][2] + m0[2][1] * m1[1][2] + m0[2][2] * m1[2][2] + m0[2][3] * m1[3][2]; result[2][3] = m0[2][0] * m1[0][3] + m0[2][1] * m1[1][3] + m0[2][2] * m1[2][3] + m0[2][3] * m1[3][3]; result[3][0] = m0[3][0] * m1[0][0] + m0[3][1] * m1[1][0] + m0[3][2] * m1[2][0] + m0[3][3] * m1[3][0]; result[3][1] = m0[3][0] * m1[0][1] + m0[3][1] * m1[1][1] + m0[3][2] * m1[2][1] + m0[3][3] * m1[3][1]; result[3][2] = m0[3][0] * m1[0][2] + m0[3][1] * m1[1][2] + m0[3][2] * m1[2][2] + m0[3][3] * m1[3][2]; result[3][3] = m0[3][0] * m1[0][3] + m0[3][1] * m1[1][3] + m0[3][2] * m1[2][3] + m0[3][3] * m1[3][3]; } void ps2_vu0_copy_matrix(FMATRIX transfer, FMATRIX pose) { memcpy(transfer, pose, sizeof(FMATRIX)); } void ps2util_obj_Free(OBJECT* obj) { free(obj); } void ps2_vu0_sub_vector(FVECTOR result, FVECTOR v0, FVECTOR v1) { result[0] = v0[0] - v1[0]; result[1] = v0[1] - v1[1]; result[2] = v0[2] - v1[2]; result[3] = v0[3];// - v1[3]; } void ps2_vu0_normalize(FVECTOR result, FVECTOR v) { // 大きさで割ってるだけって float d = sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); result[0] = v[0] / d; result[1] = v[1] / d; result[2] = v[2] / d; result[3] = 1; } void xml_free(PolygonInfo xml) { //none printf("xml_free\n"); } // scenegraで /* ただgSprite_PutSprite呼び出してるだけだから、 呼び出し先で直接gSprite_PutSprite関数を呼び出す事にしました */ void ps2util_obj_Draw(OBJECT *object) { //gSprite_PutObject(object); // gSprite_PutSprite(false, 100, object->xyz[0], object->xyz[1], object->xyz[2], 1 ); // PutSprite を持ってくれば? /* // char *name = "test"; // SceneGraphPtr object = droot->createSceneGraph("test"); root->addChild(object); // 画像の数数えとく static float my_scale = 5; float scale[] = {my_scale,my_scale,1}; //親の回転、座標から、子の回転、座標を算出 get_matrix_scale(object->matrix, object->angle, object->xyz, scale, root->matrix); //法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている) get_matrix(object->real_matrix, object->angle, object->xyz, root->real_matrix); */ } void ps2util_sprite_Destroy(ps2utilSprite *title_sprite ) { //none } //putSprite で置き換え? void ps2util_sprite_Set_basicAttribute(ps2utilSprite *p, unsigned short x, unsigned short y, unsigned short sptable_tw1, unsigned short sptable_th1, unsigned short sptable_tx, unsigned short sptable_ty, unsigned short sptable_tw2, unsigned short sptable_th2, int sprite_prio_foreground) { //none } void ps2util_sprite_Request(ps2utilSprite *p) { //none } void ps2util_sprite_Unuse_alpha(ps2utilSprite *sp) { //none } void ps2util_graphic_Init() { //none } /* ps2 依存関係の sprite.c より引用。 */ #define SPRITE_HAS_4VERTEXIS 4 #define PS2_GS_XYZ3 1 // なにかわからん定数だから適当に作りました void sprite_disappear( SPRITE* sprite ) { int i; GsSpritePacket* packet = sprite->gs_packet; for (i=0; i<SPRITE_HAS_4VERTEXIS; i++) packet->primData[i].xyz_addr = PS2_GS_XYZ3; } /* ps2 依存関係から持ってきた。 テクスチャに割り振ったメモリの解放処理? 元ファイル:texture.c */ /* void free_texture(TEXTURE *tex) { if (tex == NULL) return; //delete_name_dictionary(tex->name); free(tex->free_texenv); free(tex->free_image); free(tex); } */ /* ps2 依存関係内の、texture.c から拝借 この malloc によるメモリ取得をあちこちで行っているっぽい cerium にある。 */ int malloc_align16(void *free, void *aligned, int size) { char *index; unsigned int *f=(unsigned int *)free, *a=(unsigned int *)aligned; if (free == NULL || aligned == NULL || size <= 0) return(-1); index = (char *)malloc(size + ALIGN_16BYTE); if (index == NULL) { return(-1); } *f = *a = (unsigned long int)index; if (((unsigned long int)index % ALIGN_16BYTE) != 0) { index += ALIGN_16BYTE - ((unsigned long int)index % ALIGN_16BYTE); *a = (unsigned long int)index; } return(0); } /* void ps2util_tex_Exclude( TEXTURE* t ) { //const char *test = "test"; } */ void ps2util_sprite_Draw() { printf("ps2util_sprite_Draw()\n"); } void ps2util_graphic_Finish() { printf("ps2util_graphic_Finish()\n"); } // title.cに書いてた void ps2util_sprite_Use_alpha( ps2utilSprite *title ) { printf("ps2util_sprite_Use_alpha()\n"); }