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)); }
private void OnEnable() { CurveEditorState.Reset(); _spline = (Bezier3DSpline)target; _splineDataEditor = (Bezier3DSplineDataInspector)CreateEditor(_spline.SplineData, typeof(Bezier3DSplineDataInspector)); _splineDataEditor.ShouldDrawSceneGUI = false; }
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(); } } }
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); } }
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()); } }
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); }
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(); } } } }
void OnEnable() { spline = target as Bezier3DSpline; }
public override void OnInspectorGUI() { _spline = (Bezier3DSpline)target; _splineDataEditor.OnInspectorGUI(); }