view field.cc @ 126:030394675d8e

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

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "libps2.h"
#include "ps2util.h"
#include "mytype.h"
#include "field.h"
#include "car.h"
#include "quotanion.h"
#include <stdbool.h>

#include "Application.h"

#define BUFSIZE 256

/* --- main.c --- */
extern FILE *main_fp;

static int field_num_max = 0;
static int field_num = 1;

static FieldPtr field_list;
static FieldPtr field_actual;

extern Viewer	*droot;

// 適当に自作:miya
PolygonInfo* xml_read_file(char *colImg)
{
  PolygonInfo* test;
  printf("xml_read_file");

  return test;
}


static FieldPtr
field_create(char *fieldImg, char *colImg )// OBJECT *tex)
{
  FieldPtr	self;
  OBJECT	*obj;
  void		*free_addr;

  // 初期化
  droot->createFromXMLfile(fieldImg);
  obj = droot->createSceneGraph("hoge");

  droot->createFromXMLfile(colImg);
  OBJECT *col_obj = droot->createSceneGraph("hoge");

  if (malloc_align16(&free_addr, &self, sizeof(Field)) == -1) {
    fprintf(stderr, "field.c: malloc_align16 error\n");
    fflush(stderr);
    exit(EXIT_FAILURE);
  }
  
  self->object = obj;
  self->next   = NULL;
  self->prev   = NULL;
  self->free_addr = free_addr;
#ifdef DEBUG
  fprintf(main_fp, "malloc fieldNode addr = %x(free), %x(obj)\n", (int)free_addr, (int)self);
#endif

  // ちょっと今だけコメント ---
  col_init(&self->colface, col_obj);

#ifdef DEBUG
  fprintf(main_fp, "       facenum = %d\n", self->colface.facenum);
  fprintf(main_fp, "       facenum = %x(free), ", (int)self->colface.free_addr);
  fprintf(main_fp, "facenum = %x(obj)\n", (int)self->colface.colface);
#endif

  return self;
}


static void
field_new_readCSV(FILE *fp, int id)
{
  FieldPtr fieldHead = NULL;
  FieldPtr newField  = NULL;
  FieldPtr prevField = NULL;
  char buff[BUFSIZE], *bufp;
  char fieldImg[BUFSIZE], colImg[BUFSIZE];//, texname[BUFSIZE];

  //TEXTURE *tex = NULL;
  int course_id;
  bool flag = false;

  while ((bufp = fgets(buff, BUFSIZE, fp)) != NULL) {
    bufp++;

    switch (buff[0]) {

    case 'n': // コースIDの読み取り
      if (flag == false) {
	sscanf(bufp, " %d\n", &course_id);
	if (id == course_id) {
	  flag = true;
	}
      }
      else {
	goto FINISH_LOAD;
      }
      break;

      /*
	case 't': // テクスチャのロード
	if (flag) {
	sscanf(bufp, " %s\n", texname);
	//tex = read_png_file(texname);
	ps2util_tex_Set(tex);
	}
	break;
      */

    case 'c': // コースのロード
      if (flag) {
	sscanf(bufp, " %s %s\n", fieldImg, colImg);

	newField = field_create(fieldImg, colImg );//, tex);
	if (!fieldHead) {
	  fieldHead = prevField = newField;
	} else {
	  prevField->next = newField;
	  newField->prev = prevField;
	  prevField = newField;
	}
	newField->init = fieldHead;	
	field_num_max++;
      }
      break;

    default:
      break;
     
    }
  }


 FINISH_LOAD:
  // 先頭と最後尾のリンクを張る
  newField->next = newField->init;
  newField->init->prev = newField;

  field_list = field_actual = fieldHead;
}


/*---------------------/
  FieldPtr
  field_init:
    指定したファイルからコースを生成する。
  戻り値
    コース先頭のポインタ
/---------------------*/
void
field_init(int id)
{
  FILE *fp;
  const char *filename = "course/course.dat";

  if (!(fp = fopen(filename, "r"))) {
    fprintf(main_fp, "error read file %s\n", filename);
    exit(EXIT_FAILURE);
  }
  field_new_readCSV(fp, id);
  fclose(fp);
}

static void
field_draw(FieldPtr p)
{
  ps2_vu0_unit_matrix((FMATRIX)(p->object->matrix));

  /*
    p->object->matrix[3][0] = p->location[0];
    p->object->matrix[3][1] = p->location[1];
    p->object->matrix[3][2] = p->location[2];
    p->object->matrix[3][3] = p->location[3];
  */

  // 上の5この処理、このやり方でも同じか確かめたい
  for( int i = 0; i < 4; i ++ )
    p->object->matrix[11+i] = p->location[0];

  // 今ちょっとコメント
  //ps2util_obj_Draw(p->object);
}


void field_update(CarPtr car)
{
  FieldPtr p;

  p = field_actual;
 
  // current
  p->location[0] = -car->location[0];
  p->location[1] = -car->location[1];
  p->location[2] = -car->location[2];
  p->location[3] = 1;
  field_draw(p);

  // next
  p = field_actual->next;
  if (p) {
    p->location[0] = -car->location[0];
    p->location[1] = -car->location[1];
    p->location[2] = -car->location[2];
    p->location[3] = 1;
    field_draw(p);
  }

  // prev
  p = field_actual->prev;
  if (p) {
    p->location[0] = -car->location[0];
    p->location[1] = -car->location[1];
    p->location[2] = -car->location[2];
    p->location[3] = 1;
    field_draw(p);
  }
}

void
field_destroy()
{
  /*
  FieldPtr p = field_list;
  FieldPtr d;

  
  TEXTURE *t;

  p->prev->next = NULL;

  t = p->object->surfaces->texture;
  ps2util_tex_Exclude(t);
  free_texture(t);

  while (p) {
    d = p;
    p = p->next;
    ps2util_obj_Free(d->object);
    free(d->colface.free_addr);
    free(d->free_addr);
#ifdef DEBUG
    fprintf(main_fp, "free fieldNode addr = %x\n", (int)d->free_addr);
#endif
  }

  field_num_max = 0;
  field_num = 1;

  */
}

/*
 * 周回記録。1周する毎に1を返す。
 */
int
field_rap_increment(int n)
{
  field_num += n;
  if (field_num > field_num_max) {
    field_num = 1;
    return 1;
  } else {
    return 0;
  }
}

void
field_set_actual(FieldPtr p)
{
  field_actual = p;
}

FieldPtr
field_get_actual()
{
  return field_actual;
}