A C++ implementation of the Wave Function Collapse Tile-Model algorithm by @mxgmn ready for OpenFrameworks.
ofxWFC3D works in 3 dimensions, uses XML configuration files and outputs multiple formats such indices, ofNodes and key-value transformation tables.
It supports the original symmetry, rotations and subsets. It also implements new functionalities. The addon does not require any specific hardware or external libraries. It should work in every OF supported platform.
The tiles placement and their neighbor relations are based its symmetry. Tiles rotates anticlockwise 90° on the Y axis.
symmetry | 0 | 0° | 1 | 90° | 2 | 180° | 3 | 270° |
---|---|---|---|---|
X | x | x | x | |
T | ||||
L | ||||
I | x | x | ||
\ | x | x | ||
+ |
// instance the WFC3D
ofxWFC3D wfc;
// config_name, subset, x, y, z, periodic=false, ground_name="", surround_name=""
wfc.SetUp("data.xml", "default", width, height, length);
// run the WFC3D
// (the algorithm may runs into contradictions)
wfc.Run(seed);
// get a list of all the tiles transformations
ofNode world_node; // parent node
std::vector<ofNode> = wfc.getNodes(world_node, glm::vec3(size_x,size_y,size_z));
// get the indices of each tile based on the configuration
std::vector<size_t> modelIndices = wfc.getIndices();
It reduces entropy and limits randomness creating predictable results.
// instanciate an specific tile on the WFC
wfc.SetTile("tile", x, y, z);
This version of the WFC, includes tiles without symmetry. The "+" symmetry actually does not perform any symmetry, instead uses only rotations and has 4 unique anchor points.
For complex structures that require a very concrete tile union, use the symmetry type "+".
<tile name="corner" symmetry="+"/>
The "min-height" and "max-height" attributes defined the height range where a tile can be placed.
<tile name="roof" symmetry="I" min-height="2" max-height="4"/>
ofxWFC3D has a different axis coordinate, being Y-up and Z-forward. That is what OF uses as well. This changes does not only changes the output, it does also affects the configuration and the way the wave propagates and its observed.
Example basic
// OF 0.10.1 - Arch-Linux | i7-6500U
| Process | Microsecond | Attempts |
| ------------- | ------------- | --------- |
| SetUp | 3204 | 1 |
| SetUp | 1452 | 1 |
| SetUp | 1438 | 1 |
| SetUp | 451 | 1 |
| Run | 140883 | 1 |
| Run | 142980 | 1 |
| Run | 134868 | 1 |
| Run | 117848 | 1 |
Example advance
// OF 0.10.1 - Arch-Linux | i7-6500U
| Process | Microsecond | Attempts |
| ------------- | ------------- | --------- |
| SetUp | 2520 | 1 |
| SetUp | 2025 | 1 |
| SetUp | 1463 | 1 |
| SetUp | 526 | 1 |
| Run | 59608 | 3 | 2 contradictions
| Run | 60894 | 4 | 3 contradictions
| Run | 75666 | 3 | 2 contradictions
| Run | 64881 | 1 |
| Run | 69637 | 2 | 1 contradiction
ofxWFC3D is distributed under the MIT License.