Fix drag and drop pieces into inline edit models.

This commit is contained in:
Leonardo Zide
2026-07-22 22:56:57 -07:00
parent 10b202141b
commit 9590852a29
5 changed files with 39 additions and 44 deletions
+14 -9
View File
@@ -1352,6 +1352,12 @@ void lcModel::GetScene(lcScene* Scene, const lcCamera* ViewCamera, bool AllowHig
if (Light->IsVisible())
Scene->AddInterfaceObject(Light.get());
}
if (Scene->GetDrawInsertPreview())
{
for (const lcInsertPieceInfo& PreviewPieceInfoTransform : mPreviewInsertPieceInfo)
PreviewPieceInfoTransform.Info->AddRenderMeshes(Scene, PreviewPieceInfoTransform.Transform, PreviewPieceInfoTransform.ColorIndex, lcRenderMeshState::Focused, false);
}
}
void lcModel::AddSubModelRenderMeshes(lcScene* Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, lcRenderMeshState RenderMeshState, bool ParentActive) const
@@ -1366,6 +1372,12 @@ void lcModel::AddSubModelRenderMeshes(lcScene* Scene, const lcMatrix44& WorldMat
Piece->AddSubModelRenderMeshes(Scene, WorldMatrix, DefaultColorIndex, RenderMeshState, ParentActive);
}
}
if (Scene->GetDrawInsertPreview())
{
for (const lcInsertPieceInfo& PreviewPieceInfoTransform : mPreviewInsertPieceInfo)
PreviewPieceInfoTransform.Info->AddRenderMeshes(Scene, lcMul(PreviewPieceInfoTransform.Transform, WorldMatrix), PreviewPieceInfoTransform.ColorIndex, lcRenderMeshState::Focused, false);
}
}
QImage lcModel::GetStepImage(bool Zoom, int Width, int Height, lcStep Step)
@@ -4965,7 +4977,7 @@ void lcModel::EndMouseTool(lcTool Tool, lcView* View, bool Accept)
}
}
bool lcModel::InsertPieceToolClicked(std::optional<lcMatrix44> Transform)
bool lcModel::InsertPieceToolClicked()
{
if (mPreviewInsertPieceInfo.empty())
return false;
@@ -4979,14 +4991,7 @@ bool lcModel::InsertPieceToolClicked(std::optional<lcMatrix44> Transform)
{
Piece = new lcPiece(InsertPieceInfo.Info);
lcMatrix44 PieceTransform;
if (Transform.has_value())
PieceTransform = lcMul(InsertPieceInfo.Transform, Transform.value());
else
PieceTransform = InsertPieceInfo.Transform;
Piece->Initialize(PieceTransform, mCurrentStep);
Piece->Initialize(InsertPieceInfo.Transform, mCurrentStep);
Piece->SetColorIndex(InsertPieceInfo.ColorIndex);
Piece->UpdatePosition(mCurrentStep);
+1 -1
View File
@@ -351,7 +351,7 @@ public:
void BeginMouseTool(lcTool Tool, lcView* View);
void EndMouseTool(lcTool Tool, lcView* View, bool Accept);
bool InsertPieceToolClicked(std::optional<lcMatrix44> Transform);
bool InsertPieceToolClicked();
void InsertCameraToolClicked(const lcVector3& Position);
void InsertLightToolClicked(const lcVector3& Position, lcLightType LightType);
void UpdateMoveTool(const lcVector3& Distance, bool AllowRelative, bool AlternateButtonDrag);
-5
View File
@@ -10,13 +10,8 @@
lcScene::lcScene()
{
mActiveSubmodelInstance = nullptr;
mDrawInterface = false;
mShadingMode = lcShadingMode::DefaultLights;
mAllowLOD = true;
mMeshLODDistance = 250.0f;
mHasFadedParts = false;
mPreTranslucentCallback = nullptr;
}
void lcScene::Begin(const lcMatrix44& ViewMatrix)
+17 -6
View File
@@ -58,6 +58,16 @@ public:
return mDrawInterface;
}
void SetDrawInsertPreview(bool DrawInsertPreview)
{
mDrawInsertPreview = DrawInsertPreview;
}
bool GetDrawInsertPreview() const
{
return mDrawInsertPreview;
}
void SetShadingMode(lcShadingMode ShadingMode)
{
mShadingMode = ShadingMode;
@@ -102,18 +112,19 @@ protected:
lcMatrix44 mViewMatrix;
lcMatrix44 mActiveSubmodelTransform;
lcPiece* mActiveSubmodelInstance;
lcPiece* mActiveSubmodelInstance = nullptr;
lcShadingMode mShadingMode;
bool mDrawInterface;
bool mAllowLOD;
bool mDrawInterface = false;
bool mDrawInsertPreview = false;
bool mAllowLOD = true;
float mMeshLODDistance;
lcVector4 mFadeColor;
lcVector4 mHighlightColor;
bool mHasFadedParts;
bool mTranslucentFade;
bool mHasFadedParts = false;
bool mTranslucentFade = false;
std::function<void()> mPreTranslucentCallback;
std::function<void()> mPreTranslucentCallback = nullptr;
std::vector<lcRenderMesh> mRenderMeshes;
std::vector<int> mOpaqueMeshes;
std::vector<lcTranslucentMeshInstance> mTranslucentMeshes;
+7 -23
View File
@@ -479,15 +479,9 @@ void lcView::UpdatePiecePreview()
if (PreviewInfo)
{
std::tie(InsertPieceInfo, IsConnection) = GetMouseInsertPieceInfo(false, true, PreviewInfo, nullptr);
if (GetActiveModel() != mModel)
{
for (lcInsertPieceInfo& InfoTransform : InsertPieceInfo)
InfoTransform.Transform = lcMul(InfoTransform.Transform, mActiveSubmodelTransform);
}
}
mModel->SetPreviewInsertPieceInfo(std::move(InsertPieceInfo));
GetActiveModel()->SetPreviewInsertPieceInfo(std::move(InsertPieceInfo));
}
std::pair<std::vector<lcInsertPieceInfo>, bool> lcView::GetMouseInsertPieceInfo(bool IgnoreSelected, bool AllowNewPieces, PieceInfo* Info, lcPiece* MovingPiece) const
@@ -877,16 +871,11 @@ void lcView::OnDraw()
mScene->SetActiveSubmodelInstance(mActiveSubmodelInstance, mActiveSubmodelTransform);
mScene->SetDrawInterface(DrawInterface);
mModel->GetScene(mScene.get(), mCamera, Preferences.mHighlightNewParts, Preferences.mFadeSteps);
bool DrawInsertPreview = DrawInterface && std::any_of(mViews.begin(), mViews.end(), [](lcView* View){ return View->mTrackTool == lcTrackTool::Insert; });
if (DrawInsertPreview)
{
for (const lcInsertPieceInfo& PreviewPieceInfoTransform : mModel->GetPreviewInsertPieceInfo())
PreviewPieceInfoTransform.Info->AddRenderMeshes(mScene.get(), PreviewPieceInfoTransform.Transform, PreviewPieceInfoTransform.ColorIndex, lcRenderMeshState::Focused, false);
}
mScene->SetDrawInsertPreview(DrawInsertPreview);
mModel->GetScene(mScene.get(), mCamera, Preferences.mHighlightNewParts, Preferences.mFadeSteps);
if (DrawInterface)
mScene->SetPreTranslucentCallback([this]() { DrawGrid(); });
@@ -1731,7 +1720,7 @@ void lcView::EndDrag(bool Accept)
break;
case lcDragState::Piece:
ActiveModel->InsertPieceToolClicked(std::nullopt);
ActiveModel->InsertPieceToolClicked();
break;
case lcDragState::Color:
@@ -2518,12 +2507,7 @@ void lcView::OnButtonDown(lcTrackButton TrackButton)
{
UpdatePiecePreview();
std::optional<lcMatrix44> Transform;
if (GetActiveModel() != mModel)
Transform = lcMatrix44AffineInverse(mActiveSubmodelTransform);
if (!ActiveModel->InsertPieceToolClicked(Transform))
if (!ActiveModel->InsertPieceToolClicked())
break;
if ((mMouseModifiers & Qt::ControlModifier) == 0)