From 126c0d65960ef4e6a52d66e8e11ddca29143d60e 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: Wed, 13 Nov 2019 07:24:59 -0800 Subject: [PATCH] Updated meshoptimizer. --- .../meshoptimizer/.github/workflows/build.yml | 4 +- 3rdparty/meshoptimizer/.travis.yml | 1 + 3rdparty/meshoptimizer/CMakeLists.txt | 5 + 3rdparty/meshoptimizer/demo/demo.html | 1 + 3rdparty/meshoptimizer/demo/pirate.glb | Bin 29008 -> 29716 bytes 3rdparty/meshoptimizer/tools/gltfpack.cpp | 108 ++++++++++++++---- 6 files changed, 93 insertions(+), 26 deletions(-) diff --git a/3rdparty/meshoptimizer/.github/workflows/build.yml b/3rdparty/meshoptimizer/.github/workflows/build.yml index ab29f999e..18dd693a2 100644 --- a/3rdparty/meshoptimizer/.github/workflows/build.yml +++ b/3rdparty/meshoptimizer/.github/workflows/build.yml @@ -17,6 +17,7 @@ jobs: make -j2 config=debug test make -j2 config=release test make -j2 config=release gltfpack + strip gltfpack - name: make coverage run: | make -j2 config=coverage test @@ -36,7 +37,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: cmake configure - run: cmake . -DBUILD_DEMO=ON -DBUILD_TOOLS=ON -A ${{matrix.arch}} + run: cmake . -DBUILD_DEMO=ON -DBUILD_TOOLS=ON -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug>" -A ${{matrix.arch}} - name: cmake test shell: bash # necessary for fail-fast run: | @@ -48,3 +49,4 @@ jobs: with: name: gltfpack-windows path: Release/gltfpack.exe + if: matrix.arch == 'x64' diff --git a/3rdparty/meshoptimizer/.travis.yml b/3rdparty/meshoptimizer/.travis.yml index 3c46e945a..038f8af71 100644 --- a/3rdparty/meshoptimizer/.travis.yml +++ b/3rdparty/meshoptimizer/.travis.yml @@ -1,6 +1,7 @@ language: cpp jobs: + include: - os: linux compiler: gcc - os: linux diff --git a/3rdparty/meshoptimizer/CMakeLists.txt b/3rdparty/meshoptimizer/CMakeLists.txt index 2fcba6701..cda378fb1 100644 --- a/3rdparty/meshoptimizer/CMakeLists.txt +++ b/3rdparty/meshoptimizer/CMakeLists.txt @@ -1,5 +1,10 @@ cmake_minimum_required(VERSION 3.0) +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.15) + cmake_policy(SET CMP0091 NEW) # Enables use of MSVC_RUNTIME_LIBRARY + cmake_policy(SET CMP0092 NEW) # Enables clean /W4 override for MSVC +endif() + project(meshoptimizer VERSION 0.12 LANGUAGES CXX) option(BUILD_DEMO "Build demo" OFF) diff --git a/3rdparty/meshoptimizer/demo/demo.html b/3rdparty/meshoptimizer/demo/demo.html index 2ce3fd3ed..7cc32b89c 100644 --- a/3rdparty/meshoptimizer/demo/demo.html +++ b/3rdparty/meshoptimizer/demo/demo.html @@ -33,6 +33,7 @@ var canvas = document.getElementById("renderCanvas"); BABYLON.GLTF2.GLTFLoader.RegisterExtension("MESHOPT_compression", (loader) => new MESHOPT_compression(loader, MeshoptDecoder)); + BABYLON.GLTF2.GLTFLoader.RegisterExtension("KHR_quantized_geometry", (loader) => ({ name: "KHR_quantized_geometry", enabled: true })); var createScene = function () { var scene = new BABYLON.Scene(engine); diff --git a/3rdparty/meshoptimizer/demo/pirate.glb b/3rdparty/meshoptimizer/demo/pirate.glb index eaf3397c0c7e7a1d5adf1254444bf5dc9f635d94..9f8a664673bc7c50570535665facce56296492c9 100644 GIT binary patch delta 9316 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�RDP|?Ah?};NxqPGg@k1-@FCqq4Yo055gP# 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 Rl$!$fdw`}xb-7D~{|A(vT{!>% diff --git a/3rdparty/meshoptimizer/tools/gltfpack.cpp b/3rdparty/meshoptimizer/tools/gltfpack.cpp index e939f3f13..22b3664a1 100644 --- a/3rdparty/meshoptimizer/tools/gltfpack.cpp +++ b/3rdparty/meshoptimizer/tools/gltfpack.cpp @@ -73,7 +73,7 @@ struct Settings int pos_bits; int tex_bits; int nrm_bits; - bool nrm_unit; + bool nrm_unnormalized; int anim_freq; bool anim_const; @@ -841,6 +841,29 @@ void reindexMesh(Mesh& mesh) } } +void filterMesh(Mesh& mesh) +{ + unsigned int* indices = &mesh.indices[0]; + size_t total_indices = mesh.indices.size(); + + size_t write = 0; + + for (size_t i = 0; i < total_indices; i += 3) + { + unsigned int a = indices[i + 0], b = indices[i + 1], c = indices[i + 2]; + + if (a != b && a != c && b != c) + { + indices[write + 0] = a; + indices[write + 1] = b; + indices[write + 2] = c; + write += 3; + } + } + + mesh.indices.resize(write); +} + Stream* getStream(Mesh& mesh, cgltf_attribute_type type) { for (size_t i = 0; i < mesh.streams.size(); ++i) @@ -922,6 +945,9 @@ void sortBoneInfluences(Mesh& mesh) if (!joints || !weights) return; + // weights below cutoff can't be represented in quantized 8-bit storage + const float weight_cutoff = 0.5f / 255.f; + size_t vertex_count = mesh.streams[0].data.size(); for (size_t i = 0; i < vertex_count; ++i) @@ -933,7 +959,7 @@ void sortBoneInfluences(Mesh& mesh) int count = 0; for (int k = 0; k < 4; ++k) - if (wa.f[k] > 0.f) + if (wa.f[k] > weight_cutoff) { inf[count].i = ja.f[k]; inf[count].w = wa.f[k]; @@ -1156,20 +1182,51 @@ StreamFormat writeVertexStream(std::string& bin, const Stream& stream, const Qua { float pos_rscale = params.pos_scale == 0.f ? 0.f : 1.f / params.pos_scale; + int maxv = 0; + for (size_t i = 0; i < stream.data.size(); ++i) { const Attr& a = stream.data[i]; - int16_t v[4] = { - int16_t((a.f[0] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[0]) * pos_rscale, params.pos_bits)), - int16_t((a.f[1] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[1]) * pos_rscale, params.pos_bits)), - int16_t((a.f[2] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[2]) * pos_rscale, params.pos_bits)), - 0}; - bin.append(reinterpret_cast(v), sizeof(v)); + maxv = std::max(maxv, meshopt_quantizeUnorm(fabsf(a.f[0]) * pos_rscale, params.pos_bits)); + maxv = std::max(maxv, meshopt_quantizeUnorm(fabsf(a.f[1]) * pos_rscale, params.pos_bits)); + maxv = std::max(maxv, meshopt_quantizeUnorm(fabsf(a.f[2]) * pos_rscale, params.pos_bits)); } - StreamFormat format = {cgltf_type_vec3, cgltf_component_type_r_16, false, 8}; - return format; + if (maxv <= 127) + { + for (size_t i = 0; i < stream.data.size(); ++i) + { + const Attr& a = stream.data[i]; + + int8_t v[4] = { + int8_t((a.f[0] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[0]) * pos_rscale, params.pos_bits)), + int8_t((a.f[1] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[1]) * pos_rscale, params.pos_bits)), + int8_t((a.f[2] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[2]) * pos_rscale, params.pos_bits)), + 0}; + bin.append(reinterpret_cast(v), sizeof(v)); + } + + StreamFormat format = {cgltf_type_vec3, cgltf_component_type_r_8, false, 4}; + return format; + } + else + { + for (size_t i = 0; i < stream.data.size(); ++i) + { + const Attr& a = stream.data[i]; + + int16_t v[4] = { + int16_t((a.f[0] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[0]) * pos_rscale, params.pos_bits)), + int16_t((a.f[1] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[1]) * pos_rscale, params.pos_bits)), + int16_t((a.f[2] >= 0.f ? 1 : -1) * meshopt_quantizeUnorm(fabsf(a.f[2]) * pos_rscale, params.pos_bits)), + 0}; + bin.append(reinterpret_cast(v), sizeof(v)); + } + + StreamFormat format = {cgltf_type_vec3, cgltf_component_type_r_16, false, 8}; + return format; + } } } else if (stream.type == cgltf_attribute_type_texcoord) @@ -1195,8 +1252,8 @@ StreamFormat writeVertexStream(std::string& bin, const Stream& stream, const Qua } else if (stream.type == cgltf_attribute_type_normal) { - bool nrm_unit = has_targets || settings.nrm_unit; - int bits = nrm_unit ? (settings.nrm_bits > 8 ? 16 : 8) : settings.nrm_bits; + bool unnormalized = settings.nrm_unnormalized && !has_targets; + int bits = unnormalized ? settings.nrm_bits : (settings.nrm_bits > 8 ? 16 : 8); for (size_t i = 0; i < stream.data.size(); ++i) { @@ -1204,7 +1261,7 @@ StreamFormat writeVertexStream(std::string& bin, const Stream& stream, const Qua float nx = a.f[0], ny = a.f[1], nz = a.f[2]; - if (!nrm_unit) + if (unnormalized) rescaleNormal(nx, ny, nz); if (bits > 8) @@ -1240,8 +1297,8 @@ StreamFormat writeVertexStream(std::string& bin, const Stream& stream, const Qua } else if (stream.type == cgltf_attribute_type_tangent) { - bool nrm_unit = has_targets || settings.nrm_unit; - int bits = nrm_unit ? (settings.nrm_bits > 8 ? 16 : 8) : settings.nrm_bits; + bool unnormalized = settings.nrm_unnormalized && !has_targets; + int bits = unnormalized ? settings.nrm_bits : (settings.nrm_bits > 8 ? 16 : 8); for (size_t i = 0; i < stream.data.size(); ++i) { @@ -1249,7 +1306,7 @@ StreamFormat writeVertexStream(std::string& bin, const Stream& stream, const Qua float nx = a.f[0], ny = a.f[1], nz = a.f[2], nw = a.f[3]; - if (!nrm_unit) + if (unnormalized) rescaleNormal(nx, ny, nz); if (bits > 8) @@ -3143,6 +3200,7 @@ void process(cgltf_data* data, std::vector& meshes, const Settings& settin case cgltf_primitive_type_triangles: reindexMesh(mesh); + filterMesh(mesh); simplifyMesh(mesh, settings.simplify_threshold, settings.simplify_aggressive); optimizeMesh(mesh); sortBoneInfluences(mesh); @@ -3443,8 +3501,9 @@ void process(cgltf_data* data, std::vector& meshes, const Settings& settin json.append(data->json + data->asset.extras.start_offset, data->json + data->asset.extras.end_offset); } append(json, "}"); + append(json, ",\"extensionsUsed\":["); - append(json, "\"MESHOPT_quantized_geometry\""); + append(json, "\"KHR_quantized_geometry\""); if (settings.compress) { comma(json); @@ -3471,16 +3530,15 @@ void process(cgltf_data* data, std::vector& meshes, const Settings& settin append(json, "\"KHR_lights_punctual\""); } append(json, "]"); + + append(json, ",\"extensionsRequired\":["); + append(json, "\"KHR_quantized_geometry\""); if (settings.compress && !settings.fallback) { - append(json, ",\"extensionsRequired\":["); - // Note: ideally we should include MESHOPT_quantized_geometry in the required extension list (regardless of compression) - // This extension *only* allows the use of quantized attributes for positions/normals/etc. This happens to be supported - // by popular JS frameworks, however, Babylon.JS refuses to load files with unsupported required extensions. - // For now we don't include it in the list, which will be fixed at some point once this extension becomes official. + comma(json); append(json, "\"MESHOPT_compression\""); - append(json, "]"); } + append(json, "]"); if (!views.empty()) { @@ -3833,7 +3891,7 @@ int main(int argc, char** argv) } else if (strcmp(arg, "-vu") == 0) { - settings.nrm_unit = true; + settings.nrm_unnormalized = true; } else if (strcmp(arg, "-af") == 0 && i + 1 < argc && isdigit(argv[i + 1][0])) { @@ -3917,7 +3975,7 @@ int main(int argc, char** argv) fprintf(stderr, "-vp N: use N-bit quantization for positions (default: 14; N should be between 1 and 16)\n"); fprintf(stderr, "-vt N: use N-bit quantization for texture corodinates (default: 12; N should be between 1 and 16)\n"); fprintf(stderr, "-vn N: use N-bit quantization for normals and tangents (default: 8; N should be between 1 and 16)\n"); - fprintf(stderr, "-vu: use unit-length normal/tangent vectors (default: off)\n"); + fprintf(stderr, "-vu: use unnormalized normal/tangent vectors to improve compression (default: off)\n"); fprintf(stderr, "-af N: resample animations at N Hz (default: 30)\n"); fprintf(stderr, "-ac: keep constant animation tracks even if they don't modify the node transform\n"); fprintf(stderr, "-kn: keep named nodes and meshes attached to named nodes so that named nodes can be transformed externally\n");