From f80b5c95e13a1af9081dde9ead032aa1f7e22604 Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Tue, 26 Nov 2024 15:53:50 -0800 Subject: [PATCH] Code cleanup. --- common/lc_model.cpp | 23 ++++++++++++++--------- common/lc_traintrack.cpp | 37 ++++++++++++++++++++++++++----------- common/lc_traintrack.h | 4 ++-- common/lc_view.cpp | 10 +++++----- common/lc_view.h | 2 +- 5 files changed, 48 insertions(+), 28 deletions(-) diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 7a624a92..c6e4cb09 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -2289,7 +2289,20 @@ void lcModel::AddPiece() if (Last) { - if (!PieceInfo->GetTrainTrackInfo() || !Last->mPieceInfo->GetTrainTrackInfo()) + bool TransformValid = false; + + if (PieceInfo->GetTrainTrackInfo() && Last->mPieceInfo->GetTrainTrackInfo()) + { + std::optional TrainTrackTransform = lcTrainTrackInfo::GetPieceInsertTransform(Last, PieceInfo); + + if (TrainTrackTransform) + { + TransformValid = true; + WorldMatrix = TrainTrackTransform.value(); + } + } + + if (!TransformValid) { const lcBoundingBox& LastBoundingBox = Last->GetBoundingBox(); lcVector3 Dist(0, 0, LastBoundingBox.Max.z - PieceInfoBoundingBox.Min.z); @@ -2298,14 +2311,6 @@ void lcModel::AddPiece() WorldMatrix = Last->mModelWorld; WorldMatrix.SetTranslation(lcMul31(Dist, Last->mModelWorld)); } - else - { - lcTrainTrackInfo* CurrentTrackInfo = Last->mPieceInfo->GetTrainTrackInfo(); - std::optional TrainTrackTransform = CurrentTrackInfo->GetPieceInsertPosition(Last, PieceInfo); - - if (TrainTrackTransform) - WorldMatrix = TrainTrackTransform.value(); - } } else { diff --git a/common/lc_traintrack.cpp b/common/lc_traintrack.cpp index 5a1c4845..786dc27c 100644 --- a/common/lc_traintrack.cpp +++ b/common/lc_traintrack.cpp @@ -71,7 +71,7 @@ void lcTrainTrackInit(lcPiecesLibrary* Library) } } -std::pair lcTrainTrackInfo::GetPieceInsertPosition(lcPiece* Piece, quint32 ConnectionIndex, lcTrainTrackType TrainTrackType) const +std::pair lcTrainTrackInfo::GetPieceInsertTransform(lcPiece* Piece, quint32 ConnectionIndex, lcTrainTrackType TrainTrackType) const { if (ConnectionIndex >= mConnections.size()) return { nullptr, lcMatrix44Identity() }; @@ -111,36 +111,51 @@ std::pair lcTrainTrackInfo::GetPieceInsertPosition(lcPie return { Info, Transform }; } -std::optional lcTrainTrackInfo::GetPieceInsertPosition(lcPiece* Piece, PieceInfo* Info) const +std::optional lcTrainTrackInfo::GetPieceInsertTransform(lcPiece* CurrentPiece, PieceInfo* Info) { - quint32 FocusSection = Piece->GetFocusSection(); + if (!CurrentPiece || !Info) + return std::nullopt; + + const lcTrainTrackInfo* CurrentTrackInfo = CurrentPiece->mPieceInfo->GetTrainTrackInfo(); + + if (!CurrentTrackInfo || CurrentTrackInfo->GetConnections().empty()) + return std::nullopt; + + const quint32 FocusSection = CurrentPiece->GetFocusSection(); quint32 ConnectionIndex = 0; - if (FocusSection > LC_PIECE_SECTION_TRAIN_TRACK_CONNECTION_FIRST) + if (FocusSection == LC_PIECE_SECTION_POSITION || FocusSection == LC_PIECE_SECTION_INVALID) { + // todo: search model for open connection + } + else + { + if (FocusSection < LC_PIECE_SECTION_TRAIN_TRACK_CONNECTION_FIRST) + return std::nullopt; + ConnectionIndex = FocusSection - LC_PIECE_SECTION_TRAIN_TRACK_CONNECTION_FIRST; - if (ConnectionIndex >= mConnections.size()) - ConnectionIndex = 0; + if (ConnectionIndex >= CurrentTrackInfo->GetConnections().size()) + return std::nullopt; } - lcTrainTrackInfo* TrainTrackInfo = Info->GetTrainTrackInfo(); + lcTrainTrackInfo* NewTrackInfo = Info->GetTrainTrackInfo(); - if (!TrainTrackInfo || TrainTrackInfo->mConnections.empty()) + if (!NewTrackInfo || NewTrackInfo->mConnections.empty()) return std::nullopt; lcMatrix44 Transform; // if (TrainTrackType != lcTrainTrackType::Left) - Transform = TrainTrackInfo->mConnections[0].Transform; + Transform = NewTrackInfo->mConnections[0].Transform; // else // { // Transform = lcMatrix44AffineInverse(TrainTrackInfo->mConnections[0].Transform); // Transform = lcMul(Transform, lcMatrix44RotationZ(LC_PI)); // } - Transform = lcMul(Transform, mConnections[ConnectionIndex].Transform); - Transform = lcMul(Transform, Piece->mModelWorld); + Transform = lcMul(Transform, CurrentTrackInfo->GetConnections()[ConnectionIndex].Transform); + Transform = lcMul(Transform, CurrentPiece->mModelWorld); return Transform; } diff --git a/common/lc_traintrack.h b/common/lc_traintrack.h index b7ff5a47..ce3275ad 100644 --- a/common/lc_traintrack.h +++ b/common/lc_traintrack.h @@ -25,8 +25,8 @@ class lcTrainTrackInfo public: lcTrainTrackInfo() = default; - std::pair GetPieceInsertPosition(lcPiece* Piece, quint32 ConnectionIndex, lcTrainTrackType TrainTrackType) const; - std::optional GetPieceInsertPosition(lcPiece* Piece, PieceInfo* Info) const; + std::pair GetPieceInsertTransform(lcPiece* Piece, quint32 ConnectionIndex, lcTrainTrackType TrainTrackType) const; + static std::optional GetPieceInsertTransform(lcPiece* CurrentPiece, PieceInfo* Info); void AddConnection(const lcTrainTrackConnection& TrainTrackConnection) { diff --git a/common/lc_view.cpp b/common/lc_view.cpp index ca0cf8d5..81d2cf6a 100644 --- a/common/lc_view.cpp +++ b/common/lc_view.cpp @@ -437,7 +437,7 @@ void lcView::UpdatePiecePreview() quint32 ConnectionIndex = mTrackToolSection & 0xff; lcTrainTrackType TrainTrackType = static_cast((mTrackToolSection >> 8) & 0xff); - std::tie(PreviewInfo, mPiecePreviewTransform) = TrainTrackInfo->GetPieceInsertPosition(Piece, ConnectionIndex, TrainTrackType); + std::tie(PreviewInfo, mPiecePreviewTransform) = TrainTrackInfo->GetPieceInsertTransform(Piece, ConnectionIndex, TrainTrackType); } } @@ -447,7 +447,7 @@ void lcView::UpdatePiecePreview() if (PreviewInfo) { - mPiecePreviewTransform = GetPieceInsertPosition(false, PreviewInfo); + mPiecePreviewTransform = GetPieceInsertTransform(false, PreviewInfo); if (GetActiveModel() != mModel) mPiecePreviewTransform = lcMul(mPiecePreviewTransform, mActiveSubmodelTransform); @@ -468,7 +468,7 @@ void lcView::UpdatePiecePreview() } } -lcMatrix44 lcView::GetPieceInsertPosition(bool IgnoreSelected, PieceInfo* Info) const +lcMatrix44 lcView::GetPieceInsertTransform(bool IgnoreSelected, PieceInfo* Info) const { lcModel* ActiveModel = GetActiveModel(); @@ -1705,7 +1705,7 @@ void lcView::EndDrag(bool Accept) PieceInfo* Info = gMainWindow->GetCurrentPieceInfo(); if (Info) - ActiveModel->InsertPieceToolClicked(Info, GetPieceInsertPosition(false, Info)); + ActiveModel->InsertPieceToolClicked(Info, GetPieceInsertTransform(false, Info)); } break; case lcDragState::Color: @@ -2855,7 +2855,7 @@ void lcView::OnMouseMove() } else if (mTrackTool == lcTrackTool::MoveXYZ && mMouseDownPiece) { - lcMatrix44 NewPosition = GetPieceInsertPosition(true, mMouseDownPiece); + lcMatrix44 NewPosition = GetPieceInsertTransform(true, mMouseDownPiece); lcVector3 Distance = NewPosition.GetTranslation() - mMouseDownPosition; ActiveModel->UpdateMoveTool(Distance, false, mTrackButton != lcTrackButton::Left); } diff --git a/common/lc_view.h b/common/lc_view.h index 6463e096..a1cee772 100644 --- a/common/lc_view.h +++ b/common/lc_view.h @@ -260,7 +260,7 @@ public: float GetOverlayScale() const; lcVector3 GetMoveDirection(const lcVector3& Direction) const; void UpdatePiecePreview(); - lcMatrix44 GetPieceInsertPosition(bool IgnoreSelected, PieceInfo* Info) const; + lcMatrix44 GetPieceInsertTransform(bool IgnoreSelected, PieceInfo* Info) const; lcVector3 GetCameraLightInsertPosition() const; void GetRayUnderPointer(lcVector3& Start, lcVector3& End) const; lcObjectSection FindObjectUnderPointer(bool PiecesOnly, bool IgnoreSelected) const;