diff --git a/common/lc_model.cpp b/common/lc_model.cpp index f6c68830..c171e6bf 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -752,6 +752,71 @@ lcMatrix44 lcModel::GetRelativeRotation() const return lcMatrix44Identity(); } +bool lcModel::RemoveSelectedObjects() +{ + bool RemovedPiece = false; + bool RemovedCamera = false; + bool RemovedLight = false; + + for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); ) + { + lcPiece* Piece = mPieces[PieceIdx]; + + if (Piece->IsSelected()) + { + RemovedPiece = true; + mPieces.Remove(Piece); + delete Piece; + } + else + PieceIdx++; + } + + for (int CameraIdx = 0; CameraIdx < mCameras.GetSize(); ) + { + lcCamera* Camera = mCameras[CameraIdx]; + + if (Camera->IsSelected()) + { + const lcArray Views = gMainWindow->GetViews(); + for (int ViewIdx = 0; ViewIdx < Views.GetSize(); ViewIdx++) + { + View* View = Views[ViewIdx]; + + if (Camera == View->mCamera) + View->SetCamera(Camera, true); + } + + RemovedCamera = true; + mCameras.RemoveIndex(CameraIdx); + delete Camera; + } + else + CameraIdx++; + } + + if (RemovedCamera) + gMainWindow->UpdateCameraMenu(); + + for (int LightIdx = 0; LightIdx < mLights.GetSize(); ) + { + lcLight* Light = mLights[LightIdx]; + + if (Light->IsSelected()) + { + RemovedLight = true; + mLights.RemoveIndex(LightIdx); + delete Light; + } + else + LightIdx++; + } + + RemoveEmptyGroups(); + + return RemovedPiece || RemovedCamera || RemovedLight; +} + bool lcModel::MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector3& ObjectDistance) { lcMatrix44 RelativeRotation = GetRelativeRotation(); @@ -911,6 +976,32 @@ bool lcModel::RotateSelectedPieces(const lcVector3& Angles) return true; } +bool lcModel::AnyPiecesSelected() const +{ + for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++) + if (mPieces[PieceIdx]->IsSelected()) + return true; + + return false; +} + +bool lcModel::AnyObjectsSelected() const +{ + for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++) + if (mPieces[PieceIdx]->IsSelected()) + return true; + + for (int CameraIdx = 0; CameraIdx < mCameras.GetSize(); CameraIdx++) + if (mCameras[CameraIdx]->IsSelected()) + return true; + + for (int LightIdx = 0; LightIdx < mLights.GetSize(); LightIdx++) + if (mLights[LightIdx]->IsSelected()) + return true; + + return false; +} + lcObject* lcModel::GetFocusObject() const { for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++) @@ -940,6 +1031,34 @@ lcObject* lcModel::GetFocusObject() const return NULL; } +lcVector3 lcModel::GetFocusOrSelectionCenter() const +{ + lcVector3 Center; + + if (GetFocusPosition(Center)) + return Center; + + GetSelectionCenter(Center); + + return Center; +} + +bool lcModel::GetFocusPosition(lcVector3& Position) const +{ + lcObject* FocusObject = GetFocusObject(); + + if (FocusObject) + { + Position = FocusObject->GetSectionPosition(FocusObject->GetFocusSection()); + return true; + } + else + { + Position = lcVector3(0.0f, 0.0f, 0.0f); + return false; + } +} + bool lcModel::GetSelectionCenter(lcVector3& Center) const { float Bounds[6] = { FLT_MAX, FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX }; diff --git a/common/lc_model.h b/common/lc_model.h index cd1d5ff1..52fa1d05 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -146,6 +146,10 @@ public: void RayTest(lcObjectRayTest& ObjectRayTest) const; void BoxTest(lcObjectBoxTest& ObjectBoxTest) const; + bool AnyPiecesSelected() const; + bool AnyObjectsSelected() const; + lcVector3 GetFocusOrSelectionCenter() const; + bool GetFocusPosition(lcVector3& Position) const; lcObject* GetFocusObject() const; bool GetSelectionCenter(lcVector3& Center) const; void FocusOrDeselectObject(const lcObjectSection& ObjectSection); @@ -191,6 +195,7 @@ protected: void LoadCheckPoint(lcModelHistoryEntry* CheckPoint); void RemoveEmptyGroups(); + bool RemoveSelectedObjects(); bool MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector3& ObjectDistance); bool RotateSelectedPieces(const lcVector3& Angles); void CalculateStep(); diff --git a/common/preview.cpp b/common/preview.cpp index 4fccb3c0..63f0dabd 100644 --- a/common/preview.cpp +++ b/common/preview.cpp @@ -77,7 +77,6 @@ void PiecePreview::SetCurrentPiece(PieceInfo *pInfo) if (m_PieceInfo != NULL) { m_PieceInfo->AddRef(); - lcGetActiveProject()->SetCurrentPiece(m_PieceInfo); Redraw(); } } diff --git a/common/project.cpp b/common/project.cpp index 763ae333..09cabd26 100644 --- a/common/project.cpp +++ b/common/project.cpp @@ -1,11 +1,6 @@ #include "lc_global.h" #include "lc_math.h" #include "lc_mesh.h" -#include -#include -#include -#include -#include #include #include "opengl.h" #include "pieceinf.h" @@ -1239,7 +1234,7 @@ void Project::RenderSceneObjects(View* view) Context->SetWorldViewMatrix(lcMul(WorldMatrix, ViewMatrix)); Context->SetLineWidth(2.0f * Preferences.mLineWidth); - m_pCurPiece->RenderPiece(gMainWindow->mColorIndex); + gMainWindow->mPreviewWidget->GetCurrentPiece()->RenderPiece(gMainWindow->mColorIndex); } if (Preferences.mLightingMode != LC_LIGHTING_FLAT) @@ -1287,17 +1282,18 @@ bool Project::GetPiecesBoundingBox(View* view, float BoundingBox[6]) lcVector3 Position; lcVector4 Rotation; GetPieceInsertPosition(view, Position, Rotation); + PieceInfo* CurPiece = gMainWindow->mPreviewWidget->GetCurrentPiece(); lcVector3 Points[8] = { - lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[5]), - lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[5]), - lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[2]), - lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[5]), - lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[2]), - lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[2]), - lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[5]), - lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[2]) + lcVector3(CurPiece->m_fDimensions[0], CurPiece->m_fDimensions[1], CurPiece->m_fDimensions[5]), + lcVector3(CurPiece->m_fDimensions[3], CurPiece->m_fDimensions[1], CurPiece->m_fDimensions[5]), + lcVector3(CurPiece->m_fDimensions[0], CurPiece->m_fDimensions[1], CurPiece->m_fDimensions[2]), + lcVector3(CurPiece->m_fDimensions[3], CurPiece->m_fDimensions[4], CurPiece->m_fDimensions[5]), + lcVector3(CurPiece->m_fDimensions[3], CurPiece->m_fDimensions[4], CurPiece->m_fDimensions[2]), + lcVector3(CurPiece->m_fDimensions[0], CurPiece->m_fDimensions[4], CurPiece->m_fDimensions[2]), + lcVector3(CurPiece->m_fDimensions[0], CurPiece->m_fDimensions[4], CurPiece->m_fDimensions[5]), + lcVector3(CurPiece->m_fDimensions[3], CurPiece->m_fDimensions[1], CurPiece->m_fDimensions[2]) }; lcMatrix44 ModelWorld = lcMatrix44FromAxisAngle(lcVector3(Rotation[0], Rotation[1], Rotation[2]), Rotation[3] * LC_DTOR); @@ -1319,71 +1315,6 @@ bool Project::GetPiecesBoundingBox(View* view, float BoundingBox[6]) return true; } -bool Project::RemoveSelectedObjects() -{ - bool RemovedPiece = false; - bool RemovedCamera = false; - bool RemovedLight = false; - - for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); ) - { - lcPiece* Piece = mPieces[PieceIdx]; - - if (Piece->IsSelected()) - { - RemovedPiece = true; - mPieces.Remove(Piece); - delete Piece; - } - else - PieceIdx++; - } - - for (int CameraIdx = 0; CameraIdx < mCameras.GetSize(); ) - { - lcCamera* Camera = mCameras[CameraIdx]; - - if (Camera->IsSelected()) - { - const lcArray Views = gMainWindow->GetViews(); - for (int ViewIdx = 0; ViewIdx < Views.GetSize(); ViewIdx++) - { - View* View = Views[ViewIdx]; - - if (Camera == View->mCamera) - View->SetCamera(Camera, true); - } - - RemovedCamera = true; - mCameras.RemoveIndex(CameraIdx); - delete Camera; - } - else - CameraIdx++; - } - - if (RemovedCamera) - gMainWindow->UpdateCameraMenu(); - - for (int LightIdx = 0; LightIdx < mLights.GetSize(); ) - { - lcLight* Light = mLights[LightIdx]; - - if (Light->IsSelected()) - { - RemovedLight = true; - mLights.RemoveIndex(LightIdx); - delete Light; - } - else - LightIdx++; - } - - RemoveEmptyGroups(); - - return RemovedPiece || RemovedCamera || RemovedLight; -} - void Project::ZoomExtents(int FirstView, int LastView) { if (mPieces.IsEmpty()) @@ -2377,15 +2308,13 @@ void Project::HandleCommand(LC_COMMANDS id) } } break; - case LC_FILE_SAVE: - { - DoSave(m_strPathName); - } break; + case LC_FILE_SAVE: + DoSave(m_strPathName); + break; - case LC_FILE_SAVEAS: - { - DoSave(NULL); - } break; + case LC_FILE_SAVEAS: + DoSave(NULL); + break; case LC_FILE_SAVE_IMAGE: { @@ -3466,10 +3395,13 @@ void Project::HandleCommand(LC_COMMANDS id) case LC_PIECE_INSERT: { - if (m_pCurPiece == NULL) + PieceInfo* CurPiece = gMainWindow->mPreviewWidget->GetCurrentPiece(); + + if (!CurPiece) break; + lcPiece* Last = mPieces.IsEmpty() ? NULL : mPieces[mPieces.GetSize() - 1]; - lcPiece* pPiece = new lcPiece(m_pCurPiece); + lcPiece* pPiece = new lcPiece(CurPiece); for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++) { @@ -3547,7 +3479,7 @@ void Project::HandleCommand(LC_COMMANDS id) axis[2] = 0.01f; } - if (id == LC_PIECE_MOVE_PLUSX || id == LC_PIECE_ROTATE_PLUSX) + if (id == LC_PIECE_MOVE_PLUSX || id == LC_PIECE_ROTATE_PLUSX) axis = lcVector3(axis[0], 0, 0); else if (id == LC_PIECE_MOVE_MINUSX || id == LC_PIECE_ROTATE_MINUSX) axis = lcVector3(-axis[0], 0, 0); @@ -4550,58 +4482,11 @@ lcGroup* Project::AddGroup(lcGroup* Parent) return NewGroup; } -lcVector3 Project::GetFocusOrSelectionCenter() const -{ - lcVector3 Center; - - if (GetFocusPosition(Center)) - return Center; - - GetSelectionCenter(Center); - - return Center; -} - -bool Project::GetFocusPosition(lcVector3& Position) const -{ - lcObject* FocusObject = GetFocusObject(); - - if (FocusObject) - { - Position = FocusObject->GetSectionPosition(FocusObject->GetFocusSection()); - return true; - } - else - { - Position = lcVector3(0.0f, 0.0f, 0.0f); - return false; - } -} - -bool Project::AnyObjectsSelected(bool PiecesOnly) const -{ - for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++) - if (mPieces[PieceIdx]->IsSelected()) - return true; - - if (!PiecesOnly) - { - for (int CameraIdx = 0; CameraIdx < mCameras.GetSize(); CameraIdx++) - if (mCameras[CameraIdx]->IsSelected()) - return true; - - for (int LightIdx = 0; LightIdx < mLights.GetSize(); LightIdx++) - if (mLights[LightIdx]->IsSelected()) - return true; - } - - return false; -} - // Find a good starting position/orientation relative to an existing piece. void Project::GetPieceInsertPosition(lcPiece* OffsetPiece, lcVector3& Position, lcVector4& Rotation) { - lcVector3 Dist(0, 0, OffsetPiece->mPieceInfo->m_fDimensions[2] - m_pCurPiece->m_fDimensions[5]); + PieceInfo* CurPiece = gMainWindow->mPreviewWidget->GetCurrentPiece(); + lcVector3 Dist(0, 0, OffsetPiece->mPieceInfo->m_fDimensions[2] - CurPiece->m_fDimensions[5]); Dist = SnapPosition(Dist); Position = lcMul31(Dist, OffsetPiece->mModelWorld); @@ -4624,8 +4509,10 @@ void Project::GetPieceInsertPosition(View* view, lcVector3& Position, lcVector4& lcVector3 ClickPoints[2] = { lcVector3((float)view->mInputState.x, (float)view->mInputState.y, 0.0f), lcVector3((float)view->mInputState.x, (float)view->mInputState.y, 1.0f) }; view->UnprojectPoints(ClickPoints, 2); + PieceInfo* CurPiece = gMainWindow->mPreviewWidget->GetCurrentPiece(); lcVector3 Intersection; - if (lcLinePlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(0, 0, 1, m_pCurPiece->m_fDimensions[5]))) + + if (lcLinePlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(0, 0, 1, CurPiece->m_fDimensions[5]))) { Intersection = SnapPosition(Intersection); Position = Intersection; @@ -4634,7 +4521,7 @@ void Project::GetPieceInsertPosition(View* view, lcVector3& Position, lcVector4& } // Couldn't find a good position, so just place the piece somewhere near the camera. - Position = view->UnprojectPoint(lcVector3((float)view->mInputState.x, (float)view->mInputState.y, 0.9f)); + Position = view->UnprojectPoint(lcVector3((float)view->mInputState.x, (float)view->mInputState.y, 0.9f)); Rotation = lcVector4(0, 0, 1, 0); } diff --git a/common/project.h b/common/project.h index c8123917..90569cdf 100644 --- a/common/project.h +++ b/common/project.h @@ -70,23 +70,20 @@ enum lcObjectProperty class Project : public lcModel { - Q_DECLARE_TR_FUNCTIONS(Project) - public: Project(); ~Project(); -public: void SetCurrentStep(lcStep Step) { mCurrentStep = Step; CalculateStep(); } - void SetCurrentPiece(PieceInfo* pInfo) - { m_pCurPiece = pInfo; } float* GetBackgroundColor() // todo: remove - { return mProperties.mBackgroundSolidColor; } + { + return mProperties.mBackgroundSolidColor; + } int GetGroupIndex(lcGroup* Group) const { @@ -94,38 +91,28 @@ public: } void UpdateInterface(); - void SetPathName (const char* lpszPathName, bool bAddToMRU); - void SetTitle (const char* lpszTitle); + void SetPathName(const char* lpszPathName, bool bAddToMRU); + void SetTitle(const char* lpszTitle); public: void LoadDefaults(); - bool GetPiecesBoundingBox(View* view, float BoundingBox[6]); void GetPiecesUsed(lcArray& PiecesUsed) const; void CreateImages(Image* images, int width, int height, lcStep from, lcStep to, bool hilite); void Render(View* view, bool bToMemory); - lcVector3 GetFocusOrSelectionCenter() const; - bool GetFocusPosition(lcVector3& Position) const; - bool AnyObjectsSelected(bool PiecesOnly) const; lcGroup* AddGroup(lcGroup* Parent); void TransformSelectedObjects(lcTransformType Type, const lcVector3& Transform); void ModifyObject(lcObject* Object, lcObjectProperty Property, void* Value); void ZoomActiveView(int Amount); - - char m_strTitle[LC_MAXPATH]; - char m_strPathName[LC_MAXPATH]; - void GetPieceInsertPosition(View* view, lcVector3& Position, lcVector4& Orientation); - void HandleCommand(LC_COMMANDS id); protected: void CheckPoint(const char* Description); - bool RemoveSelectedObjects(); void GetPieceInsertPosition(lcPiece* OffsetPiece, lcVector3& Position, lcVector4& Rotation); - static int InstanceOfName(const String& existingString, const String& candidateString, String& baseNameOut ); + static int InstanceOfName(const String& existingString, const String& candidateString, String& baseNameOut); void RenderBackground(View* view); void RenderScenePieces(View* view, bool DrawInterface); @@ -136,15 +123,14 @@ protected: void ExportPOVRay(lcFile& File); void ZoomExtents(int FirstView, int LastView); -protected: - PieceInfo* m_pCurPiece; -// lcuint16 m_nMoveSnap; - bool DoSave(const char* FileName); bool FileLoad(lcFile* file, bool bUndo, bool bMerge); void FileReadLDraw(lcFile* file, const lcMatrix44& CurrentTransform, int* nOk, int DefColor, int* nStep, lcArray& FileArray); void FileReadMPD(lcFile& MPD, lcArray& FileArray) const; + char m_strTitle[LC_MAXPATH]; + char m_strPathName[LC_MAXPATH]; + public: bool OnNewDocument(); bool OnOpenDocument(const char* FileName); diff --git a/common/view.cpp b/common/view.cpp index d7cc1171..84402341 100644 --- a/common/view.cpp +++ b/common/view.cpp @@ -224,11 +224,11 @@ void View::OnDraw() lcTool Tool = gMainWindow->GetTool(); - if ((Tool == LC_TOOL_SELECT || Tool == LC_TOOL_MOVE) && mTrackButton == LC_TRACKBUTTON_NONE && mProject->AnyObjectsSelected(false)) + if ((Tool == LC_TOOL_SELECT || Tool == LC_TOOL_MOVE) && mTrackButton == LC_TRACKBUTTON_NONE && mProject->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)) && mProject->AnyObjectsSelected(true)) + else if ((Tool == LC_TOOL_ROTATE || (Tool == LC_TOOL_SELECT && mTrackButton != LC_TRACKBUTTON_NONE && mTrackTool >= LC_TRACKTOOL_ROTATE_X && mTrackTool <= LC_TRACKTOOL_ROTATE_XYZ)) && mProject->AnyPiecesSelected()) DrawRotateOverlay(); else if ((mTrackTool == LC_TRACKTOOL_SELECT || mTrackTool == LC_TRACKTOOL_ZOOM_REGION) && mTrackButton == LC_TRACKBUTTON_LEFT) DrawSelectZoomRegionOverlay(); @@ -259,7 +259,7 @@ void View::DrawSelectMoveOverlay() lcMatrix44 RelativeRotation = mProject->GetRelativeRotation(); lcVector3 OverlayCenter = mProject->GetFocusOrSelectionCenter(); - bool AnyPiecesSelected = mProject->AnyObjectsSelected(true); + bool AnyPiecesSelected = mProject->AnyPiecesSelected(); // Draw the arrows. for (int i = 0; i < 3; i++) @@ -1746,7 +1746,7 @@ void View::OnLeftButtonDown() case LC_TRACKTOOL_MOVE_XZ: case LC_TRACKTOOL_MOVE_YZ: case LC_TRACKTOOL_MOVE_XYZ: - if (mProject->AnyObjectsSelected(false)) + if (mProject->AnyObjectsSelected()) StartTracking(LC_TRACKBUTTON_LEFT); break; @@ -1755,7 +1755,7 @@ void View::OnLeftButtonDown() case LC_TRACKTOOL_ROTATE_Z: case LC_TRACKTOOL_ROTATE_XY: case LC_TRACKTOOL_ROTATE_XYZ: - if (mProject->AnyObjectsSelected(true)) + if (mProject->AnyPiecesSelected()) StartTracking(LC_TRACKBUTTON_LEFT); break; @@ -1856,7 +1856,7 @@ void View::OnRightButtonDown() case LC_TRACKTOOL_MOVE_XZ: case LC_TRACKTOOL_MOVE_YZ: case LC_TRACKTOOL_MOVE_XYZ: - if (mProject->AnyObjectsSelected(false)) + if (mProject->AnyObjectsSelected()) StartTracking(LC_TRACKBUTTON_RIGHT); break; @@ -1865,7 +1865,7 @@ void View::OnRightButtonDown() case LC_TRACKTOOL_ROTATE_Z: case LC_TRACKTOOL_ROTATE_XY: case LC_TRACKTOOL_ROTATE_XYZ: - if (mProject->AnyObjectsSelected(true)) + if (mProject->AnyPiecesSelected()) StartTracking(LC_TRACKBUTTON_RIGHT); break; diff --git a/qt/lc_qmainwindow.cpp b/qt/lc_qmainwindow.cpp index 2175927c..7b2265e0 100644 --- a/qt/lc_qmainwindow.cpp +++ b/qt/lc_qmainwindow.cpp @@ -70,7 +70,6 @@ lcQMainWindow::lcQMainWindow(QWidget *parent) if (Info) { - lcGetActiveProject()->SetCurrentPiece(Info); PiecePreview* Preview = (PiecePreview*)piecePreview->widget; gMainWindow->mPreviewWidget = Preview; Preview->SetCurrentPiece(Info); @@ -594,7 +593,6 @@ void lcQMainWindow::partsTreeItemChanged(QTreeWidgetItem *current, QTreeWidgetIt if (info) { - lcGetActiveProject()->SetCurrentPiece(info); PiecePreview* preview = (PiecePreview*)piecePreview->widget; preview->SetCurrentPiece(info); }