public void CreateMeshes() { List <GameObject> used = new List <GameObject>(); for (int i = 0; i < spline.GetCurves().Count; i++) { var curve = spline.GetCurves()[i]; foreach (var tm in segments[i].transformedMeshes) { if (tm.mesh == null) { // if there is no mesh specified for this segment, we ignore it. continue; } // we try to find a game object previously generated. this avoids destroying/creating // game objects at each update, wich is faster. var childName = "segment " + i + " mesh " + segments[i].transformedMeshes.IndexOf(tm); var childTransform = generated.transform.Find(childName); GameObject go; if (childTransform == null) { go = UOUtility.Create(childName, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshBender), typeof(MeshCollider)); go.isStatic = true; } else { go = childTransform.gameObject; } go.GetComponent <MeshRenderer>().material = tm.material; go.GetComponent <MeshCollider>().material = tm.physicMaterial; // we update the data in the bender. It will decide itself if the bending must be recalculated. MeshBender mb = go.GetComponent <MeshBender>(); mb.Source = tm.mesh; mb.Curve = curve; mb.Translation = tm.translation; mb.Rotation = Quaternion.Euler(tm.rotation); mb.Scale = tm.scale; mb.ComputeIfNeeded(); used.Add(go); } } // finally, we destroy the unused objects foreach (var go in generated.transform .Cast <Transform>() .Select(child => child.gameObject).Except(used)) { UOUtility.Destroy(go); } }
private void GenerateMesh() { UOUtility.DestroyChildren(generated); int i = 0; float textureOffset = 0.0f; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); go.isStatic = true; // TODO Changed go.GetComponent <MeshRenderer>().material = material; ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>(); mb.ShapeVertices = shapeVertices; mb.TextureScale = textureScale; mb.TextureOffset = textureOffset; mb.SampleSpacing = sampleSpacing; mb.SetInterval(curve); textureOffset += curve.Length; } }
private void GenerateMesh() { UOUtility.DestroyChildren(generated); _bounds = new Bounds(); int i = 0; float textureOffset = 0.0f; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); go.GetComponent <MeshRenderer>().material = material; ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>(); mb.SetShapeVertices(shapeVertices, false); mb.SetLoopAround(loopAround, false); mb.SetTextureScale(textureScale, false); mb.SetCurve(curve, true); mb.SetTextureOffset(textureOffset, true); textureOffset += curve.Length; _bounds.Encapsulate(go.GetComponent <MeshFilter>().sharedMesh.bounds); } }
private void OnEnable() { string generatedName = "generated by " + GetType().Name; var generatedTranform = transform.Find(generatedName); generated = generatedTranform != null ? generatedTranform.gameObject : UOUtility.Create(generatedName, gameObject); spline = GetComponentInParent <Spline>(); spline.NodeListChanged += (s, e) => { toUpdate = true; foreach (CubicBezierCurve curve in spline.GetCurves()) { curve.Changed.AddListener(() => toUpdate = true); } }; foreach (CubicBezierCurve curve in spline.GetCurves()) { curve.Changed.AddListener(() => toUpdate = true); } }
static void DisplayUnselected(Spline spline, GizmoType gizmoType) { foreach (CubicBezierCurve curve in spline.GetCurves()) { Handles.DrawBezier(spline.transform.TransformPoint(curve.n1.Position), spline.transform.TransformPoint(curve.n2.Position), spline.transform.TransformPoint(curve.n1.Direction), spline.transform.TransformPoint(curve.GetInverseDirection()), CURVE_COLOR, null, 3); } }
static void SceneBezierDrawer(Spline spline, GizmoType gizmoType) { // draw a bezier curve for each curve in the spline foreach (CubicBezierCurve curve in spline.GetCurves()) { Handles.DrawBezier(spline.transform.TransformPoint(curve.n1.Position), spline.transform.TransformPoint(curve.n2.Position), spline.transform.TransformPoint(curve.n1.Direction), spline.transform.TransformPoint(curve.GetInverseDirection()), Color.white, null, 3); } }
private void OnValidate() { if (spline == null) { return; } // apply scale and roll at each node float currentLength = 0; foreach (CubicBezierCurve curve in spline.GetCurves()) { float startRate = currentLength / spline.Length; currentLength += curve.Length; float endRate = currentLength / spline.Length; curve.n1.Scale = Vector2.one * (startScale + (endScale - startScale) * startRate); curve.n2.Scale = Vector2.one * (startScale + (endScale - startScale) * endRate); curve.n1.Roll = startRoll + (endRoll - startRoll) * startRate; curve.n2.Roll = startRoll + (endRoll - startRoll) * endRate; } toUpdate = true; }
public void CreateMeshes() { UOUtility.DestroyChildren(generated); int i = 0; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("SplineMesh" + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshBender)); go.GetComponent <MeshRenderer>().material = material; MeshBender mb = go.GetComponent <MeshBender>(); mb.Source = mesh; mb.Rotation = Quaternion.Euler(rotation); mb.Curve = curve; mb.ComputeIfNeeded(); } }
private void GenerateMesh() { UOUtility.DestroyChildren(generated); int i = 0; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); go.GetComponent <MeshRenderer>().material = material; ExtrusionSegment mb = go.GetComponent <ExtrusionSegment>(); mb.SetShapeVertices(shapeVertices, false); mb.SetTextureScale(textureScale, false); mb.SetCurve(curve, true); } }
protected void GenerateMesh() { UOUtility.DestroyChildren(generated); int i = 0; float textureOffset = 0.0f; foreach (CubicBezierCurve curve in spline.GetCurves()) { GameObject go = UOUtility.Create("segment " + i++, generated, typeof(MeshFilter), typeof(MeshRenderer), typeof(ExtrusionSegment), typeof(MeshCollider)); MeshRenderer goRenderer = go.GetComponent <MeshRenderer>(); goRenderer.material = material; ExtrusionSegment seg = go.GetComponent <ExtrusionSegment>(); seg.ShapeVertices = shapeVertices; seg.TextureScale = textureScale; seg.TextureOffset = textureOffset; seg.SampleSpacing = sampleSpacing; seg.SetInterval(curve); goRenderer.enabled = visible; if (go.TryGetComponent(out MeshCollider meshCollider)) { meshCollider.enabled = collisionEnabled; } int layerNum = LayerMask.NameToLayer(layer); if (layerNum > -1) { go.gameObject.layer = layerNum; } textureOffset += curve.Length; } }
void OnSceneGUI() { Event e = Event.current; if (e.type == EventType.MouseDown) { Undo.RegisterCompleteObjectUndo(spline, "change spline topography"); // if alt key pressed, we will have to create a new node if node position is changed if (e.shift) { mustCreateNewNode = true; } } if (e.type == EventType.MouseUp) { mustCreateNewNode = false; } // disable game object transform gyzmo if (Selection.activeGameObject == spline.gameObject) { Tools.current = Tool.None; if (selection == null && spline.nodes.Count > 0) { selection = spline.nodes[0]; } } // draw a bezier curve for each curve in the spline foreach (CubicBezierCurve curve in spline.GetCurves()) { Handles.DrawBezier(spline.transform.TransformPoint(curve.n1.Position), spline.transform.TransformPoint(curve.n2.Position), spline.transform.TransformPoint(curve.n1.Direction), spline.transform.TransformPoint(curve.GetInverseDirection()), CURVE_COLOR, null, 3); } // draw the selection handles switch (selectionType) { case SelectionType.Node: // place a handle on the node and manage position change Vector3 newPosition = spline.transform.InverseTransformPoint(Handles.PositionHandle(spline.transform.TransformPoint(selection.Position), Quaternion.identity)); if (newPosition != selection.Position) { // position handle has been moved if (mustCreateNewNode) { mustCreateNewNode = false; selection = AddClonedNode(selection); selection.Direction += newPosition - selection.Position; selection.Position = newPosition; } else { selection.Direction += newPosition - selection.Position; selection.Position = newPosition; } } break; case SelectionType.Direction: var result = Handles.PositionHandle(spline.transform.TransformPoint(selection.Direction), Quaternion.identity); selection.Direction = spline.transform.InverseTransformPoint(result); break; case SelectionType.InverseDirection: result = Handles.PositionHandle(2 * spline.transform.TransformPoint(selection.Position) - spline.transform.TransformPoint(selection.Direction), Quaternion.identity); selection.Direction = 2 * selection.Position - spline.transform.InverseTransformPoint(result); break; case SelectionType.Up: result = Handles.PositionHandle(spline.transform.TransformPoint(selection.Position + selection.Up), Quaternion.LookRotation(selection.Direction - selection.Position)); selection.Up = (spline.transform.InverseTransformPoint(result) - selection.Position).normalized; break; } // draw the handles of all nodes, and manage selection motion Handles.BeginGUI(); foreach (SplineNode n in spline.nodes) { var dir = spline.transform.TransformPoint(n.Direction); var pos = spline.transform.TransformPoint(n.Position); var invDir = spline.transform.TransformPoint(2 * n.Position - n.Direction); var up = spline.transform.TransformPoint(n.Position + n.Up); // first we check if at least one thing is in the camera field of view if (!(CameraUtility.IsOnScreen(pos) || CameraUtility.IsOnScreen(dir) || CameraUtility.IsOnScreen(invDir) || (showUpVector && CameraUtility.IsOnScreen(up)))) { continue; } Vector3 guiPos = HandleUtility.WorldToGUIPoint(pos); if (n == selection) { Vector3 guiDir = HandleUtility.WorldToGUIPoint(dir); Vector3 guiInvDir = HandleUtility.WorldToGUIPoint(invDir); Vector3 guiUp = HandleUtility.WorldToGUIPoint(up); // for the selected node, we also draw a line and place two buttons for directions Handles.color = Color.red; Handles.DrawLine(guiDir, guiInvDir); // draw quads direction and inverse direction if they are not selected if (selectionType != SelectionType.Node) { if (Button(guiPos, directionButtonStyle)) { selectionType = SelectionType.Node; } } if (selectionType != SelectionType.Direction) { if (Button(guiDir, directionButtonStyle)) { selectionType = SelectionType.Direction; } } if (selectionType != SelectionType.InverseDirection) { if (Button(guiInvDir, directionButtonStyle)) { selectionType = SelectionType.InverseDirection; } } if (showUpVector) { Handles.color = Color.green; Handles.DrawLine(guiPos, guiUp); if (selectionType != SelectionType.Up) { if (Button(guiUp, upButtonStyle)) { selectionType = SelectionType.Up; } } } } else { if (Button(guiPos, nodeButtonStyle)) { selection = n; selectionType = SelectionType.Node; } } } Handles.EndGUI(); if (GUI.changed) { EditorUtility.SetDirty(target); } }