Library/Collision: Implement ActorCollisionController (#765)

This commit is contained in:
Narr the Reg 2025-10-25 04:51:24 -06:00 committed by GitHub
parent bf8d9d93e8
commit 43bccbee0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 99 additions and 9 deletions

View file

@ -291378,27 +291378,27 @@ Project/Collision/ActorCollisionController.o:
label:
- _ZN2al24ActorCollisionControllerC1EPNS_9LiveActorE
- _ZN2al24ActorCollisionControllerC2EPNS_9LiveActorE
status: NotDecompiled
status: Matching
- offset: 0xa4d534
size: 16
label: _ZN2al24ActorCollisionController17setColliderRadiusEf
status: NotDecompiled
status: Matching
- offset: 0xa4d544
size: 80
label: _ZN2al24ActorCollisionController22setColliderRadiusScaleEf
status: NotDecompiled
status: Matching
- offset: 0xa4d594
size: 16
label: _ZN2al24ActorCollisionController18setColliderOffsetYEf
status: NotDecompiled
status: Matching
- offset: 0xa4d5a4
size: 180
label: _ZN2al24ActorCollisionController6updateEv
status: NotDecompiled
status: Matching
- offset: 0xa4d658
size: 68
label: _ZN2al24ActorCollisionController13resetToOriginEi
status: NotDecompiled
status: Matching
Project/Controller/JoyPadAccelerometerAddon.o:
'.text':
- offset: 0xa4d69c

View file

@ -0,0 +1,59 @@
#include "Library/Collision/ActorCollisionController.h"
#include "Library/LiveActor/ActorCollisionFunction.h"
namespace al {
ActorCollisionController::ActorCollisionController(LiveActor* actor) : mActor(actor) {
mRadius = getColliderRadius(mActor);
mOffsetY = getColliderOffsetY(mActor);
}
void ActorCollisionController::setColliderRadius(f32 radius) {
mDelay = -1;
al::setColliderRadius(mActor, radius);
}
void ActorCollisionController::setColliderRadiusScale(f32 scale) {
setColliderRadius(mRadius * scale);
setColliderOffsetY(mOffsetY * scale);
}
void ActorCollisionController::setColliderOffsetY(f32 offsetY) {
mDelay = -1;
al::setColliderOffsetY(mActor, offsetY);
}
void ActorCollisionController::update() {
if (mDelay <= 0)
return;
if (mDelay == 1) {
resetToOrigin(mDelay);
return;
}
f32 radius = getColliderRadius(mActor);
f32 offsetY = getColliderOffsetY(mActor);
f32 rate = 1.0f / mDelay;
radius += (mRadius - radius) * rate;
offsetY += (mOffsetY - offsetY) * rate;
al::setColliderRadius(mActor, radius);
al::setColliderOffsetY(mActor, offsetY);
mDelay--;
}
void ActorCollisionController::resetToOrigin(s32 delay) {
if (delay >= 2) {
mDelay = delay;
return;
}
al::setColliderRadius(mActor, mRadius);
al::setColliderOffsetY(mActor, mOffsetY);
mDelay = 0;
}
} // namespace al

View file

@ -0,0 +1,25 @@
#pragma once
#include <basis/seadTypes.h>
namespace al {
class LiveActor;
class ActorCollisionController {
public:
ActorCollisionController(LiveActor* actor);
void setColliderRadius(f32 radius);
void setColliderRadiusScale(f32 scale);
void setColliderOffsetY(f32 offsetY);
void update();
void resetToOrigin(s32 delay);
private:
LiveActor* mActor;
f32 mRadius;
f32 mOffsetY;
s32 mDelay = 0;
};
static_assert(sizeof(ActorCollisionController) == 0x18);
} // namespace al

View file

@ -75,11 +75,17 @@ def common_no_namespace_qualifiers(c, path):
del nest_level[-1]
continue
matches = re.findall(r"([^\(,\s]+::)+[^\(,\s]+", x)
matches = re.findall(r"([^\(,\s]+::)+([^\(,\s]+)", x)
for match in matches:
match = match[0:-2]
namespace = match[0][0:-2]
if "setColliderRadius" in match[1]:
continue;
if "setColliderOffsetY" in match[1]:
continue;
# examples: "sead", "al", "nn::g3d"
if CHECK(lambda a: match not in allowed_namespaces, line, match + " should be omitted here!",
if CHECK(lambda a: namespace not in allowed_namespaces, line, namespace[0] + " should be omitted here!",
path): return
if len(nest_level) != 0: