mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-23 09:04:21 +00:00
Library/Collision: Implement ActorCollisionController (#765)
This commit is contained in:
parent
bf8d9d93e8
commit
43bccbee0f
|
|
@ -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
|
||||
|
|
|
|||
59
lib/al/Library/Collision/ActorCollisionController.cpp
Normal file
59
lib/al/Library/Collision/ActorCollisionController.cpp
Normal 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
|
||||
25
lib/al/Library/Collision/ActorCollisionController.h
Normal file
25
lib/al/Library/Collision/ActorCollisionController.h
Normal 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
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue