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