From 127484be477ff0db825bcfb6677f89c67a298aa3 Mon Sep 17 00:00:00 2001 From: Ondrej Stava Date: Mon, 27 Feb 2017 15:46:48 -0800 Subject: [PATCH] Updating draco decoder javascript API and other minor changes. 1. Javascript decoder is now exported as a module using DracoModule() function that needs to be instantiated on the client. 2. Updated Javascript example applications and README.md 3. Added normalization function to VectorD 4. Added support for converting a single signed value to symbol for entropy coding and vice versa 5. Minor code cleaning --- Makefile.emcc | 3 ++ README.md | 16 +++--- core/symbol_decoding.cc | 17 ++++--- core/symbol_decoding.h | 4 ++ core/symbol_encoding.cc | 19 +++++--- core/symbol_encoding.h | 4 ++ core/vector_d.h | 10 ++++ core/vector_d_test.cc | 21 +++++++- javascript/draco_decoder.js | 8 ++- javascript/example/DRACOLoader.js | 57 +++++++++++----------- javascript/example/webgl_loader_draco.html | 3 +- javascript/time_draco_decode.html | 13 ++--- mesh/edgebreaker_traverser.h | 11 +++++ mesh/mesh.h | 1 - 14 files changed, 126 insertions(+), 61 deletions(-) diff --git a/Makefile.emcc b/Makefile.emcc index a77aedd..444ae49 100644 --- a/Makefile.emcc +++ b/Makefile.emcc @@ -56,6 +56,9 @@ ALL_C_OPTS += -O3 ALL_C_OPTS += -s ALLOW_MEMORY_GROWTH=1 #ALL_C_OPTS += -s TOTAL_MEMORY=67108864 +# Export the main module as "DracoModule". +ALL_C_OPTS += -s MODULARIZE=1 -s EXPORT_NAME="'DracoModule'" + # Do not create a .mem file. ALL_C_OPTS += --memory-init-file 0 diff --git a/README.md b/README.md index 27febad..6d2d6a4 100644 --- a/README.md +++ b/README.md @@ -319,28 +319,30 @@ Javascript Decoder API The Javascript decoder is located in `javascript/draco_decoder.js`. The Javascript decoder can decode mesh and point cloud. In order to use the -decoder you must first create `DecoderBuffer` and `WebIDLWrapper` objects. Set +decoder, you must first create an instance of `DracoModule`. The instance is +then used to create `DecoderBuffer` and `WebIDLWrapper` objects. Set the encoded data in the `DecoderBuffer`. Then call `GetEncodedGeometryType()` to identify the type of geometry, e.g. mesh or point cloud. Then call either `DecodeMeshFromBuffer()` or `DecodePointCloudFromBuffer()`, which will return a Mesh object or a point cloud. For example: ~~~~~ js -const buffer = new Module.DecoderBuffer(); +const dracoDecoder = DracoModule(); +const buffer = new dracoDecoder.DecoderBuffer(); buffer.Init(encFileData, encFileData.length); -const wrapper = new Module.WebIDLWrapper(); +const wrapper = new dracoDecoder.WebIDLWrapper(); const geometryType = wrapper.GetEncodedGeometryType(buffer); let outputGeometry; -if (geometryType == Module.TRIANGULAR_MESH) { +if (geometryType == dracoDecoder.TRIANGULAR_MESH) { outputGeometry = wrapper.DecodeMeshFromBuffer(buffer); } else { outputGeometry = wrapper.DecodePointCloudFromBuffer(buffer); } -Module.destroy(outputGeometry); -Module.destroy(wrapper); -Module.destroy(buffer); +dracoDecoder.destroy(outputGeometry); +dracoDecoder.destroy(wrapper); +dracoDecoder.destroy(buffer); ~~~~~ Please see `javascript/emscripten/draco_web.idl` for the full API. diff --git a/core/symbol_decoding.cc b/core/symbol_decoding.cc index e47a2f5..532818f 100644 --- a/core/symbol_decoding.cc +++ b/core/symbol_decoding.cc @@ -25,16 +25,19 @@ namespace draco { void ConvertSymbolsToSignedInts(const uint32_t *in, int in_values, int32_t *out) { for (int i = 0; i < in_values; ++i) { - uint32_t val = in[i]; - const bool is_negative = (val & 1); - val >>= 1; - int32_t ret = static_cast(val); - if (is_negative) - ret = -ret - 1; - out[i] = ret; + out[i] = ConvertSymbolToSignedInt(in[i]); } } +int32_t ConvertSymbolToSignedInt(uint32_t val) { + const bool is_negative = (val & 1); + val >>= 1; + int32_t ret = static_cast(val); + if (is_negative) + ret = -ret - 1; + return ret; +} + template