forked from Unity-Technologies/EntityComponentSystemSamples
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVerifyCollisionEventData.cs
More file actions
93 lines (80 loc) · 3.67 KB
/
Copy pathVerifyCollisionEventData.cs
File metadata and controls
93 lines (80 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Physics.Systems;
using UnityEngine;
using UnityEngine.Assertions;
namespace Unity.Physics.Tests
{
public struct VerifyCollisionEventDataData : IComponentData
{
}
[Serializable]
public class VerifyCollisionEventData : MonoBehaviour, IConvertGameObjectToEntity
{
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
{
dstManager.AddComponentData(entity, new VerifyCollisionEventDataData());
#if HAVOK_PHYSICS_EXISTS
Havok.Physics.HavokConfiguration config = Havok.Physics.HavokConfiguration.Default;
config.EnableSleeping = 0;
dstManager.AddComponentData(entity, config);
#endif
}
}
[UpdateBefore(typeof(StepPhysicsWorld))]
public class VerifyCollisionEventDataSystem : JobComponentSystem
{
EntityQuery m_VerificationGroup;
StepPhysicsWorld m_StepPhysicsWorld;
protected override void OnCreate()
{
m_StepPhysicsWorld = World.GetOrCreateSystem<StepPhysicsWorld>();
m_VerificationGroup = GetEntityQuery(new EntityQueryDesc
{
All = new ComponentType[] { typeof(VerifyCollisionEventDataData) }
});
}
struct VerifyCollisionEventDataJob : ICollisionEventsJob
{
[ReadOnly]
public PhysicsWorld World;
[ReadOnly]
public NativeSlice<RigidBody> Bodies;
[ReadOnly]
public ComponentDataFromEntity<VerifyCollisionEventDataData> VerificationData;
public void Execute(CollisionEvent collisionEvent)
{
// Collision event is between a static and dynamic box.
// Verify all data in the provided event struct.
CollisionEvent.Details details = collisionEvent.CalculateDetails(ref World);
Assert.IsTrue(details.EstimatedImpulse >= 0.0f);
Assert.IsTrue(details.EstimatedContactPointPositions.Length == 4);
Assert.AreNotEqual(collisionEvent.BodyIndices.BodyAIndex, collisionEvent.BodyIndices.BodyBIndex);
Assert.AreEqual(collisionEvent.ColliderKeys.ColliderKeyA.Value, ColliderKey.Empty.Value);
Assert.AreEqual(collisionEvent.ColliderKeys.ColliderKeyB.Value, ColliderKey.Empty.Value);
Assert.AreEqual(collisionEvent.Entities.EntityA, Bodies[collisionEvent.BodyIndices.BodyAIndex].Entity);
Assert.AreEqual(collisionEvent.Entities.EntityB, Bodies[collisionEvent.BodyIndices.BodyBIndex].Entity);
Assert.AreApproximatelyEqual(collisionEvent.Normal.x, 0.0f, 0.01f);
Assert.AreApproximatelyEqual(collisionEvent.Normal.y, 1.0f, 0.01f);
Assert.AreApproximatelyEqual(collisionEvent.Normal.z, 0.0f, 0.01f);
}
}
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
SimulationCallbacks.Callback testCollisionEventCallback = (ref ISimulation simulation, ref PhysicsWorld world, JobHandle inDeps) =>
{
return new VerifyCollisionEventDataJob
{
World = world,
Bodies = world.Bodies,
VerificationData = GetComponentDataFromEntity<VerifyCollisionEventDataData>(true)
}.Schedule(simulation, ref world, inDeps);
};
m_StepPhysicsWorld.EnqueueCallback(SimulationCallbacks.Phase.PostSolveJacobians, testCollisionEventCallback, inputDeps);
return inputDeps;
}
}
}