protected override void HandleCreateShapeEvents(SceneView sceneView, Rect sceneRect) { bool pointOnEdge = false; bool havePlane = false; bool vertexOnGeometry = false; CSGBrush vertexOnBrush = null; CSGPlane hoverBuildPlane = buildPlane; var camera = sceneView.camera; var assume2DView = CSGSettings.Assume2DView(camera); if (camera != null && camera.pixelRect.Contains(Event.current.mousePosition)) { if (!hoverDefaultPlane.HasValue || settings.vertices.Length == 0) { bool forceGrid = RealtimeCSG.CSGGrid.ForceGrid; RealtimeCSG.CSGGrid.ForceGrid = false; hoverDefaultPlane = RealtimeCSG.CSGGrid.CurrentGridPlane; RealtimeCSG.CSGGrid.ForceGrid = forceGrid; firstSnappedEdges = null; firstSnappedBrush = null; firstSnappedPlanes = null; base.geometryModel = null; } if (editMode == EditMode.CreatePlane) { LegacyBrushIntersection intersection; if (!assume2DView && !havePlane && EditorWindow.mouseOverWindow == sceneView && SceneQueryUtility.FindWorldIntersection(camera, Event.current.mousePosition, out intersection)) { worldPosition = intersection.worldIntersection; hoverBuildPlane = intersection.worldPlane; vertexOnBrush = intersection.brush; vertexOnGeometry = true; } else { hoverBuildPlane = hoverDefaultPlane.Value; vertexOnBrush = null; var mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); worldPosition = hoverBuildPlane.RayIntersection(mouseRay); vertexOnGeometry = false; } ResetVisuals(); if (snapFunction != null) { CSGBrush snappedOnBrush; worldPosition = snapFunction(camera, worldPosition, hoverBuildPlane, ref visualSnappedEdges, out snappedOnBrush, generatedBrushes, ignoreAllBrushes: true); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; vertexOnGeometry = true; } } if (settings.vertices.Length == 1) { if (hoverBuildPlane.normal != MathConstants.zeroVector3) { editMode = EditMode.CreateShape; havePlane = true; } } } else { var mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); worldPosition = hoverBuildPlane.RayIntersection(mouseRay); ResetVisuals(); if (snapFunction != null) { CSGBrush snappedOnBrush; worldPosition = snapFunction(camera, worldPosition, hoverBuildPlane, ref visualSnappedEdges, out snappedOnBrush, generatedBrushes, ignoreAllBrushes: true); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; } } } if (geometryModel == null && vertexOnBrush != null) { if (vertexOnBrush.ChildData != null && vertexOnBrush.ChildData.Model) geometryModel = vertexOnBrush.ChildData.Model; } if (worldPosition != prevWorldPosition) { prevWorldPosition = worldPosition; if (settings.vertices.Length > 0) { if (hadSphere || (settings.vertices[0] - worldPosition).sqrMagnitude > MathConstants.EqualityEpsilon) { hadSphere = true; UpdateBaseShape(true); } } if (Event.current.type != EventType.Repaint) CSG_EditorGUIUtility.RepaintAll(); } visualSnappedGrid = RealtimeCSG.CSGGrid.FindAllGridEdgesThatTouchPoint(camera, worldPosition); visualSnappedBrush = vertexOnBrush; } RealtimeCSG.CSGGrid.SetForcedGrid(camera, hoverBuildPlane); if (!SceneDragToolManager.IsDraggingObjectInScene && Event.current.type == EventType.Repaint) { PaintSnapVisualisation(); PaintCircle(sceneView, base.shapeId); } var type = Event.current.GetTypeForControl(base.shapeId); switch (type) { case EventType.Layout: { return; } case EventType.ValidateCommand: case EventType.KeyDown: { if (GUIUtility.hotControl == base.shapeId) { if (Keys.PerformActionKey.IsKeyPressed() || Keys.DeleteSelectionKey.IsKeyPressed() || Keys.CancelActionKey.IsKeyPressed()) { Event.current.Use(); } } return; } case EventType.KeyUp: { if (GUIUtility.hotControl == base.shapeId) { if (Keys.CylinderBuilderMode.IsKeyPressed() || Keys.PerformActionKey.IsKeyPressed()) { HotKeyReleased(); Event.current.Use(); return; } if (Keys.DeleteSelectionKey.IsKeyPressed() || Keys.CancelActionKey.IsKeyPressed()) { Cancel(); Event.current.Use(); return; } } return; } case EventType.MouseDown: { if (!sceneRect.Contains(Event.current.mousePosition)) break; if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) return; if ((GUIUtility.hotControl != 0 && GUIUtility.hotControl != shapeEditId && GUIUtility.hotControl != base.shapeId) || Event.current.button != 0) return; Event.current.Use(); if (settings.vertices.Length == 0) { if ((GUIUtility.hotControl == 0 || GUIUtility.hotControl == base.shapeEditId) && base.shapeId != -1) { base.CalculateWorldSpaceTangents(camera); GUIUtility.hotControl = base.shapeId; GUIUtility.keyboardControl = base.shapeId; EditorGUIUtility.editingTextField = false; } } if (GUIUtility.hotControl == base.shapeId && settings.vertices.Length < 2) { if (!float.IsNaN(worldPosition.x) && !float.IsInfinity(worldPosition.x) && !float.IsNaN(worldPosition.y) && !float.IsInfinity(worldPosition.y) && !float.IsNaN(worldPosition.z) && !float.IsInfinity(worldPosition.z)) { if (hoverBuildPlane.normal.sqrMagnitude != 0) buildPlane = hoverBuildPlane; CalculateWorldSpaceTangents(camera); if (settings.vertices.Length == 0) { if (pointOnEdge) { firstSnappedEdges = visualSnappedEdges.ToArray(); firstSnappedBrush = visualSnappedBrush; firstSnappedPlanes = null; } else { firstSnappedBrush = null; firstSnappedEdges = null; firstSnappedPlanes = null; } planeOnGeometry = vertexOnGeometry; } else { if (firstSnappedEdges != null) { if (firstSnappedPlanes == null) CreateSnappedPlanes(); bool outside = true; for (int i = 0; i < firstSnappedPlanes.Length; i++) { if (firstSnappedPlanes[i].Distance(worldPosition) <= MathConstants.DistanceEpsilon) { outside = false; break; } } planeOnGeometry = !outside; } if (vertexOnGeometry) { var plane = hoverDefaultPlane.Value; var distance = plane.Distance(worldPosition); plane.d += distance; hoverDefaultPlane = plane; for (int i = 0; i < settings.vertices.Length; i++) { if (!settings.onGeometryVertices[i]) { settings.vertices[i] = GeometryUtility.ProjectPointOnPlane(plane, settings.vertices[i]); settings.onGeometryVertices[i] = true; } } } } ArrayUtility.Add(ref settings.onGeometryVertices, vertexOnGeometry); settings.AddPoint(worldPosition); CSG_EditorGUIUtility.RepaintAll(); if (settings.vertices.Length == 2) { HotKeyReleased(); } } } return; } case EventType.MouseDrag: { if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) break; if (GUIUtility.hotControl == base.shapeId && Event.current.button == 0) { Event.current.Use(); } return; } case EventType.MouseUp: { if (GUIUtility.hotControl != base.shapeId) return; if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) return; if (Event.current.button == 0) { Event.current.Use(); ResetVisuals(); if (settings.vertices.Length == 2) { GUIUtility.hotControl = 0; GUIUtility.keyboardControl = 0; EditorGUIUtility.editingTextField = false; editMode = EditMode.CreateShape; HotKeyReleased(); } } return; } } }
public bool DragUpdated(SceneView sceneView) { var camera = sceneView.camera; LegacyBrushIntersection intersection; int highlight_surface = -1; CSGBrush highlight_brush = null; if (!SceneQueryUtility.FindWorldIntersection(camera, Event.current.mousePosition, out intersection)) { highlight_brush = null; highlight_surface = -1; } else { highlight_brush = intersection.brush; highlight_surface = intersection.surfaceIndex; } bool modified = true; if (hoverBrushSurfaces != null) { for (int i = 0; i < hoverBrushSurfaces.Length; i++) { if (hoverBrushSurfaces[i].brush == highlight_brush && hoverBrushSurfaces[i].surfaceIndex == highlight_surface) { modified = false; break; } } } bool needUpdate = false; if (modified) { hoverOnSelectedSurfaces = false; if (hoverBrushSurfaces != null) { needUpdate = true; RestoreMaterials(hoverBrushSurfaces); } hoverBrushSurfaces = HoverOnBrush(new CSGBrush[1] { highlight_brush }, highlight_surface); if (hoverBrushSurfaces != null) { hoverBrushSurfaces = GetCombinedBrushes(hoverBrushSurfaces); needUpdate = true; using (new UndoGroup(hoverBrushSurfaces, "Modified materials")) { RememberMaterials(hoverBrushSurfaces); ApplyMaterial(hoverBrushSurfaces); } } } else { bool prevSelectAllSurfaces = selectAllSurfaces; selectAllSurfaces = Event.current.shift; if (prevSelectAllSurfaces != selectAllSurfaces) { if (hoverBrushSurfaces != null) { needUpdate = true; using (new UndoGroup(hoverBrushSurfaces, "Modified materials")) { ApplyMaterial(hoverBrushSurfaces); } } } } if (needUpdate) { InternalCSGModelManager.UpdateMeshes(); MeshInstanceManager.UpdateHelperSurfaceVisibility(); } return(needUpdate); }
protected override void HandleCreateShapeEvents(Rect sceneRect) { if (settings.vertices.Length < 2) { if (editMode == EditMode.ExtrudeShape || editMode == EditMode.EditShape) { editMode = EditMode.CreatePlane; } } bool pointOnEdge = false; bool havePlane = false; bool vertexOnGeometry = false; CSGBrush vertexOnBrush = null; CSGPlane hoverBuildPlane = buildPlane; var sceneView = SceneView.currentDrawingSceneView; //(SceneView.currentDrawingSceneView != null) ? SceneView.currentDrawingSceneView : SceneView.lastActiveSceneView; var camera = (sceneView == null) ? null : sceneView.camera; if (camera != null && camera.pixelRect.Contains(Event.current.mousePosition)) { if (!hoverDefaultPlane.HasValue || settings.vertices.Length == 0) { bool forceGrid = RealtimeCSG.CSGGrid.ForceGrid; RealtimeCSG.CSGGrid.ForceGrid = false; hoverDefaultPlane = RealtimeCSG.CSGGrid.CurrentGridPlane; RealtimeCSG.CSGGrid.ForceGrid = forceGrid; firstSnappedEdges = null; firstSnappedBrush = null; firstSnappedPlanes = null; base.geometryModel = null; } if (editMode == EditMode.CreatePlane) { BrushIntersection intersection; if (!IgnoreDepthForRayCasts(sceneView) && !havePlane && SceneQueryUtility.FindWorldIntersection(Event.current.mousePosition, out intersection)) { worldPosition = intersection.worldIntersection; if (intersection.surfaceInverted) { hoverBuildPlane = intersection.plane.Negated(); } else { hoverBuildPlane = intersection.plane; } vertexOnBrush = intersection.brush; vertexOnGeometry = true; } else { hoverBuildPlane = hoverDefaultPlane.Value; vertexOnBrush = null; var mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); worldPosition = hoverBuildPlane.Intersection(mouseRay); vertexOnGeometry = false; } ResetVisuals(); if (snapFunction != null) { CSGBrush snappedOnBrush; worldPosition = snapFunction(worldPosition, hoverBuildPlane, ref visualSnappedEdges, out snappedOnBrush, generatedBrushes); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; vertexOnGeometry = true; } } if (settings.vertices.Length == 1) { if (hoverBuildPlane.normal != MathConstants.zeroVector3) { editMode = EditMode.CreateShape; havePlane = true; } } else if (settings.vertices.Length == 2) { onLastPoint = true; } } else { var mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); worldPosition = hoverBuildPlane.Intersection(mouseRay); ResetVisuals(); if (snapFunction != null) { CSGBrush snappedOnBrush; worldPosition = snapFunction(worldPosition, hoverBuildPlane, ref visualSnappedEdges, out snappedOnBrush, generatedBrushes); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; } } } if (geometryModel == null && vertexOnBrush != null) { var brush_cache = InternalCSGModelManager.GetBrushCache(vertexOnBrush); if (brush_cache != null && brush_cache.childData != null && brush_cache.childData.Model) { geometryModel = brush_cache.childData.Model; } } if (worldPosition != prevWorldPosition) { prevWorldPosition = worldPosition; if (Event.current.type != EventType.Repaint) { SceneView.RepaintAll(); } } visualSnappedGrid = RealtimeCSG.CSGGrid.FindAllGridEdgesThatTouchPoint(worldPosition); visualSnappedBrush = vertexOnBrush; } RealtimeCSG.CSGGrid.SetForcedGrid(hoverBuildPlane); if (!SceneDragToolManager.IsDraggingObjectInScene && Event.current.type == EventType.Repaint) { PaintSnapVisualisation(); PaintShape(base.shapeId); } var type = Event.current.GetTypeForControl(base.shapeId); switch (type) { case EventType.Layout: { return; } case EventType.ValidateCommand: case EventType.KeyDown: { if (GUIUtility.hotControl == base.shapeId) { if (Keys.PerformActionKey.IsKeyPressed() || Keys.DeleteSelectionKey.IsKeyPressed() || Keys.CancelActionKey.IsKeyPressed()) { Event.current.Use(); } } return; } case EventType.KeyUp: { if (GUIUtility.hotControl == base.shapeId) { if (Keys.BoxBuilderMode.IsKeyPressed() || Keys.PerformActionKey.IsKeyPressed()) { HotKeyReleased(); Event.current.Use(); return; } if (Keys.DeleteSelectionKey.IsKeyPressed() || Keys.CancelActionKey.IsKeyPressed()) { Cancel(); Event.current.Use(); return; } } return; } case EventType.MouseDown: { if (!sceneRect.Contains(Event.current.mousePosition)) { break; } if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) { return; } if ((GUIUtility.hotControl != 0 && GUIUtility.hotControl != shapeEditId && GUIUtility.hotControl != base.shapeId) || Event.current.button != 0) { return; } Event.current.Use(); if (settings.vertices.Length == 0) { if ((GUIUtility.hotControl == 0 || GUIUtility.hotControl == base.shapeEditId) && base.shapeId != -1) { base.CalculateWorldSpaceTangents(); GUIUtility.hotControl = base.shapeId; GUIUtility.keyboardControl = base.shapeId; EditorGUIUtility.editingTextField = false; } } if (GUIUtility.hotControl == base.shapeId && settings.vertices.Length < 2) { if (!float.IsNaN(worldPosition.x) && !float.IsInfinity(worldPosition.x) && !float.IsNaN(worldPosition.y) && !float.IsInfinity(worldPosition.y) && !float.IsNaN(worldPosition.z) && !float.IsInfinity(worldPosition.z)) { if (hoverBuildPlane.normal.sqrMagnitude != 0) { buildPlane = hoverBuildPlane; } CalculateWorldSpaceTangents(); if (settings.vertices.Length == 0) { if (pointOnEdge) { firstSnappedEdges = visualSnappedEdges.ToArray(); firstSnappedBrush = visualSnappedBrush; firstSnappedPlanes = null; } else { firstSnappedBrush = null; firstSnappedEdges = null; firstSnappedPlanes = null; } geometryPlane = buildPlane; planeOnGeometry = vertexOnGeometry; } else { if (firstSnappedEdges != null) { if (firstSnappedPlanes == null) { CreateSnappedPlanes(); } bool outside = true; for (int i = 0; i < firstSnappedPlanes.Length; i++) { if (firstSnappedPlanes[i].Distance(worldPosition) <= MathConstants.DistanceEpsilon) { outside = false; break; } } planeOnGeometry = !outside; } if (vertexOnGeometry) { var plane = hoverDefaultPlane.Value; var distance = plane.Distance(worldPosition); if (float.IsInfinity(distance) || float.IsNaN(distance)) { distance = 1.0f; } plane.d += distance; hoverDefaultPlane = plane; for (int i = 0; i < settings.vertices.Length; i++) { if (!settings.onGeometryVertices[i]) { settings.vertices[i] = GeometryUtility.ProjectPointOnPlane(plane, settings.vertices[i]); settings.onGeometryVertices[i] = true; } } } } ArrayUtility.Add(ref settings.onGeometryVertices, vertexOnGeometry); settings.AddPoint(worldPosition); SceneView.RepaintAll(); if (settings.vertices.Length == 2) { HotKeyReleased(); } } } return; } case EventType.MouseDrag: { if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) { break; } if (GUIUtility.hotControl == base.shapeId && Event.current.button == 0) { Event.current.Use(); } return; } case EventType.MouseUp: { if (GUIUtility.hotControl != base.shapeId) { return; } if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) { return; } if (Event.current.button == 0) { Event.current.Use(); ResetVisuals(); if (onLastPoint) { GUIUtility.hotControl = 0; GUIUtility.keyboardControl = 0; EditorGUIUtility.editingTextField = false; editMode = EditMode.CreateShape; HotKeyReleased(); } } return; } } return; }
protected override void HandleCreateShapeEvents(Rect sceneRect) { bool pointOnEdge = false; bool havePlane = false; bool vertexOnGeometry = false; CSGBrush vertexOnBrush = null; CSGPlane hoverBuildPlane = buildPlane; var sceneView = SceneView.currentDrawingSceneView; //(SceneView.currentDrawingSceneView != null) ? SceneView.currentDrawingSceneView : SceneView.lastActiveSceneView; var camera = sceneView.camera; if (camera != null && camera.pixelRect.Contains(Event.current.mousePosition)) { if (!hoverDefaultPlane.HasValue || settings.vertices.Length == 0) { bool forceGrid = RealtimeCSG.CSGGrid.ForceGrid; RealtimeCSG.CSGGrid.ForceGrid = false; hoverDefaultPlane = RealtimeCSG.CSGGrid.CurrentGridPlane; RealtimeCSG.CSGGrid.ForceGrid = forceGrid; firstSnappedEdges = null; firstSnappedBrush = null; firstSnappedPlanes = null; base.geometryModel = null; } if (editMode == EditMode.CreatePlane) { LegacyBrushIntersection intersection; if (!IgnoreDepthForRayCasts(sceneView) && !havePlane && SceneQueryUtility.FindWorldIntersection(Event.current.mousePosition, out intersection)) { worldPosition = intersection.worldIntersection; hoverBuildPlane = intersection.worldPlane; vertexOnBrush = intersection.brush; vertexOnGeometry = true; } else { hoverBuildPlane = hoverDefaultPlane.Value; vertexOnBrush = null; var mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); worldPosition = hoverBuildPlane.RayIntersection(mouseRay); vertexOnGeometry = false; } ResetVisuals(); if (snapFunction != null) { CSGBrush snappedOnBrush; worldPosition = snapFunction(worldPosition, hoverBuildPlane, ref visualSnappedEdges, out snappedOnBrush, generatedBrushes, ignoreAllBrushes: true); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; vertexOnGeometry = true; } } if (settings.vertices.Length == 1) { if (hoverBuildPlane.normal != MathConstants.zeroVector3) { editMode = EditMode.CreateShape; havePlane = true; } } } else { var mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); if (settings.vertices.Length == 2) { var startPoint = settings.vertices[1]; var forward = camera.transform.forward; if (Vector3.Dot(forward, gridBinormal) < Vector3.Dot(forward, gridTangent)) { hoverBuildPlane = new CSGPlane(gridBinormal, startPoint); } else { hoverBuildPlane = new CSGPlane(gridTangent, startPoint); } worldPosition = hoverBuildPlane.RayIntersection(mouseRay); // the third point is always straight up from the second point //worldPosition = startPoint + (Vector3.Dot(worldPosition - startPoint, gridNormal) * gridNormal); RealtimeCSG.CSGGrid.SetForcedGrid(hoverBuildPlane); ResetVisuals(); if (raySnapFunction != null) { Ray ray = new Ray(startPoint, gridNormal); CSGBrush snappedOnBrush; worldPosition = raySnapFunction(worldPosition, ray, ref visualSnappedEdges, out snappedOnBrush); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; } } worldPosition = GeometryUtility.ProjectPointOnInfiniteLine(worldPosition, startPoint, gridNormal); } else { worldPosition = hoverBuildPlane.RayIntersection(mouseRay); RealtimeCSG.CSGGrid.SetForcedGrid(hoverBuildPlane); ResetVisuals(); if (snapFunction != null) { CSGBrush snappedOnBrush; worldPosition = snapFunction(worldPosition, hoverBuildPlane, ref visualSnappedEdges, out snappedOnBrush, generatedBrushes, ignoreAllBrushes: true); if (snappedOnBrush != null) { pointOnEdge = (visualSnappedEdges != null && visualSnappedEdges.Count > 0); vertexOnBrush = snappedOnBrush; } } } } if (geometryModel == null && vertexOnBrush != null) { if (vertexOnBrush.ChildData != null && vertexOnBrush.ChildData.Model) { geometryModel = vertexOnBrush.ChildData.Model; } } if (worldPosition != prevWorldPosition) { prevWorldPosition = worldPosition; if (settings.vertices.Length > 0) { if ((settings.vertices[0] - worldPosition).sqrMagnitude > MathConstants.EqualityEpsilon) { UpdateSizes(); UpdateBaseShape(true); } } if (Event.current.type != EventType.Repaint) { CSG_EditorGUIUtility.UpdateSceneViews(); } } visualSnappedGrid = RealtimeCSG.CSGGrid.FindAllGridEdgesThatTouchPoint(worldPosition); visualSnappedBrush = vertexOnBrush; } RealtimeCSG.CSGGrid.SetForcedGrid(hoverBuildPlane); if (!SceneDragToolManager.IsDraggingObjectInScene && Event.current.type == EventType.Repaint) { PaintSnapVisualisation(); PaintShape(base.shapeId); } var type = Event.current.GetTypeForControl(base.shapeId); switch (type) { case EventType.Layout: { return; } case EventType.ValidateCommand: case EventType.KeyDown: { if (GUIUtility.hotControl == base.shapeId) { if (Keys.PerformActionKey.IsKeyPressed() || Keys.DeleteSelectionKey.IsKeyPressed() || Keys.CancelActionKey.IsKeyPressed()) { Event.current.Use(); } } return; } case EventType.KeyUp: { if (GUIUtility.hotControl == base.shapeId) { if (Keys.CylinderBuilderMode.IsKeyPressed() || Keys.PerformActionKey.IsKeyPressed()) { HotKeyReleased(); Event.current.Use(); return; } if (Keys.DeleteSelectionKey.IsKeyPressed() || Keys.CancelActionKey.IsKeyPressed()) { Cancel(); Event.current.Use(); return; } } return; } case EventType.MouseDown: { if (!sceneRect.Contains(Event.current.mousePosition)) { break; } if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) { return; } if ((GUIUtility.hotControl != 0 && GUIUtility.hotControl != shapeEditId && GUIUtility.hotControl != base.shapeId) || Event.current.button != 0) { return; } Event.current.Use(); if (settings.vertices.Length == 0) { if ((GUIUtility.hotControl == 0 || GUIUtility.hotControl == base.shapeEditId) && base.shapeId != -1) { base.CalculateWorldSpaceTangents(); GUIUtility.hotControl = base.shapeId; GUIUtility.keyboardControl = base.shapeId; EditorGUIUtility.editingTextField = false; } } if (GUIUtility.hotControl == base.shapeId && settings.vertices.Length < kMaxPoints) { if (!float.IsNaN(worldPosition.x) && !float.IsInfinity(worldPosition.x) && !float.IsNaN(worldPosition.y) && !float.IsInfinity(worldPosition.y) && !float.IsNaN(worldPosition.z) && !float.IsInfinity(worldPosition.z)) { if (settings.vertices.Length < 2 && hoverBuildPlane.normal.sqrMagnitude != 0) { buildPlane = hoverBuildPlane; } CalculateWorldSpaceTangents(); if (settings.vertices.Length == 0) { if (pointOnEdge) { firstSnappedEdges = visualSnappedEdges.ToArray(); firstSnappedBrush = visualSnappedBrush; firstSnappedPlanes = null; } else { firstSnappedBrush = null; firstSnappedEdges = null; firstSnappedPlanes = null; } planeOnGeometry = vertexOnGeometry; } else { if (firstSnappedEdges != null) { if (firstSnappedPlanes == null) { CreateSnappedPlanes(); } bool outside = true; for (int i = 0; i < firstSnappedPlanes.Length; i++) { if (firstSnappedPlanes[i].Distance(worldPosition) <= MathConstants.DistanceEpsilon) { outside = false; break; } } planeOnGeometry = !outside; } if (vertexOnGeometry) { var plane = hoverDefaultPlane.Value; var distance = plane.Distance(worldPosition); plane.d += distance; hoverDefaultPlane = plane; for (int i = 0; i < settings.vertices.Length; i++) { if (!settings.onGeometryVertices[i]) { settings.SetPoint(i, GeometryUtility.ProjectPointOnPlane(plane, settings.vertices[i])); settings.onGeometryVertices[i] = true; } } } } ArrayUtility.Add(ref settings.onGeometryVertices, vertexOnGeometry); settings.AddPoint(worldPosition); UpdateSizes(); CSG_EditorGUIUtility.UpdateSceneViews(); if (settings.vertices.Length == kMaxPoints) { HotKeyReleased(); } } } return; } case EventType.MouseDrag: { if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) { break; } if (GUIUtility.hotControl == base.shapeId && Event.current.button == 0) { Event.current.Use(); } return; } case EventType.MouseUp: { if (GUIUtility.hotControl != base.shapeId) { return; } if (Tools.viewTool != ViewTool.None && Tools.viewTool != ViewTool.Pan) { return; } if (Event.current.button == 0) { Event.current.Use(); ResetVisuals(); if (settings.vertices.Length == kMaxPoints) { GUIUtility.hotControl = 0; GUIUtility.keyboardControl = 0; EditorGUIUtility.editingTextField = false; editMode = EditMode.CreateShape; HotKeyReleased(); } } return; } } }
public static Vector3 SnapToWorld(Camera camera, CSGPlane snapPlane, Vector3 unsnappedPosition, Vector3 snappedPosition, ref List <Vector3> snappingEdges, out CSGBrush snappedOnBrush, CSGBrush[] ignoreBrushes = null) { snappedOnBrush = null; test_points[0] = unsnappedPosition; test_points[1] = snappedPosition; worldIntersections.Clear(); for (int i = 0; i < test_points.Length; i++) { var test_point2D = CameraUtility.WorldToGUIPoint(test_points[i]); LegacyBrushIntersection intersection; if (SceneQueryUtility.FindWorldIntersection(camera, test_point2D, out intersection)) { if (intersection.brush && intersection.brush.ControlMesh != null) { intersection.worldIntersection = GeometryUtility.ProjectPointOnPlane(snapPlane, intersection.worldIntersection); worldIntersections.Add(intersection); } } } var old_difference = snappedPosition - unsnappedPosition; var old_difference_magnitude = old_difference.magnitude * 1.5f; Vector3 newSnappedPoint = snappedPosition; CSGPlane?snappingPlane = snapPlane; for (int i = 0; i < worldIntersections.Count; i++) { if (ignoreBrushes != null && ArrayUtility.Contains(ignoreBrushes, worldIntersections[i].brush)) { continue; } List <Vector3> outEdgePoints; Vector3 outPosition; if (GridUtility.SnapToVertices(worldIntersections[i].brush, snappingPlane, unsnappedPosition, out outEdgePoints, out outPosition)) { var new_difference = outPosition - unsnappedPosition; var new_difference_magnitude = new_difference.magnitude; if (new_difference_magnitude <= old_difference_magnitude + MathConstants.EqualityEpsilon) { old_difference_magnitude = new_difference_magnitude; newSnappedPoint = outPosition; snappingEdges = outEdgePoints; snappedOnBrush = worldIntersections[i].brush; } } if (GridUtility.SnapToEdge(camera, worldIntersections[i].brush, snappingPlane ?? worldIntersections[i].worldPlane, worldIntersections[i].worldIntersection, out outEdgePoints, out outPosition)) { var new_difference = outPosition - unsnappedPosition; var new_difference_magnitude = new_difference.magnitude * 1.1f; if (new_difference_magnitude <= old_difference_magnitude + MathConstants.EqualityEpsilon) { old_difference_magnitude = new_difference_magnitude; newSnappedPoint = outPosition; snappingEdges = outEdgePoints; snappedOnBrush = worldIntersections[i].brush; } } } //snappingEdges = FindAllEdgesThatTouchPoint(snappedOnBrush, newSnappedPoint); return(newSnappedPoint); }
public static Vector3 SnapToWorld(CSGPlane snapPlane, Vector3 unsnappedPosition, Vector3 snappedPosition, ref List <Vector3> snappingEdges, out CSGBrush snappedOnBrush, CSGBrush[] ignoreBrushes = null) { snappedOnBrush = null; var intersections = new BrushIntersection[0]; var test_points = new Vector3[] { unsnappedPosition, snappedPosition }; BrushIntersection intersection; for (int i = 0; i < test_points.Length; i++) { var test_point2D = HandleUtility.WorldToGUIPoint(test_points[i]); if (SceneQueryUtility.FindWorldIntersection(test_point2D, out intersection, MathConstants.GrowBrushFactor)) { if (intersection.brush && intersection.brush.ControlMesh != null) { intersection.worldIntersection = GeometryUtility.ProjectPointOnPlane(snapPlane, intersection.worldIntersection); ArrayUtility.Add(ref intersections, intersection); } } } var old_difference = snappedPosition - unsnappedPosition; var old_difference_magnitude = old_difference.magnitude * 1.5f; Vector3 newSnappedPoint = snappedPosition; CSGPlane?snappingPlane = snapPlane; for (int i = 0; i < intersections.Length; i++) { if (ignoreBrushes != null && ArrayUtility.Contains(ignoreBrushes, intersections[i].brush)) { continue; } List <Vector3> outEdgePoints; Vector3 outPosition; if (GridUtility.SnapToVertices(intersections[i].brush, snappingPlane, unsnappedPosition, out outEdgePoints, out outPosition)) { var new_difference = outPosition - unsnappedPosition; var new_difference_magnitude = new_difference.magnitude; if (new_difference_magnitude <= old_difference_magnitude + MathConstants.EqualityEpsilon) { old_difference_magnitude = new_difference_magnitude; newSnappedPoint = outPosition; snappingEdges = outEdgePoints; snappedOnBrush = intersections[i].brush; } } if (GridUtility.SnapToEdge(intersections[i].brush, snappingPlane ?? intersections[i].plane, intersections[i].worldIntersection, out outEdgePoints, out outPosition)) { var new_difference = outPosition - unsnappedPosition; var new_difference_magnitude = new_difference.magnitude * 1.1f; if (new_difference_magnitude <= old_difference_magnitude + MathConstants.EqualityEpsilon) { old_difference_magnitude = new_difference_magnitude; newSnappedPoint = outPosition; snappingEdges = outEdgePoints; snappedOnBrush = intersections[i].brush; } } } //snappingEdges = FindAllEdgesThatTouchPoint(snappedOnBrush, newSnappedPoint); return(newSnappedPoint); }