ksys/phys: Rename some RigidBody flags (add/remove from world)

This commit is contained in:
Léo Lam 2022-03-22 22:41:04 +01:00
parent c97cf995ef
commit f3308d7bee
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
10 changed files with 91 additions and 89 deletions

View File

@ -82974,14 +82974,14 @@ Address,Quality,Size,Name
0x0000007100f8cc98,O,000172,_ZN4ksys4phys9RigidBody18initMotionAccessorERKNS0_22RigidBodyInstanceParamEPN4sead4HeapEb 0x0000007100f8cc98,O,000172,_ZN4ksys4phys9RigidBody18initMotionAccessorERKNS0_22RigidBodyInstanceParamEPN4sead4HeapEb
0x0000007100f8cd44,O,000552,_ZN4ksys4phys9RigidBody12createMotionEP16hkpMaxSizeMotionNS0_10MotionTypeERKNS0_22RigidBodyInstanceParamE 0x0000007100f8cd44,O,000552,_ZN4ksys4phys9RigidBody12createMotionEP16hkpMaxSizeMotionNS0_10MotionTypeERKNS0_22RigidBodyInstanceParamE
0x0000007100f8cf6c,O,000052,_ZNK4ksys4phys9RigidBody13getHkBodyNameEv 0x0000007100f8cf6c,O,000052,_ZNK4ksys4phys9RigidBody13getHkBodyNameEv
0x0000007100f8cfa0,m,000424,_ZN4ksys4phys9RigidBody3x_0Ev 0x0000007100f8cfa0,m,000424,_ZN4ksys4phys9RigidBody10addToWorldEv
0x0000007100f8d148,O,000144,_ZN4ksys4phys9RigidBody13setMotionFlagENS1_10MotionFlagE 0x0000007100f8d148,O,000144,_ZN4ksys4phys9RigidBody13setMotionFlagENS1_10MotionFlagE
0x0000007100f8d1d8,O,000032,_ZNK4ksys4phys9RigidBody8isActiveEv 0x0000007100f8d1d8,O,000032,_ZNK4ksys4phys9RigidBody8isActiveEv
0x0000007100f8d1f8,O,000012,_ZNK4ksys4phys9RigidBody10isFlag8SetEv 0x0000007100f8d1f8,O,000012,_ZNK4ksys4phys9RigidBody14isAddedToWorldEv
0x0000007100f8d204,O,000012,_ZNK4ksys4phys9RigidBody16isMotionFlag1SetEv 0x0000007100f8d204,O,000012,_ZNK4ksys4phys9RigidBody19isAddingBodyToWorldEv
0x0000007100f8d210,O,000012,_ZNK4ksys4phys9RigidBody16isMotionFlag2SetEv 0x0000007100f8d210,O,000012,_ZNK4ksys4phys9RigidBody23isRemovingBodyFromWorldEv
0x0000007100f8d21c,O,000236,_ZN4ksys4phys9RigidBody27addOrRemoveRigidBodyToWorldEv 0x0000007100f8d21c,O,000236,_ZN4ksys4phys9RigidBody15removeFromWorldEv
0x0000007100f8d308,O,000888,_ZN4ksys4phys9RigidBody3x_6Ev 0x0000007100f8d308,O,000888,_ZN4ksys4phys9RigidBody28removeFromWorldAndResetLinksEv
0x0000007100f8d680,O,000140,_ZNK4ksys4phys9RigidBody23getEntityMotionAccessorEv 0x0000007100f8d680,O,000140,_ZNK4ksys4phys9RigidBody23getEntityMotionAccessorEv
0x0000007100f8d70c,O,000156,_ZNK4ksys4phys9RigidBody18getLinkedRigidBodyEv 0x0000007100f8d70c,O,000156,_ZNK4ksys4phys9RigidBody18getLinkedRigidBodyEv
0x0000007100f8d7a8,O,000152,_ZNK4ksys4phys9RigidBody20resetLinkedRigidBodyEv 0x0000007100f8d7a8,O,000152,_ZNK4ksys4phys9RigidBody20resetLinkedRigidBodyEv
@ -83514,9 +83514,9 @@ Address,Quality,Size,Name
0x0000007100fa970c,O,000056,_ZN4ksys4phys12RigidBodySet23disableAllContactLayersEv 0x0000007100fa970c,O,000056,_ZN4ksys4phys12RigidBodySet23disableAllContactLayersEv
0x0000007100fa9744,O,000112,_ZN4ksys4phys12RigidBodySet28setScaleAndUpdateImmediatelyEf 0x0000007100fa9744,O,000112,_ZN4ksys4phys12RigidBodySet28setScaleAndUpdateImmediatelyEf
0x0000007100fa97b4,O,000072,_ZN4ksys4phys12RigidBodySet8setScaleEf 0x0000007100fa97b4,O,000072,_ZN4ksys4phys12RigidBodySet8setScaleEf
0x0000007100fa97fc,O,000056,_ZN4ksys4phys12RigidBodySet17callRigidBody_x_0Ev 0x0000007100fa97fc,O,000056,_ZN4ksys4phys12RigidBodySet10addToWorldEv
0x0000007100fa9834,O,000056,_ZN4ksys4phys12RigidBodySet29addOrRemoveRigidBodiesToWorldEv 0x0000007100fa9834,O,000056,_ZN4ksys4phys12RigidBodySet15removeFromWorldEv
0x0000007100fa986c,O,000084,_ZN4ksys4phys12RigidBodySet23areAllTrueRigidBody_x_6Ev 0x0000007100fa986c,O,000084,_ZN4ksys4phys12RigidBodySet28removeFromWorldAndResetLinksEv
0x0000007100fa98c0,O,000120,_ZN4ksys4phys12RigidBodySet23hasNoRigidBodyWithFlag8Eb 0x0000007100fa98c0,O,000120,_ZN4ksys4phys12RigidBodySet23hasNoRigidBodyWithFlag8Eb
0x0000007100fa9938,O,000072,_ZN4ksys4phys12RigidBodySet17callRigidBody_x_7Eh 0x0000007100fa9938,O,000072,_ZN4ksys4phys12RigidBodySet17callRigidBody_x_7Eh
0x0000007100fa9980,U,000004,SphereRigidBody::make 0x0000007100fa9980,U,000004,SphereRigidBody::make

Can't render this file because it is too large.

View File

@ -196,9 +196,9 @@ hkpCollidable* RigidBody::getCollidable() const {
} }
// NON_MATCHING: ldr w8, [x20, #0x68] should be ldr w8, [x22] (equivalent) // NON_MATCHING: ldr w8, [x20, #0x68] should be ldr w8, [x22] (equivalent)
void RigidBody::x_0() { void RigidBody::addToWorld() {
// debug code that survived because mFlags is atomic // debug code that survived because mFlags is atomic
static_cast<void>(isFlag8Set()); static_cast<void>(isAddedToWorld());
auto lock = makeScopedLock(false); auto lock = makeScopedLock(false);
@ -213,11 +213,11 @@ void RigidBody::x_0() {
} }
} }
if (isMotionFlag2Set()) { if (isRemovingBodyFromWorld()) {
mMotionFlags.reset(MotionFlag::_2); mMotionFlags.reset(MotionFlag::BodyRemovalRequested);
mMotionFlags.set(MotionFlag::_1); mMotionFlags.set(MotionFlag::BodyAddRequested);
} else if (!isMotionFlag1Set()) { } else if (!isAddingBodyToWorld()) {
setMotionFlag(MotionFlag::_1); setMotionFlag(MotionFlag::BodyAddRequested);
} }
} }
@ -236,33 +236,33 @@ bool RigidBody::isActive() const {
return mHkBody->isActive(); return mHkBody->isActive();
} }
bool RigidBody::isFlag8Set() const { bool RigidBody::isAddedToWorld() const {
return mFlags.isOn(Flag::_8); return mFlags.isOn(Flag::_8);
} }
bool RigidBody::isMotionFlag1Set() const { bool RigidBody::isAddingBodyToWorld() const {
return mMotionFlags.isOn(MotionFlag::_1); return mMotionFlags.isOn(MotionFlag::BodyAddRequested);
} }
bool RigidBody::isMotionFlag2Set() const { bool RigidBody::isRemovingBodyFromWorld() const {
return mMotionFlags.isOn(MotionFlag::_2); return mMotionFlags.isOn(MotionFlag::BodyRemovalRequested);
} }
void RigidBody::addOrRemoveRigidBodyToWorld() { void RigidBody::removeFromWorld() {
// debug code that survived because mFlags is atomic? // debug code that survived because mFlags is atomic?
static_cast<void>(mFlags.getDirect()); static_cast<void>(mFlags.getDirect());
auto lock = sead::makeScopedLock(mCS); auto lock = sead::makeScopedLock(mCS);
if (mMotionFlags.isOn(MotionFlag::_1)) { if (mMotionFlags.isOn(MotionFlag::BodyAddRequested)) {
mMotionFlags.reset(MotionFlag::_1); mMotionFlags.reset(MotionFlag::BodyAddRequested);
mMotionFlags.set(MotionFlag::_2); mMotionFlags.set(MotionFlag::BodyRemovalRequested);
} else if (isFlag8Set()) { } else if (isAddedToWorld()) {
setMotionFlag(MotionFlag::_2); setMotionFlag(MotionFlag::BodyRemovalRequested);
} }
} }
bool RigidBody::x_6() { bool RigidBody::removeFromWorldAndResetLinks() {
// debug code that survived because mFlags is atomic? // debug code that survived because mFlags is atomic?
static_cast<void>(mFlags.getDirect()); static_cast<void>(mFlags.getDirect());
@ -270,15 +270,15 @@ bool RigidBody::x_6() {
bool result = true; bool result = true;
if (isFlag8Set()) { if (isAddedToWorld()) {
mFlags.reset(Flag::_20); mFlags.reset(Flag::_20);
if (mMotionFlags.isOn(MotionFlag::_1)) { if (mMotionFlags.isOn(MotionFlag::BodyAddRequested)) {
mMotionFlags.reset(MotionFlag::_1); mMotionFlags.reset(MotionFlag::BodyAddRequested);
mMotionFlags.set(MotionFlag::_2); mMotionFlags.set(MotionFlag::BodyRemovalRequested);
} }
setMotionFlag(MotionFlag::_2); setMotionFlag(MotionFlag::BodyRemovalRequested);
result = false; result = false;
} else if (mFlags.isOn(Flag::UpdateRequested)) { } else if (mFlags.isOn(Flag::UpdateRequested)) {
System::instance()->getRigidBodyRequestMgr()->pushRigidBody(getLayerType(), this); System::instance()->getRigidBodyRequestMgr()->pushRigidBody(getLayerType(), this);
@ -452,7 +452,7 @@ void RigidBody::replaceMotionObject() {
} }
void RigidBody::x_10() { void RigidBody::x_10() {
auto lock = makeScopedLock(isFlag8Set()); auto lock = makeScopedLock(isAddedToWorld());
if (isEntity()) { if (isEntity()) {
if (mMotionAccessor && if (mMotionAccessor &&
@ -476,18 +476,18 @@ void RigidBody::x_10() {
void RigidBody::setCollisionInfo(CollisionInfo* info) { void RigidBody::setCollisionInfo(CollisionInfo* info) {
if (mCollisionInfo != info) { if (mCollisionInfo != info) {
if (mCollisionInfo && isFlag8Set()) if (mCollisionInfo && isAddedToWorld())
System::instance()->removeRigidBodyFromContactSystem(this); System::instance()->removeRigidBodyFromContactSystem(this);
mCollisionInfo = info; mCollisionInfo = info;
} }
if (isFlag8Set() && mCollisionInfo && !mCollisionInfo->isLinked()) if (isAddedToWorld() && mCollisionInfo && !mCollisionInfo->isLinked())
System::instance()->registerCollisionInfo(mCollisionInfo); System::instance()->registerCollisionInfo(mCollisionInfo);
} }
void RigidBody::setContactPointInfo(ContactPointInfo* info) { void RigidBody::setContactPointInfo(ContactPointInfo* info) {
mContactPointInfo = info; mContactPointInfo = info;
if (isFlag8Set() && mContactPointInfo && !mContactPointInfo->isLinked()) if (isAddedToWorld() && mContactPointInfo && !mContactPointInfo->isLinked())
System::instance()->registerContactPointInfo(info); System::instance()->registerContactPointInfo(info);
} }
@ -544,7 +544,7 @@ void RigidBody::resetFrozenState() {
} }
void RigidBody::updateCollidableQualityType(bool high_quality) { void RigidBody::updateCollidableQualityType(bool high_quality) {
auto lock = makeScopedLock(isFlag8Set()); auto lock = makeScopedLock(isAddedToWorld());
if (isCharacterControllerType()) { if (isCharacterControllerType()) {
setCollidableQualityType(HK_COLLIDABLE_QUALITY_CHARACTER); setCollidableQualityType(HK_COLLIDABLE_QUALITY_CHARACTER);
@ -712,10 +712,10 @@ static void resetCollisionFilterInfoForListShapes(const hkpShape* shape) {
void RigidBody::setCollisionFilterInfo(u32 info) { void RigidBody::setCollisionFilterInfo(u32 info) {
const auto current_layer = getContactLayer(); const auto current_layer = getContactLayer();
const auto lock = makeScopedLock(isFlag8Set()); const auto lock = makeScopedLock(isAddedToWorld());
if (getCollisionFilterInfo() != info) { if (getCollisionFilterInfo() != info) {
if (isFlag8Set()) { if (isAddedToWorld()) {
if (int(current_layer) != getContactLayer(EntityCollisionMask(info))) if (int(current_layer) != getContactLayer(EntityCollisionMask(info)))
System::instance()->removeRigidBodyFromContactSystem(this); System::instance()->removeRigidBodyFromContactSystem(this);
} }
@ -724,7 +724,7 @@ void RigidBody::setCollisionFilterInfo(u32 info) {
if (auto* shape = mHkBody->getCollidableRw()->getShape()) if (auto* shape = mHkBody->getCollidableRw()->getShape())
resetCollisionFilterInfoForListShapes(shape); resetCollisionFilterInfoForListShapes(shape);
if (isFlag8Set()) if (isAddedToWorld())
setMotionFlag(MotionFlag::_8000); setMotionFlag(MotionFlag::_8000);
} }
} }
@ -917,7 +917,7 @@ bool RigidBody::isTransformDirty() const {
} }
void RigidBody::updateShape() { void RigidBody::updateShape() {
if (isFlag8Set()) { if (isAddedToWorld()) {
setMotionFlag(MotionFlag::DirtyShape); setMotionFlag(MotionFlag::DirtyShape);
return; return;
} }
@ -955,7 +955,7 @@ void RigidBody::changeMotionType(MotionType motion_type) {
if (getMotionType() == motion_type) if (getMotionType() == motion_type)
return; return;
if (isFlag8Set()) { if (isAddedToWorld()) {
switch (motion_type) { switch (motion_type) {
case MotionType::Dynamic: case MotionType::Dynamic:
if (isEntity()) { if (isEntity()) {
@ -1718,7 +1718,7 @@ void RigidBody::clearFlag2000000(bool clear) {
mFlags.change(Flag::_2000000, !clear); mFlags.change(Flag::_2000000, !clear);
if (isFlag8Set()) if (isAddedToWorld())
setMotionFlag(MotionFlag::_10000); setMotionFlag(MotionFlag::_10000);
else else
updateDeactivation(); updateDeactivation();
@ -1730,7 +1730,7 @@ void RigidBody::clearFlag4000000(bool clear) {
mFlags.change(Flag::_4000000, !clear); mFlags.change(Flag::_4000000, !clear);
if (isFlag8Set()) if (isAddedToWorld())
setMotionFlag(MotionFlag::_10000); setMotionFlag(MotionFlag::_10000);
else else
updateDeactivation(); updateDeactivation();
@ -1742,7 +1742,7 @@ void RigidBody::clearFlag8000000(bool clear) {
mFlags.change(Flag::_8000000, !clear); mFlags.change(Flag::_8000000, !clear);
if (isFlag8Set()) if (isAddedToWorld())
setMotionFlag(MotionFlag::_10000); setMotionFlag(MotionFlag::_10000);
else else
updateDeactivation(); updateDeactivation();

View File

@ -101,8 +101,10 @@ public:
}; };
enum class MotionFlag { enum class MotionFlag {
_1 = 1 << 0, /// Whether somebody requested that the rigid body be added to the world.
_2 = 1 << 1, BodyAddRequested = 1 << 0,
/// Whether somebody requested that the rigid body be removed from the world.
BodyRemovalRequested = 1 << 1,
Dynamic = 1 << 2, Dynamic = 1 << 2,
Keyframed = 1 << 3, Keyframed = 1 << 3,
Fixed = 1 << 4, Fixed = 1 << 4,
@ -154,15 +156,15 @@ public:
sead::SafeString getHkBodyName() const; sead::SafeString getHkBodyName() const;
hkpCollidable* getCollidable() const; hkpCollidable* getCollidable() const;
void x_0(); void addToWorld();
bool isActive() const; bool isActive() const;
bool isAddedToWorld() const;
bool isFlag8Set() const; bool isAddingBodyToWorld() const;
bool isMotionFlag1Set() const; bool isRemovingBodyFromWorld() const;
bool isMotionFlag2Set() const; void removeFromWorld();
void addOrRemoveRigidBodyToWorld(); /// Returns true if the system has finished removing the body from the world and
bool x_6(); /// resetting body/accessor links, false otherwise.
bool removeFromWorldAndResetLinks();
/// Get the motion accessor if it is a RigidBodyMotionEntity. Returns nullptr otherwise. /// Get the motion accessor if it is a RigidBodyMotionEntity. Returns nullptr otherwise.
RigidBodyMotionEntity* getEntityMotionAccessor() const; RigidBodyMotionEntity* getEntityMotionAccessor() const;

View File

@ -47,7 +47,7 @@ void RigidBodyMotionEntity::setTransform(const sead::Matrix34f& mtx,
toHkTransform(&transform, mtx); toHkTransform(&transform, mtx);
mMotion->setTransform(transform); mMotion->setTransform(transform);
if (mBody->isFlag8Set()) { if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyTransform); setMotionFlag(RigidBody::MotionFlag::DirtyTransform);
} else { } else {
getHkBody()->getMotion()->setTransform(transform); getHkBody()->getMotion()->setTransform(transform);
@ -71,7 +71,7 @@ void RigidBodyMotionEntity::setPosition(const sead::Vector3f& position,
mMotion->setPositionAndRotation(hk_position, hk_rotate); mMotion->setPositionAndRotation(hk_position, hk_rotate);
if (mBody->isFlag8Set()) { if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyTransform); setMotionFlag(RigidBody::MotionFlag::DirtyTransform);
} else { } else {
getHkBody()->getMotion()->setPositionAndRotation(hk_position, hk_rotate); getHkBody()->getMotion()->setPositionAndRotation(hk_position, hk_rotate);
@ -113,7 +113,7 @@ void RigidBodyMotionEntity::setCenterOfMassInLocal(const sead::Vector3f& center)
const auto hk_center = toHkVec4(center); const auto hk_center = toHkVec4(center);
mMotion->setCenterOfMassInLocal(hk_center); mMotion->setCenterOfMassInLocal(hk_center);
if (mBody->isFlag8Set()) if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyCenterOfMassLocal); setMotionFlag(RigidBody::MotionFlag::DirtyCenterOfMassLocal);
else else
getHkBody()->setCenterOfMassLocal(hk_center); getHkBody()->setCenterOfMassLocal(hk_center);
@ -280,7 +280,7 @@ void RigidBodyMotionEntity::setMass(float mass) {
} }
mMotion->setMass(mass); mMotion->setMass(mass);
if (mBody->isFlag8Set()) if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyMass); setMotionFlag(RigidBody::MotionFlag::DirtyMass);
else if (mBody->getMotionType() == MotionType::Dynamic) else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->getMotion()->setMass(mass); getHkBody()->getMotion()->setMass(mass);
@ -359,7 +359,7 @@ void RigidBodyMotionEntity::setInertiaLocal(const sead::Vector3f& inertia) {
// Some properties are not automatically transferred over. Copy them manually. // Some properties are not automatically transferred over. Copy them manually.
mMotion->setGravityFactor(gravity_factor); mMotion->setGravityFactor(gravity_factor);
mMotion->setMass(mass); mMotion->setMass(mass);
if (mBody->isFlag8Set()) if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyMiscState); setMotionFlag(RigidBody::MotionFlag::DirtyMiscState);
else if (mBody->getMotionType() == MotionType::Dynamic) else if (mBody->getMotionType() == MotionType::Dynamic)
updateRigidBodyMotionExceptState(); updateRigidBodyMotionExceptState();
@ -371,7 +371,7 @@ void RigidBodyMotionEntity::setInertiaLocal(const sead::Vector3f& inertia) {
hk_inertia.m_col2.set(0, 0, inertia.z); hk_inertia.m_col2.set(0, 0, inertia.z);
mMotion->setInertiaLocal(hk_inertia); mMotion->setInertiaLocal(hk_inertia);
if (mBody->isFlag8Set()) { if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyInertiaLocal); setMotionFlag(RigidBody::MotionFlag::DirtyInertiaLocal);
} else if (mBody->getMotionType() == MotionType::Dynamic && } else if (mBody->getMotionType() == MotionType::Dynamic &&
!mBody->isCharacterControllerType()) { !mBody->isCharacterControllerType()) {
@ -401,7 +401,7 @@ void RigidBodyMotionEntity::setLinearDamping(float value) {
} }
mMotion->setLinearDamping(value); mMotion->setLinearDamping(value);
if (mBody->isFlag8Set()) if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor); setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor);
else if (mBody->getMotionType() == MotionType::Dynamic) else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->setLinearDamping(getTimeFactor() * value); getHkBody()->setLinearDamping(getTimeFactor() * value);
@ -421,7 +421,7 @@ void RigidBodyMotionEntity::setAngularDamping(float value) {
} }
mMotion->setAngularDamping(value); mMotion->setAngularDamping(value);
if (mBody->isFlag8Set()) if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor); setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor);
else if (mBody->getMotionType() == MotionType::Dynamic) else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->setAngularDamping(getTimeFactor() * value); getHkBody()->setAngularDamping(getTimeFactor() * value);
@ -441,7 +441,7 @@ void RigidBodyMotionEntity::setGravityFactor(float value) {
} }
mMotion->setGravityFactor(value); mMotion->setGravityFactor(value);
if (mBody->isFlag8Set()) if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor); setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor);
else if (mBody->getMotionType() == MotionType::Dynamic) else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->setGravityFactor(value); getHkBody()->setGravityFactor(value);
@ -581,7 +581,7 @@ bool RigidBodyMotionEntity::registerAccessor(RigidBodyMotionSensor* accessor) {
mLinkedAccessors.pushBack(accessor); mLinkedAccessors.pushBack(accessor);
if (mFlags.isOff(Flag::_2) && mBody->isFlag8Set()) if (mFlags.isOff(Flag::_2) && mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::_80000); setMotionFlag(RigidBody::MotionFlag::_80000);
return true; return true;
@ -595,7 +595,7 @@ bool RigidBodyMotionEntity::deregisterAccessor(RigidBodyMotionSensor* accessor)
return false; return false;
// Found the accessor -- now we just need to erase it. // Found the accessor -- now we just need to erase it.
if (mFlags.isOn(Flag::_2) && mBody->isFlag8Set()) if (mFlags.isOn(Flag::_2) && mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::_80000); setMotionFlag(RigidBody::MotionFlag::_80000);
mLinkedAccessors.erase(idx); mLinkedAccessors.erase(idx);
return true; return true;
@ -611,7 +611,7 @@ bool RigidBodyMotionEntity::deregisterAllAccessors() {
mLinkedAccessors.back()->resetLinkedRigidBody(); mLinkedAccessors.back()->resetLinkedRigidBody();
} }
if (mFlags.isOn(Flag::_2) && mBody->isFlag8Set()) if (mFlags.isOn(Flag::_2) && mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::_80000); setMotionFlag(RigidBody::MotionFlag::_80000);
return true; return true;
} }
@ -621,7 +621,7 @@ void RigidBodyMotionEntity::copyTransformToAllLinkedBodies() {
for (int i = 0, n = mLinkedAccessors.size(); i < n; ++i) { for (int i = 0, n = mLinkedAccessors.size(); i < n; ++i) {
auto* body = mLinkedAccessors[i]->getBody(); auto* body = mLinkedAccessors[i]->getBody();
if (!body->isFlag8Set() && body->isMotionFlag1Set()) { if (!body->isAddedToWorld() && body->isAddingBodyToWorld()) {
sead::Matrix34f transform; sead::Matrix34f transform;
mBody->getTransform(&transform); mBody->getTransform(&transform);
body->setTransform(transform, true); body->setTransform(transform, true);

View File

@ -21,7 +21,7 @@ bool RigidBodyMotionSensor::init(const RigidBodyInstanceParam& params, sead::Hea
} }
KSYS_ALWAYS_INLINE void RigidBodyMotionSensor::setTransformImpl(const sead::Matrix34f& mtx) { KSYS_ALWAYS_INLINE void RigidBodyMotionSensor::setTransformImpl(const sead::Matrix34f& mtx) {
if (mBody->isFlag8Set()) { // flag 8 = block updates? if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyTransform); setMotionFlag(RigidBody::MotionFlag::DirtyTransform);
return; return;
} }
@ -183,7 +183,7 @@ void RigidBodyMotionSensor::getTransform(sead::Matrix34f* mtx) {
void RigidBodyMotionSensor::setCenterOfMassInLocal(const sead::Vector3f& center) { void RigidBodyMotionSensor::setCenterOfMassInLocal(const sead::Vector3f& center) {
mCenterOfMassInLocal.e = center.e; mCenterOfMassInLocal.e = center.e;
if (mBody->isFlag8Set()) { if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyCenterOfMassLocal); setMotionFlag(RigidBody::MotionFlag::DirtyCenterOfMassLocal);
return; return;
} }
@ -270,7 +270,7 @@ float RigidBodyMotionSensor::getMaxAngularVelocity() {
} }
void RigidBodyMotionSensor::setLinkedRigidBody(RigidBody* body) { void RigidBodyMotionSensor::setLinkedRigidBody(RigidBody* body) {
auto lock = mBody->makeScopedLock(mBody->isFlag8Set()); auto lock = mBody->makeScopedLock(mBody->isAddedToWorld());
if (mLinkedRigidBody == body) if (mLinkedRigidBody == body)
return; return;
@ -302,7 +302,7 @@ void RigidBodyMotionSensor::resetLinkedRigidBody() {
if (!mLinkedRigidBody) if (!mLinkedRigidBody)
return; return;
auto lock = mBody->makeScopedLock(mBody->isFlag8Set()); auto lock = mBody->makeScopedLock(mBody->isAddedToWorld());
if (mLinkedRigidBody) { if (mLinkedRigidBody) {
mLinkedRigidBody->getEntityMotionAccessorForSensor()->deregisterAccessor(this); mLinkedRigidBody->getEntityMotionAccessorForSensor()->deregisterAccessor(this);
mLinkedRigidBody = nullptr; mLinkedRigidBody = nullptr;
@ -319,7 +319,7 @@ bool RigidBodyMotionSensor::isFlag40000Set() const {
} }
void RigidBodyMotionSensor::copyMotionFromLinkedRigidBody() { void RigidBodyMotionSensor::copyMotionFromLinkedRigidBody() {
auto lock = mBody->makeScopedLock(mBody->isFlag8Set()); auto lock = mBody->makeScopedLock(mBody->isAddedToWorld());
auto* accessor = mLinkedRigidBody->getEntityMotionAccessorForSensor(); auto* accessor = mLinkedRigidBody->getEntityMotionAccessorForSensor();
auto* linked_hk_body = mLinkedRigidBody->getHkBody(); auto* linked_hk_body = mLinkedRigidBody->getHkBody();

View File

@ -144,28 +144,28 @@ void RigidBodySet::setScale(float scale) {
body.setScale(scale); body.setScale(scale);
} }
void RigidBodySet::callRigidBody_x_0() { void RigidBodySet::addToWorld() {
for (auto& body : mRigidBodies) for (auto& body : mRigidBodies)
body.x_0(); body.addToWorld();
} }
void RigidBodySet::addOrRemoveRigidBodiesToWorld() { void RigidBodySet::removeFromWorld() {
for (auto& body : mRigidBodies) for (auto& body : mRigidBodies)
body.addOrRemoveRigidBodyToWorld(); body.removeFromWorld();
} }
bool RigidBodySet::areAllTrueRigidBody_x_6() { bool RigidBodySet::removeFromWorldAndResetLinks() {
bool ok = true; bool ok = true;
for (auto& body : mRigidBodies) for (auto& body : mRigidBodies)
ok &= body.x_6(); ok &= body.removeFromWorldAndResetLinks();
return ok; return ok;
} }
bool RigidBodySet::hasNoRigidBodyWithFlag8(bool require_motion_flag_1_to_be_unset) { bool RigidBodySet::hasNoRigidBodyWithFlag8(bool require_motion_flag_1_to_be_unset) {
for (auto it = mRigidBodies.begin(), end = mRigidBodies.end(); it != end; ++it) { for (auto it = mRigidBodies.begin(), end = mRigidBodies.end(); it != end; ++it) {
if (it->isFlag8Set()) if (it->isAddedToWorld())
return false; return false;
if (require_motion_flag_1_to_be_unset && it->isMotionFlag1Set()) if (require_motion_flag_1_to_be_unset && it->isAddingBodyToWorld())
return false; return false;
} }
return true; return true;

View File

@ -58,9 +58,9 @@ public:
void setScaleAndUpdateImmediately(float scale); void setScaleAndUpdateImmediately(float scale);
void setScale(float scale); void setScale(float scale);
void callRigidBody_x_0(); void addToWorld();
void addOrRemoveRigidBodiesToWorld(); void removeFromWorld();
bool areAllTrueRigidBody_x_6(); bool removeFromWorldAndResetLinks();
bool hasNoRigidBodyWithFlag8(bool require_motion_flag_1_to_be_unset); bool hasNoRigidBodyWithFlag8(bool require_motion_flag_1_to_be_unset);
void callRigidBody_x_7(u8 type); void callRigidBody_x_7(u8 type);

View File

@ -368,7 +368,7 @@ void ContactListener::handleCollisionAdded(const hkpCollisionEvent& event, Rigid
const auto j = int(layer_b - mLayerBase); const auto j = int(layer_b - mLayerBase);
if (areContactsTrackedForLayerPair(i, j)) { if (areContactsTrackedForLayerPair(i, j)) {
auto* layer_col_info = getContactLayerCollisionInfo(i, j); auto* layer_col_info = getContactLayerCollisionInfo(i, j);
if (body_a->isFlag8Set() && body_b->isFlag8Set()) { if (body_a->isAddedToWorld() && body_b->isAddedToWorld()) {
const auto layer_a_ = int(layer_a); const auto layer_a_ = int(layer_a);
const auto tracked_layer = layer_col_info->getLayer(); const auto tracked_layer = layer_col_info->getLayer();
const bool body_a_first = layer_a_ == tracked_layer; const bool body_a_first = layer_a_ == tracked_layer;

View File

@ -81,11 +81,11 @@ u32 InstanceSet::sub_7100FB9C2C() const {
void InstanceSet::sub_7100FBA9BC() { void InstanceSet::sub_7100FBA9BC() {
for (auto& rb : mRigidBodySets) { for (auto& rb : mRigidBodySets) {
rb.callRigidBody_x_0(); rb.addToWorld();
} }
for (auto& body : mList) { for (auto& body : mList) {
body->x_0(); body->addToWorld();
} }
if (mCollisionController != nullptr) if (mCollisionController != nullptr)

View File

@ -40,7 +40,7 @@ void SensorContactListener::handleCollisionAdded(const hkpCollisionEvent& event,
if (areContactsTrackedForLayerPair(rlayer_a, rlayer_b)) { if (areContactsTrackedForLayerPair(rlayer_a, rlayer_b)) {
auto* layer_col_info = getContactLayerCollisionInfo(rlayer_a, rlayer_b); auto* layer_col_info = getContactLayerCollisionInfo(rlayer_a, rlayer_b);
if (body_a->isFlag8Set() && body_b->isFlag8Set()) { if (body_a->isAddedToWorld() && body_b->isAddedToWorld()) {
const auto layer_a_ = int(layer_a); const auto layer_a_ = int(layer_a);
const auto tracked_layer = layer_col_info->getLayer(); const auto tracked_layer = layer_col_info->getLayer();
const bool body_a_first = layer_a_ == tracked_layer; const bool body_a_first = layer_a_ == tracked_layer;