diff gSprite.h @ 115:31dd5c07f7c1

class OBJECT:SceanGraph
author e085768
date Wed, 15 Jun 2011 23:31:59 +0900
parents 0b65ca27f113
children ed702e49cc6c
line wrap: on
line diff
--- a/gSprite.h	Thu Jun 09 18:07:46 2011 +0900
+++ b/gSprite.h	Wed Jun 15 23:31:59 2011 +0900
@@ -1,22 +1,290 @@
-#ifndef GSPRITE_H
-#define GSPRITE_H
+//SgoexCerium.ccより
+#include "matrix_calc.h"
+#include "TaskManager.h"
+#include "SceneGraph.h"
+#include "Application.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "libps2.h"
+#include "ps2util.h"
+#include <stdbool.h>
+
+#define DEFOBJ 100
+#define SPRITE_COL 0x4f
+#define SCREEN_HALF_W 320
+#define SCREEN_HALF_H 240
+
+static SpriteTable   sptable[DEFOBJ];
+static ps2utilSprite sp[DEFOBJ]; // 表示スプライト用スタック
+static unsigned int  sp_counter;
+static bool          flag_spriteInited = false; // スプライトロードフラグ
+
+static TEXTURE *sprite_tex;
+
+
+
+extern Viewer *droot;
 
-//スプライトの優先順位らしい ?
-#define SPRITE_PRIO_FOREGROUND 1
+static SceneGraphPtr root;
+
+
+//SgoexCerium.ccより
+void
+flip()
+{
+    CameraPtr camera = droot->sgroot->getCamera();
+
+    droot->sgroot->flip();
+    droot->sgroot->lightCalc();
+
+    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] = 30.0f;
+
+    /*親の回転、座標から、子の回転、座標を算出*/
+    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);
+}
+
+
+
+
 
-typedef struct sptable {
-    int tx;
-    int ty;
-    int tw;
-    int th;
-} SpriteTable;
+/*void
+gSprite_DefSprite(int number, int tx, int ty, int tw, int th)
+{
+  sptable[number].tx = tx;
+  sptable[number].ty = ty;
+  sptable[number].tw = tw;
+  sptable[number].th = th;
+}*/
+void
+gSprite_DefSprite(int number, const char *name, float w, float h, int color, OBJECT *obj)
+{
+    SpriteTable *m = &sptable[number];
+    m->w = w;
+    m->h = h;
+    m->color = (color & 32);
+    m->mx = w / 2; //画像の中心を座標としたいらしい。
+    m->my = h / 2;
+    m->tex_w = power_of_two(m->w);
+    m->tex_h = power_of_two(m->h);
+    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)
+{
+    SpriteTable *m = &sptable[number];
+    char *name = (char *) m->texture;
+if (!name) {
+    printf("PutSprite %d unknown\n",number);
+    return;
+}
+    SceneGraphPtr object = droot->createSceneGraph(name);
+    //object->c_xyz[0] = m->mx;
+    //object->c_xyz[1] = m->my;
+    root->addChild(object);
+
+    object->xyz[0] -= object->c_xyz[0]*my_scale;
+    object->xyz[1] -= object->c_xyz[1]*my_scale;
+    object->xyz[2] -= object->c_xyz[2];
+
+    object->xyz[0] += x+m->mx;
+    object->xyz[1] += y+m->my;
+    object->xyz[2] += zorder * 0.01;
+
+    float scale[] = {my_scale,my_scale,1};
+    //float c_xyz[] = {0,0,0};
+    //scale_matrix(object->matrix, scale, c_xyz);
+
+    /*親の回転、座標から、子の回転、座標を算出*/
+    //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);
+}
+
+
+
+
 
 
-// extern とってみたけど、なにか不都合ありますか?:miya
-void gSprite_Init();
-void gSprite_Draw_Reset();
-void gSprite_PutSprite(int number, int x, int y);
-void gSprite_PutSpriteEx(int number, int x, int y, float w, float h);
-void gSprite_DefSprite(int number, int tx, int ty, int tw, int th);
+/*void
+gSprite_PutSpriteEx(int number, int x, int y, float w, float h)
+{
+    ps2utilSprite *p = &sp[sp_counter];
+
+    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);
+
+    ps2util_sprite_Request(p);
+    sp_counter++;
+}*/
+void
+PutSpriteEx(int number, int x, int y, float scalex, float scaley, float angle)
+{
+ if (1) {
+    PutSprite(1, x, y, number);
+    return;
+ }
+
+    SpriteTable *m = &sptable[number];
+    char *name = (char *) m->texture;
+if (!name) {
+    printf("PutSpriteEx %d unknown\n",number);
+    return;
+}
+    SceneGraphPtr object = droot->createSceneGraph(name);
+    root->addChild(object);
+
+    float scale[] = {my_scale*scalex*4,my_scale*scaley*4,1};
+
+    /*親の回転、座標から、子の回転、座標を算出*/
+    object->xyz[0] = x - object->c_xyz[0] * my_scale - m->w*my_scale;
+    object->xyz[1] = y - object->c_xyz[1] * my_scale - m->h*my_scale;
+    object->xyz[2] = number * 0.01;
+    //object->c_xyz[0] = m->mx;
+    //object->c_xyz[1] = m->my;
+    object->angle[3] = angle * (3.1415926*2/4096);
+    get_matrix(object->matrix, object->angle, object->xyz, root->matrix);
+    float c_xyz[] = {0,0,0};
+    scale_matrix(object->matrix, scale, c_xyz);
+    /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/
+    // get_matrix(object->real_matrix, object->angle, object->xyz, root->real_matrix);
+}
+
+
+
+
+
+
+
+//ここいらはどうやら、スプライトを取得する部分。
+
+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);
+  }
 
-#endif
+}
+
+static void
+gSprite_Create()
+{
+  int 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);
+    }
+    ps2util_sprite_Unuse_alpha(&sp[i]);
+  }
+
+  flag_spriteInited = false;
+}
+
+
+void
+gSprite_Init()
+{
+  ps2util_graphic_Init();
+  //gSprite_Init_Png("img/main2.png");
+  //gSprite_Create(); // スプライト生成
+  
+  sgroot->createFromXMLfile("./xml_files/boss.xml");
+ 
+  /*  gSprite_DefSprite(10,   1,   1, 512, 666); // タイトル  
+  gSprite_DefSprite(17,   1,  35,  33,  33); // 選択マーク
+  gSprite_DefSprite(23,   1,   1, 106,  34); // スピードメーター
+  gSprite_DefSprite(24,  51,  40,  18,  20); // 右矢印
+  gSprite_DefSprite(25,  33,  40,  17,  20); // 左矢印
+  gSprite_DefSprite(26,  56,  89,  55,  26); // km/h
+  gSprite_DefSprite(27,  62,  62,  39,  26); // Rap
+  gSprite_DefSprite(28, 430,  62,  53,  46); // 1p
+  gSprite_DefSprite(29, 460,   6,  53,  46); // 2P 
+  gSprite_DefSprite(51, 333, 116, 165,  140); // 選択画面の車 
+  gSprite_DefSprite(52, 181, 116, 165,  140);
+  gSprite_DefSprite(53,  12, 116, 165,  140);
+  gSprite_DefSprite(81, 115,   1, 148, 114); // 選択画面のコース 
+  // 本当は (82, 272,...)です。二つ目のコース絵がないので 
+  gSprite_DefSprite(82, 272,   1, 148, 114);*/
+
+}
+
+
+static void
+gSprite_Clear()
+{
+  int i;
+
+  for (i=0; i<DEFOBJ; i++) {
+    sprite_disappear(&sp[i].attribute);
+  }
+  sp_counter = 0;
+}
+
+
+
+void
+gSprite_Draw_Reset()
+{
+  if (flag_spriteInited == true) {
+    gSprite_Clear();
+  }
+}
+
+
+
+void
+gSprite_PutSprite_Pause()
+{
+}