diff options
Diffstat (limited to 'extern/draco/src')
-rw-r--r-- | extern/draco/src/common.cpp | 28 | ||||
-rw-r--r-- | extern/draco/src/common.h | 2 | ||||
-rw-r--r-- | extern/draco/src/decoder.cpp | 74 | ||||
-rw-r--r-- | extern/draco/src/decoder.h | 36 | ||||
-rw-r--r-- | extern/draco/src/encoder.cpp | 97 | ||||
-rw-r--r-- | extern/draco/src/encoder.h | 33 |
6 files changed, 147 insertions, 123 deletions
diff --git a/extern/draco/src/common.cpp b/extern/draco/src/common.cpp index 6f98d8db7ef..3a11c126ece 100644 --- a/extern/draco/src/common.cpp +++ b/extern/draco/src/common.cpp @@ -54,20 +54,20 @@ size_t getComponentByteLength(size_t componentType) { switch (componentType) { - case ComponentType::Byte: - case ComponentType::UnsignedByte: - return 1; - - case ComponentType::Short: - case ComponentType::UnsignedShort: - return 2; - - case ComponentType::UnsignedInt: - case ComponentType::Float: - return 4; - - default: - return 0; + case ComponentType::Byte: + case ComponentType::UnsignedByte: + return 1; + + case ComponentType::Short: + case ComponentType::UnsignedShort: + return 2; + + case ComponentType::UnsignedInt: + case ComponentType::Float: + return 4; + + default: + return 0; } } diff --git a/extern/draco/src/common.h b/extern/draco/src/common.h index beaf7d91adb..eef50596350 100644 --- a/extern/draco/src/common.h +++ b/extern/draco/src/common.h @@ -33,7 +33,7 @@ #define API(returnType) extern "C" returnType #endif -enum ComponentType: size_t +enum ComponentType : size_t { Byte = 5120, UnsignedByte = 5121, diff --git a/extern/draco/src/decoder.cpp b/extern/draco/src/decoder.cpp index 3f3e03bd9f2..e5ec2b65e6c 100644 --- a/extern/draco/src/decoder.cpp +++ b/extern/draco/src/decoder.cpp @@ -17,7 +17,6 @@ * @date 2020-11-18 */ - #include "decoder.h" #include <memory> @@ -30,7 +29,8 @@ #define LOG_PREFIX "DracoDecoder | " -struct Decoder { +struct Decoder +{ std::unique_ptr<draco::Mesh> mesh; std::vector<uint8_t> indexBuffer; std::map<uint32_t, std::vector<uint8_t>> buffers; @@ -54,20 +54,20 @@ bool decoderDecode(Decoder *decoder, void *data, size_t byteLength) draco::Decoder dracoDecoder; draco::DecoderBuffer dracoDecoderBuffer; dracoDecoderBuffer.Init(reinterpret_cast<char *>(data), byteLength); - + auto decoderStatus = dracoDecoder.DecodeMeshFromBuffer(&dracoDecoderBuffer); if (!decoderStatus.ok()) { printf(LOG_PREFIX "Error during Draco decoding: %s\n", decoderStatus.status().error_msg()); return false; } - + decoder->mesh = std::move(decoderStatus).value(); decoder->vertexCount = decoder->mesh->num_points(); decoder->indexCount = decoder->mesh->num_faces() * 3; - + printf(LOG_PREFIX "Decoded %" PRIu32 " vertices, %" PRIu32 " indices\n", decoder->vertexCount, decoder->indexCount); - + return true; } @@ -83,32 +83,32 @@ uint32_t decoderGetIndexCount(Decoder *decoder) bool decoderAttributeIsNormalized(Decoder *decoder, uint32_t id) { - const draco::PointAttribute* attribute = decoder->mesh->GetAttributeByUniqueId(id); + const draco::PointAttribute *attribute = decoder->mesh->GetAttributeByUniqueId(id); return attribute != nullptr && attribute->normalized(); } bool decoderReadAttribute(Decoder *decoder, uint32_t id, size_t componentType, char *dataType) { - const draco::PointAttribute* attribute = decoder->mesh->GetAttributeByUniqueId(id); - + const draco::PointAttribute *attribute = decoder->mesh->GetAttributeByUniqueId(id); + if (attribute == nullptr) { printf(LOG_PREFIX "Attribute with id=%" PRIu32 " does not exist in Draco data\n", id); return false; } - + size_t stride = getAttributeStride(componentType, dataType); - + std::vector<uint8_t> decodedData; decodedData.resize(stride * decoder->vertexCount); - + for (uint32_t i = 0; i < decoder->vertexCount; ++i) { auto index = attribute->mapped_index(draco::PointIndex(i)); uint8_t *value = decodedData.data() + i * stride; - + bool converted = false; - + switch (componentType) { case ComponentType::Byte: @@ -139,7 +139,7 @@ bool decoderReadAttribute(Decoder *decoder, uint32_t id, size_t componentType, c return false; } } - + decoder->buffers[id] = decodedData; return true; } @@ -166,13 +166,13 @@ void decoderCopyAttribute(Decoder *decoder, size_t id, void *output) } } -template<class T> +template <class T> void decodeIndices(Decoder *decoder) { std::vector<uint8_t> decodedIndices; decodedIndices.resize(decoder->indexCount * sizeof(T)); T *typedView = reinterpret_cast<T *>(decodedIndices.data()); - + for (uint32_t faceIndex = 0; faceIndex < decoder->mesh->num_faces(); ++faceIndex) { const draco::Mesh::Face &face = decoder->mesh->face(draco::FaceIndex(faceIndex)); @@ -180,7 +180,7 @@ void decodeIndices(Decoder *decoder) typedView[faceIndex * 3 + 1] = face[1].value(); typedView[faceIndex * 3 + 2] = face[2].value(); } - + decoder->indexBuffer = decodedIndices; } @@ -188,26 +188,26 @@ bool decoderReadIndices(Decoder *decoder, size_t indexComponentType) { switch (indexComponentType) { - case ComponentType::Byte: - decodeIndices<int8_t>(decoder); - break; - case ComponentType::UnsignedByte: - decodeIndices<uint8_t>(decoder); - break; - case ComponentType::Short: - decodeIndices<int16_t>(decoder); - break; - case ComponentType::UnsignedShort: - decodeIndices<uint16_t>(decoder); - break; - case ComponentType::UnsignedInt: - decodeIndices<uint32_t>(decoder); - break; - default: - printf(LOG_PREFIX "Index component type %zu not supported\n", indexComponentType); - return false; + case ComponentType::Byte: + decodeIndices<int8_t>(decoder); + break; + case ComponentType::UnsignedByte: + decodeIndices<uint8_t>(decoder); + break; + case ComponentType::Short: + decodeIndices<int16_t>(decoder); + break; + case ComponentType::UnsignedShort: + decodeIndices<uint16_t>(decoder); + break; + case ComponentType::UnsignedInt: + decodeIndices<uint32_t>(decoder); + break; + default: + printf(LOG_PREFIX "Index component type %zu not supported\n", indexComponentType); + return false; } - + return true; } diff --git a/extern/draco/src/decoder.h b/extern/draco/src/decoder.h index 914eb776e8f..c154b426c59 100644 --- a/extern/draco/src/decoder.h +++ b/extern/draco/src/decoder.h @@ -28,26 +28,38 @@ struct Decoder; -API(Decoder *) decoderCreate(); +API(Decoder *) +decoderCreate(); -API(void) decoderRelease(Decoder *decoder); +API(void) +decoderRelease(Decoder *decoder); -API(bool) decoderDecode(Decoder *decoder, void *data, size_t byteLength); +API(bool) +decoderDecode(Decoder *decoder, void *data, size_t byteLength); -API(uint32_t) decoderGetVertexCount(Decoder *decoder); +API(uint32_t) +decoderGetVertexCount(Decoder *decoder); -API(uint32_t) decoderGetIndexCount(Decoder *decoder); +API(uint32_t) +decoderGetIndexCount(Decoder *decoder); -API(bool) decoderAttributeIsNormalized(Decoder *decoder, uint32_t id); +API(bool) +decoderAttributeIsNormalized(Decoder *decoder, uint32_t id); -API(bool) decoderReadAttribute(Decoder *decoder, uint32_t id, size_t componentType, char *dataType); +API(bool) +decoderReadAttribute(Decoder *decoder, uint32_t id, size_t componentType, char *dataType); -API(size_t) decoderGetAttributeByteLength(Decoder *decoder, size_t id); +API(size_t) +decoderGetAttributeByteLength(Decoder *decoder, size_t id); -API(void) decoderCopyAttribute(Decoder *decoder, size_t id, void *output); +API(void) +decoderCopyAttribute(Decoder *decoder, size_t id, void *output); -API(bool) decoderReadIndices(Decoder *decoder, size_t indexComponentType); +API(bool) +decoderReadIndices(Decoder *decoder, size_t indexComponentType); -API(size_t) decoderGetIndicesByteLength(Decoder *decoder); +API(size_t) +decoderGetIndicesByteLength(Decoder *decoder); -API(void) decoderCopyIndices(Decoder *decoder, void *output); +API(void) +decoderCopyIndices(Decoder *decoder, void *output); diff --git a/extern/draco/src/encoder.cpp b/extern/draco/src/encoder.cpp index ff7570ecfcd..34282ced8c6 100644 --- a/extern/draco/src/encoder.cpp +++ b/extern/draco/src/encoder.cpp @@ -59,7 +59,8 @@ void encoderRelease(Encoder *encoder) delete encoder; } -void encoderSetCompressionLevel(Encoder *encoder, uint32_t compressionLevel) { +void encoderSetCompressionLevel(Encoder *encoder, uint32_t compressionLevel) +{ encoder->compressionLevel = compressionLevel; } @@ -75,7 +76,7 @@ void encoderSetQuantizationBits(Encoder *encoder, uint32_t position, uint32_t no bool encoderEncode(Encoder *encoder, uint8_t preserveTriangleOrder) { printf(LOG_PREFIX "Preserve triangle order: %s\n", preserveTriangleOrder ? "yes" : "no"); - + draco::Encoder dracoEncoder; int speed = 10 - static_cast<int>(encoder->compressionLevel); @@ -87,12 +88,12 @@ bool encoderEncode(Encoder *encoder, uint8_t preserveTriangleOrder) dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::COLOR, encoder->quantization.color); dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC, encoder->quantization.generic); dracoEncoder.SetTrackEncodedProperties(true); - + if (preserveTriangleOrder) { dracoEncoder.SetEncodingMethod(draco::MESH_SEQUENTIAL_ENCODING); } - + auto encoderStatus = dracoEncoder.EncodeMeshToBuffer(encoder->mesh, &encoder->encoderBuffer); if (encoderStatus.ok()) { @@ -130,20 +131,19 @@ void encoderCopy(Encoder *encoder, uint8_t *data) memcpy(data, encoder->encoderBuffer.data(), encoder->encoderBuffer.size()); } -template<class T> +template <class T> void encodeIndices(Encoder *encoder, uint32_t indexCount, T *indices) { int face_count = indexCount / 3; encoder->mesh.SetNumFaces(static_cast<size_t>(face_count)); encoder->rawSize += indexCount * sizeof(T); - + for (int i = 0; i < face_count; ++i) { draco::Mesh::Face face = { draco::PointIndex(indices[3 * i + 0]), draco::PointIndex(indices[3 * i + 1]), - draco::PointIndex(indices[3 * i + 2]) - }; + draco::PointIndex(indices[3 * i + 2])}; encoder->mesh.SetFace(draco::FaceIndex(static_cast<uint32_t>(i)), face); } } @@ -152,23 +152,23 @@ void encoderSetIndices(Encoder *encoder, size_t indexComponentType, uint32_t ind { switch (indexComponentType) { - case ComponentType::Byte: - encodeIndices(encoder, indexCount, reinterpret_cast<int8_t *>(indices)); - break; - case ComponentType::UnsignedByte: - encodeIndices(encoder, indexCount, reinterpret_cast<uint8_t *>(indices)); - break; - case ComponentType::Short: - encodeIndices(encoder, indexCount, reinterpret_cast<int16_t *>(indices)); - break; - case ComponentType::UnsignedShort: - encodeIndices(encoder, indexCount, reinterpret_cast<uint16_t *>(indices)); - break; - case ComponentType::UnsignedInt: - encodeIndices(encoder, indexCount, reinterpret_cast<uint32_t *>(indices)); - break; - default: - printf(LOG_PREFIX "Index component type %zu not supported\n", indexComponentType); + case ComponentType::Byte: + encodeIndices(encoder, indexCount, reinterpret_cast<int8_t *>(indices)); + break; + case ComponentType::UnsignedByte: + encodeIndices(encoder, indexCount, reinterpret_cast<uint8_t *>(indices)); + break; + case ComponentType::Short: + encodeIndices(encoder, indexCount, reinterpret_cast<int16_t *>(indices)); + break; + case ComponentType::UnsignedShort: + encodeIndices(encoder, indexCount, reinterpret_cast<uint16_t *>(indices)); + break; + case ComponentType::UnsignedInt: + encodeIndices(encoder, indexCount, reinterpret_cast<uint32_t *>(indices)); + break; + default: + printf(LOG_PREFIX "Index component type %zu not supported\n", indexComponentType); } } @@ -190,7 +190,7 @@ draco::GeometryAttribute::Type getAttributeSemantics(char *attribute) { return draco::GeometryAttribute::COLOR; } - + return draco::GeometryAttribute::GENERIC; } @@ -198,37 +198,38 @@ draco::DataType getDataType(size_t componentType) { switch (componentType) { - case ComponentType::Byte: - return draco::DataType::DT_INT8; - - case ComponentType::UnsignedByte: - return draco::DataType::DT_UINT8; - - case ComponentType::Short: - return draco::DataType::DT_INT16; - - case ComponentType::UnsignedShort: - return draco::DataType::DT_UINT16; - - case ComponentType::UnsignedInt: - return draco::DataType::DT_UINT32; - - case ComponentType::Float: - return draco::DataType::DT_FLOAT32; - - default: - return draco::DataType::DT_INVALID; + case ComponentType::Byte: + return draco::DataType::DT_INT8; + + case ComponentType::UnsignedByte: + return draco::DataType::DT_UINT8; + + case ComponentType::Short: + return draco::DataType::DT_INT16; + + case ComponentType::UnsignedShort: + return draco::DataType::DT_UINT16; + + case ComponentType::UnsignedInt: + return draco::DataType::DT_UINT32; + + case ComponentType::Float: + return draco::DataType::DT_FLOAT32; + + default: + return draco::DataType::DT_INVALID; } } -API(uint32_t) encoderSetAttribute(Encoder *encoder, char *attributeName, size_t componentType, char *dataType, void *data) +API(uint32_t) +encoderSetAttribute(Encoder *encoder, char *attributeName, size_t componentType, char *dataType, void *data) { auto buffer = std::make_unique<draco::DataBuffer>(); uint32_t count = encoder->mesh.num_points(); size_t componentCount = getNumberOfComponents(dataType); size_t stride = getAttributeStride(componentType, dataType); draco::DataType dracoDataType = getDataType(componentType); - + draco::GeometryAttribute::Type semantics = getAttributeSemantics(attributeName); draco::GeometryAttribute attribute; attribute.Init(semantics, &*buffer, componentCount, getDataType(componentType), false, stride, 0); diff --git a/extern/draco/src/encoder.h b/extern/draco/src/encoder.h index 2f7f21a469b..c6fdc30295b 100644 --- a/extern/draco/src/encoder.h +++ b/extern/draco/src/encoder.h @@ -28,24 +28,35 @@ struct Encoder; -API(Encoder *) encoderCreate(uint32_t vertexCount); +API(Encoder *) +encoderCreate(uint32_t vertexCount); -API(void) encoderRelease(Encoder *encoder); +API(void) +encoderRelease(Encoder *encoder); -API(void) encoderSetCompressionLevel(Encoder *encoder, uint32_t compressionLevel); +API(void) +encoderSetCompressionLevel(Encoder *encoder, uint32_t compressionLevel); -API(void) encoderSetQuantizationBits(Encoder *encoder, uint32_t position, uint32_t normal, uint32_t uv, uint32_t color, uint32_t generic); +API(void) +encoderSetQuantizationBits(Encoder *encoder, uint32_t position, uint32_t normal, uint32_t uv, uint32_t color, uint32_t generic); -API(bool) encoderEncode(Encoder *encoder, uint8_t preserveTriangleOrder); +API(bool) +encoderEncode(Encoder *encoder, uint8_t preserveTriangleOrder); -API(uint64_t) encoderGetByteLength(Encoder *encoder); +API(uint64_t) +encoderGetByteLength(Encoder *encoder); -API(void) encoderCopy(Encoder *encoder, uint8_t *data); +API(void) +encoderCopy(Encoder *encoder, uint8_t *data); -API(void) encoderSetIndices(Encoder *encoder, size_t indexComponentType, uint32_t indexCount, void *indices); +API(void) +encoderSetIndices(Encoder *encoder, size_t indexComponentType, uint32_t indexCount, void *indices); -API(uint32_t) encoderSetAttribute(Encoder *encoder, char *attributeName, size_t componentType, char *dataType, void *data); +API(uint32_t) +encoderSetAttribute(Encoder *encoder, char *attributeName, size_t componentType, char *dataType, void *data); -API(uint32_t) encoderGetEncodedVertexCount(Encoder *encoder); +API(uint32_t) +encoderGetEncodedVertexCount(Encoder *encoder); -API(uint32_t) encoderGetEncodedIndexCount(Encoder *encoder); +API(uint32_t) +encoderGetEncodedIndexCount(Encoder *encoder); |