Skip to content

Commit

Permalink
Use unique_ptr for cameras.
Browse files Browse the repository at this point in the history
  • Loading branch information
leozide committed Jun 4, 2024
1 parent 27f5dcf commit 6a9c2d6
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 67 deletions.
6 changes: 3 additions & 3 deletions common/camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,13 @@ bool lcCamera::SetName(const QString& Name)
return true;
}

void lcCamera::CreateName(const lcArray<lcCamera*>& Cameras)
void lcCamera::CreateName(const std::vector<std::unique_ptr<lcCamera>>& Cameras)
{
if (!mName.isEmpty())
{
bool Found = false;

for (const lcCamera* Camera : Cameras)
for (const std::unique_ptr<lcCamera>& Camera : Cameras)
{
if (Camera->GetName() == mName)
{
Expand All @@ -147,7 +147,7 @@ void lcCamera::CreateName(const lcArray<lcCamera*>& Cameras)
int MaxCameraNumber = 0;
const QLatin1String Prefix("Camera ");

for (const lcCamera* Camera : Cameras)
for (const std::unique_ptr<lcCamera>& Camera : Cameras)
{
QString CameraName = Camera->GetName();

Expand Down
3 changes: 1 addition & 2 deletions common/camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

#include "object.h"
#include "lc_math.h"
#include "lc_array.h"

#define LC_CAMERA_HIDDEN 0x0001
#define LC_CAMERA_SIMPLE 0x0002
Expand Down Expand Up @@ -65,7 +64,7 @@ class lcCamera : public lcObject
}

bool SetName(const QString& Name);
void CreateName(const lcArray<lcCamera*>& Cameras);
void CreateName(const std::vector<std::unique_ptr<lcCamera>>& Cameras);

bool IsSimple() const
{
Expand Down
14 changes: 7 additions & 7 deletions common/lc_mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2163,25 +2163,25 @@ void lcMainWindow::ViewFocusReceived()

void lcMainWindow::CameraMenuAboutToShow()
{
const lcArray<lcCamera*>& Cameras = lcGetActiveModel()->GetCameras();
const std::vector<std::unique_ptr<lcCamera>>& Cameras = lcGetActiveModel()->GetCameras();
lcView* ActiveView = GetActiveView();
const lcCamera* CurrentCamera = ActiveView ? ActiveView->GetCamera() : nullptr;
bool CurrentSet = false;

for (int ActionIdx = LC_VIEW_CAMERA_FIRST; ActionIdx <= LC_VIEW_CAMERA_LAST; ActionIdx++)
for (size_t ActionIndex = LC_VIEW_CAMERA_FIRST; ActionIndex <= LC_VIEW_CAMERA_LAST; ActionIndex++)
{
QAction* Action = mActions[ActionIdx];
int CameraIdx = ActionIdx - LC_VIEW_CAMERA_FIRST;
QAction* Action = mActions[ActionIndex];
size_t CameraIndex = ActionIndex - LC_VIEW_CAMERA_FIRST;

if (CameraIdx < Cameras.size())
if (CameraIndex < Cameras.size())
{
if (CurrentCamera == Cameras[CameraIdx])
if (CurrentCamera == Cameras[CameraIndex].get())
{
Action->setChecked(true);
CurrentSet = true;
}

Action->setText(Cameras[CameraIdx]->GetName());
Action->setText(Cameras[CameraIndex]->GetName());
Action->setVisible(true);
}
else
Expand Down
96 changes: 56 additions & 40 deletions common/lc_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -275,15 +275,24 @@ void lcModel::DeleteModel()
// TODO: this is only needed to avoid a dangling pointer during undo/redo if a camera is set to a view but we should find a better solution instead
for (lcView* View : Views)
{
lcCamera* Camera = View->GetCamera();
lcCamera* ViewCamera = View->GetCamera();

if (!Camera->IsSimple() && mCameras.FindIndex(Camera) != -1)
View->SetCamera(Camera, true);
if (!ViewCamera->IsSimple())
{
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
{
if (Camera.get() == ViewCamera)
{
View->SetCamera(ViewCamera, true);
break;
}
}
}
}
}

mPieces.DeleteAll();
mCameras.DeleteAll();
mCameras.clear();
mLights.clear();
mGroups.clear();
mFileLines.clear();
Expand Down Expand Up @@ -501,7 +510,7 @@ void lcModel::SaveLDraw(QTextStream& Stream, bool SelectedOnly, lcStep LastStep)
Stream << QLatin1String("0 !LEOCAD GROUP END\r\n");
}

for (const lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (!SelectedOnly || Camera->IsSelected())
Camera->SaveLDraw(Stream);

Expand Down Expand Up @@ -1148,14 +1157,13 @@ void lcModel::Merge(lcModel* Other)

Other->mPieces.RemoveAll();

for (int CameraIdx = 0; CameraIdx < Other->mCameras.size(); CameraIdx++)
for (std::unique_ptr<lcCamera>& Camera : Other->mCameras)
{
lcCamera* Camera = Other->mCameras[CameraIdx];
Camera->CreateName(mCameras);
mCameras.emplace_back(Camera);
mCameras.emplace_back(std::move(Camera));
}

Other->mCameras.RemoveAll();
Other->mCameras.clear();

for (std::unique_ptr<lcLight>& Light : Other->mLights)
{
Expand Down Expand Up @@ -1331,9 +1339,9 @@ void lcModel::GetScene(lcScene* Scene, const lcCamera* ViewCamera, bool AllowHig

if (Scene->GetDrawInterface() && !Scene->GetActiveSubmodelInstance())
{
for (const lcCamera* Camera : mCameras)
if (Camera != ViewCamera && Camera->IsVisible())
Scene->AddInterfaceObject(Camera);
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (Camera.get() != ViewCamera && Camera->IsVisible())
Scene->AddInterfaceObject(Camera.get());

for (const std::unique_ptr<lcLight>& Light : mLights)
if (Light->IsVisible())
Expand Down Expand Up @@ -1642,8 +1650,8 @@ void lcModel::RayTest(lcObjectRayTest& ObjectRayTest) const
if (ObjectRayTest.PiecesOnly)
return;

for (const lcCamera* Camera : mCameras)
if (Camera != ObjectRayTest.ViewCamera && Camera->IsVisible() && (!ObjectRayTest.IgnoreSelected || !Camera->IsSelected()))
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (Camera.get() != ObjectRayTest.ViewCamera && Camera->IsVisible() && (!ObjectRayTest.IgnoreSelected || !Camera->IsSelected()))
Camera->RayTest(ObjectRayTest);

for (const std::unique_ptr<lcLight>& Light : mLights)
Expand All @@ -1657,8 +1665,8 @@ void lcModel::BoxTest(lcObjectBoxTest& ObjectBoxTest) const
if (Piece->IsVisible(mCurrentStep))
Piece->BoxTest(ObjectBoxTest);

for (const lcCamera* Camera : mCameras)
if (Camera != ObjectBoxTest.ViewCamera && Camera->IsVisible())
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (Camera.get() != ObjectBoxTest.ViewCamera && Camera->IsVisible())
Camera->BoxTest(ObjectBoxTest);

for (const std::unique_ptr<lcLight>& Light : mLights)
Expand Down Expand Up @@ -1805,7 +1813,7 @@ void lcModel::CalculateStep(lcStep Step)
}
}

for (lcCamera* Camera : mCameras)
for (std::unique_ptr<lcCamera>& Camera : mCameras)
Camera->UpdatePosition(Step);

for (const std::unique_ptr<lcLight>& Light : mLights)
Expand Down Expand Up @@ -1876,7 +1884,7 @@ void lcModel::InsertStep(lcStep Step)
Piece->SetSelected(false);
}

for (lcCamera* Camera : mCameras)
for (std::unique_ptr<lcCamera>& Camera : mCameras)
Camera->InsertTime(Step, 1);

for (const std::unique_ptr<lcLight>& Light : mLights)
Expand All @@ -1895,7 +1903,7 @@ void lcModel::RemoveStep(lcStep Step)
Piece->SetSelected(false);
}

for (lcCamera* Camera : mCameras)
for (std::unique_ptr<lcCamera>& Camera : mCameras)
Camera->RemoveTime(Step, 1);

for (const std::unique_ptr<lcLight>& Light : mLights)
Expand Down Expand Up @@ -2349,7 +2357,7 @@ void lcModel::DeleteAllCameras()
if (mCameras.empty())
return;

mCameras.DeleteAll();
mCameras.clear();

gMainWindow->UpdateSelectedObjects(true);
UpdateAllViews();
Expand Down Expand Up @@ -2384,7 +2392,7 @@ void lcModel::RemoveSelectedPiecesKeyFrames()
if (Piece->IsSelected())
Piece->RemoveKeyFrames();

for (lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (Camera->IsSelected())
Camera->RemoveKeyFrames();

Expand Down Expand Up @@ -2694,9 +2702,9 @@ bool lcModel::RemoveSelectedObjects()
PieceIdx++;
}

for (int CameraIdx = 0; CameraIdx < mCameras.size(); )
for (std::vector<std::unique_ptr<lcCamera>>::iterator CameraIt = mCameras.begin(); CameraIt != mCameras.end(); )
{
lcCamera* Camera = mCameras[CameraIdx];
lcCamera* Camera = CameraIt->get();

if (Camera->IsSelected())
{
Expand All @@ -2707,16 +2715,15 @@ bool lcModel::RemoveSelectedObjects()
View->SetCamera(Camera, true);

RemovedCamera = true;
mCameras.RemoveIndex(CameraIdx);
delete Camera;
CameraIt = mCameras.erase(CameraIt);
}
else
CameraIdx++;
CameraIt++;
}

for (std::vector<std::unique_ptr<lcLight>>::iterator LightIt = mLights.begin(); LightIt != mLights.end(); )
{
std::unique_ptr<lcLight>& Light = *LightIt;
lcLight* Light = LightIt->get();

if (Light->IsSelected())
{
Expand Down Expand Up @@ -2779,7 +2786,7 @@ void lcModel::MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector
{
const lcVector3 TransformedObjectDistance = lcMul(ObjectDistance, RelativeRotation);

for (lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
{
if (Camera->IsSelected())
{
Expand Down Expand Up @@ -3206,7 +3213,7 @@ bool lcModel::AnyObjectsSelected() const
if (Piece->IsSelected())
return true;

for (const lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (Camera->IsSelected())
return true;

Expand All @@ -3223,9 +3230,9 @@ lcObject* lcModel::GetFocusObject() const
if (Piece->IsFocused())
return Piece;

for (lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
if (Camera->IsFocused())
return Camera;
return Camera.get();

for (const std::unique_ptr<lcLight>& Light : mLights)
if (Light->IsFocused())
Expand Down Expand Up @@ -3280,7 +3287,7 @@ bool lcModel::GetMoveRotateTransform(lcVector3& Center, lcMatrix33& RelativeRota
NumSelected++;
}

for (const lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
{
if (!Camera->IsSelected())
continue;
Expand Down Expand Up @@ -3439,7 +3446,7 @@ bool lcModel::GetSelectionCenter(lcVector3& Center) const
}
}

for (lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
{
if (Camera->IsSelected())
{
Expand Down Expand Up @@ -3622,15 +3629,15 @@ void lcModel::GetSelectionInformation(int* Flags, std::vector<lcObject*>& Select
}
}

for (lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
{
if (Camera->IsSelected())
{
Selection.emplace_back(Camera);
Selection.emplace_back(Camera.get());
*Flags |= LC_SEL_SELECTED | LC_SEL_CAMERA;

if (Camera->IsFocused())
*Focus = Camera;
*Focus = Camera.get();
}
}

Expand Down Expand Up @@ -3685,7 +3692,7 @@ void lcModel::ClearSelection(bool UpdateInterface)
for (lcPiece* Piece : mPieces)
Piece->SetSelected(false);

for (lcCamera* Camera : mCameras)
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
Camera->SetSelected(false);

for (const std::unique_ptr<lcLight>& Light : mLights)
Expand Down Expand Up @@ -4294,7 +4301,10 @@ void lcModel::BeginCameraTool(const lcVector3& Position, const lcVector3& Target

void lcModel::UpdateCameraTool(const lcVector3& Position)
{
lcCamera* Camera = mCameras[mCameras.size() - 1];
if (mCameras.empty())
return;

std::unique_ptr<lcCamera>& Camera = mCameras.back();

Camera->MoveSelected(1, false, Position - mMouseToolDistance);
Camera->UpdatePosition(1);
Expand Down Expand Up @@ -4365,9 +4375,15 @@ void lcModel::EraserToolClicked(lcObject* Object)
View->SetCamera(Camera, true);
}

mCameras.Remove((lcCamera*)Object);
for (std::vector<std::unique_ptr<lcCamera>>::iterator CameraIt = mCameras.begin(); CameraIt != mCameras.end(); CameraIt++)
{
if (CameraIt->get() == Object)
{
mCameras.erase(CameraIt);
break;
}
}
}
delete Object;
break;

case lcObjectType::Light:
Expand Down
4 changes: 2 additions & 2 deletions common/lc_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class lcModel
return mPieces;
}

const lcArray<lcCamera*>& GetCameras() const
const std::vector<std::unique_ptr<lcCamera>>& GetCameras() const
{
return mCameras;
}
Expand Down Expand Up @@ -404,7 +404,7 @@ class lcModel
bool mMouseToolFirstMove;

lcArray<lcPiece*> mPieces;
lcArray<lcCamera*> mCameras;
std::vector<std::unique_ptr<lcCamera>> mCameras;
std::vector<std::unique_ptr<lcLight>> mLights;
std::vector<std::unique_ptr<lcGroup>> mGroups;
QStringList mFileLines;
Expand Down
Loading

0 comments on commit 6a9c2d6

Please sign in to comment.