Ejemplo n.º 1
0
        public override async void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver)
        {
            var selectedItem = RootSelection;

            ActiveSelectedItem = selectedItem;

            if (MouseIsOver || MouseDownOnControl)
            {
                diameterValueDisplayInfo.Visible = true;
            }
            else if (!hadClickOnControl || scaleController.HasChange)
            {
                diameterValueDisplayInfo.Visible = false;
            }

            if (MouseDownOnControl && hitPlane != null)
            {
                var info = hitPlane.GetClosestIntersection(mouseEvent3D.MouseRay);

                if (info != null &&
                    selectedItem != null)
                {
                    var delta = info.HitPosition - initialHitPosition;

                    var lockedBottomCenter = ObjectSpace.GetCenterPosition(selectedItem, placement);

                    var(hit, otherSide) = GetHitIndices(selectedItem);
                    var grabPositionEdge  = ObjectSpace.GetEdgePosition(selectedItem, otherSide);
                    var stretchDirection  = (ObjectSpace.GetEdgePosition(selectedItem, hit) - grabPositionEdge).GetNormal();
                    var deltaAlongStretch = stretchDirection.Dot(delta);

                    // scale it
                    var newSize = scaleController.InitialState.Diameters[diameterIndex];
                    newSize += deltaAlongStretch * 2;
                    newSize  = Math.Max(Math.Max(newSize, .001), Object3DControlContext.SnapGridDistance);

                    if (Object3DControlContext.SnapGridDistance > 0)
                    {
                        // snap this position to the grid
                        double snapGridDistance = Object3DControlContext.SnapGridDistance;

                        // snap this position to the grid
                        newSize = ((int)((newSize / snapGridDistance) + .5)) * snapGridDistance;
                    }

                    scaleController.ScaleDiameter(newSize, diameterIndex);

                    await selectedItem.Rebuild();

                    // and keep the locked edge in place
                    Vector3 newBottomCenter = ObjectSpace.GetCenterPosition(selectedItem, placement);

                    selectedItem.Matrix *= Matrix4X4.CreateTranslation(lockedBottomCenter - newBottomCenter);

                    Invalidate();
                }
            }

            base.OnMouseMove(mouseEvent3D, mouseIsOver);
        }
        public override void OnMouseDown(Mouse3DEventArgs mouseEvent3D)
        {
            var selectedItem = RootSelection;

            ActiveSelectedItem = selectedItem;

            if (mouseEvent3D.MouseEvent2D.Button == MouseButtons.Left &&
                mouseEvent3D.info != null &&
                selectedItem != null)
            {
                hadClickOnControl = true;

                xValueDisplayInfo.Visible = true;
                yValueDisplayInfo.Visible = true;

                var edge0 = ObjectSpace.GetEdgePosition(selectedItem, quadrantIndex);
                var edge1 = ObjectSpace.GetEdgePosition(selectedItem, quadrantIndex + 1);
                var edge3 = ObjectSpace.GetEdgePosition(selectedItem, quadrantIndex + 2);

                var normal01    = (edge1 - edge0).GetNormal();
                var normal03    = (edge3 - edge0).GetNormal();
                var planeNormal = normal01.Cross(normal03).GetNormal();
                hitPlane = new PlaneShape(new Plane(planeNormal, edge0), null);

                initialHitPosition = mouseEvent3D.info.HitPosition;
                scaleController    = new ScaleController(Object3DControlContext, getWidth, setWidth, getDepth, setDepth, getHeight, setHeight);

                Object3DControlContext.Scene.ShowSelectionShadow = false;
            }

            base.OnMouseDown(mouseEvent3D);
        }
        private async void EditComplete(object s, EventArgs e)
        {
            var newWidth = xValueDisplayInfo.Value != 0 ? xValueDisplayInfo.Value : scaleController.FinalState.Width;
            var newDepth = yValueDisplayInfo.Value != 0 ? yValueDisplayInfo.Value : scaleController.FinalState.Depth;

            Vector3 lockedEdge = ObjectSpace.GetEdgePosition(ActiveSelectedItem, edgeIndex + 2);

            if (edgeIndex % 2 == 1)
            {
                if (newWidth == scaleController.FinalState.Width)
                {
                    return;
                }
                scaleController.ScaleWidth(newWidth);
            }
            else
            {
                if (newDepth == scaleController.FinalState.Depth)
                {
                    return;
                }
                scaleController.ScaleDepth(newDepth);
            }
            await ActiveSelectedItem.Rebuild();

            // and keep the locked edge in place
            Vector3 newLockedEdge = ObjectSpace.GetEdgePosition(ActiveSelectedItem, edgeIndex + 2);

            ActiveSelectedItem.Translate(lockedEdge - newLockedEdge);

            scaleController.EditComplete();
            // make a new controller so we will have new undo data
            scaleController = new ScaleController(Object3DControlContext, getWidth, setWidth, getDepth, setDepth, getHeight, setHeight);
        }
        public override void OnMouseDown(Mouse3DEventArgs mouseEvent3D)
        {
            var selectedItem = RootSelection;

            ActiveSelectedItem = selectedItem;

            if (mouseEvent3D.MouseEvent2D.Button == MouseButtons.Left &&
                mouseEvent3D.info != null &&
                selectedItem != null)
            {
                hadClickOnControl = true;

                xValueDisplayInfo.Visible = true;
                yValueDisplayInfo.Visible = true;

                var edge      = ObjectSpace.GetEdgePosition(selectedItem, edgeIndex);
                var otherSide = ObjectSpace.GetEdgePosition(selectedItem, edgeIndex + 2);

                var upNormal    = (edge - otherSide).GetNormal();
                var sideNormal  = upNormal.Cross(mouseEvent3D.MouseRay.directionNormal).GetNormal();
                var planeNormal = upNormal.Cross(sideNormal).GetNormal();
                hitPlane = new PlaneShape(new Plane(planeNormal, mouseEvent3D.info.HitPosition), null);

                initialHitPosition = mouseEvent3D.info.HitPosition;

                scaleController = new ScaleController(Object3DControlContext, getWidth, setWidth, getDepth, setDepth, getHeight, setHeight);

                Object3DControlContext.Scene.ShowSelectionShadow = false;
            }

            base.OnMouseDown(mouseEvent3D);
        }
Ejemplo n.º 5
0
        private (int edge, int otherSide) GetHitIndices(IObject3D selectedItem)
        {
            var bestZEdgePosition = -1;
            var otherSide         = -1;
            var bestCornerZ       = double.PositiveInfinity;

            // get the closest z on the bottom in view space
            for (int i = 0; i < 4; i++)
            {
                Vector3 cornerPosition    = ObjectSpace.GetEdgePosition(selectedItem, i, placement);
                Vector3 cornerScreenSpace = Object3DControlContext.World.WorldToScreenSpace(cornerPosition);
                if (cornerScreenSpace.Z < bestCornerZ)
                {
                    bestCornerZ       = cornerScreenSpace.Z;
                    bestZEdgePosition = i;
                    otherSide         = (i + 2) % 4;
                }
            }

            return(bestZEdgePosition, otherSide);
        }
        public override void SetPosition(IObject3D selectedItem, MeshSelectInfo selectInfo)
        {
            // create the transform for the box
            Vector3 edgePosition = ObjectSpace.GetEdgePosition(selectedItem, edgeIndex);

            Vector3 boxCenter = edgePosition;

            double distBetweenPixelsWorldSpace = Object3DControlContext.World.GetWorldUnitsPerScreenPixelAtPosition(edgePosition);

            switch (edgeIndex)
            {
            case 0:
                boxCenter.Y += selectCubeSize / 2 * distBetweenPixelsWorldSpace;
                break;

            case 1:
                boxCenter.X -= selectCubeSize / 2 * distBetweenPixelsWorldSpace;
                break;

            case 2:
                boxCenter.Y -= selectCubeSize / 2 * distBetweenPixelsWorldSpace;
                break;

            case 3:
                boxCenter.X += selectCubeSize / 2 * distBetweenPixelsWorldSpace;
                break;
            }

            boxCenter.Z += selectCubeSize / 2 * distBetweenPixelsWorldSpace;

            var rotation = Matrix4X4.CreateRotation(new Quaternion(selectedItem.Matrix));

            var centerMatrix = Matrix4X4.CreateTranslation(boxCenter);

            centerMatrix   = rotation * Matrix4X4.CreateScale(distBetweenPixelsWorldSpace) * centerMatrix;
            TotalTransform = centerMatrix;
        }
        public override async void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver)
        {
            var selectedItem = RootSelection;

            ActiveSelectedItem = selectedItem;

            if (MouseIsOver || MouseDownOnControl)
            {
                xValueDisplayInfo.Visible = true;
                yValueDisplayInfo.Visible = true;
            }
            else if (!hadClickOnControl || scaleController.HasChange)
            {
                xValueDisplayInfo.Visible = false;
                yValueDisplayInfo.Visible = false;
            }

            if (MouseDownOnControl && hitPlane != null)
            {
                var info = hitPlane.GetClosestIntersection(mouseEvent3D.MouseRay);

                if (info != null &&
                    selectedItem != null)
                {
                    var delta = info.HitPosition - initialHitPosition;

                    var lockedEdge = ObjectSpace.GetEdgePosition(selectedItem, edgeIndex + 2);

                    var stretchDirection  = (ObjectSpace.GetEdgePosition(selectedItem, edgeIndex) - lockedEdge).GetNormal();
                    var deltaAlongStretch = stretchDirection.Dot(delta);

                    // scale it
                    var newSize = new Vector2(scaleController.InitialState.Width, scaleController.InitialState.Depth);
                    if (edgeIndex % 2 == 1)
                    {
                        newSize.X += deltaAlongStretch;
                        newSize.X  = Math.Max(Math.Max(newSize.X, .001), Object3DControlContext.SnapGridDistance);
                    }
                    else
                    {
                        newSize.Y += deltaAlongStretch;
                        newSize.Y  = Math.Max(Math.Max(newSize.Y, .001), Object3DControlContext.SnapGridDistance);
                    }

                    if (Object3DControlContext.SnapGridDistance > 0)
                    {
                        // snap this position to the grid
                        double snapGridDistance = Object3DControlContext.SnapGridDistance;

                        // snap this position to the grid
                        if (edgeIndex % 2 == 1)
                        {
                            newSize.X = ((int)((newSize.X / snapGridDistance) + .5)) * snapGridDistance;
                        }
                        else
                        {
                            newSize.Y = ((int)((newSize.Y / snapGridDistance) + .5)) * snapGridDistance;
                        }
                    }

                    if (edgeIndex % 2 == 1)
                    {
                        scaleController.ScaleWidth(newSize.X);
                    }
                    else
                    {
                        scaleController.ScaleDepth(newSize.Y);
                    }

                    await selectedItem.Rebuild();

                    // and keep the locked edge in place
                    Vector3 newLockedEdge = ObjectSpace.GetEdgePosition(selectedItem, edgeIndex + 2);

                    selectedItem.Matrix *= Matrix4X4.CreateTranslation(lockedEdge - newLockedEdge);

                    Invalidate();
                }
            }

            base.OnMouseMove(mouseEvent3D, mouseIsOver);
        }