mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-12-24 20:57:18 +01:00
Got rid of std::touples in the wfc module.
This commit is contained in:
parent
bb723e3c44
commit
2680c89948
@ -7,7 +7,6 @@ void Propagator::init_compatible() {
|
|||||||
for (uint32_t y = 0; y < wave_height; y++) {
|
for (uint32_t y = 0; y < wave_height; y++) {
|
||||||
for (uint32_t x = 0; x < wave_width; x++) {
|
for (uint32_t x = 0; x < wave_width; x++) {
|
||||||
for (uint32_t pattern = 0; pattern < patterns_size; pattern++) {
|
for (uint32_t pattern = 0; pattern < patterns_size; pattern++) {
|
||||||
|
|
||||||
for (int direction = 0; direction < 4; direction++) {
|
for (int direction = 0; direction < 4; direction++) {
|
||||||
value.direction[direction] = static_cast<uint32_t>(propagator_state[pattern].directions[get_opposite_direction(direction)].size());
|
value.direction[direction] = static_cast<uint32_t>(propagator_state[pattern].directions[get_opposite_direction(direction)].size());
|
||||||
}
|
}
|
||||||
@ -22,8 +21,13 @@ void Propagator::propagate(Wave &wave) {
|
|||||||
// We propagate every element while there is element to propagate.
|
// We propagate every element while there is element to propagate.
|
||||||
while (propagating.size() != 0) {
|
while (propagating.size() != 0) {
|
||||||
// The cell and pattern that has been set to false.
|
// The cell and pattern that has been set to false.
|
||||||
uint32_t y1, x1, pattern;
|
|
||||||
std::tie(y1, x1, pattern) = propagating[propagating.size() - 1];
|
const PropagatingEntry &e = propagating[propagating.size() - 1];
|
||||||
|
|
||||||
|
uint32_t y1 = e.data[0];
|
||||||
|
uint32_t x1 = e.data[1];
|
||||||
|
uint32_t pattern = e.data[2];
|
||||||
|
|
||||||
propagating.resize(propagating.size() - 1);
|
propagating.resize(propagating.size() - 1);
|
||||||
|
|
||||||
// We propagate the information in all 4 directions.
|
// We propagate the information in all 4 directions.
|
||||||
@ -38,9 +42,11 @@ void Propagator::propagate(Wave &wave) {
|
|||||||
} else {
|
} else {
|
||||||
x2 = x1 + dx;
|
x2 = x1 + dx;
|
||||||
y2 = y1 + dy;
|
y2 = y1 + dy;
|
||||||
|
|
||||||
if (x2 < 0 || x2 >= (int)wave.width) {
|
if (x2 < 0 || x2 >= (int)wave.width) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y2 < 0 || y2 >= (int)wave.height) {
|
if (y2 < 0 || y2 >= (int)wave.height) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -54,19 +60,19 @@ void Propagator::propagate(Wave &wave) {
|
|||||||
// contradiction with pattern1
|
// contradiction with pattern1
|
||||||
int size = patterns.size();
|
int size = patterns.size();
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
uint32_t pattern = patterns[i];
|
uint32_t pattern_entry = patterns[i];
|
||||||
|
|
||||||
// We decrease the number of compatible patterns in the opposite
|
// We decrease the number of compatible patterns in the opposite
|
||||||
// direction If the pattern was discarded from the wave, the element
|
// direction If the pattern was discarded from the wave, the element
|
||||||
// is still negative, which is not a problem
|
// is still negative, which is not a problem
|
||||||
CompatibilityEntry &value = compatible.get(y2, x2, pattern);
|
CompatibilityEntry &value = compatible.get(y2, x2, pattern_entry);
|
||||||
value.direction[direction]--;
|
value.direction[direction]--;
|
||||||
|
|
||||||
// If the element was set to 0 with this operation, we need to remove
|
// If the element was set to 0 with this operation, we need to remove
|
||||||
// the pattern from the wave, and propagate the information
|
// the pattern from the wave, and propagate the information
|
||||||
if (value.direction[direction] == 0) {
|
if (value.direction[direction] == 0) {
|
||||||
add_to_propagator(y2, x2, pattern);
|
add_to_propagator(y2, x2, pattern_entry);
|
||||||
wave.set(i2, pattern, false);
|
wave.set(i2, pattern_entry, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include "array_3d.h"
|
#include "array_3d.h"
|
||||||
#include "core/vector.h"
|
#include "core/vector.h"
|
||||||
#include "direction.h"
|
#include "direction.h"
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
class Wave;
|
class Wave;
|
||||||
|
|
||||||
@ -26,10 +25,26 @@ private:
|
|||||||
|
|
||||||
const bool periodic_output;
|
const bool periodic_output;
|
||||||
|
|
||||||
|
struct PropagatingEntry {
|
||||||
|
uint32_t data[3];
|
||||||
|
|
||||||
|
PropagatingEntry() {
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
data[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PropagatingEntry(uint32_t x, uint32_t y, uint32_t z) {
|
||||||
|
data[0] = x;
|
||||||
|
data[1] = y;
|
||||||
|
data[2] = z;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// All the tuples (y, x, pattern) that should be propagated.
|
// All the tuples (y, x, pattern) that should be propagated.
|
||||||
// The tuple should be propagated when wave.get(y, x, pattern) is set to
|
// The tuple should be propagated when wave.get(y, x, pattern) is set to
|
||||||
// false.
|
// false.
|
||||||
Vector<std::tuple<uint32_t, uint32_t, uint32_t>> propagating;
|
Vector<PropagatingEntry> propagating;
|
||||||
|
|
||||||
struct CompatibilityEntry {
|
struct CompatibilityEntry {
|
||||||
int direction[4];
|
int direction[4];
|
||||||
@ -67,7 +82,7 @@ public:
|
|||||||
CompatibilityEntry temp;
|
CompatibilityEntry temp;
|
||||||
compatible.get(y, x, pattern) = temp;
|
compatible.get(y, x, pattern) = temp;
|
||||||
|
|
||||||
propagating.push_back(std::tuple<uint32_t, uint32_t, uint32_t>(y, x, pattern));
|
propagating.push_back(PropagatingEntry(y, x, pattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
void propagate(Wave &wave);
|
void propagate(Wave &wave);
|
||||||
|
@ -212,11 +212,10 @@ private:
|
|||||||
|
|
||||||
// Generate the propagator which will be used in the wfc algorithm.
|
// Generate the propagator which will be used in the wfc algorithm.
|
||||||
static Vector<PropagatorEntry> generate_propagator(
|
static Vector<PropagatorEntry> generate_propagator(
|
||||||
const Vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t>> &neighbors,
|
const Vector<NeighbourData> &neighbors,
|
||||||
Vector<Tile<T>> tiles,
|
Vector<Tile<T>> tiles,
|
||||||
Vector<std::pair<uint32_t, uint32_t>> id_to_oriented_tile,
|
Vector<std::pair<uint32_t, uint32_t>> id_to_oriented_tile,
|
||||||
Vector<Vector<uint32_t>> oriented_tile_ids) {
|
Vector<Vector<uint32_t>> oriented_tile_ids) {
|
||||||
|
|
||||||
size_t nb_oriented_tiles = id_to_oriented_tile.size();
|
size_t nb_oriented_tiles = id_to_oriented_tile.size();
|
||||||
Vector<DensePropagatorHelper> dense_propagator(nb_oriented_tiles, { Vector<bool>(nb_oriented_tiles, false), Vector<bool>(nb_oriented_tiles, false), Vector<bool>(nb_oriented_tiles, false), Vector<bool>(nb_oriented_tiles, false) });
|
Vector<DensePropagatorHelper> dense_propagator(nb_oriented_tiles, { Vector<bool>(nb_oriented_tiles, false), Vector<bool>(nb_oriented_tiles, false), Vector<bool>(nb_oriented_tiles, false), Vector<bool>(nb_oriented_tiles, false) });
|
||||||
dense_propagator.resize(nb_oriented_tiles);
|
dense_propagator.resize(nb_oriented_tiles);
|
||||||
@ -311,11 +310,20 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
struct NeighbourData {
|
||||||
|
uint32_t data[4];
|
||||||
|
|
||||||
|
NeighbourData() {
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
direction[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Construct the TilingWFC class to generate a tiled image.
|
// Construct the TilingWFC class to generate a tiled image.
|
||||||
TilingWFC(
|
TilingWFC(
|
||||||
const Vector<Tile<T>> &tiles,
|
const Vector<Tile<T>> &tiles,
|
||||||
const Vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t>>
|
const Vector<NeighbourData> &neighbors,
|
||||||
&neighbors,
|
|
||||||
const uint32_t height, const uint32_t width,
|
const uint32_t height, const uint32_t width,
|
||||||
const TilingWFCOptions &options, int seed) :
|
const TilingWFCOptions &options, int seed) :
|
||||||
tiles(tiles),
|
tiles(tiles),
|
||||||
|
Loading…
Reference in New Issue
Block a user