OdysseyDecomp/lib/al/Project/Collision/ActorCollisionController.cpp

60 lines
1.4 KiB
C++

#include "Project/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