private void UpdateRotationHandlePosition() { GraphicalUiElement singleSelectedObject = null; if (selectedObjects.Count == 1) { singleSelectedObject = selectedObjects[0]; } if (singleSelectedObject == null) { // hide the rotation handles rotationHandle.Visible = false; } else { rotationHandle.Visible = true; // right side const float minimumOffset = 24; float xOffset = 0; if (singleSelectedObject.XOrigin == HorizontalAlignment.Left) { xOffset = singleSelectedObject.GetAbsoluteWidth() + minimumOffset; } else if (singleSelectedObject.XOrigin == HorizontalAlignment.Center) { xOffset = singleSelectedObject.GetAbsoluteWidth() / 2.0f + minimumOffset; } else if (singleSelectedObject.XOrigin == HorizontalAlignment.Right) { xOffset = minimumOffset; } var offset = new Vector2( xOffset, 0); MathFunctions.RotateVector( ref offset, -MathHelper.ToRadians(singleSelectedObject.GetAbsoluteRotation())); rotationHandle.X = singleSelectedObject.AbsoluteX + offset.X; // consider the Y rotationHandle.Y = singleSelectedObject.AbsoluteY + offset.Y; rotationHandle.Radius = 8 / Renderer.Self.Camera.Zoom; } }
private bool SideGrabbingActivityForInstanceSave(float cursorXChange, float cursorYChange, InstanceSave instanceSave, List <ElementWithState> elementStack) { float changeXMultiplier; float changeYMultiplier; float widthMultiplier; float heightMultiplier; CalculateMultipliers(instanceSave, elementStack, out changeXMultiplier, out changeYMultiplier, out widthMultiplier, out heightMultiplier); AdjustCursorChangeValuesForShiftDrag(ref cursorXChange, ref cursorYChange, instanceSave, elementStack); bool hasChangeOccurred = false; Vector2 reposition = new Vector2(cursorXChange * changeXMultiplier, cursorYChange * changeYMultiplier); // invert Y so up is positive reposition.Y *= -1; GraphicalUiElement representation = null; if (instanceSave != null) { representation = WireframeObjectManager.Self.GetRepresentation(instanceSave); } else { representation = WireframeObjectManager.Self.GetRepresentation(elementStack.Last().Element); } float rotation = MathHelper.ToRadians(representation?.GetAbsoluteRotation() ?? 0); MathFunctions.RotateVector(ref reposition, rotation); // flip Y back reposition.Y *= -1; if (reposition.X != 0) { hasChangeOccurred = true; if (instanceSave != null) { EditingManager.Self.ModifyVariable("X", reposition.X, instanceSave); } else { EditingManager.Self.ModifyVariable("X", reposition.X, elementStack.Last().Element); } } if (reposition.Y != 0) { hasChangeOccurred = true; if (instanceSave != null) { EditingManager.Self.ModifyVariable("Y", reposition.Y, instanceSave); } else { EditingManager.Self.ModifyVariable("Y", reposition.Y, elementStack.Last().Element); } } if (heightMultiplier != 0 && cursorYChange != 0) { hasChangeOccurred = true; if (instanceSave != null) { EditingManager.Self.ModifyVariable("Height", cursorYChange * heightMultiplier, instanceSave); } else { EditingManager.Self.ModifyVariable("Height", cursorYChange * heightMultiplier, elementStack.Last().Element); } } if (widthMultiplier != 0 && cursorXChange != 0) { hasChangeOccurred = true; if (instanceSave != null) { EditingManager.Self.ModifyVariable("Width", cursorXChange * widthMultiplier, instanceSave); } else { EditingManager.Self.ModifyVariable("Width", cursorXChange * widthMultiplier, elementStack.Last().Element); } } return(hasChangeOccurred); }