summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Loer <chris.loer@gmail.com>2017-06-02 12:02:02 -0700
committerChris Loer <chris.loer@gmail.com>2017-06-06 09:01:18 -0700
commit7c364ffcc5515917abd7710d00ba703480474405 (patch)
treee8940850614455a3396407561b604e47e187484a
parentde0bda00a0b315739a0730ebc8b44227df2664a6 (diff)
downloadqtlocation-mapboxgl-7c364ffcc5515917abd7710d00ba703480474405.tar.gz
[core] [DO NOT MERGE] Prototype approach to subsetting symbol attribute binding
-rw-r--r--src/mbgl/programs/attributes.hpp10
-rw-r--r--src/mbgl/programs/programs.hpp12
-rw-r--r--src/mbgl/programs/symbol_program.cpp9
-rw-r--r--src/mbgl/programs/symbol_program.hpp143
-rw-r--r--src/mbgl/renderer/buckets/symbol_bucket.hpp8
-rw-r--r--src/mbgl/renderer/paint_property_binder.hpp24
-rw-r--r--src/mbgl/renderer/painters/painter_symbol.cpp16
-rw-r--r--src/mbgl/style/layers/symbol_layer_properties.hpp8
8 files changed, 123 insertions, 107 deletions
diff --git a/src/mbgl/programs/attributes.hpp b/src/mbgl/programs/attributes.hpp
index 8d7841995b..4099978ddb 100644
--- a/src/mbgl/programs/attributes.hpp
+++ b/src/mbgl/programs/attributes.hpp
@@ -53,16 +53,6 @@ struct a_color {
using Type = gl::Attribute<float, 2>;
};
-struct a_fill_color {
- static auto name() { return "a_fill_color"; }
- using Type = gl::Attribute<float, 2>;
-};
-
-struct a_halo_color {
- static auto name() { return "a_halo_color"; }
- using Type = gl::Attribute<float, 2>;
-};
-
struct a_stroke_color {
static auto name() { return "a_stroke_color"; }
using Type = gl::Attribute<float, 2>;
diff --git a/src/mbgl/programs/programs.hpp b/src/mbgl/programs/programs.hpp
index ff6b1cd505..6a4a35cf24 100644
--- a/src/mbgl/programs/programs.hpp
+++ b/src/mbgl/programs/programs.hpp
@@ -29,8 +29,10 @@ public:
linePattern(context, programParameters),
raster(context, programParameters),
symbolIcon(context, programParameters),
- symbolIconSDF(context, programParameters),
- symbolGlyph(context, programParameters),
+ symbolSDFIconFill(context, programParameters),
+ symbolSDFIconHalo(context, programParameters),
+ symbolSDFTextFill(context, programParameters),
+ symbolSDFTextHalo(context, programParameters),
debug(context, ProgramParameters(programParameters.pixelRatio, false, programParameters.cacheDir)),
collisionBox(context, ProgramParameters(programParameters.pixelRatio, false, programParameters.cacheDir)) {
}
@@ -48,8 +50,10 @@ public:
LinePatternProgram linePattern;
RasterProgram raster;
SymbolIconProgram symbolIcon;
- SymbolSDFIconProgram symbolIconSDF;
- SymbolSDFTextProgram symbolGlyph;
+ SymbolSDFIconFillProgram symbolSDFIconFill;
+ SymbolSDFIconHaloProgram symbolSDFIconHalo;
+ SymbolSDFTextFillProgram symbolSDFTextFill;
+ SymbolSDFTextHaloProgram symbolSDFTextHalo;
DebugProgram debug;
CollisionBoxProgram collisionBox;
diff --git a/src/mbgl/programs/symbol_program.cpp b/src/mbgl/programs/symbol_program.cpp
index bd43237b8f..d224f3bac2 100644
--- a/src/mbgl/programs/symbol_program.cpp
+++ b/src/mbgl/programs/symbol_program.cpp
@@ -84,8 +84,8 @@ SymbolIconProgram::uniformValues(const bool isText,
);
}
-template <class PaintProperties>
-typename SymbolSDFProgram<PaintProperties>::UniformValues SymbolSDFProgram<PaintProperties>::uniformValues(
+SymbolSDFUniforms::Values
+symbolSDFUniformValues(
const bool isText,
const style::SymbolPropertyValues& values,
const Size& texsize,
@@ -98,7 +98,7 @@ typename SymbolSDFProgram<PaintProperties>::UniformValues SymbolSDFProgram<Paint
? std::cos(state.getPitch())
: 1.0) * state.getCameraToCenterDistance();
- return makeValues<SymbolSDFProgram<PaintProperties>::UniformValues>(
+ return makeValues<SymbolSDFUniforms::Values>(
isText,
values,
texsize,
@@ -113,7 +113,4 @@ typename SymbolSDFProgram<PaintProperties>::UniformValues SymbolSDFProgram<Paint
);
}
-template class SymbolSDFProgram<style::IconPaintProperties>;
-template class SymbolSDFProgram<style::TextPaintProperties>;
-
} // namespace mbgl
diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp
index 9ca55a704a..091de72e9d 100644
--- a/src/mbgl/programs/symbol_program.hpp
+++ b/src/mbgl/programs/symbol_program.hpp
@@ -409,7 +409,10 @@ class SymbolIconProgram : public SymbolProgram<
uniforms::u_camera_to_center_distance,
uniforms::u_pitch,
uniforms::u_max_camera_distance>,
- style::IconPaintProperties>
+ style::Properties<
+ style::IconOpacity,
+ style::IconTranslate,
+ style::IconTranslateAnchor>>
{
public:
using SymbolProgram::SymbolProgram;
@@ -427,75 +430,85 @@ enum class SymbolSDFPart {
Halo = 0
};
-template <class PaintProperties>
-class SymbolSDFProgram : public SymbolProgram<
+using SymbolSDFUniforms = gl::Uniforms<
+ uniforms::u_matrix,
+ uniforms::u_extrude_scale,
+ uniforms::u_texsize,
+ uniforms::u_zoom,
+ uniforms::u_rotate_with_map,
+ uniforms::u_texture,
+ uniforms::u_fadetexture,
+ uniforms::u_is_text,
+ uniforms::u_collision_y_stretch,
+ uniforms::u_camera_to_center_distance,
+ uniforms::u_pitch,
+ uniforms::u_max_camera_distance,
+ uniforms::u_gamma_scale,
+ uniforms::u_pitch,
+ uniforms::u_bearing,
+ uniforms::u_aspect_ratio,
+ uniforms::u_pitch_with_map,
+ uniforms::u_is_halo>;
+
+SymbolSDFUniforms::Values
+symbolSDFUniformValues(const bool isText,
+ const style::SymbolPropertyValues&,
+ const Size& texsize,
+ const std::array<float, 2>& pixelsToGLUnits,
+ const RenderTile&,
+ const TransformState&,
+ const SymbolSDFPart);
+
+using SymbolSDFIconFillProgram = SymbolProgram<
shaders::symbol_sdf,
gl::Triangle,
SymbolLayoutAttributes,
- gl::Uniforms<
- uniforms::u_matrix,
- uniforms::u_extrude_scale,
- uniforms::u_texsize,
- uniforms::u_zoom,
- uniforms::u_rotate_with_map,
- uniforms::u_texture,
- uniforms::u_fadetexture,
- uniforms::u_is_text,
- uniforms::u_collision_y_stretch,
- 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,
- uniforms::u_is_halo>,
- PaintProperties>
-{
-public:
- using BaseProgram = SymbolProgram<shaders::symbol_sdf,
- gl::Triangle,
- SymbolLayoutAttributes,
- gl::Uniforms<
- uniforms::u_matrix,
- uniforms::u_extrude_scale,
- uniforms::u_texsize,
- uniforms::u_zoom,
- uniforms::u_rotate_with_map,
- uniforms::u_texture,
- uniforms::u_fadetexture,
- uniforms::u_is_text,
- uniforms::u_collision_y_stretch,
- 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,
- uniforms::u_is_halo>,
- PaintProperties>;
-
- using UniformValues = typename BaseProgram::UniformValues;
-
-
-
- using BaseProgram::BaseProgram;
-
- static UniformValues uniformValues(const bool isText,
- const style::SymbolPropertyValues&,
- const Size& texsize,
- const std::array<float, 2>& pixelsToGLUnits,
- const RenderTile&,
- const TransformState&,
- const SymbolSDFPart);
-};
-
-using SymbolSDFIconProgram = SymbolSDFProgram<style::IconPaintProperties>;
-using SymbolSDFTextProgram = SymbolSDFProgram<style::TextPaintProperties>;
+ SymbolSDFUniforms,
+ style::Properties<
+ style::IconOpacity,
+ style::IconTranslate,
+ style::IconTranslateAnchor,
+ style::IconColor>>;
+
+using SymbolSDFIconHaloProgram = SymbolProgram<
+ shaders::symbol_sdf,
+ gl::Triangle,
+ SymbolLayoutAttributes,
+ SymbolSDFUniforms,
+ style::Properties<
+ style::IconOpacity,
+ style::IconTranslate,
+ style::IconTranslateAnchor,
+ style::IconHaloColor,
+ style::IconHaloWidth,
+ style::IconHaloBlur>>;
+
+using SymbolSDFTextFillProgram = SymbolProgram<
+ shaders::symbol_sdf,
+ gl::Triangle,
+ SymbolLayoutAttributes,
+ SymbolSDFUniforms,
+ style::Properties<
+ style::TextOpacity,
+ style::TextTranslate,
+ style::TextTranslateAnchor,
+ style::TextColor>>;
+
+using SymbolSDFTextHaloProgram = SymbolProgram<
+ shaders::symbol_sdf,
+ gl::Triangle,
+ SymbolLayoutAttributes,
+ SymbolSDFUniforms,
+ style::Properties<
+ style::TextOpacity,
+ style::TextTranslate,
+ style::TextTranslateAnchor,
+ style::TextHaloColor,
+ style::TextHaloWidth,
+ style::TextHaloBlur>>;
using SymbolLayoutVertex = SymbolLayoutAttributes::Vertex;
using SymbolIconAttributes = SymbolIconProgram::Attributes;
-using SymbolTextAttributes = SymbolSDFTextProgram::Attributes;
+//using SymbolTextAttributes = SymbolSDFTextProgram::Attributes;
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp
index 652f2ea8e3..3f6149dfc9 100644
--- a/src/mbgl/renderer/buckets/symbol_bucket.hpp
+++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp
@@ -18,7 +18,9 @@ namespace mbgl {
class SymbolBucket : public Bucket {
public:
SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated,
- const std::map<std::string, std::pair<style::IconPaintProperties::PossiblyEvaluated, style::TextPaintProperties::PossiblyEvaluated>>&,
+ const std::map<std::string, std::pair<
+ style::IconPaintProperties::PossiblyEvaluated,
+ style::TextPaintProperties::PossiblyEvaluated>>&,
const style::DataDrivenPropertyValue<float>& textSize,
const style::DataDrivenPropertyValue<float>& iconSize,
float zoom,
@@ -37,8 +39,8 @@ public:
const bool iconsNeedLinear;
std::map<std::string, std::pair<
- SymbolIconProgram::PaintPropertyBinders,
- SymbolSDFTextProgram::PaintPropertyBinders>> paintPropertyBinders;
+ style::IconPaintProperties::Binders,
+ style::TextPaintProperties::Binders>> paintPropertyBinders;
std::unique_ptr<SymbolSizeBinder> textSizeBinder;
diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp
index 14934fb6bd..a3dc2e1372 100644
--- a/src/mbgl/renderer/paint_property_binder.hpp
+++ b/src/mbgl/renderer/paint_property_binder.hpp
@@ -296,26 +296,36 @@ public:
template <class P>
using Attribute = ZoomInterpolatedAttribute<typename P::Attribute>;
-
using Attributes = gl::Attributes<Attribute<Ps>...>;
using AttributeBindings = typename Attributes::Bindings;
+ template <class P, class EvaluatedProperties>
+ auto attributeBinding(const EvaluatedProperties& currentProperties) const {
+ return binders.template get<P>()->attributeBinding(currentProperties.template get<P>());
+ }
+
template <class EvaluatedProperties>
AttributeBindings attributeBindings(const EvaluatedProperties& currentProperties) const {
return AttributeBindings {
- binders.template get<Ps>()->attributeBinding(currentProperties.template get<Ps>())...
+ attributeBinding<Ps>(currentProperties)...
};
}
- using Uniforms = gl::Uniforms<InterpolationUniform<typename Ps::Attribute>...>;
+ template <class P>
+ using Uniform = InterpolationUniform<typename P::Attribute>;
+ using Uniforms = gl::Uniforms<Uniform<Ps>...>;
using UniformValues = typename Uniforms::Values;
+ template <class P>
+ auto uniformValue(float currentZoom) const {
+ return typename Uniform<P>::Value {
+ binders.template get<P>()->interpolationFactor(currentZoom)
+ };
+ }
+
UniformValues uniformValues(float currentZoom) const {
- (void)currentZoom; // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56958
return UniformValues {
- typename InterpolationUniform<typename Ps::Attribute>::Value {
- binders.template get<Ps>()->interpolationFactor(currentZoom)
- }...
+ uniformValue<Ps>(currentZoom)...
};
}
diff --git a/src/mbgl/renderer/painters/painter_symbol.cpp b/src/mbgl/renderer/painters/painter_symbol.cpp
index 2dfc615125..3286b79294 100644
--- a/src/mbgl/renderer/painters/painter_symbol.cpp
+++ b/src/mbgl/renderer/painters/painter_symbol.cpp
@@ -75,8 +75,8 @@ void Painter::renderSymbol(PaintParameters& parameters,
if (bucket.sdfIcons) {
if (values.hasHalo) {
- draw(parameters.programs.symbolIconSDF,
- SymbolSDFIconProgram::uniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo),
+ draw(parameters.programs.symbolSDFIconHalo,
+ symbolSDFUniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo),
bucket.icon,
bucket.iconSizeBinder,
values,
@@ -85,8 +85,8 @@ void Painter::renderSymbol(PaintParameters& parameters,
}
if (values.hasFill) {
- draw(parameters.programs.symbolIconSDF,
- SymbolSDFIconProgram::uniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill),
+ draw(parameters.programs.symbolSDFIconFill,
+ symbolSDFUniformValues(false, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill),
bucket.icon,
bucket.iconSizeBinder,
values,
@@ -113,8 +113,8 @@ void Painter::renderSymbol(PaintParameters& parameters,
const Size texsize = glyphAtlas->getSize();
if (values.hasHalo) {
- draw(parameters.programs.symbolGlyph,
- SymbolSDFTextProgram::uniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo),
+ draw(parameters.programs.symbolSDFTextHalo,
+ symbolSDFUniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Halo),
bucket.text,
bucket.textSizeBinder,
values,
@@ -123,8 +123,8 @@ void Painter::renderSymbol(PaintParameters& parameters,
}
if (values.hasFill) {
- draw(parameters.programs.symbolGlyph,
- SymbolSDFTextProgram::uniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill),
+ draw(parameters.programs.symbolSDFTextFill,
+ symbolSDFUniformValues(true, values, texsize, pixelsToGLUnits, tile, state, SymbolSDFPart::Fill),
bucket.text,
bucket.textSizeBinder,
values,
diff --git a/src/mbgl/style/layers/symbol_layer_properties.hpp b/src/mbgl/style/layers/symbol_layer_properties.hpp
index d484d699d7..77deb8b85c 100644
--- a/src/mbgl/style/layers/symbol_layer_properties.hpp
+++ b/src/mbgl/style/layers/symbol_layer_properties.hpp
@@ -185,11 +185,11 @@ struct IconOpacity : DataDrivenPaintProperty<float, attributes::a_opacity> {
static float defaultValue() { return 1; }
};
-struct IconColor : DataDrivenPaintProperty<Color, attributes::a_fill_color> {
+struct IconColor : DataDrivenPaintProperty<Color, attributes::a_color> {
static Color defaultValue() { return Color::black(); }
};
-struct IconHaloColor : DataDrivenPaintProperty<Color, attributes::a_halo_color> {
+struct IconHaloColor : DataDrivenPaintProperty<Color, attributes::a_color> {
static Color defaultValue() { return {}; }
};
@@ -213,11 +213,11 @@ struct TextOpacity : DataDrivenPaintProperty<float, attributes::a_opacity> {
static float defaultValue() { return 1; }
};
-struct TextColor : DataDrivenPaintProperty<Color, attributes::a_fill_color> {
+struct TextColor : DataDrivenPaintProperty<Color, attributes::a_color> {
static Color defaultValue() { return Color::black(); }
};
-struct TextHaloColor : DataDrivenPaintProperty<Color, attributes::a_halo_color> {
+struct TextHaloColor : DataDrivenPaintProperty<Color, attributes::a_color> {
static Color defaultValue() { return {}; }
};