#pragma once #include #include #include #include #include #include namespace mbgl { using CollisionBoxLayoutAttributes = TypeList< attributes::a_pos, attributes::a_anchor_pos, attributes::a_extrude, attributes::a_shift>; using CollisionBoxDynamicAttributes = TypeList; class CollisionBoxProgram : public Program< CollisionBoxProgram, gfx::PrimitiveType::Line, TypeListConcat, TypeList< uniforms::u_matrix, uniforms::u_extrude_scale, uniforms::u_camera_to_center_distance>, TypeList<>, style::Properties<>> { public: using Program::Program; static gfx::Vertex layoutVertex(Point a, Point anchor, Point o) { return { {{ static_cast(a.x), static_cast(a.y) }}, {{ static_cast(anchor.x), static_cast(anchor.y) }}, {{ static_cast(::round(o.x)), static_cast(::round(o.y)) }}, {{ 0.0f, 0.0f }} }; } static gfx::Vertex dynamicVertex(bool placed, bool notUsed) { return { {{ static_cast(placed), static_cast(notUsed) }} }; } template void draw(gfx::Context& context, const DrawMode& drawMode, const gfx::DepthMode& depthMode, const gfx::StencilMode& stencilMode, const gfx::ColorMode& colorMode, const gfx::CullFaceMode& cullFaceMode, const LayoutUniformValues& layoutUniformValues, const gfx::VertexBuffer>& layoutVertexBuffer, const gfx::VertexBuffer>& dynamicVertexBuffer, const gfx::IndexBuffer& indexBuffer, const SegmentVector& segments, const Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties, const TextureBindings& textureBindings, float currentZoom, const std::string& layerID) { UniformValues uniformValues = layoutUniformValues .concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties)); AttributeBindings allAttributeBindings = gfx::AttributeBindings(layoutVertexBuffer) .concat(gfx::AttributeBindings(dynamicVertexBuffer)) .concat(paintPropertyBinders.attributeBindings(currentProperties)); assert(layoutVertexBuffer.elements == dynamicVertexBuffer.elements); for (auto& segment : segments) { auto drawScopeIt = segment.drawScopes.find(layerID); if (drawScopeIt == segment.drawScopes.end()) { drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } program->draw( context, std::move(drawMode), std::move(depthMode), std::move(stencilMode), std::move(colorMode), std::move(cullFaceMode), uniformValues, drawScopeIt->second, allAttributeBindings.offset(segment.vertexOffset), textureBindings, indexBuffer, segment.indexOffset, segment.indexLength); } } }; class CollisionCircleProgram : public Program< CollisionCircleProgram, gfx::PrimitiveType::Triangle, TypeListConcat, TypeList< uniforms::u_matrix, uniforms::u_extrude_scale, uniforms::u_overscale_factor, uniforms::u_camera_to_center_distance>, TypeList<>, style::Properties<>> { public: using Program::Program; static gfx::Vertex vertex(Point a, Point anchor, Point o) { return { {{ static_cast(a.x), static_cast(a.y) }}, {{ static_cast(anchor.x), static_cast(anchor.y) }}, {{ static_cast(::round(o.x)), static_cast(::round(o.y)) }}, {{ 0.0f, 0.0f }} }; } template void draw(gfx::Context& context, const DrawMode& drawMode, const gfx::DepthMode& depthMode, const gfx::StencilMode& stencilMode, const gfx::ColorMode& colorMode, const gfx::CullFaceMode& cullFaceMode, const LayoutUniformValues& layoutUniformValues, const gfx::VertexBuffer>& layoutVertexBuffer, const gfx::VertexBuffer>& dynamicVertexBuffer, const gfx::IndexBuffer& indexBuffer, const SegmentVector& segments, const Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties, const TextureBindings& textureBindings, float currentZoom, const std::string& layerID) { UniformValues uniformValues = layoutUniformValues .concat(paintPropertyBinders.uniformValues(currentZoom, currentProperties)); AttributeBindings allAttributeBindings = gfx::AttributeBindings(layoutVertexBuffer) .concat(gfx::AttributeBindings(dynamicVertexBuffer)) .concat(paintPropertyBinders.attributeBindings(currentProperties)); for (auto& segment : segments) { auto drawScopeIt = segment.drawScopes.find(layerID); if (drawScopeIt == segment.drawScopes.end()) { drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } program->draw( context, std::move(drawMode), std::move(depthMode), std::move(stencilMode), std::move(colorMode), std::move(cullFaceMode), uniformValues, drawScopeIt->second, allAttributeBindings.offset(segment.vertexOffset), textureBindings, indexBuffer, segment.indexOffset, segment.indexLength); } } }; using CollisionBoxVertex = CollisionBoxProgram::LayoutVertex; } // namespace mbgl