/// Set the position of the body's origin and rotation. /// This breaks any contacts and wakes the other bodies. /// @param position the world position of the body's local origin. /// @param angle the world rotation in radians. public void SetXForm(Vector2 position, float angle) { Debug.Assert(_world.IsLocked == false); if (_world.IsLocked == true) { return; } _xf.R.Set(angle); _xf.Position = position; _sweep.c0 = _sweep.c = MathUtils.Multiply(ref _xf, _sweep.localCenter); _sweep.a0 = _sweep.a = angle; BroadPhase broadPhase = _world._contactManager._broadPhase; for (Fixture f = _fixtureList; f != null; f = f._next) { f.Synchronize(broadPhase, ref _xf, ref _xf); } _world._contactManager.FindNewContacts(); }
// We need separation create/destroy functions from the ructor/destructor because // the destructor cannot access the allocator or broad-phase (no destructor arguments allowed by C++). internal void Create(BroadPhase broadPhase, Body body, ref XForm xf, FixtureDef def) { _userData = def.userData; _friction = def.friction; _restitution = def.restitution; _density = def.density; _body = body; _next = null; _filter = def.filter; _isSensor = def.isSensor; _shape = def.shape.Clone(); // Create proxy in the broad-phase. AABB aabb; _shape.ComputeAABB(out aabb, ref xf); _proxyId = broadPhase.CreateProxy(ref aabb, this); }
/// Call this to draw shapes and other debug draw data. public void DrawDebugData() { if (DebugDraw == null) { return; } DebugDrawFlags flags = DebugDraw.Flags; if ((flags & DebugDrawFlags.Shape) == DebugDrawFlags.Shape) { for (Body b = _bodyList; b != null; b = b.GetNext()) { XForm xf; b.GetXForm(out xf); for (Fixture f = b.GetFixtureList(); f != null; f = f.GetNext()) { if (b.IsStatic) { DrawShape(f, xf, ColorEx.FromScRgb(0.5f, 0.9f, 0.5f)); } else if (b.IsSleeping) { DrawShape(f, xf, ColorEx.FromScRgb(0.5f, 0.5f, 0.9f)); } else { DrawShape(f, xf, ColorEx.FromScRgb(0.9f, 0.9f, 0.9f)); } } } } if ((flags & DebugDrawFlags.Joint) == DebugDrawFlags.Joint) { for (Joint j = _jointList; j != null; j = j.GetNext()) { if (j.JointType != JointType.Mouse) { DrawJoint(j); } } } if ((flags & DebugDrawFlags.Pair) == DebugDrawFlags.Pair) { // TODO } if ((flags & DebugDrawFlags.AABB) == DebugDrawFlags.AABB) { Color color = ColorEx.FromScRgb(0.9f, 0.3f, 0.9f); BroadPhase bp = _contactManager._broadPhase; for (Body b = _bodyList; b != null; b = b.GetNext()) { for (Fixture f = b.GetFixtureList(); f != null; f = f.GetNext()) { AABB aabb; bp.GetAABB(f._proxyId, out aabb); FixedArray8 <Vector2> vs = new FixedArray8 <Vector2>(); vs[0] = new Vector2(aabb.lowerBound.X, aabb.lowerBound.Y); vs[1] = new Vector2(aabb.upperBound.X, aabb.lowerBound.Y); vs[2] = new Vector2(aabb.upperBound.X, aabb.upperBound.Y); vs[3] = new Vector2(aabb.lowerBound.X, aabb.upperBound.Y); DebugDraw.DrawPolygon(ref vs, 4, color); } } } if ((flags & DebugDrawFlags.CenterOfMass) == DebugDrawFlags.CenterOfMass) { for (Body b = _bodyList; b != null; b = b.GetNext()) { XForm xf; b.GetXForm(out xf); xf.Position = b.GetWorldCenter(); DebugDraw.DrawXForm(ref xf); } } }