Added zoom region action.

This commit is contained in:
Leonardo Zide
2025-12-08 21:08:48 -08:00
parent 7c196945f8
commit 910c3de13e
6 changed files with 104 additions and 148 deletions
+74 -123
View File
@@ -1721,149 +1721,76 @@ void lcModel::RunSelectionAction(const lcModelActionSelection* ModelActionSelect
}
}
void lcModel::BeginMouseToolAction(lcTool Tool, lcView* View)
void lcModel::BeginObjectEditAction(lcModelActionObjectEditMode ModelActionObjectEditMode, const lcView* View)
{
std::unique_ptr<lcModelActionMouseTool> ModelActionMouseTool = std::make_unique<lcModelActionMouseTool>(Tool);
std::unique_ptr<lcModelActionObjectEdit> ModelActionObjectEdit = std::make_unique<lcModelActionObjectEdit>(ModelActionObjectEditMode);
switch (Tool)
switch (ModelActionObjectEditMode)
{
case lcTool::Insert:
case lcTool::PointLight:
case lcTool::SpotLight:
case lcTool::DirectionalLight:
case lcTool::AreaLight:
case lcTool::Camera:
case lcTool::Select:
case lcModelActionObjectEditMode::Camera:
ModelActionObjectEdit->SaveCameraStartState(View->GetCamera());
break;
case lcTool::Move:
case lcTool::Rotate:
ModelActionMouseTool->SaveSelectionStartState(this);
break;
case lcTool::Eraser:
case lcTool::Paint:
case lcTool::ColorPicker:
break;
case lcTool::Zoom:
case lcTool::Pan:
case lcTool::RotateView:
case lcTool::Roll:
ModelActionMouseTool->SaveCameraStartState(View->GetCamera());
break;
case lcTool::ZoomRegion:
break;
case lcTool::Count:
case lcModelActionObjectEditMode::Selection:
ModelActionObjectEdit->SaveSelectionStartState(this);
break;
}
mActionSequence.emplace_back(std::move(ModelActionMouseTool));
mActionSequence.emplace_back(std::move(ModelActionObjectEdit));
}
void lcModel::EndMouseToolAction(lcTool Tool, lcView* View, const QString& Description)
void lcModel::EndObjectEditAction(lcModelActionObjectEditMode ModelActionObjectEditMode, const lcView* View)
{
if (mActionSequence.empty())
return;
lcModelActionMouseTool* ModelActionMouseTool = dynamic_cast<lcModelActionMouseTool*>(mActionSequence.back().get());
lcModelActionObjectEdit* ModelActionObjectEdit = dynamic_cast<lcModelActionObjectEdit*>(mActionSequence.back().get());
if (!ModelActionMouseTool || Tool != ModelActionMouseTool->GetTool())
if (!ModelActionObjectEdit || ModelActionObjectEditMode != ModelActionObjectEdit->GetMode())
return;
switch (Tool)
switch (ModelActionObjectEditMode)
{
case lcTool::Insert:
case lcTool::PointLight:
case lcTool::SpotLight:
case lcTool::DirectionalLight:
case lcTool::AreaLight:
case lcTool::Camera:
case lcTool::Select:
case lcModelActionObjectEditMode::Camera:
ModelActionObjectEdit->SaveCameraEndState(View->GetCamera());
break;
case lcTool::Move:
case lcTool::Rotate:
ModelActionMouseTool->SaveSelectionEndState(this);
break;
case lcTool::Eraser:
case lcTool::Paint:
case lcTool::ColorPicker:
break;
case lcTool::Zoom:
case lcTool::Pan:
case lcTool::RotateView:
case lcTool::Roll:
ModelActionMouseTool->SaveCameraEndState(View->GetCamera());
break;
case lcTool::ZoomRegion:
break;
case lcTool::Count:
case lcModelActionObjectEditMode::Selection:
ModelActionObjectEdit->SaveSelectionEndState(this);
break;
}
RecordSelectionAction(lcModelActionSelectionMode::Set);
EndActionSequence(Description);
}
void lcModel::RunMouseToolAction(const lcModelActionMouseTool* ModelActionMouseTool, bool Apply)
void lcModel::RunObjectEditAction(const lcModelActionObjectEdit* ModelActionObjectEdit, bool Apply)
{
if (!ModelActionMouseTool)
if (!ModelActionObjectEdit)
return;
lcTool Tool = ModelActionMouseTool->GetTool();
lcModelActionObjectEditMode ModelActionObjectEditMode = ModelActionObjectEdit->GetMode();
switch (Tool)
switch (ModelActionObjectEditMode)
{
case lcTool::Insert:
case lcTool::PointLight:
case lcTool::SpotLight:
case lcTool::DirectionalLight:
case lcTool::AreaLight:
case lcTool::Camera:
case lcTool::Select:
break;
case lcTool::Move:
case lcTool::Rotate:
if (Apply)
ModelActionMouseTool->LoadSelectionEndState(this);
else
ModelActionMouseTool->LoadSelectionStartState(this);
SetCurrentStep(mCurrentStep);
break;
case lcTool::Eraser:
case lcTool::Paint:
case lcTool::ColorPicker:
break;
case lcTool::Zoom:
case lcTool::Pan:
case lcTool::RotateView:
case lcTool::Roll:
if (lcCamera* Camera = GetCamera(ModelActionMouseTool->GetCameraName()))
case lcModelActionObjectEditMode::Camera:
if (lcCamera* Camera = GetCamera(ModelActionObjectEdit->GetCameraName()))
{
if (Apply)
ModelActionMouseTool->LoadCameraEndState(Camera);
ModelActionObjectEdit->LoadCameraEndState(Camera);
else
ModelActionMouseTool->LoadCameraStartState(Camera);
ModelActionObjectEdit->LoadCameraStartState(Camera);
SetCurrentStep(mCurrentStep);
}
break;
case lcModelActionObjectEditMode::Selection:
if (Apply)
ModelActionObjectEdit->LoadSelectionEndState(this);
else
ModelActionObjectEdit->LoadSelectionStartState(this);
case lcTool::ZoomRegion:
break;
case lcTool::Count:
SetCurrentStep(mCurrentStep);
break;
}
}
@@ -2308,8 +2235,8 @@ void lcModel::PerformActionSequence(const std::vector<std::unique_ptr<lcModelAct
{
if (const lcModelActionSelection* ModelActionSelection = dynamic_cast<const lcModelActionSelection*>(ModelAction))
RunSelectionAction(ModelActionSelection, Apply);
else if (const lcModelActionMouseTool* ModelActionMouseTool = dynamic_cast<const lcModelActionMouseTool*>(ModelAction))
RunMouseToolAction(ModelActionMouseTool, Apply);
else if (const lcModelActionObjectEdit* ModelActionObjectEdit = dynamic_cast<const lcModelActionObjectEdit*>(ModelAction))
RunObjectEditAction(ModelActionObjectEdit, Apply);
else if (const lcModelActionAddPieces* ModelActionAddPieces = dynamic_cast<const lcModelActionAddPieces*>(ModelAction))
RunAddPiecesAction(ModelActionAddPieces, Apply);
else if (const lcModelActionAddCamera* ModelActionAddCamera = dynamic_cast<const lcModelActionAddCamera*>(ModelAction))
@@ -5143,7 +5070,7 @@ void lcModel::BeginMouseTool(lcTool Tool, lcView* View)
case lcTool::Rotate:
BeginActionSequence();
RecordSelectionAction(lcModelActionSelectionMode::Set);
BeginMouseToolAction(Tool, View);
BeginObjectEditAction(lcModelActionObjectEditMode::Selection, View);
break;
case lcTool::Eraser:
@@ -5158,8 +5085,7 @@ void lcModel::BeginMouseTool(lcTool Tool, lcView* View)
if (!View->GetCamera()->IsSimple())
{
BeginActionSequence();
RecordSelectionAction(lcModelActionSelectionMode::Set);
BeginMouseToolAction(Tool, View);
BeginObjectEditAction(lcModelActionObjectEditMode::Camera, View);
}
break;
@@ -5194,11 +5120,13 @@ void lcModel::EndMouseTool(lcTool Tool, lcView* View, bool Accept)
break;
case lcTool::Move:
EndMouseToolAction(Tool, View, tr("Move"));
EndObjectEditAction(lcModelActionObjectEditMode::Selection, View);
EndActionSequence(tr("Move"));
break;
case lcTool::Rotate:
EndMouseToolAction(Tool, View, tr("Rotate"));
EndObjectEditAction(lcModelActionObjectEditMode::Selection, View);
EndActionSequence(tr("Rotate"));
break;
case lcTool::Eraser:
@@ -5208,22 +5136,34 @@ void lcModel::EndMouseTool(lcTool Tool, lcView* View, bool Accept)
case lcTool::Zoom:
if (!View->GetCamera()->IsSimple())
EndMouseToolAction(Tool, View, tr("Zoom"));
{
EndObjectEditAction(lcModelActionObjectEditMode::Camera, View);
EndActionSequence(tr("Zoom"));
}
break;
case lcTool::Pan:
if (!View->GetCamera()->IsSimple())
EndMouseToolAction(Tool, View, tr("Pan"));
{
EndObjectEditAction(lcModelActionObjectEditMode::Camera, View);
EndActionSequence(tr("Pan"));
}
break;
case lcTool::RotateView:
if (!View->GetCamera()->IsSimple())
EndMouseToolAction(Tool, View, tr("Orbit"));
{
EndObjectEditAction(lcModelActionObjectEditMode::Camera, View);
EndActionSequence(tr("Orbit"));
}
break;
case lcTool::Roll:
if (!View->GetCamera()->IsSimple())
EndMouseToolAction(Tool, View, tr("Roll"));
{
EndObjectEditAction(lcModelActionObjectEditMode::Camera, View);
EndActionSequence(tr("Roll"));
}
break;
case lcTool::ZoomRegion:
@@ -5519,15 +5459,26 @@ void lcModel::UpdateRollTool(lcCamera* Camera, float Mouse)
UpdateAllViews();
}
void lcModel::ZoomRegionToolClicked(lcCamera* Camera, float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners)
void lcModel::ZoomRegionToolClicked(lcView* View, float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners)
{
lcCamera* Camera = View->GetCamera();
if (!Camera->IsSimple())
{
BeginActionSequence();
BeginObjectEditAction(lcModelActionObjectEditMode::Camera, View);
}
Camera->ZoomRegion(AspectRatio, Position, TargetPosition, Corners, mCurrentStep, gMainWindow->GetAddKeys());
if (!Camera->IsSimple())
{
EndObjectEditAction(lcModelActionObjectEditMode::Camera, View);
EndActionSequence(tr("Zoom"));
}
gMainWindow->UpdateSelectedObjects(false);
UpdateAllViews();
if (!Camera->IsSimple())
SaveCheckpoint(tr("Zoom"));
}
void lcModel::LookAt(lcCamera* Camera)
+6 -5
View File
@@ -6,7 +6,7 @@
enum class lcObjectPropertyId;
class lcModelAction;
class lcModelActionSelection;
class lcModelActionMouseTool;
class lcModelActionObjectEdit;
class lcModelActionAddPieces;
class lcModelActionAddCamera;
class lcModelActionAddLight;
@@ -16,6 +16,7 @@ class lcModelActionHidePieces;
class lcModelActionStep;
enum class lcModelActionSelectionMode;
enum class lcModelActionAddPieceSelectionMode;
enum class lcModelActionObjectEditMode;
enum class lcModelActionGroupPiecesMode;
enum class lcModelActionHidePiecesMode;
enum class lcModelActionStepMode;
@@ -371,7 +372,7 @@ public:
void UpdatePanTool(lcCamera* Camera, const lcVector3& Distance);
void UpdateOrbitTool(lcCamera* Camera, float MouseX, float MouseY);
void UpdateRollTool(lcCamera* Camera, float Mouse);
void ZoomRegionToolClicked(lcCamera* Camera, float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners);
void ZoomRegionToolClicked(lcView* View, float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners);
void LookAt(lcCamera* Camera);
void MoveCamera(lcCamera* Camera, const lcVector3& Direction);
void ZoomExtents(lcCamera* Camera, float Aspect, const lcMatrix44& WorldMatrix);
@@ -410,9 +411,9 @@ protected:
void RecordSelectionAction(lcModelActionSelectionMode ModelActionSelectionMode);
void RunSelectionAction(const lcModelActionSelection* ModelActionSelection, bool Apply);
void BeginMouseToolAction(lcTool Tool, lcView* View);
void EndMouseToolAction(lcTool Tool, lcView* View, const QString& Description);
void RunMouseToolAction(const lcModelActionMouseTool* ModelActionMouseTool, bool Apply);
void BeginObjectEditAction(lcModelActionObjectEditMode ModelActionObjectEditMode, const lcView* View);
void EndObjectEditAction(lcModelActionObjectEditMode ModelActionObjectEditMode, const lcView* View);
void RunObjectEditAction(const lcModelActionObjectEdit* ModelActionObjectEdit, bool Apply);
void RecordAddPiecesAction(const std::vector<lcInsertPieceInfo>& PieceInfoTransforms, lcModelActionAddPieceSelectionMode SelectionMode);
void RunAddPiecesAction(const lcModelActionAddPieces* ModelActionAddPieces, bool Apply);
void RecordAddCameraAction(const lcVector3& Position, const lcVector3& TargetPosition);
+10 -10
View File
@@ -164,12 +164,12 @@ std::tuple<std::vector<lcObject*>, lcObject*, uint32_t> lcModelActionSelection::
return { SelectedObjects, FocusObject, mFocusSection };
}
lcModelActionMouseTool::lcModelActionMouseTool(lcTool Tool)
: mTool( Tool )
lcModelActionObjectEdit::lcModelActionObjectEdit(lcModelActionObjectEditMode Mode)
: mMode(Mode)
{
}
void lcModelActionMouseTool::SaveCameraStartState(const lcCamera* Camera)
void lcModelActionObjectEdit::SaveCameraStartState(const lcCamera* Camera)
{
QDataStream Stream(&mStartBuffer, QIODevice::WriteOnly);
@@ -178,43 +178,43 @@ void lcModelActionMouseTool::SaveCameraStartState(const lcCamera* Camera)
mCameraName = Camera->GetName();
}
void lcModelActionMouseTool::LoadCameraStartState(lcCamera* Camera) const
void lcModelActionObjectEdit::LoadCameraStartState(lcCamera* Camera) const
{
QDataStream Stream(const_cast<QByteArray*>(&mStartBuffer), QIODevice::ReadOnly);
Camera->LoadUndoData(Stream);
}
void lcModelActionMouseTool::SaveCameraEndState(const lcCamera* Camera)
void lcModelActionObjectEdit::SaveCameraEndState(const lcCamera* Camera)
{
QDataStream Stream(&mEndBuffer, QIODevice::WriteOnly);
Camera->SaveUndoData(Stream);
}
void lcModelActionMouseTool::LoadCameraEndState(lcCamera* Camera) const
void lcModelActionObjectEdit::LoadCameraEndState(lcCamera* Camera) const
{
QDataStream Stream(const_cast<QByteArray*>(&mEndBuffer), QIODevice::ReadOnly);
Camera->LoadUndoData(Stream);
}
void lcModelActionMouseTool::SaveSelectionStartState(const lcModel* Model)
void lcModelActionObjectEdit::SaveSelectionStartState(const lcModel* Model)
{
SaveUndoBuffer(mStartBuffer, Model, true);
}
void lcModelActionMouseTool::LoadSelectionStartState(lcModel* Model) const
void lcModelActionObjectEdit::LoadSelectionStartState(lcModel* Model) const
{
LoadUndoBuffer(mStartBuffer, Model, true);
}
void lcModelActionMouseTool::SaveSelectionEndState(const lcModel* Model)
void lcModelActionObjectEdit::SaveSelectionEndState(const lcModel* Model)
{
SaveUndoBuffer(mEndBuffer, Model, true);
}
void lcModelActionMouseTool::LoadSelectionEndState(lcModel* Model) const
void lcModelActionObjectEdit::LoadSelectionEndState(lcModel* Model) const
{
LoadUndoBuffer(mEndBuffer, Model, true);
}
+12 -7
View File
@@ -5,7 +5,6 @@
struct lcInsertPieceInfo;
enum class lcObjectType;
enum class lcLightType;
enum class lcTool;
class lcModelAction
{
@@ -50,11 +49,17 @@ protected:
lcModelActionSelectionMode mMode = lcModelActionSelectionMode::Clear;
};
class lcModelActionMouseTool : public lcModelAction
enum class lcModelActionObjectEditMode
{
Camera,
Selection
};
class lcModelActionObjectEdit: public lcModelAction
{
public:
lcModelActionMouseTool(lcTool Tool);
virtual ~lcModelActionMouseTool() = default;
lcModelActionObjectEdit(lcModelActionObjectEditMode Mode);
virtual ~lcModelActionObjectEdit() = default;
void SaveCameraStartState(const lcCamera* Camera);
void LoadCameraStartState(lcCamera* Camera) const;
@@ -66,9 +71,9 @@ public:
void SaveSelectionEndState(const lcModel* Model);
void LoadSelectionEndState(lcModel* Model) const;
lcTool GetTool() const
lcModelActionObjectEditMode GetMode() const
{
return mTool;
return mMode;
}
const QString& GetCameraName() const
@@ -77,7 +82,7 @@ public:
}
protected:
lcTool mTool;
lcModelActionObjectEditMode mMode;
QString mCameraName;
QByteArray mStartBuffer;
QByteArray mEndBuffer;
+1 -2
View File
@@ -9,7 +9,6 @@
#include "lc_texture.h"
#include "piece.h"
#include "pieceinf.h"
#include "lc_synth.h"
#include "lc_traintrack.h"
#include "lc_scene.h"
#include "lc_context.h"
@@ -2465,7 +2464,7 @@ void lcView::StopTracking(bool Accept)
if (lcLineSegmentPlaneIntersection(&Target, Points[0], Points[1], Plane) && lcLineSegmentPlaneIntersection(&Corners[0], Points[2], Points[3], Plane) && lcLineSegmentPlaneIntersection(&Corners[1], Points[3], Points[4], Plane))
{
float AspectRatio = (float)mWidth / (float)mHeight;
ActiveModel->ZoomRegionToolClicked(mCamera, AspectRatio, Points[0], Target, Corners);
ActiveModel->ZoomRegionToolClicked(this, AspectRatio, Points[0], Target, Corners);
}
}
break;
+1 -1
View File
@@ -63,7 +63,7 @@ void lcViewWidget::SetView(lcView* View)
void lcViewWidget::UpdateMousePosition()
{
QPoint MousePosition = mapFromGlobal( QCursor::pos() );
QPoint MousePosition = mapFromGlobal(QCursor::pos());
float DeviceScale = GetDeviceScale();
mView->SetMousePosition(MousePosition.x() * DeviceScale, mView->GetHeight() - MousePosition.y() * DeviceScale - 1);