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;
+}