summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game/network/rail.cpp22
-rw-r--r--game/network/rail.h11
2 files changed, 15 insertions, 18 deletions
diff --git a/game/network/rail.cpp b/game/network/rail.cpp
index 133b80c..c84f97f 100644
--- a/game/network/rail.cpp
+++ b/game/network/rail.cpp
@@ -2,7 +2,7 @@
#include "network.h"
#include <GL/glew.h>
#include <array>
-#include <cassert>
+#include <collection.hpp>
#include <game/network/link.h>
#include <game/network/network.impl.h> // IWYU pragma: keep
#include <gfx/models/vertex.hpp>
@@ -12,6 +12,7 @@
#include <maths.h>
#include <stdexcept>
#include <utility>
+#include <vector>
template class NetworkOf<RailLink>;
@@ -102,23 +103,22 @@ RailLinks::addLinksBetween(glm::vec3 start, glm::vec3 end)
return addLink<RailLinkCurve>(start, end, centre.first);
}
-void
-RailLink::defaultMesh()
+MeshPtr
+RailLink::defaultMesh(const std::span<Vertex> vertices)
{
+ std::vector<unsigned int> indices;
for (auto n = RAIL_CROSSSECTION_VERTICES; n < vertices.size(); n += 1) {
indices.push_back(n - RAIL_CROSSSECTION_VERTICES);
indices.push_back(n);
}
- assert(vertices.capacity() == vertices.size());
- assert(indices.capacity() == indices.size());
- meshes.create<Mesh>(vertices, indices, GL_TRIANGLE_STRIP);
+ return std::make_unique<Mesh>(vertices, indices, GL_TRIANGLE_STRIP);
}
void
RailLink::render(const Shader &) const
{
- meshes.apply(&Mesh::Draw);
+ mesh->Draw();
}
constexpr const std::array<std::pair<glm::vec3, float>, RAIL_CROSSSECTION_VERTICES> railCrossSection {{
@@ -144,8 +144,8 @@ RailLinkStraight::RailLinkStraight(const NodePtr & a, const NodePtr & b) : RailL
RailLinkStraight::RailLinkStraight(NodePtr a, NodePtr b, const glm::vec3 & diff) :
RailLink({std::move(a), vector_yaw(diff)}, {std::move(b), vector_yaw(-diff)}, glm::length(diff))
{
+ std::vector<Vertex> vertices;
vertices.reserve(2 * railCrossSection.size());
- indices.reserve(2 * railCrossSection.size());
const auto len = round_sleepers(length / 2.F);
const auto e {flat_orientation(diff)};
for (int ei = 0; ei < 2; ei++) {
@@ -155,7 +155,7 @@ RailLinkStraight::RailLinkStraight(NodePtr a, NodePtr b, const glm::vec3 & diff)
vertices.emplace_back(m, glm::vec2 {rcs.second, ei ? len : 0.F}, up);
}
}
- defaultMesh();
+ mesh = defaultMesh(vertices);
}
Location
@@ -185,8 +185,8 @@ RailLinkCurve::RailLinkCurve(const NodePtr & a, const NodePtr & b, glm::vec3 c,
const auto trans {glm::translate(centreBase)};
int segCount = segs;
+ std::vector<Vertex> vertices;
vertices.reserve((segCount + 1) * railCrossSection.size());
- indices.reserve(segCount * 2 * railCrossSection.size());
for (glm::vec3 swing = {arc.second, e1p.y - centreBase.y, 0.F}; segCount >= 0; swing += step, --segCount) {
const auto t {trans * glm::rotate(swing.x - half_pi, up) * glm::translate(glm::vec3 {radius, swing.y, 0.F})};
for (const auto & rcs : railCrossSection) {
@@ -194,7 +194,7 @@ RailLinkCurve::RailLinkCurve(const NodePtr & a, const NodePtr & b, glm::vec3 c,
vertices.emplace_back(m, glm::vec2 {rcs.second, swing.z}, up);
}
}
- defaultMesh();
+ mesh = defaultMesh(vertices);
}
Location
diff --git a/game/network/rail.h b/game/network/rail.h
index 1d0ef68..c67dc67 100644
--- a/game/network/rail.h
+++ b/game/network/rail.h
@@ -1,10 +1,8 @@
#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 "network.h"
@@ -13,10 +11,11 @@
#include <maths.h>
#include <memory>
#include <set>
+#include <span>
#include <utility>
-#include <vector>
class Shader;
+class Vertex;
// A piece of rail track
class RailLink : public Link, public Renderable {
@@ -26,11 +25,9 @@ public:
void render(const Shader &) const override;
protected:
- void defaultMesh();
+ [[nodiscard]] static MeshPtr defaultMesh(const std::span<Vertex> vertices);
- Collection<Mesh, false> meshes;
- std::vector<Vertex> vertices;
- std::vector<unsigned int> indices;
+ MeshPtr mesh;
};
class RailLinkStraight : public RailLink {