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 <string.h>
4
5char gCloudyFlowerFieldsBg[] = "fla_bg";
6char gSunnyFlowerFieldsBg[] = "flb_bg";
10
13
32
39
49
57
59 return arg0 + (arg1 - arg0) * alpha / 256;
60}
61
64 u16 flags = 0;
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;
78 s32 numLines;
80
82 s16 texOffsetY;
83
84
85 enum {
86 BG_BLEND_NONE = 0,
90 };
91
96 }
97
98 switch (*gBackgroundTintModePtr) {
99 case ENV_TINT_NONE:
100 case ENV_TINT_SHROUD:
102 if (a1 != 0) {
104 }
105 break;
106 case ENV_TINT_DEPTH:
107 case ENV_TINT_REMAP:
108 default:
110 if (!(r1 == 255 && g1 == 255 && b1 == 255 && r2 == 0 && g2 == 0 && b2 == 0)) {
112 }
113 break;
114 }
115
116 switch (flags) {
117 case BG_BLEND_NONE:
119 break;
120 case BG_BLEND_HAS_FOG:
122 break;
125 fogR = r1;
126 fogG = g1;
127 fogB = b1;
128 fogA = a1;
129 break;
132 fogR = (fogR * (255 - a1) + r1 * a1) / 255;
133 fogG = (fogG * (255 - a1) + g1 * a1) / 255;
134 fogB = (fogB * (255 - a1) + b1 * a1) / 255;
135 fogA = (fogA * (255 - a1) + a1 * a1) / 255;
136 break;
139 break;
140 }
141
143 switch (*gBackgroundTintModePtr) {
144 case ENV_TINT_NONE:
145 case ENV_TINT_SHROUD:
146 if (fogA == 255) {
147 for (i = 0; i < ARRAY_COUNT(gBackgroundPalette); i++) {
148 gBackgroundPalette[i] = 1;
149 }
150 } else {
151 // lerp from background palette color to fog color based on fog alpha
152 for (i = 0; i < ARRAY_COUNT(gBackgroundPalette); i++) {
153 // NOTE: values after UNPACK range from [0,31], so we need to shift fog color into that range
158 gBackgroundPalette[i] = blendedB << 1 | blendedG << 6 | blendedR << 11 | 1;
159 }
160 }
161 break;
162 case ENV_TINT_DEPTH:
163 case ENV_TINT_REMAP:
164 default:
165 // the background color channels are remapped from [0,255] -> [min,max]
166 for (i = 0; i < ARRAY_COUNT(gBackgroundPalette); i++) {
167 // NOTE: values after UNPACK range from [0,31], so we need to shift other colors into that range
169 blendedB = (b2 >> 3) + ((UNPACK_PAL_B(palColor) * b1 >> 3) >> 5);
170 blendedG = (g2 >> 3) + ((UNPACK_PAL_G(palColor) * g1 >> 3) >> 5);
171 blendedR = (r2 >> 3) + ((UNPACK_PAL_R(palColor) * r1 >> 3) >> 5);
172
173 if (blendedB > 0x1F) {
174 blendedB = 0x1F;
175 }
176 if (blendedG > 0x1F) {
177 blendedG = 0x1F;
178 }
179 if (blendedR > 0x1F) {
180 blendedR = 0x1F;
181 }
182 gBackgroundPalette[i] = blendedB << 1 | blendedG << 6 | blendedR << 11 | 1;
183 }
184 break;
185 }
186 }
187
188 theta = clamp_angle(-cam->curBoomYaw);
191 f5 = cosTheta * cam->lookAt_obj.x - sinTheta * cam->lookAt_obj.z + cam->leadAmount;
192 scrollValue = -f5 * 0.25f;
194
197 } else {
199 }
200
201 while (scrollValue < 0.0f) {
203 }
204
210
219
222 } else {
224 }
225
230 for (i = 0; i < numLines; i++) {
231 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
232 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
233 texOffsetY -= gGameStatusPtr->backgroundMaxY;
234 }
237 0, 0, 295, 5, 0,
239
241 (bgXOffset + bgMinX - 1) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
242 G_TX_RENDERTILE, (bgMaxX - bgXOffset) * 32, 0, 4096, 1024);
244 (bgMaxX + bgMinX - 1) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
245 G_TX_RENDERTILE, 0, 0, 4096, 1024);
246 }
247 if (extraHeight != 0) {
248 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
249 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
250 texOffsetY -= gGameStatusPtr->backgroundMaxY;
251 }
254 0, 0, 295, extraHeight - 1, 0,
257 (bgXOffset + bgMinX - 1) * 4, (bgMaxY - 1 + bgMinY) * 4,
258 G_TX_RENDERTILE, (bgMaxX - bgXOffset) * 32, 0, 4096, 1024);
260 (bgMaxX + bgMinX - 1) * 4, (bgMaxY - 1 + bgMinY) * 4,
261 G_TX_RENDERTILE, 0, 0, 4096, 1024);
262 }
263 } else {
264 lineHeight = 6;
267 gBackroundWavePhase += TAU / 60; // 60 frames period
268 for (i = 0; i < numLines; i++) {
269 waveOffset = sin_rad(gBackroundWavePhase + i * (TAU / 15)) * 3.0f;
271 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
272 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
273 texOffsetY -= gGameStatusPtr->backgroundMaxY;
274 }
277 0, 0, 295, 5, 0,
279
281 (2 * bgXOffset + (bgMinX - 1)) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
282 G_TX_RENDERTILE, bgMaxX * 32 - bgXOffset * 16, 0, 4096, 1024);
284 (bgMaxX + bgMinX - 1) * 4, (lineHeight * i + lineHeight - 1 + bgMinY) * 4,
285 G_TX_RENDERTILE, 0, 0, 4096, 1024);
286 }
287 if (extraHeight != 0) {
288 waveOffset = sin_rad(gBackroundWavePhase + i * (TAU / 15)) * 3.0f;
290 texOffsetY = gBackroundTextureYOffset + lineHeight * i;
291 if (texOffsetY > gGameStatusPtr->backgroundMaxY) {
292 texOffsetY -= gGameStatusPtr->backgroundMaxY;
293 }
296 0, 0, 295, extraHeight - 1, 0,
299 (2 * bgXOffset + (bgMinX - 1)) * 4, (bgMaxY - 1 + bgMinY) * 4,
300 G_TX_RENDERTILE, bgMaxX * 32 - bgXOffset * 16, 0, 4096, 1024);
302 (bgMaxX + bgMinX - 1) * 4, (bgMaxY - 1 + bgMinY) * 4,
303 G_TX_RENDERTILE, 0, 0, 4096, 1024);
304 }
305 }
306}
307
310}
311
313 gBackroundWaveEnabled = false;
314}
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:312
void enable_background_wave(void)
Definition background.c:308
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:5870
@ BACKGROUND_RENDER_STATE_MASK
Definition enums.h:5875
@ BACKGROUND_FLAG_FOG
Definition enums.h:5871
@ ENV_TINT_SHROUD
Definition enums.h:3972
@ ENV_TINT_DEPTH
Definition enums.h:3974
@ ENV_TINT_REMAP
Definition enums.h:3978
@ ENV_TINT_NONE
Definition enums.h:3970
@ STORY_CH6_DESTROYED_PUFF_PUFF_MACHINE
Definition enums.h:191
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1730
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:3792
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:3801
f32 sin_rad(f32 x)
Definition 43F0.c:713
void mdl_get_remap_tint_params(u8 *primR, u8 *primG, u8 *primB, u8 *envR, u8 *envG, u8 *envB)
Definition model.c:3950
@ GB_StoryProgress
#define UNPACK_PAL_B(color)
Definition macros.h:280
#define UNPACK_PAL_R(color)
Definition macros.h:278
#define TAU
Definition macros.h:139
#define BSS
Definition macros.h:6
#define ARRAY_COUNT(arr)
Definition macros.h:39
#define UNPACK_PAL_G(color)
Definition macros.h:279
#define UNK_PTR
Definition types.h:7
BackgroundHeader gBackgroundImage
GameStatus * gGameStatusPtr
Definition main_loop.c:31
Camera gCameras[4]
Definition cam_main.c:16
Gfx * gMainGfxPos
Definition cam_main.c:14
u8 * gBackgroundTintModePtr
Definition model.c:105
s32 gCurrentCameraID
Definition cam_math.c:5