Initial implementation of in place submodel editing.

This commit is contained in:
Leonardo Zide 2018-03-29 10:20:36 -07:00
parent e0acb8f2b3
commit b30ffd1b59
20 changed files with 271 additions and 114 deletions

View file

@ -13,6 +13,7 @@ lcVector4 gInterfaceColors[LC_NUM_INTERFACECOLORS] = // todo: make the colors co
{
lcVector4(0.898f, 0.298f, 0.400f, 1.000f), // LC_COLOR_SELECTED
lcVector4(0.400f, 0.298f, 0.898f, 1.000f), // LC_COLOR_FOCUSED
lcVector4(0.800f, 0.800f, 0.800f, 1.000f), // LC_COLOR_DISABLED
lcVector4(0.500f, 0.800f, 0.500f, 1.000f), // LC_COLOR_CAMERA
lcVector4(0.500f, 0.800f, 0.500f, 1.000f), // LC_COLOR_LIGHT
lcVector4(0.500f, 0.800f, 0.500f, 0.500f), // LC_COLOR_CONTROL_POINT

View file

@ -34,6 +34,7 @@ enum lcInterfaceColor
{
LC_COLOR_SELECTED,
LC_COLOR_FOCUSED,
LC_COLOR_DISABLED,
LC_COLOR_CAMERA,
LC_COLOR_LIGHT,
LC_COLOR_CONTROL_POINT,

View file

@ -1200,6 +1200,13 @@ lcCommand gCommands[LC_NUM_COMMANDS] =
QT_TRANSLATE_NOOP("Status", "Insert the contents of the selected model references into the current model"),
QT_TRANSLATE_NOOP("Shortcut", "")
},
// LC_PIECE_EDIT_SELECTED_SUBMODEL
{
QT_TRANSLATE_NOOP("Action", "Piece.EditSelectedSubmodel"),
QT_TRANSLATE_NOOP("Menu", "Edit Selected Submodel"),
QT_TRANSLATE_NOOP("Status", "Edit the currently selected submodel"),
QT_TRANSLATE_NOOP("Shortcut", "")
},
// LC_PIECE_GROUP
{
QT_TRANSLATE_NOOP("Action", "Piece.Group"),

View file

@ -185,6 +185,7 @@ enum lcCommandId
LC_PIECE_VIEW_SELECTED_MODEL,
LC_PIECE_MOVE_SELECTION_TO_MODEL,
LC_PIECE_INLINE_SELECTED_MODELS,
LC_PIECE_EDIT_SELECTED_SUBMODEL,
LC_PIECE_GROUP,
LC_PIECE_UNGROUP,
LC_PIECE_GROUP_ADD,

View file

@ -540,9 +540,10 @@ void lcContext::SetColorIndex(int ColorIndex)
SetColor(gColorList[ColorIndex].Value);
}
void lcContext::SetColorIndexTinted(int ColorIndex, lcInterfaceColor InterfaceColor)
void lcContext::SetColorIndexTinted(int ColorIndex, lcInterfaceColor InterfaceColor, float Weight)
{
SetColor((gColorList[ColorIndex].Value + gInterfaceColors[InterfaceColor]) * 0.5f);
lcVector3 Color(gColorList[ColorIndex].Value * Weight + gInterfaceColors[InterfaceColor] * (1.0f - Weight));
SetColor(lcVector4(Color, gColorList[ColorIndex].Value.w));
}
void lcContext::SetEdgeColorIndex(int ColorIndex)

View file

@ -150,7 +150,7 @@ public:
void SetColor(float Red, float Green, float Blue, float Alpha);
void SetColorIndex(int ColorIndex);
void SetColorIndexTinted(int ColorIndex, lcInterfaceColor InterfaceColor);
void SetColorIndexTinted(int ColorIndex, lcInterfaceColor InterfaceColor, float Weight);
void SetEdgeColorIndex(int ColorIndex);
void SetInterfaceColor(lcInterfaceColor InterfaceColor);

View file

@ -50,7 +50,7 @@ void lcModelTabWidget::Clear()
ResetLayout();
mModel = nullptr;
for (View* View : mViews)
View->mModel = nullptr;
View->Clear();
mViews.RemoveAll();
mActiveView = nullptr;
lcQGLWidget* Widget = (lcQGLWidget*)layout()->itemAt(0)->widget();
@ -518,6 +518,7 @@ void lcMainWindow::CreateMenus()
PieceMenu->addAction(mActions[LC_PIECE_VIEW_SELECTED_MODEL]);
PieceMenu->addAction(mActions[LC_PIECE_INLINE_SELECTED_MODELS]);
PieceMenu->addAction(mActions[LC_PIECE_MOVE_SELECTION_TO_MODEL]);
PieceMenu->addAction(mActions[LC_PIECE_EDIT_SELECTED_SUBMODEL]);
PieceMenu->addSeparator();
PieceMenu->addAction(mActions[LC_PIECE_GROUP]);
PieceMenu->addAction(mActions[LC_PIECE_UNGROUP]);
@ -1436,7 +1437,7 @@ void lcMainWindow::ResetCameras()
void lcMainWindow::AddView(View* View)
{
lcModelTabWidget* TabWidget = GetTabWidgetForModel(View->mModel);
lcModelTabWidget* TabWidget = GetTabWidgetForModel(View->GetModel());
if (!TabWidget)
return;
@ -1794,6 +1795,7 @@ void lcMainWindow::UpdateSelectedObjects(bool SelectionChanged)
mActions[LC_PIECE_VIEW_SELECTED_MODEL]->setEnabled(Flags & LC_SEL_MODEL_SELECTED);
mActions[LC_PIECE_MOVE_SELECTION_TO_MODEL]->setEnabled(Flags & LC_SEL_PIECE);
mActions[LC_PIECE_INLINE_SELECTED_MODELS]->setEnabled(Flags & LC_SEL_MODEL_SELECTED);
mActions[LC_PIECE_EDIT_SELECTED_SUBMODEL]->setEnabled(Flags & LC_SEL_MODEL_SELECTED);
mActions[LC_PIECE_GROUP]->setEnabled(Flags & LC_SEL_CAN_GROUP);
mActions[LC_PIECE_UNGROUP]->setEnabled(Flags & LC_SEL_GROUPED);
mActions[LC_PIECE_GROUP_ADD]->setEnabled((Flags & (LC_SEL_GROUPED | LC_SEL_FOCUS_GROUPED)) == LC_SEL_GROUPED);
@ -2617,6 +2619,10 @@ void lcMainWindow::HandleCommand(lcCommandId CommandId)
lcGetActiveModel()->InlineSelectedModels();
break;
case LC_PIECE_EDIT_SELECTED_SUBMODEL:
GetActiveView()->SetSelectedSubmodelActive();
break;
case LC_PIECE_GROUP:
lcGetActiveModel()->GroupSelection();
break;

View file

@ -101,6 +101,7 @@ enum lcRenderMeshState
LC_RENDERMESH_NONE,
LC_RENDERMESH_SELECTED,
LC_RENDERMESH_FOCUSED,
LC_RENDERMESH_DISABLED,
LC_RENDERMESH_HIGHLIGHT
};

View file

@ -175,6 +175,33 @@ lcModel::~lcModel()
DeleteHistory();
}
bool lcModel::GetPieceWorldMatrix(lcPiece* Piece, lcMatrix44& ParentWorldMatrix) const
{
for (lcPiece* ModelPiece : mPieces)
{
if (ModelPiece == Piece)
{
ParentWorldMatrix = lcMul(ModelPiece->mModelWorld, ParentWorldMatrix);
return true;
}
PieceInfo* Info = ModelPiece->mPieceInfo;
if (Info->IsModel())
{
lcMatrix44 WorldMatrix = lcMul(ModelPiece->mModelWorld, ParentWorldMatrix);
if (Info->GetPieceWorldMatrix(Piece, WorldMatrix))
{
ParentWorldMatrix = WorldMatrix;
return true;
}
}
}
return false;
}
bool lcModel::IncludesModel(const lcModel* Model) const
{
if (Model == this)
@ -1224,21 +1251,17 @@ void lcModel::DuplicateSelectedPieces()
SaveCheckpoint(tr("Duplicating Pieces"));
}
void lcModel::GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface, bool Highlight) const
void lcModel::GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface, bool Highlight, lcPiece* ActiveSubmodelInstance) const
{
Scene.Begin(ViewCamera->mWorldView);
mPieceInfo->AddRenderMesh(Scene);
for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++)
{
lcPiece* Piece = mPieces[PieceIdx];
for (lcPiece* Piece : mPieces)
if (Piece->IsVisible(mCurrentStep))
Piece->AddRenderMeshes(Scene, DrawInterface, Highlight && Piece->GetStepShow() == mCurrentStep);
}
Piece->AddRenderMeshes(Scene, DrawInterface, Highlight && Piece->GetStepShow() == mCurrentStep, ActiveSubmodelInstance);
if (DrawInterface)
if (DrawInterface && !ActiveSubmodelInstance)
{
for (int CameraIdx = 0; CameraIdx < mCameras.GetSize(); CameraIdx++)
{
@ -1260,15 +1283,11 @@ void lcModel::GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface,
Scene.End();
}
void lcModel::SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected) const
void lcModel::SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected, bool Disabled, lcPiece* ActiveSubmodelInstance) const
{
for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++)
{
lcPiece* Piece = mPieces[PieceIdx];
for (lcPiece* Piece : mPieces)
if (Piece->GetStepHide() == LC_STEP_MAX)
Piece->SubModelAddRenderMeshes(Scene, WorldMatrix, DefaultColorIndex, Focused, Selected);
}
Piece->SubModelAddRenderMeshes(Scene, WorldMatrix, DefaultColorIndex, Focused, Selected, Disabled, ActiveSubmodelInstance);
}
void lcModel::DrawBackground(lcGLWidget* Widget)

View file

@ -108,6 +108,7 @@ public:
return mSavedHistory != mUndoHistory[0];
}
bool GetPieceWorldMatrix(lcPiece* Piece, lcMatrix44& ParentWorldMatrix) const;
bool IncludesModel(const lcModel* Model) const;
void CreatePieceInfo(Project* Project);
void UpdatePieceInfo(lcArray<lcModel*>& UpdatedModels);
@ -231,8 +232,8 @@ public:
void Paste();
void DuplicateSelectedPieces();
void GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface, bool Highlight) const;
void SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected) const;
void GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface, bool Highlight, lcPiece* ActiveSubmodelInstance) const;
void SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected, bool Disabled, lcPiece* ActiveSubmodelInstance) const;
void DrawBackground(lcGLWidget* Widget);
void SaveStepImages(const QString& BaseName, bool AddStepSuffix, bool Zoom, bool Highlight, int Width, int Height, lcStep Start, lcStep End);

View file

@ -370,7 +370,7 @@ void lcPartSelectionListModel::DrawPreview(int InfoIndex)
lcScene Scene;
Scene.Begin(ViewMatrix);
Info->AddRenderMeshes(Scene, lcMatrix44Identity(), mColorIndex, false, false, false);
Info->AddRenderMeshes(Scene, lcMatrix44Identity(), mColorIndex, false, false, false, false, nullptr);
Scene.End();

View file

@ -100,11 +100,15 @@ void lcScene::DrawRenderMeshes(lcContext* Context, int PrimitiveTypes, bool Enab
break;
case LC_RENDERMESH_SELECTED:
Context->SetColorIndexTinted(ColorIndex, LC_COLOR_SELECTED);
Context->SetColorIndexTinted(ColorIndex, LC_COLOR_SELECTED, 0.5f);
break;
case LC_RENDERMESH_FOCUSED:
Context->SetColorIndexTinted(ColorIndex, LC_COLOR_FOCUSED);
Context->SetColorIndexTinted(ColorIndex, LC_COLOR_FOCUSED, 0.5f);
break;
case LC_RENDERMESH_DISABLED:
Context->SetColorIndexTinted(ColorIndex, LC_COLOR_DISABLED, 0.25f);
break;
}
}
@ -130,6 +134,10 @@ void lcScene::DrawRenderMeshes(lcContext* Context, int PrimitiveTypes, bool Enab
case LC_RENDERMESH_HIGHLIGHT:
Context->SetInterfaceColor(LC_COLOR_HIGHLIGHT);
break;
case LC_RENDERMESH_DISABLED:
Context->SetInterfaceColor(LC_COLOR_DISABLED);
break;
}
}
else if (Section->PrimitiveType == LC_MESH_CONDITIONAL_LINES)

View file

@ -350,7 +350,7 @@ void MinifigWizard::OnDraw()
for (int PieceIdx = 0; PieceIdx < LC_MFW_NUMITEMS; PieceIdx++)
if (mMinifig.Parts[PieceIdx])
mMinifig.Parts[PieceIdx]->AddRenderMeshes(Scene, mMinifig.Matrices[PieceIdx], mMinifig.Colors[PieceIdx], false, false, false);
mMinifig.Parts[PieceIdx]->AddRenderMeshes(Scene, mMinifig.Matrices[PieceIdx], mMinifig.Colors[PieceIdx], false, false, false, false, nullptr);
Scene.End();

View file

@ -646,31 +646,36 @@ void lcPiece::RemoveKeyFrames()
ChangeKey(mRotationKeys, lcMatrix33(mModelWorld), 1, true);
}
void lcPiece::AddRenderMeshes(lcScene& Scene, bool DrawInterface, bool Highlight) const
void lcPiece::AddRenderMeshes(lcScene& Scene, bool DrawInterface, bool Highlight, lcPiece* ActiveSubmodelInstance) const
{
bool Focused, Selected;
bool Focused, Selected, Disabled;
if (DrawInterface)
{
Focused = IsFocused();
Selected = IsSelected();
Disabled = ActiveSubmodelInstance && (ActiveSubmodelInstance != this);
}
else
{
Focused = false;
Selected = false;
Disabled = false;
}
if (ActiveSubmodelInstance == this)
ActiveSubmodelInstance = nullptr;
if (!mMesh)
mPieceInfo->AddRenderMeshes(Scene, mModelWorld, mColorIndex, Focused, Selected, Highlight);
mPieceInfo->AddRenderMeshes(Scene, mModelWorld, mColorIndex, Focused, Selected, Disabled, Highlight, ActiveSubmodelInstance);
else
Scene.AddMesh(mMesh, mModelWorld, mColorIndex, Focused ? LC_RENDERMESH_FOCUSED : (Selected ? LC_RENDERMESH_SELECTED : LC_RENDERMESH_NONE), mPieceInfo->mFlags);
Scene.AddMesh(mMesh, mModelWorld, mColorIndex, Disabled ? LC_RENDERMESH_DISABLED : (Focused ? LC_RENDERMESH_FOCUSED : (Selected ? LC_RENDERMESH_SELECTED : LC_RENDERMESH_NONE)), mPieceInfo->mFlags);
if (Selected)
Scene.AddInterfaceObject(this);
}
void lcPiece::SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected) const
void lcPiece::SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected, bool Disabled, lcPiece* ActiveSubmodelInstance) const
{
int ColorIndex = mColorIndex;
@ -678,9 +683,9 @@ void lcPiece::SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMat
ColorIndex = DefaultColorIndex;
if (!mMesh)
mPieceInfo->AddRenderMeshes(Scene, lcMul(mModelWorld, WorldMatrix), ColorIndex, Focused, Selected, false);
mPieceInfo->AddRenderMeshes(Scene, lcMul(mModelWorld, WorldMatrix), ColorIndex, Focused, Selected, Disabled, false, ActiveSubmodelInstance);
else
Scene.AddMesh(mMesh, lcMul(mModelWorld, WorldMatrix), ColorIndex, Focused ? LC_RENDERMESH_FOCUSED : (Selected ? LC_RENDERMESH_SELECTED : LC_RENDERMESH_NONE), mPieceInfo->mFlags);
Scene.AddMesh(mMesh, lcMul(mModelWorld, WorldMatrix), ColorIndex, Disabled ? LC_RENDERMESH_DISABLED : (Focused ? LC_RENDERMESH_FOCUSED : (Selected ? LC_RENDERMESH_SELECTED : LC_RENDERMESH_NONE)), mPieceInfo->mFlags);
}
void lcPiece::MoveSelected(lcStep Step, bool AddKey, const lcVector3& Distance)

View file

@ -346,8 +346,8 @@ public:
virtual void DrawInterface(lcContext* Context) const override;
virtual void RemoveKeyFrames() override;
void AddRenderMeshes(lcScene& Scene, bool DrawInterface, bool Highlight) const;
void SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected) const;
void AddRenderMeshes(lcScene& Scene, bool DrawInterface, bool Highlight, lcPiece* ActiveSubmodelInstance) const;
void SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected, bool Disabled, lcPiece* ActiveSubmodelInstance) const;
void InsertTime(lcStep Start, lcStep Time);
void RemoveTime(lcStep Start, lcStep Time);

View file

@ -104,6 +104,14 @@ void PieceInfo::CreateProject(Project* Project, const char* PieceName)
m_strDescription[sizeof(m_strDescription) - 1] = 0;
}
bool PieceInfo::GetPieceWorldMatrix(lcPiece* Piece, lcMatrix44& WorldMatrix) const
{
if (mFlags & LC_PIECE_MODEL)
return mModel->GetPieceWorldMatrix(Piece, WorldMatrix);
return false;
}
bool PieceInfo::IncludesModel(const lcModel* Model) const
{
if (mFlags & LC_PIECE_MODEL)
@ -298,18 +306,18 @@ void PieceInfo::AddRenderMesh(lcScene& Scene)
Scene.AddMesh(mMesh, lcMatrix44Identity(), gDefaultColor, LC_RENDERMESH_NONE, mFlags);
}
void PieceInfo::AddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int ColorIndex, bool Focused, bool Selected, bool Highlight) const
void PieceInfo::AddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int ColorIndex, bool Focused, bool Selected, bool Disabled, bool Highlight, lcPiece* ActiveSubmodelInstance) const
{
if ((mMesh) || (mFlags & LC_PIECE_PLACEHOLDER))
Scene.AddMesh((mFlags & LC_PIECE_PLACEHOLDER) ? gPlaceholderMesh : mMesh, WorldMatrix, ColorIndex, Focused ? LC_RENDERMESH_FOCUSED : (Selected ? LC_RENDERMESH_SELECTED : (Highlight ? LC_RENDERMESH_HIGHLIGHT : LC_RENDERMESH_NONE)), mFlags);
Scene.AddMesh((mFlags & LC_PIECE_PLACEHOLDER) ? gPlaceholderMesh : mMesh, WorldMatrix, ColorIndex, Disabled ? LC_RENDERMESH_DISABLED : (Focused ? LC_RENDERMESH_FOCUSED : (Selected ? LC_RENDERMESH_SELECTED : (Highlight ? LC_RENDERMESH_HIGHLIGHT : LC_RENDERMESH_NONE))), mFlags);
if (mFlags & LC_PIECE_MODEL)
mModel->SubModelAddRenderMeshes(Scene, WorldMatrix, ColorIndex, Focused, Selected);
mModel->SubModelAddRenderMeshes(Scene, WorldMatrix, ColorIndex, Focused, Selected, Disabled, ActiveSubmodelInstance);
else if (mFlags & LC_PIECE_PROJECT)
{
lcModel* Model = mProject->GetMainModel();
if (Model)
Model->SubModelAddRenderMeshes(Scene, WorldMatrix, ColorIndex, Focused, Selected);
Model->SubModelAddRenderMeshes(Scene, WorldMatrix, ColorIndex, Focused, Selected, Disabled, ActiveSubmodelInstance);
}
}

View file

@ -136,13 +136,14 @@ public:
void ZoomExtents(float FoV, float AspectRatio, lcMatrix44& ProjectionMatrix, lcMatrix44& ViewMatrix) const;
void AddRenderMesh(lcScene& Scene);
void AddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int ColorIndex, bool Focused, bool Selected, bool Highlight) const;
void AddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int ColorIndex, bool Focused, bool Selected, bool Disabled, bool Highlight, lcPiece* ActiveSubmodelInstance) const;
void CreatePlaceholder(const char* Name);
void SetPlaceholder();
void SetModel(lcModel* Model, bool UpdateMesh, Project* CurrentProject, bool SearchProjectFolder);
void CreateProject(Project* Project, const char* PieceName);
bool GetPieceWorldMatrix(lcPiece* Piece, lcMatrix44& WorldMatrix) const;
bool IncludesModel(const lcModel* Model) const;
bool MinIntersectDist(const lcVector3& Start, const lcVector3& End, float& MinDistance) const;
bool BoxTest(const lcMatrix44& WorldMatrix, const lcVector4 Planes[6]) const;

View file

@ -1554,7 +1554,7 @@ QImage Project::CreatePartsListImage(lcModel* Model, lcStep Step)
lcScene Scene;
Scene.Begin(ViewMatrix);
Image.Info->AddRenderMeshes(Scene, lcMatrix44Identity(), Image.ColorIndex, false, false, false);
Image.Info->AddRenderMeshes(Scene, lcMatrix44Identity(), Image.ColorIndex, false, false, false, false, nullptr);
Scene.End();
@ -1942,7 +1942,7 @@ void Project::ExportHTML(const lcHTMLExportOptions& Options)
lcScene Scene;
Scene.Begin(ViewMatrix);
Info->AddRenderMeshes(Scene, lcMatrix44Identity(), Options.PartImagesColor, false, false, false);
Info->AddRenderMeshes(Scene, lcMatrix44Identity(), Options.PartImagesColor, false, false, false, false, nullptr);
Scene.End();

View file

@ -15,6 +15,7 @@ lcIndexBuffer View::mRotateMoveIndexBuffer;
View::View(lcModel* Model)
{
mModel = Model;
mActiveSubmodelInstance = nullptr;
mCamera = nullptr;
mHighlight = false;
memset(mGridSettings, 0, sizeof(mGridSettings));
@ -42,6 +43,41 @@ View::~View()
delete mCamera;
}
lcModel* View::GetActiveModel() const
{
return !mActiveSubmodelInstance ? mModel : mActiveSubmodelInstance->mPieceInfo->GetModel();
}
void View::SetSelectedSubmodelActive()
{
if (mActiveSubmodelInstance)
{
lcModel* Model = mActiveSubmodelInstance->mPieceInfo->GetModel();
Model->SetActive(false);
Model->ClearSelection(true);
mActiveSubmodelInstance = nullptr;
}
lcModel* ActiveModel = GetActiveModel();
lcObject* Object = ActiveModel->GetFocusObject();
if (Object && Object->IsPiece())
{
lcPiece* Piece = (lcPiece*)Object;
if (Piece->mPieceInfo->IsModel())
{
ActiveModel->ClearSelection(false);
mActiveSubmodelMatrix = lcMatrix44Identity();
mModel->GetPieceWorldMatrix(Piece, mActiveSubmodelMatrix);
mActiveSubmodelInstance = Piece;
lcModel* Model = mActiveSubmodelInstance->mPieceInfo->GetModel();
Model->SetActive(true);
Model->ClearSelection(true);
}
}
}
void View::CreateResources(lcContext* Context)
{
gGridTexture = new lcTexture;
@ -428,6 +464,7 @@ void View::ShowContextMenu() const
Popup->addSeparator();
Popup->addAction(Actions[LC_PIECE_EDIT_SELECTED_SUBMODEL]);
Popup->addAction(Actions[LC_PIECE_VIEW_SELECTED_MODEL]);
Popup->addAction(Actions[LC_PIECE_INLINE_SELECTED_MODELS]);
Popup->addAction(Actions[LC_PIECE_MOVE_SELECTION_TO_MODEL]);
@ -501,15 +538,16 @@ lcVector3 View::GetMoveDirection(const lcVector3& Direction) const
lcMatrix44 View::GetPieceInsertPosition(bool IgnoreSelected, PieceInfo* Info) const
{
lcPiece* HitPiece = (lcPiece*)FindObjectUnderPointer(true, IgnoreSelected).Object;
lcModel* ActiveModel = GetActiveModel();
if (HitPiece)
{
lcVector3 Position(0, 0, HitPiece->GetBoundingBox().Max.z - Info->GetBoundingBox().Min.z);
if (gMainWindow->GetRelativeTransform())
Position = lcMul31(mModel->SnapPosition(Position), HitPiece->mModelWorld);
Position = lcMul31(ActiveModel->SnapPosition(Position), HitPiece->mModelWorld);
else
Position = mModel->SnapPosition(lcMul31(Position, HitPiece->mModelWorld));
Position = ActiveModel->SnapPosition(lcMul31(Position, HitPiece->mModelWorld));
lcMatrix44 WorldMatrix = HitPiece->mModelWorld;
WorldMatrix.SetTranslation(Position);
@ -525,7 +563,7 @@ lcMatrix44 View::GetPieceInsertPosition(bool IgnoreSelected, PieceInfo* Info) co
const lcBoundingBox& BoundingBox = Info->GetBoundingBox();
if (lcLineSegmentPlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(0, 0, 1, BoundingBox.Min.z)))
{
Intersection = mModel->SnapPosition(Intersection);
Intersection = ActiveModel->SnapPosition(Intersection);
return lcMatrix44Translation(Intersection);
}
@ -567,7 +605,17 @@ lcObjectSection View::FindObjectUnderPointer(bool PiecesOnly, bool IgnoreSelecte
ObjectRayTest.ObjectSection.Object = nullptr;
ObjectRayTest.ObjectSection.Section = 0;;
mModel->RayTest(ObjectRayTest);
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel != mModel)
{
lcMatrix44 InverseMatrix = lcMatrix44AffineInverse(mActiveSubmodelMatrix);
ObjectRayTest.Start = lcMul31(ObjectRayTest.Start, InverseMatrix);
ObjectRayTest.End = lcMul31(ObjectRayTest.End, InverseMatrix);
}
ActiveModel->RayTest(ObjectRayTest);
return ObjectRayTest.ObjectSection;
}
@ -627,7 +675,8 @@ lcArray<lcObject*> View::FindObjectsInBox(float x1, float y1, float x2, float y2
ObjectBoxTest.Planes[4] = lcVector4(PlaneNormals[4], -lcDot(PlaneNormals[4], Corners[0]));
ObjectBoxTest.Planes[5] = lcVector4(PlaneNormals[5], -lcDot(PlaneNormals[5], Corners[5]));
mModel->BoxTest(ObjectBoxTest);
lcModel* ActiveModel = GetActiveModel();
ActiveModel->BoxTest(ObjectBoxTest);
return ObjectBoxTest.Objects;
}
@ -666,14 +715,14 @@ void View::OnDraw()
bool DrawInterface = mWidget != nullptr;
mModel->GetScene(mScene, mCamera, DrawInterface, mHighlight);
mModel->GetScene(mScene, mCamera, DrawInterface, mHighlight, mActiveSubmodelInstance);
if (DrawInterface && mTrackTool == LC_TRACKTOOL_INSERT)
{
PieceInfo* Info = gMainWindow->GetCurrentPieceInfo();
if (Info)
Info->AddRenderMeshes(mScene, GetPieceInsertPosition(false, gMainWindow->GetCurrentPieceInfo()), gMainWindow->mColorIndex, true, true, false);
Info->AddRenderMeshes(mScene, GetPieceInsertPosition(false, gMainWindow->GetCurrentPieceInfo()), gMainWindow->mColorIndex, true, true, false, false, nullptr);
}
int TotalTileRows = 1;
@ -771,12 +820,13 @@ void View::OnDraw()
DrawAxes();
lcTool Tool = gMainWindow->GetTool();
lcModel* ActiveModel = GetActiveModel();
if ((Tool == LC_TOOL_SELECT || Tool == LC_TOOL_MOVE) && mTrackButton == LC_TRACKBUTTON_NONE && mModel->AnyObjectsSelected())
if ((Tool == LC_TOOL_SELECT || Tool == LC_TOOL_MOVE) && mTrackButton == LC_TRACKBUTTON_NONE && ActiveModel->AnyObjectsSelected())
DrawSelectMoveOverlay();
else if (GetCurrentTool() == LC_TOOL_MOVE && mTrackButton != LC_TRACKBUTTON_NONE)
DrawSelectMoveOverlay();
else if ((Tool == LC_TOOL_ROTATE || (Tool == LC_TOOL_SELECT && mTrackButton != LC_TRACKBUTTON_NONE && mTrackTool >= LC_TRACKTOOL_ROTATE_X && mTrackTool <= LC_TRACKTOOL_ROTATE_XYZ)) && mModel->AnyPiecesSelected())
else if ((Tool == LC_TOOL_ROTATE || (Tool == LC_TOOL_SELECT && mTrackButton != LC_TRACKBUTTON_NONE && mTrackTool >= LC_TRACKTOOL_ROTATE_X && mTrackTool <= LC_TRACKTOOL_ROTATE_XYZ)) && ActiveModel->AnyPiecesSelected())
DrawRotateOverlay();
else if ((mTrackTool == LC_TRACKTOOL_SELECT || mTrackTool == LC_TRACKTOOL_ZOOM_REGION) && mTrackButton == LC_TRACKBUTTON_LEFT)
DrawSelectZoomRegionOverlay();
@ -799,11 +849,15 @@ void View::DrawSelectMoveOverlay()
lcVector3 OverlayCenter;
lcMatrix33 RelativeRotation;
mModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
bool AnyPiecesSelected = mModel->AnyPiecesSelected();
lcModel* ActiveModel = GetActiveModel();
ActiveModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
bool AnyPiecesSelected = ActiveModel->AnyPiecesSelected();
lcMatrix44 WorldMatrix = lcMatrix44(RelativeRotation, OverlayCenter);
if (ActiveModel != mModel)
WorldMatrix = lcMul(WorldMatrix, mActiveSubmodelMatrix);
const float OverlayScale = GetOverlayScale();
WorldMatrix = lcMul(lcMatrix44Scale(lcVector3(OverlayScale, OverlayScale, OverlayScale)), WorldMatrix);
@ -813,7 +867,7 @@ void View::DrawSelectMoveOverlay()
mContext->SetVertexBuffer(mRotateMoveVertexBuffer);
mContext->SetVertexFormatPosition(3);
lcObject* Focus = mModel->GetFocusObject();
lcObject* Focus = ActiveModel->GetFocusObject();
quint32 AllowedTransforms = Focus ? Focus->GetAllowedTransforms() : LC_OBJECT_TRANSFORM_MOVE_X | LC_OBJECT_TRANSFORM_MOVE_Y | LC_OBJECT_TRANSFORM_MOVE_Z | LC_OBJECT_TRANSFORM_ROTATE_X | LC_OBJECT_TRANSFORM_ROTATE_Y | LC_OBJECT_TRANSFORM_ROTATE_Z;
if (mTrackButton == LC_TRACKBUTTON_NONE || (mTrackTool >= LC_TRACKTOOL_MOVE_X && mTrackTool <= LC_TRACKTOOL_MOVE_XYZ))
@ -989,8 +1043,9 @@ void View::DrawRotateOverlay()
lcVector3 OverlayCenter;
lcMatrix33 RelativeRotation;
mModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
lcVector3 MouseToolDistance = mModel->SnapRotation(mModel->GetMouseToolDistance());
lcModel* ActiveModel = GetActiveModel();
ActiveModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
lcVector3 MouseToolDistance = ActiveModel->SnapRotation(ActiveModel->GetMouseToolDistance());
bool HasAngle = false;
// Draw a disc showing the rotation amount.
@ -1783,7 +1838,8 @@ float View::GetOverlayScale() const
{
lcVector3 OverlayCenter;
lcMatrix33 RelativeRotation;
mModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
lcModel* ActiveModel = GetActiveModel();
ActiveModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation);
lcVector3 ScreenPos = ProjectPoint(OverlayCenter);
ScreenPos[0] += 10.0f;
@ -1803,17 +1859,19 @@ void View::EndDrag(bool Accept)
{
if (Accept)
{
lcModel* ActiveModel = GetActiveModel();
switch (mDragState)
{
case lcDragState::NONE:
break;
case lcDragState::PIECE:
mModel->InsertPieceToolClicked(GetPieceInsertPosition(false, gMainWindow->GetCurrentPieceInfo()));
ActiveModel->InsertPieceToolClicked(GetPieceInsertPosition(false, gMainWindow->GetCurrentPieceInfo()));
break;
case lcDragState::COLOR:
mModel->PaintToolClicked(FindObjectUnderPointer(true, false).Object);
ActiveModel->PaintToolClicked(FindObjectUnderPointer(true, false).Object);
break;
}
}
@ -1832,22 +1890,32 @@ void View::SetProjection(bool Ortho)
gMainWindow->UpdatePerspective();
}
else
mModel->SetCameraOrthographic(mCamera, Ortho);
{
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel)
ActiveModel->SetCameraOrthographic(mCamera, Ortho);
}
}
void View::LookAt()
{
mModel->LookAt(mCamera);
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel)
ActiveModel->LookAt(mCamera);
}
void View::ZoomExtents()
{
mModel->ZoomExtents(mCamera, (float)mWidth / (float)mHeight);
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel)
ActiveModel->ZoomExtents(mCamera, (float)mWidth / (float)mHeight);
}
void View::MoveCamera(const lcVector3& Direction)
{
mModel->MoveCamera(mCamera, Direction);
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel)
ActiveModel->MoveCamera(mCamera, Direction);
}
void View::UpdateTrackTool()
@ -1858,6 +1926,7 @@ void View::UpdateTrackTool()
int y = mInputState.y;
bool Redraw = false;
mTrackToolFromOverlay = false;
lcModel* ActiveModel = GetActiveModel();
switch (CurrentTool)
{
@ -1893,7 +1962,7 @@ void View::UpdateTrackTool()
lcVector3 OverlayCenter;
lcMatrix33 RelativeRotation;
if (!mModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation))
if (!ActiveModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation))
break;
lcVector3 PlaneNormals[3] =
@ -1912,7 +1981,7 @@ void View::UpdateTrackTool()
const lcVector3& End = StartEnd[1];
float ClosestIntersectionDistance = FLT_MAX;
lcObject* Focus = mModel->GetFocusObject();
lcObject* Focus = ActiveModel->GetFocusObject();
int ControlPointIndex = -1;
if (Focus && Focus->IsPiece())
{
@ -1954,7 +2023,7 @@ void View::UpdateTrackTool()
}
}
if (CurrentTool == LC_TOOL_SELECT && Proj1 > OverlayRotateArrowStart && Proj1 < OverlayRotateArrowEnd && Proj2 > OverlayRotateArrowStart && Proj2 < OverlayRotateArrowEnd && mModel->AnyPiecesSelected())
if (CurrentTool == LC_TOOL_SELECT && Proj1 > OverlayRotateArrowStart && Proj1 < OverlayRotateArrowEnd && Proj2 > OverlayRotateArrowStart && Proj2 < OverlayRotateArrowEnd && ActiveModel->AnyPiecesSelected())
{
lcTrackTool PlaneModes[] = { LC_TRACKTOOL_ROTATE_X, LC_TRACKTOOL_ROTATE_Y, LC_TRACKTOOL_ROTATE_Z };
@ -2064,7 +2133,7 @@ void View::UpdateTrackTool()
lcVector3 OverlayCenter;
lcMatrix33 RelativeRotation;
if (!mModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation))
if (!ActiveModel->GetMoveRotateTransform(OverlayCenter, RelativeRotation))
break;
// Calculate the distance from the mouse pointer to the center of the sphere.
@ -2369,6 +2438,7 @@ void View::StartTracking(lcTrackButton TrackButton)
mMouseDownX = mInputState.x;
mMouseDownY = mInputState.y;
lcTool Tool = GetCurrentTool();
lcModel* ActiveModel = GetActiveModel();
switch (Tool)
{
@ -2385,7 +2455,7 @@ void View::StartTracking(lcTrackButton TrackButton)
};
UnprojectPoints(PositionTarget, 2);
mModel->BeginSpotLightTool(PositionTarget[0], PositionTarget[1]);
ActiveModel->BeginSpotLightTool(PositionTarget[0], PositionTarget[1]);
}
break;
@ -2398,7 +2468,7 @@ void View::StartTracking(lcTrackButton TrackButton)
};
UnprojectPoints(PositionTarget, 2);
mModel->BeginCameraTool(PositionTarget[0], PositionTarget[1]);
ActiveModel->BeginCameraTool(PositionTarget[0], PositionTarget[1]);
}
break;
@ -2407,7 +2477,7 @@ void View::StartTracking(lcTrackButton TrackButton)
case LC_TOOL_MOVE:
case LC_TOOL_ROTATE:
mModel->BeginMouseTool();
ActiveModel->BeginMouseTool();
break;
case LC_TOOL_ERASER:
@ -2418,7 +2488,7 @@ void View::StartTracking(lcTrackButton TrackButton)
case LC_TOOL_PAN:
case LC_TOOL_ROTATE_VIEW:
case LC_TOOL_ROLL:
mModel->BeginMouseTool();
ActiveModel->BeginMouseTool();
break;
case LC_TOOL_ZOOM_REGION:
@ -2437,6 +2507,7 @@ void View::StopTracking(bool Accept)
return;
lcTool Tool = GetCurrentTool();
lcModel* ActiveModel = GetActiveModel();
switch (Tool)
{
@ -2446,7 +2517,7 @@ void View::StopTracking(bool Accept)
case LC_TOOL_SPOTLIGHT:
case LC_TOOL_CAMERA:
mModel->EndMouseTool(Tool, Accept);
ActiveModel->EndMouseTool(Tool, Accept);
break;
case LC_TOOL_SELECT:
@ -2455,17 +2526,17 @@ void View::StopTracking(bool Accept)
lcArray<lcObject*> Objects = FindObjectsInBox(mMouseDownX, mMouseDownY, mInputState.x, mInputState.y);
if (mInputState.Modifiers & Qt::ControlModifier)
mModel->AddToSelection(Objects, true, true);
ActiveModel->AddToSelection(Objects, true, true);
else if (mInputState.Modifiers & Qt::ShiftModifier)
mModel->RemoveFromSelection(Objects);
ActiveModel->RemoveFromSelection(Objects);
else
mModel->SetSelectionAndFocus(Objects, nullptr, 0, true);
ActiveModel->SetSelectionAndFocus(Objects, nullptr, 0, true);
}
break;
case LC_TOOL_MOVE:
case LC_TOOL_ROTATE:
mModel->EndMouseTool(Tool, Accept);
ActiveModel->EndMouseTool(Tool, Accept);
break;
case LC_TOOL_ERASER:
@ -2476,7 +2547,7 @@ void View::StopTracking(bool Accept)
case LC_TOOL_PAN:
case LC_TOOL_ROTATE_VIEW:
case LC_TOOL_ROLL:
mModel->EndMouseTool(Tool, Accept);
ActiveModel->EndMouseTool(Tool, Accept);
break;
case LC_TOOL_ZOOM_REGION:
@ -2496,7 +2567,7 @@ void View::StopTracking(bool Accept)
UnprojectPoints(Points, 5);
lcVector3 Center = mModel->GetSelectionOrModelCenter();
lcVector3 Center = ActiveModel->GetSelectionOrModelCenter();
lcVector3 PlaneNormal(mCamera->mPosition - mCamera->mTargetPosition);
lcVector4 Plane(PlaneNormal, -lcDot(PlaneNormal, Center));
@ -2505,7 +2576,7 @@ void View::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;
mModel->ZoomRegionToolClicked(mCamera, AspectRatio, Points[0], Target, Corners);
ActiveModel->ZoomRegionToolClicked(mCamera, AspectRatio, Points[0], Target, Corners);
}
}
break;
@ -2524,11 +2595,17 @@ void View::CancelTrackingOrClearSelection()
if (mTrackButton != LC_TRACKBUTTON_NONE)
StopTracking(false);
else
mModel->ClearSelection(true);
{
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel)
ActiveModel->ClearSelection(true);
}
}
void View::OnButtonDown(lcTrackButton TrackButton)
{
lcModel* ActiveModel = GetActiveModel();
switch (mTrackTool)
{
case LC_TRACKTOOL_NONE:
@ -2541,7 +2618,7 @@ void View::OnButtonDown(lcTrackButton TrackButton)
if (!CurPiece)
break;
mModel->InsertPieceToolClicked(GetPieceInsertPosition(false, gMainWindow->GetCurrentPieceInfo()));
ActiveModel->InsertPieceToolClicked(GetPieceInsertPosition(false, gMainWindow->GetCurrentPieceInfo()));
if ((mInputState.Modifiers & Qt::ControlModifier) == 0)
gMainWindow->SetTool(LC_TOOL_SELECT);
@ -2552,7 +2629,7 @@ void View::OnButtonDown(lcTrackButton TrackButton)
case LC_TRACKTOOL_POINTLIGHT:
{
mModel->PointLightToolClicked(UnprojectPoint(lcVector3((float)mInputState.x, (float)mInputState.y, 0.9f)));
ActiveModel->PointLightToolClicked(UnprojectPoint(lcVector3((float)mInputState.x, (float)mInputState.y, 0.9f)));
if ((mInputState.Modifiers & Qt::ControlModifier) == 0)
gMainWindow->SetTool(LC_TOOL_SELECT);
@ -2571,11 +2648,11 @@ void View::OnButtonDown(lcTrackButton TrackButton)
lcObjectSection ObjectSection = FindObjectUnderPointer(false, false);
if (mInputState.Modifiers & Qt::ControlModifier)
mModel->FocusOrDeselectObject(ObjectSection);
ActiveModel->FocusOrDeselectObject(ObjectSection);
else if (mInputState.Modifiers & Qt::ShiftModifier)
mModel->RemoveFromSelection(ObjectSection);
ActiveModel->RemoveFromSelection(ObjectSection);
else
mModel->ClearSelectionAndSetFocus(ObjectSection, true);
ActiveModel->ClearSelectionAndSetFocus(ObjectSection, true);
StartTracking(TrackButton);
}
@ -2588,7 +2665,7 @@ void View::OnButtonDown(lcTrackButton TrackButton)
case LC_TRACKTOOL_MOVE_XZ:
case LC_TRACKTOOL_MOVE_YZ:
case LC_TRACKTOOL_MOVE_XYZ:
if (mModel->AnyObjectsSelected())
if (ActiveModel->AnyObjectsSelected())
StartTracking(TrackButton);
break;
@ -2597,22 +2674,22 @@ void View::OnButtonDown(lcTrackButton TrackButton)
case LC_TRACKTOOL_ROTATE_Z:
case LC_TRACKTOOL_ROTATE_XY:
case LC_TRACKTOOL_ROTATE_XYZ:
if (mModel->AnyPiecesSelected())
if (ActiveModel->AnyPiecesSelected())
StartTracking(TrackButton);
break;
case LC_TRACKTOOL_SCALE_PLUS:
case LC_TRACKTOOL_SCALE_MINUS:
if (mModel->AnyPiecesSelected())
if (ActiveModel->AnyPiecesSelected())
StartTracking(TrackButton);
break;
case LC_TRACKTOOL_ERASER:
mModel->EraserToolClicked(FindObjectUnderPointer(false, false).Object);
ActiveModel->EraserToolClicked(FindObjectUnderPointer(false, false).Object);
break;
case LC_TRACKTOOL_PAINT:
mModel->PaintToolClicked(FindObjectUnderPointer(true, false).Object);
ActiveModel->PaintToolClicked(FindObjectUnderPointer(true, false).Object);
break;
case LC_TRACKTOOL_ZOOM:
@ -2658,13 +2735,14 @@ void View::OnLeftButtonDoubleClick()
gMainWindow->SetActiveView(this);
lcObjectSection ObjectSection = FindObjectUnderPointer(false, false);
lcModel* ActiveModel = GetActiveModel();
if (mInputState.Modifiers & Qt::ControlModifier)
mModel->FocusOrDeselectObject(ObjectSection);
ActiveModel->FocusOrDeselectObject(ObjectSection);
else if (mInputState.Modifiers & Qt::ShiftModifier)
mModel->RemoveFromSelection(ObjectSection);
ActiveModel->RemoveFromSelection(ObjectSection);
else
mModel->ClearSelectionAndSetFocus(ObjectSection, true);
ActiveModel->ClearSelectionAndSetFocus(ObjectSection, true);
}
void View::OnMiddleButtonDown()
@ -2737,7 +2815,9 @@ void View::OnForwardButtonUp()
void View::OnMouseMove()
{
if (!mModel)
lcModel* ActiveModel = GetActiveModel();
if (!ActiveModel)
return;
if (mTrackButton == LC_TRACKBUTTON_NONE)
@ -2761,11 +2841,11 @@ void View::OnMouseMove()
break;
case LC_TRACKTOOL_SPOTLIGHT:
mModel->UpdateSpotLightTool(UnprojectPoint(lcVector3((float)mInputState.x, (float)mInputState.y, 0.9f)));
ActiveModel->UpdateSpotLightTool(UnprojectPoint(lcVector3((float)mInputState.x, (float)mInputState.y, 0.9f)));
break;
case LC_TRACKTOOL_CAMERA:
mModel->UpdateCameraTool(UnprojectPoint(lcVector3((float)mInputState.x, (float)mInputState.y, 0.9f)));
ActiveModel->UpdateCameraTool(UnprojectPoint(lcVector3((float)mInputState.x, (float)mInputState.y, 0.9f)));
break;
case LC_TRACKTOOL_SELECT:
@ -2799,7 +2879,7 @@ void View::OnMouseMove()
lcVector3 Center;
lcMatrix33 RelativeRotation;
mModel->GetMoveRotateTransform(Center, RelativeRotation);
ActiveModel->GetMoveRotateTransform(Center, RelativeRotation);
if (mTrackTool == LC_TRACKTOOL_MOVE_X || mTrackTool == LC_TRACKTOOL_MOVE_Y || mTrackTool == LC_TRACKTOOL_MOVE_Z)
{
@ -2821,7 +2901,7 @@ void View::OnMouseMove()
lcVector3 Distance = Intersection - MoveStart;
Distance = lcMul(Distance, lcMatrix33AffineInverse(RelativeRotation));
mModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
}
else if (mTrackTool == LC_TRACKTOOL_MOVE_XY || mTrackTool == LC_TRACKTOOL_MOVE_XZ || mTrackTool == LC_TRACKTOOL_MOVE_YZ)
{
@ -2846,7 +2926,7 @@ void View::OnMouseMove()
{
lcVector3 Distance = Intersection - MoveStart;
Distance = lcMul(Distance, lcMatrix33AffineInverse(RelativeRotation));
mModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
}
}
}
@ -2854,7 +2934,7 @@ void View::OnMouseMove()
{
lcMatrix44 NewPosition = GetPieceInsertPosition(true, mMouseDownPiece);
lcVector3 Distance = NewPosition.GetTranslation() - mMouseDownPosition;
mModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
}
else if (mTrackTool == LC_TRACKTOOL_SCALE_PLUS || mTrackTool == LC_TRACKTOOL_SCALE_MINUS)
{
@ -2869,7 +2949,7 @@ void View::OnMouseMove()
lcVector3 Intersection;
lcClosestPointsBetweenLines(Center, Center + Direction, CurrentStart, CurrentEnd, &Intersection, nullptr);
lcObject* Focus = mModel->GetFocusObject();
lcObject* Focus = ActiveModel->GetFocusObject();
if (Focus && Focus->IsPiece())
{
lcPiece* Piece = (lcPiece*)Focus;
@ -2890,7 +2970,7 @@ void View::OnMouseMove()
float Scale = lcClamp(Distance, 0.1f, ScaleMax);
mModel->UpdateScaleTool(Scale);
ActiveModel->UpdateScaleTool(Scale);
}
}
}
@ -2907,7 +2987,7 @@ void View::OnMouseMove()
if (lcLineSegmentPlaneIntersection(&MoveStart, MouseDownStart, MouseDownEnd, Plane))
{
lcVector3 Distance = Intersection - MoveStart;
mModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateMoveTool(Distance, mTrackButton != LC_TRACKBUTTON_LEFT);
}
}
}
@ -2965,7 +3045,7 @@ void View::OnMouseMove()
MoveX *= 36.0f * (float)(mInputState.x - mMouseDownX) * MouseSensitivity;
MoveY *= 36.0f * (float)(mInputState.y - mMouseDownY) * MouseSensitivity;
mModel->UpdateRotateTool(MoveX + MoveY, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateRotateTool(MoveX + MoveY, mTrackButton != LC_TRACKBUTTON_LEFT);
}
break;
@ -2977,7 +3057,7 @@ void View::OnMouseMove()
lcVector3 MoveX = 36.0f * (float)(mInputState.x - mMouseDownX) * MouseSensitivity * ScreenX;
lcVector3 MoveY = 36.0f * (float)(mInputState.y - mMouseDownY) * MouseSensitivity * ScreenY;
mModel->UpdateRotateTool(MoveX + MoveY, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateRotateTool(MoveX + MoveY, mTrackButton != LC_TRACKBUTTON_LEFT);
}
break;
@ -2985,7 +3065,7 @@ void View::OnMouseMove()
{
lcVector3 ScreenZ = lcNormalize(mCamera->mTargetPosition - mCamera->mPosition);
mModel->UpdateRotateTool(36.0f * (float)(mInputState.y - mMouseDownY) * MouseSensitivity * ScreenZ, mTrackButton != LC_TRACKBUTTON_LEFT);
ActiveModel->UpdateRotateTool(36.0f * (float)(mInputState.y - mMouseDownY) * MouseSensitivity * ScreenZ, mTrackButton != LC_TRACKBUTTON_LEFT);
}
break;
@ -2994,7 +3074,7 @@ void View::OnMouseMove()
break;
case LC_TRACKTOOL_ZOOM:
mModel->UpdateZoomTool(mCamera, 2.0f * MouseSensitivity * (mInputState.y - mMouseDownY));
ActiveModel->UpdateZoomTool(mCamera, 2.0f * MouseSensitivity * (mInputState.y - mMouseDownY));
break;
case LC_TRACKTOOL_PAN:
@ -3013,7 +3093,7 @@ void View::OnMouseMove()
const lcVector3& CurrentEnd = Points[1];
const lcVector3& MouseDownStart = Points[2];
const lcVector3& MouseDownEnd = Points[3];
lcVector3 Center = mModel->GetSelectionOrModelCenter();
lcVector3 Center = ActiveModel->GetSelectionOrModelCenter();
lcVector3 PlaneNormal(mCamera->mPosition - mCamera->mTargetPosition);
lcVector4 Plane(PlaneNormal, -lcDot(PlaneNormal, Center));
@ -3028,24 +3108,24 @@ void View::OnMouseMove()
break;
}
mModel->UpdatePanTool(mCamera, MoveStart - Intersection);
ActiveModel->UpdatePanTool(mCamera, MoveStart - Intersection);
}
break;
case LC_TRACKTOOL_ORBIT_X:
mModel->UpdateOrbitTool(mCamera, 0.1f * MouseSensitivity * (mInputState.x - mMouseDownX), 0.0f);
ActiveModel->UpdateOrbitTool(mCamera, 0.1f * MouseSensitivity * (mInputState.x - mMouseDownX), 0.0f);
break;
case LC_TRACKTOOL_ORBIT_Y:
mModel->UpdateOrbitTool(mCamera, 0.0f, 0.1f * MouseSensitivity * (mInputState.y - mMouseDownY));
ActiveModel->UpdateOrbitTool(mCamera, 0.0f, 0.1f * MouseSensitivity * (mInputState.y - mMouseDownY));
break;
case LC_TRACKTOOL_ORBIT_XY:
mModel->UpdateOrbitTool(mCamera, 0.1f * MouseSensitivity * (mInputState.x - mMouseDownX), 0.1f * MouseSensitivity * (mInputState.y - mMouseDownY));
ActiveModel->UpdateOrbitTool(mCamera, 0.1f * MouseSensitivity * (mInputState.x - mMouseDownX), 0.1f * MouseSensitivity * (mInputState.y - mMouseDownY));
break;
case LC_TRACKTOOL_ROLL:
mModel->UpdateRollTool(mCamera, 2.0f * MouseSensitivity * (mInputState.x - mMouseDownX) * LC_DTOR);
ActiveModel->UpdateRollTool(mCamera, 2.0f * MouseSensitivity * (mInputState.x - mMouseDownX) * LC_DTOR);
break;
case LC_TRACKTOOL_ZOOM_REGION:

View file

@ -58,6 +58,20 @@ public:
View(lcModel* Model);
virtual ~View();
void Clear()
{
mModel = nullptr;
mActiveSubmodelInstance = nullptr;
}
lcModel* GetModel() const
{
return mModel;
}
lcModel* GetActiveModel() const;
void SetSelectedSubmodelActive();
void SetHighlight(bool Highlight)
{
mHighlight = Highlight;
@ -107,7 +121,6 @@ public:
lcObjectSection FindObjectUnderPointer(bool PiecesOnly, bool IgnoreSelected) const;
lcArray<lcObject*> FindObjectsInBox(float x1, float y1, float x2, float y2) const;
lcModel* mModel;
lcCamera* mCamera;
lcVector3 ProjectPoint(const lcVector3& Point) const
@ -157,6 +170,10 @@ protected:
void OnButtonDown(lcTrackButton TrackButton);
lcMatrix44 GetTileProjectionMatrix(int CurrentRow, int CurrentColumn, int CurrentTileWidth, int CurrentTileHeight) const;
lcModel* mModel;
lcPiece* mActiveSubmodelInstance;
lcMatrix44 mActiveSubmodelMatrix;
lcScene mScene;
lcDragState mDragState;
lcTrackButton mTrackButton;