private void HandleMouseInput(InputState input) { Vector2 point = new Vector2(input.CurrentMouseState.X, input.CurrentMouseState.Y); if (input.LastMouseState.LeftButton == ButtonState.Released && input.CurrentMouseState.LeftButton == ButtonState.Pressed) { //create mouse spring _pickedGeom = PhysicsSimulator.Collide(point); if (_pickedGeom != null) { _mousePickSpring = SpringFactory.Instance.CreateFixedLinearSpring(PhysicsSimulator, _pickedGeom.Body, _pickedGeom.Body. GetLocalPosition(point), point, 20, 10); } } else if (input.LastMouseState.LeftButton == ButtonState.Pressed && input.CurrentMouseState.LeftButton == ButtonState.Released) { //destroy mouse spring if (_mousePickSpring != null && _mousePickSpring.IsDisposed == false) { _mousePickSpring.Dispose(); _mousePickSpring = null; } } //move anchor point if (input.CurrentMouseState.LeftButton == ButtonState.Pressed && _mousePickSpring != null) { _mousePickSpring.WorldAttachPoint = point; } }
private void DrawSprings(SpriteBatch spriteBatch) { for (int i = 0; i < _physicsSimulator.SpringList.Count; i++) { if (!(_physicsSimulator.SpringList[i] is FixedLinearSpring)) { continue; } FixedLinearSpring fixedLinearSpring = (FixedLinearSpring)_physicsSimulator.SpringList[i]; _worldAttachPoint = fixedLinearSpring.WorldAttachPoint; _body1AttachPointInWorldCoordinates = fixedLinearSpring.Body.GetWorldPosition(fixedLinearSpring.BodyAttachPoint); _springCircleBrush.Draw(spriteBatch, _body1AttachPointInWorldCoordinates); _springCircleBrush.Draw(spriteBatch, _worldAttachPoint); Vector2.Lerp(ref _worldAttachPoint, ref _body1AttachPointInWorldCoordinates, .25f, out _vectorTemp1); _springCircleBrush.Draw(spriteBatch, _vectorTemp1); Vector2.Lerp(ref _worldAttachPoint, ref _body1AttachPointInWorldCoordinates, .50f, out _vectorTemp1); _springCircleBrush.Draw(spriteBatch, _vectorTemp1); Vector2.Lerp(ref _worldAttachPoint, ref _body1AttachPointInWorldCoordinates, .75f, out _vectorTemp1); _springCircleBrush.Draw(spriteBatch, _vectorTemp1); _springLineBrush.Draw(spriteBatch, _body1AttachPointInWorldCoordinates, fixedLinearSpring.WorldAttachPoint); } for (int i = 0; i < _physicsSimulator.SpringList.Count; i++) { if (!(_physicsSimulator.SpringList[i] is LinearSpring)) { continue; } LinearSpring linearSpring = (LinearSpring)_physicsSimulator.SpringList[i]; _attachPoint1 = linearSpring.AttachPoint1; _attachPoint2 = linearSpring.AttachPoint2; linearSpring.Body1.GetWorldPosition(ref _attachPoint1, out _body1AttachPointInWorldCoordinates); linearSpring.Body2.GetWorldPosition(ref _attachPoint2, out _body2AttachPointInWorldCoordinates); _springCircleBrush.Draw(spriteBatch, _body1AttachPointInWorldCoordinates); _springCircleBrush.Draw(spriteBatch, _body2AttachPointInWorldCoordinates); Vector2.Lerp(ref _body1AttachPointInWorldCoordinates, ref _body2AttachPointInWorldCoordinates, .25f, out _vectorTemp1); _springCircleBrush.Draw(spriteBatch, _vectorTemp1); Vector2.Lerp(ref _body1AttachPointInWorldCoordinates, ref _body2AttachPointInWorldCoordinates, .50f, out _vectorTemp1); _springCircleBrush.Draw(spriteBatch, _vectorTemp1); Vector2.Lerp(ref _body1AttachPointInWorldCoordinates, ref _body2AttachPointInWorldCoordinates, .75f, out _vectorTemp1); _springCircleBrush.Draw(spriteBatch, _vectorTemp1); _springLineBrush.Draw(spriteBatch, _body1AttachPointInWorldCoordinates, _body2AttachPointInWorldCoordinates); } }
void polygon_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Vector2 point = new Vector2((float)(e.GetPosition(_parentCanvas).X), (float)(e.GetPosition(_parentCanvas).Y)); _pickedSprite = (sender as PhysicsSprite); _pickedSprite.CaptureMouse(); if (MousePickEnabled) { if (_pickedSprite != null) { _mousePickSpring = ControllerFactory.Instance.CreateFixedLinearSpring(Simulator, _pickedSprite.BodyObject, _pickedSprite.BodyObject.GetLocalPosition(point), point, 10, 5); _lineShowSpring.X1 = point.X; _lineShowSpring.Y1 = point.Y; _lineShowSpring.X2 = point.X; _lineShowSpring.Y2 = point.Y; _lineShowSpring.Visibility = Visibility.Visible; e.Handled = true; } } if (MouseLeftButtonDown != null) { MouseLeftButtonDown(_pickedSprite.Name); } }
public FixedLinearSpring CreateFixedLinearSpring(Body body, Vector2 bodyAttachPoint, Vector2 worldAttachPoint, float springConstant, float dampningConstant) { FixedLinearSpring fixedSpring = new FixedLinearSpring(body, bodyAttachPoint, worldAttachPoint, springConstant, dampningConstant); return(fixedSpring); }
public FixedLinearSpringVisualHelper(ILinearSpringVisual visual, FixedLinearSpring spring) { this.visual = visual; this.spring = spring; spring.SpringUpdated += OnSpringUpdated; Update(); }
public FixedLinearSpringBrush AddFixedLinearSpringBrushToCanvas(FixedLinearSpring spring) { FixedLinearSpringBrush fls = new FixedLinearSpringBrush(); fls.FixedLinearSpring = spring; _simulatorCanvas.Children.Add(fls); drawingList.Add(fls); return(fls); }
private void SimulatorView_MouseLeftButtonUp(object sender, MouseEventArgs e) { if (_mousePickSpring != null && _mousePickSpring.IsDisposed == false) { _mousePickSpring.Dispose(); _mousePickSpring = null; RemoveFixedLinearSpringBrush(_mouseSpringBrush); } }
public FixedLinearSpring CreateFixedLinearSpring(PhysicsSimulator physicsSimulator, Body body, Vector2 bodyAttachPoint, Vector2 worldAttachPoint, float springConstant, float dampningConstant) { FixedLinearSpring fixedSpring = CreateFixedLinearSpring(body, bodyAttachPoint, worldAttachPoint, springConstant, dampningConstant); physicsSimulator.Add(fixedSpring); return(fixedSpring); }
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) { base.OnMouseLeftButtonUp(e); if (mousePickSpring != null && mousePickSpring.IsDisposed == false) { mousePickSpring.Dispose(); mousePickSpring = null; RemoveVisual(mouseSpringVisual); } }
private void SimulatorView_MouseLeftButtonDown(object sender, MouseEventArgs e) { Vector2 point = new Vector2((float)(e.GetPosition(this).X), (float)(e.GetPosition(this).Y)); _pickedGeom = physicsSimulator.Collide(point); if (_pickedGeom != null) { _mousePickSpring = SpringFactory.Instance.CreateFixedLinearSpring(physicsSimulator, _pickedGeom.Body, _pickedGeom.Body.GetLocalPosition( point), point, 20, 10); _mouseSpringBrush = AddFixedLinearSpringBrushToCanvas(_mousePickSpring); } }
public FixedLinearSpringVisual AddFixedLinearSpringVisualToCanvas(FixedLinearSpring spring) { FixedLinearSpringVisual visual = new FixedLinearSpringVisual(); if (spring != null) { new FixedLinearSpringVisualHelper(visual, spring); } AddVisualToCanvas(visual, null); return(visual); }
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); Vector2 point = new Vector2((float)(e.GetPosition(this).X), (float)(e.GetPosition(this).Y)); pickedGeom = physicsSimulator.Collide(point); if (pickedGeom != null) { mousePickSpring = SpringFactory.Instance.CreateFixedLinearSpring(physicsSimulator, pickedGeom.Body, pickedGeom.Body.GetLocalPosition( point), point, 20, 10); mouseSpringVisual = AddFixedLinearSpringVisualToCanvas(mousePickSpring); } }
void polygon_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (_pickedSprite != null) { _pickedSprite.ReleaseMouseCapture(); } if (_mousePickSpring != null && _mousePickSpring.IsDisposed == false) { _mousePickSpring.Dispose(); _mousePickSpring = null; _lineShowSpring.Visibility = Visibility.Collapsed; e.Handled = true; } if (MouseLeftButtonUp != null && _pickedSprite != null) { MouseLeftButtonUp(_pickedSprite.Name); } _pickedSprite = null; }
protected override void Update(GameTime gameTime) { padState = GamePad.GetState(PlayerIndex.One); keyState = Keyboard.GetState(); mouseState = Mouse.GetState(); // let the user escape the demo if (PressedOnce(Keys.Escape, Buttons.Back)) { this.Exit(); } // change threading mode if (PressedOnce(Keys.M, Buttons.A)) { multithread = !multithread; } #region drag and drop physical objects with the mouse JVector mouseLocation = Camera.ScreenToWorldSpace(new JVector(mouseState.X, mouseState.Y)); // MouseDown if (mouseState.LeftButton == ButtonState.Pressed && mousePreviousState.LeftButton == ButtonState.Released) { JBBox mouseBox = new JBBox(mouseLocation - new JVector(0.01f), mouseLocation + new JVector(0.01f)); World.CollisionSystem.Query((foundItem) => { grabBody = foundItem as RigidBody; // don't continue return(false); }, ref mouseBox); if (grabBody != null) { if (grabSpring != null) { World.RemoveSpring(grabSpring); } // convert mouse coordinates to foundBody's local space var localMouseLocation = JVector.Transform(mouseLocation - grabBody.Position, JMatrix.CreateRotationZ(-grabBody.Orientation)); grabBody.IsActive = true; grabSpring = new FixedLinearSpring(grabBody, localMouseLocation, mouseLocation, 50 * grabBody.Mass, 15 * grabBody.Mass); grabSpring.IsOnlyPull = true; grabSpring.Length = 1; World.AddSpring(grabSpring); } } // MouseMove if (mouseState.LeftButton == ButtonState.Pressed) { if (grabBody != null) { grabSpring.WorldAnchor = mouseLocation; } } // MouseUp else if (mouseState.LeftButton == ButtonState.Released && mousePreviousState.LeftButton == ButtonState.Pressed) { if (grabSpring != null) { World.RemoveSpring(grabSpring); } grabSpring = null; grabBody = null; } #endregion #region create random primitives Random r = new Random(); if (PressedOnce(Keys.Space, Buttons.B)) { Random rand = new Random(); RigidBody body = new RigidBody(new BoxShape(5.5f, 5.5f)) { EnableDebugDraw = true, //Position = new JVector((float)rand.NextDouble(), 0), AngularVelocity = 0, LinearVelocity = new JVector(0, -10), Orientation = 0.0f,//0.001f + (float)rand.NextDouble(), Material = new Material() { DynamicFriction = 1f, StaticFriction = 1f, Restitution = 0f, }, Position = new JVector(0, 15), }; World.AddBody(body); } #endregion #region switch through physic scenes if (PressedOnce(Keys.Add, Buttons.X)) { DestroyCurrentScene(); currentScene++; currentScene = currentScene % PhysicScenes.Count; PhysicScenes[currentScene].Build(); } if (PressedOnce(Keys.Subtract, Buttons.Y)) { DestroyCurrentScene(); currentScene += PhysicScenes.Count - 1; currentScene = currentScene % PhysicScenes.Count; PhysicScenes[currentScene].Build(); } #endregion UpdateDisplayText(gameTime); float step = (float)gameTime.ElapsedGameTime.TotalSeconds; if (step > 1.0f / 60.0f) { step = 1.0f / 60.0f; } World.Step(step, multithread); // TODO - add options for variable timestep vs fixed //World.Step((float)gameTime.ElapsedGameTime.TotalSeconds, multithread, 1f/ 100f, 1); gamePadPreviousState = padState; keyboardPreviousState = keyState; mousePreviousState = mouseState; base.Update(gameTime); }