Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
Pass pitch-scaling vertex attributes and uniforms to shaders.
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisLoer committed May 18, 2017
1 parent d50ae1d commit 5ae86cc
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 21 deletions.
23 changes: 12 additions & 11 deletions src/mbgl/layout/symbol_layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ std::unique_ptr<SymbolBucket> SymbolLayout::place(CollisionTile& collisionTile)
for (const auto& symbol : symbolInstance.glyphQuads) {
addSymbol(
bucket->text, *bucket->textSizeBinder, symbol, feature, placementZoom,
keepUpright, textPlacement, collisionTile.config.angle, symbolInstance.writingModes);
keepUpright, textPlacement, collisionTile.config.angle, symbolInstance.writingModes, symbolInstance.point);
}
}
}
Expand All @@ -504,7 +504,7 @@ std::unique_ptr<SymbolBucket> SymbolLayout::place(CollisionTile& collisionTile)
if (iconScale < collisionTile.maxScale && symbolInstance.iconQuad) {
addSymbol(
bucket->icon, *bucket->iconSizeBinder, *symbolInstance.iconQuad, feature, placementZoom,
keepUpright, iconPlacement, collisionTile.config.angle, symbolInstance.writingModes);
keepUpright, iconPlacement, collisionTile.config.angle, symbolInstance.writingModes, symbolInstance.point);
}
}

Expand All @@ -530,7 +530,8 @@ void SymbolLayout::addSymbol(Buffer& buffer,
const bool keepUpright,
const style::SymbolPlacementType placement,
const float placementAngle,
const WritingModeType writingModes) {
const WritingModeType writingModes,
const Point<float> labelAnchor) {
constexpr const uint16_t vertexLength = 4;

const auto &tl = symbol.tl;
Expand Down Expand Up @@ -579,13 +580,13 @@ void SymbolLayout::addSymbol(Buffer& buffer,
uint8_t glyphAngle = std::round((symbol.glyphAngle / (M_PI * 2)) * 256);

// coordinates (2 triangles)
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, tl, tex.x, tex.y,
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, tl, labelAnchor, tex.x, tex.y,
minZoom, maxZoom, placementZoom, glyphAngle));
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, tr, tex.x + tex.w, tex.y,
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, tr, labelAnchor, tex.x + tex.w, tex.y,
minZoom, maxZoom, placementZoom, glyphAngle));
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, bl, tex.x, tex.y + tex.h,
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, bl, labelAnchor, tex.x, tex.y + tex.h,
minZoom, maxZoom, placementZoom, glyphAngle));
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, br, tex.x + tex.w, tex.y + tex.h,
buffer.vertices.emplace_back(SymbolLayoutAttributes::vertex(anchorPoint, br, labelAnchor, tex.x + tex.w, tex.y + tex.h,
minZoom, maxZoom, placementZoom, glyphAngle));

sizeBinder.populateVertexVector(feature);
Expand Down Expand Up @@ -635,10 +636,10 @@ void SymbolLayout::addToDebugBuffers(CollisionTile& collisionTile, SymbolBucket&
auto& segment = collisionBox.segments.back();
uint16_t index = segment.vertexLength;

collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, tl, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, tr, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, br, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, bl, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, symbolInstance.point, tl, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, symbolInstance.point, tr, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, symbolInstance.point, br, maxZoom, placementZoom));
collisionBox.vertices.emplace_back(CollisionBoxProgram::vertex(anchor, symbolInstance.point, bl, maxZoom, placementZoom));

collisionBox.lines.emplace_back(index + 0, index + 1);
collisionBox.lines.emplace_back(index + 1, index + 2);
Expand Down
3 changes: 2 additions & 1 deletion src/mbgl/layout/symbol_layout.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ class SymbolLayout {
const bool keepUpright,
const style::SymbolPlacementType,
const float placementAngle,
WritingModeType writingModes);
WritingModeType writingModes,
const Point<float> labelAnchor);

const std::string sourceLayerName;
const std::string bucketName;
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/programs/attributes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ inline uint16_t packUint8Pair(T a, T b) {
MBGL_DEFINE_ATTRIBUTE(int16_t, 2, a_pos);
MBGL_DEFINE_ATTRIBUTE(int16_t, 2, a_extrude);
MBGL_DEFINE_ATTRIBUTE(int16_t, 4, a_pos_offset);
MBGL_DEFINE_ATTRIBUTE(int16_t, 2, a_label_pos);
MBGL_DEFINE_ATTRIBUTE(int16_t, 2, a_anchor_pos);
MBGL_DEFINE_ATTRIBUTE(uint16_t, 2, a_texture_pos);
MBGL_DEFINE_ATTRIBUTE(int16_t, 3, a_normal);
MBGL_DEFINE_ATTRIBUTE(uint16_t, 1, a_edgedistance);
Expand Down
2 changes: 1 addition & 1 deletion src/mbgl/programs/collision_box_program.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

namespace mbgl {

static_assert(sizeof(CollisionBoxProgram::LayoutVertex) == 10, "expected CollisionBoxVertex size");
static_assert(sizeof(CollisionBoxProgram::LayoutVertex) == 14, "expected CollisionBoxVertex size");

} // namespace mbgl
12 changes: 10 additions & 2 deletions src/mbgl/programs/collision_box_program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, u_maxzoom);

using CollisionBoxAttributes = gl::Attributes<
attributes::a_pos,
attributes::a_anchor_pos,
attributes::a_extrude,
attributes::a_data<uint8_t, 2>>;

Expand All @@ -29,18 +30,25 @@ class CollisionBoxProgram : public Program<
uniforms::u_matrix,
uniforms::u_scale,
uniforms::u_zoom,
uniforms::u_maxzoom>,
uniforms::u_maxzoom,
uniforms::u_collision_y_stretch,
uniforms::u_camera_to_center_distance,
uniforms::u_pitch>,
style::Properties<>>
{
public:
using Program::Program;

static LayoutVertex vertex(Point<float> a, Point<float> o, float maxzoom, float placementZoom) {
static LayoutVertex vertex(Point<float> a, Point<float> anchor, Point<float> o, float maxzoom, float placementZoom) {
return LayoutVertex {
{{
static_cast<int16_t>(a.x),
static_cast<int16_t>(a.y)
}},
{{
static_cast<int16_t>(anchor.x),
static_cast<int16_t>(anchor.y)
}},
{{
static_cast<int16_t>(::round(o.x)),
static_cast<int16_t>(::round(o.y))
Expand Down
6 changes: 4 additions & 2 deletions src/mbgl/programs/symbol_program.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace mbgl {

using namespace style;

static_assert(sizeof(SymbolLayoutVertex) == 16, "expected SymbolLayoutVertex size");
static_assert(sizeof(SymbolLayoutVertex) == 20, "expected SymbolLayoutVertex size");

std::unique_ptr<SymbolSizeBinder> SymbolSizeBinder::create(const float tileZoom,
const style::DataDrivenPropertyValue<float>& sizeProperty,
Expand Down Expand Up @@ -59,6 +59,9 @@ Values makeValues(const bool isText,
uniforms::u_fadetexture::Value{ 1 },
uniforms::u_is_text::Value{ isText },
uniforms::u_collision_y_stretch::Value{ tile.tile.yStretch() },
uniforms::u_camera_to_center_distance::Value{ state.getCameraToCenterDistance() },
uniforms::u_pitch::Value{ state.getPitch() },
uniforms::u_max_camera_distance::Value{ 10.0f },
std::forward<Args>(args)...
};
}
Expand Down Expand Up @@ -103,7 +106,6 @@ typename SymbolSDFProgram<PaintProperties>::UniformValues SymbolSDFProgram<Paint
tile,
state,
uniforms::u_gamma_scale::Value{ gammaScale },
uniforms::u_pitch::Value{ state.getPitch() },
uniforms::u_bearing::Value{ -1.0f * state.getAngle() },
uniforms::u_aspect_ratio::Value{ (state.getSize().width * 1.0f) / (state.getSize().height * 1.0f) },
uniforms::u_pitch_with_map::Value{ values.pitchAlignment == AlignmentType::Map },
Expand Down
21 changes: 17 additions & 4 deletions src/mbgl/programs/symbol_program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,17 @@ MBGL_DEFINE_UNIFORM_SCALAR(bool, u_is_size_feature_constant);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_size_t);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_size);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_layout_size);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_collision_y_stretch);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_max_camera_distance);
} // namespace uniforms

struct SymbolLayoutAttributes : gl::Attributes<
attributes::a_pos_offset,
attributes::a_label_pos,
attributes::a_data<uint16_t, 4>>
{
static Vertex vertex(Point<float> a,
Point<float> o,
Point<float> labelAnchor,
uint16_t tx,
uint16_t ty,
float minzoom,
Expand All @@ -67,6 +69,10 @@ struct SymbolLayoutAttributes : gl::Attributes<
static_cast<int16_t>(::round(o.x * 64)), // use 1/64 pixels for placement
static_cast<int16_t>(::round(o.y * 64))
}},
{{
static_cast<int16_t>(labelAnchor.x),
static_cast<int16_t>(labelAnchor.y)
}},
{{
tx,
ty,
Expand Down Expand Up @@ -399,7 +405,10 @@ class SymbolIconProgram : public SymbolProgram<
uniforms::u_texture,
uniforms::u_fadetexture,
uniforms::u_is_text,
uniforms::u_collision_y_stretch>,
uniforms::u_collision_y_stretch,
uniforms::u_camera_to_center_distance,
uniforms::u_pitch,
uniforms::u_max_camera_distance>,
style::IconPaintProperties>
{
public:
Expand Down Expand Up @@ -433,8 +442,10 @@ class SymbolSDFProgram : public SymbolProgram<
uniforms::u_fadetexture,
uniforms::u_is_text,
uniforms::u_collision_y_stretch,
uniforms::u_gamma_scale,
uniforms::u_camera_to_center_distance,
uniforms::u_pitch,
uniforms::u_max_camera_distance,
uniforms::u_gamma_scale,
uniforms::u_bearing,
uniforms::u_aspect_ratio,
uniforms::u_pitch_with_map,
Expand All @@ -455,8 +466,10 @@ class SymbolSDFProgram : public SymbolProgram<
uniforms::u_fadetexture,
uniforms::u_is_text,
uniforms::u_collision_y_stretch,
uniforms::u_gamma_scale,
uniforms::u_camera_to_center_distance,
uniforms::u_pitch,
uniforms::u_max_camera_distance,
uniforms::u_gamma_scale,
uniforms::u_bearing,
uniforms::u_aspect_ratio,
uniforms::u_pitch_with_map,
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/programs/uniforms.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ MBGL_DEFINE_UNIFORM_SCALAR(Color, u_color);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_blur);

MBGL_DEFINE_UNIFORM_SCALAR(float, u_zoom);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_collision_y_stretch);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_camera_to_center_distance);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_pitch);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_bearing);

Expand Down
3 changes: 3 additions & 0 deletions src/mbgl/renderer/painters/painter_symbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ void Painter::renderSymbol(PaintParameters& parameters,
uniforms::u_scale::Value{ std::pow(2.0f, float(state.getZoom() - tile.tile.id.overscaledZ)) },
uniforms::u_zoom::Value{ float(state.getZoom() * 10) },
uniforms::u_maxzoom::Value{ float((tile.id.canonical.z + 1) * 10) },
uniforms::u_collision_y_stretch::Value{ tile.tile.yStretch() },
uniforms::u_camera_to_center_distance::Value{ state.getCameraToCenterDistance() },
uniforms::u_pitch::Value{ state.getPitch() }
},
*bucket.collisionBox.vertexBuffer,
*bucket.collisionBox.indexBuffer,
Expand Down

0 comments on commit 5ae86cc

Please sign in to comment.