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
0x0000007100f8cd44,O,000552,_ZN4ksys4phys9RigidBody12createMotionEP16hkpMaxSizeMotionNS0_10MotionTypeERKNS0_22RigidBodyInstanceParamE
0x0000007100f8cf6c,O,000052,_ZNK4ksys4phys9RigidBody13getHkBodyNameEv
0x0000007100f8cfa0,m,000424,_ZN4ksys4phys9RigidBody3x_0Ev
0x0000007100f8cfa0,m,000424,_ZN4ksys4phys9RigidBody10addToWorldEv
0x0000007100f8d148,O,000144,_ZN4ksys4phys9RigidBody13setMotionFlagENS1_10MotionFlagE
0x0000007100f8d1d8,O,000032,_ZNK4ksys4phys9RigidBody8isActiveEv
0x0000007100f8d1f8,O,000012,_ZNK4ksys4phys9RigidBody10isFlag8SetEv
0x0000007100f8d204,O,000012,_ZNK4ksys4phys9RigidBody16isMotionFlag1SetEv
0x0000007100f8d210,O,000012,_ZNK4ksys4phys9RigidBody16isMotionFlag2SetEv
0x0000007100f8d21c,O,000236,_ZN4ksys4phys9RigidBody27addOrRemoveRigidBodyToWorldEv
0x0000007100f8d308,O,000888,_ZN4ksys4phys9RigidBody3x_6Ev
0x0000007100f8d1f8,O,000012,_ZNK4ksys4phys9RigidBody14isAddedToWorldEv
0x0000007100f8d204,O,000012,_ZNK4ksys4phys9RigidBody19isAddingBodyToWorldEv
0x0000007100f8d210,O,000012,_ZNK4ksys4phys9RigidBody23isRemovingBodyFromWorldEv
0x0000007100f8d21c,O,000236,_ZN4ksys4phys9RigidBody15removeFromWorldEv
0x0000007100f8d308,O,000888,_ZN4ksys4phys9RigidBody28removeFromWorldAndResetLinksEv
0x0000007100f8d680,O,000140,_ZNK4ksys4phys9RigidBody23getEntityMotionAccessorEv
0x0000007100f8d70c,O,000156,_ZNK4ksys4phys9RigidBody18getLinkedRigidBodyEv
0x0000007100f8d7a8,O,000152,_ZNK4ksys4phys9RigidBody20resetLinkedRigidBodyEv
@ -83514,9 +83514,9 @@ Address,Quality,Size,Name
0x0000007100fa970c,O,000056,_ZN4ksys4phys12RigidBodySet23disableAllContactLayersEv
0x0000007100fa9744,O,000112,_ZN4ksys4phys12RigidBodySet28setScaleAndUpdateImmediatelyEf
0x0000007100fa97b4,O,000072,_ZN4ksys4phys12RigidBodySet8setScaleEf
0x0000007100fa97fc,O,000056,_ZN4ksys4phys12RigidBodySet17callRigidBody_x_0Ev
0x0000007100fa9834,O,000056,_ZN4ksys4phys12RigidBodySet29addOrRemoveRigidBodiesToWorldEv
0x0000007100fa986c,O,000084,_ZN4ksys4phys12RigidBodySet23areAllTrueRigidBody_x_6Ev
0x0000007100fa97fc,O,000056,_ZN4ksys4phys12RigidBodySet10addToWorldEv
0x0000007100fa9834,O,000056,_ZN4ksys4phys12RigidBodySet15removeFromWorldEv
0x0000007100fa986c,O,000084,_ZN4ksys4phys12RigidBodySet28removeFromWorldAndResetLinksEv
0x0000007100fa98c0,O,000120,_ZN4ksys4phys12RigidBodySet23hasNoRigidBodyWithFlag8Eb
0x0000007100fa9938,O,000072,_ZN4ksys4phys12RigidBodySet17callRigidBody_x_7Eh
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)
void RigidBody::x_0() {
void RigidBody::addToWorld() {
// debug code that survived because mFlags is atomic
static_cast<void>(isFlag8Set());
static_cast<void>(isAddedToWorld());
auto lock = makeScopedLock(false);
@ -213,11 +213,11 @@ void RigidBody::x_0() {
}
}
if (isMotionFlag2Set()) {
mMotionFlags.reset(MotionFlag::_2);
mMotionFlags.set(MotionFlag::_1);
} else if (!isMotionFlag1Set()) {
setMotionFlag(MotionFlag::_1);
if (isRemovingBodyFromWorld()) {
mMotionFlags.reset(MotionFlag::BodyRemovalRequested);
mMotionFlags.set(MotionFlag::BodyAddRequested);
} else if (!isAddingBodyToWorld()) {
setMotionFlag(MotionFlag::BodyAddRequested);
}
}
@ -236,33 +236,33 @@ bool RigidBody::isActive() const {
return mHkBody->isActive();
}
bool RigidBody::isFlag8Set() const {
bool RigidBody::isAddedToWorld() const {
return mFlags.isOn(Flag::_8);
}
bool RigidBody::isMotionFlag1Set() const {
return mMotionFlags.isOn(MotionFlag::_1);
bool RigidBody::isAddingBodyToWorld() const {
return mMotionFlags.isOn(MotionFlag::BodyAddRequested);
}
bool RigidBody::isMotionFlag2Set() const {
return mMotionFlags.isOn(MotionFlag::_2);
bool RigidBody::isRemovingBodyFromWorld() const {
return mMotionFlags.isOn(MotionFlag::BodyRemovalRequested);
}
void RigidBody::addOrRemoveRigidBodyToWorld() {
void RigidBody::removeFromWorld() {
// debug code that survived because mFlags is atomic?
static_cast<void>(mFlags.getDirect());
auto lock = sead::makeScopedLock(mCS);
if (mMotionFlags.isOn(MotionFlag::_1)) {
mMotionFlags.reset(MotionFlag::_1);
mMotionFlags.set(MotionFlag::_2);
} else if (isFlag8Set()) {
setMotionFlag(MotionFlag::_2);
if (mMotionFlags.isOn(MotionFlag::BodyAddRequested)) {
mMotionFlags.reset(MotionFlag::BodyAddRequested);
mMotionFlags.set(MotionFlag::BodyRemovalRequested);
} else if (isAddedToWorld()) {
setMotionFlag(MotionFlag::BodyRemovalRequested);
}
}
bool RigidBody::x_6() {
bool RigidBody::removeFromWorldAndResetLinks() {
// debug code that survived because mFlags is atomic?
static_cast<void>(mFlags.getDirect());
@ -270,15 +270,15 @@ bool RigidBody::x_6() {
bool result = true;
if (isFlag8Set()) {
if (isAddedToWorld()) {
mFlags.reset(Flag::_20);
if (mMotionFlags.isOn(MotionFlag::_1)) {
mMotionFlags.reset(MotionFlag::_1);
mMotionFlags.set(MotionFlag::_2);
if (mMotionFlags.isOn(MotionFlag::BodyAddRequested)) {
mMotionFlags.reset(MotionFlag::BodyAddRequested);
mMotionFlags.set(MotionFlag::BodyRemovalRequested);
}
setMotionFlag(MotionFlag::_2);
setMotionFlag(MotionFlag::BodyRemovalRequested);
result = false;
} else if (mFlags.isOn(Flag::UpdateRequested)) {
System::instance()->getRigidBodyRequestMgr()->pushRigidBody(getLayerType(), this);
@ -452,7 +452,7 @@ void RigidBody::replaceMotionObject() {
}
void RigidBody::x_10() {
auto lock = makeScopedLock(isFlag8Set());
auto lock = makeScopedLock(isAddedToWorld());
if (isEntity()) {
if (mMotionAccessor &&
@ -476,18 +476,18 @@ void RigidBody::x_10() {
void RigidBody::setCollisionInfo(CollisionInfo* info) {
if (mCollisionInfo != info) {
if (mCollisionInfo && isFlag8Set())
if (mCollisionInfo && isAddedToWorld())
System::instance()->removeRigidBodyFromContactSystem(this);
mCollisionInfo = info;
}
if (isFlag8Set() && mCollisionInfo && !mCollisionInfo->isLinked())
if (isAddedToWorld() && mCollisionInfo && !mCollisionInfo->isLinked())
System::instance()->registerCollisionInfo(mCollisionInfo);
}
void RigidBody::setContactPointInfo(ContactPointInfo* info) {
mContactPointInfo = info;
if (isFlag8Set() && mContactPointInfo && !mContactPointInfo->isLinked())
if (isAddedToWorld() && mContactPointInfo && !mContactPointInfo->isLinked())
System::instance()->registerContactPointInfo(info);
}
@ -544,7 +544,7 @@ void RigidBody::resetFrozenState() {
}
void RigidBody::updateCollidableQualityType(bool high_quality) {
auto lock = makeScopedLock(isFlag8Set());
auto lock = makeScopedLock(isAddedToWorld());
if (isCharacterControllerType()) {
setCollidableQualityType(HK_COLLIDABLE_QUALITY_CHARACTER);
@ -712,10 +712,10 @@ static void resetCollisionFilterInfoForListShapes(const hkpShape* shape) {
void RigidBody::setCollisionFilterInfo(u32 info) {
const auto current_layer = getContactLayer();
const auto lock = makeScopedLock(isFlag8Set());
const auto lock = makeScopedLock(isAddedToWorld());
if (getCollisionFilterInfo() != info) {
if (isFlag8Set()) {
if (isAddedToWorld()) {
if (int(current_layer) != getContactLayer(EntityCollisionMask(info)))
System::instance()->removeRigidBodyFromContactSystem(this);
}
@ -724,7 +724,7 @@ void RigidBody::setCollisionFilterInfo(u32 info) {
if (auto* shape = mHkBody->getCollidableRw()->getShape())
resetCollisionFilterInfoForListShapes(shape);
if (isFlag8Set())
if (isAddedToWorld())
setMotionFlag(MotionFlag::_8000);
}
}
@ -917,7 +917,7 @@ bool RigidBody::isTransformDirty() const {
}
void RigidBody::updateShape() {
if (isFlag8Set()) {
if (isAddedToWorld()) {
setMotionFlag(MotionFlag::DirtyShape);
return;
}
@ -955,7 +955,7 @@ void RigidBody::changeMotionType(MotionType motion_type) {
if (getMotionType() == motion_type)
return;
if (isFlag8Set()) {
if (isAddedToWorld()) {
switch (motion_type) {
case MotionType::Dynamic:
if (isEntity()) {
@ -1718,7 +1718,7 @@ void RigidBody::clearFlag2000000(bool clear) {
mFlags.change(Flag::_2000000, !clear);
if (isFlag8Set())
if (isAddedToWorld())
setMotionFlag(MotionFlag::_10000);
else
updateDeactivation();
@ -1730,7 +1730,7 @@ void RigidBody::clearFlag4000000(bool clear) {
mFlags.change(Flag::_4000000, !clear);
if (isFlag8Set())
if (isAddedToWorld())
setMotionFlag(MotionFlag::_10000);
else
updateDeactivation();
@ -1742,7 +1742,7 @@ void RigidBody::clearFlag8000000(bool clear) {
mFlags.change(Flag::_8000000, !clear);
if (isFlag8Set())
if (isAddedToWorld())
setMotionFlag(MotionFlag::_10000);
else
updateDeactivation();

View File

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

View File

@ -47,7 +47,7 @@ void RigidBodyMotionEntity::setTransform(const sead::Matrix34f& mtx,
toHkTransform(&transform, mtx);
mMotion->setTransform(transform);
if (mBody->isFlag8Set()) {
if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyTransform);
} else {
getHkBody()->getMotion()->setTransform(transform);
@ -71,7 +71,7 @@ void RigidBodyMotionEntity::setPosition(const sead::Vector3f& position,
mMotion->setPositionAndRotation(hk_position, hk_rotate);
if (mBody->isFlag8Set()) {
if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyTransform);
} else {
getHkBody()->getMotion()->setPositionAndRotation(hk_position, hk_rotate);
@ -113,7 +113,7 @@ void RigidBodyMotionEntity::setCenterOfMassInLocal(const sead::Vector3f& center)
const auto hk_center = toHkVec4(center);
mMotion->setCenterOfMassInLocal(hk_center);
if (mBody->isFlag8Set())
if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyCenterOfMassLocal);
else
getHkBody()->setCenterOfMassLocal(hk_center);
@ -280,7 +280,7 @@ void RigidBodyMotionEntity::setMass(float mass) {
}
mMotion->setMass(mass);
if (mBody->isFlag8Set())
if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyMass);
else if (mBody->getMotionType() == MotionType::Dynamic)
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.
mMotion->setGravityFactor(gravity_factor);
mMotion->setMass(mass);
if (mBody->isFlag8Set())
if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyMiscState);
else if (mBody->getMotionType() == MotionType::Dynamic)
updateRigidBodyMotionExceptState();
@ -371,7 +371,7 @@ void RigidBodyMotionEntity::setInertiaLocal(const sead::Vector3f& inertia) {
hk_inertia.m_col2.set(0, 0, inertia.z);
mMotion->setInertiaLocal(hk_inertia);
if (mBody->isFlag8Set()) {
if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyInertiaLocal);
} else if (mBody->getMotionType() == MotionType::Dynamic &&
!mBody->isCharacterControllerType()) {
@ -401,7 +401,7 @@ void RigidBodyMotionEntity::setLinearDamping(float value) {
}
mMotion->setLinearDamping(value);
if (mBody->isFlag8Set())
if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor);
else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->setLinearDamping(getTimeFactor() * value);
@ -421,7 +421,7 @@ void RigidBodyMotionEntity::setAngularDamping(float value) {
}
mMotion->setAngularDamping(value);
if (mBody->isFlag8Set())
if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor);
else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->setAngularDamping(getTimeFactor() * value);
@ -441,7 +441,7 @@ void RigidBodyMotionEntity::setGravityFactor(float value) {
}
mMotion->setGravityFactor(value);
if (mBody->isFlag8Set())
if (mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::DirtyDampingOrGravityFactor);
else if (mBody->getMotionType() == MotionType::Dynamic)
getHkBody()->setGravityFactor(value);
@ -581,7 +581,7 @@ bool RigidBodyMotionEntity::registerAccessor(RigidBodyMotionSensor* accessor) {
mLinkedAccessors.pushBack(accessor);
if (mFlags.isOff(Flag::_2) && mBody->isFlag8Set())
if (mFlags.isOff(Flag::_2) && mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::_80000);
return true;
@ -595,7 +595,7 @@ bool RigidBodyMotionEntity::deregisterAccessor(RigidBodyMotionSensor* accessor)
return false;
// 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);
mLinkedAccessors.erase(idx);
return true;
@ -611,7 +611,7 @@ bool RigidBodyMotionEntity::deregisterAllAccessors() {
mLinkedAccessors.back()->resetLinkedRigidBody();
}
if (mFlags.isOn(Flag::_2) && mBody->isFlag8Set())
if (mFlags.isOn(Flag::_2) && mBody->isAddedToWorld())
setMotionFlag(RigidBody::MotionFlag::_80000);
return true;
}
@ -621,7 +621,7 @@ void RigidBodyMotionEntity::copyTransformToAllLinkedBodies() {
for (int i = 0, n = mLinkedAccessors.size(); i < n; ++i) {
auto* body = mLinkedAccessors[i]->getBody();
if (!body->isFlag8Set() && body->isMotionFlag1Set()) {
if (!body->isAddedToWorld() && body->isAddingBodyToWorld()) {
sead::Matrix34f transform;
mBody->getTransform(&transform);
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) {
if (mBody->isFlag8Set()) { // flag 8 = block updates?
if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyTransform);
return;
}
@ -183,7 +183,7 @@ void RigidBodyMotionSensor::getTransform(sead::Matrix34f* mtx) {
void RigidBodyMotionSensor::setCenterOfMassInLocal(const sead::Vector3f& center) {
mCenterOfMassInLocal.e = center.e;
if (mBody->isFlag8Set()) {
if (mBody->isAddedToWorld()) {
setMotionFlag(RigidBody::MotionFlag::DirtyCenterOfMassLocal);
return;
}
@ -270,7 +270,7 @@ float RigidBodyMotionSensor::getMaxAngularVelocity() {
}
void RigidBodyMotionSensor::setLinkedRigidBody(RigidBody* body) {
auto lock = mBody->makeScopedLock(mBody->isFlag8Set());
auto lock = mBody->makeScopedLock(mBody->isAddedToWorld());
if (mLinkedRigidBody == body)
return;
@ -302,7 +302,7 @@ void RigidBodyMotionSensor::resetLinkedRigidBody() {
if (!mLinkedRigidBody)
return;
auto lock = mBody->makeScopedLock(mBody->isFlag8Set());
auto lock = mBody->makeScopedLock(mBody->isAddedToWorld());
if (mLinkedRigidBody) {
mLinkedRigidBody->getEntityMotionAccessorForSensor()->deregisterAccessor(this);
mLinkedRigidBody = nullptr;
@ -319,7 +319,7 @@ bool RigidBodyMotionSensor::isFlag40000Set() const {
}
void RigidBodyMotionSensor::copyMotionFromLinkedRigidBody() {
auto lock = mBody->makeScopedLock(mBody->isFlag8Set());
auto lock = mBody->makeScopedLock(mBody->isAddedToWorld());
auto* accessor = mLinkedRigidBody->getEntityMotionAccessorForSensor();
auto* linked_hk_body = mLinkedRigidBody->getHkBody();

View File

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

View File

@ -58,9 +58,9 @@ public:
void setScaleAndUpdateImmediately(float scale);
void setScale(float scale);
void callRigidBody_x_0();
void addOrRemoveRigidBodiesToWorld();
bool areAllTrueRigidBody_x_6();
void addToWorld();
void removeFromWorld();
bool removeFromWorldAndResetLinks();
bool hasNoRigidBodyWithFlag8(bool require_motion_flag_1_to_be_unset);
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);
if (areContactsTrackedForLayerPair(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 tracked_layer = layer_col_info->getLayer();
const bool body_a_first = layer_a_ == tracked_layer;

View File

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

View File

@ -40,7 +40,7 @@ void SensorContactListener::handleCollisionAdded(const hkpCollisionEvent& event,
if (areContactsTrackedForLayerPair(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 tracked_layer = layer_col_info->getLayer();
const bool body_a_first = layer_a_ == tracked_layer;