summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2022-03-01 13:21:53 +0100
committerLéo Lam <leo@leolam.fr>2022-03-01 13:24:18 +0100
commit7f52270cdda40abdab53380bd6e7185a77fc882f (patch)
treecfb31bff1d9c7f4f4c67e9e5d16219e5e29fc269 /src
parentf852073fd4d751ea77e33c642448ba5c4eb30abf (diff)
ksys/phys: SensorCollisionMask layer2 -> ignored_layer
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.cpp10
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.h5
-rw-r--r--src/KingSystem/Physics/System/physInstanceSet.cpp2
-rw-r--r--src/KingSystem/Physics/System/physSensorGroupFilter.cpp16
-rw-r--r--src/KingSystem/Physics/System/physSensorGroupFilter.h7
-rw-r--r--src/KingSystem/Physics/physDefines.h11
6 files changed, 26 insertions, 25 deletions
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
index c9418fcb..41dbebe0 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
+++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
@@ -717,14 +717,14 @@ void RigidBody::setCollisionFilterInfo(u32 info) {
}
}
-void RigidBody::setSensorReceiverLayer2(ContactLayer layer) {
+void RigidBody::setSensorReceiverIgnoredLayer(ContactLayer layer) {
static_cast<void>(isSensor());
static_cast<void>(isSensor());
- const auto info = sensorCollisionMaskSetLayer2(true, layer, getCollisionFilterInfo());
+ const auto info = sensorCollisionMaskSetIgnoredLayer(true, layer, getCollisionFilterInfo());
setCollisionFilterInfo(info);
}
-void RigidBody::clearSensorReceiverLayer2() {
+void RigidBody::clearSensorReceiverIgnoredLayer() {
if (!isSensor())
return;
@@ -732,8 +732,8 @@ void RigidBody::clearSensorReceiverLayer2() {
return;
// The layer we pass here is actually irrelevant because we're clearing the layer value anyway.
- const auto info =
- sensorCollisionMaskSetLayer2(false, ContactLayer::SensorNoHit, getCollisionFilterInfo());
+ const auto info = sensorCollisionMaskSetIgnoredLayer(false, ContactLayer::SensorNoHit,
+ getCollisionFilterInfo());
setCollisionFilterInfo(info);
}
diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h
index d015f267..b98ba414 100644
--- a/src/KingSystem/Physics/RigidBody/physRigidBody.h
+++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h
@@ -229,10 +229,9 @@ public:
}
/// Only works for sensor rigid bodies that do not use a custom receiver.
- // TODO: rename once we figure out what this layer is used for
- void setSensorReceiverLayer2(ContactLayer layer);
+ void setSensorReceiverIgnoredLayer(ContactLayer layer);
/// Only works for sensor rigid bodies that do not use a custom receiver.
- void clearSensorReceiverLayer2();
+ void clearSensorReceiverIgnoredLayer();
void setContactLayerAndHandler(ContactLayer layer, SystemGroupHandler* handler);
void setContactLayerAndGroundHit(ContactLayer layer, GroundHit ground_hit);
diff --git a/src/KingSystem/Physics/System/physInstanceSet.cpp b/src/KingSystem/Physics/System/physInstanceSet.cpp
index 2d7d4dd5..ccfc3062 100644
--- a/src/KingSystem/Physics/System/physInstanceSet.cpp
+++ b/src/KingSystem/Physics/System/physInstanceSet.cpp
@@ -140,7 +140,7 @@ void InstanceSet::sub_7100FBB00C(phys::RigidBody* body, phys::RigidBodyParam* pa
}
body->enableGroundCollision(instance_params.no_hit_ground == 0);
body->enableWaterCollision(instance_params.no_hit_water == 0);
- body->clearSensorReceiverLayer2();
+ body->clearSensorReceiverIgnoredLayer();
}
void* InstanceSet::sub_7100FBBC28(const sead::SafeString& name) const {
diff --git a/src/KingSystem/Physics/System/physSensorGroupFilter.cpp b/src/KingSystem/Physics/System/physSensorGroupFilter.cpp
index 5d339276..9c5ed54d 100644
--- a/src/KingSystem/Physics/System/physSensorGroupFilter.cpp
+++ b/src/KingSystem/Physics/System/physSensorGroupFilter.cpp
@@ -82,9 +82,9 @@ hkBool SensorGroupFilter::testCollisionForSensors(u32 infoA, u32 infoB) const {
return false;
}
- if (a.data.has_layer2 && b.data.layer == a.data.layer2)
+ if (a.data.has_ignored_layer && b.data.layer == a.data.ignored_layer)
return false;
- if (b.data.has_layer2 && a.data.layer == b.data.layer2)
+ if (b.data.has_ignored_layer && a.data.layer == b.data.ignored_layer)
return false;
return m_collisionLookupTable[a.data.layer] & (1 << b.data.layer);
@@ -241,7 +241,7 @@ u32 sensorCollisionMaskSetLayer(ContactLayer layer, u32 mask) {
clearBitFields(&info.raw, info.is_custom_receiver, info.custom_receiver_data.layer);
} else {
clearBitFields(&info.raw, info.is_custom_receiver, info.data.layer,
- info.data.has_layer2, info.data.layer2);
+ info.data.has_ignored_layer, info.data.ignored_layer);
}
if (info.is_custom_receiver) {
@@ -254,7 +254,7 @@ u32 sensorCollisionMaskSetLayer(ContactLayer layer, u32 mask) {
return info.raw;
}
-u32 sensorCollisionMaskSetLayer2(bool set, ContactLayer layer, u32 mask) {
+u32 sensorCollisionMaskSetIgnoredLayer(bool set, ContactLayer layer, u32 mask) {
SEAD_ASSERT(getContactLayerType(layer) == ContactLayerType::Sensor);
SensorCollisionMask info{mask};
@@ -262,12 +262,12 @@ u32 sensorCollisionMaskSetLayer2(bool set, ContactLayer layer, u32 mask) {
return info.raw;
info.is_custom_receiver = false;
- info.data.has_layer2 = false;
- info.data.layer2 = {};
+ info.data.has_ignored_layer = false;
+ info.data.ignored_layer = {};
if (set) {
- info.data.has_layer2 = true;
- info.data.layer2.SetUnsafe(layer - FirstSensor);
+ info.data.has_ignored_layer = true;
+ info.data.ignored_layer.SetUnsafe(layer - FirstSensor);
}
return info.raw;
diff --git a/src/KingSystem/Physics/System/physSensorGroupFilter.h b/src/KingSystem/Physics/System/physSensorGroupFilter.h
index 4f85702d..c3e942dc 100644
--- a/src/KingSystem/Physics/System/physSensorGroupFilter.h
+++ b/src/KingSystem/Physics/System/physSensorGroupFilter.h
@@ -64,13 +64,12 @@ protected:
/// @param mask An existing sensor collision mask
u32 sensorCollisionMaskSetLayer(ContactLayer layer, u32 mask);
-/// Set or clear a second contact layer in a sensor collision mask.
+/// Set or clear a contact layer to ignore during collision detection in a sensor collision mask.
/// This function does nothing when using a custom receiver.
/// @param set If true, set the specified layer. Clear it otherwise
-/// @param layer A sensor contact layer
+/// @param layer A sensor contact layer to be ignored
/// @param mask An existing sensor collision mask
-// TODO: rename once we figure out what this layer is used for
-u32 sensorCollisionMaskSetLayer2(bool set, ContactLayer layer, u32 mask);
+u32 sensorCollisionMaskSetIgnoredLayer(bool set, ContactLayer layer, u32 mask);
inline u32 SensorSystemGroupHandler::makeCollisionFilterInfo(u32 info, ContactLayer layer,
GroundHit ground_hit) {
diff --git a/src/KingSystem/Physics/physDefines.h b/src/KingSystem/Physics/physDefines.h
index 55718aaa..befc5ae7 100644
--- a/src/KingSystem/Physics/physDefines.h
+++ b/src/KingSystem/Physics/physDefines.h
@@ -308,11 +308,14 @@ union SensorCollisionMask {
union Data {
ContactLayer getLayer() const { return int(layer) + FirstSensor; }
- /// ContactLayer minus FirstSensor.
+ /// The sensor's contact layer.
+ /// @note Add FirstSensor to get the actual ContactLayer value.
util::BitField<0, 5, u32> layer;
- // TODO: rename once we figure out what this layer is used for
- util::BitField<5, 1, bool, u32> has_layer2;
- util::BitField<6, 5, u32> layer2;
+ /// Whether `ignored_layer` contains a valid layer.
+ util::BitField<5, 1, bool, u32> has_ignored_layer;
+ /// Contact layer to ignore during collision detection. Only valid if `has_ignored_layer`.
+ /// @note Add FirstSensor to get the actual ContactLayer value.
+ util::BitField<6, 5, u32> ignored_layer;
};
union CustomReceiverData {