#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { namespace gl { template class UnindexedVertices { public: using VertexType = Vertex; UnindexedVertices(DrawMode drawMode_, const VertexBuffer& vertexBuffer_) : drawMode(std::move(drawMode_)), vertexBuffer(vertexBuffer_.buffer), segments({{ 0, 0, vertexBuffer_.vertexCount, 0 }}) {} DrawMode drawMode; gl::BufferID vertexBuffer; static constexpr std::size_t vertexSize = sizeof(Vertex); static constexpr gl::BufferID indexBuffer = 0; static constexpr std::size_t primitiveSize = 0; std::vector segments; }; template auto Unindexed(const VertexBuffer& vertexBuffer, Args&&... drawModeArguments) { return UnindexedVertices( DrawMode { std::forward(drawModeArguments)... }, vertexBuffer); } template class SegmentedVertices { public: using VertexType = Vertex; SegmentedVertices(DrawMode drawMode_, const VertexBuffer& vertexBuffer_, const IndexBuffer& indexBuffer_, const std::vector& segments_) : drawMode(std::move(drawMode_)), vertexBuffer(vertexBuffer_.buffer), indexBuffer(indexBuffer_.buffer), segments(segments_) {} DrawMode drawMode; gl::BufferID vertexBuffer; static constexpr std::size_t vertexSize = sizeof(Vertex); gl::BufferID indexBuffer; static constexpr std::size_t primitiveSize = sizeof(Primitive); const std::vector& segments; }; template auto Segmented(const VertexBuffer& vertexBuffer, const IndexBuffer& indexBuffer, const std::vector& segments, Args&&... drawModeArguments) { static_assert(std::is_same::value, "primitive mode mismatch"); return SegmentedVertices( DrawMode { std::forward(drawModeArguments)... }, vertexBuffer, indexBuffer, segments); } class Drawable { public: template Drawable(DepthMode depthMode_, StencilMode stencilMode_, ColorMode colorMode_, Program& program_, typename Program::UniformValues&& uniformValues, const Subject& subject) : drawMode(subject.drawMode), depthMode(std::move(depthMode_)), stencilMode(std::move(stencilMode_)), colorMode(std::move(colorMode_)), program(program_.program), vertexBuffer(subject.vertexBuffer), vertexSize(subject.vertexSize), indexBuffer(subject.indexBuffer), primitiveSize(subject.primitiveSize), segments(subject.segments), bindUniforms(Program::Uniforms::binder(program_.uniformsState, std::move(uniformValues))), bindAttributes(Program::Attributes::binder(program_.attributesState)) { static_assert(std::is_standard_layout::value, "vertex type must use standard layout"); static_assert(std::is_same::value, "vertex type mismatch"); } DrawMode drawMode; DepthMode depthMode; StencilMode stencilMode; ColorMode colorMode; gl::ProgramID program; gl::BufferID vertexBuffer; std::size_t vertexSize; gl::BufferID indexBuffer; std::size_t primitiveSize; const std::vector& segments; std::function bindUniforms; std::function bindAttributes; }; } // namespace gl } // namespace mbgl