board: added tunnel tile

Dieser Commit ist enthalten in:
Reinder Feenstra 2021-09-05 21:52:10 +02:00
Ursprung 5249fe89b6
Commit bf08369357
16 geänderte Dateien mit 268 neuen und 2 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
viewBox="0 0 25.399999 25.400001"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="board_tile.rail.tunnel.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="29.457824"
inkscape:cy="31.95405"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1015"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid3713"
spacingx="0.26458333"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-nc/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-nc/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:prohibits
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-271.59998)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:24;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 36.001953 -0.001953125 L 36.001953 9.0253906 C 39.904201 7.8305339 43.948566 7.2246094 47.996094 7.2246094 C 52.045421 7.2246094 56.094449 7.8314231 60 9.0273438 L 60 -0.001953125 L 36.001953 -0.001953125 z M 47.996094 13.212891 C 40.521859 13.212891 33.054785 15.609158 26.818359 20.394531 C 14.345507 29.965316 9.8331809 46.795361 15.849609 61.320312 A 6.0005998 6.0005998 0 1 0 26.935547 56.728516 C 22.975386 47.167823 25.909202 36.209873 34.119141 29.910156 C 42.32908 23.61044 53.672874 23.61044 61.882812 29.910156 C 70.092751 36.209873 73.024612 47.167823 69.064453 56.728516 A 6.0005998 6.0005998 0 1 0 80.152344 61.320312 C 86.168773 46.795361 81.656443 29.965316 69.183594 20.394531 C 62.947165 15.609158 55.470329 13.212891 47.996094 13.212891 z M 48 31.173828 C 44.405816 31.173828 40.812676 32.339774 37.773438 34.671875 C 37.135901 35.161072 36.551655 35.693909 36.001953 36.251953 L 36.001953 96 L 60 96 L 60 36.251953 C 59.450114 35.693659 58.866308 35.161268 58.228516 34.671875 C 55.189275 32.339774 51.594184 31.173828 48 31.173828 z "
transform="matrix(0.26458333,0,0,0.26458333,0,271.59998)"
id="path935" />
</g>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 4.8 KiB

Datei anzeigen

@ -70,5 +70,6 @@
<file>board_tile.rail.bridge_45_left.svg</file>
<file>board_tile.rail.bridge_45_right.svg</file>
<file>board_tile.rail.sensor.svg</file>
<file>board_tile.rail.tunnel.svg</file>
</qresource>
</RCC>

Datei anzeigen

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
viewBox="0 0 25.399999 25.400001"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="board_tile.rail.tunnel.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="29.457824"
inkscape:cy="31.95405"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1015"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid3713"
spacingx="0.26458333"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-nc/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-nc/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:prohibits
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-271.59998)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#404040;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:24;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 36.001953 -0.001953125 L 36.001953 9.0253906 C 39.904201 7.8305339 43.948566 7.2246094 47.996094 7.2246094 C 52.045421 7.2246094 56.094449 7.8314231 60 9.0273438 L 60 -0.001953125 L 36.001953 -0.001953125 z M 47.996094 13.212891 C 40.521859 13.212891 33.054785 15.609158 26.818359 20.394531 C 14.345507 29.965316 9.8331809 46.795361 15.849609 61.320312 A 6.0005998 6.0005998 0 1 0 26.935547 56.728516 C 22.975386 47.167823 25.909202 36.209873 34.119141 29.910156 C 42.32908 23.61044 53.672874 23.61044 61.882812 29.910156 C 70.092751 36.209873 73.024612 47.167823 69.064453 56.728516 A 6.0005998 6.0005998 0 1 0 80.152344 61.320312 C 86.168773 46.795361 81.656443 29.965316 69.183594 20.394531 C 62.947165 15.609158 55.470329 13.212891 47.996094 13.212891 z M 48 31.173828 C 44.405816 31.173828 40.812676 32.339774 37.773438 34.671875 C 37.135901 35.161072 36.551655 35.693909 36.001953 36.251953 L 36.001953 96 L 60 96 L 60 36.251953 C 59.450114 35.693659 58.866308 35.161268 58.228516 34.671875 C 55.189275 32.339774 51.594184 31.173828 48 31.173828 z "
transform="matrix(0.26458333,0,0,0.26458333,0,271.59998)"
id="path935" />
</g>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 4.8 KiB

Datei anzeigen

@ -47,5 +47,6 @@
<file>board_tile.rail.bridge_45_left.svg</file>
<file>board_tile.rail.bridge_45_right.svg</file>
<file>board_tile.rail.sensor.svg</file>
<file>board_tile.rail.tunnel.svg</file>
</qresource>
</RCC>

Datei anzeigen

@ -444,6 +444,7 @@ void BoardAreaWidget::paintEvent(QPaintEvent* event)
case TileId::RailBridge45Right:
case TileId::RailBridge90:
case TileId::RailBufferStop:
case TileId::RailTunnel:
tilePainter.draw(id, r, a);
break;

Datei anzeigen

@ -49,9 +49,10 @@ struct TileInfo
uint8_t rotates;
};
const std::array<TileInfo, 29> tileInfo = {
const std::array<TileInfo, 30> tileInfo = {
TileInfo{QStringLiteral("board_tile.rail.straight"), TileId::RailStraight, 0xFF},
TileInfo{QStringLiteral("board_tile.rail.buffer_stop"), TileId::RailBufferStop, 0xFF},
TileInfo{QStringLiteral("board_tile.rail.tunnel"), TileId::RailTunnel, 0xFF},
TileInfo{QStringLiteral(""), TileId::None, 0},
TileInfo{QStringLiteral("board_tile.rail.curve_45"), TileId::RailCurve45, 0xFF},
TileInfo{QStringLiteral("board_tile.rail.curve_90"), TileId::RailCurve90, 0xFF},

Datei anzeigen

@ -125,6 +125,23 @@ void TilePainter::draw(TileId id, const QRectF& r, TileRotate rotate)
drawBlock(id, r, rotate);
break;
case TileId::RailTunnel:
{
setTrackPen();
drawStraight(r, rotate);
// tunnel arc:
const int angle = -toDeg(rotate) * 16 - 45 * 8; // - 22.5 deg
const int angleLength = 225 * 16; // 225 deg
const qreal m = r.width() / 5;
const QRectF rArc = r.adjusted(m, m, -m, -m);
m_painter.setPen(QPen(backgroundColor, m_trackWidth, Qt::SolidLine, Qt::FlatCap));
m_painter.drawArc(rArc, angle, angleLength);
m_painter.setPen(QPen(trackColor, m_trackWidth / 2., Qt::SolidLine, Qt::FlatCap));
m_painter.drawArc(rArc, angle, angleLength);
break;
}
case TileId::None:
case TileId::ReservedForFutureExpension:
break;

Datei anzeigen

@ -3,6 +3,7 @@
## Rail tiles {#tiles-rail}
- ![](../../gfx/board/tiles/board_tile.rail.straight.png) Straight
- ![](../../gfx/board/tiles/board_tile.rail.buffer_stop.png) Buffer stop
- ![](../../gfx/board/tiles/board_tile.rail.tunnel.png) Tunnel
- ![](../../gfx/board/tiles/board_tile.rail.curve_45.png) Curve 45°
- ![](../../gfx/board/tiles/board_tile.rail.curve_90.png) Curve 90°
- ![](../../gfx/board/tiles/board_tile.rail.cross_45.png) Crossover 45°

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 660 B

Datei anzeigen

@ -0,0 +1,28 @@
/**
* server/src/board/tile/rail/tunnelrailtile.cpp
*
* This file is part of the traintastic source code.
*
* Copyright (C) 2021 Reinder Feenstra
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "tunnelrailtile.hpp"
TunnelRailTile::TunnelRailTile(const std::weak_ptr<World>& world, std::string_view _id)
: StraightRailTile(world, _id, TileId::RailTunnel)
{
}

Datei anzeigen

@ -0,0 +1,37 @@
/**
* server/src/board/tile/rail/tunnelrailtile.hpp
*
* This file is part of the traintastic source code.
*
* Copyright (C) 2021 Reinder Feenstra
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef TRAINTASTIC_SERVER_BOARD_TILE_RAIL_TUNNELRAILTILE_HPP
#define TRAINTASTIC_SERVER_BOARD_TILE_RAIL_TUNNELRAILTILE_HPP
#include "straightrailtile.hpp"
class TunnelRailTile : public StraightRailTile
{
CLASS_ID("board_tile.rail.tunnel")
CREATE(TunnelRailTile)
public:
TunnelRailTile(const std::weak_ptr<World>& world, std::string_view _id);
};
#endif

Datei anzeigen

@ -49,5 +49,6 @@ std::shared_ptr<Tile> Tiles::create(const std::shared_ptr<World>& world, std::st
IF_CLASSID_CREATE(BufferStopRailTile)
IF_CLASSID_CREATE(SensorRailTile)
IF_CLASSID_CREATE(BlockRailTile)
IF_CLASSID_CREATE(TunnelRailTile)
return std::shared_ptr<Tile>();
}

Datei anzeigen

@ -48,6 +48,7 @@
#include "rail/bufferstoprailtile.hpp"
#include "rail/sensorrailtile.hpp"
#include "rail/blockrailtile.hpp"
#include "rail/tunnelrailtile.hpp"
struct Tiles
{
@ -76,7 +77,8 @@ struct Tiles
Signal3AspectRailTile::classId,
BufferStopRailTile::classId,
SensorRailTile::classId,
BlockRailTile::classId
BlockRailTile::classId,
TunnelRailTile::classId
);
static std::shared_ptr<Tile> create(const std::shared_ptr<World>& world, std::string_view classId, std::string_view id = {});

Datei anzeigen

@ -47,6 +47,7 @@
#include "../src/board/tile/rail/bufferstoprailtile.hpp"
#include "../src/board/tile/rail/sensorrailtile.hpp"
#include "../src/board/tile/rail/blockrailtile.hpp"
#include "../src/board/tile/rail/tunnelrailtile.hpp"
TEST_CASE("Board: Add non existing tile", "[board][board-add]")
{
@ -80,6 +81,7 @@ TEMPLATE_TEST_CASE("Board: Add tile", "[board][board-add]"
, BufferStopRailTile
, SensorRailTile
, BlockRailTile
, TunnelRailTile
)
{
auto world = World::create();

Datei anzeigen

@ -51,6 +51,7 @@ enum class TileId : uint16_t // 10 bit
RailBridge45Left = 21,
RailBridge45Right = 22,
RailBridge90 = 23,
RailTunnel = 24,
ReservedForFutureExpension = 1023
};

Datei anzeigen

@ -46,6 +46,7 @@ class_id:board_tile.rail.signal_2aspect=Signal 2 aspect
class_id:board_tile.rail.signal_3_aspect=Signal (3 aspects)
class_id:board_tile.rail.signal_3aspect=Signal 3 aspect
class_id:board_tile.rail.straight=Straight track
class_id:board_tile.rail.tunnel=Tunnel
class_id:board_tile.rail.turnout_3way=Turnout 3-way
class_id:board_tile.rail.turnout_doubleslip=Double slip
class_id:board_tile.rail.turnout_left_45=Turnout left 45°