Fixed color inconsistencies between the different way of adding train tracks.

This commit is contained in:
Leonardo Zide
2025-05-01 20:22:09 -07:00
parent 354b24f4e0
commit 6059442c6a
7 changed files with 47 additions and 53 deletions
+7 -11
View File
@@ -2313,7 +2313,7 @@ lcPiece* lcModel::AddPiece(PieceInfo* Info, quint32 Section)
if (Last)
{
std::vector<lcPieceInfoTransform> TrainTracks;
std::vector<lcInsertPieceInfo> 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<lcPieceInfoTransform>& PieceInfoTransforms)
void lcModel::InsertPieceToolClicked(const std::vector<lcInsertPieceInfo>& 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);
}
+3 -2
View File
@@ -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<lcPieceInfoTransform>& PieceInfoTransforms);
void InsertPieceToolClicked(const std::vector<lcInsertPieceInfo>& PieceInfoTransforms);
void InsertLightToolClicked(const lcVector3& Position, lcLightType LightType);
void BeginCameraTool(const lcVector3& Position, const lcVector3& Target);
void UpdateCameraTool(const lcVector3& Position);
+1 -1
View File
@@ -248,7 +248,7 @@ void lcPartSelectionListModel::SetCustomParts(const std::vector<PieceInfo*>& 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)
+5 -6
View File
@@ -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<lcPieceInfoTransform> lcTrainTrackInfo::GetPieceInsertTransforms(lcPiece* CurrentPiece, PieceInfo* Info, quint32 PreferredSection, std::optional<lcVector3> ClosestPoint)
std::vector<lcInsertPieceInfo> lcTrainTrackInfo::GetInsertPieceInfo(lcPiece* CurrentPiece, PieceInfo* Info, int ColorIndex, quint32 PreferredSection, std::optional<lcVector3> ClosestPoint)
{
std::vector<lcPieceInfoTransform> Pieces;
std::vector<lcInsertPieceInfo> Pieces;
const lcTrainTrackInfo* CurrentTrackInfo = CurrentPiece->mPieceInfo->GetTrainTrackInfo();
if (!CurrentTrackInfo || CurrentTrackInfo->GetConnections().empty())
@@ -214,8 +213,8 @@ std::vector<lcPieceInfoTransform> 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<lcPieceInfoTransform> lcTrainTrackInfo::GetPieceInsertTransforms(lcP
std::optional<lcMatrix44> 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;
+2 -2
View File
@@ -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<lcPieceInfoTransform> GetPieceInsertTransforms(lcPiece* CurrentPiece, PieceInfo* Info, quint32 PreferredSection, std::optional<lcVector3> ClosestPoint);
static std::vector<lcInsertPieceInfo> GetInsertPieceInfo(lcPiece* CurrentPiece, PieceInfo* Info, int ColorIndex, quint32 PreferredSection, std::optional<lcVector3> ClosestPoint);
static std::optional<lcMatrix44> GetConnectionTransform(PieceInfo* CurrentInfo, const lcMatrix44& CurrentTransform, quint32 CurrentConnectionIndex, PieceInfo* Info, quint32 NewConnectionIndex);
static std::optional<lcMatrix44> CalculateTransformToConnection(const lcMatrix44& ConnectionTransform, PieceInfo* Info, quint32 ConnectionIndex);
static int GetPieceConnectionIndex(const lcPiece* Piece1, int ConnectionIndex1, const lcPiece* Piece2);
+26 -28
View File
@@ -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<lcPieceInfoTransform> NewInfoTransform;
std::vector<lcInsertPieceInfo> 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<lcPieceInfoTransform> lcView::GetPieceInsertTransform(bool IgnoreSelected, PieceInfo* Info) const
std::vector<lcInsertPieceInfo> lcView::GetMouseInsertPieceInfo(bool IgnoreSelected, PieceInfo* Info) const
{
lcModel* ActiveModel = GetActiveModel();
@@ -505,7 +505,7 @@ std::vector<lcPieceInfoTransform> lcView::GetPieceInsertTransform(bool IgnoreSel
lcVector3 ClosestPoint = ObjectRayTest.Start + lcNormalize(ObjectRayTest.End - ObjectRayTest.Start) * ObjectRayTest.Distance;
quint32 FocusSection = MousePiece->GetFocusSection();
std::vector<lcPieceInfoTransform> TrainTracks = lcTrainTrackInfo::GetPieceInsertTransforms(MousePiece, Info, FocusSection, ClosestPoint);
std::vector<lcInsertPieceInfo> TrainTracks = lcTrainTrackInfo::GetInsertPieceInfo(MousePiece, Info, gMainWindow->mColorIndex, FocusSection, ClosestPoint);
if (!TrainTracks.empty())
return TrainTracks;
@@ -534,7 +534,7 @@ std::vector<lcPieceInfoTransform> lcView::GetPieceInsertTransform(bool IgnoreSel
lcMatrix44 WorldMatrix = ObjectRayTest.PieceInfoRayTest.Transform;
WorldMatrix.SetTranslation(Position);
return { { Info, WorldMatrix } };
return { lcInsertPieceInfo{ Info, WorldMatrix, gMainWindow->mColorIndex } };
}
std::array<lcVector3, 2> ClickPoints = {{ lcVector3((float)mMouseX, (float)mMouseY, 0.0f), lcVector3((float)mMouseX, (float)mMouseY, 1.0f) }};
@@ -554,7 +554,7 @@ std::vector<lcPieceInfoTransform> 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<lcPieceInfoTransform> 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<lcPieceInfoTransform> PieceInfoTransforms = GetPieceInsertTransform(true, mMouseDownPiece);
std::vector<lcInsertPieceInfo> PieceInfoTransforms = GetMouseInsertPieceInfo(true, mMouseDownPiece);
if (!PieceInfoTransforms.empty())
{
+3 -3
View File
@@ -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<lcPieceInfoTransform> GetPieceInsertTransform(bool IgnoreSelected, PieceInfo* Info) const;
std::vector<lcInsertPieceInfo> 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<lcPieceInfoTransform> mPreviewPieceInfoTransforms;
std::vector<lcInsertPieceInfo> mPreviewInsertPieceInfo;
lcVertexBuffer mGridBuffer;
int mGridSettings[7];