From f6bc4897605b839d0a5b85336452642657add6f1 Mon Sep 17 00:00:00 2001 From: William Manning Date: Mon, 9 Dec 2024 22:14:53 -0500 Subject: [PATCH] Back from the dead! Fixed some big performance issues; added a macro for debugging heap corruption. --- WFC++.vcxproj | 20 ++-- WFC++.vcxproj.filters | 9 +- WFC++/HelperClasses.h | 47 +++++++- WFC++/{ => HelperSrc}/Vector2i.cpp | 2 +- WFC++/List.hpp | 37 ++----- WFC++/MemoryChecks.h | 103 ++++++++++++++++++ WFC++/Platform.h | 44 ++++++-- WFC++/Set.hpp | 1 + WFC++/Simple/State.cpp | 6 +- WFC++/Tiled3D/Grid.cpp | 27 ++++- WFC++/Tiled3D/Grid.h | 72 ++++++++---- WFC++/Tiled3D/StandardRunner.cpp | 70 ++++++------ WFC++/Tiled3D/StandardRunner.h | 8 +- WFC++/Tiled3D/Tile.hpp | 10 ++ WFC++/Tiled3D/Transform3D.cpp | 8 +- WFC++/Tiled3D/Transform3D.h | 64 +++++++++-- WFC++/Vector2i.h | 3 + WFCtests/TestTilesets.hpp | 31 +++--- WFCtests/main.cpp | 14 ++- WFCunreal/Config/DefaultEngine.ini | 3 + WFCunreal/Content/Set_Wires/Wires.uasset | Bin 9071 -> 9071 bytes .../Content/Set_Wires/WiresGenerator.umap | Bin 632686 -> 632647 bytes .../Set_Wires/WiresGenerator_BuiltData.uasset | Bin 1328808 -> 1328808 bytes WFCunreal/Content/SimpleGenerator.uasset | Bin 326433 -> 361645 bytes WFCunreal/Source/WfcppDemo.Target.cs | 1 + WFCunreal/Source/WfcppDemo/WfcppDemo.Build.cs | 9 +- WFCunreal/Source/WfcppDemoEditor.Target.cs | 2 +- .../Private/WfcTilesetEditorScene.cpp | 12 +- .../Source/WfcppEditor/WfcppEditor.Build.cs | 13 +-- .../WfcppRuntime/Private/WfcGenerator.cpp | 7 +- .../WfcppRuntime/Public/WfcFacePrototype.h | 17 ++- .../Source/WfcppRuntime/WfcppRuntime.Build.cs | 37 +++++-- 32 files changed, 472 insertions(+), 205 deletions(-) rename WFC++/{ => HelperSrc}/Vector2i.cpp (99%) create mode 100644 WFC++/MemoryChecks.h diff --git a/WFC++.vcxproj b/WFC++.vcxproj index e856afa..ffbd6be 100644 --- a/WFC++.vcxproj +++ b/WFC++.vcxproj @@ -93,9 +93,9 @@ Level3 Disabled true - _WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) + _DEBUG;_WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) $(IntDir)\%(RelativeDir)\%(Filename).obj - stdcpp14 + stdcpp20 4251;4984 @@ -131,9 +131,9 @@ del /q "%UNREAL_WFC_DIR%\Tiled" Level3 Disabled true - _WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) + _DEBUG;_WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) $(IntDir)\%(RelativeDir)\%(Filename).obj - stdcpp14 + stdcpp20 4251;4984 @@ -171,9 +171,9 @@ del /q "%UNREAL_WFC_DIR%\Tiled" true true true - _WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) + NDEBUG;_WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) $(IntDir)\%(RelativeDir)\%(Filename).obj - stdcpp14 + stdcpp20 4251;4984 @@ -215,10 +215,11 @@ del /q "%UNREAL_WFC_DIR%\Tiled" true true true - _WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) + NDEBUG;_WINDLL;WFC_EXPORTS;%(PreprocessorDefinitions) $(IntDir)\%(RelativeDir)\%(Filename).obj - stdcpp14 + stdcpp20 4251;4984 + Speed true @@ -260,6 +261,7 @@ del /q "%UNREAL_WFC_DIR%\Tiled" + @@ -283,6 +285,7 @@ del /q "%UNREAL_WFC_DIR%\Tiled" + @@ -293,7 +296,6 @@ del /q "%UNREAL_WFC_DIR%\Tiled" - diff --git a/WFC++.vcxproj.filters b/WFC++.vcxproj.filters index 944d30a..70d1a71 100644 --- a/WFC++.vcxproj.filters +++ b/WFC++.vcxproj.filters @@ -79,6 +79,9 @@ Helper Classes + + Helper Classes + @@ -98,9 +101,6 @@ - - Helper Classes - Generator Classes\Simple @@ -131,5 +131,8 @@ Generator Classes\Tiled3D + + Helper Classes + \ No newline at end of file diff --git a/WFC++/HelperClasses.h b/WFC++/HelperClasses.h index 18a38d1..32000e4 100644 --- a/WFC++/HelperClasses.h +++ b/WFC++/HelperClasses.h @@ -15,7 +15,50 @@ namespace WFC { - //We could use a custom RNG that's much more lightweight, - // but WFC only samples the RNG like twice per iteration. + //Keep in mind WFC only samples the RNG like twice per iteration. + //We don't need something really tight like PCG. using PRNG = xoshiro256starstar64; + + + //Unfortunately, std::discrete_distribution is really slow to create, + // and its allocations seemingly can't be re-used, + // so below is my own implementation. + + //Returns a random index from the 'weights' list, using its elements as random weights. + //Returns -1 if there are no elements or your weights don't sum to a positive number. + template + int PickWeightedRandomIndex(Rng& rng, List& weights, Weight cachedTotalWeight = -1) + { + if (weights.GetSize() < 1) + return -1; + + //Generate a random float from 0 to the total weight, then use that as a "budget" + // to search for the last element before that budget is exhausted. + //There are multiple faster algorithms to do this, + // but they're all harder to implement and I don't think this is a bottleneck. + + Weight totalWeight; + if (cachedTotalWeight > Weight{ 0 }) + totalWeight = cachedTotalWeight; + else + { + totalWeight = { 0 }; + for (const Weight& w : weights) + totalWeight += w; + + if (totalWeight <= Weight{ 0 }) + return -1; + } + + Weight remainingBudget = std::uniform_real_distribution(0, totalWeight)(rng); + //Due to floating-point error we may run off the end of the weights array; + // plus once we pass the second-to-last element we already know what the answer will be. + for (int i = 0; i < weights.GetSize() - 1; ++i) + { + remainingBudget -= weights[i]; + if (remainingBudget <= 0) + return i; + } + return weights.GetSize() - 1; + } } \ No newline at end of file diff --git a/WFC++/Vector2i.cpp b/WFC++/HelperSrc/Vector2i.cpp similarity index 99% rename from WFC++/Vector2i.cpp rename to WFC++/HelperSrc/Vector2i.cpp index 1ed77e9..c95563f 100644 --- a/WFC++/Vector2i.cpp +++ b/WFC++/HelperSrc/Vector2i.cpp @@ -1,4 +1,4 @@ -#include "Vector2i.h" +#include "../Vector2i.h" using namespace WFC; diff --git a/WFC++/List.hpp b/WFC++/List.hpp index 32ff71e..73832bd 100644 --- a/WFC++/List.hpp +++ b/WFC++/List.hpp @@ -16,29 +16,8 @@ namespace WFC List() { } explicit List(int size) : vec(size) { } - explicit List(const T& first) { vec.push_back(first); } - explicit List(const T& first, const T& second) { vec.push_back(first); vec.push_back(second); } - explicit List(const T& first, const T& second, const T& third) - { vec.push_back(first); vec.push_back(second); vec.push_back(third); } - explicit List(const T& first, const T& second, const T& third, const T& fourth) - { vec.push_back(first); vec.push_back(second); vec.push_back(third); vec.push_back(fourth); } List(std::initializer_list list) : vec(list) { } - //Move operators: - List(List&& from) : vec(std::move(from.vec)) { } - List& operator=(List&& from) - { - vec = std::move(from.vec); - return *this; - } - //Copy operators: - List(const List& from) : vec(from.vec) { } - List& operator=(const List& from) - { - vec = from.vec; - return *this; - } - size_t GetSize() const { return vec.size(); } @@ -51,19 +30,21 @@ namespace WFC void Reserve(size_t n) { vec.reserve(n); } //Adds the given value to the end of this vector. - void PushBack(const T& value) { vec.push_back(value); } + T& PushBack(const T& value) { vec.push_back(value); return vec.back(); } //Adds the given value to the beginning of this vector. - void PushFront(const T& value) { Insert(0, value); } + T& PushFront(const T& value) { return Insert(0, value); } T PopBack() { T val = std::move(vec.back()); vec.pop_back(); return val; } T PopFront() { T val = std::move(vec[0]); vec.erase(vec.begin()); return val; } - void RemoveAt(size_t i) { vec.erase(vec.begin() + i); } + void RemoveAt(size_t i) { vec.erase(std::next(vec.begin(), i)); } - void Insert(size_t i, const T& value) { vec.insert(vec.begin() + i, value); } - void Insert(size_t i, const List& elements) { vec.insert(vec.begin() + i, elements.begin(), elements.end()); } + T& Insert(size_t i, const T& value) { return *vec.insert(vec.begin() + i, value); } + T& Insert(size_t i, const List& elements) { return *vec.insert(vec.begin() + i, elements.begin(), elements.end()); } void Clear() { vec.clear(); } + bool Contains(const T& t) { return std::find(begin(), end(), t) != end(); } + template int IndexOf(Predicate p) const { @@ -87,6 +68,10 @@ namespace WFC typename std::vector::const_iterator end() const { return vec.end(); } typename std::vector::iterator end() { return vec.end(); } + //Needed for performant algorithms. + auto& GetUnderlying() { return vec; } + const auto& GetUnderlying() const { return vec; } + private: std::vector vec; diff --git a/WFC++/MemoryChecks.h b/WFC++/MemoryChecks.h new file mode 100644 index 0000000..8fd3226 --- /dev/null +++ b/WFC++/MemoryChecks.h @@ -0,0 +1,103 @@ +#pragma once + +#include +#include +#include +#include + + +//To debug heap memory corruption, `#define WFCPP_CHECK_MEMORY 1` before including this library. +//You may also define a printf-like error handler, `WFCPP_CHECK_MEMORY_ERROR(s, ...)`. +//It defaults to `fprintf(stderr, ...)`. +//Then you can call `DEBUGMEM_Validate()` on an instance to check the padding bits for corruption. + +//DEBUG: Turn memory check off explicitly. Associated static_assert is further down. +#define WFCPP_CHECK_MEMORY 0 + +//For Intellisense, act as if memory debugging is always on. +#if !defined(WFCPP_CHECK_MEMORY) && (defined(__INTELLISENSE__) || defined(__RESHARPER__)) + #define WFCPP_CHECK_MEMORY 1 +#endif + +//By default, disable memory debugging. +#if !defined(WFCPP_CHECK_MEMORY) + #if defined(NDEBUG) + #define WFCPP_CHECK_MEMORY 0 + #else + #define WFCPP_CHECK_MEMORY 1 + #endif +#endif + +//Make sure there is an error handler. +#if WFCPP_CHECK_MEMORY && !defined(WFCPP_CHECK_MEMORY_ERROR) + #define WFCPP_CHECK_MEMORY_ERROR(s, ...) \ + fprintf(stderr, "WFCPP: heap corruption detected! " s, ##__VA_ARGS__) +#endif + +static_assert(!WFCPP_CHECK_MEMORY); + +namespace WFC::DEBUGMEM +{ + //Helper struct representing a set of bytes that should stay at a hard-coded value + // unless the heap has been corrupted. + template + struct Padding + { + std::array Data; + static constexpr uint32_t TestValue = 0xdeadbeef; + Padding() + { + for (size_t i = 0; i < N; ++i) + Data[i] = TestValue; + } + //Returns -1 if none was found. + int64_t GetFirstFailedIndex() const + { + for (size_t i = 0; i < N; ++i) + if (Data[i] != TestValue) + return static_cast(i); + return -1; + } + void Validate() const + { + auto firstFailedIdx = GetFirstFailedIndex(); + if (firstFailedIdx >= 0) + { + WFCPP_CHECK_MEMORY_ERROR( + "Start of %s has corrupted padding value starting at byte %" PRId64 "! " + "It should be %#010x but it's %#010x", + HeaderMsgGetter(), firstFailedIdx * 4, + TestValue, Data[firstFailedIdx] + ); + throw std::exception{ }; + } + } + }; + + inline const char* TestPaddingHeaderGetter() { return "TestHere"; } + using TestPadding = Padding<16, &TestPaddingHeaderGetter>; + static_assert( + sizeof(TestPadding) == 16 * 4, + "16" "-element padding doesn't work in this compiler; it gets padded to be larger" + ); +} + +#if WFCPP_CHECK_MEMORY + //Insert this at the top of a struct to pad it with int32's, to check for bad writes. + //Must be followed up with the FOOTER version at the bottom of the struct. + #define WFCPP_MEMORY_CHECK_HEADER(nWordsOfPadding, headerString) \ + static const char* DEBUGMEM_GetHeaderString() { return headerString; } \ + WFC::DEBUGMEM::Padding<(nWordsOfPadding), &DEBUGMEM_GetHeaderString> DEBUGMEM_Header; \ + static_assert(sizeof(decltype(DEBUGMEM_Header) )== 4 * (nWordsOfPadding), \ + #nWordsOfPadding "-element padding doesn't work; it got padded to some larger size") + //Insert this at the bottom of a struct that had the HEADER version inserted to the top of it. + #define WFCPP_MEMORY_CHECK_FOOTER(nWordsOfPadding) \ + WFC::DEBUGMEM::Padding<(nWordsOfPadding), &DEBUGMEM_GetHeaderString> DEBUGMEM_Footer; \ + static_assert(sizeof(decltype(DEBUGMEM_Footer)) == 4 * (nWordsOfPadding), \ + #nWordsOfPadding "-element padding doesn't work; it got padded to some larger size"); \ + void DEBUGMEM_Validate() const { DEBUGMEM_Header.Validate(); DEBUGMEM_Footer.Validate(); } +#else + #define WFCPP_MEMORY_CHECK_HEADER(...) + #define WFCPP_MEMORY_CHECK_FOOTER(...) \ + template void DEBUGMEM_Validate(Args... args) const { } +#endif \ No newline at end of file diff --git a/WFC++/Platform.h b/WFC++/Platform.h index dec51d3..a9f8239 100644 --- a/WFC++/Platform.h +++ b/WFC++/Platform.h @@ -1,20 +1,30 @@ #pragma once +#if !defined(WFC_STATIC) + #define WFC_STATIC 0 +#endif #if defined(_WIN32) || defined(WIN32) -#define OS_WINDOWS + #define OS_WINDOWS -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#define NOMINMAX // Stop conflicts with "min" and "max" macro names -// Windows Header Files: -#include -//#undef NOMINMAX -//#undef WIN32_LEAN_AND_MEAN + //If in an external environment that's already included platform stuff (i.e. Unreal Engine), + // skip including Windows stuff again. + #if !defined(TEXT) + #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + #define NOMINMAX // Stop conflicts with "min" and "max" macro names + #include + //#undef NOMINMAX + //#undef WIN32_LEAN_AND_MEAN + #endif #elif defined(__unix__) -#define OS_UNIX + #define OS_UNIX + +#else + + #define OS_UNKNOWN #endif @@ -23,16 +33,26 @@ //WFC_EXIMP: Defined as "extern" if importing a DLL, or nothing otherwise. #ifdef OS_WINDOWS #ifdef WFC_EXPORTS - #define WFC_API __declspec(dllexport) + #if !defined(WFC_API) + #define WFC_API __declspec(dllexport) + #endif #define WFC_EXIMP #elif WFC_STATIC - #define WFC_API + #if !defined(WFC_API) + #define WFC_API + #endif #define WFC_EXIMP #else - #define WFC_API __declspec(dllimport) + #if !defined(WFC_API) + #define WFC_API __declspec(dllimport) + #endif #define WFC_EXIMP extern #endif #else #define WFC_API #define WFC_EXIMP -#endif \ No newline at end of file +#endif + + +//Forcefully include debugging headers here so that all files will see them. +#include "MemoryChecks.h" \ No newline at end of file diff --git a/WFC++/Set.hpp b/WFC++/Set.hpp index 1481ffb..8dd3fb7 100644 --- a/WFC++/Set.hpp +++ b/WFC++/Set.hpp @@ -21,6 +21,7 @@ namespace WFC bool Erase(const T& t) { return set.erase(t) > 0; } void Erase(const Set& ts) { for (const T& el : ts) set.erase(el); } + void Erase(const List& ts) { for (const T& el : ts) set.erase(el); } bool Contains(const T& t) const { return set.find(t) != set.end(); } void Clear() { set.clear(); } diff --git a/WFC++/Simple/State.cpp b/WFC++/Simple/State.cpp index 827676f..6c3072d 100644 --- a/WFC++/Simple/State.cpp +++ b/WFC++/Simple/State.cpp @@ -78,12 +78,12 @@ Nullable State::Iterate(Vector2i& out_changedPos, List& out_fail { //Get a list of values and corresponding weights. std::vector colors(chosenPixel.ColorFrequencies.GetSize()); - std::vector weights(chosenPixel.ColorFrequencies.GetSize()); + std::vector weights(chosenPixel.ColorFrequencies.GetSize()); size_t index = 0; for (const auto& colAndWeight : chosenPixel.ColorFrequencies) { colors[index] = colAndWeight.first; - weights[index] = colAndWeight.second; + weights[index] = static_cast(colAndWeight.second); index += 1; } @@ -227,7 +227,7 @@ void State::RecalculatePixelChances(Vector2i pixelPos) Vector2i patternPos = pixelPos - patternMinCorner; Pixel patternColor = pattern[patternPos]; - size_t index = badColors.IndexOf( + auto index = badColors.IndexOf( [&patternColor](const Pixel& p) { return p == patternColor; }); if (index == -1 && pattern.DoesFit(patternMinCorner, *this)) pixel.ColorFrequencies[patternColor] += pattern.Frequency; diff --git a/WFC++/Tiled3D/Grid.cpp b/WFC++/Tiled3D/Grid.cpp index fde260c..7dc3c10 100644 --- a/WFC++/Tiled3D/Grid.cpp +++ b/WFC++/Tiled3D/Grid.cpp @@ -8,10 +8,11 @@ using namespace WFC::Tiled3D; Grid::Grid(const List& inputTiles, const Vector3i& outputSize) - : InputTiles(inputTiles), Cells(outputSize), - PossiblePermutations({ (int)inputTiles.GetSize(), outputSize }), + : InputTiles(inputTiles), NPermutedTiles(std::accumulate(InputTiles.begin(), InputTiles.end(), - 0, [](int sum, const Tile& tile) { return sum + tile.Permutations.Size(); })) + 0, [](int sum, const Tile& tile) { return sum + tile.Permutations.Size(); })), + Cells(outputSize), + PossiblePermutations({ (int)inputTiles.GetSize(), outputSize }) { assert(inputTiles.GetSize() < (TileIdx)(-1)); //The last index is reserved for [null] @@ -36,6 +37,7 @@ Grid::Grid(const List& inputTiles, const Vector3i& outputSize) matches.Add(transform); } + DEBUGMEM_ValidateAll(); Reset(); } @@ -50,12 +52,16 @@ void Grid::Reset() for (int tileI = 0; tileI < InputTiles.GetSize(); ++tileI) for (const Vector3i& cellPos : Region3i(Cells.GetDimensions())) PossiblePermutations[Vector4i(tileI, cellPos)] = InputTiles[tileI].Permutations; + + DEBUGMEM_ValidateAll(); } bool Grid::IsLegalPlacement(const Vector3i& cellPos, TileIdx tileIdx, Transform3D tilePermutation) const { + DEBUGMEM_ValidateAll(); + for (const auto& neighborData : GetNeighbors(cellPos)) { Vector3i neighborPos; @@ -100,6 +106,8 @@ void Grid::SetCell(const Vector3i& pos, TileIdx tile, Transform3D tilePermutatio for (const auto& neighborData : GetNeighbors(pos)) if (Cells.IsIndexValid(std::get<0>(neighborData))) ApplyFilter(pos, std::get<0>(neighborData), std::get<1>(neighborData), report); + + DEBUGMEM_ValidateAll(); } @@ -169,7 +177,7 @@ void Grid::ClearCells(const Region3i& region, Report* report, auto sideTowardsOutside = Tiled3D::MakeDirection3D(side == 0, axis); - ApplyFilter(clearedPos, outsidePos, sideTowardsOutside, report); + ApplyFilter(outsidePos, clearedPos, GetOpposite(sideTowardsOutside), report); } //Otherwise, the outside cell needs to recompute *its* possibilities // because the cleared cell may have opened them back up. @@ -191,6 +199,8 @@ void Grid::ClearCells(const Region3i& region, Report* report, } } + DEBUGMEM_ValidateAll(); + //Any immutable/uncleared cells will affect their newly-cleared neighbors. for (const Vector3i& cellPos : unclearedCellsInRegion) { @@ -206,6 +216,8 @@ void Grid::ClearCells(const Region3i& region, Report* report, ApplyFilter(cellPos, neighborPos, sideTowardsNeighbor, report); } } + + DEBUGMEM_ValidateAll(); } void Grid::ClearCell(const Vector3i& cellPos, Report* report, bool isChangeableAfterwards) @@ -219,6 +231,7 @@ void Grid::ApplyFilter(const Vector3i& cellPos, Report* report) { auto& cell = Cells[cellPos]; + cell.DEBUGMEM_Validate(); if (cell.IsSet()) return; @@ -255,6 +268,8 @@ void Grid::ApplyFilter(const Vector3i& cellPos, if (report) report->GotInteresting.Add(cellPos); } + + DEBUGMEM_ValidateAll(); } void Grid::ApplyFilter(const Vector3i& cellPos, const Vector3i& neighborPos, @@ -281,8 +296,10 @@ void Grid::ResetCellPossibilities(const Vector3i& cellPos, CellState& cell, Repo cell.NPossibilities = NPermutedTiles; if (report) - report->GotBoring.Add(cellPos); + report->GotBoring.PushBack(cellPos); for (int tileI = 0; tileI < InputTiles.GetSize(); ++tileI) PossiblePermutations[{tileI, cellPos}] = InputTiles[tileI].Permutations; + + DEBUGMEM_ValidateAll(); } \ No newline at end of file diff --git a/WFC++/Tiled3D/Grid.h b/WFC++/Tiled3D/Grid.h index 70a3e37..6218fb5 100644 --- a/WFC++/Tiled3D/Grid.h +++ b/WFC++/Tiled3D/Grid.h @@ -25,6 +25,8 @@ namespace WFC //The state of an output cell. struct WFC_API CellState { + WFCPP_MEMORY_CHECK_HEADER(16, "CellState struct"); + TileIdx ChosenTile = -1; Transform3D ChosenPermutation = Transform3D{}; @@ -37,8 +39,24 @@ namespace WFC //A value of 1 means that it's set, OR that it only has one possiblity left. uint16_t NPossibilities = 0; + //Constructors written explicitly so we can insert breakpoints as needed. + CellState() { } + CellState(TileIdx chosenTile, Transform3D chosenPermutation, bool isChangeable, uint16_t nPossibilities) + #if !(UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT) + : ChosenTile(chosenTile), ChosenPermutation(chosenPermutation), IsChangeable(isChangeable), NPossibilities(nPossibilities) + #endif + { + #if UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT + ChosenTile = chosenTile; + ChosenPermutation = chosenPermutation; + IsChangeable = isChangeable; + NPossibilities = nPossibilities; + #endif + } bool IsSet() const { return ChosenTile != (TileIdx)(-1); } + + WFCPP_MEMORY_CHECK_FOOTER(16); }; //A record of what happened during some action. @@ -49,7 +67,7 @@ namespace WFC // and 'GotUnsolvable' should supercede 'GotInteresting'. //Cells that no longer have any contraints on their tile options. - Set GotBoring; + List GotBoring; //Cells that have fewer possible options now. Set GotInteresting; //Cells that now have zero options for tile placement. @@ -61,27 +79,6 @@ namespace WFC GotBoring.Clear(); GotUnsolvable.Clear(); } - - template - void ForeachBoringCell(Func toDo) - { - for (const auto& p : GotBoring) - if (!GotInteresting.Contains(p) && !GotUnsolvable.Contains(p)) - toDo(p); - } - template - void ForeachInterestingCell(Func toDo) - { - for (const auto& p : GotInteresting) - if (!GotUnsolvable.Contains(p)) - toDo(p); - } - template - void ForeachUnsolvableCell(Func toDo) - { - for (const auto& p : GotUnsolvable) - toDo(p); - } }; @@ -94,6 +91,19 @@ namespace WFC // stores which tile permutations contain that face. //You can get the index for a FacePermutation with 'FaceIndices'. const Array2D& GetMatchingFaces() const { return MatchingFaces; } + inline void DEBUGMEM_ValidateInputs() const + { + //Note: iterate with indices as much as possible so it's clearer in the debugger where validation is failing. + for (int i = 0; i < InputTiles.GetSize(); ++i) + InputTiles[i].DEBUGMEM_Validate(); + for (const auto& faceAndIdx : GetFaceIndices()) + faceAndIdx.first.DEBUGMEM_Validate(); + for (Vector2i idx : Region2i(GetMatchingFaces().GetDimensions())) + { + const auto& data = GetMatchingFaces()[idx]; + data.DEBUGMEM_Validate(); + } + } //The output data. //While these fields are exposed publicly, @@ -106,6 +116,22 @@ namespace WFC //NOTE: after a cell is set, its entry here no longer gets updated, // so you should check whether a cell is set before paying attention to this data. Array4D PossiblePermutations; + void DEBUGMEM_ValidateOutputs() const + { + //Note: iterate with indices as much as possible so it's clearer in the debugger where validation is failing. + for (Vector3i idx : Region3i(Cells.GetDimensions())) + Cells[idx].DEBUGMEM_Validate(); + for (Vector4i idx : Region4i(PossiblePermutations.GetDimensions())) + PossiblePermutations[idx].DEBUGMEM_Validate(); + } + + void DEBUGMEM_ValidateAll() const + { + #if WFCPP_CHECK_MEMORY + DEBUGMEM_ValidateInputs(); + DEBUGMEM_ValidateOutputs(); + #endif + } //TODO: "Policies". Such as: // * BoundaryPolicy (e.x. wrapping, clamping, or assuming a specific edge face) @@ -115,7 +141,7 @@ namespace WFC //TOOD: Data about which pointIDs are "friends" //The simulation settings: - //TODO: These shouldn't be publicly non-const, as changing them effects tile possibilities. But don't overdo it, this will be refactored out eventually + //TODO: These shouldn't be publicly non-const, as changing them affects tile possibilities. But don't overdo it, this will be refactored out eventually bool IsPeriodicX = false, IsPeriodicY = false, IsPeriodicZ = false; diff --git a/WFC++/Tiled3D/StandardRunner.cpp b/WFC++/Tiled3D/StandardRunner.cpp index 24137c8..cd84bb6 100644 --- a/WFC++/Tiled3D/StandardRunner.cpp +++ b/WFC++/Tiled3D/StandardRunner.cpp @@ -64,7 +64,7 @@ void StandardRunner::ClearAround(const Vector3i& centerCellPos) Grid.ClearCells(region, &report); //Process the report. - //Note that the order is important, these collections aren't mutually exclusive. + //Note that the order is important; the report's collections aren't mutually exclusive. nextCells.Erase(report.GotBoring); nextCells.Add(report.GotInteresting); assert(report.GotUnsolvable.GetSize() == 0); //Removing tiles shouldn't make @@ -107,33 +107,38 @@ void StandardRunner::Set(const Vector3i& cellPos, TileIdx tile, Transform3D perm Vector3i StandardRunner::PickNextCellToSet() { + assert(nextCells.GetSize() > 0); + //Assign a priority to each cell under consideration. - buffer_pickCell_priorities.Clear(); - auto& cellPriorities = buffer_pickCell_priorities; + buffer_pickCell_options.Clear(); + buffer_pickCell_options.Reserve(nextCells.GetSize()); + auto& cellPriorities = buffer_pickCell_options; + //Get each cell's priority and add it to the candidate list. + //Also track the current highest-priority. float maxPriority = std::numeric_limits().lowest(); for (const Vector3i& cellPos : nextCells) { float priority = GetPriority(cellPos); - cellPriorities[cellPos] = priority; + cellPriorities.GetUnderlying().emplace_back(cellPos, priority); maxPriority = Math::Max(maxPriority, priority); } //Filter out the cells of less-than-max priority. - auto iter = cellPriorities.begin(); - while (iter != cellPriorities.end()) - { - if (iter->second < maxPriority) - iter = cellPriorities.Unwrap().erase(iter); - else - ++iter; - } - - //Pick one cell randomly. - iter = cellPriorities.begin(); - auto idx = std::uniform_int_distribution(0, (int)cellPriorities.GetSize() - 1)(Rand); - std::advance(iter, idx); - return iter->first; + auto newEndIterator = std::remove_if( + cellPriorities.begin(), cellPriorities.end(), + [maxPriority](const std::tuple& option) + { + return std::get<1>(option) < maxPriority; + } + ); + cellPriorities.GetUnderlying().erase(newEndIterator, cellPriorities.end()); + assert(cellPriorities.GetSize() > 1); + + //Randomly choose one max-priority cell. + return std::get<0>(cellPriorities[ + std::uniform_int_distribution(0, static_cast(cellPriorities.GetSize() - 1))(Rand) + ]); } bool StandardRunner::Tick() @@ -206,30 +211,27 @@ bool StandardRunner::TickN(int n) WFC::Nullable> StandardRunner::RandomTile(const TransformSet* allowedPerTile) { - auto& distributionBuffer = buffer_randomTile_distribution; + auto& distributionWeights = buffer_randomTile_weights; - //Pick a tile. - distributionBuffer.Clear(); + //Pick a tile, weighting them by their number of possible permutations + // (and of course the user's own weights). + distributionWeights.Clear(); for (int tileI = 0; tileI < Grid.InputTiles.GetSize(); ++tileI) - distributionBuffer.PushBack(allowedPerTile[tileI].Size() * Grid.InputTiles[tileI].Weight); - //If all tiles have weight 0, then none are possible. - if (std::all_of(distributionBuffer.begin(), distributionBuffer.end(), - [](int i) { return i == 0; })) + distributionWeights.PushBack(static_cast(allowedPerTile[tileI].Size() * Grid.InputTiles[tileI].Weight)); + int chosenTileI = PickWeightedRandomIndex(Rand, distributionWeights); + if (chosenTileI < 0) return { }; - std::discrete_distribution tileDistribution(distributionBuffer.begin(), - distributionBuffer.end()); - int chosenTileI = tileDistribution(Rand); //Pick a permutation for the tile. const auto& permutations = allowedPerTile[chosenTileI]; assert(permutations.Size() > 0); - distributionBuffer.Resize((size_t)N_ROTATIONS_3D * 2); - std::fill(distributionBuffer.begin(), distributionBuffer.end(), 0); + distributionWeights.Resize(static_cast(N_ROTATIONS_3D * 2)); + std::fill(distributionWeights.begin(), distributionWeights.end(), 0); for (Transform3D tr : permutations) - distributionBuffer[TransformSet::ToBitIdx(tr)] = 1; - std::discrete_distribution permDistribution(distributionBuffer.begin(), - distributionBuffer.end()); - int chosenTransformI = permDistribution(Rand); + distributionWeights[TransformSet::ToBitIdx(tr)] = 1; + int chosenTransformI = PickWeightedRandomIndex(Rand, distributionWeights); + assert(chosenTransformI >= 0); + return std::make_tuple((TileIdx)chosenTileI, TransformSet::FromBit(chosenTransformI)); } \ No newline at end of file diff --git a/WFC++/Tiled3D/StandardRunner.h b/WFC++/Tiled3D/StandardRunner.h index 00b453e..696d1a5 100644 --- a/WFC++/Tiled3D/StandardRunner.h +++ b/WFC++/Tiled3D/StandardRunner.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "Grid.h" @@ -110,8 +111,7 @@ namespace Tiled3D StandardRunner(const List& inputTiles, const Vector3i& gridSize, const Dictionary>* constants = nullptr, PRNG rand = PRNG(std::random_device()())) - : Grid(inputTiles, gridSize), Rand(rand), - History(gridSize, { }) + : History(gridSize, { }), Rand(rand), Grid(inputTiles, gridSize) { if (constants != nullptr) for (const auto& constant : *constants) @@ -127,8 +127,8 @@ namespace Tiled3D private: Grid::Report report; Set nextCells, unsolvableCells; - Dictionary buffer_pickCell_priorities; - List buffer_randomTile_distribution; + List> buffer_pickCell_options; + List buffer_randomTile_weights; void ClearAround(const Vector3i& centerCellPos); void Set(const Vector3i& cellPos, TileIdx tile, Transform3D permutation, diff --git a/WFC++/Tiled3D/Tile.hpp b/WFC++/Tiled3D/Tile.hpp index 7e49faf..2580e18 100644 --- a/WFC++/Tiled3D/Tile.hpp +++ b/WFC++/Tiled3D/Tile.hpp @@ -15,6 +15,8 @@ namespace WFC //A single item in a tileset. struct WFC_API Tile { + WFCPP_MEMORY_CHECK_HEADER(16, "Tile struct"); + //Information about the faces of this tile. CubePermutation Data; @@ -26,6 +28,14 @@ namespace WFC //The default weight is chosen by convention to be 100 // so that there's plenty of room to be given a weight under the default. uint32_t Weight = 100; + + WFCPP_MEMORY_CHECK_FOOTER(16, "Tile struct"); + inline void DEBUGMEM_ValidateAll() + { + DEBUGMEM_Validate(); + Data.DEBUGMEM_ValidateAll(); + Permutations.DEBUGMEM_Validate(); + } }; } } \ No newline at end of file diff --git a/WFC++/Tiled3D/Transform3D.cpp b/WFC++/Tiled3D/Transform3D.cpp index 1258c58..b0b055c 100644 --- a/WFC++/Tiled3D/Transform3D.cpp +++ b/WFC++/Tiled3D/Transform3D.cpp @@ -17,7 +17,7 @@ namespace //For example, to see what happens to the MinX face // when applying RotY90, use // "Lookup_DirTransforms[MinX][RotY90]". - std::array, + constexpr std::array, N_DIRECTIONS_3D> Lookup_DirTransforms = { { #pragma region MinX { @@ -357,7 +357,7 @@ FacePermutation Transform3D::ApplyToFace(FacePermutation face) const //For each point, figure out where it is now on the new face. //Swap the point ID's accordingly. std::array oldPointIDs, newPointIDs; - memcpy(oldPointIDs.data(), face.Points, sizeof(PointID) * oldPointIDs.size()); + oldPointIDs = face.Points; memset(newPointIDs.data(), 0xff, sizeof(PointID) * newPointIDs.size()); //Initialize the data to -1 so that // it stands out if one stays uninitialized. for (smallU_t pI = 0; pI < N_FACE_POINTS; ++pI) @@ -371,10 +371,10 @@ FacePermutation Transform3D::ApplyToFace(FacePermutation face) const } //Double-check that every old point mapped to a unique new point. for (PointID newID : newPointIDs) - assert(newID != (PointID)0 - (PointID)1); + assert(newID != ~PointID{ 0 }); //Output the mapped face data. - memcpy(face.Points, newPointIDs.data(), sizeof(PointID) * newPointIDs.size()); + face.Points = newPointIDs; face.Side = newSide; return face; } diff --git a/WFC++/Tiled3D/Transform3D.h b/WFC++/Tiled3D/Transform3D.h index 6d745e3..f8cf10a 100644 --- a/WFC++/Tiled3D/Transform3D.h +++ b/WFC++/Tiled3D/Transform3D.h @@ -1,10 +1,11 @@ #pragma once -#include "../Platform.h" #include //TODO: Why? remove this #include #include +#include "../Platform.h" + #include "../Vector2i.h" #include "../Vector3i.h" #include "../WFCMath.h" @@ -17,7 +18,7 @@ namespace WFC //Each type of face should have its own unique PointIDs -- // anywhere from 1 to 4, depending on the face's symmetry. //Four of these, can uniquely identify a face permutation. - using PointID = uint_fast32_t; + using PointID = std::uint_fast32_t; //Note that we're assuming a left-handed coordinate system. @@ -99,16 +100,29 @@ namespace WFC } - //A specific permutation of a face, on a specific side of the cube. struct WFC_API FacePermutation { + WFCPP_MEMORY_CHECK_HEADER(16, "FacePermutation struct"); + //The side of the cube this face is on. Directions3D Side; //The four points of this face. Indexed with the "FacePoints" enum. //Two faces can line up against each other if their corresponding points match. - PointID Points[N_FACE_POINTS]; + std::array Points; + + FacePermutation() : FacePermutation(Directions3D::MinX) { } + FacePermutation(Directions3D side) : Side(side) + { + for (int i = 0; i < N_FACE_POINTS; ++i) + Points[i] = static_cast(-1); + } + FacePermutation(Directions3D side, const std::array& facePoints) + : Side(side), Points(facePoints) + { + } + //Gets the matching face on the opposite side. FacePermutation Flipped() const @@ -136,13 +150,16 @@ namespace WFC inline bool operator==(const FacePermutation& f2) const { - static_assert(sizeof(Points) == sizeof(PointID) * 4, + static_assert(sizeof(Points) == sizeof(PointID) * N_FACE_POINTS, "memcmp() will be broken if this fails"); return (Side == f2.Side) && - (memcmp(Points, f2.Points, sizeof(PointID) * 4) == 0); + (memcmp(Points.data(), f2.Points.data(), sizeof(PointID) * N_FACE_POINTS) == 0); } inline bool operator!=(const FacePermutation& f2) const { return !(operator==(f2)); } #pragma endregion + + + WFCPP_MEMORY_CHECK_FOOTER(16); }; @@ -183,13 +200,37 @@ namespace WFC //The faces of a cube, with memory of how they have been transformed. struct WFC_API CubePermutation { + WFCPP_MEMORY_CHECK_HEADER(16, "CubePermutation struct"); + //The faces of this cube. //Their positions in the array are based on the original un-transformed cube -- // e.x. Faces[Directions::MinX] is the face that STARTED as the MinX face. - FacePermutation Faces[N_DIRECTIONS_3D]; + std::array Faces; + + CubePermutation() + : CubePermutation(FacePermutation(Directions3D::MinX), FacePermutation{ Directions3D::MaxX }, + FacePermutation{ Directions3D::MinY }, FacePermutation{ Directions3D::MaxY }, + FacePermutation{ Directions3D::MinZ }, FacePermutation{ Directions3D::MaxZ }) + { + + } + CubePermutation(FacePermutation minX, FacePermutation maxX, + FacePermutation minY, FacePermutation maxY, + FacePermutation minZ, FacePermutation maxZ) + : Faces{ minX, maxX, minY, maxY, minZ, maxZ } + { + } //Gets the index in "Faces" for the face currently facing the given direction. uint_fast8_t GetFace(Directions3D dir) const; + + WFCPP_MEMORY_CHECK_FOOTER(16); + inline void DEBUGMEM_ValidateAll() + { + DEBUGMEM_Validate(); + for (const auto& facePermutation : Faces) + facePermutation.DEBUGMEM_Validate(); + } }; @@ -216,7 +257,7 @@ namespace WFC inline Transform3D Inverse() const { - //This is actually quite simple, because you can consider + //This is actually quite simple because you can consider // the inversion and rotation separately. static const std::array rotLookup = { @@ -265,6 +306,7 @@ namespace WFC Transform3D transform, Directions3D sideAfterTransform) { + //TODO: Seems like a small bottleneck is in here; try keeping a memoized table of transform+sideAfter => originalSide. auto originalSide = transform.Inverse().ApplyToSide(sideAfterTransform); auto newFace = transform.ApplyToFace(cubeBeforeTransform.Faces[originalSide]); assert(newFace.Side == sideAfterTransform); @@ -292,6 +334,9 @@ namespace WFC //TODO: Move to its own file. { public: + + WFCPP_MEMORY_CHECK_HEADER(16, "TransformSet struct"); + static const uint_fast8_t BIT_COUNT = N_ROTATIONS_3D * 2; using BitsType = Math::SmallestUInt; @@ -520,6 +565,9 @@ namespace WFC private: BitsType bits = 0; uint_fast8_t nBits = 0; + + public: + WFCPP_MEMORY_CHECK_FOOTER(16); }; } } \ No newline at end of file diff --git a/WFC++/Vector2i.h b/WFC++/Vector2i.h index 8692c79..8928028 100644 --- a/WFC++/Vector2i.h +++ b/WFC++/Vector2i.h @@ -116,6 +116,9 @@ namespace WFC //Reference: https://stackoverflow.com/questions/30032950/creating-a-hash-seed-value-from-2-integers-fast //It works better with high bits than low ones, // so I bitwise-invert the components before using them. + + //UPDATE: I'm starting to think the real bottleneck was elsewhere in the Dictionary which performs this hash. + int a = ~x, b = ~y; a ^= b; diff --git a/WFCtests/TestTilesets.hpp b/WFCtests/TestTilesets.hpp index 4ad151a..2966c04 100644 --- a/WFCtests/TestTilesets.hpp +++ b/WFCtests/TestTilesets.hpp @@ -39,22 +39,21 @@ namespace Tilesets template inline List OneTileArmy(Transforms... transforms) { - return List { - { - //Faces: - { { - //Remember point ordering: AA, AB, BA, BB - { MinX, { 0, 1, 1, 2 } }, //MinX - { MaxX, { 0, 1, 1, 2 } }, //MaxX - { MinY, { 4, 5, 6, 7 } }, //MinY - { MaxY, { 4, 5, 6, 7 } }, //MaxY - { MinZ, { 3, 3, 3, 3 } }, //MinZ - { MaxZ, { 3, 3, 3, 3 } } //MaxZ - } }, - TransformSet::Combine(transforms...), - uint32_t{100} - } - }; + auto permutations = TransformSet::Combine(transforms...); + List output; + auto& tile = output.PushBack(WFC::Tiled3D::Tile{ }); + + //Remember point ordering: AA, AB, BA, BB + tile.Data.Faces[0] = { MinX, { 0, 1, 1, 2 } }; + tile.Data.Faces[1] = { MaxX, { 0, 1, 1, 2 } }; + tile.Data.Faces[2] = { MinY, { 4, 5, 6, 7 } }; + tile.Data.Faces[3] = { MaxY, { 4, 5, 6, 7 } }; + tile.Data.Faces[4] = { MinZ, { 3, 3, 3, 3 } }; + tile.Data.Faces[5] = { MaxZ, { 3, 3, 3, 3 } }; + tile.Permutations = permutations; + tile.Weight = 100; + + return output; } //TODO: 2 tiles that line up with each other in strange face pairings diff --git a/WFCtests/main.cpp b/WFCtests/main.cpp index 5f12f9b..b59c5b4 100644 --- a/WFCtests/main.cpp +++ b/WFCtests/main.cpp @@ -610,8 +610,8 @@ SUITE(WFC_Tiled3D) Grid state(OneTileArmy(usedTransforms), { 4, 4, 4 }); Grid::Report report; - //Set a cell in the min corner with no transform, and check the effects. - //Horizontally, the neighbors should be locked into using the null permutation. + //Set a cell in the min corner with the identity transform, and check the effects. + //Horizontally, the neighbors should be locked into using the same permutation. //Vertically, the neighbors could still be any permutation, // as the Z face is very symmetrical. state.SetCell({ 0, 0, 0 }, 0, { }, &report, true, false); @@ -844,7 +844,8 @@ SUITE(WFC_Tiled3D) { nSet += 1; CHECK_EQUAL(0, cell.ChosenTile); - CHECK(cell.ChosenPermutation == + + REQUIRE CHECK(cell.ChosenPermutation == state.Grid.Cells[originalCellPos].ChosenPermutation); if (cellPos != originalCellPos) @@ -872,7 +873,8 @@ SUITE(WFC_Tiled3D) usedTransforms.Add(Transform3D{ }); usedTransforms.Add(Transform3D{ false, Rotations3D::AxisZ_90 }); usedTransforms.Add(Transform3D{ false, Rotations3D::AxisY_90 }); //The incompatible one. - StandardRunner state(OneTileArmy(usedTransforms), { 4, 5, 6 }); + //Use a really big world grid to do some stress- and performance-testing. + StandardRunner state(OneTileArmy(usedTransforms), { 50, 50, 50 }); //Set one tile on each Z-slice. Dictionary> constants; @@ -887,12 +889,14 @@ SUITE(WFC_Tiled3D) //Run until the whole grid is solved. //The number of iterations needed is simple to calculate, // as the grid can only be solved one way. + std::cout << "Running slow test...\n"; int nLeft = state.Grid.Cells.GetNumbElements() - 6; for (int i = 0; i < nLeft - 1; ++i) { auto didEnd = state.Tick(); CHECK(!didEnd); } + std::cout << "Slow test finished!\n"; //Finish the last tile. auto didEnd = state.Tick(); CHECK(!didEnd); @@ -903,7 +907,7 @@ SUITE(WFC_Tiled3D) //Check the chosen tiles on each Z-slice. for (int z = 0; z < state.Grid.Cells.GetDepth(); ++z) { - const auto& expectedCell = state.Grid.Cells[{ 2, 2, z }]; + const auto& expectedCell = state.Grid.Cells[{ 0, 0, z }]; for (int y = 0; y < state.Grid.Cells.GetHeight(); ++y) { for (int x = 0; x < state.Grid.Cells.GetWidth(); ++x) diff --git a/WFCunreal/Config/DefaultEngine.ini b/WFCunreal/Config/DefaultEngine.ini index 7e942bd..3ae7c11 100644 --- a/WFCunreal/Config/DefaultEngine.ini +++ b/WFCunreal/Config/DefaultEngine.ini @@ -15,3 +15,6 @@ AppliedDefaultGraphicsPerformance=Maximum +ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/WfcppDemo") +ActiveClassRedirects=(OldClassName="TP_BlankGameModeBase",NewClassName="WfcppDemoGameModeBase") + +[CoreRedirects] ++EnumRedirects=(OldName="/Script/WfcppRuntime.PointID",NewName="/Script/WfcppRuntime.PointSymmetry") \ No newline at end of file diff --git a/WFCunreal/Content/Set_Wires/Wires.uasset b/WFCunreal/Content/Set_Wires/Wires.uasset index 29e95f91d219580804004c08b8570b1ceef32066..14ec5de90e1412027bb35a6f8df3192d9fefdfc0 100644 GIT binary patch delta 115 zcmaFw_TFv6Gy(Y!TrX!iR5|oN(mcv8)GD@dS%?55!{qz2GLyvxWq_;((chc(g~XYm rg2|#l!Oab#LM)T-$;wV%F9}m~Tq*#h2BchA9zW_=-X tW~gAYC{S>7gQyS-;|Z{;^^!1E$E5<8p&Eqcff~5L^6pAd`N{Fh0sxKBDR}?@ diff --git a/WFCunreal/Content/Set_Wires/WiresGenerator.umap b/WFCunreal/Content/Set_Wires/WiresGenerator.umap index 32fc4836606cd67b0f2d674b1fa25771caa5abe2..fb9e305b35ceb2dbb9ff1f5ecf7f38d1c6df5af3 100644 GIT binary patch delta 11281 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 delta 11769 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 diff --git a/WFCunreal/Content/Set_Wires/WiresGenerator_BuiltData.uasset b/WFCunreal/Content/Set_Wires/WiresGenerator_BuiltData.uasset index ff95c7428ee033f0c29718c11967532f3aacdb9f..5c1263e5c36aac3c6b2ca4b95b11a40c9ff27c08 100644 GIT binary patch delta 110 zcmZ3{8@Qr3aKbMEwRJbxe-^2GOsKu=Qd}kevYCsqor@8KnShuXh*^M`6^Pk@m>q~Y mfS41Axqz4(h-A*fLIWSg@9OiI~SwKJXZkov>G4) delta 110 zcmZ3{8@Qr3aKbNvX5Qk7Uygq8T;DeJRax)GHO*X%?Oco?%ml>DK+FQftU$~L#Oy%K n0mPg@%mu{UK+FTgyg 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 ^ODb2O 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 V(@j9lP?~VSARxUfN)`CiL6M>$ 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

UIA-Tgi-sSxqHp1#&f@F2FiO1Lva&L8 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

or1fTAJq!nM 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 diff --git a/WFCunreal/Source/WfcppDemo.Target.cs b/WFCunreal/Source/WfcppDemo.Target.cs index 4aea11f..f2e67a1 100644 --- a/WFCunreal/Source/WfcppDemo.Target.cs +++ b/WFCunreal/Source/WfcppDemo.Target.cs @@ -9,6 +9,7 @@ public WfcppDemoTarget( TargetInfo Target) : base(Target) { Type = TargetType.Game; DefaultBuildSettings = BuildSettingsVersion.V2; + CppStandard = CppStandardVersion.Cpp17; ExtraModuleNames.AddRange( new string[] { "WfcppDemo", "WfcppRuntime" } ); } } diff --git a/WFCunreal/Source/WfcppDemo/WfcppDemo.Build.cs b/WFCunreal/Source/WfcppDemo/WfcppDemo.Build.cs index b2a2fae..3418165 100644 --- a/WFCunreal/Source/WfcppDemo/WfcppDemo.Build.cs +++ b/WFCunreal/Source/WfcppDemo/WfcppDemo.Build.cs @@ -7,17 +7,12 @@ public class WfcppDemo : ModuleRules public WfcppDemo(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + CppStandard = CppStandardVersion.Cpp17; - PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "WfcppRuntime" }); PrivateDependencyModuleNames.AddRange(new string[] { }); - PrivateIncludePaths.AddRange(new string[] { - "../../WFC++", - "../../WFC++/Tiled3D" - }); - PrivateDefinitions.Add("WFC_STATIC=1"); - // Uncomment if you are using Slate UI // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); diff --git a/WFCunreal/Source/WfcppDemoEditor.Target.cs b/WFCunreal/Source/WfcppDemoEditor.Target.cs index b753d0e..c502568 100644 --- a/WFCunreal/Source/WfcppDemoEditor.Target.cs +++ b/WFCunreal/Source/WfcppDemoEditor.Target.cs @@ -9,6 +9,6 @@ public WfcppDemoEditorTarget( TargetInfo Target) : base(Target) { Type = TargetType.Editor; DefaultBuildSettings = BuildSettingsVersion.V2; - ExtraModuleNames.AddRange( new string[] { "WfcppDemo", "WfcppEditor" } ); + ExtraModuleNames.AddRange( new string[] { "WfcppDemo", "WfcppEditor", "WfcppRuntime" } ); } } diff --git a/WFCunreal/Source/WfcppEditor/Private/WfcTilesetEditorScene.cpp b/WFCunreal/Source/WfcppEditor/Private/WfcTilesetEditorScene.cpp index 54e3e0d..b70543f 100644 --- a/WFCunreal/Source/WfcppEditor/Private/WfcTilesetEditorScene.cpp +++ b/WFCunreal/Source/WfcppEditor/Private/WfcTilesetEditorScene.cpp @@ -51,7 +51,7 @@ namespace auto ConvertVec(const WFC::Vector3i& v) { return FVector(v.x, v.y, v.z); } FString MakePointLabel(WFC::Tiled3D::FacePoints corner, - TOptional symmetry = TOptional()) + TOptional symmetry = TOptional()) { const auto* cornerText = TEXT("ERROR"); switch (corner) @@ -68,10 +68,10 @@ namespace const auto* symmetryText = TEXT("ERROR2"); switch (symmetry.GetValue()) { - case PointID::a: symmetryText = TEXT("a"); break; - case PointID::b: symmetryText = TEXT("b"); break; - case PointID::c: symmetryText = TEXT("c"); break; - case PointID::d: symmetryText = TEXT("d"); break; + case PointSymmetry::a: symmetryText = TEXT("a"); break; + case PointSymmetry::b: symmetryText = TEXT("b"); break; + case PointSymmetry::c: symmetryText = TEXT("c"); break; + case PointSymmetry::d: symmetryText = TEXT("d"); break; default: check(false); } @@ -236,7 +236,7 @@ void FWfcTilesetEditorScene::Refresh(const UWfcTileset* tileset, TOptionalGetPrototypeCorner(point.CornerType); - auto pointSymmetry = assetFacePrototype->GetPoint(prototypeCornerType); + auto pointSymmetry = assetFacePrototype->GetPointSymmetry(prototypeCornerType); auto text = MakePointLabel(point.CornerType, pointSymmetry); point.Label->SetText(FText::FromString(MakePointLabel(point.CornerType, pointSymmetry))); diff --git a/WFCunreal/Source/WfcppEditor/WfcppEditor.Build.cs b/WFCunreal/Source/WfcppEditor/WfcppEditor.Build.cs index acc2fe3..88db521 100644 --- a/WFCunreal/Source/WfcppEditor/WfcppEditor.Build.cs +++ b/WFCunreal/Source/WfcppEditor/WfcppEditor.Build.cs @@ -4,6 +4,7 @@ public class WfcppEditor : ModuleRules public WfcppEditor(ReadOnlyTargetRules target) : base(target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + CppStandard = CppStandardVersion.Cpp17; PublicDependencyModuleNames.AddRange(new [] { "Core", "CoreUObject", @@ -27,17 +28,5 @@ public WfcppEditor(ReadOnlyTargetRules target) : base(target) DynamicallyLoadedModuleNames.AddRange(new[] { "AssetTools" }); - - PublicIncludePaths.AddRange(new [] { - "WfcppEditor/Public", - "WfcppRuntime/Public" - }); - PrivateIncludePaths.AddRange(new [] { - "WfcppEditor/Private", - "../../WFC++", - "../../WFC++/Tiled3D" - }); - - PrivateDefinitions.Add("WFC_STATIC=1"); } } \ No newline at end of file diff --git a/WFCunreal/Source/WfcppRuntime/Private/WfcGenerator.cpp b/WFCunreal/Source/WfcppRuntime/Private/WfcGenerator.cpp index b087025..408de4f 100644 --- a/WFCunreal/Source/WfcppRuntime/Private/WfcGenerator.cpp +++ b/WFCunreal/Source/WfcppRuntime/Private/WfcGenerator.cpp @@ -63,7 +63,7 @@ void UWfcGenerator::Start(const UWfcTileset* tiles, tileset = tiles; checkf(seed >= 0, TEXT("Seed value is less than 0: %i"), seed); - checkf(seed <= std::numeric_limits().max(), + checkf(seed <= static_cast(std::numeric_limits().max()), TEXT("Seed value is more than the max of %i: %i"), std::numeric_limits().max(), seed); checkf(tileset->Tiles.Num() > 0, TEXT("Must have at least 1 tile in the tileset!")) @@ -91,8 +91,7 @@ void UWfcGenerator::Start(const UWfcTileset* tiles, for (const auto& tile : tiles->Tiles) { wfcTileIDs.Add(tile.Key); - wfcTileInputs.PushBack({ { } }); - auto& wfcTile = wfcTileInputs.GetBack(); + auto& wfcTile = wfcTileInputs.PushBack({ { } }); wfcTile.Weight = static_cast(tile.Value.WeightU32); @@ -116,7 +115,7 @@ void UWfcGenerator::Start(const UWfcTileset* tiles, { auto localCorner = static_cast(pointI); auto prototypeCorner = assetFace.GetPrototypeCorner(localCorner); - auto cornerID = prototype.GetPoint(prototypeCorner); + auto cornerID = prototype.GetPointSymmetry(prototypeCorner); //Convert the 0-3 symmetry value stored in the asset, // into a unique index across all tile faces. diff --git a/WFCunreal/Source/WfcppRuntime/Public/WfcFacePrototype.h b/WFCunreal/Source/WfcppRuntime/Public/WfcFacePrototype.h index a007d5d..b091806 100644 --- a/WFCunreal/Source/WfcppRuntime/Public/WfcFacePrototype.h +++ b/WFCunreal/Source/WfcppRuntime/Public/WfcFacePrototype.h @@ -6,9 +6,8 @@ //ID's for a tile face, to identify symmetries and match with other faces. -//TODO: Rename 'PointSymmetry', and rename 'GetPoint()' below to 'GetPointSymmetry()'. UENUM(BlueprintType) -enum class PointID : uint8 +enum class PointSymmetry : uint8 { a = 0, b = 1, @@ -27,25 +26,25 @@ struct WFCPPRUNTIME_API FWfcFacePrototype //The ID of the corner on the 'min' side of both face axes. UPROPERTY(EditAnywhere, BlueprintReadWrite) - PointID pAA = PointID::a; + PointSymmetry pAA = PointSymmetry::a; //The ID of the corner on the 'min' side of the first axis (X or Y), // and the 'max' side of the second axis (Y or Z). UPROPERTY(EditAnywhere, BlueprintReadWrite) - PointID pAB = PointID::b; + PointSymmetry pAB = PointSymmetry::b; //The ID of the corner on the 'max' side of the first axis (X or Y), // and the 'min' side of the second axis (Y or Z). UPROPERTY(EditAnywhere, BlueprintReadWrite) - PointID pBA = PointID::c; + PointSymmetry pBA = PointSymmetry::c; //The ID of the corner on the 'max' side of both face axes. UPROPERTY(EditAnywhere, BlueprintReadWrite) - PointID pBB = PointID::d; + PointSymmetry pBB = PointSymmetry::d; //Whether this face can match with itself. UPROPERTY(EditAnywhere, BlueprintReadWrite) bool FriendWithSelf = true; - //A display name for GUI purposes. + //A display name for human readability. UPROPERTY(EditAnywhere, BlueprintReadWrite) FString Nickname = "New Face"; @@ -53,9 +52,9 @@ struct WFCPPRUNTIME_API FWfcFacePrototype //Finds the symmetry of the given corner. - PointID GetPoint(WFC::Tiled3D::FacePoints corner) const { return const_cast(this)->GetPoint(corner); } + PointSymmetry GetPointSymmetry(WFC::Tiled3D::FacePoints corner) const { return const_cast(this)->GetPointSymmetry(corner); } //Gets a mutable reference to the symmetry at the given corner. - PointID& GetPoint(WFC::Tiled3D::FacePoints corner) + PointSymmetry& GetPointSymmetry(WFC::Tiled3D::FacePoints corner) { switch (corner) { diff --git a/WFCunreal/Source/WfcppRuntime/WfcppRuntime.Build.cs b/WFCunreal/Source/WfcppRuntime/WfcppRuntime.Build.cs index fbe959a..79f56ee 100644 --- a/WFCunreal/Source/WfcppRuntime/WfcppRuntime.Build.cs +++ b/WFCunreal/Source/WfcppRuntime/WfcppRuntime.Build.cs @@ -1,9 +1,13 @@ -using UnrealBuildTool; +using System; +using System.Collections.Generic; +using Tools.DotNETCommon; +using UnrealBuildTool; public class WfcppRuntime : ModuleRules { public WfcppRuntime(ReadOnlyTargetRules target) : base(target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + CppStandard = CppStandardVersion.Cpp17; PublicDependencyModuleNames.AddRange(new string[] { }); @@ -11,16 +15,27 @@ public WfcppRuntime(ReadOnlyTargetRules target) : base(target) "Core", "CoreUObject", "Engine", "InputCore" }); + + //Compile the WFC cpp files as part of this module. + var wfcDir = DirectoryReference.Combine( + DirectoryReference.FromString(ModuleDirectory).ParentDirectory.ParentDirectory.ParentDirectory, + "WFC++" + ); + foreach (string subFolder in new[] { "Tiled3D", "HelperSrc" }) + { + var nestedWfcDir = DirectoryReference.Combine(wfcDir, subFolder); + if (!ConditionalAddModuleDirectory(nestedWfcDir)) + throw new Exception("WFC++ directory not found! Expected at " + nestedWfcDir); + } - PublicIncludePaths.AddRange(new [] { - "WfcppRuntime/Public" - }); - PrivateIncludePaths.AddRange(new [] { - "WfcppRuntime/Private", - "../../WFC++", - "../../WFC++/Tiled3D" - }); - - PrivateDefinitions.Add("WFC_STATIC=1"); + //Enable memory debugging: + if (new HashSet() { + UnrealTargetConfiguration.Debug, + UnrealTargetConfiguration.DebugGame + }.Contains(target.Configuration)) + { + PublicDefinitions.Add("WFCPP_CHECK_MEMORY=1"); + } + PublicDefinitions.Add("WFC_API=WFCPPRUNTIME_API"); } } \ No newline at end of file