Example #1
0
        private void closeRoute()
        {
            // we will use the GoSpline class to handle the dirtywork of closing the path
            var path = new GoSpline(_target.nodes, _target.forceStraightLinePath);

            path.closePath();

            _target.nodes = path.nodes;

            GUI.changed = true;
        }
 public ScalePathTweenProperty(GoSpline path, bool isRelative = false) : base(isRelative)
 {
     _path = path;
 }
Example #3
0
        public override void OnInspectorGUI()
        {
            // what kind of handles shall we use?
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Use Standard Handles");
            _target.useStandardHandles = EditorGUILayout.Toggle(_target.useStandardHandles);
            EditorGUILayout.EndHorizontal();


            // path name:
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Route Name");
            _target.pathName = EditorGUILayout.TextField(_target.pathName);
            EditorGUILayout.EndHorizontal();

            if (_target.pathName == string.Empty)
            {
                _target.pathName = "route" + Random.Range(1, 100000);
            }


            // path color:
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Route Color");
            _target.pathColor = EditorGUILayout.ColorField(_target.pathColor);
            EditorGUILayout.EndHorizontal();


            // force straight lines:
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Force Straight Line Path");
            _target.forceStraightLinePath = EditorGUILayout.Toggle(_target.forceStraightLinePath);
            EditorGUILayout.EndHorizontal();


            // resolution
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Editor Drawing Resolution");
            _target.pathResolution = EditorGUILayout.IntSlider(_target.pathResolution, 2, 100);
            EditorGUILayout.EndHorizontal();


            EditorGUILayout.Separator();


            // insert node - we need 3 or more nodes for insert to make sense
            if (_target.nodes.Count > 2)
            {
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PrefixLabel("Insert Node");
                _insertIndex = EditorGUILayout.IntField(_insertIndex);
                if (GUILayout.Button("Insert"))
                {
                    // validate the index
                    if (_insertIndex >= 0 && _insertIndex < _target.nodes.Count)
                    {
                        // insert the node offsetting it a bit from the previous node
                        var copyNodeIndex = _insertIndex == 0 ? 0 : _insertIndex;
                        var copyNode      = _target.nodes[copyNodeIndex];
                        copyNode.x += 10;
                        copyNode.z += 10;

                        insertNodeAtIndex(copyNode, _insertIndex);
                    }
                }
                EditorGUILayout.EndHorizontal();
            }


            // close route?
            if (GUILayout.Button("Close Path"))
            {
                Undo.RecordObject(_target, "Path Vector Changed");
                closeRoute();
                GUI.changed = true;
            }


            // shift the start point to the origin
            if (GUILayout.Button("Shift Path to Start at Origin"))
            {
                Undo.RecordObject(_target, "Path Vector Changed");

                var offset = Vector3.zero;

                // see what kind of path we are. the simplest case is just a straight line
                var path = new GoSpline(_target.nodes, _target.forceStraightLinePath);
                if (path.splineType == GoSplineType.StraightLine || _target.nodes.Count < 5)
                {
                    offset = Vector3.zero - _target.nodes[0];
                }
                else
                {
                    offset = Vector3.zero - _target.nodes[1];
                }

                for (var i = 0; i < _target.nodes.Count; i++)
                {
                    _target.nodes[i] += offset;
                }

                GUI.changed = true;
            }


            // reverse
            if (GUILayout.Button("Reverse Path"))
            {
                Undo.RecordObject(_target, "Path Vector Changed");
                _target.nodes.Reverse();
                GUI.changed = true;
            }


            // persist to disk
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Save to/Read from Disk");

            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Serialize and Save Path");
            if (GUILayout.Button("Save"))
            {
                var path = EditorUtility.SaveFilePanel("Save path", Application.dataPath + "/StreamingAssets", _target.pathName + ".asset", "asset");
                if (path != string.Empty)
                {
                    persistRouteToDisk(path);

                    // fetch the filename and set it as the routeName
                    _target.pathName = Path.GetFileName(path).Replace(".asset", string.Empty);
                    GUI.changed      = true;
                }
            }
            EditorGUILayout.EndHorizontal();


            // load from disk
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Load saved path");
            if (GUILayout.Button("Load"))
            {
                var path = EditorUtility.OpenFilePanel("Choose path to load", Path.Combine(Application.dataPath, "StreamingAssets"), "asset");
                if (path != string.Empty)
                {
                    if (!File.Exists(path))
                    {
                        EditorUtility.DisplayDialog("File does not exist", "Path couldn't find the file you specified", "Close");
                    }
                    else
                    {
                        _target.nodes    = GoSpline.bytesToVector3List(File.ReadAllBytes(path));
                        _target.pathName = Path.GetFileName(path).Replace(".asset", string.Empty);
                        GUI.changed      = true;
                    }
                }
            }
            EditorGUILayout.EndHorizontal();


            // node display
            EditorGUILayout.Space();
            _showNodeDetails = EditorGUILayout.Foldout(_showNodeDetails, "Show Node Values");
            if (_showNodeDetails)
            {
                EditorGUI.indentLevel++;
                for (int i = 0; i < _target.nodes.Count; i++)
                {
                    _target.nodes[i] = EditorGUILayout.Vector3Field("Node " + (i + 1), _target.nodes[i]);
                }
                EditorGUI.indentLevel--;
            }


            // instructions
            EditorGUILayout.Space();
            EditorGUILayout.HelpBox("While dragging a node, hold down Ctrl and slowly move the cursor to snap to a nearby point\n\n" +
                                    "Click the 'Close Path' button to add a new node that will close out the current path.\n\n" +
                                    "Hold Command while dragging a node to snap in 5 point increments\n\n" +
                                    "Double click to add a new node at the end of the path\n\n" +
                                    "Hold down alt while adding a node to prepend the new node at the front of the route\n\n" +
                                    "Press delete or backspace to delete the selected node\n\n" +
                                    "NOTE: make sure you have the pan tool selected while editing paths", MessageType.None);


            // update and redraw:
            if (GUI.changed)
            {
                EditorUtility.SetDirty(_target);
                Repaint();
            }
        }
 public Vector3PathTweenProperty(string propertyName, GoSpline path, bool isRelative = false) : base(isRelative)
 {
     this.propertyName = propertyName;
     _path             = path;
 }