diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 8515d0b4..31dfd059 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -2313,7 +2313,7 @@ lcPiece* lcModel::AddPiece(PieceInfo* Info, quint32 Section) if (Last) { - std::vector TrainTracks; + std::vector TrainTracks; if (Info->GetTrainTrackInfo() && Last->mPieceInfo->GetTrainTrackInfo()) { @@ -2325,14 +2325,10 @@ lcPiece* lcModel::AddPiece(PieceInfo* Info, quint32 Section) if (!Last->IsFocused()) UpdateTrainTrackConnections(Last, false); - TrainTracks = lcTrainTrackInfo::GetPieceInsertTransforms(Last, Info, Section, std::nullopt); + TrainTracks = lcTrainTrackInfo::GetInsertPieceInfo(Last, Info, gMainWindow->mColorIndex, Section, std::nullopt); - for (const lcPieceInfoTransform& TrainTrack : TrainTracks) - { - int ColorIndex = lcGetColorIndex(TrainTrack.Info->GetTrainTrackInfo()->GetColorCode()); - - CreatePiece(TrainTrack.Info, TrainTrack.Transform, ColorIndex); - } + for (const lcInsertPieceInfo& TrainTrack : TrainTracks) + CreatePiece(TrainTrack.Info, TrainTrack.Transform, TrainTrack.ColorIndex); } if (TrainTracks.empty()) @@ -4445,15 +4441,15 @@ void lcModel::EndMouseTool(lcTool Tool, bool Accept) } } -void lcModel::InsertPieceToolClicked(const std::vector& PieceInfoTransforms) +void lcModel::InsertPieceToolClicked(const std::vector& PieceInfoTransforms) { lcPiece* Piece = nullptr; - for (const lcPieceInfoTransform& PieceInfoTransform : PieceInfoTransforms) + for (const lcInsertPieceInfo& PieceInfoTransform : PieceInfoTransforms) { Piece = new lcPiece(PieceInfoTransform.Info); Piece->Initialize(PieceInfoTransform.Transform, mCurrentStep); - Piece->SetColorIndex(gMainWindow->mColorIndex); + Piece->SetColorIndex(PieceInfoTransform.ColorIndex); Piece->UpdatePosition(mCurrentStep); AddPiece(Piece); } diff --git a/common/lc_model.h b/common/lc_model.h index 643413b9..6ce43d0e 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -40,10 +40,11 @@ enum class lcTransformType Count }; -struct lcPieceInfoTransform +struct lcInsertPieceInfo { PieceInfo* Info; lcMatrix44 Transform; + int ColorIndex; }; class lcModelProperties @@ -339,7 +340,7 @@ public: void BeginMouseTool(); void EndMouseTool(lcTool Tool, bool Accept); - void InsertPieceToolClicked(const std::vector& PieceInfoTransforms); + void InsertPieceToolClicked(const std::vector& PieceInfoTransforms); void InsertLightToolClicked(const lcVector3& Position, lcLightType LightType); void BeginCameraTool(const lcVector3& Position, const lcVector3& Target); void UpdateCameraTool(const lcVector3& Position); diff --git a/common/lc_partselectionwidget.cpp b/common/lc_partselectionwidget.cpp index d93ef834..268dfa48 100644 --- a/common/lc_partselectionwidget.cpp +++ b/common/lc_partselectionwidget.cpp @@ -248,7 +248,7 @@ void lcPartSelectionListModel::SetCustomParts(const std::vector& Par Entry.Info = Part; if (lcTrainTrackInfo* TrainTrackInfo = Part->GetTrainTrackInfo()) - Entry.ColorIndex = lcGetColorIndex(TrainTrackInfo->GetColorCode()); + Entry.ColorIndex = mColorIndex; } auto lcPartSortFunc = [](const lcPartSelectionListModelEntry& a, const lcPartSelectionListModelEntry& b) diff --git a/common/lc_traintrack.cpp b/common/lc_traintrack.cpp index a71341d7..c3de2190 100644 --- a/common/lc_traintrack.cpp +++ b/common/lc_traintrack.cpp @@ -9,7 +9,6 @@ // todo: // when moving existing pieces, lcView::OnMouseMove calls UpdateMoveTool which only takes a position and can't rotate pieces // hide some of the 12v tracks to avoid bloat -// better insert gizmo mouse detection // auto replace cross when going over a straight section // set focus connection after adding @@ -132,9 +131,9 @@ int lcTrainTrackInfo::GetPieceConnectionIndex(const lcPiece* Piece1, int Connect return -1; } -std::vector lcTrainTrackInfo::GetPieceInsertTransforms(lcPiece* CurrentPiece, PieceInfo* Info, quint32 PreferredSection, std::optional ClosestPoint) +std::vector lcTrainTrackInfo::GetInsertPieceInfo(lcPiece* CurrentPiece, PieceInfo* Info, int ColorIndex, quint32 PreferredSection, std::optional ClosestPoint) { - std::vector Pieces; + std::vector Pieces; const lcTrainTrackInfo* CurrentTrackInfo = CurrentPiece->mPieceInfo->GetTrainTrackInfo(); if (!CurrentTrackInfo || CurrentTrackInfo->GetConnections().empty()) @@ -214,8 +213,8 @@ std::vector lcTrainTrackInfo::GetPieceInsertTransforms(lcP if (Transform) { - Pieces.emplace_back(lcPieceInfoTransform{ SleeperInfo, SleeperTransform.value() }); - Pieces.emplace_back(lcPieceInfoTransform{ Info, Transform.value() }); + Pieces.emplace_back(lcInsertPieceInfo{ SleeperInfo, SleeperTransform.value(), lcGetColorIndex(SleeperInfo->GetTrainTrackInfo()->GetColorCode()) }); + Pieces.emplace_back(lcInsertPieceInfo{ Info, Transform.value(), ColorIndex }); } } else @@ -223,7 +222,7 @@ std::vector lcTrainTrackInfo::GetPieceInsertTransforms(lcP std::optional Transform = GetConnectionTransform(CurrentPiece->mPieceInfo, CurrentPiece->mModelWorld, ConnectionIndex, Info, NewConnectionIndex); if (Transform) - Pieces.emplace_back(lcPieceInfoTransform{ Info, Transform.value() }); + Pieces.emplace_back(lcInsertPieceInfo{ Info, Transform.value(), ColorIndex }); } return Pieces; diff --git a/common/lc_traintrack.h b/common/lc_traintrack.h index e23a3fc3..2805c3dc 100644 --- a/common/lc_traintrack.h +++ b/common/lc_traintrack.h @@ -5,7 +5,7 @@ class lcPiece; class lcPiecesLibrary; class PieceInfo; -struct lcPieceInfoTransform; +struct lcInsertPieceInfo; enum class lcTrainTrackConnectionSleeper { @@ -45,7 +45,7 @@ public: } static void Initialize(lcPiecesLibrary* Library); - static std::vector GetPieceInsertTransforms(lcPiece* CurrentPiece, PieceInfo* Info, quint32 PreferredSection, std::optional ClosestPoint); + static std::vector GetInsertPieceInfo(lcPiece* CurrentPiece, PieceInfo* Info, int ColorIndex, quint32 PreferredSection, std::optional ClosestPoint); static std::optional GetConnectionTransform(PieceInfo* CurrentInfo, const lcMatrix44& CurrentTransform, quint32 CurrentConnectionIndex, PieceInfo* Info, quint32 NewConnectionIndex); static std::optional CalculateTransformToConnection(const lcMatrix44& ConnectionTransform, PieceInfo* Info, quint32 ConnectionIndex); static int GetPieceConnectionIndex(const lcPiece* Piece1, int ConnectionIndex1, const lcPiece* Piece2); diff --git a/common/lc_view.cpp b/common/lc_view.cpp index ce526c4b..712d1b90 100644 --- a/common/lc_view.cpp +++ b/common/lc_view.cpp @@ -51,14 +51,14 @@ lcView::lcView(lcViewType ViewType, lcModel* Model) lcView::~lcView() { - if (!mPreviewPieceInfoTransforms.empty()) + if (!mPreviewInsertPieceInfo.empty()) { lcPiecesLibrary* Library = lcGetPiecesLibrary(); - for (lcPieceInfoTransform &PreviewPieceInfoTransform : mPreviewPieceInfoTransforms) + for (lcInsertPieceInfo& PreviewPieceInfoTransform : mPreviewInsertPieceInfo) Library->ReleasePieceInfo(PreviewPieceInfoTransform.Info); - mPreviewPieceInfoTransforms.clear(); + mPreviewInsertPieceInfo.clear(); } mContext->DestroyVertexBuffer(mGridBuffer); @@ -462,31 +462,31 @@ lcVector3 lcView::GetMoveDirection(const lcVector3& Direction) const void lcView::UpdatePiecePreview() { PieceInfo* PreviewInfo = gMainWindow->GetCurrentPieceInfo(); - std::vector NewInfoTransform; + std::vector InsertPieceInfo; if (PreviewInfo) { - NewInfoTransform = GetPieceInsertTransform(false, PreviewInfo); + InsertPieceInfo = GetMouseInsertPieceInfo(false, PreviewInfo); if (GetActiveModel() != mModel) { - for (lcPieceInfoTransform &InfoTransform : NewInfoTransform) + for (lcInsertPieceInfo& InfoTransform : InsertPieceInfo) InfoTransform.Transform = lcMul(InfoTransform.Transform, mActiveSubmodelTransform); } } lcPiecesLibrary* Library = lcGetPiecesLibrary(); - for (lcPieceInfoTransform &InfoTransform : NewInfoTransform) + for (lcInsertPieceInfo& InfoTransform : InsertPieceInfo) Library->LoadPieceInfo(InfoTransform.Info, true, true); - for (lcPieceInfoTransform &PreviewPieceInfoTransform : mPreviewPieceInfoTransforms) + for (lcInsertPieceInfo& PreviewPieceInfoTransform : mPreviewInsertPieceInfo) Library->ReleasePieceInfo(PreviewPieceInfoTransform.Info); - mPreviewPieceInfoTransforms = std::move(NewInfoTransform); + mPreviewInsertPieceInfo = std::move(InsertPieceInfo); } -std::vector lcView::GetPieceInsertTransform(bool IgnoreSelected, PieceInfo* Info) const +std::vector lcView::GetMouseInsertPieceInfo(bool IgnoreSelected, PieceInfo* Info) const { lcModel* ActiveModel = GetActiveModel(); @@ -505,7 +505,7 @@ std::vector lcView::GetPieceInsertTransform(bool IgnoreSel lcVector3 ClosestPoint = ObjectRayTest.Start + lcNormalize(ObjectRayTest.End - ObjectRayTest.Start) * ObjectRayTest.Distance; quint32 FocusSection = MousePiece->GetFocusSection(); - std::vector TrainTracks = lcTrainTrackInfo::GetPieceInsertTransforms(MousePiece, Info, FocusSection, ClosestPoint); + std::vector TrainTracks = lcTrainTrackInfo::GetInsertPieceInfo(MousePiece, Info, gMainWindow->mColorIndex, FocusSection, ClosestPoint); if (!TrainTracks.empty()) return TrainTracks; @@ -534,7 +534,7 @@ std::vector lcView::GetPieceInsertTransform(bool IgnoreSel lcMatrix44 WorldMatrix = ObjectRayTest.PieceInfoRayTest.Transform; WorldMatrix.SetTranslation(Position); - return { { Info, WorldMatrix } }; + return { lcInsertPieceInfo{ Info, WorldMatrix, gMainWindow->mColorIndex } }; } std::array ClickPoints = {{ lcVector3((float)mMouseX, (float)mMouseY, 0.0f), lcVector3((float)mMouseX, (float)mMouseY, 1.0f) }}; @@ -554,7 +554,7 @@ std::vector lcView::GetPieceInsertTransform(bool IgnoreSel if (lcLineSegmentPlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(0, 0, 1, BoundingBox.Min.z))) { Intersection = ActiveModel->SnapPosition(Intersection); - return { { Info, lcMatrix44Translation(Intersection) } }; + return { lcInsertPieceInfo{ Info, lcMatrix44Translation(Intersection), gMainWindow->mColorIndex } }; } lcVector3 Position; @@ -567,10 +567,10 @@ std::vector lcView::GetPieceInsertTransform(bool IgnoreSel if (lcLineSegmentPlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(FrontVector, -lcDot(FrontVector, Position)))) { Intersection = ActiveModel->SnapPosition(Intersection); - return { { Info, lcMatrix44Translation(Intersection) } }; + return { lcInsertPieceInfo{ Info, lcMatrix44Translation(Intersection), gMainWindow->mColorIndex } }; } - return { { Info, lcMatrix44Translation(UnprojectPoint(lcVector3((float)mMouseX, (float)mMouseY, 0.9f))) } }; + return { lcInsertPieceInfo{ Info, lcMatrix44Translation(UnprojectPoint(lcVector3((float)mMouseX, (float)mMouseY, 0.9f))), gMainWindow->mColorIndex } }; } lcVector3 lcView::GetCameraLightInsertPosition() const @@ -879,8 +879,8 @@ void lcView::OnDraw() { UpdatePiecePreview(); - for (const lcPieceInfoTransform &PreviewPieceInfoTransform : mPreviewPieceInfoTransforms) - PreviewPieceInfoTransform.Info->AddRenderMeshes(mScene.get(), PreviewPieceInfoTransform.Transform, gMainWindow->mColorIndex, lcRenderMeshState::Focused, false); + for (const lcInsertPieceInfo& PreviewPieceInfoTransform : mPreviewInsertPieceInfo) + PreviewPieceInfoTransform.Info->AddRenderMeshes(mScene.get(), PreviewPieceInfoTransform.Transform, PreviewPieceInfoTransform.ColorIndex, lcRenderMeshState::Focused, false); } if (DrawInterface) @@ -1447,14 +1447,14 @@ void lcView::DrawGrid() if (mTrackTool == lcTrackTool::Insert) { - for (const lcPieceInfoTransform &PreviewPieceInfoTransform : mPreviewPieceInfoTransforms) + for (const lcInsertPieceInfo& PreviewInsertPieceInfo : mPreviewInsertPieceInfo) { lcVector3 Points[8]; - lcGetBoxCorners(PreviewPieceInfoTransform.Info->GetBoundingBox(), Points); + lcGetBoxCorners(PreviewInsertPieceInfo.Info->GetBoundingBox(), Points); for (int i = 0; i < 8; i++) { - lcVector3 Point = lcMul31(Points[i], PreviewPieceInfoTransform.Transform); + lcVector3 Point = lcMul31(Points[i], PreviewInsertPieceInfo.Transform); Min = lcMin(Point, Min); Max = lcMax(Point, Max); @@ -1707,10 +1707,8 @@ void lcView::EndDrag(bool Accept) case lcDragState::Piece: { - PieceInfo* Info = gMainWindow->GetCurrentPieceInfo(); - - if (Info) - ActiveModel->InsertPieceToolClicked(GetPieceInsertTransform(false, Info)); + if (!mPreviewInsertPieceInfo.empty()) + ActiveModel->InsertPieceToolClicked(mPreviewInsertPieceInfo); } break; case lcDragState::Color: @@ -2506,14 +2504,14 @@ void lcView::OnButtonDown(lcTrackButton TrackButton) { UpdatePiecePreview(); - if (mPreviewPieceInfoTransforms.empty()) + if (mPreviewInsertPieceInfo.empty()) break; if (GetActiveModel() != mModel) - for (lcPieceInfoTransform& PreviewPieceInfoTransform : mPreviewPieceInfoTransforms) + for (lcInsertPieceInfo& PreviewPieceInfoTransform : mPreviewInsertPieceInfo) PreviewPieceInfoTransform.Transform = lcMul(PreviewPieceInfoTransform.Transform, lcMatrix44AffineInverse(mActiveSubmodelTransform)); - ActiveModel->InsertPieceToolClicked(mPreviewPieceInfoTransforms); + ActiveModel->InsertPieceToolClicked(mPreviewInsertPieceInfo); if ((mMouseModifiers & Qt::ControlModifier) == 0) gMainWindow->SetTool(lcTool::Select); @@ -2928,7 +2926,7 @@ void lcView::OnMouseMove() } else if (mTrackTool == lcTrackTool::MoveXYZ && mMouseDownPiece) { - std::vector PieceInfoTransforms = GetPieceInsertTransform(true, mMouseDownPiece); + std::vector PieceInfoTransforms = GetMouseInsertPieceInfo(true, mMouseDownPiece); if (!PieceInfoTransforms.empty()) { diff --git a/common/lc_view.h b/common/lc_view.h index 52e157d0..f4de30c2 100644 --- a/common/lc_view.h +++ b/common/lc_view.h @@ -4,7 +4,7 @@ #include "lc_math.h" #include "lc_commands.h" -struct lcPieceInfoTransform; +struct lcInsertPieceInfo; enum class lcDragState { @@ -266,7 +266,7 @@ public: float GetOverlayScale() const; lcVector3 GetMoveDirection(const lcVector3& Direction) const; void UpdatePiecePreview(); - std::vector GetPieceInsertTransform(bool IgnoreSelected, PieceInfo* Info) const; + std::vector GetMouseInsertPieceInfo(bool IgnoreSelected, PieceInfo* Info) const; lcVector3 GetCameraLightInsertPosition() const; void GetRayUnderPointer(lcVector3& Start, lcVector3& End) const; lcObjectRayTest RayTest(bool PiecesOnly, bool IgnoreSelected) const; @@ -357,7 +357,7 @@ protected: lcCamera* mCamera = nullptr; - std::vector mPreviewPieceInfoTransforms; + std::vector mPreviewInsertPieceInfo; lcVertexBuffer mGridBuffer; int mGridSettings[7];