TrueSync: TSPhysics2D.cs Source File

TrueSync

TSPhysics2D.cs
1 using System;
2 
3 namespace TrueSync
4 {
5 
9  public class TSPhysics2D {
10 
11  public enum TSCapsuleDirection2D {
12 
13  VERTICAL,
14 
15  HORIZONTAL
16 
17  }
18 
19  private static FP POINT_RADIUS = 0.001f;
20 
21  private static object OverlapGeneric(Physics2D.Shape shape, TSVector2 position, Physics2D.BodySpecialSensor sensorType, int layerMask) {
22  Physics2D.World world = (Physics2D.World)Physics2DWorldManager.instance.GetWorld();
23 
24  Physics2D.Body body = Physics2D.BodyFactory.CreateBody(world);
25  body.CreateFixture(shape);
26 
27  body.BodyType = Physics2D.BodyType.Static;
28  body.IsSensor = true;
29  body.CollidesWith = Physics2D.Category.All;
30 
31  body.SpecialSensor = sensorType;
32  body.SpecialSensorMask = layerMask;
33  body.Position = position;
34 
35  world.RemoveBody(body);
36  world.ProcessRemovedBodies();
37 
38  if (body._specialSensorResults.Count > 0) {
39  if (sensorType == Physics2D.BodySpecialSensor.ActiveOnce) {
40  return Physics2DWorldManager.instance.GetGameObject(body._specialSensorResults[0]).GetComponent<TSCollider2D>();
41  } else {
42  TSCollider2D[] result = new TSCollider2D[body._specialSensorResults.Count];
43  for (int i = 0; i < body._specialSensorResults.Count; i++) {
44  result[i] = Physics2DWorldManager.instance.GetGameObject(body._specialSensorResults[i]).GetComponent<TSCollider2D>();
45  }
46 
47  return result;
48  }
49 
50  }
51 
52  return null;
53  }
54 
55  private static object _OverlapCircle(TSVector2 point, FP radius, Physics2D.BodySpecialSensor sensorType, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
56  return OverlapGeneric(new Physics2D.CircleShape(radius, 1), point, sensorType, layerMask);
57  }
58 
66  public static TSCollider2D OverlapCircle(TSVector2 point, FP radius, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
67  return (TSCollider2D) _OverlapCircle(point, radius, Physics2D.BodySpecialSensor.ActiveOnce, layerMask);
68  }
69 
77  public static TSCollider2D[] OverlapCircleAll(TSVector2 point, FP radius, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
78  return (TSCollider2D[]) _OverlapCircle(point, radius, Physics2D.BodySpecialSensor.ActiveAll, layerMask);
79  }
80 
88  public static object _OverlapArea(TSVector2 pointA, TSVector2 pointB, Physics2D.BodySpecialSensor sensorType, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
89  TSVector2 center;
90  center.x = (pointA.x + pointB.x) * FP.Half;
91  center.y = (pointA.y + pointB.y) * FP.Half;
92 
93  Physics2D.Vertices vertices = new Physics2D.Vertices(4);
94  vertices.Add(new TSVector2(pointA.x, pointA.y) - center);
95  vertices.Add(new TSVector2(pointB.x, pointA.y) - center);
96  vertices.Add(new TSVector2(pointB.x, pointB.y) - center);
97  vertices.Add(new TSVector2(pointA.x, pointB.y) - center);
98 
99  return OverlapGeneric(new Physics2D.PolygonShape(vertices, 1), center, sensorType, layerMask);
100  }
101 
109  public static TSCollider2D OverlapArea(TSVector2 pointA, TSVector2 pointB, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
110  return (TSCollider2D) _OverlapArea(pointA, pointB, Physics2D.BodySpecialSensor.ActiveOnce, layerMask);
111  }
112 
120  public static TSCollider2D[] OverlapAreaAll(TSVector2 pointA, TSVector2 pointB, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
121  return (TSCollider2D[]) _OverlapArea(pointA, pointB, Physics2D.BodySpecialSensor.ActiveAll, layerMask);
122  }
123 
130  public static TSCollider2D OverlapPoint(TSVector2 point, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
131  return (TSCollider2D)_OverlapCircle(point, POINT_RADIUS, Physics2D.BodySpecialSensor.ActiveOnce, layerMask);
132  }
133 
140  public static TSCollider2D[] OverlapPointAll(TSVector2 point, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
141  return (TSCollider2D[])_OverlapCircle(point, POINT_RADIUS, Physics2D.BodySpecialSensor.ActiveAll, layerMask);
142  }
143 
144  private static object _OverlapBox(TSVector2 point, TSVector2 size, FP angle, Physics2D.BodySpecialSensor sensorType, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
145  size *= FP.Half;
146  angle *= FP.Deg2Rad;
147 
148  return OverlapGeneric(new Physics2D.PolygonShape(Physics2D.PolygonTools.CreateRectangle(size.x, size.y, point, angle * -1), 1), point, sensorType, layerMask);
149  }
150 
159  public static TSCollider2D OverlapBox(TSVector2 point, TSVector2 size, FP angle, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
160  return (TSCollider2D) _OverlapBox(point, size, angle, Physics2D.BodySpecialSensor.ActiveOnce, layerMask);
161  }
162 
171  public static TSCollider2D[] OverlapBoxAll(TSVector2 point, TSVector2 size, FP angle, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
172  return (TSCollider2D[]) _OverlapBox(point, size, angle, Physics2D.BodySpecialSensor.ActiveAll, layerMask);
173  }
174 
175  private static object _OverlapCapsule(TSVector2 point, TSVector2 size, TSCapsuleDirection2D direction, FP angle, Physics2D.BodySpecialSensor sensorType, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
176  if (direction == TSCapsuleDirection2D.HORIZONTAL) {
177  FP aux = size.y;
178  size.y = size.x;
179  size.x = aux;
180 
181  angle += 90;
182  }
183 
184  FP radius = size.x * FP.Half;
185  Physics2D.Vertices capVerts = Physics2D.PolygonTools.CreateCapsule(size.y, radius, 8, radius, 8);
186 
187  Physics2D.PolygonTools.TransformVertices(capVerts, point, angle * FP.Deg2Rad * -1);
188 
189  return OverlapGeneric(new Physics2D.PolygonShape(capVerts, 1), point, sensorType, layerMask);
190  }
191 
201  public static TSCollider2D OverlapCapsule(TSVector2 point, TSVector2 size, TSCapsuleDirection2D direction, FP angle, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
202  return (TSCollider2D) _OverlapCapsule(point, size, direction, angle, Physics2D.BodySpecialSensor.ActiveOnce, layerMask);
203  }
204 
214  public static TSCollider2D[] OverlapCapsuleAll(TSVector2 point, TSVector2 size, TSCapsuleDirection2D direction, FP angle, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
215  return (TSCollider2D[]) _OverlapCapsule(point, size, direction, angle, Physics2D.BodySpecialSensor.ActiveAll, layerMask);
216  }
217 
218  public static object _CircleCast(TSVector2 origin, FP radius, TSVector2 direction, FP distance, Physics2D.BodySpecialSensor sensorType, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
219  if (distance + radius > FP.MaxValue) {
220  distance = FP.MaxValue - radius;
221  }
222 
223  direction.Normalize();
224 
225  TSVector2 offsetToCenter = ((direction * distance) * FP.Half);
226  offsetToCenter.x = FP.Abs(offsetToCenter.x);
227  offsetToCenter.y = FP.Abs(offsetToCenter.y);
228 
229  FP angle = TSVector2.Angle(direction, TSVector2.right);
230 
231  if (direction.x <= 0 && direction.y >= 0) {
232  offsetToCenter.x = -offsetToCenter.x;
233  } else if (direction.x <= 0 && direction.y <= 0) {
234  offsetToCenter.x = -offsetToCenter.x;
235  offsetToCenter.y = -offsetToCenter.y;
236  angle = -angle;
237  } else if (direction.x >= 0 && direction.y <= 0) {
238  offsetToCenter.y = -offsetToCenter.y;
239  angle = -angle;
240  }
241 
242  TSVector2 center = origin + offsetToCenter;
243 
244  object result = _OverlapCapsule(center, new TSVector2(distance + radius * 2, radius * 2), TSCapsuleDirection2D.HORIZONTAL, -angle, sensorType, layerMask);
245 
246  if (result is TSCollider2D) {
247  return new TSRaycastHit2D((TSCollider2D) result);
248  } else {
249  TSCollider2D[] resultAux = (TSCollider2D[]) result;
250  TSRaycastHit2D[] resultHit = new TSRaycastHit2D[resultAux.Length];
251 
252  for (int index = 0; index < resultHit.Length; index++) {
253  resultHit[index] = new TSRaycastHit2D(resultAux[index]);
254  }
255 
256  return resultHit;
257  }
258  }
259 
269  public static TSRaycastHit2D CircleCast(TSVector2 origin, FP radius, TSVector2 direction, FP distance, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
270  return (TSRaycastHit2D) _CircleCast(origin, radius, direction, distance, Physics2D.BodySpecialSensor.ActiveOnce, layerMask);
271  }
272 
282  public static TSRaycastHit2D[] CircleCastAll(TSVector2 origin, FP radius, TSVector2 direction, FP distance, int layerMask = UnityEngine.Physics.DefaultRaycastLayers) {
283  return (TSRaycastHit2D[]) _CircleCast(origin, radius, direction, distance, Physics2D.BodySpecialSensor.ActiveAll, layerMask);
284  }
285 
286  public static TSRaycastHit2D Raycast(TSVector2 origin, TSVector2 direction, FP distance) {
287  return Physics2DWorldManager.instance.Raycast(origin, direction, distance);
288  }
289 
290  public static TSRaycastHit2D[] RaycastAll(TSVector2 origin, TSVector2 direction, FP distance) {
291  return Physics2DWorldManager.instance.RaycastAll(origin, direction, distance);
292  }
293 
294  }
295 
296 }
static TSCollider2D OverlapBox(TSVector2 point, TSVector2 size, FP angle, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns the first TSCollider2D within a box area. Returns null if there is none.
Definition: TSPhysics2D.cs:159
static Physics2DWorldManager instance
Public access to a manager instance.
static TSRaycastHit2D CircleCast(TSVector2 origin, FP radius, TSVector2 direction, FP distance, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Cast a circle and returns a TSRaycastHit2D with information about the first TSCollider2D found...
Definition: TSPhysics2D.cs:269
static TSCollider2D[] OverlapPointAll(TSVector2 point, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns all TSCollider2D within a small circular area. Returns null if there is none.
Definition: TSPhysics2D.cs:140
static object _OverlapArea(TSVector2 pointA, TSVector2 pointB, Physics2D.BodySpecialSensor sensorType, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns the first TSCollider2D within a rectangular area. Returns null if there is none...
Definition: TSPhysics2D.cs:88
Information about a 2D cast hit.
static TSCollider2D OverlapCapsule(TSVector2 point, TSVector2 size, TSCapsuleDirection2D direction, FP angle, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns the first TSCollider2D within a capsule area. Returns null if there is none.
Definition: TSPhysics2D.cs:201
static TSCollider2D OverlapCircle(TSVector2 point, FP radius, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns the first TSCollider2D within a circular area. Returns null if there is none.
Definition: TSPhysics2D.cs:66
Manages the 2D physics simulation.
static TSCollider2D[] OverlapAreaAll(TSVector2 pointA, TSVector2 pointB, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns all TSCollider2D within a rectangular area. Returns null if there is none.
Definition: TSPhysics2D.cs:120
static TSCollider2D[] OverlapCapsuleAll(TSVector2 point, TSVector2 size, TSCapsuleDirection2D direction, FP angle, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns all TSCollider2D within a capsule area. Returns null if there is none.
Definition: TSPhysics2D.cs:214
static TSCollider2D[] OverlapBoxAll(TSVector2 point, TSVector2 size, FP angle, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns all TSCollider2D within a box area. Returns null if there is none.
Definition: TSPhysics2D.cs:171
static TSCollider2D OverlapArea(TSVector2 pointA, TSVector2 pointB, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns the first TSCollider2D within a rectangular area. Returns null if there is none...
Definition: TSPhysics2D.cs:109
static TSCollider2D[] OverlapCircleAll(TSVector2 point, FP radius, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns all TSCollider2D within a circular area. Returns null if there is none.
Definition: TSPhysics2D.cs:77
Helpers for 2D physics.
Definition: TSPhysics2D.cs:9
Abstract collider for 2D shapes.
Definition: TSCollider2D.cs:12
static TSCollider2D OverlapPoint(TSVector2 point, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Returns the first TSCollider2D within a small circular area. Returns null if there is none...
Definition: TSPhysics2D.cs:130
static TSRaycastHit2D[] CircleCastAll(TSVector2 origin, FP radius, TSVector2 direction, FP distance, int layerMask=UnityEngine.Physics.DefaultRaycastLayers)
Cast a circle and returns an array TSRaycastHit2D with information about all TSCollider2D found...
Definition: TSPhysics2D.cs:282
Generated by   doxygen 1.8.11