public ResultData Generate(Transform target) { ResultData result; Status = "Generating (1/3)"; _target = target; //Generate a new set of data. _data = new Volumetric3(Length, Width, Height); if (MethodList.Count > 0) { foreach (GenerationMethod method in MethodList) { try { _data = method.Generate(_data); } catch (Exception e) { Status = "Idle from error."; return(new ResultData(false, e.Message)); } } result = Convert(); if (result.Successful) { result = Display(); } else { Status = "Idle from Error"; } } else { result = new ResultData(false, "There were no methods to use."); } return(result); }
public override ResultData Convert(Volumetric3 data) { _length = data.Length; _width = data.Width; _height = data.Height; vertsAll.Clear(); indicesAll.Clear(); //Calculate segment sizes int widthS = _width / ThreadSplit; //Store the tasks we create List <Task <MarchingCubesTaskData> > segmentTasks = new List <Task <MarchingCubesTaskData> >(); try { for (int i = 1; i <= ThreadSplit; i++) { int widtha = widthS * i; int minRange = widtha - widthS; int maxRange = widtha; Func <MarchingCubesTaskData> generateTask = () => { List <Vector3> verts = new List <Vector3>(); List <int> indices = new List <int>(); Marching marching = new MarchingCubes(Surface); marching.Generate(data.Voxels, _width, _height, _length, verts, indices, minRange, maxRange); return(new MarchingCubesTaskData(verts, indices)); }; segmentTasks.Add(Task.Run(generateTask)); } } catch (Exception e) { return(new ResultData(false, "Exception: " + e.Message)); } //Loop waiting for all tasks to finish. while (true) { int tasksCompleted = 0; for (int i = 0; i < segmentTasks.Count; i++) { if (segmentTasks[i].IsCompleted) { tasksCompleted++; } if (segmentTasks[i].IsCanceled || segmentTasks[i].IsFaulted) { return(new ResultData(false, "One or more tasks faulted.")); } } if (tasksCompleted >= ThreadSplit) { break; } } //Combine all lists into one for (int i = 0; i < segmentTasks.Count; i++) { vertsAll.AddRange(segmentTasks[i].Result.Verts); } Converted = true; return(new ResultData(true)); }
public abstract Volumetric3 Generate(Volumetric3 startData);
public abstract ResultData Convert(Volumetric3 data);