diff --git a/common/lc_traintrack.cpp b/common/lc_traintrack.cpp
index bc731e9b..86f6e3ee 100644
--- a/common/lc_traintrack.cpp
+++ b/common/lc_traintrack.cpp
@@ -7,80 +7,50 @@
// todo:
// auto replace cross when going over a straight section
-// move config to json
// add other track types
// set focus connection after adding
void lcTrainTrackInit(lcPiecesLibrary* Library)
{
- PieceInfo* Info = Library->FindPiece("74746.dat", nullptr, false, false);
+ QFile ConfigFile(QLatin1String(":/resources/traintrack.json"));
- if (Info)
+ if (!ConfigFile.open(QIODevice::ReadOnly))
+ return;
+
+ QJsonDocument Document = QJsonDocument::fromJson(ConfigFile.readAll());
+ QJsonObject Root = Document.object();
+
+ if (Root["Version"].toInt() != 1)
+ return;
+
+ QJsonObject JsonPieces = Root["Pieces"].toObject();
+
+ for (QJsonObject::const_iterator PiecesIt = JsonPieces.constBegin(); PiecesIt != JsonPieces.constEnd(); ++PiecesIt)
{
+ PieceInfo* Info = Library->FindPiece(PiecesIt.key().toLatin1(), nullptr, false, false);
+
+ if (!Info)
+ continue;
+
lcTrainTrackInfo* TrainTrackInfo = new lcTrainTrackInfo();
- TrainTrackInfo->AddConnection(lcMatrix44Translation(lcVector3(160.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(LC_PI), lcVector3(-160.0f, 0.0f, 0.0f)), 0);
-
Info->SetTrainTrackInfo(TrainTrackInfo);
- }
- Info = Library->FindPiece("74747.dat", nullptr, false, false);
+ QJsonObject JsonPiece = PiecesIt->toObject();
+ QJsonArray JsonConnections = JsonPiece["Connections"].toArray();
- if (Info)
- {
- lcTrainTrackInfo* TrainTrackInfo = new lcTrainTrackInfo();
+ for (QJsonArray::const_iterator ConnectionIt = JsonConnections.constBegin(); ConnectionIt != JsonConnections.constEnd(); ++ConnectionIt)
+ {
+ QJsonObject JsonConnection = ConnectionIt->toObject();
- const float CurveX = sinf(LC_DTOR * 11.25f) * 800.0f;
- const float CurveY = (cosf(LC_DTOR * 11.25f) * 800.0f) - 800.0f;
+ QJsonArray JsonPosition = JsonConnection["Position"].toArray();
+ lcVector3 Position(JsonPosition[0].toDouble(), JsonPosition[1].toDouble(), JsonPosition[2].toDouble());
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(-11.25f * LC_DTOR), lcVector3(CurveX, CurveY, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(-168.75f * LC_DTOR), lcVector3(-CurveX, CurveY, 0.0f)), 0);
+ float Rotation = JsonConnection["Rotation"].toDouble() * LC_DTOR;
+ quint32 Type = qHash(JsonConnection["Type"].toString());
- Info->SetTrainTrackInfo(TrainTrackInfo);
- }
-
- const float BranchX = 320.0f + 320.0f + (-(sinf(LC_DTOR * 22.5f) * 800.0f));
- const float BranchY = 320.0f + ((cosf(LC_DTOR * 22.5f) * 800.0f) - 800.0f);
-
- Info = Library->FindPiece("2861c04.dat", nullptr, false, false);
-
- if (Info)
- {
- lcTrainTrackInfo* TrainTrackInfo = new lcTrainTrackInfo();
-
- TrainTrackInfo->AddConnection(lcMatrix44Translation(lcVector3(320.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(LC_PI), lcVector3(-320.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(22.5f * LC_DTOR), lcVector3(BranchX, BranchY, 0.0f)), 0);
-
- Info->SetTrainTrackInfo(TrainTrackInfo);
- }
-
- Info = Library->FindPiece("2859c04.dat", nullptr, false, false);
-
- if (Info)
- {
- lcTrainTrackInfo* TrainTrackInfo = new lcTrainTrackInfo();
-
- TrainTrackInfo->AddConnection(lcMatrix44Translation(lcVector3(320.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(LC_PI), lcVector3(-320.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(-22.5f * LC_DTOR), lcVector3(BranchX, -BranchY, 0.0f)), 0);
-
- Info->SetTrainTrackInfo(TrainTrackInfo);
- }
-
- Info = Library->FindPiece("32087.dat", nullptr, false, false);
-
- if (Info)
- {
- lcTrainTrackInfo* TrainTrackInfo = new lcTrainTrackInfo();
-
- TrainTrackInfo->AddConnection(lcMatrix44Translation(lcVector3(160.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(LC_PI / 2.0f), lcVector3(0.0f, 160.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(LC_PI), lcVector3(-160.0f, 0.0f, 0.0f)), 0);
- TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(-LC_PI / 2.0f), lcVector3(0.0f, -160.0f, 0.0f)), 0);
-
- Info->SetTrainTrackInfo(TrainTrackInfo);
+ TrainTrackInfo->AddConnection(lcMatrix44(lcMatrix33RotationZ(Rotation), Position), Type);
+ }
}
}
diff --git a/leocad.qrc b/leocad.qrc
index 4c43e621..9d3cd777 100644
--- a/leocad.qrc
+++ b/leocad.qrc
@@ -123,6 +123,7 @@
resources/minifig.ini
resources/ldraw.xml
resources/ldraw2bl.txt
+ resources/traintrack.json
resources/leocad_fr.qm
resources/leocad_pt.qm
resources/leocad_de.qm
diff --git a/resources/traintrack.json b/resources/traintrack.json
new file mode 100644
index 00000000..5eb619a8
--- /dev/null
+++ b/resources/traintrack.json
@@ -0,0 +1,106 @@
+{
+ "Version": 1,
+ "Pieces":
+ {
+ "2859c04.dat":
+ {
+ "Connections":
+ [
+ {
+ "Position": [ 320.0, 0.0, 0.0 ],
+ "Rotation": 0,
+ "Type": "9V"
+ },
+ {
+ "Position": [ -320.0, 0.0, 0.0 ],
+ "Rotation": 180,
+ "Type": "9V"
+ },
+ {
+ "Position": [ 333.85324096679688, -259.10357666015625, 0.0 ],
+ "Rotation": -22.5,
+ "Type": "9V"
+ }
+ ]
+ },
+ "2861c04.dat":
+ {
+ "Connections":
+ [
+ {
+ "Position": [ 320.0, 0.0, 0.0 ],
+ "Rotation": 0,
+ "Type": "9V"
+ },
+ {
+ "Position": [ -320.0, 0.0, 0.0 ],
+ "Rotation": 180,
+ "Type": "9V"
+ },
+ {
+ "Position": [ 333.85324096679688, 259.10357666015625, 0.0 ],
+ "Rotation": 22.5,
+ "Type": "9V"
+ }
+ ]
+ },
+ "32087.dat":
+ {
+ "Connections":
+ [
+ {
+ "Position": [ 160.0, 0.0, 0.0 ],
+ "Rotation": 0,
+ "Type": "9V"
+ },
+ {
+ "Position": [ 0.0, 160.0, 0.0 ],
+ "Rotation": 90,
+ "Type": "9V"
+ },
+ {
+ "Position": [ -160.0, 0.0, 0.0 ],
+ "Rotation": 180,
+ "Type": "9V"
+ },
+ {
+ "Position": [ 0.0, -160.0, 0.0 ],
+ "Rotation": -90,
+ "Type": "9V"
+ }
+ ]
+ },
+ "74746.dat":
+ {
+ "Connections":
+ [
+ {
+ "Position": [ 160.0, 0.0, 0.0 ],
+ "Rotation": 0.0,
+ "Type": "9V"
+ },
+ {
+ "Position": [ -160.0, 0.0, 0.0 ],
+ "Rotation": 180.0,
+ "Type": "9V"
+ }
+ ]
+ },
+ "74747.dat":
+ {
+ "Connections":
+ [
+ {
+ "Position": [ 156.072265625, -15.371826171875, 0.0 ],
+ "Rotation": -11.25,
+ "Type": "9V"
+ },
+ {
+ "Position": [ -156.072265625, -15.371826171875, 0.0 ],
+ "Rotation": -168.75,
+ "Type": "9V"
+ }
+ ]
+ }
+ }
+}