From c3dfa60882d94bbf5893b5c4e91384ff57a21e8b Mon Sep 17 00:00:00 2001 From: Niels Breuker Date: Fri, 31 Mar 2023 14:27:14 +0200 Subject: Instead of explicit closure pieces try to place pieces with a single connector. --- src/Generating/PieceGeneratorBFSTree.cpp | 41 +++++++++++++++++++++----------- src/Generating/PiecePool.h | 3 --- src/Generating/PrefabPiecePool.cpp | 36 ++-------------------------- src/Generating/PrefabPiecePool.h | 1 - src/Generating/VillageGen.cpp | 7 ------ 5 files changed, 29 insertions(+), 59 deletions(-) diff --git a/src/Generating/PieceGeneratorBFSTree.cpp b/src/Generating/PieceGeneratorBFSTree.cpp index cf6e82ca3..7aaebe75c 100644 --- a/src/Generating/PieceGeneratorBFSTree.cpp +++ b/src/Generating/PieceGeneratorBFSTree.cpp @@ -108,14 +108,33 @@ bool cPieceGeneratorBFSTree::TryPlacePieceAtConnector( // Get a list of available connections: cConnections Connections; int WantedConnectorType = -a_Connector.m_Type; - cPieces AvailablePieces; + cPieces AvailablePieces = m_PiecePool.GetPiecesWithConnector(WantedConnectorType); if (a_OnlyClosurePieces) { - AvailablePieces = m_PiecePool.GetClosurePiecesWithConnector(WantedConnectorType); - } - else - { - AvailablePieces = m_PiecePool.GetPiecesWithConnector(WantedConnectorType); + cPieces closurePieces; + closurePieces.reserve(AvailablePieces.size()); + for (auto & piece : AvailablePieces) + { + auto hitBox = piece->GetHitBox(); + hitBox.Sort(); + auto pieceSize = hitBox.p2 - hitBox.p1; + auto connectors = piece->GetConnectors(); + Vector3i lastCoord = connectors[0].m_Pos; + bool hasMultipleConnectors = false; + for (const auto & connector : connectors) + { + if (connector.m_Pos != lastCoord) + { + hasMultipleConnectors = true; + break; + } + } + if (!hasMultipleConnectors) + { + closurePieces.push_back(piece); + } + } + AvailablePieces = closurePieces; } Connections.reserve(AvailablePieces.size()); Vector3i ConnPos = cPiece::cConnector::AddDirection(a_Connector.m_Pos, a_Connector.m_Direction); // The position at which the new connector should be placed - 1 block away from the current connector @@ -123,14 +142,8 @@ bool cPieceGeneratorBFSTree::TryPlacePieceAtConnector( FindPieceForConnector(AvailablePieces, a_ParentPiece, a_Connector, WantedConnectorType, ConnPos, a_OutPieces, Connections, WeightTotal); if (Connections.empty()) { - // If there are no available connections try to place a closure connector. - AvailablePieces = m_PiecePool.GetClosurePiecesWithConnector(WantedConnectorType); - FindPieceForConnector(AvailablePieces, a_ParentPiece, a_Connector, WantedConnectorType, ConnPos, a_OutPieces, Connections, WeightTotal); - if (Connections.empty()) - { - // No available connections, bail out - return false; - } + // No available connections, bail out + return false; } ASSERT(WeightTotal > 0); diff --git a/src/Generating/PiecePool.h b/src/Generating/PiecePool.h index 2e027e354..5897f32c7 100644 --- a/src/Generating/PiecePool.h +++ b/src/Generating/PiecePool.h @@ -284,9 +284,6 @@ public: The cPiece pointers returned are managed by the pool and the caller doesn't free them. */ virtual cPieces GetPiecesWithConnector(int a_ConnectorType) = 0; - /** Returns a list of closure pieces that contain the specified connector type. */ - virtual cPieces GetClosurePiecesWithConnector(int a_ConnectorType) = 0; - /** Returns the pieces that should be used as the starting point. Multiple starting points are supported, one of the returned piece will be chosen. */ virtual cPieces GetStartingPieces(void) = 0; diff --git a/src/Generating/PrefabPiecePool.cpp b/src/Generating/PrefabPiecePool.cpp index b78251d78..1fbdac8af 100644 --- a/src/Generating/PrefabPiecePool.cpp +++ b/src/Generating/PrefabPiecePool.cpp @@ -350,18 +350,8 @@ bool cPrefabPiecePool::LoadCubesetPieceVer1(const AString & a_FileName, cLuaStat else { auto p = prefab.release(); - - int IsClosurePiece = 0; - a_LuaState.GetNamedValue("Metadata.IsClosurePiece", IsClosurePiece); - if (IsClosurePiece != 0) - { - m_ClosurePieces.push_back(p); - } - else - { - m_AllPieces.push_back(p); - AddToPerConnectorMap(p); - } + m_AllPieces.push_back(p); + AddToPerConnectorMap(p); } return true; @@ -773,28 +763,6 @@ cPieces cPrefabPiecePool::GetPiecesWithConnector(int a_ConnectorType) -cPieces cPrefabPiecePool::GetClosurePiecesWithConnector(int a_ConnectorType) -{ - cPieces pieces; - for (auto& piece : m_ClosurePieces) - { - auto connectors = piece->GetConnectors(); - for (auto& connector : connectors) - { - if (connector.m_Type == a_ConnectorType) - { - pieces.push_back(piece); - break; - } - } - } - return pieces; -} - - - - - cPieces cPrefabPiecePool::GetStartingPieces(void) { if (m_StartingPieces.empty()) diff --git a/src/Generating/PrefabPiecePool.h b/src/Generating/PrefabPiecePool.h index 36aaf8bae..27bcf1965 100644 --- a/src/Generating/PrefabPiecePool.h +++ b/src/Generating/PrefabPiecePool.h @@ -112,7 +112,6 @@ public: // cPiecePool overrides: virtual cPieces GetPiecesWithConnector(int a_ConnectorType) override; - virtual cPieces GetClosurePiecesWithConnector(int a_ConnectorType) override; virtual cPieces GetStartingPieces(void) override; virtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override; virtual int GetStartingPieceWeight(const cPiece & a_NewPiece) override; diff --git a/src/Generating/VillageGen.cpp b/src/Generating/VillageGen.cpp index 281d49541..6575b2f3a 100644 --- a/src/Generating/VillageGen.cpp +++ b/src/Generating/VillageGen.cpp @@ -258,13 +258,6 @@ protected: } - virtual cPieces GetClosurePiecesWithConnector(int a_ConnectorType) override - { - cPieces pieces; - return pieces; - } - - virtual cPieces GetStartingPieces(void) override { return m_Prefabs.GetStartingPieces(); -- cgit v1.2.3