diff options
Diffstat (limited to 'src/mbgl/shaders/preludes.cpp')
-rw-r--r-- | src/mbgl/shaders/preludes.cpp | 18 |
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. |