protected bool IgnoreDepthForRayCasts(Camera camera)
 {
     return(CSGSettings.Assume2DView(camera));
 }
 protected bool IgnoreDepthForRayCasts(SceneView sceneview)
 {
     return(CSGSettings.Assume2DView(sceneview));
 }
Esempio n. 3
0
        protected void GrabHeightHandle(int index, bool ignoreFirstMouseUp = false)
        {
            var sceneView = SceneView.currentDrawingSceneView;            //(SceneView.currentDrawingSceneView != null) ? SceneView.currentDrawingSceneView : SceneView.lastActiveSceneView;
            var camera    = (sceneView == null) ? null : sceneView.camera;

            if (camera == null)
            {
                return;
            }

            var assume2DView = CSGSettings.Assume2DView(sceneView);

            firstClick                        = ignoreFirstMouseUp;
            editMode                          = EditMode.ExtrudeShape;
            GUIUtility.hotControl             = extrusionPoints[index].ID;
            GUIUtility.keyboardControl        = extrusionPoints[index].ID;
            EditorGUIUtility.editingTextField = false;
            EditorGUIUtility.SetWantsMouseJumping(1);

            var     surfaceDirection = buildPlane.normal;
            var     closestAxisForward = GeometryUtility.SnapToClosestAxis(-camera.transform.forward);
            var     closestAxisArrow = GeometryUtility.SnapToClosestAxis(surfaceDirection);
            Vector3 tangent, normal;
            float   dot = Mathf.Abs(Vector3.Dot(closestAxisForward, closestAxisArrow));

            if (dot != 1)
            {
                Vector3 v1, v2;
                if (closestAxisForward.x == 0 && closestAxisForward.y == 0)
                {
                    v1 = new Vector3(1, 0, 0);
                    v2 = new Vector3(0, 1, 0);
                }
                else
                if (closestAxisForward.x == 0 && closestAxisForward.z == 0)
                {
                    v1 = new Vector3(1, 0, 0);
                    v2 = new Vector3(0, 0, 1);
                }
                else
                //if (closestAxisForward.y == 0 && closestAxisForward.z == 0)
                {
                    v1 = new Vector3(0, 1, 0);
                    v2 = new Vector3(0, 0, 1);
                }

                var   backward = -camera.transform.forward;
                float dot1     = Vector3.Dot(backward, v1);
                float dot2     = Vector3.Dot(backward, v2);
                if (dot1 < dot2)
                {
                    tangent = v1;
                }
                else
                {
                    tangent = v2;
                }
            }
            else
            {
                tangent = GeometryUtility.SnapToClosestAxis(Vector3.Cross(surfaceDirection, -camera.transform.forward));
            }

            normal = Vector3.Cross(surfaceDirection, tangent);

            if (assume2DView)
            {
                normal = -camera.transform.forward;
            }

            if (normal == MathConstants.zeroVector3)
            {
                normal = GeometryUtility.SnapToClosestAxis(-camera.transform.forward);
            }

            movePlane = new CSGPlane(normal, extrusionPoints[index].Position);
            if (!assume2DView && Mathf.Abs(movePlane.Distance(camera.transform.position)) < 2.0f)
            {
                var new_tangent = Vector3.Cross(normal, closestAxisForward);
                if (new_tangent != MathConstants.zeroVector3)
                {
                    tangent   = new_tangent;
                    normal    = Vector3.Cross(surfaceDirection, tangent);
                    movePlane = new CSGPlane(normal, extrusionPoints[index].Position);
                }
            }

            movePolygonDirection = haveForcedDirection ? forcedDirection : buildPlane.normal;

            if (!isFinished)
            {
                RealtimeCSG.CSGGrid.SetForcedGrid(movePlane);
            }

            var plane = new CSGPlane(buildPlane.normal, extrusionPoints[index].Position);

            heightPosition = Event.current.mousePosition;

            heightHandleOffset = (plane.Distance(GetHeightHandlePosition(extrusionPoints[index].Position)) * movePolygonDirection);

            if (float.IsInfinity(heightHandleOffset.x) || float.IsNaN(heightHandleOffset.x) ||
                float.IsInfinity(heightHandleOffset.y) || float.IsNaN(heightHandleOffset.y) ||
                float.IsInfinity(heightHandleOffset.z) || float.IsNaN(heightHandleOffset.z))
            {
                heightHandleOffset = Vector3.zero;
            }
        }