match: func_80027568 (#674)

* match: func_80027568

* fix: formatting, add Vec3f pointer cast

* refac: make position in object transform union of vec3f and 3 floats
This commit is contained in:
Dominik Peters
2025-07-11 21:19:55 +02:00
committed by GitHub
parent 66f4f02897
commit 64e550d450
7 changed files with 67 additions and 69 deletions
+7 -7
View File
@@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the
All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified.
<!-- README_SCORE_SUMMARY_BEGIN -->
As of July 7, 2025, this is our current score:
As of July 10, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 96.67%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 96.77%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 62.56%
<!-- README_SCORE_SUMMARY_END -->
@@ -117,14 +117,14 @@ s32 is_drumstick_unlocked(void) {
```
<!-- README_SCORE_BEGIN -->
As of July 7, 2025, this is our current score:
As of July 10, 2025, this is our current score:
```
======================================================================
ADVENTURE ONE (ASM -> C Decompilation)
--------------- 96.67% Complete (97.77% NON_MATCHING) ----------------
# Decompiled functions: 1940
# GLOBAL_ASM remaining: 12
# NON_MATCHING functions: 6
--------------- 96.77% Complete (97.77% NON_MATCHING) ----------------
# Decompiled functions: 1941
# GLOBAL_ASM remaining: 11
# NON_MATCHING functions: 5
# NON_EQUIVALENT WIP functions: 6
---------------------------- Game Status -----------------------------
Balloons: 46/47, Keys: 4/4, Trophies: 4/5
+8 -3
View File
@@ -1525,9 +1525,14 @@ typedef struct ObjectTransform {
/* 0x0006 */ s16 spriteID;
};
/* 0x0008 */ f32 scale;
/* 0x000C */ f32 x_position;
/* 0x0010 */ f32 y_position;
/* 0x0014 */ f32 z_position;
union {
/* 0x000C */ Vec3f position;
struct {
/* 0x000C */ f32 x_position;
/* 0x0010 */ f32 y_position;
/* 0x0014 */ f32 z_position;
};
};
} ObjectTransform;
/* Size: 0x0630 bytes */
+1 -1
View File
@@ -8,7 +8,7 @@
enum CollisionModes { COLLISION_MODE_DEFAULT, COLLISION_MODE_1, COLLISION_MODE_NO_WALLS };
void generate_collision_candidates(s32 numPoints, Vec3f *origins, Vec3f *targets, s32 vehicleID);
s32 generate_collision_candidates(s32 numPoints, Vec3f *origins, Vec3f *targets, s32 vehicleID);
s32 compute_grid_overlap_mask(LevelModelSegmentBoundingBox *bbox, s32 x1, s32 z1, s32 x2, s32 z2);
s32 resolve_collisions(Vec3f *origin, Vec3f *target, f32 *radius, s8 *surface, s32 numEntries, s32 *numCollisions);
+30 -33
View File
@@ -442,9 +442,9 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) {
dir.z = obj->trans.z_position + (obj->z_velocity * updateRateF);
radius = 9.0f;
generate_collision_candidates(1, (Vec3f *) &obj->trans.x_position, &dir, -1);
generate_collision_candidates(1, &obj->trans.position, &dir, -1);
hasCollision = FALSE;
resolve_collisions((Vec3f *) &obj->trans.x_position, &dir, &radius, &surface, 1, &hasCollision);
resolve_collisions(&obj->trans.position, &dir, &radius, &surface, 1, &hasCollision);
if (hasCollision) {
obj->x_velocity = (dir.x - obj->trans.x_position) / updateRateF;
obj->y_velocity = (dir.y - obj->trans.y_position) / updateRateF;
@@ -709,7 +709,7 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) {
Object_CollectEgg *egg;
Object *racerObj;
Object_Racer *racer;
f32 targetPos[3];
Vec3f targetPos;
f32 radius;
f32 updateRateF;
s32 hasCollision;
@@ -726,21 +726,20 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) {
break;
case EGG_MOVING:
obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE;
targetPos[0] = obj->trans.x_position + (obj->x_velocity * updateRateF);
targetPos[1] = obj->trans.y_position + (obj->y_velocity * updateRateF);
targetPos[2] = obj->trans.z_position + (obj->z_velocity * updateRateF);
targetPos.f[0] = obj->trans.x_position + (obj->x_velocity * updateRateF);
targetPos.f[1] = obj->trans.y_position + (obj->y_velocity * updateRateF);
targetPos.f[2] = obj->trans.z_position + (obj->z_velocity * updateRateF);
radius = 9.0f;
generate_collision_candidates(1, (Vec3f *) &obj->trans.x_position, (Vec3f *) targetPos, -1);
generate_collision_candidates(1, &obj->trans.position, &targetPos, -1);
hasCollision = FALSE;
surface = SURFACE_DEFAULT;
resolve_collisions((Vec3f *) &obj->trans.x_position, (Vec3f *) targetPos, &radius, &surface, 1,
&hasCollision);
obj->x_velocity = (targetPos[0] - obj->trans.x_position) / updateRateF;
obj->y_velocity = (targetPos[1] - obj->trans.y_position) / updateRateF;
obj->z_velocity = (targetPos[2] - obj->trans.z_position) / updateRateF;
obj->trans.x_position = targetPos[0];
obj->trans.y_position = targetPos[1];
obj->trans.z_position = targetPos[2];
resolve_collisions(&obj->trans.position, &targetPos, &radius, &surface, 1, &hasCollision);
obj->x_velocity = (targetPos.f[0] - obj->trans.x_position) / updateRateF;
obj->y_velocity = (targetPos.f[1] - obj->trans.y_position) / updateRateF;
obj->z_velocity = (targetPos.f[2] - obj->trans.z_position) / updateRateF;
obj->trans.x_position = targetPos.f[0];
obj->trans.y_position = targetPos.f[1];
obj->trans.z_position = targetPos.f[2];
obj->y_velocity -= 0.5;
obj->x_velocity *= 0.98;
obj->z_velocity *= 0.98;
@@ -4307,7 +4306,7 @@ void obj_init_banana(Object *obj, UNUSED LevelObjectEntry_Banana *entry) {
void obj_loop_banana(Object *obj, s32 updateRate) {
Object *racerObj;
Object_Racer *racer;
f32 targetPos[3];
Vec3f targetPos;
f32 radius;
f32 updateRateF;
f32 velX;
@@ -4342,20 +4341,19 @@ void obj_loop_banana(Object *obj, s32 updateRate) {
banana->unk0 = 0;
}
if (properties->status == BANANA_DROPPED) {
targetPos[0] = obj->trans.x_position + (obj->x_velocity * updateRateF);
targetPos[1] = obj->trans.y_position + (obj->y_velocity * updateRateF);
targetPos[2] = obj->trans.z_position + (obj->z_velocity * updateRateF);
targetPos.f[0] = obj->trans.x_position + (obj->x_velocity * updateRateF);
targetPos.f[1] = obj->trans.y_position + (obj->y_velocity * updateRateF);
targetPos.f[2] = obj->trans.z_position + (obj->z_velocity * updateRateF);
radius = 8.0f;
generate_collision_candidates(1, (Vec3f *) &obj->trans.x_position, (Vec3f *) targetPos, -1);
generate_collision_candidates(1, &obj->trans.position, &targetPos, -1);
hasCollision = 0;
resolve_collisions((Vec3f *) &obj->trans.x_position, (Vec3f *) targetPos, &radius, &surface, 1,
&hasCollision);
obj->x_velocity = (targetPos[0] - obj->trans.x_position) / updateRateF;
obj->y_velocity = (targetPos[1] - obj->trans.y_position) / updateRateF;
obj->z_velocity = (targetPos[2] - obj->trans.z_position) / updateRateF;
obj->trans.x_position = targetPos[0];
obj->trans.y_position = targetPos[1];
obj->trans.z_position = targetPos[2];
resolve_collisions(&obj->trans.position, &targetPos, &radius, &surface, 1, &hasCollision);
obj->x_velocity = (targetPos.f[0] - obj->trans.x_position) / updateRateF;
obj->y_velocity = (targetPos.f[1] - obj->trans.y_position) / updateRateF;
obj->z_velocity = (targetPos.f[2] - obj->trans.z_position) / updateRateF;
obj->trans.x_position = targetPos.f[0];
obj->trans.y_position = targetPos.f[1];
obj->trans.z_position = targetPos.f[2];
// Bananas dropped by planes will not have gravity.
if (banana->droppedVehicleID != VEHICLE_PLANE) {
obj->y_velocity -= 1.0; //!@Delta
@@ -4853,10 +4851,10 @@ void weapon_projectile(Object *obj, s32 updateRate) {
offset.z = obj->trans.z_position + (obj->z_velocity * updateRateF);
if (weapon->weaponID != WEAPON_MAGNET_LEVEL_3) {
radius = 16.0f;
generate_collision_candidates(1, (Vec3f *) &obj->trans.x_position, &offset, -1);
generate_collision_candidates(1, &obj->trans.position, &offset, -1);
hasCollision = FALSE;
surface = SURFACE_NONE;
resolve_collisions((Vec3f *) &obj->trans.x_position, &offset, &radius, &surface, 1, &hasCollision);
resolve_collisions(&obj->trans.position, &offset, &radius, &surface, 1, &hasCollision);
if (hasCollision > 0) {
if (get_collision_normal(&diffX, &diffY, &diffZ)) {
obj->properties.projectile.timer = 0;
@@ -5157,11 +5155,10 @@ void weapon_trap(Object *weaponObj, s32 updateRate) {
intendedPos.y = weaponObj->trans.y_position + (weaponObj->y_velocity * updateRateF);
intendedPos.z = weaponObj->trans.z_position + (weaponObj->z_velocity * updateRateF);
radius = 9.0f;
generate_collision_candidates(1, (Vec3f *) &weaponObj->trans.x_position, (Vec3f *) &intendedPos.x, -1);
generate_collision_candidates(1, &weaponObj->trans.position, &intendedPos, -1);
hasCollision = FALSE;
surface = SURFACE_NONE;
resolve_collisions((Vec3f *) &weaponObj->trans.x_position, (Vec3f *) &intendedPos, &radius, &surface, 1,
&hasCollision);
resolve_collisions(&weaponObj->trans.position, &intendedPos, &radius, &surface, 1, &hasCollision);
weaponObj->x_velocity = (intendedPos.x - weaponObj->trans.x_position) / updateRateF;
weaponObj->y_velocity = (intendedPos.y - weaponObj->trans.y_position) / updateRateF;
weaponObj->z_velocity = (intendedPos.z - weaponObj->trans.z_position) / updateRateF;
+1 -1
View File
@@ -3973,7 +3973,7 @@ void render_bubble_trap(ObjectTransform *trans, Sprite *gfxData, Object *obj, s3
Camera *cameraSegment;
f32 dist;
vec3f_rotate(&trans->rotation, (Vec3f *) &obj->trans.x_position);
vec3f_rotate(&trans->rotation, &obj->trans.position);
obj->trans.x_position += trans->x_position;
obj->trans.y_position += trans->y_position;
obj->trans.z_position += trans->z_position;
+2 -2
View File
@@ -1190,7 +1190,7 @@ void setup_particle_position(Particle *particle, Object *obj, ParticleEmitter *e
particle->trans.y_position = particle->localPos.y;
particle->trans.z_position = particle->localPos.z;
if (particle->movementType == PARTICLE_MOVEMENT_BASIC_PARENT) {
vec3f_rotate(&obj->trans.rotation, (Vec3f *) &particle->trans.x_position);
vec3f_rotate(&obj->trans.rotation, &particle->trans.position);
}
particle->trans.x_position += obj->trans.x_position;
@@ -2283,7 +2283,7 @@ void move_particle_attached_to_parent(Particle *particle) {
particle->trans.x_position = 0.0f;
particle->trans.y_position = -particle->downOffset;
particle->trans.z_position = 0.0f;
vec3f_rotate(&particle->trans.rotation, (Vec3f *) &particle->trans.x_position);
vec3f_rotate(&particle->trans.rotation, &particle->trans.position);
particle->trans.x_position += particle->localPos.x;
particle->trans.y_position += particle->localPos.y;
particle->trans.z_position += particle->localPos.z;
+18 -22
View File
@@ -1075,8 +1075,6 @@ s32 void_generate_primitive(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) {
return NULL;
}
// https://decomp.me/scratch/7GUjD
#ifdef NON_MATCHING
s32 func_80027568(void) {
LevelModelSegment *segment; // spE4
s32 ret;
@@ -1099,8 +1097,7 @@ s32 func_80027568(void) {
f32 A, B, C, D;
Object **racerObjects; // sp80
Object *racerObj; // sp7C
s32 index;
u16 index2;
f32 *planes;
racerObjects = get_racer_objects(&numRacers);
if (numRacers == 0) {
@@ -1122,20 +1119,21 @@ s32 func_80027568(void) {
if (racerObj == NULL) {
return FALSE;
}
generate_collision_candidates(1, (Vec3f *) &racerObj->trans.x_position,
(Vec3f *) &gSceneActiveCamera->trans.x_position, -1);
generate_collision_candidates(1, &racerObj->trans.position, &gSceneActiveCamera->trans.position, -1);
ret = FALSE;
for (var_t4 = 0; var_t4 < gNumCollisionCandidates && ret == FALSE; var_t4++) {
if (gCollisionCandidates[var_t4] > 0) {
flipSide = gCollisionCandidates[var_t4];
if (flipSide > 0) {
// this is segment Entry
segment = (LevelModelSegment *) (gCollisionCandidates[var_t4] | 0x80000000);
segment = (LevelModelSegment *) PHYS_TO_K0(flipSide);
} else {
colNode = (CollisionNode *) gCollisionCandidates[var_t4];
index = colNode->colPlaneIndex << 2;
A = segment->collisionPlanes[index + 0];
B = segment->collisionPlanes[index + 1];
C = segment->collisionPlanes[index + 2];
D = segment->collisionPlanes[index + 3];
colNode = (CollisionNode *) flipSide;
curViewport = colNode->colPlaneIndex << 2;
planes = &segment->collisionPlanes[curViewport];
A = planes[0];
B = planes[1];
C = planes[2];
D = planes[3];
camDist = A * gSceneActiveCamera->trans.x_position + B * gSceneActiveCamera->trans.y_position +
C * gSceneActiveCamera->trans.z_position + D - 14.0;
@@ -1164,11 +1162,12 @@ s32 func_80027568(void) {
curViewport &= 0x7FFF;
flipSide = TRUE;
}
curViewport = 4 * curViewport;
A1 = segment->collisionPlanes[curViewport + 0];
B1 = segment->collisionPlanes[curViewport + 1];
C1 = segment->collisionPlanes[curViewport + 2];
D1 = segment->collisionPlanes[curViewport + 3];
curViewport = curViewport << 2;
planes = &segment->collisionPlanes[curViewport];
A1 = planes[0];
B1 = planes[1];
C1 = planes[2];
D1 = planes[3];
var_f18 = A1 * var_f20 + B1 * var_f22 + C1 * var_f24 + D1;
if (flipSide) {
var_f18 = -var_f18;
@@ -1183,9 +1182,6 @@ s32 func_80027568(void) {
}
return ret;
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_80027568.s")
#endif
/**
* Sets up the camera placement for the 4th viewport when using T.T Cam in 3 player.