From 69f2285a95a7f8a32f29198fdc5c37ddb5e25b0e Mon Sep 17 00:00:00 2001 From: "florent.teppe" Date: Tue, 18 Apr 2023 19:35:11 +0200 Subject: [PATCH 1/5] fix issue #7335 --- apps/opencs/model/world/columnimp.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index ea8bff74b7..ad84520b37 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -869,7 +869,7 @@ namespace CSMWorld QVariant get(const Record& record) const override { - return QString::fromUtf8(record.get().mCell.getRefIdString().c_str()); + return QString::fromUtf8(record.get().mCell.serializeText().c_str()); } void set(Record& record, const QVariant& data) override From 3bbf60373a0c9dd12ab152f33f532c55d051e350 Mon Sep 17 00:00:00 2001 From: "florent.teppe" Date: Wed, 19 Apr 2023 10:19:09 +0200 Subject: [PATCH 2/5] Keep things coherent between references and and cell table --- apps/opencs/model/world/cell.cpp | 8 +------- apps/opencs/model/world/columnimp.hpp | 2 +- apps/openmw_test_suite/esm/testrefid.cpp | 4 ++-- components/esm/esm3exteriorcellrefid.cpp | 7 ++++--- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/apps/opencs/model/world/cell.cpp b/apps/opencs/model/world/cell.cpp index f4b0084ef4..edf3b0d40c 100644 --- a/apps/opencs/model/world/cell.cpp +++ b/apps/opencs/model/world/cell.cpp @@ -6,11 +6,5 @@ void CSMWorld::Cell::load(ESM::ESMReader& esm, bool& isDeleted) { ESM::Cell::load(esm, isDeleted, false); - mId = ESM::RefId::stringRefId(mName); - if (isExterior()) - { - std::ostringstream stream; - stream << "#" << mData.mX << " " << mData.mY; - mId = ESM::RefId::stringRefId(stream.str()); - } + mId = ESM::RefId::stringRefId(ESM::Cell::mId.toString()); } diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index ad84520b37..6ce7b96815 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -869,7 +869,7 @@ namespace CSMWorld QVariant get(const Record& record) const override { - return QString::fromUtf8(record.get().mCell.serializeText().c_str()); + return QString::fromUtf8(record.get().mCell.toString().c_str()); } void set(Record& record, const QVariant& data) override diff --git a/apps/openmw_test_suite/esm/testrefid.cpp b/apps/openmw_test_suite/esm/testrefid.cpp index 763484867a..6f50b465ef 100644 --- a/apps/openmw_test_suite/esm/testrefid.cpp +++ b/apps/openmw_test_suite/esm/testrefid.cpp @@ -256,9 +256,9 @@ namespace ESM { RefId::index(REC_ARMO, 42), "ARMO:0x2a" }, { RefId::esm3ExteriorCell(-13, 42), "-13:42" }, { RefId::esm3ExteriorCell(std::numeric_limits::min(), std::numeric_limits::min()), - "-2147483648:-2147483648" }, + "#2147483648 -2147483648" }, { RefId::esm3ExteriorCell(std::numeric_limits::max(), std::numeric_limits::max()), - "2147483647:2147483647" }, + "#2147483647 2147483647" }, }; INSTANTIATE_TEST_SUITE_P(ESMRefIdToString, ESMRefIdToStringTest, ValuesIn(toStringParams)); diff --git a/components/esm/esm3exteriorcellrefid.cpp b/components/esm/esm3exteriorcellrefid.cpp index 63373dd055..c5486f6671 100644 --- a/components/esm/esm3exteriorcellrefid.cpp +++ b/components/esm/esm3exteriorcellrefid.cpp @@ -11,9 +11,10 @@ namespace ESM { constexpr std::size_t separator = 1; std::string result; - result.resize(getDecIntegralCapacity(mX) + separator + getDecIntegralCapacity(mY), '\0'); - const std::size_t endX = serializeDecIntegral(mX, 0, result); - result[endX] = ':'; + result.resize(separator + getDecIntegralCapacity(mX) + separator + getDecIntegralCapacity(mY), '\0'); + result[0] = '#'; + const std::size_t endX = serializeDecIntegral(mX, separator, result); + result[endX] = ' '; const std::size_t endY = serializeDecIntegral(mY, endX + separator, result); result.resize(endY); return result; From cb4a97e50b6cd387400b8e7984aebad7bb262335 Mon Sep 17 00:00:00 2001 From: "florent.teppe" Date: Wed, 19 Apr 2023 10:54:19 +0200 Subject: [PATCH 3/5] Displays references in exterior cells. A bit hackish. --- apps/opencs/view/render/cell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/opencs/view/render/cell.cpp b/apps/opencs/view/render/cell.cpp index c84559db90..cb2fe01772 100644 --- a/apps/opencs/view/render/cell.cpp +++ b/apps/opencs/view/render/cell.cpp @@ -95,7 +95,7 @@ bool CSVRender::Cell::addObjects(int start, int end) for (int i = start; i <= end; ++i) { - const auto& cellId = collection.getRecord(i).get().mCell; + const auto& cellId = ESM::RefId::stringRefId(collection.getRecord(i).get().mCell.toString()); CSMWorld::RecordBase::State state = collection.getRecord(i).mState; From 6b5d9f334400ad188a9da0e251cbefae5f1bdb0a Mon Sep 17 00:00:00 2001 From: "florent.teppe" Date: Wed, 19 Apr 2023 11:49:54 +0200 Subject: [PATCH 4/5] fixes reference saving stage --- apps/opencs/model/doc/savingstages.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/apps/opencs/model/doc/savingstages.cpp b/apps/opencs/model/doc/savingstages.cpp index 4015a4b8bf..c4269670b2 100644 --- a/apps/opencs/model/doc/savingstages.cpp +++ b/apps/opencs/model/doc/savingstages.cpp @@ -256,25 +256,17 @@ void CSMDoc::CollectionReferencesStage::perform(int stage, Messages& messages) if (record.isModified() || record.mState == CSMWorld::RecordBase::State_Deleted) { - const ESM::RefId& cellId + const ESM::RefId cellId = record.get().mOriginalCell.empty() ? record.get().mCell : record.get().mOriginalCell; std::deque& indices = mState.getOrInsertSubRecord(cellId); // collect moved references at the end of the container - const bool interior = !cellId.startsWith("#"); - std::ostringstream stream; - if (!interior) - { - // recalculate the ref's cell location - std::pair index = record.get().getCellIndex(); - stream << "#" << index.first << " " << index.second; - } + const bool interior = !cellId.is(); // An empty mOriginalCell is meant to indicate that it is the same as // the current cell. It is possible that a moved ref is moved again. - if ((record.get().mOriginalCell.empty() ? record.get().mCell : record.get().mOriginalCell) - != ESM::RefId::stringRefId(stream.str()) + if ((record.get().mOriginalCell.empty() ? record.get().mCell : record.get().mOriginalCell) != cellId && !interior && record.mState != CSMWorld::RecordBase::State_ModifiedOnly && !record.get().mNew) indices.push_back(i); else @@ -359,7 +351,7 @@ void CSMDoc::WriteCellCollectionStage::perform(int stage, Messages& messages) std::deque tempRefs; std::deque persistentRefs; - const std::deque* references = mState.findSubRecord(cell.get().mId); + const std::deque* references = mState.findSubRecord(static_cast(cell.get()).mId); if (cell.isModified() || cell.mState == CSMWorld::RecordBase::State_Deleted || references != nullptr) { From fc3d113d298cbe3bf6d482cb91b8099582c1fd62 Mon Sep 17 00:00:00 2001 From: "florent.teppe" Date: Thu, 20 Apr 2023 10:25:10 +0200 Subject: [PATCH 5/5] fix tests --- apps/openmw_test_suite/esm/testrefid.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw_test_suite/esm/testrefid.cpp b/apps/openmw_test_suite/esm/testrefid.cpp index 6f50b465ef..15ec9e1766 100644 --- a/apps/openmw_test_suite/esm/testrefid.cpp +++ b/apps/openmw_test_suite/esm/testrefid.cpp @@ -254,9 +254,9 @@ namespace ESM { RefId::generated(42), "0x2a" }, { RefId::generated(std::numeric_limits::max()), "0xffffffffffffffff" }, { RefId::index(REC_ARMO, 42), "ARMO:0x2a" }, - { RefId::esm3ExteriorCell(-13, 42), "-13:42" }, + { RefId::esm3ExteriorCell(-13, 42), "#-13 42" }, { RefId::esm3ExteriorCell(std::numeric_limits::min(), std::numeric_limits::min()), - "#2147483648 -2147483648" }, + "#-2147483648 -2147483648" }, { RefId::esm3ExteriorCell(std::numeric_limits::max(), std::numeric_limits::max()), "#2147483647 2147483647" }, };