mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-26 10:34:30 +00:00
134 lines
4.8 KiB
C++
134 lines
4.8 KiB
C++
#include "Library/Screen/ScreenPointerUtil.h"
|
|
|
|
#include "Library/LiveActor/ActorInitInfo.h"
|
|
#include "Library/LiveActor/ActorPoseUtil.h"
|
|
#include "Library/LiveActor/LiveActor.h"
|
|
#include "Library/Screen/ScreenPointDirector.h"
|
|
#include "Library/Screen/ScreenPointKeeper.h"
|
|
#include "Library/Screen/ScreenPointTarget.h"
|
|
#include "Library/Screen/ScreenPointer.h"
|
|
|
|
namespace al {
|
|
|
|
s32 compareScreenPointTarget(const ScreenPointTargetHitInfo* targetHitInfoA,
|
|
const ScreenPointTargetHitInfo* targetHitInfoB) {
|
|
if (targetHitInfoA->directPointDistance - targetHitInfoB->directPointDistance < 0.0f)
|
|
return -1;
|
|
if (targetHitInfoA->directPointDistance - targetHitInfoB->directPointDistance > 0.0f)
|
|
return 1;
|
|
|
|
return targetHitInfoA->screenPointDistance < targetHitInfoB->screenPointDistance ? -1 :
|
|
targetHitInfoA->screenPointDistance > targetHitInfoB->screenPointDistance ? 1 :
|
|
0;
|
|
}
|
|
|
|
// NON_MATCHING: https://decomp.me/scratch/bBeTv
|
|
s32 compareScreenPointTargetPriorDirectPoint(const ScreenPointTargetHitInfo* targetHitInfoA,
|
|
const ScreenPointTargetHitInfo* targetHitInfoB) {
|
|
f32 screenA = targetHitInfoA->screenPointDistance;
|
|
f32 screenB = targetHitInfoB->screenPointDistance;
|
|
|
|
if (screenB <= 0.0f && screenA > 0.0f)
|
|
return -1;
|
|
if (screenB > 0.0f && screenA <= 0.0f)
|
|
return 1;
|
|
|
|
f32 diffDirect = targetHitInfoA->directPointDistance - targetHitInfoB->directPointDistance;
|
|
|
|
if (screenB <= 0.0f && screenA < 0.0f) {
|
|
if (diffDirect < 0.0f)
|
|
return -1;
|
|
if (diffDirect > 0.0f)
|
|
return 1;
|
|
|
|
if (screenA < screenB)
|
|
return -1;
|
|
if (screenB < screenA)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
if (screenA < screenB)
|
|
return -1;
|
|
if (screenB < screenA)
|
|
return 1;
|
|
|
|
if (diffDirect < 0.0f)
|
|
return -1;
|
|
if (diffDirect > 0.0f)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
bool isExistScreenPointTargetKeeper(LiveActor* actor) {
|
|
return actor->getScreenPointKeeper() != nullptr;
|
|
}
|
|
|
|
bool isScreenPointTargetArrayFull(LiveActor* actor) {
|
|
return actor->getScreenPointKeeper()->isTargetArrayFull();
|
|
}
|
|
|
|
bool isExistScreenPointTarget(LiveActor* actor, const char* name) {
|
|
return actor->getScreenPointKeeper()->isExistTarget(name);
|
|
}
|
|
|
|
ScreenPointTarget* addScreenPointTarget(LiveActor* actor, const ActorInitInfo& initInfo,
|
|
const char* targetName, f32 radius, const char* jointName,
|
|
const sead::Vector3f& vb) {
|
|
ScreenPointTarget* target = actor->getScreenPointKeeper()->addTarget(
|
|
actor, initInfo, targetName, radius, getTransPtr(actor), jointName, vb);
|
|
|
|
ScreenPointDirector* director = initInfo.screenPointDirector;
|
|
director->registerTarget(target);
|
|
director->setCheckGroup(target);
|
|
return target;
|
|
}
|
|
|
|
bool hitCheckSegmentScreenPointTarget(ScreenPointer* screenPointer, const sead::Vector3f& posStart,
|
|
const sead::Vector3f& posEnd) {
|
|
return screenPointer->hitCheckSegment(posStart, posEnd);
|
|
}
|
|
|
|
bool hitCheckScreenCircleScreenPointTarget(ScreenPointer* screenPointer, const sead::Vector2f& pos,
|
|
f32 radius, f32 screenRadius) {
|
|
return screenPointer->hitCheckScreenCircle(pos, radius, screenRadius);
|
|
}
|
|
|
|
bool hitCheckLayoutCircleScreenPointTarget(ScreenPointer* screenPointer, const sead::Vector2f& pos,
|
|
f32 radius, f32 layoutRadius,
|
|
s32 (*cmp)(const ScreenPointTargetHitInfo*,
|
|
const ScreenPointTargetHitInfo*)) {
|
|
return screenPointer->hitCheckLayoutCircle(pos, radius, layoutRadius, cmp);
|
|
}
|
|
|
|
bool isHitScreenPointTarget(ScreenPointer* screenPointer, const ScreenPointTarget* target) {
|
|
return screenPointer->isHitTarget(target);
|
|
}
|
|
|
|
bool sendMsgScreenPointTarget(const SensorMsg& message, ScreenPointer* screenPointer,
|
|
ScreenPointTarget* target) {
|
|
return target->getActor()->receiveMsgScreenPoint(&message, screenPointer, target);
|
|
}
|
|
|
|
s32 getHitTargetNum(ScreenPointer* screenPointer) {
|
|
return screenPointer->getHitTargetNum();
|
|
}
|
|
|
|
const sead::Vector3f& getHitTargetPos(ScreenPointer* screenPointer, s32 index) {
|
|
return screenPointer->getHitTarget(index)->getTargetPos();
|
|
}
|
|
|
|
f32 getHitTargetRadius(ScreenPointer* screenPointer, s32 index) {
|
|
return screenPointer->getHitTarget(index)->getTargetRadius();
|
|
}
|
|
|
|
} // namespace al
|
|
|
|
namespace alScreenPointFunction {
|
|
|
|
void updateScreenPointAll(al::LiveActor* actor) {
|
|
actor->getScreenPointKeeper()->update();
|
|
}
|
|
|
|
} // namespace alScreenPointFunction
|