public static void LoadPrefs()
 {
     defaultAlwaysDraw     = EditorPrefs.GetBool("Dreamteck.Splines.defaultAlwaysDraw", false);
     defaultShowThickness  = EditorPrefs.GetBool("Dreamteck.Splines.defaultShowThickness", false);
     default2D             = EditorPrefs.GetBool("Dreamteck.Splines.default2D", false);
     showPointNumbers      = EditorPrefs.GetBool("Dreamteck.Splines.showPointNumbers", false);
     defaultColor          = LoadColor("Dreamteck.Splines.defaultColor", Color.white);
     highlightColor        = LoadColor("Dreamteck.Splines.highlightColor", new Color(0f, 0.564f, 1f, 1f));
     highlightContentColor = LoadColor("Dreamteck.Splines.highlightContentColor", new Color(1f, 1f, 1f, 0.95f));
     defaultComputerSpace  = (SplineComputer.Space)EditorPrefs.GetInt("Dreamteck.Splines.defaultComputerSpace", 0);
     defaultType           = (Spline.Type)EditorPrefs.GetInt("Dreamteck.Splines.defaultType", 0);
     loaded = true;
 }
Example #2
0
        /// <summary>
        /// Set a point of this computer's spline. The point must be in world coordinates.
        /// </summary>
        /// <param name="index"></param>
        /// <param name="point"></param>
        /// <param name="updateNodes">If there are nodes, connected to this point, should they be updated?</param>
        public void SetPoint(int index, SplinePoint point, SplineComputer.Space setSpace = SplineComputer.Space.World)
        {
            if (index < 0 || index >= spline.points.Length)
            {
                return;
            }
            bool        rebuild  = false;
            SplinePoint newPoint = point;

            if (_space == SplineComputer.Space.Local && setSpace == SplineComputer.Space.World)
            {
                newPoint.position = InverseTransformPoint(point.position);
                newPoint.tangent  = InverseTransformPoint(point.tangent);
                newPoint.tangent2 = InverseTransformPoint(point.tangent2);
                newPoint.normal   = InverseTransformDirection(point.normal);
            }
            if (newPoint.position != spline.points[index].position)
            {
                rebuild = true;
            }
            else if (newPoint.tangent != spline.points[index].tangent)
            {
                rebuild = true;
            }
            else if (newPoint.tangent2 != spline.points[index].tangent2)
            {
                rebuild = true;
            }
            else if (newPoint.size != spline.points[index].size)
            {
                rebuild = true;
            }
            else if (newPoint.type != spline.points[index].type)
            {
                rebuild = true;
            }
            else if (newPoint.color != spline.points[index].color)
            {
                rebuild = true;
            }
            else if (newPoint.normal != spline.points[index].normal)
            {
                rebuild = true;
            }
            spline.points[index] = newPoint;
            if (rebuild)
            {
                Rebuild();
                SetNodeForPoint(index, point);
            }
        }
Example #3
0
 /// <summary>
 /// Get the points from this computer's spline. All points are transformed in world coordinates.
 /// </summary>
 /// <returns></returns>
 public SplinePoint[] GetPoints(SplineComputer.Space getSpace = SplineComputer.Space.World)
 {
     SplinePoint[] points = new SplinePoint[spline.points.Length];
     for (int i = 0; i < points.Length; i++)
     {
         points[i] = spline.points[i];
         if (_space == SplineComputer.Space.Local && getSpace == SplineComputer.Space.World)
         {
             points[i].position = TransformPoint(points[i].position);
             points[i].tangent  = TransformPoint(points[i].tangent);
             points[i].tangent2 = TransformPoint(points[i].tangent2);
             points[i].normal   = TransformDirection(points[i].normal);
         }
     }
     return(points);
 }
Example #4
0
        public static void OnGUI()
        {
            if (!loaded)
            {
                LoadPrefs();
            }
            EditorGUILayout.LabelField("Newly created splines:", EditorStyles.boldLabel);
            startInCreationMode  = EditorGUILayout.Toggle("Start in Creation Mode", startInCreationMode);
            defaultComputerSpace = (SplineComputer.Space)EditorGUILayout.EnumPopup("Space", defaultComputerSpace);
            defaultType          = (Spline.Type)EditorGUILayout.EnumPopup("Type", defaultType);
            defaultAlwaysDraw    = EditorGUILayout.Toggle("Always draw", defaultAlwaysDraw);
            defaultShowThickness = EditorGUILayout.Toggle("Show thickness", defaultShowThickness);
            default2D            = EditorGUILayout.Toggle("2D Mode", default2D);
            defaultColor         = EditorGUILayout.ColorField("Spline color", defaultColor);
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Newly created points:", EditorStyles.boldLabel);
            createPointSize  = EditorGUILayout.FloatField("Default Size", createPointSize);
            createPointColor = EditorGUILayout.ColorField("Default Color", createPointColor);
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Editor", EditorStyles.boldLabel);
            highlightColor        = EditorGUILayout.ColorField("Highlight color", highlightColor);
            highlightContentColor = EditorGUILayout.ColorField("Highlight content color", highlightContentColor);
            duplicationDirection  = (DuplicationDirection)EditorGUILayout.EnumPopup("Duplicate Direction", duplicationDirection);
            showPointNumbers      = EditorGUILayout.Toggle("Show point numbers", showPointNumbers);

            if (GUILayout.Button("Use Defaults", GUILayout.Width(120)))
            {
                duplicationDirection  = DuplicationDirection.Forward;
                defaultAlwaysDraw     = false;
                defaultShowThickness  = false;
                default2D             = false;
                startInCreationMode   = true;
                defaultColor          = Color.white;
                highlightColor        = new Color(0f, 0.564f, 1f, 1f);
                highlightContentColor = new Color(1f, 1f, 1f, 0.95f);
                showPointNumbers      = false;
                defaultComputerSpace  = SplineComputer.Space.Local;
                defaultType           = Spline.Type.Hermite;
                createPointSize       = 1f;
                createPointColor      = Color.white;
                SavePrefs();
            }
            if (GUI.changed)
            {
                SavePrefs();
            }
        }
Example #5
0
 public static void LoadPrefs()
 {
     defaultAlwaysDraw     = EditorPrefs.GetBool("Dreamteck.Splines.defaultAlwaysDraw", false);
     defaultShowThickness  = EditorPrefs.GetBool("Dreamteck.Splines.defaultShowThickness", false);
     default2D             = EditorPrefs.GetBool("Dreamteck.Splines.default2D", false);
     startInCreationMode   = EditorPrefs.GetBool("Dreamteck.Splines.startInCreationMode", true);
     showPointNumbers      = EditorPrefs.GetBool("Dreamteck.Splines.showPointNumbers", false);
     pointEditSpace        = (SplineComputer.Space)EditorPrefs.GetInt("Dreamteck.Splines.pointEditSpace", 1);
     defaultColor          = LoadColor("Dreamteck.Splines.defaultColor", Color.white);
     highlightColor        = LoadColor("Dreamteck.Splines.highlightColor", new Color(0f, 0.564f, 1f, 1f));
     highlightContentColor = LoadColor("Dreamteck.Splines.highlightContentColor", new Color(1f, 1f, 1f, 0.95f));
     defaultComputerSpace  = (SplineComputer.Space)EditorPrefs.GetInt("Dreamteck.Splines.defaultComputerSpace", 0);
     defaultType           = (Spline.Type)EditorPrefs.GetInt("Dreamteck.Splines.defaultType", 0);
     duplicationDirection  = (DuplicationDirection)EditorPrefs.GetInt("Dreamteck.Splines.duplicationDirection", 0);
     createPointSize       = EditorPrefs.GetFloat("Dreamteck.Splines.createPointSize", 1f);
     createPointColor      = LoadColor("Dreamteck.Splines.createPointColor", Color.white);
     loaded = true;
 }
Example #6
0
 /// <summary>
 /// Get a point from this computer's spline. The point is transformed in world coordinates.
 /// </summary>
 /// <param name="index">Point index</param>
 /// <returns></returns>
 public SplinePoint GetPoint(int index, SplineComputer.Space getSpace = SplineComputer.Space.World)
 {
     if (index < 0 || index >= spline.points.Length)
     {
         return(new SplinePoint());
     }
     if (_space == SplineComputer.Space.Local && getSpace == SplineComputer.Space.World)
     {
         SplinePoint point = spline.points[index];
         point.position = TransformPoint(point.position);
         point.tangent  = TransformPoint(point.tangent);
         point.tangent2 = TransformPoint(point.tangent2);
         point.normal   = TransformDirection(point.normal);
         return(point);
     }
     else
     {
         return(spline.points[index]);
     }
 }
Example #7
0
        void PointMenu()
        {
            if (selectedPoints.Count == 0 || points.Length == 0)
            {
                return;
            }
            //Otherwise show the editing menu + the point selection menu
            Vector3 avgPos    = Vector3.zero;
            Vector3 avgTan    = Vector3.zero;
            Vector3 avgTan2   = Vector3.zero;
            Vector3 avgNormal = Vector3.zero;
            float   avgSize   = 0f;
            Color   avgColor  = Color.clear;

            for (int i = 0; i < selectedPoints.Count; i++)
            {
                avgPos    += points[selectedPoints[i]].position;
                avgNormal += points[selectedPoints[i]].normal;
                avgSize   += points[selectedPoints[i]].size;
                avgTan    += points[selectedPoints[i]].tangent;
                avgTan2   += points[selectedPoints[i]].tangent2;
                avgColor  += points[selectedPoints[i]].color;
            }

            avgPos   /= selectedPoints.Count;
            avgTan   /= selectedPoints.Count;
            avgTan2  /= selectedPoints.Count;
            avgSize  /= selectedPoints.Count;
            avgColor /= selectedPoints.Count;
            avgNormal.Normalize();

            SplinePoint avgPoint = new SplinePoint(avgPos, avgPos);

            avgPoint.tangent  = avgTan;
            avgPoint.tangent2 = avgTan2;
            avgPoint.size     = avgSize;
            avgPoint.color    = avgColor;
            avgPoint.type     = points[selectedPoints[0]].type;
            SplinePoint.Type lastType = avgPoint.type;

            avgPoint.normal = avgNormal;
            EditorGUI.BeginChangeCheck();
            SplineComputer.Space lastSpace = SplinePrefs.pointEditSpace;
            SplinePrefs.pointEditSpace = (SplineComputer.Space)EditorGUILayout.EnumPopup("Edit Space", SplinePrefs.pointEditSpace);
            if (lastSpace != SplinePrefs.pointEditSpace)
            {
                SplinePrefs.SavePrefs();
            }
            if (splineType == Spline.Type.Bezier)
            {
                if (is2D)
                {
                    avgPoint.SetTangentPosition(TransformedPositionField2D("Tangent 1", avgPoint.tangent));
                    avgPoint.SetTangent2Position(TransformedPositionField2D("Tangent 2", avgPoint.tangent2));
                }
                else
                {
                    avgPoint.SetTangentPosition(TransformedPositionField("Tangent 1", avgPoint.tangent));
                    avgPoint.SetTangent2Position(TransformedPositionField("Tangent 2", avgPoint.tangent2));
                }
            }
            if (is2D)
            {
                avgPoint.SetPosition(TransformedPositionField2D("Position", avgPoint.position));
            }
            else
            {
                avgPoint.SetPosition(TransformedPositionField("Position", avgPoint.position));
            }
            if (!is2D)
            {
                if (SplinePrefs.pointEditSpace == SplineComputer.Space.Local)
                {
                    avgPoint.normal = _matrix.inverse.MultiplyVector(avgPoint.normal);
                }
                avgPoint.normal = TransformedPositionField("Normal", avgPoint.normal);
                if (SplinePrefs.pointEditSpace == SplineComputer.Space.Local)
                {
                    avgPoint.normal = _matrix.MultiplyVector(avgPoint.normal);
                }
            }
            avgPoint.size  = EditorGUILayout.FloatField("Size", avgPoint.size);
            avgPoint.color = EditorGUILayout.ColorField("Color", avgPoint.color);
            if (splineType == Spline.Type.Bezier)
            {
                avgPoint.type = (SplinePoint.Type)EditorGUILayout.EnumPopup("Point Type", avgPoint.type);
            }

            if (!EditorGUI.EndChangeCheck())
            {
                return;
            }
            RecordUndo("Edit Points");
            for (int i = 0; i < selectedPoints.Count; i++)
            {
                points[selectedPoints[i]].SetPosition(GetChangedVector(avgPos, avgPoint.position, points[selectedPoints[i]].position));
                points[selectedPoints[i]].normal = GetChangedVector(avgNormal, avgPoint.normal, points[selectedPoints[i]].normal);

                if (splineType == Spline.Type.Bezier)
                {
                    points[selectedPoints[i]].SetTangentPosition(GetChangedVector(avgTan, avgPoint.tangent, points[selectedPoints[i]].tangent));
                    points[selectedPoints[i]].SetTangent2Position(GetChangedVector(avgTan2, avgPoint.tangent2, points[selectedPoints[i]].tangent2));
                }
                if (avgPoint.size != avgSize)
                {
                    points[selectedPoints[i]].size = avgPoint.size;
                }
                if (avgColor != avgPoint.color)
                {
                    points[selectedPoints[i]].color = avgPoint.color;
                }
                if (lastType != avgPoint.type)
                {
                    points[selectedPoints[i]].type = avgPoint.type;
                }
            }
        }
Example #8
0
        /// <summary>
        /// Set the points of this computer's spline.
        /// </summary>
        /// <param name="points"></param>
        /// <param name="updateNodes">Should it also update any linked nodes?</param>
        public void SetPoints(SplinePoint[] points, SplineComputer.Space setSpace = SplineComputer.Space.World)
        {
            bool rebuild = false;

            if (points.Length != spline.points.Length)
            {
                rebuild = true;
                if (points.Length < 4)
                {
                    Break();
                }
                spline.points = new SplinePoint[points.Length];
            }
            SplinePoint newPoint;

            for (int i = 0; i < points.Length; i++)
            {
                newPoint = points[i];
                if (_space == SplineComputer.Space.Local && setSpace == SplineComputer.Space.World)
                {
                    newPoint.position = InverseTransformPoint(points[i].position);
                    newPoint.tangent  = InverseTransformPoint(points[i].tangent);
                    newPoint.tangent2 = InverseTransformPoint(points[i].tangent2);
                    newPoint.normal   = InverseTransformDirection(points[i].normal);
                }
                if (!rebuild)
                {
                    if (newPoint.position != spline.points[i].position)
                    {
                        rebuild = true;
                    }
                    else if (newPoint.tangent != spline.points[i].tangent)
                    {
                        rebuild = true;
                    }
                    else if (newPoint.tangent2 != spline.points[i].tangent2)
                    {
                        rebuild = true;
                    }
                    else if (newPoint.size != spline.points[i].size)
                    {
                        rebuild = true;
                    }
                    else if (newPoint.type != spline.points[i].type)
                    {
                        rebuild = true;
                    }
                    else if (newPoint.color != spline.points[i].color)
                    {
                        rebuild = true;
                    }
                    else if (newPoint.normal != spline.points[i].normal)
                    {
                        rebuild = true;
                    }
                }
                spline.points[i] = newPoint;
            }
            if (rebuild)
            {
                Rebuild();
                UpdateConnectedNodes(points);
            }
        }