diff --git a/apps/opencs/model/doc/savingstages.cpp b/apps/opencs/model/doc/savingstages.cpp index 7d6e8fef88..edf319db6c 100644 --- a/apps/opencs/model/doc/savingstages.cpp +++ b/apps/opencs/model/doc/savingstages.cpp @@ -253,12 +253,9 @@ int CSMDoc::WriteCellCollectionStage::setup() return mDocument.getData().getCells().getSize(); } -int CSMDoc::WriteCellCollectionStage::writeReferences (const std::deque& references, bool interior, unsigned int& newRefNum, bool temp) +void CSMDoc::WriteCellCollectionStage::writeReferences (const std::deque& references, bool interior, unsigned int& newRefNum) { ESM::ESMWriter& writer = mState.getWriter(); - size_t refCount = 0; - const CSMWorld::RefIdCollection& referenceables = mDocument.getData().getReferenceables(); - const CSMWorld::RefIdData& refIdData = referenceables.getDataSet(); for (std::deque::const_iterator iter (references.begin()); iter!=references.end(); ++iter) @@ -266,14 +263,6 @@ int CSMDoc::WriteCellCollectionStage::writeReferences (const std::deque& re const CSMWorld::Record& ref = mDocument.getData().getReferences().getRecord (*iter); - unsigned int recordFlags = refIdData.getRecordFlags(ref.get().mId); - bool isPersistent = (recordFlags & 0x00000400) != 0; - - if (temp && isPersistent || !temp && !isPersistent) - continue; - - refCount++; - if (ref.isModified() || ref.mState == CSMWorld::RecordBase::State_Deleted) { CSMWorld::CellRef refRecord = ref.get(); @@ -318,14 +307,17 @@ int CSMDoc::WriteCellCollectionStage::writeReferences (const std::deque& re refRecord.save (writer, false, false, ref.mState == CSMWorld::RecordBase::State_Deleted); } } - - return refCount; } void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages) { ESM::ESMWriter& writer = mState.getWriter(); const CSMWorld::Record& cell = mDocument.getData().getCells().getRecord (stage); + const CSMWorld::RefIdCollection& referenceables = mDocument.getData().getReferenceables(); + const CSMWorld::RefIdData& refIdData = referenceables.getDataSet(); + + std::deque tempRefs; + std::deque persistentRefs; std::map >::const_iterator references = mState.getSubRecords().find (Misc::StringUtils::lowerCase (cell.get().mId)); @@ -350,6 +342,14 @@ void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages) CSMWorld::CellRef refRecord = ref.get(); + unsigned int recordFlags = refIdData.getRecordFlags(refRecord.mRefID); + bool isPersistent = (recordFlags & 0x00000400) != 0; + + if (isPersistent) + persistentRefs.push_back(*iter); + else + tempRefs.push_back(*iter); + if (refRecord.mNew || (!interior && ref.mState==CSMWorld::RecordBase::State_ModifiedOnly && /// \todo consider worldspace @@ -380,10 +380,9 @@ void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages) // write references if (references!=mState.getSubRecords().end()) { - int persistentRefCount = writeReferences(references->second, interior, newRefNum, false/*temp*/); - cellRecord.saveTempMarker(writer, int(references->second.size()) - persistentRefCount); - // FIXME: loops twice, inefficient - writeReferences(references->second, interior, newRefNum, true/*temp*/); + writeReferences(persistentRefs, interior, newRefNum); + cellRecord.saveTempMarker(writer, int(references->second.size()) - persistentRefs.size()); + writeReferences(tempRefs, interior, newRefNum); } writer.endRecord (cellRecord.sRecordId); diff --git a/apps/opencs/model/doc/savingstages.hpp b/apps/opencs/model/doc/savingstages.hpp index e9497a6064..d59a1efe5e 100644 --- a/apps/opencs/model/doc/savingstages.hpp +++ b/apps/opencs/model/doc/savingstages.hpp @@ -171,7 +171,7 @@ namespace CSMDoc Document& mDocument; SavingState& mState; - int writeReferences (const std::deque& references, bool interior, unsigned int& newRefNum, bool temp); + void writeReferences (const std::deque& references, bool interior, unsigned int& newRefNum); public: