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); }
/// <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; } }