#pragma once #include #include #include #include #include #include namespace mbgl { class PlacedSymbol; struct TileDistance; using CollisionBoundaries = std::array; // [x1, y1, x2, y2] struct IntersectStatus { enum Flags : uint8_t { None = 0, HorizontalBorders = 1 << 0, VerticalBorders = 1 << 1 }; Flags flags = None; // Assuming tile border divides box in two sections int minSectionLength = 0; }; class CollisionIndex { public: using CollisionGrid = GridIndex; explicit CollisionIndex(const TransformState&, MapMode); IntersectStatus intersectsTileEdges(const CollisionBox&, Point shift, const mat4& posMatrix, float textPixelRatio, const CollisionBoundaries& tileEdges) const; std::pair placeFeature( const CollisionFeature& feature, Point shift, const mat4& posMatrix, const mat4& labelPlaneMatrix, float textPixelRatio, const PlacedSymbol& symbol, float scale, float fontSize, bool allowOverlap, bool pitchWithMap, bool collisionDebug, const optional& avoidEdges, const optional>& collisionGroupPredicate, std::vector& /*out*/); void insertFeature(const CollisionFeature& feature, const std::vector&, bool ignorePlacement, uint32_t bucketInstanceId, uint16_t collisionGroupId); std::unordered_map> queryRenderedSymbols(const ScreenLineString&) const; CollisionBoundaries projectTileBoundaries(const mat4& posMatrix) const; const TransformState& getTransformState() const { return transformState; } float getViewportPadding() const { return viewportPadding; } private: bool isOffscreen(const CollisionBoundaries&) const; bool isInsideGrid(const CollisionBoundaries&) const; bool isInsideTile(const CollisionBoundaries& boundaries, const CollisionBoundaries& tileBoundaries) const; bool overlapsTile(const CollisionBoundaries& boundaries, const CollisionBoundaries& tileBoundaries) const; std::pair placeLineFeature( const CollisionFeature& feature, const mat4& posMatrix, const mat4& labelPlaneMatrix, float textPixelRatio, const PlacedSymbol& symbol, float scale, float fontSize, bool allowOverlap, bool pitchWithMap, bool collisionDebug, const optional& avoidEdges, const optional>& collisionGroupPredicate, std::vector& /*out*/); float approximateTileDistance(const TileDistance& tileDistance, float lastSegmentAngle, float pixelsToTileUnits, float cameraToAnchorDistance, bool pitchWithMap); std::pair projectAnchor(const mat4& posMatrix, const Point& point) const; std::pair,float> projectAndGetPerspectiveRatio(const mat4& posMatrix, const Point& point) const; Point projectPoint(const mat4& posMatrix, const Point& point) const; CollisionBoundaries getProjectedCollisionBoundaries(const mat4& posMatrix, Point shift, float textPixelRatio, const CollisionBox& box) const; const TransformState transformState; const float viewportPadding; CollisionGrid collisionGrid; CollisionGrid ignoredGrid; const float screenRightBoundary; const float screenBottomBoundary; const float gridRightBoundary; const float gridBottomBoundary; const float pitchFactor; }; } // namespace mbgl