diff --git a/common/lc_instructions.cpp b/common/lc_instructions.cpp index dacd33d2..4011d5ab 100644 --- a/common/lc_instructions.cpp +++ b/common/lc_instructions.cpp @@ -180,7 +180,7 @@ void lcInstructions::AddDefaultPages(lcModel* Model, std::vector { std::set StepSubModels; - for (lcPiece* Piece : Model->GetPieces()) + for (const std::unique_ptr& Piece : Model->GetPieces()) { if (!Piece->IsHidden() && Piece->GetStepShow() == Step && Piece->mPieceInfo->IsModel()) { diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 4256dd13..1f9b8986 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -219,9 +219,9 @@ lcModel::~lcModel() bool lcModel::GetPieceWorldMatrix(lcPiece* Piece, lcMatrix44& ParentWorldMatrix) const { - for (const lcPiece* ModelPiece : mPieces) + for (const std::unique_ptr& ModelPiece : mPieces) { - if (ModelPiece == Piece) + if (ModelPiece.get() == Piece) { ParentWorldMatrix = lcMul(ModelPiece->mModelWorld, ParentWorldMatrix); return true; @@ -249,7 +249,7 @@ bool lcModel::IncludesModel(const lcModel* Model) const if (Model == this) return true; - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->mPieceInfo->IncludesModel(Model)) return true; @@ -291,7 +291,7 @@ void lcModel::DeleteModel() } } - mPieces.DeleteAll(); + mPieces.clear(); mCameras.clear(); mLights.clear(); mGroups.clear(); @@ -334,7 +334,7 @@ void lcModel::UpdatePieceInfo(std::vector& UpdatedModels) lcVector3 Min(FLT_MAX, FLT_MAX, FLT_MAX), Max(-FLT_MAX, -FLT_MAX, -FLT_MAX); - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsVisibleInSubModel()) { @@ -364,7 +364,7 @@ void lcModel::SaveLDraw(QTextStream& Stream, bool SelectedOnly, lcStep LastStep) int AddedSteps = 0; bool SavedStep = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (SelectedOnly && !Piece->IsSelected()) continue; @@ -844,7 +844,7 @@ bool lcModel::LoadBinary(lcFile* file) file->ReadS32(&count, 1); lcPiecesLibrary* Library = lcGetPiecesLibrary(); - const int FirstNewPiece = mPieces.size(); + const size_t FirstNewPiece = mPieces.size(); while (count--) { @@ -963,9 +963,9 @@ bool lcModel::LoadBinary(lcFile* file) Group->mGroup = mGroups[NumGroups + i].get(); } - for (int PieceIdx = FirstNewPiece; PieceIdx < mPieces.size(); PieceIdx++) + for (size_t PieceIndex = FirstNewPiece; PieceIndex < mPieces.size(); PieceIndex++) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = mPieces[PieceIndex].get(); i = (qint32)(quintptr)(Piece->GetGroup()); Piece->SetGroup(nullptr); @@ -1118,7 +1118,7 @@ bool lcModel::LoadInventory(const QByteArray& Inventory) float CurrentY = 0.0f; float ColumnWidth = 0.0f; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { lcBoundingBox BoundingBox = Piece->mPieceInfo->GetBoundingBox(); RoundBounds(BoundingBox.Min.x); @@ -1148,14 +1148,13 @@ bool lcModel::LoadInventory(const QByteArray& Inventory) void lcModel::Merge(lcModel* Other) { - for (int PieceIdx = 0; PieceIdx < Other->mPieces.size(); PieceIdx++) + for (std::unique_ptr& Piece : Other->mPieces) { - lcPiece* Piece = Other->mPieces[PieceIdx]; Piece->SetFileLine(-1); - AddPiece(Piece); + AddPiece(Piece.release()); } - Other->mPieces.RemoveAll(); + Other->mPieces.clear(); for (std::unique_ptr& Camera : Other->mCameras) { @@ -1221,23 +1220,23 @@ void lcModel::Paste(bool PasteToCurrentStep) Buffer.open(QIODevice::ReadOnly); Model->LoadLDraw(Buffer, lcGetActiveProject()); - const lcArray& PastedPieces = Model->mPieces; + const std::vector>& PastedPieces = Model->mPieces; std::vector SelectedObjects; SelectedObjects.reserve(PastedPieces.size()); - for (lcPiece* Piece : PastedPieces) + for (const std::unique_ptr& Piece : PastedPieces) { Piece->SetFileLine(-1); if (PasteToCurrentStep) { Piece->SetStepShow(mCurrentStep); - SelectedObjects.emplace_back(Piece); + SelectedObjects.emplace_back(Piece.get()); } else { if (Piece->GetStepShow() <= mCurrentStep) - SelectedObjects.emplace_back(Piece); + SelectedObjects.emplace_back(Piece.get()); } } @@ -1288,9 +1287,9 @@ void lcModel::DuplicateSelectedPieces() } }; - for (int PieceIdx = 0; PieceIdx < mPieces.size(); PieceIdx++) + for (size_t PieceIdx = 0; PieceIdx < mPieces.size(); PieceIdx++) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = mPieces[PieceIdx].get(); if (!Piece->IsSelected()) continue; @@ -1328,7 +1327,7 @@ void lcModel::GetScene(lcScene* Scene, const lcCamera* ViewCamera, bool AllowHig if (mPieceInfo) mPieceInfo->AddRenderMesh(*Scene); - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsVisible(mCurrentStep)) { @@ -1351,7 +1350,7 @@ void lcModel::GetScene(lcScene* Scene, const lcCamera* ViewCamera, bool AllowHig void lcModel::AddSubModelRenderMeshes(lcScene* Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, lcRenderMeshState RenderMeshState, bool ParentActive) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisibleInSubModel()) Piece->AddSubModelRenderMeshes(Scene, WorldMatrix, DefaultColorIndex, RenderMeshState, ParentActive); } @@ -1643,7 +1642,7 @@ void lcModel::SaveStepImages(const QString& BaseName, bool AddStepSuffix, bool Z void lcModel::RayTest(lcObjectRayTest& ObjectRayTest) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisible(mCurrentStep) && (!ObjectRayTest.IgnoreSelected || !Piece->IsSelected())) Piece->RayTest(ObjectRayTest); @@ -1661,7 +1660,7 @@ void lcModel::RayTest(lcObjectRayTest& ObjectRayTest) const void lcModel::BoxTest(lcObjectBoxTest& ObjectBoxTest) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisible(mCurrentStep)) Piece->BoxTest(ObjectBoxTest); @@ -1678,7 +1677,7 @@ bool lcModel::SubModelMinIntersectDist(const lcVector3& WorldStart, const lcVect { bool MinIntersect = false; - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { const lcMatrix44 InverseWorldMatrix = lcMatrix44AffineInverse(Piece->mModelWorld); const lcVector3 Start = lcMul31(WorldStart, InverseWorldMatrix); @@ -1699,7 +1698,7 @@ bool lcModel::SubModelMinIntersectDist(const lcVector3& WorldStart, const lcVect bool lcModel::SubModelBoxTest(const lcVector4 Planes[6]) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisibleInSubModel() && Piece->mPieceInfo->BoxTest(Piece->mModelWorld, Planes)) return true; @@ -1708,14 +1707,14 @@ bool lcModel::SubModelBoxTest(const lcVector4 Planes[6]) const void lcModel::SubModelCompareBoundingBox(const lcMatrix44& WorldMatrix, lcVector3& Min, lcVector3& Max) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisibleInSubModel()) Piece->SubModelCompareBoundingBox(WorldMatrix, Min, Max); } void lcModel::SubModelAddBoundingBoxPoints(const lcMatrix44& WorldMatrix, std::vector& Points) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisibleInSubModel()) Piece->SubModelAddBoundingBoxPoints(WorldMatrix, Points); } @@ -1746,7 +1745,7 @@ void lcModel::LoadCheckPoint(lcModelHistoryEntry* CheckPoint) lcPiecesLibrary* Library = lcGetPiecesLibrary(); std::vector LoadedInfos; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { PieceInfo* Info = Piece->mPieceInfo; Library->LoadPieceInfo(Info, true, true); @@ -1800,7 +1799,7 @@ void lcModel::SetActive(bool Active) void lcModel::CalculateStep(lcStep Step) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { Piece->UpdatePosition(Step); @@ -1869,7 +1868,7 @@ lcStep lcModel::GetLastStep() const { lcStep Step = 1; - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) Step = lcMax(Step, Piece->GetStepShow()); return Step; @@ -1877,7 +1876,7 @@ lcStep lcModel::GetLastStep() const void lcModel::InsertStep(lcStep Step) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { Piece->InsertTime(Step, 1); if (Piece->IsSelected() && !Piece->IsVisible(mCurrentStep)) @@ -1896,7 +1895,7 @@ void lcModel::InsertStep(lcStep Step) void lcModel::RemoveStep(lcStep Step) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { Piece->RemoveTime(Step, 1); if (Piece->IsSelected() && !Piece->IsVisible(mCurrentStep)) @@ -1968,7 +1967,7 @@ void lcModel::GroupSelection() lcGroup* NewGroup = GetGroup(Dialog.mName, true); - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { @@ -1988,7 +1987,7 @@ void lcModel::UngroupSelection() { std::set SelectedGroups; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { @@ -2009,7 +2008,7 @@ void lcModel::UngroupSelection() } } - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { lcGroup* Group = Piece->GetGroup(); @@ -2032,7 +2031,7 @@ void lcModel::AddSelectedPiecesToGroup() { lcGroup* Group = nullptr; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { @@ -2044,7 +2043,7 @@ void lcModel::AddSelectedPiecesToGroup() if (Group) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsFocused()) { @@ -2060,7 +2059,7 @@ void lcModel::AddSelectedPiecesToGroup() void lcModel::RemoveFocusPieceFromGroup() { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsFocused()) { @@ -2078,8 +2077,8 @@ void lcModel::ShowEditGroupsDialog() QMap PieceParents; QMap GroupParents; - for (lcPiece* Piece : mPieces) - PieceParents[Piece] = Piece->GetGroup(); + for (const std::unique_ptr& Piece : mPieces) + PieceParents[Piece.get()] = Piece->GetGroup(); for (const std::unique_ptr& Group : mGroups) GroupParents[Group.get()] = Group->mGroup; @@ -2091,9 +2090,9 @@ void lcModel::ShowEditGroupsDialog() bool Modified = Dialog.mNewGroups.isEmpty(); - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { - lcGroup* ParentGroup = Dialog.mPieceParents.value(Piece); + lcGroup* ParentGroup = Dialog.mPieceParents.value(Piece.get()); if (ParentGroup != Piece->GetGroup()) { @@ -2154,7 +2153,7 @@ void lcModel::RemoveEmptyGroups() lcGroup* Group = GroupIt->get(); int Ref = 0; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->GetGroup() == Group) Ref++; @@ -2170,7 +2169,7 @@ void lcModel::RemoveEmptyGroups() if (Ref != 0) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->GetGroup() == Group) { @@ -2285,13 +2284,13 @@ void lcModel::AddPiece() if (!PieceInfo) return; - lcPiece* Last = mPieces.empty() ? nullptr : mPieces[mPieces.size() - 1]; + lcPiece* Last = mPieces.empty() ? nullptr : mPieces.back().get(); - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsFocused()) { - Last = Piece; + Last = Piece.get(); break; } } @@ -2325,11 +2324,11 @@ void lcModel::AddPiece() void lcModel::AddPiece(lcPiece* Piece) { - for (int PieceIdx = 0; PieceIdx < mPieces.size(); PieceIdx++) + for (size_t PieceIndex = 0; PieceIndex < mPieces.size(); PieceIndex++) { - if (mPieces[PieceIdx]->GetStepShow() > Piece->GetStepShow()) + if (mPieces[PieceIndex]->GetStepShow() > Piece->GetStepShow()) { - InsertPiece(Piece, PieceIdx); + InsertPiece(Piece, PieceIndex); return; } } @@ -2337,7 +2336,7 @@ void lcModel::AddPiece(lcPiece* Piece) InsertPiece(Piece, mPieces.size()); } -void lcModel::InsertPiece(lcPiece* Piece, int Index) +void lcModel::InsertPiece(lcPiece* Piece, size_t Index) { const PieceInfo* Info = Piece->mPieceInfo; @@ -2349,7 +2348,7 @@ void lcModel::InsertPiece(lcPiece* Piece, int Index) lcGetPiecesLibrary()->mBuffersDirty = true; } - mPieces.InsertAt(Index, Piece); + mPieces.insert(mPieces.begin() + Index, std::unique_ptr(Piece)); } void lcModel::DeleteAllCameras() @@ -2379,7 +2378,7 @@ void lcModel::DeleteSelectedObjects() void lcModel::ResetSelectedPiecesPivotPoint() { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsSelected()) Piece->ResetPivotPoint(); @@ -2388,7 +2387,7 @@ void lcModel::ResetSelectedPiecesPivotPoint() void lcModel::RemoveSelectedPiecesKeyFrames() { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsSelected()) Piece->RemoveKeyFrames(); @@ -2445,9 +2444,9 @@ void lcModel::ShowSelectedPiecesEarlier() { std::vector MovedPieces; - for (int PieceIdx = 0; PieceIdx < mPieces.size(); ) + for (auto PieceIt = mPieces.begin(); PieceIt != mPieces.end(); ) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = PieceIt->get(); if (Piece->IsSelected()) { @@ -2458,13 +2457,13 @@ void lcModel::ShowSelectedPiecesEarlier() Step--; Piece->SetStepShow(Step); - MovedPieces.emplace_back(Piece); - mPieces.RemoveIndex(PieceIdx); + MovedPieces.emplace_back(PieceIt->release()); + PieceIt = mPieces.erase(PieceIt); continue; } } - PieceIdx++; + PieceIt++; } if (MovedPieces.empty()) @@ -2484,11 +2483,11 @@ void lcModel::ShowSelectedPiecesEarlier() void lcModel::ShowSelectedPiecesLater() { - lcArray MovedPieces; + std::vector MovedPieces; - for (int PieceIdx = 0; PieceIdx < mPieces.size(); ) + for (auto PieceIt = mPieces.begin(); PieceIt != mPieces.end(); ) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = PieceIt->get(); if (Piece->IsSelected()) { @@ -2502,21 +2501,20 @@ void lcModel::ShowSelectedPiecesLater() if (!Piece->IsVisible(mCurrentStep)) Piece->SetSelected(false); - MovedPieces.emplace_back(Piece); - mPieces.RemoveIndex(PieceIdx); + MovedPieces.emplace_back(PieceIt->release()); + PieceIt = mPieces.erase(PieceIt); continue; } } - PieceIdx++; + PieceIt++; } if (MovedPieces.empty()) return; - for (int PieceIdx = 0; PieceIdx < MovedPieces.size(); PieceIdx++) + for (lcPiece* Piece : MovedPieces) { - lcPiece* Piece = MovedPieces[PieceIdx]; Piece->SetFileLine(-1); AddPiece(Piece); } @@ -2527,24 +2525,25 @@ void lcModel::ShowSelectedPiecesLater() UpdateAllViews(); } -void lcModel::SetPieceSteps(const QList>& PieceSteps) +void lcModel::SetPieceSteps(const std::vector>& PieceSteps) { if (PieceSteps.size() != mPieces.size()) return; bool Modified = false; - for (int PieceIdx = 0; PieceIdx < PieceSteps.size(); PieceIdx++) + for (size_t PieceIdx = 0; PieceIdx < PieceSteps.size(); PieceIdx++) { - const QPair& PieceStep = PieceSteps[PieceIdx]; - lcPiece* Piece = mPieces[PieceIdx]; + const std::pair& PieceStep = PieceSteps[PieceIdx]; + lcPiece* Piece = mPieces[PieceIdx].get(); if (Piece != PieceStep.first || Piece->GetStepShow() != PieceStep.second) { Piece = PieceStep.first; const lcStep Step = PieceStep.second; - mPieces[PieceIdx] = Piece; + mPieces[PieceIdx].release(); + mPieces[PieceIdx] = std::unique_ptr(Piece); Piece->SetStepShow(Step); if (!Piece->IsVisible(mCurrentStep)) @@ -2565,7 +2564,7 @@ void lcModel::SetPieceSteps(const QList>& PieceSteps) void lcModel::RenamePiece(PieceInfo* Info) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->mPieceInfo == Info) Piece->UpdateID(); } @@ -2575,19 +2574,20 @@ void lcModel::MoveSelectionToModel(lcModel* Model) if (!Model) return; - lcArray Pieces; + std::vector Pieces; lcPiece* ModelPiece = nullptr; lcStep FirstStep = LC_STEP_MAX; lcVector3 Min(FLT_MAX, FLT_MAX, FLT_MAX), Max(-FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int PieceIdx = 0; PieceIdx < mPieces.size(); ) + for (size_t PieceIndex = 0; PieceIndex < mPieces.size(); ) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = mPieces[PieceIndex].get(); if (Piece->IsSelected()) { Piece->CompareBoundingBox(Min, Max); - mPieces.RemoveIndex(PieceIdx); + mPieces[PieceIndex].release(); + mPieces.erase(mPieces.begin() + PieceIndex); Piece->SetGroup(nullptr); // todo: copy groups Pieces.emplace_back(Piece); FirstStep = qMin(FirstStep, Piece->GetStepShow()); @@ -2596,20 +2596,19 @@ void lcModel::MoveSelectionToModel(lcModel* Model) { ModelPiece = new lcPiece(Model->mPieceInfo); ModelPiece->SetColorIndex(gDefaultColor); - InsertPiece(ModelPiece, PieceIdx); - PieceIdx++; + InsertPiece(ModelPiece, PieceIndex); + PieceIndex++; } } else - PieceIdx++; + PieceIndex++; } lcVector3 ModelCenter = (Min + Max) / 2.0f; ModelCenter.z += (Min.z - Max.z) / 2.0f; - for (int PieceIdx = 0; PieceIdx < Pieces.size(); PieceIdx++) + for (lcPiece* Piece : Pieces) { - lcPiece* Piece = Pieces[PieceIdx]; Piece->SetFileLine(-1); Piece->SetStepShow(Piece->GetStepShow() - FirstStep + 1); Piece->MoveSelected(Piece->GetStepShow(), false, -ModelCenter); @@ -2633,21 +2632,22 @@ void lcModel::InlineSelectedModels() { std::vector NewPieces; - for (int PieceIdx = 0; PieceIdx < mPieces.size(); ) + for (size_t PieceIndex = 0; PieceIndex < mPieces.size(); ) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = mPieces[PieceIndex].get(); if (!Piece->IsSelected() || !Piece->mPieceInfo->IsModel()) { - PieceIdx++; + PieceIndex++; continue; } - mPieces.RemoveIndex(PieceIdx); + mPieces[PieceIndex].release(); + mPieces.erase(mPieces.begin() + PieceIndex); lcModel* Model = Piece->mPieceInfo->GetModel(); - for (const lcPiece* ModelPiece : Model->mPieces) + for (const std::unique_ptr& ModelPiece : Model->mPieces) { lcPiece* NewPiece = new lcPiece(nullptr); @@ -2664,8 +2664,8 @@ void lcModel::InlineSelectedModels() NewPiece->UpdatePosition(mCurrentStep); NewPieces.emplace_back(NewPiece); - InsertPiece(NewPiece, PieceIdx); - PieceIdx++; + InsertPiece(NewPiece, PieceIndex); + PieceIndex++; } delete Piece; @@ -2688,18 +2688,17 @@ bool lcModel::RemoveSelectedObjects() bool RemovedCamera = false; bool RemovedLight = false; - for (int PieceIdx = 0; PieceIdx < mPieces.size(); ) + for (auto PieceIt = mPieces.begin(); PieceIt != mPieces.end(); ) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = PieceIt->get(); if (Piece->IsSelected()) { RemovedPiece = true; - mPieces.Remove(Piece); - delete Piece; + PieceIt = mPieces.erase(PieceIt); } else - PieceIdx++; + PieceIt++; } for (std::vector>::iterator CameraIt = mCameras.begin(); CameraIt != mCameras.end(); ) @@ -2755,7 +2754,7 @@ void lcModel::MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector if (AlternateButtonDrag) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsFocused()) { @@ -2767,7 +2766,7 @@ void lcModel::MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector } else { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { @@ -3029,7 +3028,7 @@ void lcModel::SetSelectedPiecesColorIndex(int ColorIndex) { bool Modified = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected() && Piece->GetColorIndex() != ColorIndex) { @@ -3049,12 +3048,12 @@ void lcModel::SetSelectedPiecesColorIndex(int ColorIndex) void lcModel::SetSelectedPiecesStepShow(lcStep Step) { - lcArray MovedPieces; + std::vector MovedPieces; bool SelectionChanged = false; - for (int PieceIdx = 0; PieceIdx < mPieces.size(); ) + for (auto PieceIt = mPieces.begin(); PieceIt != mPieces.end(); ) { - lcPiece* Piece = mPieces[PieceIdx]; + lcPiece* Piece = PieceIt->get(); if (Piece->IsSelected() && Piece->GetStepShow() != Step) { @@ -3066,20 +3065,19 @@ void lcModel::SetSelectedPiecesStepShow(lcStep Step) SelectionChanged = true; } - MovedPieces.emplace_back(Piece); - mPieces.RemoveIndex(PieceIdx); + MovedPieces.emplace_back(PieceIt->release()); + PieceIt = mPieces.erase(PieceIt); continue; } - PieceIdx++; + PieceIt++; } if (MovedPieces.empty()) return; - for (int PieceIdx = 0; PieceIdx < MovedPieces.size(); PieceIdx++) + for (lcPiece* Piece : MovedPieces) { - lcPiece* Piece = MovedPieces[PieceIdx]; Piece->SetFileLine(-1); AddPiece(Piece); } @@ -3095,7 +3093,7 @@ void lcModel::SetSelectedPiecesStepHide(lcStep Step) bool Modified = false; bool SelectionChanged = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected() && Piece->GetStepHide() != Step) { @@ -3200,7 +3198,7 @@ void lcModel::SetObjectsProperty(const std::vector& Objects, lcObject bool lcModel::AnyPiecesSelected() const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsSelected()) return true; @@ -3209,7 +3207,7 @@ bool lcModel::AnyPiecesSelected() const bool lcModel::AnyObjectsSelected() const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsSelected()) return true; @@ -3226,9 +3224,9 @@ bool lcModel::AnyObjectsSelected() const lcObject* lcModel::GetFocusObject() const { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsFocused()) - return Piece; + return Piece.get(); for (const std::unique_ptr& Camera : mCameras) if (Camera->IsFocused()) @@ -3243,7 +3241,7 @@ lcObject* lcModel::GetFocusObject() const lcModel* lcModel::GetFirstSelectedSubmodel() const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsSelected() && Piece->mPieceInfo->IsModel()) return Piece->mPieceInfo->GetModel(); @@ -3252,7 +3250,7 @@ lcModel* lcModel::GetFirstSelectedSubmodel() const void lcModel::GetSubModels(std::set& SubModels) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->mPieceInfo->IsModel()) { @@ -3271,7 +3269,7 @@ bool lcModel::GetMoveRotateTransform(lcVector3& Center, lcMatrix33& RelativeRota Center = lcVector3(0.0f, 0.0f, 0.0f); RelativeRotation = lcMatrix33Identity(); - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (!Piece->IsSelected()) continue; @@ -3366,7 +3364,7 @@ bool lcModel::GetPieceFocusOrSelectionCenter(lcVector3& Center) const lcPiece* Selected = nullptr; int NumSelected = 0; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsFocused()) { @@ -3377,7 +3375,7 @@ bool lcModel::GetPieceFocusOrSelectionCenter(lcVector3& Center) const if (Piece->IsSelected()) { Piece->CompareBoundingBox(Min, Max); - Selected = Piece; + Selected = Piece.get(); NumSelected++; } } @@ -3432,7 +3430,7 @@ bool lcModel::GetSelectionCenter(lcVector3& Center) const bool SinglePieceSelected = true; bool Selected = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { @@ -3440,7 +3438,7 @@ bool lcModel::GetSelectionCenter(lcVector3& Center) const Selected = true; if (!SelectedPiece) - SelectedPiece = Piece; + SelectedPiece = Piece.get(); else SinglePieceSelected = false; } @@ -3485,7 +3483,7 @@ lcBoundingBox lcModel::GetAllPiecesBoundingBox() const Box.Min = lcVector3(FLT_MAX, FLT_MAX, FLT_MAX); Box.Max = lcVector3(-FLT_MAX, -FLT_MAX, -FLT_MAX); - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) Piece->CompareBoundingBox(Box.Min, Box.Max); } else @@ -3500,7 +3498,7 @@ bool lcModel::GetVisiblePiecesBoundingBox(lcVector3& Min, lcVector3& Max) const Min = lcVector3(FLT_MAX, FLT_MAX, FLT_MAX); Max = lcVector3(-FLT_MAX, -FLT_MAX, -FLT_MAX); - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsVisible(mCurrentStep)) { @@ -3516,7 +3514,7 @@ std::vector lcModel::GetPiecesBoundingBoxPoints() const { std::vector Points; - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisible(mCurrentStep)) Piece->SubModelAddBoundingBoxPoints(lcMatrix44Identity(), Points); @@ -3525,7 +3523,7 @@ std::vector lcModel::GetPiecesBoundingBoxPoints() const void lcModel::GetPartsList(int DefaultColorIndex, bool ScanSubModels, bool AddSubModels, lcPartsList& PartsList) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (!Piece->IsVisibleInSubModel()) continue; @@ -3541,7 +3539,7 @@ void lcModel::GetPartsList(int DefaultColorIndex, bool ScanSubModels, bool AddSu void lcModel::GetPartsListForStep(lcStep Step, int DefaultColorIndex, lcPartsList& PartsList, bool Cumulative) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Cumulative ? Piece->GetStepShow() > Step : Piece->GetStepShow() != Step || Piece->IsHidden()) continue; @@ -3557,7 +3555,7 @@ void lcModel::GetPartsListForStep(lcStep Step, int DefaultColorIndex, lcPartsLis void lcModel::GetModelParts(const lcMatrix44& WorldMatrix, int DefaultColorIndex, std::vector& ModelParts) const { - for (const lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) Piece->GetModelParts(WorldMatrix, DefaultColorIndex, ModelParts); } @@ -3573,14 +3571,14 @@ void lcModel::GetSelectionInformation(int* Flags, std::vector& Select lcGroup* Group = nullptr; bool First = true; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { - Selection.emplace_back(Piece); + Selection.emplace_back(Piece.get()); if (Piece->IsFocused()) - *Focus = Piece; + *Focus = Piece.get(); if (Piece->mPieceInfo->IsModel()) *Flags |= LC_SEL_MODEL_SELECTED; @@ -3666,21 +3664,21 @@ std::vector lcModel::GetSelectionModePieces(const lcPiece* SelectedPi break; case lcSelectionMode::Piece: - for (lcPiece* Piece : mPieces) - if (Piece->IsVisible(mCurrentStep) && Piece->mPieceInfo == Info && Piece != SelectedPiece) - Pieces.emplace_back(Piece); + for (const std::unique_ptr& Piece : mPieces) + if (Piece->IsVisible(mCurrentStep) && Piece->mPieceInfo == Info && Piece.get() != SelectedPiece) + Pieces.emplace_back(Piece.get()); break; case lcSelectionMode::Color: - for (lcPiece* Piece : mPieces) - if (Piece->IsVisible(mCurrentStep) && Piece->GetColorIndex() == ColorIndex && Piece != SelectedPiece) - Pieces.emplace_back(Piece); + for (const std::unique_ptr& Piece : mPieces) + if (Piece->IsVisible(mCurrentStep) && Piece->GetColorIndex() == ColorIndex && Piece.get() != SelectedPiece) + Pieces.emplace_back(Piece.get()); break; case lcSelectionMode::PieceColor: - for (lcPiece* Piece : mPieces) - if (Piece->IsVisible(mCurrentStep) && Piece->mPieceInfo == Info && Piece->GetColorIndex() == ColorIndex && Piece != SelectedPiece) - Pieces.emplace_back(Piece); + for (const std::unique_ptr& Piece : mPieces) + if (Piece->IsVisible(mCurrentStep) && Piece->mPieceInfo == Info && Piece->GetColorIndex() == ColorIndex && Piece.get() != SelectedPiece) + Pieces.emplace_back(Piece.get()); break; } @@ -3689,7 +3687,7 @@ std::vector lcModel::GetSelectionModePieces(const lcPiece* SelectedPi void lcModel::ClearSelection(bool UpdateInterface) { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) Piece->SetSelected(false); for (const std::unique_ptr& Camera : mCameras) @@ -3710,7 +3708,7 @@ void lcModel::SelectGroup(lcGroup* TopGroup, bool Select) if (!TopGroup) return; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (!Piece->IsSelected() && Piece->IsVisible(mCurrentStep) && (Piece->GetTopGroup() == TopGroup)) Piece->SetSelected(Select); } @@ -3914,7 +3912,7 @@ void lcModel::RemoveFromSelection(const lcObjectSection& ObjectSection) void lcModel::SelectAllPieces() { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisible(mCurrentStep)) Piece->SetSelected(true); @@ -3925,7 +3923,7 @@ void lcModel::SelectAllPieces() void lcModel::InvertSelection() { - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) if (Piece->IsVisible(mCurrentStep)) Piece->SetSelected(!Piece->IsSelected()); @@ -3937,7 +3935,7 @@ void lcModel::HideSelectedPieces() { bool Modified = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected()) { @@ -3961,7 +3959,7 @@ void lcModel::HideUnselectedPieces() { bool Modified = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (!Piece->IsSelected()) { @@ -3984,7 +3982,7 @@ void lcModel::UnhideSelectedPieces() { bool Modified = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsSelected() && Piece->IsHidden()) { @@ -4007,7 +4005,7 @@ void lcModel::UnhideAllPieces() { bool Modified = false; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (Piece->IsHidden()) { @@ -4059,7 +4057,7 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) Piece->SetPieceInfo(Params.ReplacePieceInfo, QString(), true); }; - int StartIdx = mPieces.size() - 1; + size_t StartIndex = mPieces.size() - 1; int ReplacedCount = 0; if (!FindAll) @@ -4069,11 +4067,11 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) if (FocusedPiece) { - for (int PieceIdx = 0; PieceIdx < mPieces.size(); PieceIdx++) + for (size_t PieceIndex = 0; PieceIndex < mPieces.size(); PieceIndex++) { - if (FocusedPiece == mPieces[PieceIdx]) + if (FocusedPiece == mPieces[PieceIndex].get()) { - StartIdx = PieceIdx; + StartIndex = PieceIndex; break; } } @@ -4086,23 +4084,28 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) } } - int CurrentIdx = StartIdx; + size_t CurrentIndex = StartIndex; lcPiece* Focus = nullptr; std::vector Selection; for (;;) { if (SearchForward) - CurrentIdx++; + { + CurrentIndex++; + + if (CurrentIndex >= mPieces.size()) + CurrentIndex = 0; + } else - CurrentIdx--; + { + if (CurrentIndex == 0) + CurrentIndex = mPieces.size(); - if (CurrentIdx < 0) - CurrentIdx = mPieces.size() - 1; - else if (CurrentIdx >= mPieces.size()) - CurrentIdx = 0; + CurrentIndex--; + } - lcPiece* Current = mPieces[CurrentIdx]; + lcPiece* Current = mPieces[CurrentIndex].get(); if (Current->IsVisible(mCurrentStep) && PieceMatches(Current)) { @@ -4122,7 +4125,7 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) } } - if (CurrentIdx == StartIdx) + if (CurrentIndex == StartIndex) break; } @@ -4358,9 +4361,11 @@ void lcModel::EraserToolClicked(lcObject* Object) switch (Object->GetType()) { case lcObjectType::Piece: - mPieces.Remove((lcPiece*)Object); - RemoveEmptyGroups(); - delete Object; + if (auto PieceIt = std::find_if(mPieces.begin(), mPieces.end(), [Object](const std::unique_ptr& CheckPiece) { return CheckPiece.get() == Object; }); PieceIt != mPieces.end()) + { + mPieces.erase(PieceIt); + RemoveEmptyGroups(); + } break; case lcObjectType::Camera: @@ -4624,7 +4629,7 @@ void lcModel::ShowArrayDialog() lcVector3 RotationAngles = Dialog.mRotations[0] * Step1 + Dialog.mRotations[1] * Step2 + Dialog.mRotations[2] * Step3; const lcVector3 Offset = Dialog.mOffsets[0] * Step1 + Dialog.mOffsets[1] * Step2 + Dialog.mOffsets[2] * Step3; - for (lcPiece* Piece : mPieces) + for (const std::unique_ptr& Piece : mPieces) { if (!Piece->IsSelected()) continue; diff --git a/common/lc_model.h b/common/lc_model.h index 17ed5875..c3188488 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -135,7 +135,7 @@ public: return mPieceInfo; } - const lcArray& GetPieces() const + const std::vector>& GetPieces() const { return mPieces; } @@ -219,7 +219,7 @@ public: void RemoveFocusedControlPoint(); void ShowSelectedPiecesEarlier(); void ShowSelectedPiecesLater(); - void SetPieceSteps(const QList>& PieceSteps); + void SetPieceSteps(const std::vector>& PieceSteps); void RenamePiece(PieceInfo* Info); void MoveSelectionToModel(lcModel* Model); @@ -390,7 +390,7 @@ protected: void SelectGroup(lcGroup* TopGroup, bool Select); void AddPiece(lcPiece* Piece); - void InsertPiece(lcPiece* Piece, int Index); + void InsertPiece(lcPiece* Piece, size_t Index); lcPOVRayOptions mPOVRayOptions; lcModelProperties mProperties; @@ -403,7 +403,7 @@ protected: lcVector3 mMouseToolDistance; bool mMouseToolFirstMove; - lcArray mPieces; + std::vector> mPieces; std::vector> mCameras; std::vector> mLights; std::vector> mGroups; diff --git a/common/lc_previewwidget.cpp b/common/lc_previewwidget.cpp index 29061020..f46219b3 100644 --- a/common/lc_previewwidget.cpp +++ b/common/lc_previewwidget.cpp @@ -97,7 +97,7 @@ bool lcPreview::SetCurrentPiece(const QString& PartType, int ColorCode) if (Info) { - for (lcPiece* ModelPiece : mModel->GetPieces()) + for (const std::unique_ptr& ModelPiece : mModel->GetPieces()) { if (Info == ModelPiece->mPieceInfo) { @@ -156,7 +156,7 @@ void lcPreview::UpdatePreview() QString PartType; int ColorCode = -1; - for (lcPiece* ModelPiece : mModel->GetPieces()) + for (const std::unique_ptr& ModelPiece : mModel->GetPieces()) { if (ModelPiece->mPieceInfo) { diff --git a/common/lc_timelinewidget.cpp b/common/lc_timelinewidget.cpp index 963c407e..5085302e 100644 --- a/common/lc_timelinewidget.cpp +++ b/common/lc_timelinewidget.cpp @@ -128,12 +128,12 @@ void lcTimelineWidget::Update(bool Clear, bool UpdateItems) StepItem->setExpanded(true); } - const lcArray& Pieces = Model->GetPieces(); + const std::vector>& Pieces = Model->GetPieces(); QTreeWidgetItem* StepItem = nullptr; int PieceItemIndex = 0; lcStep Step = 0; - for (lcPiece* Piece : Pieces) + for (const std::unique_ptr& Piece : Pieces) { while (Step != Piece->GetStepShow()) { @@ -143,8 +143,9 @@ void lcTimelineWidget::Update(bool Clear, bool UpdateItems) { QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex); lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value(); + auto RemoveIt = std::find_if(Pieces.begin(), Pieces.end(), [RemovePiece](const std::unique_ptr& CheckPiece){ return CheckPiece.get() == RemovePiece; }); - if (Pieces.FindIndex(RemovePiece) == -1) + if (RemoveIt == Pieces.end()) { mItems.remove(RemovePiece); delete PieceItem; @@ -162,7 +163,7 @@ void lcTimelineWidget::Update(bool Clear, bool UpdateItems) PieceItemIndex = 0; } - QTreeWidgetItem* PieceItem = mItems.value(Piece); + QTreeWidgetItem* PieceItem = mItems.value(Piece.get()); bool UpdateItem = UpdateItems; if (StepItem) @@ -171,9 +172,9 @@ void lcTimelineWidget::Update(bool Clear, bool UpdateItems) { PieceItem = new QTreeWidgetItem(); PieceItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); - PieceItem->setData(0, Qt::UserRole, QVariant::fromValue((uintptr_t)Piece)); + PieceItem->setData(0, Qt::UserRole, QVariant::fromValue((uintptr_t)Piece.get())); StepItem->insertChild(PieceItemIndex, PieceItem); - mItems[Piece] = PieceItem; + mItems[Piece.get()] = PieceItem; UpdateItem = true; } @@ -644,7 +645,7 @@ void lcTimelineWidget::PreviewSelection(QTreeWidgetItem* CurrentItem) void lcTimelineWidget::UpdateModel() { - QList> PieceSteps; + std::vector> PieceSteps; for (int TopLevelItemIdx = 0; TopLevelItemIdx < topLevelItemCount(); TopLevelItemIdx++) { @@ -655,7 +656,7 @@ void lcTimelineWidget::UpdateModel() QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIdx); lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value(); - PieceSteps.append(QPair(Piece, TopLevelItemIdx + 1)); + PieceSteps.emplace_back(std::pair(Piece, TopLevelItemIdx + 1)); } } diff --git a/qt/lc_qselectdialog.cpp b/qt/lc_qselectdialog.cpp index d91e8d9b..39058bcf 100644 --- a/qt/lc_qselectdialog.cpp +++ b/qt/lc_qselectdialog.cpp @@ -183,16 +183,16 @@ void lcQSelectDialog::AddChildren(QTreeWidgetItem* ParentItem, lcGroup* ParentGr AddChildren(GroupItem, Group.get(), Model); } - const lcArray& Pieces = Model->GetPieces(); + const std::vector>& Pieces = Model->GetPieces(); lcStep currentStep = Model->GetCurrentStep(); - for (lcPiece* Piece : Pieces) + for (const std::unique_ptr& Piece : Pieces) { if (Piece->GetGroup() != ParentGroup || !Piece->IsVisible(currentStep)) continue; QTreeWidgetItem* PieceItem = new QTreeWidgetItem(ParentItem, QStringList(Piece->GetName())); - PieceItem->setData(0, IndexRole, QVariant::fromValue((uintptr_t)Piece)); + PieceItem->setData(0, IndexRole, QVariant::fromValue((uintptr_t)Piece.get())); PieceItem->setCheckState(0, Piece->IsSelected() ? Qt::Checked : Qt::Unchecked); }