Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
background.c
Go to the documentation of this file.
1#include "common.h"
2#include "model.h"
3#include "gcc/string.h"
4
5char gCloudyFlowerFieldsBg[] = "fla_bg";
6char gSunnyFlowerFieldsBg[] = "flb_bg";
10
13
32
39
49
57
58u16 blend_background_channel(u16 arg0, s32 arg1, s32 alpha) {
59 return arg0 + (arg1 - arg0) * alpha / 256;
60}
61
64 u16 flags = 0;
65 s32 fogR, fogG, fogB, fogA;
66 u8 r1, g1, b1, a1;
67 u8 r2, g2, b2;
69 s32 i;
70
72
73 s32 bgMinX;
74 s32 bgMinY;
75 s32 bgMaxX;
76 s32 bgMaxY;
77 s32 lineHeight;
78 s32 numLines;
79 s32 extraHeight;
80
81 s32 bgXOffset;
82 s16 texOffsetY;
83
84 u8* newvar;
85
86 enum {
87 BG_BLEND_NONE = 0,
91 };
92
97 }
98
99 switch (*gBackgroundTintModePtr) {
100 case ENV_TINT_NONE:
101 case ENV_TINT_SHROUD:
103 if (a1 != 0) {
105 }
106 break;
107 case ENV_TINT_DEPTH:
108 case ENV_TINT_REMAP:
109 default:
111 if (!(r1 == 255 && g1 == 255 && b1 == 255 && r2 == 0 && g2 == 0 && b2 == 0)) {
113 }
114 break;
115 }
116
117 switch (flags) {
118 case BG_BLEND_NONE:
120 break;
121 case BG_BLEND_HAS_FOG:
123 break;
126 fogR = r1;
127 fogG = g1;
128 fogB = b1;
129 fogA = a1;
130 break;
133 fogR = (fogR * (255 - a1) + r1 * a1) / 255;
134 fogG = (fogG * (255 - a1) + g1 * a1) / 255;
135 fogB = (fogB * (255 - a1) + b1 * a1) / 255;
136 fogA = (fogA * (255 - a1) + a1 * a1) / 255;
137 break;
140 break;
141 }
142
144 switch (*gBackgroundTintModePtr) {
145 case ENV_TINT_NONE:
146 case ENV_TINT_SHROUD:
147 if (fogA == 255) {
148 for (i = 0; i < ARRAY_COUNT(gBackgroundPalette); i++) {
149 gBackgroundPalette[i] = 1;
150 }
151 } else {
152 // lerp from background palette color to fog color based on fog alpha
153 for (i = 0; i < ARRAY_COUNT(gBackgroundPalette); i++) {
154 // NOTE: values after UNPACK range from [0,31], so we need to shift fog color into that range
159 gBackgroundPalette[i] = blendedB << 1 | blendedG << 6 | blendedR << 11 | 1;
160 }
161 }
162 break;
163 case ENV_TINT_DEPTH:
164 case ENV_TINT_REMAP:
165 default:
166 // the background color channels are remapped from [0,255] -> [min,max]
167 for (i = 0; i < ARRAY_COUNT(gBackgroundPalette); i++) {
168 // NOTE: values after UNPACK range from [0,31], so we need to shift other colors into that range
170 blendedB = (b2 >> 3) + ((UNPACK_PAL_B(palColor) * b1 >> 3) >> 5);
171 blendedG = (g2 >> 3) + ((UNPACK_PAL_G(palColor) * g1 >> 3) >> 5);
172 blendedR = (r2 >> 3) + ((UNPACK_PAL_R(palColor) * r1 >> 3) >> 5);
173
174 if (blendedB > 0x1F) {
175 blendedB = 0x1F;
176 }
177 if (blendedG > 0x1F) {
178 blendedG = 0x1F;
179 }
180 if (blendedR > 0x1F) {
181 blendedR = 0x1F;
182 }
183 gBackgroundPalette[i] = blendedB << 1 | blendedG << 6 | blendedR << 11 | 1;
184 }
185 break;
186 }
187 }
188
189 theta = clamp_angle(-cam->curBoomYaw);
192 f5 = cosTheta * cam->lookAt_obj.x - sinTheta * cam->lookAt_obj.z + cam->leadAmount;
193 scrollValue = -f5 * 0.25f;
195
198 } else {
200 }
201
202 while (scrollValue < 0.0f) {
204 }
205
211
220
223 } else {
225 }
226
231 for (i = 0; i < numLines; i++) {
232 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
233 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
234 texOffsetY -= gGameStatusPtr->backgroundMaxY;
235 }
238 0, 0, 295, 5, 0,
240
242 (bgXOffset + bgMinX - 1) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
243 G_TX_RENDERTILE, (bgMaxX - bgXOffset) * 32, 0, 4096, 1024);
245 (bgMaxX + bgMinX - 1) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
246 G_TX_RENDERTILE, 0, 0, 4096, 1024);
247 }
248 if (extraHeight != 0) {
249 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
250 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
251 texOffsetY -= gGameStatusPtr->backgroundMaxY;
252 }
255 0, 0, 295, extraHeight - 1, 0,
258 (bgXOffset + bgMinX - 1) * 4, (bgMaxY - 1 + bgMinY) * 4,
259 G_TX_RENDERTILE, (bgMaxX - bgXOffset) * 32, 0, 4096, 1024);
261 (bgMaxX + bgMinX - 1) * 4, (bgMaxY - 1 + bgMinY) * 4,
262 G_TX_RENDERTILE, 0, 0, 4096, 1024);
263 }
264 } else {
265 lineHeight = 6;
268 gBackroundWavePhase += TAU / 60; // 60 frames period
269 for (i = 0; i < numLines; i++) {
270 waveOffset = sin_rad(gBackroundWavePhase + i * (TAU / 15)) * 3.0f;
272 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
273 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
274 texOffsetY -= gGameStatusPtr->backgroundMaxY;
275 }
278 0, 0, 295, 5, 0,
280
282 (2 * bgXOffset + (bgMinX - 1)) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
283 G_TX_RENDERTILE, bgMaxX * 32 - bgXOffset * 16, 0, 4096, 1024);
285 (bgMaxX + bgMinX - 1) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
286 G_TX_RENDERTILE, 0, 0, 4096, 1024);
287 }
288 if (extraHeight != 0) {
289 waveOffset = sin_rad(gBackroundWavePhase + i * (TAU / 15)) * 3.0f;
291 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
292 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
293 texOffsetY -= gGameStatusPtr->backgroundMaxY;
294 }
297 0, 0, 295, extraHeight - 1, 0,
300 (2 * bgXOffset + (bgMinX - 1)) * 4, (bgMaxY - 1 + bgMinY) * 4,
301 G_TX_RENDERTILE, bgMaxX * 32 - bgXOffset * 16, 0, 4096, 1024);
303 (bgMaxX + bgMinX - 1) * 4, (bgMaxY - 1 + bgMinY) * 4,
304 G_TX_RENDERTILE, 0, 0, 4096, 1024);
305 }
306 }
307}
308
312
BSS s32 PopupMenu_SelectedIndex
s16 gBackroundTextureYOffset
Definition background.c:8
s8 gBackroundWaveEnabled
Definition background.c:7
char gCloudyFlowerFieldsBg[]
Definition background.c:5
u16 blend_background_channel(u16 arg0, s32 arg1, s32 alpha)
Definition background.c:58
void disable_background_wave(void)
Definition background.c:313
void enable_background_wave(void)
Definition background.c:309
BSS PAL_BIN gBackgroundPalette[256]
Definition background.c:11
void load_map_bg(char *optAssetName)
Definition background.c:14
BSS f32 gBackroundLastScrollValue
Definition background.c:12
void appendGfx_background_texture(void)
Definition background.c:62
char gSunnyFlowerFieldsBg[]
Definition background.c:6
f32 gBackroundWavePhase
Definition background.c:9
void set_background_size(s16 startX, s16 startY, s16 sizeX, s16 sizeY)
Definition background.c:50
void reset_background_settings(void)
Definition background.c:33
void set_background(BackgroundHeader *bg)
Definition background.c:40
u16 * backgroundPalette
#define PAL_BIN
s8 flags
Definition demo_api.c:15
#define sin_deg
#define clamp_angle
#define cos_deg
#define mdl_get_shroud_tint_params
@ BACKGROUND_FLAG_TEXTURE
Definition enums.h:6284
@ BACKGROUND_RENDER_STATE_MASK
Definition enums.h:6289
@ BACKGROUND_FLAG_FOG
Definition enums.h:6285
@ ENV_TINT_SHROUD
Definition enums.h:4386
@ ENV_TINT_DEPTH
Definition enums.h:4388
@ ENV_TINT_REMAP
Definition enums.h:4392
@ ENV_TINT_NONE
Definition enums.h:4384
@ STORY_CH6_DESTROYED_PUFF_PUFF_MACHINE
Definition enums.h:191
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
f32 fabsf(f32 f)
void * load_asset_by_name(const char *assetName, u32 *decompressedSize)
Definition world.c:251
s32 is_world_fog_enabled(void)
Definition model.c:3795
s32 general_heap_free(void *data)
Definition heap.c:18
void decode_yay0(void *src, void *dst)
void get_world_fog_color(s32 *r, s32 *g, s32 *b, s32 *a)
Definition model.c:3804
f32 sin_rad(f32 x)
Definition 43F0.c:712
void mdl_get_remap_tint_params(u8 *primR, u8 *primG, u8 *primB, u8 *envR, u8 *envG, u8 *envB)
Definition model.c:3953
@ GB_StoryProgress
#define UNPACK_PAL_B(color)
Definition macros.h:273
#define UNPACK_PAL_R(color)
Definition macros.h:271
#define TAU
Definition macros.h:132
#define BSS
Definition macros.h:7
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define UNPACK_PAL_G(color)
Definition macros.h:272
#define UNK_PTR
Definition types.h:7
BackgroundHeader gBackgroundImage
GameStatus * gGameStatusPtr
Definition main_loop.c:32
Camera gCameras[4]
Definition cam_main.c:17
Gfx * gMainGfxPos
Definition cam_main.c:15
u8 * gBackgroundTintModePtr
Definition model.c:105
s32 gCurrentCameraID
Definition cam_math.c:4