Skip to content

Commit

Permalink
♻️ Refactor jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
matyo91 committed Oct 20, 2024
1 parent f9ae1d1 commit 91b6256
Show file tree
Hide file tree
Showing 147 changed files with 55 additions and 63 deletions.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit-coding-train/9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/11.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/12.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/images/wave-function-collapse/circuit/9.png
Binary file modified assets/images/wave-function-collapse/demo/0.png
Binary file modified assets/images/wave-function-collapse/demo/1.png
Binary file modified assets/images/wave-function-collapse/demo/2.png
Binary file modified assets/images/wave-function-collapse/demo/3.png
Binary file modified assets/images/wave-function-collapse/demo/4.png
Binary file modified assets/images/wave-function-collapse/floor/0.png
Binary file modified assets/images/wave-function-collapse/floor/1.png
Binary file modified assets/images/wave-function-collapse/floor/10.png
Binary file modified assets/images/wave-function-collapse/floor/11.png
Binary file modified assets/images/wave-function-collapse/floor/12.png
Binary file modified assets/images/wave-function-collapse/floor/13.png
Binary file modified assets/images/wave-function-collapse/floor/14.png
Binary file modified assets/images/wave-function-collapse/floor/15.png
Binary file modified assets/images/wave-function-collapse/floor/16.png
Binary file modified assets/images/wave-function-collapse/floor/2.png
Binary file modified assets/images/wave-function-collapse/floor/3.png
Binary file modified assets/images/wave-function-collapse/floor/4.png
Binary file modified assets/images/wave-function-collapse/floor/5.png
Binary file modified assets/images/wave-function-collapse/floor/6.png
Binary file modified assets/images/wave-function-collapse/floor/7.png
Binary file modified assets/images/wave-function-collapse/floor/8.png
Binary file modified assets/images/wave-function-collapse/floor/9.png
Binary file modified assets/images/wave-function-collapse/mountains/0.png
Binary file modified assets/images/wave-function-collapse/mountains/1.png
Binary file modified assets/images/wave-function-collapse/mountains/2.png
Binary file modified assets/images/wave-function-collapse/mountains/3.png
Binary file modified assets/images/wave-function-collapse/mountains/4.png
Binary file modified assets/images/wave-function-collapse/pipes/0.png
Binary file modified assets/images/wave-function-collapse/pipes/1.png
Binary file modified assets/images/wave-function-collapse/pipes/2.png
Binary file modified assets/images/wave-function-collapse/pipes/3.png
Binary file modified assets/images/wave-function-collapse/pipes/4.png
Binary file modified assets/images/wave-function-collapse/polka/0.png
Binary file modified assets/images/wave-function-collapse/polka/1.png
Binary file modified assets/images/wave-function-collapse/polka/2.png
Binary file modified assets/images/wave-function-collapse/polka/3.png
Binary file modified assets/images/wave-function-collapse/polka/4.png
Binary file modified assets/images/wave-function-collapse/roads/0.png
Binary file modified assets/images/wave-function-collapse/roads/1.png
Binary file modified assets/images/wave-function-collapse/roads/2.png
Binary file modified assets/images/wave-function-collapse/roads/3.png
Binary file modified assets/images/wave-function-collapse/roads/4.png
Binary file modified assets/images/wave-function-collapse/space/0.png
Binary file modified assets/images/wave-function-collapse/space/1.png
Binary file modified assets/images/wave-function-collapse/space/10.png
Binary file modified assets/images/wave-function-collapse/space/11.png
Binary file modified assets/images/wave-function-collapse/space/12.png
Binary file modified assets/images/wave-function-collapse/space/13.png
Binary file modified assets/images/wave-function-collapse/space/14.png
Binary file modified assets/images/wave-function-collapse/space/15.png
Binary file modified assets/images/wave-function-collapse/space/16.png
Binary file modified assets/images/wave-function-collapse/space/17.png
Binary file modified assets/images/wave-function-collapse/space/18.png
Binary file modified assets/images/wave-function-collapse/space/19.png
Binary file modified assets/images/wave-function-collapse/space/2.png
Binary file modified assets/images/wave-function-collapse/space/20.png
Binary file modified assets/images/wave-function-collapse/space/21.png
Binary file modified assets/images/wave-function-collapse/space/22.png
Binary file modified assets/images/wave-function-collapse/space/23.png
Binary file modified assets/images/wave-function-collapse/space/24.png
Binary file modified assets/images/wave-function-collapse/space/25.png
Binary file modified assets/images/wave-function-collapse/space/26.png
Binary file modified assets/images/wave-function-collapse/space/27.png
Binary file modified assets/images/wave-function-collapse/space/28.png
Binary file modified assets/images/wave-function-collapse/space/29.png
Binary file modified assets/images/wave-function-collapse/space/3.png
Binary file modified assets/images/wave-function-collapse/space/30.png
Binary file modified assets/images/wave-function-collapse/space/31.png
Binary file modified assets/images/wave-function-collapse/space/32.png
Binary file modified assets/images/wave-function-collapse/space/33.png
Binary file modified assets/images/wave-function-collapse/space/34.png
Binary file modified assets/images/wave-function-collapse/space/35.png
Binary file modified assets/images/wave-function-collapse/space/36.png
Binary file modified assets/images/wave-function-collapse/space/37.png
Binary file modified assets/images/wave-function-collapse/space/38.png
Binary file modified assets/images/wave-function-collapse/space/39.png
Binary file modified assets/images/wave-function-collapse/space/4.png
Binary file modified assets/images/wave-function-collapse/space/40.png
Binary file modified assets/images/wave-function-collapse/space/41.png
Binary file modified assets/images/wave-function-collapse/space/42.png
Binary file modified assets/images/wave-function-collapse/space/43.png
Binary file modified assets/images/wave-function-collapse/space/44.png
Binary file modified assets/images/wave-function-collapse/space/45.png
Binary file modified assets/images/wave-function-collapse/space/46.png
Binary file modified assets/images/wave-function-collapse/space/47.png
Binary file modified assets/images/wave-function-collapse/space/48.png
Binary file modified assets/images/wave-function-collapse/space/49.png
Binary file modified assets/images/wave-function-collapse/space/5.png
Binary file modified assets/images/wave-function-collapse/space/50.png
Binary file modified assets/images/wave-function-collapse/space/51.png
Binary file modified assets/images/wave-function-collapse/space/52.png
Binary file modified assets/images/wave-function-collapse/space/53.png
Binary file modified assets/images/wave-function-collapse/space/54.png
Binary file modified assets/images/wave-function-collapse/space/55.png
Binary file modified assets/images/wave-function-collapse/space/56.png
Binary file modified assets/images/wave-function-collapse/space/57.png
Binary file modified assets/images/wave-function-collapse/space/58.png
Binary file modified assets/images/wave-function-collapse/space/59.png
Binary file modified assets/images/wave-function-collapse/space/6.png
Binary file modified assets/images/wave-function-collapse/space/60.png
Binary file modified assets/images/wave-function-collapse/space/61.png
Binary file modified assets/images/wave-function-collapse/space/62.png
Binary file modified assets/images/wave-function-collapse/space/63.png
Binary file modified assets/images/wave-function-collapse/space/64.png
Binary file modified assets/images/wave-function-collapse/space/65.png
Binary file modified assets/images/wave-function-collapse/space/66.png
Binary file modified assets/images/wave-function-collapse/space/67.png
Binary file modified assets/images/wave-function-collapse/space/68.png
Binary file modified assets/images/wave-function-collapse/space/69.png
Binary file modified assets/images/wave-function-collapse/space/7.png
Binary file modified assets/images/wave-function-collapse/space/8.png
Binary file modified assets/images/wave-function-collapse/space/9.png
Binary file modified assets/images/wave-function-collapse/train-tracks/0.png
Binary file modified assets/images/wave-function-collapse/train-tracks/1.png
Binary file modified assets/images/wave-function-collapse/train-tracks/2.png
Binary file modified assets/images/wave-function-collapse/train-tracks/3.png
Binary file modified assets/images/wave-function-collapse/train-tracks/4.png
34 changes: 18 additions & 16 deletions src/Command/WaveFunctionCollapseCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,34 +69,36 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$io->writeln(sprintf('Grid size: %dx%d', $width, $height));
$io->writeln(sprintf('Dataset: %s', $dataSet->value));

$board = new Board($width, $height);
$board->reset($dataSet);
$flow = Flow::do(function () use ($io, $imagine, $dataSet) {
yield static function ($data) {
[$width, $height, $dataSet] = $data;

$flow = Flow::do(function () use ($io, $imagine, $board, $dataSet) {
yield new YFlow(function ($collapseLoop) use ($imagine, $board, $dataSet) {
return function ($data) use ($collapseLoop, $imagine, $board, $dataSet) {
[$grid, $images] = $data;
$board = new Board($width, $height);
$board->reset($dataSet);

return [$board, []];
};
yield new YFlow(function ($collapseLoop) use ($imagine, $dataSet) {
return function ($data) use ($collapseLoop, $imagine, $dataSet) {
[$board, $images] = $data;

$images[] = (new ImgJob(
$imagine,
$this->assetsDir,
$board->tiles,
$board->width,
$board->height,
$dataSet,
256
))($grid);
$nextGrid = (new CollapseJob($board->tiles, $board->width, $board->height))($grid);
))($board);
$nextBoard = (new CollapseJob())($board);

if ($nextGrid === null) {
return [$grid, $images];
if ($nextBoard === null) {
return [$board, $images];
}

return $collapseLoop([$nextGrid, $images]);
return $collapseLoop([$nextBoard, $images]);
};
});
yield function ($data) {
[$grid, $images] = $data;
[$board, $images] = $data;

return (new Mp4Job($this->cacheDir))($images);
};
Expand All @@ -105,7 +107,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
};
});

$flow(new Ip([$board->grid, []]));
$flow(new Ip([$width, $height, $dataSet]));

$flow->await();

Expand Down
52 changes: 23 additions & 29 deletions src/Job/WaveFunctionCollapse/CollapseJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,23 @@

namespace App\Job\WaveFunctionCollapse;

use App\Model\WaveFunctionCollapse\Board;
use App\Model\WaveFunctionCollapse\Cell;
use App\Model\WaveFunctionCollapse\Tile;
use Flow\JobInterface;

use function count;
use function in_array;

/**
* @implements JobInterface<Cell[], Cell[]|null>
* @implements JobInterface<Board, Board|null>
*/
class CollapseJob implements JobInterface
{
public function __construct(
/** @var Tile[] */
public array $tiles,
public int $width,
public int $height,
) {}

public function __invoke($grid): mixed
public function __invoke($board): mixed
{
// Pick cell with least entropy
$gridNoOptions = array_filter($grid, static fn (Cell $a) => empty($a->getOptions()));
$gridCopy = array_filter($grid, static fn (Cell $a) => !$a->isCollapsed());
$gridNoOptions = array_filter($board->grid, static fn (Cell $a) => empty($a->getOptions()));
$gridCopy = array_filter($board->grid, static fn (Cell $a) => !$a->isCollapsed());
if (!empty($gridNoOptions) || empty($gridCopy)) {
return null;
}
Expand Down Expand Up @@ -58,50 +51,50 @@ public function __invoke($grid): mixed
$cell->setOptions([$pick]);

$nextGrid = [];
for ($j = 0; $j < $this->height; $j++) {
for ($i = 0; $i < $this->width; $i++) {
$index = $i + $j * $this->height;
if ($grid[$index]->isCollapsed()) {
$nextGrid[$index] = $grid[$index];
for ($j = 0; $j < $board->height; $j++) {
for ($i = 0; $i < $board->width; $i++) {
$index = $i + $j * $board->height;
if ($board->grid[$index]->isCollapsed()) {
$nextGrid[$index] = $board->grid[$index];
} else {
$options = range(0, count($this->tiles) - 1);
$options = range(0, count($board->tiles) - 1);

// Look up
if ($j > 0) {
$up = $grid[$i + ($j - 1) * $this->height];
$up = $board->grid[$i + ($j - 1) * $board->height];
$validOptions = [];
foreach ($up->getOptions() as $option) {
$valid = $this->tiles[$option]->down;
$valid = $board->tiles[$option]->down;
$validOptions = array_merge($validOptions, $valid);
}
$this->checkValid($options, $validOptions);
}
// Look right
if ($i < $this->width - 1) {
$right = $grid[$i + 1 + $j * $this->height];
if ($i < $board->width - 1) {
$right = $board->grid[$i + 1 + $j * $board->height];
$validOptions = [];
foreach ($right->getOptions() as $option) {
$valid = $this->tiles[$option]->left;
$valid = $board->tiles[$option]->left;
$validOptions = array_merge($validOptions, $valid);
}
$this->checkValid($options, $validOptions);
}
// Look down
if ($j < $this->height - 1) {
$down = $grid[$i + ($j + 1) * $this->height];
if ($j < $board->height - 1) {
$down = $board->grid[$i + ($j + 1) * $board->height];
$validOptions = [];
foreach ($down->getOptions() as $option) {
$valid = $this->tiles[$option]->up;
$valid = $board->tiles[$option]->up;
$validOptions = array_merge($validOptions, $valid);
}
$this->checkValid($options, $validOptions);
}
// Look left
if ($i > 0) {
$left = $grid[$i - 1 + $j * $this->height];
$left = $board->grid[$i - 1 + $j * $board->height];
$validOptions = [];
foreach ($left->getOptions() as $option) {
$valid = $this->tiles[$option]->right;
$valid = $board->tiles[$option]->right;
$validOptions = array_merge($validOptions, $valid);
}
$this->checkValid($options, $validOptions);
Expand All @@ -111,8 +104,9 @@ public function __invoke($grid): mixed
}
}
}
$board->grid = $nextGrid;

return $nextGrid;
return $board;
}

/**
Expand Down
22 changes: 9 additions & 13 deletions src/Job/WaveFunctionCollapse/ImgJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace App\Job\WaveFunctionCollapse;

use App\EnumType\WaveFunctionCollapse\DataSetEnumType;
use App\Model\WaveFunctionCollapse\Cell;
use App\Model\WaveFunctionCollapse\Board;
use App\Model\WaveFunctionCollapse\Tile;
use Flow\JobInterface;
use Imagine\Image\Box;
Expand All @@ -16,31 +16,27 @@
use function sprintf;

/**
* @implements JobInterface<Cell[], ImageInterface>
* @implements JobInterface<Board, ImageInterface>
*/
class ImgJob implements JobInterface
{
public function __construct(
private ImagineInterface $imagine,
private string $assetsDir,
/** @var Tile[] */
public array $tiles,
public int $width,
public int $height,
public DataSetEnumType $dataSet,
public int $tileSize = 32,
) {}

public function __invoke($grid): ImageInterface
public function __invoke($board): ImageInterface
{
$image = $this->imagine->create(new Box($this->width * $this->tileSize, $this->height * $this->tileSize));
$image = $this->imagine->create(new Box($board->width * $this->tileSize, $board->height * $this->tileSize));

for ($j = 0; $j < $this->height; $j++) {
for ($i = 0; $i < $this->width; $i++) {
$index = $i + $j * $this->height;
$cell = $grid[$index];
for ($j = 0; $j < $board->height; $j++) {
for ($i = 0; $i < $board->width; $i++) {
$index = $i + $j * $board->height;
$cell = $board->grid[$index];
if ($cell->isCollapsed()) {
$tile = $this->tiles[$cell->options[0]];
$tile = $board->tiles[$cell->options[0]];
$tileImagePath = sprintf(
'%s/images/wave-function-collapse/%s/%d.png',
$this->assetsDir,
Expand Down
10 changes: 5 additions & 5 deletions src/Twig/Components/WaveFunctionCollapse/Ui.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,17 @@ public function reset(): void
public function collapse(): void
{
$flow = Flow::do(function () {
yield new CollapseJob($this->board->tiles, $this->board->width, $this->board->height);
yield function ($nextGrid) {
if ($nextGrid === null) {
yield new CollapseJob();
yield function ($nextBoard) {
if ($nextBoard === null) {
$this->board->startOver();
} else {
$this->board->grid = $nextGrid;
$this->board = $nextBoard;
}
};
});

$flow(new Ip($this->board->grid));
$flow(new Ip($this->board));
$flow->await();
}

Expand Down

0 comments on commit 91b6256

Please sign in to comment.