diff options
Diffstat (limited to 'game/network')
| -rw-r--r-- | game/network/rail.cpp | 40 | ||||
| -rw-r--r-- | game/network/rail.h | 2 | 
2 files changed, 24 insertions, 18 deletions
diff --git a/game/network/rail.cpp b/game/network/rail.cpp index e66b5c8..299c647 100644 --- a/game/network/rail.cpp +++ b/game/network/rail.cpp @@ -3,6 +3,7 @@  #include <GL/glew.h>  #include <array>  #include <cache.h> +#include <cassert>  #include <gfx/gl/shader.h>  #include <gfx/models/texture.h>  #include <gfx/models/vertex.hpp> @@ -23,6 +24,19 @@ RailLinks::render(const Shader & shader) const  }  void +RailLink::defaultMesh() +{ +	for (auto n = 4U; n < vertices.size(); n += 1) { +		indices.push_back(n - 4); +		indices.push_back(n); +	} + +	assert(vertices.capacity() == vertices.size()); +	assert(indices.capacity() == indices.size()); +	meshes.create<Mesh>(vertices, indices, GL_TRIANGLE_STRIP); +} + +void  RailLink::render(const Shader &) const  {  	meshes.apply(&Mesh::Draw); @@ -59,13 +73,9 @@ RailLinkStraight::RailLinkStraight(NodePtr a, NodePtr b, const glm::vec3 & diff)  		for (const auto & rcs : railCrossSection) {  			const glm::vec3 m {(trans * glm::vec4 {rcs.first, 1})};  			vertices.emplace_back(m, glm::vec2 {rcs.second, ei ? len : 0.F}, up); -			if (vertices.size() > railCrossSection.size()) { -				indices.push_back(vertices.size() - railCrossSection.size() - 1); -				indices.push_back(vertices.size() - 1); -			}  		}  	} -	meshes.create<Mesh>(vertices, indices, GL_TRIANGLE_STRIP); +	defaultMesh();  }  RailLinkCurve::RailLinkCurve(const NodePtr & a, const NodePtr & b, glm::vec2 c) : @@ -86,21 +96,15 @@ RailLinkCurve::RailLinkCurve(const NodePtr & a, const NodePtr & b, glm::vec3 c,  	const auto step {glm::vec3 {arc_length(arc), e1p.y - e0p.y, slength} / segs};  	const auto trans {glm::translate(centreBase)}; -	auto addRcs = [this, trans, radius](auto arc) { -		const auto t {trans * glm::rotate(half_pi - arc.x, up) * glm::translate(glm::vec3 {radius, arc.y, 0.F})}; +	int segCount = segs; +	vertices.reserve((segCount + 1) * railCrossSection.size()); +	indices.reserve(segCount * 2 * railCrossSection.size()); +	for (glm::vec3 swing = {arc.first, 0.F, 0.F}; segCount >= 0; swing += step, --segCount) { +		const auto t {trans * glm::rotate(half_pi - swing.x, up) * glm::translate(glm::vec3 {radius, swing.y, 0.F})};  		for (const auto & rcs : railCrossSection) {  			const glm::vec3 m {(t * glm::vec4 {rcs.first, 1})}; -			vertices.emplace_back(m, glm::vec2 {rcs.second, arc.z}, up); +			vertices.emplace_back(m, glm::vec2 {rcs.second, swing.z}, up);  		} -	}; -	for (glm::vec3 swing = {arc.first, 0.F, 0.F}; swing.x < arc.second; swing += step) { -		addRcs(swing); -	} -	addRcs(glm::vec3 {arc.second, e1p.y - e0p.y, slength}); - -	for (auto n = 4U; n < vertices.size(); n += 1) { -		indices.push_back(n - 4); -		indices.push_back(n);  	} -	meshes.create<Mesh>(vertices, indices, GL_TRIANGLE_STRIP); +	defaultMesh();  } diff --git a/game/network/rail.h b/game/network/rail.h index 8fee27f..5fea713 100644 --- a/game/network/rail.h +++ b/game/network/rail.h @@ -26,6 +26,8 @@ public:  	void render(const Shader &) const override;  protected: +	void defaultMesh(); +  	Collection<Mesh, false> meshes;  	std::vector<Vertex> vertices;  	std::vector<unsigned int> indices;  | 
