forked from Unity-Technologies/EntityComponentSystemSamples
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathImmediatePhysicsWorldStepper.cs
More file actions
100 lines (88 loc) · 3.42 KB
/
Copy pathImmediatePhysicsWorldStepper.cs
File metadata and controls
100 lines (88 loc) · 3.42 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
94
95
96
97
98
99
100
using System;
using Unity.Collections;
using Unity.Entities;
namespace Unity.Physics.Systems
{
/// <summary>
/// Utility class for running physics simulation immediately on the main thread.
/// Not suitable for a field in an ECS job!
/// </summary>
public struct ImmediatePhysicsWorldStepper : IDisposable
{
// Simulation context
public SimulationContext SimulationContext;
#if HAVOK_PHYSICS_EXISTS
public Havok.Physics.SimulationContext HavokSimulationContext;
#endif
public bool Created;
/// <summary>
/// Create method. Use this instead of constructor.
/// </summary>
public static ImmediatePhysicsWorldStepper Create()
{
ImmediatePhysicsWorldStepper instance = new ImmediatePhysicsWorldStepper();
instance.Created = true;
instance.SimulationContext = new SimulationContext();
#if HAVOK_PHYSICS_EXISTS
instance.HavokSimulationContext = new Havok.Physics.SimulationContext(Havok.Physics.HavokConfiguration.Default);
#endif
return instance;
}
#if HAVOK_PHYSICS_EXISTS
/// <summary>
/// Create method. Provides an option to pass in HavokConfiguration (for example, VDB options).
/// </summary>
/// <param name="havokConfiguration"></param>
public static ImmediatePhysicsWorldStepper Create(Havok.Physics.HavokConfiguration havokConfiguration)
{
ImmediatePhysicsWorldStepper instance = new ImmediatePhysicsWorldStepper();
instance.Created = true;
instance.SimulationContext = new SimulationContext();
instance.HavokSimulationContext = new Havok.Physics.SimulationContext(havokConfiguration);
return instance;
}
#endif
/// <summary>
/// Steps the UnityPhysics simulation (on current thread)
/// </summary>
public static void StepUnityPhysicsSimulationImmediate(in SimulationStepInput stepInput, ref SimulationContext simulationContext)
{
Simulation.StepImmediate(stepInput, ref simulationContext);
}
#if HAVOK_PHYSICS_EXISTS
/// <summary>
/// Steps the HavokPhysics simulation (on current thread)
/// </summary>
public static void StepHavokPhysicsSimulationImmediate(in SimulationStepInput stepInput, ref Havok.Physics.SimulationContext havokSimulationContext)
{
Havok.Physics.HavokSimulation.StepImmediate(stepInput, ref havokSimulationContext);
}
#endif
public void Dispose()
{
SimulationContext.Dispose();
#if HAVOK_PHYSICS_EXISTS
HavokSimulationContext.Dispose();
#endif
Created = false;
}
/// <summary>
/// Prepares simulation context and steps the simulation (on current thread)
/// </summary>
public void StepImmediate(SimulationType simType, ref PhysicsWorld physicsWorld, in SimulationStepInput stepInput)
{
if (simType == SimulationType.UnityPhysics)
{
SimulationContext.Reset(stepInput);
Simulation.StepImmediate(stepInput, ref SimulationContext);
}
#if HAVOK_PHYSICS_EXISTS
else
{
HavokSimulationContext.Reset(ref physicsWorld);
Havok.Physics.HavokSimulation.StepImmediate(stepInput, ref HavokSimulationContext);
}
#endif
}
}
}