Library/Collision: Implement PartsConnectorUtil (#722)

This commit is contained in:
Narr the Reg 2025-09-16 04:22:24 -06:00 committed by GitHub
parent f2b32f130c
commit 4f6bf2e236
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 645 additions and 86 deletions

View file

@ -232456,187 +232456,187 @@ Library/Collision/PartsConnectorUtil.o:
- offset: 0x857b34
size: 88
label: _ZN2al18createMtxConnectorEPKNS_9LiveActorE
status: NotDecompiled
status: Matching
- offset: 0x857b8c
size: 80
label: _ZN2al18createMtxConnectorEPKNS_9LiveActorERKN4sead4QuatIfEE
status: NotDecompiled
status: Matching
- offset: 0x857bdc
size: 124
label: _ZN2al21tryCreateMtxConnectorEPKNS_9LiveActorERKNS_13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x857c58
size: 116
label: _ZN2al21tryCreateMtxConnectorEPKNS_9LiveActorERKNS_13ActorInitInfoERKN4sead4QuatIfEE
status: NotDecompiled
status: Matching
- offset: 0x857ccc
size: 84
label: _ZN2al29createCollisionPartsConnectorEPKNS_9LiveActorERKN4sead4QuatIfEE
status: NotDecompiled
status: Matching
- offset: 0x857d20
size: 132
label: _ZN2al32tryCreateCollisionPartsConnectorEPKNS_9LiveActorERKNS_13ActorInitInfoE
status: NotDecompiled
status: Matching
- offset: 0x857da4
size: 120
label: _ZN2al32tryCreateCollisionPartsConnectorEPKNS_9LiveActorERKNS_13ActorInitInfoERKN4sead4QuatIfEE
status: NotDecompiled
status: Matching
- offset: 0x857e1c
size: 12
label: _ZN2al24isMtxConnectorConnectingEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x857e28
size: 12
label: _ZN2al22disconnectMtxConnectorEPNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x857e34
size: 120
label: _ZN2al29attachMtxConnectorToCollisionEPNS_12MtxConnectorEPKNS_9LiveActorERKN4sead7Vector3IfEES9_
status: NotDecompiled
status: Matching
- offset: 0x857eac
size: 36
label: _ZN2al29attachMtxConnectorToCollisionEPNS_12MtxConnectorEPKNS_9LiveActorEb
status: NotDecompiled
status: Matching
- offset: 0x857ed0
size: 244
label: _ZN2al29attachMtxConnectorToCollisionEPNS_12MtxConnectorEPKNS_9LiveActorEff
status: NotDecompiled
status: Matching
- offset: 0x857fc4
size: 16
label: _ZN2al34attachMtxConnectorToCollisionPartsEPNS_12MtxConnectorEPKNS_14CollisionPartsE
status: NotDecompiled
status: Matching
- offset: 0x857fd4
size: 24
label: _ZN2al25setConnectorBaseQuatTransERKN4sead4QuatIfEERKNS0_7Vector3IfEEPNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x857fec
size: 68
label: _ZN2al25setConnectorBaseQuatTransEPNS_9LiveActorEPNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x858030
size: 72
label: _ZN2al13connectPoseQTEPNS_9LiveActorEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x858078
size: 92
label: _ZN2al13connectPoseQTEPNS_9LiveActorEPKNS_12MtxConnectorERKN4sead4QuatIfEERKNS5_7Vector3IfEE
status: NotDecompiled
status: Matching
- offset: 0x8580d4
size: 48
label: _ZN2al16connectPoseTransEPNS_9LiveActorEPKNS_12MtxConnectorERKN4sead7Vector3IfEE
status: NotDecompiled
status: Matching
- offset: 0x858104
size: 72
label: _ZN2al14connectPoseMtxEPNS_9LiveActorEPKNS_12MtxConnectorERKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x85814c
size: 16
label: _ZN2al16calcConnectTransEPN4sead7Vector3IfEEPKNS_12MtxConnectorERKS2_
status: NotDecompiled
status: Matching
- offset: 0x85815c
size: 52
label: _ZN2al16calcConnectTransEPN4sead7Vector3IfEEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x858190
size: 44
label: _ZN2al14calcConnectDirEPN4sead7Vector3IfEEPKNS_12MtxConnectorERKS2_
status: NotDecompiled
status: Matching
- offset: 0x8581bc
size: 24
label: _ZN2al13calcConnectQTEPN4sead4QuatIfEEPNS0_7Vector3IfEEPKNS_12MtxConnectorERKS2_RKS5_
status: NotDecompiled
status: Matching
- offset: 0x8581d4
size: 28
label: _ZN2al13calcConnectQTEPN4sead4QuatIfEEPNS0_7Vector3IfEEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x8581f0
size: 16
label: _ZN2al14calcConnectMtxEPN4sead8Matrix34IfEEPKNS_12MtxConnectorERKS2_
status: NotDecompiled
status: Matching
- offset: 0x858200
size: 208
label: _ZN2al14calcConnectMtxEPN4sead8Matrix34IfEEPKNS_12MtxConnectorERKNS0_4QuatIfEERKNS0_7Vector3IfEE
status: NotDecompiled
status: Matching
- offset: 0x8582d0
size: 636
label: _ZN2al31attachMtxConnectorToCollisionRTEPNS_12MtxConnectorEPKNS_9LiveActorEbb
status: NotDecompiled
status: Matching
- offset: 0x85854c
size: 560
label: _ZN2al31attachMtxConnectorToCollisionQTEPNS_12MtxConnectorEPKNS_9LiveActorEbb
status: NotDecompiled
status: Matching
- offset: 0x85877c
size: 56
label: _ZN2al25attachMtxConnectorToJointEPNS_12MtxConnectorEPKNS_9LiveActorEPKc
status: NotDecompiled
status: Matching
- offset: 0x8587b4
size: 312
label: _ZN2al25attachMtxConnectorToJointEPNS_12MtxConnectorEPKNS_9LiveActorEPKcRKN4sead7Vector3IfEESB_
status: NotDecompiled
status: Matching
- offset: 0x8588ec
size: 296
label: _ZN2al26attachMtxConnectorToMtxPtrEPNS_12MtxConnectorEPKN4sead8Matrix34IfEERKNS2_7Vector3IfEESA_
status: NotDecompiled
status: Matching
- offset: 0x858a14
size: 60
label: _ZN2al25attachMtxConnectorToActorEPNS_12MtxConnectorEPKNS_9LiveActorE
status: NotDecompiled
status: Matching
- offset: 0x858a50
size: 316
label: _ZN2al25attachMtxConnectorToActorEPNS_12MtxConnectorEPKNS_9LiveActorERKN4sead7Vector3IfEES9_
status: NotDecompiled
status: Matching
- offset: 0x858b8c
size: 12
label: _ZN2al26attachMtxConnectorToMtxPtrEPNS_12MtxConnectorEPKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x858b98
size: 228
label: _ZN2al26attachMtxConnectorToSensorEPNS_12MtxConnectorEPNS_9HitSensorERKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x858c7c
size: 232
label: _ZN2al29attachSensorConnectorToSensorEPNS_15SensorConnectorEPNS_9HitSensorERKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x858d64
size: 228
label: _ZN2al37attachMtxConnectorToScreenPointTargetEPNS_12MtxConnectorEPNS_17ScreenPointTargetERKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x858e48
size: 20
label: _ZN2al29attachCollisionPartsConnectorEPNS_23CollisionPartsConnectorEPKNS_14CollisionPartsE
status: NotDecompiled
status: Matching
- offset: 0x858e5c
size: 244
label: _ZN2al37attachCollisionPartsConnectorToGroundEPNS_23CollisionPartsConnectorEPKNS_9LiveActorE
status: NotDecompiled
status: Matching
- offset: 0x858f50
size: 140
label: _ZN2al19attachToHitTriangleEPNS_23CollisionPartsConnectorERKNS_8TriangleERKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x858fdc
size: 140
label: _ZN2al15attachToHitInfoEPNS_23CollisionPartsConnectorERKNS_7HitInfoERKN4sead8Matrix34IfEE
status: NotDecompiled
status: Matching
- offset: 0x859068
size: 212
label: _ZN2al26attachToHitInfoNrmToMinusZEPNS_23CollisionPartsConnectorERKNS_7HitInfoE
status: NotDecompiled
status: Matching
- offset: 0x85913c
size: 4
label: _ZN2al15calcConnectInfoEPKNS_12MtxConnectorEPN4sead7Vector3IfEEPNS3_4QuatIfEES6_RKS5_SB_
status: NotDecompiled
status: Matching
- offset: 0x859140
size: 116
label: _ZN2al29connectPoseQTUsingConnectInfoEPNS_9LiveActorEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x8591b4
size: 20
label: _ZN2al18getConnectBaseQuatEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
- offset: 0x8591c8
size: 20
label: _ZN2al19getConnectBaseTransEPKNS_12MtxConnectorE
status: NotDecompiled
status: Matching
Library/Collision/PartsMtxConnector.o:
'.text':
- offset: 0x8591dc

View file

@ -1,36 +1,110 @@
#pragma once
#include <container/seadPtrArray.h>
#include <math/seadVector.h>
#include <prim/seadDelegate.h>
namespace al {
struct ArrowHitInfo;
class CollisionPartsFilterBase;
class CollisionParts;
class CollisionCheckInfoBase;
struct DiskHitInfo;
struct HitInfo;
class HitSensor;
class ICollisionPartsKeeper;
class IUseCollision;
class LiveActor;
struct SphereHitInfo;
class Triangle;
class TriangleFilterBase;
struct HitInfo;
struct ArrowHitInfo;
bool isFloorCode(const Triangle&, const char*);
} // namespace al
namespace alCollisionUtil {
bool getFirstPolyOnArrow(const al::IUseCollision*, sead::Vector3f*, al::Triangle*,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
bool getHitPosAndNormalOnArrow(const al::IUseCollision*, sead::Vector3f*, sead::Vector3f*,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
bool getHitPosOnArrow(const al::IUseCollision*, sead::Vector3f*, const sead::Vector3f&,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
class SphereMoveHitInfo;
al::ICollisionPartsKeeper* getCollisionPartsKeeper(const al::IUseCollision*);
bool isCollisionMoving(const al::HitInfo*);
const sead::Vector3f& getCollisionHitPos(const al::HitInfo*);
const sead::Vector3f& getCollisionHitNormal(const al::HitInfo*);
const sead::Vector3f& getCollisionMovingReaction(const al::HitInfo*);
al::HitSensor* getCollisionHitSensor(const al::HitInfo*);
al::CollisionParts* getCollisionHitParts(const al::HitInfo*);
al::LiveActor* getCollisionHitActor(const al::HitInfo*);
s32 checkStrikeSphere(const al::IUseCollision*, const sead::Vector3f&, f32,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
s32 checkStrikeSphereMovingReaction(const al::IUseCollision*, const sead::Vector3f&, f32,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
s32 checkStrikeDisk(const al::IUseCollision*, const sead::Vector3f&, f32, f32,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
s32 checkStrikeArrow(const al::IUseCollision*, const sead::Vector3f& origin,
const sead::Vector3f& delta, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
s32 checkStrikeSphereForPlayer(const al::IUseCollision*, const sead::Vector3f&, f32,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
const sead::Vector3f& getCollisionHitPos(const al::HitInfo*);
const sead::Vector3f& getCollisionHitNormal(const al::HitInfo*);
bool getFirstPolyOnArrow(const al::IUseCollision*, const al::ArrowHitInfo**, const sead::Vector3f&,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
const al::ArrowHitInfo& getStrikeArrowInfo(const al::IUseCollision*, u32);
bool getFirstPolyOnArrow(const al::IUseCollision*, sead::Vector3f*, al::Triangle*,
const sead::Vector3f&, const sead::Vector3f&, const char*);
bool getFirstPolyOnArrow(const al::IUseCollision*, sead::Vector3f*, al::Triangle*,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
bool getHitPosOnArrow(const al::IUseCollision*, sead::Vector3f*, const sead::Vector3f&,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
bool getHitPosAndNormalOnArrow(const al::IUseCollision*, sead::Vector3f*, sead::Vector3f*,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
bool getHitPosAndNormalAndSensorOnArrow(const al::IUseCollision*, sead::Vector3f*, sead::Vector3f*,
al::HitSensor**, const sead::Vector3f&,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
bool getFirstCollisionSensorOnArrow(const al::IUseCollision*, sead::Vector3f*, al::HitSensor**,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
bool getLastCollisionSensorOnArrow(const al::IUseCollision*, sead::Vector3f*, al::HitSensor**,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
bool getLastPolyOnArrow(const al::IUseCollision*, sead::Vector3f*, al::Triangle*,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*, const al::TriangleFilterBase*);
bool getLastPolyOnArrow(const al::IUseCollision*, const al::ArrowHitInfo**, const sead::Vector3f&,
const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
al::CollisionParts* getStrikeArrowCollisionParts(const al::IUseCollision*, sead::Vector3f*,
const sead::Vector3f&, const sead::Vector3f&,
const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
al::HitSensor* tryGetStrikeArrowCollisionSensor(const al::IUseCollision*, const sead::Vector3f&,
const sead::Vector3f&,
const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
s32 getStrikeArrowInfoNum(const al::IUseCollision*);
const al::SphereHitInfo& getStrikeSphereInfo(const al::IUseCollision*, u32);
s32 getStrikeSphereInfoNum(const al::IUseCollision*);
const sead::Vector3f& getStrikeSphereHitPos(const al::IUseCollision*, u32);
const al::DiskHitInfo& getStrikeDiskInfo(const al::IUseCollision*, u32);
s32 getStrikeDiskInfoNum(const al::IUseCollision*);
const sead::Vector3f& getStrikeDiskHitPos(const al::IUseCollision*, u32);
bool isInvalidParts(const al::CollisionParts&, const al::CollisionCheckInfoBase&);
bool isFarAway(const al::CollisionParts&, const sead::Vector3f&, f32);
s32 checkStrikeSphereMove(const al::IUseCollision*, SphereMoveHitInfo*, s32, const sead::Vector3f&,
f32, const sead::Vector3f&, const al::CollisionPartsFilterBase*,
const al::TriangleFilterBase*);
void searchCollisionParts(const al::IUseCollision*, const sead::Vector3f&, f32,
sead::IDelegate1<al::CollisionParts*>&,
const al::CollisionPartsFilterBase*);
void validateCollisionPartsPtrArray(const al::IUseCollision*, sead::PtrArray<al::CollisionParts>*);
void invalidateCollisionPartsPtrArray(const al::IUseCollision*);
sead::PtrArray<al::CollisionParts>* getCollisionPartsPtrArray(const al::IUseCollision*);
} // namespace alCollisionUtil

View file

@ -49,6 +49,8 @@ public:
const sead::Matrix34f& getBaseInvMtx() const;
const sead::Matrix34f& getPrevBaseMtx() const;
const CollisionParts* getCollisionParts() const { return mCollisionParts; }
// clang-format off
friend bool ::operator==(const Triangle& lhs, const Triangle& rhs);
friend bool ::operator!=(const Triangle& lhs, const Triangle& rhs);

View file

@ -198,12 +198,12 @@ public:
class CollisionPartsFilterActor : public CollisionPartsFilterBase {
public:
CollisionPartsFilterActor(LiveActor* actor) : mActor(actor) {}
CollisionPartsFilterActor(const LiveActor* actor) : mActor(actor) {}
bool isInvalidParts(CollisionParts* collisionParts) override;
private:
LiveActor* mActor;
const LiveActor* mActor;
bool mIsCompareEqual = true;
};

View file

@ -0,0 +1,378 @@
#include "Library/Collision/PartsConnectorUtil.h"
#include "Library/Collision/CollisionParts.h"
#include "Library/Collision/CollisionPartsKeeperUtil.h"
#include "Library/Collision/CollisionPartsTriangle.h"
#include "Library/Collision/KCollisionServer.h"
#include "Library/Collision/PartsConnector.h"
#include "Library/Collision/PartsMtxConnector.h"
#include "Library/Collision/SensorConnector.h"
#include "Library/LiveActor/ActorModelFunction.h"
#include "Library/LiveActor/ActorPoseUtil.h"
#include "Library/LiveActor/LiveActor.h"
#include "Library/Math/MathUtil.h"
#include "Library/Matrix/MatrixUtil.h"
#include "Library/Placement/PlacementFunction.h"
#include "Library/Screen/ScreenPointTarget.h"
#include "Project/HitSensor/HitSensor.h"
namespace al {
inline bool IsConnectToCollision(const ActorInitInfo& initInfo) {
bool isConnectToCollision = false;
if (!al::tryGetArg(&isConnectToCollision, initInfo, "IsConnectToCollision"))
return false;
return isConnectToCollision;
}
MtxConnector* createMtxConnector(const LiveActor* actor) {
return new MtxConnector(getQuat(actor), getTrans(actor));
}
MtxConnector* createMtxConnector(const LiveActor* actor, const sead::Quatf& quat) {
return new MtxConnector(quat, getTrans(actor));
}
MtxConnector* tryCreateMtxConnector(const LiveActor* actor, const ActorInitInfo& initInfo) {
return IsConnectToCollision(initInfo) ? createMtxConnector(actor) : nullptr;
}
MtxConnector* tryCreateMtxConnector(const LiveActor* actor, const ActorInitInfo& initInfo,
const sead::Quatf& quat) {
return IsConnectToCollision(initInfo) ? createMtxConnector(actor, quat) : nullptr;
}
CollisionPartsConnector* createCollisionPartsConnector(const LiveActor* actor,
const sead::Quatf& quat) {
CollisionPartsConnector* connector = new CollisionPartsConnector();
connector->setBaseQuatTrans(quat, getTrans(actor));
return connector;
}
CollisionPartsConnector* tryCreateCollisionPartsConnector(const LiveActor* actor,
const ActorInitInfo& initInfo) {
return tryCreateCollisionPartsConnector(actor, initInfo, getQuat(actor));
}
CollisionPartsConnector* tryCreateCollisionPartsConnector(const LiveActor* actor,
const ActorInitInfo& initInfo,
const sead::Quatf& quat) {
return IsConnectToCollision(initInfo) ? createCollisionPartsConnector(actor, quat) : nullptr;
}
bool isMtxConnectorConnecting(const MtxConnector* connector) {
return connector->isConnecting();
}
void disconnectMtxConnector(MtxConnector* connector) {
return connector->clear();
}
CollisionParts* attachMtxConnectorToCollision(MtxConnector* connector, const LiveActor* actor,
const sead::Vector3f& pos,
const sead::Vector3f& dir) {
CollisionPartsFilterActor partsFilter = CollisionPartsFilterActor(actor);
CollisionParts* parts = alCollisionUtil::getStrikeArrowCollisionParts(actor, nullptr, pos, dir,
&partsFilter, nullptr);
if (!parts)
return nullptr;
attachMtxConnectorToCollisionParts(connector, parts);
return parts;
}
CollisionParts* attachMtxConnectorToCollision(MtxConnector* connector, const LiveActor* actor,
bool isAttachToGround) {
return attachMtxConnectorToCollision(connector, actor, 50.0f,
isAttachToGround ? -150.0f : 150.0f);
}
CollisionParts* attachMtxConnectorToCollision(MtxConnector* connector, const LiveActor* actor,
f32 checkOffUp, f32 checkDistance) {
sead::Vector3f upDir;
calcUpDir(&upDir, actor);
sead::Vector3f dir = upDir * -checkDistance;
sead::Vector3f pos = getTrans(actor) + upDir * checkOffUp;
return attachMtxConnectorToCollision(connector, actor, pos, dir);
}
void attachMtxConnectorToCollisionParts(MtxConnector* connector, const CollisionParts* parts) {
connector->init(&parts->getBaseMtx(), parts->getBaseInvMtx());
}
void setConnectorBaseQuatTrans(const sead::Quatf& quat, const sead::Vector3f& trans,
MtxConnector* connector) {
connector->setBaseQuatTrans(quat, trans);
}
void setConnectorBaseQuatTrans(LiveActor* actor, MtxConnector* connector) {
connector->setBaseQuatTrans(getQuat(actor), getTrans(actor));
}
void connectPoseQT(LiveActor* actor, const MtxConnector* connector) {
calcConnectQT(getQuatPtr(actor), getTransPtr(actor), connector);
}
void connectPoseQT(LiveActor* actor, const MtxConnector* connector, const sead::Quatf& quat,
const sead::Vector3f& trans) {
calcConnectQT(getQuatPtr(actor), getTransPtr(actor), connector, quat, trans);
}
void connectPoseTrans(LiveActor* actor, const MtxConnector* connector,
const sead::Vector3f& trans) {
calcConnectTrans(getTransPtr(actor), connector, trans);
}
void connectPoseMtx(LiveActor* actor, const MtxConnector* connector, const sead::Matrix34f& mtx) {
sead::Matrix34f poseMtx;
calcConnectMtx(&poseMtx, connector, mtx);
normalize(&poseMtx);
updatePoseMtx(actor, &poseMtx);
}
void calcConnectTrans(sead::Vector3f* outTrans, const MtxConnector* connector,
const sead::Vector3f& trans) {
connector->multTrans(outTrans, trans);
}
void calcConnectTrans(sead::Vector3f* outTrans, const MtxConnector* connector) {
calcConnectTrans(outTrans, connector, connector->getBaseTrans());
}
void calcConnectDir(sead::Vector3f* outDir, const MtxConnector* connector,
const sead::Vector3f& dir) {
connector->multVec(outDir, dir);
normalize(outDir);
}
void calcConnectQT(sead::Quatf* outQuat, sead::Vector3f* outTrans, const MtxConnector* connector,
const sead::Quatf& poseQuat, const sead::Vector3f& poseTrans) {
connector->multQT(outQuat, outTrans, poseQuat, poseTrans);
}
void calcConnectQT(sead::Quatf* outQuat, sead::Vector3f* outTrans, const MtxConnector* connector) {
connector->multQT(outQuat, outTrans, nullptr);
}
void calcConnectMtx(sead::Matrix34f* outMtx, const MtxConnector* connector,
const sead::Matrix34f& mtx) {
connector->multMtx(outMtx, mtx);
}
void calcConnectMtx(sead::Matrix34f* outMtx, const MtxConnector* connector, const sead::Quatf& quat,
const sead::Vector3f& trans) {
sead::Matrix34f mtx;
mtx.makeQT(quat, trans);
calcConnectMtx(outMtx, connector, mtx);
}
void attachMtxConnectorToCollisionRT(MtxConnector* connector, const LiveActor* actor,
bool isFacingUp, bool useStrikeArrowPos) {
sead::Vector3f facingDir;
calcUpDir(&facingDir, actor);
if (!isFacingUp)
facingDir = -facingDir;
sead::Vector3f dir = facingDir * 150.0f;
sead::Vector3f pos = getTrans(actor) - facingDir * 50.0f;
CollisionPartsFilterActor partsFilter = CollisionPartsFilterActor(actor);
sead::Vector3f arrowPos;
CollisionParts* parts = alCollisionUtil::getStrikeArrowCollisionParts(
actor, &arrowPos, pos, dir, &partsFilter, nullptr);
if (!parts)
return;
const sead::Vector3f& rotate = getRotate(actor);
sead::Matrix34f mtx;
mtx.makeRT({sead::Mathf::deg2rad(rotate.x), sead::Mathf::deg2rad(rotate.y),
sead::Mathf::deg2rad(rotate.z)},
useStrikeArrowPos ? arrowPos : getTrans(actor));
connector->init(&parts->getBaseMtx(), parts->getBaseInvMtx() * mtx);
}
void attachMtxConnectorToCollisionQT(MtxConnector* connector, const LiveActor* actor,
bool isFacingUp, bool useStrikeArrowPos) {
sead::Vector3f facingDir;
calcUpDir(&facingDir, actor);
if (!isFacingUp)
facingDir = -facingDir;
sead::Vector3f dir = facingDir * 150.0f;
sead::Vector3f pos = getTrans(actor) - facingDir * 50.0f;
CollisionPartsFilterActor partsFilter = CollisionPartsFilterActor(actor);
sead::Vector3f arrowPos;
CollisionParts* parts = alCollisionUtil::getStrikeArrowCollisionParts(
actor, &arrowPos, pos, dir, &partsFilter, nullptr);
if (!parts)
return;
sead::Matrix34f mtx;
mtx.makeQT(getQuat(actor), useStrikeArrowPos ? arrowPos : getTrans(actor));
connector->init(&parts->getBaseMtx(), parts->getBaseInvMtx() * mtx);
}
void attachMtxConnectorToJoint(MtxConnector* connector, const LiveActor* actor,
const char* jointName) {
attachMtxConnectorToMtxPtr(connector, getJointMtxPtr(actor, jointName));
}
void attachMtxConnectorToJoint(MtxConnector* connector, const LiveActor* actor,
const char* jointName, const sead::Vector3f& rotation,
const sead::Vector3f& trans) {
attachMtxConnectorToMtxPtr(connector, getJointMtxPtr(actor, jointName), rotation, trans);
}
void attachMtxConnectorToMtxPtr(MtxConnector* connector, const sead::Matrix34f* mtx,
const sead::Vector3f& rotation, const sead::Vector3f& trans) {
sead::Quatf quat;
quat.setRPY(sead::Mathf::deg2rad(rotation.x), sead::Mathf::deg2rad(rotation.y),
sead::Mathf::deg2rad(rotation.z));
connector->setBaseQuatTrans(quat, trans);
attachMtxConnectorToMtxPtr(connector, mtx);
}
void attachMtxConnectorToActor(MtxConnector* connector, const LiveActor* actor) {
attachMtxConnectorToMtxPtr(connector, actor->getBaseMtx());
}
void attachMtxConnectorToActor(MtxConnector* connector, const LiveActor* actor,
const sead::Vector3f& rotation, const sead::Vector3f& trans) {
attachMtxConnectorToMtxPtr(connector, actor->getBaseMtx(), rotation, trans);
}
void attachMtxConnectorToMtxPtr(MtxConnector* connector, const sead::Matrix34f* mtx) {
connector->init(mtx, sead::Matrix34f::ident);
}
void attachMtxConnectorToSensor(MtxConnector* connector, HitSensor* hitSensor,
const sead::Matrix34f& mtx) {
const sead::Matrix34f* followMtx = hitSensor->getFollowMtx();
if (followMtx) {
sead::Matrix34f newMtx;
newMtx.setInverse(*followMtx);
newMtx = newMtx * mtx;
connector->init(followMtx, newMtx);
return;
}
if (hitSensor->getParentActor()->getBaseMtx()) {
const sead::Matrix34f* baseMtx = hitSensor->getParentActor()->getBaseMtx();
if (baseMtx) {
sead::Matrix34f newMtx;
newMtx.setInverse(*baseMtx);
newMtx = newMtx * mtx;
connector->init(baseMtx, newMtx);
}
}
}
void attachSensorConnectorToSensor(SensorConnector* connector, HitSensor* hitSensor,
const sead::Matrix34f& mtx) {
const sead::Matrix34f* followMtx = hitSensor->getFollowMtx();
if (followMtx) {
sead::Matrix34f newMtx;
newMtx.setInverse(*followMtx);
newMtx = newMtx * mtx;
connector->init(followMtx, newMtx, hitSensor);
return;
}
if (hitSensor->getParentActor()->getBaseMtx()) {
const sead::Matrix34f* baseMtx = hitSensor->getParentActor()->getBaseMtx();
if (baseMtx) {
sead::Matrix34f newMtx;
newMtx.setInverse(*baseMtx);
newMtx = newMtx * mtx;
connector->init(baseMtx, newMtx, hitSensor);
}
}
}
void attachMtxConnectorToScreenPointTarget(MtxConnector* connector,
ScreenPointTarget* screenPointTarget,
const sead::Matrix34f& mtx) {
const sead::Matrix34f* followMtx = screenPointTarget->getJointMtx();
if (followMtx) {
sead::Matrix34f newMtx;
newMtx.setInverse(*followMtx);
newMtx = newMtx * mtx;
connector->init(followMtx, newMtx);
return;
}
if (screenPointTarget->getActor()->getBaseMtx()) {
const sead::Matrix34f* baseMtx = screenPointTarget->getActor()->getBaseMtx();
if (baseMtx) {
sead::Matrix34f newMtx;
newMtx.setInverse(*baseMtx);
newMtx = newMtx * mtx;
connector->init(baseMtx, newMtx);
}
}
}
void attachCollisionPartsConnector(CollisionPartsConnector* partsConnector,
const CollisionParts* parts) {
partsConnector->init(&parts->getBaseMtx(), parts->getBaseInvMtx(), parts);
}
void attachCollisionPartsConnectorToGround(CollisionPartsConnector* partsConnector,
const LiveActor* actor) {
// Same as attachMtxConnectorToCollision(connector, actor, true)
CollisionPartsFilterActor partsFilter = CollisionPartsFilterActor(actor);
sead::Vector3f upDir{0.0f, 0.0f, 0.0f};
calcUpDir(&upDir, actor);
CollisionParts* parts = alCollisionUtil::getStrikeArrowCollisionParts(
actor, nullptr, getTrans(actor) + upDir * 50.0f, upDir * -150.0f, &partsFilter, nullptr);
attachCollisionPartsConnector(partsConnector, parts);
}
void attachToHitTriangle(CollisionPartsConnector* partsConnector, const Triangle& triangle,
const sead::Matrix34f& mtx) {
const CollisionParts* collisionParts = triangle.getCollisionParts();
sead::Matrix34f partsMtx = collisionParts->getBaseInvMtx() * mtx;
partsConnector->init(&collisionParts->getBaseMtx(), partsMtx, collisionParts);
}
void attachToHitInfo(CollisionPartsConnector* partsConnector, const HitInfo& hitInfo,
const sead::Matrix34f& mtx) {
attachToHitTriangle(partsConnector, hitInfo.triangle, mtx);
}
void attachToHitInfoNrmToMinusZ(CollisionPartsConnector* partsConnector, const HitInfo& hitInfo) {
sead::Matrix34f mtx;
makeMtxFrontNoSupportPos(&mtx, -hitInfo.triangle.getFaceNormal(), hitInfo.collisionHitPos);
attachToHitInfo(partsConnector, hitInfo, mtx);
}
void calcConnectInfo(const MtxConnector* connector, sead::Vector3f* outTrans, sead::Quatf* outQuat,
sead::Vector3f* outScale, const sead::Vector3f& vecA,
const sead::Vector3f& vecB) {
connector->calcConnectInfo(outTrans, outQuat, outScale, vecA, vecB);
}
void connectPoseQTUsingConnectInfo(LiveActor* actor, const MtxConnector* connector) {
if (!connector->isConnecting())
return;
sead::Vector3f trans;
sead::Quatf quat;
connector->calcConnectInfo(&trans, &quat, nullptr, sead::Vector3f::zero, sead::Vector3f::zero);
setTrans(actor, trans);
setQuat(actor, quat);
}
const sead::Quatf& getConnectBaseQuat(const MtxConnector* connector) {
return connector->getBaseQuat();
}
const sead::Vector3f& getConnectBaseTrans(const MtxConnector* connector) {
return connector->getBaseTrans();
}
} // namespace al

View file

@ -1,5 +1,7 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadMatrix.h>
#include <math/seadQuat.h>
#include <math/seadVector.h>
@ -7,32 +9,92 @@ namespace al {
struct ActorInitInfo;
class CollisionParts;
class CollisionPartsConnector;
struct HitInfo;
class HitSensor;
class LiveActor;
class MtxConnector;
class ScreenPointTarget;
class SensorConnector;
class Triangle;
MtxConnector* createMtxConnector(const LiveActor* actor);
MtxConnector* createMtxConnector(const LiveActor* actor, const sead::Quatf& quat);
MtxConnector* tryCreateMtxConnector(const LiveActor* actor, const ActorInitInfo& initInfo);
MtxConnector* tryCreateMtxConnector(const LiveActor* actor, const ActorInitInfo& initInfo,
const sead::Quatf& quat);
CollisionPartsConnector* createCollisionPartsConnector(const LiveActor* actor,
const sead::Quatf& quat);
MtxConnector* createMtxConnector(const LiveActor* actor);
MtxConnector* tryCreateMtxConnector(const LiveActor* actor, const ActorInitInfo& info);
void attachMtxConnectorToCollision(MtxConnector* mtxConnector, const LiveActor* actor, bool);
void attachMtxConnectorToCollision(MtxConnector* mtxConnector, const LiveActor* actor,
const sead::Vector3f&, const sead::Vector3f&);
void attachMtxConnectorToCollisionParts(MtxConnector* mtxConnector,
const CollisionParts* collisionParts);
CollisionParts* attachMtxConnectorToCollision(MtxConnector* mtxConnector, const LiveActor* actor,
f32, f32);
void connectPoseQT(LiveActor* actor, const MtxConnector* mtxConnector, const sead::Quatf& quat,
const sead::Vector3f& trans);
void connectPoseQT(LiveActor* actor, const MtxConnector* mtxConnector);
void attachMtxConnectorToJoint(MtxConnector* mtxConnector, const LiveActor* actor,
const char* jointName);
void attachMtxConnectorToJoint(MtxConnector* mtxConnector, const LiveActor* actor,
const char* jointName, const sead::Vector3f& quatInitVec,
const sead::Vector3f& trans);
void disconnectMtxConnector(MtxConnector* mtxConnector);
bool isMtxConnectorConnecting(const MtxConnector* mtxConnector);
void calcConnectTrans(sead::Vector3f* connectTrans, const MtxConnector* mtxConnector);
CollisionPartsConnector* tryCreateCollisionPartsConnector(const LiveActor* actor,
const ActorInitInfo& initInfo);
CollisionPartsConnector* tryCreateCollisionPartsConnector(const LiveActor* actor,
const ActorInitInfo& initInfo,
const sead::Quatf& quat);
bool isMtxConnectorConnecting(const MtxConnector* connector);
void disconnectMtxConnector(MtxConnector* connector);
CollisionParts* attachMtxConnectorToCollision(MtxConnector* connector, const LiveActor* actor,
const sead::Vector3f& pos, const sead::Vector3f& dir);
CollisionParts* attachMtxConnectorToCollision(MtxConnector* connector, const LiveActor* actor,
bool isAttachToGround);
CollisionParts* attachMtxConnectorToCollision(MtxConnector* connector, const LiveActor* actor,
f32 checkOffUp, f32 checkDistance);
void attachMtxConnectorToCollisionParts(MtxConnector* connector, const CollisionParts* parts);
void setConnectorBaseQuatTrans(const sead::Quatf& quat, const sead::Vector3f& trans,
MtxConnector* mtxConnector);
MtxConnector* connector);
void setConnectorBaseQuatTrans(LiveActor* actor, MtxConnector* connector);
void connectPoseQT(LiveActor* actor, const MtxConnector* connector);
void connectPoseQT(LiveActor* actor, const MtxConnector* connector, const sead::Quatf& quat,
const sead::Vector3f& trans);
void connectPoseTrans(LiveActor* actor, const MtxConnector* connector, const sead::Vector3f& trans);
void connectPoseMtx(LiveActor* actor, const MtxConnector* connector, const sead::Matrix34f& mtx);
void calcConnectTrans(sead::Vector3f* outTrans, const MtxConnector* connector,
const sead::Vector3f& trans);
void calcConnectTrans(sead::Vector3f* outTrans, const MtxConnector* connector);
void calcConnectDir(sead::Vector3f* outDir, const MtxConnector* connector,
const sead::Vector3f& dir);
void calcConnectQT(sead::Quatf* outQuat, sead::Vector3f* outTrans, const MtxConnector* connector,
const sead::Quatf& poseQuat, const sead::Vector3f& poseTrans);
void calcConnectQT(sead::Quatf* outQuat, sead::Vector3f* outTrans, const MtxConnector* connector);
void calcConnectMtx(sead::Matrix34f* outMtx, const MtxConnector* connector,
const sead::Matrix34f& mtx);
void calcConnectMtx(sead::Matrix34f* outMtx, const MtxConnector* connector, const sead::Quatf& quat,
const sead::Vector3f& trans);
void attachMtxConnectorToCollisionRT(MtxConnector* connector, const LiveActor* actor,
bool isFacingUp, bool useStrikeArrowPos);
void attachMtxConnectorToCollisionQT(MtxConnector* connector, const LiveActor* actor,
bool isFacingUp, bool useStrikeArrowPos);
void attachMtxConnectorToJoint(MtxConnector* connector, const LiveActor* actor,
const char* jointName);
void attachMtxConnectorToJoint(MtxConnector* connector, const LiveActor* actor,
const char* jointName, const sead::Vector3f& rotation,
const sead::Vector3f& trans);
void attachMtxConnectorToMtxPtr(MtxConnector* connector, const sead::Matrix34f* mtx,
const sead::Vector3f& rotation, const sead::Vector3f& trans);
void attachMtxConnectorToActor(MtxConnector* connector, const LiveActor* actor);
void attachMtxConnectorToActor(MtxConnector* connector, const LiveActor* actor,
const sead::Vector3f& rotation, const sead::Vector3f& trans);
void attachMtxConnectorToMtxPtr(MtxConnector* connector, const sead::Matrix34f* mtx);
void attachMtxConnectorToSensor(MtxConnector* connector, HitSensor* hitSensor,
const sead::Matrix34f& mtx);
void attachSensorConnectorToSensor(SensorConnector* connector, HitSensor* hitSensor,
const sead::Matrix34f& mtx);
void attachMtxConnectorToScreenPointTarget(MtxConnector* connector,
ScreenPointTarget* screenPointTarget,
const sead::Matrix34f& mtx);
void attachCollisionPartsConnector(CollisionPartsConnector* partsConnector,
const CollisionParts* parts);
void attachCollisionPartsConnectorToGround(CollisionPartsConnector* partsConnector,
const LiveActor* actor);
void attachToHitTriangle(CollisionPartsConnector* partsConnector, const Triangle& triangle,
const sead::Matrix34f& mtx);
void attachToHitInfo(CollisionPartsConnector* partsConnector, const HitInfo& hitInfo,
const sead::Matrix34f& mtx);
void attachToHitInfoNrmToMinusZ(CollisionPartsConnector* partsConnector, const HitInfo& hitInfo);
// TODO: Rename vecA and vecB
void calcConnectInfo(const MtxConnector* connector, sead::Vector3f* outTrans, sead::Quatf* outQuat,
sead::Vector3f* outScale, const sead::Vector3f& vecA,
const sead::Vector3f& vecB);
void connectPoseQTUsingConnectInfo(LiveActor* actor, const MtxConnector* connector);
const sead::Quatf& getConnectBaseQuat(const MtxConnector* connector);
const sead::Vector3f& getConnectBaseTrans(const MtxConnector* connector);
} // namespace al

View file

@ -0,0 +1,26 @@
#pragma once
#include <math/seadMatrix.h>
#include "Library/Collision/PartsMtxConnector.h"
namespace al {
class HitSensor;
class SensorConnector : public MtxConnector {
public:
SensorConnector();
bool isConnecting() const override;
void clear() override;
void init(const sead::Matrix34f*, const sead::Matrix34f&, HitSensor*);
HitSensor* getConnectingSensor() const;
private:
HitSensor* mHitSensor;
};
static_assert(sizeof(SensorConnector) == 0x68);
} // namespace al

View file

@ -1,10 +1,13 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadMatrix.h>
#include <math/seadVector.h>
namespace al {
class LiveActor;
class ParameterObj;
class ScreenPointCheckGroup;
class ScreenPointTarget {
public:
@ -27,9 +30,19 @@ public:
ParameterObj* getParameterObj() const { return mParameterObj; }
sead::Matrix34f* getJointMtx() const { return mJointMtx; }
LiveActor* getActor() const { return mActor; }
private:
void* filler;
ParameterObj* mParameterObj;
char filler2[0x60];
char filler2[0x28];
sead::Vector3f* _38;
sead::Matrix34f* mJointMtx;
sead::Vector3f _48;
sead::Vector3f _54;
LiveActor* mActor;
ScreenPointCheckGroup* mCheckGroup;
};
} // namespace al

View file

@ -4,11 +4,11 @@
#include <math/seadVector.h>
namespace al {
class LiveActor;
class HitSensor;
class HitSensorDirectror;
class HitSensorKeeper;
class LiveActor;
class SensorHitGroup;
class HitSensor;
using SensorSortCmpFunc = bool (*)(HitSensor* a, HitSensor* b);
@ -70,6 +70,8 @@ public:
LiveActor* getParentActor() const { return mParentActor; }
const sead::Matrix34f* getFollowMtx() const { return mFollowMtx; }
void scaleY(f32 scaleY) {
mRadius *= scaleY;
mFollowPosOffset.y *= scaleY;

View file

@ -314,6 +314,8 @@ def common_const_reference(c, path):
continue
if "sead::IDelegate1<CollisionParts*>" in line:
continue
if "sead::IDelegate1<al::CollisionParts*>" in line:
continue
if re.search(r"(?<!const)[( ][\w_:]+(<[\w_:]+[\*&]?>)?&", line):
FAIL("References must be const!", line, path)