#pragma once #include #include #include #include #include #include #include #include namespace mbgl { template class Program { public: using LayoutAttributes = LayoutAttrs; using LayoutVertex = typename LayoutAttributes::Vertex; using PaintPropertyBinders = typename PaintProperties::Binders; using PaintAttributes = typename PaintPropertyBinders::Attributes; using Attributes = gl::ConcatenateAttributes; using UniformValues = typename Uniforms::Values; using PaintUniforms = typename PaintPropertyBinders::Uniforms; using AllUniforms = gl::ConcatenateUniforms; using ProgramType = gl::Program; ProgramType program; Program(gl::Context& context, const ProgramParameters& programParameters) : program(ProgramType::createProgram( context, programParameters, Shaders::name, Shaders::vertexSource, Shaders::fragmentSource)) { } template void draw(gl::Context& context, DrawMode drawMode, gl::DepthMode depthMode, gl::StencilMode stencilMode, gl::ColorMode colorMode, UniformValues&& uniformValues, const gl::VertexBuffer& layoutVertexBuffer, const gl::IndexBuffer& indexBuffer, const gl::SegmentVector& segments, const PaintPropertyBinders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties, float currentZoom) { program.draw( context, std::move(drawMode), std::move(depthMode), std::move(stencilMode), std::move(colorMode), uniformValues .concat(paintPropertyBinders.uniformValues(currentZoom)), LayoutAttributes::allVariableBindings(layoutVertexBuffer) .concat(paintPropertyBinders.attributeBindings(currentProperties)), indexBuffer, segments ); } }; } // namespace mbgl