/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * C++ library for the Draco compression feature inside the glTF-Blender-IO project. * * The python side uses the CTypes library to open the DLL, load function * pointers add pass the data to the compressor as raw bytes. * * The compressor intercepts the regular glTF exporter after data has been * gathered and right before the data is converted to a JSON representation, * which is going to be written out. * * The original uncompressed data is removed and replaces an extension, * pointing to the newly created buffer containing the compressed data. * * @author Jim Eckerlein * @date 2019-11-29 */ #include #if defined(_MSC_VER) #define DLL_EXPORT(retType) extern "C" __declspec(dllexport) retType __cdecl #else #define DLL_EXPORT(retType) extern "C" retType #endif /** * This tuple is opaquely exposed to Python through a pointer. * It encapsulates the complete current compressor state. * * A single instance is only intended to compress a single primitive. */ struct DracoCompressor; DLL_EXPORT(DracoCompressor *) create_compressor (); DLL_EXPORT(void) set_compression_level ( DracoCompressor *compressor, uint32_t compressionLevel ); DLL_EXPORT(void) set_position_quantization ( DracoCompressor *compressor, uint32_t quantizationBitsPosition ); DLL_EXPORT(void) set_normal_quantization ( DracoCompressor *compressor, uint32_t quantizationBitsNormal ); DLL_EXPORT(void) set_uv_quantization ( DracoCompressor *compressor, uint32_t quantizationBitsTexCoord ); DLL_EXPORT(void) set_generic_quantization ( DracoCompressor *compressor, uint32_t bits ); /// Compresses a mesh. /// Use `compress_morphed` when compressing primitives which have morph targets. DLL_EXPORT(bool) compress ( DracoCompressor *compressor ); /// Compresses the mesh. /// Use this instead of `compress`, because this procedure takes into account that mesh triangles must not be reordered. DLL_EXPORT(bool) compress_morphed ( DracoCompressor *compressor ); /** * Returns the size of the compressed data in bytes. */ DLL_EXPORT(uint64_t) get_compressed_size ( DracoCompressor const *compressor ); /** * Copies the compressed mesh into the given byte buffer. * * @param[o_data] A Python `bytes` object. */ DLL_EXPORT(void) copy_to_bytes ( DracoCompressor const *compressor, uint8_t *o_data ); /** * Releases all memory allocated by the compressor. */ DLL_EXPORT(void) destroy_compressor ( DracoCompressor *compressor ); DLL_EXPORT(void) set_faces ( DracoCompressor *compressor, uint32_t index_count, uint32_t index_byte_length, uint8_t const *indices ); /// Adds a `float` position attribute to the current mesh. /// Returns the id Draco has assigned to this attribute. DLL_EXPORT(uint32_t) add_positions_f32 ( DracoCompressor *compressor, uint32_t count, uint8_t const *data ); /// Adds a `float` normal attribute to the current mesh. /// Returns the id Draco has assigned to this attribute. DLL_EXPORT(uint32_t) add_normals_f32 ( DracoCompressor *compressor, uint32_t count, uint8_t const *data ); /// Adds a `float` texture coordinate attribute to the current mesh. /// Returns the id Draco has assigned to this attribute. DLL_EXPORT(uint32_t) add_uvs_f32 ( DracoCompressor *compressor, uint32_t count, uint8_t const *data ); /// Adds a `unsigned short` joint attribute to the current mesh. /// Returns the id Draco has assigned to this attribute. DLL_EXPORT(uint32_t) add_joints_u16 ( DracoCompressor *compressor, uint32_t count, uint8_t const *data ); /// Adds a `float` weight attribute to the current mesh. /// Returns the id Draco has assigned to this attribute. DLL_EXPORT(uint32_t) add_weights_f32 ( DracoCompressor *compressor, uint32_t count, uint8_t const *data );