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; hitPlane = new PlaneShape(Vector3.UnitZ, mouseEvent3D.info.HitPosition.Z, null); originalPointToMove = GetEdgePosition(selectedItem, edgeIndex); initialHitPosition = mouseEvent3D.info.HitPosition; transformOnMouseDown = transformAppliedByThis = selectedItem.Matrix; mouseDownSelectedBounds = selectedItem.GetAxisAlignedBoundingBox(); } base.OnMouseDown(mouseEvent3D); }
public override void OnMouseUp(MouseEventArgs mouseEvent) { Invalidate(); if (SuppressUiVolumes) { return; } Ray ray = this.World.GetRayForLocalBounds(mouseEvent.Position); bool anyInteractionVolumeHit = FindInteractionVolumeHit(ray, out InteractionVolume iaVolume, out IntersectInfo info); var mouseEvent3D = new Mouse3DEventArgs(mouseEvent, ray, info); if (MouseDownOnInteractionVolume && mouseDownIAVolume != null) { mouseDownIAVolume.OnMouseUp(mouseEvent3D); SelectedInteractionVolume = null; mouseDownIAVolume = null; } else { mouseDownIAVolume = null; if (anyInteractionVolumeHit) { iaVolume.OnMouseUp(mouseEvent3D); } SelectedInteractionVolume = null; } base.OnMouseUp(mouseEvent); }
public override void OnMouseMove(MouseEventArgs mouseEvent) { lastMouseMovePosition = mouseEvent.Position; base.OnMouseMove(mouseEvent); if (SuppressObject3DControls || !this.PositionWithinLocalBounds(mouseEvent.X, mouseEvent.Y) || !CanSelectObject()) { return; } Ray ray = this.World.GetRayForLocalBounds(mouseEvent.Position); IntersectInfo info = null; var mouseEvent3D = new Mouse3DEventArgs(mouseEvent, ray, info); if (MouseDownOnObject3DControlVolume && mouseDownObject3DControl != null) { mouseDownObject3DControl.OnMouseMove(mouseEvent3D, false); } else { this.FindHitObject3DControl(ray, out IObject3DControl hitObject3DControl, out _); var object3DControls = this.Object3DControls; var overControl = false; foreach (var object3DControl in object3DControls) { if (hitObject3DControl == object3DControl && hitObject3DControl.Visible) { overControl = true; // we have found the control that got hit, wait 200 ms to see if we are still over the same control UiThread.RunOnIdle(() => { var ray2 = this.World.GetRayForLocalBounds(lastMouseMovePosition); this.FindHitObject3DControl(ray2, out IObject3DControl stillOver3DControl, out _); if (stillOver3DControl == hitObject3DControl) { // we are over the same control as the last mouse move so set the hovered object to it HoveredObject3DControl = object3DControl; object3DControl.OnMouseMove(mouseEvent3D, true); } }, .2); } else { object3DControl.OnMouseMove(mouseEvent3D, false); } } if (overControl && hitObject3DControl is Object3DControl object3DControl2 && object3DControl2.RootSelection != null) { ApplicationController.Instance.UiHint = "Click to edit values".Localize(); }
public override void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { if (mouseEvent3D.info != null && mouseEvent3D.MouseEvent2D.Button == MouseButtons.Left && Object3DControlContext.Scene.SelectedItem != null) { hadClickOnControl = true; activeSelectedItem = RootSelection; heightValueDisplayInfo.Visible = true; var selectedItem = activeSelectedItem; var bottomPosition = GetBottomPosition(selectedItem); var topPosition = GetTopPosition(selectedItem); var upNormal = (topPosition - bottomPosition).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); originalPointToMove = GetTopPosition(selectedItem); initialHitPosition = mouseEvent3D.info.HitPosition; if (selectedItem is IObjectWithHeight heightObject) { heightOnMouseDown = heightObject.Height; } } base.OnMouseDown(mouseEvent3D); }
public void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver) { if (mouseOver != mouseIsOver) { mouseOver = mouseIsOver; context.GuiSurface.Invalidate(); } if (downOnControl) { var ray = context.World.GetRayForLocalBounds(mouseEvent3D.MouseEvent2D.Position); var scene = context.Scene; var intersectionInfo = scene.GetBVHData().GetClosestIntersection(ray); if (intersectionInfo != null) { foreach (var object3D in scene.Children) { if (object3D.GetBVHData().Contains(intersectionInfo.HitPosition)) { var newPosition = intersectionInfo.HitPosition; if (newPosition != getPosition()) { setPosition(newPosition); context.GuiSurface.Invalidate(); break; } } } } } }
public override void OnMouseUp(MouseEventArgs mouseEvent) { Invalidate(); if (SuppressObject3DControls) { return; } Ray ray = this.World.GetRayForLocalBounds(mouseEvent.Position); bool anyObject3DControlVolumeHit = FindHitObject3DControl(ray, out IObject3DControl object3DControl, out IntersectInfo info); var mouseEvent3D = new Mouse3DEventArgs(mouseEvent, ray, info); if (MouseDownOnObject3DControlVolume && mouseDownObject3DControl != null) { mouseDownObject3DControl.OnMouseUp(mouseEvent3D); SelectedObject3DControl = null; mouseDownObject3DControl = null; } else { mouseDownObject3DControl = null; if (anyObject3DControlVolumeHit) { object3DControl.OnMouseUp(mouseEvent3D); } SelectedObject3DControl = null; } base.OnMouseUp(mouseEvent); }
public override void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { if (mouseEvent3D.info != null && mouseEvent3D.MouseEvent2D.Button == MouseButtons.Left && Object3DControlContext.Scene.SelectedItem != null) { hadClickOnControl = true; activeSelectedItem = RootSelection; heightValueDisplayInfo.Visible = true; var selectedItem = activeSelectedItem; var bottomPosition = GetBottomPosition(selectedItem); var topPosition = GetTopPosition(selectedItem); originalPointToMove = topPosition; var upNormal = (topPosition - bottomPosition).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, getDiameters, setDiameters); Object3DControlContext.Scene.ShowSelectionShadow = false; } base.OnMouseDown(mouseEvent3D); }
public override void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { if (mouseEvent3D.info != null && Object3DControlContext.Scene.SelectedItem != null) { hadClickOnControl = true; activeSelectedItem = RootSelection; zValueDisplayInfo.Visible = true; var selectedItem = activeSelectedItem; double distanceToHit = Vector3Ex.Dot(mouseEvent3D.info.HitPosition, mouseEvent3D.MouseRay.directionNormal); hitPlane = new PlaneShape(mouseEvent3D.MouseRay.directionNormal, distanceToHit, null); originalPointToMove = GetTopPosition(selectedItem); initialHitPosition = mouseEvent3D.info.HitPosition; if (selectedItem is IObjectWithHeight heightObject) { heightOnMouseDown = heightObject.Height; } mouseDownSelectedBounds = selectedItem.GetAxisAlignedBoundingBox(); } base.OnMouseDown(mouseEvent3D); }
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); }
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; diameterValueDisplayInfo.Visible = true; var(edge, otherSide) = GetHitPosition(selectedItem); 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, null, null, null, null, getHeight, setHeight, getDiameters, setDiameters); Object3DControlContext.Scene.ShowSelectionShadow = false; } base.OnMouseDown(mouseEvent3D); }
public override async void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver) { var selectedItem = RootSelection; activeSelectedItem = selectedItem; if (MouseIsOver) { heightValueDisplayInfo.Visible = true; } else if (!hadClickOnControl) { heightValueDisplayInfo.Visible = false; } if (MouseDownOnControl) { IntersectInfo info = hitPlane.GetClosestIntersection(mouseEvent3D.MouseRay); if (info != null && selectedItem != null) { var delta = info.HitPosition - initialHitPosition; var bottom = GetBottomPosition(selectedItem); var top = GetTopPosition(selectedItem); var up = top - bottom; var newPosition = originalPointToMove + delta; var newSize = (newPosition - bottom).Length; double snapGridDistance = Object3DControlContext.SnapGridDistance; // if we are about to scale the object to less than 0 if (up.Dot(info.HitPosition - bottom) < 0) { newSize = .001; } if (snapGridDistance > 0) { newSize = System.Math.Max(newSize, snapGridDistance); // snap this position to the grid newSize = ((int)((newSize / snapGridDistance) + .5)) * snapGridDistance; } scaleController.ScaleHeight(newSize); await selectedItem.Rebuild(); var postScaleBottom = GetBottomPosition(selectedItem); selectedItem.Translate(bottom - postScaleBottom); Invalidate(); } } base.OnMouseMove(mouseEvent3D, mouseIsOver); }
private void ModelEventSource3DOnMouseMove(object sender, Mouse3DEventArgs mouse3DEventArgs) { var modelHit = mouse3DEventArgs.RayHitResult.ModelHit as GeometryModel3D; //((GeometryModel3D)modelHit).Material = new DiffuseMaterial(Brushes.Red); SelectObject(modelHit); }
public void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { DownOnControl = true; ApplicationController.Instance.UiHint = UiHint; mouseDownPosition = getPosition(); // Make sure we always get a new hit plane ResetHitPlane(); }
public override void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { if (activeSelectedItem is IObjectWithHeight heightObject) { SetHeightUndo(heightObject.Height); } base.OnMouseUp(mouseEvent3D); }
private void OnDuckMouseEnter(object sender, Mouse3DEventArgs e) { var hitVisual3D = e.HitObject as ModelVisual3D; if (_duckModels.Contains(hitVisual3D)) { HighlightDuckVisual3D(hitVisual3D); } }
public void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { if (DownOnControl) { DownOnControl = false; editComplete(mouseDownPosition); ApplicationController.Instance.UiHint = ""; } }
public override void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { if (hadClickOnControl) { Object3DControlContext.Scene.AddTransformSnapshot(transformOnMouseDown); } base.OnMouseUp(mouseEvent3D); }
public override async void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver) { var selectedItem = RootSelection; activeSelectedItem = selectedItem; if (MouseIsOver) { zValueDisplayInfo.Visible = true; } else if (!hadClickOnControl) { zValueDisplayInfo.Visible = false; } if (MouseDownOnControl) { IntersectInfo info = hitPlane.GetClosestIntersection(mouseEvent3D.MouseRay); if (info != null && selectedItem != null) { var delta = info.HitPosition - initialHitPosition; var newPosition = originalPointToMove + delta; var lockedBottom = GetBottomPosition(selectedItem); var newSize = (newPosition - lockedBottom).Length; 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; } if (selectedItem is IObjectWithHeight heightObject) { heightObject.Height = newSize; selectedItem.Invalidate(new InvalidateArgs(selectedItem, InvalidateType.DisplayValues)); } await selectedItem.Rebuild(); var postScaleBottom = GetBottomPosition(selectedItem); selectedItem.Translate(lockedBottom - postScaleBottom); Invalidate(); } } base.OnMouseMove(mouseEvent3D, mouseIsOver); }
private void eventSource3D_MouseMove(object sender, Mouse3DEventArgs e) { if (e.RayHitResult == null) { HitPositionTextBlock.Text = null; } else { HitPositionTextBlock.Text = string.Format("Hit pos: {0:0}", e.RayHitResult.HitPosition); } }
public override void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { if (MouseDownOnControl) { scaleController.EditComplete(); scaleController = new ScaleController(Object3DControlContext, getWidth, setWidth, getDepth, setDepth, getHeight, setHeight, getDiameters, setDiameters); Object3DControlContext.Scene.ShowSelectionShadow = true; } base.OnMouseUp(mouseEvent3D); }
public void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver) { if (mouseOver != mouseIsOver) { mouseOver = mouseIsOver; context.GuiSurface.Invalidate(); } if (DownOnControl) { UpdatePosition(mouseEvent3D.MouseEvent2D.Position); } }
private void BoxOnMouseEnter(object sender, Mouse3DEventArgs mouse3DEventArgs) { var boxVisual3D = mouse3DEventArgs.HitObject as Ab3d.Visuals.BoxVisual3D; if (boxVisual3D == null) { return; // This should not happen } // Set _isSelectedBoxClicked to true if the selected box is clicked (red) - this will be used on MouseLeave _isSelectedBoxClicked = ReferenceEquals(boxVisual3D.Material, _clickedMaterial); boxVisual3D.Material = _selectedMaterial; }
public override void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { if (hadClickOnControl) { if (getDiameters[diameterIndex]() != scaleController.InitialState.Diameters[diameterIndex]) { scaleController.EditComplete(); scaleController = new ScaleController(Object3DControlContext, null, null, null, null, getHeight, setHeight, getDiameters, setDiameters); } Object3DControlContext.Scene.ShowSelectionShadow = true; } base.OnMouseUp(mouseEvent3D); }
public override void OnMouseMove(Mouse3DEventArgs mouseEvent3D, bool mouseIsOver) { var selectedItem = RootSelection; ActiveSelectedItem = selectedItem; if (MouseIsOver) { zHeightDisplayInfo.Visible = true; } else if (!hadClickOnControl) { zHeightDisplayInfo.Visible = false; } if (MouseDownOnControl) { IntersectInfo info = hitPlane.GetClosestIntersection(mouseEvent3D.MouseRay); if (info != null && selectedItem != null && mouseDownSelectedBounds != null) { var delta = info.HitPosition.Z - initialHitPosition.Z; double newZPosition = mouseDownSelectedBounds.MinXYZ.Z + delta; if (Object3DControlContext.SnapGridDistance > 0) { // snap this position to the grid double snapGridDistance = Object3DControlContext.SnapGridDistance; // snap this position to the grid newZPosition = ((int)((newZPosition / snapGridDistance) + .5)) * snapGridDistance; } AxisAlignedBoundingBox originalSelectedBounds = selectedItem.GetAxisAlignedBoundingBox(); var moveAmount = newZPosition - originalSelectedBounds.MinXYZ.Z; if (moveAmount != 0) { selectedItem.Matrix *= Matrix4X4.CreateTranslation(0, 0, moveAmount); Invalidate(); } } } base.OnMouseMove(mouseEvent3D, mouseIsOver); }
public override void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { if (hadClickOnControl) { if (getWidth() != scaleController.InitialState.Width || getDepth() != scaleController.InitialState.Depth) { scaleController.EditComplete(); // make a new controller so we will have new undo data scaleController = new ScaleController(Object3DControlContext, getWidth, setWidth, getDepth, setDepth, getHeight, setHeight); } Object3DControlContext.Scene.ShowSelectionShadow = true; } base.OnMouseUp(mouseEvent3D); }
public override void OnMouseUp(Mouse3DEventArgs mouseEvent3D) { Object3DControlContext.Scene.DrawSelection = true; // if we rotated it if (mouseDownInfo != null) { // put in the start transform so we can go back to it if we have to Object3DControlContext.Scene.AddTransformSnapshot(mouseDownInfo.SelectedObjectTransform); } if (mouseDownInfo != null) { Object3DControlContext.Scene.ShowSelectionShadow = true; } base.OnMouseUp(mouseEvent3D); }
private void BoxOnMouseLeave(object sender, Mouse3DEventArgs mouse3DEventArgs) { var boxVisual3D = mouse3DEventArgs.HitObject as Ab3d.Visuals.BoxVisual3D; if (boxVisual3D == null) { return; // This should not happen } if (_isSelectedBoxClicked) { boxVisual3D.Material = _clickedMaterial; } else { boxVisual3D.Material = _normalMaterial; } }
public override void OnMouseDown(Mouse3DEventArgs mouseEvent3D) { Object3DControlContext.Scene.DrawSelection = false; IObject3D selectedItem = RootSelection; if (mouseEvent3D.info != null && selectedItem != null) { selectedItemOnMouseDown = selectedItem; angleTextControl.Visible = true; var selectedObject = selectedItemOnMouseDown; AxisAlignedBoundingBox currentSelectedBounds = selectedObject.GetAxisAlignedBoundingBox(); var selectedObjectRotationCenter = currentSelectedBounds.Center; var cornerForAxis = GetCornerPosition(selectedObject); // move the rotation center to the correct side of the bounding box selectedObjectRotationCenter[RotationAxis] = cornerForAxis[RotationAxis]; mouseDownInfo = new Mouse3DInfo( mouseEvent3D.info.HitPosition, selectedObject.Matrix, selectedObjectRotationCenter, GetControlCenter(selectedObject), RotationAxis); // Get move data updated lastSnappedRotation = 0; SnappedRotationAngle = 0; RotatingCW = true; mouseMoveInfo = mouseDownInfo; Object3DControlContext.Scene.ShowSelectionShadow = false; mouseMoveInfo = new Mouse3DInfo( mouseEvent3D.info.HitPosition, selectedObject.Matrix, selectedObjectRotationCenter, GetControlCenter(selectedObject), RotationAxis); } base.OnMouseDown(mouseEvent3D); }
public override void OnMouseMove(MouseEventArgs mouseEvent) { base.OnMouseMove(mouseEvent); if (SuppressUiVolumes || !this.PositionWithinLocalBounds(mouseEvent.X, mouseEvent.Y)) { return; } Ray ray = this.World.GetRayForLocalBounds(mouseEvent.Position); IntersectInfo info = null; var mouseEvent3D = new Mouse3DEventArgs(mouseEvent, ray, info); if (MouseDownOnInteractionVolume && mouseDownIAVolume != null) { mouseDownIAVolume.OnMouseMove(mouseEvent3D); } else { this.FindInteractionVolumeHit(ray, out InteractionVolume hitIAVolume, out info); var iaVolumes = this.InteractionVolumes; foreach (var iaVolume in iaVolumes.OfType <InteractionVolume>()) { if (hitIAVolume == iaVolume) { iaVolume.MouseOver = true; iaVolume.MouseMoveInfo = info; HoveredInteractionVolume = iaVolume; } else { iaVolume.MouseOver = false; iaVolume.MouseMoveInfo = null; } // TODO: Why do non-hit volumes get mouse move? iaVolume.OnMouseMove(mouseEvent3D); } } }