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); }
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); }