From d40a3b9ed991bc361b633a36914e2ebe688473d3 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Sep 2016 21:24:07 -0400 Subject: [PATCH] Support rgb565 --- Source/Scene/PointCloud3DTileContent.js | 55 ++++++++++++++---- .../PointCloudRGB565/pointCloudRGB565.pnts | Bin 0 -> 14180 bytes .../PointCloud/PointCloudRGB565/tileset.json | 21 +++++++ Specs/Scene/PointCloud3DTileContentSpec.js | 5 ++ 4 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 Specs/Data/Cesium3DTiles/PointCloud/PointCloudRGB565/pointCloudRGB565.pnts create mode 100644 Specs/Data/Cesium3DTiles/PointCloud/PointCloudRGB565/tileset.json diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 33f266e52a28..9c75f83aab9b 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -353,12 +353,16 @@ define([ // Get the colors var colors; var isTranslucent = false; + var isRGB565 = false; if (defined(featureTableJson.RGBA)) { colors = featureTable.getPropertyArray('RGBA', ComponentDatatype.UNSIGNED_BYTE, 4); isTranslucent = true; } else if (defined(featureTableJson.RGB)) { colors = featureTable.getPropertyArray('RGB', ComponentDatatype.UNSIGNED_BYTE, 3); + } else if (defined(featureTableJson.RGB565)) { + colors = featureTable.getPropertyArray('RGB565', ComponentDatatype.UNSIGNED_SHORT, 1); + isRGB565 = true; } else if (defined(featureTableJson.CONSTANT_RGBA)) { var constantRGBA = featureTable.getGlobalProperty('CONSTANT_RGBA'); this._constantColor = Color.fromBytes(constantRGBA[0], constantRGBA[1], constantRGBA[2], constantRGBA[3], this._constantColor); @@ -421,6 +425,7 @@ define([ normals : normals, batchIds : batchIds, isQuantized : isQuantized, + isRGB565 : isRGB565, isOctEncoded16P : isOctEncoded16P, styleableProperties : styleableProperties }; @@ -438,6 +443,7 @@ define([ var normals = parsedContent.normals; var batchIds = parsedContent.batchIds; var isQuantized = parsedContent.isQuantized; + var isRGB565 = parsedContent.isRGB565; var isOctEncoded16P = parsedContent.isOctEncoded16P; var styleableProperties = parsedContent.styleableProperties; var isTranslucent = content._isTranslucent; @@ -520,6 +526,14 @@ define([ if (hasColors) { if (isTranslucent) { vs += 'attribute vec4 a_color; \n'; + } else if (isRGB565) { + vs += 'attribute float a_color; \n' + + 'const float SHIFT_RIGHT_11 = 1.0 / 2048.0; \n' + + 'const float SHIFT_RIGHT_5 = 1.0 / 32.0; \n' + + 'const float SHIFT_LEFT_11 = 2048.0; \n' + + 'const float SHIFT_LEFT_5 = 32.0; \n' + + 'const float NORMALIZE_6 = 1.0 / 64.0; \n' + + 'const float NORMALIZE_5 = 1.0 / 32.0; \n'; } else { vs += 'attribute vec3 a_color; \n'; } @@ -550,6 +564,15 @@ define([ if (hasColors) { if (isTranslucent) { vs += ' vec4 color = a_color * u_highlightColor; \n'; + } else if (isRGB565) { + vs += ' float compressed = a_color; \n' + + ' float r = floor(compressed * SHIFT_RIGHT_11); \n' + + ' compressed -= r * SHIFT_LEFT_11; \n' + + ' float g = floor(compressed * SHIFT_RIGHT_5); \n' + + ' compressed -= g * SHIFT_LEFT_5; \n' + + ' float b = compressed; \n' + + ' vec3 rgb = vec3(r * NORMALIZE_5, g * NORMALIZE_6, b * NORMALIZE_5); \n' + + ' vec4 color = vec4(rgb * u_highlightColor.rgb, u_highlightColor.a); \n'; } else { vs += ' vec4 color = vec4(a_color * u_highlightColor.rgb, u_highlightColor.a); \n'; } @@ -667,16 +690,28 @@ define([ } if (hasColors) { - var colorComponentsPerAttribute = isTranslucent ? 4 : 3; - attributes.push({ - index : colorAttributeLocation, - vertexBuffer : colorsVertexBuffer, - componentsPerAttribute : colorComponentsPerAttribute, - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - normalize : true, - offsetInBytes : 0, - strideInBytes : 0 - }); + if (isRGB565) { + attributes.push({ + index : colorAttributeLocation, + vertexBuffer : colorsVertexBuffer, + componentsPerAttribute : 1, + componentDatatype : ComponentDatatype.UNSIGNED_SHORT, + normalize : false, + offsetInBytes : 0, + strideInBytes : 0 + }); + } else { + var colorComponentsPerAttribute = isTranslucent ? 4 : 3; + attributes.push({ + index : colorAttributeLocation, + vertexBuffer : colorsVertexBuffer, + componentsPerAttribute : colorComponentsPerAttribute, + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + normalize : true, + offsetInBytes : 0, + strideInBytes : 0 + }); + } } if (hasNormals) { diff --git a/Specs/Data/Cesium3DTiles/PointCloud/PointCloudRGB565/pointCloudRGB565.pnts b/Specs/Data/Cesium3DTiles/PointCloud/PointCloudRGB565/pointCloudRGB565.pnts new file mode 100644 index 0000000000000000000000000000000000000000..076d812ab5a4b99d2b0e0768c3ccdd76630fe282 GIT binary patch literal 14180 zcmZ9S(My}ly2huCO%c2h1Tk&eh6;j^v-vbJt}KLvvsr9ytseGXcZb7H8%+`9Ah-}@ zyWneMQv@#rK}?&r|AK98d+C56rcGNx5Cku5YukTgzt1?&e8c|W^Zm^;@4UZE(#y{M z{~z-glu}c}N^MHr%E=%5{OjibOpZ1^=JKrR^i z%i!R^U@piG{$E-~|6}a;vB`;>zy9myy~RJKCo7ft=|67%8vH4Szy0@6Zs*+^U3g%;U&XM zPH91zg^G-fN)A0%KH~__79xh1IlN?e$?%0d>oNA3qmq@+;πVtARuONN(h?kTf) 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