Fix huge stack allocation in surface loading functions (#569)

This commit is contained in:
arthurtilly
2023-01-20 19:06:06 +13:00
committed by GitHub
parent 7551748a35
commit 818da65ae6

View File

@@ -675,12 +675,12 @@ static void get_optimal_coll_dist(struct Object *obj) {
} }
#endif #endif
static TerrainData sVertexData[600];
/** /**
* Transform an object's vertices, reload them, and render the object. * Transform an object's vertices, reload them, and render the object.
*/ */
void load_object_collision_model(void) { void load_object_collision_model(void) {
TerrainData vertexData[600];
TerrainData *collisionData = o->collisionData; TerrainData *collisionData = o->collisionData;
f32 marioDist = o->oDistanceToMario; f32 marioDist = o->oDistanceToMario;
@@ -709,11 +709,11 @@ void load_object_collision_model(void) {
&& !(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) && !(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)
) { ) {
collisionData++; collisionData++;
transform_object_vertices(&collisionData, vertexData); transform_object_vertices(&collisionData, sVertexData);
// TERRAIN_LOAD_CONTINUE acts as an "end" to the terrain data. // TERRAIN_LOAD_CONTINUE acts as an "end" to the terrain data.
while (*collisionData != TERRAIN_LOAD_CONTINUE) { while (*collisionData != TERRAIN_LOAD_CONTINUE) {
load_object_surfaces(&collisionData, vertexData, TRUE); load_object_surfaces(&collisionData, sVertexData, TRUE);
} }
} }
COND_BIT((marioDist < o->oDrawingDistance), o->header.gfx.node.flags, GRAPH_RENDER_ACTIVE); COND_BIT((marioDist < o->oDrawingDistance), o->header.gfx.node.flags, GRAPH_RENDER_ACTIVE);
@@ -723,7 +723,6 @@ void load_object_collision_model(void) {
* Transform an object's vertices and add them to the static surface pool. * Transform an object's vertices and add them to the static surface pool.
*/ */
void load_object_static_model(void) { void load_object_static_model(void) {
TerrainData vertexData[600];
TerrainData *collisionData = o->collisionData; TerrainData *collisionData = o->collisionData;
u32 surfacePoolData; u32 surfacePoolData;
@@ -734,11 +733,11 @@ void load_object_static_model(void) {
gSurfacesAllocated = gNumStaticSurfaces; gSurfacesAllocated = gNumStaticSurfaces;
collisionData++; collisionData++;
transform_object_vertices(&collisionData, vertexData); transform_object_vertices(&collisionData, sVertexData);
// TERRAIN_LOAD_CONTINUE acts as an "end" to the terrain data. // TERRAIN_LOAD_CONTINUE acts as an "end" to the terrain data.
while (*collisionData != TERRAIN_LOAD_CONTINUE) { while (*collisionData != TERRAIN_LOAD_CONTINUE) {
load_object_surfaces(&collisionData, vertexData, FALSE); load_object_surfaces(&collisionData, sVertexData, FALSE);
} }
surfacePoolData = (uintptr_t)gCurrStaticSurfacePoolEnd - (uintptr_t)gCurrStaticSurfacePool; surfacePoolData = (uintptr_t)gCurrStaticSurfacePoolEnd - (uintptr_t)gCurrStaticSurfacePool;