Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion Assets/BetterPhysics/Runtime/Scripts/BetterRigidbody.cs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,11 @@ private void ApplyHardLimit(SpeedLimit limit) {
}
}

#if UNITY_6000_4_OR_NEWER
internal EntityId GetRigidbodyEntityId() => _rb.GetEntityId();
#else
internal int GetRigidbodyInstanceID() => _rb.GetInstanceID();
#endif
internal Rigidbody WrappedRigidbody => GetComponent<Rigidbody>();

public Vector3 Velocity {
Expand Down Expand Up @@ -489,7 +493,9 @@ public void AddRelativeTorque(float x, float y, float z, ForceMode mode = ForceM
public Action<Quaternion> MoveRotation => _rb.MoveRotation;
public Action ResetCenterOfMass => _rb.ResetCenterOfMass;
public Action ResetInertiaTensor => _rb.ResetInertiaTensor;
#if !UNITY_6000_0_OR_NEWER
public Action<float> SetDensity => _rb.SetDensity;
#endif
public Action Sleep => _rb.Sleep;

public bool SweepTest(Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity,
Expand Down Expand Up @@ -838,4 +844,4 @@ private Vector3 CalculateVelocityChangeWithSoftLimit(in Vector3 currentVelocity,

#endregion
}
}
}
45 changes: 43 additions & 2 deletions Assets/BetterPhysics/Runtime/Scripts/ContactModificationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,18 @@ public static ContactModificationManager Instance {
/// </summary>
public static ContactModificationManager WeakInstance => _instance;

#if UNITY_6000_4_OR_NEWER
private Dictionary<EntityId, IDictionary<int, OneWayLayerInteraction>> _perRigidbodyData;
#else
private Dictionary<int, IDictionary<int, OneWayLayerInteraction>> _perRigidbodyData;

#endif

// Tracks which BetterRigidbody is in which layer
#if UNITY_6000_4_OR_NEWER
private Dictionary<EntityId, int> _rigidbodyLayerMapping;
#else
private Dictionary<int, int> _rigidbodyLayerMapping;
#endif

private BetterPhysicsSettings _settings;

Expand All @@ -54,8 +62,13 @@ private void PhysicsOnContactModifyEvent(PhysicsScene scene, NativeArray<Modifia
for (int i = 0; i < contactPairs.Length; i++) {
var pair = contactPairs[i];

#if UNITY_6000_4_OR_NEWER
EntityId bodyAId = pair.bodyEntityId;
EntityId bodyBId = pair.otherBodyEntityId;
#else
int bodyAId = pair.bodyInstanceID;
int bodyBId = pair.otherBodyInstanceID;
#endif

if (!_rigidbodyLayerMapping.TryGetValue(bodyAId, out int layerA)) {
// Debug.Log($"Body A {bodyAId} is not a registered BRB");
Expand Down Expand Up @@ -138,35 +151,55 @@ private void PhysicsOnContactModifyEvent(PhysicsScene scene, NativeArray<Modifia
}

public void Register(BetterRigidbody body) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
_rigidbodyLayerMapping[rbInstanceId] = body.PhysicsLayer;
_perRigidbodyData[rbInstanceId] = body.SerializedInteractions;

// Debug.Log($"Registering {rbInstanceId} to layer {body.PhysicsLayer}");
}

public void UnRegister(BetterRigidbody body) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
_perRigidbodyData.Remove(rbInstanceId);
_rigidbodyLayerMapping.Remove(rbInstanceId);
}

public void ResetCustomInteractions(BetterRigidbody body) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
if (_perRigidbodyData.TryGetValue(rbInstanceId, out var data)) {
data.Clear();
}
}

public void SetCustomInteraction(BetterRigidbody body, OneWayLayerInteraction interaction) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
if (_perRigidbodyData.TryGetValue(rbInstanceId, out var data)) {
data[interaction.receiver] = interaction;
}
}

public bool RemoveCustomInteraction(BetterRigidbody body, int receiverLayer) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
if (_perRigidbodyData.TryGetValue(rbInstanceId, out var data)) {
return data.Remove(receiverLayer);
}
Expand All @@ -175,7 +208,11 @@ public bool RemoveCustomInteraction(BetterRigidbody body, int receiverLayer) {
}

public bool TryGetCustomInteraction(BetterRigidbody body, int receiverLayer, out OneWayLayerInteraction interaction) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
if (_perRigidbodyData.TryGetValue(rbInstanceId, out var data)) {
return data.TryGetValue(receiverLayer, out interaction);
}
Expand All @@ -185,9 +222,13 @@ public bool TryGetCustomInteraction(BetterRigidbody body, int receiverLayer, out
}

public void UpdateBodyLayer(BetterRigidbody body) {
#if UNITY_6000_4_OR_NEWER
var rbInstanceId = body.GetEntityId();
#else
var rbInstanceId = body.GetRigidbodyInstanceID();
#endif
_rigidbodyLayerMapping.Remove(rbInstanceId);
_rigidbodyLayerMapping[rbInstanceId] = body.PhysicsLayer;
}
}
}
}