Exemple #1
0
        public override object GetValue(NodePort port)
        {
            object o = base.GetValue(port);

            if (o != null)
            {
                return(o);
            }

            Bezier3DSpline spline = GetInputValue <Bezier3DSpline>("spline", this.spline);

            if (spline == null)
            {
                return(0);
            }

            if (port.fieldName == "length")
            {
                return(spline.totalLength);
            }
            else if (port.fieldName == "pointCount")
            {
                return(spline.KnotCount);
            }
            else
            {
                return(null);
            }
        }
        private void FollowCurve(Mesh mesh, Bezier3DSpline spline)
        {
            int axis = (int)this.axis;

            Vector3[] verts = mesh.vertices;
            Vector3[] norms = mesh.normals;
            Vector4[] tan   = mesh.tangents;
            for (int i = 0; i < mesh.vertexCount; i++)
            {
                float   dist   = verts[i][axis];
                Vector3 offset = verts[i];
                offset[axis] = 0;

                Quaternion orientation = spline.GetOrientationLocalFast(dist);

                verts[i] = spline.GetPointLocal(dist) + (orientation * offset);
                norms[i] = orientation * norms[i];
                float w = tan[i].w;
                tan[i]   = orientation * new Vector3(tan[i].x, tan[i].y, tan[i].z);
                tan[i].w = w;
            }
            mesh.SetVertices(new List <Vector3>(verts));
            mesh.SetNormals(new List <Vector3>(norms));
            mesh.SetTangents(new List <Vector4>(tan));
        }
Exemple #3
0
        private void OnEnable()
        {
            CurveEditorState.Reset();

            _spline = (Bezier3DSpline)target;

            _splineDataEditor = (Bezier3DSplineDataInspector)CreateEditor(_spline.SplineData, typeof(Bezier3DSplineDataInspector));
            _splineDataEditor.ShouldDrawSceneGUI = false;
        }
Exemple #4
0
 static void OnUpdateSpline(Bezier3DSpline spline)
 {
     Graphmesh[] meshModifiers = FindObjectsOfType <Graphmesh>();
     for (int i = 0; i < meshModifiers.Length; i++)
     {
         if (meshModifiers[i].outputCache.Contains(spline))
         {
             meshModifiers[i].Generate();
         }
     }
 }
Exemple #5
0
        public override object GetValue(NodePort port)
        {
            object o = base.GetValue(port);

            if (o != null)
            {
                return(o);
            }

            Bezier3DSpline spline     = GetInputValue <Bezier3DSpline>("spline", this.spline);
            Material       material   = GetInputValue <Material>("material", this.material);
            float          resolution = GetInputValue <float>("resolution", this.resolution);

            if (spline != null)
            {
                List <Vector2> points = new List <Vector2>();
                for (int i = 0; i < spline.KnotCount; i++)
                {
                    Vector3 pos = spline.GetKnot(i).position;
                    points.Add(new Vector2(pos.x, pos.z));

                    Bezier3DCurve curve = spline.GetCurve(i);
                    if (!curve.isLinear)
                    {
                        for (int k = 1; k < resolution; k++)
                        {
                            float t = (float)k / resolution;
                            pos = curve.GetPoint(t);
                            points.Add(new Vector2(pos.x, pos.z));
                        }
                    }
                }
                int[]          tris  = Triangulate(points);
                List <Vector3> verts = points.Select(x => new Vector3(x.x, 0, x.y)).ToList();
                List <Vector3> norms = points.Select(x => Vector3.up).ToList();

                Mesh mesh = new Mesh();
                mesh.vertices  = verts.ToArray();
                mesh.triangles = tris;
                mesh.normals   = norms.ToArray();
                ModelGroup output = new ModelGroup();
                Material[] mats   = new Material[] { material };
                output.Add(new Model(mesh, mats));
                return(output);
            }
            else
            {
                return(null);
            }
        }
Exemple #6
0
        public override object GetValue(NodePort port)
        {
            object o = base.GetValue(port);

            if (o != null)
            {
                return(o);
            }

            Bezier3DSpline spline      = this.spline;
            NodePort       splineInput = GetInputByFieldName("spline").Connection;

            if (splineInput != null)
            {
                spline = splineInput.GetOutputValue() as Bezier3DSpline;
            }

            if (port.fieldName == "length")
            {
                if (spline != null)
                {
                    return(spline.totalLength);
                }
                else
                {
                    return(0);
                }
            }
            else if (port.fieldName == "pointCount")
            {
                if (spline != null)
                {
                    return(spline.KnotCount);
                }
                else
                {
                    return(0);
                }
            }
            else
            {
                return(null);
            }
        }
        public override object GetValue(NodePort port)
        {
            object o = base.GetValue(port);

            if (o != null)
            {
                return(o);
            }

            ModelGroup[]   input  = GetInputValues <ModelGroup>("input", this.input);
            Bezier3DSpline spline = GetInputValue <Bezier3DSpline>("spline", this.spline);
            ModelGroup     output = new ModelGroup();

            if (input == null)
            {
                return(output);
            }

            // Loop through input model groups
            for (int mg = 0; mg < input.Length; mg++)
            {
                if (input[mg] == null)
                {
                    continue;
                }
                // Loop through group models
                for (int i = 0; i < input[mg].Count; i++)
                {
                    Mesh mesh = input[mg][i].mesh.Copy();
                    if (spline != null)
                    {
                        FollowCurve(mesh, spline);
                    }
                    output.Add(new Model(input[mg][i])
                    {
                        mesh = mesh
                    });
                }
            }
            return(output);
        }
    public override void OnPreviewGUI(Rect r, GUIStyle background)
    {
        if (Event.current.type == EventType.Repaint)
        {
            Bezier3DSpline spline = target as Bezier3DSpline;

            RectOffset rectOffset = new RectOffset(-5, -5, -5, -5);
            r = rectOffset.Add(r);
            Rect position1 = r;
            Rect position2 = r;
            position1.width = 110f;
            position2.xMin += 110f;
            position2.width = 110f;
            EditorGUI.LabelField(position1, "Property", styles.headerStyle);
            EditorGUI.LabelField(position2, "Value", styles.headerStyle);
            position1.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
            position2.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
            ShowProperty(ref position1, ref position2, "Point Count", spline.KnotCount.ToString());
            ShowProperty(ref position1, ref position2, "Total Length", spline.totalLength.ToString());
        }
    }
Exemple #9
0
        public override object GetValue(NodePort port)
        {
            object o = base.GetValue(port);

            if (o != null)
            {
                return(o);
            }

            List <Model>   input      = GetModelList(GetInputByFieldName("model"));
            NodePort       splinePort = GetPortByFieldName("spline");
            Bezier3DSpline spline     = splinePort.Connection.GetOutputValue() as Bezier3DSpline;

            if (spline == null)
            {
                Debug.Log("Spline is null");
            }

            for (int i = 0; i < input.Count; i++)
            {
                FollowCurve(input[i], spline);
            }
            return(input);
        }
Exemple #10
0
    override public void OnInspectorGUI()
    {
        Bezier3DSpline spline = target as Bezier3DSpline;

        ValidateSelected();

        EditorGUILayout.LabelField("Spline settings");

        EditorGUI.indentLevel = 1;

        EditorGUI.BeginChangeCheck();
        int steps = spline.cacheDensity;

        steps = EditorGUILayout.DelayedIntField("Cache density", steps);
        if (EditorGUI.EndChangeCheck())
        {
            spline.SetCacheDensity(steps);
            if (onUpdateSpline != null)
            {
                onUpdateSpline(spline);
            }
        }

        EditorGUI.BeginChangeCheck();
        bool closed = spline.closed;

        closed = EditorGUILayout.Toggle(new GUIContent("Closed", "Generate an extra curve, connecting the final point to the first point."), closed);
        if (EditorGUI.EndChangeCheck())
        {
            spline.SetClosed(closed);
            if (onUpdateSpline != null)
            {
                onUpdateSpline(spline);
            }
            SceneView.RepaintAll();
        }

        Rect position = EditorGUILayout.GetControlRect(false, 19f, EditorStyles.numberField);

        position.xMin += EditorGUIUtility.labelWidth;

        Rect flipRect = new Rect(position.x, position.y, position.width, position.height);

        if (GUI.Button(flipRect, new GUIContent("Flip", "Flip spline direction.")))
        {
            spline.Flip();
            if (onUpdateSpline != null)
            {
                onUpdateSpline(spline);
            }
            SceneView.RepaintAll();
        }


        EditorGUI.indentLevel = 0;

        EditorGUILayout.Space();
        if (activeKnot != -1)
        {
            EditorGUILayout.LabelField("Selected point");
            EditorGUI.indentLevel = 1;
            Bezier3DSpline.Knot knot = spline.GetKnot(activeKnot);

            position       = EditorGUILayout.GetControlRect(false, 19f, EditorStyles.numberField);
            position.xMin += EditorGUIUtility.labelWidth;

            EditorGUI.BeginChangeCheck();
            bool orientation     = knot.orientation != null;
            Rect orientationRect = new Rect(position.x, position.y, position.height, position.height);
            orientation = GUI.Toggle(orientationRect, orientation, new GUIContent("O", "Orientation Anchor"), "Button");
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(spline, "Toggle Bezier Orientation Anchor");
                if (orientation)
                {
                    knot.orientation = Quaternion.identity;
                }
                else
                {
                    knot.orientation = null;
                }
                spline.SetKnot(activeKnot, knot);
                if (onUpdateSpline != null)
                {
                    onUpdateSpline(spline);
                }
                SceneView.RepaintAll();
            }

            EditorGUI.BeginChangeCheck();
            bool auto     = knot.auto != 0f;
            Rect autoRect = new Rect(position.x + position.height + 4, position.y, position.height, position.height);
            auto = GUI.Toggle(autoRect, auto, new GUIContent("A", "Auto Handles"), "Button");
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(spline, "Toggle Bezier Auto Handles");
                if (auto)
                {
                    knot.auto = 0.33f;
                }
                else
                {
                    knot.auto = 0f;
                }
                spline.SetKnot(activeKnot, knot);
                if (onUpdateSpline != null)
                {
                    onUpdateSpline(spline);
                }
                SceneView.RepaintAll();
            }


            if (orientation)
            {
                EditorGUILayout.Space();
                EditorGUI.BeginChangeCheck();
                Vector3 orientationEuler = knot.orientation.Value.eulerAngles;
                orientationEuler = EditorGUILayout.Vector3Field("Orientation", orientationEuler);
                if (EditorGUI.EndChangeCheck())
                {
                    knot.orientation = Quaternion.Euler(orientationEuler);
                    spline.SetKnot(activeKnot, knot);
                    SceneView.RepaintAll();
                }
            }

            if (auto)
            {
                EditorGUILayout.Space();
                EditorGUI.BeginChangeCheck();
                knot.position = EditorGUILayout.Vector3Field("Position", knot.position);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(spline, "Edit Bezier Point");
                    spline.SetKnot(activeKnot, knot);
                    if (onUpdateSpline != null)
                    {
                        onUpdateSpline(spline);
                    }
                    SceneView.RepaintAll();
                }
                EditorGUI.BeginChangeCheck();
                knot.auto = EditorGUILayout.FloatField("Distance", knot.auto);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(spline, "Edit Bezier Point");
                    spline.SetKnot(activeKnot, knot);
                    if (onUpdateSpline != null)
                    {
                        onUpdateSpline(spline);
                    }
                    SceneView.RepaintAll();
                }
            }
            else
            {
                EditorGUILayout.Space();
                EditorGUI.BeginChangeCheck();
                knot.position = EditorGUILayout.Vector3Field("Position", knot.position);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(spline, "Edit Bezier Point");
                    spline.SetKnot(activeKnot, knot);
                    if (onUpdateSpline != null)
                    {
                        onUpdateSpline(spline);
                    }
                    SceneView.RepaintAll();
                }
                EditorGUI.BeginChangeCheck();
                knot.handleIn = EditorGUILayout.Vector3Field("Handle in", knot.handleIn);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(spline, "Edit Bezier Handle");
                    if (mirror)
                    {
                        knot.handleOut = -knot.handleIn;
                    }
                    spline.SetKnot(activeKnot, knot);
                    if (onUpdateSpline != null)
                    {
                        onUpdateSpline(spline);
                    }
                    SceneView.RepaintAll();
                }
                EditorGUI.BeginChangeCheck();
                knot.handleOut = EditorGUILayout.Vector3Field("Handle out", knot.handleOut);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(spline, "Edit Bezier Handle");
                    if (mirror)
                    {
                        knot.handleIn = -knot.handleOut;
                    }
                    spline.SetKnot(activeKnot, knot);
                    if (onUpdateSpline != null)
                    {
                        onUpdateSpline(spline);
                    }
                    SceneView.RepaintAll();
                }
            }
        }
    }
Exemple #11
0
 void OnEnable()
 {
     spline = target as Bezier3DSpline;
 }
Exemple #12
0
        public override void OnInspectorGUI()
        {
            _spline = (Bezier3DSpline)target;

            _splineDataEditor.OnInspectorGUI();
        }