summaryrefslogtreecommitdiff
path: root/src/mbgl/shaders/preludes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/shaders/preludes.cpp')
-rw-r--r--src/mbgl/shaders/preludes.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/mbgl/shaders/preludes.cpp b/src/mbgl/shaders/preludes.cpp
index 806e655285..cca0f3e3f1 100644
--- a/src/mbgl/shaders/preludes.cpp
+++ b/src/mbgl/shaders/preludes.cpp
@@ -43,17 +43,25 @@ vec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 v
}
}
+// Unpack a pair of values that have been packed into a single float.
+// The packed values are assumed to be 8-bit unsigned integers, and are
+// packed like so:
+// packedValue = floor(input[0]) * 256 + input[1],
+vec2 unpack_float(const float packedValue) {
+ float v0 = floor(packedValue / 256.0);
+ return vec2(v0, packedValue - v0 * 256.0);
+}
+
// To minimize the number of attributes needed in the mapbox-gl-native shaders,
// we encode a 4-component color into a pair of floats (i.e. a vec2) as follows:
// [ floor(color.r * 255) * 256 + color.g * 255,
// floor(color.b * 255) * 256 + color.g * 255 ]
vec4 decode_color(const vec2 encodedColor) {
- float r = floor(encodedColor[0]/256.0)/255.0;
- float g = (encodedColor[0] - r*256.0*255.0)/255.0;
- float b = floor(encodedColor[1]/256.0)/255.0;
- float a = (encodedColor[1] - b*256.0*255.0)/255.0;
- return vec4(r, g, b, a);
+ return vec4(
+ unpack_float(encodedColor[0]) / 255.0,
+ unpack_float(encodedColor[1]) / 255.0
+ );
}
// Unpack a pair of paint values and interpolate between them.