internal static void MoveCollider(Collider coll) { Body body = coll.connectedBody; BodyType bodyType = body.BodyType; Transform t = coll.transform; if ((bodyType == BodyType.Kinematic) || (ApplicationSettings.Physics_MoveStaticColliders && bodyType == BodyType.Static)) { if (((t.changes & TransformChanges.Position) == TransformChanges.Position) || ((t.changes & TransformChanges.Rotation) == TransformChanges.Rotation)) { float rad = MathHelper.ToRadians(VectorConverter.Angle(t.eulerAngles, coll.to2dMode)); Microsoft.Xna.Framework.Vector2 pos = VectorConverter.Convert(t.position, coll.to2dMode); #if DEBUG Debug.LogIf(DebugSettings.LogColliderChanges, String.Format("Move {0} to {1} and rotate to {2}", coll, pos, rad)); #endif body.SetTransformIgnoreContacts(ref pos, rad); } if ((t.changes & TransformChanges.Scale) == TransformChanges.Scale) { #if DEBUG Debug.LogIf(DebugSettings.LogColliderChanges, String.Format("Resize collider {0}", coll)); #endif coll.ResizeConnectedBody(); } } }
public ColliderContact(Contact contact) { this.colliderA = contact.FixtureA.Body.UserData; this.colliderB = contact.FixtureB.Body.UserData; involvesATrigger = colliderA.isTrigger || colliderB.isTrigger; // Creates collisions Microsoft.Xna.Framework.Vector2 normal; FarseerPhysics.Common.FixedArray2 <Microsoft.Xna.Framework.Vector2> points; contact.GetWorldManifold(out normal, out points); collisionBToA = new Collision() { collider = colliderB, relativeVelocity = ((colliderA.rigidbody != null) ? colliderA.rigidbody.velocity : Vector3.zero) - ((colliderB.rigidbody != null) ? colliderB.rigidbody.velocity : Vector3.zero), contacts = new ContactPoint[contact.Manifold.PointCount] }; collisionAToB = new Collision() { collider = colliderA, relativeVelocity = ((colliderB.rigidbody != null) ? colliderB.rigidbody.velocity : Vector3.zero) - ((colliderA.rigidbody != null) ? colliderA.rigidbody.velocity : Vector3.zero), contacts = new ContactPoint[contact.Manifold.PointCount] }; for (int j = 0; j < collisionBToA.contacts.Length; j++) { collisionBToA.contacts[j].thisCollider = colliderB; collisionBToA.contacts[j].otherCollider = colliderA; collisionBToA.contacts[j].point = VectorConverter.Convert(points[j], colliderB.to2dMode); collisionBToA.contacts[j].normal = VectorConverter.Convert(-normal, colliderB.to2dMode); collisionAToB.contacts[j].thisCollider = colliderA; collisionAToB.contacts[j].otherCollider = colliderB; collisionAToB.contacts[j].point = VectorConverter.Convert(points[j], colliderA.to2dMode); collisionAToB.contacts[j].normal = VectorConverter.Convert(normal, colliderA.to2dMode); } }
internal static bool Raycast(Body body, Ray ray, out RaycastHit hitInfo, float distance) { RayCastOutput output; RayCastInput input = new RayCastInput() { Point1 = ray.origin, Point2 = ray.origin + ray.direction, MaxFraction = distance }; hitInfo = new RaycastHit() { body = body }; for (int i = 0; i < body.FixtureList.Count; i++) { if (body.FixtureList[i].RayCast(out output, ref input, 0)) { hitInfo.collider = body.UserData; hitInfo.transform = body.UserData.transform; hitInfo.normal = VectorConverter.Convert(output.Normal, body.UserData.to2dMode); hitInfo.distance = output.Fraction; hitInfo.point = ray.GetPoint(output.Fraction); return(true); } } return(false); }
public static bool Pointcast(Vector2 point, out RaycastHit hitInfo, int layerMask) { #if DEBUG Application.raycastTimer.Start(); #endif Fixture f = world.TestPointActive(point, layerMask); hitInfo = new RaycastHit(); if (f != null) { hitInfo.body = f.Body; hitInfo.collider = f.Body.UserData; hitInfo.transform = f.Body.UserData.transform; hitInfo.point = VectorConverter.Convert(point, f.Body.UserData.to2dMode); } #if DEBUG Application.raycastTimer.Stop(); #endif return(f != null); }
internal static float rayCastCallback(Fixture fixture, Microsoft.Xna.Framework.Vector2 point, Microsoft.Xna.Framework.Vector2 normal, float fraction) { float dist = _distance * fraction; Component uo = fixture.Body.UserData; Collider coll = uo as Collider; if (coll == null && (uo is Rigidbody)) { coll = (uo as Rigidbody).collider; } if ((coll != null) && (coll.gameObject != null) && (coll.gameObject.active) && (_layerMask & (1 << coll.gameObject.layer)) > 0) { if (_findClosest) { if (dist < _nearest) { _nearest = dist; _hit.body = fixture.Body; _hit.point = VectorConverter.Convert(point, coll.to2dMode); _hit.normal = VectorConverter.Convert(normal, coll.to2dMode); _hit.distance = dist; _hit.collider = coll; _hit.transform = coll.transform; _didHit = true; } return(fraction); } else { _hits[_hitCount].body = fixture.Body; _hits[_hitCount].collider = coll; _hits[_hitCount].distance = dist; _hits[_hitCount].normal = VectorConverter.Convert(normal, coll.to2dMode); _hits[_hitCount].point = VectorConverter.Convert(point, coll.to2dMode); _hits[_hitCount].transform = coll.transform; _hitCount++; return(1); } } return(-1); }
internal static Bounds FromAABB(ref AABB aabb, Physics.To2dMode to2dMode, Vector3 size) { Vector3 center = VectorConverter.Convert(aabb.Center, to2dMode); Vector3 sz = VectorConverter.Convert(aabb.Extents * 2, to2dMode); switch (to2dMode) { case Physics.To2dMode.DropX: sz.x = size.x; break; case Physics.To2dMode.DropY: sz.y = size.y; break; case Physics.To2dMode.DropZ: sz.z = size.z; break; } return(new Bounds(center, sz)); }
public static void Update(float elapsedTime) { #if DEBUG if (ApplicationSettings.ShowBodyCounter) { Debug.Display("Body count", world.BodyList.Count); } #endif world.Step(elapsedTime); for (int i = rigidBodies.Count - 1; i >= 0; i--) { Body body = rigidBodies[i]; Collider comp = (Collider)body.UserData; FarseerPhysics.Common.Transform t; body.GetTransform(out t); comp.transform.SetPositionFromPhysics(VectorConverter.Convert(t.Position, comp.to2dMode), t.Angle, VectorConverter.GetUp(comp.to2dMode)); } contactProcessor.Update(); }
public static RaycastHit[] PointcastAll(Vector2 point, int layerMask) { #if DEBUG Application.raycastTimer.Start(); #endif fList.Clear(); world.TestPointAllActive(point, fList, layerMask); RaycastHit[] hits = new RaycastHit[fList.Count]; for (int i = 0; i < fList.Count; i++) { Fixture f = fList[i]; RaycastHit hitInfo = new RaycastHit(); hitInfo.body = f.Body; hitInfo.collider = f.Body.UserData; hitInfo.transform = f.Body.UserData.transform; hitInfo.point = VectorConverter.Convert(point, f.Body.UserData.to2dMode); hits[i] = hitInfo; } #if DEBUG Application.raycastTimer.Stop(); #endif return(hits); }