mirror of https://github.com/zeldaret/botw.git
ksys/phys: SensorCollisionMask layer2 -> ignored_layer
This commit is contained in:
parent
f852073fd4
commit
7f52270cdd
|
@ -83008,8 +83008,8 @@ Address,Quality,Size,Name
|
||||||
0x0000007100f8f1c4,O,000572,_ZN4ksys4phys9RigidBody22setCollisionFilterInfoEj
|
0x0000007100f8f1c4,O,000572,_ZN4ksys4phys9RigidBody22setCollisionFilterInfoEj
|
||||||
0x0000007100f8f400,O,000172,_ZN4ksys4phys9RigidBody20enableWaterCollisionEb
|
0x0000007100f8f400,O,000172,_ZN4ksys4phys9RigidBody20enableWaterCollisionEb
|
||||||
0x0000007100f8f4ac,O,000048,_ZNK4ksys4phys9RigidBody23isWaterCollisionEnabledEv
|
0x0000007100f8f4ac,O,000048,_ZNK4ksys4phys9RigidBody23isWaterCollisionEnabledEv
|
||||||
0x0000007100f8f4dc,O,000064,_ZN4ksys4phys9RigidBody23setSensorReceiverLayer2ENS0_12ContactLayerE
|
0x0000007100f8f4dc,O,000064,_ZN4ksys4phys9RigidBody29setSensorReceiverIgnoredLayerENS0_12ContactLayerE
|
||||||
0x0000007100f8f51c,O,000104,_ZN4ksys4phys9RigidBody25clearSensorReceiverLayer2Ev
|
0x0000007100f8f51c,O,000104,_ZN4ksys4phys9RigidBody31clearSensorReceiverIgnoredLayerEv
|
||||||
0x0000007100f8f584,O,000144,_ZN4ksys4phys9RigidBody25setContactLayerAndHandlerENS0_12ContactLayerEPNS0_18SystemGroupHandlerE
|
0x0000007100f8f584,O,000144,_ZN4ksys4phys9RigidBody25setContactLayerAndHandlerENS0_12ContactLayerEPNS0_18SystemGroupHandlerE
|
||||||
0x0000007100f8f614,O,000144,_ZN4ksys4phys9RigidBody15setContactLayerENS0_12ContactLayerE
|
0x0000007100f8f614,O,000144,_ZN4ksys4phys9RigidBody15setContactLayerENS0_12ContactLayerE
|
||||||
0x0000007100f8f6a4,O,000256,_ZN4ksys4phys9RigidBody21setSystemGroupHandlerEPNS0_18SystemGroupHandlerE
|
0x0000007100f8f6a4,O,000256,_ZN4ksys4phys9RigidBody21setSystemGroupHandlerEPNS0_18SystemGroupHandlerE
|
||||||
|
@ -84143,7 +84143,7 @@ Address,Quality,Size,Name
|
||||||
0x0000007100fc8374,O,000192,_ZN4ksys4phys17SensorGroupFilter30doInitSystemGroupHandlerLists_EPN4sead4HeapE
|
0x0000007100fc8374,O,000192,_ZN4ksys4phys17SensorGroupFilter30doInitSystemGroupHandlerLists_EPN4sead4HeapE
|
||||||
0x0000007100fc8434,O,000016,_ZN4ksys4phys17SensorGroupFilter16getFreeListIndexEPKNS0_18SystemGroupHandlerE
|
0x0000007100fc8434,O,000016,_ZN4ksys4phys17SensorGroupFilter16getFreeListIndexEPKNS0_18SystemGroupHandlerE
|
||||||
0x0000007100fc8444,O,000072,_ZN4ksys4phys27sensorCollisionMaskSetLayerENS0_12ContactLayerEj
|
0x0000007100fc8444,O,000072,_ZN4ksys4phys27sensorCollisionMaskSetLayerENS0_12ContactLayerEj
|
||||||
0x0000007100fc848c,O,000060,_ZN4ksys4phys28sensorCollisionMaskSetLayer2EbNS0_12ContactLayerEj
|
0x0000007100fc848c,O,000060,_ZN4ksys4phys34sensorCollisionMaskSetIgnoredLayerEbNS0_12ContactLayerEj
|
||||||
0x0000007100fc84c8,O,000056,_ZN4ksys4phys24SensorSystemGroupHandler23makeCollisionFilterInfoEjNS0_12ContactLayerENS0_9GroundHitE
|
0x0000007100fc84c8,O,000056,_ZN4ksys4phys24SensorSystemGroupHandler23makeCollisionFilterInfoEjNS0_12ContactLayerENS0_9GroundHitE
|
||||||
0x0000007100fc8500,O,000020,_ZN4ksys4phys24SensorSystemGroupHandler22makeQueryCollisionMaskEjNS0_9GroundHitEb
|
0x0000007100fc8500,O,000020,_ZN4ksys4phys24SensorSystemGroupHandler22makeQueryCollisionMaskEjNS0_9GroundHitEb
|
||||||
0x0000007100fc8514,O,000020,_ZN4ksys4phys24SensorSystemGroupHandler2m8Ev
|
0x0000007100fc8514,O,000020,_ZN4ksys4phys24SensorSystemGroupHandler2m8Ev
|
||||||
|
|
Can't render this file because it is too large.
|
|
@ -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());
|
||||||
static_cast<void>(isSensor());
|
static_cast<void>(isSensor());
|
||||||
const auto info = sensorCollisionMaskSetLayer2(true, layer, getCollisionFilterInfo());
|
const auto info = sensorCollisionMaskSetIgnoredLayer(true, layer, getCollisionFilterInfo());
|
||||||
setCollisionFilterInfo(info);
|
setCollisionFilterInfo(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RigidBody::clearSensorReceiverLayer2() {
|
void RigidBody::clearSensorReceiverIgnoredLayer() {
|
||||||
if (!isSensor())
|
if (!isSensor())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -732,8 +732,8 @@ void RigidBody::clearSensorReceiverLayer2() {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// The layer we pass here is actually irrelevant because we're clearing the layer value anyway.
|
// The layer we pass here is actually irrelevant because we're clearing the layer value anyway.
|
||||||
const auto info =
|
const auto info = sensorCollisionMaskSetIgnoredLayer(false, ContactLayer::SensorNoHit,
|
||||||
sensorCollisionMaskSetLayer2(false, ContactLayer::SensorNoHit, getCollisionFilterInfo());
|
getCollisionFilterInfo());
|
||||||
|
|
||||||
setCollisionFilterInfo(info);
|
setCollisionFilterInfo(info);
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,10 +229,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Only works for sensor rigid bodies that do not use a custom receiver.
|
/// 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 setSensorReceiverIgnoredLayer(ContactLayer layer);
|
||||||
void setSensorReceiverLayer2(ContactLayer layer);
|
|
||||||
/// Only works for sensor rigid bodies that do not use a custom receiver.
|
/// Only works for sensor rigid bodies that do not use a custom receiver.
|
||||||
void clearSensorReceiverLayer2();
|
void clearSensorReceiverIgnoredLayer();
|
||||||
|
|
||||||
void setContactLayerAndHandler(ContactLayer layer, SystemGroupHandler* handler);
|
void setContactLayerAndHandler(ContactLayer layer, SystemGroupHandler* handler);
|
||||||
void setContactLayerAndGroundHit(ContactLayer layer, GroundHit ground_hit);
|
void setContactLayerAndGroundHit(ContactLayer layer, GroundHit ground_hit);
|
||||||
|
|
|
@ -140,7 +140,7 @@ void InstanceSet::sub_7100FBB00C(phys::RigidBody* body, phys::RigidBodyParam* pa
|
||||||
}
|
}
|
||||||
body->enableGroundCollision(instance_params.no_hit_ground == 0);
|
body->enableGroundCollision(instance_params.no_hit_ground == 0);
|
||||||
body->enableWaterCollision(instance_params.no_hit_water == 0);
|
body->enableWaterCollision(instance_params.no_hit_water == 0);
|
||||||
body->clearSensorReceiverLayer2();
|
body->clearSensorReceiverIgnoredLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void* InstanceSet::sub_7100FBBC28(const sead::SafeString& name) const {
|
void* InstanceSet::sub_7100FBBC28(const sead::SafeString& name) const {
|
||||||
|
|
|
@ -82,9 +82,9 @@ hkBool SensorGroupFilter::testCollisionForSensors(u32 infoA, u32 infoB) const {
|
||||||
return false;
|
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;
|
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 false;
|
||||||
|
|
||||||
return m_collisionLookupTable[a.data.layer] & (1 << b.data.layer);
|
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);
|
clearBitFields(&info.raw, info.is_custom_receiver, info.custom_receiver_data.layer);
|
||||||
} else {
|
} else {
|
||||||
clearBitFields(&info.raw, info.is_custom_receiver, info.data.layer,
|
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) {
|
if (info.is_custom_receiver) {
|
||||||
|
@ -254,7 +254,7 @@ u32 sensorCollisionMaskSetLayer(ContactLayer layer, u32 mask) {
|
||||||
return info.raw;
|
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);
|
SEAD_ASSERT(getContactLayerType(layer) == ContactLayerType::Sensor);
|
||||||
|
|
||||||
SensorCollisionMask info{mask};
|
SensorCollisionMask info{mask};
|
||||||
|
@ -262,12 +262,12 @@ u32 sensorCollisionMaskSetLayer2(bool set, ContactLayer layer, u32 mask) {
|
||||||
return info.raw;
|
return info.raw;
|
||||||
|
|
||||||
info.is_custom_receiver = false;
|
info.is_custom_receiver = false;
|
||||||
info.data.has_layer2 = false;
|
info.data.has_ignored_layer = false;
|
||||||
info.data.layer2 = {};
|
info.data.ignored_layer = {};
|
||||||
|
|
||||||
if (set) {
|
if (set) {
|
||||||
info.data.has_layer2 = true;
|
info.data.has_ignored_layer = true;
|
||||||
info.data.layer2.SetUnsafe(layer - FirstSensor);
|
info.data.ignored_layer.SetUnsafe(layer - FirstSensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return info.raw;
|
return info.raw;
|
||||||
|
|
|
@ -64,13 +64,12 @@ protected:
|
||||||
/// @param mask An existing sensor collision mask
|
/// @param mask An existing sensor collision mask
|
||||||
u32 sensorCollisionMaskSetLayer(ContactLayer layer, u32 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.
|
/// This function does nothing when using a custom receiver.
|
||||||
/// @param set If true, set the specified layer. Clear it otherwise
|
/// @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
|
/// @param mask An existing sensor collision mask
|
||||||
// TODO: rename once we figure out what this layer is used for
|
u32 sensorCollisionMaskSetIgnoredLayer(bool set, ContactLayer layer, u32 mask);
|
||||||
u32 sensorCollisionMaskSetLayer2(bool set, ContactLayer layer, u32 mask);
|
|
||||||
|
|
||||||
inline u32 SensorSystemGroupHandler::makeCollisionFilterInfo(u32 info, ContactLayer layer,
|
inline u32 SensorSystemGroupHandler::makeCollisionFilterInfo(u32 info, ContactLayer layer,
|
||||||
GroundHit ground_hit) {
|
GroundHit ground_hit) {
|
||||||
|
|
|
@ -308,11 +308,14 @@ union SensorCollisionMask {
|
||||||
union Data {
|
union Data {
|
||||||
ContactLayer getLayer() const { return int(layer) + FirstSensor; }
|
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;
|
util::BitField<0, 5, u32> layer;
|
||||||
// TODO: rename once we figure out what this layer is used for
|
/// Whether `ignored_layer` contains a valid layer.
|
||||||
util::BitField<5, 1, bool, u32> has_layer2;
|
util::BitField<5, 1, bool, u32> has_ignored_layer;
|
||||||
util::BitField<6, 5, u32> layer2;
|
/// 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 {
|
union CustomReceiverData {
|
||||||
|
|
Loading…
Reference in New Issue