view gSprite.cc @ 126:030394675d8e

succes compile
author e085768
date Thu, 30 Jun 2011 21:48:38 +0900
parents c62fec1dd2f8
children d9e3137e70a0
line wrap: on
line source

//SgoexCerium.ccより
#include "matrix_calc.h"
#include "TaskManager.h"
#include "SceneGraph.h"
#include "Application.h"
#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include "libps2.h"
#include "ps2util.h"
#include "gSprite.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;

/*static*/ SceneGraphPtr	root;

static float	my_scale = 5;


//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]	 = 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);
}

// rootのポインターを返す
SceneGraphPtr getRootPtr( void )
{
  return root;
}

/*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)
void gSprite_PutSprite(int number, int x, int y, int z)
{
  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;

    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;
    */
  
  object->xyz[0] = x;
  object->xyz[1] = y;
  object->xyz[2] = z;
    
  root->addChild(object);

  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);

}


/*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
gSprite_PutSpriteEx(int number, int x, int y, int z, float scalex, float scaley, float angle)
{
  if (1) {
    gSprite_PutSprite(number, x, y, z);
    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);
  }

  
  }
*/

 /*
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()
{
  droot->createFromXMLfile("xml_file/title.xml");

  droot->createFromXMLfile("xml_file/select.xml");
  droot->createFromXMLfile("xml_file/sp_meter.xml");
  droot->createFromXMLfile("xml_file/r_arrow.xml");
  droot->createFromXMLfile("xml_file/l_arrow.xml");
  droot->createFromXMLfile("xml_file/km.xml");
  droot->createFromXMLfile("xml_file/rap.xml");
  droot->createFromXMLfile("xml_file/1p.xml");
  droot->createFromXMLfile("xml_file/2p.xml");
  droot->createFromXMLfile("xml_file/select_car_1.xml");
  droot->createFromXMLfile("xml_file/select_car_2.xml");
  droot->createFromXMLfile("xml_file/select_car_3.xml");
  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(); // スプライト生成

  // testCoeler
  int tc = 1;

  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); // 右矢印
  gSprite_DefSprite( L_ARROW,  "l_arrow", 17,  20, tc); // 左矢印
  gSprite_DefSprite( KM,  "km",  55,  26, tc); // km/h
  gSprite_DefSprite( RAP,  "rap", 39,  26, tc); // Rap
  gSprite_DefSprite( PLAYER_1, "1P", 53, 46, tc); // 1p
  gSprite_DefSprite( PLAYER_2, "2P", 53,  46, tc); // 2P 
  gSprite_DefSprite( SELECT_CAR_1, "select_car_1", 165,  140, tc); // 選択画面の車 
  gSprite_DefSprite( SELECT_CAR_2, "select_car_2", 165,  140, tc);
  gSprite_DefSprite( SELECT_CAR_3,  "select_car_3", 165,  140, tc);
  gSprite_DefSprite( SELECT_CORSE_1, "select_corse_1", 148, 114, tc); // 選択画面のコース 
  // 本当は (82, 272,...)です。二つ目のコース絵がないので 
  gSprite_DefSprite( SELECT_CORSE_2, "select_corse_2", 148, 114 ,tc);

}


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()
{
}