/*============================================================================
  NuSYSTEM sample program SNAKE TAIL HACK
  
  view.c
  
  Copyright (C) 1997, NINTENDO Co,Ltd.
  ============================================================================*/

#include <assert.h>
#include <nusys.h>

#include "main.h"
#include "graphic.h"
#include "para.h"

void SetViewMtx( Dynamic* );
void SetViewMtxGameOver( Dynamic* );
extern float View;

/*--------------------------------------*/
/*  Setting the view-matrix (at the normal time)	*/
/*  IN:	dp The dynamic pointer		*/
/*  RET: None			*/
/*--------------------------------------*/
void
SetViewMtx( Dynamic* dp )
{
    u16   perspNorm;
    static LookAt lookat;
    /* The calculation and set-up of the projection-matrix*/
    guPerspective(&dp->projection, &perspNorm,
		  33, (float)SCREEN_WD/(float)SCREEN_HT, 10, 10000, 1.0);

    guLookAtReflect(&dp->viewing, &lookat,
		    0,
		    cosf(2.0*M_PI/(360/(View+90.0)))*CAM_DISTANCE,
		    sinf(2.0*M_PI/(360/(View+90.0)))*CAM_DISTANCE,
		    0, 0, 0,
		    0, 1, 0);

    gSPPerspNormalize(glistp++, perspNorm);
    gSPLookAt(glistp++, &lookat);

    gSPMatrix(glistp++, &(dp->projection), 
	      G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(glistp++, &(dp->viewing), 
	      G_MTX_PROJECTION | G_MTX_MUL | G_MTX_NOPUSH);
}

/*----------------------------------------------*/
/*  Setting of the view-matrix (at the game-over)	*/
/*  IN:	dp The dynamic pointer		*/
/*  RET:None					*/
/*----------------------------------------------*/
void
SetViewMtxGameOver( Dynamic* dp )
{
    u16   perspNorm;
    static LookAt lookat;
    /* The calculation and set-up of the projection-matrix */
    guPerspective(&dp->projection, &perspNorm,
		  33, (float)SCREEN_WD/(float)SCREEN_HT, 10, 10000, 1.0);

    guLookAtReflect(&dp->viewing, &lookat,
		    0,
		    0,
		    1500,
		    0, 0, 0,
		    0, 1, 0);

    gSPPerspNormalize(glistp++, perspNorm);
    gSPLookAt(glistp++, &lookat);

    gSPMatrix(glistp++, &(dp->projection), 
	      G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
    gSPMatrix(glistp++, &(dp->viewing), 
	      G_MTX_PROJECTION | G_MTX_MUL | G_MTX_NOPUSH);
}