From 0ad08ed3bd65eae28f897f88ba85a390292da542 Mon Sep 17 00:00:00 2001 From: Unnunu Date: Sat, 12 Apr 2025 01:37:29 +0300 Subject: [PATCH] wip --- include/structs.h | 2 +- src/object_functions.c | 2 +- src/objects.c | 4 +- src/particles.c | 480 +++++++++++++++++---------- src/particles.h | 111 +++---- src/thread3_main.c | 4 +- ver/symbols/symbol_addrs.jpn.v79.txt | 46 +-- ver/symbols/symbol_addrs.pal.v77.txt | 46 +-- ver/symbols/symbol_addrs.pal.v80.txt | 46 +-- ver/symbols/symbol_addrs.us.v77.txt | 46 +-- ver/symbols/symbol_addrs.us.v80.txt | 46 +-- 11 files changed, 477 insertions(+), 356 deletions(-) diff --git a/include/structs.h b/include/structs.h index 01643867..d065ec48 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1724,7 +1724,7 @@ typedef struct Object_68 { /* Size: 0x20 bytes */ typedef struct ParticleEmitter { - /* 0x00 */ struct Particle *unk0; + /* 0x00 */ struct ParticleBehavior *behaviour; /* 0x04 */ s16 unk4; /* 0x06 */ u8 unk6; /* 0x07 */ u8 unk7; diff --git a/src/object_functions.c b/src/object_functions.c index 715e987b..9f9a92ba 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -6278,7 +6278,7 @@ void obj_init_midichset(Object *obj, LevelObjectEntry_Midichset *entry) { /* Official name: bubblerInit */ void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry) { - func_800AF134((Particle *) obj->particleEmitter, entry->particleBehaviourID, entry->particlePropertyID, 0, 0, 0); + func_800AF134(obj->particleEmitter, entry->particleBehaviourID, entry->particlePropertyID, 0, 0, 0); obj->properties.common.unk0 = entry->particleDensity; } diff --git a/src/objects.c b/src/objects.c index 550a434b..b9d32adb 100644 --- a/src/objects.c +++ b/src/objects.c @@ -2063,10 +2063,10 @@ s32 obj_init_emitter(Object *obj, ParticleEmitter *emitter) { particleDataEntry = obj->segment.header->objectParticles; for (i = 0; i < obj->segment.header->particleCount; i++) { if ((particleDataEntry[i].upper & 0xFFFF0000) == 0xFFFF0000) { - partInitTrigger((Particle *) &obj->particleEmitter[i].unk0, (particleDataEntry[i].upper >> 8) & 0xFF, + partInitTrigger((Particle *) &obj->particleEmitter[i], (particleDataEntry[i].upper >> 8) & 0xFF, particleDataEntry[i].upper & 0xFF); } else { - func_800AF29C((Particle *) &obj->particleEmitter[i].unk0, (particleDataEntry[i].upper >> 0x18) & 0xFF, + func_800AF29C((Particle *) &obj->particleEmitter[i], (particleDataEntry[i].upper >> 0x18) & 0xFF, (particleDataEntry[i].upper >> 0x10) & 0xFF, particleDataEntry[i].upper & 0xFFFF, (particleDataEntry[i].lower >> 0x10) & 0xFFFF, particleDataEntry[i].lower & 0xFFFF); } diff --git a/src/particles.c b/src/particles.c index 9b26c05b..0364ae02 100644 --- a/src/particles.c +++ b/src/particles.c @@ -36,24 +36,24 @@ const char D_800E8B44[] = "\nError :: particle %x is not indexed correctly in tr /************ .data ************/ // I woundn't be suprised if most of these zeroes are really just null pointers. -s32 D_800E2CA0 = 0; +s32 gNumTriangleParticles = 0; s32 D_800E2CA4 = 0; -ParticleType *D_800E2CA8 = NULL; -s32 D_800E2CAC = 0; +Particle *gTriangleParticleBuffer = NULL; +s32 gNumRectangleParticles = 0; s32 D_800E2CB0 = 0; -ParticleType *D_800E2CB4 = NULL; -s32 D_800E2CB8 = 0; +Particle *gRectangleParticleBuffer = NULL; +s32 gNumPointParticles = 0; s32 D_800E2CBC = 0; -ParticleType *D_800E2CC0 = NULL; -s32 D_800E2CC4 = 0; +Particle *gPointParticleBuffer = NULL; +s32 gNumLineParticles = 0; s32 D_800E2CC8 = 0; -ParticleType *D_800E2CCC = NULL; -s32 D_800E2CD0 = 0; +Particle *gLineParticleBuffer = NULL; +s32 gNumSpriteParticles = 0; s32 D_800E2CD4 = 0; -Particle *D_800E2CD8 = NULL; +SpriteParticle *gSpriteParticleBuffer = NULL; UNUSED s32 D_800E2CDC = 0; // Only ever and checked for being less than 512. -s32 *D_800E2CE0 = NULL; -s32 *D_800E2CE4 = NULL; +Vertex *gParticleVertexBuffer = NULL; +Triangle *gParticleTriangleBuffer = NULL; s32 gParticlesAssetTableCount = 0; s32 *gParticlesAssets = NULL; @@ -97,11 +97,11 @@ s16 D_800E2E28 = 0; f32 gParticleGravityTable[8] = { 0.0f, 0.1, 0.2f, 0.3f, 0.45f, 0.525f, 0.6f, 0.8f }; -s32 D_800E2E4C = 0; -s32 D_800E2E50 = 0; -s32 D_800E2E54 = 0; -s32 D_800E2E58 = 0; -s32 D_800E2E5C = 0; +s32 gMaxTriangleParticles = 0; +s32 gMaxRectangleParticles = 0; +s32 gMaxPointParticles = 0; +s32 gMaxLineParticles = 0; +s32 gMaxSpriteParticles = 0; Sprite **D_800E2E60 = NULL; s32 D_800E2E64 = 0; @@ -146,15 +146,15 @@ s16 D_80127C88[12]; /******************************/ void func_800AE270(void) { - func_800AE374(); - func_800AE438(); + free_particle_buffers(); + free_particle_vertex_triangles(); func_800AE2D8(); } void func_800AE2A0(void) { - func_800AE374(); - func_800AE438(); - func_800AE490(); + free_particle_buffers(); + free_particle_vertex_triangles(); + free_particle_assets(); func_800AE2D8(); } @@ -170,41 +170,41 @@ void func_800AE2D8(void) { } } -void func_800AE374(void) { - if (D_800E2CA8 != NULL) { - mempool_free(D_800E2CA8); - D_800E2CA8 = NULL; +void free_particle_buffers(void) { + if (gTriangleParticleBuffer != NULL) { + mempool_free(gTriangleParticleBuffer); + gTriangleParticleBuffer = NULL; } - if (D_800E2CB4 != NULL) { - mempool_free(D_800E2CB4); - D_800E2CB4 = NULL; + if (gRectangleParticleBuffer != NULL) { + mempool_free(gRectangleParticleBuffer); + gRectangleParticleBuffer = NULL; } - if (D_800E2CC0 != NULL) { - mempool_free(D_800E2CC0); - D_800E2CC0 = NULL; + if (gPointParticleBuffer != NULL) { + mempool_free(gPointParticleBuffer); + gPointParticleBuffer = NULL; } - if (D_800E2CCC != NULL) { - mempool_free(D_800E2CCC); - D_800E2CCC = NULL; + if (gLineParticleBuffer != NULL) { + mempool_free(gLineParticleBuffer); + gLineParticleBuffer = NULL; } - if (D_800E2CD8 != NULL) { - mempool_free(D_800E2CD8); - D_800E2CD8 = NULL; + if (gSpriteParticleBuffer != NULL) { + mempool_free(gSpriteParticleBuffer); + gSpriteParticleBuffer = NULL; } } -void func_800AE438(void) { - if (D_800E2CE0 != NULL) { - mempool_free(D_800E2CE0); - D_800E2CE0 = NULL; +void free_particle_vertex_triangles(void) { + if (gParticleVertexBuffer != NULL) { + mempool_free(gParticleVertexBuffer); + gParticleVertexBuffer = NULL; } - if (D_800E2CE4 != NULL) { - mempool_free(D_800E2CE4); - D_800E2CE4 = NULL; + if (gParticleTriangleBuffer != NULL) { + mempool_free(gParticleTriangleBuffer); + gParticleTriangleBuffer = NULL; } } -void func_800AE490(void) { +void free_particle_assets(void) { if (gParticlesAssets != NULL) { mempool_free(gParticlesAssets); gParticlesAssets = NULL; @@ -226,7 +226,7 @@ void func_800AE490(void) { void init_particle_assets(void) { s32 i; - func_800AE490(); + free_particle_assets(); gParticlesAssetTable = (ParticleProperties **) load_asset_section_from_rom(ASSET_PARTICLES_TABLE); gParticlesAssetTableCount = -1; while (((s32) gParticlesAssetTable[gParticlesAssetTableCount + 1]) != -1) { @@ -255,7 +255,138 @@ void init_particle_assets(void) { } } -#pragma GLOBAL_ASM("asm/nonmatchings/particles/func_800AE728.s") +#ifdef NON_EQUIVALENT +void init_particle_buffers(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5) { + unsigned int new_var2; + Vertex *sp54; + Triangle *sp50; + s32 i; + s16 *asset2F; + ParticleModel* modelPtr; + s32 zero = 0; + + D_800E2D00->word = 0; + + if (arg0 < 0) { + arg0 = 0x10; + } + if (arg1 < 0) { + arg1 = 0x10; + } + if (arg2 < 0) { + arg2 = 0xD0; + } + if (arg3 < 0) { + arg3 = 0xA0; + } + if (arg4 < 0) { + arg4 = 0x40; + } + gMaxTriangleParticles = arg0; + D_800E2CA4 = 0; + gMaxRectangleParticles = arg1; + D_800E2CB0 = 0; + gMaxPointParticles = arg2; + D_800E2CBC = 0; + gMaxLineParticles = arg3; + D_800E2CC8 = 0; + gMaxSpriteParticles = arg4; + D_800E2CD4 = 0; + + free_particle_vertex_triangles(); + gParticleVertexBuffer = mempool_alloc_safe((3 * arg0 + 4 * arg1 + 6 * arg3 + 16 * arg4) * sizeof(Vertex), COLOUR_TAG_SEMITRANS_GREY); + gParticleTriangleBuffer = mempool_alloc_safe((arg0 + 2 * arg1) * sizeof(Triangle), COLOUR_TAG_SEMITRANS_GREY); + D_800E2CDC = 0; + + free_particle_buffers(); + if (gMaxTriangleParticles > 0) { + gNumTriangleParticles = 0; + gTriangleParticleBuffer = mempool_alloc_safe(arg0 * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + } + if (gMaxRectangleParticles > 0) { + gNumRectangleParticles = 0; + gRectangleParticleBuffer = mempool_alloc_safe(arg1 * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + } + if (gMaxPointParticles > 0) { + gNumPointParticles = 0; + gPointParticleBuffer = mempool_alloc_safe(arg2 * sizeof(Particle), COLOUR_TAG_SEMITRANS_GREY); + } + if (gMaxLineParticles > 0) { + gNumLineParticles = 0; + gLineParticleBuffer = mempool_alloc_safe(arg3 * (sizeof(Particle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + } + if (gMaxSpriteParticles > 0) { + gNumSpriteParticles = 0; + gSpriteParticleBuffer = mempool_alloc_safe(arg4 * (sizeof(SpriteParticle) + sizeof(ParticleModel)), COLOUR_TAG_SEMITRANS_GREY); + } + + sp54 = &gParticleVertexBuffer[zero]; + sp50 = &gParticleTriangleBuffer[zero]; + + modelPtr = &gTriangleParticleBuffer[gMaxTriangleParticles]; + for (i = 0; i < gMaxTriangleParticles; i++) { + gTriangleParticleBuffer[i].modelData = &modelPtr[i]; + generate_particle_shape_triangle(gTriangleParticleBuffer[i].modelData, &sp54, &sp50); + } + + modelPtr = &gRectangleParticleBuffer[gMaxRectangleParticles]; + for (i = 0; i < gMaxRectangleParticles; i++) { + gRectangleParticleBuffer[i].modelData = &modelPtr[i]; + generate_particle_shape_quad(gRectangleParticleBuffer[i].modelData, &sp54, &sp50); + } + + modelPtr = &gLineParticleBuffer[gMaxLineParticles]; + for (i = 0; i < gMaxLineParticles; i++) { + gLineParticleBuffer[i].modelData = &modelPtr[i]; + sp50 = D_800E2D08; + generate_particle_shape_line(gLineParticleBuffer[i].modelData, &sp54, &sp50); + } + + modelPtr = &gSpriteParticleBuffer[gMaxSpriteParticles]; + for (i = 0; i < gMaxSpriteParticles; i++) { + gSpriteParticleBuffer[i].base.modelData = &modelPtr[i]; + sp50 = D_800E2D78; + generate_particle_shape_sprite(gSpriteParticleBuffer[i].base.modelData, &sp54, &sp50); + } + + for (i = 0; i < gMaxTriangleParticles; i++) { + gTriangleParticleBuffer[i].segment.particle.unk2C = 0; + } + + for (i = 0; i < gMaxRectangleParticles; i++) { + gRectangleParticleBuffer[i].segment.particle.unk2C = 0; + } + + for (i = 0; i < gMaxPointParticles; i++) { + gPointParticleBuffer[i].segment.particle.unk2C = 0; + } + + for (i = 0; i < gMaxLineParticles; i++) { + gLineParticleBuffer[i].segment.particle.unk2C = 0; + } + + for (i = 0; i < gMaxSpriteParticles; i++) { + gSpriteParticleBuffer[i].base.segment.particle.unk2C = 0; + } + + if (D_800E2E60 == NULL) { + asset2F = load_asset_section_from_rom(ASSET_BINARY_47); + D_800E2E64 = 0; + while (asset2F[D_800E2E64] != -1) { + D_800E2E64++; + } + + D_800E2E60 = mempool_alloc_safe(D_800E2E64 * 4, COLOUR_TAG_BLUE); + for (i = 0; i < D_800E2E64; i++) { + D_800E2E60[i] = (Sprite *) func_8007C12C(asset2F[i] & 0x3FFF, 1); + } + + mempool_free(asset2F); + } +} +#else +#pragma GLOBAL_ASM("asm/nonmatchings/particles/init_particle_buffers.s") +#endif /** * Generate a triangle shaped particle mesh. @@ -341,7 +472,7 @@ void generate_particle_shape_quad(ParticleModel *model, Vertex **vtx, Triangle * *triangles = tempTri; } -void func_800AEF88(ParticleModel *model, Vertex **vtx, Triangle **triangles) { +void generate_particle_shape_line(ParticleModel *model, Vertex **vtx, Triangle **triangles) { s32 i; Vertex *tempVtx; @@ -360,7 +491,7 @@ void func_800AEF88(ParticleModel *model, Vertex **vtx, Triangle **triangles) { *vtx = tempVtx; } -void func_800AF024(ParticleModel *model, Vertex **vtx, Triangle **triangles) { +void generate_particle_shape_sprite(ParticleModel *model, Vertex **vtx, Triangle **triangles) { s32 i; Vertex *tempVtx; @@ -415,7 +546,7 @@ void func_800AF0F0(Particle *particle) { temp_v1->unk1C = temp_t8; } -void func_800AF134(Particle *particle, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ) { +void func_800AF134(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ) { ParticleBehavior *behaviour; if (propertyID >= gParticlesAssetTableCount) { propertyID = 0; @@ -424,9 +555,9 @@ void func_800AF134(Particle *particle, s32 behaviourID, s32 propertyID, s16 velX behaviourID = 0; } behaviour = gParticleBehavioursAssetTable[behaviourID]; - if (particle->data.propertyID != propertyID || behaviour != particle->data.behaviour) { - func_800B2260(particle); - func_800AF29C(particle, behaviourID, propertyID, velX, velY, velZ); + if (emitter->unk8 != propertyID || behaviour != emitter->behaviour) { + func_800B2260(emitter); + func_800AF29C(emitter, behaviourID, propertyID, velX, velY, velZ); } } @@ -486,27 +617,20 @@ void func_800AF29C(Particle *arg0, s32 behaviourID, s32 propertyID, s16 velX, s1 #ifdef NON_EQUIVALENT void func_800AF404(s32 updateRate) { - u32 new_var; s32 i; - s16 temp; - Vec3s *vecTemp; - + D_800E2E28 = (D_800E2E28 + (updateRate << 6)) & 0x1FF; - temp = D_800E2E28; - new_var = temp; - // clang-format off - for (i = 0; i < ARRAY_COUNT(D_800E2D08); i++) {\ - vecTemp = &D_800E2D58[i];\ - D_800E2D08[i].uv2.v = vecTemp->s[0] + new_var;\ - D_800E2D08[i].uv1.v = vecTemp->s[1] + new_var;\ - D_800E2D08[i].uv0.v = vecTemp->s[2] + new_var;\ + + for (i = 0; i < ARRAY_COUNT(D_800E2D08); i++) { + D_800E2D08[i].uv2.v = D_800E2D58[i].s[0] + D_800E2E28; + D_800E2D08[i].uv1.v = D_800E2D58[i].s[1] + D_800E2E28; + D_800E2D08[i].uv0.v = D_800E2D58[i].s[2] + D_800E2E28; } - // clang-format on + for (i = 0; i < ARRAY_COUNT(D_800E2D78); i++) { - vecTemp = &D_800E2DF8[i]; - D_800E2D78[i].uv0.v = vecTemp->s[0] + new_var; - D_800E2D78[i].uv1.v = vecTemp->s[1] + new_var; - D_800E2D78[i].uv2.v = vecTemp->s[2] + new_var; + D_800E2D78[i].uv0.v = D_800E2DF8[i].s[0] + D_800E2E28; + D_800E2D78[i].uv1.v = D_800E2DF8[i].s[1] + D_800E2E28; + D_800E2D78[i].uv2.v = D_800E2DF8[i].s[2] + D_800E2E28; } } #else @@ -519,7 +643,7 @@ void func_800AF52C(Object *obj, s32 arg1) { ParticleBehavior *behaviour; Particle *temp; - temp_v0 = (Particle *) &obj->particleEmitter[arg1].unk0; + temp_v0 = (Particle *) &obj->particleEmitter[arg1].behaviour; behaviour = temp_v0->data.behaviour; temp_v0->data.opacity = 0; if (temp_v0->data.flags & 0x4000) { @@ -684,7 +808,7 @@ void func_800AF714(Object *racerObj, s32 updateRate) { func_800AFE5C((Particle *) racerObj, (Particle *) &racerObj->particleEmitter[i]); } else { racerObj->particleEmitter[i].unkA += updateRate; - if (racerObj->particleEmitter[i].unkA >= racerObj->particleEmitter[i].unk0->segment.unk40_s16) { + if (racerObj->particleEmitter[i].unkA >= racerObj->particleEmitter[i].behaviour->unk40) { func_800AFE5C((Particle *) racerObj, (Particle *) &racerObj->particleEmitter[i]); } } @@ -739,7 +863,7 @@ void obj_spawn_particle(Object *obj, s32 updateRate) { func_800AFE5C((Particle *) obj, (Particle *) &obj->particleEmitter[i]); } else { obj->particleEmitter[i].unkA += updateRate; - if (obj->particleEmitter[i].unkA >= obj->particleEmitter[i].unk0->segment.unk40_s16) { + if (obj->particleEmitter[i].unkA >= obj->particleEmitter[i].behaviour->unk40) { func_800AFE5C((Particle *) obj, (Particle *) &obj->particleEmitter[i]); } } @@ -778,7 +902,7 @@ void obj_spawn_particle(Object *obj, s32 updateRate) { // TODO: Should this be void func_800AFE5C(Object *arg0, ParticleEmitter *arg1)? void func_800AFE5C(Particle *arg0, Particle *arg1) { - Particle *temp_s0; + SpriteParticle *temp_s0; Particle *tempObj; Particle *tempObj2; s32 i; @@ -803,7 +927,7 @@ void func_800AFE5C(Particle *arg0, Particle *arg1) { if (temp_s0 != NULL) { func_8000E9D0((Object *) temp_s0); temp_s0->unk74 = arg1->data.unk6; - temp_s0->segment.unk40 |= 0x2000; + temp_s0->base.segment.unk40 |= 0x2000; arg1->data.unkC_60[arg1->data.unk6] = temp_s0; arg1->data.unk6++; } @@ -947,9 +1071,9 @@ void func_800B03C0(Particle *particle, Particle *arg1, Particle *arg2, ParticleB particle->segment.trans.z_position += arg1->segment.trans.z_position; } -Particle *func_800B0698(Particle *arg0, Particle *arg1) { +SpriteParticle *func_800B0698(Particle *arg0, Particle *arg1) { ParticleProperties *properties; - Particle *var_v0; + SpriteParticle *var_v0; TextureHeader **texture; ParticleBehavior *sp20; f32 temp_f0; @@ -965,65 +1089,65 @@ Particle *func_800B0698(Particle *arg0, Particle *arg1) { if (var_v0 == NULL) { return var_v0; } - var_v0->segment.particle.blockID = arg0->segment.particle.blockID; - var_v0->segment.trans.flags = -OBJ_FLAGS_DEACTIVATED; - var_v0->segment.particle.movementType = properties->movementType; - var_v0->segment.unk40 = properties->unk2; - var_v0->segment.unk3C = arg0; + var_v0->base.segment.particle.blockID = arg0->segment.particle.blockID; + var_v0->base.segment.trans.flags = -OBJ_FLAGS_DEACTIVATED; + var_v0->base.segment.particle.movementType = properties->movementType; + var_v0->base.segment.unk40 = properties->unk2; + var_v0->base.segment.unk3C = arg0; var_v0->unk70 = arg1; - var_v0->segment.trans.scale = properties->scale * sp20->unk50; - var_v0->segment.scaleVel = properties->scale * sp20->unk54; - var_v0->segment.particle.destroyTimer = properties->lifeTime; - var_v0->segment.particle.unk34 = 0.0f; - var_v0->segment.particle.unk38 = 0.0f; - var_v0->colour.r = properties->colour.r; - var_v0->colour.g = properties->colour.g; - var_v0->colour.b = properties->colour.b; - var_v0->colour.a = properties->colour.a; - if (var_v0->segment.unk40 & 0x800 && arg0->unk54_ptr != NULL) { - var_v0->brightness = *arg0->unk54_ptr * 255.0f; + var_v0->base.segment.trans.scale = properties->scale * sp20->unk50; + var_v0->base.segment.scaleVel = properties->scale * sp20->unk54; + var_v0->base.segment.particle.destroyTimer = properties->lifeTime; + var_v0->base.segment.particle.unk34 = 0.0f; + var_v0->base.segment.particle.unk38 = 0.0f; + var_v0->base.colour.r = properties->colour.r; + var_v0->base.colour.g = properties->colour.g; + var_v0->base.colour.b = properties->colour.b; + var_v0->base.colour.a = properties->colour.a; + if (var_v0->base.segment.unk40 & 0x800 && arg0->unk54_ptr != NULL) { + var_v0->base.brightness = *arg0->unk54_ptr * 255.0f; } else { - var_v0->brightness = 255; + var_v0->base.brightness = 255; } - var_v0->opacityTimer = properties->opacityTimer; + var_v0->base.opacityTimer = properties->opacityTimer; if (arg1->data.flags & 0x100) { - var_v0->opacity = arg1->data.opacity; + var_v0->base.opacity = arg1->data.opacity; } else { - var_v0->opacity = properties->opacity << 8; + var_v0->base.opacity = properties->opacity << 8; } if (properties->opacity < 255) { - if (var_v0->segment.unk40 & 0x1000) { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + if (var_v0->base.segment.unk40 & 0x1000) { + var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if (var_v0->opacityTimer < var_v0->segment.particle.destroyTimer) { - var_v0->opacityVel = ((properties->opacityVel << 8) - (var_v0->opacity & 0xFFFF)) / - (var_v0->segment.particle.destroyTimer - var_v0->opacityTimer); + if (var_v0->base.opacityTimer < var_v0->base.segment.particle.destroyTimer) { + var_v0->base.opacityVel = ((properties->opacityVel << 8) - (var_v0->base.opacity & 0xFFFF)) / + (var_v0->base.segment.particle.destroyTimer - var_v0->base.opacityTimer); } else { - var_v0->opacityVel = 0; + var_v0->base.opacityVel = 0; } func_800B03C0(var_v0, arg0, arg1, sp20); if (sp20->flags & 0x80) { - var_v0->segment.trans.rotation.y_rotation = sp20->angleOffsetY; - var_v0->segment.trans.rotation.x_rotation = sp20->angleOffsetX; - var_v0->segment.trans.rotation.z_rotation = sp20->angleOffsetZ; + var_v0->base.segment.trans.rotation.y_rotation = sp20->angleOffsetY; + var_v0->base.segment.trans.rotation.x_rotation = sp20->angleOffsetX; + var_v0->base.segment.trans.rotation.z_rotation = sp20->angleOffsetZ; } else { - var_v0->segment.trans.rotation.y_rotation = arg0->segment.trans.rotation.y_rotation + sp20->angleOffsetY; - var_v0->segment.trans.rotation.x_rotation = arg0->segment.trans.rotation.x_rotation + sp20->angleOffsetX; - var_v0->segment.trans.rotation.z_rotation = arg0->segment.trans.rotation.z_rotation + sp20->angleOffsetZ; + var_v0->base.segment.trans.rotation.y_rotation = arg0->segment.trans.rotation.y_rotation + sp20->angleOffsetY; + var_v0->base.segment.trans.rotation.x_rotation = arg0->segment.trans.rotation.x_rotation + sp20->angleOffsetX; + var_v0->base.segment.trans.rotation.z_rotation = arg0->segment.trans.rotation.z_rotation + sp20->angleOffsetZ; } - var_v0->angleVelY = sp20->angleVelY; - var_v0->angleVelX = sp20->angleVelX; - var_v0->angleVelZ = sp20->angleVelZ; + var_v0->base.angleVelY = sp20->angleVelY; + var_v0->base.angleVelX = sp20->angleVelX; + var_v0->base.angleVelZ = sp20->angleVelZ; func_800B0010(var_v0, arg0, arg1, sp20); - var_v0->gravity = gParticleGravityTable[(var_v0->segment.unk40 >> 4) & 7]; - if (var_v0->segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY) { - temp_f0 = var_v0->segment.x_velocity; - temp_f2 = var_v0->segment.y_velocity; - temp_f14 = var_v0->segment.z_velocity; - var_v0->forwardVel = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); + var_v0->base.gravity = gParticleGravityTable[(var_v0->base.segment.unk40 >> 4) & 7]; + if (var_v0->base.segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITY) { + temp_f0 = var_v0->base.segment.x_velocity; + temp_f2 = var_v0->base.segment.y_velocity; + temp_f14 = var_v0->base.segment.z_velocity; + var_v0->base.forwardVel = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); } if (sp20->flags & 2) { arg1->data.angle.rotation.z_rotation += sp20->unk1C; @@ -1033,23 +1157,23 @@ Particle *func_800B0698(Particle *arg0, Particle *arg1) { arg1->data.angle.direction.x_rotation += sp20->unk2A; arg1->data.angle.direction.z_rotation += sp20->unk2C; } - var_v0->segment.unk1A = properties->unk6; - var_v0->segment.textureFrame = 0; - texture = &var_v0->modelData->texture; + var_v0->base.segment.unk1A = properties->unk6; + var_v0->base.segment.textureFrame = 0; + texture = &var_v0->base.modelData->texture; if (properties->textureID == -1) { *texture = NULL; } else { *texture = load_texture(properties->textureID); if ((*texture) != NULL) { if ((*texture)->flags & 4) { - if (var_v0->segment.unk40 & 0x1000) { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0100; + if (var_v0->base.segment.unk40 & 0x1000) { + var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0100; } else { - var_v0->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + var_v0->base.segment.trans.flags |= OBJ_FLAGS_UNK_0080; } } - if ((var_v0->segment.unk40 & 3) == 2) { - var_v0->segment.textureFrame = (*texture)->numOfTextures - 1; + if ((var_v0->base.segment.unk40 & 3) == 2) { + var_v0->base.segment.textureFrame = (*texture)->numOfTextures - 1; } } } @@ -1419,82 +1543,82 @@ Particle *func_800B1CB8(s32 arg0) { switch (arg0) { case 0x80: - if ((D_800E2CC0 != NULL)) { - if (D_800E2CB8 >= D_800E2E54 - 1) { + if ((gPointParticleBuffer != NULL)) { + if (gNumPointParticles >= gMaxPointParticles - 1) { if (D_800E2CBC == 0) { D_800E2CBC = 1; } } else { - while (D_800E2CC0[i].unk2C != 0) { + while (gPointParticleBuffer[i].segment.particle.unk2C != 0) { i++; } - D_800E2CC0[i].unk2C = 0x80; - D_800E2CB8++; - var_v1 = (Particle *) &D_800E2CC0[i]; + gPointParticleBuffer[i].segment.particle.unk2C = 0x80; + gNumPointParticles++; + var_v1 = (Particle *) &gPointParticleBuffer[i]; } } break; case 1: - if (D_800E2CA8 != NULL) { - if (D_800E2CA0 >= D_800E2E4C - 1) { + if (gTriangleParticleBuffer != NULL) { + if (gNumTriangleParticles >= gMaxTriangleParticles - 1) { if (D_800E2CA4 == 0) { D_800E2CA4 = 1; } } else { - while (D_800E2CA8[i].unk2C != 0) { + while (gTriangleParticleBuffer[i].segment.particle.unk2C != 0) { i++; } - D_800E2CA8[i].unk2C = 1; - D_800E2CA0++; - var_v1 = (Particle *) &D_800E2CA8[i]; + gTriangleParticleBuffer[i].segment.particle.unk2C = 1; + gNumTriangleParticles++; + var_v1 = (Particle *) &gTriangleParticleBuffer[i]; } } break; case 2: - if (D_800E2CB4 != NULL) { - if (D_800E2CAC >= D_800E2E50 - 1) { + if (gRectangleParticleBuffer != NULL) { + if (gNumRectangleParticles >= gMaxRectangleParticles - 1) { if (D_800E2CB0 == 0) { D_800E2CB0 = 1; } } else { - while (D_800E2CB4[i].unk2C != 0) { + while (gRectangleParticleBuffer[i].segment.particle.unk2C != 0) { i++; } - D_800E2CB4[i].unk2C = 2; - D_800E2CAC++; - var_v1 = (Particle *) &D_800E2CB4[i]; + gRectangleParticleBuffer[i].segment.particle.unk2C = 2; + gNumRectangleParticles++; + var_v1 = (Particle *) &gRectangleParticleBuffer[i]; } } break; case 3: - if (D_800E2CCC != NULL) { - if (D_800E2CC4 >= D_800E2E58 - 1) { + if (gLineParticleBuffer != NULL) { + if (gNumLineParticles >= gMaxLineParticles - 1) { if (D_800E2CC8 == 0) { D_800E2CC8 = 1; } } else { - while (D_800E2CCC[i].unk2C != 0) { + while (gLineParticleBuffer[i].segment.particle.unk2C != 0) { i++; } - D_800E2CCC[i].unk2C = 3; - D_800E2CC4++; - var_v1 = (Particle *) &D_800E2CCC[i]; + gLineParticleBuffer[i].segment.particle.unk2C = 3; + gNumLineParticles++; + var_v1 = (Particle *) &gLineParticleBuffer[i]; } } break; case 4: - if (D_800E2CD8 != NULL) { - if (D_800E2CD0 >= D_800E2E5C - 1) { + if (gSpriteParticleBuffer != NULL) { + if (gNumSpriteParticles >= gMaxSpriteParticles - 1) { if (D_800E2CD4 == 0) { D_800E2CD4 = 1; } } else { - while (D_800E2CD8[i].segment.particle.unk2C != 0) { + while (gSpriteParticleBuffer[i].base.segment.particle.unk2C != 0) { i++; } - D_800E2CD8[i].segment.particle.unk2C = 4; - D_800E2CD0++; - var_v1 = (Particle *) &D_800E2CD8[i]; + gSpriteParticleBuffer[i].base.segment.particle.unk2C = 4; + gNumSpriteParticles++; + var_v1 = (Particle *) &gSpriteParticleBuffer[i]; } } break; @@ -1510,54 +1634,54 @@ void func_800B2040(Particle *arg0) { switch (arg0->segment.particle.unk2C) { case 0x80: - if (D_800E2CB8 > 0) { + if (gNumPointParticles > 0) { if (arg0->modelData) { free_sprite((Sprite *) &arg0->modelData->texture); } - D_800E2CB8--; + gNumPointParticles--; arg0->segment.particle.unk2C = 0; } break; case 0: return; case 1: - if (D_800E2CA0 > 0) { + if (gNumTriangleParticles > 0) { tex = arg0->modelData->texture; if (tex != NULL) { free_texture(tex); } - D_800E2CA0--; + gNumTriangleParticles--; arg0->segment.particle.unk2C = 0; } break; case 2: - if (D_800E2CAC > 0) { + if (gNumRectangleParticles > 0) { tex = arg0->modelData->texture; if (tex != NULL) { free_texture(tex); } - D_800E2CAC--; + gNumRectangleParticles--; arg0->segment.particle.unk2C = 0; } break; case 3: - if (D_800E2CC4 > 0) { + if (gNumLineParticles > 0) { tex = arg0->modelData->texture; if (tex != NULL) { free_texture(tex); } - D_800E2CC4--; + gNumLineParticles--; arg0->segment.particle.unk2C = 0; } break; case 4: - if (D_800E2CD0 > 0) { + if (gNumSpriteParticles > 0) { func_800B263C(arg0); tex = arg0->modelData->texture; if (tex != NULL) { free_texture(tex); } - D_800E2CD0--; + gNumSpriteParticles--; arg0->segment.particle.unk2C = 0; } break; @@ -1565,14 +1689,14 @@ void func_800B2040(Particle *arg0) { } void func_800B2260(Particle *arg0) { - Particle *temp_v0; + SpriteParticle *temp_v0; s32 i; if (arg0->data.flags & 0x400) { if (arg0->data.unkC_60 != NULL) { for (i = 0; i < arg0->data.unk6; i++) { temp_v0 = arg0->data.unkC_60[i]; - temp_v0->segment.particle.destroyTimer = 0; + temp_v0->base.segment.particle.destroyTimer = 0; temp_v0->unk70 = 0; } mempool_free(arg0->data.unkC_60); @@ -1587,7 +1711,7 @@ void func_800B2260(Particle *arg0) { */ void handle_particle_movement(Particle *particle, s32 updateRate) { LevelModelSegmentBoundingBox *boundingBox; - Particle *tempParticle; + SpriteParticle *tempParticle; gParticleUpdateRate = updateRate; tempParticle = NULL; @@ -1601,8 +1725,8 @@ void handle_particle_movement(Particle *particle, s32 updateRate) { } if (particle->segment.particle.unk2C == 4) { tempParticle = particle; - particle->modelFrame = 1 - particle->modelFrame; - particle->unk77 = 0; + ((SpriteParticle*)particle)->modelFrame = 1 - ((SpriteParticle*)particle)->modelFrame; + ((SpriteParticle*)particle)->unk77 = 0; } if (tempParticle == NULL || (tempParticle && tempParticle->unk70)) { if (particle->segment.particle.movementType == PARTICLE_MOVEMENT_VELOCITIES) { @@ -1658,9 +1782,9 @@ void handle_particle_movement(Particle *particle, s32 updateRate) { } } -void func_800B263C(Particle *arg0) { +void func_800B263C(SpriteParticle *arg0) { Particle *new_var; - Particle *new_var2; + SpriteParticle *new_var2; Particle *temp_v0; s32 i; @@ -1668,7 +1792,7 @@ void func_800B263C(Particle *arg0) { if (temp_v0 != NULL) { new_var = temp_v0; if (temp_v0->data.unk6 != 0) { - if (arg0 == temp_v0->data.unkC_60[arg0->unk74]) { + if (&arg0->base == temp_v0->data.unkC_60[arg0->unk74]) { temp_v0->data.unk6--; for (i = arg0->unk74; i < temp_v0->data.unk6; i++) { new_var->data.unkC_60[i] = new_var->data.unkC_60[i + 1]; @@ -2089,11 +2213,11 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt if (particle->segment.camera.unk3A > 0) { gDPSetPrimColor((*dList)++, 0, 0, particle->brightness, particle->brightness, particle->brightness, 255); - if (particle->unk77 == 0) { + if (((SpriteParticle*)particle)->unk77 == 0) { func_800B3E64((Object *) particle); } modelData = particle->modelData; - temp = particle->modelFrame; + temp = ((SpriteParticle*)particle)->modelFrame; temp <<= 3; tempvtx = &modelData->vertices[temp]; load_and_set_texture(dList, modelData->texture, renderFlags, particle->segment.textureFrame << 8); diff --git a/src/particles.h b/src/particles.h index 3df06b36..8a762702 100644 --- a/src/particles.h +++ b/src/particles.h @@ -230,49 +230,53 @@ typedef struct ParticleOtherSomething { } ParticleOtherSomething; typedef struct Particle { - union { - /* 0x0000 */ ParticleSegment segment; - /* 0x0000 */ ParticleData data; - }; - union { - /* 0x0044 */ ParticleModel *modelData; - /* 0x0044 */ ParticleOtherSomething *unk44_1; - }; - /* 0x0048 */ s16 behaviorId; - /* 0x004A */ s16 brightness; - /* 0x004C */ f32 baseVelX; - /* 0x0050 */ f32 baseVelY; - union { - /* 0x0054 */ f32 baseVelZ; - /* 0x0054 */ f32 *unk54_ptr; - }; - union { - /* 0x0058 */ Particle_58 **unk58_ptr; - /* 0x0058 */ f32 forwardVel; - }; - /* 0x005C */ s16 opacity; - /* 0x005E */ s16 opacityVel; - /* 0x0060 */ s16 opacityTimer; - /* 0x0062 */ s16 angleVelY; - /* 0x0064 */ s16 angleVelX; - /* 0x0066 */ s16 angleVelZ; - union { - /* 0x0068 */ f32 gravity; - struct { - /* 0x0068 */ u8 unk68b; - /* 0x0069 */ u8 unk69b; - /* 0x006A */ s8 unk6Ab; - /* 0x006B */ s8 unk6Bb; - }; - }; - /* 0x006C */ ColourRGBA colour; - /* 0x0070 */ struct Particle *unk70; - /* 0x0074 */ u8 unk74; - /* 0x0075 */ u8 modelFrame; - /* 0x0076 */ u8 unk76; - /* 0x0077 */ s8 unk77; + union { + /* 0x0000 */ ParticleSegment segment; + /* 0x0000 */ ParticleData data; + }; + union { + /* 0x0044 */ ParticleModel *modelData; + /* 0x0044 */ ParticleOtherSomething *unk44_1; + }; + /* 0x0048 */ s16 behaviorId; + /* 0x004A */ s16 brightness; + /* 0x004C */ f32 baseVelX; + /* 0x0050 */ f32 baseVelY; + union { + /* 0x0054 */ f32 baseVelZ; + /* 0x0054 */ f32 *unk54_ptr; + }; + union { + /* 0x0058 */ Particle_58 **unk58_ptr; + /* 0x0058 */ f32 forwardVel; + }; + /* 0x005C */ s16 opacity; + /* 0x005E */ s16 opacityVel; + /* 0x0060 */ s16 opacityTimer; + /* 0x0062 */ s16 angleVelY; + /* 0x0064 */ s16 angleVelX; + /* 0x0066 */ s16 angleVelZ; + union { + /* 0x0068 */ f32 gravity; + struct { + /* 0x0068 */ u8 unk68b; + /* 0x0069 */ u8 unk69b; + /* 0x006A */ s8 unk6Ab; + /* 0x006B */ s8 unk6Bb; + }; + }; + /* 0x006C */ ColourRGBA colour; } Particle; +typedef struct SpriteParticle { + /* 0x0000 */ Particle base; + /* 0x0070 */ struct Particle *unk70; + /* 0x0074 */ u8 unk74; + /* 0x0075 */ u8 modelFrame; + /* 0x0076 */ u8 unk76; + /* 0x0077 */ s8 unk77; +} SpriteParticle; + // Size: 8 bytes typedef struct unkParticleBehaviorUnk9C { s32 unk0; @@ -282,42 +286,35 @@ typedef struct unkParticleBehaviorUnk9C { u8 pad7; // Probably alpha } unkParticleBehaviorUnk9C; -// Almost an identical copy of Particle, but a few bytes shorter. Exists to make sure func_800B1CB8 matches. -typedef struct ParticleType { - u8 pad[0x2C]; - s16 unk2C; - u8 pad2[0x42]; -} ParticleType; - void func_800AE270(void); void func_800AE2A0(void); void func_800AE2D8(void); -void func_800AE374(void); -void func_800AE438(void); -void func_800AE490(void); +void free_particle_buffers(void); +void free_particle_vertex_triangles(void); +void free_particle_assets(void); void generate_particle_shape_triangle(ParticleModel *model, Vertex **vtx, Triangle **triangles); void generate_particle_shape_quad(ParticleModel *model, Vertex **vtx, Triangle **triangles); -void func_800AEF88(ParticleModel *model, Vertex **vtx, Triangle **triangles); -void func_800AF024(ParticleModel *model, Vertex **vtx, Triangle **triangles); +void generate_particle_shape_line(ParticleModel *model, Vertex **vtx, Triangle **triangles); +void generate_particle_shape_sprite(ParticleModel *model, Vertex **vtx, Triangle **triangles); void func_800AF0A4(Particle *particle); void func_800AF0F0(Particle *particle); void partInitTrigger(Particle *particle, s32 behaviourID, s32 propertyID); void func_800AF29C(Particle *arg0, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ); void func_800AF6E4(Object *obj, s32 arg1); void func_800B2260(Particle *arg0); -void func_800B263C(Particle *arg0); +void func_800B263C(SpriteParticle *arg0); void init_particle_assets(void); void set_particle_texture_frame(Particle *particle); void func_800B03C0(Particle *particle, Particle *arg1, Particle *arg2, ParticleBehavior *behaviour); void func_800B2040(Particle *arg0); void handle_particle_movement(Particle *particle, s32 updateRate); void func_800B0010(Particle *arg0, Particle *arg1, Particle *arg2, ParticleBehavior *arg3); -Particle *func_800B0698(Particle *arg0, Particle *arg1); +SpriteParticle *func_800B0698(Particle *arg0, Particle *arg1); Particle *func_800B1CB8(s32 arg0); void func_800AFE5C(Particle *arg0, Particle *arg1); Particle *func_800B1130(Particle *arg0, Particle *arg1); void func_800AF52C(Object *obj, s32 arg1); -void func_800AF134(Particle *particle, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ); +void func_800AF134(ParticleEmitter *emitter, s32 behaviourID, s32 propertyID, s16 velX, s16 velY, s16 velZ); void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 flags); void func_800B4668(Object *obj, s32 idx, s32 arg2, s32 arg3); void func_800B46BC(Object *obj, s32 idx, s32 arg2, s32 arg3); @@ -328,7 +325,7 @@ void func_800AF714(Object *racerObj, s32 updateRate); Particle* func_800B0BAC(Object* arg0, Particle* arg1); void func_800AF404(s32 updateRate); // Non Matching -void func_800AE728(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); // Non Matching +void init_particle_buffers(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); // Non Matching void move_particle_basic_parent(Particle *); void move_particle_velocity_parent(Particle *); void move_particle_with_velocities(Particle *); diff --git a/src/thread3_main.c b/src/thread3_main.c index 5010467e..889a93d8 100644 --- a/src/thread3_main.c +++ b/src/thread3_main.c @@ -389,7 +389,7 @@ void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v load_game_text_table(); load_level(levelId, numberOfPlayers, entranceId, vehicleId, gGameCurrentCutscene); hud_init(get_viewport_count()); - func_800AE728(8, 0x10, 0x96, 0x64, 0x32, 0); + init_particle_buffers(8, 16, 150, 100, 50, 0); ainode_update(); osSetTime(0); mempool_free_timer(2); @@ -880,7 +880,7 @@ void load_level_menu(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v load_game_text_table(); load_level(levelId, numberOfPlayers, entranceId, vehicleId, cutsceneId); hud_init(get_viewport_count()); - func_800AE728(4, 4, 0x6E, 0x30, 0x20, 0); + init_particle_buffers(4, 4, 110, 48, 32, 0); ainode_update(); osSetTime(0); mempool_free_timer(2); diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index dfde387c..9f63fcc3 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -1625,15 +1625,15 @@ render_rain_overlay = 0x800AE2BC; func_800AE270 = 0x800AE870; func_800AE2A0 = 0x800AE8A0; func_800AE2D8 = 0x800AE8D8; -func_800AE374 = 0x800AE974; -func_800AE438 = 0x800AEA38; -func_800AE490 = 0x800AEA90; +free_particle_buffers = 0x800AE974; +free_particle_vertex_triangles = 0x800AEA38; +free_particle_assets = 0x800AEA90; init_particle_assets = 0x800AEB30; -func_800AE728 = 0x800AED28; +init_particle_buffers = 0x800AED28; generate_particle_shape_triangle = 0x800AF414; generate_particle_shape_quad = 0x800AF4B8; -func_800AEF88 = 0x800AF588; -func_800AF024 = 0x800AF624; +generate_particle_shape_line = 0x800AF588; +generate_particle_shape_sprite = 0x800AF624; func_800AF0A4 = 0x800AF6A4; func_800AF0F0 = 0x800AF6F0; func_800AF134 = 0x800AF734; @@ -2810,24 +2810,24 @@ gWeatherSoundMask = 0x800E4784; gThunderTransition = 0x800E4788; // particles.c .data -D_800E2CA0 = 0x800E4790; +gNumTriangleParticles = 0x800E4790; D_800E2CA4 = 0x800E4794; -D_800E2CA8 = 0x800E4798; -D_800E2CAC = 0x800E479C; +gTriangleParticleBuffer = 0x800E4798; +gNumRectangleParticles = 0x800E479C; D_800E2CB0 = 0x800E47A0; -D_800E2CB4 = 0x800E47A4; -D_800E2CB8 = 0x800E47A8; +gRectangleParticleBuffer = 0x800E47A4; +gNumPointParticles = 0x800E47A8; D_800E2CBC = 0x800E47AC; -D_800E2CC0 = 0x800E47B0; -D_800E2CC4 = 0x800E47B4; +gPointParticleBuffer = 0x800E47B0; +gNumLineParticles = 0x800E47B4; D_800E2CC8 = 0x800E47B8; -D_800E2CCC = 0x800E47BC; -D_800E2CD0 = 0x800E47C0; +gLineParticleBuffer = 0x800E47BC; +gNumSpriteParticles = 0x800E47C0; D_800E2CD4 = 0x800E47C4; -D_800E2CD8 = 0x800E47C8; +gSpriteParticleBuffer = 0x800E47C8; D_800E2CDC = 0x800E47CC; -D_800E2CE0 = 0x800E47D0; -D_800E2CE4 = 0x800E47D4; +gParticleVertexBuffer = 0x800E47D0; +gParticleTriangleBuffer = 0x800E47D4; gParticlesAssetTableCount = 0x800E47D8; gParticlesAssets = 0x800E47DC; gParticlesAssetTable = 0x800E47E0; @@ -2841,11 +2841,11 @@ D_800E2D78 = 0x800E4868; D_800E2DF8 = 0x800E48E8; D_800E2E28 = 0x800E4918; gParticleGravityTable = 0x800E491C; -D_800E2E4C = 0x800E493C; -D_800E2E50 = 0x800E4940; -D_800E2E54 = 0x800E4944; -D_800E2E58 = 0x800E4948; -D_800E2E5C = 0x800E494C; +gMaxTriangleParticles = 0x800E493C; +gMaxRectangleParticles = 0x800E4940; +gMaxPointParticles = 0x800E4944; +gMaxLineParticles = 0x800E4948; +gMaxSpriteParticles = 0x800E494C; D_800E2E60 = 0x800E4950; D_800E2E64 = 0x800E4954; gParticleCoordListTri = 0x800E4958; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index fa89969a..2855ce76 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -1614,15 +1614,15 @@ render_rain_overlay = 0x800ADD4C; func_800AE270 = 0x800AE300; func_800AE2A0 = 0x800AE330; func_800AE2D8 = 0x800AE368; -func_800AE374 = 0x800AE404; -func_800AE438 = 0x800AE4C8; -func_800AE490 = 0x800AE520; +free_particle_buffers = 0x800AE404; +free_particle_vertex_triangles = 0x800AE4C8; +free_particle_assets = 0x800AE520; init_particle_assets = 0x800AE5C0; -func_800AE728 = 0x800AE7B8; +init_particle_buffers = 0x800AE7B8; generate_particle_shape_triangle = 0x800AEEA4; generate_particle_shape_quad = 0x800AEF48; -func_800AEF88 = 0x800AF018; -func_800AF024 = 0x800AF0B4; +generate_particle_shape_line = 0x800AF018; +generate_particle_shape_sprite = 0x800AF0B4; func_800AF0A4 = 0x800AF134; func_800AF0F0 = 0x800AF180; func_800AF134 = 0x800AF1C4; @@ -2650,24 +2650,24 @@ gRainSplashGfx = 0x800E2D1C; gRainVertexFlip = 0x800E2D20; gWeatherSoundMask = 0x800E2D24; gThunderTransition = 0x800E2D28; -D_800E2CA0 = 0x800E2D30; +gNumTriangleParticles = 0x800E2D30; D_800E2CA4 = 0x800E2D34; -D_800E2CA8 = 0x800E2D38; -D_800E2CAC = 0x800E2D3C; +gTriangleParticleBuffer = 0x800E2D38; +gNumRectangleParticles = 0x800E2D3C; D_800E2CB0 = 0x800E2D40; -D_800E2CB4 = 0x800E2D44; -D_800E2CB8 = 0x800E2D48; +gRectangleParticleBuffer = 0x800E2D44; +gNumPointParticles = 0x800E2D48; D_800E2CBC = 0x800E2D4C; -D_800E2CC0 = 0x800E2D50; -D_800E2CC4 = 0x800E2D54; +gPointParticleBuffer = 0x800E2D50; +gNumLineParticles = 0x800E2D54; D_800E2CC8 = 0x800E2D58; -D_800E2CCC = 0x800E2D5C; -D_800E2CD0 = 0x800E2D60; +gLineParticleBuffer = 0x800E2D5C; +gNumSpriteParticles = 0x800E2D60; D_800E2CD4 = 0x800E2D64; -D_800E2CD8 = 0x800E2D68; +gSpriteParticleBuffer = 0x800E2D68; D_800E2CDC = 0x800E2D6C; -D_800E2CE0 = 0x800E2D70; -D_800E2CE4 = 0x800E2D74; +gParticleVertexBuffer = 0x800E2D70; +gParticleTriangleBuffer = 0x800E2D74; gParticlesAssetTableCount = 0x800E2D78; gParticlesAssets = 0x800E2D7C; gParticlesAssetTable = 0x800E2D80; @@ -2681,11 +2681,11 @@ D_800E2D78 = 0x800E2E08; D_800E2DF8 = 0x800E2E88; D_800E2E28 = 0x800E2EB8; gParticleGravityTable = 0x800E2EBC; -D_800E2E4C = 0x800E2EDC; -D_800E2E50 = 0x800E2EE0; -D_800E2E54 = 0x800E2EE4; -D_800E2E58 = 0x800E2EE8; -D_800E2E5C = 0x800E2EEC; +gMaxTriangleParticles = 0x800E2EDC; +gMaxRectangleParticles = 0x800E2EE0; +gMaxPointParticles = 0x800E2EE4; +gMaxLineParticles = 0x800E2EE8; +gMaxSpriteParticles = 0x800E2EEC; D_800E2E60 = 0x800E2EF0; D_800E2E64 = 0x800E2EF4; gParticleCoordListTri = 0x800E2EF8; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index d063deae..e4bbdc95 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -1535,15 +1535,15 @@ render_rain_overlay = 0x800AE2AC; func_800AE270 = 0x800AE860; func_800AE2A0 = 0x800AE890; func_800AE2D8 = 0x800AE8C8; -func_800AE374 = 0x800AE964; -func_800AE438 = 0x800AEA28; -func_800AE490 = 0x800AEA80; +free_particle_buffers = 0x800AE964; +free_particle_vertex_triangles = 0x800AEA28; +free_particle_assets = 0x800AEA80; init_particle_assets = 0x800AEB20; -func_800AE728 = 0x800AED18; +init_particle_buffers = 0x800AED18; generate_particle_shape_triangle = 0x800AF404; generate_particle_shape_quad = 0x800AF4A8; -func_800AEF88 = 0x800AF578; -func_800AF024 = 0x800AF614; +generate_particle_shape_line = 0x800AF578; +generate_particle_shape_sprite = 0x800AF614; func_800AF0A4 = 0x800AF694; func_800AF0F0 = 0x800AF6E0; func_800AF134 = 0x800AF724; @@ -2579,24 +2579,24 @@ gRainSplashGfx = 0x800E32AC; gRainVertexFlip = 0x800E32B0; gWeatherSoundMask = 0x800E32B4; gThunderTransition = 0x800E32B8; -D_800E2CA0 = 0x800E32C0; +gNumTriangleParticles = 0x800E32C0; D_800E2CA4 = 0x800E32C4; -D_800E2CA8 = 0x800E32C8; -D_800E2CAC = 0x800E32CC; +gTriangleParticleBuffer = 0x800E32C8; +gNumRectangleParticles = 0x800E32CC; D_800E2CB0 = 0x800E32D0; -D_800E2CB4 = 0x800E32D4; -D_800E2CB8 = 0x800E32D8; +gRectangleParticleBuffer = 0x800E32D4; +gNumPointParticles = 0x800E32D8; D_800E2CBC = 0x800E32DC; -D_800E2CC0 = 0x800E32E0; -D_800E2CC4 = 0x800E32E4; +gPointParticleBuffer = 0x800E32E0; +gNumLineParticles = 0x800E32E4; D_800E2CC8 = 0x800E32E8; -D_800E2CCC = 0x800E32EC; -D_800E2CD0 = 0x800E32F0; +gLineParticleBuffer = 0x800E32EC; +gNumSpriteParticles = 0x800E32F0; D_800E2CD4 = 0x800E32F4; -D_800E2CD8 = 0x800E32F8; +gSpriteParticleBuffer = 0x800E32F8; D_800E2CDC = 0x800E32FC; -D_800E2CE0 = 0x800E3300; -D_800E2CE4 = 0x800E3304; +gParticleVertexBuffer = 0x800E3300; +gParticleTriangleBuffer = 0x800E3304; gParticlesAssetTableCount = 0x800E3308; gParticlesAssets = 0x800E330C; gParticlesAssetTable = 0x800E3310; @@ -2610,11 +2610,11 @@ D_800E2D78 = 0x800E3398; D_800E2DF8 = 0x800E3418; D_800E2E28 = 0x800E3448; gParticleGravityTable = 0x800E344C; -D_800E2E4C = 0x800E346C; -D_800E2E50 = 0x800E3470; -D_800E2E54 = 0x800E3474; -D_800E2E58 = 0x800E3478; -D_800E2E5C = 0x800E347C; +gMaxTriangleParticles = 0x800E346C; +gMaxRectangleParticles = 0x800E3470; +gMaxPointParticles = 0x800E3474; +gMaxLineParticles = 0x800E3478; +gMaxSpriteParticles = 0x800E347C; D_800E2E60 = 0x800E3480; D_800E2E64 = 0x800E3484; gParticleCoordListTri = 0x800E3488; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 0feed664..795e2dac 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -1620,15 +1620,15 @@ render_rain_overlay = 0x800ADCBC; func_800AE270 = 0x800AE270; func_800AE2A0 = 0x800AE2A0; func_800AE2D8 = 0x800AE2D8; -func_800AE374 = 0x800AE374; -func_800AE438 = 0x800AE438; -func_800AE490 = 0x800AE490; +free_particle_buffers = 0x800AE374; +free_particle_vertex_triangles = 0x800AE438; +free_particle_assets = 0x800AE490; init_particle_assets = 0x800AE530; -func_800AE728 = 0x800AE728; +init_particle_buffers = 0x800AE728; generate_particle_shape_triangle = 0x800AEE14; generate_particle_shape_quad = 0x800AEEB8; -func_800AEF88 = 0x800AEF88; -func_800AF024 = 0x800AF024; +generate_particle_shape_line = 0x800AEF88; +generate_particle_shape_sprite = 0x800AF024; func_800AF0A4 = 0x800AF0A4; func_800AF0F0 = 0x800AF0F0; func_800AF134 = 0x800AF134; @@ -2801,24 +2801,24 @@ gWeatherSoundMask = 0x800E2C94; gThunderTransition = 0x800E2C98; // particles.c .data -D_800E2CA0 = 0x800E2CA0; +gNumTriangleParticles = 0x800E2CA0; D_800E2CA4 = 0x800E2CA4; -D_800E2CA8 = 0x800E2CA8; -D_800E2CAC = 0x800E2CAC; +gTriangleParticleBuffer = 0x800E2CA8; +gNumRectangleParticles = 0x800E2CAC; D_800E2CB0 = 0x800E2CB0; -D_800E2CB4 = 0x800E2CB4; -D_800E2CB8 = 0x800E2CB8; +gRectangleParticleBuffer = 0x800E2CB4; +gNumPointParticles = 0x800E2CB8; D_800E2CBC = 0x800E2CBC; -D_800E2CC0 = 0x800E2CC0; -D_800E2CC4 = 0x800E2CC4; +gPointParticleBuffer = 0x800E2CC0; +gNumLineParticles = 0x800E2CC4; D_800E2CC8 = 0x800E2CC8; -D_800E2CCC = 0x800E2CCC; -D_800E2CD0 = 0x800E2CD0; +gLineParticleBuffer = 0x800E2CCC; +gNumSpriteParticles = 0x800E2CD0; D_800E2CD4 = 0x800E2CD4; -D_800E2CD8 = 0x800E2CD8; +gSpriteParticleBuffer = 0x800E2CD8; D_800E2CDC = 0x800E2CDC; -D_800E2CE0 = 0x800E2CE0; -D_800E2CE4 = 0x800E2CE4; +gParticleVertexBuffer = 0x800E2CE0; +gParticleTriangleBuffer = 0x800E2CE4; gParticlesAssetTableCount = 0x800E2CE8; gParticlesAssets = 0x800E2CEC; gParticlesAssetTable = 0x800E2CF0; @@ -2832,11 +2832,11 @@ D_800E2D78 = 0x800E2D78; D_800E2DF8 = 0x800E2DF8; D_800E2E28 = 0x800E2E28; gParticleGravityTable = 0x800E2E2C; -D_800E2E4C = 0x800E2E4C; -D_800E2E50 = 0x800E2E50; -D_800E2E54 = 0x800E2E54; -D_800E2E58 = 0x800E2E58; -D_800E2E5C = 0x800E2E5C; +gMaxTriangleParticles = 0x800E2E4C; +gMaxRectangleParticles = 0x800E2E50; +gMaxPointParticles = 0x800E2E54; +gMaxLineParticles = 0x800E2E58; +gMaxSpriteParticles = 0x800E2E5C; D_800E2E60 = 0x800E2E60; D_800E2E64 = 0x800E2E64; gParticleCoordListTri = 0x800E2E68; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 4454e41a..bf51e179 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -1534,15 +1534,15 @@ render_rain_overlay = 0x800AE21C; func_800AE270 = 0x800AE7D0; func_800AE2A0 = 0x800AE800; func_800AE2D8 = 0x800AE838; -func_800AE374 = 0x800AE8D4; -func_800AE438 = 0x800AE998; -func_800AE490 = 0x800AE9F0; +free_particle_buffers = 0x800AE8D4; +free_particle_vertex_triangles = 0x800AE998; +free_particle_assets = 0x800AE9F0; init_particle_assets = 0x800AEA90; -func_800AE728 = 0x800AEC88; +init_particle_buffers = 0x800AEC88; generate_particle_shape_triangle = 0x800AF374; generate_particle_shape_quad = 0x800AF418; -func_800AEF88 = 0x800AF4E8; -func_800AF024 = 0x800AF584; +generate_particle_shape_line = 0x800AF4E8; +generate_particle_shape_sprite = 0x800AF584; func_800AF0A4 = 0x800AF604; func_800AF0F0 = 0x800AF650; func_800AF134 = 0x800AF694; @@ -2576,24 +2576,24 @@ gRainSplashGfx = 0x800E321C; gRainVertexFlip = 0x800E3220; gWeatherSoundMask = 0x800E3224; gThunderTransition = 0x800E3228; -D_800E2CA0 = 0x800E3230; +gNumTriangleParticles = 0x800E3230; D_800E2CA4 = 0x800E3234; -D_800E2CA8 = 0x800E3238; -D_800E2CAC = 0x800E323C; +gTriangleParticleBuffer = 0x800E3238; +gNumRectangleParticles = 0x800E323C; D_800E2CB0 = 0x800E3240; -D_800E2CB4 = 0x800E3244; -D_800E2CB8 = 0x800E3248; +gRectangleParticleBuffer = 0x800E3244; +gNumPointParticles = 0x800E3248; D_800E2CBC = 0x800E324C; -D_800E2CC0 = 0x800E3250; -D_800E2CC4 = 0x800E3254; +gPointParticleBuffer = 0x800E3250; +gNumLineParticles = 0x800E3254; D_800E2CC8 = 0x800E3258; -D_800E2CCC = 0x800E325C; -D_800E2CD0 = 0x800E3260; +gLineParticleBuffer = 0x800E325C; +gNumSpriteParticles = 0x800E3260; D_800E2CD4 = 0x800E3264; -D_800E2CD8 = 0x800E3268; +gSpriteParticleBuffer = 0x800E3268; D_800E2CDC = 0x800E326C; -D_800E2CE0 = 0x800E3270; -D_800E2CE4 = 0x800E3274; +gParticleVertexBuffer = 0x800E3270; +gParticleTriangleBuffer = 0x800E3274; gParticlesAssetTableCount = 0x800E3278; gParticlesAssets = 0x800E327C; gParticlesAssetTable = 0x800E3280; @@ -2607,11 +2607,11 @@ D_800E2D78 = 0x800E3308; D_800E2DF8 = 0x800E3388; D_800E2E28 = 0x800E33B8; gParticleGravityTable = 0x800E33BC; -D_800E2E4C = 0x800E33DC; -D_800E2E50 = 0x800E33E0; -D_800E2E54 = 0x800E33E4; -D_800E2E58 = 0x800E33E8; -D_800E2E5C = 0x800E33EC; +gMaxTriangleParticles = 0x800E33DC; +gMaxRectangleParticles = 0x800E33E0; +gMaxPointParticles = 0x800E33E4; +gMaxLineParticles = 0x800E33E8; +gMaxSpriteParticles = 0x800E33EC; D_800E2E60 = 0x800E33F0; D_800E2E64 = 0x800E33F4; gParticleCoordListTri = 0x800E33F8;