FixedSlidingHingeJoint CreateBorderJoint(Orientation orientation) { FixedSlidingHingeJoint joint = new FixedSlidingHingeJoint(Body, new Vector2D(0, 0), new Lifespan(), orientation); joint.Softness = borderSoftness; engine.AddJoint(joint); return joint; }
void PhysicsTimerCallback(double dt, double trueDt) { engine.Update(dt, trueDt); if (Body != null) { Vector2D position = -Body.State.Position.Linear; Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { ScrollToHorizontalOffset(position.X); ScrollToVerticalOffset(position.Y); })); if (position.X < ContentDecorator.BORDER) { if (horizontalJoint == null) { Body.State.Position.Linear = new Vector2D(-ContentDecorator.BORDER, -position.Y); horizontalJoint = CreateBorderJoint(Orientation.Horizontal); } } else if (position.X > ScrollableWidth - ContentDecorator.BORDER) { if (horizontalJoint == null) { Body.State.Position.Linear = new Vector2D(-ScrollableWidth + ContentDecorator.BORDER, -position.Y); horizontalJoint = CreateBorderJoint(Orientation.Horizontal); } } else if (firstContactId.HasValue && horizontalJoint != null) { horizontalJoint.Lifetime.IsExpired = true; horizontalJoint = null; } if (position.Y < ContentDecorator.BORDER) { if (verticalJoint == null) { Body.State.Position.Linear = new Vector2D(-position.X, -ContentDecorator.BORDER); verticalJoint = CreateBorderJoint(Orientation.Vertical); } } else if (position.Y > ScrollableHeight - ContentDecorator.BORDER) { if (verticalJoint == null) { Body.State.Position.Linear = new Vector2D(-position.X, -ScrollableHeight + ContentDecorator.BORDER); verticalJoint = CreateBorderJoint(Orientation.Vertical); } } else if (firstContactId.HasValue && verticalJoint != null) { verticalJoint.Lifetime.IsExpired = true; verticalJoint = null; } } }