02-14-2020, 07:34 PM
I'm trying to use Curvy to read in data, generate meshes from the data, and save just the meshes out to the scene (since they will be static and I don't want the overhead of Curvy), but I'm running into an issue with the components not updating which is preventing me from being able to save out the mesh. I've created a test script (below) to figure out the process, and the debug statements print 0, for the first one giving the length of the spline, and null, for the second one which should be the saved mesh. I was reading through prior posts in the forum and took the advice to set auto refresh to false and force a refresh before I want to use the results of a component, but that is clearly not working. I thought it might be an editor specific bug, so I tried running the same script at start and got the same results. Why is this not working to generate my mesh in a way that I can save it out? When I go to the scene view afterwards, I can see that everything has been created as expected, it just seems to be happening after I try to access it within the script.
Code:
using UnityEngine;
using FluffyUnderware.Curvy;
using FluffyUnderware.Curvy.Generator.Modules;
using FluffyUnderware.Curvy.Generator;
using FluffyUnderware.Curvy.Shapes;
public class CurvyTest : MonoBehaviour
{
[ContextMenu("Test")]
public void Test() {
// Create the generator and required build components
CurvyGenerator generator = CurvyGenerator.Create();
generator.AutoRefresh = false;
InputSplinePath wirePath = generator.AddModule<InputSplinePath>();
InputSplinePath crossPath = generator.AddModule<InputSplinePath>();
BuildShapeExtrusion buildShapeExtrusion = generator.AddModule<BuildShapeExtrusion>();
BuildVolumeMesh buildVolumeMesh = generator.AddModule<BuildVolumeMesh>();
CreateMesh createMesh = generator.AddModule<CreateMesh>();
// Create inputs to generator components
// Create the wire spline
CurvySpline wireSpline = CurvySpline.Create();
CurvySplineSegment controlPoint1 = wireSpline.Add();
controlPoint1.gameObject.transform.localPosition = new Vector3(0, 0, 0);
CurvySplineSegment controlPoint2 = wireSpline.Add();
controlPoint2.gameObject.transform.localPosition = new Vector3(0, 1, 0);
CurvySplineSegment controlPoint3 = wireSpline.Add();
controlPoint3.gameObject.transform.localPosition = new Vector3(1, 1, 0);
CurvySplineSegment controlPoint4 = wireSpline.Add();
controlPoint4.gameObject.transform.localPosition = new Vector3(1, 2, 0);
CurvySplineSegment controlPoint5 = wireSpline.Add();
controlPoint5.gameObject.transform.localPosition = new Vector3(1, 2, 1);
// Create the circle cross section
CurvySpline crossSpline = CurvySpline.Create();
CSCircle circle = crossSpline.gameObject.AddComponent(typeof(CSCircle)) as CSCircle;
circle.Radius = 0.005f;
circle.Count = 10;
crossSpline.Refresh();
Debug.Log(crossSpline.Length);
crossSpline.MaxPointsPerUnit = 10 / crossSpline.Length;
circle.Refresh();
// Link the splines to the shape extruder
wirePath.Spline = wireSpline;
crossPath.Spline = crossSpline;
CGModuleInputSlot pathInput = buildShapeExtrusion.GetInputSlot("Path");
CGModuleInputSlot crossInput = buildShapeExtrusion.GetInputSlot("Cross");
CGModuleOutputSlot pathOutput = wirePath.GetOutputSlot("Path");
CGModuleOutputSlot crossOutput = crossPath.GetOutputSlot("Path");
pathInput.LinkTo(pathOutput);
crossInput.LinkTo(crossOutput);
// Set shape extruder parameters
buildShapeExtrusion.Resolution = 100;
buildShapeExtrusion.CrossResolution = 100;
// Link the mesh and mesh generator
CGModuleInputSlot volumeInput = buildVolumeMesh.GetInputSlot("Volume");
CGModuleOutputSlot volumeOutput = buildShapeExtrusion.GetOutputSlot("Volume");
volumeInput.LinkTo(volumeOutput);
CGModuleInputSlot meshInput = createMesh.GetInputSlot("VMesh");
CGModuleOutputSlot meshOutput = buildVolumeMesh.GetOutputSlot("VMesh");
meshInput.LinkTo(meshOutput);
// Save the mesh and destroy the components used to make it
generator.Refresh(true);
GameObject mesh = createMesh.SaveToScene(null);
Debug.Log(mesh);
}
public void Start() {
Test();
}
}