From dd0fffb030ccfb0b11ba985834595a64d7ac6f2a Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 27 May 2025 22:20:50 +0100 Subject: [PATCH] Homogenate batch flags and render flags and begin the painful task of documenting waves. (#590) * part one of wave pain * 2 * littel bit more * m * h * l * aagghh * yeah * :) * bruh * b * m * faith * z * b * rename batch flags * Update waves.c * fix conflicts --- include/level_object_entries.h | 14 +- include/structs.h | 36 +- src/object_functions.c | 18 +- src/object_models.c | 4 +- src/objects.c | 18 +- src/textures_sprites.c | 20 +- src/textures_sprites.h | 18 +- src/tracks.c | 52 +- src/tracks.h | 42 +- src/waves.c | 1883 +++++++++-------- src/waves.h | 171 +- .../buildTypes/buildModel/buildModelBatch.cpp | 2 +- ver/symbols/symbol_addrs.jpn.v79.txt | 98 +- ver/symbols/symbol_addrs.pal.v77.txt | 98 +- ver/symbols/symbol_addrs.pal.v80.txt | 98 +- ver/symbols/symbol_addrs.us.v77.txt | 98 +- ver/symbols/symbol_addrs.us.v80.txt | 98 +- 17 files changed, 1371 insertions(+), 1397 deletions(-) diff --git a/include/level_object_entries.h b/include/level_object_entries.h index 8faa7211..adaf7f60 100644 --- a/include/level_object_entries.h +++ b/include/level_object_entries.h @@ -436,11 +436,6 @@ typedef struct LevelObjectEntry_TimeTrial_Ghost { /* 0x00 */ LevelObjectEntryCommon common; } LevelObjectEntry_TimeTrial_Ghost; -typedef struct LevelObjectEntry_WaveGenerator { - /* 0x00 */ LevelObjectEntryCommon common; - /* 0x08 */ u8 unk8[10]; -} LevelObjectEntry_WaveGenerator; - typedef struct LevelObjectEntry_Butterfly { /* 0x00 */ LevelObjectEntryCommon common; /* 0x08 */ u16 unk8; @@ -711,16 +706,16 @@ typedef struct LevelObjectEntry8003FC44 { s8 unkA; } LevelObjectEntry8003FC44; -typedef struct LevelObjectEntry800BF524 { +typedef struct LevelObjectEntry_WaveGenerator { LevelObjectEntryCommon common; u8 unk8; u8 unk9; - u16 unkA; + u16 waveSize; u16 unkC; u16 unkE; u8 unk10; u8 unk11; -} LevelObjectEntry800BF524; +} LevelObjectEntry_WaveGenerator; typedef struct LevelObjectEntry_WavePower { LevelObjectEntryCommon common; @@ -937,7 +932,6 @@ typedef struct LevelObjectEntry { LevelObjectEntry_Trigger trigger; LevelObjectEntry_AirZippers_WaterZippers airzipper_waterzipper; LevelObjectEntry_TimeTrial_Ghost ghost; - LevelObjectEntry_WaveGenerator waverGenerator; LevelObjectEntry_Butterfly butterfly; LevelObjectEntry_Parkwarden taj; LevelObjectEntry_WorldKey worldKey; @@ -980,7 +974,7 @@ typedef struct LevelObjectEntry { LevelObjectEntry8000E2B4 unk8000E2B4; LevelObjectEntry80011AD0 unk80011AD0; LevelObjectEntry8003FC44 unk8003FC44; - LevelObjectEntry800BF524 unk800BF524; + LevelObjectEntry_WaveGenerator waveGenerator; LevelObjectEntry_WavePower wavePower; LevelObjectEntry_CharacterSelect characterSelect; LevelObjectEntry_Hud hud; diff --git a/include/structs.h b/include/structs.h index 1330ddbe..c52aafa4 100644 --- a/include/structs.h +++ b/include/structs.h @@ -461,31 +461,31 @@ typedef struct LevelHeader { /* 0x52 */ u8 music; /* 0x53 */ u8 unk53; /* 0x54 */ u16 instruments; - /* 0x56 */ u8 unk56; // values between 2 and 8 (except 5 and 7), used to determine waves count? + /* 0x56 */ u8 waveSubdivisons; // values between 2 and 8 (except 5 and 7), used to determine waves count? /* 0x57 */ u8 unk57; // possible values: 2,4,8,16,20, related to waves - /* 0x58 */ u8 unk58; // possible values: 1,2,4 - /* 0x59 */ u8 unk59; // always 0? - /* 0x5A */ s16 unk5A; // values between 512 and 4608 - /* 0x5C */ u8 unk5C; // possible values: 1,2,4 - /* 0x5D */ u8 unk5D; // always 0? - /* 0x5E */ s16 unk5E; // values between 512 and 4963 - /* 0x60 */ s16 unk60; // possible values: 120, 130, 157, 178, 187 + /* 0x58 */ u8 waveSineStep0; // possible values: 1,2,4 + /* 0x59 */ u8 waveSineBase0; // always 0? + /* 0x5A */ s16 waveSineHeight0; // values between 512 and 4608 + /* 0x5C */ u8 waveSineStep1; // possible values: 1,2,4 + /* 0x5D */ u8 waveSineBase1; // always 0? + /* 0x5E */ s16 waveSineHeight1; // values between 512 and 4963 + /* 0x60 */ s16 waveSeedSize; // possible values: 120, 130, 157, 178, 187 /* 0x62 */ s16 wavePower; // always 256 /* 0x64 */ s16 unk64; // Always 153 except in Smokey Castle where it's 0 and the title screen where it's 256 (Some form of secondary power) /* 0x66 */ s16 unk66; // values between 908 and 2560 - /* 0x68 */ s16 textureId; // always 62 except in the trophy race where it's 205 - /* 0x6A */ u8 unk6A; // values between 1 and 6 - /* 0x6B */ u8 unk6B; // values between 1 and 6 - /* 0x6C */ s8 unk6C; // values between 0 and 4 - /* 0x6D */ s8 unk6D; // values between 0 and 2 except in Hot Top Volcano where it's -2 - /* 0x6E */ s16 unk6E; // possible values: 3,5 + /* 0x68 */ s16 waveTexID; // always 62 except in the trophy race where it's 205 + /* 0x6A */ u8 waveUVScaleX; // values between 1 and 6 + /* 0x6B */ u8 waveUVScaleY; // values between 1 and 6 + /* 0x6C */ s8 waveUVScrollX; // values between 0 and 4 + /* 0x6D */ s8 waveUVScrollY; // values between 0 and 2 except in Hot Top Volcano where it's -2 + /* 0x6E */ s16 waveViewDist; // possible values: 3,5 - //func_800B8134 Seems to use this struct, and it differs on unk70 only. + //waves_init_header Seems to use this struct, and it differs on unk70 only. union { /* 0x70 */ LevelHeader_70 *unk70[1]; // unknown size, however only size of 1 matches struct { - /* 0x70 */ u8 darkVertexColours; // always 1 except in Hot Top Volcano where it's 0 - /* 0x71 */ u8 unk71; // possible values: 0,1 + /* 0x70 */ u8 wavesXlu; // always 1 except in Hot Top Volcano where it's 0 + /* 0x71 */ u8 waveDoubleDensity; // possible values: 0,1 }; }; @@ -1598,7 +1598,7 @@ typedef struct Object_Log { /* 0x06 */ u16 unk6; /* 0x08 */ u16 unk8; /* 0x0A */ u16 unkA; - /* 0x0C */ u16 unkC; + /* 0x0C */ u16 blockID; /* 0x0E */ s8 unkE[2]; } Object_Log; diff --git a/src/object_functions.c b/src/object_functions.c index 814f9efd..d106c2a5 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -5578,8 +5578,8 @@ void obj_init_rgbalight(Object *obj, LevelObjectEntry_RgbaLight *entry, UNUSED s * Sets hitbox data from spawn info. */ void obj_init_buoy_pirateship(Object *obj, UNUSED LevelObjectEntry_Buoy_PirateShip *entry, UNUSED s32 arg2) { - obj->unk64 = - func_800BE654(obj->segment.object.segmentID, obj->segment.trans.x_position, obj->segment.trans.z_position); + obj->unk64 = (Object_Log *) obj_wave_init(obj->segment.object.segmentID, obj->segment.trans.x_position, + obj->segment.trans.z_position); obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; @@ -5593,7 +5593,7 @@ void obj_init_buoy_pirateship(Object *obj, UNUSED LevelObjectEntry_Buoy_PirateSh */ void obj_loop_buoy_pirateship(Object *obj, s32 updateRate) { if (obj->unk64 != NULL) { - obj->segment.trans.y_position = log_wave_height((Object_Log *) obj->unk64, updateRate); + obj->segment.trans.y_position = obj_wave_height((Object_Log *) obj->unk64, updateRate); } obj->segment.animFrame += updateRate * 8; } @@ -5604,8 +5604,8 @@ void obj_loop_buoy_pirateship(Object *obj, s32 updateRate) { */ void obj_init_log(Object *obj, LevelObjectEntry_Log *entry, UNUSED s32 arg2) { f32 radius; - obj->unk64 = - func_800BE654(obj->segment.object.segmentID, obj->segment.trans.x_position, obj->segment.trans.z_position); + obj->unk64 = (Object_Log *) obj_wave_init(obj->segment.object.segmentID, obj->segment.trans.x_position, + obj->segment.trans.z_position); obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 2; obj->interactObj->hitboxRadius = 30; @@ -5634,7 +5634,7 @@ void obj_loop_log(Object *obj, s32 updateRate) { log = (Object_Log *) obj->unk64; if (log != NULL) { - obj->segment.trans.y_position = log_wave_height(log, updateRate); + obj->segment.trans.y_position = obj_wave_height(log, updateRate); } else { obj->segment.trans.y_position = ((LevelObjectEntryCommon *) obj->segment.level_entry)->y; } @@ -5753,8 +5753,12 @@ void obj_init_lensflareswitch(Object *obj, LevelObjectEntry_LensFlareSwitch *ent obj->segment.trans.scale /= 40.0f; } +/** + * Wave Generator init func. + * Calls a function to add a wave generator point for the waves system. + */ void obj_init_wavegenerator(Object *obj, UNUSED LevelObjectEntry_WaveGenerator *entry, UNUSED s32 arg2) { - func_800BF524(obj); + wavegen_add(obj); } void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butterflyEntry, s32 param) { diff --git a/src/object_models.c b/src/object_models.c index bf393121..4bbe6cde 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -568,7 +568,7 @@ void func_80060910(ObjectModel *mdl) { startTri = mdl->batches[i].facesOffset; vertOffset = mdl->batches[i].verticesOffset; endTri = mdl->batches[i + 1].facesOffset; - if (mdl->batches[i].flags & BATCH_FLAGS_UNK00000200) { + if (mdl->batches[i].flags & RENDER_UNK_200) { endTri = startTri - 1; } @@ -613,7 +613,7 @@ s32 func_80060AC8(ObjectModel *mdl, s32 arg1, s32 arg2, s32 arg3, s32 *outBatchI startTri = mdl->batches[i].facesOffset; vertOffset = mdl->batches[i].verticesOffset; endTri = mdl->batches[i + 1].facesOffset; - if (mdl->batches[i].flags & BATCH_FLAGS_UNK00000200) { + if (mdl->batches[i].flags & RENDER_UNK_200) { endTri = startTri - 1; } for (triIndex = startTri; triIndex < endTri; triIndex++, count++) { diff --git a/src/objects.c b/src/objects.c index feec2028..825f41d9 100644 --- a/src/objects.c +++ b/src/objects.c @@ -2537,7 +2537,7 @@ void func_80011134(Object *obj, s32 updateRate) { batch = model->batches; temp_s5 = model->unk50; for (batchNumber = 0; temp_s5 > 0 && batchNumber < model->numberOfBatches; batchNumber++) { - if (batch[batchNumber].flags & BATCH_FLAGS_TEXTURE_ANIM) { + if (batch[batchNumber].flags & RENDER_TEX_ANIM) { if (batch[batchNumber].textureIndex != TEX_INDEX_NO_TEXTURE) { tex = model->textures[batch[batchNumber].textureIndex].texture; sp5C = batch[batchNumber].unk7; @@ -2569,7 +2569,7 @@ void func_80011264(ObjectModel *model, Object *obj) { batch = model->batches; while (i < model->numberOfBatches) { - if (batch[i].flags & BATCH_FLAGS_TEXTURE_ANIM) { + if (batch[i].flags & RENDER_TEX_ANIM) { if (batch[i].textureIndex != TEX_INDEX_NO_TEXTURE) { // Fakematch if (model->textures[batch[i].textureIndex].texture) {} @@ -3410,7 +3410,7 @@ void func_80012F94(Object *obj) { } racerLightTimer *= 4; for (batchNum = 0; batchNum < temp_a1_3->numberOfBatches; batchNum++) { - if ((temp_a1_3->batches[batchNum].flags & 0x810000) == BATCH_FLAGS_TEXTURE_ANIM) { + if ((temp_a1_3->batches[batchNum].flags & 0x810000) == RENDER_TEX_ANIM) { temp_a1_3->batches[batchNum].unk7 = racerLightTimer; } } @@ -3746,9 +3746,9 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s i = startIndex; endLoop = FALSE; while (i < objModel->numberOfBatches && !endLoop) { - if (!(objModel->batches[i].flags & BATCH_FLAGS_UNK00000004) || flags & RENDER_SEMI_TRANSPARENT) { + if (!(objModel->batches[i].flags & RENDER_SEMI_TRANSPARENT) || flags & RENDER_SEMI_TRANSPARENT) { // Hidden/Invisible geometry - textureIndex = objModel->batches[i].flags & BATCH_FLAGS_HIDDEN; + textureIndex = objModel->batches[i].flags & RENDER_HIDDEN; // Probably a fakematch to use textureIndex here, but it works. if (!textureIndex) { vertOffset = objModel->batches[i].verticesOffset; @@ -3769,7 +3769,7 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s texEnabled = TRUE; texToSet = objModel->textures[textureIndex].texture; } - texToSetFlags = objModel->batches[i].flags | BATCH_FLAGS_UNK00000008; + texToSetFlags = objModel->batches[i].flags | RENDER_FOG_ACTIVE; if (flags & RENDER_SEMI_TRANSPARENT && !(objModel->batches[i].flags & (flags & ~RENDER_SEMI_TRANSPARENT))) { texToSetFlags |= RENDER_SEMI_TRANSPARENT; @@ -5988,7 +5988,7 @@ void obj_shade_fancy(ObjectModel *model, Object *object, s32 arg2, f32 intensity if (model->batches[i].unk6 != 0xFF) { dynamicLightingEnabled = -1; // This is a bit weird, but I guess it works. } - if (model->batches[i].flags & BATCH_FLAGS_ENVMAP) { + if (model->batches[i].flags & RENDER_ENVMAP) { environmentMappingEnabled = -1; } } @@ -6047,8 +6047,8 @@ void calc_env_mapping_for_object(ObjectModel *model, s16 zRot, s16 xRot, s16 yRo f32_matrix_to_s32_matrix(&objRotMtxF32, &objRotMtxS32); for (i = 0; i < model->numberOfBatches; i++) { - if (model->batches[i].flags & BATCH_FLAGS_ENVMAP) { - sp70 = ((model->batches[i].flags & BATCH_FLAGS_UNK00020000) | BATCH_FLAGS_ENVMAP) ^ BATCH_FLAGS_ENVMAP; + if (model->batches[i].flags & RENDER_ENVMAP) { + sp70 = ((model->batches[i].flags & RENDER_UNK_0020000) | RENDER_ENVMAP) ^ RENDER_ENVMAP; tex = model->textures[model->batches[i].textureIndex].texture; k = 0; diff --git a/src/textures_sprites.c b/src/textures_sprites.c index 7f6d1517..99bf2fde 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -1520,14 +1520,14 @@ void tex_animate_texture(TextureHeader *texture, u32 *triangleBatchInfoFlags, s3 s32 bit26Set; s32 breakVar; - bit23Set = *triangleBatchInfoFlags & BATCH_FLAGS_UNK00800000; - bit26Set = *triangleBatchInfoFlags & BATCH_FLAGS_UNK04000000; - bit25Set = *triangleBatchInfoFlags & BATCH_FLAGS_UNK02000000; + bit23Set = *triangleBatchInfoFlags & RENDER_UNK_0800000; + bit26Set = *triangleBatchInfoFlags & RENDER_UNK_4000000; + bit25Set = *triangleBatchInfoFlags & RENDER_UNK_2000000; if (bit23Set) { if (!bit25Set) { if (get_random_number_from_range(0, 1000) > 985) { - *triangleBatchInfoFlags &= ~BATCH_FLAGS_UNK04000000; - *triangleBatchInfoFlags |= BATCH_FLAGS_UNK02000000; + *triangleBatchInfoFlags &= ~RENDER_UNK_4000000; + *triangleBatchInfoFlags |= RENDER_UNK_2000000; } } else if (!bit26Set) { *arg2 += texture->frameAdvanceDelay * updateRate; @@ -1535,16 +1535,16 @@ void tex_animate_texture(TextureHeader *texture, u32 *triangleBatchInfoFlags, s3 *arg2 = ((texture->numOfTextures * 2) - *arg2) - 1; if (*arg2 < 0) { *arg2 = 0; - *triangleBatchInfoFlags &= ~(BATCH_FLAGS_UNK02000000 | BATCH_FLAGS_UNK04000000); + *triangleBatchInfoFlags &= ~(RENDER_UNK_2000000 | RENDER_UNK_4000000); } else { - *triangleBatchInfoFlags |= BATCH_FLAGS_UNK04000000; + *triangleBatchInfoFlags |= RENDER_UNK_4000000; } } } else { *arg2 -= texture->frameAdvanceDelay * updateRate; if (*arg2 < 0) { *arg2 = 0; - *triangleBatchInfoFlags &= ~(BATCH_FLAGS_UNK02000000 | BATCH_FLAGS_UNK04000000); + *triangleBatchInfoFlags &= ~(RENDER_UNK_2000000 | RENDER_UNK_4000000); } } } else if (bit25Set) { @@ -1557,12 +1557,12 @@ void tex_animate_texture(TextureHeader *texture, u32 *triangleBatchInfoFlags, s3 breakVar = FALSE; if (*arg2 < 0) { *arg2 = -*arg2; - *triangleBatchInfoFlags &= ~BATCH_FLAGS_UNK04000000; + *triangleBatchInfoFlags &= ~RENDER_UNK_4000000; breakVar = TRUE; } if (*arg2 >= texture->numOfTextures) { *arg2 = ((texture->numOfTextures * 2) - *arg2) - 1; - *triangleBatchInfoFlags |= BATCH_FLAGS_UNK04000000; + *triangleBatchInfoFlags |= RENDER_UNK_4000000; breakVar = TRUE; } } while (breakVar); diff --git a/src/textures_sprites.h b/src/textures_sprites.h index 5ca85c3c..6ccec09c 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -54,16 +54,18 @@ enum RenderFlags { RENDER_CLAMP_X = (1 << 6), // Prevent texture repeating on the X axis. RENDER_CLAMP_Y = (1 << 7), // Prevent texture repeating on the Y axis. RENDER_Z_UPDATE = (1 << 8), // Updates the depth buffer when rendering. + RENDER_HIDDEN = (1 << 8), // Shares a spot with Z update, as that's generally a given with level geometry. RENDER_PRESERVE_COVERAGE = (1 << 9), // Coverage is used to help smooth the image. This won't write over existing coverage values. + RENDER_UNK_200 = (1 << 9), // Shares a slot with coverage, being normal geometry doesn't care about coverage. RENDER_LINE_SWAP = (1 << 10), // Texture has swapped lines, for speed. Makes the load process slightly different. RENDER_DECAL = (1 << 11), // Projects a surface on existing geometry, taking precedent to not zfight. RENDER_UNK_0001000 = (1 << 12), - RENDER_UNK_0002000 = (1 << 13), - RENDER_UNK_0004000 = (1 << 14), - RENDER_UNK_0008000 = (1 << 15), - RENDER_UNK_0010000 = (1 << 16), + RENDER_WATER = (1 << 13), // Marks geometry as water. Not rendered if the block is utilising wavegen. + RENDER_NO_SHADOW = (1 << 14), // Do not render shadows on this geometry. + RENDER_ENVMAP = (1 << 15), // Calculate envmaps on this geometry. + RENDER_TEX_ANIM = (1 << 16), // Animated textures. RENDER_UNK_0020000 = (1 << 17), - RENDER_UNK_0040000 = (1 << 18), + RENDER_PULSING_LIGHTS = (1 << 18), // Use a different material to apply a pulsating colour effect. RENDER_UNK_0080000 = (1 << 19), RENDER_UNK_0100000 = (1 << 20), RENDER_UNK_0200000 = (1 << 21), @@ -73,7 +75,11 @@ enum RenderFlags { RENDER_UNK_2000000 = (1 << 25), RENDER_UNK_4000000 = (1 << 26), RENDER_VTX_ALPHA = (1 << 27), // Allows use of vertex alpha, disabling fog if necessary. - RENDER_ALL = 0xFFFFFFFF + RENDER_UNK_10000000 = (1 << 28), + RENDER_UNK_20000000 = (1 << 29), + RENDER_UNK_40000000 = (1 << 30), + RENDER_UNK_80000000 = (1 << 31), + RENDER_ALL = 0xFFFFFFFF }; typedef enum TextureRenderModes { diff --git a/src/tracks.c b/src/tracks.c index 51cb35ff..8f53b4f9 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -26,8 +26,7 @@ #define LEVEL_MODEL_MAX_SIZE 0x82A00 #define LEVEL_SEGMENT_MAX 128 -#define FLAGS_8002E904 \ - (BATCH_FLAGS_HIDDEN | BATCH_FLAGS_RECEIVE_SHADOWS | BATCH_FLAGS_WATER | BATCH_FLAGS_FORCE_NO_SHADOWS) +#define FLAGS_8002E904 (RENDER_HIDDEN | RENDER_DECAL | RENDER_WATER | RENDER_NO_SHADOW) /************ .data ************/ @@ -237,7 +236,7 @@ void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, } if (gWaveBlockCount) { - func_800B82B4(gCurrentLevelModel, gCurrentLevelHeader2, i); + waves_init(gCurrentLevelModel, gCurrentLevelHeader2, i); } cam_set_layout(numberOfPlayers); @@ -311,7 +310,7 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, Triangle **tris, s32 tempUpdateRate = updateRate; } if (gWaveBlockCount) { - func_800B9C18(tempUpdateRate); + waves_update(tempUpdateRate); } shadow_update(SHADOW_ACTORS, SHADOW_ACTORS, updateRate); for (i = 0; i < 7; i++) { @@ -766,7 +765,7 @@ void func_80026430(LevelModelSegment *segment, f32 arg1, f32 arg2, f32 arg3) { currFaceOffset = segment->batches[i].facesOffset; verticesOffset = segment->batches[i].verticesOffset; nextFaceOffset = segment->batches[i + 1].facesOffset; - if (segment->batches[i].flags & (BATCH_FLAGS_HIDDEN | BATCH_FLAGS_UNK00000200)) { + if (segment->batches[i].flags & (RENDER_HIDDEN | RENDER_UNK_200)) { currFaceOffset = nextFaceOffset; } for (j = currFaceOffset; j < nextFaceOffset; j++) { @@ -1293,12 +1292,12 @@ void animate_level_textures(s32 updateRate) { for (segmentNumber = 0; segmentNumber < gCurrentLevelModel->numberOfSegments; segmentNumber++) { batch = segment[segmentNumber].batches; for (batchNumber = 0; batchNumber < segment[segmentNumber].numberOfBatches; batchNumber++) { - if (batch[batchNumber].flags & BATCH_FLAGS_TEXTURE_ANIM) { + if (batch[batchNumber].flags & RENDER_TEX_ANIM) { if (batch[batchNumber].textureIndex != 0xFF) { texture = gCurrentLevelModel->textures[batch[batchNumber].textureIndex].texture; if (texture->numOfTextures != 0x100 && texture->frameAdvanceDelay) { temp = batch[batchNumber].unk7 << 6; - if (batch[batchNumber].flags & BATCH_FLAGS_UNK80000000) { + if (batch[batchNumber].flags & RENDER_UNK_80000000) { temp |= batch[batchNumber].unk6; tex_animate_texture(texture, &batch[batchNumber].flags, &temp, updateRate); batch[batchNumber].unk6 = temp & 0x3F; @@ -1687,7 +1686,7 @@ void initialise_player_viewport_vars(s32 updateRate) { gPrevCameraY = gSceneActiveCamera->trans.y_position; gPrevCameraZ = gSceneActiveCamera->trans.z_position; if (gWaveBlockCount != 0) { - func_800B8B8C(); + waves_visibility_reset(); racers = get_racer_objects(&numRacers); if (gSceneActiveCamera->mode != CAMERA_FINISH_RACE && numRacers > 0 && !check_if_showing_cutscene_camera()) { i = -1; @@ -1695,11 +1694,11 @@ void initialise_player_viewport_vars(s32 updateRate) { i++; racer = &racers[i]->unk64->racer; } while (i < numRacers - 1 && viewportID != racer->playerIndex); - func_800B8C04(racers[i]->segment.trans.x_position, racers[i]->segment.trans.y_position, - racers[i]->segment.trans.z_position, get_current_viewport(), updateRate); + waves_visibility(racers[i]->segment.trans.x_position, racers[i]->segment.trans.y_position, + racers[i]->segment.trans.z_position, get_current_viewport(), updateRate); } else { - func_800B8C04(gSceneActiveCamera->trans.x_position, gSceneActiveCamera->trans.y_position, - gSceneActiveCamera->trans.z_position, get_current_viewport(), updateRate); + waves_visibility(gSceneActiveCamera->trans.x_position, gSceneActiveCamera->trans.y_position, + gSceneActiveCamera->trans.z_position, get_current_viewport(), updateRate); } } get_current_level_header()->unk3 = 1; @@ -1825,7 +1824,7 @@ void render_level_geometry_and_objects(void) { } if (gWaveBlockCount != 0) { - func_800BA8E4(&gSceneCurrDisplayList, &gSceneCurrMatrix, get_current_viewport()); + waves_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, get_current_viewport()); } rendermode_reset(&gSceneCurrDisplayList); @@ -1903,7 +1902,7 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { //! @bug: batchInfo is uninitalized numberVertices = (batchInfo + 1)->verticesOffset - batchInfo->verticesOffset; segment = &gCurrentLevelModel->segments[segmentId]; - sp78 = (nonOpaque && gWaveBlockCount) ? func_800B9228(segment) : 0; + sp78 = (nonOpaque && gWaveBlockCount) ? waves_block_hq(segment) : 0; if (nonOpaque) { startPos = segment->numberofOpaqueBatches; endPos = segment->numberOfBatches; @@ -1914,7 +1913,7 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { for (i = startPos; i < endPos; i++) { batchInfo = &segment->batches[i]; textureFlags = RENDER_NONE; - isInvisible = batchInfo->flags & BATCH_FLAGS_HIDDEN; + isInvisible = batchInfo->flags & RENDER_HIDDEN; if (isInvisible) { continue; } @@ -1926,18 +1925,17 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { texture = gCurrentLevelModel->textures[batchInfo->textureIndex].texture; textureFlags = texture->flags; } - batchFlags |= BATCH_FLAGS_UNK00000008 | BATCH_FLAGS_UNK00000002; - if (!(batchFlags & BATCH_FLAGS_DEPTH_WRITE) && !(batchFlags & BATCH_FLAGS_RECEIVE_SHADOWS)) { + batchFlags |= RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; + if (!(batchFlags & RENDER_CUTOUT) && !(batchFlags & RENDER_DECAL)) { batchFlags |= gAntiAliasing; } - if ((!(textureFlags & RENDER_SEMI_TRANSPARENT) && !(batchFlags & BATCH_FLAGS_WATER)) || - batchFlags & BATCH_FLAGS_RECEIVE_SHADOWS) { + if ((!(textureFlags & RENDER_SEMI_TRANSPARENT) && !(batchFlags & RENDER_WATER)) || batchFlags & RENDER_DECAL) { renderBatch = TRUE; } if (nonOpaque) { renderBatch = (renderBatch + 1) & 1; } - if (sp78 && batchFlags & BATCH_FLAGS_WATER) { + if (sp78 && batchFlags & RENDER_WATER) { renderBatch = FALSE; } if (!renderBatch) { @@ -1963,7 +1961,7 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { } else { gDPSetEnvColor(gSceneCurrDisplayList++, 255, 255, 255, 0); } - if (batchFlags & BATCH_FLAGS_PULSATING_LIGHTS) { + if (batchFlags & RENDER_PULSING_LIGHTS) { color = gCurrentLevelHeader2->pulseLightData->outColorValue; gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, color, color, color, color); material_set_blinking_lights(&gSceneCurrDisplayList, texture, batchFlags, texOffset); @@ -2575,8 +2573,7 @@ s32 func_8002B0F4(s32 levelSegmentIndex, f32 xIn, f32 zIn, WaterProperties ***ar nextFaceOffset = currentBatch[1].facesOffset; currentVerticesOffset = currentBatch->verticesOffset; - if (temp_s2 != 11 && temp_s2 != 15 && - (currentBatch->flags & (BATCH_FLAGS_HIDDEN | BATCH_FLAGS_UNK00000200))) { + if (temp_s2 != 11 && temp_s2 != 15 && (currentBatch->flags & (RENDER_HIDDEN | RENDER_UNK_200))) { currentFaceOffset = nextFaceOffset; } @@ -2961,7 +2958,7 @@ void free_track(void) { racerfx_free(); if (gWaveBlockCount != 0) { - free_waves(); + waves_free(); } for (i = 0; i < gCurrentLevelModel->numberOfTextures; i++) { tex_free(gCurrentLevelModel->textures[i].texture); @@ -3574,10 +3571,9 @@ void func_8002DE30(Object *obj) { obj->segment.trans.x_position + 16.0f, obj->segment.trans.z_position + 16.0f); block = &gCurrentLevelModel->segments[blockId]; for (i = 0; i < block->numberOfBatches && !foundResult; i++) { - if (!(block->batches[i].flags & (BATCH_FLAGS_HIDDEN | BATCH_FLAGS_RECEIVE_SHADOWS | BATCH_FLAGS_WATER | - BATCH_FLAGS_FORCE_NO_SHADOWS))) { + if (!(block->batches[i].flags & (RENDER_HIDDEN | RENDER_DECAL | RENDER_WATER | RENDER_NO_SHADOW))) { batchFlags = (block->batches[i].flags >> 19) & - (BATCH_FLAGS_UNK00000001 | BATCH_FLAGS_UNK00000002 | BATCH_FLAGS_UNK00000004); + (RENDER_ANTI_ALIASING | RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT); vertices = &block->vertices[block->batches[i].verticesOffset]; for (j = block->batches[i].facesOffset; j < block->batches[i + 1].facesOffset && !foundResult; j++) { blockId = block->unk10[j] & var_t3; @@ -3752,7 +3748,7 @@ void func_8002E904(LevelModelSegment *arg0, s32 arg1, s32 arg2) { spD0[3].y = gNewShadowObj->segment.trans.z_position - gNewShadowLength; for (spAC = 0; spAC < arg0->numberOfBatches; spAC++) { - if ((arg2 && (arg0->batches[spAC].flags & BATCH_FLAGS_WATER)) || + if ((arg2 && (arg0->batches[spAC].flags & RENDER_WATER)) || (!arg2 && !(arg0->batches[spAC].flags & FLAGS_8002E904))) { curFacesOffset = arg0->batches[spAC].facesOffset; nextFacesOffset = arg0->batches[spAC + 1].facesOffset; diff --git a/src/tracks.h b/src/tracks.h index 797bb420..e94f9ac4 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -10,42 +10,6 @@ #define LOCAL_OFFSET_TO_RAM_ADDRESS(type, ptr) \ ptr = (type)((s32)((u8*)ptr) + (s32)((u8*)mdl)) -enum TriangleBatchFlags { - BATCH_FLAGS_NONE = 0, - BATCH_FLAGS_UNK00000001 = (1 << 0), - BATCH_FLAGS_UNK00000002 = (1 << 1), - BATCH_FLAGS_UNK00000004 = (1 << 2), - BATCH_FLAGS_UNK00000008 = (1 << 3), - BATCH_FLAGS_DEPTH_WRITE = (1 << 4), - BATCH_FLAGS_UNK00000020 = (1 << 5), - BATCH_FLAGS_UNK00000040 = (1 << 6), - BATCH_FLAGS_UNK00000080 = (1 << 7), - BATCH_FLAGS_HIDDEN = (1 << 8), - BATCH_FLAGS_UNK00000200 = (1 << 9), - BATCH_FLAGS_UNK00000400 = (1 << 10), - BATCH_FLAGS_RECEIVE_SHADOWS = (1 << 11), - BATCH_FLAGS_UNK00001000 = (1 << 12), - BATCH_FLAGS_WATER = (1 << 13), - BATCH_FLAGS_FORCE_NO_SHADOWS = (1 << 14), - BATCH_FLAGS_ENVMAP = (1 << 15), - BATCH_FLAGS_TEXTURE_ANIM = (1 << 16), - BATCH_FLAGS_UNK00020000 = (1 << 17), - BATCH_FLAGS_PULSATING_LIGHTS = (1 << 18), - BATCH_FLAGS_UNK00080000 = (1 << 19), - BATCH_FLAGS_UNK00100000 = (1 << 20), - BATCH_FLAGS_UNK00200000 = (1 << 21), - BATCH_FLAGS_UNK00400000 = (1 << 22), - BATCH_FLAGS_UNK00800000 = (1 << 23), - BATCH_FLAGS_UNK01000000 = (1 << 24), - BATCH_FLAGS_UNK02000000 = (1 << 25), - BATCH_FLAGS_UNK04000000 = (1 << 26), - BATCH_FLAGS_UNK08000000 = (1 << 27), - BATCH_FLAGS_UNK10000000 = (1 << 28), - BATCH_FLAGS_UNK20000000 = (1 << 29), - BATCH_FLAGS_UNK40000000 = (1 << 30), - BATCH_FLAGS_UNK80000000 = (1 << 31), -}; - enum ShadowUpdate { SHADOW_NONE, SHADOW_SCENERY, @@ -214,8 +178,8 @@ void func_80028050(void); void initialise_player_viewport_vars(s32); void func_8002A31C(void); void update_colour_cycle(LevelHeader_70 *arg0, s32 updateRate); -void func_800B9C18(s32); -void func_800BA8E4(Gfx**, MatrixS**, s32); +void waves_update(s32); +void waves_render(Gfx**, MatrixS**, s32); void func_8002DE30(Object*); void shadow_generate(Object*, s32); void func_8002E904(LevelModelSegment *, s32, s32 arg2); @@ -225,7 +189,7 @@ void func_8002F440(void); f32 func_8002FA64(void); s32 func_8002BAB0(s32 levelSegmentIndex, f32 xIn, f32 zIn, f32 *yOut); void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, u32 entranceId, u32 collectables, u32 arg6); -void func_800B82B4(LevelModel *, LevelHeader *, s32); +void waves_init(LevelModel *, LevelHeader *, s32); void func_80025510(s32); void func_8002C0C4(s32 modelId); void func_800304C8(unk8011C8B8 *arg0); diff --git a/src/waves.c b/src/waves.c index 25fd1467..76e47945 100644 --- a/src/waves.c +++ b/src/waves.c @@ -9,11 +9,13 @@ #include "math_util.h" #include "PRinternal/viint.h" +#include "printf.h" + /************ .data ************/ -f32 *D_800E3040 = NULL; // indexed by values of D_800E3044 -Vec2s *D_800E3044 = NULL; // holds some sort of index? -TexCoords *D_800E3048 = NULL; +f32 *gWaveHeightTable = NULL; // indexed by values of gWaveHeightIndices +Vec2s *gWaveHeightIndices = NULL; // holds some sort of index? +TexCoords *gWaveUVTable = NULL; f32 *D_800E304C[9] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; Vertex *gWaveVertices[4][1] = { { NULL }, { NULL } }; @@ -26,11 +28,11 @@ Triangle D_800E3090[4] = { }; TextureHeader *gWaveTextureHeader = NULL; -s32 *D_800E30D4 = NULL; // indexed by D_800E30D8.unkC -LevelModel_Alternate *D_800E30D8 = NULL; -s32 D_800E30DC = 0; // Tracks an index into D_8012A1E8 -s16 *D_800E30E0 = NULL; // Points to either D_800E30E8 or D_800E3110 and is used for D_800E30D4 -s16 *D_800E30E4 = NULL; // Points to either D_800E30FC or D_800E3144 and is used to index D_800E304C +s32 *D_800E30D4 = NULL; // indexed by gWaveModel.unkC +LevelModel_Alternate *gWaveModel = NULL; +s32 gVisibleWaveTiles = 0; // Tracks an index into gWaveBlockIDs +s16 *D_800E30E0 = NULL; // Points to either D_800E30E8 or D_800E3110 and is used for D_800E30D4 +s16 *D_800E30E4 = NULL; // Points to either D_800E30FC or D_800E3144 and is used to index D_800E304C s16 D_800E30E8[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; @@ -41,13 +43,13 @@ s16 D_800E3110[26] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 s16 D_800E3144[26] = { 0, 1, 1, 1, 2, 3, 4, 4, 4, 5, 3, 4, 4, 4, 5, 3, 4, 4, 4, 5, 6, 7, 7, 7, 8, 0 }; u8 *D_800E3178 = NULL; -s32 D_800E317C = 0; // some sort of count? Relative to D_80129FC8.unk0 +s32 gWaveTileTotal = 0; // some sort of count? Relative to gWaveController.subdivisions LevelHeader_70 *D_800E3180 = NULL; -unk800E3184 *D_800E3184 = NULL; // tracks an index into D_800E3190 -s32 D_800E3188 = 0; // counter for something, incremented in func_800BF634, decremented in func_800BF3E4 -s32 D_800E318C = 0; // used in mempool_alloc_safe size calculation, multiplied with 8 -unk800E3190 *D_800E3190 = NULL; -Object **D_800E3194 = NULL; // might be a length of 32 +unk800E3184 *D_800E3184 = NULL; // tracks an index into gWaveGenList +s32 gWaveGenCount = 0; // counter for something, incremented in wavegen_register, decremented in wavegen_destroy +s32 gWaveTileGridCount = 0; // used in mempool_alloc_safe size calculation, multiplied with 8 +WaveGen *gWaveGenList = NULL; +Object **gWaveGenObjs = NULL; // might be a length of 32 Object *gWaveGeneratorObj = NULL; /*******************************/ @@ -56,51 +58,48 @@ Object *gWaveGeneratorObj = NULL; const char D_800E9160[] = "\nCouldn't find a block to pick wave details from.\nUsing block 0 as default."; const char D_800E91AC[] = "\n\nBlock may be specified using 'P' on water group node."; -const char D_800E91E4[] = "\nError :: can not remove a wave swell object which doesn't exist !"; -const char D_800E9228[] = "\nError :: more than eight swells overlap on column %d."; -const char D_800E9260[] = "\nError :: can not add another wave swell, reached limit of %d."; /*********************************/ /************ .bss ************/ Gfx *gWaveDL; -MatrixS *D_80129FC4; -unk80129FC8 D_80129FC8; // holds lots of control information used in this file -s32 gWaveVertexFlip; // either 1 or 0, toggled in func_800B9C18, used to index vertices and triangles -f32 D_8012A01C; // is set to lowest value of D_800E3040 -f32 D_8012A020; // is set to highest value of D_800E3040 +MatrixS *gWaveMtx; +WaveControl gWaveController; // holds lots of control information used in this file +s32 gWaveVertexFlip; // either 1 or 0, toggled in waves_update, used to index vertices and triangles +f32 gWaveLowerY; // is set to lowest value of gWaveHeightTable +f32 gWaveUpperY; // is set to highest value of gWaveHeightTable UNUSED s32 D_8012A024; -Vertex D_8012A028[2][4]; // stores values of gWaveVertices to be used in func_800BA8E4 +Vertex D_8012A028[2][4]; // stores values of gWaveVertices to be used in waves_render s32 gWavePlayerCount; // controls whether 2 or 4 items are used in gWaveVertices / gWaveTriangles TriangleBatchInfo *gWaveBatch; TextureHeader *gWaveTexture; -s32 D_8012A084; // u value for D_800E3048 -s32 D_8012A088; // v value for D_800E3048 -s32 D_8012A08C; // is added onto u of D_8012A084, is multiplied with texture width -s32 D_8012A090; // is added onto v of D_8012A084, is multiplied with texture height -s32 D_8012A094; // bitmask / something width (related to texture) -s32 D_8012A098; // bitmask / something height (related to texture) -s32 D_8012A09C; // stores / relates to frameAdvanceDelay, used in func_800BA8E4 -f32 D_8012A0A0; // copy of gWaveBoundingBoxDiffX -f32 D_8012A0A4; // copy of gWaveBoundingBoxDiffZ +s32 gWaveUVBaseX; // u value for gWaveUVTable +s32 gWaveUVBaseY; // v value for gWaveUVTable +s32 gWaveUVStepX; // is added onto u of gWaveUVBaseX, is multiplied with texture width +s32 gWaveUVStepY; // is added onto v of gWaveUVBaseX, is multiplied with texture height +s32 gWaveTexUVMaskX; // bitmask / something width (related to texture) +s32 gWaveTexUVMaskY; // bitmask / something height (related to texture) +s32 gWaveTexAnimFrame; // stores / relates to frameAdvanceDelay, used in waves_render +f32 gWaveBoundingBoxW; // copy of gWaveBoundingBoxDiffX +f32 gWaveBoundingBoxH; // copy of gWaveBoundingBoxDiffZ s32 gWaveBoundingBoxDiffX; s32 gWaveBoundingBoxDiffZ; s32 gWaveBoundingBoxX1; s32 gWaveBoundingBoxZ1; -f32 D_8012A0B8; // some sort of ratio for x -f32 D_8012A0BC; // some sort of ratio for z -s32 D_8012A0C0; // level bounding box x1 -s32 D_8012A0C4; // level bounding box x2 -s32 D_8012A0C8; // level bounding box z1 -s32 D_8012A0CC; // level bounding box x2 -s32 D_8012A0D0; // copy of gWaveBoundingBoxX1 -s32 D_8012A0D4; // copy of gWaveBoundingBoxZ1 -s32 D_8012A0D8; // used in mempool_alloc_safe size calculation -s32 D_8012A0DC; // used in mempool_alloc_safe size calculation +f32 gWaveVtxStepX; // some sort of ratio for x +f32 gWaveVtxStepZ; // some sort of ratio for z +s32 gWaveBlockBoundsX1; // level bounding box x1 +s32 gWaveBlockBoundsZ1; // level bounding box x2 +s32 gWaveBlockBoundsX2; // level bounding box z1 +s32 gWaveBlockBoundsZ2; // level bounding box x2 +s32 gWaveBlockPosX; // copy of gWaveBoundingBoxX1 +s32 gWaveBlockPosZ; // copy of gWaveBoundingBoxZ1 +s32 gWaveTileCountX; // used in mempool_alloc_safe size calculation +s32 gWaveTileCountZ; // used in mempool_alloc_safe size calculation s32 gNumberOfLevelSegments; s32 D_8012A0E8[64]; -s16 D_8012A1E8[512]; // used to index D_800E30D8 and as arg0 for func_800B92F4 and func_800B97A8 +s16 gWaveBlockIDs[512]; // used to index gWaveModel and as arg0 for func_800B92F4 and func_800B97A8 unk8012A5E8 D_8012A5E8[2]; unk8012A5E8 D_8012A600[24]; f32 gWavePowerBase; @@ -122,105 +121,120 @@ s32 gWavePowerDivisor; tex = NULL; \ } -void free_waves(void) { +/** + * Free all Wavegen data from memory. + * Has safety checks to ensure what it's freeing exists, first. + */ +void waves_free(void) { TextureHeader *tempTex; s32 *tempMem; - FREE_MEM(D_800E3040); - FREE_MEM(D_800E3044); - FREE_MEM(D_800E3048); + FREE_MEM(gWaveHeightTable); + FREE_MEM(gWaveHeightIndices); + FREE_MEM(gWaveUVTable); FREE_MEM(D_800E304C[0]); FREE_MEM(gWaveVertices[0][0]); FREE_MEM(gWaveTriangles[0][0]); FREE_TEX(gWaveTextureHeader); FREE_MEM(D_800E30D4); - FREE_MEM(D_800E30D8); + FREE_MEM(gWaveModel); FREE_MEM(D_800E3178); - D_800E3190 = NULL; - D_800E3194 = NULL; + gWaveGenList = NULL; + gWaveGenObjs = NULL; D_800E3184 = NULL; - D_800E3188 = 0; + gWaveGenCount = 0; } -void wave_init(void) { +/** + * Allocates and sets up pointers for all wave geometry and data. + * Allocates a set for each viewport, up to 2. + * Calls waves_free as a precautionary. + */ +void waves_alloc(void) { s32 temp; s32 allocSize; s32 i; - free_waves(); - D_800E3040 = (f32 *) mempool_alloc_safe(D_80129FC8.unk20 * sizeof(f32 *), COLOUR_TAG_CYAN); - D_800E3044 = (Vec2s *) mempool_alloc_safe((D_80129FC8.unk4 * sizeof(Vec2s *)) * D_80129FC8.unk4, COLOUR_TAG_CYAN); - D_800E3048 = (TexCoords *) mempool_alloc_safe(((D_80129FC8.unk0 + 1) * sizeof(TexCoords *)) * (D_80129FC8.unk0 + 1), - COLOUR_TAG_CYAN); - allocSize = ((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1); + waves_free(); + gWaveHeightTable = (f32 *) mempool_alloc_safe(gWaveController.seedSize * sizeof(f32), COLOUR_TAG_CYAN); + gWaveHeightIndices = (Vec2s *) mempool_alloc_safe( + (gWaveController.tileCount * sizeof(Vec2s *)) * gWaveController.tileCount, COLOUR_TAG_CYAN); + gWaveUVTable = (TexCoords *) mempool_alloc_safe(((gWaveController.subdivisions + 1) * sizeof(TexCoords *)) * + (gWaveController.subdivisions + 1), + COLOUR_TAG_CYAN); + allocSize = ((gWaveController.subdivisions + 1) << 2) * (gWaveController.subdivisions + 1); D_800E304C[0] = mempool_alloc_safe(allocSize * ARRAY_COUNT(D_800E304C), COLOUR_TAG_CYAN); for (i = 1; i < ARRAY_COUNT(D_800E304C); i++) { D_800E304C[i] = (f32 *) (((u32) D_800E304C[0]) + (allocSize * i)); } - temp = (D_80129FC8.unk0 + 1); - allocSize = (temp * 250 * (D_80129FC8.unk0 + 1)); - if (gWavePlayerCount != 2) { + temp = (gWaveController.subdivisions + 1); + allocSize = (temp * 250 * (gWaveController.subdivisions + 1)); + if (gWavePlayerCount != 2) { // 1 player gWaveVertices[0][0] = (Vertex *) mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); gWaveVertices[1][0] = (Vertex *) (((u32) gWaveVertices[0][0]) + allocSize); - } else { + } else { // 2 Player gWaveVertices[0][0] = (Vertex *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); gWaveVertices[1][0] = (Vertex *) (((u32) gWaveVertices[0][0]) + allocSize); gWaveVertices[2][0] = (Vertex *) (((u32) gWaveVertices[1][0]) + allocSize); gWaveVertices[3][0] = (Vertex *) (((u32) gWaveVertices[2][0]) + allocSize); } - allocSize = (D_80129FC8.unk0 * 32) * D_80129FC8.unk0; - if (gWavePlayerCount != 2) { + allocSize = (gWaveController.subdivisions * 32) * gWaveController.subdivisions; + if (gWavePlayerCount != 2) { // 1 Player gWaveTriangles[0][0] = mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); gWaveTriangles[1][0] = (Triangle *) (((u32) gWaveTriangles[0][0]) + allocSize); - } else { + } else { // 2 Player gWaveTriangles[0][0] = (Triangle *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); gWaveTriangles[1][0] = (Triangle *) (((u32) gWaveTriangles[0][0]) + allocSize); gWaveTriangles[2][0] = (Triangle *) (((u32) gWaveTriangles[1][0]) + allocSize); gWaveTriangles[3][0] = (Triangle *) (((u32) gWaveTriangles[2][0]) + allocSize); } - gWaveTextureHeader = load_texture(D_80129FC8.textureId); + gWaveTextureHeader = load_texture(gWaveController.textureId); } -void func_800B8134(LevelHeader *header) { +/** + * Initialise wave controller variables using the level header. + * Two player waves hardset the subdivision level to 4. + */ +void waves_init_header(LevelHeader *header) { if (gWavePlayerCount != 2) { - D_80129FC8.unk0 = header->unk56; + gWaveController.subdivisions = header->waveSubdivisons; } else { - D_80129FC8.unk0 = 4; + gWaveController.subdivisions = 4; } - D_80129FC8.unk4 = header->unk57; - D_80129FC8.unk8 = header->unk58; - D_80129FC8.unkC = header->unk5A / 256.0f; - D_80129FC8.unk10 = header->unk59 << 8; - D_80129FC8.unk14 = header->unk5C; - D_80129FC8.unk18 = header->unk5E / 256.0f; - D_80129FC8.unk1C = header->unk5D << 8; - D_80129FC8.unk20 = header->unk60 & ~1; + gWaveController.tileCount = header->unk57; + gWaveController.initSine[0].sineStep = header->waveSineStep0; + gWaveController.initSine[0].height = header->waveSineHeight0 / 256.0f; + gWaveController.initSine[0].sineBase = header->waveSineBase0 << 8; + gWaveController.initSine[1].sineStep = header->waveSineStep1; + gWaveController.initSine[1].height = header->waveSineHeight1 / 256.0f; + gWaveController.initSine[1].sineBase = header->waveSineBase1 << 8; + gWaveController.seedSize = header->waveSeedSize & ~1; // Always an even number. if (gWavePlayerCount != 2) { - D_80129FC8.unk24 = header->unk6E; + gWaveController.waveViewDist = header->waveViewDist; } else { - D_80129FC8.unk24 = 3; + gWaveController.waveViewDist = 3; } - D_80129FC8.unk28 = header->unk71; - D_80129FC8.textureId = header->textureId & 0xFFFF; - D_80129FC8.unk30 = header->unk6A; - D_80129FC8.unk34 = header->unk6B; - D_80129FC8.unk38 = header->unk6C; - D_80129FC8.unk3C = header->unk6D; - D_80129FC8.magnitude = header->wavePower / 256.0f; - D_80129FC8.unk44 = header->unk64 / 256.0f; - D_80129FC8.unk48 = header->unk66 / 256.0f; - D_80129FC8.darkVertexColours = header->darkVertexColours; + gWaveController.doubleDensity = header->waveDoubleDensity; + gWaveController.textureId = header->waveTexID & 0xFFFF; + gWaveController.uvScaleX = header->waveUVScaleX; + gWaveController.uvScaleY = header->waveUVScaleY; + gWaveController.uvScrollX = header->waveUVScrollX; + gWaveController.uvScrollY = header->waveUVScrollY; + gWaveController.magnitude = header->wavePower / 256.0f; + gWaveController.unk44 = header->unk64 / 256.0f; + gWaveController.unk48 = header->unk66 / 256.0f; + gWaveController.xlu = header->wavesXlu; } -void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { +void waves_init(LevelModel *model, LevelHeader *header, s32 playerCount) { s32 k; - s32 var_fp; + s32 sineVar2; s32 j_2; s32 var_s3; s32 var_s5; - s32 var_s6; - s32 sp54; + s32 sineVar1; + s32 sineStep1; s32 i; - s32 sp4C; + s32 sineStep2; s32 j; s32 i_2; s32 var_t0; @@ -230,48 +244,49 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { s32 var_t2; gWavePlayerCount = playerCount; - func_800B8134(header); - wave_init(); + waves_init_header(header); + waves_alloc(); func_800BBDDC(model, header); - D_8012A0A0 = gWaveBoundingBoxDiffX; - D_8012A0A4 = gWaveBoundingBoxDiffZ; - D_8012A0B8 = D_8012A0A0 / D_80129FC8.unk0; - D_8012A0BC = D_8012A0A4 / D_80129FC8.unk0; - D_8012A084 = 0; - D_8012A088 = 0; - D_8012A08C = ((gWaveTexture->width * D_80129FC8.unk30) * 32) / D_80129FC8.unk0; - D_8012A090 = ((gWaveTexture->height * D_80129FC8.unk34) * 32) / D_80129FC8.unk0; - D_8012A094 = (gWaveTexture->width * 32) - 1; - D_8012A098 = (gWaveTexture->height * 32) - 1; - D_8012A09C = 0; - var_s6 = D_80129FC8.unk10; - sp54 = (D_80129FC8.unk8 << 16) / D_80129FC8.unk20; - var_fp = D_80129FC8.unk1C; - sp4C = (D_80129FC8.unk14 << 16) / D_80129FC8.unk20; - D_8012A01C = 10000.0f; - D_8012A020 = -10000.0f; - for (i_2 = 0; i_2 < D_80129FC8.unk20; i_2++) { - D_800E3040[i_2] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); - if (D_80129FC8.unk28 != FALSE) { - D_800E3040[i_2] *= 2.0f; + gWaveBoundingBoxW = gWaveBoundingBoxDiffX; + gWaveBoundingBoxH = gWaveBoundingBoxDiffZ; + gWaveVtxStepX = gWaveBoundingBoxW / gWaveController.subdivisions; + gWaveVtxStepZ = gWaveBoundingBoxH / gWaveController.subdivisions; + gWaveUVBaseX = 0; + gWaveUVBaseY = 0; + gWaveUVStepX = ((gWaveTexture->width * gWaveController.uvScaleX) * 32) / gWaveController.subdivisions; + gWaveUVStepY = ((gWaveTexture->height * gWaveController.uvScaleY) * 32) / gWaveController.subdivisions; + gWaveTexUVMaskX = (gWaveTexture->width * 32) - 1; + gWaveTexUVMaskY = (gWaveTexture->height * 32) - 1; + gWaveTexAnimFrame = 0; + sineVar1 = gWaveController.initSine[0].sineBase; + sineStep1 = (gWaveController.initSine[0].sineStep << 16) / gWaveController.seedSize; + sineVar2 = gWaveController.initSine[1].sineBase; + sineStep2 = (gWaveController.initSine[1].sineStep << 16) / gWaveController.seedSize; + gWaveLowerY = 10000.0f; + gWaveUpperY = -10000.0f; + for (i_2 = 0; i_2 < gWaveController.seedSize; i_2++) { + gWaveHeightTable[i_2] = (sins_f(sineVar1) * gWaveController.initSine[0].height) + + (gWaveController.initSine[1].height * sins_f(sineVar2)); + if (gWaveController.doubleDensity) { + gWaveHeightTable[i_2] *= 2.0f; } - if (D_800E3040[i_2] < D_8012A01C) { - D_8012A01C = D_800E3040[i_2]; + if (gWaveHeightTable[i_2] < gWaveLowerY) { + gWaveLowerY = gWaveHeightTable[i_2]; } - if (D_8012A020 < D_800E3040[i_2]) { - D_8012A020 = D_800E3040[i_2]; + if (gWaveUpperY < gWaveHeightTable[i_2]) { + gWaveUpperY = gWaveHeightTable[i_2]; } - var_s6 += sp54; - var_fp += sp4C; + sineVar1 += sineStep1; + sineVar2 += sineStep2; }; save_rng_seed(); set_rng_seed(0x57415646); var_s5 = 0; - for (i_2 = 0; i_2 < D_80129FC8.unk4; i_2++) { - for (j_2 = 0; j_2 < D_80129FC8.unk4; j_2++) { - D_800E3044[var_s5].s[0] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); - D_800E3044[var_s5].s[1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + for (i_2 = 0; i_2 < gWaveController.tileCount; i_2++) { + for (j_2 = 0; j_2 < gWaveController.tileCount; j_2++) { + gWaveHeightIndices[var_s5].s[0] = get_random_number_from_range(0, gWaveController.seedSize - 1); + gWaveHeightIndices[var_s5].s[1] = get_random_number_from_range(0, gWaveController.seedSize - 1); var_s5++; } } @@ -284,14 +299,14 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { playerCount = 4; } for (var_s3 = 0; var_s3 < 25; var_s3++) { - if (0 <= D_80129FC8.unk0) { + if (0 <= gWaveController.subdivisions) { do { - for (j_2 = 0; D_80129FC8.unk0 >= j_2; j_2++) { + for (j_2 = 0; gWaveController.subdivisions >= j_2; j_2++) { for (k = 0; k < playerCount; k++) { - gWaveVertices[0][k][var_s5].x = (j_2 * D_8012A0B8) + 0.5; - gWaveVertices[0][k][var_s5].z = (i_2 * D_8012A0BC) + 0.5; + gWaveVertices[0][k][var_s5].x = (j_2 * gWaveVtxStepX) + 0.5; + gWaveVertices[0][k][var_s5].z = (i_2 * gWaveVtxStepZ) + 0.5; // this is only 0 for hot top volcano - if (D_80129FC8.darkVertexColours == 0) { + if (gWaveController.xlu == FALSE) { gWaveVertices[0][k][var_s5].r = 255; gWaveVertices[0][k][var_s5].g = 255; gWaveVertices[0][k][var_s5].b = 255; @@ -305,24 +320,24 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { var_s5++; } i_2++; - } while (D_80129FC8.unk0 >= i_2); + } while (gWaveController.subdivisions >= i_2); i_2 = 0; } } var_s5 = 0; - for (i_2 = 0; i_2 < D_80129FC8.unk0; i_2++) { - for (j_2 = 0; j_2 < D_80129FC8.unk0; j_2++) { + for (i_2 = 0; i_2 < gWaveController.subdivisions; i_2++) { + for (j_2 = 0; j_2 < gWaveController.subdivisions; j_2++) { for (k = 0; k < playerCount; k++) { gWaveTriangles[0][k][var_s5].flags = BACKFACE_DRAW; gWaveTriangles[0][k][var_s5].vi0 = j_2; - gWaveTriangles[0][k][var_s5].vi1 = (j_2 + D_80129FC8.unk0) + 1; + gWaveTriangles[0][k][var_s5].vi1 = (j_2 + gWaveController.subdivisions) + 1; gWaveTriangles[0][k][var_s5].vi2 = j_2 + 1; var_s5++; gWaveTriangles[0][k][var_s5].flags = BACKFACE_DRAW; gWaveTriangles[0][k][var_s5].vi0 = j_2 + 1; - gWaveTriangles[0][k][var_s5].vi1 = (j_2 + D_80129FC8.unk0) + 1; - gWaveTriangles[0][k][var_s5].vi2 = (j_2 + D_80129FC8.unk0) + 2; + gWaveTriangles[0][k][var_s5].vi1 = (j_2 + gWaveController.subdivisions) + 1; + gWaveTriangles[0][k][var_s5].vi2 = (j_2 + gWaveController.subdivisions) + 2; var_s5--; } var_s5 += 2; @@ -330,7 +345,7 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { } func_800BC6C8(); - var_s5 = (D_80129FC8.unk0 + 1) * D_80129FC8.unk0; + var_s5 = (gWaveController.subdivisions + 1) * gWaveController.subdivisions; for (i = 0; i < ARRAY_COUNT(D_8012A028); i++) { D_8012A028[i][0].x = gWaveVertices[i][0][0].x; D_8012A028[i][0].y = 0; @@ -340,13 +355,13 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { D_8012A028[i][0].b = gWaveVertices[i][0][0].b; D_8012A028[i][0].a = gWaveVertices[i][0][0].a; - D_8012A028[i][1].x = gWaveVertices[i][0][D_80129FC8.unk0].x; + D_8012A028[i][1].x = gWaveVertices[i][0][gWaveController.subdivisions].x; D_8012A028[i][1].y = 0; - D_8012A028[i][1].z = gWaveVertices[i][0][D_80129FC8.unk0].z; - D_8012A028[i][1].r = gWaveVertices[i][0][D_80129FC8.unk0].r; - D_8012A028[i][1].g = gWaveVertices[i][0][D_80129FC8.unk0].g; - D_8012A028[i][1].b = gWaveVertices[i][0][D_80129FC8.unk0].b; - D_8012A028[i][1].a = gWaveVertices[i][0][D_80129FC8.unk0].a; + D_8012A028[i][1].z = gWaveVertices[i][0][gWaveController.subdivisions].z; + D_8012A028[i][1].r = gWaveVertices[i][0][gWaveController.subdivisions].r; + D_8012A028[i][1].g = gWaveVertices[i][0][gWaveController.subdivisions].g; + D_8012A028[i][1].b = gWaveVertices[i][0][gWaveController.subdivisions].b; + D_8012A028[i][1].a = gWaveVertices[i][0][gWaveController.subdivisions].a; D_8012A028[i][2].x = gWaveVertices[i][0][var_s5].x; D_8012A028[i][2].y = 0; @@ -356,40 +371,43 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 playerCount) { D_8012A028[i][2].b = gWaveVertices[i][0][var_s5].b; D_8012A028[i][2].a = gWaveVertices[i][0][var_s5].a; - D_8012A028[i][3].x = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].x; + D_8012A028[i][3].x = gWaveVertices[i][0][var_s5 + gWaveController.subdivisions].x; D_8012A028[i][3].y = 0; - D_8012A028[i][3].z = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].z; - D_8012A028[i][3].r = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].r; - D_8012A028[i][3].g = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].g; - D_8012A028[i][3].b = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].b; - D_8012A028[i][3].a = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].a; + D_8012A028[i][3].z = gWaveVertices[i][0][var_s5 + gWaveController.subdivisions].z; + D_8012A028[i][3].r = gWaveVertices[i][0][var_s5 + gWaveController.subdivisions].r; + D_8012A028[i][3].g = gWaveVertices[i][0][var_s5 + gWaveController.subdivisions].g; + D_8012A028[i][3].b = gWaveVertices[i][0][var_s5 + gWaveController.subdivisions].b; + D_8012A028[i][3].a = gWaveVertices[i][0][var_s5 + gWaveController.subdivisions].a; } func_800BCC70(model); - if (D_80129FC8.unk24 == 3) { + if (gWaveController.waveViewDist == 3) { D_800E30E0 = D_800E30E8; D_800E30E4 = D_800E30FC; } else { - D_80129FC8.unk24 = 5; + gWaveController.waveViewDist = 5; D_800E30E0 = D_800E3110; D_800E30E4 = D_800E3144; } - D_800E3188 = 0; + gWaveGenCount = 0; gWavePowerDivisor = 0; gWaveGeneratorObj = NULL; gWaveVertexFlip = 0; } -void func_800B8B8C(void) { +/** + * Set wave visiblity variables to zero. + */ +void waves_visibility_reset(void) { s32 i; - D_800E30DC = 0; - for (i = 0; i < D_8012A0D8 * D_8012A0DC; i++) { + gVisibleWaveTiles = 0; + for (i = 0; i < gWaveTileCountX * gWaveTileCountZ; i++) { D_800E30D4[i] = 0; } } -void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewport, s32 updateRate) { +void waves_visibility(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewport, s32 updateRate) { s32 xPosRatio; s32 zPosRatio; s32 tempXPosRatio; @@ -397,28 +415,28 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp s32 var_s5; u32 var_t2; s32 var_t5; - s32 var_v0; + s32 i; s32 var_s4; s32 var_a3; - s32 var_s6; + s32 blockDist; - xPosRatio = (xPosition - D_8012A0D0) / gWaveBoundingBoxDiffX; - zPosRatio = (zPosition - D_8012A0D4) / gWaveBoundingBoxDiffZ; + xPosRatio = (xPosition - gWaveBlockPosX) / gWaveBoundingBoxDiffX; + zPosRatio = (zPosition - gWaveBlockPosZ) / gWaveBoundingBoxDiffZ; if (0) {} for (var_v1 = 0; var_v1 != ARRAY_COUNT(D_8012A600); var_v1 += 4) { - D_8012A5E8[0].unk0 = -1; - D_8012A5E8[1].unk0 = -1; - D_8012A600[var_v1].unk0 = -1; - D_8012A600[var_v1 + 1].unk0 = -1; - D_8012A600[var_v1 + 2].unk0 = -1; - D_8012A600[var_v1 + 3].unk0 = -1; + D_8012A5E8[0].blockID = -1; + D_8012A5E8[1].blockID = -1; + D_8012A600[var_v1].blockID = -1; + D_8012A600[var_v1 + 1].blockID = -1; + D_8012A600[var_v1 + 2].blockID = -1; + D_8012A600[var_v1 + 3].blockID = -1; } - if (D_80129FC8.unk28 != 0) { - xPosition -= (xPosRatio * gWaveBoundingBoxDiffX) + D_8012A0D0; - zPosition -= (zPosRatio * gWaveBoundingBoxDiffZ) + D_8012A0D4; + if (gWaveController.doubleDensity) { + xPosition -= (xPosRatio * gWaveBoundingBoxDiffX) + gWaveBlockPosX; + zPosition -= (zPosRatio * gWaveBoundingBoxDiffZ) + gWaveBlockPosZ; if ((gWaveBoundingBoxDiffX >> 1) < xPosition) { var_v1 = 8; } else { @@ -431,51 +449,53 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp var_s4 = 0; } - for (var_v1 -= (D_80129FC8.unk24 >> 1) * 8; var_v1 < 0; var_v1 += 16) { + for (var_v1 -= (gWaveController.waveViewDist >> 1) * 8; var_v1 < 0; var_v1 += 16) { xPosRatio -= 1; } - for (var_s4 -= (D_80129FC8.unk24 >> 1) * 16; var_s4 < 0; var_s4 += 32) { + for (var_s4 -= (gWaveController.waveViewDist >> 1) * 16; var_s4 < 0; var_s4 += 32) { zPosRatio -= 1; } - for (var_s6 = 0, var_a3 = 0; var_s6 < D_80129FC8.unk24; var_s6++) { - if ((zPosRatio >= 0) && (zPosRatio < D_8012A0DC)) { + for (blockDist = 0, var_a3 = 0; blockDist < gWaveController.waveViewDist; blockDist++) { + if (zPosRatio >= 0 && zPosRatio < gWaveTileCountZ) { tempXPosRatio = xPosRatio; var_t5 = var_v1; - var_t2 = (zPosRatio * D_8012A0D8) + xPosRatio; - for (var_s5 = 0; var_s5 < D_80129FC8.unk24; var_s5++) { + var_t2 = (zPosRatio * gWaveTileCountX) + xPosRatio; + for (var_s5 = 0; var_s5 < gWaveController.waveViewDist; var_s5++) { // clang-format off if ( (tempXPosRatio >= 0) && - (tempXPosRatio < D_8012A0D8) && + (tempXPosRatio < gWaveTileCountX) && (D_8012A0E8[zPosRatio] & (1 << tempXPosRatio)) ) { // clang-format on - D_800E30D4[var_t2] |= D_800E30E0[var_s6 * D_80129FC8.unk24 + var_s5] << (var_t5 + var_s4); - for (var_v0 = 0; var_v0 < gNumberOfLevelSegments; var_v0++) { - if (var_t2 == D_800E30D8[var_v0].unkC) { - D_8012A5E8[var_a3].unk0 = var_v0; + D_800E30D4[var_t2] |= D_800E30E0[blockDist * gWaveController.waveViewDist + var_s5] + << (var_t5 + var_s4); + for (i = 0; i < gNumberOfLevelSegments; i++) { + if (var_t2 == gWaveModel[i].unkC) { + D_8012A5E8[var_a3].blockID = i; D_8012A5E8[var_a3].unk2 = (var_t5 + var_s4) >> 3; - D_8012A5E8[var_a3].unk8 = var_v0 * D_800E317C; - D_8012A5E8[var_a3].unk4 = D_800E30D8[var_v0].unk12; + D_8012A5E8[var_a3].unk8 = i * gWaveTileTotal; + D_8012A5E8[var_a3].unk4 = gWaveModel[i].unk12; if (var_t5 != 0) { - D_8012A5E8[var_a3].unk8 += D_80129FC8.unk0; - D_8012A5E8[var_a3].unk4 += D_80129FC8.unk0; - while (D_8012A5E8[var_a3].unk4 >= D_80129FC8.unk4) { - D_8012A5E8[var_a3].unk4 -= D_80129FC8.unk4; + D_8012A5E8[var_a3].unk8 += gWaveController.subdivisions; + D_8012A5E8[var_a3].unk4 += gWaveController.subdivisions; + while (D_8012A5E8[var_a3].unk4 >= gWaveController.tileCount) { + D_8012A5E8[var_a3].unk4 -= gWaveController.tileCount; } } - D_8012A5E8[var_a3].unk6 = D_800E30D8[var_v0].unk10; + D_8012A5E8[var_a3].unk6 = gWaveModel[i].unk10; if (var_s4 != 0) { - D_8012A5E8[var_a3].unk8 += ((D_80129FC8.unk0 * 2) + 1) * D_80129FC8.unk0; - D_8012A5E8[var_a3].unk6 += D_80129FC8.unk0; - while (D_8012A5E8[var_a3].unk6 >= D_80129FC8.unk4) { - D_8012A5E8[var_a3].unk6 -= D_80129FC8.unk4; + D_8012A5E8[var_a3].unk8 += + ((gWaveController.subdivisions * 2) + 1) * gWaveController.subdivisions; + D_8012A5E8[var_a3].unk6 += gWaveController.subdivisions; + while (D_8012A5E8[var_a3].unk6 >= gWaveController.tileCount) { + D_8012A5E8[var_a3].unk6 -= gWaveController.tileCount; } } var_a3++; - var_v0 = 0x7FFF; + i = 0x7FFF; } } } @@ -494,30 +514,30 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp } } } else { - xPosRatio -= D_80129FC8.unk24 >> 1; - zPosRatio -= D_80129FC8.unk24 >> 1; - for (var_s6 = 0, var_a3 = 0; var_s6 < D_80129FC8.unk24; var_s6++, zPosRatio++) { - if ((zPosRatio >= 0) && (zPosRatio < D_8012A0DC)) { + xPosRatio -= gWaveController.waveViewDist >> 1; + zPosRatio -= gWaveController.waveViewDist >> 1; + for (blockDist = 0, var_a3 = 0; blockDist < gWaveController.waveViewDist; blockDist++, zPosRatio++) { + if ((zPosRatio >= 0) && (zPosRatio < gWaveTileCountZ)) { tempXPosRatio = xPosRatio; - var_t2 = (zPosRatio * D_8012A0D8) + xPosRatio; - for (var_s5 = 0; var_s5 < D_80129FC8.unk24; var_s5++, tempXPosRatio++, var_t2++) { + var_t2 = (zPosRatio * gWaveTileCountX) + xPosRatio; + for (var_s5 = 0; var_s5 < gWaveController.waveViewDist; var_s5++, tempXPosRatio++, var_t2++) { // clang-format off if ( (tempXPosRatio >= 0) && - (tempXPosRatio < D_8012A0D8) && + (tempXPosRatio < gWaveTileCountX) && (D_8012A0E8[zPosRatio] & (1 << tempXPosRatio)) ) { // clang-format on - D_800E30D4[var_t2] = D_800E30E0[var_s6 * D_80129FC8.unk24 + var_s5]; - for (var_v0 = 0; var_v0 < gNumberOfLevelSegments; var_v0++) { - if (var_t2 == D_800E30D8[var_v0].unkC) { - D_8012A5E8[var_a3].unk0 = var_v0; + D_800E30D4[var_t2] = D_800E30E0[blockDist * gWaveController.waveViewDist + var_s5]; + for (i = 0; i < gNumberOfLevelSegments; i++) { + if (var_t2 == gWaveModel[i].unkC) { + D_8012A5E8[var_a3].blockID = i; D_8012A5E8[var_a3].unk2 = 0; - D_8012A5E8[var_a3].unk4 = D_800E30D8[var_v0].unk12; - D_8012A5E8[var_a3].unk6 = D_800E30D8[var_v0].unk10; - D_8012A5E8[var_a3].unk8 = var_v0 * D_800E317C; + D_8012A5E8[var_a3].unk4 = gWaveModel[i].unk12; + D_8012A5E8[var_a3].unk6 = gWaveModel[i].unk10; + D_8012A5E8[var_a3].unk8 = i * gWaveTileTotal; var_a3++; - var_v0 = 0x7FFF; + i = 0x7FFF; } } } @@ -529,20 +549,23 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp func_800BA288(currentViewport, updateRate); } -s32 func_800B9228(LevelModelSegment *arg0) { - s32 v0 = 0; +/** + * Returns whether the current wave tile is expected to be the high quality wavegen, over the standard flat plane. + */ +s32 waves_block_hq(LevelModelSegment *block) { + s32 indexNum = 0; s32 result = FALSE; - while (v0 < gNumberOfLevelSegments && arg0 != D_800E30D8[v0].unk00) { - v0++; + while (indexNum < gNumberOfLevelSegments && block != gWaveModel[indexNum].block) { + indexNum++; }; - if (D_800E30D4[D_800E30D8[v0].unkC]) { + if (D_800E30D4[gWaveModel[indexNum].unkC]) { result = TRUE; - D_8012A1E8[D_800E30DC++] = v0; + gWaveBlockIDs[gVisibleWaveTiles++] = indexNum; } return result; } -void func_800B92F4(s32 arg0, s32 arg1) { +void func_800B92F4(s32 blockID, s32 viewportID) { s32 i; s32 var_s2; s32 j; @@ -554,25 +577,25 @@ void func_800B92F4(s32 arg0, s32 arg1) { s32 sp8C; s32 sp88; s32 sp84; - s32 var_v1; + s32 vertexCol; s32 vertexIdx; s32 var_s1; s32 k; Vertex *vertices; LevelModel_Alternate *sp6C; - temp_f22 = (1.0f - D_80129FC8.unk44) / 255.0f; - sp6C = &D_800E30D8[arg0]; - sp90 = (D_80129FC8.unk0 + 1) * (D_80129FC8.unk0 + 1); - for (k = 0; D_8012A5E8[k].unk0 != -1; k++) { - if (arg0 != D_8012A5E8[k].unk0) { + temp_f22 = (1.0f - gWaveController.unk44) / 255.0f; + sp6C = &gWaveModel[blockID]; + sp90 = (gWaveController.subdivisions + 1) * (gWaveController.subdivisions + 1); + for (k = 0; D_8012A5E8[k].blockID != -1; k++) { + if (blockID != D_8012A5E8[k].blockID) { continue; } - if (D_80129FC8.unk28 != FALSE) { + if (gWaveController.doubleDensity) { sp98 = (((u32) D_800E30D4[sp6C->unkC] >> (D_8012A5E8[k].unk2 * 8)) & 0xFF) - 1; - sp8C = (D_8012A5E8[k].unk2 & 1) * D_80129FC8.unk0; - sp88 = ((D_8012A5E8[k].unk2 & 2) >> 1) * D_80129FC8.unk0; + sp8C = (D_8012A5E8[k].unk2 & 1) * gWaveController.subdivisions; + sp88 = ((D_8012A5E8[k].unk2 & 2) >> 1) * gWaveController.subdivisions; } else { sp98 = (D_800E30D4[sp6C->unkC] & 0xFF) - 1; sp8C = 0; @@ -580,17 +603,18 @@ void func_800B92F4(s32 arg0, s32 arg1) { } sp84 = D_8012A5E8[k].unk6; - vertices = &gWaveVertices[gWaveVertexFlip + arg1][0][sp90 * sp98]; + vertices = &gWaveVertices[gWaveVertexFlip + viewportID][0][sp90 * sp98]; sp98 = D_800E30E4[sp98]; vertexIdx = 0; - for (i = 0; i <= D_80129FC8.unk0; i++) { + for (i = 0; i <= gWaveController.subdivisions; i++) { var_s1 = D_8012A5E8[k].unk4; - var_s2 = (sp84 * D_80129FC8.unk4) + var_s1; - for (j = 0; j <= D_80129FC8.unk0; j++) { - vertexY = - (D_800E3040[D_800E3044[var_s2].s[0]] + D_800E3040[D_800E3044[var_s2].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - vertexY += func_800BEFC4(arg0, j + sp8C, i + sp88); + var_s2 = (sp84 * gWaveController.tileCount) + var_s1; + for (j = 0; j <= gWaveController.subdivisions; j++) { + vertexY = (gWaveHeightTable[gWaveHeightIndices[var_s2].s[0]] + + gWaveHeightTable[gWaveHeightIndices[var_s2].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + vertexY += waves_get_y(blockID, j + sp8C, i + sp88); } vertexY *= D_800E304C[sp98][vertexIdx]; var_v0 = D_800E3178[D_8012A5E8[k].unk8]; @@ -599,50 +623,50 @@ void func_800B92F4(s32 arg0, s32 arg1) { var_v0 <<= 1; \ D_8012A5E8[k].unk8++; // clang-format on - if (var_v0 < 0xFF) { - vertexY *= D_80129FC8.unk44 + ((f32) var_v0 * temp_f22); + if (var_v0 < 255) { + vertexY *= gWaveController.unk44 + ((f32) var_v0 * temp_f22); } - var_v0 += (s32) (vertexY * D_80129FC8.unk48); - if (var_v0 > 0xFF) { - var_v0 = 0xFF; + var_v0 += (s32) (vertexY * gWaveController.unk48); + if (var_v0 > 255) { + var_v0 = 255; } else if (var_v0 < 0) { var_v0 = 0; } - var_v0 += ((0xFF - var_v0) * sp6C->unk14[arg1 >> 1].unk0[D_8012A5E8[k].unk2]) >> 7; + var_v0 += ((255 - var_v0) * sp6C->unk14[viewportID >> 1].unk0[D_8012A5E8[k].unk2]) >> 7; vertices[vertexIdx].y = vertexY; - var_v1 = var_v0 < 0xC0 ? 0xFF : ((0xFF - var_v0) * 4) & 0xFF; - vertices[vertexIdx].r = var_v1; - vertices[vertexIdx].g = var_v1; - vertices[vertexIdx].b = var_v1; + vertexCol = var_v0 < 192 ? 255 : ((255 - var_v0) * 4) & 255; + vertices[vertexIdx].r = vertexCol; + vertices[vertexIdx].g = vertexCol; + vertices[vertexIdx].b = vertexCol; - var_v1 = var_v0 < 0x40 ? (var_v0 * 4) & 0xFF : 0xFF; - vertices[vertexIdx].a = var_v1; + vertexCol = var_v0 < 64 ? (var_v0 * 4) & 255 : 255; + vertices[vertexIdx].a = vertexCol; vertexIdx++; var_s1++; var_s2++; - if (var_s1 >= D_80129FC8.unk4) { - var_s1 -= D_80129FC8.unk4; - var_s2 -= D_80129FC8.unk4; + if (var_s1 >= gWaveController.tileCount) { + var_s1 -= gWaveController.tileCount; + var_s2 -= gWaveController.tileCount; } } sp84++; - if (sp84 >= D_80129FC8.unk4) { - sp84 -= D_80129FC8.unk4; + if (sp84 >= gWaveController.tileCount) { + sp84 -= gWaveController.tileCount; } - if (D_80129FC8.unk28 != FALSE) { - D_8012A5E8[k].unk8 += D_80129FC8.unk0; + if (gWaveController.doubleDensity) { + D_8012A5E8[k].unk8 += gWaveController.subdivisions; } } } } -void func_800B97A8(s32 arg0, s32 arg1) { +void func_800B97A8(s32 blockID, s32 arg1) { s32 var_v0; f32 temp_f26; s32 vertexIdx; s32 spA8; - f32 var_f20; + f32 y; s32 spA0; s32 sp9C; s32 sp98; @@ -657,21 +681,21 @@ void func_800B97A8(s32 arg0, s32 arg1) { s32 k; k = 0; - temp_f26 = (D_8012A020 * 2.0f) - (D_8012A01C * 2.0f); - spA0 = (D_80129FC8.unk0 + 1) * (D_80129FC8.unk0 + 1); - sp78 = &D_800E30D8[arg0]; + temp_f26 = (gWaveUpperY * 2.0f) - (gWaveLowerY * 2.0f); + spA0 = (gWaveController.subdivisions + 1) * (gWaveController.subdivisions + 1); + sp78 = &gWaveModel[blockID]; var_f28 = temp_f26 <= 0 ? 0 : 1.0f / temp_f26; - temp_f26 = D_8012A01C * 2.0f; - for (; D_8012A5E8[k].unk0 != -1; k++) { - if (arg0 != D_8012A5E8[k].unk0) { + temp_f26 = gWaveLowerY * 2.0f; + for (; D_8012A5E8[k].blockID != -1; k++) { + if (blockID != D_8012A5E8[k].blockID) { continue; } - if (D_80129FC8.unk28 != FALSE) { + if (gWaveController.doubleDensity) { spA8 = (((u32) D_800E30D4[sp78->unkC] >> (D_8012A5E8[k].unk2 * 8)) & 0xFF) - 1; - sp9C = (D_8012A5E8[k].unk2 & 1) * D_80129FC8.unk0; - sp98 = ((s32) (D_8012A5E8[k].unk2 & 2) >> 1) * D_80129FC8.unk0; + sp9C = (D_8012A5E8[k].unk2 & 1) * gWaveController.subdivisions; + sp98 = ((s32) (D_8012A5E8[k].unk2 & 2) >> 1) * gWaveController.subdivisions; } else { spA8 = (D_800E30D4[sp78->unkC] & 0xFF) - 1; sp9C = 0; @@ -681,24 +705,25 @@ void func_800B97A8(s32 arg0, s32 arg1) { var_a0 = D_8012A5E8[k].unk6; vertices = &gWaveVertices[gWaveVertexFlip + arg1][0][spA0 * spA8]; spA8 = D_800E30E4[spA8]; - for (i = 0, vertexIdx = 0; i <= D_80129FC8.unk0; i++) { + for (i = 0, vertexIdx = 0; i <= gWaveController.subdivisions; i++) { var_s1 = D_8012A5E8[k].unk4; - var_s2 = (var_a0 * D_80129FC8.unk4) + var_s1; - for (j = 0; j <= D_80129FC8.unk0; j++) { - var_f20 = - (D_800E3040[D_800E3044[var_s2].s[0]] + D_800E3040[D_800E3044[var_s2].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - var_f20 += func_800BEFC4(arg0, j + sp9C, i + sp98); + var_s2 = (var_a0 * gWaveController.tileCount) + var_s1; + for (j = 0; j <= gWaveController.subdivisions; j++) { + y = (gWaveHeightTable[gWaveHeightIndices[var_s2].s[0]] + + gWaveHeightTable[gWaveHeightIndices[var_s2].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + y += waves_get_y(blockID, j + sp9C, i + sp98); } - var_f20 *= D_800E304C[spA8][vertexIdx]; - vertices[vertexIdx].y = var_f20; - var_f20 = (var_f20 - temp_f26) * var_f28; - if (var_f20 > 1.0f) { - var_f20 = 1.0f; - } else if (var_f20 < 0) { - var_f20 = 0; + y *= D_800E304C[spA8][vertexIdx]; + vertices[vertexIdx].y = y; + y = (y - temp_f26) * var_f28; + if (y > 1.0f) { + y = 1.0f; + } else if (y < 0) { + y = 0; } - var_v0 = (0 * var_f20); + var_v0 = (0 * y); var_v0 += 0xFF; vertices[vertexIdx].r = var_v0; vertices[vertexIdx].g = var_v0; @@ -707,23 +732,23 @@ void func_800B97A8(s32 arg0, s32 arg1) { vertexIdx++; var_s1++; var_s2++; - if (var_s1 >= D_80129FC8.unk4) { - var_s1 -= D_80129FC8.unk4; - var_s2 -= D_80129FC8.unk4; + if (var_s1 >= gWaveController.tileCount) { + var_s1 -= gWaveController.tileCount; + var_s2 -= gWaveController.tileCount; } } var_a0++; - if (var_a0 >= D_80129FC8.unk4) { - var_a0 -= D_80129FC8.unk4; + if (var_a0 >= gWaveController.tileCount) { + var_a0 -= gWaveController.tileCount; } - if (D_80129FC8.unk28 != FALSE) { - D_8012A5E8[k].unk8 += D_80129FC8.unk0; + if (gWaveController.doubleDensity) { + D_8012A5E8[k].unk8 += gWaveController.subdivisions; } } } } -void func_800B9C18(s32 arg0) { +void waves_update(s32 updateRate) { s32 i; s32 j; s32 k; @@ -738,41 +763,41 @@ void func_800B9C18(s32 arg0) { s32 i_2; gWaveVertexFlip = 1 - gWaveVertexFlip; - for (i_2 = 0, j_2 = 0; i_2 < D_80129FC8.unk4; i_2++) { - for (k_2 = 0; k_2 < D_80129FC8.unk4; k_2++) { - D_800E3044[j_2].s[0] += arg0; - while (D_800E3044[j_2].s[0] >= D_80129FC8.unk20) { - D_800E3044[j_2].s[0] -= D_80129FC8.unk20; + for (i_2 = 0, j_2 = 0; i_2 < gWaveController.tileCount; i_2++) { + for (k_2 = 0; k_2 < gWaveController.tileCount; k_2++) { + gWaveHeightIndices[j_2].s[0] += updateRate; + while (gWaveHeightIndices[j_2].s[0] >= gWaveController.seedSize) { + gWaveHeightIndices[j_2].s[0] -= gWaveController.seedSize; } - D_800E3044[j_2].s[1] += arg0; - while (D_800E3044[j_2].s[1] >= D_80129FC8.unk20) { - D_800E3044[j_2].s[1] -= D_80129FC8.unk20; + gWaveHeightIndices[j_2].s[1] += updateRate; + while (gWaveHeightIndices[j_2].s[1] >= gWaveController.seedSize) { + gWaveHeightIndices[j_2].s[1] -= gWaveController.seedSize; } j_2++; } } - D_8012A09C += gWaveTextureHeader->frameAdvanceDelay * arg0; - if (D_8012A09C < 0) { - D_8012A09C = 0; + gWaveTexAnimFrame += gWaveTextureHeader->frameAdvanceDelay * updateRate; + if (gWaveTexAnimFrame < 0) { + gWaveTexAnimFrame = 0; } else { - while (D_8012A09C >= gWaveTextureHeader->numOfTextures) { - D_8012A09C -= gWaveTextureHeader->numOfTextures; + while (gWaveTexAnimFrame >= gWaveTextureHeader->numOfTextures) { + gWaveTexAnimFrame -= gWaveTextureHeader->numOfTextures; } } - D_8012A084 = ((D_80129FC8.unk38 * arg0) + D_8012A084) & D_8012A094; - D_8012A088 = ((D_80129FC8.unk3C * arg0) + D_8012A088) & D_8012A098; - var_a2 = D_8012A088; - for (i = 0, var_s0 = 0; i <= D_80129FC8.unk0; i++) { - var_v1 = D_8012A084; - for (j = 0; j <= D_80129FC8.unk0; j++) { - D_800E3048[var_s0].u = var_v1; - D_800E3048[var_s0].v = var_a2; - var_v1 += D_8012A08C; + gWaveUVBaseX = ((gWaveController.uvScrollX * updateRate) + gWaveUVBaseX) & gWaveTexUVMaskX; + gWaveUVBaseY = ((gWaveController.uvScrollY * updateRate) + gWaveUVBaseY) & gWaveTexUVMaskY; + var_a2 = gWaveUVBaseY; + for (i = 0, var_s0 = 0; i <= gWaveController.subdivisions; i++) { + var_v1 = gWaveUVBaseX; + for (j = 0; j <= gWaveController.subdivisions; j++) { + gWaveUVTable[var_s0].u = var_v1; + gWaveUVTable[var_s0].v = var_a2; + var_v1 += gWaveUVStepX; var_s0++; } - var_a2 += D_8012A090; + var_a2 += gWaveUVStepY; } if (gWavePlayerCount != 2) { @@ -783,22 +808,22 @@ void func_800B9C18(s32 arg0) { var_s0 = 0; var_t5 = 0; - var_ra = D_80129FC8.unk0 + 1; - for (i = 0; i < D_80129FC8.unk0; i++) { - for (j = 0; j < D_80129FC8.unk0; j++) { + var_ra = gWaveController.subdivisions + 1; + for (i = 0; i < gWaveController.subdivisions; i++) { + for (j = 0; j < gWaveController.subdivisions; j++) { for (k = 0; k < var_t2; k++) { - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv0.u = D_800E3048[var_t5].u; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv0.v = D_800E3048[var_t5 + 1].v; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv1.u = D_800E3048[var_ra].u; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv1.v = D_800E3048[var_ra].v; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv2.u = D_800E3048[var_t5 + 1].u; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv2.v = D_800E3048[var_t5 + 1].v; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv0.u = D_800E3048[var_t5 + 1].u; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv0.v = D_800E3048[var_t5 + 1].v; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv1.u = D_800E3048[var_ra].u; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv1.v = D_800E3048[var_ra + 1].v; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv2.u = D_800E3048[var_ra + 1].u; - gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv2.v = D_800E3048[var_ra + 1].v; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv0.u = gWaveUVTable[var_t5].u; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv0.v = gWaveUVTable[var_t5 + 1].v; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv1.u = gWaveUVTable[var_ra].u; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv1.v = gWaveUVTable[var_ra].v; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv2.u = gWaveUVTable[var_t5 + 1].u; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0].uv2.v = gWaveUVTable[var_t5 + 1].v; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv0.u = gWaveUVTable[var_t5 + 1].u; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv0.v = gWaveUVTable[var_t5 + 1].v; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv1.u = gWaveUVTable[var_ra].u; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv1.v = gWaveUVTable[var_ra + 1].v; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv2.u = gWaveUVTable[var_ra + 1].u; + gWaveTriangles[gWaveVertexFlip][k << 1][var_s0 + 1].uv2.v = gWaveUVTable[var_ra + 1].v; } var_t5++; var_ra++; @@ -808,32 +833,40 @@ void func_800B9C18(s32 arg0) { var_ra++; } - D_800E3090[2 * gWaveVertexFlip].uv0.u = D_800E3048[0].u; - D_800E3090[2 * gWaveVertexFlip].uv0.v = D_800E3048[0].v; - D_800E3090[2 * gWaveVertexFlip].uv1.u = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].u; - D_800E3090[2 * gWaveVertexFlip].uv1.v = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].v; - D_800E3090[2 * gWaveVertexFlip].uv2.u = D_800E3048[D_80129FC8.unk0].u; - D_800E3090[2 * gWaveVertexFlip].uv2.v = D_800E3048[D_80129FC8.unk0].v; - D_800E3090[2 * gWaveVertexFlip + 1].uv0.u = D_800E3048[D_80129FC8.unk0].u; - D_800E3090[2 * gWaveVertexFlip + 1].uv0.v = D_800E3048[D_80129FC8.unk0].v; - D_800E3090[2 * gWaveVertexFlip + 1].uv1.u = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].u; - D_800E3090[2 * gWaveVertexFlip + 1].uv1.v = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].v; - D_800E3090[2 * gWaveVertexFlip + 1].uv2.u = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1) + D_80129FC8.unk0].u; - D_800E3090[2 * gWaveVertexFlip + 1].uv2.v = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1) + D_80129FC8.unk0].v; + D_800E3090[2 * gWaveVertexFlip].uv0.u = gWaveUVTable[0].u; + D_800E3090[2 * gWaveVertexFlip].uv0.v = gWaveUVTable[0].v; + D_800E3090[2 * gWaveVertexFlip].uv1.u = + gWaveUVTable[gWaveController.subdivisions * (gWaveController.subdivisions + 1)].u; + D_800E3090[2 * gWaveVertexFlip].uv1.v = + gWaveUVTable[gWaveController.subdivisions * (gWaveController.subdivisions + 1)].v; + D_800E3090[2 * gWaveVertexFlip].uv2.u = gWaveUVTable[gWaveController.subdivisions].u; + D_800E3090[2 * gWaveVertexFlip].uv2.v = gWaveUVTable[gWaveController.subdivisions].v; + D_800E3090[2 * gWaveVertexFlip + 1].uv0.u = gWaveUVTable[gWaveController.subdivisions].u; + D_800E3090[2 * gWaveVertexFlip + 1].uv0.v = gWaveUVTable[gWaveController.subdivisions].v; + D_800E3090[2 * gWaveVertexFlip + 1].uv1.u = + gWaveUVTable[gWaveController.subdivisions * (gWaveController.subdivisions + 1)].u; + D_800E3090[2 * gWaveVertexFlip + 1].uv1.v = + gWaveUVTable[gWaveController.subdivisions * (gWaveController.subdivisions + 1)].v; + D_800E3090[2 * gWaveVertexFlip + 1].uv2.u = + gWaveUVTable[gWaveController.subdivisions * (gWaveController.subdivisions + 1) + gWaveController.subdivisions] + .u; + D_800E3090[2 * gWaveVertexFlip + 1].uv2.v = + gWaveUVTable[gWaveController.subdivisions * (gWaveController.subdivisions + 1) + gWaveController.subdivisions] + .v; - if (D_800E3188 > 0) { - func_800BFE98(arg0); + if (gWaveGenCount > 0) { + func_800BFE98(updateRate); } if (gWavePowerDivisor <= 0) { return; } - if (arg0 < gWavePowerDivisor) { - D_80129FC8.magnitude += (f32) arg0 * gWaveMagnitude; - gWavePowerDivisor -= arg0; + if (updateRate < gWavePowerDivisor) { + gWaveController.magnitude += (f32) updateRate * gWaveMagnitude; + gWavePowerDivisor -= updateRate; } else { - D_80129FC8.magnitude = gWavePowerBase; + gWaveController.magnitude = gWavePowerBase; gWavePowerDivisor = 0; } } @@ -844,35 +877,35 @@ void func_800BA288(s32 arg0, s32 arg1) { arg1 <<= 3; for (i = 0; i < gNumberOfLevelSegments; i++) { - if (D_8012A0E8[D_800E30D8[i].unkB] & (1 << D_800E30D8[i].unkA)) { - if (D_80129FC8.unk28 != FALSE) { + if (D_8012A0E8[gWaveModel[i].unkB] & (1 << gWaveModel[i].unkA)) { + if (gWaveController.doubleDensity) { for (j = 0; j < 4; j++) { - if (D_800E30D4[D_800E30D8[i].unkC] & (0xFF << (j << 3))) { - if (arg1 < D_800E30D8[i].unk14[arg0].unk0[j]) { - D_800E30D8[i].unk14[arg0].unk0[j] -= arg1; + if (D_800E30D4[gWaveModel[i].unkC] & (0xFF << (j << 3))) { + if (arg1 < gWaveModel[i].unk14[arg0].unk0[j]) { + gWaveModel[i].unk14[arg0].unk0[j] -= arg1; } else { - D_800E30D8[i].unk14[arg0].unk0[j] = 0; + gWaveModel[i].unk14[arg0].unk0[j] = 0; } } else { - if ((D_800E30D8[i].unk14[arg0].unk0[j] + arg1) < 0x80) { - D_800E30D8[i].unk14[arg0].unk0[j] += arg1; + if ((gWaveModel[i].unk14[arg0].unk0[j] + arg1) < 0x80) { + gWaveModel[i].unk14[arg0].unk0[j] += arg1; } else { - D_800E30D8[i].unk14[arg0].unk0[j] = 0x80; + gWaveModel[i].unk14[arg0].unk0[j] = 0x80; } } } } else { - if (D_800E30D4[D_800E30D8[i].unkC]) { - if (arg1 < D_800E30D8[i].unk14[arg0].unk0[0]) { - D_800E30D8[i].unk14[arg0].unk0[0] -= arg1; + if (D_800E30D4[gWaveModel[i].unkC]) { + if (arg1 < gWaveModel[i].unk14[arg0].unk0[0]) { + gWaveModel[i].unk14[arg0].unk0[0] -= arg1; } else { - D_800E30D8[i].unk14[arg0].unk0[0] = 0; + gWaveModel[i].unk14[arg0].unk0[0] = 0; } } else { - if (D_800E30D8[i].unk14[arg0].unk0[0] + arg1 < 0x80) { - D_800E30D8[i].unk14[arg0].unk0[0] += arg1; + if (gWaveModel[i].unk14[arg0].unk0[0] + arg1 < 0x80) { + gWaveModel[i].unk14[arg0].unk0[0] += arg1; } else { - D_800E30D8[i].unk14[arg0].unk0[0] = 0x80; + gWaveModel[i].unk14[arg0].unk0[0] = 0x80; } } } @@ -920,7 +953,7 @@ void wave_load_material(TextureHeader *tex, s32 rtile) { } } -void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { +void waves_render(Gfx **dList, MatrixS **mtx, s32 viewportID) { s32 sp11C; Vertex *vtx; Triangle *tri; @@ -930,28 +963,29 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { s32 sp104; s32 var_fp; s32 var_t0; - ObjectTransform spE4; + ObjectTransform transform; LevelModel_Alternate *spE0; s32 i; TextureHeader *tex1; TextureHeader *tex2; - if (viewportID != 1 || gWavePlayerCount != 2) { + if (viewportID != VIEWPORT_LAYOUT_2_PLAYERS || gWavePlayerCount != 2) { viewportID = 0; } else { viewportID = 2; } - if (D_800E30DC > 0) { + if (gVisibleWaveTiles > 0) { gWaveDL = *dList; - D_80129FC4 = *mtx; + gWaveMtx = *mtx; i = 0; rendermode_reset(&gWaveDL); gSPSetGeometryMode(gWaveDL++, G_ZBUFFER); - if (D_80129FC8.darkVertexColours) { + // Low Quality water. Sets up material data here too. + if (gWaveController.xlu) { gSPClearGeometryMode(gWaveDL++, G_FOG); - tex1 = set_animated_texture_header(gWaveTextureHeader, D_8012A09C << 8); - tex2 = set_animated_texture_header(gWaveTexture, gWaveBatch->unk7 << 14); + tex1 = set_animated_texture_header(gWaveTextureHeader, gWaveTexAnimFrame * (16 * 16)); + tex2 = set_animated_texture_header(gWaveTexture, gWaveBatch->unk7 * (128 * 128)); wave_load_material(tex1, 1); wave_load_material(tex2, 0); gDPSetCombineMode(gWaveDL++, DKR_CC_UNK14, DKR_CC_UNK15); @@ -970,7 +1004,7 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { } } else { gSPSetGeometryMode(gWaveDL++, G_FOG); - tex1 = set_animated_texture_header(gWaveTexture, gWaveBatch->unk7 << 14); + tex1 = set_animated_texture_header(gWaveTexture, gWaveBatch->unk7 * (128 * 128)); gDkrDmaDisplayList(gWaveDL++, OS_K0_TO_PHYSICAL(tex1->cmd), tex1->numberOfCommands); gDPSetCombineMode(gWaveDL++, DKR_CC_UNK16, DKR_CC_UNK8); gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2); @@ -982,41 +1016,43 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { gDPSetEnvColor(gWaveDL++, 255, 255, 255, 0); } } - if (D_80129FC8.unk28) { - spE4.scale = 0.5f; + if (gWaveController.doubleDensity) { + transform.scale = 0.5f; } else { - spE4.scale = 1.0f; + transform.scale = 1.0f; } - spE4.rotation.x = spE4.rotation.y = spE4.rotation.z = 0; - for (; i < D_800E30DC; i++) { - if (D_80129FC8.darkVertexColours) { - func_800B92F4(D_8012A1E8[i], viewportID); + transform.rotation.x = transform.rotation.y = transform.rotation.z = 0; + // High Quality water + for (; i < gVisibleWaveTiles; i++) { + if (gWaveController.xlu) { + func_800B92F4(gWaveBlockIDs[i], viewportID); } else { - func_800B97A8(D_8012A1E8[i], viewportID); + func_800B97A8(gWaveBlockIDs[i], viewportID); } - spE0 = &D_800E30D8[D_8012A1E8[i]]; - spE4.x_position = spE0->unk4; - spE4.y_position = spE0->unk6; - spE4.z_position = spE0->unk8; + spE0 = &gWaveModel[gWaveBlockIDs[i]]; + transform.x_position = spE0->originX; + transform.y_position = spE0->originY; + transform.z_position = spE0->originZ; sp104 = D_800E30D4[spE0->unkC]; - if (D_80129FC8.unk28) { + if (gWaveController.doubleDensity) { for (sp11C = 0; sp11C < 2; sp11C++) { - spE4.x_position = spE0->unk4; + transform.x_position = spE0->originX; for (var_fp = 0; var_fp < 2; var_fp++) { - cam_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); + cam_push_model_mtx(&gWaveDL, &gWaveMtx, &transform, 1.0f, 0.0f); if (sp104 & 0xFF) { - numTris = D_80129FC8.unk0 << 1; - numVerts = D_80129FC8.unk0 + 1; + numTris = gWaveController.subdivisions << 1; + numVerts = gWaveController.subdivisions + 1; var_t0 = ((sp104 & 0xFF) - 1) * numVerts * numVerts; - for (j = 0; j < D_80129FC8.unk0; j++) { + for (j = 0; j < gWaveController.subdivisions; j++) { vtx = &gWaveVertices[gWaveVertexFlip + viewportID][0][var_t0]; - tri = &gWaveTriangles[gWaveVertexFlip + viewportID][0][j * (D_80129FC8.unk0 << 1)]; + tri = &gWaveTriangles[gWaveVertexFlip + viewportID][0] + [j * (gWaveController.subdivisions << 1)]; gSPVertexDKR(gWaveDL++, OS_K0_TO_PHYSICAL(vtx), numVerts << 1, 0); gSPPolygon(gWaveDL++, OS_K0_TO_PHYSICAL(tri), numTris, TRIN_ENABLE_TEXTURE); - var_t0 += D_80129FC8.unk0 + 1; + var_t0 += gWaveController.subdivisions + 1; } } else { gSPVertexDKR(gWaveDL++, OS_K0_TO_PHYSICAL(&D_8012A028[gWaveVertexFlip]), 4, 0); @@ -1025,35 +1061,35 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 viewportID) { } apply_matrix_from_stack(&gWaveDL); sp104 >>= 8; - spE4.x_position += D_8012A0A0 * 0.5f; + transform.x_position += gWaveBoundingBoxW * 0.5f; } - spE4.z_position += D_8012A0A4 * 0.5f; + transform.z_position += gWaveBoundingBoxH * 0.5f; } } else { - cam_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); - numTris = D_80129FC8.unk0 << 1; - numVerts = D_80129FC8.unk0 + 1; + cam_push_model_mtx(&gWaveDL, &gWaveMtx, &transform, 1.0f, 0.0f); + numTris = gWaveController.subdivisions << 1; + numVerts = gWaveController.subdivisions + 1; var_t0 = ((sp104 & 0xFF) - 1) * numVerts * numVerts; - for (j = 0; j < D_80129FC8.unk0; j++) { + for (j = 0; j < gWaveController.subdivisions; j++) { vtx = &gWaveVertices[gWaveVertexFlip + viewportID][0][var_t0]; - tri = &gWaveTriangles[gWaveVertexFlip + viewportID][0][j * (D_80129FC8.unk0 << 1)]; + tri = &gWaveTriangles[gWaveVertexFlip + viewportID][0][j * (gWaveController.subdivisions << 1)]; gSPVertexDKR(gWaveDL++, OS_K0_TO_PHYSICAL(vtx), numVerts << 1, 0); gSPPolygon(gWaveDL++, OS_K0_TO_PHYSICAL(tri), numTris, TRIN_ENABLE_TEXTURE); - var_t0 += D_80129FC8.unk0 + 1; + var_t0 += gWaveController.subdivisions + 1; } apply_matrix_from_stack(&gWaveDL); } } - if (D_80129FC8.darkVertexColours) { + if (gWaveController.xlu) { gSPSetGeometryMode(gWaveDL++, G_FOG); gDPSetPrimColor(gWaveDL++, 0, 0, 255, 255, 255, 255); } *dList = gWaveDL; - *mtx = D_80129FC4; + *mtx = gWaveMtx; } - D_800E30DC = 0; + gVisibleWaveTiles = 0; } f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { @@ -1083,33 +1119,33 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { arg0 = 0; } - sp78 = D_800E30D8[arg0].unk6; + sp78 = gWaveModel[arg0].originY; - sp90 = D_8012A0BC; - sp94 = D_8012A0B8; - var_f16 = (1.0f - D_80129FC8.unk44) / 127.0f; - sp58 = arg0 * D_800E317C; + sp90 = gWaveVtxStepZ; + sp94 = gWaveVtxStepX; + var_f16 = (1.0f - gWaveController.unk44) / 127.0f; + sp58 = arg0 * gWaveTileTotal; - if (D_80129FC8.unk28 != FALSE) { - sp90 *= 0.5f; - sp94 *= 0.5f; - sp60 = (D_80129FC8.unk0 * 2) + 1; + if (gWaveController.doubleDensity) { + sp90 /= 2.0f; + sp94 /= 2.0f; + sp60 = (gWaveController.subdivisions * 2) + 1; } else { - sp60 = D_80129FC8.unk0 + 1; + sp60 = gWaveController.subdivisions + 1; } - arg1 -= D_800E30D8[arg0].unk4; + arg1 -= gWaveModel[arg0].originX; if (arg1 < 0.0f) { arg1 = 0.0f; - } else if (D_8012A0A0 <= arg1) { - arg1 = D_8012A0A0 - 1; // needs to be 1 instead of 1.0f + } else if (gWaveBoundingBoxW <= arg1) { + arg1 = gWaveBoundingBoxW - 1; // needs to be 1 instead of 1.0f } - arg2 -= D_800E30D8[arg0].unk8; + arg2 -= gWaveModel[arg0].originZ; if (arg2 < 0.0f) { arg2 = 0.0f; - } else if (D_8012A0A4 <= arg2) { - arg2 = D_8012A0A4 - 1; // needs to be 1 instead of 1.0f + } else if (gWaveBoundingBoxH <= arg2) { + arg2 = gWaveBoundingBoxH - 1; // needs to be 1 instead of 1.0f } sp70 = arg1 / sp94; @@ -1117,14 +1153,14 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { arg1 -= sp70 * sp94; arg2 -= sp6C * sp90; - var_t0 = D_800E30D8[arg0].unk12 + sp70; - while (var_t0 >= D_80129FC8.unk4) { - var_t0 -= D_80129FC8.unk4; + var_t0 = gWaveModel[arg0].unk12 + sp70; + while (var_t0 >= gWaveController.tileCount) { + var_t0 -= gWaveController.tileCount; } - var_a3 = D_800E30D8[arg0].unk10 + sp6C; - while (var_a3 >= D_80129FC8.unk4) { - var_a3 -= D_80129FC8.unk4; + var_a3 = gWaveModel[arg0].unk10 + sp6C; + while (var_a3 >= gWaveController.tileCount) { + var_a3 -= gWaveController.tileCount; } var_v0 = 0; @@ -1133,49 +1169,55 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { } if (var_v0) { - var_a0 = (var_a3 * D_80129FC8.unk4) + var_t0; - spA0 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + var_a0 = (var_a3 * gWaveController.tileCount) + var_t0; + spA0 = (gWaveHeightTable[gWaveHeightIndices[var_a0].s[0]] + gWaveHeightTable[gWaveHeightIndices[var_a0].s[1]]) * + gWaveController.magnitude; var_a0 = sp58 + sp70 + (sp6C * sp60); - if (D_800E3188 > 0) { - spA0 += func_800BEFC4(arg0, sp70, sp6C); + if (gWaveGenCount > 0) { + spA0 += waves_get_y(arg0, sp70, sp6C); } var_v0 = D_800E3178[var_a0]; if (D_800E3178[var_a0] < 0x7F) { - spA0 *= D_80129FC8.unk44 + (var_v0 * var_f16); + spA0 *= gWaveController.unk44 + (var_v0 * var_f16); } - var_a0 = (var_a3 + 1) >= D_80129FC8.unk4 ? var_t0 : ((var_a3 + 1) * D_80129FC8.unk4) + var_t0; - var_f12 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - var_f12 += func_800BEFC4(arg0, sp70, sp6C + 1); + var_a0 = + (var_a3 + 1) >= gWaveController.tileCount ? var_t0 : ((var_a3 + 1) * gWaveController.tileCount) + var_t0; + var_f12 = + (gWaveHeightTable[gWaveHeightIndices[var_a0].s[0]] + gWaveHeightTable[gWaveHeightIndices[var_a0].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + var_f12 += waves_get_y(arg0, sp70, sp6C + 1); } var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); var_v0 = D_800E3178[var_a0]; if (D_800E3178[var_a0] < 0x7F) { - var_f12 *= D_80129FC8.unk44 + (var_v0 * var_f16); + var_f12 *= gWaveController.unk44 + (var_v0 * var_f16); } - if ((var_t0 + 1) >= D_80129FC8.unk4) { - var_a0 = var_a3 * D_80129FC8.unk4; + if ((var_t0 + 1) >= gWaveController.tileCount) { + var_a0 = var_a3 * gWaveController.tileCount; } else { - var_a0 = (var_t0 + 0) + (var_a3 * D_80129FC8.unk4) + 1; + var_a0 = (var_t0 + 0) + (var_a3 * gWaveController.tileCount) + 1; } - var_f2 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - var_f2 += func_800BEFC4(arg0, sp70 + 1, sp6C); + var_f2 = + (gWaveHeightTable[gWaveHeightIndices[var_a0].s[0]] + gWaveHeightTable[gWaveHeightIndices[var_a0].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + var_f2 += waves_get_y(arg0, sp70 + 1, sp6C); } var_a0 = sp58 + sp70 + (sp6C * sp60); var_a0++; var_v0 = D_800E3178[var_a0]; if (D_800E3178[var_a0] < 0x7F) { - var_f2 *= D_80129FC8.unk44 + (var_v0 * var_f16); + var_f2 *= gWaveController.unk44 + (var_v0 * var_f16); } - if (D_80129FC8.unk28 != FALSE) { - spA0 *= 0.5f; - var_f12 *= 0.5f; - var_f2 *= 0.5f; + if (gWaveController.doubleDensity) { + spA0 /= 2.0f; + var_f12 /= 2.0f; + var_f2 /= 2.0f; } spA4 = 0.0f; @@ -1183,53 +1225,59 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { arg3Y = sp90 * sp94; arg3Z = (spA0 - var_f12) * sp94; } else { - if ((var_t0 + 1) >= D_80129FC8.unk4) { - var_a0 = var_a3 * D_80129FC8.unk4; + if ((var_t0 + 1) >= gWaveController.tileCount) { + var_a0 = var_a3 * gWaveController.tileCount; } else { - var_a0 = (var_t0 + 0) + (var_a3 * D_80129FC8.unk4) + 1; + var_a0 = (var_t0 + 0) + (var_a3 * gWaveController.tileCount) + 1; } - spA0 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - spA0 += func_800BEFC4(arg0, sp70 + 1, sp6C); + spA0 = (gWaveHeightTable[gWaveHeightIndices[var_a0].s[0]] + gWaveHeightTable[gWaveHeightIndices[var_a0].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + spA0 += waves_get_y(arg0, sp70 + 1, sp6C); } var_a0 = sp58 + sp70 + (sp6C * sp60); var_a0++; var_v0 = D_800E3178[var_a0]; if (D_800E3178[var_a0] < 0x7F) { - spA0 *= D_80129FC8.unk44 + (var_v0 * var_f16); + spA0 *= gWaveController.unk44 + (var_v0 * var_f16); } - var_a0 = (var_a3 + 1) >= D_80129FC8.unk4 ? var_t0 : ((var_a3 + 1) * D_80129FC8.unk4) + var_t0; - var_f12 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - var_f12 += func_800BEFC4(arg0, sp70, sp6C + 1); + var_a0 = + (var_a3 + 1) >= gWaveController.tileCount ? var_t0 : ((var_a3 + 1) * gWaveController.tileCount) + var_t0; + var_f12 = + (gWaveHeightTable[gWaveHeightIndices[var_a0].s[0]] + gWaveHeightTable[gWaveHeightIndices[var_a0].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + var_f12 += waves_get_y(arg0, sp70, sp6C + 1); } var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); var_v0 = (tempD_800E3178 = D_800E3178)[var_a0]; if (var_v0 < 0x7F) { - var_f12 *= D_80129FC8.unk44 + (var_v0 * var_f16); + var_f12 *= gWaveController.unk44 + (var_v0 * var_f16); } - var_a0 = (var_t0 + 1) >= D_80129FC8.unk4 ? 0 : (var_t0 + 1); - if ((var_a3 + 1) < D_80129FC8.unk4) { - var_a0 += (var_a3 + 1) * D_80129FC8.unk4; + var_a0 = (var_t0 + 1) >= gWaveController.tileCount ? 0 : (var_t0 + 1); + if ((var_a3 + 1) < gWaveController.tileCount) { + var_a0 += (var_a3 + 1) * gWaveController.tileCount; } - var_f2 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; - if (D_800E3188 > 0) { - var_f2 += func_800BEFC4(arg0, sp70 + 1, sp6C + 1); + var_f2 = + (gWaveHeightTable[gWaveHeightIndices[var_a0].s[0]] + gWaveHeightTable[gWaveHeightIndices[var_a0].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + var_f2 += waves_get_y(arg0, sp70 + 1, sp6C + 1); } var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); var_a0++; var_v0 = D_800E3178[var_a0]; if (var_v0 < 0x7F) { - var_f2 *= D_80129FC8.unk44 + (var_v0 * var_f16); + var_f2 *= gWaveController.unk44 + (var_v0 * var_f16); } - if (D_80129FC8.unk28 != FALSE) { - spA0 *= 0.5f; - var_f12 *= 0.5f; - var_f2 *= 0.5f; + if (gWaveController.doubleDensity) { + spA0 /= 2.0f; + var_f12 /= 2.0f; + var_f2 /= 2.0f; } spA4 = sp94; @@ -1266,7 +1314,7 @@ void func_800BBE08(LevelModel *level, LevelHeader *header) { s32 j; TriangleBatchInfo *curBatch; s32 i; - s32 temp_t6; + s32 colourID; LevelModelSegmentBoundingBox *bb; LevelModelSegment *segment; @@ -1276,8 +1324,8 @@ void func_800BBE08(LevelModel *level, LevelHeader *header) { for (i = 0; curBatch == 0 && i < numSegments; i++) { segment = &level->segments[i]; for (j = 0; curBatch == 0 && j < segment->numberOfBatches; j++) { - if ((segment->batches[j].flags & (BATCH_FLAGS_UNK01000000 | BATCH_FLAGS_WATER | BATCH_FLAGS_HIDDEN)) == - (BATCH_FLAGS_UNK01000000 | BATCH_FLAGS_WATER)) { + if ((segment->batches[j].flags & (RENDER_UNK_1000000 | RENDER_WATER | RENDER_HIDDEN)) == + (RENDER_UNK_1000000 | RENDER_WATER)) { curBatch = &segment->batches[j]; } } @@ -1295,11 +1343,12 @@ void func_800BBE08(LevelModel *level, LevelHeader *header) { gWaveBoundingBoxZ1 = bb->z1; gWaveBatch = curBatch; gWaveTexture = level->textures[curBatch->textureIndex].texture; - temp_t6 = (curBatch->flags & (BATCH_FLAGS_UNK40000000 | BATCH_FLAGS_UNK20000000 | BATCH_FLAGS_UNK10000000)) >> 28; - if (temp_t6 > 0) { - D_800E3180 = header->unk70[temp_t6]; + // Change these batch flags to 0, 1, 2 and 4 + colourID = (curBatch->flags & (RENDER_UNK_40000000 | RENDER_UNK_20000000 | RENDER_UNK_10000000)) >> 28; + if (colourID > 0) { + D_800E3180 = header->unk70[colourID]; } else { - D_800E3180 = 0; + D_800E3180 = NULL; } } @@ -1310,7 +1359,7 @@ void func_800BBF78(LevelModel *model) { s32 segmentVertexY; s32 temp_t2; s32 pad; - s32 sp44; + s32 subdivisions; LevelModelSegment *levelSegments; s32 i; s32 var_v0; @@ -1318,75 +1367,75 @@ void func_800BBF78(LevelModel *model) { levelSegments = model->segments; levelSegmentBoundingBoxes = model->segmentsBoundingBoxes; - sp44 = D_80129FC8.unk0; - if (D_80129FC8.unk28 != FALSE) { - sp44 = sp44 * 2; + subdivisions = gWaveController.subdivisions; + if (gWaveController.doubleDensity) { + subdivisions *= 2; } - D_8012A0C0 = levelSegmentBoundingBoxes->x1; - D_8012A0C8 = levelSegmentBoundingBoxes->x2; - D_8012A0C4 = levelSegmentBoundingBoxes->z1; - D_8012A0CC = levelSegmentBoundingBoxes->z2; + gWaveBlockBoundsX1 = levelSegmentBoundingBoxes->x1; + gWaveBlockBoundsX2 = levelSegmentBoundingBoxes->x2; + gWaveBlockBoundsZ1 = levelSegmentBoundingBoxes->z1; + gWaveBlockBoundsZ2 = levelSegmentBoundingBoxes->z2; for (i = 1; i < model->numberOfSegments; i++) { - if (levelSegmentBoundingBoxes[i].x1 < D_8012A0C0) { - D_8012A0C0 = levelSegmentBoundingBoxes[i].x1; + if (levelSegmentBoundingBoxes[i].x1 < gWaveBlockBoundsX1) { + gWaveBlockBoundsX1 = levelSegmentBoundingBoxes[i].x1; } - if (D_8012A0C8 < levelSegmentBoundingBoxes[i].x2) { - D_8012A0C8 = levelSegmentBoundingBoxes[i].x2; + if (gWaveBlockBoundsX2 < levelSegmentBoundingBoxes[i].x2) { + gWaveBlockBoundsX2 = levelSegmentBoundingBoxes[i].x2; } - if (levelSegmentBoundingBoxes[i].z1 < D_8012A0C4) { - D_8012A0C4 = levelSegmentBoundingBoxes[i].z1; + if (levelSegmentBoundingBoxes[i].z1 < gWaveBlockBoundsZ1) { + gWaveBlockBoundsZ1 = levelSegmentBoundingBoxes[i].z1; } - if (D_8012A0CC < levelSegmentBoundingBoxes[i].z2) { - D_8012A0CC = levelSegmentBoundingBoxes[i].z2; + if (gWaveBlockBoundsZ2 < levelSegmentBoundingBoxes[i].z2) { + gWaveBlockBoundsZ2 = levelSegmentBoundingBoxes[i].z2; } } - D_8012A0D0 = gWaveBoundingBoxX1; - while (D_8012A0C0 < D_8012A0D0) { - D_8012A0D0 -= gWaveBoundingBoxDiffX; + gWaveBlockPosX = gWaveBoundingBoxX1; + while (gWaveBlockBoundsX1 < gWaveBlockPosX) { + gWaveBlockPosX -= gWaveBoundingBoxDiffX; } - D_8012A0D4 = gWaveBoundingBoxZ1; - while (D_8012A0C4 < D_8012A0D4) { - D_8012A0D4 -= gWaveBoundingBoxDiffZ; + gWaveBlockPosZ = gWaveBoundingBoxZ1; + while (gWaveBlockBoundsZ1 < gWaveBlockPosZ) { + gWaveBlockPosZ -= gWaveBoundingBoxDiffZ; } - D_8012A0D8 = ((D_8012A0C8 - D_8012A0D0) / gWaveBoundingBoxDiffX) + 1; - D_8012A0DC = ((D_8012A0CC - D_8012A0D4) / gWaveBoundingBoxDiffZ) + 1; - D_800E318C = (sp44 * D_8012A0D8) + 1; + gWaveTileCountX = ((gWaveBlockBoundsX2 - gWaveBlockPosX) / gWaveBoundingBoxDiffX) + 1; + gWaveTileCountZ = ((gWaveBlockBoundsZ2 - gWaveBlockPosZ) / gWaveBoundingBoxDiffZ) + 1; + gWaveTileGridCount = (subdivisions * gWaveTileCountX) + 1; if (D_800E30D4 != NULL) { mempool_free(D_800E30D4); } - D_800E30D4 = mempool_alloc_safe(D_8012A0D8 * D_8012A0DC * 4, COLOUR_TAG_CYAN); + D_800E30D4 = mempool_alloc_safe(gWaveTileCountX * gWaveTileCountZ * sizeof(uintptr_t), COLOUR_TAG_CYAN); - if (D_800E30D8 != NULL) { - mempool_free(D_800E30D8); + if (gWaveModel != NULL) { + mempool_free(gWaveModel); } // clang-format off - D_800E30D8 = mempool_alloc_safe( - (model->numberOfSegments * sizeof(LevelModel_Alternate)) + (D_800E318C * 8) + 0x880, + gWaveModel = mempool_alloc_safe( + (model->numberOfSegments * sizeof(LevelModel_Alternate)) + (gWaveTileGridCount * 8) + 0x880, COLOUR_TAG_CYAN ); // clang-format on - D_800E3190 = (unk800E3190 *) ((u32) D_800E30D8 + model->numberOfSegments * sizeof(LevelModel_Alternate)); - D_800E3194 = (Object **) (D_800E3190 + sizeof(unk800E3190 *) * 8); - D_800E3184 = (unk800E3184 *) (D_800E3194 + sizeof(Object *) * 8); + gWaveGenList = (WaveGen *) ((u32) gWaveModel + model->numberOfSegments * sizeof(LevelModel_Alternate)); + gWaveGenObjs = (Object **) (gWaveGenList + sizeof(WaveGen *) * 8); + D_800E3184 = (unk800E3184 *) (gWaveGenObjs + 32); - for (i = 0; i < (D_800E318C * 8); i++) { + for (i = 0; i < (gWaveTileGridCount * 8); i++) { D_800E3184->unk0[i] = 0xFF; } // 0x20 / 32 sizeof what? for (i = 0; i < 32; i++) { - D_800E3194[i] = 0; + gWaveGenObjs[i] = 0; } - D_800E3188 = 0; + gWaveGenCount = 0; - for (i = 0; i < (D_8012A0D8 * D_8012A0DC); i++) { + for (i = 0; i < (gWaveTileCountX * gWaveTileCountZ); i++) { D_800E30D4[i] = 0; } @@ -1396,36 +1445,37 @@ void func_800BBF78(LevelModel *model) { gNumberOfLevelSegments = model->numberOfSegments; for (i = 0; i < gNumberOfLevelSegments; i++) { - temp_t1 = levelSegmentBoundingBoxes[i].x1 - D_8012A0D0 + 8; - temp_t2 = levelSegmentBoundingBoxes[i].z1 - D_8012A0D4 + 8; - temp_t1 = ((temp_t1 / gWaveBoundingBoxDiffX) * gWaveBoundingBoxDiffX) + D_8012A0D0; - temp_t2 = ((temp_t2 / gWaveBoundingBoxDiffZ) * gWaveBoundingBoxDiffZ) + D_8012A0D4; + temp_t1 = levelSegmentBoundingBoxes[i].x1 - gWaveBlockPosX + 8; + temp_t2 = levelSegmentBoundingBoxes[i].z1 - gWaveBlockPosZ + 8; + temp_t1 = ((temp_t1 / gWaveBoundingBoxDiffX) * gWaveBoundingBoxDiffX) + gWaveBlockPosX; + temp_t2 = ((temp_t2 / gWaveBoundingBoxDiffZ) * gWaveBoundingBoxDiffZ) + gWaveBlockPosZ; segmentVertexY = 0; for (j = 0; j < levelSegments[i].numberOfBatches; j++) { - if ((levelSegments[i].batches[j].flags & 0x2000) && (levelSegments[i].batches[j].flags & 0x400000)) { + if ((levelSegments[i].batches[j].flags & RENDER_WATER) && + (levelSegments[i].batches[j].flags & RENDER_UNK_0400000)) { segmentVertexY = levelSegments[i].vertices[levelSegments[i].batches[j].verticesOffset].y; } } - otherModel = &D_800E30D8[i]; - otherModel->unk00 = &levelSegments[i]; - otherModel->unk4 = temp_t1; - otherModel->unk6 = segmentVertexY; - otherModel->unk8 = temp_t2; - otherModel->unkA = (temp_t1 - D_8012A0D0) / gWaveBoundingBoxDiffX; - otherModel->unkB = (temp_t2 - D_8012A0D4) / gWaveBoundingBoxDiffZ; - otherModel->unkC = otherModel->unkA + (otherModel->unkB * D_8012A0D8); + otherModel = &gWaveModel[i]; + otherModel->block = &levelSegments[i]; + otherModel->originX = temp_t1; + otherModel->originY = segmentVertexY; + otherModel->originZ = temp_t2; + otherModel->unkA = (temp_t1 - gWaveBlockPosX) / gWaveBoundingBoxDiffX; + otherModel->unkB = (temp_t2 - gWaveBlockPosZ) / gWaveBoundingBoxDiffZ; + otherModel->unkC = otherModel->unkA + (otherModel->unkB * gWaveTileCountX); otherModel->unk12 = 0; otherModel->unk10 = 0; if (levelSegments[i].hasWaves != 0) { - var_v0 = otherModel->unkA * sp44; - while (var_v0 >= D_80129FC8.unk4) { - var_v0 -= D_80129FC8.unk4; + var_v0 = otherModel->unkA * subdivisions; + while (var_v0 >= gWaveController.tileCount) { + var_v0 -= gWaveController.tileCount; } otherModel->unk12 = var_v0; - var_v0 = otherModel->unkB * sp44; - while (var_v0 >= D_80129FC8.unk4) { - var_v0 -= D_80129FC8.unk4; + var_v0 = otherModel->unkB * subdivisions; + while (var_v0 >= gWaveController.tileCount) { + var_v0 -= gWaveController.tileCount; } otherModel->unk10 = var_v0; D_8012A0E8[otherModel->unkB] |= (1 << otherModel->unkA); @@ -1446,212 +1496,214 @@ void func_800BC6C8(void) { s32 var_v0; f32 sp34[0x80]; - var_v0 = 0x4000 / D_80129FC8.unk0; + var_v0 = 0x4000 / gWaveController.subdivisions; var_s0 = 0; - for (i = 0; i < D_80129FC8.unk0;) { + for (i = 0; i < gWaveController.subdivisions;) { sp34[i++] = sins_f(var_s0); var_s0 += var_v0; } sp34[0] = 0.0f; - sp34[D_80129FC8.unk0] = 1.0f; + sp34[gWaveController.subdivisions] = 1.0f; k = 0; - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = 0; j <= D_80129FC8.unk0; j++) { + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = 0; j <= gWaveController.subdivisions; j++) { D_800E304C[4][k] = 1.0f; k++; } } k = 0; - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = 0; j <= D_80129FC8.unk0; j++) { + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = 0; j <= gWaveController.subdivisions; j++) { D_800E304C[1][k] = sp34[i]; k++; } } k = 0; - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = 0; j <= D_80129FC8.unk0;) { + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = 0; j <= gWaveController.subdivisions;) { D_800E304C[3][k++] = sp34[j++]; } } k = 0; - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = 0; j <= D_80129FC8.unk0;) { - D_800E304C[5][k++] = sp34[D_80129FC8.unk0 - j++]; + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = 0; j <= gWaveController.subdivisions;) { + D_800E304C[5][k++] = sp34[gWaveController.subdivisions - j++]; } } k = 0; - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = 0; j <= D_80129FC8.unk0; j++) { - D_800E304C[7][k] = sp34[D_80129FC8.unk0 - i]; + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = 0; j <= gWaveController.subdivisions; j++) { + D_800E304C[7][k] = sp34[gWaveController.subdivisions - i]; k++; } } - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = i; j <= D_80129FC8.unk0; j++) { - D_800E304C[0][i * (D_80129FC8.unk0 + 1) + j] = sp34[i]; - D_800E304C[0][j * (D_80129FC8.unk0 + 1) + i] = sp34[i]; + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = i; j <= gWaveController.subdivisions; j++) { + D_800E304C[0][i * (gWaveController.subdivisions + 1) + j] = sp34[i]; + D_800E304C[0][j * (gWaveController.subdivisions + 1) + i] = sp34[i]; } } - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = i; j <= D_80129FC8.unk0; j++) { - D_800E304C[2][(i * (D_80129FC8.unk0 + 1)) + D_80129FC8.unk0 - j] = sp34[i]; - D_800E304C[2][(j * (D_80129FC8.unk0 + 1)) + D_80129FC8.unk0 - i] = sp34[i]; + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = i; j <= gWaveController.subdivisions; j++) { + D_800E304C[2][(i * (gWaveController.subdivisions + 1)) + gWaveController.subdivisions - j] = sp34[i]; + D_800E304C[2][(j * (gWaveController.subdivisions + 1)) + gWaveController.subdivisions - i] = sp34[i]; } } - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = i; j <= D_80129FC8.unk0; j++) { - D_800E304C[6][(D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)) - (i * (D_80129FC8.unk0 + 1)) + j] = sp34[i]; - D_800E304C[6][(D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)) - (j * (D_80129FC8.unk0 + 1)) + i] = sp34[i]; + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = i; j <= gWaveController.subdivisions; j++) { + D_800E304C[6][(gWaveController.subdivisions * (gWaveController.subdivisions + 1)) - + (i * (gWaveController.subdivisions + 1)) + j] = sp34[i]; + D_800E304C[6][(gWaveController.subdivisions * (gWaveController.subdivisions + 1)) - + (j * (gWaveController.subdivisions + 1)) + i] = sp34[i]; } } - for (i = 0; i <= D_80129FC8.unk0; i++) { - for (j = i; j <= D_80129FC8.unk0; j++) { + for (i = 0; i <= gWaveController.subdivisions; i++) { + for (j = i; j <= gWaveController.subdivisions; j++) { // clang-format off - D_800E304C[8][(D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)) - (i * (D_80129FC8.unk0 + 1)) + D_80129FC8.unk0 - j] = sp34[i]; - D_800E304C[8][(D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)) - (j * (D_80129FC8.unk0 + 1)) + D_80129FC8.unk0 - i] = sp34[i]; + D_800E304C[8][(gWaveController.subdivisions * (gWaveController.subdivisions + 1)) - (i * (gWaveController.subdivisions + 1)) + gWaveController.subdivisions - j] = sp34[i]; + D_800E304C[8][(gWaveController.subdivisions * (gWaveController.subdivisions + 1)) - (j * (gWaveController.subdivisions + 1)) + gWaveController.subdivisions - i] = sp34[i]; // clang-format on } } } -void func_800BCC70(LevelModel *arg0) { - s32 sp18C; +void func_800BCC70(LevelModel *model) { + s32 i; u32 pad_sp188; s32 sp184; - s32 var_t2; + s32 k; s32 var_t4; s32 var_t8; - f32 var_f20; - f32 var_f22; - f32 var_f24; - f32 var_f26; - f32 var_f28; - s32 var_v0; + f32 y; + f32 x; + f32 z; + f32 stepX; + f32 stepZ; + s32 collisionCount; s32 sp140[8]; - s32 var_v1; + s32 j; s32 var_a1; s32 var_a2; s32 var_a3; s32 var_s2; - s32 var_s4; + s32 subdivisions; s32 var_s5; - f32 spAC[30]; + f32 colY[30]; f32 *spA8; Vec2i *spA4; u8 *spA0; - var_s4 = D_80129FC8.unk0; - if (D_80129FC8.unk28 != 0) { - var_s4 *= 2; + subdivisions = gWaveController.subdivisions; + if (gWaveController.doubleDensity) { + subdivisions *= 2; } - D_800E317C = (var_s4 + 1) * (var_s4 + 1); + gWaveTileTotal = (subdivisions + 1) * (subdivisions + 1); if (D_800E3178 != NULL) { mempool_free(D_800E3178); } - D_800E3178 = mempool_alloc_safe(arg0->numberOfSegments * D_800E317C, COLOUR_TAG_CYAN); - spA0 = mempool_alloc_safe(arg0->numberOfSegments * 4, COLOUR_TAG_CYAN); - spA4 = mempool_alloc_safe((D_8012A0D8 * D_8012A0DC) * 8, COLOUR_TAG_CYAN); - spA8 = mempool_alloc_safe((var_s4 * 4) + 4, COLOUR_TAG_CYAN); + D_800E3178 = mempool_alloc_safe(model->numberOfSegments * gWaveTileTotal, COLOUR_TAG_CYAN); + spA0 = mempool_alloc_safe(model->numberOfSegments * 4, COLOUR_TAG_CYAN); + spA4 = mempool_alloc_safe((gWaveTileCountX * gWaveTileCountZ) * 8, COLOUR_TAG_CYAN); + spA8 = mempool_alloc_safe((subdivisions * 4) + 4, COLOUR_TAG_CYAN); // temp assignment required for match pad_sp188 = -1; - for (var_a3 = 0; var_a3 < (D_8012A0D8 * D_8012A0DC); var_a3++) { + for (var_a3 = 0; var_a3 < (gWaveTileCountX * gWaveTileCountZ); var_a3++) { spA4[var_a3].i[0] = -1; spA4[var_a3].i[1] = pad_sp188; } - for (var_t2 = 0; var_t2 <= var_s4; var_t2++) { - spA8[var_t2] = (((var_s4 - (var_t2 << 1)) / (f32) var_s4) * 8.0f); + for (k = 0; k <= subdivisions; k++) { + spA8[k] = ((subdivisions - (k << 1)) / (f32) subdivisions) * 8.0f; } - var_f26 = D_8012A0A0 / var_s4; - var_f28 = D_8012A0A4 / var_s4; - for (sp18C = 0, var_s5 = 0; sp18C < arg0->numberOfSegments; sp18C++) { - if (D_8012A0E8[D_800E30D8[sp18C].unkB] & (1 << D_800E30D8[sp18C].unkA)) { - spA4[(D_800E30D8[sp18C].unkB * D_8012A0D8) + D_800E30D8[sp18C].unkA].i[0] = sp18C; - spA4[(D_800E30D8[sp18C].unkB * D_8012A0D8) + D_800E30D8[sp18C].unkA].i[1] = var_s5; - var_f20 = D_800E30D8[sp18C].unk6; - var_f24 = D_800E30D8[sp18C].unk8; - for (sp184 = 0; sp184 <= var_s4; sp184++) { - var_f22 = D_800E30D8[sp18C].unk4; - for (var_t2 = 0; var_t2 <= var_s4; var_t2++) { + stepX = gWaveBoundingBoxW / subdivisions; + stepZ = gWaveBoundingBoxH / subdivisions; + for (i = 0, var_s5 = 0; i < model->numberOfSegments; i++) { + if (D_8012A0E8[gWaveModel[i].unkB] & (1 << gWaveModel[i].unkA)) { + spA4[(gWaveModel[i].unkB * gWaveTileCountX) + gWaveModel[i].unkA].i[0] = i; + spA4[(gWaveModel[i].unkB * gWaveTileCountX) + gWaveModel[i].unkA].i[1] = var_s5; + y = gWaveModel[i].originY; + z = gWaveModel[i].originZ; + for (sp184 = 0; sp184 <= subdivisions; sp184++) { + x = gWaveModel[i].originX; + for (k = 0; k <= subdivisions; k++) { // var_v0 stores the length of spAC - var_v0 = func_8002BAB0(sp18C, spA8[var_t2] + var_f22, spA8[sp184] + var_f24, spAC); - if (var_v0 == 0) { - var_a2 = 0xFF; + collisionCount = func_8002BAB0(i, spA8[k] + x, spA8[sp184] + z, colY); + if (collisionCount == 0) { + var_a2 = 255; } else { - var_v1 = 0; - while (var_v1 < var_v0 - 1 && var_f20 <= spAC[var_v1]) { - var_v1++; + j = 0; + while (j < collisionCount - 1 && y <= colY[j]) { + j++; } - if (var_f20 < spAC[var_v1]) { + if (y < colY[j]) { var_a2 = 0; - } else if (var_f20 == spAC[var_v1]) { - var_a2 = 0xFF; + } else if (y == colY[j]) { + var_a2 = 255; } else { - var_a2 = (var_f20 - spAC[var_v1]) * D_80129FC8.unk48; - if (var_a2 > 0x1FF) { - var_a2 = 0x1FF; + var_a2 = (y - colY[j]) * gWaveController.unk48; + if (var_a2 > 511) { + var_a2 = 511; } var_a2 >>= 1; } } D_800E3178[var_s5++] = var_a2; - var_f22 += var_f26; + x += stepX; } - var_f24 += var_f28; + z += stepZ; } } else { // clang-format off // @note \ required here - for (var_t2 = 0; var_t2 < D_800E317C; var_t2++) { \ - D_800E3178[var_s5++] = 0xFF; + for (k = 0; k < gWaveTileTotal; k++) { \ + D_800E3178[var_s5++] = 255; } // clang-format on } } - for (sp184 = 0; sp184 < D_8012A0DC; sp184++) { - for (var_t2 = 0; var_t2 < D_8012A0D8; var_t2++) { - var_t4 = spA4[(sp184 * D_8012A0D8) + var_t2].i[1]; + for (sp184 = 0; sp184 < gWaveTileCountZ; sp184++) { + for (k = 0; k < gWaveTileCountX; k++) { + var_t4 = spA4[(sp184 * gWaveTileCountX) + k].i[1]; if (var_t4 != -1) { - if (sp184 < (D_8012A0DC - 1)) { - var_v0 = spA4[((sp184 + 1) * D_8012A0D8) + var_t2].i[1]; - if (var_v0 != -1) { - var_a1 = ((var_s4 + 1) * var_s4) + var_t4 + 1; - var_v1 = var_v0 + 1; - for (var_a3 = 0; var_a3 < var_s4 - 1; var_a3++) { - var_a2 = (D_800E3178[var_a1] + D_800E3178[var_v1]) >> 1; + if (sp184 < (gWaveTileCountZ - 1)) { + collisionCount = spA4[((sp184 + 1) * gWaveTileCountX) + k].i[1]; + if (collisionCount != -1) { + var_a1 = ((subdivisions + 1) * subdivisions) + var_t4 + 1; + j = collisionCount + 1; + for (var_a3 = 0; var_a3 < subdivisions - 1; var_a3++) { + var_a2 = (D_800E3178[var_a1] + D_800E3178[j]) >> 1; D_800E3178[var_a1] = var_a2; - D_800E3178[var_v1] = var_a2; - var_v1++; + D_800E3178[j] = var_a2; + j++; var_a1++; } } } - if (var_t2 < (D_8012A0D8 - 1)) { - var_v0 = spA4[(sp184 * D_8012A0D8) + var_t2 + 1].i[1]; - if (var_v0 != -1) { - var_a1 = (var_s4 * 2) + var_t4 + 1; - var_v1 = var_v0 + var_s4 + 1; - for (var_a3 = 0; var_a3 < var_s4 - 1; var_a3++) { - var_a2 = (D_800E3178[var_a1] + D_800E3178[var_v1]) >> 1; + if (k < (gWaveTileCountX - 1)) { + collisionCount = spA4[(sp184 * gWaveTileCountX) + k + 1].i[1]; + if (collisionCount != -1) { + var_a1 = (subdivisions * 2) + var_t4 + 1; + j = collisionCount + subdivisions + 1; + for (var_a3 = 0; var_a3 < subdivisions - 1; var_a3++) { + var_a2 = (D_800E3178[var_a1] + D_800E3178[j]) >> 1; D_800E3178[var_a1] = var_a2; - if (!var_v1) {} - D_800E3178[var_v1] = var_a2; - var_v1 += var_s4; - var_v1++; - var_a1 += var_s4; + if (!j) {} + D_800E3178[j] = var_a2; + j += subdivisions; + j++; + var_a1 += subdivisions; var_a1++; } } @@ -1660,50 +1712,50 @@ void func_800BCC70(LevelModel *arg0) { } } - for (var_t4 = 0, sp18C = 0; sp18C < arg0->numberOfSegments; sp18C++, var_t4 += D_800E317C) { - spA0[(sp18C * 4) + 0] = D_800E3178[var_t4]; - spA0[(sp18C * 4) + 1] = D_800E3178[var_t4 + (var_s4)]; - spA0[(sp18C * 4) + 2] = D_800E3178[var_t4 + ((var_s4 + 1) * var_s4)]; - spA0[(sp18C * 4) + 3] = D_800E3178[var_t4 + ((var_s4 + 1) * (var_s4 + 1)) - 1]; + for (var_t4 = 0, i = 0; i < model->numberOfSegments; i++, var_t4 += gWaveTileTotal) { + spA0[(i * 4) + 0] = D_800E3178[var_t4]; + spA0[(i * 4) + 1] = D_800E3178[var_t4 + (subdivisions)]; + spA0[(i * 4) + 2] = D_800E3178[var_t4 + ((subdivisions + 1) * subdivisions)]; + spA0[(i * 4) + 3] = D_800E3178[var_t4 + ((subdivisions + 1) * (subdivisions + 1)) - 1]; } - for (var_t4 = 0, sp18C = 0; sp18C < arg0->numberOfSegments; sp18C++, var_t4 += D_800E317C) { - var_s5 = (D_800E30D8[sp18C].unkB * D_8012A0D8) + D_800E30D8[sp18C].unkA; + for (var_t4 = 0, i = 0; i < model->numberOfSegments; i++, var_t4 += gWaveTileTotal) { + var_s5 = (gWaveModel[i].unkB * gWaveTileCountX) + gWaveModel[i].unkA; if (spA4[var_s5].i[0] != -1) { for (var_a3 = 0; var_a3 < ARRAY_COUNT(sp140); var_a3++) { sp140[var_a3] = -1; } - if (D_800E30D8[sp18C].unkB > 0) { - if (D_800E30D8[sp18C].unkA > 0) { - sp140[0] = spA4[var_s5 - D_8012A0D8 - 1].i[0]; + if (gWaveModel[i].unkB > 0) { + if (gWaveModel[i].unkA > 0) { + sp140[0] = spA4[var_s5 - gWaveTileCountX - 1].i[0]; } - sp140[1] = spA4[var_s5 - D_8012A0D8].i[0]; - if (D_800E30D8[sp18C].unkA < D_8012A0D8 - 1) { - sp140[2] = spA4[var_s5 - D_8012A0D8 + 1].i[0]; + sp140[1] = spA4[var_s5 - gWaveTileCountX].i[0]; + if (gWaveModel[i].unkA < gWaveTileCountX - 1) { + sp140[2] = spA4[var_s5 - gWaveTileCountX + 1].i[0]; } } - if (D_800E30D8[sp18C].unkA > 0) { + if (gWaveModel[i].unkA > 0) { sp140[3] = spA4[var_s5 - 1].i[0]; } - if (D_800E30D8[sp18C].unkA < (D_8012A0D8 - 1)) { + if (gWaveModel[i].unkA < (gWaveTileCountX - 1)) { sp140[4] = spA4[var_s5 + 1].i[0]; } - if (D_800E30D8[sp18C].unkB < (D_8012A0DC - 1)) { - if (D_800E30D8[sp18C].unkA > 0) { - sp140[5] = spA4[var_s5 + D_8012A0D8 - 1].i[0]; + if (gWaveModel[i].unkB < (gWaveTileCountZ - 1)) { + if (gWaveModel[i].unkA > 0) { + sp140[5] = spA4[var_s5 + gWaveTileCountX - 1].i[0]; } - sp140[6] = spA4[var_s5 + D_8012A0D8].i[0]; - if (D_800E30D8[sp18C].unkA < D_8012A0D8 - 1) { - sp140[7] = spA4[var_s5 + D_8012A0D8 + 1].i[0]; + sp140[6] = spA4[var_s5 + gWaveTileCountX].i[0]; + if (gWaveModel[i].unkA < gWaveTileCountX - 1) { + sp140[7] = spA4[var_s5 + gWaveTileCountX + 1].i[0]; } } var_a3 = 1; - var_a2 = spA0[sp18C * 4]; + var_a2 = spA0[i * 4]; if (sp140[0] != -1) { var_a3++; var_a2 += spA0[(sp140[0] * 4) + 3]; @@ -1720,7 +1772,7 @@ void func_800BCC70(LevelModel *arg0) { } D_800E3178[var_t4] = var_a2 / var_a3; - var_a2 = spA0[(sp18C * 4) + 1]; + var_a2 = spA0[(i * 4) + 1]; var_a3 = 1; if (sp140[1] != -1) { var_a3++; @@ -1736,9 +1788,9 @@ void func_800BCC70(LevelModel *arg0) { var_a3++; var_a2 += spA0[sp140[4] * 4]; } - D_800E3178[var_t4 + var_s4] = var_a2 / var_a3; + D_800E3178[var_t4 + subdivisions] = var_a2 / var_a3; - var_a2 = spA0[(sp18C * 4) + 2]; + var_a2 = spA0[(i * 4) + 2]; var_a3 = 1; if (sp140[3] != -1) { var_a3++; @@ -1754,9 +1806,9 @@ void func_800BCC70(LevelModel *arg0) { var_a3++; var_a2 += spA0[sp140[6] * 4]; } - D_800E3178[var_t4 + ((var_s4 + 1) * var_s4)] = var_a2 / var_a3; + D_800E3178[var_t4 + ((subdivisions + 1) * subdivisions)] = var_a2 / var_a3; - var_a2 = spA0[(sp18C * 4) + 3]; + var_a2 = spA0[(i * 4) + 3]; var_a3 = 1; if (sp140[4] != -1) { var_a3++; @@ -1773,7 +1825,7 @@ void func_800BCC70(LevelModel *arg0) { var_a2 += spA0[sp140[7] * 4]; } - D_800E3178[var_t4 + ((var_s4 + 1) * (var_s4 + 1)) - 1] = var_a2 / var_a3; + D_800E3178[var_t4 + ((subdivisions + 1) * (subdivisions + 1)) - 1] = var_a2 / var_a3; } } @@ -1832,24 +1884,24 @@ s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNeg s32 var_s7; // sp74 s32 var_t8; - var_t0 = (arg0 * D_800E317C); - spCC = D_8012A0B8; - spC8 = D_8012A0BC; - var_f24 = (1.0f - D_80129FC8.unk44) / 127.0f; - if (D_80129FC8.unk28 != FALSE) { - sp36C = D_80129FC8.unk0 * 2; + var_t0 = (arg0 * gWaveTileTotal); + spCC = gWaveVtxStepX; + spC8 = gWaveVtxStepZ; + var_f24 = (1.0f - gWaveController.unk44) / 127.0f; + if (gWaveController.doubleDensity != FALSE) { + sp36C = gWaveController.subdivisions * 2; spCC *= 0.5; spC8 *= 0.5; var_f22 = 0.5f; } else { var_f22 = 1.0f; - sp36C = D_80129FC8.unk0; + sp36C = gWaveController.subdivisions; } - var_f12 = shadowXNegPosition - D_800E30D8[arg0].unk4; - var_f14 = shadowZNegPosition - D_800E30D8[arg0].unk8; - var_f16 = shadowXPosition - D_800E30D8[arg0].unk4; - var_f18 = shadowZPosition - D_800E30D8[arg0].unk8; + var_f12 = shadowXNegPosition - gWaveModel[arg0].originX; + var_f14 = shadowZNegPosition - gWaveModel[arg0].originZ; + var_f16 = shadowXPosition - gWaveModel[arg0].originX; + var_f18 = shadowZPosition - gWaveModel[arg0].originZ; if (var_f12 < 0.0f) { sp368 = 0; @@ -1863,26 +1915,26 @@ s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNeg sp364 = var_f14 / spC8; } - if (D_8012A0A0 <= var_f16) { + if (gWaveBoundingBoxW <= var_f16) { sp358 = sp36C; } else { sp358 = (s32) (var_f16 / spCC) + 1; } - if (D_8012A0A4 <= var_f18) { + if (gWaveBoundingBoxH <= var_f18) { sp354 = sp36C; } else { sp354 = (s32) (var_f18 / spCC) + 1; } - var_v1 = D_800E30D8[arg0].unk12 + sp368; - while (var_v1 >= D_80129FC8.unk4) { - var_v1 -= D_80129FC8.unk4; + var_v1 = gWaveModel[arg0].unk12 + sp368; + while (var_v1 >= gWaveController.tileCount) { + var_v1 -= gWaveController.tileCount; } - var_v0 = D_800E30D8[arg0].unk10 + sp364; - while (var_v0 >= D_80129FC8.unk4) { - var_v0 -= D_80129FC8.unk4; + var_v0 = gWaveModel[arg0].unk10 + sp364; + while (var_v0 >= gWaveController.tileCount) { + var_v0 -= gWaveController.tileCount; } var_s6 = sp364; @@ -1894,35 +1946,36 @@ s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNeg do { var_s4 = spA4; var_s0 = var_v1; - var_s2 = (sp34C * D_80129FC8.unk4) + var_v1; + var_s2 = (sp34C * gWaveController.tileCount) + var_v1; if (sp358 >= sp368) { var_s1 = sp368; var_s5 = sp358 + 1; do { - var_f20 = (D_800E3040[D_800E3044[var_s2].s[0]] + D_800E3040[D_800E3044[var_s2].s[1]]) * - D_80129FC8.magnitude; - if (D_800E3188 > 0) { - var_f20 += func_800BEFC4(arg0, var_s1, var_s6); + var_f20 = (gWaveHeightTable[gWaveHeightIndices[var_s2].s[0]] + + gWaveHeightTable[gWaveHeightIndices[var_s2].s[1]]) * + gWaveController.magnitude; + if (gWaveGenCount > 0) { + var_f20 += waves_get_y(arg0, var_s1, var_s6); } if (D_800E3178[var_s4] < 0x7F) { // s32 cast below required - var_f20 *= D_80129FC8.unk44 + ((s32) D_800E3178[var_s4] * var_f24); + var_f20 *= gWaveController.unk44 + ((s32) D_800E3178[var_s4] * var_f24); } var_s1++; var_s7++; var_s0++; var_s4++; var_s2++; - spD8[var_s7 - 1] = D_800E30D8[arg0].unk6 + (s32) (var_f20 * var_f22); - if (var_s0 >= D_80129FC8.unk4) { - var_s0 -= D_80129FC8.unk4; - var_s2 -= D_80129FC8.unk4; + spD8[var_s7 - 1] = gWaveModel[arg0].originY + (s32) (var_f20 * var_f22); + if (var_s0 >= gWaveController.tileCount) { + var_s0 -= gWaveController.tileCount; + var_s2 -= gWaveController.tileCount; } } while (var_s5 != var_s1); } sp34C++; - if (sp34C >= D_80129FC8.unk4) { - sp34C -= D_80129FC8.unk4; + if (sp34C >= gWaveController.tileCount) { + sp34C -= gWaveController.tileCount; } spA4 += sp36C; var_s6++; @@ -1931,13 +1984,13 @@ s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNeg var_s7 = 0; sp36C = (sp358 - sp368) + 1; - var_a1 = D_800E30D8[arg0].unk8 + (s32) (sp364 * spC8); + var_a1 = gWaveModel[arg0].originZ + (s32) (sp364 * spC8); if (sp364 < sp354) { sp98 = sp368 * spCC; var_s6 = sp364; do { - var_s8 = D_800E30D8[arg0].unk8 + (s32) ((var_s6 + 1) * spC8); - var_s3_2 = D_800E30D8[arg0].unk4 + sp98; + var_s8 = gWaveModel[arg0].originZ + (s32) ((var_s6 + 1) * spC8); + var_s3_2 = gWaveModel[arg0].originX + sp98; if (sp368 < sp358) { var_s0_2 = &arg1[var_s7]; // a3 / t5 as index @@ -2008,7 +2061,7 @@ s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNeg var_f28 = var_f26 * var_f26; do { var_s0_2->unk0 = var_s3_2; - var_s2_s16 = D_800E30D8[arg0].unk4 + (s32) (var_s1 * spCC); + var_s2_s16 = gWaveModel[arg0].originX + (s32) (var_s1 * spCC); var_s0_2->unk6 = var_s3_2; var_s0_2->unkC = var_s2_s16; var_s0_2->unk2 = spD8[temp1_2]; @@ -2074,7 +2127,7 @@ s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNeg #pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BDC80.s") #endif -Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { +Object_Log *obj_wave_init(s32 blockID, f32 x, f32 z) { f32 spE4; f32 temp_f; s32 pad; @@ -2104,72 +2157,72 @@ Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { s32 sp68[6]; s32 sp5C[3]; f32 sp50[3]; - Object_64 *object; + Object_Log *object; - var_t0 = 0x80; + var_t0 = 128; object = NULL; - if (D_800E3040 != NULL && arg0 >= 0 && arg0 < gNumberOfLevelSegments) { - object = mempool_alloc_safe((D_80129FC8.unk20 >> 1) + 0xE, COLOUR_TAG_CYAN); - object->effect_box.unk0 = D_800E30D8[arg0].unk6; - object->effect_box.unk2 = 0; - object->effect_box.unk3 = 1; - object->effect_box.unk4 = 0; - object->effect_box.unk6 = D_80129FC8.unk20; - var_f20 = D_8012A0BC; - var_f22 = D_8012A0B8; - temp_f2 = (1.0f - D_80129FC8.unk44) / 127.0f; + if (gWaveHeightTable != NULL && blockID >= 0 && blockID < gNumberOfLevelSegments) { + object = mempool_alloc_safe((gWaveController.seedSize >> 1) + (sizeof(Object_Log) - 2), COLOUR_TAG_CYAN); + object->unk0 = gWaveModel[blockID].originY; + object->unk2 = 0; + object->unk3 = 1; + object->unk4 = 0; + object->unk6 = gWaveController.seedSize; + var_f20 = gWaveVtxStepZ; + var_f22 = gWaveVtxStepX; + temp_f2 = (1.0f - gWaveController.unk44) / 127.0f; var_f2 = temp_f2; - spB0 = (arg0 * D_800E317C); - if (D_80129FC8.unk28 != 0) { - var_t4 = (D_80129FC8.unk0 * 2) + 1; - var_f20 *= 0.5f; - var_f22 *= 0.5f; + spB0 = (blockID * gWaveTileTotal); + if (gWaveController.doubleDensity) { + var_t4 = (gWaveController.subdivisions * 2) + 1; + var_f20 /= 2.0f; + var_f22 /= 2.0f; } else { - var_t4 = D_80129FC8.unk0 + 1; + var_t4 = gWaveController.subdivisions + 1; } // clang-format off - arg1 -= D_800E30D8[arg0].unk4; - if (arg1 < 0.0f) { arg1 = 0.0f; } - else if (arg1 >= D_8012A0A0) { arg1 = D_8012A0A0 - 1; } - arg2 -= D_800E30D8[arg0].unk8; - if (arg2 < 0.0f) { arg2 = 0.0f; } - else if (arg2 >= D_8012A0A4) { arg2 = D_8012A0A4 - 1; } + x -= gWaveModel[blockID].originX; + if (x < 0.0f) { x = 0.0f; } + else if (x >= gWaveBoundingBoxW) { x = gWaveBoundingBoxW - 1; } + z -= gWaveModel[blockID].originZ; + if (z < 0.0f) { z = 0.0f; } + else if (z >= gWaveBoundingBoxH) { z = gWaveBoundingBoxH - 1; } // clang-format on - spC4 = arg1 / var_f22; - spC0 = arg2 / var_f20; - object->effect_box.unk8 = spC4; - object->effect_box.unkA = spC0; - object->effect_box.unkC = arg0; - arg1 -= (spC4 * var_f22); - arg2 -= (spC0 * var_f20); - var_a0 = D_800E30D8[arg0].unk12 + spC4; - while (var_a0 >= D_80129FC8.unk4) { - var_a0 -= D_80129FC8.unk4; + spC4 = x / var_f22; + spC0 = z / var_f20; + object->unk8 = spC4; + object->unkA = spC0; + object->blockID = blockID; + x -= (spC4 * var_f22); + z -= (spC0 * var_f20); + var_a0 = gWaveModel[blockID].unk12 + spC4; + while (var_a0 >= gWaveController.tileCount) { + var_a0 -= gWaveController.tileCount; } - var_v0 = D_800E30D8[arg0].unk10 + spC0; - while (var_v0 >= D_80129FC8.unk4) { - var_v0 -= D_80129FC8.unk4; + var_v0 = gWaveModel[blockID].unk10 + spC0; + while (var_v0 >= gWaveController.tileCount) { + var_v0 -= gWaveController.tileCount; } var_t1 = FALSE; - if (arg2 != var_f20 && arg1 < (((var_f20 - arg2) / var_f20) * var_f22)) { + if (z != var_f20 && x < (((var_f20 - z) / var_f20) * var_f22)) { var_t1 = TRUE; } if (var_t1 != FALSE) { - sp80[0] = (var_v0 * D_80129FC8.unk4) + var_a0; + sp80[0] = (var_v0 * gWaveController.tileCount) + var_a0; - if ((var_v0 + 1) >= D_80129FC8.unk4) { + if ((var_v0 + 1) >= gWaveController.tileCount) { sp80[1] = var_a0; } else { - sp80[1] = ((var_v0 + 1) * D_80129FC8.unk4) + var_a0; + sp80[1] = ((var_v0 + 1) * gWaveController.tileCount) + var_a0; } - if ((var_a0 + 1) >= D_80129FC8.unk4) { - sp80[2] = (var_v0 * D_80129FC8.unk4); + if ((var_a0 + 1) >= gWaveController.tileCount) { + sp80[2] = (var_v0 * gWaveController.tileCount); } else { - sp80[2] = (var_v0 * D_80129FC8.unk4) + var_a0 + 1; + sp80[2] = (var_v0 * gWaveController.tileCount) + var_a0 + 1; } spE4 = 0.0f; @@ -2177,26 +2230,26 @@ Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { sp5C[1] = (spB0 + spC4) + ((spC0 + 1) * var_t4); sp5C[2] = (spB0 + spC4) + (spC0 * var_t4) + 1; } else { - if ((var_a0 + 1) >= D_80129FC8.unk4) { - sp80[0] = var_v0 * D_80129FC8.unk4; + if ((var_a0 + 1) >= gWaveController.tileCount) { + sp80[0] = var_v0 * gWaveController.tileCount; } else { - sp80[0] = var_a0 + 1 + (var_v0 * D_80129FC8.unk4); + sp80[0] = var_a0 + 1 + (var_v0 * gWaveController.tileCount); } - if ((var_v0 + 1) >= D_80129FC8.unk4) { + if ((var_v0 + 1) >= gWaveController.tileCount) { sp80[1] = var_a0; } else { - sp80[1] = ((var_v0 + 1) * D_80129FC8.unk4) + var_a0; + sp80[1] = ((var_v0 + 1) * gWaveController.tileCount) + var_a0; } - if ((var_a0 + 1) >= D_80129FC8.unk4) { + if ((var_a0 + 1) >= gWaveController.tileCount) { sp80[2] = 0; } else { sp80[2] = var_a0 + 1; } - if ((var_v0 + 1) < D_80129FC8.unk4) { - sp80[2] += (var_v0 + 1) * D_80129FC8.unk4; + if ((var_v0 + 1) < gWaveController.tileCount) { + sp80[2] += (var_v0 + 1) * gWaveController.tileCount; } spE4 = var_f22; @@ -2206,26 +2259,26 @@ Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { } for (var_a3 = 0; var_a3 < 3; var_a3++) { - sp68[var_a3 * 2] = D_800E3044[sp80[var_a3]].s[0]; - sp68[var_a3 * 2 + 1] = D_800E3044[sp80[var_a3]].s[1]; + sp68[var_a3 * 2] = gWaveHeightIndices[sp80[var_a3]].s[0]; + sp68[var_a3 * 2 + 1] = gWaveHeightIndices[sp80[var_a3]].s[1]; sp50[var_a3] = 1.0f; var_a2 = D_800E3178[sp5C[var_a3]]; if (var_a2 < 0x7F) { - sp50[var_a3] *= D_80129FC8.unk44 + (var_a2 * var_f2); + sp50[var_a3] *= gWaveController.unk44 + (var_a2 * var_f2); } } - if (D_80129FC8.unk28 != 0) { - sp50[0] *= 0.5; - sp50[1] *= 0.5; - sp50[2] *= 0.5; + if (gWaveController.doubleDensity) { + sp50[0] /= 2.0; + sp50[1] /= 2.0; + sp50[2] /= 2.0; } - for (var_a3 = 0; var_a3 < (D_80129FC8.unk20 >> 1); var_a3++) { - temp_f = (D_800E3040[sp68[0]] + D_800E3040[sp68[1]]) * sp50[0]; - var_f12 = (D_800E3040[sp68[2]] + D_800E3040[sp68[3]]) * sp50[1]; - var_f0 = (D_800E3040[sp68[4]] + D_800E3040[sp68[5]]) * sp50[2]; + for (var_a3 = 0; var_a3 < (gWaveController.seedSize >> 1); var_a3++) { + temp_f = (gWaveHeightTable[sp68[0]] + gWaveHeightTable[sp68[1]]) * sp50[0]; + var_f12 = (gWaveHeightTable[sp68[2]] + gWaveHeightTable[sp68[3]]) * sp50[1]; + var_f0 = (gWaveHeightTable[sp68[4]] + gWaveHeightTable[sp68[5]]) * sp50[2]; if (var_t1 != FALSE) { var_f2 = (temp_f - var_f0) * var_f20; var_f14 = (temp_f - var_f12) * var_f22; @@ -2238,8 +2291,8 @@ Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { var_f2 /= var_f0; var_f14 /= var_f0; var_f12 = var_f18 / var_f0; - var_v0_2 = -(s32) (((var_f2 * arg1) + (var_f14 * arg2) - ((spE4 * var_f2) + (temp_f * var_f12))) * 16.0f / - var_f12); + var_v0_2 = + -(s32) (((var_f2 * x) + (var_f14 * z) - ((spE4 * var_f2) + (temp_f * var_f12))) * 16.0f / var_f12); if (var_v0_2 >= var_t0 || var_v0_2 < -var_t0) { var_v1 = 0; do { @@ -2248,15 +2301,15 @@ Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { } while (var_v0_2 >= var_t0 || var_v0_2 < -var_t0); for (var_a1 = 0; var_a1 < var_a3; var_a1++) { - object->effect_box.unkE[var_a1] >>= var_v1; + object->unkE[var_a1] >>= var_v1; } - object->effect_box.unk2 += var_v1; + object->unk2 += var_v1; } - object->effect_box.unkE[var_a3] = (var_v0_2 >> object->effect_box.unk2); + object->unkE[var_a3] = (var_v0_2 >> object->unk2); for (var_a1 = 0; var_a1 < 6; var_a1++) { sp68[var_a1] += 2; - while (sp68[var_a1] >= D_80129FC8.unk20) { - sp68[var_a1] -= D_80129FC8.unk20; + while (sp68[var_a1] >= gWaveController.seedSize) { + sp68[var_a1] -= gWaveController.seedSize; } } } @@ -2266,9 +2319,9 @@ Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { } /** - * Finds the wave height and returns it for the spinning log object. + * Finds the wave height and returns it for the given object. */ -f32 log_wave_height(Object_Log *log, s32 updateRate) { +f32 obj_wave_height(Object_Log *log, s32 updateRate) { s32 var_t0; f32 y; @@ -2292,110 +2345,111 @@ f32 log_wave_height(Object_Log *log, s32 updateRate) { var_t0 <<= log->unk2; } y = (((f32) var_t0 / 16.0) + (f32) log->unk0); - y *= D_80129FC8.magnitude; - y += func_800BEFC4(log->unkC, log->unk8, log->unkA); + y *= gWaveController.magnitude; + y += waves_get_y(log->blockID, log->unk8, log->unkA); return y; } // height related calculation? -f32 func_800BEFC4(s32 arg0, s32 arg1, s32 arg2) { - f32 temp_f0; - f32 temp_f12; - f32 temp_f20; - f32 temp_f22; +f32 waves_get_y(s32 blockID, s32 arg1, s32 arg2) { + f32 dist; + f32 distSq; + f32 diffX; + f32 diffZ; f32 temp_f24; - f32 temp_f26; + f32 zeroCheck; f32 temp_f30; - f32 var_f0; - f32 var_f28; - f32 var_f2; + f32 stepX; + f32 y; + f32 stepZ; u32 var_s0; s32 temp_a1; - s32 var_s3; - s32 var_v1; + s32 i; + s32 subdivisons; s32 temp_0; unk800E3184 *temp_a3; - unk800E3190 *temp_s1; + WaveGen *gen; - var_f28 = 0.0f; - if (D_800E3188 <= 0) { - return var_f28; + y = 0.0f; + if (gWaveGenCount <= 0) { + return y; } - var_v1 = D_80129FC8.unk0; - var_f0 = D_8012A0B8; - var_f2 = D_8012A0BC; - if (D_80129FC8.unk28 != FALSE) { - var_v1 *= 2; - var_f0 *= 0.5f; - var_f2 *= 0.5f; + subdivisons = gWaveController.subdivisions; + stepX = gWaveVtxStepX; + stepZ = gWaveVtxStepZ; + if (gWaveController.doubleDensity) { + subdivisons *= 2; + stepX /= 2.0f; + stepZ /= 2.0f; } - temp_a1 = (D_800E30D8[arg0].unkA * var_v1) + arg1; + temp_a1 = (gWaveModel[blockID].unkA * subdivisons) + arg1; temp_a3 = &D_800E3184[temp_a1]; if (temp_a3->unk0[0] != 0xFF) { - temp_0 = arg2 + (var_v1 * D_800E30D8[arg0].unkB); - temp_f30 = D_8012A0D0 + (temp_a1 * var_f0); - temp_f24 = D_8012A0D4 + (temp_0 * var_f2); - temp_f26 = 0; - var_s3 = 0; + temp_0 = arg2 + (subdivisons * gWaveModel[blockID].unkB); + temp_f30 = gWaveBlockPosX + (temp_a1 * stepX); + temp_f24 = gWaveBlockPosZ + (temp_0 * stepZ); + zeroCheck = 0; + i = 0; do { - temp_s1 = &D_800E3190[temp_a3->unk0[var_s3]]; - if ((temp_s1->unk0 <= temp_f24) && (temp_f24 <= temp_s1->unk4)) { - temp_f20 = temp_f30 - temp_s1->unk8; - temp_f22 = temp_f24 - temp_s1->unkC; - temp_f12 = (temp_f20 * temp_f20) + (temp_f22 * temp_f22); - if (temp_f12 < temp_s1->unk14) { - temp_f0 = sqrtf(temp_f12); - var_s0 = temp_s1->unk1A; - if (temp_s1->unk31 != 0) { - if (temp_f20 < temp_f26) { - var_s0 -= (s32) (temp_f20 * temp_s1->unk20); + gen = &gWaveGenList[temp_a3->unk0[i]]; + if (gen->minZ <= temp_f24 && temp_f24 <= gen->maxZ) { + diffX = temp_f30 - gen->x_position; + diffZ = temp_f24 - gen->z_position; + distSq = (diffX * diffX) + (diffZ * diffZ); + if (distSq < gen->radiusSq) { + dist = sqrtf(distSq); + var_s0 = gen->unk1A; + if (gen->unk30) { + if (diffX < zeroCheck) { + var_s0 -= (s32) (diffX * gen->unk20); } else { - var_s0 += (s32) (temp_f20 * temp_s1->unk20); + var_s0 += (s32) (diffX * gen->unk20); } - } else if (temp_s1->unk32 != 0) { - if (temp_f20 < temp_f26) { - var_s0 -= (s32) (temp_f22 * temp_s1->unk20); + } else if (gen->unk31) { + if (diffX < zeroCheck) { + var_s0 -= (s32) (diffZ * gen->unk20); } else { - var_s0 += (s32) (temp_f22 * temp_s1->unk20); + var_s0 += (s32) (diffZ * gen->unk20); } } else { - var_s0 += (s32) (temp_f0 * temp_s1->unk20); + var_s0 += (s32) (dist * gen->unk20); } - temp_f20 = coss_f((temp_f0 * 65536.0f) / temp_s1->unk10); - var_f28 += temp_s1->unk24 * sins_f(var_s0) * temp_f20; + diffX = coss_f((dist * 65536.0f) / gen->radius); + y += gen->unk24 * sins_f(var_s0) * diffX; } } - var_s3++; - } while (var_s3 < 8 && temp_a3->unk0[var_s3] != 0xFF); + i++; + } while (i < 8 && temp_a3->unk0[i] != 0xFF); } - return var_f28; + return y; } -void func_800BF3E4(Object *obj) { +void wavegen_destroy(Object *obj) { s32 i; s32 k; s32 j; - s32 m; + s32 hasWave; unk800E3184 *temp_a1; - if (D_800E3190 == NULL) { + if (gWaveGenList == NULL) { return; } - for (i = 0, m = 0; i < D_800E3188 && m == 0; i++) { - if (obj == D_800E3194[i]) { - m = -1; + for (i = 0, hasWave = FALSE; i < gWaveGenCount && hasWave == FALSE; i++) { + if (obj == gWaveGenObjs[i]) { + hasWave = -1; } } - if (m == 0) { + if (hasWave == FALSE) { + stubbed_printf("\nError :: can not remove a wave swell object which doesn't exist !"); return; } i--; - for (j = 0; j < D_800E318C; j++) { + for (j = 0; j < gWaveTileGridCount; j++) { for (k = 0, temp_a1 = &D_800E3184[j]; k < 8 && temp_a1->unk0[k] != 0xFF; k++) { if (i != temp_a1->unk0[k]) { continue; @@ -2410,77 +2464,80 @@ void func_800BF3E4(Object *obj) { } } - D_800E3194[j] = NULL; - D_800E3188--; + gWaveGenObjs[j] = NULL; + gWaveGenCount--; } -void func_800BF524(Object *obj) { - LevelObjectEntry800BF524 *temp_v0; - s32 var_v1; +void wavegen_add(Object *obj) { + LevelObjectEntry_WaveGenerator *temp_v0; + s32 flags; - temp_v0 = &obj->segment.level_entry->unk800BF524; - var_v1 = 0; + temp_v0 = &obj->segment.level_entry->waveGenerator; + flags = 0; if (temp_v0->unk10 != 0) { - var_v1 = 1; + flags = 1; } if (temp_v0->unk11 != 0) { - var_v1 |= 2; + flags |= 2; } - func_800BF634(obj, obj->segment.trans.x_position, obj->segment.trans.z_position, (f32) temp_v0->unkA, - temp_v0->unk9 << 8, (f32) temp_v0->unk8 / 16.0, (f32) temp_v0->unkE, (f32) temp_v0->unkC / 16.0, - var_v1); + wavegen_register(obj, obj->segment.trans.x_position, obj->segment.trans.z_position, (f32) temp_v0->waveSize, + temp_v0->unk9 << 8, (f32) temp_v0->unk8 / 16.0, (f32) temp_v0->unkE, (f32) temp_v0->unkC / 16.0, + flags); } -unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, f32 arg5, f32 arg6, f32 arg7, - s32 arg8) { - f32 var_f0; - s32 var_a0; - s32 var_a0_2; +const char D_800E9228[] = "\nError :: more than eight swells overlap on column %d."; + +WaveGen *wavegen_register(Object *obj, f32 xPos, f32 zPos, f32 waveSize, s32 arg4, f32 arg5, f32 arg6, f32 arg7, + s32 flags) { + f32 stepSize; + s32 emptyWave; + s32 minX; s32 j; - s32 var_a2_2; + s32 maxX; s32 k; s32 i; unk800E3184 *temp; - unk800E3190 *result; + WaveGen *result; result = NULL; - if (D_800E3190 != NULL) { - for (i = 0, var_a0 = 0; i < 32 && var_a0 == 0; i++) { - if (D_800E3194[i] == NULL) { - var_a0 = -1; + if (gWaveGenList != NULL) { + for (i = 0, emptyWave = FALSE; i < 32 && emptyWave == FALSE; i++) { + if (gWaveGenObjs[i] == NULL) { + emptyWave = -1; // Why it is -1 is anyone's guess. Though all that's important is that it's nonzero. } } i--; - if (var_a0 != 0) { - D_800E3194[i] = obj; - D_800E3188++; - var_f0 = D_8012A0B8; - if (D_80129FC8.unk28 != FALSE) { - var_f0 /= 2.0f; + if (emptyWave) { + gWaveGenObjs[i] = obj; + gWaveGenCount++; + stepSize = gWaveVtxStepX; + if (gWaveController.doubleDensity) { + stepSize /= 2.0f; } - var_a0_2 = (((xPos - arg3) - D_8012A0D0) / var_f0); - if (var_a0_2 >= D_800E318C) { + minX = ((xPos - waveSize) - gWaveBlockPosX) / stepSize; + if (minX >= gWaveTileGridCount) { + stubbed_printf("\nError :: can not add another wave swell, reached limit of %d.", gWaveTileGridCount); return result; } - var_a2_2 = (((xPos + arg3) - D_8012A0D0) / var_f0); - if (var_a2_2 < 0) { + maxX = ((xPos + waveSize) - gWaveBlockPosX) / stepSize; + if (maxX < 0) { return result; } - if (var_a0_2 < 0) { - var_a0_2 = 0; + if (minX < 0) { + minX = 0; } - if (var_a2_2 >= D_800E318C) { - var_a2_2 = D_800E318C - 1; + if (maxX >= gWaveTileGridCount) { + maxX = gWaveTileGridCount - 1; } - for (j = var_a0_2; j <= var_a2_2; j++) { + for (j = minX; j <= maxX; j++) { temp = &D_800E3184[j]; if (temp->unk0[7] != 0xFF) { continue; @@ -2492,14 +2549,14 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, } temp->unk0[k] = i; } - result = &D_800E3190[i]; - result->unk0 = zPos - arg3; - result->unk4 = zPos + arg3; - result->unk8 = xPos; - result->unkC = zPos; - result->unk10 = arg3; - result->unk18 = i; - result->unk14 = arg3 * arg3; + result = &gWaveGenList[i]; + result->minZ = zPos - waveSize; + result->maxZ = zPos + waveSize; + result->x_position = xPos; + result->z_position = zPos; + result->radius = waveSize; + result->index = i; + result->radiusSq = waveSize * waveSize; result->unk1A = arg4; if (osTvType == OS_TV_TYPE_PAL) { result->unk1C = arg5 * 20971.52; //(f64) (0x80000 / 25.0); @@ -2509,8 +2566,8 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, result->unk20 = 65536.0f / arg6; result->unk24 = arg7; result->unk28 = arg5; - result->unk31 = arg8 & 1; - result->unk32 = arg8 & 2; + result->unk30 = flags & 1; + result->unk31 = flags & 2; result->unk2C = arg6; } } @@ -2518,7 +2575,7 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, return result; } -UNUSED void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { +UNUSED void func_800BF9F8(WaveGen *gen, f32 arg1, f32 arg2) { UNUSED s32 pad[4]; s32 sp1C; f32 var_f0; @@ -2527,34 +2584,34 @@ UNUSED void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { s32 var_a2; s32 j; s32 iteration; - s32 temp_v1; + s32 index; u8 *var_a2_2; - if (arg0 == NULL) { + if (gen == NULL) { return; } - var_f0 = D_8012A0B8; + var_f0 = gWaveVtxStepX; iteration = 0; - if (D_80129FC8.unk28 != FALSE) { - var_f0 *= 0.5f; + if (gWaveController.doubleDensity) { + var_f0 /= 2.0f; } - temp_v1 = arg0->unk18; + index = gen->index; while (iteration != 2) { var_a1 = TRUE; - var_a2 = ((arg0->unk8 - arg0->unk10) - D_8012A0D0) / var_f0; - if (var_a2 >= D_800E318C) { + var_a2 = ((gen->x_position - gen->radius) - gWaveBlockPosX) / var_f0; + if (var_a2 >= gWaveTileGridCount) { var_a1 = FALSE; } else if (var_a2 < 0) { var_a2 = 0; } if (var_a1) { - sp1C = ((arg0->unk8 + arg0->unk10) - D_8012A0D0) / var_f0; + sp1C = ((gen->x_position + gen->radius) - gWaveBlockPosX) / var_f0; if (sp1C < 0) { var_a1 = FALSE; - } else if (sp1C >= D_800E318C) { - sp1C = D_800E318C - 1; + } else if (sp1C >= gWaveTileGridCount) { + sp1C = gWaveTileGridCount - 1; } } @@ -2567,11 +2624,11 @@ UNUSED void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { while (var_a2_2[0] != 0xFF) { var_a2_2++; } - var_a2_2[0] = temp_v1; + var_a2_2[0] = index; } } else { while (j < 8) { - if (temp_v1 == var_a2_2[j]) { + if (index == var_a2_2[j]) { while (j < 7) { var_a2_2[j] = var_a2_2[j + 1]; j++; @@ -2586,49 +2643,49 @@ UNUSED void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { } if (iteration == 0) { - arg0->unk8 += arg1; - arg0->unkC += arg2; - arg0->unk0 += arg2; - arg0->unk4 += arg2; + gen->x_position += arg1; + gen->z_position += arg2; + gen->minZ += arg2; + gen->maxZ += arg2; } iteration++; } } -UNUSED void func_800BFC54(unk800BFC54_arg0 *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4) { - if (arg0 == NULL) { +UNUSED void wavegen_scale(WaveGen *gen, f32 radiusAdd, f32 arg2, f32 arg3, f32 arg4) { + if (gen == NULL) { return; } - arg0->unk10 = (arg0->unk10 + arg1); - if (arg0->unk10 < 1.0) { - arg0->unk10 = 1.0f; + gen->radius += radiusAdd; + if (gen->radius < 1.0) { + gen->radius = 1.0f; } - arg0->unk0 = (arg0->unkC - arg0->unk10); - arg0->unk4 = (arg0->unkC + arg0->unk10); - arg0->unk28 += arg2; + gen->minZ = (gen->z_position - gen->radius); + gen->maxZ = (gen->z_position + gen->radius); + gen->unk28 += arg2; if (osTvType == OS_TV_TYPE_PAL) { - arg0->unk1C = arg0->unk28 * 20971.52; //(f64) (0x80000 / 25.0); + gen->unk1C = gen->unk28 * 20971.52; //(f64) (0x80000 / 25.0); } else { - arg0->unk1C = arg0->unk28 * 17476.27; //(f64) ((0x80000 / 1.2) / 25.0); + gen->unk1C = gen->unk28 * 17476.27; //(f64) ((0x80000 / 1.2) / 25.0); } - arg0->unk2C = arg0->unk2C + arg3; - if (arg0->unk2C < 1.0) { - arg0->unk2C = 1.0f; + gen->unk2C = gen->unk2C + arg3; + if (gen->unk2C < 1.0) { + gen->unk2C = 1.0f; } - arg0->unk20 = 65536.0f / arg0->unk2C; // 0x10000 - arg0->unk24 = arg0->unk24 + arg4; + gen->unk20 = 65536.0f / gen->unk2C; // 0x10000 + gen->unk24 += arg4; } -void func_800BFE98(s32 arg0) { +void func_800BFE98(s32 updateRate) { s32 i; for (i = 0; i < 32; i++) { - if (D_800E3194[i] != NULL) { - D_800E3190[i].unk1A += (0, D_800E3190[i].unk1C * arg0) >> 4; + if (gWaveGenObjs[i] != NULL) { + gWaveGenList[i].unk1A += (0, gWaveGenList[i].unk1C * updateRate) >> 4; } } } @@ -2678,7 +2735,7 @@ void obj_loop_wavepower(Object *obj) { diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; if ((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ) < distance) { gWavePowerBase = entry->power / 256.0f; - gWaveMagnitude = (gWavePowerBase - D_80129FC8.magnitude) / (f32) entry->divisor; + gWaveMagnitude = (gWavePowerBase - gWaveController.magnitude) / (f32) entry->divisor; gWavePowerDivisor = entry->divisor; gWaveGeneratorObj = obj; } diff --git a/src/waves.h b/src/waves.h index 5151402a..5165dfa6 100644 --- a/src/waves.h +++ b/src/waves.h @@ -11,10 +11,10 @@ typedef struct { /* Size: 0x1C bytes */ typedef struct { - LevelModelSegment *unk00; - s16 unk4; // something with x - s16 unk6; // something with y AND used as playerIndex - s16 unk8; // something with z + LevelModelSegment *block; + s16 originX; // something with x + s16 originY; // something with y AND used as playerIndex + s16 originZ; // something with z u8 unkA; // some sort of x ratio u8 unkB; // some sort of z ratio / index of D_8012A0E8 u32 unkC; // indexes D_800E30D4 @@ -24,134 +24,87 @@ typedef struct { } LevelModel_Alternate; /* Size: 0x40 bytes */ -typedef struct unk800E3190 { - f32 unk0; - f32 unk4; - f32 unk8; - f32 unkC; - f32 unk10; - f32 unk14; - s16 unk18; - u16 unk1A; - u32 unk1C; - f32 unk20; - f32 unk24; - f32 unk28; - f32 unk2C; - u8 unk31; - u8 unk32; - u8 pad33[0xE]; -} unk800E3190; +typedef struct WaveGen { + /* 0x00 */ f32 minZ; + /* 0x04 */ f32 maxZ; + /* 0x08 */ f32 x_position; + /* 0x0C */ f32 z_position; + /* 0x10 */ f32 radius; + /* 0x14 */ f32 radiusSq; + /* 0x18 */ u16 index; + /* 0x1A */ u16 unk1A; + /* 0x1C */ u32 unk1C; + /* 0x20 */ f32 unk20; + /* 0x24 */ f32 unk24; + /* 0x28 */ f32 unk28; + /* 0x2C */ f32 unk2C; + /* 0x30 */ u8 unk30; + /* 0x31 */ u8 unk31; + /* 0x32 */ u8 unk32; + /* 0x33 */ u8 unk33; + u32 pad34[3]; +} WaveGen; typedef struct unk800E3184 { u8 unk0[8]; } unk800E3184; typedef struct unk8012A5E8 { - s16 unk0; + s16 blockID; s16 unk2; s16 unk4; s16 unk6; s32 unk8; } unk8012A5E8; -typedef struct unk80129FC8 { - s32 unk0; // count or index? - s32 unk4; // compared to and substracted - s32 unk8; // used to populate D_800E3040 - f32 unkC; // used to populate D_800E3040 - s32 unk10; // used to populate D_800E3040 - s32 unk14; // used to populate D_800E3040 - f32 unk18; // used to populate D_800E3040 - s32 unk1C; // used to populate D_800E3040 - s32 unk20; // count of elements in D_800E3040 - s32 unk24; // possible values: 3 or 5, controls what's set for D_800E30E0 and D_800E30E4 - s32 unk28; // some sort of flag +typedef struct WaveControlSine { + s32 sineStep; // Amount the sine angle increases by. + f32 height; // Peak height of the wave level. + s32 sineBase; // Value the sine angle starts at. +} WaveControlSine; + +typedef struct WaveControl { + s32 subdivisions; // Number of subdivisions the wave plane has. Higher values use more triangles + s32 tileCount; // Number of wave tiles squared. + WaveControlSine initSine[2]; + s32 seedSize; // count of elements in gWaveHeightTable + s32 waveViewDist; // View distance refers to number of blocks away wavegen works on that tile. Vanilla sets 3 or 5. + s32 doubleDensity; // If active, doubles the level of subdivisons done with waves. s32 textureId; - s32 unk30; // multiplier for texture width - s32 unk34; // multiplier for texture height - s32 unk38; // used in u of uv calculation for wave triangles - s32 unk3C; // used in v of uv calculation for wave triangles + s32 uvScaleX; // multiplier for texture width + s32 uvScaleY; // multiplier for texture height + s32 uvScrollX; + s32 uvScrollY; f32 magnitude; // Global wave strength f32 unk44; // something related to height / scale f32 unk48; // used in vertex RGBA calculation - s32 darkVertexColours; -} unk80129FC8; + s32 xlu; // Determines whether to use semitransparent or opaque render modes by default. +} WaveControl; -typedef struct unk800BBE08_arg1 { - u8 pad[0x70]; - s32 unk70[1]; // Unknown length. -} unk800BBE08_arg1; - -typedef struct unk800BFC54_arg0 { - f32 unk0; - f32 unk4; - u8 pad8[0x4]; - f32 unkC; - f32 unk10; - u8 pad14[0x8]; - u32 unk1C; - f32 unk20; - f32 unk24; - f32 unk28; - f32 unk2C; -} unk800BFC54_arg0; - -typedef struct unk800BF9F8 { - f32 unk0; - f32 unk4; - f32 unk8; - f32 unkC; - f32 unk10; - u8 pad14[4]; - u16 unk18; -} unk800BF9F8; - -// 4 Vertexes -// Size: 0x28 - 40 bytes/ -typedef struct unk8012A028 { - Vertex vert[4]; - // Vertex vertexA; - // Vertex vertexB; - // Vertex vertexC; - // Vertex vertexD; -} unk8012A028; - -// /* Size: 10 bytes */ -// typedef struct Vertex { -// /* 0x00 */ s16 x; -// /* 0x02 */ s16 y; -// /* 0x04 */ s16 z; -// /* 0x06 */ u8 r; -// /* 0x07 */ u8 g; -// /* 0x08 */ u8 b; -// /* 0x09 */ u8 a; -// } Vertex; - -void free_waves(void); -void func_800B8B8C(void); -s32 func_800B9228(LevelModelSegment *arg0); +void waves_free(void); +void waves_visibility_reset(void); +s32 waves_block_hq(LevelModelSegment *block); void func_800BBDDC(LevelModel *level, LevelHeader *header); -void func_800BFE98(s32 arg0); -void func_800B8134(LevelHeader *header); +void func_800BFE98(s32 updateRate); +void waves_init_header(LevelHeader *header); void func_800BBE08(LevelModel *level, LevelHeader *header); void obj_loop_wavepower(Object *obj); -void func_800BFC54(unk800BFC54_arg0 *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4); -void func_800BF3E4(Object *obj); -f32 log_wave_height(Object_Log *log, s32 updateRate); +void wavegen_scale(WaveGen *gen, f32 radiusAdd, f32 arg2, f32 arg3, f32 arg4); +void wavegen_destroy(Object *obj); +f32 obj_wave_height(Object_Log *log, s32 updateRate); void func_800BA288(s32 arg0, s32 arg1); -void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2); -unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, f32 arg5, f32 arg6, f32 arg7, s32 arg8); -void wave_init(void); +void func_800BF9F8(WaveGen *gen, f32 arg1, f32 arg2); +WaveGen *wavegen_register(Object *obj, f32 xPos, f32 zPos, f32 waveSize, s32 arg4, f32 arg5, f32 arg6, f32 arg7, + s32 flags); +void waves_alloc(void); void wave_load_material(TextureHeader *tex, s32 rtile); - -Object_64 *func_800BE654(s32, f32, f32); -void func_800BBF78(LevelModel *model); // Non Matching +Object_Log *obj_wave_init(s32, f32, f32); +void func_800BBF78(LevelModel *model); f32 func_800BB2F4(s32, f32, f32, Vec3f *); -void func_800B8C04(s32, s32, s32, s32, s32); -void func_800BF524(Object *); -f32 func_800BEFC4(s32, s32, s32); +void waves_visibility(s32, s32, s32, s32, s32); +void wavegen_add(Object *); +f32 waves_get_y(s32, s32, s32); void func_800BC6C8(void); -void func_800BCC70(LevelModel *arg0); +void func_800BCC70(LevelModel *model); #endif diff --git a/tools/dkr_assets_tool_src/builder/buildTypes/buildModel/buildModelBatch.cpp b/tools/dkr_assets_tool_src/builder/buildTypes/buildModel/buildModelBatch.cpp index b9acbc4a..33a26464 100644 --- a/tools/dkr_assets_tool_src/builder/buildTypes/buildModel/buildModelBatch.cpp +++ b/tools/dkr_assets_tool_src/builder/buildTypes/buildModel/buildModelBatch.cpp @@ -55,7 +55,7 @@ void BuildModelBatch::write_batch(const std::map &materialIds, outBatch->textureIndex = materialIds.at(_materialId.value()); BuildModelMaterial &material = materials[outBatch->textureIndex]; if(material.is_texture_animated()) { - flags |= 0x10000; // BATCH_FLAGS_TEXTURE_ANIM + flags |= 0x10000; // RENDER_TEX_ANIM } materialDoubleSided = material.is_texture_double_sided(); } else { diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index f757db49..66ca5625 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -1722,19 +1722,19 @@ render_epc_lock_up_display = 0x800B7E10; stack_pointer = 0x800B8310; // waves.c .text -free_waves = 0x800B8320; -wave_init = 0x800B84B4; -func_800B8134 = 0x800B8734; -func_800B82B4 = 0x800B88B4; -func_800B8B8C = 0x800B918C; -func_800B8C04 = 0x800B9204; -func_800B9228 = 0x800B9828; +waves_free = 0x800B8320; +waves_alloc = 0x800B84B4; +waves_init_header = 0x800B8734; +waves_init = 0x800B88B4; +waves_visibility_reset = 0x800B918C; +waves_visibility = 0x800B9204; +waves_block_hq = 0x800B9828; func_800B92F4 = 0x800B98F4; func_800B97A8 = 0x800B9DA8; -func_800B9C18 = 0x800BA218; +waves_update = 0x800BA218; func_800BA288 = 0x800BA888; wave_load_material = 0x800BAAB8; -func_800BA8E4 = 0x800BAEE4; +waves_render = 0x800BAEE4; func_800BB2F4 = 0x800BB8F4; func_800BBDDC = 0x800BC3DC; func_800BBE08 = 0x800BC408; @@ -1742,14 +1742,14 @@ func_800BBF78 = 0x800BC578; func_800BC6C8 = 0x800BCCC8; func_800BCC70 = 0x800BD270; func_800BDC80 = 0x800BE280; -func_800BE654 = 0x800BEC54; -log_wave_height = 0x800BF4B4; -func_800BEFC4 = 0x800BF5C4; -func_800BF3E4 = 0x800BF9E4; -func_800BF524 = 0x800BFB24; +obj_wave_init = 0x800BEC54; +obj_wave_height = 0x800BF4B4; +waves_get_y = 0x800BF5C4; +wavegen_destroy = 0x800BF9E4; +wavegen_add = 0x800BFB24; func_800BF634 = 0x800BFC34; func_800BF9F8 = 0x800BFFF8; -func_800BFC54 = 0x800C0254; +wavegen_scale = 0x800C0254; func_800BFE98 = 0x800C0498; obj_loop_wavepower = 0x800C05DC; @@ -2875,17 +2875,17 @@ sLockupDelay = 0x800E4B18; objStatusString = 0x800E4B1C; // size:0xC // waves.c .data -D_800E3040 = 0x800E4B30; -D_800E3044 = 0x800E4B34; -D_800E3048 = 0x800E4B38; +gWaveHeightTable = 0x800E4B30; +gWaveHeightIndices = 0x800E4B34; +gWaveUVTable = 0x800E4B38; D_800E304C = 0x800E4B3C; gWaveVertices = 0x800E4B60; gWaveTriangles = 0x800E4B70; D_800E3090 = 0x800E4B80; gWaveTextureHeader = 0x800E4BC0; D_800E30D4 = 0x800E4BC4; -D_800E30D8 = 0x800E4BC8; -D_800E30DC = 0x800E4BCC; +gWaveModel = 0x800E4BC8; +gVisibleWaveTiles = 0x800E4BCC; D_800E30E0 = 0x800E4BD0; D_800E30E4 = 0x800E4BD4; D_800E30E8 = 0x800E4BD8; @@ -2893,13 +2893,13 @@ D_800E30FC = 0x800E4BEC; D_800E3110 = 0x800E4C00; D_800E3144 = 0x800E4C34; D_800E3178 = 0x800E4C68; -D_800E317C = 0x800E4C6C; +gWaveTileTotal = 0x800E4C6C; D_800E3180 = 0x800E4C70; D_800E3184 = 0x800E4C74; -D_800E3188 = 0x800E4C78; -D_800E318C = 0x800E4C7C; -D_800E3190 = 0x800E4C80; -D_800E3194 = 0x800E4C84; +gWaveGenCount = 0x800E4C78; +gWaveTileGridCount = 0x800E4C7C; +gWaveGenList = 0x800E4C80; +gWaveGenObjs = 0x800E4C84; gWaveGeneratorObj = 0x800E4C88; // fade_transition.c .data @@ -4487,41 +4487,41 @@ gObjectStackTrace = 0x8012BA60; // size:0x10 // waves .bss gWaveDL = 0x8012BA70; -D_80129FC4 = 0x8012BA74; -D_80129FC8 = 0x8012BA78; // size:0x50 +gWaveMtx = 0x8012BA74; +gWaveController = 0x8012BA78; // size:0x50 gWaveVertexFlip = 0x8012BAC8; -D_8012A01C = 0x8012BACC; -D_8012A020 = 0x8012BAD0; +gWaveLowerY = 0x8012BACC; +gWaveUpperY = 0x8012BAD0; D_8012A028 = 0x8012BAD8; gWavePlayerCount = 0x8012BB28; gWaveBatch = 0x8012BB2C; gWaveTexture = 0x8012BB30; -D_8012A084 = 0x8012BB34; -D_8012A088 = 0x8012BB38; -D_8012A08C = 0x8012BB3C; -D_8012A090 = 0x8012BB40; -D_8012A094 = 0x8012BB44; -D_8012A098 = 0x8012BB48; -D_8012A09C = 0x8012BB4C; -D_8012A0A0 = 0x8012BB50; -D_8012A0A4 = 0x8012BB54; +gWaveUVBaseX = 0x8012BB34; +gWaveUVBaseY = 0x8012BB38; +gWaveUVStepX = 0x8012BB3C; +gWaveUVStepY = 0x8012BB40; +gWaveTexUVMaskX = 0x8012BB44; +gWaveTexUVMaskY = 0x8012BB48; +gWaveTexAnimFrame = 0x8012BB4C; +gWaveBoundingBoxW = 0x8012BB50; +gWaveBoundingBoxH = 0x8012BB54; gWaveBoundingBoxDiffX = 0x8012BB58; gWaveBoundingBoxDiffZ = 0x8012BB5C; gWaveBoundingBoxX1 = 0x8012BB60; gWaveBoundingBoxZ1 = 0x8012BB64; -D_8012A0B8 = 0x8012BB68; -D_8012A0BC = 0x8012BB6C; -D_8012A0C0 = 0x8012BB70; -D_8012A0C4 = 0x8012BB74; -D_8012A0C8 = 0x8012BB78; -D_8012A0CC = 0x8012BB7C; -D_8012A0D0 = 0x8012BB80; -D_8012A0D4 = 0x8012BB84; -D_8012A0D8 = 0x8012BB88; -D_8012A0DC = 0x8012BB8C; +gWaveVtxStepX = 0x8012BB68; +gWaveVtxStepZ = 0x8012BB6C; +gWaveBlockBoundsX1 = 0x8012BB70; +gWaveBlockBoundsZ1 = 0x8012BB74; +gWaveBlockBoundsX2 = 0x8012BB78; +gWaveBlockBoundsZ2 = 0x8012BB7C; +gWaveBlockPosX = 0x8012BB80; +gWaveBlockPosZ = 0x8012BB84; +gWaveTileCountX = 0x8012BB88; +gWaveTileCountZ = 0x8012BB8C; gNumberOfLevelSegments = 0x8012BB90; D_8012A0E8 = 0x8012BB98; -D_8012A1E8 = 0x8012BC98; +gWaveBlockIDs = 0x8012BC98; D_8012A5E8 = 0x8012C098; D_8012A600 = 0x8012C0B0; gWavePowerBase = 0x8012C1D0; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 61f788c6..7aaa8ebf 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -1698,19 +1698,19 @@ get_lockup_status = 0x800B776C; mode_lockup = 0x800B7864; render_epc_lock_up_display = 0x800B78A0; stack_pointer = 0x800B7DA0; -free_waves = 0x800B7DB0; -wave_init = 0x800B7F44; -func_800B8134 = 0x800B81C4; -func_800B82B4 = 0x800B8344; -func_800B8B8C = 0x800B8C1C; -func_800B8C04 = 0x800B8C94; -func_800B9228 = 0x800B92B8; +waves_free = 0x800B7DB0; +waves_alloc = 0x800B7F44; +waves_init_header = 0x800B81C4; +waves_init = 0x800B8344; +waves_visibility_reset = 0x800B8C1C; +waves_visibility = 0x800B8C94; +waves_block_hq = 0x800B92B8; func_800B92F4 = 0x800B9384; func_800B97A8 = 0x800B9838; -func_800B9C18 = 0x800B9CA8; +waves_update = 0x800B9CA8; func_800BA288 = 0x800BA318; wave_load_material = 0x800BA548; -func_800BA8E4 = 0x800BA974; +waves_render = 0x800BA974; func_800BB2F4 = 0x800BB384; func_800BBDDC = 0x800BBE6C; func_800BBE08 = 0x800BBE98; @@ -1718,14 +1718,14 @@ func_800BBF78 = 0x800BC008; func_800BC6C8 = 0x800BC758; func_800BCC70 = 0x800BCD00; func_800BDC80 = 0x800BDD10; -func_800BE654 = 0x800BE6E4; -log_wave_height = 0x800BEF44; -func_800BEFC4 = 0x800BF054; -func_800BF3E4 = 0x800BF474; -func_800BF524 = 0x800BF5B4; +obj_wave_init = 0x800BE6E4; +obj_wave_height = 0x800BEF44; +waves_get_y = 0x800BF054; +wavegen_destroy = 0x800BF474; +wavegen_add = 0x800BF5B4; func_800BF634 = 0x800BF6C4; func_800BF9F8 = 0x800BFA88; -func_800BFC54 = 0x800BFCE4; +wavegen_scale = 0x800BFCE4; func_800BFE98 = 0x800BFF28; obj_loop_wavepower = 0x800C006C; enable_new_screen_transitions = 0x800C0200; @@ -2700,17 +2700,17 @@ sLockupStatus = 0x800E30B0; sLockupPage = 0x800E30B4; sLockupDelay = 0x800E30B8; objStatusString = 0x800E30BC; // size:0xC -D_800E3040 = 0x800E30D0; -D_800E3044 = 0x800E30D4; -D_800E3048 = 0x800E30D8; +gWaveHeightTable = 0x800E30D0; +gWaveHeightIndices = 0x800E30D4; +gWaveUVTable = 0x800E30D8; D_800E304C = 0x800E30DC; gWaveVertices = 0x800E3100; gWaveTriangles = 0x800E3110; D_800E3090 = 0x800E3120; gWaveTextureHeader = 0x800E3160; D_800E30D4 = 0x800E3164; -D_800E30D8 = 0x800E3168; -D_800E30DC = 0x800E316C; +gWaveModel = 0x800E3168; +gVisibleWaveTiles = 0x800E316C; D_800E30E0 = 0x800E3170; D_800E30E4 = 0x800E3174; D_800E30E8 = 0x800E3178; @@ -2718,13 +2718,13 @@ D_800E30FC = 0x800E318C; D_800E3110 = 0x800E31A0; D_800E3144 = 0x800E31D4; D_800E3178 = 0x800E3208; -D_800E317C = 0x800E320C; +gWaveTileTotal = 0x800E320C; D_800E3180 = 0x800E3210; D_800E3184 = 0x800E3214; -D_800E3188 = 0x800E3218; -D_800E318C = 0x800E321C; -D_800E3190 = 0x800E3220; -D_800E3194 = 0x800E3224; +gWaveGenCount = 0x800E3218; +gWaveTileGridCount = 0x800E321C; +gWaveGenList = 0x800E3220; +gWaveGenObjs = 0x800E3224; gWaveGeneratorObj = 0x800E3228; gTransitionsDisabled = 0x800E3230; sLevelTransitionDelayTimer = 0x800E3234; @@ -4164,41 +4164,41 @@ gEpcInfoStack1 = 0x80129A40; // size:0x200 gEpcInfoStack2 = 0x80129C40; // size:0x400 gObjectStackTrace = 0x8012A040; // size:0x10 gWaveDL = 0x8012A050; -D_80129FC4 = 0x8012A054; -D_80129FC8 = 0x8012A058; // size:0x50 +gWaveMtx = 0x8012A054; +gWaveController = 0x8012A058; // size:0x50 gWaveVertexFlip = 0x8012A0A8; -D_8012A01C = 0x8012A0AC; -D_8012A020 = 0x8012A0B0; +gWaveLowerY = 0x8012A0AC; +gWaveUpperY = 0x8012A0B0; D_8012A028 = 0x8012A0B8; gWavePlayerCount = 0x8012A108; gWaveBatch = 0x8012A10C; gWaveTexture = 0x8012A110; -D_8012A084 = 0x8012A114; -D_8012A088 = 0x8012A118; -D_8012A08C = 0x8012A11C; -D_8012A090 = 0x8012A120; -D_8012A094 = 0x8012A124; -D_8012A098 = 0x8012A128; -D_8012A09C = 0x8012A12C; -D_8012A0A0 = 0x8012A130; -D_8012A0A4 = 0x8012A134; +gWaveUVBaseX = 0x8012A114; +gWaveUVBaseY = 0x8012A118; +gWaveUVStepX = 0x8012A11C; +gWaveUVStepY = 0x8012A120; +gWaveTexUVMaskX = 0x8012A124; +gWaveTexUVMaskY = 0x8012A128; +gWaveTexAnimFrame = 0x8012A12C; +gWaveBoundingBoxW = 0x8012A130; +gWaveBoundingBoxH = 0x8012A134; gWaveBoundingBoxDiffX = 0x8012A138; gWaveBoundingBoxDiffZ = 0x8012A13C; gWaveBoundingBoxX1 = 0x8012A140; gWaveBoundingBoxZ1 = 0x8012A144; -D_8012A0B8 = 0x8012A148; -D_8012A0BC = 0x8012A14C; -D_8012A0C0 = 0x8012A150; -D_8012A0C4 = 0x8012A154; -D_8012A0C8 = 0x8012A158; -D_8012A0CC = 0x8012A15C; -D_8012A0D0 = 0x8012A160; -D_8012A0D4 = 0x8012A164; -D_8012A0D8 = 0x8012A168; -D_8012A0DC = 0x8012A16C; +gWaveVtxStepX = 0x8012A148; +gWaveVtxStepZ = 0x8012A14C; +gWaveBlockBoundsX1 = 0x8012A150; +gWaveBlockBoundsZ1 = 0x8012A154; +gWaveBlockBoundsX2 = 0x8012A158; +gWaveBlockBoundsZ2 = 0x8012A15C; +gWaveBlockPosX = 0x8012A160; +gWaveBlockPosZ = 0x8012A164; +gWaveTileCountX = 0x8012A168; +gWaveTileCountZ = 0x8012A16C; gNumberOfLevelSegments = 0x8012A170; D_8012A0E8 = 0x8012A178; -D_8012A1E8 = 0x8012A278; +gWaveBlockIDs = 0x8012A278; D_8012A5E8 = 0x8012A678; D_8012A600 = 0x8012A690; gWavePowerBase = 0x8012A7B0; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 9202e57f..5f368a94 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -1619,19 +1619,19 @@ get_lockup_status = 0x800B7C8C; mode_lockup = 0x800B7D84; render_epc_lock_up_display = 0x800B7DC0; stack_pointer = 0x800B82C0; -free_waves = 0x800B82D0; -wave_init = 0x800B8464; -func_800B8134 = 0x800B86E4; -func_800B82B4 = 0x800B8864; -func_800B8B8C = 0x800B913C; -func_800B8C04 = 0x800B91B4; -func_800B9228 = 0x800B97D8; +waves_free = 0x800B82D0; +waves_alloc = 0x800B8464; +waves_init_header = 0x800B86E4; +waves_init = 0x800B8864; +waves_visibility_reset = 0x800B913C; +waves_visibility = 0x800B91B4; +waves_block_hq = 0x800B97D8; func_800B92F4 = 0x800B98A4; func_800B97A8 = 0x800B9D58; -func_800B9C18 = 0x800BA1C8; +waves_update = 0x800BA1C8; func_800BA288 = 0x800BA838; wave_load_material = 0x800BAA68; -func_800BA8E4 = 0x800BAE94; +waves_render = 0x800BAE94; func_800BB2F4 = 0x800BB8A4; func_800BBDDC = 0x800BC38C; func_800BBE08 = 0x800BC3B8; @@ -1639,14 +1639,14 @@ func_800BBF78 = 0x800BC528; func_800BC6C8 = 0x800BCC78; func_800BCC70 = 0x800BD220; func_800BDC80 = 0x800BE230; -func_800BE654 = 0x800BEC04; -log_wave_height = 0x800BF464; -func_800BEFC4 = 0x800BF574; -func_800BF3E4 = 0x800BF994; -func_800BF524 = 0x800BFAD4; +obj_wave_init = 0x800BEC04; +obj_wave_height = 0x800BF464; +waves_get_y = 0x800BF574; +wavegen_destroy = 0x800BF994; +wavegen_add = 0x800BFAD4; func_800BF634 = 0x800BFBE4; func_800BF9F8 = 0x800BFFA8; -func_800BFC54 = 0x800C0204; +wavegen_scale = 0x800C0204; func_800BFE98 = 0x800C0448; obj_loop_wavepower = 0x800C058C; enable_new_screen_transitions = 0x800C0720; @@ -2629,17 +2629,17 @@ sLockupStatus = 0x800E3640; sLockupPage = 0x800E3644; sLockupDelay = 0x800E3648; objStatusString = 0x800E364C; // size:0xC -D_800E3040 = 0x800E3660; -D_800E3044 = 0x800E3664; -D_800E3048 = 0x800E3668; +gWaveHeightTable = 0x800E3660; +gWaveHeightIndices = 0x800E3664; +gWaveUVTable = 0x800E3668; D_800E304C = 0x800E366C; gWaveVertices = 0x800E3690; gWaveTriangles = 0x800E36A0; D_800E3090 = 0x800E36B0; gWaveTextureHeader = 0x800E36F0; D_800E30D4 = 0x800E36F4; -D_800E30D8 = 0x800E36F8; -D_800E30DC = 0x800E36FC; +gWaveModel = 0x800E36F8; +gVisibleWaveTiles = 0x800E36FC; D_800E30E0 = 0x800E3700; D_800E30E4 = 0x800E3704; D_800E30E8 = 0x800E3708; @@ -2647,13 +2647,13 @@ D_800E30FC = 0x800E371C; D_800E3110 = 0x800E3730; D_800E3144 = 0x800E3764; D_800E3178 = 0x800E3798; -D_800E317C = 0x800E379C; +gWaveTileTotal = 0x800E379C; D_800E3180 = 0x800E37A0; D_800E3184 = 0x800E37A4; -D_800E3188 = 0x800E37A8; -D_800E318C = 0x800E37AC; -D_800E3190 = 0x800E37B0; -D_800E3194 = 0x800E37B4; +gWaveGenCount = 0x800E37A8; +gWaveTileGridCount = 0x800E37AC; +gWaveGenList = 0x800E37B0; +gWaveGenObjs = 0x800E37B4; gWaveGeneratorObj = 0x800E37B8; gTransitionsDisabled = 0x800E37C0; sLevelTransitionDelayTimer = 0x800E37C4; @@ -4099,41 +4099,41 @@ gEpcInfoStack1 = 0x8012A000; // size:0x200 gEpcInfoStack2 = 0x8012A200; // size:0x400 gObjectStackTrace = 0x8012A600; // size:0x10 gWaveDL = 0x8012A610; -D_80129FC4 = 0x8012A614; -D_80129FC8 = 0x8012A618; // size:0x50 +gWaveMtx = 0x8012A614; +gWaveController = 0x8012A618; // size:0x50 gWaveVertexFlip = 0x8012A668; -D_8012A01C = 0x8012A66C; -D_8012A020 = 0x8012A670; +gWaveLowerY = 0x8012A66C; +gWaveUpperY = 0x8012A670; D_8012A028 = 0x8012A678; gWavePlayerCount = 0x8012A6C8; gWaveBatch = 0x8012A6CC; gWaveTexture = 0x8012A6D0; -D_8012A084 = 0x8012A6D4; -D_8012A088 = 0x8012A6D8; -D_8012A08C = 0x8012A6DC; -D_8012A090 = 0x8012A6E0; -D_8012A094 = 0x8012A6E4; -D_8012A098 = 0x8012A6E8; -D_8012A09C = 0x8012A6EC; -D_8012A0A0 = 0x8012A6F0; -D_8012A0A4 = 0x8012A6F4; +gWaveUVBaseX = 0x8012A6D4; +gWaveUVBaseY = 0x8012A6D8; +gWaveUVStepX = 0x8012A6DC; +gWaveUVStepY = 0x8012A6E0; +gWaveTexUVMaskX = 0x8012A6E4; +gWaveTexUVMaskY = 0x8012A6E8; +gWaveTexAnimFrame = 0x8012A6EC; +gWaveBoundingBoxW = 0x8012A6F0; +gWaveBoundingBoxH = 0x8012A6F4; gWaveBoundingBoxDiffX = 0x8012A6F8; gWaveBoundingBoxDiffZ = 0x8012A6FC; gWaveBoundingBoxX1 = 0x8012A700; gWaveBoundingBoxZ1 = 0x8012A704; -D_8012A0B8 = 0x8012A708; -D_8012A0BC = 0x8012A70C; -D_8012A0C0 = 0x8012A710; -D_8012A0C4 = 0x8012A714; -D_8012A0C8 = 0x8012A718; -D_8012A0CC = 0x8012A71C; -D_8012A0D0 = 0x8012A720; -D_8012A0D4 = 0x8012A724; -D_8012A0D8 = 0x8012A728; -D_8012A0DC = 0x8012A72C; +gWaveVtxStepX = 0x8012A708; +gWaveVtxStepZ = 0x8012A70C; +gWaveBlockBoundsX1 = 0x8012A710; +gWaveBlockBoundsZ1 = 0x8012A714; +gWaveBlockBoundsX2 = 0x8012A718; +gWaveBlockBoundsZ2 = 0x8012A71C; +gWaveBlockPosX = 0x8012A720; +gWaveBlockPosZ = 0x8012A724; +gWaveTileCountX = 0x8012A728; +gWaveTileCountZ = 0x8012A72C; gNumberOfLevelSegments = 0x8012A730; D_8012A0E8 = 0x8012A738; -D_8012A1E8 = 0x8012A838; +gWaveBlockIDs = 0x8012A838; D_8012A5E8 = 0x8012AC38; D_8012A600 = 0x8012AC50; gWavePowerBase = 0x8012AD70; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 1aca4ebb..98e447ef 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -1716,19 +1716,19 @@ render_epc_lock_up_display = 0x800B7810; stack_pointer = 0x800B7D10; // waves.c .text -free_waves = 0x800B7D20; -wave_init = 0x800B7EB4; -func_800B8134 = 0x800B8134; -func_800B82B4 = 0x800B82B4; -func_800B8B8C = 0x800B8B8C; -func_800B8C04 = 0x800B8C04; -func_800B9228 = 0x800B9228; +waves_free = 0x800B7D20; +waves_alloc = 0x800B7EB4; +waves_init_header = 0x800B8134; +waves_init = 0x800B82B4; +waves_visibility_reset = 0x800B8B8C; +waves_visibility = 0x800B8C04; +waves_block_hq = 0x800B9228; func_800B92F4 = 0x800B92F4; func_800B97A8 = 0x800B97A8; -func_800B9C18 = 0x800B9C18; +waves_update = 0x800B9C18; func_800BA288 = 0x800BA288; wave_load_material = 0x800BA4B8; -func_800BA8E4 = 0x800BA8E4; +waves_render = 0x800BA8E4; func_800BB2F4 = 0x800BB2F4; func_800BBDDC = 0x800BBDDC; func_800BBE08 = 0x800BBE08; @@ -1736,14 +1736,14 @@ func_800BBF78 = 0x800BBF78; func_800BC6C8 = 0x800BC6C8; func_800BCC70 = 0x800BCC70; func_800BDC80 = 0x800BDC80; -func_800BE654 = 0x800BE654; -log_wave_height = 0x800BEEB4; -func_800BEFC4 = 0x800BEFC4; -func_800BF3E4 = 0x800BF3E4; -func_800BF524 = 0x800BF524; +obj_wave_init = 0x800BE654; +obj_wave_height = 0x800BEEB4; +waves_get_y = 0x800BEFC4; +wavegen_destroy = 0x800BF3E4; +wavegen_add = 0x800BF524; func_800BF634 = 0x800BF634; func_800BF9F8 = 0x800BF9F8; -func_800BFC54 = 0x800BFC54; +wavegen_scale = 0x800BFC54; func_800BFE98 = 0x800BFE98; obj_loop_wavepower = 0x800BFFDC; @@ -2857,17 +2857,17 @@ sLockupDelay = 0x800E3028; objStatusString = 0x800E302C; // size:0xC // waves.c .data -D_800E3040 = 0x800E3040; -D_800E3044 = 0x800E3044; -D_800E3048 = 0x800E3048; +gWaveHeightTable = 0x800E3040; +gWaveHeightIndices = 0x800E3044; +gWaveUVTable = 0x800E3048; D_800E304C = 0x800E304C; gWaveVertices = 0x800E3070; gWaveTriangles = 0x800E3080; D_800E3090 = 0x800E3090; gWaveTextureHeader = 0x800E30D0; D_800E30D4 = 0x800E30D4; -D_800E30D8 = 0x800E30D8; -D_800E30DC = 0x800E30DC; +gWaveModel = 0x800E30D8; +gVisibleWaveTiles = 0x800E30DC; D_800E30E0 = 0x800E30E0; D_800E30E4 = 0x800E30E4; D_800E30E8 = 0x800E30E8; @@ -2875,13 +2875,13 @@ D_800E30FC = 0x800E30FC; D_800E3110 = 0x800E3110; D_800E3144 = 0x800E3144; D_800E3178 = 0x800E3178; -D_800E317C = 0x800E317C; +gWaveTileTotal = 0x800E317C; D_800E3180 = 0x800E3180; D_800E3184 = 0x800E3184; -D_800E3188 = 0x800E3188; -D_800E318C = 0x800E318C; -D_800E3190 = 0x800E3190; -D_800E3194 = 0x800E3194; +gWaveGenCount = 0x800E3188; +gWaveTileGridCount = 0x800E318C; +gWaveGenList = 0x800E3190; +gWaveGenObjs = 0x800E3194; gWaveGeneratorObj = 0x800E3198; // fade_transition.c .data @@ -4607,41 +4607,41 @@ gObjectStackTrace = 0x80129FB0; // size:0x10 // waves .bss gWaveDL = 0x80129FC0; -D_80129FC4 = 0x80129FC4; -D_80129FC8 = 0x80129FC8; // size:0x50 +gWaveMtx = 0x80129FC4; +gWaveController = 0x80129FC8; // size:0x50 gWaveVertexFlip = 0x8012A018; -D_8012A01C = 0x8012A01C; -D_8012A020 = 0x8012A020; +gWaveLowerY = 0x8012A01C; +gWaveUpperY = 0x8012A020; D_8012A028 = 0x8012A028; gWavePlayerCount = 0x8012A078; gWaveBatch = 0x8012A07C; gWaveTexture = 0x8012A080; -D_8012A084 = 0x8012A084; -D_8012A088 = 0x8012A088; -D_8012A08C = 0x8012A08C; -D_8012A090 = 0x8012A090; -D_8012A094 = 0x8012A094; -D_8012A098 = 0x8012A098; -D_8012A09C = 0x8012A09C; -D_8012A0A0 = 0x8012A0A0; -D_8012A0A4 = 0x8012A0A4; +gWaveUVBaseX = 0x8012A084; +gWaveUVBaseY = 0x8012A088; +gWaveUVStepX = 0x8012A08C; +gWaveUVStepY = 0x8012A090; +gWaveTexUVMaskX = 0x8012A094; +gWaveTexUVMaskY = 0x8012A098; +gWaveTexAnimFrame = 0x8012A09C; +gWaveBoundingBoxW = 0x8012A0A0; +gWaveBoundingBoxH = 0x8012A0A4; gWaveBoundingBoxDiffX = 0x8012A0A8; gWaveBoundingBoxDiffZ = 0x8012A0AC; gWaveBoundingBoxX1 = 0x8012A0B0; gWaveBoundingBoxZ1 = 0x8012A0B4; -D_8012A0B8 = 0x8012A0B8; -D_8012A0BC = 0x8012A0BC; -D_8012A0C0 = 0x8012A0C0; -D_8012A0C4 = 0x8012A0C4; -D_8012A0C8 = 0x8012A0C8; -D_8012A0CC = 0x8012A0CC; -D_8012A0D0 = 0x8012A0D0; -D_8012A0D4 = 0x8012A0D4; -D_8012A0D8 = 0x8012A0D8; -D_8012A0DC = 0x8012A0DC; +gWaveVtxStepX = 0x8012A0B8; +gWaveVtxStepZ = 0x8012A0BC; +gWaveBlockBoundsX1 = 0x8012A0C0; +gWaveBlockBoundsZ1 = 0x8012A0C4; +gWaveBlockBoundsX2 = 0x8012A0C8; +gWaveBlockBoundsZ2 = 0x8012A0CC; +gWaveBlockPosX = 0x8012A0D0; +gWaveBlockPosZ = 0x8012A0D4; +gWaveTileCountX = 0x8012A0D8; +gWaveTileCountZ = 0x8012A0DC; gNumberOfLevelSegments = 0x8012A0E0; D_8012A0E8 = 0x8012A0E8; -D_8012A1E8 = 0x8012A1E8; +gWaveBlockIDs = 0x8012A1E8; D_8012A5E8 = 0x8012A5E8; D_8012A600 = 0x8012A600; gWavePowerBase = 0x8012A720; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index a96b74f6..303a91ae 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -1618,19 +1618,19 @@ get_lockup_status = 0x800B7BFC; mode_lockup = 0x800B7CF4; render_epc_lock_up_display = 0x800B7D30; stack_pointer = 0x800B8230; -free_waves = 0x800B8240; -wave_init = 0x800B83D4; -func_800B8134 = 0x800B8654; -func_800B82B4 = 0x800B87D4; -func_800B8B8C = 0x800B90AC; -func_800B8C04 = 0x800B9124; -func_800B9228 = 0x800B9748; +waves_free = 0x800B8240; +waves_alloc = 0x800B83D4; +waves_init_header = 0x800B8654; +waves_init = 0x800B87D4; +waves_visibility_reset = 0x800B90AC; +waves_visibility = 0x800B9124; +waves_block_hq = 0x800B9748; func_800B92F4 = 0x800B9814; func_800B97A8 = 0x800B9CC8; -func_800B9C18 = 0x800BA138; +waves_update = 0x800BA138; func_800BA288 = 0x800BA7A8; wave_load_material = 0x800BA9D8; -func_800BA8E4 = 0x800BAE04; +waves_render = 0x800BAE04; func_800BB2F4 = 0x800BB814; func_800BBDDC = 0x800BC2FC; func_800BBE08 = 0x800BC328; @@ -1638,14 +1638,14 @@ func_800BBF78 = 0x800BC498; func_800BC6C8 = 0x800BCBE8; func_800BCC70 = 0x800BD190; func_800BDC80 = 0x800BE1A0; -func_800BE654 = 0x800BEB74; -log_wave_height = 0x800BF3D4; -func_800BEFC4 = 0x800BF4E4; -func_800BF3E4 = 0x800BF904; -func_800BF524 = 0x800BFA44; +obj_wave_init = 0x800BEB74; +obj_wave_height = 0x800BF3D4; +waves_get_y = 0x800BF4E4; +wavegen_destroy = 0x800BF904; +wavegen_add = 0x800BFA44; func_800BF634 = 0x800BFB54; func_800BF9F8 = 0x800BFF18; -func_800BFC54 = 0x800C0174; +wavegen_scale = 0x800C0174; func_800BFE98 = 0x800C03B8; obj_loop_wavepower = 0x800C04FC; enable_new_screen_transitions = 0x800C0690; @@ -2626,17 +2626,17 @@ sLockupStatus = 0x800E35B0; sLockupPage = 0x800E35B4; sLockupDelay = 0x800E35B8; objStatusString = 0x800E35BC; // size:0xC -D_800E3040 = 0x800E35D0; -D_800E3044 = 0x800E35D4; -D_800E3048 = 0x800E35D8; +gWaveHeightTable = 0x800E35D0; +gWaveHeightIndices = 0x800E35D4; +gWaveUVTable = 0x800E35D8; D_800E304C = 0x800E35DC; gWaveVertices = 0x800E3600; gWaveTriangles = 0x800E3610; D_800E3090 = 0x800E3620; gWaveTextureHeader = 0x800E3660; D_800E30D4 = 0x800E3664; -D_800E30D8 = 0x800E3668; -D_800E30DC = 0x800E366C; +gWaveModel = 0x800E3668; +gVisibleWaveTiles = 0x800E366C; D_800E30E0 = 0x800E3670; D_800E30E4 = 0x800E3674; D_800E30E8 = 0x800E3678; @@ -2644,13 +2644,13 @@ D_800E30FC = 0x800E368C; D_800E3110 = 0x800E36A0; D_800E3144 = 0x800E36D4; D_800E3178 = 0x800E3708; -D_800E317C = 0x800E370C; +gWaveTileTotal = 0x800E370C; D_800E3180 = 0x800E3710; D_800E3184 = 0x800E3714; -D_800E3188 = 0x800E3718; -D_800E318C = 0x800E371C; -D_800E3190 = 0x800E3720; -D_800E3194 = 0x800E3724; +gWaveGenCount = 0x800E3718; +gWaveTileGridCount = 0x800E371C; +gWaveGenList = 0x800E3720; +gWaveGenObjs = 0x800E3724; gWaveGeneratorObj = 0x800E3728; gTransitionsDisabled = 0x800E3730; sLevelTransitionDelayTimer = 0x800E3734; @@ -4094,41 +4094,41 @@ gEpcInfoStack1 = 0x80129F70; // size:0x200 gEpcInfoStack2 = 0x8012A170; // size:0x400 gObjectStackTrace = 0x8012A570; // size:0x10 gWaveDL = 0x8012A580; -D_80129FC4 = 0x8012A584; -D_80129FC8 = 0x8012A588; // size:0x50 +gWaveMtx = 0x8012A584; +gWaveController = 0x8012A588; // size:0x50 gWaveVertexFlip = 0x8012A5D8; -D_8012A01C = 0x8012A5DC; -D_8012A020 = 0x8012A5E0; +gWaveLowerY = 0x8012A5DC; +gWaveUpperY = 0x8012A5E0; D_8012A028 = 0x8012A5E8; gWavePlayerCount = 0x8012A638; gWaveBatch = 0x8012A63C; gWaveTexture = 0x8012A640; -D_8012A084 = 0x8012A644; -D_8012A088 = 0x8012A648; -D_8012A08C = 0x8012A64C; -D_8012A090 = 0x8012A650; -D_8012A094 = 0x8012A654; -D_8012A098 = 0x8012A658; -D_8012A09C = 0x8012A65C; -D_8012A0A0 = 0x8012A660; -D_8012A0A4 = 0x8012A664; +gWaveUVBaseX = 0x8012A644; +gWaveUVBaseY = 0x8012A648; +gWaveUVStepX = 0x8012A64C; +gWaveUVStepY = 0x8012A650; +gWaveTexUVMaskX = 0x8012A654; +gWaveTexUVMaskY = 0x8012A658; +gWaveTexAnimFrame = 0x8012A65C; +gWaveBoundingBoxW = 0x8012A660; +gWaveBoundingBoxH = 0x8012A664; gWaveBoundingBoxDiffX = 0x8012A668; gWaveBoundingBoxDiffZ = 0x8012A66C; gWaveBoundingBoxX1 = 0x8012A670; gWaveBoundingBoxZ1 = 0x8012A674; -D_8012A0B8 = 0x8012A678; -D_8012A0BC = 0x8012A67C; -D_8012A0C0 = 0x8012A680; -D_8012A0C4 = 0x8012A684; -D_8012A0C8 = 0x8012A688; -D_8012A0CC = 0x8012A68C; -D_8012A0D0 = 0x8012A690; -D_8012A0D4 = 0x8012A694; -D_8012A0D8 = 0x8012A698; -D_8012A0DC = 0x8012A69C; +gWaveVtxStepX = 0x8012A678; +gWaveVtxStepZ = 0x8012A67C; +gWaveBlockBoundsX1 = 0x8012A680; +gWaveBlockBoundsZ1 = 0x8012A684; +gWaveBlockBoundsX2 = 0x8012A688; +gWaveBlockBoundsZ2 = 0x8012A68C; +gWaveBlockPosX = 0x8012A690; +gWaveBlockPosZ = 0x8012A694; +gWaveTileCountX = 0x8012A698; +gWaveTileCountZ = 0x8012A69C; gNumberOfLevelSegments = 0x8012A6A0; D_8012A0E8 = 0x8012A6A8; -D_8012A1E8 = 0x8012A7A8; +gWaveBlockIDs = 0x8012A7A8; D_8012A5E8 = 0x8012ABA8; D_8012A600 = 0x8012ABC0; gWavePowerBase = 0x8012ACE0;