Fixed color inconsistencies between the different way of adding train tracks.
This commit is contained in:
+7
-11
@@ -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
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user