public override void DrawScene() { base.DrawScene(); if (spline.isClosed) { return; } Camera editorCamera = SceneView.currentDrawingSceneView.camera; for (int i = 0; i < availableMergeComputers.Length; i++) { SplineDrawer.DrawSplineComputer(availableMergeComputers[i]); SplinePoint startPoint = availableMergeComputers[i].GetPoint(0); SplinePoint endPoint = availableMergeComputers[i].GetPoint(availableMergeComputers[i].pointCount - 1); Handles.color = availableMergeComputers[i].editorPathColor; if (SplineEditorHandles.CircleButton(startPoint.position, Quaternion.LookRotation(editorCamera.transform.position - startPoint.position), HandleUtility.GetHandleSize(startPoint.position) * 0.15f, 1f, availableMergeComputers[i].editorPathColor)) { Merge(i, MergeSide.Start); break; } if (SplineEditorHandles.CircleButton(endPoint.position, Quaternion.LookRotation(editorCamera.transform.position - endPoint.position), HandleUtility.GetHandleSize(endPoint.position) * 0.15f, 1f, availableMergeComputers[i].editorPathColor)) { Merge(i, MergeSide.End); break; } } Handles.color = Color.white; }
protected override void InsertMode(Vector3 screenCoordinates) { base.InsertMode(screenCoordinates); double percent = ProjectScreenSpace(screenCoordinates); editor.evaluate(percent, evalResult); if (editor.eventModule.mouseRight) { SplineEditorHandles.DrawCircle(evalResult.position, Quaternion.LookRotation(editorCamera.transform.position - evalResult.position), HandleUtility.GetHandleSize(evalResult.position) * 0.2f); return; } if (SplineEditorHandles.CircleButton(evalResult.position, Quaternion.LookRotation(editorCamera.transform.position - evalResult.position), HandleUtility.GetHandleSize(evalResult.position) * 0.2f, 1.5f, color)) { RecordUndo("Create Point"); SplinePoint newPoint = new SplinePoint(evalResult.position, evalResult.position); newPoint.size = evalResult.size; newPoint.color = evalResult.color; newPoint.normal = evalResult.up; SplinePoint[] newPoints = new SplinePoint[points.Length + 1]; double floatIndex = (points.Length - 1) * percent; int pointIndex = Mathf.Clamp(DMath.FloorInt(floatIndex), 0, points.Length - 2); for (int i = 0; i < newPoints.Length; i++) { if (i <= pointIndex) { newPoints[i] = points[i]; } else if (i == pointIndex + 1) { newPoints[i] = newPoint; } else { newPoints[i] = points[i - 1]; } } SplineComputer spline = dsEditor.spline; points = newPoints; lastCreated = points.Length - 1; dsEditor.UpdateSpline(); spline.ShiftNodes(pointIndex + 1, spline.pointCount - 1, 1); if (createNode) { CreateNodeForPoint(pointIndex + 1); } } }
public override void DrawScene() { bool change = false; Camera editorCamera = SceneView.currentDrawingSceneView.camera; for (int i = 0; i < spline.pointCount; i++) { Vector3 pos = spline.GetPointPosition(i); if (SplineEditorHandles.CircleButton(pos, Quaternion.LookRotation(editorCamera.transform.position - pos), HandleUtility.GetHandleSize(pos) * 0.12f, 1f, spline.editorPathColor)) { SplitAtPoint(i); change = true; break; } } SplineSample projected = spline.Evaluate(ProjectMouse()); if (!change) { float pointValue = (float)projected.percent * (spline.pointCount - 1); int pointIndex = Mathf.FloorToInt(pointValue); float size = HandleUtility.GetHandleSize(projected.position) * 0.3f; Vector3 up = Vector3.Cross(editorCamera.transform.forward, projected.forward).normalized *size + projected.position; Vector3 down = Vector3.Cross(projected.forward, editorCamera.transform.forward).normalized *size + projected.position; Handles.color = spline.editorPathColor; Handles.DrawLine(up, down); Handles.color = Color.white; if (pointValue - pointIndex > spline.moveStep) { if (SplineEditorHandles.CircleButton(projected.position, Quaternion.LookRotation(editorCamera.transform.position - projected.position), HandleUtility.GetHandleSize(projected.position) * 0.12f, 1f, spline.editorPathColor)) { SplitAtPercent(projected.percent); change = true; } } SceneView.RepaintAll(); } Handles.color = Color.white; SplineDrawer.DrawSplineComputer(spline, 0.0, projected.percent, 1f); SplineDrawer.DrawSplineComputer(spline, projected.percent, 1.0, 0.4f); }
protected virtual void InsertMode(Vector3 screenCoordinates) { double percent = ProjectScreenSpace(screenCoordinates); editor.evaluate(percent, evalResult); if (editor.eventModule.mouseRight) { SplineEditorHandles.DrawCircle(evalResult.position, Quaternion.LookRotation(editorCamera.transform.position - evalResult.position), HandleUtility.GetHandleSize(evalResult.position) * 0.2f); return; } if (SplineEditorHandles.CircleButton(evalResult.position, Quaternion.LookRotation(editorCamera.transform.position - evalResult.position), HandleUtility.GetHandleSize(evalResult.position) * 0.2f, 1.5f, color)) { RecordUndo("Create Point"); SplinePoint newPoint = new SplinePoint(evalResult.position, evalResult.position); newPoint.size = evalResult.size; newPoint.color = evalResult.color; newPoint.normal = evalResult.up; SplinePoint[] newPoints = new SplinePoint[points.Length + 1]; double floatIndex = (points.Length - 1) * percent; int pointIndex = Mathf.Clamp(DMath.FloorInt(floatIndex), 0, points.Length - 2); for (int i = 0; i < newPoints.Length; i++) { if (i <= pointIndex) { newPoints[i] = points[i]; } else if (i == pointIndex + 1) { newPoints[i] = newPoint; } else { newPoints[i] = points[i - 1]; } } points = newPoints; SelectPoint(pointIndex); } }
protected virtual void OnSceneGUI() { Node node = (Node)target; Node.Connection[] connections = node.GetConnections(); for (int i = 0; i < connections.Length; i++) { DSSplineDrawer.DrawSplineComputer(connections[i].spline, 0.0, 1.0, 0.5f); } bool update = false; if (position != node.transform.position) { position = node.transform.position; update = true; } if (scale != node.transform.localScale) { scale = node.transform.localScale; update = true; } if (rotation != node.transform.rotation) { rotation = node.transform.rotation; update = true; } if (update) { node.UpdateConnectedComputers(); } if (addComp == null) { if (connections.Length > 0) { bool bezier = false; for (int i = 0; i < connections.Length; i++) { if (connections[i].spline == null) { continue; } if (connections[i].spline.type == Spline.Type.Bezier) { bezier = true; continue; } } if (bezier && node.type == Node.Type.Smooth) { if (connections[0].spline != null) { SplinePoint point = node.GetPoint(0, true); Handles.DrawDottedLine(node.transform.position, point.tangent, 6f); Handles.DrawDottedLine(node.transform.position, point.tangent2, 6f); Vector3 lastPos = point.tangent; bool setPoint = false; point.SetTangentPosition(Handles.PositionHandle(point.tangent, node.transform.rotation)); if (lastPos != point.tangent) { setPoint = true; } lastPos = point.tangent2; point.SetTangent2Position(Handles.PositionHandle(point.tangent2, node.transform.rotation)); if (lastPos != point.tangent2) { setPoint = true; } if (setPoint) { node.SetPoint(0, point, true); node.UpdateConnectedComputers(); } } } } return; } SplinePoint[] points = addComp.GetPoints(); Transform camTransform = SceneView.currentDrawingSceneView.camera.transform; DSSplineDrawer.DrawSplineComputer(addComp, 0.0, 1.0, 0.5f); TextAnchor originalAlignment = GUI.skin.label.alignment; Color originalColor = GUI.skin.label.normal.textColor; GUI.skin.label.alignment = TextAnchor.MiddleCenter; GUI.skin.label.normal.textColor = addComp.editorPathColor; for (int i = 0; i < availablePoints.Length; i++) { if (addComp.isClosed && i == points.Length - 1) { break; } Handles.Label(points[i].position + Camera.current.transform.up * HandleUtility.GetHandleSize(points[i].position) * 0.3f, (i + 1).ToString()); if (SplineEditorHandles.CircleButton(points[availablePoints[i]].position, Quaternion.LookRotation(-camTransform.forward, camTransform.up), HandleUtility.GetHandleSize(points[availablePoints[i]].position) * 0.1f, 2f, addComp.editorPathColor)) { AddConnection(addComp, availablePoints[i]); break; } } GUI.skin.label.alignment = originalAlignment; GUI.skin.label.normal.textColor = originalColor; }