bg.c
1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* 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;
}