Cleanup lcModelAction.

This commit is contained in:
Leonardo Zide
2026-02-03 21:09:58 -08:00
parent 07c80b705f
commit d41671fff5
3 changed files with 187 additions and 187 deletions
+1 -1
View File
@@ -1988,7 +1988,7 @@ void lcModel::EndActionSequence(const QString& Description)
for (const std::unique_ptr<lcModelAction>& ModelAction : mUndoHistory.front()->ModelActions)
{
if (const lcModelActionSelection* ModelActionSelection = dynamic_cast<const lcModelActionSelection*>(ModelAction.get()))
if (dynamic_cast<const lcModelActionSelection*>(ModelAction.get()))
{
gMainWindow->UpdateSelectedObjects(true);
break;
+177 -176
View File
@@ -6,182 +6,6 @@
#include "light.h"
#include "group.h"
bool lcModelAction::SaveHistoryBuffer(QByteArray& Buffer, const lcModel* Model)
{
QDataStream Stream(&Buffer, QIODevice::WriteOnly);
const std::vector<std::unique_ptr<lcGroup>>& Groups = Model->GetGroups();
const std::vector<std::unique_ptr<lcPiece>>& Pieces = Model->GetPieces();
const std::vector<std::unique_ptr<lcCamera>>& Cameras = Model->GetCameras();
const std::vector<std::unique_ptr<lcLight>>& Lights = Model->GetLights();
uint64_t ObjectCount[4] = { Groups.size(), Pieces.size(), Cameras.size(), Lights.size() };
if (Stream.writeRawData(reinterpret_cast<const char*>(ObjectCount), sizeof(ObjectCount)) != sizeof(ObjectCount))
return false;
for (size_t GroupIndex : mGroupIndices)
{
const lcGroup* Group = Groups[GroupIndex].get();
uint64_t ParentIndex = UINT64_MAX;
if (Group->mGroup)
for (ParentIndex = 0; ParentIndex < Groups.size(); ParentIndex++)
if (Group->mGroup == Groups[ParentIndex].get())
break;
Stream << Group->mName;
Stream << ParentIndex;
}
for (size_t PieceIndex : mPieceIndices)
if (!Pieces[PieceIndex]->SaveUndoData(Stream, Model))
return false;
for (size_t CameraIndex : mCameraIndices)
if (!Cameras[CameraIndex]->SaveUndoData(Stream, Model))
return false;
for (size_t LightIndex : mLightIndices)
if (!Lights[LightIndex]->SaveUndoData(Stream, Model))
return false;
return true;
}
bool lcModelAction::LoadHistoryBuffer(const QByteArray& Buffer, lcModel* Model, bool CreateObjects) const
{
QDataStream Stream(const_cast<QByteArray*>(&Buffer), QIODevice::ReadOnly);
const std::vector<std::unique_ptr<lcGroup>>& Groups = Model->GetGroups();
const std::vector<std::unique_ptr<lcPiece>>& Pieces = Model->GetPieces();
const std::vector<std::unique_ptr<lcCamera>>& Cameras = Model->GetCameras();
const std::vector<std::unique_ptr<lcLight>>& Lights = Model->GetLights();
uint64_t ObjectCount[4];
if (Stream.readRawData(reinterpret_cast<char*>(ObjectCount), sizeof(ObjectCount)) != sizeof(ObjectCount))
return false;
if (CreateObjects)
{
ObjectCount[0] -= mGroupIndices.size();
ObjectCount[1] -= mPieceIndices.size();
ObjectCount[2] -= mCameraIndices.size();
ObjectCount[3] -= mLightIndices.size();
}
if (ObjectCount[0] != Groups.size() || ObjectCount[1] != Pieces.size() || ObjectCount[2] != Cameras.size() || ObjectCount[3] != Lights.size())
return false;
if (CreateObjects)
{
for (size_t GroupIndex : mGroupIndices)
{
std::unique_ptr<lcGroup> Group(new lcGroup());
QString Name;
uint64_t ParentIndex;
Stream >> Name;
Stream >> ParentIndex;
Group->mName = Name;
Group->mGroup = ParentIndex < Groups.size() ? Groups[ParentIndex].get() : nullptr;
Model->AddGroup(std::move(Group), GroupIndex);
}
for (size_t PieceIndex : mPieceIndices)
{
if (PieceIndex > Pieces.size())
return false;
std::unique_ptr<lcPiece> Piece(new lcPiece(nullptr));
if (!Piece->LoadUndoData(Stream, Model))
return false;
Model->AddPiece(std::move(Piece), PieceIndex);
}
for (size_t CameraIndex : mCameraIndices)
{
if (CameraIndex > Cameras.size())
return false;
std::unique_ptr<lcCamera> Camera(new lcCamera(false));
if (!Camera->LoadUndoData(Stream, Model))
return false;
Model->AddCamera(std::move(Camera), CameraIndex);
}
for (size_t LightIndex : mLightIndices)
{
if (LightIndex > Lights.size())
return false;
std::unique_ptr<lcLight> Light(new lcLight(lcVector3(0.0f, 0.0f, 0.0f), lcLightType::Point));
if (!Light->LoadUndoData(Stream, Model))
return false;
Model->AddLight(std::move(Light), LightIndex);
}
}
else
{
for (size_t GroupIndex : mGroupIndices)
{
lcGroup* Group = Groups[GroupIndex].get();
QString Name;
uint64_t ParentIndex;
Stream >> Name;
Stream >> ParentIndex;
Group->mName = Name;
Group->mGroup = ParentIndex < Groups.size() ? Groups[ParentIndex].get() : nullptr;
}
for (size_t PieceIndex : mPieceIndices)
{
if (PieceIndex >= Pieces.size())
return false;
const std::unique_ptr<lcPiece>& Piece = Pieces[PieceIndex];
if (!Piece->LoadUndoData(Stream, Model))
return false;
}
for (size_t CameraIndex : mCameraIndices)
{
if (CameraIndex >= Cameras.size())
return false;
const std::unique_ptr<lcCamera>& Camera = Cameras[CameraIndex];
if (!Camera->LoadUndoData(Stream, Model))
return false;
}
for (size_t LightIndex : mLightIndices)
{
if (LightIndex >= Lights.size())
return false;
const std::unique_ptr<lcLight>& Light = Lights[LightIndex];
if (!Light->LoadUndoData(Stream, Model))
return false;
}
}
return true;
}
void lcModelActionSelection::SaveStartState(const lcModel* Model)
{
SaveState(mStartState, Model);
@@ -323,6 +147,183 @@ lcModelActionObjectEdit::lcModelActionObjectEdit(lcModelActionObjectEditMode Mod
{
}
bool lcModelActionObjectEdit::SaveHistoryBuffer(QByteArray& Buffer, const lcModel* Model)
{
QDataStream Stream(&Buffer, QIODevice::WriteOnly);
const std::vector<std::unique_ptr<lcGroup>>& Groups = Model->GetGroups();
const std::vector<std::unique_ptr<lcPiece>>& Pieces = Model->GetPieces();
const std::vector<std::unique_ptr<lcCamera>>& Cameras = Model->GetCameras();
const std::vector<std::unique_ptr<lcLight>>& Lights = Model->GetLights();
uint64_t ObjectCount[4] = { Groups.size(), Pieces.size(), Cameras.size(), Lights.size() };
if (Stream.writeRawData(reinterpret_cast<const char*>(ObjectCount), sizeof(ObjectCount)) != sizeof(ObjectCount))
return false;
for (size_t GroupIndex : mGroupIndices)
{
const lcGroup* Group = Groups[GroupIndex].get();
uint64_t ParentIndex = UINT64_MAX;
if (Group->mGroup)
for (ParentIndex = 0; ParentIndex < Groups.size(); ParentIndex++)
if (Group->mGroup == Groups[ParentIndex].get())
break;
Stream << Group->mName;
Stream << ParentIndex;
}
for (size_t PieceIndex : mPieceIndices)
if (!Pieces[PieceIndex]->SaveUndoData(Stream, Model))
return false;
for (size_t CameraIndex : mCameraIndices)
if (!Cameras[CameraIndex]->SaveUndoData(Stream, Model))
return false;
for (size_t LightIndex : mLightIndices)
if (!Lights[LightIndex]->SaveUndoData(Stream, Model))
return false;
return true;
}
bool lcModelActionObjectEdit::LoadHistoryBuffer(const QByteArray& Buffer, lcModel* Model, bool CreateObjects) const
{
QDataStream Stream(const_cast<QByteArray*>(&Buffer), QIODevice::ReadOnly);
const std::vector<std::unique_ptr<lcGroup>>& Groups = Model->GetGroups();
const std::vector<std::unique_ptr<lcPiece>>& Pieces = Model->GetPieces();
const std::vector<std::unique_ptr<lcCamera>>& Cameras = Model->GetCameras();
const std::vector<std::unique_ptr<lcLight>>& Lights = Model->GetLights();
uint64_t ObjectCount[4];
if (Stream.readRawData(reinterpret_cast<char*>(ObjectCount), sizeof(ObjectCount)) != sizeof(ObjectCount))
return false;
if (CreateObjects)
{
ObjectCount[0] -= mGroupIndices.size();
ObjectCount[1] -= mPieceIndices.size();
ObjectCount[2] -= mCameraIndices.size();
ObjectCount[3] -= mLightIndices.size();
}
if (ObjectCount[0] != Groups.size() || ObjectCount[1] != Pieces.size() || ObjectCount[2] != Cameras.size() || ObjectCount[3] != Lights.size())
return false;
if (CreateObjects)
{
for (size_t GroupIndex : mGroupIndices)
{
std::unique_ptr<lcGroup> Group(new lcGroup());
QString Name;
uint64_t ParentIndex;
Stream >> Name;
Stream >> ParentIndex;
Group->mName = Name;
Group->mGroup = ParentIndex < Groups.size() ? Groups[ParentIndex].get() : nullptr;
Model->AddGroup(std::move(Group), GroupIndex);
}
for (size_t PieceIndex : mPieceIndices)
{
if (PieceIndex > Pieces.size())
return false;
std::unique_ptr<lcPiece> Piece(new lcPiece(nullptr));
if (!Piece->LoadUndoData(Stream, Model))
return false;
Model->AddPiece(std::move(Piece), PieceIndex);
}
for (size_t CameraIndex : mCameraIndices)
{
if (CameraIndex > Cameras.size())
return false;
std::unique_ptr<lcCamera> Camera(new lcCamera(false));
if (!Camera->LoadUndoData(Stream, Model))
return false;
Model->AddCamera(std::move(Camera), CameraIndex);
}
for (size_t LightIndex : mLightIndices)
{
if (LightIndex > Lights.size())
return false;
std::unique_ptr<lcLight> Light(new lcLight(lcVector3(0.0f, 0.0f, 0.0f), lcLightType::Point));
if (!Light->LoadUndoData(Stream, Model))
return false;
Model->AddLight(std::move(Light), LightIndex);
}
}
else
{
for (size_t GroupIndex : mGroupIndices)
{
lcGroup* Group = Groups[GroupIndex].get();
QString Name;
uint64_t ParentIndex;
Stream >> Name;
Stream >> ParentIndex;
Group->mName = Name;
Group->mGroup = ParentIndex < Groups.size() ? Groups[ParentIndex].get() : nullptr;
}
for (size_t PieceIndex : mPieceIndices)
{
if (PieceIndex >= Pieces.size())
return false;
const std::unique_ptr<lcPiece>& Piece = Pieces[PieceIndex];
if (!Piece->LoadUndoData(Stream, Model))
return false;
}
for (size_t CameraIndex : mCameraIndices)
{
if (CameraIndex >= Cameras.size())
return false;
const std::unique_ptr<lcCamera>& Camera = Cameras[CameraIndex];
if (!Camera->LoadUndoData(Stream, Model))
return false;
}
for (size_t LightIndex : mLightIndices)
{
if (LightIndex >= Lights.size())
return false;
const std::unique_ptr<lcLight>& Light = Lights[LightIndex];
if (!Light->LoadUndoData(Stream, Model))
return false;
}
}
return true;
}
bool lcModelActionObjectEdit::SaveStartState(const lcModel* Model, const lcCamera* Camera)
{
const std::vector<std::unique_ptr<lcPiece>>& Pieces = Model->GetPieces();
+9 -10
View File
@@ -8,15 +8,6 @@ class lcModelAction
public:
lcModelAction() = default;
virtual ~lcModelAction() = default;
protected:
bool SaveHistoryBuffer(QByteArray& Buffer, const lcModel* Model);
bool LoadHistoryBuffer(const QByteArray& Buffer, lcModel* Model, bool CreateObjects) const;
std::vector<size_t> mGroupIndices;
std::vector<size_t> mPieceIndices;
std::vector<size_t> mCameraIndices;
std::vector<size_t> mLightIndices;
};
struct lcModelActionSelectionState
@@ -25,7 +16,7 @@ struct lcModelActionSelectionState
std::vector<bool> CameraSelection;
std::vector<bool> LightSelection;
size_t FocusIndex = SIZE_MAX;
uint32_t FocusSection = 0;
uint32_t FocusSection = ~0U;
lcObjectType FocusObjectType = static_cast<lcObjectType>(~0);
bool operator!=(const lcModelActionSelectionState& Other) const
@@ -86,6 +77,14 @@ public:
}
protected:
bool SaveHistoryBuffer(QByteArray& Buffer, const lcModel* Model);
bool LoadHistoryBuffer(const QByteArray& Buffer, lcModel* Model, bool CreateObjects) const;
std::vector<size_t> mGroupIndices;
std::vector<size_t> mPieceIndices;
std::vector<size_t> mCameraIndices;
std::vector<size_t> mLightIndices;
lcModelActionObjectEditMode mMode;
QByteArray mStartBuffer;
QByteArray mEndBuffer;