コード例 #1
0
        private void HandleComplete(TesseraGenerateOptions options, TesseraCompletion completion)
        {
            if (!completion.success)
            {
                if (completion.contradictionLocation != null)
                {
                    var loc = completion.contradictionLocation;
                    Debug.LogError($"Failed to complete generation, issue at tile {loc}");
                }
                else
                {
                    Debug.LogError("Failed to complete generation");
                }
                return;
            }

            ITesseraTileOutput to = null;

            if (options.onCreate != null)
            {
                to = new ForEachOutput(options.onCreate);
            }
            else
            {
                to = GetComponent <ITesseraTileOutput>() ?? new InstantiateOutput(transform);
            }

            to.UpdateTiles(completion.tileInstances);
        }
コード例 #2
0
        /// <summary>
        /// Asynchronously runs the generation process described in the class docs, for use with StartCoroutine.
        /// </summary>
        /// <remarks>The default instantiation is still synchronous, so this can still cause frame glitches unless you override onCreate.</remarks>
        /// <param name="onCreate"></param>
        public IEnumerator StartGenerate(TesseraGenerateOptions options = null)
        {
            options = options ?? new TesseraGenerateOptions();

            var coregenerator = CreateTesseraGeneratorHelper(options);


            for (var r = 0; r < retries; r++)
            {
                TilePropagator propagator;
                TilePropagator Run()
                {
                    coregenerator.SetupAndRun();
                    return(coregenerator.Propagator);
                }

                if (options.multithreaded)
                {
                    var runTask = Task.Run(Run, options.cancellationToken);

                    while (!runTask.IsCompleted)
                    {
                        yield return(null);
                    }

                    options.cancellationToken.ThrowIfCancellationRequested();

                    propagator = runTask.Result;
                }
                else
                {
                    propagator = Run();
                }

                var status = propagator.Status;

                var contradictionTile = new ModelTile {
                };

                var result = propagator.ToValueArray <ModelTile?>(contradiction: contradictionTile);


                if (status == DeBroglie.Resolution.Contradiction)
                {
                    if (r < retries - 1)
                    {
                        continue;
                    }
                }


                var completion = new TesseraCompletion();
                completion.retries               = r;
                completion.backtrackCount        = propagator.BacktrackCount;
                completion.success               = status == DeBroglie.Resolution.Decided;
                completion.tileInstances         = GetTesseraTileInstances(result).ToList();
                completion.contradictionLocation = completion.success ? null : GetContradictionLocation(result);

                if (options.onComplete != null)
                {
                    options.onComplete(completion);
                }
                else
                {
                    HandleComplete(options, completion);
                }

                yield return(completion);

                // Exit retries
                break;
            }
        }