You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
* buffers: refresh 15 and revert to base decomp * behavior script * color helper functions * extended bounds * egeo_layout * fixed model ids * camera conf improved * message panel ucode small * graph node * level script * mathutil updates * mathutil updates (allow unused funcs) * behaviors a - beta_fish * Add librtc and fix some data declarations * Move GRUCODE define to proper location in makefile * Refresh 15 * extra * Make ROM name smaller and change messages printed on build a bit * Fix console (lol) * Update UNF to latest master * Make ucode load from .o's (and also fix Super3D) * Fix crash with rumble + custom mario model * graph node and mathutil * removed behaviors * Ldtob documentation * _Putfld labeling * area * behavior actions * camera * debug updates * bubbles * envfx snow * farcall helpers * game init * geo misc * hud * only check if VC on render init * ingame menu * revert goddard to base decomp * insn disasm * interaction documentation * level geo * level update defines * macro special objects formatting changes * main.h documentation * map parser documentation & formatting * airborne documentation * mario actions automatic documentation * mario actions cutscene documentation * mario actions moving documentation and options * mario actions object documentation and options * mario stationary documentation * mario submerged documentation * mario misc documentation * mario step: ledge grab fixes and documentation * mario documentation * memory.h documentation * moving textures * object behaviors * object collision * fix flamethrower bug * object helpers * object list processor documentation * paintings * platform displacement * print / printf * puppycam absf * puppyprint updates and formatting changes * rendering graph node performance optimizations * rumble opt and doc * hqvm back to ultrasm64 * save file documentation and unlock defines * s2d engine * reset various files to ultrasm64 * file select * intro geo documentation * screen transition documentation * segment2.h * shadow overhaul * skybox refactor * sound init: clean up define usage + documentation * spawn object optimizations and documentation * spawn sound cleanup * sram to ultrasm64 * star select cleanup * title screen cleanup * dialogs / text * rename stomp smoke * stomp smoke -> small water splash * updated README * compilation flags * optimized file positions + support function/data sections * surface collision performance improvements * surface load optimizations * camera conf documentation * Allow easier command for opening puppyprint debug * Rearranged framebuffers & fixed puppyprint console printing * Fix shadow scaling and shifting * Fix SILHOUETTE, OBJECTS_REJ, and ucode loading, also clean up render phase system a bit. * Fixed build with BETTER_HANGING off * Clean up OBJECTS_REJ ifdefs * Fix duplicate comment & graph render layers/flags bitmask * Fixed build with BETTER_HANGING off * Fix Fast64 importing by reverting sSegmentTable change * Readded missing functions that caused build errors with Mario head enabled * Fixed clang compilation issues * Add INTER mode for geo_update_layer_transparency * Fix build warnings * bugfix: miscalculation in obj_turn_toward_object * Some puppytech fixes * Further Puppycamera fixes * Fix BUGFIX_DIALOG_TIME_STOP Fixes #136 * Fix sliding platform bparams * Add LEGACY_SHADOW_IDS define for Fast64 compatibility * Apply suggested changes * Better find_in_bounds_yaw_wdw_bob_thi ifdef * Fix build warnings for unused functions * Fixed stale reference bug from obj_mark_for_deletion change * Fixed incorrect digit for 100s #145 * Change groundpound-fix define and functionality to just disable bonking * Fixed puppyroll #134 * Adjust height value for terrain angle to kick in * fixed hi score flashing * Remove menudata backup (#131) Not considered important enough to keep * Fix fread() build warning * Add COURSE_NUM_TO_INDEX to save_file_get_star_flags check in bhv_unagi_init * Fix approach_s16 return value * Use boolean defines for oCapDoScaleVertically * Make the door lock a part of the key door model to eliminate z-fighting, also reduce z fighting on numbered doors with AUTO_LOD enabled. * Move flames to LAYER_TRANSPARENT_INTER * Resolved some compiler warnings and added FALL_THROUGH define (#168) * Address some more compiler warnings with different define toggles * Remove unnecessary fallthrough attribute * fixed geo_process_billboard floating point exception * Allow water to face any direction * Initialize focOffset so that BBH doesn't crash * Removed superfluous RDP commands when switching microcodes which would override scissor * Set OBJ_FLAG_DONT_CALC_COLL_DIST on bhvUkikiCage * Fix rumble build * Fixed UNLOCK_FPS strobing * Update src/game/object_helpers.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Update src/game/object_helpers.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Fix LEGACY_SHADOW_IDS id conflict * Use the vanilla default value for rotating fire bars if bparam2 is 0 * START_LEVEL safeguard * Fix some drawing distance issues caused by AUTO_COLLISION_DISTANCE * Fix rumble build * Fixed spline poll code using the wrong values for keyframes * Update readme with better credits Better credits for individual contributors * add arthur * added falco and moose * add fazana * le funny typo * added S2DEX engine to credits * silhouette + axo + ratio * remove specific callouts + add auto col distance * Update data/behavior_data.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Update data/behavior_data.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Update data/behavior_data.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Revert formatting changes to match vanilla decomp * Re-implement Y buffer for find_ceil * Re-implement POWER_STARS_HEAL for normal Power Stars * Start level comment & exit course comment/collapse * utilize reonucam technique for FAST_VERTICAL_CAMERA_MOVEMENT * Fix "MAX_REFERENCED_WALLS" typo * Allow stop_and_set_height_to_floor to work at any height if Mario is teleporting (#213) * Revert stop_and_set_height_to_floor to vanilla Fixes #208 * Fixed sAudioEnabled so that it disables audio CPU processing as well * Fixed puppyprint debug RDP us calculations * Renamed sAudioEnabled to gAudioEnabled * Replaced mtxf_to_mtx_asm with an equivalent implementation that supports WORLD_SCALE * Moved extended bounds and world scale configuration to a new config_world.h file * Default all objects to non-rej (#227) Fixes #221 (Default all objects to non-rej) * Fix #221 * Fix VISUAL_DEBUG breaking/crashing when OBJECTS_REJ is disabled (#211) * Fix VISUAL_DEBUG breaking/crashing when OBJECTS_REJ is disabled * Change vtl decrement in visual_surface_display from 6 to 3 Fixes #207 * Make area in SL igloo wider to prevent a softlock (#233) Fixes #210 * Fix coin formation coins being deleted if they spawn in the middle of a floor, also fix TTM slide coin position (#232) Fixes #201 * Make UNLOCK_ALL apply to more things * Fix wrong ifdef/ifndef in bhv_invisible_objects_under_bridge_init * Change chain chomp load/unload distances depending on number of segments (#237) Fixes #192 * added WATER_PLUNGE_UPWARP define * Add reonucam patch (#239) * added reonucam patch Fixes #218 * Fix how shadows handle water/transparency/height (#228) * Fix how shadows handle water/transparency/height * Change shadow check for flying carpets from a level specific check to a oPlatformOnTrackType check Fixes #179 * added reonucam credit * delete unnecesary patches * Apply suggested changes * murdered more patches * UNLOCK_ALL unlocks the cap boxes * UNLOCK_ALL unlocks cap boxes (slightly more epic edition) * revert ceil buffer * Renamed HD_INTRO_TEXTURES define, separated intro floombas * prevent double definition of floombas * actually prevent floomba redefinition * Develop/refactor default defines (#242) * Changed default config options * Added build dir to includePaths for pngs * disable NO_SLEEP by default * Disable puppyprint by default Sorry fazana 😔 * fix typos * add comment about BETTER_REVERB console perf * disable blue coin switch retry by default * Update config_audio.h Co-authored-by: Reonu <danileon95@gmail.com> Co-authored-by: Mr-Wiseguy <68165316+Mr-Wiseguy@users.noreply.github.com> * revert air step line to vanilla to fix bitfs scaling platform issue (#247) Fixes #200 * Fix stuttering on thin slopes (#248) * Fix stuttering on thin slopes * Revert vec3f_find_ceil calls to vanilla * Rename vec3f_find_ceil to find_mario_ceil * Update src/engine/surface_collision.h Fixes #249 * Swap static and dynamic surface checks back to vanilla order (#253) * Swap static and dynamic surface checks back to vanilla order * re-enable DISABLE_ALL config Fixes #251 #252 * Fixed save and quitting while in widescreen (#257) * Fixed save and quitting while in widescreen * use define for the level * all my homies hate ifdefs * skip wall offsets < 0 (#255) Fixes #255 * #264: Document non-stop stars' issues (#267) * #264: Document non-stop stars' issues * Update include/config/config_game.h * nonstop vanilla comment * derive margin_radius from radius after capping at 200 (#266) Fixes #259 * Config cleanup/refactor (#269) * Moved puppyprint define to graphics / rearranged some debug defines for ease of access * Moved compatibility safeguards to config_safeguards.h * spacing and comment formatting * #272 Move GFX_POOL_SIZE to config_graphics.h * disable EASIER_DIALOG_TRIGGER by default * prevent redefining warnings * small ifdef typo * changed ifndef to undefs Fixes #262 Fixes #272 * Improved movement config documentation related to turning around (#271) Fixes #270 * rename CUSTOM_DEBUG, add comments (#275) * Update README.md (#277) * v2.0.0 Co-authored-by: CrashOveride95 <crashoveride953@gmail.com> Co-authored-by: Arceveti <73617174+Arceveti@users.noreply.github.com> Co-authored-by: n64 <n64> Co-authored-by: Fazana <52551480+FazanaJ@users.noreply.github.com> Co-authored-by: Mr-Wiseguy <mrwiseguyromhacking@gmail.com> Co-authored-by: aglab2 <aglab3@gmail.com> Co-authored-by: gheskett <gheskett@gmail.com> Co-authored-by: Reonu <danileon95@gmail.com> Co-authored-by: Axollyon <20480418+Axollyon@users.noreply.github.com> Co-authored-by: Mr-Wiseguy <68165316+Mr-Wiseguy@users.noreply.github.com>
370 lines
12 KiB
C
370 lines
12 KiB
C
#include <PR/ultratypes.h>
|
|
#include <PR/gbi.h>
|
|
|
|
#include "engine/math_util.h"
|
|
#include "engine/surface_collision.h"
|
|
#include "behavior_data.h"
|
|
#include "geo_misc.h"
|
|
#include "level_table.h"
|
|
#include "memory.h"
|
|
#include "level_update.h"
|
|
#include "object_list_processor.h"
|
|
#include "rendering_graph_node.h"
|
|
#include "segment2.h"
|
|
#include "shadow.h"
|
|
#include "sm64.h"
|
|
|
|
/**
|
|
* @file shadow.c
|
|
* This file implements a self-contained subsystem used to draw shadows.
|
|
*/
|
|
|
|
/**
|
|
* An array consisting of all the hardcoded rectangle shadows in the game.
|
|
*/
|
|
static ShadowRectangle sShadowRectangles[2] = {
|
|
{ 7.2f, 4.6f, TRUE }, // Spindel
|
|
{ 4.0f, 3.6f, TRUE }, // Whomp
|
|
};
|
|
|
|
struct Shadow gCurrShadow;
|
|
struct Shadow *s = &gCurrShadow;
|
|
|
|
/**
|
|
* Shrink a shadow when its parent object is further from the floor, given the
|
|
* initial size of the shadow and the current distance.
|
|
*/
|
|
f32 scale_shadow_with_distance(f32 initial, f32 distFromFloor) {
|
|
if (distFromFloor <= 0.0f) {
|
|
return initial;
|
|
} else if (distFromFloor >= 600.0f) {
|
|
return initial * 0.5f;
|
|
} else {
|
|
return initial * (1.0f - ((distFromFloor * 0.5f) / 600.0f));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Dim a shadow when its parent object is further from the ground.
|
|
*/
|
|
s32 dim_shadow_with_distance(u8 solidity, f32 distFromFloor) {
|
|
if (solidity < 121) {
|
|
return solidity;
|
|
} else if (distFromFloor <= 0.0f) {
|
|
return solidity;
|
|
} else if (distFromFloor >= 600.0f) {
|
|
return 120;
|
|
} else {
|
|
return (((120 - solidity) * distFromFloor) / 600.0f) + (f32) solidity;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize a shadow. Return 0 on success, 1 on failure.
|
|
*
|
|
* @param pos Position of the parent object (not the shadow)
|
|
* @param shadowScale Diameter of the shadow
|
|
* @param overwriteSolidity Flag for whether the existing shadow solidity should
|
|
* be dimmed based on its distance to the floor
|
|
*/
|
|
s32 init_shadow(f32 distToShadow, s16 shadowScale, s8 shadowType, u8 overwriteSolidity) {
|
|
f32 baseScale;
|
|
|
|
if (shadowType != SHADOW_SQUARE_PERMANENT) {
|
|
// Set solidity and scale based on distance.
|
|
|
|
if (overwriteSolidity) {
|
|
s->solidity = dim_shadow_with_distance(overwriteSolidity, distToShadow);
|
|
}
|
|
|
|
baseScale = scale_shadow_with_distance(shadowScale, distToShadow);
|
|
} else {
|
|
s->solidity = overwriteSolidity;
|
|
baseScale = shadowScale;
|
|
}
|
|
vec3f_set(s->scale, baseScale, baseScale, baseScale);
|
|
|
|
return !(s->solidity);
|
|
}
|
|
|
|
/**
|
|
* Linearly interpolate a shadow's solidity between zero and finalSolidity
|
|
* depending on curr's relation to start and end.
|
|
*/
|
|
void linearly_interpolate_solidity_positive(u8 finalSolidity, s16 curr, s16 start,
|
|
s16 end) {
|
|
if (curr >= 0 && curr < start) {
|
|
s->solidity = 0;
|
|
} else if (end < curr) {
|
|
s->solidity = finalSolidity;
|
|
} else {
|
|
s->solidity = (f32) finalSolidity * (curr - start) / (end - start);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Linearly interpolate a shadow's solidity between initialSolidity and zero
|
|
* depending on curr's relation to start and end. Note that if curr < start,
|
|
* the solidity will be zero.
|
|
*/
|
|
void linearly_interpolate_solidity_negative(u8 initialSolidity, s16 curr, s16 start,
|
|
s16 end) {
|
|
// The curr < start case is not handled. Thus, if start != 0, this function
|
|
// will have the surprising behavior of hiding the shadow until start.
|
|
// This is not necessarily a bug, since this function is only used once,
|
|
// with start == 0.
|
|
if (curr >= start && end >= curr) {
|
|
s->solidity = ((f32) initialSolidity * (1.0f - (f32)(curr - start) / (end - start)));
|
|
} else {
|
|
s->solidity = 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change a shadow's solidity based on the player's current animation frame.
|
|
*/
|
|
s32 correct_shadow_solidity_for_animations(u8 initialSolidity) {
|
|
s16 animFrame = gMarioObject->header.gfx.animInfo.animFrame;
|
|
switch (gMarioObject->header.gfx.animInfo.animID) {
|
|
case MARIO_ANIM_IDLE_ON_LEDGE:
|
|
return SHADOW_SOLIDITY_NO_SHADOW;
|
|
case MARIO_ANIM_FAST_LEDGE_GRAB:
|
|
linearly_interpolate_solidity_positive(initialSolidity, animFrame, 5, 14);
|
|
return SHADOW_SOILDITY_ALREADY_SET;
|
|
case MARIO_ANIM_SLOW_LEDGE_GRAB:
|
|
linearly_interpolate_solidity_positive(initialSolidity, animFrame, 21, 33);
|
|
return SHADOW_SOILDITY_ALREADY_SET;
|
|
case MARIO_ANIM_CLIMB_DOWN_LEDGE:
|
|
linearly_interpolate_solidity_negative(initialSolidity, animFrame, 0, 5);
|
|
return SHADOW_SOILDITY_ALREADY_SET;
|
|
default:
|
|
return SHADOW_SOLIDITY_NOT_YET_SET;
|
|
}
|
|
}
|
|
|
|
#ifdef ENABLE_VANILLA_LEVEL_SPECIFIC_CHECKS
|
|
/**
|
|
* Slightly change the height of a shadow in levels with lava.
|
|
*/
|
|
void correct_lava_shadow_height(f32 *floorHeight) {
|
|
if (gCurrLevelNum == LEVEL_BITFS) {
|
|
if (*floorHeight < -3000.0f) {
|
|
*floorHeight = -3062.0f;
|
|
s->isDecal = FALSE;
|
|
} else if (*floorHeight > 3400.0f) {
|
|
*floorHeight = 3492.0f;
|
|
s->isDecal = FALSE;
|
|
}
|
|
} else if (gCurrLevelNum == LEVEL_LLL
|
|
&& gCurrAreaIndex == 1) {
|
|
*floorHeight = 5.0f;
|
|
s->isDecal = FALSE;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Add a shadow to the given display list.
|
|
* shadowType 0 uses a circle texture, the rest use a square texture.
|
|
* Uses environment alpha for shadow solidity.
|
|
*/
|
|
static void add_shadow_to_display_list(Gfx *displayListHead, s8 shadowType) {
|
|
if (shadowType == SHADOW_CIRCLE) {
|
|
gSPDisplayList(displayListHead++, dl_shadow_circle);
|
|
} else {
|
|
gSPDisplayList(displayListHead++, dl_shadow_square);
|
|
}
|
|
gDPSetEnvColor(displayListHead++, 255, 255, 255, s->solidity);
|
|
gSPDisplayList(displayListHead++, dl_shadow_end);
|
|
gSPEndDisplayList(displayListHead);
|
|
}
|
|
|
|
//! TODO:
|
|
// - Breakout create_shadow_below_xyz into multiple functions
|
|
/**
|
|
* Create a shadow at the absolute position given, with the given parameters.
|
|
* Return a pointer to the display list representing the shadow.
|
|
*/
|
|
Gfx *create_shadow_below_xyz(Vec3f pos, s16 shadowScale, u8 shadowSolidity, s8 shadowType, s8 shifted) {
|
|
struct Object *obj = gCurGraphNodeObjectNode;
|
|
// Check if the object exists.
|
|
if (obj == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
// The floor underneath the object.
|
|
struct Surface *floor = NULL;
|
|
// The y-position of the floor (or water or lava) underneath the object.
|
|
f32 floorHeight = FLOOR_LOWER_LIMIT_MISC;
|
|
f32 x = pos[0];
|
|
f32 y = pos[1];
|
|
f32 z = pos[2];
|
|
s8 isPlayer = (obj == gMarioObject);
|
|
s8 notHeldObj = (gCurGraphNodeHeldObject == NULL);
|
|
|
|
// Attempt to use existing floors before finding a new one.
|
|
if (notHeldObj && isPlayer && gMarioState->floor) {
|
|
// The object is Mario and has a referenced floor.
|
|
floor = gMarioState->floor;
|
|
floorHeight = gMarioState->floorHeight;
|
|
} else if (notHeldObj && (gCurGraphNodeObject != &gMirrorMario) && obj->oFloor) {
|
|
// The object is not Mario but has a referenced floor.
|
|
//! Some objects only get their oFloor from bhv_init_room, which skips dynamic floors.
|
|
floor = obj->oFloor;
|
|
floorHeight = obj->oFloorHeight;
|
|
} else {
|
|
// The object has no referenced floor, so find a new one.
|
|
// gCollisionFlags |= COLLISION_FLAG_RETURN_FIRST;
|
|
floorHeight = find_floor(x, y, z, &floor);
|
|
|
|
// No shadow if the position is OOB.
|
|
if (floor == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
// Skip shifting the shadow height later, since the find_floor call above uses the already shifted position.
|
|
shifted = FALSE;
|
|
}
|
|
|
|
// The shadow is a decal by default.
|
|
s->isDecal = TRUE;
|
|
|
|
// Check for water under the shadow.
|
|
struct Surface *waterFloor = NULL;
|
|
f32 waterLevel = find_water_level_and_floor(x, y, z, &waterFloor);
|
|
|
|
// Whether the floor is an environment box rather than an actual surface.
|
|
s32 isEnvBox = FALSE;
|
|
|
|
if (waterLevel > FLOOR_LOWER_LIMIT_MISC
|
|
&& y >= waterLevel
|
|
&& floorHeight <= waterLevel) {
|
|
// Skip shifting the shadow height later, since the find_water_level_and_floor call above uses the already shifted position.
|
|
shifted = FALSE;
|
|
|
|
// If there is water under the shadow, put the shadow on the water.
|
|
floorHeight = waterLevel;
|
|
|
|
// Don't use the decal layer, since water is transparent.
|
|
s->isDecal = FALSE;
|
|
|
|
// Check whether the water is an environment box or a water surface.
|
|
if (waterFloor != NULL) { // Water surfaces:
|
|
floor = waterFloor;
|
|
} else { // Environment boxes:
|
|
isEnvBox = TRUE;
|
|
}
|
|
} else { // Normal surfaces:
|
|
TerrainData type = floor->type;
|
|
if (type == SURFACE_ICE) {
|
|
// Ice floors are usually transparent.
|
|
s->isDecal = FALSE;
|
|
#ifdef ENABLE_VANILLA_LEVEL_SPECIFIC_CHECKS
|
|
} else if (type == SURFACE_BURNING) {
|
|
// Set the shadow height to the lava height in specific areas.
|
|
correct_lava_shadow_height(&floorHeight);
|
|
#endif
|
|
} else if (floor->object != NULL
|
|
&& floor->object->behavior == segmented_to_virtual(bhvPlatformOnTrack)
|
|
&& floor->object->oPlatformOnTrackType == PLATFORM_ON_TRACK_TYPE_CARPET) {
|
|
// Raise the shadow 5 units so the shadow doesn't clip into the flying carpet.
|
|
floorHeight += 5;
|
|
// The flying carpet is transparent.
|
|
s->isDecal = FALSE;
|
|
}
|
|
}
|
|
|
|
f32 nx, ny, nz;
|
|
if (isEnvBox) {
|
|
// Assume the floor is flat.
|
|
nx = 0.0f;
|
|
ny = 1.0f;
|
|
nz = 0.0f;
|
|
} else {
|
|
// Read the floor's normals.
|
|
nx = floor->normal.x;
|
|
ny = floor->normal.y;
|
|
nz = floor->normal.z;
|
|
|
|
// No shadow if the y-normal is negative (an unexpected result).
|
|
if (ny <= 0.0f) {
|
|
return NULL;
|
|
}
|
|
|
|
// If the animation changes the shadow position, move its height to the new position.
|
|
if (shifted) {
|
|
floorHeight = -((x * nx) + (z * nz) + floor->originOffset) / ny;
|
|
}
|
|
}
|
|
|
|
// No shadow if the floor is lower than expected possible,
|
|
if (floorHeight < FLOOR_LOWER_LIMIT_MISC) {
|
|
return NULL;
|
|
}
|
|
|
|
// Get the vertical distance to the shadow, now that the final shadow height is set.
|
|
f32 distToShadow = (y - floorHeight);
|
|
|
|
// No shadow if the object is below it.
|
|
if (distToShadow < -80.0f) {
|
|
return NULL;
|
|
}
|
|
|
|
// No shadow if the non-Mario object is too high.
|
|
if (!isPlayer && distToShadow > 1024.0f) {
|
|
return NULL;
|
|
}
|
|
|
|
vec3f_set(s->floorNormal, nx, ny, nz);
|
|
|
|
if (isPlayer) {
|
|
// Set the shadow solidity manually for certain Mario animations.
|
|
s32 solidityAction = correct_shadow_solidity_for_animations(shadowSolidity);
|
|
switch (solidityAction) {
|
|
case SHADOW_SOLIDITY_NO_SHADOW:
|
|
return NULL;
|
|
case SHADOW_SOILDITY_ALREADY_SET:
|
|
if (init_shadow(distToShadow, shadowScale, shadowType, /* overwriteSolidity */ 0)) {
|
|
return NULL;
|
|
}
|
|
break;
|
|
case SHADOW_SOLIDITY_NOT_YET_SET:
|
|
if (init_shadow(distToShadow, shadowScale, shadowType, shadowSolidity)) {
|
|
return NULL;
|
|
}
|
|
break;
|
|
default:
|
|
return NULL;
|
|
}
|
|
} else {
|
|
if (init_shadow(distToShadow, shadowScale, shadowType, shadowSolidity)) {
|
|
return NULL;
|
|
}
|
|
|
|
// Get the scaling modifiers for rectangular shadows (Whomp and Spindel).
|
|
if (shadowType >= SHADOW_RECTANGLE_HARDCODED_OFFSET) {
|
|
s8 idx = shadowType - SHADOW_RECTANGLE_HARDCODED_OFFSET;
|
|
s->scale[0] *= sShadowRectangles[idx].scaleX;
|
|
s->scale[2] *= sShadowRectangles[idx].scaleZ;
|
|
if (sShadowRectangles[idx].scaleWithDistance) {
|
|
scale_shadow_with_distance(s->scale[0], distToShadow);
|
|
scale_shadow_with_distance(s->scale[2], distToShadow);
|
|
}
|
|
}
|
|
}
|
|
|
|
Gfx *displayList = alloc_display_list(4 * sizeof(Gfx));
|
|
|
|
if (displayList == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
// Generate the shadow display list with type and solidity.
|
|
add_shadow_to_display_list(displayList, shadowType);
|
|
|
|
// Move the shadow position to the floor height.
|
|
pos[1] = floorHeight;
|
|
|
|
return displayList;
|
|
}
|