From c14ea22eee5866a580899027ef42b3867faa280c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sun, 28 Jul 2019 20:53:14 -0700 Subject: [PATCH] Updated meshoptimizer. --- 3rdparty/meshoptimizer/tools/gltfpack.cpp | 63 ++++++++++++++--------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/3rdparty/meshoptimizer/tools/gltfpack.cpp b/3rdparty/meshoptimizer/tools/gltfpack.cpp index dc1cfe684..561a86fda 100644 --- a/3rdparty/meshoptimizer/tools/gltfpack.cpp +++ b/3rdparty/meshoptimizer/tools/gltfpack.cpp @@ -237,12 +237,6 @@ void parseMeshesGltf(cgltf_data* data, std::vector& meshes) { const cgltf_primitive& primitive = mesh.primitives[pi]; - if (!primitive.indices || !primitive.indices->buffer_view) - { - fprintf(stderr, "Warning: ignoring primitive %d of mesh %d because it has no index data\n", int(pi), mesh_id); - continue; - } - if (primitive.type != cgltf_primitive_type_triangles) { fprintf(stderr, "Warning: ignoring primitive %d of mesh %d because type %d is not supported\n", int(pi), mesh_id, primitive.type); @@ -256,9 +250,21 @@ void parseMeshesGltf(cgltf_data* data, std::vector& meshes) result.material = primitive.material; result.skin = node.skin; - result.indices.resize(primitive.indices->count); - for (size_t i = 0; i < primitive.indices->count; ++i) - result.indices[i] = unsigned(cgltf_accessor_read_index(primitive.indices, i)); + if (primitive.indices) + { + result.indices.resize(primitive.indices->count); + for (size_t i = 0; i < primitive.indices->count; ++i) + result.indices[i] = unsigned(cgltf_accessor_read_index(primitive.indices, i)); + } + else + { + size_t count = primitive.attributes ? primitive.attributes[0].data->count : 0; + + // note, while we could generate a good index buffer, reindexMesh will take care of this + result.indices.resize(count); + for (size_t i = 0; i < count; ++i) + result.indices[i] = unsigned(i); + } for (size_t ai = 0; ai < primitive.attributes_count; ++ai) { @@ -2189,10 +2195,7 @@ void writeEmbeddedImage(std::string& json, std::vector& views, const size_t view = getBufferView(views, BufferView::Kind_Image, -1, 1, false); assert(views[view].data.empty()); - views[view].data.append(data, size); - - // each chunk must be aligned to 4 bytes - views[view].data.resize((views[view].data.size() + 3) & ~3); + views[view].data.assign(data, size); append(json, "\"bufferView\":"); append(json, view); @@ -2730,7 +2733,7 @@ void printStats(const std::vector& views, BufferView::Kind kind, con } } -bool process(cgltf_data* data, std::vector& meshes, const Settings& settings, std::string& json, std::string& bin) +void process(cgltf_data* data, std::vector& meshes, const Settings& settings, std::string& json, std::string& bin) { if (settings.verbose) { @@ -3241,8 +3244,6 @@ bool process(cgltf_data* data, std::vector& meshes, const Settings& settin printStats(views, BufferView::Kind_Index, "index"); printStats(views, BufferView::Kind_Keyframe, "keyframe"); } - - return true; } void writeU32(FILE* out, uint32_t data) @@ -3250,6 +3251,15 @@ void writeU32(FILE* out, uint32_t data) fwrite(&data, 4, 1, out); } +bool requiresExtension(cgltf_data* data, const char* name) +{ + for (size_t i = 0; i < data->extensions_required_count; ++i) + if (strcmp(data->extensions_required[i], name) == 0) + return true; + + return false; +} + int gltfpack(const char* input, const char* output, const Settings& settings) { cgltf_data* data = 0; @@ -3264,9 +3274,18 @@ int gltfpack(const char* input, const char* output, const Settings& settings) result = (result == cgltf_result_success) ? cgltf_validate(data) : result; result = (result == cgltf_result_success) ? cgltf_load_buffers(&options, data, input) : result; + const char* error = NULL; + if (result != cgltf_result_success) + error = getError(result); + else if (requiresExtension(data, "KHR_draco_mesh_compression")) + error = "file requires Draco mesh compression support"; + else if (requiresExtension(data, "MESHOPT_compression")) + error = "file has already been compressed using gltfpack"; + + if (error) { - fprintf(stderr, "Error loading %s: %s\n", input, getError(result)); + fprintf(stderr, "Error loading %s: %s\n", input, error); cgltf_free(data); return 2; } @@ -3296,12 +3315,7 @@ int gltfpack(const char* input, const char* output, const Settings& settings) } std::string json, bin; - if (!process(data, meshes, settings, json, bin)) - { - fprintf(stderr, "Error processing %s\n", input); - cgltf_free(data); - return 3; - } + process(data, meshes, settings, json, bin); cgltf_free(data); @@ -3467,7 +3481,10 @@ int main(int argc, char** argv) if (test) { for (int i = test; i < argc; ++i) + { + printf("%s\n", argv[i]); gltfpack(argv[i], NULL, settings); + } return 0; }