bg.c 1.96 KB
/*
 *  NINTENDO64 SAMPLE PROGRAM
 *
 *  FILE : bg.c
 *
 *  Copyright (C) 1997, NINTENDO Co,Ltd.
 */


#include  <ultra64.h>
#include  <PR/gs2dex.h>
#include  "system.h"
#include  "bg.h"


/*
 *  BG 構造体の初期化 
 */
void  bgInit(BG_STATE  *bgStat, uObjBg  *bg, uObjTxtr  *tlut)
{

  osWritebackDCache(bg, sizeof(uObjBg));
  guS2DInitBg(bg);

  bgStat->bg     = bg;
  bgStat->bgTLUT = tlut;
}


/*
 *  BG 構造体の更新 
 */
void  bgUpdate(BG_STATE  *bgStat)
{

  static  u32  move_bg_counter = 0;

  /* ダブルバッファ用 */
  static  u16  reserv_imageX   = 0;


  move_bg_counter ++;

  /* 前回の変更を反映 */
  if(move_bg_counter == 1)
    bgStat->bg->b.imageX = reserv_imageX;

  if(!(move_bg_counter % BG_SCROLL_COUNT)){

    /* BG のスクロール */
    bgStat->bg->b.imageX += BG_SCROLL << 5;

    /* BG のイメージ端処理 */
    if(bgStat->bg->b.imageX >= (bgStat->bg->b.imageW << 3))
      bgStat->bg->b.imageX -= (bgStat->bg->b.imageW << 3); 

    /* 今回の変更を保存 */
    reserv_imageX = bgStat->bg->b.imageX;

    move_bg_counter = 0;
  }
}


/*
 *  BG の描画
 */
Gfx  *bgDraw(Gfx  *gp, BG_STATE  *bgStat)
{
  /* BG 描画用 RSP 設定 */
  gSPObjRenderMode(gp ++, 0);
  
#ifndef NO_BG
  /* BG 描画用 RDP 設定 */
  gDPPipeSync(gp ++);
  /* Global */
  gDPSetCycleType(gp ++, G_CYC_COPY);
  /* TX */
  gDPSetTextureLUT(gp ++, G_TT_RGBA16);
  /* TF */
  gDPSetTextureFilter(gp ++, G_TF_POINT);
  /* CC */
  gDPSetCombineMode(gp ++, G_CC_DECALRGBA, G_CC_DECALRGBA);
  /* BL */
  gDPSetRenderMode(gp ++, G_RM_NOOP, G_RM_NOOP2);
  
  /* BG 描画 */
  gSPObjLoadTxtr(gp ++, bgStat->bgTLUT);
  gSPBgRectCopy (gp ++, bgStat->bg);
#else
  /* BG 描画用 RDP 設定 */
  gDPPipeSync(gp ++ );
  /* Global */
  gDPSetCycleType(gp ++, G_CYC_FILL);
  /* BL */
  gDPSetRenderMode(gp ++, G_RM_NOOP, G_RM_NOOP2);
  /* MI */
  gDPSetFillColor(gp ++, GPACK_RGBA5551(0, 0, 0,1) << 16 | 
		  GPACK_RGBA5551(0, 0, 0,1));

  /* 画面塗り潰し */
  gDPFillRectangle(gp ++,  0, 0,  SCREEN_WD - 1, SCREEN_HT - 1);
#endif
  
  return gp;
}