#ifndef RAILLINKS_H #define RAILLINKS_H #include "collection.hpp" #include "game/worldobject.h" #include "gfx/models/mesh.h" #include "gfx/models/vertex.hpp" #include "gfx/renderable.h" #include "link.h" #include #include #include #include class Shader; class Texture; // A piece of rail track class RailLink : public Link, public Renderable { public: using Link::Link; void render(const Shader &) const override; protected: RailLink(); Collection meshes; std::vector vertices; std::vector indices; }; class RailLinkStraight : public RailLink { public: RailLinkStraight(End, End); }; class RailLinkCurve : public RailLink { public: RailLinkCurve(End, End, glm::vec2); private: glm::vec2 centre; }; template concept RailLinkConcept = std::is_base_of_v; class RailLinks : public Renderable, public WorldObject { public: RailLinks(); template std::shared_ptr addLink(glm::vec3, glm::vec3); template std::shared_ptr addLink(glm::vec3, glm::vec3, glm::vec2); private: using Nodes = std::set>; Collection links; Nodes nodes; void render(const Shader &) const override; void tick(TickDuration elapsed) override; std::shared_ptr texture; }; #endif