internal override ActionResult EndActivation() { Clear(); ToolManager.RestorePreviousTool(); EditorApplication.delayCall += () => ProBuilderEditor.ResetToLastSelectMode(); return(new ActionResult(ActionResult.Status.Success, "End Poly Shape")); }
public override ShapeState DoState(Event evt) { if (evt.type == EventType.KeyDown) { switch (evt.keyCode) { case KeyCode.Escape: ToolManager.RestorePreviousTool(); break; } } if (tool.m_LastShapeCreated != null) { EditShapeTool.DoEditingHandles(tool.m_LastShapeCreated, true); } if (evt.isMouse && HandleUtility.nearestControl == tool.controlID) { var res = EditorHandleUtility.FindBestPlaneAndBitangent(evt.mousePosition); Ray ray = HandleUtility.GUIPointToWorldRay(evt.mousePosition); float hit; if (res.item1.Raycast(ray, out hit)) { //Plane init tool.m_Plane = res.item1; tool.m_PlaneForward = res.item2; tool.m_PlaneRight = Vector3.Cross(tool.m_Plane.normal, tool.m_PlaneForward); var planeNormal = tool.m_Plane.normal; var planeCenter = tool.m_Plane.normal * -tool.m_Plane.distance; // if hit point on plane is cardinal axis and on grid, snap to grid. if (Math.IsCardinalAxis(planeNormal)) { const float epsilon = .00001f; bool offGrid = false; Vector3 snapVal = EditorSnapping.activeMoveSnapValue; Vector3 center = Vector3.Scale(ProBuilderSnapping.GetSnappingMaskBasedOnNormalVector(planeNormal), planeCenter); for (int i = 0; i < 3; i++) { offGrid |= Mathf.Abs(snapVal[i] % center[i]) > epsilon; } tool.m_IsOnGrid = !offGrid; } else { tool.m_IsOnGrid = false; } m_HitPosition = tool.GetPoint(ray.GetPoint(hit)); //Click has been done => Define a plane for the tool if (evt.type == EventType.MouseDown) { //BB init tool.m_BB_Origin = m_HitPosition; tool.m_BB_HeightCorner = tool.m_BB_Origin; tool.m_BB_OppositeCorner = tool.m_BB_Origin; return(NextState()); } } else { m_HitPosition = Vector3.negativeInfinity; } } if (GUIUtility.hotControl == 0 && evt.shift && !(evt.control || evt.command)) { tool.DuplicatePreview(m_HitPosition); } else if (tool.m_DuplicateGO != null) { Object.DestroyImmediate(tool.m_DuplicateGO); } // Repaint to visualize the placement preview dot if (evt.type == EventType.MouseMove && HandleUtility.nearestControl == tool.controlID) { HandleUtility.Repaint(); } if (evt.type == EventType.Repaint) { if (GUIUtility.hotControl == 0 && HandleUtility.nearestControl == tool.controlID) { using (new Handles.DrawingScope(EditorHandleDrawing.vertexSelectedColor)) { Handles.DotHandleCap(-1, m_HitPosition, Quaternion.identity, HandleUtility.GetHandleSize(m_HitPosition) * 0.05f, EventType.Repaint); } } if (GUIUtility.hotControl == 0 && evt.shift && !(evt.control || evt.command)) { tool.DrawBoundingBox(false); } } return(this); }
internal override ActionResult EndActivation() { Clear(); ToolManager.RestorePreviousTool(); return(new ActionResult(ActionResult.Status.Success, "End Poly Shape")); }