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);
            }
        }
Exemple #4
0
        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();
        }
Exemple #6
0
        public FixedLinearSpringBrush AddFixedLinearSpringBrushToCanvas(FixedLinearSpring spring)
        {
            FixedLinearSpringBrush fls = new FixedLinearSpringBrush();

            fls.FixedLinearSpring = spring;
            _simulatorCanvas.Children.Add(fls);
            drawingList.Add(fls);
            return(fls);
        }
Exemple #7
0
 private void SimulatorView_MouseLeftButtonUp(object sender, MouseEventArgs e)
 {
     if (_mousePickSpring != null && _mousePickSpring.IsDisposed == false)
     {
         _mousePickSpring.Dispose();
         _mousePickSpring = null;
         RemoveFixedLinearSpringBrush(_mouseSpringBrush);
     }
 }
Exemple #8
0
        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);
        }
Exemple #9
0
        protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonUp(e);

            if (mousePickSpring != null && mousePickSpring.IsDisposed == false)
            {
                mousePickSpring.Dispose();
                mousePickSpring = null;
                RemoveVisual(mouseSpringVisual);
            }
        }
Exemple #10
0
        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);
            }
        }
Exemple #11
0
        public FixedLinearSpringVisual AddFixedLinearSpringVisualToCanvas(FixedLinearSpring spring)
        {
            FixedLinearSpringVisual visual = new FixedLinearSpringVisual();

            if (spring != null)
            {
                new FixedLinearSpringVisualHelper(visual, spring);
            }

            AddVisualToCanvas(visual, null);

            return(visual);
        }
Exemple #12
0
        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;
        }
Exemple #14
0
        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);
        }