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);
        }
示例#2
0
        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));
        }
示例#3
0
 public abstract Volumetric3 Generate(Volumetric3 startData);
示例#4
0
 public abstract ResultData Convert(Volumetric3 data);