From 9264c1dd6d511bf57d7b31d86f494d9cda920724 Mon Sep 17 00:00:00 2001 From: Viktor Kovacs Date: Sat, 27 Mar 2021 08:29:19 +0100 Subject: [PATCH] Add code for new version. --- .gitignore | 7 + .jshintrc | 39 + LICENSE.md | 21 + README.md | 41 + StartServer.bat | 1 + libs/jquery-3.5.1.min.js | 2 + libs/jquery.license.txt | 20 + libs/three.license.txt | 21 + libs/three.min-126.js | 2 + package.json | 19 + source/core/core.js | 4 + source/core/taskrunner.js | 41 + source/export/exporter.js | 26 + source/export/exporterbase.js | 81 + source/export/exportergltf.js | 404 ++ source/export/exporterobj.js | 107 + source/export/exporteroff.js | 33 + source/export/exporterply.js | 94 + source/export/exporterstl.js | 84 + source/export/exporterutils.js | 34 + source/external/three.converter.js | 195 + source/external/three.model.loader.js | 85 + source/geometry/coord2d.js | 33 + source/geometry/coord3d.js | 119 + source/geometry/geometry.js | 40 + source/geometry/matrix.js | 396 ++ source/geometry/transformation.js | 41 + source/geometry/tween.js | 29 + source/import/importer.js | 354 ++ source/import/importer3ds.js | 679 +++ source/import/importerbase.js | 83 + source/import/importergltf.js | 899 ++++ source/import/importerobj.js | 385 ++ source/import/importeroff.js | 103 + source/import/importerply.js | 428 ++ source/import/importerstl.js | 168 + source/import/importerutils.js | 72 + source/io/binaryreader.js | 109 + source/io/binarywriter.js | 92 + source/io/bufferutils.js | 56 + source/io/fileutils.js | 125 + source/io/textwriter.js | 41 + source/model/mesh.js | 100 + source/model/meshbuffer.js | 144 + source/model/model.js | 105 + source/model/modelentities.js | 229 + source/model/modelfinalization.js | 241 + source/model/modelutils.js | 163 + source/viewer/domutils.js | 21 + source/viewer/domviewer.js | 83 + source/viewer/navigation.js | 549 +++ source/viewer/viewer.js | 375 ++ test/framework/native_import.js | 14 + test/package.json | 8 + test/test.js | 27 + test/testfiles/3ds/cube_four_instances.3ds | Bin 0 -> 2409 bytes .../3ds/cube_instance_scale_rotation.3ds | Bin 0 -> 2409 bytes test/testfiles/3ds/cube_two_instances.3ds | Bin 0 -> 2057 bytes test/testfiles/3ds/cube_with_materials.3ds | Bin 0 -> 1881 bytes .../3ds/cube_with_texture_transformations.3ds | Bin 0 -> 1881 bytes test/testfiles/3ds/texture.png | Bin 0 -> 56249 bytes test/testfiles/bin/binary_content.bin | Bin 0 -> 166 bytes test/testfiles/bin/binary_content.txt | 46 + test/testfiles/bin/binarywriter.cpp | 105 + test/testfiles/gltf/Box/README.md | 10 + test/testfiles/gltf/Box/glTF-Binary/Box.glb | Bin 0 -> 1664 bytes test/testfiles/gltf/Box/glTF-Draco/Box.bin | Bin 0 -> 120 bytes test/testfiles/gltf/Box/glTF-Draco/Box.gltf | 152 + .../testfiles/gltf/Box/glTF-Embedded/Box.gltf | 142 + test/testfiles/gltf/Box/glTF/Box.gltf | 142 + test/testfiles/gltf/Box/glTF/Box0.bin | Bin 0 -> 648 bytes .../gltf/Box/screenshot/screenshot.png | Bin 0 -> 3276 bytes test/testfiles/gltf/BoxInterleaved/README.md | 10 + .../glTF-Binary/BoxInterleaved.glb | Bin 0 -> 1632 bytes .../glTF-Embedded/BoxInterleaved.gltf | 140 + .../BoxInterleaved/glTF/BoxInterleaved.bin | Bin 0 -> 648 bytes .../BoxInterleaved/glTF/BoxInterleaved.gltf | 140 + .../BoxInterleaved/screenshot/screenshot.png | Bin 0 -> 3276 bytes test/testfiles/gltf/BoxTextured/README.md | 10 + .../BoxTextured/glTF-Binary/BoxTextured.glb | Bin 0 -> 25756 bytes .../glTF-Embedded/BoxTextured.gltf | 181 + .../gltf/BoxTextured/glTF/BoxTextured.gltf | 181 + .../gltf/BoxTextured/glTF/BoxTextured0.bin | Bin 0 -> 840 bytes .../gltf/BoxTextured/glTF/CesiumLogoFlat.png | Bin 0 -> 23516 bytes .../BoxTextured/screenshot/screenshot.png | Bin 0 -> 10893 bytes .../testfiles/gltf/Mesh_PrimitiveMode/LICENSE | 21 + .../Mesh_PrimitiveMode_00.bin | Bin 0 -> 12288 bytes .../Mesh_PrimitiveMode_00.gltf | 71 + .../Mesh_PrimitiveMode_01.bin | Bin 0 -> 96 bytes .../Mesh_PrimitiveMode_01.gltf | 71 + .../Mesh_PrimitiveMode_02.bin | Bin 0 -> 48 bytes .../Mesh_PrimitiveMode_02.gltf | 71 + .../Mesh_PrimitiveMode_03.bin | Bin 0 -> 60 bytes .../Mesh_PrimitiveMode_03.gltf | 71 + .../Mesh_PrimitiveMode_04.bin | Bin 0 -> 48 bytes .../Mesh_PrimitiveMode_04.gltf | 71 + .../Mesh_PrimitiveMode_05.bin | Bin 0 -> 48 bytes .../Mesh_PrimitiveMode_05.gltf | 71 + .../Mesh_PrimitiveMode_06.bin | Bin 0 -> 72 bytes .../Mesh_PrimitiveMode_06.gltf | 70 + .../Mesh_PrimitiveMode_07.bin | Bin 0 -> 16384 bytes .../Mesh_PrimitiveMode_07.gltf | 85 + .../Mesh_PrimitiveMode_08.bin | Bin 0 -> 80 bytes .../Mesh_PrimitiveMode_08.gltf | 85 + .../Mesh_PrimitiveMode_09.bin | Bin 0 -> 64 bytes .../Mesh_PrimitiveMode_09.gltf | 85 + .../Mesh_PrimitiveMode_10.bin | Bin 0 -> 68 bytes .../Mesh_PrimitiveMode_10.gltf | 85 + .../Mesh_PrimitiveMode_11.bin | Bin 0 -> 64 bytes .../Mesh_PrimitiveMode_11.gltf | 85 + .../Mesh_PrimitiveMode_12.bin | Bin 0 -> 64 bytes .../Mesh_PrimitiveMode_12.gltf | 85 + .../Mesh_PrimitiveMode_13.bin | Bin 0 -> 72 bytes .../Mesh_PrimitiveMode_13.gltf | 84 + .../Mesh_PrimitiveMode_14.bin | Bin 0 -> 54 bytes .../Mesh_PrimitiveMode_14.gltf | 84 + .../Mesh_PrimitiveMode_15.bin | Bin 0 -> 60 bytes .../Mesh_PrimitiveMode_15.gltf | 84 + test/testfiles/gltf/OrientationTest/README.md | 27 + .../glTF-Binary/OrientationTest.glb | Bin 0 -> 38920 bytes .../glTF-Embedded/OrientationTest.gltf | 1258 ++++++ .../OrientationTest/glTF/OrientationTest.bin | Bin 0 -> 27168 bytes .../OrientationTest/glTF/OrientationTest.gltf | 1258 ++++++ .../screenshot/OrientationTestFail.png | Bin 0 -> 58520 bytes .../OrientationTest/screenshot/screenshot.png | Bin 0 -> 44099 bytes test/testfiles/gltf/SimpleMeshes/README.md | 25 + .../glTF-Embedded/SimpleMeshes.gltf | 85 + .../gltf/SimpleMeshes/glTF/SimpleMeshes.gltf | 84 + .../gltf/SimpleMeshes/glTF/triangle.bin | Bin 0 -> 80 bytes .../SimpleMeshes/screenshot/screenshot.png | Bin 0 -> 775 bytes .../gltf/SimpleMeshes/screenshot/triangle.png | Bin 0 -> 62895 bytes .../gltf/SimpleSparseAccessor/README.md | 22 + .../glTF-Embedded/SimpleSparseAccessor.gltf | 77 + .../glTF/SimpleSparseAccessor.bin | Bin 0 -> 284 bytes .../glTF/SimpleSparseAccessor.gltf | 106 + .../SimpleSparseAccessorDescription.png | Bin 0 -> 81348 bytes .../screenshot/screenshot.png | Bin 0 -> 7103 bytes .../simpleSparseAccessorStructure.png | Bin 0 -> 107522 bytes test/testfiles/gltf/Triangle/README.md | 15 + .../gltf/Triangle/glTF-Embedded/Triangle.gltf | 70 + .../gltf/Triangle/glTF/Triangle.gltf | 70 + .../gltf/Triangle/glTF/simpleTriangle.bin | Bin 0 -> 44 bytes .../gltf/Triangle/screenshot/screenshot.png | Bin 0 -> 836 bytes .../Triangle/screenshot/simpleTriangle.png | Bin 0 -> 43858 bytes .../gltf/TriangleWithoutIndices/README.md | 15 + .../glTF-Embedded/TriangleWithoutIndices.gltf | 54 + .../glTF/TriangleWithoutIndices.gltf | 55 + .../glTF/triangleWithoutIndices.bin | Bin 0 -> 36 bytes .../screenshot/screenshot.png | Bin 0 -> 836 bytes .../screenshot/triangleWithoutIndices.png | Bin 0 -> 25349 bytes test/testfiles/obj/cube with white spaces.mtl | 25 + test/testfiles/obj/cube with white spaces.obj | 38 + test/testfiles/obj/cube_rgb.mtl | 20 + test/testfiles/obj/cube_rgb.obj | 37 + test/testfiles/obj/cube_texture.png | Bin 0 -> 56249 bytes test/testfiles/obj/cube_with_materials.mtl | 25 + test/testfiles/obj/cube_with_materials.obj | 38 + .../obj/cube_with_materials_comments.mtl | 25 + .../obj/cube_with_materials_comments.obj | 38 + test/testfiles/obj/empty_meshes.obj | 16 + test/testfiles/obj/hundred_cubes.mtl | 14 + test/testfiles/obj/hundred_cubes.obj | 1603 +++++++ test/testfiles/obj/icosahedron.obj | 61 + test/testfiles/obj/materials.mtl | 9 + test/testfiles/obj/single_rectangle.obj | 5 + test/testfiles/obj/single_triangle.obj | 4 + .../testfiles/obj/single_triangle_in_mesh.obj | 5 + .../obj/single_triangle_negative_indices.obj | 4 + .../obj/single_triangle_with_comments.obj | 15 + .../obj/single_triangle_with_material.obj | 9 + .../single_triangle_with_normals_and_uvs.obj | 8 + .../obj/two_meshes_same_vertices.obj | 10 + .../obj/two_meshes_with_same_name.obj | 10 + test/testfiles/obj/two_triangles.obj | 10 + .../testfiles/obj/two_triangles_in_meshes.obj | 12 + .../obj/two_triangles_with_material.obj | 14 + test/testfiles/off/cube.off | 19 + test/testfiles/off/single_rectangle.off | 10 + test/testfiles/off/single_triangle.off | 6 + .../off/single_triangle_with_comments.off | 20 + test/testfiles/off/two_triangles.off | 14 + test/testfiles/ply/cube.ply | 25 + test/testfiles/ply/cube_meshlab_ascii.ply | 30 + test/testfiles/ply/cube_meshlab_binary.ply | Bin 0 -> 447 bytes test/testfiles/ply/cube_rgb.ply | 35 + test/testfiles/ply/cube_rgb_binary.ply | Bin 0 -> 911 bytes test/testfiles/ply/single_rectangle.ply | 16 + test/testfiles/ply/single_triangle.ply | 13 + .../ply/single_triangle_with_comments.ply | 18 + test/testfiles/ply/two_triangles.ply | 20 + test/testfiles/stl/cube_meshlab_ascii.stl | 86 + test/testfiles/stl/cube_meshlab_binary.stl | Bin 0 -> 684 bytes test/testfiles/stl/single_triangle.stl | 9 + .../stl/single_triangle_no_normal.stl | 9 + .../stl/single_triangle_with_comments.stl | 19 + test/testfiles/stl/stl_ascii.stl | 4006 +++++++++++++++++ test/testfiles/stl/stl_binary.stl | Bin 0 -> 36484 bytes test/testfiles/stl/two_triangles.stl | 16 + test/tests/exporter_test.js | 364 ++ test/tests/fileutils_test.js | 41 + test/tests/geometry_test.js | 146 + test/tests/importer3ds_test.js | 161 + test/tests/importergltf_test.js | 444 ++ test/tests/importerobj_test.js | 518 +++ test/tests/importeroff_test.js | 137 + test/tests/importerply_test.js | 212 + test/tests/importerstl_test.js | 204 + test/tests/importerutils_test.js | 17 + test/tests/io_test.js | 92 + test/tests/mesh_test.js | 109 + test/tests/meshbuffer_test.js | 356 ++ test/tests/model_test.js | 152 + test/tests/modelutils_test.js | 81 + test/tests/taskrunner_test.js | 31 + test/utils/importall.js | 10 + test/utils/testfiles.js | 104 + test/utils/testutils.js | 114 + tools/config.json | 65 + tools/create_package.py | 148 + tools/generate_test_obj.py | 192 + tools/lib/tools_lib.py | 111 + tools/optimize_svg_files.py | 15 + tools/sandbox/index.html | 63 + tools/update_includes.py | 34 + website/assets/fonts/Quicksand/OFL.txt | 93 + .../assets/fonts/Quicksand/Quicksand-Bold.ttf | Bin 0 -> 77028 bytes .../fonts/Quicksand/Quicksand-Light.ttf | Bin 0 -> 77104 bytes .../fonts/Quicksand/Quicksand-Medium.ttf | Bin 0 -> 77464 bytes .../fonts/Quicksand/Quicksand-Regular.ttf | Bin 0 -> 77420 bytes .../fonts/Quicksand/Quicksand-SemiBold.ttf | Bin 0 -> 77396 bytes .../assets/images/3dviewer_net_favicon.png | Bin 0 -> 779 bytes website/assets/images/3dviewer_net_logo.svg | 1 + .../images/3dviewer_net_logo_social.png | Bin 0 -> 24660 bytes .../images/3dviewer_net_logo_social.svg | 278 ++ .../assets/images/3dviewer_net_logo_text.svg | 1 + website/assets/images/dialog/arrow_down.svg | 1 + .../assets/images/dialog/file_download.svg | 1 + website/assets/images/header/donate.svg | 1 + website/assets/images/header/donate_hover.svg | 1 + website/assets/images/header/feedback.svg | 1 + .../assets/images/header/feedback_hover.svg | 1 + website/assets/images/header/github.svg | 1 + website/assets/images/header/github_hover.svg | 1 + website/assets/images/header/info.svg | 1 + website/assets/images/header/info_hover.svg | 1 + website/assets/images/toolbar/embed.svg | 1 + website/assets/images/toolbar/export.svg | 1 + website/assets/images/toolbar/fit.svg | 1 + website/assets/images/toolbar/fix_up_off.svg | 1 + website/assets/images/toolbar/fix_up_on.svg | 1 + website/assets/images/toolbar/flip.svg | 1 + website/assets/images/toolbar/open.svg | 1 + website/assets/images/toolbar/open_url.svg | 1 + website/assets/images/toolbar/up_y.svg | 1 + website/assets/images/toolbar/up_z.svg | 1 + website/assets/images/tree/arrow_down.svg | 1 + website/assets/images/tree/arrow_up.svg | 1 + website/assets/images/tree/details.svg | 1 + website/assets/images/tree/files.svg | 1 + website/assets/images/tree/fit_tree.svg | 1 + website/assets/images/tree/hidden.svg | 1 + website/assets/images/tree/materials.svg | 1 + website/assets/images/tree/meshes.svg | 1 + website/assets/images/tree/missing_files.svg | 1 + website/assets/images/tree/model.svg | 1 + website/assets/images/tree/open.svg | 1 + website/assets/images/tree/visible.svg | 1 + website/assets/models/logo.mtl | 14 + website/assets/models/logo.obj | 39 + website/assets/models/solids.mtl | 24 + website/assets/models/solids.obj | 116 + website/embed.html | 108 + website/embed_iframe.html | 35 + website/embed_selfhost.html | 80 + website/examples.html | 24 + website/index.html | 149 + website/info/index.html | 232 + website/info/info.css | 153 + website/o3dv/dialogs.js | 373 ++ website/o3dv/embed.js | 69 + website/o3dv/hashhandler.js | 110 + website/o3dv/info.js | 156 + website/o3dv/loader.js | 61 + website/o3dv/menu.js | 259 ++ website/o3dv/modal.js | 90 + website/o3dv/modeldata.js | 127 + website/o3dv/toolbar.js | 84 + website/o3dv/treeview.js | 263 ++ website/o3dv/utils.js | 138 + website/o3dv/website.css | 682 +++ website/o3dv/website.js | 448 ++ website/robots.txt | 2 + 292 files changed, 28019 insertions(+) create mode 100644 .gitignore create mode 100644 .jshintrc create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 StartServer.bat create mode 100644 libs/jquery-3.5.1.min.js create mode 100644 libs/jquery.license.txt create mode 100644 libs/three.license.txt create mode 100644 libs/three.min-126.js create mode 100644 package.json create mode 100644 source/core/core.js create mode 100644 source/core/taskrunner.js create mode 100644 source/export/exporter.js create mode 100644 source/export/exporterbase.js create mode 100644 source/export/exportergltf.js create mode 100644 source/export/exporterobj.js create mode 100644 source/export/exporteroff.js create mode 100644 source/export/exporterply.js create mode 100644 source/export/exporterstl.js create mode 100644 source/export/exporterutils.js create mode 100644 source/external/three.converter.js create mode 100644 source/external/three.model.loader.js create mode 100644 source/geometry/coord2d.js create mode 100644 source/geometry/coord3d.js create mode 100644 source/geometry/geometry.js create mode 100644 source/geometry/matrix.js create mode 100644 source/geometry/transformation.js create mode 100644 source/geometry/tween.js create mode 100644 source/import/importer.js create mode 100644 source/import/importer3ds.js create mode 100644 source/import/importerbase.js create mode 100644 source/import/importergltf.js create mode 100644 source/import/importerobj.js create mode 100644 source/import/importeroff.js create mode 100644 source/import/importerply.js create mode 100644 source/import/importerstl.js create mode 100644 source/import/importerutils.js create mode 100644 source/io/binaryreader.js create mode 100644 source/io/binarywriter.js create mode 100644 source/io/bufferutils.js create mode 100644 source/io/fileutils.js create mode 100644 source/io/textwriter.js create mode 100644 source/model/mesh.js create mode 100644 source/model/meshbuffer.js create mode 100644 source/model/model.js create mode 100644 source/model/modelentities.js create mode 100644 source/model/modelfinalization.js create mode 100644 source/model/modelutils.js create mode 100644 source/viewer/domutils.js create mode 100644 source/viewer/domviewer.js create mode 100644 source/viewer/navigation.js create mode 100644 source/viewer/viewer.js create mode 100644 test/framework/native_import.js create mode 100644 test/package.json create mode 100644 test/test.js create mode 100644 test/testfiles/3ds/cube_four_instances.3ds create mode 100644 test/testfiles/3ds/cube_instance_scale_rotation.3ds create mode 100644 test/testfiles/3ds/cube_two_instances.3ds create mode 100644 test/testfiles/3ds/cube_with_materials.3ds create mode 100644 test/testfiles/3ds/cube_with_texture_transformations.3ds create mode 100644 test/testfiles/3ds/texture.png create mode 100644 test/testfiles/bin/binary_content.bin create mode 100644 test/testfiles/bin/binary_content.txt create mode 100644 test/testfiles/bin/binarywriter.cpp create mode 100644 test/testfiles/gltf/Box/README.md create mode 100644 test/testfiles/gltf/Box/glTF-Binary/Box.glb create mode 100644 test/testfiles/gltf/Box/glTF-Draco/Box.bin create mode 100644 test/testfiles/gltf/Box/glTF-Draco/Box.gltf create mode 100644 test/testfiles/gltf/Box/glTF-Embedded/Box.gltf create mode 100644 test/testfiles/gltf/Box/glTF/Box.gltf create mode 100644 test/testfiles/gltf/Box/glTF/Box0.bin create mode 100644 test/testfiles/gltf/Box/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/BoxInterleaved/README.md create mode 100644 test/testfiles/gltf/BoxInterleaved/glTF-Binary/BoxInterleaved.glb create mode 100644 test/testfiles/gltf/BoxInterleaved/glTF-Embedded/BoxInterleaved.gltf create mode 100644 test/testfiles/gltf/BoxInterleaved/glTF/BoxInterleaved.bin create mode 100644 test/testfiles/gltf/BoxInterleaved/glTF/BoxInterleaved.gltf create mode 100644 test/testfiles/gltf/BoxInterleaved/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/BoxTextured/README.md create mode 100644 test/testfiles/gltf/BoxTextured/glTF-Binary/BoxTextured.glb create mode 100644 test/testfiles/gltf/BoxTextured/glTF-Embedded/BoxTextured.gltf create mode 100644 test/testfiles/gltf/BoxTextured/glTF/BoxTextured.gltf create mode 100644 test/testfiles/gltf/BoxTextured/glTF/BoxTextured0.bin create mode 100644 test/testfiles/gltf/BoxTextured/glTF/CesiumLogoFlat.png create mode 100644 test/testfiles/gltf/BoxTextured/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/LICENSE create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_00.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_00.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_01.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_01.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_02.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_02.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_03.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_03.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.gltf create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.bin create mode 100644 test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.gltf create mode 100644 test/testfiles/gltf/OrientationTest/README.md create mode 100644 test/testfiles/gltf/OrientationTest/glTF-Binary/OrientationTest.glb create mode 100644 test/testfiles/gltf/OrientationTest/glTF-Embedded/OrientationTest.gltf create mode 100644 test/testfiles/gltf/OrientationTest/glTF/OrientationTest.bin create mode 100644 test/testfiles/gltf/OrientationTest/glTF/OrientationTest.gltf create mode 100644 test/testfiles/gltf/OrientationTest/screenshot/OrientationTestFail.png create mode 100644 test/testfiles/gltf/OrientationTest/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/SimpleMeshes/README.md create mode 100644 test/testfiles/gltf/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf create mode 100644 test/testfiles/gltf/SimpleMeshes/glTF/SimpleMeshes.gltf create mode 100644 test/testfiles/gltf/SimpleMeshes/glTF/triangle.bin create mode 100644 test/testfiles/gltf/SimpleMeshes/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/SimpleMeshes/screenshot/triangle.png create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/README.md create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/glTF/SimpleSparseAccessor.bin create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/glTF/SimpleSparseAccessor.gltf create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/screenshot/SimpleSparseAccessorDescription.png create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/SimpleSparseAccessor/screenshot/simpleSparseAccessorStructure.png create mode 100644 test/testfiles/gltf/Triangle/README.md create mode 100644 test/testfiles/gltf/Triangle/glTF-Embedded/Triangle.gltf create mode 100644 test/testfiles/gltf/Triangle/glTF/Triangle.gltf create mode 100644 test/testfiles/gltf/Triangle/glTF/simpleTriangle.bin create mode 100644 test/testfiles/gltf/Triangle/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/Triangle/screenshot/simpleTriangle.png create mode 100644 test/testfiles/gltf/TriangleWithoutIndices/README.md create mode 100644 test/testfiles/gltf/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf create mode 100644 test/testfiles/gltf/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf create mode 100644 test/testfiles/gltf/TriangleWithoutIndices/glTF/triangleWithoutIndices.bin create mode 100644 test/testfiles/gltf/TriangleWithoutIndices/screenshot/screenshot.png create mode 100644 test/testfiles/gltf/TriangleWithoutIndices/screenshot/triangleWithoutIndices.png create mode 100644 test/testfiles/obj/cube with white spaces.mtl create mode 100644 test/testfiles/obj/cube with white spaces.obj create mode 100644 test/testfiles/obj/cube_rgb.mtl create mode 100644 test/testfiles/obj/cube_rgb.obj create mode 100644 test/testfiles/obj/cube_texture.png create mode 100644 test/testfiles/obj/cube_with_materials.mtl create mode 100644 test/testfiles/obj/cube_with_materials.obj create mode 100644 test/testfiles/obj/cube_with_materials_comments.mtl create mode 100644 test/testfiles/obj/cube_with_materials_comments.obj create mode 100644 test/testfiles/obj/empty_meshes.obj create mode 100644 test/testfiles/obj/hundred_cubes.mtl create mode 100644 test/testfiles/obj/hundred_cubes.obj create mode 100644 test/testfiles/obj/icosahedron.obj create mode 100644 test/testfiles/obj/materials.mtl create mode 100644 test/testfiles/obj/single_rectangle.obj create mode 100644 test/testfiles/obj/single_triangle.obj create mode 100644 test/testfiles/obj/single_triangle_in_mesh.obj create mode 100644 test/testfiles/obj/single_triangle_negative_indices.obj create mode 100644 test/testfiles/obj/single_triangle_with_comments.obj create mode 100644 test/testfiles/obj/single_triangle_with_material.obj create mode 100644 test/testfiles/obj/single_triangle_with_normals_and_uvs.obj create mode 100644 test/testfiles/obj/two_meshes_same_vertices.obj create mode 100644 test/testfiles/obj/two_meshes_with_same_name.obj create mode 100644 test/testfiles/obj/two_triangles.obj create mode 100644 test/testfiles/obj/two_triangles_in_meshes.obj create mode 100644 test/testfiles/obj/two_triangles_with_material.obj create mode 100644 test/testfiles/off/cube.off create mode 100644 test/testfiles/off/single_rectangle.off create mode 100644 test/testfiles/off/single_triangle.off create mode 100644 test/testfiles/off/single_triangle_with_comments.off create mode 100644 test/testfiles/off/two_triangles.off create mode 100644 test/testfiles/ply/cube.ply create mode 100644 test/testfiles/ply/cube_meshlab_ascii.ply create mode 100644 test/testfiles/ply/cube_meshlab_binary.ply create mode 100644 test/testfiles/ply/cube_rgb.ply create mode 100644 test/testfiles/ply/cube_rgb_binary.ply create mode 100644 test/testfiles/ply/single_rectangle.ply create mode 100644 test/testfiles/ply/single_triangle.ply create mode 100644 test/testfiles/ply/single_triangle_with_comments.ply create mode 100644 test/testfiles/ply/two_triangles.ply create mode 100644 test/testfiles/stl/cube_meshlab_ascii.stl create mode 100644 test/testfiles/stl/cube_meshlab_binary.stl create mode 100644 test/testfiles/stl/single_triangle.stl create mode 100644 test/testfiles/stl/single_triangle_no_normal.stl create mode 100644 test/testfiles/stl/single_triangle_with_comments.stl create mode 100644 test/testfiles/stl/stl_ascii.stl create mode 100644 test/testfiles/stl/stl_binary.stl create mode 100644 test/testfiles/stl/two_triangles.stl create mode 100644 test/tests/exporter_test.js create mode 100644 test/tests/fileutils_test.js create mode 100644 test/tests/geometry_test.js create mode 100644 test/tests/importer3ds_test.js create mode 100644 test/tests/importergltf_test.js create mode 100644 test/tests/importerobj_test.js create mode 100644 test/tests/importeroff_test.js create mode 100644 test/tests/importerply_test.js create mode 100644 test/tests/importerstl_test.js create mode 100644 test/tests/importerutils_test.js create mode 100644 test/tests/io_test.js create mode 100644 test/tests/mesh_test.js create mode 100644 test/tests/meshbuffer_test.js create mode 100644 test/tests/model_test.js create mode 100644 test/tests/modelutils_test.js create mode 100644 test/tests/taskrunner_test.js create mode 100644 test/utils/importall.js create mode 100644 test/utils/testfiles.js create mode 100644 test/utils/testutils.js create mode 100644 tools/config.json create mode 100644 tools/create_package.py create mode 100644 tools/generate_test_obj.py create mode 100644 tools/lib/tools_lib.py create mode 100644 tools/optimize_svg_files.py create mode 100644 tools/sandbox/index.html create mode 100644 tools/update_includes.py create mode 100644 website/assets/fonts/Quicksand/OFL.txt create mode 100644 website/assets/fonts/Quicksand/Quicksand-Bold.ttf create mode 100644 website/assets/fonts/Quicksand/Quicksand-Light.ttf create mode 100644 website/assets/fonts/Quicksand/Quicksand-Medium.ttf create mode 100644 website/assets/fonts/Quicksand/Quicksand-Regular.ttf create mode 100644 website/assets/fonts/Quicksand/Quicksand-SemiBold.ttf create mode 100644 website/assets/images/3dviewer_net_favicon.png create mode 100644 website/assets/images/3dviewer_net_logo.svg create mode 100644 website/assets/images/3dviewer_net_logo_social.png create mode 100644 website/assets/images/3dviewer_net_logo_social.svg create mode 100644 website/assets/images/3dviewer_net_logo_text.svg create mode 100644 website/assets/images/dialog/arrow_down.svg create mode 100644 website/assets/images/dialog/file_download.svg create mode 100644 website/assets/images/header/donate.svg create mode 100644 website/assets/images/header/donate_hover.svg create mode 100644 website/assets/images/header/feedback.svg create mode 100644 website/assets/images/header/feedback_hover.svg create mode 100644 website/assets/images/header/github.svg create mode 100644 website/assets/images/header/github_hover.svg create mode 100644 website/assets/images/header/info.svg create mode 100644 website/assets/images/header/info_hover.svg create mode 100644 website/assets/images/toolbar/embed.svg create mode 100644 website/assets/images/toolbar/export.svg create mode 100644 website/assets/images/toolbar/fit.svg create mode 100644 website/assets/images/toolbar/fix_up_off.svg create mode 100644 website/assets/images/toolbar/fix_up_on.svg create mode 100644 website/assets/images/toolbar/flip.svg create mode 100644 website/assets/images/toolbar/open.svg create mode 100644 website/assets/images/toolbar/open_url.svg create mode 100644 website/assets/images/toolbar/up_y.svg create mode 100644 website/assets/images/toolbar/up_z.svg create mode 100644 website/assets/images/tree/arrow_down.svg create mode 100644 website/assets/images/tree/arrow_up.svg create mode 100644 website/assets/images/tree/details.svg create mode 100644 website/assets/images/tree/files.svg create mode 100644 website/assets/images/tree/fit_tree.svg create mode 100644 website/assets/images/tree/hidden.svg create mode 100644 website/assets/images/tree/materials.svg create mode 100644 website/assets/images/tree/meshes.svg create mode 100644 website/assets/images/tree/missing_files.svg create mode 100644 website/assets/images/tree/model.svg create mode 100644 website/assets/images/tree/open.svg create mode 100644 website/assets/images/tree/visible.svg create mode 100644 website/assets/models/logo.mtl create mode 100644 website/assets/models/logo.obj create mode 100644 website/assets/models/solids.mtl create mode 100644 website/assets/models/solids.obj create mode 100644 website/embed.html create mode 100644 website/embed_iframe.html create mode 100644 website/embed_selfhost.html create mode 100644 website/examples.html create mode 100644 website/index.html create mode 100644 website/info/index.html create mode 100644 website/info/info.css create mode 100644 website/o3dv/dialogs.js create mode 100644 website/o3dv/embed.js create mode 100644 website/o3dv/hashhandler.js create mode 100644 website/o3dv/info.js create mode 100644 website/o3dv/loader.js create mode 100644 website/o3dv/menu.js create mode 100644 website/o3dv/modal.js create mode 100644 website/o3dv/modeldata.js create mode 100644 website/o3dv/toolbar.js create mode 100644 website/o3dv/treeview.js create mode 100644 website/o3dv/utils.js create mode 100644 website/o3dv/website.css create mode 100644 website/o3dv/website.js create mode 100644 website/robots.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..afac5a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build/* +website_meta_data.txt +website_analytics_data.txt +website_script_data.txt +package-lock.json +node_modules +__pycache__ diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..ec9cff1 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,39 @@ +{ + "esversion" : 6, + "curly" : true, + "forin" : true, + "latedef" : true, + "nonew" : true, + "quotmark" : true, + "funcscope" : true, + "lastsemic" : true, + "loopfunc" : true, + "shadow" : false, + "undef" : true, + "unused" : false, + "bitwise" : false, + "freeze" : true, + "leanswitch" : true, + "eqeqeq" : true, + "futurehostile" : true, + "regexpu" : true, + "varstmt" : true, + "globals" : { + "OV" : true, + "THREE" : false, + "TextDecoder" : false, + "XMLHttpRequest" : false, + "FileReader" : false, + "Blob" : false, + "URL" : false, + "window" : false, + "document" : false, + "setTimeout" : false, + "requestAnimationFrame" : false, + "getComputedStyle" : false, + "alert" : false, + "atob" : false, + "console" : false, + "$" : false + } +} diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..8e84f9c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Viktor Kovacs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..98e56f9 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Online 3D Viewer + +This repository contains the source code of the https://3dviewer.net website. The website can open several 3D file formats and visualize the model in your browser. + +## Supported file formats + +### Import + +- obj (with mtl and texture) +- 3ds (with texture) +- stl (ascii and binary) +- ply (ascii and binary) +- gltf (ascii and binary) +- off (ascii only) + +### Export + +- obj (with mtl) +- stl (ascii and binary) +- ply (ascii and binary) +- off (ascii only) + +## Features + +- Load model: + - Select files from a file browser dialog + - Drag and drop files from your computer + - Specify files by web url + - Specify files by web url in hash parameters +- Explore model: + - Orbit, pan, zoom + - Set up direction + - Fit to window +- Investigate model: + - List used and missing files + - List all materials and meshes + - Show/hide and zoom to a specific mesh + - List materials used by a specific mesh + - Show model information (model size, vertex and polygon count) +- Export model to various format +- Embed viewer in your website diff --git a/StartServer.bat b/StartServer.bat new file mode 100644 index 0000000..69a4f71 --- /dev/null +++ b/StartServer.bat @@ -0,0 +1 @@ +python -m http.server 8000 diff --git a/libs/jquery-3.5.1.min.js b/libs/jquery-3.5.1.min.js new file mode 100644 index 0000000..b061403 --- /dev/null +++ b/libs/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0=0;--a){var o=this.tryEntries[a],s=o.completion;if("root"===o.tryLoc)return i("end");if(o.tryLoc<=this.prev){var l=r.call(o,"catchLoc"),c=r.call(o,"finallyLoc");if(l&&c){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),A(n),m}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;A(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:R(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),m}},t}("object"==typeof module?module.exports:{});try{regeneratorRuntime=e}catch(t){Function("r","regeneratorRuntime = r")(e)}var n="126",r=100,i=300,a=301,o=302,s=303,l=304,c=306,u=307,h=1e3,d=1001,p=1002,f=1003,m=1004,v=1005,g=1006,y=1007,x=1008,_=1009,b=1012,w=1014,M=1015,S=1016,T=1020,E=1022,A=1023,L=1026,R=1027,C=33776,P=33777,D=33778,I=33779,N=35840,B=35841,O=35842,z=35843,F=37492,H=37496,G=2300,U=2301,k=2302,V=2400,W=2401,j=2402,q=2500,X=2501,Y=3e3,Z=3001,J=3007,Q=3002,K=3004,$=3005,tt=3006,et=7680,nt=35044,rt=35048,it="300 es";function at(t,e,n,r,i,a,o){try{var s=t[a](o),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,i)}function ot(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=t[Symbol.iterator]()).next.bind(n)}function pt(){}Object.assign(pt.prototype,{addEventListener:function(t,e){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)},hasEventListener:function(t,e){if(void 0===this._listeners)return!1;var n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)},removeEventListener:function(t,e){if(void 0!==this._listeners){var n=this._listeners[t];if(void 0!==n){var r=n.indexOf(e);-1!==r&&n.splice(r,1)}}},dispatchEvent:function(t){if(void 0!==this._listeners){var e=this._listeners[t.type];if(void 0!==e){t.target=this;for(var n=e.slice(0),r=0,i=n.length;r>8&255]+ft[t>>16&255]+ft[t>>24&255]+"-"+ft[255&e]+ft[e>>8&255]+"-"+ft[e>>16&15|64]+ft[e>>24&255]+"-"+ft[63&n|128]+ft[n>>8&255]+"-"+ft[n>>16&255]+ft[n>>24&255]+ft[255&r]+ft[r>>8&255]+ft[r>>16&255]+ft[r>>24&255]).toUpperCase()},clamp:function(t,e,n){return Math.max(e,Math.min(n,t))},euclideanModulo:function(t,e){return(t%e+e)%e},mapLinear:function(t,e,n,r,i){return r+(t-e)*(i-r)/(n-e)},lerp:function(t,e,n){return(1-n)*t+n*e},damp:function(t,e,n,r){return gt.lerp(t,e,1-Math.exp(-n*r))},pingpong:function(t,e){return void 0===e&&(e=1),e-Math.abs(gt.euclideanModulo(t,2*e)-e)},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(vt=t%2147483647),((vt=16807*vt%2147483647)-1)/2147483646},degToRad:function(t){return t*gt.DEG2RAD},radToDeg:function(t){return t*gt.RAD2DEG},isPowerOfTwo:function(t){return 0==(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,n,r,i){var a=Math.cos,o=Math.sin,s=a(n/2),l=o(n/2),c=a((e+r)/2),u=o((e+r)/2),h=a((e-r)/2),d=o((e-r)/2),p=a((r-e)/2),f=o((r-e)/2);switch(i){case"XYX":t.set(s*u,l*h,l*d,s*c);break;case"YZY":t.set(l*d,s*u,l*h,s*c);break;case"ZXZ":t.set(l*h,l*d,s*u,s*c);break;case"XZX":t.set(s*u,l*f,l*p,s*c);break;case"YXY":t.set(l*p,s*u,l*f,s*c);break;case"ZYZ":t.set(l*f,l*p,s*u,s*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}},yt=function(){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.x=t,this.y=e}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setScalar=function(t){return this.x=t,this.y=t,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.setComponent=function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this},e.getComponent=function(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}},e.clone=function(){return new this.constructor(this.x,this.y)},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)},e.addScalar=function(t){return this.x+=t,this.y+=t,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.addScaledVector=function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this},e.sub=function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)},e.subScalar=function(t){return this.x-=t,this.y-=t,this},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.multiply=function(t){return this.x*=t.x,this.y*=t.y,this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.divide=function(t){return this.x/=t.x,this.y/=t.y,this},e.divideScalar=function(t){return this.multiplyScalar(1/t)},e.applyMatrix3=function(t){var e=this.x,n=this.y,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6],this.y=r[1]*e+r[4]*n+r[7],this},e.min=function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this},e.max=function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this},e.clamp=function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this},e.clampScalar=function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this},e.clampLength=function(t,e){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))},e.floor=function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},e.ceil=function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},e.round=function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},e.roundToZero=function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},e.negate=function(){return this.x=-this.x,this.y=-this.y,this},e.dot=function(t){return this.x*t.x+this.y*t.y},e.cross=function(t){return this.x*t.y-this.y*t.x},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.manhattanLength=function(){return Math.abs(this.x)+Math.abs(this.y)},e.normalize=function(){return this.divideScalar(this.length()||1)},e.angle=function(){var t=Math.atan2(-this.y,-this.x)+Math.PI;return t},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.distanceToSquared=function(t){var e=this.x-t.x,n=this.y-t.y;return e*e+n*n},e.manhattanDistanceTo=function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)},e.setLength=function(t){return this.normalize().multiplyScalar(t)},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.lerpVectors=function(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.fromArray=function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t},e.fromBufferAttribute=function(t,e,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this},e.rotateAround=function(t,e){var n=Math.cos(e),r=Math.sin(e),i=this.x-t.x,a=this.y-t.y;return this.x=i*n-a*r+t.x,this.y=i*r+a*n+t.y,this},e.random=function(){return this.x=Math.random(),this.y=Math.random(),this},st(t,[{key:"width",get:function(){return this.x},set:function(t){this.x=t}},{key:"height",get:function(){return this.y},set:function(t){this.y=t}}]),t}();yt.prototype.isVector2=!0;var xt,_t=function(){function t(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}var e=t.prototype;return e.set=function(t,e,n,r,i,a,o,s,l){var c=this.elements;return c[0]=t,c[1]=r,c[2]=o,c[3]=e,c[4]=i,c[5]=s,c[6]=n,c[7]=a,c[8]=l,this},e.identity=function(){return this.set(1,0,0,0,1,0,0,0,1),this},e.copy=function(t){var e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this},e.extractBasis=function(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this},e.setFromMatrix4=function(t){var e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},e.multiply=function(t){return this.multiplyMatrices(this,t)},e.premultiply=function(t){return this.multiplyMatrices(t,this)},e.multiplyMatrices=function(t,e){var n=t.elements,r=e.elements,i=this.elements,a=n[0],o=n[3],s=n[6],l=n[1],c=n[4],u=n[7],h=n[2],d=n[5],p=n[8],f=r[0],m=r[3],v=r[6],g=r[1],y=r[4],x=r[7],_=r[2],b=r[5],w=r[8];return i[0]=a*f+o*g+s*_,i[3]=a*m+o*y+s*b,i[6]=a*v+o*x+s*w,i[1]=l*f+c*g+u*_,i[4]=l*m+c*y+u*b,i[7]=l*v+c*x+u*w,i[2]=h*f+d*g+p*_,i[5]=h*m+d*y+p*b,i[8]=h*v+d*x+p*w,this},e.multiplyScalar=function(t){var e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this},e.determinant=function(){var t=this.elements,e=t[0],n=t[1],r=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8];return e*a*c-e*o*l-n*i*c+n*o*s+r*i*l-r*a*s},e.invert=function(){var t=this.elements,e=t[0],n=t[1],r=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=c*a-o*l,h=o*s-c*i,d=l*i-a*s,p=e*u+n*h+r*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);var f=1/p;return t[0]=u*f,t[1]=(r*l-c*n)*f,t[2]=(o*n-r*a)*f,t[3]=h*f,t[4]=(c*e-r*s)*f,t[5]=(r*i-o*e)*f,t[6]=d*f,t[7]=(n*s-l*e)*f,t[8]=(a*e-n*i)*f,this},e.transpose=function(){var t,e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this},e.getNormalMatrix=function(t){return this.setFromMatrix4(t).invert().transpose()},e.transposeIntoArray=function(t){var e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this},e.setUvTransform=function(t,e,n,r,i,a,o){var s=Math.cos(i),l=Math.sin(i);return this.set(n*s,n*l,-n*(s*a+l*o)+a+t,-r*l,r*s,-r*(-l*a+s*o)+o+e,0,0,1),this},e.scale=function(t,e){var n=this.elements;return n[0]*=t,n[3]*=t,n[6]*=t,n[1]*=e,n[4]*=e,n[7]*=e,this},e.rotate=function(t){var e=Math.cos(t),n=Math.sin(t),r=this.elements,i=r[0],a=r[3],o=r[6],s=r[1],l=r[4],c=r[7];return r[0]=e*i+n*s,r[3]=e*a+n*l,r[6]=e*o+n*c,r[1]=-n*i+e*s,r[4]=-n*a+e*l,r[7]=-n*o+e*c,this},e.translate=function(t,e){var n=this.elements;return n[0]+=t*n[2],n[3]+=t*n[5],n[6]+=t*n[8],n[1]+=e*n[2],n[4]+=e*n[5],n[7]+=e*n[8],this},e.equals=function(t){for(var e=this.elements,n=t.elements,r=0;r<9;r++)if(e[r]!==n[r])return!1;return!0},e.fromArray=function(t,e){void 0===e&&(e=0);for(var n=0;n<9;n++)this.elements[n]=t[n+e];return this},e.toArray=function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t},e.clone=function(){return(new this.constructor).fromArray(this.elements)},t}();_t.prototype.isMatrix3=!0;var bt={getDataURL:function(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;var e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===xt&&(xt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),xt.width=t.width,xt.height=t.height;var n=xt.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=xt}return e.width>2048||e.height>2048?e.toDataURL("image/jpeg",.6):e.toDataURL("image/png")}},wt=0,Mt=function(t){function e(n,r,i,a,o,s,l,c,u,h){var p;return void 0===n&&(n=e.DEFAULT_IMAGE),void 0===r&&(r=e.DEFAULT_MAPPING),void 0===i&&(i=d),void 0===a&&(a=d),void 0===o&&(o=g),void 0===s&&(s=x),void 0===l&&(l=A),void 0===c&&(c=_),void 0===u&&(u=1),void 0===h&&(h=Y),p=t.call(this)||this,Object.defineProperty(ut(p),"id",{value:wt++}),p.uuid=gt.generateUUID(),p.name="",p.image=n,p.mipmaps=[],p.mapping=r,p.wrapS=i,p.wrapT=a,p.magFilter=o,p.minFilter=s,p.anisotropy=u,p.format=l,p.internalFormat=null,p.type=c,p.offset=new yt(0,0),p.repeat=new yt(1,1),p.center=new yt(0,0),p.rotation=0,p.matrixAutoUpdate=!0,p.matrix=new _t,p.generateMipmaps=!0,p.premultiplyAlpha=!1,p.flipY=!0,p.unpackAlignment=4,p.encoding=h,p.version=0,p.onUpdate=null,p}lt(e,t);var n=e.prototype;return n.updateMatrix=function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},n.clone=function(){return(new this.constructor).copy(this)},n.copy=function(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this},n.toJSON=function(t){var e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];var n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var r=this.image;if(void 0===r.uuid&&(r.uuid=gt.generateUUID()),!e&&void 0===t.images[r.uuid]){var i;if(Array.isArray(r)){i=[];for(var a=0,o=r.length;a1)switch(this.wrapS){case h:t.x=t.x-Math.floor(t.x);break;case d:t.x=t.x<0?0:1;break;case p:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case h:t.y=t.y-Math.floor(t.y);break;case d:t.y=t.y<0?0:1;break;case p:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t},st(e,[{key:"needsUpdate",set:function(t){!0===t&&this.version++}}]),e}(pt);function St(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?bt.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}Mt.DEFAULT_IMAGE=void 0,Mt.DEFAULT_MAPPING=i,Mt.prototype.isTexture=!0;var Tt=function(){function t(t,e,n,r){void 0===t&&(t=0),void 0===e&&(e=0),void 0===n&&(n=0),void 0===r&&(r=1),this.x=t,this.y=e,this.z=n,this.w=r}var e=t.prototype;return e.set=function(t,e,n,r){return this.x=t,this.y=e,this.z=n,this.w=r,this},e.setScalar=function(t){return this.x=t,this.y=t,this.z=t,this.w=t,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.setZ=function(t){return this.z=t,this},e.setW=function(t){return this.w=t,this},e.setComponent=function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this},e.getComponent=function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}},e.clone=function(){return new this.constructor(this.x,this.y,this.z,this.w)},e.copy=function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this},e.add=function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)},e.addScalar=function(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this},e.addScaledVector=function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this},e.sub=function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)},e.subScalar=function(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this},e.multiply=function(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},e.applyMatrix4=function(t){var e=this.x,n=this.y,r=this.z,i=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*r+a[12]*i,this.y=a[1]*e+a[5]*n+a[9]*r+a[13]*i,this.z=a[2]*e+a[6]*n+a[10]*r+a[14]*i,this.w=a[3]*e+a[7]*n+a[11]*r+a[15]*i,this},e.divideScalar=function(t){return this.multiplyScalar(1/t)},e.setAxisAngleFromQuaternion=function(t){this.w=2*Math.acos(t.w);var e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this},e.setAxisAngleFromRotationMatrix=function(t){var e,n,r,i,a=.01,o=.1,s=t.elements,l=s[0],c=s[4],u=s[8],h=s[1],d=s[5],p=s[9],f=s[2],m=s[6],v=s[10];if(Math.abs(c-h)y&&g>x?gx?y=0?1:-1,y=1-v*v;if(y>Number.EPSILON){var x=Math.sqrt(y),_=Math.atan2(x,v*g);m=Math.sin(m*_)/x,o=Math.sin(o*_)/x}var b=o*g;if(s=s*m+h*b,l=l*m+d*b,c=c*m+p*b,u=u*m+f*b,m===1-o){var w=1/Math.sqrt(s*s+l*l+c*c+u*u);s*=w,l*=w,c*=w,u*=w}}t[e]=s,t[e+1]=l,t[e+2]=c,t[e+3]=u},t.multiplyQuaternionsFlat=function(t,e,n,r,i,a){var o=n[r],s=n[r+1],l=n[r+2],c=n[r+3],u=i[a],h=i[a+1],d=i[a+2],p=i[a+3];return t[e]=o*p+c*u+s*d-l*h,t[e+1]=s*p+c*h+l*u-o*d,t[e+2]=l*p+c*d+o*h-s*u,t[e+3]=c*p-o*u-s*h-l*d,t};var e=t.prototype;return e.set=function(t,e,n,r){return this._x=t,this._y=e,this._z=n,this._w=r,this._onChangeCallback(),this},e.clone=function(){return new this.constructor(this._x,this._y,this._z,this._w)},e.copy=function(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this},e.setFromEuler=function(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var n=t._x,r=t._y,i=t._z,a=t._order,o=Math.cos,s=Math.sin,l=o(n/2),c=o(r/2),u=o(i/2),h=s(n/2),d=s(r/2),p=s(i/2);switch(a){case"XYZ":this._x=h*c*u+l*d*p,this._y=l*d*u-h*c*p,this._z=l*c*p+h*d*u,this._w=l*c*u-h*d*p;break;case"YXZ":this._x=h*c*u+l*d*p,this._y=l*d*u-h*c*p,this._z=l*c*p-h*d*u,this._w=l*c*u+h*d*p;break;case"ZXY":this._x=h*c*u-l*d*p,this._y=l*d*u+h*c*p,this._z=l*c*p+h*d*u,this._w=l*c*u-h*d*p;break;case"ZYX":this._x=h*c*u-l*d*p,this._y=l*d*u+h*c*p,this._z=l*c*p-h*d*u,this._w=l*c*u+h*d*p;break;case"YZX":this._x=h*c*u+l*d*p,this._y=l*d*u+h*c*p,this._z=l*c*p-h*d*u,this._w=l*c*u-h*d*p;break;case"XZY":this._x=h*c*u-l*d*p,this._y=l*d*u-h*c*p,this._z=l*c*p+h*d*u,this._w=l*c*u+h*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return!1!==e&&this._onChangeCallback(),this},e.setFromAxisAngle=function(t,e){var n=e/2,r=Math.sin(n);return this._x=t.x*r,this._y=t.y*r,this._z=t.z*r,this._w=Math.cos(n),this._onChangeCallback(),this},e.setFromRotationMatrix=function(t){var e=t.elements,n=e[0],r=e[4],i=e[8],a=e[1],o=e[5],s=e[9],l=e[2],c=e[6],u=e[10],h=n+o+u;if(h>0){var d=.5/Math.sqrt(h+1);this._w=.25/d,this._x=(c-s)*d,this._y=(i-l)*d,this._z=(a-r)*d}else if(n>o&&n>u){var p=2*Math.sqrt(1+n-o-u);this._w=(c-s)/p,this._x=.25*p,this._y=(r+a)/p,this._z=(i+l)/p}else if(o>u){var f=2*Math.sqrt(1+o-n-u);this._w=(i-l)/f,this._x=(r+a)/f,this._y=.25*f,this._z=(s+c)/f}else{var m=2*Math.sqrt(1+u-n-o);this._w=(a-r)/m,this._x=(i+l)/m,this._y=(s+c)/m,this._z=.25*m}return this._onChangeCallback(),this},e.setFromUnitVectors=function(t,e){var n=t.dot(e)+1;return n<1e-6?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()},e.angleTo=function(t){return 2*Math.acos(Math.abs(gt.clamp(this.dot(t),-1,1)))},e.rotateTowards=function(t,e){var n=this.angleTo(t);if(0===n)return this;var r=Math.min(1,e/n);return this.slerp(t,r),this},e.identity=function(){return this.set(0,0,0,1)},e.invert=function(){return this.conjugate()},e.conjugate=function(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this},e.dot=function(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w},e.lengthSq=function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},e.length=function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},e.normalize=function(){var t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this},e.multiply=function(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)},e.premultiply=function(t){return this.multiplyQuaternions(t,this)},e.multiplyQuaternions=function(t,e){var n=t._x,r=t._y,i=t._z,a=t._w,o=e._x,s=e._y,l=e._z,c=e._w;return this._x=n*c+a*o+r*l-i*s,this._y=r*c+a*s+i*o-n*l,this._z=i*c+a*l+n*s-r*o,this._w=a*c-n*o-r*s-i*l,this._onChangeCallback(),this},e.slerp=function(t,e){if(0===e)return this;if(1===e)return this.copy(t);var n=this._x,r=this._y,i=this._z,a=this._w,o=a*t._w+n*t._x+r*t._y+i*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=r,this._z=i,this;var s=1-o*o;if(s<=Number.EPSILON){var l=1-e;return this._w=l*a+e*this._w,this._x=l*n+e*this._x,this._y=l*r+e*this._y,this._z=l*i+e*this._z,this.normalize(),this._onChangeCallback(),this}var c=Math.sqrt(s),u=Math.atan2(c,o),h=Math.sin((1-e)*u)/c,d=Math.sin(e*u)/c;return this._w=a*h+this._w*d,this._x=n*h+this._x*d,this._y=r*h+this._y*d,this._z=i*h+this._z*d,this._onChangeCallback(),this},e.equals=function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w},e.fromArray=function(t,e){return void 0===e&&(e=0),this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t},e.fromBufferAttribute=function(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this},e._onChange=function(t){return this._onChangeCallback=t,this},e._onChangeCallback=function(){},st(t,[{key:"x",get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},{key:"y",get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},{key:"z",get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},{key:"w",get:function(){return this._w},set:function(t){this._w=t,this._onChangeCallback()}}]),t}();Lt.prototype.isQuaternion=!0;var Rt=function(){function t(t,e,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===n&&(n=0),this.x=t,this.y=e,this.z=n}var e=t.prototype;return e.set=function(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this},e.setScalar=function(t){return this.x=t,this.y=t,this.z=t,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.setZ=function(t){return this.z=t,this},e.setComponent=function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this},e.getComponent=function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}},e.clone=function(){return new this.constructor(this.x,this.y,this.z)},e.copy=function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},e.add=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)},e.addScalar=function(t){return this.x+=t,this.y+=t,this.z+=t,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},e.addScaledVector=function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this},e.sub=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)},e.subScalar=function(t){return this.x-=t,this.y-=t,this.z-=t,this},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},e.multiply=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this.z*=t,this},e.multiplyVectors=function(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this},e.applyEuler=function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Pt.setFromEuler(t))},e.applyAxisAngle=function(t,e){return this.applyQuaternion(Pt.setFromAxisAngle(t,e))},e.applyMatrix3=function(t){var e=this.x,n=this.y,r=this.z,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6]*r,this.y=i[1]*e+i[4]*n+i[7]*r,this.z=i[2]*e+i[5]*n+i[8]*r,this},e.applyNormalMatrix=function(t){return this.applyMatrix3(t).normalize()},e.applyMatrix4=function(t){var e=this.x,n=this.y,r=this.z,i=t.elements,a=1/(i[3]*e+i[7]*n+i[11]*r+i[15]);return this.x=(i[0]*e+i[4]*n+i[8]*r+i[12])*a,this.y=(i[1]*e+i[5]*n+i[9]*r+i[13])*a,this.z=(i[2]*e+i[6]*n+i[10]*r+i[14])*a,this},e.applyQuaternion=function(t){var e=this.x,n=this.y,r=this.z,i=t.x,a=t.y,o=t.z,s=t.w,l=s*e+a*r-o*n,c=s*n+o*e-i*r,u=s*r+i*n-a*e,h=-i*e-a*n-o*r;return this.x=l*s+h*-i+c*-o-u*-a,this.y=c*s+h*-a+u*-i-l*-o,this.z=u*s+h*-o+l*-a-c*-i,this},e.project=function(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)},e.unproject=function(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)},e.transformDirection=function(t){var e=this.x,n=this.y,r=this.z,i=t.elements;return this.x=i[0]*e+i[4]*n+i[8]*r,this.y=i[1]*e+i[5]*n+i[9]*r,this.z=i[2]*e+i[6]*n+i[10]*r,this.normalize()},e.divide=function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this},e.divideScalar=function(t){return this.multiplyScalar(1/t)},e.min=function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this},e.max=function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this},e.clamp=function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this},e.clampScalar=function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this},e.clampLength=function(t,e){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))},e.floor=function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},e.ceil=function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},e.round=function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},e.roundToZero=function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},e.negate=function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},e.dot=function(t){return this.x*t.x+this.y*t.y+this.z*t.z},e.lengthSq=function(){return this.x*this.x+this.y*this.y+this.z*this.z},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},e.manhattanLength=function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},e.normalize=function(){return this.divideScalar(this.length()||1)},e.setLength=function(t){return this.normalize().multiplyScalar(t)},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this},e.lerpVectors=function(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this},e.cross=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)},e.crossVectors=function(t,e){var n=t.x,r=t.y,i=t.z,a=e.x,o=e.y,s=e.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this},e.projectOnVector=function(t){var e=t.lengthSq();if(0===e)return this.set(0,0,0);var n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)},e.projectOnPlane=function(t){return Ct.copy(this).projectOnVector(t),this.sub(Ct)},e.reflect=function(t){return this.sub(Ct.copy(t).multiplyScalar(2*this.dot(t)))},e.angleTo=function(t){var e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;var n=this.dot(t)/e;return Math.acos(gt.clamp(n,-1,1))},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.distanceToSquared=function(t){var e=this.x-t.x,n=this.y-t.y,r=this.z-t.z;return e*e+n*n+r*r},e.manhattanDistanceTo=function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)},e.setFromSpherical=function(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)},e.setFromSphericalCoords=function(t,e,n){var r=Math.sin(e)*t;return this.x=r*Math.sin(n),this.y=Math.cos(e)*t,this.z=r*Math.cos(n),this},e.setFromCylindrical=function(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)},e.setFromCylindricalCoords=function(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this},e.setFromMatrixPosition=function(t){var e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this},e.setFromMatrixScale=function(t){var e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),r=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=r,this},e.setFromMatrixColumn=function(t,e){return this.fromArray(t.elements,4*e)},e.setFromMatrix3Column=function(t,e){return this.fromArray(t.elements,3*e)},e.equals=function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},e.fromArray=function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t},e.fromBufferAttribute=function(t,e,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this},e.random=function(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this},t}();Rt.prototype.isVector3=!0;var Ct=new Rt,Pt=new Lt,Dt=function(){function t(t,e){void 0===t&&(t=new Rt(1/0,1/0,1/0)),void 0===e&&(e=new Rt(-1/0,-1/0,-1/0)),this.min=t,this.max=e}var e=t.prototype;return e.set=function(t,e){return this.min.copy(t),this.max.copy(e),this},e.setFromArray=function(t){for(var e=1/0,n=1/0,r=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,l=t.length;si&&(i=c),u>a&&(a=u),h>o&&(o=h)}return this.min.set(e,n,r),this.max.set(i,a,o),this},e.setFromBufferAttribute=function(t){for(var e=1/0,n=1/0,r=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,l=t.count;si&&(i=c),u>a&&(a=u),h>o&&(o=h)}return this.min.set(e,n,r),this.max.set(i,a,o),this},e.setFromPoints=function(t){this.makeEmpty();for(var e=0,n=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)},e.containsBox=function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z},e.getParameter=function(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Rt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))},e.intersectsBox=function(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)},e.intersectsSphere=function(t){return this.clampPoint(t.center,Nt),Nt.distanceToSquared(t.center)<=t.radius*t.radius},e.intersectsPlane=function(t){var e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant},e.intersectsTriangle=function(t){if(this.isEmpty())return!1;this.getCenter(kt),Vt.subVectors(this.max,kt),Ot.subVectors(t.a,kt),zt.subVectors(t.b,kt),Ft.subVectors(t.c,kt),Ht.subVectors(zt,Ot),Gt.subVectors(Ft,zt),Ut.subVectors(Ot,Ft);var e=[0,-Ht.z,Ht.y,0,-Gt.z,Gt.y,0,-Ut.z,Ut.y,Ht.z,0,-Ht.x,Gt.z,0,-Gt.x,Ut.z,0,-Ut.x,-Ht.y,Ht.x,0,-Gt.y,Gt.x,0,-Ut.y,Ut.x,0];return!!qt(e,Ot,zt,Ft,Vt)&&(!!qt(e=[1,0,0,0,1,0,0,0,1],Ot,zt,Ft,Vt)&&(Wt.crossVectors(Ht,Gt),qt(e=[Wt.x,Wt.y,Wt.z],Ot,zt,Ft,Vt)))},e.clampPoint=function(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Rt),e.copy(t).clamp(this.min,this.max)},e.distanceToPoint=function(t){return Nt.copy(t).clamp(this.min,this.max).sub(t).length()},e.getBoundingSphere=function(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(Nt).length(),t},e.intersect=function(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this},e.union=function(t){return this.min.min(t.min),this.max.max(t.max),this},e.applyMatrix4=function(t){return this.isEmpty()||(It[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),It[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),It[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),It[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),It[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),It[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),It[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),It[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(It)),this},e.translate=function(t){return this.min.add(t),this.max.add(t),this},e.equals=function(t){return t.min.equals(this.min)&&t.max.equals(this.max)},t}();Dt.prototype.isBox3=!0;var It=[new Rt,new Rt,new Rt,new Rt,new Rt,new Rt,new Rt,new Rt],Nt=new Rt,Bt=new Dt,Ot=new Rt,zt=new Rt,Ft=new Rt,Ht=new Rt,Gt=new Rt,Ut=new Rt,kt=new Rt,Vt=new Rt,Wt=new Rt,jt=new Rt;function qt(t,e,n,r,i){for(var a=0,o=t.length-3;a<=o;a+=3){jt.fromArray(t,a);var s=i.x*Math.abs(jt.x)+i.y*Math.abs(jt.y)+i.z*Math.abs(jt.z),l=e.dot(jt),c=n.dot(jt),u=r.dot(jt);if(Math.max(-Math.max(l,c,u),Math.min(l,c,u))>s)return!1}return!0}var Xt=new Dt,Yt=function(){function t(t,e){void 0===t&&(t=new Rt),void 0===e&&(e=-1),this.center=t,this.radius=e}var e=t.prototype;return e.set=function(t,e){return this.center.copy(t),this.radius=e,this},e.setFromPoints=function(t,e){var n=this.center;void 0!==e?n.copy(e):Xt.setFromPoints(t).getCenter(n);for(var r=0,i=0,a=t.length;ithis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e},e.getBoundingBox=function(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Dt),this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)},e.applyMatrix4=function(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this},e.translate=function(t){return this.center.add(t),this},e.equals=function(t){return t.center.equals(this.center)&&t.radius===this.radius},e.clone=function(){return(new this.constructor).copy(this)},t}(),Zt=new Rt,Jt=new Rt,Qt=new Rt,Kt=new Rt,$t=new Rt,te=new Rt,ee=new Rt,ne=function(){function t(t,e){void 0===t&&(t=new Rt),void 0===e&&(e=new Rt(0,0,-1)),this.origin=t,this.direction=e}var e=t.prototype;return e.set=function(t,e){return this.origin.copy(t),this.direction.copy(e),this},e.copy=function(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this},e.at=function(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Rt),e.copy(this.direction).multiplyScalar(t).add(this.origin)},e.lookAt=function(t){return this.direction.copy(t).sub(this.origin).normalize(),this},e.recast=function(t){return this.origin.copy(this.at(t,Zt)),this},e.closestPointToPoint=function(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Rt),e.subVectors(t,this.origin);var n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)},e.distanceToPoint=function(t){return Math.sqrt(this.distanceSqToPoint(t))},e.distanceSqToPoint=function(t){var e=Zt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Zt.copy(this.direction).multiplyScalar(e).add(this.origin),Zt.distanceToSquared(t))},e.distanceSqToSegment=function(t,e,n,r){Jt.copy(t).add(e).multiplyScalar(.5),Qt.copy(e).sub(t).normalize(),Kt.copy(this.origin).sub(Jt);var i,a,o,s,l=.5*t.distanceTo(e),c=-this.direction.dot(Qt),u=Kt.dot(this.direction),h=-Kt.dot(Qt),d=Kt.lengthSq(),p=Math.abs(1-c*c);if(p>0)if(a=c*u-h,s=l*p,(i=c*h-u)>=0)if(a>=-s)if(a<=s){var f=1/p;o=(i*=f)*(i+c*(a*=f)+2*u)+a*(c*i+a+2*h)+d}else a=l,o=-(i=Math.max(0,-(c*a+u)))*i+a*(a+2*h)+d;else a=-l,o=-(i=Math.max(0,-(c*a+u)))*i+a*(a+2*h)+d;else a<=-s?o=-(i=Math.max(0,-(-c*l+u)))*i+(a=i>0?-l:Math.min(Math.max(-l,-h),l))*(a+2*h)+d:a<=s?(i=0,o=(a=Math.min(Math.max(-l,-h),l))*(a+2*h)+d):o=-(i=Math.max(0,-(c*l+u)))*i+(a=i>0?l:Math.min(Math.max(-l,-h),l))*(a+2*h)+d;else a=c>0?-l:l,o=-(i=Math.max(0,-(c*a+u)))*i+a*(a+2*h)+d;return n&&n.copy(this.direction).multiplyScalar(i).add(this.origin),r&&r.copy(Qt).multiplyScalar(a).add(Jt),o},e.intersectSphere=function(t,e){Zt.subVectors(t.center,this.origin);var n=Zt.dot(this.direction),r=Zt.dot(Zt)-n*n,i=t.radius*t.radius;if(r>i)return null;var a=Math.sqrt(i-r),o=n-a,s=n+a;return o<0&&s<0?null:o<0?this.at(s,e):this.at(o,e)},e.intersectsSphere=function(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius},e.distanceToPlane=function(t){var e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;var n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null},e.intersectPlane=function(t,e){var n=this.distanceToPlane(t);return null===n?null:this.at(n,e)},e.intersectsPlane=function(t){var e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0},e.intersectBox=function(t,e){var n,r,i,a,o,s,l=1/this.direction.x,c=1/this.direction.y,u=1/this.direction.z,h=this.origin;return l>=0?(n=(t.min.x-h.x)*l,r=(t.max.x-h.x)*l):(n=(t.max.x-h.x)*l,r=(t.min.x-h.x)*l),c>=0?(i=(t.min.y-h.y)*c,a=(t.max.y-h.y)*c):(i=(t.max.y-h.y)*c,a=(t.min.y-h.y)*c),n>a||i>r?null:((i>n||n!=n)&&(n=i),(a=0?(o=(t.min.z-h.z)*u,s=(t.max.z-h.z)*u):(o=(t.max.z-h.z)*u,s=(t.min.z-h.z)*u),n>s||o>r?null:((o>n||n!=n)&&(n=o),(s=0?n:r,e)))},e.intersectsBox=function(t){return null!==this.intersectBox(t,Zt)},e.intersectTriangle=function(t,e,n,r,i){$t.subVectors(e,t),te.subVectors(n,t),ee.crossVectors($t,te);var a,o=this.direction.dot(ee);if(o>0){if(r)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}Kt.subVectors(this.origin,t);var s=a*this.direction.dot(te.crossVectors(Kt,te));if(s<0)return null;var l=a*this.direction.dot($t.cross(Kt));if(l<0)return null;if(s+l>o)return null;var c=-a*Kt.dot(ee);return c<0?null:this.at(c/o,i)},e.applyMatrix4=function(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this},e.equals=function(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)},e.clone=function(){return(new this.constructor).copy(this)},t}(),re=function(){function t(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}var e=t.prototype;return e.set=function(t,e,n,r,i,a,o,s,l,c,u,h,d,p,f,m){var v=this.elements;return v[0]=t,v[4]=e,v[8]=n,v[12]=r,v[1]=i,v[5]=a,v[9]=o,v[13]=s,v[2]=l,v[6]=c,v[10]=u,v[14]=h,v[3]=d,v[7]=p,v[11]=f,v[15]=m,this},e.identity=function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},e.clone=function(){return(new t).fromArray(this.elements)},e.copy=function(t){var e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this},e.copyPosition=function(t){var e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this},e.setFromMatrix3=function(t){var e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this},e.extractBasis=function(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this},e.makeBasis=function(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this},e.extractRotation=function(t){var e=this.elements,n=t.elements,r=1/ie.setFromMatrixColumn(t,0).length(),i=1/ie.setFromMatrixColumn(t,1).length(),a=1/ie.setFromMatrixColumn(t,2).length();return e[0]=n[0]*r,e[1]=n[1]*r,e[2]=n[2]*r,e[3]=0,e[4]=n[4]*i,e[5]=n[5]*i,e[6]=n[6]*i,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},e.makeRotationFromEuler=function(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var e=this.elements,n=t.x,r=t.y,i=t.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(r),l=Math.sin(r),c=Math.cos(i),u=Math.sin(i);if("XYZ"===t.order){var h=a*c,d=a*u,p=o*c,f=o*u;e[0]=s*c,e[4]=-s*u,e[8]=l,e[1]=d+p*l,e[5]=h-f*l,e[9]=-o*s,e[2]=f-h*l,e[6]=p+d*l,e[10]=a*s}else if("YXZ"===t.order){var m=s*c,v=s*u,g=l*c,y=l*u;e[0]=m+y*o,e[4]=g*o-v,e[8]=a*l,e[1]=a*u,e[5]=a*c,e[9]=-o,e[2]=v*o-g,e[6]=y+m*o,e[10]=a*s}else if("ZXY"===t.order){var x=s*c,_=s*u,b=l*c,w=l*u;e[0]=x-w*o,e[4]=-a*u,e[8]=b+_*o,e[1]=_+b*o,e[5]=a*c,e[9]=w-x*o,e[2]=-a*l,e[6]=o,e[10]=a*s}else if("ZYX"===t.order){var M=a*c,S=a*u,T=o*c,E=o*u;e[0]=s*c,e[4]=T*l-S,e[8]=M*l+E,e[1]=s*u,e[5]=E*l+M,e[9]=S*l-T,e[2]=-l,e[6]=o*s,e[10]=a*s}else if("YZX"===t.order){var A=a*s,L=a*l,R=o*s,C=o*l;e[0]=s*c,e[4]=C-A*u,e[8]=R*u+L,e[1]=u,e[5]=a*c,e[9]=-o*c,e[2]=-l*c,e[6]=L*u+R,e[10]=A-C*u}else if("XZY"===t.order){var P=a*s,D=a*l,I=o*s,N=o*l;e[0]=s*c,e[4]=-u,e[8]=l*c,e[1]=P*u+N,e[5]=a*c,e[9]=D*u-I,e[2]=I*u-D,e[6]=o*c,e[10]=N*u+P}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},e.makeRotationFromQuaternion=function(t){return this.compose(oe,t,se)},e.lookAt=function(t,e,n){var r=this.elements;return ue.subVectors(t,e),0===ue.lengthSq()&&(ue.z=1),ue.normalize(),le.crossVectors(n,ue),0===le.lengthSq()&&(1===Math.abs(n.z)?ue.x+=1e-4:ue.z+=1e-4,ue.normalize(),le.crossVectors(n,ue)),le.normalize(),ce.crossVectors(ue,le),r[0]=le.x,r[4]=ce.x,r[8]=ue.x,r[1]=le.y,r[5]=ce.y,r[9]=ue.y,r[2]=le.z,r[6]=ce.z,r[10]=ue.z,this},e.multiply=function(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)},e.premultiply=function(t){return this.multiplyMatrices(t,this)},e.multiplyMatrices=function(t,e){var n=t.elements,r=e.elements,i=this.elements,a=n[0],o=n[4],s=n[8],l=n[12],c=n[1],u=n[5],h=n[9],d=n[13],p=n[2],f=n[6],m=n[10],v=n[14],g=n[3],y=n[7],x=n[11],_=n[15],b=r[0],w=r[4],M=r[8],S=r[12],T=r[1],E=r[5],A=r[9],L=r[13],R=r[2],C=r[6],P=r[10],D=r[14],I=r[3],N=r[7],B=r[11],O=r[15];return i[0]=a*b+o*T+s*R+l*I,i[4]=a*w+o*E+s*C+l*N,i[8]=a*M+o*A+s*P+l*B,i[12]=a*S+o*L+s*D+l*O,i[1]=c*b+u*T+h*R+d*I,i[5]=c*w+u*E+h*C+d*N,i[9]=c*M+u*A+h*P+d*B,i[13]=c*S+u*L+h*D+d*O,i[2]=p*b+f*T+m*R+v*I,i[6]=p*w+f*E+m*C+v*N,i[10]=p*M+f*A+m*P+v*B,i[14]=p*S+f*L+m*D+v*O,i[3]=g*b+y*T+x*R+_*I,i[7]=g*w+y*E+x*C+_*N,i[11]=g*M+y*A+x*P+_*B,i[15]=g*S+y*L+x*D+_*O,this},e.multiplyScalar=function(t){var e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this},e.determinant=function(){var t=this.elements,e=t[0],n=t[4],r=t[8],i=t[12],a=t[1],o=t[5],s=t[9],l=t[13],c=t[2],u=t[6],h=t[10],d=t[14];return t[3]*(+i*s*u-r*l*u-i*o*h+n*l*h+r*o*d-n*s*d)+t[7]*(+e*s*d-e*l*h+i*a*h-r*a*d+r*l*c-i*s*c)+t[11]*(+e*l*u-e*o*d-i*a*u+n*a*d+i*o*c-n*l*c)+t[15]*(-r*o*c-e*s*u+e*o*h+r*a*u-n*a*h+n*s*c)},e.transpose=function(){var t,e=this.elements;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this},e.setPosition=function(t,e,n){var r=this.elements;return t.isVector3?(r[12]=t.x,r[13]=t.y,r[14]=t.z):(r[12]=t,r[13]=e,r[14]=n),this},e.invert=function(){var t=this.elements,e=t[0],n=t[1],r=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=t[9],h=t[10],d=t[11],p=t[12],f=t[13],m=t[14],v=t[15],g=u*m*l-f*h*l+f*s*d-o*m*d-u*s*v+o*h*v,y=p*h*l-c*m*l-p*s*d+a*m*d+c*s*v-a*h*v,x=c*f*l-p*u*l+p*o*d-a*f*d-c*o*v+a*u*v,_=p*u*s-c*f*s-p*o*h+a*f*h+c*o*m-a*u*m,b=e*g+n*y+r*x+i*_;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);var w=1/b;return t[0]=g*w,t[1]=(f*h*i-u*m*i-f*r*d+n*m*d+u*r*v-n*h*v)*w,t[2]=(o*m*i-f*s*i+f*r*l-n*m*l-o*r*v+n*s*v)*w,t[3]=(u*s*i-o*h*i-u*r*l+n*h*l+o*r*d-n*s*d)*w,t[4]=y*w,t[5]=(c*m*i-p*h*i+p*r*d-e*m*d-c*r*v+e*h*v)*w,t[6]=(p*s*i-a*m*i-p*r*l+e*m*l+a*r*v-e*s*v)*w,t[7]=(a*h*i-c*s*i+c*r*l-e*h*l-a*r*d+e*s*d)*w,t[8]=x*w,t[9]=(p*u*i-c*f*i-p*n*d+e*f*d+c*n*v-e*u*v)*w,t[10]=(a*f*i-p*o*i+p*n*l-e*f*l-a*n*v+e*o*v)*w,t[11]=(c*o*i-a*u*i-c*n*l+e*u*l+a*n*d-e*o*d)*w,t[12]=_*w,t[13]=(c*f*r-p*u*r+p*n*h-e*f*h-c*n*m+e*u*m)*w,t[14]=(p*o*r-a*f*r-p*n*s+e*f*s+a*n*m-e*o*m)*w,t[15]=(a*u*r-c*o*r+c*n*s-e*u*s-a*n*h+e*o*h)*w,this},e.scale=function(t){var e=this.elements,n=t.x,r=t.y,i=t.z;return e[0]*=n,e[4]*=r,e[8]*=i,e[1]*=n,e[5]*=r,e[9]*=i,e[2]*=n,e[6]*=r,e[10]*=i,e[3]*=n,e[7]*=r,e[11]*=i,this},e.getMaxScaleOnAxis=function(){var t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],r=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,r))},e.makeTranslation=function(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this},e.makeRotationX=function(t){var e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this},e.makeRotationY=function(t){var e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this},e.makeRotationZ=function(t){var e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this},e.makeRotationAxis=function(t,e){var n=Math.cos(e),r=Math.sin(e),i=1-n,a=t.x,o=t.y,s=t.z,l=i*a,c=i*o;return this.set(l*a+n,l*o-r*s,l*s+r*o,0,l*o+r*s,c*o+n,c*s-r*a,0,l*s-r*o,c*s+r*a,i*s*s+n,0,0,0,0,1),this},e.makeScale=function(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this},e.makeShear=function(t,e,n){return this.set(1,e,n,0,t,1,n,0,t,e,1,0,0,0,0,1),this},e.compose=function(t,e,n){var r=this.elements,i=e._x,a=e._y,o=e._z,s=e._w,l=i+i,c=a+a,u=o+o,h=i*l,d=i*c,p=i*u,f=a*c,m=a*u,v=o*u,g=s*l,y=s*c,x=s*u,_=n.x,b=n.y,w=n.z;return r[0]=(1-(f+v))*_,r[1]=(d+x)*_,r[2]=(p-y)*_,r[3]=0,r[4]=(d-x)*b,r[5]=(1-(h+v))*b,r[6]=(m+g)*b,r[7]=0,r[8]=(p+y)*w,r[9]=(m-g)*w,r[10]=(1-(h+f))*w,r[11]=0,r[12]=t.x,r[13]=t.y,r[14]=t.z,r[15]=1,this},e.decompose=function(t,e,n){var r=this.elements,i=ie.set(r[0],r[1],r[2]).length(),a=ie.set(r[4],r[5],r[6]).length(),o=ie.set(r[8],r[9],r[10]).length();this.determinant()<0&&(i=-i),t.x=r[12],t.y=r[13],t.z=r[14],ae.copy(this);var s=1/i,l=1/a,c=1/o;return ae.elements[0]*=s,ae.elements[1]*=s,ae.elements[2]*=s,ae.elements[4]*=l,ae.elements[5]*=l,ae.elements[6]*=l,ae.elements[8]*=c,ae.elements[9]*=c,ae.elements[10]*=c,e.setFromRotationMatrix(ae),n.x=i,n.y=a,n.z=o,this},e.makePerspective=function(t,e,n,r,i,a){void 0===a&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var o=this.elements,s=2*i/(e-t),l=2*i/(n-r),c=(e+t)/(e-t),u=(n+r)/(n-r),h=-(a+i)/(a-i),d=-2*a*i/(a-i);return o[0]=s,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=l,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=h,o[14]=d,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this},e.makeOrthographic=function(t,e,n,r,i,a){var o=this.elements,s=1/(e-t),l=1/(n-r),c=1/(a-i),u=(e+t)*s,h=(n+r)*l,d=(a+i)*c;return o[0]=2*s,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*l,o[9]=0,o[13]=-h,o[2]=0,o[6]=0,o[10]=-2*c,o[14]=-d,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this},e.equals=function(t){for(var e=this.elements,n=t.elements,r=0;r<16;r++)if(e[r]!==n[r])return!1;return!0},e.fromArray=function(t,e){void 0===e&&(e=0);for(var n=0;n<16;n++)this.elements[n]=t[n+e];return this},e.toArray=function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t},t}();re.prototype.isMatrix4=!0;var ie=new Rt,ae=new re,oe=new Rt(0,0,0),se=new Rt(1,1,1),le=new Rt,ce=new Rt,ue=new Rt,he=new re,de=new Lt,pe=function(){function t(e,n,r,i){void 0===e&&(e=0),void 0===n&&(n=0),void 0===r&&(r=0),void 0===i&&(i=t.DefaultOrder),this._x=e,this._y=n,this._z=r,this._order=i}var e=t.prototype;return e.set=function(t,e,n,r){return this._x=t,this._y=e,this._z=n,this._order=r||this._order,this._onChangeCallback(),this},e.clone=function(){return new this.constructor(this._x,this._y,this._z,this._order)},e.copy=function(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this},e.setFromRotationMatrix=function(t,e,n){var r=gt.clamp,i=t.elements,a=i[0],o=i[4],s=i[8],l=i[1],c=i[5],u=i[9],h=i[2],d=i[6],p=i[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(r(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-u,p),this._z=Math.atan2(-o,a)):(this._x=Math.atan2(d,c),this._z=0);break;case"YXZ":this._x=Math.asin(-r(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(s,p),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-h,a),this._z=0);break;case"ZXY":this._x=Math.asin(r(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-h,p),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(l,a));break;case"ZYX":this._y=Math.asin(-r(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(l,a)):(this._x=0,this._z=Math.atan2(-o,c));break;case"YZX":this._z=Math.asin(r(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-u,c),this._y=Math.atan2(-h,a)):(this._x=0,this._y=Math.atan2(s,p));break;case"XZY":this._z=Math.asin(-r(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(s,a)):(this._x=Math.atan2(-u,p),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==n&&this._onChangeCallback(),this},e.setFromQuaternion=function(t,e,n){return he.makeRotationFromQuaternion(t),this.setFromRotationMatrix(he,e,n)},e.setFromVector3=function(t,e){return this.set(t.x,t.y,t.z,e||this._order)},e.reorder=function(t){return de.setFromEuler(this),this.setFromQuaternion(de,t)},e.equals=function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order},e.fromArray=function(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t},e.toVector3=function(t){return t?t.set(this._x,this._y,this._z):new Rt(this._x,this._y,this._z)},e._onChange=function(t){return this._onChangeCallback=t,this},e._onChangeCallback=function(){},st(t,[{key:"x",get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},{key:"y",get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},{key:"z",get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},{key:"order",get:function(){return this._order},set:function(t){this._order=t,this._onChangeCallback()}}]),t}();pe.prototype.isEuler=!0,pe.DefaultOrder="XYZ",pe.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];var fe=function(){function t(){this.mask=1}var e=t.prototype;return e.set=function(t){this.mask=1<1){for(var e=0;e1){for(var e=0;e0){r.children=[];for(var p=0;p0){r.animations=[];for(var f=0;f0&&(n.geometries=v),g.length>0&&(n.materials=g),y.length>0&&(n.textures=y),x.length>0&&(n.images=x),_.length>0&&(n.shapes=_),b.length>0&&(n.skeletons=b),w.length>0&&(n.animations=w)}return n.object=r,n;function M(t){var e=[];for(var n in t){var r=t[n];delete r.metadata,e.push(r)}return e}},clone:function(t){return(new this.constructor).copy(this,t)},copy:function(t,e){if(void 0===e&&(e=!0),this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(var n=0;n1?void 0:e.copy(n).multiplyScalar(i).add(t.start)},e.intersectsLine=function(t){var e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0},e.intersectsBox=function(t){return t.intersectsPlane(this)},e.intersectsSphere=function(t){return t.intersectsPlane(this)},e.coplanarPoint=function(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Rt),t.copy(this.normal).multiplyScalar(-this.constant)},e.applyMatrix4=function(t,e){var n=e||Pe.getNormalMatrix(t),r=this.coplanarPoint(Re).applyMatrix4(t),i=this.normal.applyMatrix3(n).normalize();return this.constant=-r.dot(i),this},e.translate=function(t){return this.constant-=t.dot(this.normal),this},e.equals=function(t){return t.normal.equals(this.normal)&&t.constant===this.constant},e.clone=function(){return(new this.constructor).copy(this)},t}();De.prototype.isPlane=!0;var Ie=new Rt,Ne=new Rt,Be=new Rt,Oe=new Rt,ze=new Rt,Fe=new Rt,He=new Rt,Ge=new Rt,Ue=new Rt,ke=new Rt,Ve=function(){function t(t,e,n){void 0===t&&(t=new Rt),void 0===e&&(e=new Rt),void 0===n&&(n=new Rt),this.a=t,this.b=e,this.c=n}t.getNormal=function(t,e,n,r){void 0===r&&(console.warn("THREE.Triangle: .getNormal() target is now required"),r=new Rt),r.subVectors(n,e),Ie.subVectors(t,e),r.cross(Ie);var i=r.lengthSq();return i>0?r.multiplyScalar(1/Math.sqrt(i)):r.set(0,0,0)},t.getBarycoord=function(t,e,n,r,i){Ie.subVectors(r,e),Ne.subVectors(n,e),Be.subVectors(t,e);var a=Ie.dot(Ie),o=Ie.dot(Ne),s=Ie.dot(Be),l=Ne.dot(Ne),c=Ne.dot(Be),u=a*l-o*o;if(void 0===i&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),i=new Rt),0===u)return i.set(-2,-1,-1);var h=1/u,d=(l*s-o*c)*h,p=(a*c-o*s)*h;return i.set(1-d-p,p,d)},t.containsPoint=function(t,e,n,r){return this.getBarycoord(t,e,n,r,Oe),Oe.x>=0&&Oe.y>=0&&Oe.x+Oe.y<=1},t.getUV=function(t,e,n,r,i,a,o,s){return this.getBarycoord(t,e,n,r,Oe),s.set(0,0),s.addScaledVector(i,Oe.x),s.addScaledVector(a,Oe.y),s.addScaledVector(o,Oe.z),s},t.isFrontFacing=function(t,e,n,r){return Ie.subVectors(n,e),Ne.subVectors(t,e),Ie.cross(Ne).dot(r)<0};var e=t.prototype;return e.set=function(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this},e.setFromPointsAndIndices=function(t,e,n,r){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[r]),this},e.clone=function(){return(new this.constructor).copy(this)},e.copy=function(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this},e.getArea=function(){return Ie.subVectors(this.c,this.b),Ne.subVectors(this.a,this.b),.5*Ie.cross(Ne).length()},e.getMidpoint=function(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Rt),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},e.getNormal=function(e){return t.getNormal(this.a,this.b,this.c,e)},e.getPlane=function(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new De),t.setFromCoplanarPoints(this.a,this.b,this.c)},e.getBarycoord=function(e,n){return t.getBarycoord(e,this.a,this.b,this.c,n)},e.getUV=function(e,n,r,i,a){return t.getUV(e,this.a,this.b,this.c,n,r,i,a)},e.containsPoint=function(e){return t.containsPoint(e,this.a,this.b,this.c)},e.isFrontFacing=function(e){return t.isFrontFacing(this.a,this.b,this.c,e)},e.intersectsBox=function(t){return t.intersectsTriangle(this)},e.closestPointToPoint=function(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Rt);var n,r,i=this.a,a=this.b,o=this.c;ze.subVectors(a,i),Fe.subVectors(o,i),Ge.subVectors(t,i);var s=ze.dot(Ge),l=Fe.dot(Ge);if(s<=0&&l<=0)return e.copy(i);Ue.subVectors(t,a);var c=ze.dot(Ue),u=Fe.dot(Ue);if(c>=0&&u<=c)return e.copy(a);var h=s*u-c*l;if(h<=0&&s>=0&&c<=0)return n=s/(s-c),e.copy(i).addScaledVector(ze,n);ke.subVectors(t,o);var d=ze.dot(ke),p=Fe.dot(ke);if(p>=0&&d<=p)return e.copy(o);var f=d*l-s*p;if(f<=0&&l>=0&&p<=0)return r=l/(l-p),e.copy(i).addScaledVector(Fe,r);var m=c*p-d*u;if(m<=0&&u-c>=0&&d-p>=0)return He.subVectors(o,a),r=(u-c)/(u-c+(d-p)),e.copy(a).addScaledVector(He,r);var v=1/(m+f+h);return n=f*v,r=h*v,e.copy(i).addScaledVector(ze,n).addScaledVector(Fe,r)},e.equals=function(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)},t}(),We=0;function je(){Object.defineProperty(this,"id",{value:We++}),this.uuid=gt.generateUUID(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=r,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=et,this.stencilZFail=et,this.stencilZPass=et,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}je.prototype=Object.assign(Object.create(pt.prototype),{constructor:je,isMaterial:!0,onBeforeCompile:function(){},customProgramCacheKey:function(){return this.onBeforeCompile.toString()},setValues:function(t){if(void 0!==t)for(var e in t){var n=t[e];if(void 0!==n)if("shading"!==e){var r=this[e];void 0!==r?r&&r.isColor?r.set(n):r&&r.isVector3&&n&&n.isVector3?r.copy(n):this[e]=n:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}else console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;else console.warn("THREE.Material: '"+e+"' parameter is undefined.")}},toJSON:function(t){var e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});var n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function r(t){var e=[];for(var n in t){var r=t[n];delete r.metadata,e.push(r)}return e}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(n.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,n.reflectivity=this.reflectivity,n.refractionRatio=this.refractionRatio,void 0!==this.combine&&(n.combine=this.combine),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity)),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.size&&(n.size=this.size),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.skinning&&(n.skinning=!0),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e){var i=r(t.textures),a=r(t.images);i.length>0&&(n.textures=i),a.length>0&&(n.images=a)}return n},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;var e=t.clippingPlanes,n=null;if(null!==e){var r=e.length;n=new Array(r);for(var i=0;i!==r;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(je.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}});var qe={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Xe={h:0,s:0,l:0},Ye={h:0,s:0,l:0};function Ze(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}function Je(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Qe(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}var Ke=function(){function t(t,e,n){return void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}var e=t.prototype;return e.set=function(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this},e.setScalar=function(t){return this.r=t,this.g=t,this.b=t,this},e.setHex=function(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this},e.setRGB=function(t,e,n){return this.r=t,this.g=e,this.b=n,this},e.setHSL=function(t,e,n){if(t=gt.euclideanModulo(t,1),e=gt.clamp(e,0,1),n=gt.clamp(n,0,1),0===e)this.r=this.g=this.b=n;else{var r=n<=.5?n*(1+e):n+e-n*e,i=2*n-r;this.r=Ze(i,r,t+1/3),this.g=Ze(i,r,t),this.b=Ze(i,r,t-1/3)}return this},e.setStyle=function(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}var n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){var r,i=n[1],a=n[2];switch(i){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,e(r[4]),this;if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,e(r[4]),this;break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a)){var o=parseFloat(r[1])/360,s=parseInt(r[2],10)/100,l=parseInt(r[3],10)/100;return e(r[4]),this.setHSL(o,s,l)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){var c=n[1],u=c.length;if(3===u)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===u)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this},e.setColorName=function(t){var e=qe[t];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this},e.clone=function(){return new this.constructor(this.r,this.g,this.b)},e.copy=function(t){return this.r=t.r,this.g=t.g,this.b=t.b,this},e.copyGammaToLinear=function(t,e){return void 0===e&&(e=2),this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this},e.copyLinearToGamma=function(t,e){void 0===e&&(e=2);var n=e>0?1/e:1;return this.r=Math.pow(t.r,n),this.g=Math.pow(t.g,n),this.b=Math.pow(t.b,n),this},e.convertGammaToLinear=function(t){return this.copyGammaToLinear(this,t),this},e.convertLinearToGamma=function(t){return this.copyLinearToGamma(this,t),this},e.copySRGBToLinear=function(t){return this.r=Je(t.r),this.g=Je(t.g),this.b=Je(t.b),this},e.copyLinearToSRGB=function(t){return this.r=Qe(t.r),this.g=Qe(t.g),this.b=Qe(t.b),this},e.convertSRGBToLinear=function(){return this.copySRGBToLinear(this),this},e.convertLinearToSRGB=function(){return this.copyLinearToSRGB(this),this},e.getHex=function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},e.getHexString=function(){return("000000"+this.getHex().toString(16)).slice(-6)},e.getHSL=function(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});var e,n,r=this.r,i=this.g,a=this.b,o=Math.max(r,i,a),s=Math.min(r,i,a),l=(s+o)/2;if(s===o)e=0,n=0;else{var c=o-s;switch(n=l<=.5?c/(o+s):c/(2-o-s),o){case r:e=(i-a)/c+(ie&&(e=t[n]);return e}Object.defineProperty(nn.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(nn.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this},copyAt:function(t,e,n){t*=this.itemSize,n*=e.itemSize;for(var r=0,i=this.itemSize;r65535?un:ln)(t,1):this.index=t,this},getAttribute:function(t){return this.attributes[t]},setAttribute:function(t,e){return this.attributes[t]=e,this},deleteAttribute:function(t){return delete this.attributes[t],this},hasAttribute:function(t){return void 0!==this.attributes[t]},addGroup:function(t,e,n){void 0===n&&(n=0),this.groups.push({start:t,count:e,materialIndex:n})},clearGroups:function(){this.groups=[]},setDrawRange:function(t,e){this.drawRange.start=t,this.drawRange.count=e},applyMatrix4:function(t){var e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);var n=this.attributes.normal;if(void 0!==n){var r=(new _t).getNormalMatrix(t);n.applyNormalMatrix(r),n.needsUpdate=!0}var i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(t),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(t){return yn.makeRotationX(t),this.applyMatrix4(yn),this},rotateY:function(t){return yn.makeRotationY(t),this.applyMatrix4(yn),this},rotateZ:function(t){return yn.makeRotationZ(t),this.applyMatrix4(yn),this},translate:function(t,e,n){return yn.makeTranslation(t,e,n),this.applyMatrix4(yn),this},scale:function(t,e,n){return yn.makeScale(t,e,n),this.applyMatrix4(yn),this},lookAt:function(t){return xn.lookAt(t),xn.updateMatrix(),this.applyMatrix4(xn.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(_n).negate(),this.translate(_n.x,_n.y,_n.z),this},setFromPoints:function(t){for(var e=[],n=0,r=t.length;n0&&(t.userData=this.userData),void 0!==this.parameters){var e=this.parameters;for(var n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};var r=this.index;null!==r&&(t.data.index={type:r.array.constructor.name,array:Array.prototype.slice.call(r.array)});var i=this.attributes;for(var a in i){var o=i[a],s=o.toJSON(t.data);""!==o.name&&(s.name=o.name),t.data.attributes[a]=s}var l={},c=!1;for(var u in this.morphAttributes){for(var h=this.morphAttributes[u],d=[],p=0,f=h.length;p0&&(l[u]=d,c=!0)}c&&(t.data.morphAttributes=l,t.data.morphTargetsRelative=this.morphTargetsRelative);var g=this.groups;g.length>0&&(t.data.groups=JSON.parse(JSON.stringify(g)));var y=this.boundingSphere;return null!==y&&(t.data.boundingSphere={center:y.center.toArray(),radius:y.radius}),t},clone:function(){return(new Sn).copy(this)},copy:function(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;var e={};this.name=t.name;var n=t.index;null!==n&&this.setIndex(n.clone(e));var r=t.attributes;for(var i in r){var a=r[i];this.setAttribute(i,a.clone(e))}var o=t.morphAttributes;for(var s in o){for(var l=[],c=o[s],u=0,h=c.length;un.far?null:{distance:l,point:Un.clone(),object:t}}(t,e,n,r,Ln,Rn,Cn,Gn);if(g){s&&(zn.fromBufferAttribute(s,c),Fn.fromBufferAttribute(s,u),Hn.fromBufferAttribute(s,h),g.uv=Ve.getUV(Gn,Ln,Rn,Cn,zn,Fn,Hn,new yt)),l&&(zn.fromBufferAttribute(l,c),Fn.fromBufferAttribute(l,u),Hn.fromBufferAttribute(l,h),g.uv2=Ve.getUV(Gn,Ln,Rn,Cn,zn,Fn,Hn,new yt));var y={a:c,b:u,c:h,normal:new Rt,materialIndex:0};Ve.getNormal(Ln,Rn,Cn,y.normal),g.face=y}return g}kn.prototype=Object.assign(Object.create(Le.prototype),{constructor:kn,isMesh:!0,copy:function(t){return Le.prototype.copy.call(this,t),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=t.material,this.geometry=t.geometry,this},updateMorphTargets:function(){var t=this.geometry;if(t.isBufferGeometry){var e=t.morphAttributes,n=Object.keys(e);if(n.length>0){var r=e[n[0]];if(void 0!==r){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var i=0,a=r.length;i0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(t,e){var n,r=this.geometry,i=this.material,a=this.matrixWorld;if(void 0!==i&&(null===r.boundingSphere&&r.computeBoundingSphere(),An.copy(r.boundingSphere),An.applyMatrix4(a),!1!==t.ray.intersectsSphere(An)&&(Tn.copy(a).invert(),En.copy(t.ray).applyMatrix4(Tn),null===r.boundingBox||!1!==En.intersectsBox(r.boundingBox))))if(r.isBufferGeometry){var o=r.index,s=r.attributes.position,l=r.morphAttributes.position,c=r.morphTargetsRelative,u=r.attributes.uv,h=r.attributes.uv2,d=r.groups,p=r.drawRange;if(null!==o)if(Array.isArray(i))for(var f=0,m=d.length;f0?1:-1,h.push(A.x,A.y,A.z),d.push(C/m),d.push(1-L/v),T+=1}for(var D=0;D0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;var i={};for(var a in this.extensions)!0===this.extensions[a]&&(i[a]=!0);return Object.keys(i).length>0&&(e.extensions=i),e},Zn.prototype=Object.assign(Object.create(Le.prototype),{constructor:Zn,isCamera:!0,copy:function(t,e){return Le.prototype.copy.call(this,t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Rt),this.updateWorldMatrix(!0,!1);var e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()},updateMatrixWorld:function(t){Le.prototype.updateMatrixWorld.call(this,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()},updateWorldMatrix:function(t,e){Le.prototype.updateWorldMatrix.call(this,t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()},clone:function(){return(new this.constructor).copy(this)}}),Jn.prototype=Object.assign(Object.create(Zn.prototype),{constructor:Jn,isPerspectiveCamera:!0,copy:function(t,e){return Zn.prototype.copy.call(this,t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this},setFocalLength:function(t){var e=.5*this.getFilmHeight()/t;this.fov=2*gt.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var t=Math.tan(.5*gt.DEG2RAD*this.fov);return.5*this.getFilmHeight()/t},getEffectiveFOV:function(){return 2*gt.RAD2DEG*Math.atan(Math.tan(.5*gt.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(t,e,n,r,i,a){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=r,this.view.width=i,this.view.height=a,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=this.near,e=t*Math.tan(.5*gt.DEG2RAD*this.fov)/this.zoom,n=2*e,r=this.aspect*n,i=-.5*r,a=this.view;if(null!==this.view&&this.view.enabled){var o=a.fullWidth,s=a.fullHeight;i+=a.offsetX*r/o,e-=a.offsetY*n/s,r*=a.width/o,n*=a.height/s}var l=this.filmOffset;0!==l&&(i+=t*l/this.getFilmWidth()),this.projectionMatrix.makePerspective(i,i+r,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()},toJSON:function(t){var e=Le.prototype.toJSON.call(this,t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}});var Qn=90,Kn=function(t){function e(e,n,r){var i;if((i=t.call(this)||this).type="CubeCamera",!0!==r.isWebGLCubeRenderTarget)return console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter."),ut(i);i.renderTarget=r;var a=new Jn(Qn,1,e,n);a.layers=i.layers,a.up.set(0,-1,0),a.lookAt(new Rt(1,0,0)),i.add(a);var o=new Jn(Qn,1,e,n);o.layers=i.layers,o.up.set(0,-1,0),o.lookAt(new Rt(-1,0,0)),i.add(o);var s=new Jn(Qn,1,e,n);s.layers=i.layers,s.up.set(0,0,1),s.lookAt(new Rt(0,1,0)),i.add(s);var l=new Jn(Qn,1,e,n);l.layers=i.layers,l.up.set(0,0,-1),l.lookAt(new Rt(0,-1,0)),i.add(l);var c=new Jn(Qn,1,e,n);c.layers=i.layers,c.up.set(0,-1,0),c.lookAt(new Rt(0,0,1)),i.add(c);var u=new Jn(Qn,1,e,n);return u.layers=i.layers,u.up.set(0,-1,0),u.lookAt(new Rt(0,0,-1)),i.add(u),i}return lt(e,t),e.prototype.update=function(t,e){null===this.parent&&this.updateMatrixWorld();var n=this.renderTarget,r=this.children,i=r[0],a=r[1],o=r[2],s=r[3],l=r[4],c=r[5],u=t.xr.enabled,h=t.getRenderTarget();t.xr.enabled=!1;var d=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,i),t.setRenderTarget(n,1),t.render(e,a),t.setRenderTarget(n,2),t.render(e,o),t.setRenderTarget(n,3),t.render(e,s),t.setRenderTarget(n,4),t.render(e,l),n.texture.generateMipmaps=d,t.setRenderTarget(n,5),t.render(e,c),t.setRenderTarget(h),t.xr.enabled=u},e}(Le),$n=function(t){function e(e,n,r,i,o,s,l,c,u,h){var d;return e=void 0!==e?e:[],n=void 0!==n?n:a,l=void 0!==l?l:E,(d=t.call(this,e,n,r,i,o,s,l,c,u,h)||this)._needsFlipEnvMap=!0,d.flipY=!1,d}return lt(e,t),st(e,[{key:"images",get:function(){return this.image},set:function(t){this.image=t}}]),e}(Mt);$n.prototype.isCubeTexture=!0;var tr=function(t){function e(e,n,r){var i;return Number.isInteger(n)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),n=r),i=t.call(this,e,e,n)||this,n=n||{},i.texture=new $n(void 0,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),i.texture.generateMipmaps=void 0!==n.generateMipmaps&&n.generateMipmaps,i.texture.minFilter=void 0!==n.minFilter?n.minFilter:g,i.texture._needsFlipEnvMap=!1,i}lt(e,t);var n=e.prototype;return n.fromEquirectangularTexture=function(t,e){this.texture.type=e.type,this.texture.format=A,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;var n={tEquirect:{value:null}},r="\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",i="\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t",a=new Wn(5,5,5),o=new Yn({name:"CubemapFromEquirect",uniforms:jn(n),vertexShader:r,fragmentShader:i,side:1,blending:0});o.uniforms.tEquirect.value=e;var s=new kn(a,o),l=e.minFilter;return e.minFilter===x&&(e.minFilter=g),new Kn(1,10,this).update(t,s),e.minFilter=l,s.geometry.dispose(),s.material.dispose(),this},n.clear=function(t,e,n,r){for(var i=t.getRenderTarget(),a=0;a<6;a++)t.setRenderTarget(this,a),t.clear(e,n,r);t.setRenderTarget(i)},e}(Et);tr.prototype.isWebGLCubeRenderTarget=!0;var er=function(t){function e(e,n,r,i,a,o,s,l,c,u,h,d){var p;return(p=t.call(this,null,o,s,l,c,u,i,a,h,d)||this).image={data:e||null,width:n||1,height:r||1},p.magFilter=void 0!==c?c:f,p.minFilter=void 0!==u?u:f,p.generateMipmaps=!1,p.flipY=!1,p.unpackAlignment=1,p.needsUpdate=!0,p}return lt(e,t),e}(Mt);er.prototype.isDataTexture=!0;var nr=new Yt,rr=new Rt,ir=function(){function t(t,e,n,r,i,a){void 0===t&&(t=new De),void 0===e&&(e=new De),void 0===n&&(n=new De),void 0===r&&(r=new De),void 0===i&&(i=new De),void 0===a&&(a=new De),this.planes=[t,e,n,r,i,a]}var e=t.prototype;return e.set=function(t,e,n,r,i,a){var o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(r),o[4].copy(i),o[5].copy(a),this},e.copy=function(t){for(var e=this.planes,n=0;n<6;n++)e[n].copy(t.planes[n]);return this},e.setFromProjectionMatrix=function(t){var e=this.planes,n=t.elements,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],l=n[5],c=n[6],u=n[7],h=n[8],d=n[9],p=n[10],f=n[11],m=n[12],v=n[13],g=n[14],y=n[15];return e[0].setComponents(o-r,u-s,f-h,y-m).normalize(),e[1].setComponents(o+r,u+s,f+h,y+m).normalize(),e[2].setComponents(o+i,u+l,f+d,y+v).normalize(),e[3].setComponents(o-i,u-l,f-d,y-v).normalize(),e[4].setComponents(o-a,u-c,f-p,y-g).normalize(),e[5].setComponents(o+a,u+c,f+p,y+g).normalize(),this},e.intersectsObject=function(t){var e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),nr.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(nr)},e.intersectsSprite=function(t){return nr.center.set(0,0,0),nr.radius=.7071067811865476,nr.applyMatrix4(t.matrixWorld),this.intersectsSphere(nr)},e.intersectsSphere=function(t){for(var e=this.planes,n=t.center,r=-t.radius,i=0;i<6;i++){if(e[i].distanceToPoint(n)0?t.max.x:t.min.x,rr.y=r.normal.y>0?t.max.y:t.min.y,rr.z=r.normal.z>0?t.max.z:t.min.z,r.distanceToPoint(rr)<0)return!1}return!0},e.containsPoint=function(t){for(var e=this.planes,n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0},e.clone=function(){return(new this.constructor).copy(this)},t}();function ar(){var t=null,e=!1,n=null,r=null;function i(e,a){n(e,a),r=t.requestAnimationFrame(i)}return{start:function(){!0!==e&&null!==n&&(r=t.requestAnimationFrame(i),e=!0)},stop:function(){t.cancelAnimationFrame(r),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function or(t,e){var n=e.isWebGL2,r=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),r.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);var n=r.get(e);n&&(t.deleteBuffer(n.buffer),r.delete(e))},update:function(e,i){if(e.isGLBufferAttribute){var a=r.get(e);(!a||a.version 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor.xyz *= color.xyz;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmissionmap_fragment:"#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif",transmissionmap_pars_fragment:"#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},cr={common:{diffuse:{value:new Ke(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new _t},uv2Transform:{value:new _t},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new yt(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Ke(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Ke(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new _t}},sprite:{diffuse:{value:new Ke(15658734)},opacity:{value:1},center:{value:new yt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new _t}}},ur={basic:{uniforms:qn([cr.common,cr.specularmap,cr.envmap,cr.aomap,cr.lightmap,cr.fog]),vertexShader:lr.meshbasic_vert,fragmentShader:lr.meshbasic_frag},lambert:{uniforms:qn([cr.common,cr.specularmap,cr.envmap,cr.aomap,cr.lightmap,cr.emissivemap,cr.fog,cr.lights,{emissive:{value:new Ke(0)}}]),vertexShader:lr.meshlambert_vert,fragmentShader:lr.meshlambert_frag},phong:{uniforms:qn([cr.common,cr.specularmap,cr.envmap,cr.aomap,cr.lightmap,cr.emissivemap,cr.bumpmap,cr.normalmap,cr.displacementmap,cr.fog,cr.lights,{emissive:{value:new Ke(0)},specular:{value:new Ke(1118481)},shininess:{value:30}}]),vertexShader:lr.meshphong_vert,fragmentShader:lr.meshphong_frag},standard:{uniforms:qn([cr.common,cr.envmap,cr.aomap,cr.lightmap,cr.emissivemap,cr.bumpmap,cr.normalmap,cr.displacementmap,cr.roughnessmap,cr.metalnessmap,cr.fog,cr.lights,{emissive:{value:new Ke(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:lr.meshphysical_vert,fragmentShader:lr.meshphysical_frag},toon:{uniforms:qn([cr.common,cr.aomap,cr.lightmap,cr.emissivemap,cr.bumpmap,cr.normalmap,cr.displacementmap,cr.gradientmap,cr.fog,cr.lights,{emissive:{value:new Ke(0)}}]),vertexShader:lr.meshtoon_vert,fragmentShader:lr.meshtoon_frag},matcap:{uniforms:qn([cr.common,cr.bumpmap,cr.normalmap,cr.displacementmap,cr.fog,{matcap:{value:null}}]),vertexShader:lr.meshmatcap_vert,fragmentShader:lr.meshmatcap_frag},points:{uniforms:qn([cr.points,cr.fog]),vertexShader:lr.points_vert,fragmentShader:lr.points_frag},dashed:{uniforms:qn([cr.common,cr.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:lr.linedashed_vert,fragmentShader:lr.linedashed_frag},depth:{uniforms:qn([cr.common,cr.displacementmap]),vertexShader:lr.depth_vert,fragmentShader:lr.depth_frag},normal:{uniforms:qn([cr.common,cr.bumpmap,cr.normalmap,cr.displacementmap,{opacity:{value:1}}]),vertexShader:lr.normal_vert,fragmentShader:lr.normal_frag},sprite:{uniforms:qn([cr.sprite,cr.fog]),vertexShader:lr.sprite_vert,fragmentShader:lr.sprite_frag},background:{uniforms:{uvTransform:{value:new _t},t2D:{value:null}},vertexShader:lr.background_vert,fragmentShader:lr.background_frag},cube:{uniforms:qn([cr.envmap,{opacity:{value:1}}]),vertexShader:lr.cube_vert,fragmentShader:lr.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:lr.equirect_vert,fragmentShader:lr.equirect_frag},distanceRGBA:{uniforms:qn([cr.common,cr.displacementmap,{referencePosition:{value:new Rt},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:lr.distanceRGBA_vert,fragmentShader:lr.distanceRGBA_frag},shadow:{uniforms:qn([cr.lights,cr.fog,{color:{value:new Ke(0)},opacity:{value:1}}]),vertexShader:lr.shadow_vert,fragmentShader:lr.shadow_frag}};function hr(t,e,n,r,i){var a,o,s=new Ke(0),l=0,u=null,h=0,d=null;function p(t,e){n.buffers.color.setClear(t.r,t.g,t.b,e,i)}return{getClearColor:function(){return s},setClearColor:function(t,e){void 0===e&&(e=1),s.set(t),p(s,l=e)},getClearAlpha:function(){return l},setClearAlpha:function(t){p(s,l=t)},render:function(n,i,f,m){var v=!0===i.isScene?i.background:null;v&&v.isTexture&&(v=e.get(v));var g=t.xr,y=g.getSession&&g.getSession();y&&"additive"===y.environmentBlendMode&&(v=null),null===v?p(s,l):v&&v.isColor&&(p(v,1),m=!0),(t.autoClear||m)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),v&&(v.isCubeTexture||v.isWebGLCubeRenderTarget||v.mapping===c)?(void 0===o&&((o=new kn(new Wn(1,1,1),new Yn({name:"BackgroundCubeMaterial",uniforms:jn(ur.cube.uniforms),vertexShader:ur.cube.vertexShader,fragmentShader:ur.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(o)),v.isWebGLCubeRenderTarget&&(v=v.texture),o.material.uniforms.envMap.value=v,o.material.uniforms.flipEnvMap.value=v.isCubeTexture&&v._needsFlipEnvMap?-1:1,u===v&&h===v.version&&d===t.toneMapping||(o.material.needsUpdate=!0,u=v,h=v.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null)):v&&v.isTexture&&(void 0===a&&((a=new kn(new sr(2,2),new Yn({name:"BackgroundMaterial",uniforms:jn(ur.background.uniforms),vertexShader:ur.background.vertexShader,fragmentShader:ur.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(a)),a.material.uniforms.t2D.value=v,!0===v.matrixAutoUpdate&&v.updateMatrix(),a.material.uniforms.uvTransform.value.copy(v.matrix),u===v&&h===v.version&&d===t.toneMapping||(a.material.needsUpdate=!0,u=v,h=v.version,d=t.toneMapping),n.unshift(a,a.geometry,a.material,0,0,null))}}}function dr(t,e,n,r){var i=t.getParameter(34921),a=r.isWebGL2?null:e.get("OES_vertex_array_object"),o=r.isWebGL2||null!==a,s={},l=d(null),c=l;function u(e){return r.isWebGL2?t.bindVertexArray(e):a.bindVertexArrayOES(e)}function h(e){return r.isWebGL2?t.deleteVertexArray(e):a.deleteVertexArrayOES(e)}function d(t){for(var e=[],n=[],r=[],a=0;a=0){var y=l[h];if(void 0!==y){var x=y.normalized,_=y.itemSize,b=n.get(y);if(void 0===b)continue;var w=b.buffer,M=b.type,S=b.bytesPerElement;if(y.isInterleavedBufferAttribute){var T=y.data,E=T.stride,A=y.offset;T&&T.isInstancedInterleavedBuffer?(m(d,T.meshPerAttribute),void 0===s._maxInstanceCount&&(s._maxInstanceCount=T.meshPerAttribute*T.count)):f(d),t.bindBuffer(34962,w),g(d,_,M,x,E*S,A*S)}else y.isInstancedBufferAttribute?(m(d,y.meshPerAttribute),void 0===s._maxInstanceCount&&(s._maxInstanceCount=y.meshPerAttribute*y.count)):f(d),t.bindBuffer(34962,w),g(d,_,M,x,0,0)}else if("instanceMatrix"===h){var L=n.get(i.instanceMatrix);if(void 0===L)continue;var R=L.buffer,C=L.type;m(d+0,1),m(d+1,1),m(d+2,1),m(d+3,1),t.bindBuffer(34962,R),t.vertexAttribPointer(d+0,4,C,!1,64,0),t.vertexAttribPointer(d+1,4,C,!1,64,16),t.vertexAttribPointer(d+2,4,C,!1,64,32),t.vertexAttribPointer(d+3,4,C,!1,64,48)}else if("instanceColor"===h){var P=n.get(i.instanceColor);if(void 0===P)continue;var D=P.buffer,I=P.type;m(d,1),t.bindBuffer(34962,D),t.vertexAttribPointer(d,3,I,!1,12,0)}else if(void 0!==u){var N=u[h];if(void 0!==N)switch(N.length){case 2:t.vertexAttrib2fv(d,N);break;case 3:t.vertexAttrib3fv(d,N);break;case 4:t.vertexAttrib4fv(d,N);break;default:t.vertexAttrib1fv(d,N)}}}}v()}(i,l,h,y),null!==x&&t.bindBuffer(34963,n.get(x).buffer))},reset:y,resetDefaultState:x,dispose:function(){for(var t in y(),s){var e=s[t];for(var n in e){var r=e[n];for(var i in r)h(r[i].object),delete r[i];delete e[n]}delete s[t]}},releaseStatesOfGeometry:function(t){if(void 0!==s[t.id]){var e=s[t.id];for(var n in e){var r=e[n];for(var i in r)h(r[i].object),delete r[i];delete e[n]}delete s[t.id]}},releaseStatesOfProgram:function(t){for(var e in s){var n=s[e];if(void 0!==n[t.id]){var r=n[t.id];for(var i in r)h(r[i].object),delete r[i];delete n[t.id]}}},initAttributes:p,enableAttribute:f,disableUnusedAttributes:v}}function pr(t,e,n,r){var i,a=r.isWebGL2;this.setMode=function(t){i=t},this.render=function(e,r){t.drawArrays(i,e,r),n.update(r,i,1)},this.renderInstances=function(r,o,s){if(0!==s){var l,c;if(a)l=t,c="drawArraysInstanced";else if(c="drawArraysInstancedANGLE",null===(l=e.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[c](i,r,o,s),n.update(o,i,s)}}}function fr(t,e,n){var r;function i(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}var a="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext,o=void 0!==n.precision?n.precision:"highp",s=i(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);var l=!0===n.logarithmicDepthBuffer,c=t.getParameter(34930),u=t.getParameter(35660),h=t.getParameter(3379),d=t.getParameter(34076),p=t.getParameter(34921),f=t.getParameter(36347),m=t.getParameter(36348),v=t.getParameter(36349),g=u>0,y=a||e.has("OES_texture_float");return{isWebGL2:a,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===e.has("EXT_texture_filter_anisotropic")){var n=e.get("EXT_texture_filter_anisotropic");r=t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:i,precision:o,logarithmicDepthBuffer:l,maxTextures:c,maxVertexTextures:u,maxTextureSize:h,maxCubemapSize:d,maxAttributes:p,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:v,vertexTextures:g,floatFragmentTextures:y,floatVertexTextures:g&&y,maxSamples:a?t.getParameter(36183):0}}function mr(t){var e=this,n=null,r=0,i=!1,a=!1,o=new De,s=new _t,l={value:null,needsUpdate:!1};function c(){l.value!==n&&(l.value=n,l.needsUpdate=r>0),e.numPlanes=r,e.numIntersection=0}function u(t,n,r,i){var a=null!==t?t.length:0,c=null;if(0!==a){if(c=l.value,!0!==i||null===c){var u=r+4*a,h=n.matrixWorldInverse;s.getNormalMatrix(h),(null===c||c.length0){var c=t.getRenderTarget(),u=new tr(o.height/2);return u.fromEquirectangularTexture(t,i),e.set(i,u),t.setRenderTarget(c),i.addEventListener("dispose",r),n(u.texture,i.mapping)}return null}}return i},dispose:function(){e=new WeakMap}}}function gr(t){var e={};function n(n){if(void 0!==e[n])return e[n];var r;switch(n){case"WEBGL_depth_texture":r=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":r=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":r=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":r=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:r=t.getExtension(n)}return e[n]=r,r}return{has:function(t){return null!==n(t)},init:function(t){t.isWebGL2?n("EXT_color_buffer_float"):(n("WEBGL_depth_texture"),n("OES_texture_float"),n("OES_texture_half_float"),n("OES_texture_half_float_linear"),n("OES_standard_derivatives"),n("OES_element_index_uint"),n("OES_vertex_array_object"),n("ANGLE_instanced_arrays")),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float")},get:function(t){var e=n(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function yr(t,e,n,r){var i={},a=new WeakMap;function o(t){var s=t.target;for(var l in null!==s.index&&e.remove(s.index),s.attributes)e.remove(s.attributes[l]);s.removeEventListener("dispose",o),delete i[s.id];var c=a.get(s);c&&(e.remove(c),a.delete(s)),r.releaseStatesOfGeometry(s),!0===s.isInstancedBufferGeometry&&delete s._maxInstanceCount,n.memory.geometries--}function s(t){var n=[],r=t.index,i=t.attributes.position,o=0;if(null!==r){var s=r.array;o=r.version;for(var l=0,c=s.length;l65535?un:ln)(n,1);x.version=o;var _=a.get(t);_&&e.remove(_),a.set(t,x)}return{get:function(t,e){return!0===i[e.id]||(e.addEventListener("dispose",o),i[e.id]=!0,n.memory.geometries++),e},update:function(t){var n=t.attributes;for(var r in n)e.update(n[r],34962);var i=t.morphAttributes;for(var a in i)for(var o=i[a],s=0,l=o.length;s0)return t;var i=e*n,a=Pr[i];if(void 0===a&&(a=new Float32Array(i),Pr[i]=a),0!==e){r.toArray(a,0);for(var o=1,s=0;o!==e;++o)s+=n,t[o].toArray(a,s)}return a}function zr(t,e){if(t.length!==e.length)return!1;for(var n=0,r=t.length;n/gm;function Di(t){return t.replace(Pi,Ii)}function Ii(t,e){var n=lr[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return Di(n)}var Ni=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Bi=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Oi(t){return t.replace(Bi,Fi).replace(Ni,zi)}function zi(t,e,n,r){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Fi(t,e,n,r)}function Fi(t,e,n,r){for(var i="",a=parseInt(e);a0?t.gammaFactor:1,w=n.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Li).join("\n")}(n),M=function(t){var e=[];for(var n in t){var r=t[n];!1!==r&&e.push("#define "+n+" "+r)}return e.join("\n")}(f),S=p.createProgram(),T=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?((i=[M].filter(Li).join("\n")).length>0&&(i+="\n"),(s=[w,M].filter(Li).join("\n")).length>0&&(s+="\n")):(i=[Hi(n),"#define SHADER_NAME "+n.shaderName,M,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+b,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+x:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+g:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Li).join("\n"),s=[w,Hi(n),"#define SHADER_NAME "+n.shaderName,M,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+b,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+y:"",n.envMap?"#define "+x:"",n.envMap?"#define "+_:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+g:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?lr.tonemapping_pars_fragment:"",0!==n.toneMapping?Ai("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",lr.encodings_pars_fragment,n.map?Ei("mapTexelToLinear",n.mapEncoding):"",n.matcap?Ei("matcapTexelToLinear",n.matcapEncoding):"",n.envMap?Ei("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMap?Ei("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMap?Ei("lightMapTexelToLinear",n.lightMapEncoding):"",(l="linearToOutputTexel",h=n.outputEncoding,d=Si(h),"vec4 "+l+"( vec4 value ) { return LinearTo"+d[0]+d[1]+"; }"),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Li).join("\n")),m=Ci(m=Ri(m=Di(m),n),n),v=Ci(v=Ri(v=Di(v),n),n),m=Oi(m),v=Oi(v),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(T="#version 300 es\n",i=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+i,s=["#define varying in",n.glslVersion===it?"":"out highp vec4 pc_fragColor;",n.glslVersion===it?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+s);var E,A,L=T+s+v,R=wi(p,35633,T+i+m),C=wi(p,35632,L);if(p.attachShader(S,R),p.attachShader(S,C),void 0!==n.index0AttributeName?p.bindAttribLocation(S,0,n.index0AttributeName):!0===n.morphTargets&&p.bindAttribLocation(S,0,"position"),p.linkProgram(S),t.debug.checkShaderErrors){var P=p.getProgramInfoLog(S).trim(),D=p.getShaderInfoLog(R).trim(),I=p.getShaderInfoLog(C).trim(),N=!0,B=!0;if(!1===p.getProgramParameter(S,35714)){N=!1;var O=Ti(p,R,"vertex"),z=Ti(p,C,"fragment");console.error("THREE.WebGLProgram: shader error: ",p.getError(),"35715",p.getProgramParameter(S,35715),"gl.getProgramInfoLog",P,O,z)}else""!==P?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",P):""!==D&&""!==I||(B=!1);B&&(this.diagnostics={runnable:N,programLog:P,vertexShader:{log:D,prefix:i},fragmentShader:{log:I,prefix:s}})}return p.deleteShader(R),p.deleteShader(C),this.getUniforms=function(){return void 0===E&&(E=new bi(p,S)),E},this.getAttributes=function(){return void 0===A&&(A=function(t,e){for(var n={},r=t.getProgramParameter(e,35721),i=0;i0,maxBones:E,useVertexTexture:h,morphTargets:i.morphTargets,morphNormals:i.morphNormals,maxMorphTargets:t.maxMorphTargets,maxMorphNormals:t.maxMorphNormals,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:i.dithering,shadowMapEnabled:t.shadowMap.enabled&&v.length>0,shadowMapType:t.shadowMap.type,toneMapping:i.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:i.premultipliedAlpha,alphaTest:i.alphaTest,doubleSided:2===i.side,flipSided:1===i.side,depthPacking:void 0!==i.depthPacking&&i.depthPacking,index0AttributeName:i.index0AttributeName,extensionDerivatives:i.extensions&&i.extensions.derivatives,extensionFragDepth:i.extensions&&i.extensions.fragDepth,extensionDrawBuffers:i.extensions&&i.extensions.drawBuffers,extensionShaderTextureLOD:i.extensions&&i.extensions.shaderTextureLOD,rendererExtensionFragDepth:s||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:s||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:s||n.has("EXT_shader_texture_lod"),customProgramCacheKey:i.customProgramCacheKey()}},getProgramCacheKey:function(e){var n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(var r in e.defines)n.push(r),n.push(e.defines[r]);if(!1===e.isRawShaderMaterial){for(var i=0;i1&&r.sort(t||Vi),i.length>1&&i.sort(e||Wi)}}}function qi(t){var e=new WeakMap;return{get:function(n,r){var i;return!1===e.has(n)?(i=new ji(t),e.set(n,[i])):r>=e.get(n).length?(i=new ji(t),e.get(n).push(i)):i=e.get(n)[r],i},dispose:function(){e=new WeakMap}}}function Xi(){var t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];var n;switch(e.type){case"DirectionalLight":n={direction:new Rt,color:new Ke};break;case"SpotLight":n={position:new Rt,direction:new Rt,color:new Ke,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Rt,color:new Ke,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Rt,skyColor:new Ke,groundColor:new Ke};break;case"RectAreaLight":n={color:new Ke,position:new Rt,halfWidth:new Rt,halfHeight:new Rt}}return t[e.id]=n,n}}}var Yi=0;function Zi(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function Ji(t,e){for(var n,r=new Xi,i=(n={},{get:function(t){if(void 0!==n[t.id])return n[t.id];var e;switch(t.type){case"DirectionalLight":case"SpotLight":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new yt};break;case"PointLight":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new yt,shadowCameraNear:1,shadowCameraFar:1e3}}return n[t.id]=e,e}}),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},o=0;o<9;o++)a.probe.push(new Rt);var s=new Rt,l=new re,c=new re;return{setup:function(n){for(var o=0,s=0,l=0,c=0;c<9;c++)a.probe[c].set(0,0,0);var u=0,h=0,d=0,p=0,f=0,m=0,v=0,g=0;n.sort(Zi);for(var y=0,x=n.length;y0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(a.rectAreaLTC1=cr.LTC_FLOAT_1,a.rectAreaLTC2=cr.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(a.rectAreaLTC1=cr.LTC_HALF_1,a.rectAreaLTC2=cr.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),a.ambient[0]=o,a.ambient[1]=s,a.ambient[2]=l;var z=a.hash;z.directionalLength===u&&z.pointLength===h&&z.spotLength===d&&z.rectAreaLength===p&&z.hemiLength===f&&z.numDirectionalShadows===m&&z.numPointShadows===v&&z.numSpotShadows===g||(a.directional.length=u,a.spot.length=d,a.rectArea.length=p,a.point.length=h,a.hemi.length=f,a.directionalShadow.length=m,a.directionalShadowMap.length=m,a.pointShadow.length=v,a.pointShadowMap.length=v,a.spotShadow.length=g,a.spotShadowMap.length=g,a.directionalShadowMatrix.length=m,a.pointShadowMatrix.length=v,a.spotShadowMatrix.length=g,z.directionalLength=u,z.pointLength=h,z.spotLength=d,z.rectAreaLength=p,z.hemiLength=f,z.numDirectionalShadows=m,z.numPointShadows=v,z.numSpotShadows=g,a.version=Yi++)},setupView:function(t,e){for(var n=0,r=0,i=0,o=0,u=0,h=e.matrixWorldInverse,d=0,p=t.length;d=n.get(r).length?(a=new Qi(t,e),n.get(r).push(a)):a=n.get(r)[i],a},dispose:function(){n=new WeakMap}}}var $i=function(t){function e(e){var n;return(n=t.call(this)||this).type="MeshDepthMaterial",n.depthPacking=3200,n.skinning=!1,n.morphTargets=!1,n.map=null,n.alphaMap=null,n.displacementMap=null,n.displacementScale=1,n.displacementBias=0,n.wireframe=!1,n.wireframeLinewidth=1,n.fog=!1,n.setValues(e),n}return lt(e,t),e.prototype.copy=function(e){return t.prototype.copy.call(this,e),this.depthPacking=e.depthPacking,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this},e}(je);$i.prototype.isMeshDepthMaterial=!0;var ta=function(t){function e(e){var n;return(n=t.call(this)||this).type="MeshDistanceMaterial",n.referencePosition=new Rt,n.nearDistance=1,n.farDistance=1e3,n.skinning=!1,n.morphTargets=!1,n.map=null,n.alphaMap=null,n.displacementMap=null,n.displacementScale=1,n.displacementBias=0,n.fog=!1,n.setValues(e),n}return lt(e,t),e.prototype.copy=function(e){return t.prototype.copy.call(this,e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.skinning=e.skinning,this.morphTargets=e.morphTargets,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this},e}(je);ta.prototype.isMeshDistanceMaterial=!0;function ea(t,e,n){var r=new ir,i=new yt,a=new yt,o=new Tt,s=[],l=[],c={},u={0:1,1:0,2:2},h=new Yn({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new yt},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),d=h.clone();d.defines.HORIZONTAL_PASS=1;var p=new Sn;p.setAttribute("position",new nn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var m=new kn(p,h),v=this;function y(n,r){var i=e.update(m);h.uniforms.shadow_pass.value=n.map.texture,h.uniforms.resolution.value=n.mapSize,h.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(r,null,i,h,m,null),d.uniforms.shadow_pass.value=n.mapPass.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(r,null,i,d,m,null)}function x(t,e,n){var r=t<<0|e<<1|n<<2,i=s[r];return void 0===i&&(i=new $i({depthPacking:3201,morphTargets:t,skinning:e}),s[r]=i),i}function _(t,e,n){var r=t<<0|e<<1|n<<2,i=l[r];return void 0===i&&(i=new ta({morphTargets:t,skinning:e}),l[r]=i),i}function b(e,n,r,i,a,o,s){var l=null,h=x,d=e.customDepthMaterial;if(!0===i.isPointLight&&(h=_,d=e.customDistanceMaterial),void 0===d){var p=!1;!0===r.morphTargets&&(p=n.morphAttributes&&n.morphAttributes.position&&n.morphAttributes.position.length>0);var f=!1;!0===e.isSkinnedMesh&&(!0===r.skinning?f=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e)),l=h(p,f,!0===e.isInstancedMesh)}else l=d;if(t.localClippingEnabled&&!0===r.clipShadows&&0!==r.clippingPlanes.length){var m=l.uuid,v=r.uuid,g=c[m];void 0===g&&(g={},c[m]=g);var y=g[v];void 0===y&&(y=l.clone(),g[v]=y),l=y}return l.visible=r.visible,l.wireframe=r.wireframe,l.side=3===s?null!==r.shadowSide?r.shadowSide:r.side:null!==r.shadowSide?r.shadowSide:u[r.side],l.clipShadows=r.clipShadows,l.clippingPlanes=r.clippingPlanes,l.clipIntersection=r.clipIntersection,l.wireframeLinewidth=r.wireframeLinewidth,l.linewidth=r.linewidth,!0===i.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(i.matrixWorld),l.nearDistance=a,l.farDistance=o),l}function w(n,i,a,o,s){if(!1!==n.visible){if(n.layers.test(i.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===s)&&(!n.frustumCulled||r.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);var l=e.update(n),c=n.material;if(Array.isArray(c))for(var u=l.groups,h=0,d=u.length;hn||i.y>n)&&(i.x>n&&(a.x=Math.floor(n/b.x),i.x=a.x*b.x,_.mapSize.x=a.x),i.y>n&&(a.y=Math.floor(n/b.y),i.y=a.y*b.y,_.mapSize.y=a.y)),null===_.map&&!_.isPointLightShadow&&3===this.type){var M={minFilter:g,magFilter:g,format:A};_.map=new Et(i.x,i.y,M),_.map.texture.name=x.name+".shadowMap",_.mapPass=new Et(i.x,i.y,M),_.camera.updateProjectionMatrix()}if(null===_.map){var S={minFilter:f,magFilter:f,format:A};_.map=new Et(i.x,i.y,S),_.map.texture.name=x.name+".shadowMap",_.camera.updateProjectionMatrix()}t.setRenderTarget(_.map),t.clear();for(var T=_.getViewportCount(),E=0;E=1):-1!==R.indexOf("OpenGL ES")&&(L=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=L>=2);var C=null,P={},D=new Tt,I=new Tt;function N(e,n,r){var i=new Uint8Array(4),a=t.createTexture();t.bindTexture(e,a),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(var o=0;or||t.height>r)&&(i=r/Math.max(t.width,t.height)),i<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){var a=e?gt.floorPowerOfTwo:Math.floor,o=a(i*t.width),s=a(i*t.height);void 0===c&&(c=P(o,s));var l=n?P(o,s):c;return l.width=o,l.height=s,l.getContext("2d").drawImage(t,0,0,o,s),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+o+"x"+s+")."),l}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function I(t){return gt.isPowerOfTwo(t.width)&>.isPowerOfTwo(t.height)}function N(t,e){return t.generateMipmaps&&e&&t.minFilter!==f&&t.minFilter!==g}function B(e,n,i,a){t.generateMipmap(e),r.get(n).__maxMipLevel=Math.log2(Math.max(i,a))}function O(n,r,i){if(!1===u)return r;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}var a=r;return 6403===r&&(5126===i&&(a=33326),5131===i&&(a=33325),5121===i&&(a=33321)),6407===r&&(5126===i&&(a=34837),5131===i&&(a=34843),5121===i&&(a=32849)),6408===r&&(5126===i&&(a=34836),5131===i&&(a=34842),5121===i&&(a=32856)),33325!==a&&33326!==a&&34842!==a&&34836!==a||e.get("EXT_color_buffer_float"),a}function z(t){return t===f||t===m||t===v?9728:9729}function F(e){var n=e.target;n.removeEventListener("dispose",F),function(e){var n=r.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),r.remove(e)}(n),n.isVideoTexture&&_.delete(n),o.memory.textures--}function H(e){var n=e.target;n.removeEventListener("dispose",H),function(e){var n=e.texture,i=r.get(e),a=r.get(n);if(!e)return;void 0!==a.__webglTexture&&t.deleteTexture(a.__webglTexture);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(var o=0;o<6;o++)t.deleteFramebuffer(i.__webglFramebuffer[o]),i.__webglDepthbuffer&&t.deleteRenderbuffer(i.__webglDepthbuffer[o]);else t.deleteFramebuffer(i.__webglFramebuffer),i.__webglDepthbuffer&&t.deleteRenderbuffer(i.__webglDepthbuffer),i.__webglMultisampledFramebuffer&&t.deleteFramebuffer(i.__webglMultisampledFramebuffer),i.__webglColorRenderbuffer&&t.deleteRenderbuffer(i.__webglColorRenderbuffer),i.__webglDepthRenderbuffer&&t.deleteRenderbuffer(i.__webglDepthRenderbuffer);r.remove(n),r.remove(e)}(n),o.memory.textures--}var G=0;function U(t,e){var i=r.get(t);if(t.isVideoTexture&&function(t){var e=o.render.frame;_.get(t)!==e&&(_.set(t,e),t.update())}(t),t.version>0&&i.__version!==t.version){var a=t.image;if(void 0===a)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==a.complete)return void X(i,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+e),n.bindTexture(3553,i.__webglTexture)}function k(e,i){var o=r.get(e);e.version>0&&o.__version!==e.version?function(e,r,i){if(6!==r.image.length)return;q(e,r),n.activeTexture(33984+i),n.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);for(var o=r&&(r.isCompressedTexture||r.image[0].isCompressedTexture),s=r.image[0]&&r.image[0].isDataTexture,l=[],c=0;c<6;c++)l[c]=o||s?s?r.image[c].image:r.image[c]:D(r.image[c],!1,!0,p);var h,d=l[0],f=I(d)||u,m=a.convert(r.format),v=a.convert(r.type),g=O(r.internalFormat,m,v);if(j(34067,r,f),o){for(var y=0;y<6;y++){h=l[y].mipmaps;for(var x=0;x1||r.get(a).__currentAnisotropy)&&(t.texParameterf(n,s.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,i.getMaxAnisotropy())),r.get(a).__currentAnisotropy=a.anisotropy)}}function q(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",F),e.__webglTexture=t.createTexture(),o.memory.textures++)}function X(e,r,i){var o=3553;r.isDataTexture2DArray&&(o=35866),r.isDataTexture3D&&(o=32879),q(e,r),n.activeTexture(33984+i),n.bindTexture(o,e.__webglTexture),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment),t.pixelStorei(37443,0);var s,l=function(t){return!u&&(t.wrapS!==d||t.wrapT!==d||t.minFilter!==f&&t.minFilter!==g)}(r)&&!1===I(r.image),c=D(r.image,l,!1,y),h=I(c)||u,p=a.convert(r.format),m=a.convert(r.type),v=O(r.internalFormat,p,m);j(o,r,h);var x=r.mipmaps;if(r.isDepthTexture)v=6402,u?v=r.type===M?36012:r.type===w?33190:r.type===T?35056:33189:r.type===M&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===L&&6402===v&&r.type!==b&&r.type!==w&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=b,m=a.convert(r.type)),r.format===R&&6402===v&&(v=34041,r.type!==T&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=T,m=a.convert(r.type))),n.texImage2D(3553,0,v,c.width,c.height,0,p,m,null);else if(r.isDataTexture)if(x.length>0&&h){for(var _=0,S=x.length;_0&&h){for(var z=0,F=x.length;z=h&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+h),G+=1,t},this.resetTextureUnits=function(){G=0},this.setTexture2D=U,this.setTexture2DArray=function(t,e){var i=r.get(t);t.version>0&&i.__version!==t.version?X(i,t,e):(n.activeTexture(33984+e),n.bindTexture(35866,i.__webglTexture))},this.setTexture3D=function(t,e){var i=r.get(t);t.version>0&&i.__version!==t.version?X(i,t,e):(n.activeTexture(33984+e),n.bindTexture(32879,i.__webglTexture))},this.setTextureCube=k,this.setupRenderTarget=function(e){var i=e.texture,s=r.get(e),l=r.get(i);e.addEventListener("dispose",H),l.__webglTexture=t.createTexture(),o.memory.textures++;var c=!0===e.isWebGLCubeRenderTarget,h=!0===e.isWebGLMultisampleRenderTarget,d=i.isDataTexture3D||i.isDataTexture2DArray,p=I(e)||u;if(!u||i.format!==E||i.type!==M&&i.type!==S||(i.format=A,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),c){s.__webglFramebuffer=[];for(var f=0;f<6;f++)s.__webglFramebuffer[f]=t.createFramebuffer()}else if(s.__webglFramebuffer=t.createFramebuffer(),h)if(u){s.__webglMultisampledFramebuffer=t.createFramebuffer(),s.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,s.__webglColorRenderbuffer);var m=a.convert(i.format),v=a.convert(i.type),g=O(i.internalFormat,m,v),y=Q(e);t.renderbufferStorageMultisample(36161,y,g,e.width,e.height),t.bindFramebuffer(36160,s.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,s.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(s.__webglDepthRenderbuffer=t.createRenderbuffer(),Z(s.__webglDepthRenderbuffer,e,!0)),t.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(c){n.bindTexture(34067,l.__webglTexture),j(34067,i,p);for(var x=0;x<6;x++)Y(s.__webglFramebuffer[x],e,36064,34069+x);N(i,p)&&B(34067,i,e.width,e.height),n.bindTexture(34067,null)}else{var _=3553;if(d)if(u)_=i.isDataTexture3D?32879:35866;else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");n.bindTexture(_,l.__webglTexture),j(_,i,p),Y(s.__webglFramebuffer,e,36064,_),N(i,p)&&B(3553,i,e.width,e.height),n.bindTexture(3553,null)}e.depthBuffer&&J(e)},this.updateRenderTargetMipmap=function(t){var e=t.texture;if(N(e,I(t)||u)){var i=t.isWebGLCubeRenderTarget?34067:3553,a=r.get(e).__webglTexture;n.bindTexture(i,a),B(i,e,t.width,t.height),n.bindTexture(i,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(u){var n=r.get(e);t.bindFramebuffer(36008,n.__webglMultisampledFramebuffer),t.bindFramebuffer(36009,n.__webglFramebuffer);var i=e.width,a=e.height,o=16384;e.depthBuffer&&(o|=256),e.stencilBuffer&&(o|=1024),t.blitFramebuffer(0,0,i,a,0,0,i,a,o,9728),t.bindFramebuffer(36160,n.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===K&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),K=!0),t=t.texture),U(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===$&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),$=!0),t=t.texture),k(t,e)}}function ia(t,e,n){var r=n.isWebGL2;return{convert:function(t){var n;if(t===_)return 5121;if(1017===t)return 32819;if(1018===t)return 32820;if(1019===t)return 33635;if(1010===t)return 5120;if(1011===t)return 5122;if(t===b)return 5123;if(1013===t)return 5124;if(t===w)return 5125;if(t===M)return 5126;if(t===S)return r?5131:null!==(n=e.get("OES_texture_half_float"))?n.HALF_FLOAT_OES:null;if(1021===t)return 6406;if(t===E)return 6407;if(t===A)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(t===L)return 6402;if(t===R)return 34041;if(1028===t)return 6403;if(1029===t)return 36244;if(1030===t)return 33319;if(1031===t)return 33320;if(1032===t)return 36248;if(1033===t)return 36249;if(t===C||t===P||t===D||t===I){if(null===(n=e.get("WEBGL_compressed_texture_s3tc")))return null;if(t===C)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(t===P)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(t===D)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(t===I)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(t===N||t===B||t===O||t===z){if(null===(n=e.get("WEBGL_compressed_texture_pvrtc")))return null;if(t===N)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(t===B)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(t===O)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(t===z)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===t)return null!==(n=e.get("WEBGL_compressed_texture_etc1"))?n.COMPRESSED_RGB_ETC1_WEBGL:null;if((t===F||t===H)&&null!==(n=e.get("WEBGL_compressed_texture_etc"))){if(t===F)return n.COMPRESSED_RGB8_ETC2;if(t===H)return n.COMPRESSED_RGBA8_ETC2_EAC}return 37808===t||37809===t||37810===t||37811===t||37812===t||37813===t||37814===t||37815===t||37816===t||37817===t||37818===t||37819===t||37820===t||37821===t||37840===t||37841===t||37842===t||37843===t||37844===t||37845===t||37846===t||37847===t||37848===t||37849===t||37850===t||37851===t||37852===t||37853===t?null!==(n=e.get("WEBGL_compressed_texture_astc"))?t:null:36492===t?null!==(n=e.get("EXT_texture_compression_bptc"))?t:null:t===T?r?34042:null!==(n=e.get("WEBGL_depth_texture"))?n.UNSIGNED_INT_24_8_WEBGL:null:void 0}}}function aa(t){void 0===t&&(t=[]),Jn.call(this),this.cameras=t}aa.prototype=Object.assign(Object.create(Jn.prototype),{constructor:aa,isArrayCamera:!0});var oa=function(t){function e(){var e;return(e=t.call(this)||this).type="Group",e}return lt(e,t),e}(Le);function sa(){this._targetRay=null,this._grip=null,this._hand=null}function la(t,e){var n=this,r=null,i=1,a=null,o="local-floor",s=null,l=[],c=new Map,u=new Jn;u.layers.enable(1),u.viewport=new Tt;var h=new Jn;h.layers.enable(2),h.viewport=new Tt;var d=[u,h],p=new aa;p.layers.enable(1),p.layers.enable(2);var f=null,m=null;function v(t){var e=c.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function g(){c.forEach((function(t,e){t.disconnect(e)})),c.clear(),f=null,m=null,t.setFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),M.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function y(t){for(var e=r.inputSources,n=0;n0&&It(a,t,e),o.length>0&&It(o,t,e),!0===t.isScene&&t.onAfterRender(v,t,e),null!==w&&($.updateRenderTargetMipmap(w),$.updateMultisampleRenderTarget(w)),J.buffers.depth.setTest(!0),J.buffers.depth.setMask(!0),J.buffers.color.setMask(!0),J.setPolygonOffset(!1),m.pop(),p=m.length>0?m[m.length-1]:null,f.pop(),d=f.length>0?f[f.length-1]:null}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFramebuffer=function(t){y!==t&&null===w&&mt.bindFramebuffer(36160,t),y=t},this.getActiveCubeFace=function(){return x},this.getActiveMipmapLevel=function(){return b},this.getRenderTarget=function(){return w},this.setRenderTarget=function(t,e,n){void 0===e&&(e=0),void 0===n&&(n=0),w=t,x=e,b=n,t&&void 0===K.get(t).__webglFramebuffer&&$.setupRenderTarget(t);var r=y,i=!1,a=!1;if(t){var o=t.texture;(o.isDataTexture3D||o.isDataTexture2DArray)&&(a=!0);var s=K.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=s[e],i=!0):r=t.isWebGLMultisampleRenderTarget?K.get(t).__webglMultisampledFramebuffer:s,R.copy(t.viewport),C.copy(t.scissor),P=t.scissorTest}else R.copy(z).multiplyScalar(N).floor(),C.copy(F).multiplyScalar(N).floor(),P=H;if(T!==r&&(mt.bindFramebuffer(36160,r),T=r),J.viewport(R),J.scissor(C),J.setScissorTest(P),i){var l=K.get(t.texture);mt.framebufferTexture2D(36160,36064,34069+e,l.__webglTexture,n)}else if(a){var c=K.get(t.texture),u=e||0;mt.framebufferTextureLayer(36160,36064,c.__webglTexture,n||0,u)}},this.readRenderTargetPixels=function(t,e,n,r,i,a,o){if(t&&t.isWebGLRenderTarget){var s=K.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){var l=!1;s!==T&&(mt.bindFramebuffer(36160,s),l=!0);try{var c=t.texture,u=c.format,h=c.type;if(u!==A&&pt.convert(u)!==mt.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");var d=h===S&&(X.has("EXT_color_buffer_half_float")||Z.isWebGL2&&X.has("EXT_color_buffer_float"));if(!(h===_||pt.convert(h)===mt.getParameter(35738)||h===M&&(Z.isWebGL2||X.has("OES_texture_float")||X.has("WEBGL_color_buffer_float"))||d))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===mt.checkFramebufferStatus(36160)?e>=0&&e<=t.width-r&&n>=0&&n<=t.height-i&&mt.readPixels(e,n,r,i,pt.convert(u),pt.convert(h),a):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{l&&mt.bindFramebuffer(36160,T)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(t,e,n){void 0===n&&(n=0);var r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=pt.convert(e.format);$.setTexture2D(e,0),mt.copyTexImage2D(3553,n,o,t.x,t.y,i,a,0),J.unbindTexture()},this.copyTextureToTexture=function(t,e,n,r){void 0===r&&(r=0);var i=e.image.width,a=e.image.height,o=pt.convert(n.format),s=pt.convert(n.type);$.setTexture2D(n,0),mt.pixelStorei(37440,n.flipY),mt.pixelStorei(37441,n.premultiplyAlpha),mt.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?mt.texSubImage2D(3553,r,t.x,t.y,i,a,o,s,e.image.data):e.isCompressedTexture?mt.compressedTexSubImage2D(3553,r,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,o,e.mipmaps[0].data):mt.texSubImage2D(3553,r,t.x,t.y,o,s,e.image),0===r&&n.generateMipmaps&&mt.generateMipmap(3553),J.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,r,i){if(void 0===i&&(i=0),v.isWebGL1Renderer)console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");else{var a,o=n.image,s=o.width,l=o.height,c=o.data,u=pt.convert(r.format),h=pt.convert(r.type);if(r.isDataTexture3D)$.setTexture3D(r,0),a=32879;else{if(!r.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");$.setTexture2DArray(r,0),a=35866}mt.pixelStorei(37440,r.flipY),mt.pixelStorei(37441,r.premultiplyAlpha),mt.pixelStorei(3317,r.unpackAlignment);var d=mt.getParameter(3314),p=mt.getParameter(32878),f=mt.getParameter(3316),m=mt.getParameter(3315),g=mt.getParameter(32877);mt.pixelStorei(3314,s),mt.pixelStorei(32878,l),mt.pixelStorei(3316,t.min.x),mt.pixelStorei(3315,t.min.y),mt.pixelStorei(32877,t.min.z),mt.texSubImage3D(a,i,e.x,e.y,e.z,t.max.x-t.min.x+1,t.max.y-t.min.y+1,t.max.z-t.min.z+1,u,h,c),mt.pixelStorei(3314,d),mt.pixelStorei(32878,p),mt.pixelStorei(3316,f),mt.pixelStorei(3315,m),mt.pixelStorei(32877,g),0===i&&r.generateMipmaps&&mt.generateMipmap(a),J.unbindTexture()}},this.initTexture=function(t){$.setTexture2D(t,0),J.unbindTexture()},this.resetState=function(){J.reset(),ft.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}oa.prototype.isGroup=!0,Object.assign(sa.prototype,{constructor:sa,getHandSpace:function(){return null===this._hand&&(this._hand=new oa,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand},getTargetRaySpace:function(){return null===this._targetRay&&(this._targetRay=new oa,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1),this._targetRay},getGripSpace:function(){return null===this._grip&&(this._grip=new oa,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1),this._grip},dispatchEvent:function(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this},disconnect:function(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this},update:function(t,e,n){var r=null,i=null,a=null,o=this._targetRay,s=this._grip,l=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState)if(l&&t.hand){a=!0;for(var c,u=dt(t.hand.values());!(c=u()).done;){var h=c.value,d=e.getJointPose(h,n);if(void 0===l.joints[h.jointName]){var p=new oa;p.matrixAutoUpdate=!1,p.visible=!1,l.joints[h.jointName]=p,l.add(p)}var f=l.joints[h.jointName];null!==d&&(f.matrix.fromArray(d.transform.matrix),f.matrix.decompose(f.position,f.rotation,f.scale),f.jointRadius=d.radius),f.visible=null!==d}var m=l.joints["index-finger-tip"],v=l.joints["thumb-tip"],g=m.position.distanceTo(v.position);l.inputState.pinching&&g>.025?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&g<=.015&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&null!==(r=e.getPose(t.targetRaySpace,n))&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale)),null!==s&&t.gripSpace&&null!==(i=e.getPose(t.gripSpace,n))&&(s.matrix.fromArray(i.transform.matrix),s.matrix.decompose(s.position,s.rotation,s.scale));return null!==o&&(o.visible=null!==r),null!==s&&(s.visible=null!==i),null!==l&&(l.visible=null!==a),this}}),Object.assign(la.prototype,pt.prototype);var ha=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e}(ua);ha.prototype.isWebGL1Renderer=!0;var da=function(){function t(t,e){this.name="",this.color=new Ke(t),this.density=void 0!==e?e:25e-5}var e=t.prototype;return e.clone=function(){return new t(this.color,this.density)},e.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}},t}();da.prototype.isFogExp2=!0;var pa=function(){function t(t,e,n){this.name="",this.color=new Ke(t),this.near=void 0!==e?e:1,this.far=void 0!==n?n:1e3}var e=t.prototype;return e.clone=function(){return new t(this.color,this.near,this.far)},e.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}},t}();pa.prototype.isFog=!0;var fa=function(t){function e(){var e;return(e=t.call(this)||this).type="Scene",e.background=null,e.environment=null,e.fog=null,e.overrideMaterial=null,e.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:ut(e)})),e}lt(e,t);var n=e.prototype;return n.copy=function(e,n){return t.prototype.copy.call(this,e,n),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this},n.toJSON=function(e){var n=t.prototype.toJSON.call(this,e);return null!==this.background&&(n.object.background=this.background.toJSON(e)),null!==this.environment&&(n.object.environment=this.environment.toJSON(e)),null!==this.fog&&(n.object.fog=this.fog.toJSON()),n},e}(Le);function ma(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=nt,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=gt.generateUUID()}fa.prototype.isScene=!0,Object.defineProperty(ma.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(ma.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this},copyAt:function(t,e,n){t*=this.stride,n*=e.stride;for(var r=0,i=this.stride;rt.far||e.push({distance:s,point:_a.clone(),uv:Ve.getUV(_a,Ea,Aa,La,Ra,Ca,Pa,new yt),face:null,object:this})}},n.copy=function(e){return t.prototype.copy.call(this,e),void 0!==e.center&&this.center.copy(e.center),this.material=e.material,this},e}(Le);function Ia(t,e,n,r,i,a){Ma.subVectors(t,n).addScalar(.5).multiply(r),void 0!==i?(Sa.x=a*Ma.x-i*Ma.y,Sa.y=i*Ma.x+a*Ma.y):Sa.copy(Ma),t.copy(e),t.x+=Sa.x,t.y+=Sa.y,t.applyMatrix4(Ta)}Da.prototype.isSprite=!0;var Na=new Rt,Ba=new Rt,Oa=function(t){function e(){var e;return(e=t.call(this)||this)._currentLevel=0,e.type="LOD",Object.defineProperties(ut(e),{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),e.autoUpdate=!0,e}lt(e,t);var n=e.prototype;return n.copy=function(e){t.prototype.copy.call(this,e,!1);for(var n=e.levels,r=0,i=n.length;r0){var n,r;for(n=1,r=e.length;n0){Na.setFromMatrixPosition(this.matrixWorld);var n=t.ray.origin.distanceTo(Na);this.getObjectForDistance(n).raycast(t,e)}},n.update=function(t){var e=this.levels;if(e.length>1){Na.setFromMatrixPosition(t.matrixWorld),Ba.setFromMatrixPosition(this.matrixWorld);var n,r,i=Na.distanceTo(Ba)/t.zoom;for(e[0].object.visible=!0,n=1,r=e.length;n=e[n].distance;n++)e[n-1].object.visible=!1,e[n].object.visible=!0;for(this._currentLevel=n-1;no)){u.applyMatrix4(this.matrixWorld);var x=t.ray.origin.distanceTo(u);xt.far||e.push({distance:x,point:c.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}else for(var _=0,b=p.count-1;_o)){u.applyMatrix4(this.matrixWorld);var w=t.ray.origin.distanceTo(u);wt.far||e.push({distance:w,point:c.clone().applyMatrix4(this.matrixWorld),index:_,face:null,faceIndex:null,object:this})}}}else n.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},updateMorphTargets:function(){var t=this.geometry;if(t.isBufferGeometry){var e=t.morphAttributes,n=Object.keys(e);if(n.length>0){var r=e[n[0]];if(void 0!==r){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var i=0,a=r.length;i0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}});var ao=new Rt,oo=new Rt;function so(t,e){io.call(this,t,e),this.type="LineSegments"}so.prototype=Object.assign(Object.create(io.prototype),{constructor:so,isLineSegments:!0,computeLineDistances:function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,n=[],r=0,i=e.count;ri.far)return;a.push({distance:c,distanceToRay:Math.sqrt(s),point:l,index:e,face:null,object:o})}}mo.prototype=Object.assign(Object.create(Le.prototype),{constructor:mo,isPoints:!0,copy:function(t){return Le.prototype.copy.call(this,t),this.material=t.material,this.geometry=t.geometry,this},raycast:function(t,e){var n=this.geometry,r=this.matrixWorld,i=t.params.Points.threshold;if(null===n.boundingSphere&&n.computeBoundingSphere(),po.copy(n.boundingSphere),po.applyMatrix4(r),po.radius+=i,!1!==t.ray.intersectsSphere(po)){uo.copy(r).invert(),ho.copy(t.ray).applyMatrix4(uo);var a=i/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(n.isBufferGeometry){var s=n.index,l=n.attributes.position;if(null!==s)for(var c=s.array,u=0,h=c.length;u0){var r=e[n[0]];if(void 0!==r){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var i=0,a=r.length;i0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}});var go=function(t){function e(e,n,r,i,a,o,s,l,c){var u;(u=t.call(this,e,n,r,i,a,o,s,l,c)||this).format=void 0!==s?s:E,u.minFilter=void 0!==o?o:g,u.magFilter=void 0!==a?a:g,u.generateMipmaps=!1;var h=ut(u);return"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback((function t(){h.needsUpdate=!0,e.requestVideoFrameCallback(t)})),u}lt(e,t);var n=e.prototype;return n.clone=function(){return new this.constructor(this.image).copy(this)},n.update=function(){var t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)},e}(Mt);go.prototype.isVideoTexture=!0;var yo=function(t){function e(e,n,r,i,a,o,s,l,c,u,h,d){var p;return(p=t.call(this,null,o,s,l,c,u,i,a,h,d)||this).image={width:n,height:r},p.mipmaps=e,p.flipY=!1,p.generateMipmaps=!1,p}return lt(e,t),e}(Mt);yo.prototype.isCompressedTexture=!0;var xo=function(t){function e(e,n,r,i,a,o,s,l,c){var u;return(u=t.call(this,e,n,r,i,a,o,s,l,c)||this).needsUpdate=!0,u}return lt(e,t),e}(Mt);xo.prototype.isCanvasTexture=!0;var _o=function(t){function e(e,n,r,i,a,o,s,l,c,u){var h;if((u=void 0!==u?u:L)!==L&&u!==R)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");return void 0===r&&u===L&&(r=b),void 0===r&&u===R&&(r=T),(h=t.call(this,null,i,a,o,s,l,u,r,c)||this).image={width:e,height:n},h.magFilter=void 0!==s?s:f,h.minFilter=void 0!==l?l:f,h.flipY=!1,h.generateMipmaps=!1,h}return lt(e,t),e}(Mt);_o.prototype.isDepthTexture=!0;var bo=function(t){function e(e,n,r,i){var a;void 0===e&&(e=1),void 0===n&&(n=8),void 0===r&&(r=0),void 0===i&&(i=2*Math.PI),(a=t.call(this)||this).type="CircleGeometry",a.parameters={radius:e,segments:n,thetaStart:r,thetaLength:i},n=Math.max(3,n);var o=[],s=[],l=[],c=[],u=new Rt,h=new yt;s.push(0,0,0),l.push(0,0,1),c.push(.5,.5);for(var d=0,p=3;d<=n;d++,p+=3){var f=r+d/n*i;u.x=e*Math.cos(f),u.y=e*Math.sin(f),s.push(u.x,u.y,u.z),l.push(0,0,1),h.x=(s[p]/e+1)/2,h.y=(s[p+1]/e+1)/2,c.push(h.x,h.y)}for(var m=1;m<=n;m++)o.push(m,m+1,0);return a.setIndex(o),a.setAttribute("position",new dn(s,3)),a.setAttribute("normal",new dn(l,3)),a.setAttribute("uv",new dn(c,2)),a}return lt(e,t),e}(Sn),wo=function(t){function e(e,n,r,i,a,o,s,l){var c;void 0===e&&(e=1),void 0===n&&(n=1),void 0===r&&(r=1),void 0===i&&(i=8),void 0===a&&(a=1),void 0===o&&(o=!1),void 0===s&&(s=0),void 0===l&&(l=2*Math.PI),(c=t.call(this)||this).type="CylinderGeometry",c.parameters={radiusTop:e,radiusBottom:n,height:r,radialSegments:i,heightSegments:a,openEnded:o,thetaStart:s,thetaLength:l};var u=ut(c);i=Math.floor(i),a=Math.floor(a);var h=[],d=[],p=[],f=[],m=0,v=[],g=r/2,y=0;function x(t){for(var r=m,a=new yt,o=new Rt,c=0,v=!0===t?e:n,x=!0===t?1:-1,_=1;_<=i;_++)d.push(0,g*x,0),p.push(0,x,0),f.push(.5,.5),m++;for(var b=m,w=0;w<=i;w++){var M=w/i*l+s,S=Math.cos(M),T=Math.sin(M);o.x=v*T,o.y=g*x,o.z=v*S,d.push(o.x,o.y,o.z),p.push(0,x,0),a.x=.5*S+.5,a.y=.5*T*x+.5,f.push(a.x,a.y),m++}for(var E=0;E0&&x(!0),n>0&&x(!1)),c.setIndex(h),c.setAttribute("position",new dn(d,3)),c.setAttribute("normal",new dn(p,3)),c.setAttribute("uv",new dn(f,2)),c}return lt(e,t),e}(Sn),Mo=function(t){function e(e,n,r,i,a,o,s){var l;return void 0===e&&(e=1),void 0===n&&(n=1),void 0===r&&(r=8),void 0===i&&(i=1),void 0===a&&(a=!1),void 0===o&&(o=0),void 0===s&&(s=2*Math.PI),(l=t.call(this,0,e,n,r,i,a,o,s)||this).type="ConeGeometry",l.parameters={radius:e,height:n,radialSegments:r,heightSegments:i,openEnded:a,thetaStart:o,thetaLength:s},l}return lt(e,t),e}(wo),So=function(t){function e(e,n,r,i){var a;void 0===r&&(r=1),void 0===i&&(i=0),(a=t.call(this)||this).type="PolyhedronGeometry",a.parameters={vertices:e,indices:n,radius:r,detail:i};var o=[],s=[];function l(t,e,n,r){for(var i=r+1,a=[],o=0;o<=i;o++){a[o]=[];for(var s=t.clone().lerp(n,o/i),l=e.clone().lerp(n,o/i),u=i-o,h=0;h<=u;h++)a[o][h]=0===h&&o===i?s:s.clone().lerp(l,h/u)}for(var d=0;d.9&&a<.1&&(e<.2&&(s[t+0]+=1),n<.2&&(s[t+2]+=1),r<.2&&(s[t+4]+=1))}}()}(),a.setAttribute("position",new dn(o,3)),a.setAttribute("normal",new dn(o.slice(),3)),a.setAttribute("uv",new dn(s,2)),0===i?a.computeVertexNormals():a.normalizeNormals(),a}return lt(e,t),e}(Sn),To=function(t){function e(e,n){var r;void 0===e&&(e=1),void 0===n&&(n=0);var i=(1+Math.sqrt(5))/2,a=1/i,o=[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-a,-i,0,-a,i,0,a,-i,0,a,i,-a,-i,0,-a,i,0,a,-i,0,a,i,0,-i,0,-a,i,0,-a,-i,0,a,i,0,a];return(r=t.call(this,o,[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,n)||this).type="DodecahedronGeometry",r.parameters={radius:e,detail:n},r}return lt(e,t),e}(So),Eo=new Rt,Ao=new Rt,Lo=new Rt,Ro=new Ve,Co=function(t){function e(e,n){var r;if((r=t.call(this)||this).type="EdgesGeometry",r.parameters={thresholdAngle:n},n=void 0!==n?n:1,!0===e.isGeometry)return console.error("THREE.EdgesGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."),ut(r);for(var i=Math.pow(10,4),a=Math.cos(gt.DEG2RAD*n),o=e.getIndex(),s=e.getAttribute("position"),l=o?o.count:s.count,c=[0,0,0],u=["a","b","c"],h=new Array(3),d={},p=[],f=0;f80*n){r=a=t[0],i=o=t[1];for(var f=n;fa&&(a=s),l>o&&(o=l);c=0!==(c=Math.max(a-r,o-i))?1/c:0}return No(d,p,n,r,i,c),p};function Do(t,e,n,r,i){var a,o;if(i===function(t,e,n,r){for(var i=0,a=e,o=n-r;a0)for(a=e;a=e;a-=r)o=$o(a,t[a],t[a+1],o);return o&&Xo(o,o.next)&&(ts(o),o=o.next),o}function Io(t,e){if(!t)return t;e||(e=t);var n,r=t;do{if(n=!1,r.steiner||!Xo(r,r.next)&&0!==qo(r.prev,r,r.next))r=r.next;else{if(ts(r),(r=e=r.prev)===r.next)break;n=!0}}while(n||r!==e);return e}function No(t,e,n,r,i,a,o){if(t){!o&&a&&function(t,e,n,r){var i=t;do{null===i.z&&(i.z=ko(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,n,r,i,a,o,s,l,c=1;do{for(n=t,t=null,a=null,o=0;n;){for(o++,r=n,s=0,e=0;e0||l>0&&r;)0!==s&&(0===l||!r||n.z<=r.z)?(i=n,n=n.nextZ,s--):(i=r,r=r.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;n=r}a.nextZ=null,c*=2}while(o>1)}(i)}(t,r,i,a);for(var s,l,c=t;t.prev!==t.next;)if(s=t.prev,l=t.next,a?Oo(t,r,i,a):Bo(t))e.push(s.i/n),e.push(t.i/n),e.push(l.i/n),ts(t),t=l.next,c=l.next;else if((t=l)===c){o?1===o?No(t=zo(Io(t),e,n),e,n,r,i,a,2):2===o&&Fo(t,e,n,r,i,a):No(Io(t),e,n,r,i,a,1);break}}}function Bo(t){var e=t.prev,n=t,r=t.next;if(qo(e,n,r)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(Wo(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&qo(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function Oo(t,e,n,r){var i=t.prev,a=t,o=t.next;if(qo(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,u=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,h=ko(s,l,e,n,r),d=ko(c,u,e,n,r),p=t.prevZ,f=t.nextZ;p&&p.z>=h&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&Wo(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&qo(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&Wo(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&qo(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=h;){if(p!==t.prev&&p!==t.next&&Wo(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&qo(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&Wo(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&qo(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function zo(t,e,n){var r=t;do{var i=r.prev,a=r.next.next;!Xo(i,a)&&Yo(i,r,r.next,a)&&Qo(i,a)&&Qo(a,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(a.i/n),ts(r),ts(r.next),r=t=a),r=r.next}while(r!==t);return Io(r)}function Fo(t,e,n,r,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&jo(o,s)){var l=Ko(o,s);return o=Io(o,o.next),l=Io(l,l.next),No(o,e,n,r,i,a),void No(l,e,n,r,i,a)}s=s.next}o=o.next}while(o!==t)}function Ho(t,e){return t.x-e.x}function Go(t,e){if(e=function(t,e){var n,r=e,i=t.x,a=t.y,o=-1/0;do{if(a<=r.y&&a>=r.next.y&&r.next.y!==r.y){var s=r.x+(a-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=i&&s>o){if(o=s,s===i){if(a===r.y)return r;if(a===r.next.y)return r.next}n=r.x=r.x&&r.x>=u&&i!==r.x&&Wo(an.x||r.x===n.x&&Uo(n,r)))&&(n=r,d=l)),r=r.next}while(r!==c);return n}(t,e)){var n=Ko(e,t);Io(e,e.next),Io(n,n.next)}}function Uo(t,e){return qo(t.prev,t,e.prev)<0&&qo(e.next,t,t.next)<0}function ko(t,e,n,r,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Vo(t){var e=t,n=t;do{(e.x=0&&(t-o)*(r-s)-(n-o)*(e-s)>=0&&(n-o)*(a-s)-(i-o)*(r-s)>=0}function jo(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&Yo(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&(Qo(t,e)&&Qo(e,t)&&function(t,e){var n=t,r=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{n.y>a!=n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==t);return r}(t,e)&&(qo(t.prev,t,e.prev)||qo(t,e.prev,e))||Xo(t,e)&&qo(t.prev,t,t.next)>0&&qo(e.prev,e,e.next)>0)}function qo(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function Xo(t,e){return t.x===e.x&&t.y===e.y}function Yo(t,e,n,r){var i=Jo(qo(t,e,n)),a=Jo(qo(t,e,r)),o=Jo(qo(n,r,t)),s=Jo(qo(n,r,e));return i!==a&&o!==s||(!(0!==i||!Zo(t,n,e))||(!(0!==a||!Zo(t,r,e))||(!(0!==o||!Zo(n,t,r))||!(0!==s||!Zo(n,e,r)))))}function Zo(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function Jo(t){return t>0?1:t<0?-1:0}function Qo(t,e){return qo(t.prev,t,t.next)<0?qo(t,e,t.next)>=0&&qo(t,t.prev,e)>=0:qo(t,e,t.prev)<0||qo(t,t.next,e)<0}function Ko(t,e){var n=new es(t.i,t.x,t.y),r=new es(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,a.next=r,r.prev=a,r}function $o(t,e,n,r){var i=new es(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function ts(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function es(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var ns={area:function(t){for(var e=t.length,n=0,r=e-1,i=0;i2&&t[e-1].equals(t[0])&&t.pop()}function is(t,e){for(var n=0;nNumber.EPSILON){var d=Math.sqrt(u),p=Math.sqrt(l*l+c*c),f=e.x-s/d,m=e.y+o/d,v=((n.x-c/p-f)*c-(n.y+l/p-m)*l)/(o*c-s*l),g=(r=f+o*v-t.x)*r+(i=m+s*v-t.y)*i;if(g<=2)return new yt(r,i);a=Math.sqrt(g/2)}else{var y=!1;o>Number.EPSILON?l>Number.EPSILON&&(y=!0):o<-Number.EPSILON?l<-Number.EPSILON&&(y=!0):Math.sign(s)===Math.sign(c)&&(y=!0),y?(r=-s,i=o,a=Math.sqrt(u)):(r=o,i=s,a=Math.sqrt(u/2))}return new yt(r/a,i/a)}for(var z=[],F=0,H=R.length,G=H-1,U=F+1;F=0;gt--){for(var xt=gt/p,_t=u*Math.cos(xt*Math.PI/2),bt=h*Math.sin(xt*Math.PI/2)+d,wt=0,Mt=R.length;wt=0;){var r=n,i=n-1;i<0&&(i=t.length-1);for(var a=0,o=s+2*p;a=0?(t(g-s,m,u),h.subVectors(c,u)):(t(g+s,m,u),h.subVectors(u,c)),m-s>=0?(t(g,m-s,u),d.subVectors(c,u)):(t(g,m+s,u),d.subVectors(u,c)),l.crossVectors(h,d).normalize(),a.push(l.x,l.y,l.z),o.push(g,m)}for(var y=0;y0)&&f.push(E,A,R),(S!==r-1||c=r)){u.push(l.times[d]);for(var f=0;fa.tracks[v].times[0]&&(m=a.tracks[v].times[0]);for(var g=0;g=r.times[h]){var m=h*l+s,v=m+l-s;d=Ds.arraySlice(r.values,m,v)}else{var g=r.createInterpolant(),y=s,x=l-s;g.evaluate(a),d=Ds.arraySlice(g.resultBuffer,y,x)}"quaternion"===i&&(new Lt).fromArray(d).normalize().conjugate().toArray(d);for(var _=o.times.length,b=0;b<_;++b){var w=b*u+c;if("quaternion"===i)Lt.multiplyQuaternionsFlat(o.values,w,d,0,o.values,w);else for(var M=u-2*c,S=0;S=i)break t;var s=e[1];t=(i=e[--n-1]))break e}a=n,n=0}for(;n>>1;te;)--a;if(++a,0!==i||a!==r){i>=a&&(i=(a=Math.max(a,1))-1);var o=this.getValueSize();this.times=Ds.arraySlice(n,i,a),this.values=Ds.arraySlice(this.values,i*o,a*o)}return this},e.validate=function(){var t=!0,e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);var n=this.times,r=this.values,i=n.length;0===i&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);for(var a=null,o=0;o!==i;o++){var s=n[o];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,s),t=!1;break}if(null!==a&&a>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,s,a),t=!1;break}a=s}if(void 0!==r&&Ds.isTypedArray(r))for(var l=0,c=r.length;l!==c;++l){var u=r[l];if(isNaN(u)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,l,u),t=!1;break}}return t},e.optimize=function(){for(var t=Ds.arraySlice(this.times),e=Ds.arraySlice(this.values),n=this.getValueSize(),r=this.getInterpolation()===k,i=t.length-1,a=1,o=1;o0){t[a]=t[i];for(var g=i*n,y=a*n,x=0;x!==n;++x)e[y+x]=e[g+x];++a}return a!==t.length?(this.times=Ds.arraySlice(t,0,a),this.values=Ds.arraySlice(e,0,a*n)):(this.times=t,this.values=e),this},e.clone=function(){var t=Ds.arraySlice(this.times,0),e=Ds.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,t,e);return n.createInterpolant=this.createInterpolant,n},t}();zs.prototype.TimeBufferType=Float32Array,zs.prototype.ValueBufferType=Float32Array,zs.prototype.DefaultInterpolation=U;var Fs=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e}(zs);Fs.prototype.ValueTypeName="bool",Fs.prototype.ValueBufferType=Array,Fs.prototype.DefaultInterpolation=G,Fs.prototype.InterpolantFactoryMethodLinear=void 0,Fs.prototype.InterpolantFactoryMethodSmooth=void 0;var Hs=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e}(zs);Hs.prototype.ValueTypeName="color";var Gs=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e}(zs);function Us(t,e,n,r){Is.call(this,t,e,n,r)}Gs.prototype.ValueTypeName="number",Us.prototype=Object.assign(Object.create(Is.prototype),{constructor:Us,interpolate_:function(t,e,n,r){for(var i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=(n-e)/(r-e),l=t*o,c=l+o;l!==c;l+=4)Lt.slerpFlat(i,0,a,l-o,a,l,s);return i}});var ks=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e.prototype.InterpolantFactoryMethodLinear=function(t){return new Us(this.times,this.values,this.getValueSize(),t)},e}(zs);ks.prototype.ValueTypeName="quaternion",ks.prototype.DefaultInterpolation=U,ks.prototype.InterpolantFactoryMethodSmooth=void 0;var Vs=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e}(zs);Vs.prototype.ValueTypeName="string",Vs.prototype.ValueBufferType=Array,Vs.prototype.DefaultInterpolation=G,Vs.prototype.InterpolantFactoryMethodLinear=void 0,Vs.prototype.InterpolantFactoryMethodSmooth=void 0;var Ws=function(t){function e(){return t.apply(this,arguments)||this}return lt(e,t),e}(zs);Ws.prototype.ValueTypeName="vector";var js=function(){function t(t,e,n,r){void 0===e&&(e=-1),void 0===r&&(r=q),this.name=t,this.tracks=n,this.duration=e,this.blendMode=r,this.uuid=gt.generateUUID(),this.duration<0&&this.resetDuration()}t.parse=function(t){for(var e=[],n=t.tracks,r=1/(t.fps||1),i=0,a=n.length;i!==a;++i)e.push(qs(n[i]).scale(r));var o=new this(t.name,t.duration,e,t.blendMode);return o.uuid=t.uuid,o},t.toJSON=function(t){for(var e=[],n=t.tracks,r={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode},i=0,a=n.length;i!==a;++i)e.push(zs.toJSON(n[i]));return r},t.CreateFromMorphTargetSequence=function(t,e,n,r){for(var i=e.length,a=[],o=0;o1){var c=l[1],u=r[c];u||(r[c]=u=[]),u.push(s)}}var h=[];for(var d in r)h.push(this.CreateFromMorphTargetSequence(d,r[d],e,n));return h},t.parseAnimation=function(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var n=function(t,e,n,r,i){if(0!==n.length){var a=[],o=[];Ds.flattenJSON(n,a,o,r),0!==a.length&&i.push(new t(e,a,o))}},r=[],i=t.name||"default",a=t.fps||30,o=t.blendMode,s=t.length||-1,l=t.hierarchy||[],c=0;c0||0===t.search(/^data\:image\/jpeg/);i.format=r?E:A,i.needsUpdate=!0,void 0!==e&&e(i)}),n,r),i}}),Object.assign(al.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(t,e){var n=this.getUtoTmapping(t);return this.getPoint(n,e)},getPoints:function(t){void 0===t&&(t=5);for(var e=[],n=0;n<=t;n++)e.push(this.getPoint(n/t));return e},getSpacedPoints:function(t){void 0===t&&(t=5);for(var e=[],n=0;n<=t;n++)e.push(this.getPointAt(n/t));return e},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,n=[],r=this.getPoint(0),i=0;n.push(0);for(var a=1;a<=t;a++)i+=(e=this.getPoint(a/t)).distanceTo(r),n.push(i),r=e;return this.cacheArcLengths=n,n},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(t,e){var n,r=this.getLengths(),i=0,a=r.length;n=e||t*r[a-1];for(var o,s=0,l=a-1;s<=l;)if((o=r[i=Math.floor(s+(l-s)/2)]-n)<0)s=i+1;else{if(!(o>0)){l=i;break}l=i-1}if(r[i=l]===n)return i/(a-1);var c=r[i];return(i+(n-c)/(r[i+1]-c))/(a-1)},getTangent:function(t,e){var n=1e-4,r=t-n,i=t+n;r<0&&(r=0),i>1&&(i=1);var a=this.getPoint(r),o=this.getPoint(i),s=e||(a.isVector2?new yt:new Rt);return s.copy(o).sub(a).normalize(),s},getTangentAt:function(t,e){var n=this.getUtoTmapping(t);return this.getTangent(n,e)},computeFrenetFrames:function(t,e){for(var n=new Rt,r=[],i=[],a=[],o=new Rt,s=new re,l=0;l<=t;l++){var c=l/t;r[l]=this.getTangentAt(c,new Rt),r[l].normalize()}i[0]=new Rt,a[0]=new Rt;var u=Number.MAX_VALUE,h=Math.abs(r[0].x),d=Math.abs(r[0].y),p=Math.abs(r[0].z);h<=u&&(u=h,n.set(1,0,0)),d<=u&&(u=d,n.set(0,1,0)),p<=u&&n.set(0,0,1),o.crossVectors(r[0],n).normalize(),i[0].crossVectors(r[0],o),a[0].crossVectors(r[0],i[0]);for(var f=1;f<=t;f++){if(i[f]=i[f-1].clone(),a[f]=a[f-1].clone(),o.crossVectors(r[f-1],r[f]),o.length()>Number.EPSILON){o.normalize();var m=Math.acos(gt.clamp(r[f-1].dot(r[f]),-1,1));i[f].applyMatrix4(s.makeRotationAxis(o,m))}a[f].crossVectors(r[f],i[f])}if(!0===e){var v=Math.acos(gt.clamp(i[0].dot(i[t]),-1,1));v/=t,r[0].dot(o.crossVectors(i[0],i[t]))>0&&(v=-v);for(var g=1;g<=t;g++)i[g].applyMatrix4(s.makeRotationAxis(r[g],v*g)),a[g].crossVectors(r[g],i[g])}return{tangents:r,normals:i,binormals:a}},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this},toJSON:function(){var t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t},fromJSON:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}});var ol=function(t){function e(e,n,r,i,a,o,s,l){var c;return void 0===e&&(e=0),void 0===n&&(n=0),void 0===r&&(r=1),void 0===i&&(i=1),void 0===a&&(a=0),void 0===o&&(o=2*Math.PI),void 0===s&&(s=!1),void 0===l&&(l=0),(c=t.call(this)||this).type="EllipseCurve",c.aX=e,c.aY=n,c.xRadius=r,c.yRadius=i,c.aStartAngle=a,c.aEndAngle=o,c.aClockwise=s,c.aRotation=l,c}lt(e,t);var n=e.prototype;return n.getPoint=function(t,e){for(var n=e||new yt,r=2*Math.PI,i=this.aEndAngle-this.aStartAngle,a=Math.abs(i)r;)i-=r;i0?0:(Math.floor(Math.abs(l)/o)+1)*o:0===c&&l===o-1&&(l=o-2,c=1),this.closed||l>0?n=a[(l-1)%o]:(cl.subVectors(a[0],a[1]).add(a[0]),n=cl);var u=a[l%o],h=a[(l+1)%o];if(this.closed||l+2r.length-2?r.length-1:a+1],u=r[a>r.length-3?r.length-1:a+2];return n.set(fl(o,s.x,l.x,c.x,u.x),fl(o,s.y,l.y,c.y,u.y)),n},n.copy=function(e){t.prototype.copy.call(this,e),this.points=[];for(var n=0,r=e.points.length;n=e){var i=n[r]-e,a=this.curves[r],o=a.getLength(),s=0===o?0:1-i/o;return a.getPointAt(s)}r++}return null},n.getLength=function(){var t=this.getCurveLengths();return t[t.length-1]},n.updateArcLengths=function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},n.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var t=[],e=0,n=0,r=this.curves.length;n1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n},n.copy=function(e){t.prototype.copy.call(this,e),this.curves=[];for(var n=0,r=e.curves.length;n0){var c=l.getPoint(0);c.equals(this.currentPoint)||this.lineTo(c.x,c.y)}this.curves.push(l);var u=l.getPoint(1);return this.currentPoint.copy(u),this},n.copy=function(e){return t.prototype.copy.call(this,e),this.currentPoint.copy(e.currentPoint),this},n.toJSON=function(){var e=t.prototype.toJSON.call(this);return e.currentPoint=this.currentPoint.toArray(),e},n.fromJSON=function(e){return t.prototype.fromJSON.call(this,e),this.currentPoint.fromArray(e.currentPoint),this},e}(Tl),Al=function(t){function e(e){var n;return(n=t.call(this,e)||this).uuid=gt.generateUUID(),n.type="Shape",n.holes=[],n}lt(e,t);var n=e.prototype;return n.getPointsHoles=function(t){for(var e=[],n=0,r=this.holes.length;n0:r.vertexColors=t.vertexColors),void 0!==t.uniforms)for(var i in t.uniforms){var a=t.uniforms[i];switch(r.uniforms[i]={},a.type){case"t":r.uniforms[i].value=n(a.value);break;case"c":r.uniforms[i].value=(new Ke).setHex(a.value);break;case"v2":r.uniforms[i].value=(new yt).fromArray(a.value);break;case"v3":r.uniforms[i].value=(new Rt).fromArray(a.value);break;case"v4":r.uniforms[i].value=(new Tt).fromArray(a.value);break;case"m3":r.uniforms[i].value=(new _t).fromArray(a.value);break;case"m4":r.uniforms[i].value=(new re).fromArray(a.value);break;default:r.uniforms[i].value=a.value}}if(void 0!==t.defines&&(r.defines=t.defines),void 0!==t.vertexShader&&(r.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(r.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(var o in t.extensions)r.extensions[o]=t.extensions[o];if(void 0!==t.shading&&(r.flatShading=1===t.shading),void 0!==t.size&&(r.size=t.size),void 0!==t.sizeAttenuation&&(r.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(r.map=n(t.map)),void 0!==t.matcap&&(r.matcap=n(t.matcap)),void 0!==t.alphaMap&&(r.alphaMap=n(t.alphaMap)),void 0!==t.bumpMap&&(r.bumpMap=n(t.bumpMap)),void 0!==t.bumpScale&&(r.bumpScale=t.bumpScale),void 0!==t.normalMap&&(r.normalMap=n(t.normalMap)),void 0!==t.normalMapType&&(r.normalMapType=t.normalMapType),void 0!==t.normalScale){var s=t.normalScale;!1===Array.isArray(s)&&(s=[s,s]),r.normalScale=(new yt).fromArray(s)}return void 0!==t.displacementMap&&(r.displacementMap=n(t.displacementMap)),void 0!==t.displacementScale&&(r.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(r.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(r.roughnessMap=n(t.roughnessMap)),void 0!==t.metalnessMap&&(r.metalnessMap=n(t.metalnessMap)),void 0!==t.emissiveMap&&(r.emissiveMap=n(t.emissiveMap)),void 0!==t.emissiveIntensity&&(r.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(r.specularMap=n(t.specularMap)),void 0!==t.envMap&&(r.envMap=n(t.envMap)),void 0!==t.envMapIntensity&&(r.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(r.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(r.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(r.lightMap=n(t.lightMap)),void 0!==t.lightMapIntensity&&(r.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(r.aoMap=n(t.aoMap)),void 0!==t.aoMapIntensity&&(r.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(r.gradientMap=n(t.gradientMap)),void 0!==t.clearcoatMap&&(r.clearcoatMap=n(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(r.clearcoatRoughnessMap=n(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(r.clearcoatNormalMap=n(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(r.clearcoatNormalScale=(new yt).fromArray(t.clearcoatNormalScale)),void 0!==t.transmission&&(r.transmission=t.transmission),void 0!==t.transmissionMap&&(r.transmissionMap=n(t.transmissionMap)),r},n.setTextures=function(t){return this.textures=t,this},e}(Js),Zl={decodeText:function(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);for(var e="",n=0,r=t.length;n0){var o=new Ys(e);(n=new el(o)).setCrossOrigin(this.crossOrigin);for(var s=0,l=t.length;sNumber.EPSILON){if(c<0&&(o=e[a],l=-l,s=e[i],c=-c),t.ys.y)continue;if(t.y===o.y){if(t.x===o.x)return!0}else{var u=c*(t.x-o.x)-l*(t.y-o.y);if(0===u)return!0;if(u<0)continue;r=!r}}else{if(t.y!==o.y)continue;if(s.x<=t.x&&t.x<=o.x||o.x<=t.x&&t.x<=s.x)return!0}}return r}var i,a,o,s=ns.isClockWise,l=this.subPaths;if(0===l.length)return[];if(!0===e)return n(l);var c=[];if(1===l.length)return a=l[0],(o=new Al).curves=a.curves,c.push(o),c;var u=!s(l[0].getPoints());u=t?!u:u;var h,d,p=[],f=[],m=[],v=0;f[v]=void 0,m[v]=[];for(var g=0,y=l.length;g1){for(var x=!1,_=[],b=0,w=f.length;b0&&(x||(m=p))}for(var C=0,P=f.length;C0){this.source.connect(this.filters[0]);for(var t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(var t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(n,r,this._addIndex*e,1,e);for(var l=e,c=e+e;l!==c;++l)if(n[l]!==n[l+e]){o.setValue(n,r);break}},e.saveOriginalState=function(){var t=this.binding,e=this.buffer,n=this.valueSize,r=n*this._origIndex;t.getValue(e,r);for(var i=n,a=r;i!==a;++i)e[i]=e[r+i%n];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0},e.restoreOriginalState=function(){var t=3*this.valueSize;this.binding.setValue(this.buffer,t)},e._setAdditiveIdentityNumeric=function(){for(var t=this._addIndex*this.valueSize,e=t+this.valueSize,n=t;n=.5)for(var a=0;a!==i;++a)t[e+a]=t[n+a]},e._slerp=function(t,e,n,r){Lt.slerpFlat(t,e,t,e,t,n,r)},e._slerpAdditive=function(t,e,n,r,i){var a=this._workIndex*i;Lt.multiplyQuaternionsFlat(t,a,t,e,t,n),Lt.slerpFlat(t,e,t,e,t,a,r)},e._lerp=function(t,e,n,r,i){for(var a=1-r,o=0;o!==i;++o){var s=e+o;t[s]=t[s]*a+t[n+o]*r}},e._lerpAdditive=function(t,e,n,r,i){for(var a=0;a!==i;++a){var o=e+a;t[o]=t[o]+t[n+a]*r}},t}(),Pc="\\[\\]\\.:\\/",Dc=new RegExp("[\\[\\]\\.:\\/]","g"),Ic="[^\\[\\]\\.:\\/]",Nc="[^"+Pc.replace("\\.","")+"]",Bc=/((?:WC+[\/:])*)/.source.replace("WC",Ic),Oc=/(WCOD+)?/.source.replace("WCOD",Nc),zc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Ic),Fc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Ic),Hc=new RegExp("^"+Bc+Oc+zc+Fc+"$"),Gc=["material","materials","bones"];function Uc(t,e,n){var r=n||kc.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,r)}function kc(t,e,n){this.path=e,this.parsedPath=n||kc.parseTrackName(e),this.node=kc.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t}Object.assign(Uc.prototype,{getValue:function(t,e){this.bind();var n=this._targetGroup.nCachedObjects_,r=this._bindings[n];void 0!==r&&r.getValue(t,e)},setValue:function(t,e){for(var n=this._bindings,r=this._targetGroup.nCachedObjects_,i=n.length;r!==i;++r)n[r].setValue(t,e)},bind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].bind()},unbind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].unbind()}}),Object.assign(kc,{Composite:Uc,create:function(t,e,n){return t&&t.isAnimationObjectGroup?new kc.Composite(t,e,n):new kc(t,e,n)},sanitizeNodeName:function(t){return t.replace(/\s/g,"_").replace(Dc,"")},parseTrackName:function(t){var e=Hc.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);var n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},r=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==r&&-1!==r){var i=n.nodeName.substring(r+1);-1!==Gc.indexOf(i)&&(n.nodeName=n.nodeName.substring(0,r),n.objectName=i)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return n},findNode:function(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){var n=t.skeleton.getBoneByName(e);if(void 0!==n)return n}if(t.children){var r=function t(n){for(var r=0;r=i){var u=i++,h=t[u];e[h.uuid]=c,t[c]=h,e[l]=u,t[u]=s;for(var d=0,p=r;d!==p;++d){var f=n[d],m=f[u],v=f[c];f[c]=m,f[u]=v}}}this.nCachedObjects_=i},e.uncache=function(){for(var t=this._objects,e=this._indicesByUUID,n=this._bindings,r=n.length,i=this.nCachedObjects_,a=t.length,o=0,s=arguments.length;o!==s;++o){var l=arguments[o],c=l.uuid,u=e[c];if(void 0!==u)if(delete e[c],u0&&(e[b.uuid]=u),t[u]=b,t.pop();for(var w=0,M=r;w!==M;++w){var S=n[w];S[u]=S[_],S.pop()}}}this.nCachedObjects_=i},e.subscribe_=function(t,e){var n=this._bindingsIndicesByPath,r=n[t],i=this._bindings;if(void 0!==r)return i[r];var a=this._paths,o=this._parsedPaths,s=this._objects,l=s.length,c=this.nCachedObjects_,u=new Array(l);r=i.length,n[t]=r,a.push(t),o.push(e),i.push(u);for(var h=c,d=s.length;h!==d;++h){var p=s[h];u[h]=new kc(p,t,e)}return u},e.unsubscribe_=function(t){var e=this._bindingsIndicesByPath,n=e[t];if(void 0!==n){var r=this._paths,i=this._parsedPaths,a=this._bindings,o=a.length-1,s=a[o];e[t[o]]=n,a[n]=s,a.pop(),i[n]=i[o],i.pop(),r[n]=r[o],r.pop()}},t}();Vc.prototype.isAnimationObjectGroup=!0;var Wc=function(){function t(t,e,n,r){void 0===n&&(n=null),void 0===r&&(r=e.blendMode),this._mixer=t,this._clip=e,this._localRoot=n,this.blendMode=r;for(var i=e.tracks,a=i.length,o=new Array(a),s={endingStart:V,endingEnd:V},l=0;l!==a;++l){var c=i[l].createInterpolant(null);o[l]=c,c.settings=s}this._interpolantSettings=s,this._interpolants=o,this._propertyBindings=new Array(a),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}var e=t.prototype;return e.play=function(){return this._mixer._activateAction(this),this},e.stop=function(){return this._mixer._deactivateAction(this),this.reset()},e.reset=function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()},e.isRunning=function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},e.isScheduled=function(){return this._mixer._isActiveAction(this)},e.startAt=function(t){return this._startTime=t,this},e.setLoop=function(t,e){return this.loop=t,this.repetitions=e,this},e.setEffectiveWeight=function(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()},e.getEffectiveWeight=function(){return this._effectiveWeight},e.fadeIn=function(t){return this._scheduleFading(t,0,1)},e.fadeOut=function(t){return this._scheduleFading(t,1,0)},e.crossFadeFrom=function(t,e,n){if(t.fadeOut(e),this.fadeIn(e),n){var r=this._clip.duration,i=t._clip.duration,a=i/r,o=r/i;t.warp(1,a,e),this.warp(o,1,e)}return this},e.crossFadeTo=function(t,e,n){return t.crossFadeFrom(this,e,n)},e.stopFading=function(){var t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},e.setEffectiveTimeScale=function(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()},e.getEffectiveTimeScale=function(){return this._effectiveTimeScale},e.setDuration=function(t){return this.timeScale=this._clip.duration/t,this.stopWarping()},e.syncWith=function(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()},e.halt=function(t){return this.warp(this._effectiveTimeScale,0,t)},e.warp=function(t,e,n){var r=this._mixer,i=r.time,a=this.timeScale,o=this._timeScaleInterpolant;null===o&&(o=r._lendControlInterpolant(),this._timeScaleInterpolant=o);var s=o.parameterPositions,l=o.sampleValues;return s[0]=i,s[1]=i+n,l[0]=t/a,l[1]=e/a,this},e.stopWarping=function(){var t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},e.getMixer=function(){return this._mixer},e.getClip=function(){return this._clip},e.getRoot=function(){return this._localRoot||this._mixer._root},e._update=function(t,e,n,r){if(this.enabled){var i=this._startTime;if(null!==i){var a=(t-i)*n;if(a<0||0===n)return;this._startTime=null,e=n*a}e*=this._updateTimeScale(t);var o=this._updateTime(e),s=this._updateWeight(t);if(s>0){var l=this._interpolants,c=this._propertyBindings;switch(this.blendMode){case X:for(var u=0,h=l.length;u!==h;++u)l[u].evaluate(o),c[u].accumulateAdditive(s);break;case q:default:for(var d=0,p=l.length;d!==p;++d)l[d].evaluate(o),c[d].accumulate(r,s)}}}else this._updateWeight(t)},e._updateWeight=function(t){var e=0;if(this.enabled){e=this.weight;var n=this._weightInterpolant;if(null!==n){var r=n.evaluate(t)[0];e*=r,t>n.parameterPositions[1]&&(this.stopFading(),0===r&&(this.enabled=!1))}}return this._effectiveWeight=e,e},e._updateTimeScale=function(t){var e=0;if(!this.paused){e=this.timeScale;var n=this._timeScaleInterpolant;if(null!==n)e*=n.evaluate(t)[0],t>n.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}return this._effectiveTimeScale=e,e},e._updateTime=function(t){var e=this._clip.duration,n=this.loop,r=this.time+t,i=this._loopCount,a=2202===n;if(0===t)return-1===i?r:a&&1==(1&i)?e-r:r;if(2200===n){-1===i&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(r>=e)r=e;else{if(!(r<0)){this.time=r;break t}r=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=r,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===i&&(t>=0?(i=0,this._setEndings(!0,0===this.repetitions,a)):this._setEndings(0===this.repetitions,!0,a)),r>=e||r<0){var o=Math.floor(r/e);r-=e*o,i+=Math.abs(o);var s=this.repetitions-i;if(s<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,r=t>0?e:0,this.time=r,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===s){var l=t<0;this._setEndings(l,!l,a)}else this._setEndings(!1,!1,a);this._loopCount=i,this.time=r,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=r;if(a&&1==(1&i))return e-r}return r},e._setEndings=function(t,e,n){var r=this._interpolantSettings;n?(r.endingStart=W,r.endingEnd=W):(r.endingStart=t?this.zeroSlopeAtStart?W:V:j,r.endingEnd=e?this.zeroSlopeAtEnd?W:V:j)},e._scheduleFading=function(t,e,n){var r=this._mixer,i=r.time,a=this._weightInterpolant;null===a&&(a=r._lendControlInterpolant(),this._weightInterpolant=a);var o=a.parameterPositions,s=a.sampleValues;return o[0]=i,s[0]=e,o[1]=i+t,s[1]=n,this},t}(),jc=function(t){function e(e){var n;return(n=t.call(this)||this)._root=e,n._initMemoryManager(),n._accuIndex=0,n.time=0,n.timeScale=1,n}lt(e,t);var n=e.prototype;return n._bindAction=function(t,e){var n=t._localRoot||this._root,r=t._clip.tracks,i=r.length,a=t._propertyBindings,o=t._interpolants,s=n.uuid,l=this._bindingsByRootAndName,c=l[s];void 0===c&&(c={},l[s]=c);for(var u=0;u!==i;++u){var h=r[u],d=h.name,p=c[d];if(void 0!==p)a[u]=p;else{if(void 0!==(p=a[u])){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,s,d));continue}var f=e&&e._propertyBindings[u].binding.parsedPath;++(p=new Cc(kc.create(n,d,f),h.ValueTypeName,h.getValueSize())).referenceCount,this._addInactiveBinding(p,s,d),a[u]=p}o[u].resultBuffer=p.buffer}},n._activateAction=function(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){var e=(t._localRoot||this._root).uuid,n=t._clip.uuid,r=this._actionsByClip[n];this._bindAction(t,r&&r.knownActions[0]),this._addInactiveAction(t,n,e)}for(var i=t._propertyBindings,a=0,o=i.length;a!==o;++a){var s=i[a];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(t)}},n._deactivateAction=function(t){if(this._isActiveAction(t)){for(var e=t._propertyBindings,n=0,r=e.length;n!==r;++n){var i=e[n];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}},n._initMemoryManager=function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}},n._isActiveAction=function(t){var e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this},n.update=function(t){t*=this.timeScale;for(var e=this._actions,n=this._nActiveActions,r=this.time+=t,i=Math.sign(t),a=this._accuIndex^=1,o=0;o!==n;++o){e[o]._update(r,t,i,a)}for(var s=this._bindings,l=this._nActiveBindings,c=0;c!==l;++c)s[c].apply(a);return this},n.setTime=function(t){this.time=0;for(var e=0;ethis.max.x||t.ythis.max.y)},e.containsBox=function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y},e.getParameter=function(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new yt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))},e.intersectsBox=function(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)},e.clampPoint=function(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new yt),e.copy(t).clamp(this.min,this.max)},e.distanceToPoint=function(t){return tu.copy(t).clamp(this.min,this.max).sub(t).length()},e.intersect=function(t){return this.min.max(t.min),this.max.min(t.max),this},e.union=function(t){return this.min.min(t.min),this.max.max(t.max),this},e.translate=function(t){return this.min.add(t),this.max.add(t),this},e.equals=function(t){return t.min.equals(this.min)&&t.max.equals(this.max)},t}();eu.prototype.isBox2=!0;var nu=new Rt,ru=new Rt,iu=function(){function t(t,e){void 0===t&&(t=new Rt),void 0===e&&(e=new Rt),this.start=t,this.end=e}var e=t.prototype;return e.set=function(t,e){return this.start.copy(t),this.end.copy(e),this},e.copy=function(t){return this.start.copy(t.start),this.end.copy(t.end),this},e.getCenter=function(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Rt),t.addVectors(this.start,this.end).multiplyScalar(.5)},e.delta=function(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Rt),t.subVectors(this.end,this.start)},e.distanceSq=function(){return this.start.distanceToSquared(this.end)},e.distance=function(){return this.start.distanceTo(this.end)},e.at=function(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Rt),this.delta(e).multiplyScalar(t).add(this.start)},e.closestPointToPointParameter=function(t,e){nu.subVectors(t,this.start),ru.subVectors(this.end,this.start);var n=ru.dot(ru),r=ru.dot(nu)/n;return e&&(r=gt.clamp(r,0,1)),r},e.closestPointToPoint=function(t,e,n){var r=this.closestPointToPointParameter(t,e);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new Rt),this.delta(n).multiplyScalar(r).add(this.start)},e.applyMatrix4=function(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this},e.equals=function(t){return t.start.equals(this.start)&&t.end.equals(this.end)},e.clone=function(){return(new this.constructor).copy(this)},t}();function au(t){Le.call(this),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}au.prototype=Object.create(Le.prototype),au.prototype.constructor=au,au.prototype.isImmediateRenderObject=!0;var ou=new Rt,su=function(t){function e(e,n){var r;(r=t.call(this)||this).light=e,r.light.updateMatrixWorld(),r.matrix=e.matrixWorld,r.matrixAutoUpdate=!1,r.color=n;for(var i=new Sn,a=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],o=0,s=1;o<32;o++,s++){var l=o/32*Math.PI*2,c=s/32*Math.PI*2;a.push(Math.cos(l),Math.sin(l),1,Math.cos(c),Math.sin(c),1)}i.setAttribute("position",new dn(a,3));var u=new Ka({fog:!1,toneMapped:!1});return r.cone=new so(i,u),r.add(r.cone),r.update(),r}lt(e,t);var n=e.prototype;return n.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},n.update=function(){this.light.updateMatrixWorld();var t=this.light.distance?this.light.distance:1e3,e=t*Math.tan(this.light.angle);this.cone.scale.set(e,e,t),ou.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(ou),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)},e}(Le),lu=new Rt,cu=new re,uu=new re,hu=function(t){function e(e){for(var n,r=du(e),i=new Sn,a=[],o=[],s=new Ke(0,0,1),l=new Ke(0,1,0),c=0;c.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Bu.set(t.z,0,-t.x).normalize();var e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Bu,e)}},n.setLength=function(t,e,n){void 0===e&&(e=.2*t),void 0===n&&(n=.2*e),this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(n,e,n),this.cone.position.y=t,this.cone.updateMatrix()},n.setColor=function(t){this.line.material.color.set(t),this.cone.material.color.set(t)},n.copy=function(e){return t.prototype.copy.call(this,e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this},e}(Le),zu=function(t){function e(e){var n;void 0===e&&(e=1);var r=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],i=new Sn;i.setAttribute("position",new dn(r,3)),i.setAttribute("color",new dn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));var a=new Ka({vertexColors:!0,toneMapped:!1});return(n=t.call(this,i,a)||this).type="AxesHelper",n}return lt(e,t),e}(so),Fu=new Float32Array(1),Hu=new Int32Array(Fu.buffer),Gu={toHalfFloat:function(t){Fu[0]=t;var e=Hu[0],n=e>>16&32768,r=e>>12&2047,i=e>>23&255;return i<103?n:i>142?(n|=31744,n|=(255==i?0:1)&&8388607&e):i<113?n|=((r|=2048)>>114-i)+(r>>113-i&1):(n|=i-112<<10|r>>1,n+=1&r)}},Uu=Math.pow(2,8),ku=[.125,.215,.35,.446,.526,.582],Vu=5+ku.length,Wu=20,ju=((Cu={})[3e3]=0,Cu[3001]=1,Cu[3002]=2,Cu[3004]=3,Cu[3005]=4,Cu[3006]=5,Cu[3007]=6,Cu),qu=new $e({side:1,depthWrite:!1,depthTest:!1}),Xu=new kn(new Wn,qu),Yu=new Ul,Zu=sh(),Ju=Zu._lodPlanes,Qu=Zu._sizeLods,Ku=Zu._sigmas,$u=new Ke,th=null,eh=(1+Math.sqrt(5))/2,nh=1/eh,rh=[new Rt(1,1,1),new Rt(-1,1,1),new Rt(1,1,-1),new Rt(-1,1,-1),new Rt(0,eh,nh),new Rt(0,eh,-nh),new Rt(nh,0,eh),new Rt(-nh,0,eh),new Rt(eh,nh,0),new Rt(-eh,nh,0)];function ih(t){var e=Math.max(t.r,t.g,t.b),n=Math.min(Math.max(Math.ceil(Math.log2(e)),-128),127);return t.multiplyScalar(Math.pow(2,-n)),(n+128)/255}var ah=function(){function t(t){var e,n,r;this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=(e=Wu,n=new Float32Array(e),r=new Rt(0,1,0),new ws({name:"SphericalGaussianBlur",defines:{n:e},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r},inputEncoding:{value:ju[3e3]},outputEncoding:{value:ju[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}var e=t.prototype;return e.fromScene=function(t,e,n,r){void 0===e&&(e=0),void 0===n&&(n=.1),void 0===r&&(r=100),th=this._renderer.getRenderTarget();var i=this._allocateTargets();return this._sceneToCubeUV(t,n,r,i),e>0&&this._blur(i,0,0,e),this._applyPMREM(i),this._cleanup(i),i},e.fromEquirectangular=function(t){return this._fromTexture(t)},e.fromCubemap=function(t){return this._fromTexture(t)},e.compileCubemapShader=function(){null===this._cubemapShader&&(this._cubemapShader=hh(),this._compileMaterial(this._cubemapShader))},e.compileEquirectangularShader=function(){null===this._equirectShader&&(this._equirectShader=uh(),this._compileMaterial(this._equirectShader))},e.dispose=function(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(var t=0;t2?Uu:0,Uu,Uu),s.setRenderTarget(r),h&&s.render(Xu,i),s.render(t,i)}s.toneMapping=u,s.outputEncoding=c,s.autoClear=l},e._textureToCubeUV=function(t,e){var n=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=hh()):null==this._equirectShader&&(this._equirectShader=uh());var r=t.isCubeTexture?this._cubemapShader:this._equirectShader,i=new kn(Ju[0],r),a=r.uniforms;a.envMap.value=t,t.isCubeTexture||a.texelSize.value.set(1/t.image.width,1/t.image.height),a.inputEncoding.value=ju[t.encoding],a.outputEncoding.value=ju[e.texture.encoding],ch(e,0,0,3*Uu,2*Uu),n.setRenderTarget(e),n.render(i,Yu)},e._applyPMREM=function(t){var e=this._renderer,n=e.autoClear;e.autoClear=!1;for(var r=1;rWu&&console.warn("sigmaRadians, "+i+", is too large and will clip, as it requested "+f+" samples when the maximum is set to "+Wu);for(var m=[],v=0,g=0;g4?r-8+4:0),3*b,2*b),s.setRenderTarget(e),s.render(c,Yu)},t}();function oh(t){return void 0!==t&&t.type===_&&(t.encoding===Y||t.encoding===Z||t.encoding===J)}function sh(){for(var t=[],e=[],n=[],r=8,i=0;i4?o=ku[i-8+4-1]:0==i&&(o=0),n.push(o);for(var s=1/(a-1),l=-s/2,c=1+s/2,u=[l,l,c,l,c,c,l,l,c,c,l,c],h=new Float32Array(108),d=new Float32Array(72),p=new Float32Array(36),f=0;f<6;f++){var m=f%3*2/3-1,v=f>2?0:-1,g=[m,v,0,m+2/3,v,0,m+2/3,v+1,0,m,v,0,m+2/3,v+1,0,m,v+1,0];h.set(g,18*f),d.set(u,12*f);var y=[f,f,f,f,f,f];p.set(y,6*f)}var x=new Sn;x.setAttribute("position",new nn(h,3)),x.setAttribute("uv",new nn(d,2)),x.setAttribute("faceIndex",new nn(p,1)),t.push(x),r>4&&r--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function lh(t){var e=new Et(3*Uu,3*Uu,t);return e.texture.mapping=c,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function ch(t,e,n,r,i){t.viewport.set(e,n,r,i),t.scissor.set(e,n,r,i)}function uh(){var t=new yt(1,1);return new ws({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:ju[3e3]},outputEncoding:{value:ju[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function hh(){return new ws({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:ju[3e3]},outputEncoding:{value:ju[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}al.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(al.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},El.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)},yu.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},hu.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},Js.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),Zl.extractUrlBase(t)},Js.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},eu.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},eu.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},eu.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},eu.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)},Dt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Dt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},Dt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},Dt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},Dt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)},Yt.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ir.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},iu.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},gt.random16=function(){return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."),Math.random()},gt.nearestPowerOfTwo=function(t){return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."),gt.floorPowerOfTwo(t)},gt.nextPowerOfTwo=function(t){return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."),gt.ceilPowerOfTwo(t)},_t.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},_t.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},_t.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},_t.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},_t.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},_t.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},re.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},re.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},re.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Rt).setFromMatrixColumn(this,3)},re.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},re.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},re.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},re.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},re.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},re.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},re.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},re.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},re.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},re.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},re.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},re.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},re.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},re.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},re.prototype.makeFrustum=function(t,e,n,r,i,a){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,r,n,i,a)},re.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},De.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},Lt.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},Lt.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},ne.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},ne.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},ne.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},Ve.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},Ve.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},Ve.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},Ve.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},Ve.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)},Ve.barycoordFromPoint=function(t,e,n,r,i){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),Ve.getBarycoord(t,e,n,r,i)},Ve.normal=function(t,e,n,r){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),Ve.getNormal(t,e,n,r)},Al.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},Al.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new as(this,t)},Al.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new ds(this,t)},yt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},yt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},yt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Rt.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Rt.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Rt.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},Rt.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},Rt.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},Rt.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},Rt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},Rt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},Rt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Tt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},Tt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Le.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},Le.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},Le.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},Le.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},Le.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(Le.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),kn.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")},Object.defineProperties(kn.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),Object.defineProperties(Oa.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(qa.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),ka.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},Object.defineProperty(al.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(t){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=t}}),Jn.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(Ll.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties(nn.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===rt},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(rt)}}}),nn.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?rt:nt),this},nn.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},nn.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},Sn.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},Sn.prototype.addAttribute=function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new nn(arguments[1],arguments[2])))},Sn.prototype.addDrawCall=function(t,e,n){void 0!==n&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},Sn.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},Sn.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},Sn.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},Sn.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(Sn.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.defineProperties(Jl.prototype,{maxInstancedCount:{get:function(){return console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount."),this.instanceCount},set:function(t){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount."),this.instanceCount=t}}}),Object.defineProperties(Zc.prototype,{linePrecision:{get:function(){return console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold},set:function(t){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold=t}}}),Object.defineProperties(ma.prototype,{dynamic:{get:function(){return console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.usage===rt},set:function(t){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.setUsage(t)}}}),ma.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?rt:nt),this},ma.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},as.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},as.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},as.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},fa.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Object.defineProperties(qc.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(je.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new Ke}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}}}),Object.defineProperties(Ts.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(Ss.prototype,{transparency:{get:function(){return console.warn("THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission."),this.transmission},set:function(t){console.warn("THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission."),this.transmission=t}}}),Object.defineProperties(Yn.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),ua.prototype.clearTarget=function(t,e,n,r){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,n,r)},ua.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},ua.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},ua.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},ua.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},ua.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},ua.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},ua.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},ua.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},ua.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},ua.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},ua.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},ua.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},ua.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},ua.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},ua.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},ua.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},ua.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},ua.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},ua.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},ua.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},ua.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},ua.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},ua.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},ua.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(ua.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===t?Z:Y}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(ea.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(Et.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Object.defineProperties(Mc.prototype,{load:{value:function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var e=this;return(new uc).load(t,(function(t){e.setBuffer(t)})),this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}}),Rc.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},Kn.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)},Kn.prototype.clear=function(t,e,n,r){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,r)},bt.crossOrigin=void 0,bt.loadTexture=function(t,e,n,r){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var i=new il;i.setCrossOrigin(this.crossOrigin);var a=i.load(t,n,void 0,r);return e&&(a.mapping=e),a},bt.loadTextureCube=function(t,e,n,r){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var i=new nl;i.setCrossOrigin(this.crossOrigin);var a=i.load(t,n,void 0,r);return e&&(a.mapping=e),a},bt.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},bt.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};var dh={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:n}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=n),t.ACESFilmicToneMapping=4,t.AddEquation=r,t.AddOperation=2,t.AdditiveAnimationBlendMode=X,t.AdditiveBlending=2,t.AlphaFormat=1021,t.AlwaysDepth=1,t.AlwaysStencilFunc=519,t.AmbientLight=Wl,t.AmbientLightProbe=dc,t.AnimationClip=js,t.AnimationLoader=$s,t.AnimationMixer=jc,t.AnimationObjectGroup=Vc,t.AnimationUtils=Ds,t.ArcCurve=sl,t.ArrayCamera=aa,t.ArrowHelper=Ou,t.Audio=Mc,t.AudioAnalyser=Rc,t.AudioContext=cc,t.AudioListener=wc,t.AudioLoader=uc,t.AxesHelper=zu,t.AxisHelper=function(t){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new zu(t)},t.BackSide=1,t.BasicDepthPacking=3200,t.BasicShadowMap=0,t.BinaryTextureLoader=function(t){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new rl(t)},t.Bone=Va,t.BooleanKeyframeTrack=Fs,t.BoundingBoxHelper=function(t,e){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new Du(t,e)},t.Box2=eu,t.Box3=Dt,t.Box3Helper=Iu,t.BoxBufferGeometry=Wn,t.BoxGeometry=Wn,t.BoxHelper=Du,t.BufferAttribute=nn,t.BufferGeometry=Sn,t.BufferGeometryLoader=Kl,t.ByteType=1010,t.Cache=Xs,t.Camera=Zn,t.CameraHelper=Eu,t.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")},t.CanvasTexture=xo,t.CatmullRomCurve3=pl,t.CineonToneMapping=3,t.CircleBufferGeometry=bo,t.CircleGeometry=bo,t.ClampToEdgeWrapping=d,t.Clock=vc,t.Color=Ke,t.ColorKeyframeTrack=Hs,t.CompressedTexture=yo,t.CompressedTextureLoader=tl,t.ConeBufferGeometry=Mo,t.ConeGeometry=Mo,t.CubeCamera=Kn,t.CubeReflectionMapping=a,t.CubeRefractionMapping=o,t.CubeTexture=$n,t.CubeTextureLoader=nl,t.CubeUVReflectionMapping=c,t.CubeUVRefractionMapping=u,t.CubicBezierCurve=gl,t.CubicBezierCurve3=yl,t.CubicInterpolant=Ns,t.CullFaceBack=1,t.CullFaceFront=2,t.CullFaceFrontBack=3,t.CullFaceNone=0,t.Curve=al,t.CurvePath=Tl,t.CustomBlending=5,t.CustomToneMapping=5,t.CylinderBufferGeometry=wo,t.CylinderGeometry=wo,t.Cylindrical=$c,t.DataTexture=er,t.DataTexture2DArray=Tr,t.DataTexture3D=Er,t.DataTextureLoader=rl,t.DataUtils=Gu,t.DecrementStencilOp=7683,t.DecrementWrapStencilOp=34056,t.DefaultLoadingManager=Zs,t.DepthFormat=L,t.DepthStencilFormat=R,t.DepthTexture=_o,t.DirectionalLight=Vl,t.DirectionalLightHelper=Mu,t.DiscreteInterpolant=Os,t.DodecahedronBufferGeometry=To,t.DodecahedronGeometry=To,t.DoubleSide=2,t.DstAlphaFactor=206,t.DstColorFactor=208,t.DynamicBufferAttribute=function(t,e){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),new nn(t,e).setUsage(rt)},t.DynamicCopyUsage=35050,t.DynamicDrawUsage=rt,t.DynamicReadUsage=35049,t.EdgesGeometry=Co,t.EdgesHelper=function(t,e){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new so(new Co(t.geometry),new Ka({color:void 0!==e?e:16777215}))},t.EllipseCurve=ol,t.EqualDepth=4,t.EqualStencilFunc=514,t.EquirectangularReflectionMapping=s,t.EquirectangularRefractionMapping=l,t.Euler=pe,t.EventDispatcher=pt,t.ExtrudeBufferGeometry=as,t.ExtrudeGeometry=as,t.FaceColors=1,t.FileLoader=Ks,t.FlatShading=1,t.Float16BufferAttribute=hn,t.Float32Attribute=function(t,e){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new dn(t,e)},t.Float32BufferAttribute=dn,t.Float64Attribute=function(t,e){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new pn(t,e)},t.Float64BufferAttribute=pn,t.FloatType=M,t.Fog=pa,t.FogExp2=da,t.Font=ac,t.FontLoader=lc,t.FrontSide=0,t.Frustum=ir,t.GLBufferAttribute=Yc,t.GLSL1="100",t.GLSL3=it,t.GammaEncoding=J,t.GreaterDepth=6,t.GreaterEqualDepth=5,t.GreaterEqualStencilFunc=518,t.GreaterStencilFunc=516,t.GridHelper=yu,t.Group=oa,t.HalfFloatType=S,t.HemisphereLight=Rl,t.HemisphereLightHelper=gu,t.HemisphereLightProbe=hc,t.IcosahedronBufferGeometry=ss,t.IcosahedronGeometry=ss,t.ImageBitmapLoader=rc,t.ImageLoader=el,t.ImageUtils=bt,t.ImmediateRenderObject=au,t.IncrementStencilOp=7682,t.IncrementWrapStencilOp=34055,t.InstancedBufferAttribute=Ql,t.InstancedBufferGeometry=Jl,t.InstancedInterleavedBuffer=Xc,t.InstancedMesh=Qa,t.Int16Attribute=function(t,e){return console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),new sn(t,e)},t.Int16BufferAttribute=sn,t.Int32Attribute=function(t,e){return console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),new cn(t,e)},t.Int32BufferAttribute=cn,t.Int8Attribute=function(t,e){return console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),new rn(t,e)},t.Int8BufferAttribute=rn,t.IntType=1013,t.InterleavedBuffer=ma,t.InterleavedBufferAttribute=ga,t.Interpolant=Is,t.InterpolateDiscrete=G,t.InterpolateLinear=U,t.InterpolateSmooth=k,t.InvertStencilOp=5386,t.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")},t.KeepStencilOp=et,t.KeyframeTrack=zs,t.LOD=Oa,t.LatheBufferGeometry=ls,t.LatheGeometry=ls,t.Layers=fe,t.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")},t.LessDepth=2,t.LessEqualDepth=3,t.LessEqualStencilFunc=515,t.LessStencilFunc=513,t.Light=Ll,t.LightProbe=Xl,t.Line=io,t.Line3=iu,t.LineBasicMaterial=Ka,t.LineCurve=xl,t.LineCurve3=_l,t.LineDashedMaterial=Cs,t.LineLoop=lo,t.LinePieces=1,t.LineSegments=so,t.LineStrip=0,t.LinearEncoding=Y,t.LinearFilter=g,t.LinearInterpolant=Bs,t.LinearMipMapLinearFilter=1008,t.LinearMipMapNearestFilter=1007,t.LinearMipmapLinearFilter=x,t.LinearMipmapNearestFilter=y,t.LinearToneMapping=1,t.Loader=Js,t.LoaderUtils=Zl,t.LoadingManager=Ys,t.LogLuvEncoding=3003,t.LoopOnce=2200,t.LoopPingPong=2202,t.LoopRepeat=2201,t.LuminanceAlphaFormat=1025,t.LuminanceFormat=1024,t.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},t.Material=je,t.MaterialLoader=Yl,t.Math=gt,t.MathUtils=gt,t.Matrix3=_t,t.Matrix4=re,t.MaxEquation=104,t.Mesh=kn,t.MeshBasicMaterial=$e,t.MeshDepthMaterial=$i,t.MeshDistanceMaterial=ta,t.MeshFaceMaterial=function(t){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),t},t.MeshLambertMaterial=Ls,t.MeshMatcapMaterial=Rs,t.MeshNormalMaterial=As,t.MeshPhongMaterial=Ts,t.MeshPhysicalMaterial=Ss,t.MeshStandardMaterial=Ms,t.MeshToonMaterial=Es,t.MinEquation=103,t.MirroredRepeatWrapping=p,t.MixOperation=1,t.MultiMaterial=function(t){return void 0===t&&(t=[]),console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),t.isMultiMaterial=!0,t.materials=t,t.clone=function(){return t.slice()},t},t.MultiplyBlending=4,t.MultiplyOperation=0,t.NearestFilter=f,t.NearestMipMapLinearFilter=1005,t.NearestMipMapNearestFilter=1004,t.NearestMipmapLinearFilter=v,t.NearestMipmapNearestFilter=m,t.NeverDepth=0,t.NeverStencilFunc=512,t.NoBlending=0,t.NoColors=0,t.NoToneMapping=0,t.NormalAnimationBlendMode=q,t.NormalBlending=1,t.NotEqualDepth=7,t.NotEqualStencilFunc=517,t.NumberKeyframeTrack=Gs,t.Object3D=Le,t.ObjectLoader=$l,t.ObjectSpaceNormalMap=1,t.OctahedronBufferGeometry=cs,t.OctahedronGeometry=cs,t.OneFactor=201,t.OneMinusDstAlphaFactor=207,t.OneMinusDstColorFactor=209,t.OneMinusSrcAlphaFactor=205,t.OneMinusSrcColorFactor=203,t.OrthographicCamera=Ul,t.PCFShadowMap=1,t.PCFSoftShadowMap=2,t.PMREMGenerator=ah,t.ParametricBufferGeometry=us,t.ParametricGeometry=us,t.Particle=function(t){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new Da(t)},t.ParticleBasicMaterial=function(t){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new co(t)},t.ParticleSystem=function(t,e){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new mo(t,e)},t.ParticleSystemMaterial=function(t){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new co(t)},t.Path=El,t.PerspectiveCamera=Jn,t.Plane=De,t.PlaneBufferGeometry=sr,t.PlaneGeometry=sr,t.PlaneHelper=Nu,t.PointCloud=function(t,e){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new mo(t,e)},t.PointCloudMaterial=function(t){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new co(t)},t.PointLight=Gl,t.PointLightHelper=pu,t.Points=mo,t.PointsMaterial=co,t.PolarGridHelper=xu,t.PolyhedronBufferGeometry=So,t.PolyhedronGeometry=So,t.PositionalAudio=Lc,t.PropertyBinding=kc,t.PropertyMixer=Cc,t.QuadraticBezierCurve=bl,t.QuadraticBezierCurve3=wl,t.Quaternion=Lt,t.QuaternionKeyframeTrack=ks,t.QuaternionLinearInterpolant=Us,t.REVISION=n,t.RGBADepthPacking=3201,t.RGBAFormat=A,t.RGBAIntegerFormat=1033,t.RGBA_ASTC_10x10_Format=37819,t.RGBA_ASTC_10x5_Format=37816,t.RGBA_ASTC_10x6_Format=37817,t.RGBA_ASTC_10x8_Format=37818,t.RGBA_ASTC_12x10_Format=37820,t.RGBA_ASTC_12x12_Format=37821,t.RGBA_ASTC_4x4_Format=37808,t.RGBA_ASTC_5x4_Format=37809,t.RGBA_ASTC_5x5_Format=37810,t.RGBA_ASTC_6x5_Format=37811,t.RGBA_ASTC_6x6_Format=37812,t.RGBA_ASTC_8x5_Format=37813,t.RGBA_ASTC_8x6_Format=37814,t.RGBA_ASTC_8x8_Format=37815,t.RGBA_BPTC_Format=36492,t.RGBA_ETC2_EAC_Format=H,t.RGBA_PVRTC_2BPPV1_Format=z,t.RGBA_PVRTC_4BPPV1_Format=O,t.RGBA_S3TC_DXT1_Format=P,t.RGBA_S3TC_DXT3_Format=D,t.RGBA_S3TC_DXT5_Format=I,t.RGBDEncoding=tt,t.RGBEEncoding=Q,t.RGBEFormat=1023,t.RGBFormat=E,t.RGBIntegerFormat=1032,t.RGBM16Encoding=$,t.RGBM7Encoding=K,t.RGB_ETC1_Format=36196,t.RGB_ETC2_Format=F,t.RGB_PVRTC_2BPPV1_Format=B,t.RGB_PVRTC_4BPPV1_Format=N,t.RGB_S3TC_DXT1_Format=C,t.RGFormat=1030,t.RGIntegerFormat=1031,t.RawShaderMaterial=ws,t.Ray=ne,t.Raycaster=Zc,t.RectAreaLight=jl,t.RedFormat=1028,t.RedIntegerFormat=1029,t.ReinhardToneMapping=2,t.RepeatWrapping=h,t.ReplaceStencilOp=7681,t.ReverseSubtractEquation=102,t.RingBufferGeometry=hs,t.RingGeometry=hs,t.SRGB8_ALPHA8_ASTC_10x10_Format=37851,t.SRGB8_ALPHA8_ASTC_10x5_Format=37848,t.SRGB8_ALPHA8_ASTC_10x6_Format=37849,t.SRGB8_ALPHA8_ASTC_10x8_Format=37850,t.SRGB8_ALPHA8_ASTC_12x10_Format=37852,t.SRGB8_ALPHA8_ASTC_12x12_Format=37853,t.SRGB8_ALPHA8_ASTC_4x4_Format=37840,t.SRGB8_ALPHA8_ASTC_5x4_Format=37841,t.SRGB8_ALPHA8_ASTC_5x5_Format=37842,t.SRGB8_ALPHA8_ASTC_6x5_Format=37843,t.SRGB8_ALPHA8_ASTC_6x6_Format=37844,t.SRGB8_ALPHA8_ASTC_8x5_Format=37845,t.SRGB8_ALPHA8_ASTC_8x6_Format=37846,t.SRGB8_ALPHA8_ASTC_8x8_Format=37847,t.Scene=fa,t.SceneUtils=dh,t.ShaderChunk=lr,t.ShaderLib=ur,t.ShaderMaterial=Yn,t.ShadowMaterial=bs,t.Shape=Al,t.ShapeBufferGeometry=ds,t.ShapeGeometry=ds,t.ShapePath=ic,t.ShapeUtils=ns,t.ShortType=1011,t.Skeleton=qa,t.SkeletonHelper=hu,t.SkinnedMesh=ka,t.SmoothShading=2,t.Sphere=Yt,t.SphereBufferGeometry=ps,t.SphereGeometry=ps,t.Spherical=Kc,t.SphericalHarmonics3=ql,t.SplineCurve=Ml,t.SpotLight=Bl,t.SpotLightHelper=su,t.Sprite=Da,t.SpriteMaterial=xa,t.SrcAlphaFactor=204,t.SrcAlphaSaturateFactor=210,t.SrcColorFactor=202,t.StaticCopyUsage=35046,t.StaticDrawUsage=nt,t.StaticReadUsage=35045,t.StereoCamera=mc,t.StreamCopyUsage=35042,t.StreamDrawUsage=35040,t.StreamReadUsage=35041,t.StringKeyframeTrack=Vs,t.SubtractEquation=101,t.SubtractiveBlending=3,t.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},t.TangentSpaceNormalMap=0,t.TetrahedronBufferGeometry=fs,t.TetrahedronGeometry=fs,t.TextBufferGeometry=ms,t.TextGeometry=ms,t.Texture=Mt,t.TextureLoader=il,t.TorusBufferGeometry=vs,t.TorusGeometry=vs,t.TorusKnotBufferGeometry=gs,t.TorusKnotGeometry=gs,t.Triangle=Ve,t.TriangleFanDrawMode=2,t.TriangleStripDrawMode=1,t.TrianglesDrawMode=0,t.TubeBufferGeometry=ys,t.TubeGeometry=ys,t.UVMapping=i,t.Uint16Attribute=function(t,e){return console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),new ln(t,e)},t.Uint16BufferAttribute=ln,t.Uint32Attribute=function(t,e){return console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),new un(t,e)},t.Uint32BufferAttribute=un,t.Uint8Attribute=function(t,e){return console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),new an(t,e)},t.Uint8BufferAttribute=an,t.Uint8ClampedAttribute=function(t,e){return console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),new on(t,e)},t.Uint8ClampedBufferAttribute=on,t.Uniform=qc,t.UniformsLib=cr,t.UniformsUtils=Xn,t.UnsignedByteType=_,t.UnsignedInt248Type=T,t.UnsignedIntType=w,t.UnsignedShort4444Type=1017,t.UnsignedShort5551Type=1018,t.UnsignedShort565Type=1019,t.UnsignedShortType=b,t.VSMShadowMap=3,t.Vector2=yt,t.Vector3=Rt,t.Vector4=Tt,t.VectorKeyframeTrack=Ws,t.Vertex=function(t,e,n){return console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),new Rt(t,e,n)},t.VertexColors=2,t.VideoTexture=go,t.WebGL1Renderer=ha,t.WebGLCubeRenderTarget=tr,t.WebGLMultisampleRenderTarget=At,t.WebGLRenderTarget=Et,t.WebGLRenderTargetCube=function(t,e,n){return console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options )."),new tr(t,n)},t.WebGLRenderer=ua,t.WebGLUtils=ia,t.WireframeGeometry=xs,t.WireframeHelper=function(t,e){return console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),new so(new xs(t.geometry),new Ka({color:void 0!==e?e:16777215}))},t.WrapAroundEnding=j,t.XHRLoader=function(t){return console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),new Ks(t)},t.ZeroCurvatureEnding=V,t.ZeroFactor=200,t.ZeroSlopeEnding=W,t.ZeroStencilOp=0,t.sRGBEncoding=Z,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/package.json b/package.json new file mode 100644 index 0000000..99e701b --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "online-3d-viewer", + "description": "Online 3D Viewer", + "version": "0.7.0", + "repository": "github:kovacsv/Online3DViewer", + "license": "MIT", + "devDependencies": { + "google-closure-compiler": "^20210302.0.0", + "jshint": "^2.12.0", + "mocha": "^8.3.2", + "svgo": "^2.2.2" + }, + "scripts": { + "test": "mocha test", + "build": "python tools/create_package.py", + "update": "python tools/update_includes.py", + "svg": "python tools/optimize_svg_files.py" + } +} diff --git a/source/core/core.js b/source/core/core.js new file mode 100644 index 0000000..1fd1ef4 --- /dev/null +++ b/source/core/core.js @@ -0,0 +1,4 @@ +OV = +{ + +}; diff --git a/source/core/taskrunner.js b/source/core/taskrunner.js new file mode 100644 index 0000000..e023168 --- /dev/null +++ b/source/core/taskrunner.js @@ -0,0 +1,41 @@ +OV.TaskRunner = class +{ + constructor () + { + this.count = null; + this.current = null; + this.callbacks = null; + } + + Run (count, callbacks) + { + this.count = count; + this.current = 0; + this.callbacks = callbacks; + if (count === 0) { + this.TaskReady (); + } else { + this.RunOnce (); + } + } + + RunOnce () + { + let obj = this; + setTimeout (function () { + obj.callbacks.runTask (obj.current, obj.TaskReady.bind (obj)); + }, 0); + } + + TaskReady () + { + this.current += 1; + if (this.current < this.count) { + this.RunOnce (); + } else { + if (this.callbacks.onReady) { + this.callbacks.onReady (); + } + } + } +}; diff --git a/source/export/exporter.js b/source/export/exporter.js new file mode 100644 index 0000000..0c1c3b9 --- /dev/null +++ b/source/export/exporter.js @@ -0,0 +1,26 @@ +OV.Exporter = class +{ + constructor () + { + this.exporters = [ + new OV.ExporterObj (), + new OV.ExporterStl (), + new OV.ExporterPly (), + new OV.ExporterOff (), + new OV.ExporterGltf () + ]; + } + + Export (model, format, extension, callbacks) + { + let files = []; + for (let i = 0; i < this.exporters.length; i++) { + let exporter = this.exporters[i]; + if (exporter.CanExport (format, extension)) { + exporter.Export (model, format, files, callbacks); + break; + } + } + return files; + } +}; diff --git a/source/export/exporterbase.js b/source/export/exporterbase.js new file mode 100644 index 0000000..c906e78 --- /dev/null +++ b/source/export/exporterbase.js @@ -0,0 +1,81 @@ +OV.ExportedFile = class +{ + constructor (name) + { + this.name = name; + this.url = null; + this.content = null; + } + + GetName () + { + return this.name; + } + + SetName (name) + { + this.name = name; + } + + GetUrl () + { + return this.url; + } + + SetUrl (url) + { + this.url = url; + } + + GetContent () + { + return this.content; + } + + SetContent (content) + { + this.content = content; + } +}; + +OV.ExporterBase = class +{ + constructor () + { + this.callbacks = null; + } + + CanExport (format, extension) + { + return false; + } + + Export (model, format, files, callbacks) + { + this.callbacks = callbacks; + this.ExportContent (model, format, files); + } + + ExportContent (model, format, files) + { + + } + + GetExportedMaterialName (originalName) + { + return this.GetExportedName (originalName, 'Material'); + } + + GetExportedMeshName (originalName) + { + return this.GetExportedName (originalName, 'Mesh'); + } + + GetExportedName (originalName, defaultName) + { + if (originalName.length === 0) { + return defaultName; + } + return originalName; + } +}; diff --git a/source/export/exportergltf.js b/source/export/exportergltf.js new file mode 100644 index 0000000..39b8498 --- /dev/null +++ b/source/export/exportergltf.js @@ -0,0 +1,404 @@ +OV.ExporterGltf = class extends OV.ExporterBase +{ + constructor () + { + super (); + this.components = { + index : { + type : 5125, // unsigned int 32 + size : 4 + }, + number : { + type : 5126, // float 32 + size : 4 + } + }; + } + + CanExport (format, extension) + { + return (format === OV.FileFormat.Text && extension === 'gltf') || (format === OV.FileFormat.Binary && extension === 'glb'); + } + + ExportContent (model, format, files) + { + if (format === OV.FileFormat.Text) { + this.ExportAsciiContent (model, files); + } else if (format === OV.FileFormat.Binary) { + this.ExportBinaryContent (model, files); + } + } + + ExportAsciiContent (model, files) + { + let gltfFile = new OV.ExportedFile ('model.gltf'); + let binFile = new OV.ExportedFile ('model.bin'); + files.push (gltfFile); + files.push (binFile); + + let meshDataArr = this.GetMeshData (model); + let mainBuffer = this.GetMainBuffer (meshDataArr); + let mainJson = this.GetMainJson (meshDataArr); + mainJson.buffers.push ({ + uri : binFile.GetName (), + byteLength : mainBuffer.byteLength + }); + + let fileNameToIndex = []; + this.ExportMaterials (model, mainJson, function (texture) { + let fileName = OV.GetFileName (texture.name); + let textureIndex = fileNameToIndex[fileName]; + if (textureIndex === undefined) { + let textureFile = new OV.ExportedFile (fileName); + textureFile.SetUrl (texture.url); + files.push (textureFile); + + textureIndex = mainJson.textures.length; + fileNameToIndex[fileName] = textureIndex; + + mainJson.images.push ({ + uri : fileName + }); + mainJson.textures.push ({ + source : textureIndex + }); + } + return textureIndex; + }); + + gltfFile.SetContent (JSON.stringify (mainJson, null, 4)); + binFile.SetContent (mainBuffer); + } + + ExportBinaryContent (model, files) + { + let glbFile = new OV.ExportedFile ('model.glb'); + files.push (glbFile); + + let meshDataArr = this.GetMeshData (model); + let mainBuffer = this.GetMainBuffer (meshDataArr); + let mainJson = this.GetMainJson (meshDataArr); + mainJson.buffers.push ({ + byteLength : mainBuffer.byteLength + }); + + let textureBuffers = []; + let obj = this; + + let fileNameToIndex = []; + this.ExportMaterials (model, mainJson, function (texture) { + let fileName = OV.GetFileName (texture.name); + let extension = OV.GetFileExtension (texture.name); + let textureIndex = fileNameToIndex[fileName]; + if (textureIndex === undefined) { + let bufferIndex = mainJson.buffers.length; + let bufferViewIndex = mainJson.bufferViews.length; + textureIndex = mainJson.textures.length; + fileNameToIndex[fileName] = textureIndex; + let textureBuffer = obj.callbacks.getTextureBuffer (texture.name); + textureBuffers.push (textureBuffer); + mainJson.buffers.push ({ + byteLength : textureBuffer.byteLength + }); + mainJson.bufferViews.push ({ + buffer : bufferIndex, + byteOffset : 0, + byteLength : textureBuffer.byteLength + }); + mainJson.images.push ({ + bufferView : bufferViewIndex, + mimeType : 'image/' + extension + }); + mainJson.textures.push ({ + source : textureIndex + }); + } + return textureIndex; + }); + + let mainJsonString = JSON.stringify (mainJson, null, 4); + let glbSize = 12 + 8 + mainJsonString.length; + for (let i = 0; i < mainJson.buffers.length; i++) { + glbSize += 8 + mainJson.buffers[i].byteLength; + } + + let glbWriter = new OV.BinaryWriter (glbSize, true); + + glbWriter.WriteUnsignedInteger32 (0x46546C67); + glbWriter.WriteUnsignedInteger32 (2); + glbWriter.WriteUnsignedInteger32 (glbSize); + + glbWriter.WriteUnsignedInteger32 (mainJsonString.length); + glbWriter.WriteUnsignedInteger32 (0x4E4F534A); + for (let i = 0; i < mainJsonString.length; i++) { + glbWriter.WriteUnsignedCharacter8 (mainJsonString.charCodeAt (i)); + } + + glbWriter.WriteUnsignedInteger32 (mainBuffer.byteLength); + glbWriter.WriteUnsignedInteger32 (0x004E4942); + glbWriter.WriteArrayBuffer (mainBuffer); + + for (let i = 0; i < textureBuffers.length; i++) { + let textureBuffer = textureBuffers[i]; + glbWriter.WriteUnsignedInteger32 (textureBuffer.byteLength); + glbWriter.WriteUnsignedInteger32 (0x004E4942); + glbWriter.WriteArrayBuffer (textureBuffer); + } + + glbFile.SetContent (glbWriter.GetBuffer ()); + } + + GetMeshData (model) + { + let meshDataArr = []; + + for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { + let mesh = model.GetMesh (meshIndex); + let buffer = OV.ConvertMeshToMeshBuffer (mesh); + meshDataArr.push ({ + name : mesh.GetName (), + buffer : buffer, + offsets : [], + sizes : [] + }); + } + + return meshDataArr; + } + + GetMainBuffer (meshDataArr) + { + let mainBufferSize = 0; + for (let meshIndex = 0; meshIndex < meshDataArr.length; meshIndex++) { + let meshData = meshDataArr[meshIndex]; + mainBufferSize += meshData.buffer.GetByteLength (this.components.index.size, this.components.number.size); + } + + let writer = new OV.BinaryWriter (mainBufferSize, true); + for (let meshIndex = 0; meshIndex < meshDataArr.length; meshIndex++) { + let meshData = meshDataArr[meshIndex]; + let primitives = meshData.buffer.primitives; + for (let primitiveIndex = 0; primitiveIndex < primitives.length; primitiveIndex++) { + let primitive = primitives[primitiveIndex]; + let offset = writer.GetPosition (); + for (let i = 0; i < primitive.indices.length; i++) { + writer.WriteUnsignedInteger32 (primitive.indices[i]); + } + for (let i = 0; i < primitive.vertices.length; i++) { + writer.WriteFloat32 (primitive.vertices[i]); + } + for (let i = 0; i < primitive.normals.length; i++) { + writer.WriteFloat32 (primitive.normals[i]); + } + for (let i = 0; i < primitive.uvs.length; i++) { + let texCoord = primitive.uvs[i]; + if (i % 2 === 1) { + texCoord *= -1.0; + } + writer.WriteFloat32 (texCoord); + } + meshData.offsets.push (offset); + meshData.sizes.push (writer.GetPosition () - offset); + } + } + + return writer.GetBuffer (); + } + + GetMainJson (meshDataArr) + { + let mainJson = { + asset : { + version : '2.0' + }, + scene : 0, + scenes : [ + { + nodes : [] + } + ], + nodes : [], + materials : [], + meshes : [], + buffers : [], + bufferViews : [], + accessors : [] + }; + + for (let meshIndex = 0; meshIndex < meshDataArr.length; meshIndex++) { + let meshData = meshDataArr[meshIndex]; + mainJson.scenes[0].nodes.push (meshIndex); + mainJson.nodes.push ({ + mesh : meshIndex + }); + let jsonMesh = { + name : this.GetExportedMeshName (meshData.name), + primitives : [] + }; + + let primitives = meshData.buffer.primitives; + for (let primitiveIndex = 0; primitiveIndex < primitives.length; primitiveIndex++) { + let primitive = primitives[primitiveIndex]; + let bufferViewIndex = mainJson.bufferViews.length; + let accessorIndex = mainJson.accessors.length; + let accessorOffset = 0; + + let jsonPrimitive = { + attributes : { + POSITION : accessorIndex + 1, + NORMAL : accessorIndex + 2 + }, + indices : accessorIndex, + mode : 4, + material : primitive.material + }; + + mainJson.bufferViews.push ({ + buffer : 0, + byteOffset : meshData.offsets[primitiveIndex], + byteLength : meshData.sizes[primitiveIndex] + }); + + mainJson.accessors.push ({ + bufferView : bufferViewIndex, + byteOffset : accessorOffset, + componentType : this.components.index.type, + count : primitive.indices.length, + type : 'SCALAR' + }); + accessorOffset += primitive.indices.length * this.components.index.size; + + mainJson.accessors.push ({ + bufferView : bufferViewIndex, + byteOffset : accessorOffset, + componentType : this.components.number.type, + count : primitive.vertices.length / 3, + type : 'VEC3' + }); + accessorOffset += primitive.vertices.length * this.components.number.size; + + mainJson.accessors.push ({ + bufferView : bufferViewIndex, + byteOffset : accessorOffset, + componentType : this.components.number.type, + count : primitive.normals.length / 3, + type : 'VEC3' + }); + accessorOffset += primitive.normals.length * this.components.number.size; + + if (primitive.uvs.length > 0) { + mainJson.accessors.push ({ + bufferView : bufferViewIndex, + byteOffset : accessorOffset, + componentType : this.components.number.type, + count : primitive.uvs.length / 2, + type : 'VEC2' + }); + accessorOffset += primitive.uvs.length * this.components.number.size; + jsonPrimitive.attributes.TEXCOORD_0 = accessorIndex + 3; + } + + jsonMesh.primitives.push (jsonPrimitive); + } + mainJson.meshes.push (jsonMesh); + } + + return mainJson; + } + + ExportMaterials (model, mainJson, addTexture) + { + function ExportMaterial (obj, mainJson, material, addTexture) + { + function ColorToRGBA (color, opacity) + { + return [ + OV.SRGBToLinear (color.r / 255.0), + OV.SRGBToLinear (color.g / 255.0), + OV.SRGBToLinear (color.b / 255.0), + opacity + ]; + } + + function ColorToRGB (color) + { + return [ + OV.SRGBToLinear (color.r / 255.0), + OV.SRGBToLinear (color.g / 255.0), + OV.SRGBToLinear (color.b / 255.0) + ]; + } + + function GetTextureParams (mainJson, texture, addTexture) + { + if (texture === null || texture.name === null || texture.url === null) { + return null; + } + + if (mainJson.images === undefined) { + mainJson.images = []; + } + if (mainJson.textures === undefined) { + mainJson.textures = []; + } + + let textureIndex = addTexture (texture); + let textureParams = { + index : textureIndex + }; + + if (texture.HasTransformation ()) { + textureParams.extensions = { + KHR_texture_transform : { + offset : [texture.offset.x, -texture.offset.y], + scale : [texture.scale.x, texture.scale.y], + rotation : -texture.rotation + } + }; + } + + return textureParams; + } + + let jsonMaterial = { + name : obj.GetExportedMaterialName (material.name), + pbrMetallicRoughness : { + baseColorFactor : ColorToRGBA (material.diffuse, material.opacity), + metallicFactor : 0.0, + roughnessFactor : 1.0 + }, + emissiveFactor : ColorToRGB (material.emissive), + alphaMode : 'OPAQUE', + alphaCutoff : material.alphaTest + }; + + if (material.transparent) { + // TODO: mask? + jsonMaterial.alphaMode = 'BLEND'; + } + + let baseColorTexture = GetTextureParams (mainJson, material.diffuseMap, addTexture); + if (baseColorTexture !== null) { + if (!material.multiplyDiffuseMap) { + jsonMaterial.pbrMetallicRoughness.baseColorFactor = ColorToRGBA (new OV.Color (255, 255, 255), material.opacity); + } + jsonMaterial.pbrMetallicRoughness.baseColorTexture = baseColorTexture; + } + let normalTexture = GetTextureParams (mainJson, material.normalMap, addTexture); + if (normalTexture !== null) { + jsonMaterial.normalTexture = normalTexture; + } + let emissiveTexture = GetTextureParams (mainJson, material.emissiveMap, addTexture); + if (emissiveTexture !== null) { + jsonMaterial.emissiveTexture = emissiveTexture; + } + + mainJson.materials.push (jsonMaterial); + } + + for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) { + let material = model.GetMaterial (materialIndex); + ExportMaterial (this, mainJson, material, addTexture); + } + } +}; diff --git a/source/export/exporterobj.js b/source/export/exporterobj.js new file mode 100644 index 0000000..0267ea7 --- /dev/null +++ b/source/export/exporterobj.js @@ -0,0 +1,107 @@ +OV.ExporterObj = class extends OV.ExporterBase +{ + constructor () + { + super (); + } + + CanExport (format, extension) + { + return format === OV.FileFormat.Text && extension === 'obj'; + } + + ExportContent (model, format, files) + { + function WriteTexture (mtlWriter, keyword, texture, files) + { + if (texture !== null && texture.name !== null && texture.url !== null) { + let fileName = OV.GetFileName (texture.name); + mtlWriter.WriteArrayLine ([keyword, fileName]); + + let fileIndex = files.findIndex (function (file) { + return file.GetName () === fileName; + }); + if (fileIndex === -1) { + let textureFile = new OV.ExportedFile (fileName); + textureFile.SetUrl (texture.url); + files.push (textureFile); + } + } + } + + let mtlFile = new OV.ExportedFile ('model.mtl'); + let objFile = new OV.ExportedFile ('model.obj'); + + files.push (mtlFile); + files.push (objFile); + + let mtlWriter = new OV.TextWriter (); + for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) { + let material = model.GetMaterial (materialIndex); + mtlWriter.WriteArrayLine (['newmtl', this.GetExportedMaterialName (material.name)]); + mtlWriter.WriteArrayLine (['Ka', material.ambient.r / 255.0, material.ambient.g / 255.0, material.ambient.b / 255.0]); + mtlWriter.WriteArrayLine (['Kd', material.diffuse.r / 255.0, material.diffuse.g / 255.0, material.diffuse.b / 255.0]); + mtlWriter.WriteArrayLine (['Ks', material.specular.r / 255.0, material.specular.g / 255.0, material.specular.b / 255.0]); + mtlWriter.WriteArrayLine (['Ns', material.shininess * 100.0]); + mtlWriter.WriteArrayLine (['d', material.opacity]); + WriteTexture (mtlWriter, 'map_Kd', material.diffuseMap, files); + WriteTexture (mtlWriter, 'map_Ks', material.specularMap, files); + WriteTexture (mtlWriter, 'bump', material.bumpMap, files); + } + mtlFile.SetContent (mtlWriter.GetText ()); + + let objWriter = new OV.TextWriter (); + objWriter.WriteArrayLine (['mtllib', mtlFile.GetName ()]); + let vertexOffset = 0; + let normalOffset = 0; + let uvOffset = 0; + let usedMaterialName = null; + for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { + let mesh = model.GetMesh (meshIndex); + objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]); + for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { + let vertex = mesh.GetVertex (vertexIndex); + objWriter.WriteArrayLine (['v', vertex.x, vertex.y, vertex.z]); + } + for (let normalIndex = 0; normalIndex < mesh.NormalCount (); normalIndex++) { + let normal = mesh.GetNormal (normalIndex); + objWriter.WriteArrayLine (['vn', normal.x, normal.y, normal.z]); + } + for (let textureUVIndex = 0; textureUVIndex < mesh.TextureUVCount (); textureUVIndex++) { + let uv = mesh.GetTextureUV (textureUVIndex); + objWriter.WriteArrayLine (['vt', uv.x, uv.y]); + } + for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) { + let triangle = mesh.GetTriangle (triangleIndex); + let v0 = triangle.v0 + vertexOffset + 1; + let v1 = triangle.v1 + vertexOffset + 1; + let v2 = triangle.v2 + vertexOffset + 1; + let n0 = triangle.n0 + normalOffset + 1; + let n1 = triangle.n1 + normalOffset + 1; + let n2 = triangle.n2 + normalOffset + 1; + if (triangle.mat !== null) { + let material = model.GetMaterial (triangle.mat); + let materialName = this.GetExportedMaterialName (material.name); + if (materialName !== usedMaterialName) { + objWriter.WriteArrayLine (['usemtl', materialName]); + usedMaterialName = materialName; + } + } + let u0 = ''; + let u1 = ''; + let u2 = ''; + if (triangle.HasTextureUVs ()) { + u0 = triangle.u0 + uvOffset + 1; + u1 = triangle.u1 + uvOffset + 1; + u2 = triangle.u2 + uvOffset + 1; + } + objWriter.WriteArrayLine (['f', [v0, u0, n0].join ('/'), [v1, u1, n1].join ('/'), [v2, u2, n2].join ('/')]); + } + vertexOffset += mesh.VertexCount (); + normalOffset += mesh.NormalCount (); + uvOffset += mesh.TextureUVCount (); + } + + objFile.SetContent (objWriter.GetText ()); + } +}; diff --git a/source/export/exporteroff.js b/source/export/exporteroff.js new file mode 100644 index 0000000..f6187d6 --- /dev/null +++ b/source/export/exporteroff.js @@ -0,0 +1,33 @@ +OV.ExporterOff = class extends OV.ExporterBase +{ + constructor () + { + super (); + } + + CanExport (format, extension) + { + return format === OV.FileFormat.Text && extension === 'off'; + } + + ExportContent (model, format, files) + { + let offFile = new OV.ExportedFile ('model.off'); + files.push (offFile); + + let offWriter = new OV.TextWriter (); + offWriter.WriteLine ('OFF'); + offWriter.WriteArrayLine ([model.VertexCount (), model.TriangleCount (), 0]); + + OV.EnumerateModelVerticesAndTriangles (model, { + onVertex : function (x, y, z) { + offWriter.WriteArrayLine ([x, y, z]); + }, + onTriangle : function (v0, v1, v2) { + offWriter.WriteArrayLine ([3, v0, v1, v2]); + } + }); + + offFile.SetContent (offWriter.GetText ()); + } +}; diff --git a/source/export/exporterply.js b/source/export/exporterply.js new file mode 100644 index 0000000..c150fab --- /dev/null +++ b/source/export/exporterply.js @@ -0,0 +1,94 @@ +OV.ExporterPly = class extends OV.ExporterBase +{ + constructor () + { + super (); + } + + CanExport (format, extension) + { + return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'ply'; + } + + ExportContent (model, format, files) + { + if (format === OV.FileFormat.Text) { + this.ExportText (model, files); + } else { + this.ExportBinary (model, files); + } + } + + ExportText (model, files) + { + let plyFile = new OV.ExportedFile ('model.ply'); + files.push (plyFile); + + let plyWriter = new OV.TextWriter (); + + let vertexCount = model.VertexCount (); + let triangleCount = model.TriangleCount (); + let headerText = this.GetHeaderText ('ascii', vertexCount, triangleCount); + plyWriter.Write (headerText); + + OV.EnumerateModelVerticesAndTriangles (model, { + onVertex : function (x, y, z) { + plyWriter.WriteArrayLine ([x, y, z]); + }, + onTriangle : function (v0, v1, v2) { + plyWriter.WriteArrayLine ([3, v0, v1, v2]); + } + }); + + plyFile.SetContent (plyWriter.GetText ()); + } + + ExportBinary (model, files) + { + let plyFile = new OV.ExportedFile ('model.ply'); + files.push (plyFile); + + + let vertexCount = model.VertexCount (); + let triangleCount = model.TriangleCount (); + let headerText = this.GetHeaderText ('binary_little_endian', vertexCount, triangleCount); + + let fullByteLength = headerText.length + vertexCount * 3 * 4 + triangleCount * (1 + 3 * 4); + let plyWriter = new OV.BinaryWriter (fullByteLength, true); + + for (let i = 0; i < headerText.length; i++) { + plyWriter.WriteUnsignedCharacter8 (headerText.charCodeAt (i)); + } + + OV.EnumerateModelVerticesAndTriangles (model, { + onVertex : function (x, y, z) { + plyWriter.WriteFloat32 (x); + plyWriter.WriteFloat32 (y); + plyWriter.WriteFloat32 (z); + }, + onTriangle : function (v0, v1, v2) { + plyWriter.WriteUnsignedCharacter8 (3); + plyWriter.WriteInteger32 (v0); + plyWriter.WriteInteger32 (v1); + plyWriter.WriteInteger32 (v2); + } + }); + + plyFile.SetContent (plyWriter.GetBuffer ()); + } + + GetHeaderText (format, vertexCount, triangleCount) + { + let headerWriter = new OV.TextWriter (); + headerWriter.WriteLine ('ply'); + headerWriter.WriteLine ('format ' + format + ' 1.0'); + headerWriter.WriteLine ('element vertex ' + vertexCount); + headerWriter.WriteLine ('property float x'); + headerWriter.WriteLine ('property float y'); + headerWriter.WriteLine ('property float z'); + headerWriter.WriteLine ('element face ' + triangleCount); + headerWriter.WriteLine ('property list uchar int vertex_index'); + headerWriter.WriteLine ('end_header'); + return headerWriter.GetText (); + } +}; diff --git a/source/export/exporterstl.js b/source/export/exporterstl.js new file mode 100644 index 0000000..8d4665e --- /dev/null +++ b/source/export/exporterstl.js @@ -0,0 +1,84 @@ +OV.ExporterStl = class extends OV.ExporterBase +{ + constructor () + { + super (); + } + + CanExport (format, extension) + { + return (format === OV.FileFormat.Text || format === OV.FileFormat.Binary) && extension === 'stl'; + } + + ExportContent (model, format, files) + { + if (format === OV.FileFormat.Text) { + this.ExportText (model, files); + } else { + this.ExportBinary (model, files); + } + } + + ExportText (model, files) + { + let stlFile = new OV.ExportedFile ('model.stl'); + files.push (stlFile); + + let stlWriter = new OV.TextWriter (); + stlWriter.WriteLine ('solid Model'); + OV.EnumerateModelTrianglesWithNormals (model, function (v0, v1, v2, normal) { + stlWriter.WriteArrayLine (['facet', 'normal', normal.x, normal.y, normal.z]); + stlWriter.Indent (1); + stlWriter.WriteLine ('outer loop'); + stlWriter.Indent (1); + stlWriter.WriteArrayLine (['vertex', v0.x, v0.y, v0.z]); + stlWriter.WriteArrayLine (['vertex', v1.x, v1.y, v1.z]); + stlWriter.WriteArrayLine (['vertex', v2.x, v2.y, v2.z]); + stlWriter.Indent (-1); + stlWriter.WriteLine ('endloop'); + stlWriter.Indent (-1); + stlWriter.WriteLine ('endfacet'); + }); + stlWriter.WriteLine ('endsolid Model'); + + stlFile.SetContent (stlWriter.GetText ()); + } + + ExportBinary (model, files) + { + let stlFile = new OV.ExportedFile ('model.stl'); + files.push (stlFile); + + let triangleCount = model.TriangleCount (); + let headerSize = 80; + let fullByteLength = headerSize + 4 + triangleCount * 50; + let stlWriter = new OV.BinaryWriter (fullByteLength, true); + + for (let i = 0; i < headerSize; i++) { + stlWriter.WriteUnsignedCharacter8 (0); + } + + stlWriter.WriteUnsignedInteger32 (triangleCount); + OV.EnumerateModelTrianglesWithNormals (model, function (v0, v1, v2, normal) { + stlWriter.WriteFloat32 (normal.x); + stlWriter.WriteFloat32 (normal.y); + stlWriter.WriteFloat32 (normal.z); + + stlWriter.WriteFloat32 (v0.x); + stlWriter.WriteFloat32 (v0.y); + stlWriter.WriteFloat32 (v0.z); + + stlWriter.WriteFloat32 (v1.x); + stlWriter.WriteFloat32 (v1.y); + stlWriter.WriteFloat32 (v1.z); + + stlWriter.WriteFloat32 (v2.x); + stlWriter.WriteFloat32 (v2.y); + stlWriter.WriteFloat32 (v2.z); + + stlWriter.WriteUnsignedInteger16 (0); + }); + + stlFile.SetContent (stlWriter.GetBuffer ()); + } +}; diff --git a/source/export/exporterutils.js b/source/export/exporterutils.js new file mode 100644 index 0000000..addca26 --- /dev/null +++ b/source/export/exporterutils.js @@ -0,0 +1,34 @@ +OV.EnumerateModelVerticesAndTriangles = function (model, callbacks) +{ + for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { + let mesh = model.GetMesh (meshIndex); + for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { + let vertex = mesh.GetVertex (vertexIndex); + callbacks.onVertex (vertex.x, vertex.y, vertex.z); + } + } + let vertexOffset = 0; + for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { + let mesh = model.GetMesh (meshIndex); + for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) { + let triangle = mesh.GetTriangle (triangleIndex); + callbacks.onTriangle (triangle.v0 + vertexOffset, triangle.v1 + vertexOffset, triangle.v2 + vertexOffset); + } + vertexOffset += mesh.VertexCount (); + } +}; + +OV.EnumerateModelTrianglesWithNormals = function (model, onTriangle) +{ + for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) { + let mesh = model.GetMesh (meshIndex); + for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) { + let triangle = mesh.GetTriangle (triangleIndex); + let v0 = mesh.GetVertex (triangle.v0); + let v1 = mesh.GetVertex (triangle.v1); + let v2 = mesh.GetVertex (triangle.v2); + let normal = OV.CalculateTriangleNormal (v0, v1, v2); + onTriangle (v0, v1, v2, normal); + } + } +}; diff --git a/source/external/three.converter.js b/source/external/three.converter.js new file mode 100644 index 0000000..f8b16d7 --- /dev/null +++ b/source/external/three.converter.js @@ -0,0 +1,195 @@ +OV.ConvertModelToThreeMeshes = function (model, callbacks) +{ + function CreateThreeMaterial (model, materialIndex) + { + function SetTextureParameters (texture, threeTexture) + { + threeTexture.wrapS = THREE.RepeatWrapping; + threeTexture.wrapT = THREE.RepeatWrapping; + threeTexture.rotation = texture.rotation; + threeTexture.offset.x = texture.offset.x; + threeTexture.offset.y = texture.offset.y; + threeTexture.repeat.x = texture.scale.x; + threeTexture.repeat.y = texture.scale.y; + } + + function LoadTexture (threeMaterial, texture, onLoad) + { + if (texture === null || texture.url === null) { + return; + } + let loader = new THREE.TextureLoader (); + loader.load (texture.url, function (threeTexture) { + SetTextureParameters (texture, threeTexture); + threeTexture.image = OV.ResizeImageToPowerOfTwoSides (threeTexture.image); + threeMaterial.needsUpdate = true; + onLoad (threeTexture); + }); + } + + let material = model.GetMaterial (materialIndex); + let diffuseColor = new THREE.Color (material.diffuse.r / 255.0, material.diffuse.g / 255.0, material.diffuse.b / 255.0); + let specularColor = new THREE.Color (material.specular.r / 255.0, material.specular.g / 255.0, material.specular.b / 255.0); + let emissiveColor = new THREE.Color (material.emissive.r / 255.0, material.emissive.g / 255.0, material.emissive.b / 255.0); + if (OV.IsEqual (material.shininess, 0.0)) { + specularColor.setRGB (0.0, 0.0, 0.0); + } + + let threeMaterial = new THREE.MeshPhongMaterial ({ + color : diffuseColor, + specular : specularColor, + emissive : emissiveColor, + shininess : material.shininess * 10.0, + opacity : material.opacity, + transparent : material.transparent, + alphaTest : material.alphaTest, + side : THREE.DoubleSide + }); + + LoadTexture (threeMaterial, material.diffuseMap, function (threeTexture) { + if (!material.multiplyDiffuseMap) { + threeMaterial.color.setRGB (1.0, 1.0, 1.0); + } + threeMaterial.map = threeTexture; + callbacks.onTextureLoaded (); + }); + LoadTexture (threeMaterial, material.specularMap, function (threeTexture) { + threeMaterial.specularMap = threeTexture; + callbacks.onTextureLoaded (); + }); + LoadTexture (threeMaterial, material.bumpMap, function (threeTexture) { + threeMaterial.bumpMap = threeTexture; + callbacks.onTextureLoaded (); + }); + LoadTexture (threeMaterial, material.normalMap, function (threeTexture) { + threeMaterial.normalMap = threeTexture; + callbacks.onTextureLoaded (); + }); + LoadTexture (threeMaterial, material.emissiveMap, function (threeTexture) { + threeMaterial.emissiveMap = threeTexture; + callbacks.onTextureLoaded (); + }); + + return threeMaterial; + } + + function CreateThreeMesh (model, meshIndex, modelThreeMaterials) + { + let mesh = model.GetMesh (meshIndex); + let triangleCount = mesh.TriangleCount (); + if (triangleCount === 0) { + return null; + } + + let triangleIndices = []; + for (let i = 0; i < triangleCount; i++) { + triangleIndices.push (i); + } + triangleIndices.sort (function (a, b) { + let aTriangle = mesh.GetTriangle (a); + let bTriangle = mesh.GetTriangle (b); + return aTriangle.mat - bTriangle.mat; + }); + + let threeGeometry = new THREE.BufferGeometry (); + let meshThreeMaterials = []; + let meshOriginalMaterials = []; + let modelToThreeMaterials = {}; + + let vertices = []; + let normals = []; + let uvs = []; + + let groups = []; + groups.push ({ + start : 0, + end : -1 + }); + + let meshHasUVs = mesh.TextureUVCount () > 0; + for (let i = 0; i < triangleIndices.length; i++) { + let triangleIndex = triangleIndices[i]; + let triangle = mesh.GetTriangle (triangleIndex); + + let v0 = mesh.GetVertex (triangle.v0); + let v1 = mesh.GetVertex (triangle.v1); + let v2 = mesh.GetVertex (triangle.v2); + vertices.push (v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, v2.x, v2.y, v2.z); + + let n0 = mesh.GetNormal (triangle.n0); + let n1 = mesh.GetNormal (triangle.n1); + let n2 = mesh.GetNormal (triangle.n2); + normals.push (n0.x, n0.y, n0.z, n1.x, n1.y, n1.z, n2.x, n2.y, n2.z); + + if (triangle.HasTextureUVs ()) { + let u0 = mesh.GetTextureUV (triangle.u0); + let u1 = mesh.GetTextureUV (triangle.u1); + let u2 = mesh.GetTextureUV (triangle.u2); + uvs.push (u0.x, u0.y, u1.x, u1.y, u2.x, u2.y); + } else if (meshHasUVs) { + uvs.push (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); + } + + let modelMaterialIndex = triangle.mat; + let materialIndex = modelToThreeMaterials[modelMaterialIndex]; + if (materialIndex === undefined) { + materialIndex = meshThreeMaterials.length; + modelToThreeMaterials[modelMaterialIndex] = materialIndex; + meshThreeMaterials.push (modelThreeMaterials[modelMaterialIndex]); + meshOriginalMaterials.push (modelMaterialIndex); + if (i > 0) { + groups[groups.length - 1].end = i - 1; + groups.push ({ + start : groups[groups.length - 1].end + 1, + end : -1 + }); + } + } + } + + groups[groups.length - 1].end = triangleCount - 1; + + threeGeometry.setAttribute ('position', new THREE.Float32BufferAttribute (vertices, 3)); + threeGeometry.setAttribute ('normal', new THREE.Float32BufferAttribute (normals, 3)); + if (uvs.length !== 0) { + threeGeometry.setAttribute ('uv', new THREE.Float32BufferAttribute (uvs, 2)); + } + for (let i = 0; i < groups.length; i++) { + let group = groups[i]; + threeGeometry.addGroup (group.start * 3, (group.end - group.start + 1) * 3, i); + } + + let threeMesh = new THREE.Mesh (threeGeometry, meshThreeMaterials); + threeMesh.userData = { + originalMeshIndex : meshIndex, + originalMaterials : meshOriginalMaterials, + threeMaterials : null + }; + + return threeMesh; + } + + let modelThreeMaterials = []; + for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) { + let threeMaterial = CreateThreeMaterial (model, materialIndex); + modelThreeMaterials.push (threeMaterial); + } + + let threeMeshes = []; + let taskRunner = new OV.TaskRunner (); + taskRunner.Run (model.MeshCount (), { + runTask : function (index, ready) { + let mesh = model.GetMesh (index); + if (mesh.TriangleCount () === 0) { + ready (); + } else { + let threeMesh = CreateThreeMesh (model, index, modelThreeMaterials); + threeMeshes.push (threeMesh); + ready (); + } + }, + onReady : function () { + callbacks.onModelLoaded (threeMeshes); + } + }); +}; diff --git a/source/external/three.model.loader.js b/source/external/three.model.loader.js new file mode 100644 index 0000000..c8ca354 --- /dev/null +++ b/source/external/three.model.loader.js @@ -0,0 +1,85 @@ +OV.ThreeModelLoader = class +{ + constructor () + { + this.importer = new OV.Importer (); + this.callbacks = null; + this.inProgress = false; + } + + Init (callbacks) + { + this.callbacks = callbacks; + } + + LoadFromUrlList (urls) + { + if (this.inProgress) { + return; + } + + let obj = this; + this.inProgress = true; + this.callbacks.onLoadStart (); + this.importer.LoadFilesFromUrls (urls, function () { + obj.OnFilesLoaded (); + }); + } + + LoadFromFileList (files) + { + if (this.inProgress) { + return; + } + + let obj = this; + this.inProgress = true; + this.callbacks.onLoadStart (); + this.importer.LoadFilesFromFileObjects (files, function () { + obj.OnFilesLoaded (); + }); + } + + OnFilesLoaded () + { + let obj = this; + this.callbacks.onFilesLoaded (); + + let taskRunner = new OV.TaskRunner (); + taskRunner.Run (1, { + runTask : function (index, ready) { + obj.importer.Import ({ + success : function (importResult) { + obj.OnModelImported (importResult); + ready (); + }, + error : function (importerError) { + obj.callbacks.onLoadError (importerError); + obj.inProgress = false; + ready (); + } + }); + } + }); + } + + OnModelImported (importResult) + { + let obj = this; + this.callbacks.onModelImported (); + OV.ConvertModelToThreeMeshes (importResult.model, { + onTextureLoaded : function () { + obj.callbacks.onTextureLoaded (); + }, + onModelLoaded : function (meshes) { + obj.callbacks.onModelFinished (importResult, meshes); + obj.inProgress = false; + } + }); + } + + GetImporter () + { + return this.importer; + } +}; diff --git a/source/geometry/coord2d.js b/source/geometry/coord2d.js new file mode 100644 index 0000000..493393b --- /dev/null +++ b/source/geometry/coord2d.js @@ -0,0 +1,33 @@ +OV.Coord2D = class +{ + constructor (x, y) + { + this.x = x; + this.y = y; + } + + Clone () + { + return new OV.Coord2D (this.x, this.y); + } +}; + +OV.CoordIsEqual2D = function (a, b) +{ + return OV.IsEqual (a.x, b.x) && OV.IsEqual (a.y, b.y); +}; + +OV.AddCoord2D = function (a, b) +{ + return new OV.Coord2D (a.x + b.x, a.y + b.y); +}; + +OV.SubCoord2D = function (a, b) +{ + return new OV.Coord2D (a.x - b.x, a.y - b.y); +}; + +OV.CoordDistance2D = function (a, b) +{ + return Math.sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); +}; diff --git a/source/geometry/coord3d.js b/source/geometry/coord3d.js new file mode 100644 index 0000000..e3f3d35 --- /dev/null +++ b/source/geometry/coord3d.js @@ -0,0 +1,119 @@ +OV.Coord3D = class +{ + constructor (x, y, z) + { + this.x = x; + this.y = y; + this.z = z; + } + + Length () + { + return Math.sqrt (this.x * this.x + this.y * this.y + this.z * this.z); + } + + MultiplyScalar (scalar) + { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + return this; + } + + Normalize () + { + let length = this.Length (); + if (length > 0.0) { + this.MultiplyScalar (1.0 / length); + } + return this; + } + + Offset (direction, distance) + { + let normal = direction.Clone ().Normalize (); + this.x += normal.x * distance; + this.y += normal.y * distance; + this.z += normal.z * distance; + return this; + } + + Rotate (axis, angle, origo) + { + let normal = axis.Clone ().Normalize (); + + let u = normal.x; + let v = normal.y; + let w = normal.z; + + let x = this.x - origo.x; + let y = this.y - origo.y; + let z = this.z - origo.z; + + let si = Math.sin (angle); + let co = Math.cos (angle); + this.x = - u * (- u * x - v * y - w * z) * (1.0 - co) + x * co + (- w * y + v * z) * si; + this.y = - v * (- u * x - v * y - w * z) * (1.0 - co) + y * co + (w * x - u * z) * si; + this.z = - w * (- u * x - v * y - w * z) * (1.0 - co) + z * co + (- v * x + u * y) * si; + + this.x += origo.x; + this.y += origo.y; + this.z += origo.z; + return this; + } + + Clone () + { + return new OV.Coord3D (this.x, this.y, this.z); + } +}; + +OV.CoordIsEqual3D = function (a, b) +{ + return OV.IsEqual (a.x, b.x) && OV.IsEqual (a.y, b.y) && OV.IsEqual (a.z, b.z); +}; + +OV.AddCoord3D = function (a, b) +{ + return new OV.Coord3D (a.x + b.x, a.y + b.y, a.z + b.z); +}; + +OV.SubCoord3D = function (a, b) +{ + return new OV.Coord3D (a.x - b.x, a.y - b.y, a.z - b.z); +}; + +OV.CoordDistance3D = function (a, b) +{ + return Math.sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z)); +}; + +OV.VectorAngle3D = function (a, b) +{ + let aDirection = a.Clone ().Normalize (); + let bDirection = b.Clone ().Normalize (); + if (OV.CoordIsEqual3D (aDirection, bDirection)) { + return 0.0; + } + let product = OV.DotVector3D (aDirection, bDirection); + return Math.acos (product); +}; + +OV.DotVector3D = function (a, b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z; +}; + +OV.CrossVector3D = function (a, b) +{ + let result = new OV.Coord3D (0.0, 0.0, 0.0); + result.x = a.y * b.z - a.z * b.y; + result.y = a.z * b.x - a.x * b.z; + result.z = a.x * b.y - a.y * b.x; + return result; +}; + +OV.VectorLength3D = function (x, y, z) +{ + return Math.sqrt (x * x + y * y + z * z); +}; diff --git a/source/geometry/geometry.js b/source/geometry/geometry.js new file mode 100644 index 0000000..b4893be --- /dev/null +++ b/source/geometry/geometry.js @@ -0,0 +1,40 @@ +OV.Eps = 0.00000001; +OV.RadDeg = 57.29577951308232; +OV.DegRad = 0.017453292519943; + +OV.IsZero = function (a) +{ + return Math.abs (a) < OV.Eps; +}; + +OV.IsLower = function (a, b) +{ + return b - a > OV.Eps; +}; + +OV.IsGreater = function (a, b) +{ + return a - b > OV.Eps; +}; + +OV.IsEqual = function (a, b) +{ + return Math.abs (b - a) < OV.Eps; +}; + +OV.IsPositive = function (a) +{ + return a > OV.Eps; +}; + +OV.IsNegative = function (a) +{ + return a < -OV.Eps; +}; + +OV.Direction = +{ + X : 1, + Y : 2, + Z : 3 +}; diff --git a/source/geometry/matrix.js b/source/geometry/matrix.js new file mode 100644 index 0000000..46022a2 --- /dev/null +++ b/source/geometry/matrix.js @@ -0,0 +1,396 @@ +OV.Matrix = class +{ + constructor (matrix) + { + this.matrix = null; + if (matrix !== undefined && matrix !== null) { + this.matrix = matrix; + } + } + + IsValid () + { + return this.matrix !== null; + } + + Set (matrix) + { + this.matrix = matrix; + return this; + } + + Get () + { + return this.matrix; + } + + Clone () + { + let result = [ + this.matrix[0], this.matrix[1], this.matrix[2], this.matrix[3], + this.matrix[4], this.matrix[5], this.matrix[6], this.matrix[7], + this.matrix[8], this.matrix[9], this.matrix[10], this.matrix[11], + this.matrix[12], this.matrix[13], this.matrix[14], this.matrix[15] + ]; + return new OV.Matrix (result); + } + + CreateIdentity () + { + this.matrix = [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0 + ]; + return this; + } + + IsIdentity () + { + let identity = new OV.Matrix ().CreateIdentity ().Get (); + for (let i = 0; i < 16; i++) { + if (!OV.IsEqual (this.matrix[i], identity[i])) { + return false; + } + } + return true; + } + + CreateTranslation (x, y, z) + { + this.matrix = [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + x, y, z, 1.0 + ]; + return this; + } + + CreateRotation (x, y, z, w) + { + let x2 = x + x; + let y2 = y + y; + let z2 = z + z; + let xx = x * x2; + let xy = x * y2; + let xz = x * z2; + let yy = y * y2; + let yz = y * z2; + let zz = z * z2; + let wx = w * x2; + let wy = w * y2; + let wz = w * z2; + this.matrix = [ + 1.0 - (yy + zz), xy + wz, xz - wy, 0.0, + xy - wz, 1.0 - (xx + zz), yz + wx, 0.0, + xz + wy, yz - wx, 1.0 - (xx + yy), 0.0, + 0.0, 0.0, 0.0, 1.0 + ]; + return this; + } + + CreateScale (x, y, z) + { + this.matrix = [ + x, 0.0, 0.0, 0.0, + 0.0, y, 0.0, 0.0, + 0.0, 0.0, z, 0.0, + 0.0, 0.0, 0.0, 1.0 + ]; + return this; + } + + ComposeTRS (translation, rotation, scale) + { + let tx = translation[0]; + let ty = translation[1]; + let tz = translation[2]; + let qx = rotation[0]; + let qy = rotation[1]; + let qz = rotation[2]; + let qw = rotation[3]; + let sx = scale[0]; + let sy = scale[1]; + let sz = scale[2]; + + let x2 = qx + qx; + let y2 = qy + qy; + let z2 = qz + qz; + let xx = qx * x2; + let xy = qx * y2; + let xz = qx * z2; + let yy = qy * y2; + let yz = qy * z2; + let zz = qz * z2; + let wx = qw * x2; + let wy = qw * y2; + let wz = qw * z2; + + this.matrix = [ + (1.0 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0.0, + (xy - wz) * sy, (1.0 - (xx + zz)) * sy, (yz + wx) * sy, 0.0, + (xz + wy) * sz, (yz - wx) * sz, (1.0 - (xx + yy)) * sz, 0.0, + tx, ty, tz, 1.0 + ]; + return this; + } + + DecomposeTRS () + { + let translation = [ + this.matrix[12], + this.matrix[13], + this.matrix[14] + ]; + + let sx = OV.VectorLength3D (this.matrix[0], this.matrix[1], this.matrix[2]); + let sy = OV.VectorLength3D (this.matrix[4], this.matrix[5], this.matrix[6]); + let sz = OV.VectorLength3D (this.matrix[8], this.matrix[9], this.matrix[10]); + let determinant = this.Determinant (); + if (OV.IsNegative (determinant)) { + sx *= -1.0; + } + let scale = [sx, sy, sz]; + + let m00 = this.matrix[0] / sx; + let m01 = this.matrix[4] / sy; + let m02 = this.matrix[8] / sz; + let m10 = this.matrix[1] / sx; + let m11 = this.matrix[5] / sy; + let m12 = this.matrix[9] / sz; + let m20 = this.matrix[2] / sx; + let m21 = this.matrix[6] / sy; + let m22 = this.matrix[10] / sz; + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + let rotation = null; + let tr = m00 + m11 + m22; + if (tr > 0.0) { + let s = Math.sqrt (tr + 1.0) * 2.0; + rotation = [ + (m21 - m12) / s, + (m02 - m20) / s, + (m10 - m01) / s, + 0.25 * s + ]; + } else if ((m00 > m11) && (m00 > m22)) { + let s = Math.sqrt (1.0 + m00 - m11 - m22) * 2.0; + rotation = [ + 0.25 * s, + (m01 + m10) / s, + (m02 + m20) / s, + (m21 - m12) / s + ]; + } else if (m11 > m22) { + let s = Math.sqrt (1.0 + m11 - m00 - m22) * 2.0; + rotation = [ + (m01 + m10) / s, + 0.25 * s, + (m12 + m21) / s, + (m02 - m20) / s + ]; + } else { + let s = Math.sqrt (1.0 + m22 - m00 - m11) * 2.0; + rotation = [ + (m02 + m20) / s, + (m12 + m21) / s, + 0.25 * s, + (m10 - m01) / s + ]; + } + + return { + translation : translation, + rotation : rotation, + scale : scale + }; + } + + Determinant () + { + let a00 = this.matrix[0]; + let a01 = this.matrix[1]; + let a02 = this.matrix[2]; + let a03 = this.matrix[3]; + let a10 = this.matrix[4]; + let a11 = this.matrix[5]; + let a12 = this.matrix[6]; + let a13 = this.matrix[7]; + let a20 = this.matrix[8]; + let a21 = this.matrix[9]; + let a22 = this.matrix[10]; + let a23 = this.matrix[11]; + let a30 = this.matrix[12]; + let a31 = this.matrix[13]; + let a32 = this.matrix[14]; + let a33 = this.matrix[15]; + + let b00 = a00 * a11 - a01 * a10; + let b01 = a00 * a12 - a02 * a10; + let b02 = a00 * a13 - a03 * a10; + let b03 = a01 * a12 - a02 * a11; + let b04 = a01 * a13 - a03 * a11; + let b05 = a02 * a13 - a03 * a12; + let b06 = a20 * a31 - a21 * a30; + let b07 = a20 * a32 - a22 * a30; + let b08 = a20 * a33 - a23 * a30; + let b09 = a21 * a32 - a22 * a31; + let b10 = a21 * a33 - a23 * a31; + let b11 = a22 * a33 - a23 * a32; + + let determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + return determinant; + } + + Invert () + { + let a00 = this.matrix[0]; + let a01 = this.matrix[1]; + let a02 = this.matrix[2]; + let a03 = this.matrix[3]; + let a10 = this.matrix[4]; + let a11 = this.matrix[5]; + let a12 = this.matrix[6]; + let a13 = this.matrix[7]; + let a20 = this.matrix[8]; + let a21 = this.matrix[9]; + let a22 = this.matrix[10]; + let a23 = this.matrix[11]; + let a30 = this.matrix[12]; + let a31 = this.matrix[13]; + let a32 = this.matrix[14]; + let a33 = this.matrix[15]; + + let b00 = a00 * a11 - a01 * a10; + let b01 = a00 * a12 - a02 * a10; + let b02 = a00 * a13 - a03 * a10; + let b03 = a01 * a12 - a02 * a11; + let b04 = a01 * a13 - a03 * a11; + let b05 = a02 * a13 - a03 * a12; + let b06 = a20 * a31 - a21 * a30; + let b07 = a20 * a32 - a22 * a30; + let b08 = a20 * a33 - a23 * a30; + let b09 = a21 * a32 - a22 * a31; + let b10 = a21 * a33 - a23 * a31; + let b11 = a22 * a33 - a23 * a32; + + let determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + if (OV.IsEqual (determinant, 0.0)) { + return null; + } + + let result = [ + (a11 * b11 - a12 * b10 + a13 * b09) / determinant, + (a02 * b10 - a01 * b11 - a03 * b09) / determinant, + (a31 * b05 - a32 * b04 + a33 * b03) / determinant, + (a22 * b04 - a21 * b05 - a23 * b03) / determinant, + (a12 * b08 - a10 * b11 - a13 * b07) / determinant, + (a00 * b11 - a02 * b08 + a03 * b07) / determinant, + (a32 * b02 - a30 * b05 - a33 * b01) / determinant, + (a20 * b05 - a22 * b02 + a23 * b01) / determinant, + (a10 * b10 - a11 * b08 + a13 * b06) / determinant, + (a01 * b08 - a00 * b10 - a03 * b06) / determinant, + (a30 * b04 - a31 * b02 + a33 * b00) / determinant, + (a21 * b02 - a20 * b04 - a23 * b00) / determinant, + (a11 * b07 - a10 * b09 - a12 * b06) / determinant, + (a00 * b09 - a01 * b07 + a02 * b06) / determinant, + (a31 * b01 - a30 * b03 - a32 * b00) / determinant, + (a20 * b03 - a21 * b01 + a22 * b00) / determinant + ]; + + return new OV.Matrix (result); + } + + MultiplyVector (vector) + { + let a00 = vector[0]; + let a01 = vector[1]; + let a02 = vector[2]; + let a03 = vector[3]; + + let b00 = this.matrix[0]; + let b01 = this.matrix[1]; + let b02 = this.matrix[2]; + let b03 = this.matrix[3]; + let b10 = this.matrix[4]; + let b11 = this.matrix[5]; + let b12 = this.matrix[6]; + let b13 = this.matrix[7]; + let b20 = this.matrix[8]; + let b21 = this.matrix[9]; + let b22 = this.matrix[10]; + let b23 = this.matrix[11]; + let b30 = this.matrix[12]; + let b31 = this.matrix[13]; + let b32 = this.matrix[14]; + let b33 = this.matrix[15]; + + let result = [ + a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30, + a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31, + a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32, + a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33 + ]; + return result; + } + + MultiplyMatrix (matrix) + { + let a00 = this.matrix[0]; + let a01 = this.matrix[1]; + let a02 = this.matrix[2]; + let a03 = this.matrix[3]; + let a10 = this.matrix[4]; + let a11 = this.matrix[5]; + let a12 = this.matrix[6]; + let a13 = this.matrix[7]; + let a20 = this.matrix[8]; + let a21 = this.matrix[9]; + let a22 = this.matrix[10]; + let a23 = this.matrix[11]; + let a30 = this.matrix[12]; + let a31 = this.matrix[13]; + let a32 = this.matrix[14]; + let a33 = this.matrix[15]; + + let b00 = matrix.matrix[0]; + let b01 = matrix.matrix[1]; + let b02 = matrix.matrix[2]; + let b03 = matrix.matrix[3]; + let b10 = matrix.matrix[4]; + let b11 = matrix.matrix[5]; + let b12 = matrix.matrix[6]; + let b13 = matrix.matrix[7]; + let b20 = matrix.matrix[8]; + let b21 = matrix.matrix[9]; + let b22 = matrix.matrix[10]; + let b23 = matrix.matrix[11]; + let b30 = matrix.matrix[12]; + let b31 = matrix.matrix[13]; + let b32 = matrix.matrix[14]; + let b33 = matrix.matrix[15]; + + let result = [ + a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30, + a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31, + a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32, + a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33, + a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30, + a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31, + a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32, + a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33, + a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30, + a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31, + a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32, + a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33, + a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30, + a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31, + a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32, + a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33 + ]; + + return new OV.Matrix (result); + } +}; diff --git a/source/geometry/transformation.js b/source/geometry/transformation.js new file mode 100644 index 0000000..558aaf4 --- /dev/null +++ b/source/geometry/transformation.js @@ -0,0 +1,41 @@ +OV.Transformation = class +{ + constructor (matrix) + { + if (matrix !== undefined && matrix !== null) { + this.matrix = matrix; + } else { + this.matrix = new OV.Matrix (); + this.matrix.CreateIdentity (); + } + } + + SetMatrix (matrix) + { + this.matrix = matrix; + return this; + } + + GetMatrix () + { + return this.matrix; + } + + IsIdentity () + { + return this.matrix.IsIdentity (); + } + + AppendMatrix (matrix) + { + this.matrix = this.matrix.MultiplyMatrix (matrix); + return this; + } + + TransformCoord3D (coord) + { + let resultVector = this.matrix.MultiplyVector ([coord.x, coord.y, coord.z, 1.0]); + let result = new OV.Coord3D (resultVector[0], resultVector[1], resultVector[2]); + return result; + } +}; diff --git a/source/geometry/tween.js b/source/geometry/tween.js new file mode 100644 index 0000000..f212826 --- /dev/null +++ b/source/geometry/tween.js @@ -0,0 +1,29 @@ +OV.BezierTweenFunction = function (distance, index, count) +{ + let t = index / count; + return distance * (t * t * (3.0 - 2.0 * t)); +}; + +OV.LinearTweenFunction = function (distance, index, count) +{ + return index * distance / count; +}; + +OV.ParabolicTweenFunction = function (distance, index, count) +{ + let t = index / count; + let t2 = t * t; + return distance * (t2 / (2.0 * (t2 - t) + 1.0)); +}; + +OV.TweenCoord3D = function (a, b, count, tweenFunc) +{ + let dir = OV.SubCoord3D (b, a).Normalize (); + let distance = OV.CoordDistance3D (a, b); + let result = []; + for (let i = 0; i < count; i++) { + let step = tweenFunc (distance, i, count - 1); + result.push (a.Clone ().Offset (dir, step)); + } + return result; +}; diff --git a/source/import/importer.js b/source/import/importer.js new file mode 100644 index 0000000..d8ab5a5 --- /dev/null +++ b/source/import/importer.js @@ -0,0 +1,354 @@ +OV.File = class +{ + constructor (file, source) + { + this.source = source; + if (source === OV.FileSource.Url) { + this.fileUrl = file; + this.fileObject = null; + this.name = OV.GetFileName (file); + this.extension = OV.GetFileExtension (file); + } else if (source === OV.FileSource.File) { + this.fileUrl = null; + this.fileObject = file; + this.name = OV.GetFileName (file.name); + this.extension = OV.GetFileExtension (file.name); + } + this.content = null; + } +}; + +OV.FileList = class +{ + constructor (importers) + { + this.files = []; + this.importers = importers; + } + + FillFromFileUrls (fileList) + { + this.Fill (fileList, OV.FileSource.Url); + } + + FillFromFileObjects (fileList) + { + this.Fill (fileList, OV.FileSource.File); + } + + ExtendFromFileList (files) + { + for (let i = 0; i < files.length; i++) { + let file = files[i]; + if (!this.ContainsFileByPath (file.name)) { + this.files.push (file); + } + } + } + + GetFiles () + { + return this.files; + } + + GetContent (onReady) + { + let obj = this; + let taskRunner = new OV.TaskRunner (); + taskRunner.Run (this.files.length, { + runTask : function (index, complete) { + obj.GetFileContent (obj.files[index], complete); + }, + onReady : onReady + }); + } + + ContainsFileByPath (filePath) + { + return this.FindFileByPath (filePath) !== null; + } + + FindFileByPath (filePath) + { + let fileName = OV.GetFileName (filePath).toLowerCase (); + for (let fileIndex = 0; fileIndex < this.files.length; fileIndex++) { + let file = this.files[fileIndex]; + if (file.name.toLowerCase () === fileName) { + return file; + } + } + return null; + } + + HasMainFile () + { + return this.GetMainFile () !== null; + } + + GetMainFile () + { + for (let fileIndex = 0; fileIndex < this.files.length; fileIndex++) { + let file = this.files[fileIndex]; + let importer = this.FindImporter (file); + if (importer !== null) { + return { + file : file, + importer : importer + }; + } + } + return null; + } + + IsOnlySource (source) + { + if (this.files.length === 0) { + return false; + } + for (let i = 0; i < this.files.length; i++) { + let file = this.files[i]; + if (file.source !== source) { + return false; + } + } + return true; + } + + Fill (fileList, fileSource) + { + this.files = []; + for (let fileIndex = 0; fileIndex < fileList.length; fileIndex++) { + let fileObject = fileList[fileIndex]; + let file = new OV.File (fileObject, fileSource); + this.AddFile (file); + } + } + + AddFile (file) + { + this.files.push (file); + } + + GetFileContent (file, complete) + { + let callbacks = { + success : function (content) { + file.content = content; + }, + error : function () { + + }, + complete : function () { + complete (); + } + }; + if (file.content !== null) { + complete (); + return; + } + let format = this.GetFileFormat (file); + if (file.source === OV.FileSource.Url) { + OV.RequestUrl (file.fileUrl, format, callbacks); + } else if (file.source === OV.FileSource.File) { + OV.ReadFile (file.fileObject, format, callbacks); + } + } + + GetFileFormat (file) + { + for (let importerIndex = 0; importerIndex < this.importers.length; importerIndex++) { + let importer = this.importers[importerIndex]; + let extension = file.extension.toLowerCase (); + let knownFormats = importer.GetKnownFileFormats (); + if (knownFormats[extension] !== undefined) { + return knownFormats[extension]; + } + } + return OV.FileFormat.Binary; + } + + FindImporter (file) + { + for (let importerIndex = 0; importerIndex < this.importers.length; importerIndex++) { + let importer = this.importers[importerIndex]; + if (importer.CanImportExtension (file.extension.toLowerCase ())) { + return importer; + } + } + return null; + } +}; + +OV.ImporterErrorCode = +{ + NoImportableFile : 1, + ImportFailed : 2, + UnknownError : 3 +}; + +OV.ImporterError = class +{ + constructor (code, message) + { + this.code = code; + this.message = message; + } +}; + +OV.ImportResult = class +{ + constructor () + { + this.model = null; + this.mainFile = null; + this.upVector = null; + this.usedFiles = []; + this.missingFiles = []; + } +}; + +OV.Importer = class +{ + constructor () + { + this.importers = [ + new OV.ImporterObj (), + new OV.ImporterStl (), + new OV.ImporterOff (), + new OV.ImporterPly (), + new OV.Importer3ds (), + new OV.ImporterGltf () + ]; + this.fileList = new OV.FileList (this.importers); + this.missingFiles = []; + } + + LoadFilesFromUrls (fileList, onReady) + { + this.LoadFiles (fileList, OV.FileSource.Url, onReady); + } + + LoadFilesFromFileObjects (fileList, onReady) + { + this.LoadFiles (fileList, OV.FileSource.File, onReady); + } + + Import (callbacks) + { + let mainFile = this.fileList.GetMainFile (); + if (mainFile === null || mainFile.file.content === null) { + callbacks.error (new OV.ImporterError (OV.ImporterErrorCode.NoImportableFile, null)); + return; + } + + let result = new OV.ImportResult (); + result.mainFile = mainFile.file.name; + result.usedFiles.push (mainFile.file.name); + + let fileNameToContent = {}; + let textureNameToUrl = {}; + + let obj = this; + let importer = mainFile.importer; + importer.Import (mainFile.file.content, mainFile.file.extension, { + getDefaultMaterial : function () { + let material = new OV.Material (); + material.diffuse = new OV.Color (200, 200, 200); + return material; + }, + getFileContent : function (filePath) { + let fileName = OV.GetFileName (filePath); + let fileContent = fileNameToContent[fileName]; + if (fileContent === undefined) { + let file = obj.fileList.FindFileByPath (filePath); + if (file === null || file.content === null) { + result.missingFiles.push (fileName); + obj.missingFiles.push (fileName); + fileContent = null; + } else { + result.usedFiles.push (fileName); + fileContent = file.content; + } + fileNameToContent[fileName] = fileContent; + } + return fileContent; + }, + getTextureObjectUrl : function (filePath) { + let fileName = OV.GetFileName (filePath); + let textureUrl = textureNameToUrl[fileName]; + if (textureUrl === undefined) { + let file = obj.fileList.FindFileByPath (filePath); + if (file === null || file.content === null) { + result.missingFiles.push (fileName); + obj.missingFiles.push (fileName); + textureUrl = null; + } else { + result.usedFiles.push (fileName); + let blob = new Blob ([file.content]); + let blobURL = URL.createObjectURL (blob); + textureUrl = blobURL; + } + textureNameToUrl[fileName] = textureUrl; + } + return textureUrl; + } + }); + + if (importer.IsError ()) { + let message = importer.GetMessage (); + callbacks.error (new OV.ImporterError (OV.ImporterErrorCode.ImportFailed, message)); + return; + } + + result.model = importer.GetModel (); + result.model.SetName (mainFile.file.name); + result.upVector = importer.GetUpDirection (); + callbacks.success (result); + } + + LoadFiles (fileList, fileSource, onReady) + { + let newFileList = new OV.FileList (this.importers); + if (fileSource === OV.FileSource.Url) { + newFileList.FillFromFileUrls (fileList); + } else if (fileSource === OV.FileSource.File) { + newFileList.FillFromFileObjects (fileList); + } + let reset = false; + if (newFileList.HasMainFile ()) { + reset = true; + } else { + let foundMissingFile = false; + for (let i = 0; i < this.missingFiles.length; i++) { + let missingFile = this.missingFiles[i]; + if (newFileList.ContainsFileByPath (missingFile)) { + foundMissingFile = true; + } + } + if (!foundMissingFile) { + reset = true; + } else { + let newFiles = newFileList.GetFiles (); + this.fileList.ExtendFromFileList (newFiles); + reset = false; + } + } + if (reset) { + this.fileList = newFileList; + } + this.missingFiles = []; + this.fileList.GetContent (function () { + onReady (); + }); + } + + GetFileList () + { + return this.fileList; + } + + IsOnlyFileSource (source) + { + return this.fileList.IsOnlySource (source); + } +}; diff --git a/source/import/importer3ds.js b/source/import/importer3ds.js new file mode 100644 index 0000000..cdde82b --- /dev/null +++ b/source/import/importer3ds.js @@ -0,0 +1,679 @@ +OV.CHUNK3DS = +{ + MAIN3DS : 0x4D4D, + EDIT3DS : 0x3D3D, + EDIT_MATERIAL : 0xAFFF, + MAT_NAME : 0xA000, + MAT_AMBIENT : 0xA010, + MAT_DIFFUSE : 0xA020, + MAT_SPECULAR : 0xA030, + MAT_SHININESS : 0xA040, + MAT_SHININESS_STRENGTH : 0xA041, + MAT_TRANSPARENCY : 0xA050, + MAT_COLOR_F : 0x0010, + MAT_COLOR : 0x0011, + MAT_LIN_COLOR : 0x0012, + MAT_LIN_COLOR_F : 0x0013, + MAT_TEXMAP : 0xA200, + MAT_TEXMAP_NAME : 0xA300, + MAT_TEXMAP_UOFFSET : 0xA358, + MAT_TEXMAP_VOFFSET : 0xA35A, + MAT_TEXMAP_USCALE : 0xA354, + MAT_TEXMAP_VSCALE : 0xA356, + MAT_TEXMAP_ROTATION : 0xA35C, + PERCENTAGE : 0x0030, + PERCENTAGE_F : 0x0031, + EDIT_OBJECT : 0x4000, + OBJ_TRIMESH : 0x4100, + OBJ_LIGHT : 0x4600, + OBJ_CAMERA : 0x4700, + TRI_VERTEX : 0x4110, + TRI_TEXVERTEX : 0x4140, + TRI_FACE : 0x4120, + TRI_TRANSFORMATION : 0x4160, + TRI_MATERIAL : 0x4130, + TRI_SMOOTH : 0x4150, + KF3DS : 0xB000, + OBJECT_NODE : 0xB002, + OBJECT_HIERARCHY : 0xB010, + OBJECT_INSTANCE_NAME : 0xB011, + OBJECT_PIVOT : 0xB013, + OBJECT_POSITION : 0xB020, + OBJECT_ROTATION : 0xB021, + OBJECT_SCALE : 0xB022, + OBJECT_ID : 0xB030 +}; + +OV.Importer3ds = class extends OV.ImporterBase +{ + constructor () + { + super (); + + this.materialNameToIndex = null; + this.meshNameToIndex = null; + + this.meshTransformations = null; + this.defaultMaterialIndex = null; + } + + ResetState () + { + this.materialNameToIndex = {}; + this.meshNameToIndex = {}; + + this.meshTransformations = []; + this.defaultMaterialIndex = null; + } + + CanImportExtension (extension) + { + return extension === '3ds'; + } + + GetKnownFileFormats () + { + return { + '3ds' : OV.FileFormat.Binary + }; + } + + GetUpDirection () + { + return OV.Direction.Z; + } + + ImportContent (fileContent) + { + this.ProcessBinary (fileContent); + } + + ProcessBinary (fileContent) + { + let obj = this; + let reader = new OV.BinaryReader (fileContent, true); + let endByte = reader.GetByteLength (); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.MAIN3DS) { + obj.ReadMainChunk (reader, chunkLength); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + } + + ReadMainChunk (reader, length) + { + let obj = this; + let endByte = this.GetChunkEnd (reader, length); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.EDIT3DS) { + obj.ReadEditorChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.KF3DS) { + obj.ReadKeyFrameChunk (reader, chunkLength); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + } + + ReadEditorChunk (reader, length) + { + let obj = this; + let endByte = this.GetChunkEnd (reader, length); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.EDIT_MATERIAL) { + obj.ReadMaterialChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.EDIT_OBJECT) { + obj.ReadObjectChunk (reader, chunkLength); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + } + + ReadMaterialChunk (reader, length) + { + let obj = this; + let material = new OV.Material (); + let endByte = this.GetChunkEnd (reader, length); + let shininess = null; + let shininessStrength = null; + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.MAT_NAME) { + material.name = obj.ReadName (reader); + } else if (chunkId === OV.CHUNK3DS.MAT_AMBIENT) { + material.ambient = obj.ReadColorChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.MAT_DIFFUSE) { + material.diffuse = obj.ReadColorChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.MAT_SPECULAR) { + material.specular = obj.ReadColorChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.MAT_SHININESS) { + shininess = obj.ReadPercentageChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.MAT_SHININESS_STRENGTH) { + shininessStrength = obj.ReadPercentageChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.MAT_TRANSPARENCY) { + material.opacity = 1.0 - obj.ReadPercentageChunk (reader, chunkLength); + material.transparent = OV.IsLower (material.opacity, 1.0); + } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP) { + material.diffuseMap = obj.ReadTextureMapChunk (reader, chunkLength); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + + if (shininess !== null || shininessStrength !== null) { + material.shininess = shininess * shininessStrength; + } + let materialIndex = this.model.AddMaterial (material); + this.materialNameToIndex[material.name] = materialIndex; + } + + ReadTextureMapChunk (reader, length) + { + let obj = this; + let texture = new OV.TextureMap (); + let endByte = this.GetChunkEnd (reader, length); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_NAME) { + let textureName = obj.ReadName (reader); + let textureObjectUrl = obj.callbacks.getTextureObjectUrl (textureName); + texture.name = textureName; + texture.url = textureObjectUrl; + } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_UOFFSET) { + texture.offset.x = reader.ReadFloat32 (); + } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_VOFFSET) { + texture.offset.y = reader.ReadFloat32 (); + } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_USCALE) { + texture.scale.x = reader.ReadFloat32 (); + } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_VSCALE) { + texture.scale.y = reader.ReadFloat32 (); + } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_ROTATION) { + texture.rotation = reader.ReadFloat32 () * OV.DegRad; + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + return texture; + } + + ReadColorChunk (reader, length) + { + let obj = this; + let color = new OV.Color (0, 0, 0); + let endByte = this.GetChunkEnd (reader, length); + let hasLinColor = false; + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.MAT_COLOR) { + if (!hasLinColor) { + color.r = reader.ReadUnsignedCharacter8 (); + color.g = reader.ReadUnsignedCharacter8 (); + color.b = reader.ReadUnsignedCharacter8 (); + } + } else if (chunkId === OV.CHUNK3DS.MAT_LIN_COLOR) { + color.r = reader.ReadUnsignedCharacter8 (); + color.g = reader.ReadUnsignedCharacter8 (); + color.b = reader.ReadUnsignedCharacter8 (); + hasLinColor = true; + } else if (chunkId === OV.CHUNK3DS.MAT_COLOR_F) { + if (!hasLinColor) { + color.r = parseInt (reader.ReadFloat32 () * 255.0, 10); + color.g = parseInt (reader.ReadFloat32 () * 255.0, 10); + color.b = parseInt (reader.ReadFloat32 () * 255.0, 10); + } + } else if (chunkId === OV.CHUNK3DS.MAT_LIN_COLOR_F) { + color.r = parseInt (reader.ReadFloat32 () * 255.0, 10); + color.g = parseInt (reader.ReadFloat32 () * 255.0, 10); + color.b = parseInt (reader.ReadFloat32 () * 255.0, 10); + hasLinColor = true; + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + return color; + } + + ReadPercentageChunk (reader, length) + { + let obj = this; + let percentage = 0.0; + let endByte = this.GetChunkEnd (reader, length); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.PERCENTAGE) { + percentage = reader.ReadUnsignedInteger16 () / 100.0; + } else if (chunkId === OV.CHUNK3DS.PERCENTAGE_F) { + percentage = reader.ReadFloat32 (); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + return percentage; + } + + ReadObjectChunk (reader, length) + { + let obj = this; + let endByte = this.GetChunkEnd (reader, length); + let objectName = this.ReadName (reader); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.OBJ_TRIMESH) { + obj.ReadMeshChunk (reader, chunkLength, objectName); + } else if (chunkId === OV.CHUNK3DS.OBJ_LIGHT) { + obj.SkipChunk (reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.OBJ_CAMERA) { + obj.SkipChunk (reader, chunkLength); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + } + + ReadMeshChunk (reader, length, objectName) + { + let obj = this; + + let mesh = new OV.Mesh (); + mesh.SetName (objectName); + + let endByte = this.GetChunkEnd (reader, length); + let transformation = null; + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.TRI_VERTEX) { + obj.ReadVerticesChunk (mesh, reader); + } else if (chunkId === OV.CHUNK3DS.TRI_TEXVERTEX) { + obj.ReadTextureVerticesChunk (mesh, reader); + } else if (chunkId === OV.CHUNK3DS.TRI_FACE) { + obj.ReadFacesChunk (mesh, reader, chunkLength); + } else if (chunkId === OV.CHUNK3DS.TRI_TRANSFORMATION) { + transformation = obj.ReadTransformationChunk (reader); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + + if (mesh.VertexCount () === mesh.TextureUVCount ()) { + for (let i = 0; i < mesh.TriangleCount (); i++) { + let triangle = mesh.GetTriangle (i); + triangle.SetTextureUVs ( + triangle.v0, + triangle.v1, + triangle.v2 + ); + } + } + + let meshIndex = this.model.AddMesh (mesh); + this.meshNameToIndex[mesh.GetName ()] = meshIndex; + this.meshTransformations.push (new OV.Matrix (transformation)); + } + + ReadVerticesChunk (mesh, reader) + { + let vertexCount = reader.ReadUnsignedInteger16 (); + for (let i = 0; i < vertexCount; i++) { + let x = reader.ReadFloat32 (); + let y = reader.ReadFloat32 (); + let z = reader.ReadFloat32 (); + mesh.AddVertex (new OV.Coord3D (x, y, z)); + } + } + + ReadTextureVerticesChunk (mesh, reader) + { + let texVertexCount = reader.ReadUnsignedInteger16 (); + for (let i = 0; i < texVertexCount; i++) { + let x = reader.ReadFloat32 (); + let y = reader.ReadFloat32 (); + mesh.AddTextureUV (new OV.Coord2D (x, y)); + } + } + + ReadFacesChunk (mesh, reader, length) + { + let endByte = this.GetChunkEnd (reader, length); + let faceCount = reader.ReadUnsignedInteger16 (); + for (let i = 0; i < faceCount; i++) { + let v0 = reader.ReadUnsignedInteger16 (); + let v1 = reader.ReadUnsignedInteger16 (); + let v2 = reader.ReadUnsignedInteger16 (); + let flags = reader.ReadUnsignedInteger16 (); + mesh.AddTriangle (new OV.Triangle (v0, v1, v2)); + } + + let obj = this; + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.TRI_MATERIAL) { + obj.ReadFaceMaterialsChunk (mesh, reader); + } else if (chunkId === OV.CHUNK3DS.TRI_SMOOTH) { + obj.ReadFaceSmoothingGroupsChunk (mesh, faceCount, reader); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + } + + ReadFaceMaterialsChunk (mesh, reader) + { + let materialName = this.ReadName (reader); + let materialIndex = this.materialNameToIndex[materialName]; + let faceCount = reader.ReadUnsignedInteger16 (); + for (let i = 0; i < faceCount; i++) { + let faceIndex = reader.ReadUnsignedInteger16 (); + let triangle = mesh.GetTriangle (faceIndex); + if (materialIndex !== undefined) { + triangle.mat = materialIndex; + } + } + } + + ReadFaceSmoothingGroupsChunk (mesh, faceCount, reader) + { + for (let i = 0; i < faceCount; i++) { + let smoothingGroup = reader.ReadUnsignedInteger32 (); + let triangle = mesh.GetTriangle (i); + triangle.curve = smoothingGroup; + } + } + + ReadTransformationChunk (reader) + { + let matrix = []; + for (let i = 0; i < 4; i++) { + for (let j = 0; j < 3; j++) { + matrix.push (reader.ReadFloat32 ()); + } + if (i < 3) { + matrix.push (0); + } else { + matrix.push (1); + } + } + return matrix; + } + + ReadKeyFrameChunk (reader, length) + { + let nodeHierarchy = { + nodes : [], + idToIndex : {}, + meshIndexToNodes : {} + }; + + let endByte = this.GetChunkEnd (reader, length); + let obj = this; + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.OBJECT_NODE) { + obj.ReadObjectNodeChunk (nodeHierarchy, reader, chunkLength); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + + this.ApplyModelTransformations (nodeHierarchy); + } + + ApplyModelTransformations (nodeHierarchy) + { + function GetNodeTransformation (nodeHierarchy, node) + { + function GetNodePosition (node) + { + if (node.positions.length === 0) { + return [0.0, 0.0, 0.0]; + } + return node.positions[0]; + } + + function GetNodeRotation (node) + { + function GetQuaternionFromAxisAndAngle (rotation) + { + let result = [0.0, 0.0, 0.0, 1.0]; + let length = Math.sqrt (rotation[0] * rotation[0] + rotation[1] * rotation[1] + rotation[2] * rotation[2]); + if (length > 0.0) { + let omega = rotation[3] * -0.5; + let si = Math.sin (omega) / length; + result = [si * rotation[0], si * rotation[1], si * rotation[2], Math.cos (omega)]; + } + return result; + } + + if (node.rotations.length === 0) { + return [0.0, 0.0, 0.0, 1.0]; + } + + let rotation = node.rotations[0]; + return GetQuaternionFromAxisAndAngle (rotation); + } + + function GetNodeScale (node) + { + if (node.scales.length === 0) { + return [1.0, 1.0, 1.0]; + } + return node.scales[0]; + } + + if (node.matrix !== null) { + return node.matrix; + } + + let matrix = new OV.Matrix (); + matrix.ComposeTRS ( + GetNodePosition (node), + GetNodeRotation (node), + GetNodeScale (node) + ); + + if (node.userId !== 65535) { + let parentIndex = nodeHierarchy.idToIndex[node.userId]; + if (parentIndex !== undefined) { + let parentNode = nodeHierarchy.nodes[parentIndex]; + let parentMatrix = GetNodeTransformation (nodeHierarchy, parentNode); + matrix = matrix.MultiplyMatrix (parentMatrix); + } + } + + node.matrix = matrix; + return matrix; + } + + function ApplyMeshTransformation (model, currentMeshIndex, meshMatrix, nodeHierarchy, node) + { + function GetNodePivotPoint (node) + { + if (node === null) { + return [0.0, 0.0, 0.0]; + } + return node.pivot; + } + + if (!meshMatrix.IsValid ()) { + return; + } + + let nodeMatrix = meshMatrix; + if (node !== null) { + nodeMatrix = GetNodeTransformation (nodeHierarchy, node); + } + + let determinant = meshMatrix.Determinant (); + if (OV.IsNegative (determinant)) { + // Mirror by x coordinates + let scaleMatrix = new OV.Matrix ().CreateScale (-1.0, 1.0, 1.0); + meshMatrix = scaleMatrix.MultiplyMatrix (meshMatrix); + } + + let invMeshMatrix = meshMatrix.Invert (); + if (invMeshMatrix === null) { + return; + } + + let pivotPoint = GetNodePivotPoint (node); + let pivotMatrix = new OV.Matrix ().CreateTranslation (-pivotPoint[0], -pivotPoint[1], -pivotPoint[2]); + + let matrix = nodeMatrix.Clone (); + matrix = pivotMatrix.MultiplyMatrix (matrix); + matrix = invMeshMatrix.MultiplyMatrix (matrix); + + let transformation = new OV.Transformation (matrix); + let mesh = model.GetMesh (currentMeshIndex); + OV.TransformMesh (mesh, transformation); + } + + function AddDuplicatedMesh (model, meshIndex, toIndex) + { + let mesh = model.GetMesh (meshIndex); + let clonedMesh = OV.CloneMesh (mesh); + let clonedMeshIndex = model.AddMeshToIndex (clonedMesh, toIndex); + return clonedMeshIndex; + } + + let newToOldMeshIndexOffset = 0; + for (let meshIndex = 0; meshIndex < this.model.MeshCount (); meshIndex++) { + let currentMeshIndex = meshIndex; + let originalMeshIndex = currentMeshIndex - newToOldMeshIndexOffset; + let meshTransformation = this.meshTransformations[originalMeshIndex]; + let meshNodes = nodeHierarchy.meshIndexToNodes[originalMeshIndex]; + if (meshNodes === undefined) { + ApplyMeshTransformation (this.model, currentMeshIndex, meshTransformation, nodeHierarchy, null); + } else { + for (let nodeIndex = 0; nodeIndex < meshNodes.length; nodeIndex++) { + let currentNode = meshNodes[nodeIndex]; + let transformedMeshIndex = currentMeshIndex; + if (nodeIndex > 0) { + transformedMeshIndex = AddDuplicatedMesh (this.model, currentMeshIndex, currentMeshIndex + nodeIndex); + newToOldMeshIndexOffset += 1; + meshIndex += 1; + } + ApplyMeshTransformation (this.model, transformedMeshIndex, meshTransformation, nodeHierarchy, currentNode); + } + } + } + } + + ReadObjectNodeChunk (nodeHierarchy, reader, length) + { + function ReadTrackVector (obj, reader, type) + { + let result = []; + reader.Skip (10); + + let keyNum = reader.ReadInteger32 (); + for (let i = 0; i < keyNum; i++) { + reader.ReadInteger32 (); + let flags = reader.ReadUnsignedInteger16 (); + if (flags !== 0) { + reader.ReadFloat32 (); + } + + let current = null; + if (type === OV.CHUNK3DS.OBJECT_ROTATION) { + let tmp = reader.ReadFloat32 (); + current = obj.ReadVector (reader); + current[3] = tmp; + } else { + current = obj.ReadVector (reader); + } + result.push (current); + } + + return result; + } + + let objectNode = { + name : '', + instanceName : '', + nodeId : -1, + flags : -1, + userId : -1, + pivot : [0.0, 0.0, 0.0], + positions : [], + rotations : [], + scales : [], + matrix : null + }; + + let obj = this; + let endByte = this.GetChunkEnd (reader, length); + this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { + if (chunkId === OV.CHUNK3DS.OBJECT_HIERARCHY) { + objectNode.name = obj.ReadName (reader); + objectNode.flags = reader.ReadUnsignedInteger32 (); + objectNode.userId = reader.ReadUnsignedInteger16 (); + } else if (chunkId === OV.CHUNK3DS.OBJECT_INSTANCE_NAME) { + objectNode.instanceName = obj.ReadName (reader); + } else if (chunkId === OV.CHUNK3DS.OBJECT_PIVOT) { + objectNode.pivot = obj.ReadVector (reader); + } else if (chunkId === OV.CHUNK3DS.OBJECT_POSITION) { + objectNode.positions = ReadTrackVector (obj, reader, OV.CHUNK3DS.OBJECT_POSITION); + } else if (chunkId === OV.CHUNK3DS.OBJECT_ROTATION) { + objectNode.rotations = ReadTrackVector (obj, reader, OV.CHUNK3DS.OBJECT_ROTATION); + } else if (chunkId === OV.CHUNK3DS.OBJECT_SCALE) { + objectNode.scales = ReadTrackVector (obj, reader, OV.CHUNK3DS.OBJECT_SCALE); + } else if (chunkId === OV.CHUNK3DS.OBJECT_ID) { + objectNode.nodeId = reader.ReadUnsignedInteger16 (); + } else { + obj.SkipChunk (reader, chunkLength); + } + }); + + let nodeIndex = nodeHierarchy.nodes.length; + nodeHierarchy.nodes.push (objectNode); + nodeHierarchy.idToIndex[objectNode.nodeId] = nodeIndex; + + let meshIndex = this.meshNameToIndex[objectNode.name]; + if (meshIndex !== undefined) { + let meshNodes = nodeHierarchy.meshIndexToNodes[meshIndex]; + if (meshNodes === undefined) { + nodeHierarchy.meshIndexToNodes[meshIndex] = []; + } + nodeHierarchy.meshIndexToNodes[meshIndex].push (objectNode); + } + } + + ReadName (reader) + { + let name = ''; + let char = 0; + let count = 0; + while (count < 64) { + char = reader.ReadCharacter8 (); + if (char === 0) { + break; + } + name = name + String.fromCharCode (char); + count = count + 1; + } + return name; + } + + ReadVector (reader) + { + let result = [ + reader.ReadFloat32 (), + reader.ReadFloat32 (), + reader.ReadFloat32 () + ]; + return result; + } + + ReadChunks (reader, endByte, onChunk) + { + while (reader.GetPosition () <= endByte - 6) { + let chunkId = reader.ReadUnsignedInteger16 (); + let chunkLength = reader.ReadUnsignedInteger32 (); + onChunk (chunkId, chunkLength); + } + } + + GetChunkEnd (reader, length) + { + return reader.GetPosition () + length - 6; + } + + SkipChunk (reader, length) + { + reader.Skip (length - 6); + } +}; diff --git a/source/import/importerbase.js b/source/import/importerbase.js new file mode 100644 index 0000000..3729961 --- /dev/null +++ b/source/import/importerbase.js @@ -0,0 +1,83 @@ +OV.ImporterBase = class +{ + constructor () + { + this.extension = null; + this.callbacks = null; + this.model = null; + this.error = null; + this.message = null; + } + + Import (content, extension, callbacks) + { + this.extension = extension; + this.callbacks = callbacks; + this.model = new OV.Model (); + this.error = false; + this.message = null; + + this.ResetState (); + this.ImportContent (content); + if (this.error) { + return; + } + + if (OV.IsModelEmpty (this.model)) { + this.error = true; + return; + } + + OV.FinalizeModel (this.model, this.callbacks.getDefaultMaterial); + } + + ResetState () + { + + } + + ImportContent (content) + { + + } + + CanImportExtension (extension) + { + return false; + } + + GetKnownFileFormats () + { + return {}; + } + + GetUpDirection () + { + return OV.Direction.Z; + } + + GetModel () + { + return this.model; + } + + SetError () + { + this.error = true; + } + + IsError () + { + return this.error; + } + + SetMessage (message) + { + this.message = message; + } + + GetMessage () + { + return this.message; + } +}; diff --git a/source/import/importergltf.js b/source/import/importergltf.js new file mode 100644 index 0000000..f8d5017 --- /dev/null +++ b/source/import/importergltf.js @@ -0,0 +1,899 @@ +OV.GltfComponentType = +{ + BYTE : 5120, + UNSIGNED_BYTE : 5121, + SHORT : 5122, + UNSIGNED_SHORT : 5123, + UNSIGNED_INT : 5125, + FLOAT : 5126 +}; + +OV.GltfDataType = +{ + SCALAR : 0, + VEC2 : 1, + VEC3 : 2, + VEC4 : 3, + MAT2 : 4, + MAT3 : 5, + MAT4 : 6 +}; + +OV.GltfRenderMode = +{ + POINTS : 0, + LINES : 1, + LINE_LOOP : 2, + LINE_STRIP : 3, + TRIANGLES : 4, + TRIANGLE_STRIP : 5, + TRIANGLE_FAN : 6 +}; + +OV.GltfConstants = +{ + GLTF_STRING : 0x46546C67, + JSON_CHUNK_TYPE : 0x4E4F534A, + BINARY_CHUNK_TYPE : 0x004E4942 +}; + +OV.GltfNodeTree = class +{ + constructor () + { + this.nodes = []; + this.nodeToParent = {}; + this.nodeMatrices = {}; + } + + AddMeshNode (nodeIndex) + { + this.nodes.push (nodeIndex); + return this.nodes.length - 1; + } + + AddNodeParent (nodeIndex, parentIndex) + { + this.nodeToParent[nodeIndex] = parentIndex; + } + + GetNodeParent (nodeIndex) + { + let parentIndex = this.nodeToParent[nodeIndex]; + if (parentIndex === undefined || parentIndex === -1) { + return null; + } + return parentIndex; + } + + AddNodeMatrix (nodeIndex, matrix) + { + this.nodeMatrices[nodeIndex] = matrix; + } + + GetNodeMatrix (nodeIndex) + { + let matrix = this.nodeMatrices[nodeIndex]; + if (matrix === undefined) { + return null; + } + return matrix; + } +}; + +OV.GltfBufferReader = class +{ + constructor (buffer) + { + this.reader = new OV.BinaryReader (buffer, true); + this.componentType = null; + this.dataType = null; + this.byteStride = null; + this.dataCount = null; + this.sparseReader = null; + } + + SetComponentType (componentType) + { + this.componentType = componentType; + } + + SetDataType (dataType) + { + if (dataType === 'SCALAR') { + this.dataType = OV.GltfDataType.SCALAR; + } else if (dataType === 'VEC2') { + this.dataType = OV.GltfDataType.VEC2; + } else if (dataType === 'VEC3') { + this.dataType = OV.GltfDataType.VEC3; + } else if (dataType === 'VEC4') { + this.dataType = OV.GltfDataType.VEC4; + } else if (dataType === 'MAT2') { + this.dataType = OV.GltfDataType.MAT2; + } else if (dataType === 'MAT3') { + this.dataType = OV.GltfDataType.MAT3; + } else if (dataType === 'MAT4') { + this.dataType = OV.GltfDataType.MAT4; + } + } + + SetByteStride (byteStride) + { + this.byteStride = byteStride; + } + + SetDataCount (dataCount) + { + this.dataCount = dataCount; + } + + SetSparseReader (indexReader, valueReader) + { + this.sparseReader = { + indexReader : indexReader, + valueReader : valueReader + }; + } + + ReadArrayBuffer (byteLength) + { + return this.reader.ReadArrayBuffer (byteLength); + } + + GetDataCount () + { + return this.dataCount; + } + + ReadData () + { + if (this.dataType === null) { + return null; + } + if (this.dataType === OV.GltfDataType.SCALAR) { + let data = this.ReadComponent (); + this.SkipBytesByStride (1); + return data; + } else if (this.dataType === OV.GltfDataType.VEC2) { + let x = this.ReadComponent (); + let y = this.ReadComponent (); + this.SkipBytesByStride (2); + return new OV.Coord2D (x, y); + } else if (this.dataType === OV.GltfDataType.VEC3) { + let x = this.ReadComponent (); + let y = this.ReadComponent (); + let z = this.ReadComponent (); + this.SkipBytesByStride (3); + return new OV.Coord3D (x, y, z); + } + return null; + } + + EnumerateData (onData) + { + if (this.sparseReader === null) { + for (let i = 0; i < this.dataCount; i++) { + onData (this.ReadData ()); + } + } else { + let sparseData = []; + for (let i = 0; i < this.sparseReader.indexReader.GetDataCount (); i++) { + let index = this.sparseReader.indexReader.ReadData (); + let value = this.sparseReader.valueReader.ReadData (); + sparseData.push ({ + index : index, + value : value + }); + } + let sparseIndex = 0; + for (let i = 0; i < this.dataCount; i++) { + let data = this.ReadData (); + if (sparseIndex < sparseData.length && sparseData[sparseIndex].index === i) { + onData (sparseData[sparseIndex].value); + sparseIndex += 1; + } else { + onData (data); + } + } + } + } + + SkipBytes (bytes) + { + this.reader.Skip (bytes); + } + + ReadComponent () + { + if (this.componentType === null) { + return null; + } + if (this.componentType === OV.GltfComponentType.BYTE) { + return this.reader.ReadCharacter8 (); + } else if (this.componentType === OV.GltfComponentType.UNSIGNED_BYTE) { + return this.reader.ReadUnsignedCharacter8 (); + } else if (this.componentType === OV.GltfComponentType.SHORT) { + return this.reader.ReadInteger16 (); + } else if (this.componentType === OV.GltfComponentType.UNSIGNED_SHORT) { + return this.reader.ReadUnsignedInteger16 (); + } else if (this.componentType === OV.GltfComponentType.UNSIGNED_INT) { + return this.reader.ReadInteger32 (); + } else if (this.componentType === OV.GltfComponentType.FLOAT) { + return this.reader.ReadFloat32 (); + } + return null; + } + + SkipBytesByStride (componentCount) + { + if (this.byteStride === null) { + return; + } + let readBytes = componentCount * this.GetComponentSize (); + this.reader.Skip (this.byteStride - readBytes); + } + + GetComponentSize () + { + if (this.componentType === OV.GltfComponentType.BYTE) { + return 1; + } else if (this.componentType === OV.GltfComponentType.UNSIGNED_BYTE) { + return 1; + } else if (this.componentType === OV.GltfComponentType.SHORT) { + return 2; + } else if (this.componentType === OV.GltfComponentType.UNSIGNED_SHORT) { + return 2; + } else if (this.componentType === OV.GltfComponentType.UNSIGNED_INT) { + return 4; + } else if (this.componentType === OV.GltfComponentType.FLOAT) { + return 4; + } + return 0; + } +}; + +OV.GltfExtensions = class +{ + constructor () + { + this.supportedExtensions = [ + 'KHR_materials_pbrSpecularGlossiness', + 'KHR_texture_transform', + ]; + } + + GetUnsupportedExtensions (extensionsRequired) + { + let unsupportedExtensions = []; + if (extensionsRequired === undefined) { + return unsupportedExtensions; + } + for (let i = 0; i < extensionsRequired.length; i++) { + let requiredExtension = extensionsRequired[i]; + if (this.supportedExtensions.indexOf (requiredExtension) === -1) { + unsupportedExtensions.push (requiredExtension); + } + } + return unsupportedExtensions; + } + + ProcessMaterial (gltfMaterial, material, imporTextureFn) + { + function GetMaterialComponent (component) + { + return parseInt (Math.round (OV.LinearToSRGB (component) * 255.0), 10); + } + + if (gltfMaterial.extensions === undefined) { + return; + } + let khrSpecularGlossiness = gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness; + if (khrSpecularGlossiness !== undefined) { + let diffuseColor = khrSpecularGlossiness.diffuseFactor; + if (diffuseColor !== undefined) { + material.diffuse = new OV.Color ( + GetMaterialComponent (diffuseColor[0]), + GetMaterialComponent (diffuseColor[1]), + GetMaterialComponent (diffuseColor[2]) + ); + material.opacity = diffuseColor[3]; + } + let diffuseTexture = khrSpecularGlossiness.diffuseTexture; + if (diffuseTexture !== undefined) { + material.diffuseMap = imporTextureFn (diffuseTexture); + } + let specularColor = khrSpecularGlossiness.specularFactor; + if (specularColor !== undefined) { + material.specular = new OV.Color ( + GetMaterialComponent (specularColor[0]), + GetMaterialComponent (specularColor[1]), + GetMaterialComponent (specularColor[2]) + ); + } + let specularTexture = khrSpecularGlossiness.specularGlossinessTexture; + if (specularTexture !== undefined) { + material.specularMap = imporTextureFn (specularTexture); + } + let glossiness = khrSpecularGlossiness.glossinessFactor; + if (glossiness !== undefined) { + material.shininess = glossiness; + } + } + } + + ProcessTexture (gltfTexture, texture) + { + if (gltfTexture.extensions === undefined) { + return; + } + let khrTextureTransform = gltfTexture.extensions.KHR_texture_transform; + if (khrTextureTransform !== undefined) { + if (khrTextureTransform.offset !== undefined) { + texture.offset.x = khrTextureTransform.offset[0]; + texture.offset.y = -khrTextureTransform.offset[1]; + } + if (khrTextureTransform.scale !== undefined) { + texture.scale.x = khrTextureTransform.scale[0]; + texture.scale.y = khrTextureTransform.scale[1]; + } + if (khrTextureTransform.rotation !== undefined) { + texture.rotation = -khrTextureTransform.rotation; + } + } + } +}; + +OV.ImporterGltf = class extends OV.ImporterBase +{ + constructor () + { + super (); + + this.bufferContents = null; + this.gltfExtensions = null; + } + + ResetState () + { + this.bufferContents = []; + this.gltfExtensions = new OV.GltfExtensions (); + } + + CanImportExtension (extension) + { + return extension === 'gltf' || extension === 'glb'; + } + + GetKnownFileFormats () + { + return { + 'gltf' : OV.FileFormat.Text, + 'glb' : OV.FileFormat.Binary, + 'bin' : OV.FileFormat.Binary + }; + } + + GetUpDirection () + { + return OV.Direction.Y; + } + + ImportContent (fileContent) + { + if (this.extension === 'gltf') { + this.ProcessGltf (fileContent); + } else if (this.extension === 'glb') { + this.ProcessBinaryGltf (fileContent); + } + } + + ProcessGltf (fileContent) + { + let gltf = JSON.parse (fileContent); + if (gltf.asset.version !== '2.0') { + this.SetError (); + this.SetMessage ('Invalid glTF version.'); + return; + } + + for (let i = 0; i < gltf.buffers.length; i++) { + let buffer = null; + let gltfBuffer = gltf.buffers[i]; + let base64Buffer = OV.Base64DataURIToArrayBuffer (gltfBuffer.uri); + if (base64Buffer === null) { + buffer = this.callbacks.getFileContent (gltfBuffer.uri); + } else { + buffer = base64Buffer.buffer; + } + if (buffer === null) { + this.SetError (); + this.SetMessage ('One of the requested buffers is missing.'); + return; + } + this.bufferContents.push (buffer); + } + + this.ProcessMainFile (gltf); + } + + ProcessBinaryGltf (fileContent) + { + function ReadChunk (reader) + { + let length = reader.ReadUnsignedInteger32 (); + let type = reader.ReadUnsignedInteger32 (); + let buffer = reader.ReadArrayBuffer (length); + return { + type : type, + buffer : buffer + }; + } + + let reader = new OV.BinaryReader (fileContent, true); + let magic = reader.ReadUnsignedInteger32 (); + if (magic !== OV.GltfConstants.GLTF_STRING) { + this.SetError (); + this.SetMessage ('Invalid glTF file.'); + return; + } + let version = reader.ReadUnsignedInteger32 (); + if (version !== 2) { + this.SetError (); + this.SetMessage ('Invalid glTF version.'); + return; + } + let length = reader.ReadUnsignedInteger32 (); + if (length !== reader.GetByteLength ()) { + this.SetError (); + this.SetMessage ('Invalid glTF file.'); + return; + } + + let gltfTextContent = null; + while (!reader.End ()) { + let chunk = ReadChunk (reader); + if (chunk.type === OV.GltfConstants.JSON_CHUNK_TYPE) { + gltfTextContent = OV.ArrayBufferToUtf8String (chunk.buffer); + } else if (chunk.type === OV.GltfConstants.BINARY_CHUNK_TYPE) { + this.bufferContents.push (chunk.buffer); + } + } + + if (gltfTextContent !== null) { + let gltf = JSON.parse (gltfTextContent); + this.ProcessMainFile (gltf); + } + } + + ProcessMainFile (gltf) + { + let unsupportedExtensions = this.gltfExtensions.GetUnsupportedExtensions (gltf.extensionsRequired); + if (unsupportedExtensions.length > 0) { + this.SetError (); + this.SetMessage ('Unsupported extension: ' + unsupportedExtensions.join (', ') + '.'); + return; + } + + let defaultScene = this.GetDefaultScene (gltf); + if (defaultScene === null) { + this.SetError (); + this.SetMessage ('No default scene found.'); + return; + } + + let materials = gltf.materials; + if (materials !== undefined) { + for (let i = 0; i < materials.length; i++) { + this.ImportMaterial (gltf, i); + } + } + + let nodeTree = this.CollectMeshNodesForScene (gltf, defaultScene); + for (let i = 0; i < nodeTree.nodes.length; i++) { + let nodeIndex = nodeTree.nodes[i]; + this.ImportMeshNode (gltf, nodeIndex, nodeTree); + } + } + + GetDefaultScene (gltf) + { + let defaultSceneIndex = gltf.scene || 0; + if (defaultSceneIndex >= gltf.scenes.length) { + return null; + } + return gltf.scenes[defaultSceneIndex]; + } + + CollectMeshNodesForScene (gltf, scene) + { + function CollectMeshNodeIndices (gltf, parentIndex, nodeIndex, nodeTree, meshNodes) + { + let node = gltf.nodes[nodeIndex]; + if (node.mesh !== undefined) { + nodeTree.AddMeshNode (nodeIndex); + meshNodes.push (nodeIndex); + } + nodeTree.AddNodeParent (nodeIndex, parentIndex); + if (node.children !== undefined) { + for (let i = 0; i < node.children.length; i++) { + let childNodeIndex = node.children[i]; + CollectMeshNodeIndices (gltf, nodeIndex, childNodeIndex, nodeTree, meshNodes); + } + } + } + + let nodeTree = new OV.GltfNodeTree (); + let meshNodes = []; + for (let i = 0; i < scene.nodes.length; i++) { + let nodeIndex = scene.nodes[i]; + CollectMeshNodeIndices (gltf, -1, nodeIndex, nodeTree, meshNodes); + } + return nodeTree; + } + + ImportMaterial (gltf, materialIndex) + { + function GetMaterialComponent (component) + { + return parseInt (Math.round (OV.LinearToSRGB (component) * 255.0), 10); + } + + let gltfMaterial = gltf.materials[materialIndex]; + let material = new OV.Material (); + if (gltfMaterial.name !== undefined) { + material.name = gltfMaterial.name; + } + + material.diffuse = new OV.Color ( + GetMaterialComponent (1.0), + GetMaterialComponent (1.0), + GetMaterialComponent (1.0) + ); + if (gltfMaterial.pbrMetallicRoughness !== undefined) { + let baseColor = gltfMaterial.pbrMetallicRoughness.baseColorFactor; + if (baseColor !== undefined) { + material.diffuse = new OV.Color ( + GetMaterialComponent (baseColor[0]), + GetMaterialComponent (baseColor[1]), + GetMaterialComponent (baseColor[2]) + ); + material.opacity = baseColor[3]; + } + let emissiveColor = gltfMaterial.emissiveFactor; + if (emissiveColor !== undefined) { + material.emissive = new OV.Color ( + GetMaterialComponent (emissiveColor[0]), + GetMaterialComponent (emissiveColor[1]), + GetMaterialComponent (emissiveColor[2]) + ); + } + + material.diffuseMap = this.ImportTexture (gltf, gltfMaterial.pbrMetallicRoughness.baseColorTexture); + material.normalMap = this.ImportTexture (gltf, gltfMaterial.normalTexture); + material.emissiveMap = this.ImportTexture (gltf, gltfMaterial.emissiveTexture); + if (material.diffuseMap !== null) { + material.multiplyDiffuseMap = true; + } + + let alphaMode = gltfMaterial.alphaMode; + if (alphaMode !== undefined) { + if (alphaMode === 'BLEND') { + material.transparent = true; + } else if (alphaMode === 'MASK') { + material.transparent = true; + material.alphaTest = gltfMaterial.alphaCutoff || 0.5; + } + } + } + + let obj = this; + this.gltfExtensions.ProcessMaterial (gltfMaterial, material, function (textureRef) { + return obj.ImportTexture (gltf, textureRef); + }); + this.model.AddMaterial (material); + } + + ImportTexture (gltf, gltfTextureRef) + { + function GetTextureFileExtension (mimeType) + { + if (mimeType === undefined || mimeType === null) { + return ''; + } + let mimeParts = mimeType.split ('/'); + if (mimeParts.length === 0) { + return ''; + } + return '.' + mimeParts[mimeParts.length - 1]; + } + + if (gltfTextureRef === undefined || gltfTextureRef === null) { + return null; + } + + let texture = new OV.TextureMap (); + let gltfTexture = gltf.textures[gltfTextureRef.index]; + let gltfImage = gltf.images[gltfTexture.source]; + + let textureIndexString = gltfTexture.source.toString (); + if (gltfImage.uri !== undefined) { + let base64Buffer = OV.Base64DataURIToArrayBuffer (gltfImage.uri); + if (base64Buffer !== null) { + let blob = new Blob ([base64Buffer.buffer], { type : base64Buffer.mimeType }); + texture.name = 'Embedded_' + textureIndexString + GetTextureFileExtension (base64Buffer.mimeType); + texture.url = URL.createObjectURL (blob); + } else { + let textureObjectUrl = this.callbacks.getTextureObjectUrl (gltfImage.uri); + texture.name = gltfImage.uri; + texture.url = textureObjectUrl; + } + } else if (gltfImage.bufferView !== undefined) { + let bufferView = gltf.bufferViews[gltfImage.bufferView]; + let reader = this.GetReaderFromBufferView (bufferView); + if (reader !== null) { + let buffer = reader.ReadArrayBuffer (bufferView.byteLength); + let blob = new Blob ([buffer], { type: gltfImage.mimeType }); + texture.name = 'Binary_' + textureIndexString + GetTextureFileExtension (gltfImage.mimeType); + texture.url = URL.createObjectURL (blob); + } + } + + this.gltfExtensions.ProcessTexture (gltfTextureRef, texture); + return texture; + } + + ImportMeshNode (gltf, nodeIndex, nodeTree) + { + function GetNodeTransformation (gltf, nodeIndex, nodeTree) + { + let node = gltf.nodes[nodeIndex]; + let matrix = nodeTree.GetNodeMatrix (nodeIndex); + if (matrix !== null) { + return matrix; + } + + matrix = new OV.Matrix ().CreateIdentity (); + if (node.matrix !== undefined) { + matrix.Set (node.matrix); + } else { + let hasTransformation = false; + let translation = [0.0, 0.0, 0.0]; + let rotation = [0.0, 0.0, 0.0, 1.0]; + let scale = [1.0, 1.0, 1.0]; + if (node.translation !== undefined) { + translation = node.translation; + hasTransformation = true; + } + if (node.rotation !== undefined) { + rotation = node.rotation; + hasTransformation = true; + } + if (node.scale !== undefined) { + scale = node.scale; + hasTransformation = true; + } + + if (hasTransformation) { + matrix.ComposeTRS (translation, rotation, scale); + } + } + + let parentNodeIndex = nodeTree.GetNodeParent (nodeIndex); + if (parentNodeIndex !== null) { + let parentMatrix = GetNodeTransformation (gltf, parentNodeIndex, nodeTree); + matrix = matrix.MultiplyMatrix (parentMatrix); + } + + nodeTree.AddNodeMatrix (nodeIndex, matrix); + return matrix; + } + + let gltfNode = gltf.nodes[nodeIndex]; + let gltfMeshIndex = gltfNode.mesh; + let gltfMesh = gltf.meshes[gltfMeshIndex]; + + let mesh = new OV.Mesh (); + this.model.AddMesh (mesh); + if (gltfMesh.name !== undefined) { + mesh.SetName (gltfMesh.name); + } + + for (let i = 0; i < gltfMesh.primitives.length; i++) { + let primitive = gltfMesh.primitives[i]; + this.ImportPrimitive (gltf, primitive, mesh); + } + + let matrix = GetNodeTransformation (gltf, nodeIndex, nodeTree); + let transformation = new OV.Transformation (matrix); + OV.TransformMesh (mesh, transformation); + } + + ImportPrimitive (gltf, primitive, mesh) + { + function AddTriangle (mesh, v0, v1, v2, hasNormals, hasUVs, vertexOffset, normalOffset, uvOffset) + { + let triangle = new OV.Triangle (vertexOffset + v0, vertexOffset + v1, vertexOffset + v2); + if (hasNormals) { + triangle.SetNormals ( + normalOffset + v0, + normalOffset + v1, + normalOffset + v2 + ); + } + if (hasUVs) { + triangle.SetTextureUVs ( + uvOffset + v0, + uvOffset + v1, + uvOffset + v2 + ); + } + if (primitive.material !== undefined) { + triangle.mat = primitive.material; + } + mesh.AddTriangle (triangle); + } + + if (primitive.attributes === undefined) { + return; + } + + let hasVertices = (primitive.attributes.POSITION !== undefined); + let hasNormals = (primitive.attributes.NORMAL !== undefined); + let hasUVs = (primitive.attributes.TEXCOORD_0 !== undefined); + let hasIndices = (primitive.indices !== undefined); + if (!hasVertices) { + return; + } + + let mode = OV.GltfRenderMode.TRIANGLES; + if (primitive.mode !== undefined) { + mode = primitive.mode; + } + if (mode !== OV.GltfRenderMode.TRIANGLES && mode !== OV.GltfRenderMode.TRIANGLE_STRIP && mode !== OV.GltfRenderMode.TRIANGLE_FAN) { + return; + } + + let vertexOffset = mesh.VertexCount (); + let normalOffset = mesh.NormalCount (); + let uvOffset = mesh.TextureUVCount (); + + if (hasVertices) { + let accessor = gltf.accessors[primitive.attributes.POSITION]; + let reader = this.GetReaderFromAccessor (gltf, accessor); + if (reader === null) { + return; + } + reader.EnumerateData (function (data) { + mesh.AddVertex (data); + }); + } + + if (hasNormals) { + let accessor = gltf.accessors[primitive.attributes.NORMAL]; + let reader = this.GetReaderFromAccessor (gltf, accessor); + if (reader === null) { + return; + } + reader.EnumerateData (function (data) { + mesh.AddNormal (data); + }); + } + + if (hasUVs) { + let accessor = gltf.accessors[primitive.attributes.TEXCOORD_0]; + let reader = this.GetReaderFromAccessor (gltf, accessor); + if (reader === null) { + return; + } + reader.EnumerateData (function (data) { + data.y = -data.y; + mesh.AddTextureUV (data); + }); + } + + let vertexIndices = []; + if (hasIndices) { + let accessor = gltf.accessors[primitive.indices]; + let reader = this.GetReaderFromAccessor (gltf, accessor); + if (reader === null) { + return; + } + reader.EnumerateData (function (data) { + vertexIndices.push (data); + }); + } else { + for (let i = 0; i < mesh.VertexCount (); i++) { + vertexIndices.push (i); + } + } + + if (mode === OV.GltfRenderMode.TRIANGLES) { + for (let i = 0; i < vertexIndices.length; i += 3) { + let v0 = vertexIndices[i]; + let v1 = vertexIndices[i + 1]; + let v2 = vertexIndices[i + 2]; + AddTriangle (mesh, v0, v1, v2, hasNormals, hasUVs, vertexOffset, normalOffset, uvOffset); + } + } else if (mode === OV.GltfRenderMode.TRIANGLE_STRIP) { + for (let i = 0; i < vertexIndices.length - 2; i++) { + let v0 = vertexIndices[i]; + let v1 = vertexIndices[i + 1]; + let v2 = vertexIndices[i + 2]; + if (i % 2 === 1) { + let tmp = v1; + v1 = v2; + v2 = tmp; + } + AddTriangle (mesh, v0, v1, v2, hasNormals, hasUVs, vertexOffset, normalOffset, uvOffset); + } + } else if (mode === OV.GltfRenderMode.TRIANGLE_FAN) { + for (let i = 1; i < vertexIndices.length - 1; i++) { + let v0 = vertexIndices[0]; + let v1 = vertexIndices[i]; + let v2 = vertexIndices[i + 1]; + AddTriangle (mesh, v0, v1, v2, hasNormals, hasUVs, vertexOffset, normalOffset, uvOffset); + } + } + } + + GetReaderFromBufferView (bufferView) + { + let bufferIndex = bufferView.buffer || 0; + let buffer = this.bufferContents[bufferIndex]; + if (buffer === null) { + return null; + } + + let reader = new OV.GltfBufferReader (buffer); + reader.SkipBytes (bufferView.byteOffset || 0); + let byteStride = bufferView.byteStride; + if (byteStride !== undefined) { + reader.SetByteStride (byteStride); + } + + return reader; + } + + GetReaderFromAccessor (gltf, accessor) + { + let bufferViewIndex = accessor.bufferView || 0; + let bufferView = gltf.bufferViews[bufferViewIndex]; + let reader = this.GetReaderFromBufferView (bufferView); + if (reader === null) { + return null; + } + + reader.SetComponentType (accessor.componentType); + reader.SetDataType (accessor.type); + reader.SetDataCount (accessor.count); + reader.SkipBytes (accessor.byteOffset || 0); + + if (accessor.sparse !== undefined) { + let indexReader = this.GetReaderFromSparseAccessor (gltf, accessor.sparse.indices, accessor.sparse.indices.componentType, 'SCALAR', accessor.sparse.count); + let valueReader = this.GetReaderFromSparseAccessor (gltf, accessor.sparse.values, accessor.componentType, accessor.type, accessor.sparse.count); + if (indexReader !== null && valueReader !== null) { + reader.SetSparseReader (indexReader, valueReader); + } + } + return reader; + } + + GetReaderFromSparseAccessor (gltf, sparseAccessor, componentType, type, count) + { + if (sparseAccessor.bufferView === undefined) { + return null; + } + + let bufferView = gltf.bufferViews[sparseAccessor.bufferView]; + let reader = this.GetReaderFromBufferView (bufferView); + if (reader === null) { + return null; + } + + reader.SetComponentType (componentType); + reader.SetDataType (type); + reader.SetDataCount (count); + reader.SkipBytes (sparseAccessor.byteOffset || 0); + return reader; + } +}; diff --git a/source/import/importerobj.js b/source/import/importerobj.js new file mode 100644 index 0000000..40b9aff --- /dev/null +++ b/source/import/importerobj.js @@ -0,0 +1,385 @@ +OV.ImporterObj = class extends OV.ImporterBase +{ + constructor () + { + super (); + + this.globalVertices = null; + this.globalNormals = null; + this.globalUvs = null; + + this.currentMesh = null; + this.currentMeshData = null; + this.currentMaterial = null; + this.currentMaterialIndex = null; + + this.meshNameToMeshData = null; + this.materialNameToIndex = null; + } + + ResetState () + { + this.globalVertices = []; + this.globalNormals = []; + this.globalUvs = []; + + this.currentMesh = null; + this.currentMeshData = null; + this.currentMaterial = null; + this.currentMaterialIndex = null; + + this.meshNameToMeshData = {}; + this.materialNameToIndex = {}; + } + + CanImportExtension (extension) + { + return extension === 'obj'; + } + + GetKnownFileFormats () + { + return { + 'obj' : OV.FileFormat.Text, + 'mtl' : OV.FileFormat.Text + }; + } + + GetUpDirection () + { + return OV.Direction.Y; + } + + ImportContent (fileContent) + { + let obj = this; + OV.ReadLines (fileContent, function (line) { + if (!obj.IsError ()) { + obj.ProcessLine (line); + } + }); + } + + ProcessLine (line) + { + if (line[0] === '#') { + return; + } + + let parameters = OV.ParametersFromLine (line, '#'); + if (parameters.length === 0) { + return; + } + + let keyword = parameters[0].toLowerCase (); + parameters.shift (); + + if (this.ProcessMeshParameter (keyword, parameters, line)) { + return; + } + + if (this.ProcessMaterialParameter (keyword, parameters, line)) { + return; + } + } + + AddNewMesh (name) + { + let meshData = this.meshNameToMeshData[name]; + if (meshData === undefined) { + let mesh = new OV.Mesh (); + if (name !== null) { + mesh.SetName (name); + } + this.model.AddMesh (mesh); + meshData = { + mesh : mesh, + data : { + globalToCurrentVertices : {}, + globalToCurrentNormals : {}, + globalToCurrentUvs : {} + } + }; + this.meshNameToMeshData[name] = meshData; + } + this.currentMesh = meshData.mesh; + this.currentMeshData = meshData.data; + } + + ProcessMeshParameter (keyword, parameters, line) + { + if (keyword === 'g' || keyword === 'o') { + if (parameters.length === 0) { + return true; + } + let name = OV.NameFromLine (line, keyword.length, '#'); + this.AddNewMesh (name); + return true; + } else if (keyword === 'v') { + if (parameters.length < 3) { + return true; + } + this.globalVertices.push (new OV.Coord3D ( + parseFloat (parameters[0]), + parseFloat (parameters[1]), + parseFloat (parameters[2]) + )); + return true; + } else if (keyword === 'vn') { + if (parameters.length < 3) { + return true; + } + this.globalNormals.push (new OV.Coord3D ( + parseFloat (parameters[0]), + parseFloat (parameters[1]), + parseFloat (parameters[2]) + )); + return true; + } else if (keyword === 'vt') { + if (parameters.length < 2) { + return true; + } + this.globalUvs.push (new OV.Coord2D ( + parseFloat (parameters[0]), + parseFloat (parameters[1]) + )); + return true; + } else if (keyword === 'f') { + if (parameters.length < 3) { + return true; + } + this.ProcessFace (parameters); + return true; + } + + return false; + } + + ProcessMaterialParameter (keyword, parameters, line) + { + function CreateColor (parameters) + { + return new OV.Color ( + parseInt (parseFloat (parameters[0] * 255.0), 10), + parseInt (parseFloat (parameters[1] * 255.0), 10), + parseInt (parseFloat (parameters[2] * 255.0), 10) + ); + } + + function CreateTexture (keyword, line, callbacks) + { + let texture = new OV.TextureMap (); + texture.name = OV.NameFromLine (line, keyword.length, '#'); + let textureObjectUrl = callbacks.getTextureObjectUrl (texture.name); + if (textureObjectUrl !== null) { + texture.url = textureObjectUrl; + } + return texture; + } + + let obj = this; + if (keyword === 'newmtl') { + if (parameters.length === 0) { + return true; + } + + let material = new OV.Material (); + let materialName = OV.NameFromLine (line, keyword.length, '#'); + let materialIndex = this.model.AddMaterial (material); + material.name = materialName; + this.currentMaterial = material; + this.materialNameToIndex[materialName] = materialIndex; + return true; + } else if (keyword === 'usemtl') { + if (parameters.length === 0) { + return true; + } + + let materialName = OV.NameFromLine (line, keyword.length, '#'); + let materialIndex = this.materialNameToIndex[materialName]; + if (materialIndex !== undefined) { + this.currentMaterialIndex = materialIndex; + } + return true; + } else if (keyword === 'mtllib') { + if (parameters.length === 0) { + return true; + } + let fileName = OV.NameFromLine (line, keyword.length, '#'); + let fileContent = this.callbacks.getFileContent (fileName); + if (fileContent !== null) { + OV.ReadLines (fileContent, function (line) { + if (!obj.IsError ()) { + obj.ProcessLine (line); + } + }); + } + return true; + } else if (keyword === 'map_kd') { + if (this.currentMaterial === null || parameters.length === 0) { + return true; + } + this.currentMaterial.diffuseMap = CreateTexture (keyword, line, this.callbacks); + return true; + } else if (keyword === 'map_ks') { + if (this.currentMaterial === null || parameters.length === 0) { + return true; + } + this.currentMaterial.specularMap = CreateTexture (keyword, line, this.callbacks); + return true; + } else if (keyword === 'map_bump' || keyword === 'bump') { + if (this.currentMaterial === null || parameters.length === 0) { + return true; + } + this.currentMaterial.bumpMap = CreateTexture (keyword, line, this.callbacks); + return true; + } else if (keyword === 'ka') { + if (this.currentMaterial === null || parameters.length < 3) { + return true; + } + this.currentMaterial.ambient = CreateColor (parameters); + return true; + } else if (keyword === 'kd') { + if (this.currentMaterial === null || parameters.length < 3) { + return true; + } + this.currentMaterial.diffuse = CreateColor (parameters); + return true; + } else if (keyword === 'ks') { + if (this.currentMaterial === null || parameters.length < 3) { + return true; + } + this.currentMaterial.specular = CreateColor (parameters); + return true; + } else if (keyword === 'ns') { + if (this.currentMaterial === null || parameters.length < 1) { + return true; + } + this.currentMaterial.shininess = parseFloat (parameters[0]) / 100.0; + return true; + } else if (keyword === 'tr') { + if (this.currentMaterial === null || parameters.length < 1) { + return true; + } + this.currentMaterial.opacity = 1.0 - parseFloat (parameters[0]); + this.currentMaterial.transparent = OV.IsLower (this.currentMaterial.opacity, 1.0); + return true; + } else if (keyword === 'd') { + if (this.currentMaterial === null || parameters.length < 1) { + return true; + } + this.currentMaterial.opacity = parseFloat (parameters[0]); + this.currentMaterial.transparent = OV.IsLower (this.currentMaterial.opacity, 1.0); + return true; + } + + return false; + } + + ProcessFace (parameters) + { + function GetRelativeIndex (index, count) + { + if (index > 0) { + return index - 1; + } else { + return count + index; + } + } + + function GetLocalIndex (globalValueArray, globalToCurrentIndices, globalIndex, valueAdderFunc) + { + if (isNaN (globalIndex) || globalIndex < 0 || globalIndex >= globalValueArray.length) { + return null; + } + let result = globalToCurrentIndices[globalIndex]; + if (result === undefined) { + let globalValue = globalValueArray[globalIndex]; + if (globalValue === undefined) { + return null; + } + result = valueAdderFunc (globalValue); + globalToCurrentIndices[globalIndex] = result; + } + return result; + } + + function GetLocalVertexIndex (obj, mesh, globalIndex) + { + return GetLocalIndex (obj.globalVertices, obj.currentMeshData.globalToCurrentVertices, globalIndex, function (val) { + return mesh.AddVertex (new OV.Coord3D (val.x, val.y, val.z)); + }); + } + + function GetLocalNormalIndex (obj, mesh, globalIndex) + { + return GetLocalIndex (obj.globalNormals, obj.currentMeshData.globalToCurrentNormals, globalIndex, function (val) { + return mesh.AddNormal (new OV.Coord3D (val.x, val.y, val.z)); + }); + } + + function GetLocalUVIndex (obj, mesh, globalIndex) + { + return GetLocalIndex (obj.globalUvs, obj.currentMeshData.globalToCurrentUvs, globalIndex, function (val) { + return mesh.AddTextureUV (new OV.Coord2D (val.x, val.y)); + }); + } + + let vertices = []; + let normals = []; + let uvs = []; + + for (let i = 0; i < parameters.length; i++) { + let vertexParams = parameters[i].split ('/'); + vertices.push (GetRelativeIndex (parseInt (vertexParams[0], 10), this.globalVertices.length)); + if (vertexParams.length > 1 && vertexParams[1].length > 0) { + uvs.push (GetRelativeIndex (parseInt (vertexParams[1], 10), this.globalUvs.length)); + } + if (vertexParams.length > 2 && vertexParams[2].length > 0) { + normals.push (GetRelativeIndex (parseInt (vertexParams[2], 10), this.globalNormals.length)); + } + } + + if (this.currentMesh === null) { + this.AddNewMesh (''); + } + + for (let i = 0; i < vertices.length - 2; i++) { + let v0 = GetLocalVertexIndex (this, this.currentMesh, vertices[0]); + let v1 = GetLocalVertexIndex (this, this.currentMesh, vertices[i + 1]); + let v2 = GetLocalVertexIndex (this, this.currentMesh, vertices[i + 2]); + if (v0 === null || v1 === null || v2 === null) { + this.SetError (); + this.SetMessage ('Invalid vertex index.'); + break; + } + let triangle = new OV.Triangle (v0, v1, v2); + if (normals.length === vertices.length) { + let n0 = GetLocalNormalIndex (this, this.currentMesh, normals[0]); + let n1 = GetLocalNormalIndex (this, this.currentMesh, normals[i + 1]); + let n2 = GetLocalNormalIndex (this, this.currentMesh, normals[i + 2]); + if (n0 === null || n1 === null || n2 === null) { + this.SetError (); + this.SetMessage ('Invalid normal index.'); + break; + } + triangle.SetNormals (n0, n1, n2); + } + if (uvs.length === vertices.length) { + let u0 = GetLocalUVIndex (this, this.currentMesh, uvs[0]); + let u1 = GetLocalUVIndex (this, this.currentMesh, uvs[i + 1]); + let u2 = GetLocalUVIndex (this, this.currentMesh, uvs[i + 2]); + if (u0 === null || u1 === null || u2 === null) { + this.SetError (); + this.SetMessage ('Invalid uv index.'); + break; + } + triangle.SetTextureUVs (u0, u1, u2); + } + if (this.currentMaterialIndex !== null) { + triangle.mat = this.currentMaterialIndex; + } + this.currentMesh.AddTriangle (triangle); + } + } +}; diff --git a/source/import/importeroff.js b/source/import/importeroff.js new file mode 100644 index 0000000..12f0319 --- /dev/null +++ b/source/import/importeroff.js @@ -0,0 +1,103 @@ +OV.ImporterOff = class extends OV.ImporterBase +{ + constructor () + { + super (); + this.model = null; + this.mesh = null; + this.status = null; + } + + ResetState () + { + this.mesh = new OV.Mesh (); + this.model.AddMesh (this.mesh); + this.status = { + vertexCount : 0, + faceCount : 0, + foundVertex : 0, + foundFace : 0 + }; + } + + CanImportExtension (extension) + { + return extension === 'off'; + } + + GetKnownFileFormats () + { + return { + 'off' : OV.FileFormat.Text + }; + } + + GetUpDirection () + { + return OV.Direction.Y; + } + + ImportContent (fileContent) + { + let obj = this; + OV.ReadLines (fileContent, function (line) { + if (!obj.IsError ()) { + obj.ProcessLine (line); + } + }); + } + + ProcessLine (line) + { + if (line[0] === '#') { + return; + } + + let parameters = OV.ParametersFromLine (line, '#'); + if (parameters.length === 0) { + return; + } + + if (parameters[0] === 'OFF') { + return; + } + + if (this.status.vertexCount === 0 && this.status.faceCount === 0) { + if (parameters.length > 1) { + this.status.vertexCount = parseInt (parameters[0], 10); + this.status.faceCount = parseInt (parameters[1], 10); + } + return; + } + + if (this.status.foundVertex < this.status.vertexCount) { + if (parameters.length >= 3) { + this.mesh.AddVertex (new OV.Coord3D ( + parseFloat (parameters[0]), + parseFloat (parameters[1]), + parseFloat (parameters[2]) + )); + this.status.foundVertex += 1; + } + return; + } + + if (this.status.foundFace < this.status.faceCount) { + if (parameters.length >= 4) { + let vertexCount = parseInt (parameters[0], 10); + if (parameters.length < vertexCount + 1) { + return; + } + for (let i = 0; i < vertexCount - 2; i++) { + let v0 = parseInt (parameters[1]); + let v1 = parseInt (parameters[i + 2]); + let v2 = parseInt (parameters[i + 3]); + let triangle = new OV.Triangle (v0, v1, v2); + this.mesh.AddTriangle (triangle); + } + this.status.foundFace += 1; + } + return; + } + } +}; diff --git a/source/import/importerply.js b/source/import/importerply.js new file mode 100644 index 0000000..763e6ae --- /dev/null +++ b/source/import/importerply.js @@ -0,0 +1,428 @@ +OV.PlyHeader = class +{ + constructor () + { + this.format = null; + this.elements = []; + } + + SetFormat (format) + { + this.format = format; + } + + AddElement (name, count) + { + this.elements.push ({ + name : name, + count : count, + format : [] + }); + } + + GetElements () + { + return this.elements; + } + + AddSingleFormat (elemType, name) + { + let lastElement = this.elements[this.elements.length - 1]; + lastElement.format.push ({ + name : name, + isSingle : true, + elemType : elemType + }); + } + + AddListFormat (countType, elemType, name) + { + let lastElement = this.elements[this.elements.length - 1]; + lastElement.format.push ({ + name : name, + isSingle : false, + countType : countType, + elemType : elemType + }); + } + + GetElement (name) + { + for (let i = 0; i < this.elements.length; i++) { + let element = this.elements[i]; + if (element.name === name) { + return element; + } + } + return null; + } + + Check () + { + let vertex = this.GetElement ('vertex'); + if (vertex === null || vertex.length === 0 || vertex.format.length < 3) { + return false; + } + + let face = this.GetElement ('face'); + if (this.format === 'ascii') { + if (face === null || face.count === 0 || face.format.length < 0) { + return false; + } + } else if (this.format === 'binary_little_endian' || this.format === 'binary_big_endian') { + let triStrips = this.GetElement ('tristrips'); + let hasFaces = (face !== null && face.count > 0 && face.format.length > 0); + let hasTriStrips = (triStrips !== null && triStrips.count > 0 && triStrips.format.length > 0); + if (!hasFaces && !hasTriStrips) { + return false; + } + } else { + return false; + } + + return true; + } +}; + +OV.ImporterPly = class extends OV.ImporterBase +{ + constructor () + { + super (); + this.model = null; + this.mesh = null; + } + + ResetState () + { + this.mesh = new OV.Mesh (); + this.model.AddMesh (this.mesh); + } + + CanImportExtension (extension) + { + return extension === 'ply'; + } + + GetKnownFileFormats () + { + return { + 'ply' : OV.FileFormat.Binary + }; + } + + GetUpDirection () + { + return OV.Direction.Y; + } + + ImportContent (fileContent) + { + let headerString = this.GetHeaderContent (fileContent); + let header = this.ReadHeader (headerString); + if (!header.Check ()) { + this.SetError (); + this.SetMessage ('Invalid header information.'); + return; + } + + if (header.format === 'ascii') { + let contentString = OV.ArrayBufferToUtf8String (fileContent); + contentString = contentString.substr (headerString.length); + this.ReadAsciiContent (header, contentString); + } else if (header.format === 'binary_little_endian' || header.format === 'binary_big_endian') { + this.ReadBinaryContent (header, fileContent, headerString.length); + } + } + + GetHeaderContent (fileContent) + { + let headerContent = ''; + let bufferView = new Uint8Array (fileContent); + let bufferIndex = 0; + for (bufferIndex = 0; bufferIndex < fileContent.byteLength; bufferIndex++) { + headerContent += String.fromCharCode (bufferView[bufferIndex]); + if (headerContent.endsWith ('end_header')) { + break; + } + } + bufferIndex += 1; + while (bufferIndex < fileContent.byteLength) { + let char = String.fromCharCode (bufferView[bufferIndex]); + headerContent += char; + bufferIndex += 1; + if (char === '\n') { + break; + } + } + return headerContent; + } + + ReadHeader (headerContent) + { + let header = new OV.PlyHeader (); + OV.ReadLines (headerContent, function (line) { + let parameters = OV.ParametersFromLine (line, null); + if (parameters.length === 0 || parameters[0] === 'comment') { + return; + } + + if (parameters[0] === 'ply') { + return; + } else if (parameters[0] === 'format' && parameters.length >= 2) { + header.SetFormat (parameters[1]); + } else if (parameters[0] === 'element' && parameters.length >= 3) { + header.AddElement (parameters[1], parseInt (parameters[2], 10)); + } else if (parameters[0] === 'property' && parameters.length >= 3) { + if (parameters[1] === 'list' && parameters.length >= 5) { + header.AddListFormat (parameters[2], parameters[3], parameters[4]); + } else { + header.AddSingleFormat (parameters[1], parameters[2]); + } + } + }); + + return header; + } + + ReadAsciiContent (header, fileContent) + { + let obj = this; + let vertex = header.GetElement ('vertex'); + let face = header.GetElement ('face'); + let foundVertex = 0; + let foundFace = 0; + OV.ReadLines (fileContent, function (line) { + if (obj.IsError ()) { + return; + } + + let parameters = OV.ParametersFromLine (line, null); + if (parameters.length === 0 || parameters[0] === 'comment') { + return; + } + + if (foundVertex < vertex.count) { + if (parameters.length >= 3) { + obj.mesh.AddVertex (new OV.Coord3D ( + parseFloat (parameters[0]), + parseFloat (parameters[1]), + parseFloat (parameters[2]) + )); + foundVertex += 1; + } + return; + } + + if (foundFace < face.count) { + if (parameters.length >= 4) { + let vertexCount = parseInt (parameters[0], 10); + if (parameters.length < vertexCount + 1) { + return; + } + for (let i = 0; i < vertexCount - 2; i++) { + let v0 = parseInt (parameters[1]); + let v1 = parseInt (parameters[i + 2]); + let v2 = parseInt (parameters[i + 3]); + let triangle = new OV.Triangle (v0, v1, v2); + obj.mesh.AddTriangle (triangle); + } + foundFace += 1; + } + return; + } + }); + } + + ReadBinaryContent (header, fileContent, headerLength) + { + function SkipAndGetColor (obj, reader, format, startIndex) + { + let r = null; + let g = null; + let b = null; + let a = 255; + + for (let i = startIndex; i < format.length; i++) { + let currFormat = format[i]; + let val = obj.ReadByFormat (reader, currFormat); + if (currFormat.name === 'red') { + r = val; + } else if (currFormat.name === 'green') { + g = val; + } else if (currFormat.name === 'blue') { + b = val; + } else if (currFormat.name === 'alpha') { + a = val; + } + } + + if (r !== null && g !== null && b !== null) { + return [r, g, b, a]; + } + + return null; + } + + function GetMaterialFromColor (obj, color, colorToMaterial) + { + function IntegerToHex (intVal) + { + let result = parseInt (intVal, 10).toString (16); + while (result.length < 2) { + result = '0' + result; + } + return result; + } + + if (color === null) { + return null; + } + + let materialName = '#' + IntegerToHex (color[0]) + IntegerToHex (color[1]) + IntegerToHex (color[2]) + IntegerToHex (color[3]); + let materialIndex = colorToMaterial[materialName]; + if (materialIndex === undefined) { + let material = new OV.Material (); + material.name = materialName; + material.diffuse = new OV.Color (color[0], color[1], color[2]); + material.opacity = color[3] / 255.0; + material.transparent = OV.IsLower (material.opacity, 1.0); + materialIndex = obj.model.AddMaterial (material); + colorToMaterial[materialName] = materialIndex; + } + + return materialIndex; + } + + function GetFaceColorByVertexColors (obj, v0, v1, v2, vertexColors, colorToMaterial) + { + let c0 = vertexColors[v0]; + let c1 = vertexColors[v1]; + let c2 = vertexColors[v2]; + let d0 = Math.abs (c0[0] - c1[0]) + Math.abs (c0[1] - c1[1]) + Math.abs (c0[2] - c1[2]); + let d1 = Math.abs (c1[0] - c2[0]) + Math.abs (c1[1] - c2[1]) + Math.abs (c1[2] - c2[2]); + let d2 = Math.abs (c0[0] - c2[0]) + Math.abs (c0[1] - c2[1]) + Math.abs (c0[2] - c2[2]); + let min = Math.min (d0, d1, d2); + let color = c0; + if (min === d1) { + color = c1; + } + return GetMaterialFromColor (obj, color, colorToMaterial); + } + + let reader = null; + if (header.format === 'binary_little_endian') { + reader = new OV.BinaryReader (fileContent, true); + } else if (header.format === 'binary_big_endian') { + reader = new OV.BinaryReader (fileContent, false); + } else { + return; + } + reader.Skip (headerLength); + + let vertexColors = []; + let colorToMaterial = {}; + let elements = header.GetElements (); + for (let elementIndex = 0; elementIndex < elements.length; elementIndex++) { + let element = elements[elementIndex]; + if (element.name === 'vertex') { + for (let vertexIndex = 0; vertexIndex < element.count; vertexIndex++) { + let x = this.ReadByFormat (reader, element.format[0]); + let y = this.ReadByFormat (reader, element.format[1]); + let z = this.ReadByFormat (reader, element.format[2]); + let color = SkipAndGetColor (this, reader, element.format, 3); + if (color !== null) { + vertexColors.push (color); + } + this.mesh.AddVertex (new OV.Coord3D (x, y, z)); + } + } else if (element.name === 'face') { + for (let faceIndex = 0; faceIndex < element.count; faceIndex++) { + let vertices = this.ReadByFormat (reader, element.format[0]); + let faceColor = SkipAndGetColor (this, reader, element.format, 1); + for (let i = 0; i < vertices.length - 2; i++) { + let v0 = vertices[0]; + let v1 = vertices[i + 1]; + let v2 = vertices[i + 2]; + let triangle = new OV.Triangle (v0, v1, v2); + if (faceColor !== null) { + triangle.mat = GetMaterialFromColor (this, faceColor, colorToMaterial); + } else if (vertexColors.length === this.model.VertexCount ()) { + triangle.mat = GetFaceColorByVertexColors (this, v0, v1, v2, vertexColors, colorToMaterial); + } + this.mesh.AddTriangle (triangle); + } + } + } else if (element.name === 'tristrips') { + for (let triStripIndex = 0; triStripIndex < element.count; triStripIndex++) { + let vertices = this.ReadByFormat (reader, element.format[0]); + this.SkipFormat (reader, element.format, 1); + let ccw = true; + for (let i = 0; i < vertices.length - 2; i++) { + let v0 = vertices[i]; + let v1 = vertices[i + 1]; + let v2 = vertices[i + 2]; + if (v2 === -1) { + i += 2; + ccw = true; + continue; + } + if (!ccw) { + let tmp = v1; + v1 = v2; + v2 = tmp; + } + ccw = !ccw; + let triangle = new OV.Triangle (v0, v1, v2); + this.mesh.AddTriangle (triangle); + } + } + } else { + this.SkipFormat (reader, element.format, 0); + } + } + } + + SkipFormat (reader, format, startIndex) + { + for (let i = startIndex; i < format.length; i++) { + this.ReadByFormat (reader, format[i]); + } + } + + ReadByFormat (reader, format) + { + function ReadType (reader, type) + { + if (type === 'char' || type === 'int8') { + return reader.ReadCharacter8 (); + } else if (type === 'uchar' || type === 'uint8') { + return reader.ReadUnsignedCharacter8 (); + } else if (type === 'short' || type === 'int16') { + return reader.ReadInteger16 (); + } else if (type === 'ushort' || type === 'uint16') { + return reader.ReadUnsignedInteger16 (); + } else if (type === 'int' || type === 'int32') { + return reader.ReadInteger32 (); + } else if (type === 'uint' || type === 'uint32') { + return reader.ReadUnsignedInteger32 (); + } else if (type === 'float' || type === 'float32') { + return reader.ReadFloat32 (); + } else if (type === 'double' || type === 'double64') { + return reader.ReadDouble64 (); + } + return null; + } + + if (format.isSingle) { + return ReadType (reader, format.elemType); + } else { + let list = []; + let count = ReadType (reader, format.countType); + for (let i = 0; i < count; i++) { + list.push (ReadType (reader, format.elemType)); + } + return list; + } + } +}; diff --git a/source/import/importerstl.js b/source/import/importerstl.js new file mode 100644 index 0000000..5886551 --- /dev/null +++ b/source/import/importerstl.js @@ -0,0 +1,168 @@ +OV.ImporterStl = class extends OV.ImporterBase +{ + constructor () + { + super (); + this.mesh = null; + this.triangle = null; + } + + ResetState () + { + this.mesh = new OV.Mesh (); + this.model.AddMesh (this.mesh); + this.triangle = null; + } + + CanImportExtension (extension) + { + return extension === 'stl'; + } + + GetKnownFileFormats () + { + return { + 'stl' : OV.FileFormat.Binary + }; + } + + GetUpDirection () + { + return OV.Direction.Z; + } + + ImportContent (fileContent) + { + if (this.IsBinaryStlFile (fileContent)) { + this.ProcessBinary (fileContent); + } else { + let obj = this; + let textContent = OV.ArrayBufferToUtf8String (fileContent); + OV.ReadLines (textContent, function (line) { + if (!obj.IsError ()) { + obj.ProcessLine (line); + } + }); + } + } + + IsBinaryStlFile (fileContent) + { + let byteLength = fileContent.byteLength; + if (byteLength < 84) { + return false; + } + + let reader = new OV.BinaryReader (fileContent, true); + reader.Skip (80); + + let triangleCount = reader.ReadUnsignedInteger32 (); + if (byteLength !== triangleCount * 50 + 84) { + return false; + } + + return true; + } + + ProcessLine (line) + { + if (line[0] === '#') { + return; + } + + let parameters = OV.ParametersFromLine (line, '#'); + if (parameters.length === 0) { + return; + } + + let keyword = parameters[0]; + if (keyword === 'solid') { + if (parameters.length > 1) { + let name = OV.NameFromLine (line, keyword.length, '#'); + this.mesh.SetName (name); + } + return; + } + + if (keyword === 'facet') { + this.triangle = new OV.Triangle (-1, -1, -1); + if (parameters.length >= 5 && parameters[1] === 'normal') { + let normalVector = new OV.Coord3D ( + parseFloat (parameters[2]), + parseFloat (parameters[3]), + parseFloat (parameters[4]) + ); + if (OV.IsPositive (normalVector.Length ())) { + let normalIndex = this.mesh.AddNormal (normalVector); + this.triangle.SetNormals ( + normalIndex, + normalIndex, + normalIndex + ); + } + } + return; + } + + if (keyword === 'vertex' && this.triangle !== null) { + if (parameters.length >= 4) { + let vertexIndex = this.mesh.AddVertex (new OV.Coord3D ( + parseFloat (parameters[1]), + parseFloat (parameters[2]), + parseFloat (parameters[3]) + )); + if (this.triangle.v0 === -1) { + this.triangle.v0 = vertexIndex; + } else if (this.triangle.v1 === -1) { + this.triangle.v1 = vertexIndex; + } else if (this.triangle.v2 === -1) { + this.triangle.v2 = vertexIndex; + } + } + return; + } + + if (keyword === 'endfacet' && this.triangle !== null) { + if (this.triangle.v0 !== -1 && this.triangle.v1 !== -1 && this.triangle.v2 !== null) { + this.mesh.AddTriangle (this.triangle); + } + this.triangle = null; + return; + } + } + + ProcessBinary (fileContent) + { + function ReadVector (reader) + { + let coord = new OV.Coord3D (); + coord.x = reader.ReadFloat32 (); + coord.y = reader.ReadFloat32 (); + coord.z = reader.ReadFloat32 (); + return coord; + } + + function AddVertex (mesh, reader) + { + let coord = ReadVector (reader); + return mesh.AddVertex (coord); + } + + let reader = new OV.BinaryReader (fileContent, true); + reader.Skip (80); + let triangleCount = reader.ReadUnsignedInteger32 (); + for (let i = 0; i < triangleCount; i++) { + let normalVector = ReadVector (reader); + let v0 = AddVertex (this.mesh, reader); + let v1 = AddVertex (this.mesh, reader); + let v2 = AddVertex (this.mesh, reader); + reader.Skip (2); + let triangle = new OV.Triangle (v0, v1, v2); + if (OV.IsPositive (normalVector.Length ())) { + let normal = this.mesh.AddNormal (normalVector); + triangle.SetNormals (normal, normal, normal); + } + this.mesh.AddTriangle (triangle); + } + } +}; diff --git a/source/import/importerutils.js b/source/import/importerutils.js new file mode 100644 index 0000000..6cbb1a3 --- /dev/null +++ b/source/import/importerutils.js @@ -0,0 +1,72 @@ +OV.NameFromLine = function (line, startIndex, commentChar) +{ + let name = line.substr (startIndex); + let commentStart = name.indexOf (commentChar); + if (commentStart !== -1) { + name = name.substr (0, commentStart); + } + return name.trim (); +}; + +OV.ParametersFromLine = function (line, commentChar) +{ + if (commentChar !== null) { + let commentStart = line.indexOf (commentChar); + if (commentStart !== -1) { + line = line.substr (0, commentStart).trim (); + } + } + return line.split (/\s+/u); +}; + +OV.ReadLines = function (str, onLine) +{ + function LineFound (line, onLine) + { + let trimmed = line.trim (); + if (trimmed.length > 0) { + onLine (trimmed); + } + } + + let cursor = 0; + let next = str.indexOf ('\n', cursor); + while (next !== -1) { + LineFound (str.substr (cursor, next - cursor), onLine); + cursor = next + 1; + next = str.indexOf ('\n', cursor); + } + LineFound (str.substr (cursor), onLine); +}; + +OV.IsPowerOfTwo = function (x) +{ + return (x & (x - 1)) === 0; +}; + +OV.NextPowerOfTwo = function (x) +{ + if (OV.IsPowerOfTwo (x)) { + return x; + } + let npot = Math.pow (2, Math.ceil (Math.log (x) / Math.log (2))); + return parseInt (npot, 10); +}; + +OV.ResizeImageToPowerOfTwoSides = function (image) +{ + if (OV.IsPowerOfTwo (image.width) && OV.IsPowerOfTwo (image.height)) { + return image; + } + + let width = OV.NextPowerOfTwo (image.width); + let height = OV.NextPowerOfTwo (image.height); + + let canvas = document.createElement ('canvas'); + canvas.width = width; + canvas.height = height; + + let context = canvas.getContext ('2d'); + context.drawImage (image, 0, 0, width, height); + return context.getImageData (0, 0, width, height); +}; diff --git a/source/io/binaryreader.js b/source/io/binaryreader.js new file mode 100644 index 0000000..94e7138 --- /dev/null +++ b/source/io/binaryreader.js @@ -0,0 +1,109 @@ +OV.BinaryReader = class +{ + constructor (arrayBuffer, isLittleEndian) + { + this.arrayBuffer = arrayBuffer; + this.dataView = new DataView (arrayBuffer); + this.isLittleEndian = isLittleEndian; + this.position = 0; + } + + GetPosition () + { + return this.position; + } + + SetPosition (position) + { + this.position = position; + } + + GetByteLength () + { + return this.arrayBuffer.byteLength; + } + + Skip (bytes) + { + this.position = this.position + bytes; + } + + End () + { + return this.position >= this.arrayBuffer.byteLength; + } + + ReadArrayBuffer (byteLength) + { + let originalBufferView = new Uint8Array (this.arrayBuffer); + let arrayBuffer = new ArrayBuffer (byteLength); + let bufferView = new Uint8Array (arrayBuffer); + let subArray = originalBufferView.subarray (this.position, this.position + byteLength); + bufferView.set (subArray, 0); + this.position += byteLength; + return arrayBuffer; + } + + ReadBoolean8 () + { + let result = this.dataView.getInt8 (this.position); + this.position = this.position + 1; + return result ? true : false; + } + + ReadCharacter8 () + { + let result = this.dataView.getInt8 (this.position); + this.position = this.position + 1; + return result; + } + + ReadUnsignedCharacter8 () + { + let result = this.dataView.getUint8 (this.position); + this.position = this.position + 1; + return result; + } + + ReadInteger16 () + { + let result = this.dataView.getInt16 (this.position, this.isLittleEndian); + this.position = this.position + 2; + return result; + } + + ReadUnsignedInteger16 () + { + let result = this.dataView.getUint16 (this.position, this.isLittleEndian); + this.position = this.position + 2; + return result; + } + + ReadInteger32 () + { + let result = this.dataView.getInt32 (this.position, this.isLittleEndian); + this.position = this.position + 4; + return result; + } + + ReadUnsignedInteger32 () + { + let result = this.dataView.getUint32 (this.position, this.isLittleEndian); + this.position = this.position + 4; + return result; + } + + ReadFloat32 () + { + let result = this.dataView.getFloat32 (this.position, this.isLittleEndian); + this.position = this.position + 4; + return result; + } + + ReadDouble64 () + { + let result = this.dataView.getFloat64 (this.position, this.isLittleEndian); + this.position = this.position + 8; + return result; + } +}; diff --git a/source/io/binarywriter.js b/source/io/binarywriter.js new file mode 100644 index 0000000..45db254 --- /dev/null +++ b/source/io/binarywriter.js @@ -0,0 +1,92 @@ +OV.BinaryWriter = class +{ + constructor (byteLength, isLittleEndian) + { + this.arrayBuffer = new ArrayBuffer (byteLength); + this.dataView = new DataView (this.arrayBuffer); + this.isLittleEndian = isLittleEndian; + this.position = 0; + } + + GetPosition () + { + return this.position; + } + + SetPosition (position) + { + this.position = position; + } + + End () + { + return this.position >= this.arrayBuffer.byteLength; + } + + GetBuffer () + { + return this.arrayBuffer; + } + + WriteArrayBuffer (arrayBuffer) + { + let bufferView = new Uint8Array (arrayBuffer); + let thisBufferView = new Uint8Array (this.arrayBuffer); + thisBufferView.set (bufferView, this.position); + this.position += arrayBuffer.byteLength; + } + + WriteBoolean8 (val) + { + this.dataView.setInt8 (this.position, val ? 1 : 0); + this.position = this.position + 1; + } + + WriteCharacter8 (val) + { + this.dataView.setInt8 (this.position, val); + this.position = this.position + 1; + } + + WriteUnsignedCharacter8 (val) + { + this.dataView.setUint8 (this.position, val); + this.position = this.position + 1; + } + + WriteInteger16 (val) + { + this.dataView.setInt16 (this.position, val, this.isLittleEndian); + this.position = this.position + 2; + } + + WriteUnsignedInteger16 (val) + { + this.dataView.setUint16 (this.position, val, this.isLittleEndian); + this.position = this.position + 2; + } + + WriteInteger32 (val) + { + this.dataView.setInt32 (this.position, val, this.isLittleEndian); + this.position = this.position + 4; + } + + WriteUnsignedInteger32 (val) + { + this.dataView.setUint32 (this.position, val, this.isLittleEndian); + this.position = this.position + 4; + } + + WriteFloat32 (val) + { + this.dataView.setFloat32 (this.position, val, this.isLittleEndian); + this.position = this.position + 4; + } + + WriteDouble64 (val) + { + this.dataView.setFloat64 (this.position, val, this.isLittleEndian); + this.position = this.position + 8; + } +}; diff --git a/source/io/bufferutils.js b/source/io/bufferutils.js new file mode 100644 index 0000000..17965e5 --- /dev/null +++ b/source/io/bufferutils.js @@ -0,0 +1,56 @@ +OV.ArrayBufferToUtf8String = function (buffer) +{ + let decoder = new TextDecoder ('utf-8'); + return decoder.decode (buffer); +}; + +OV.ArrayBufferToAsciiString = function (buffer) +{ + let text = ''; + let bufferView = new Uint8Array (buffer); + for (let i = 0; i < bufferView.byteLength; i++) { + text += String.fromCharCode (bufferView[i]); + } + return text; +}; + +OV.AsciiStringToArrayBuffer = function (str) +{ + let buffer = new ArrayBuffer (str.length); + let bufferView = new Uint8Array (buffer); + for (let i = 0; i < str.length; i++) { + bufferView[i] = str.charCodeAt (i); + } + return buffer; +}; + +OV.Base64DataURIToArrayBuffer = function (uri) +{ + let dataPrefix = 'data:'; + if (!uri.startsWith (dataPrefix)) { + return null; + } + + let mimeSeparator = uri.indexOf (';'); + if (mimeSeparator === -1) { + return null; + } + + let bufferSeparator = uri.indexOf (','); + if (bufferSeparator === -1) { + return null; + } + + let mimeType = uri.substr (dataPrefix.length, mimeSeparator - 5); + let base64String = atob (uri.substr (bufferSeparator + 1)); + let buffer = new ArrayBuffer (base64String.length); + let bufferView = new Uint8Array (buffer); + for (let i = 0; i < base64String.length; i++) { + bufferView[i] = base64String.charCodeAt (i); + } + + return { + mimeType : mimeType, + buffer : buffer + }; +}; diff --git a/source/io/fileutils.js b/source/io/fileutils.js new file mode 100644 index 0000000..3bc01fb --- /dev/null +++ b/source/io/fileutils.js @@ -0,0 +1,125 @@ +OV.FileSource = +{ + Url : 1, + File : 2 +}; + +OV.FileFormat = +{ + Text : 1, + Binary : 2 +}; + +OV.GetFileName = function (filePath) +{ + let firstSeparator = filePath.lastIndexOf ('/'); + if (firstSeparator === -1) { + firstSeparator = filePath.lastIndexOf ('\\'); + } + let fileName = filePath; + if (firstSeparator !== -1) { + fileName = filePath.substr (firstSeparator + 1); + } + return decodeURI (fileName); +}; + +OV.GetFileExtension = function (fileName) +{ + let firstPoint = fileName.lastIndexOf ('.'); + if (firstPoint === -1) { + return ''; + } + return fileName.substr (firstPoint + 1); +}; + +OV.RequestUrl = function (url, format, callbacks) +{ + function OnSuccess (result) + { + if (callbacks.success) { + callbacks.success (result); + } + if (callbacks.complete) { + callbacks.complete (); + } + } + + function OnError () + { + if (callbacks.error) { + callbacks.error (); + } + if (callbacks.complete) { + callbacks.complete (); + } + } + + let request = new XMLHttpRequest (); + request.open ('GET', url, true); + if (format === OV.FileFormat.Text) { + request.responseType = 'text'; + } else if (format === OV.FileFormat.Binary) { + request.responseType = 'arraybuffer'; + } else { + OnError (); + return; + } + + request.onload = function () { + if (request.status === 200) { + let response = request.response; + OnSuccess (response); + } else { + OnError (); + } + }; + + request.onerror = function () { + OnError (); + }; + + request.send (null); +}; + +OV.ReadFile = function (file, format, callbacks) +{ + function OnSuccess (result) + { + if (callbacks.success) { + callbacks.success (result); + } + if (callbacks.complete) { + callbacks.complete (); + } + } + + function OnError () + { + if (callbacks.error) { + callbacks.error (); + } + if (callbacks.complete) { + callbacks.complete (); + } + } + + let reader = new FileReader (); + + reader.onloadend = function (event) { + if (event.target.readyState === FileReader.DONE) { + OnSuccess (event.target.result); + } + }; + + reader.onerror = function () { + OnError (); + }; + + if (format === OV.FileFormat.Text) { + reader.readAsText (file); + } else if (format === OV.FileFormat.Binary) { + reader.readAsArrayBuffer (file); + } else { + OnError (); + } +}; diff --git a/source/io/textwriter.js b/source/io/textwriter.js new file mode 100644 index 0000000..7b92798 --- /dev/null +++ b/source/io/textwriter.js @@ -0,0 +1,41 @@ +OV.TextWriter = class +{ + constructor () + { + this.text = ''; + this.indentation = 0; + } + + GetText () + { + return this.text; + } + + Indent (diff) + { + this.indentation += diff; + } + + WriteArrayLine (arr) + { + this.WriteLine (arr.join (' ')); + } + + WriteLine (str) + { + this.WriteIndentation (); + this.Write (str + '\n'); + } + + WriteIndentation () + { + for (let i = 0; i < this.indentation; i++) { + this.Write (' '); + } + } + + Write (str) + { + this.text += str; + } +}; diff --git a/source/model/mesh.js b/source/model/mesh.js new file mode 100644 index 0000000..ab3927f --- /dev/null +++ b/source/model/mesh.js @@ -0,0 +1,100 @@ +OV.Mesh = class +{ + constructor () + { + this.name = ''; + this.vertices = []; + this.normals = []; + this.uvs = []; + this.triangles = []; + } + + GetName () + { + return this.name; + } + + SetName (name) + { + this.name = name; + } + + VertexCount () + { + return this.vertices.length; + } + + NormalCount () + { + return this.normals.length; + } + + TextureUVCount () + { + return this.uvs.length; + } + + TriangleCount () + { + return this.triangles.length; + } + + AddVertex (vertex) + { + this.vertices.push (vertex); + return this.vertices.length - 1; + } + + SetVertex (index, vertex) + { + this.vertices[index] = vertex; + } + + GetVertex (index) + { + return this.vertices[index]; + } + + AddNormal (normal) + { + this.normals.push (normal); + return this.normals.length - 1; + } + + SetNormal (index, normal) + { + this.normals[index] = normal; + } + + GetNormal (index) + { + return this.normals[index]; + } + + AddTextureUV (uv) + { + this.uvs.push (uv); + return this.uvs.length - 1; + } + + SetTextureUV (index, uv) + { + this.uvs[index] = uv; + } + + GetTextureUV (index) + { + return this.uvs[index]; + } + + AddTriangle (triangle) + { + this.triangles.push (triangle); + return this.triangles.length - 1; + } + + GetTriangle (index) + { + return this.triangles[index]; + } +}; diff --git a/source/model/meshbuffer.js b/source/model/meshbuffer.js new file mode 100644 index 0000000..df203a4 --- /dev/null +++ b/source/model/meshbuffer.js @@ -0,0 +1,144 @@ +OV.MeshPrimitiveBuffer = class +{ + constructor () + { + this.indices = []; + this.vertices = []; + this.normals = []; + this.uvs = []; + this.material = null; + } + + GetByteLength (indexTypeSize, numberTypeSize) + { + let indexCount = this.indices.length; + let numberCount = this.vertices.length + this.normals.length + this.uvs.length; + return indexCount * indexTypeSize + numberCount * numberTypeSize; + } +}; + +OV.MeshBuffer = class +{ + constructor () + { + this.primitives = []; + } + + GetByteLength (indexTypeSize, numberTypeSize) + { + let byteLength = 0; + for (let i = 0; i < this.primitives.length; i++) { + let primitive = this.primitives[i]; + byteLength += primitive.GetByteLength (indexTypeSize, numberTypeSize); + } + return byteLength; + } +}; + +OV.ConvertMeshToMeshBuffer = function (mesh) +{ + function AddVertexToPrimitiveBuffer (mesh, vertexIndex, normalIndex, uvIndex, primitiveBuffer, primitiveMaps) + { + function GetUVOrDefault (mesh, uvIndex, forceUVs) + { + if (uvIndex !== null) { + return mesh.GetTextureUV (uvIndex); + } else if (forceUVs) { + return new OV.Coord2D (0.0, 0.0); + } else { + return null; + } + } + + function AddVertex (mesh, vertexIndex, normalIndex, uvIndex, primitiveBuffer) + { + let forceUVs = mesh.TextureUVCount () > 0; + let vertex = mesh.GetVertex (vertexIndex); + let normal = mesh.GetNormal (normalIndex); + let primitiveVertexIndex = primitiveBuffer.vertices.length / 3; + primitiveBuffer.indices.push (primitiveVertexIndex); + primitiveBuffer.vertices.push (vertex.x, vertex.y, vertex.z); + primitiveBuffer.normals.push (normal.x, normal.y, normal.z); + let uv = GetUVOrDefault (mesh, uvIndex, forceUVs); + if (uv !== null) { + primitiveBuffer.uvs.push (uv.x, uv.y); + } + return { + index : primitiveVertexIndex, + normal : normal, + uv : uv + }; + } + + function FindMatchingPrimitiveVertex (mesh, primitiveVertices, normalIndex, uvIndex) + { + for (let i = 0; i < primitiveVertices.length; i++) { + let primitiveVertex = primitiveVertices[i]; + let normal = mesh.GetNormal (normalIndex); + let equalNormal = OV.CoordIsEqual3D (primitiveVertex.normal, normal); + let equalUv = false; + if (primitiveVertex.uv === null && uvIndex === null) { + equalUv = true; + } else { + let uv = GetUVOrDefault (mesh, uvIndex, true); + equalUv = OV.CoordIsEqual2D (primitiveVertex.uv, uv); + } + if (equalNormal && equalUv) { + return primitiveVertex; + } + } + return null; + } + + let primitiveVertices = primitiveMaps.meshToPrimitiveVertices[vertexIndex]; + if (primitiveVertices === undefined) { + let primitiveVertex = AddVertex (mesh, vertexIndex, normalIndex, uvIndex, primitiveBuffer); + primitiveMaps.meshToPrimitiveVertices[vertexIndex] = [primitiveVertex]; + } else { + let existingPrimitiveVertex = FindMatchingPrimitiveVertex (mesh, primitiveVertices, normalIndex, uvIndex); + if (existingPrimitiveVertex !== null) { + primitiveBuffer.indices.push (existingPrimitiveVertex.index); + } else { + let primitiveVertex = AddVertex (mesh, vertexIndex, normalIndex, uvIndex, primitiveBuffer); + primitiveVertices.push (primitiveVertex); + } + } + } + + let meshBuffer = new OV.MeshBuffer (); + + let triangleCount = mesh.TriangleCount (); + if (triangleCount === 0) { + return null; + } + + let triangleIndices = []; + for (let i = 0; i < triangleCount; i++) { + triangleIndices.push (i); + } + triangleIndices.sort (function (a, b) { + let aTriangle = mesh.GetTriangle (a); + let bTriangle = mesh.GetTriangle (b); + return aTriangle.mat - bTriangle.mat; + }); + + let primitiveBuffer = null; + let primitiveMaps = null; + for (let i = 0; i < triangleIndices.length; i++) { + let triangleIndex = triangleIndices[i]; + let triangle = mesh.GetTriangle (triangleIndex); + if (primitiveBuffer === null || primitiveBuffer.material !== triangle.mat) { + primitiveBuffer = new OV.MeshPrimitiveBuffer (); + primitiveBuffer.material = triangle.mat; + primitiveMaps = { + meshToPrimitiveVertices : {} + }; + meshBuffer.primitives.push (primitiveBuffer); + } + AddVertexToPrimitiveBuffer (mesh, triangle.v0, triangle.n0, triangle.u0, primitiveBuffer, primitiveMaps); + AddVertexToPrimitiveBuffer (mesh, triangle.v1, triangle.n1, triangle.u1, primitiveBuffer, primitiveMaps); + AddVertexToPrimitiveBuffer (mesh, triangle.v2, triangle.n2, triangle.u2, primitiveBuffer, primitiveMaps); + } + + return meshBuffer; +}; diff --git a/source/model/model.js b/source/model/model.js new file mode 100644 index 0000000..0f459c0 --- /dev/null +++ b/source/model/model.js @@ -0,0 +1,105 @@ +OV.Model = class +{ + constructor () + { + this.name = ''; + this.materials = []; + this.meshes = []; + } + + GetName () + { + return this.name; + } + + SetName (name) + { + this.name = name; + } + + MaterialCount () + { + return this.materials.length; + } + + MeshCount () + { + return this.meshes.length; + } + + VertexCount () + { + let count = 0; + for (let i = 0; i < this.meshes.length; i++) { + count += this.meshes[i].VertexCount (); + } + return count; + } + + NormalCount () + { + let count = 0; + for (let i = 0; i < this.meshes.length; i++) { + count += this.meshes[i].NormalCount (); + } + return count; + } + + TextureUVCount () + { + let count = 0; + for (let i = 0; i < this.meshes.length; i++) { + count += this.meshes[i].TextureUVCount (); + } + return count; + } + + TriangleCount () + { + let count = 0; + for (let i = 0; i < this.meshes.length; i++) { + count += this.meshes[i].TriangleCount (); + } + return count; + } + + AddMaterial (material) + { + this.materials.push (material); + return this.materials.length - 1; + } + + GetMaterial (index) + { + return this.materials[index]; + } + + AddMesh (mesh) + { + this.meshes.push (mesh); + return this.meshes.length - 1; + } + + AddMeshToIndex (mesh, index) + { + this.meshes.splice (index, 0, mesh); + return index; + } + + RemoveMesh (index) + { + this.meshes.splice (index, 1); + } + + GetMesh (index) + { + return this.meshes[index]; + } + + Clear () + { + this.name = ''; + this.materials = []; + this.meshes = []; + } +}; diff --git a/source/model/modelentities.js b/source/model/modelentities.js new file mode 100644 index 0000000..39bbe09 --- /dev/null +++ b/source/model/modelentities.js @@ -0,0 +1,229 @@ +OV.SRGBToLinear = function (component) +{ + if (component < 0.04045) { + return component * 0.0773993808; + } else { + return Math.pow (component * 0.9478672986 + 0.0521327014, 2.4); + } +}; + +OV.LinearToSRGB = function (component) +{ + if (component < 0.0031308) { + return component * 12.92; + } else { + return 1.055 * (Math.pow (component, 0.41666)) - 0.055; + } +}; + +OV.Color = class +{ + constructor (r, g, b) + { + this.r = r; // 0 .. 255 + this.g = g; // 0 .. 255 + this.b = b; // 0 .. 255 + } + + ToHexString () + { + function IntegerToHex (intVal) + { + let result = parseInt (intVal, 10).toString (16); + while (result.length < 2) { + result = '0' + result; + } + return result; + } + + let r = IntegerToHex (this.r); + let g = IntegerToHex (this.g); + let b = IntegerToHex (this.b); + return r + g + b; + } + + Clone () + { + return new OV.Color (this.r, this.g, this.b); + } +}; + +OV.TextureMap = class +{ + constructor () + { + this.name = null; + this.url = null; + this.offset = new OV.Coord2D (0.0, 0.0); + this.scale = new OV.Coord2D (1.0, 1.0); + this.rotation = 0.0; // radians + } + + HasTransformation () + { + if (!OV.CoordIsEqual2D (this.offset, new OV.Coord2D (0.0, 0.0))) { + return true; + } + if (!OV.CoordIsEqual2D (this.scale, new OV.Coord2D (1.0, 1.0))) { + return true; + } + if (!OV.IsEqual (this.rotation, 0.0)) { + return true; + } + return false; + } + + Clone () + { + let cloned = new OV.TextureMap (); + cloned.name = this.name; + cloned.url = this.url; + cloned.offset = this.offset.Clone (); + cloned.scale = this.scale.Clone (); + cloned.rotation = this.rotation; + return cloned; + } +}; + +OV.Material = class +{ + constructor () + { + this.name = ''; + + this.ambient = new OV.Color (0, 0, 0); + this.diffuse = new OV.Color (0, 0, 0); + this.specular = new OV.Color (0, 0, 0); + this.emissive = new OV.Color (0, 0, 0); + + this.shininess = 0.0; // 0.0 .. 1.0 + this.opacity = 1.0; // 0.0 .. 1.0 + + this.diffuseMap = null; + this.specularMap = null; + this.bumpMap = null; + this.normalMap = null; + this.emissiveMap = null; + + this.alphaTest = 0.0; // 0.0 .. 1.0 + this.transparent = false; + this.multiplyDiffuseMap = false; + } + + Clone () + { + let cloned = new OV.Material (); + + cloned.name = this.name; + + cloned.ambient = this.ambient.Clone (); + cloned.diffuse = this.diffuse.Clone (); + cloned.specular = this.specular.Clone (); + cloned.emissive = this.emissive.Clone (); + + cloned.shininess = this.shininess; + cloned.opacity = this.opacity; + + cloned.diffuseMap = this.CloneTextureMap (this.diffuseMap); + cloned.specularMap = this.CloneTextureMap (this.specularMap); + cloned.bumpMap = this.CloneTextureMap (this.bumpMap); + cloned.normalMap = this.CloneTextureMap (this.normalMap); + cloned.emissiveMap = this.CloneTextureMap (this.emissiveMap); + + cloned.alphaTest = this.alphaTest; + cloned.transparent = this.transparent; + cloned.multiplyDiffuseMap = this.multiplyDiffuseMap; + + return cloned; + } + + CloneTextureMap (textureMap) + { + if (textureMap === null) { + return null; + } + return textureMap.Clone (); + } +}; + +OV.Triangle = class +{ + constructor (v0, v1, v2) + { + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + this.n0 = null; + this.n1 = null; + this.n2 = null; + + this.u0 = null; + this.u1 = null; + this.u2 = null; + + this.mat = null; + this.curve = null; + } + + HasVertices () + { + return this.v0 !== null && this.v1 !== null && this.v2 !== null; + } + + HasNormals () + { + return this.n0 !== null && this.n1 !== null && this.n2 !== null; + } + + HasTextureUVs () + { + return this.u0 !== null && this.u1 !== null && this.u2 !== null; + } + + SetVertices (v0, v1, v2) + { + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + return this; + } + + SetNormals (n0, n1, n2) + { + this.n0 = n0; + this.n1 = n1; + this.n2 = n2; + return this; + } + + SetTextureUVs (u0, u1, u2) + { + this.u0 = u0; + this.u1 = u1; + this.u2 = u2; + return this; + } + + SetMaterial (mat) + { + this.mat = mat; + return this; + } + + SetCurve (curve) + { + this.curve = curve; + return this; + } + + Clone () + { + let cloned = new OV.Triangle (this.v0, this.v1, this.v2); + cloned.SetNormals (this.n0, this.n1, this.n2); + cloned.SetTextureUVs (this.u0, this.u1, this.u2); + cloned.SetMaterial (this.mat); + cloned.SetCurve (this.curve); + return cloned; + } +}; diff --git a/source/model/modelfinalization.js b/source/model/modelfinalization.js new file mode 100644 index 0000000..52ee632 --- /dev/null +++ b/source/model/modelfinalization.js @@ -0,0 +1,241 @@ +OV.FinalizeModel = function (model, getDefaultMaterial) +{ + function FinalizeMesh (mesh, getDefaultMaterialIndex) + { + function CalculateCurveNormals (mesh) + { + function AddAverageNormal (mesh, triangle, vertexIndex, triangleNormals, vertexToTriangles) + { + let averageNormal = new OV.Coord3D (0.0, 0.0, 0.0); + let averageCount = 0; + + let neigTriangles = vertexToTriangles[vertexIndex]; + for (let i = 0; i < neigTriangles.length; i++) { + let neigIndex = neigTriangles[i]; + let neigTriangle = mesh.GetTriangle (neigIndex); + if (triangle.curve === neigTriangle.curve) { + averageNormal = OV.AddCoord3D (averageNormal, triangleNormals[neigIndex]); + averageCount = averageCount + 1; + } + } + + averageNormal.MultiplyScalar (1.0 / averageCount); + averageNormal.Normalize (); + return mesh.AddNormal (averageNormal); + } + + let triangleNormals = []; + let vertexToTriangles = {}; + + for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) { + vertexToTriangles[vertexIndex] = []; + } + + for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) { + let triangle = mesh.GetTriangle (triangleIndex); + let v0 = mesh.GetVertex (triangle.v0); + let v1 = mesh.GetVertex (triangle.v1); + let v2 = mesh.GetVertex (triangle.v2); + let normal = OV.CalculateTriangleNormal (v0, v1, v2); + triangleNormals.push (normal); + vertexToTriangles[triangle.v0].push (triangleIndex); + vertexToTriangles[triangle.v1].push (triangleIndex); + vertexToTriangles[triangle.v2].push (triangleIndex); + } + + for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) { + let triangle = mesh.GetTriangle (triangleIndex); + if (triangle.n0 === null || triangle.n1 === null || triangle.n2 === null) { + let n0 = AddAverageNormal (mesh, triangle, triangle.v0, triangleNormals, vertexToTriangles); + let n1 = AddAverageNormal (mesh, triangle, triangle.v1, triangleNormals, vertexToTriangles); + let n2 = AddAverageNormal (mesh, triangle, triangle.v2, triangleNormals, vertexToTriangles); + triangle.SetNormals (n0, n1, n2); + } + } + } + + function FinalizeTriangle (mesh, triangle, status) + { + if (!triangle.HasNormals ()) { + if (triangle.curve === null || triangle.curve === 0) { + let v0 = mesh.GetVertex (triangle.v0); + let v1 = mesh.GetVertex (triangle.v1); + let v2 = mesh.GetVertex (triangle.v2); + let normal = OV.CalculateTriangleNormal (v0, v1, v2); + let normalIndex = mesh.AddNormal (normal); + triangle.SetNormals (normalIndex, normalIndex, normalIndex); + } else { + status.calculateCurveNormals = true; + } + } + if (triangle.mat === null) { + triangle.mat = status.getDefaultMaterialIndex (); + } + if (triangle.curve === null) { + triangle.curve = 0; + } + } + + let status = { + getDefaultMaterialIndex : getDefaultMaterialIndex, + calculateCurveNormals : false + }; + + for (let i = 0; i < mesh.TriangleCount (); i++) { + let triangle = mesh.GetTriangle (i); + FinalizeTriangle (mesh, triangle, status); + } + + if (status.calculateCurveNormals) { + CalculateCurveNormals (mesh); + } + } + + let defaultMaterialIndex = null; + let getDefaultMaterialIndex = function () { + if (defaultMaterialIndex === null) { + defaultMaterialIndex = model.AddMaterial (getDefaultMaterial ()); + } + return defaultMaterialIndex; + }; + + for (let i = 0; i < model.MeshCount (); i++) { + let mesh = model.GetMesh (i); + if (mesh.TriangleCount () === 0) { + model.RemoveMesh (i); + i = i - 1; + continue; + } + FinalizeMesh (mesh, getDefaultMaterialIndex); + } +}; + +OV.CheckModel = function (model) +{ + function IsCorrectValue (val) + { + if (val === undefined || val === null) { + return false; + } + return true; + } + + function IsCorrectNumber (val) + { + if (!IsCorrectValue (val)) { + return false; + } + if (isNaN (val)) { + return false; + } + return true; + } + + function IsCorrectIndex (val, count) + { + if (!IsCorrectNumber (val)) { + return false; + } + if (val < 0 || val >= count) { + return false; + } + return true; + } + + function CheckMesh (model, mesh) + { + function CheckTriangle (model, mesh, triangle) + { + if (!IsCorrectIndex (triangle.v0, mesh.VertexCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.v1, mesh.VertexCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.v2, mesh.VertexCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.n0, mesh.NormalCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.n1, mesh.NormalCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.n2, mesh.NormalCount ())) { + return false; + } + if (triangle.HasTextureUVs ()) { + if (!IsCorrectIndex (triangle.u0, mesh.TextureUVCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.u1, mesh.TextureUVCount ())) { + return false; + } + if (!IsCorrectIndex (triangle.u2, mesh.TextureUVCount ())) { + return false; + } + } + if (!IsCorrectIndex (triangle.mat, model.MaterialCount ())) { + return false; + } + if (!IsCorrectNumber (triangle.curve)) { + return false; + } + + return true; + } + + for (let i = 0; i < mesh.VertexCount (); i++) { + let vertex = mesh.GetVertex (i); + if (!IsCorrectNumber (vertex.x)) { + return false; + } + if (!IsCorrectNumber (vertex.y)) { + return false; + } + if (!IsCorrectNumber (vertex.z)) { + return false; + } + } + + for (let i = 0; i < mesh.NormalCount (); i++) { + let normal = mesh.GetNormal (i); + if (!IsCorrectNumber (normal.x)) { + return false; + } + if (!IsCorrectNumber (normal.y)) { + return false; + } + if (!IsCorrectNumber (normal.z)) { + return false; + } + } + + for (let i = 0; i < mesh.TextureUVCount (); i++) { + let uv = mesh.GetTextureUV (i); + if (!IsCorrectNumber (uv.x)) { + return false; + } + if (!IsCorrectNumber (uv.y)) { + return false; + } + } + + for (let i = 0; i < mesh.TriangleCount (); i++) { + let triangle = mesh.GetTriangle (i); + if (!CheckTriangle (model, mesh, triangle)) { + return false; + } + } + + return true; + } + + for (let i = 0; i < model.MeshCount (); i++) { + let mesh = model.GetMesh (i); + if (!CheckMesh (model, mesh)) { + return false; + } + } + return true; +}; diff --git a/source/model/modelutils.js b/source/model/modelutils.js new file mode 100644 index 0000000..e2f5df3 --- /dev/null +++ b/source/model/modelutils.js @@ -0,0 +1,163 @@ +OV.CalculateTriangleNormal = function (v0, v1, v2) +{ + let v = OV.SubCoord3D (v1, v0); + let w = OV.SubCoord3D (v2, v0); + + let normal = new OV.Coord3D ( + v.y * w.z - v.z * w.y, + v.z * w.x - v.x * w.z, + v.x * w.y - v.y * w.x + ); + + normal.Normalize (); + return normal; +}; + +OV.TransformMesh = function (mesh, transformation) +{ + if (transformation.IsIdentity ()) { + return; + } + + for (let i = 0; i < mesh.VertexCount (); i++) { + let vertex = mesh.GetVertex (i); + let transformed = transformation.TransformCoord3D (vertex); + vertex.x = transformed.x; + vertex.y = transformed.y; + vertex.z = transformed.z; + } + + if (mesh.NormalCount () > 0) { + let trs = transformation.GetMatrix ().DecomposeTRS (); + let normalMatrix = new OV.Matrix ().ComposeTRS ([0.0, 0.0, 0.0], trs.rotation, [1.0, 1.0, 1.0]); + let normalTransformation = new OV.Transformation (normalMatrix); + for (let i = 0; i < mesh.NormalCount (); i++) { + let normal = mesh.GetNormal (i); + let transformed = normalTransformation.TransformCoord3D (normal); + normal.x = transformed.x; + normal.y = transformed.y; + normal.z = transformed.z; + } + } +}; + +OV.GetMeshBoundingBox = function (mesh) +{ + let min = new OV.Coord3D (Infinity, Infinity, Infinity); + let max = new OV.Coord3D (-Infinity, -Infinity, -Infinity); + + for (let i = 0; i < mesh.VertexCount (); i++) { + let vertex = mesh.GetVertex (i); + min.x = Math.min (min.x, vertex.x); + min.y = Math.min (min.y, vertex.y); + min.z = Math.min (min.z, vertex.z); + max.x = Math.max (max.x, vertex.x); + max.y = Math.max (max.y, vertex.y); + max.z = Math.max (max.z, vertex.z); + } + + return [min, max]; +}; + +OV.IsModelEmpty = function (model) +{ + for (let i = 0; i < model.MeshCount (); i++) { + let mesh = model.GetMesh (i); + if (mesh.TriangleCount () > 0) { + return false; + } + } + return true; +}; + +OV.CloneMesh = function (mesh) +{ + let cloned = new OV.Mesh (); + + cloned.SetName (mesh.GetName ()); + + for (let i = 0; i < mesh.VertexCount (); i++) { + let vertex = mesh.GetVertex (i); + cloned.AddVertex (vertex.Clone ()); + } + + for (let i = 0; i < mesh.NormalCount (); i++) { + let normal = mesh.GetNormal (i); + cloned.AddNormal (normal.Clone ()); + } + + for (let i = 0; i < mesh.TextureUVCount (); i++) { + let uv = mesh.GetTextureUV (i); + cloned.AddTextureUV (uv.Clone ()); + } + + for (let i = 0; i < mesh.TriangleCount (); i++) { + let triangle = mesh.GetTriangle (i); + cloned.AddTriangle (triangle.Clone ()); + } + + return cloned; +}; + +OV.CreateMergedModel = function (model) +{ + function MergeMesh (mesh, mergedMesh) + { + let vertexOffset = mergedMesh.VertexCount (); + let normalOffset = mergedMesh.NormalCount (); + let uvOffset = mergedMesh.TextureUVCount (); + + for (let i = 0; i < mesh.VertexCount (); i++) { + let vertex = mesh.GetVertex (i); + mergedMesh.AddVertex (vertex.Clone ()); + } + for (let i = 0; i < mesh.NormalCount (); i++) { + let normal = mesh.GetNormal (i); + mergedMesh.AddNormal (normal.Clone ()); + } + for (let i = 0; i < mesh.TextureUVCount (); i++) { + let uv = mesh.GetTextureUV (i); + mergedMesh.AddTextureUV (uv.Clone ()); + } + + for (let i = 0; i < mesh.TriangleCount (); i++) { + let triangle = mesh.GetTriangle (i); + let newTriangle = triangle.Clone (); + newTriangle.SetVertices ( + triangle.v0 + vertexOffset, + triangle.v1 + vertexOffset, + triangle.v2 + vertexOffset + ); + newTriangle.SetNormals ( + triangle.n0 + normalOffset, + triangle.n1 + normalOffset, + triangle.n2 + normalOffset + ); + if (newTriangle.HasTextureUVs ()) { + newTriangle.SetTextureUVs ( + triangle.u0 + uvOffset, + triangle.u1 + uvOffset, + triangle.u2 + uvOffset + ); + } + mergedMesh.AddTriangle (newTriangle); + } + } + + let mergedModel = new OV.Model (); + mergedModel.SetName (model.GetName ()); + + for (let i = 0; i < model.MaterialCount (); i++) { + let material = model.GetMaterial (i); + mergedModel.AddMaterial (material.Clone ()); + } + + let mergedMesh = new OV.Mesh (); + for (let i = 0; i < model.MeshCount (); i++) { + let mesh = model.GetMesh (i); + MergeMesh (mesh, mergedMesh); + } + + mergedModel.AddMesh (mergedMesh); + return mergedModel; +}; diff --git a/source/viewer/domutils.js b/source/viewer/domutils.js new file mode 100644 index 0000000..bee2004 --- /dev/null +++ b/source/viewer/domutils.js @@ -0,0 +1,21 @@ +OV.GetInnerDimensions = function (element, outerWidth, outerHeight) +{ + function GetInt (parameter) + { + return Math.round (parseFloat (parameter)); + } + + let style = getComputedStyle (element); + let width = outerWidth - + GetInt (style.borderLeftWidth) - GetInt (style.borderRightWidth) - + GetInt (style.marginLeft) - GetInt (style.marginRight) - + GetInt (style.paddingLeft) - GetInt (style.paddingRight); + let height = outerHeight - + GetInt (style.borderTopWidth) - GetInt (style.borderBottomWidth) - + GetInt (style.marginTop) - GetInt (style.marginBottom) - + GetInt (style.paddingTop) - GetInt (style.paddingBottom); + return { + width : width, + height : height + }; +}; diff --git a/source/viewer/domviewer.js b/source/viewer/domviewer.js new file mode 100644 index 0000000..b606cb4 --- /dev/null +++ b/source/viewer/domviewer.js @@ -0,0 +1,83 @@ +OV.Init3DViewerElements = function () +{ + function LoadElement (element) + { + let canvas = document.createElement ('canvas'); + element.appendChild (canvas); + + let viewer = new OV.Viewer (); + viewer.Init (canvas); + + let width = parseInt (element.getAttribute ('width')); + let height = parseInt (element.getAttribute ('height')); + element.style.width = width + 'px'; + element.style.height = height + 'px'; + viewer.Resize (width, height); + + let loader = new OV.ThreeModelLoader (); + let progressDiv = null; + loader.Init ({ + onLoadStart : function () { + canvas.style.display = 'none'; + progressDiv = document.createElement ('div'); + element.appendChild (progressDiv); + progressDiv.innerHTML = 'Loading model...'; + }, + onFilesLoaded : function () { + progressDiv.innerHTML = 'Importing model...'; + }, + onModelImported : function () { + progressDiv.innerHTML = 'Visualizing model...'; + }, + onModelFinished : function (importResult, threeMeshes) { + element.removeChild (progressDiv); + canvas.style.display = 'initial'; + viewer.AddMeshes (threeMeshes); + let boundingSphere = viewer.GetBoundingSphere (function (meshUserData) { + return true; + }); + viewer.AdjustClippingPlanes (boundingSphere); + viewer.FitToWindow (boundingSphere, false); + }, + onTextureLoaded : function () { + viewer.Render (); + }, + onLoadError : function (importerError) { + progressDiv.innerHTML = 'Unknown error.'; + }, + }); + + let model = element.getAttribute ('model'); + if (!model) { + return; + } + + let modelUrls = model.split (','); + if (modelUrls.length === 0) { + return; + } + + let camera = element.getAttribute ('camera'); + if (camera) { + let cameraParams = camera.split (','); + if (cameraParams.length === 9) { + let camera = new OV.Camera ( + new OV.Coord3D (parseFloat (cameraParams[0]), parseFloat (cameraParams[1]), parseFloat (cameraParams[2])), + new OV.Coord3D (parseFloat (cameraParams[3]), parseFloat (cameraParams[4]), parseFloat (cameraParams[5])), + new OV.Coord3D (parseFloat (cameraParams[6]), parseFloat (cameraParams[7]), parseFloat (cameraParams[8])) + ); + viewer.SetCamera (camera); + } + } + + loader.LoadFromUrlList (modelUrls); + } + + window.addEventListener ('load', function () { + let elements = document.getElementsByClassName ('online_3d_viewer'); + for (let i = 0; i < elements.length; i++) { + let element = elements[i]; + LoadElement (element); + } + }); +}; diff --git a/source/viewer/navigation.js b/source/viewer/navigation.js new file mode 100644 index 0000000..4945612 --- /dev/null +++ b/source/viewer/navigation.js @@ -0,0 +1,549 @@ +OV.GetClientCoordinates = function (canvas, clientX, clientY) +{ + if (canvas.getBoundingClientRect) { + let clientRect = canvas.getBoundingClientRect (); + clientX -= clientRect.left; + clientY -= clientRect.top; + } + if (window.pageXOffset && window.pageYOffset) { + clientX += window.pageXOffset; + clientY += window.pageYOffset; + } + return (new OV.Coord2D (clientX, clientY)); +}; + +OV.Camera = class +{ + constructor (eye, center, up) + { + this.eye = eye; + this.center = center; + this.up = up; + } + + Clone () + { + return new OV.Camera ( + this.eye.Clone (), + this.center.Clone (), + this.up.Clone () + ); + } +}; + +OV.MouseInteraction = class +{ + constructor () + { + this.prev = new OV.Coord2D (0.0, 0.0); + this.curr = new OV.Coord2D (0.0, 0,0); + this.diff = new OV.Coord2D (0.0, 0.0); + this.buttons = []; + } + + Down (canvas, ev) + { + this.buttons.push (ev.which); + this.curr = this.GetCurrent (canvas, ev); + this.prev = this.curr.Clone (); + } + + Move (canvas, ev) + { + this.curr = this.GetCurrent (canvas, ev); + this.diff = OV.SubCoord2D (this.curr, this.prev); + this.prev = this.curr.Clone (); + } + + Up (canvas, ev) + { + let buttonIndex = this.buttons.indexOf (ev.which); + if (buttonIndex !== -1) { + this.buttons.splice (buttonIndex, 1); + } + this.curr = this.GetCurrent (canvas, ev); + } + + Leave (canvas, ev) + { + this.buttons = []; + this.curr = this.GetCurrent (canvas, ev); + } + + IsButtonDown () + { + return this.buttons.length > 0; + } + + GetButton () + { + let length = this.buttons.length; + if (length === 0) { + return 0; + } + return this.buttons[length - 1]; + } + + GetMoveDiff () + { + return this.diff; + } + + GetCurrent (canvas, ev) + { + return OV.GetClientCoordinates (canvas, ev.clientX, ev.clientY); + } +}; + +OV.TouchInteraction = class +{ + constructor () + { + this.prevPos = new OV.Coord2D (0.0, 0.0); + this.currPos = new OV.Coord2D (0.0, 0,0); + this.diffPos = new OV.Coord2D (0.0, 0.0); + this.prevDist = 0.0; + this.currDist = 0.0; + this.diffDist = 0.0; + this.fingers = 0; + } + + Start (canvas, ev) + { + if (ev.touches.length === 0) { + return; + } + + this.fingers = ev.touches.length; + + this.currPos = this.GetCurrent (canvas, ev); + this.prevPos = this.currPos.Clone (); + + this.currDist = this.GetTouchDistance (canvas, ev); + this.prevDist = this.currDist; + } + + Move (canvas, ev) + { + if (ev.touches.length === 0) { + return; + } + this.currPos = this.GetCurrent (canvas, ev); + this.diffPos = OV.SubCoord2D (this.currPos, this.prevPos); + this.prevPos = this.currPos.Clone (); + + this.currDist = this.GetTouchDistance (canvas, ev); + this.diffDist = this.currDist - this.prevDist; + this.prevDist = this.currDist; + } + + End (canvas, ev) + { + if (ev.touches.length === 0) { + return; + } + this.fingers = 0; + this.currPos = this.GetCurrent (canvas, ev); + this.currDist = this.GetTouchDistance (canvas, ev); + } + + IsFingerDown () + { + return this.fingers !== 0; + } + + GetFingerCount () + { + return this.fingers; + } + + GetMoveDiff () + { + return this.diffPos; + } + + GetDistanceDiff () + { + return this.diffDist; + } + + GetCurrent (canvas, ev) + { + let coord = null; + if (ev.touches.length !== 0) { + let touchEv = ev.touches[0]; + coord = OV.GetClientCoordinates (canvas, touchEv.pageX, touchEv.pageY); + } + return coord; + } + + GetTouchDistance (canvas, ev) + { + if (ev.touches.length !== 2) { + return 0.0; + } + let touchEv1 = ev.touches[0]; + let touchEv2 = ev.touches[1]; + let distance = OV.CoordDistance2D ( + OV.GetClientCoordinates (canvas, touchEv1.pageX, touchEv1.pageY), + OV.GetClientCoordinates (canvas, touchEv2.pageX, touchEv2.pageY) + ); + return distance; + } +}; + +OV.ClickDetector = class +{ + constructor () + { + this.isClick = false; + this.button = 0; + } + + Down (ev) + { + this.isClick = true; + this.button = ev.which; + } + + Move () + { + this.isClick = false; + } + + Up (ev) + { + if (this.isClick && ev.which !== this.button) { + this.isClick = false; + } + } + + Leave (ev) + { + this.isClick = false; + this.button = 0; + } + + IsClick () + { + return this.isClick; + } +}; + +OV.Navigation = class +{ + constructor (canvas, camera) + { + this.canvas = canvas; + this.camera = camera; + this.orbitCenter = this.camera.center.Clone (); + this.fixUpVector = true; + + this.mouse = new OV.MouseInteraction (); + this.touch = new OV.TouchInteraction (); + this.clickDetector = new OV.ClickDetector (); + + this.onUpdate = null; + this.onClick = null; + + if (this.canvas.addEventListener) { + this.canvas.addEventListener ('mousedown', this.OnMouseDown.bind (this)); + this.canvas.addEventListener ('DOMMouseScroll', this.OnMouseWheel.bind (this)); + this.canvas.addEventListener ('mousewheel', this.OnMouseWheel.bind (this)); + this.canvas.addEventListener ('touchstart', this.OnTouchStart.bind (this)); + this.canvas.addEventListener ('touchmove', this.OnTouchMove.bind (this)); + this.canvas.addEventListener ('touchend', this.OnTouchEnd.bind (this)); + this.canvas.addEventListener ('contextmenu', this.OnContextMenu.bind (this)); + } + if (document.addEventListener) { + document.addEventListener ('mousemove', this.OnMouseMove.bind (this)); + document.addEventListener ('mouseup', this.OnMouseUp.bind (this)); + document.addEventListener ('mouseleave', this.OnMouseLeave.bind (this)); + } + } + + SetUpdateHandler (onUpdate) + { + this.onUpdate = onUpdate; + } + + SetClickHandler (onClick) + { + this.onClick = onClick; + } + + IsFixUpVector () + { + return this.fixUpVector; + } + + SetFixUpVector (fixUpVector) + { + this.fixUpVector = fixUpVector; + } + + GetCamera () + { + return this.camera; + } + + SetCamera (camera) + { + this.camera = camera; + } + + MoveCamera (newCamera, stepCount) + { + function Step (obj, steps, count, index) + { + obj.camera.eye = steps.eye[index]; + obj.camera.center = steps.center[index]; + obj.camera.up = steps.up[index]; + obj.Update (); + + if (index < count - 1) { + requestAnimationFrame (function () { + Step (obj, steps, count, index + 1); + }); + } + } + + if (stepCount === 0) { + this.SetCamera (newCamera); + return; + } + + if (OV.CoordIsEqual3D (this.camera.eye, newCamera.eye) && + OV.CoordIsEqual3D (this.camera.center, newCamera.center) && + OV.CoordIsEqual3D (this.camera.up, newCamera.up)) + { + return; + } + + let tweenFunc = OV.ParabolicTweenFunction; + let obj = this; + let steps = { + eye : OV.TweenCoord3D (this.camera.eye, newCamera.eye, stepCount, tweenFunc), + center : OV.TweenCoord3D (this.camera.center, newCamera.center, stepCount, tweenFunc), + up : OV.TweenCoord3D (this.camera.up, newCamera.up, stepCount, tweenFunc) + }; + requestAnimationFrame (function () { + Step (obj, steps, stepCount, 0); + }); + this.Update (); + } + + FitToSphere (center, radius, fov) + { + if (OV.IsZero (radius)) { + return; + } + + let fitCamera = this.GetFitToSphereCamera (center, radius, fov); + this.camera = fitCamera; + + this.orbitCenter = this.camera.center.Clone (); + this.Update (); + } + + GetFitToSphereCamera (center, radius, fov) + { + if (OV.IsZero (radius)) { + return null; + } + + let fitCamera = this.camera.Clone (); + + let offsetToOrigo = OV.SubCoord3D (fitCamera.center, center); + fitCamera.eye = OV.SubCoord3D (fitCamera.eye, offsetToOrigo); + fitCamera.center = center.Clone (); + + let centerEyeDirection = OV.SubCoord3D (fitCamera.eye, fitCamera.center).Normalize (); + let fieldOfView = fov / 2.0; + if (this.canvas.width < this.canvas.height) { + fieldOfView = fieldOfView * this.canvas.width / this.canvas.height; + } + let distance = radius / Math.sin (fieldOfView * OV.DegRad); + + fitCamera.eye = fitCamera.center.Clone ().Offset (centerEyeDirection, distance); + this.orbitCenter = fitCamera.center.Clone (); + return fitCamera; + } + + OnMouseDown (ev) + { + ev.preventDefault (); + this.mouse.Down (this.canvas, ev); + this.clickDetector.Down (ev); + } + + OnMouseMove (ev) + { + this.mouse.Move (this.canvas, ev); + this.clickDetector.Move (); + if (!this.mouse.IsButtonDown ()) { + return; + } + + let moveDiff = this.mouse.GetMoveDiff (); + let mouseButton = this.mouse.GetButton (); + if (mouseButton === 1) { + let orbitRatio = 0.5; + this.Orbit (moveDiff.x * orbitRatio, moveDiff.y * orbitRatio); + } else if (mouseButton === 3) { + let eyeCenterDistance = OV.CoordDistance3D (this.camera.eye, this.camera.center); + let panRatio = 0.001 * eyeCenterDistance; + this.Pan (moveDiff.x * panRatio, moveDiff.y * panRatio); + } + + this.Update (); + } + + OnMouseUp (ev) + { + this.mouse.Up (this.canvas, ev); + this.clickDetector.Up (ev); + if (this.clickDetector.IsClick ()) { + let isCtrlPressed = (ev.ctrlKey || ev.metaKey); + this.Click (ev.which, isCtrlPressed, ev.clientX, ev.clientY); + } + } + + OnMouseLeave (ev) + { + this.mouse.Leave (this.canvas, ev); + this.clickDetector.Leave (ev); + } + + OnTouchStart (ev) + { + ev.preventDefault (); + this.touch.Start (this.canvas, ev); + } + + OnTouchMove (ev) + { + ev.preventDefault (); + this.touch.Move (this.canvas, ev); + if (!this.touch.IsFingerDown ()) { + return; + } + + let moveDiff = this.touch.GetMoveDiff (); + let distanceDiff = this.touch.GetDistanceDiff (); + let fingerCount = this.touch.GetFingerCount (); + if (fingerCount === 1) { + let orbitRatio = 0.5; + this.Orbit (moveDiff.x * orbitRatio, moveDiff.y * orbitRatio); + } else if (fingerCount === 2) { + let zoomRatio = 0.005; + this.Zoom (distanceDiff * zoomRatio); + let panRatio = 0.001 * OV.CoordDistance3D (this.camera.eye, this.camera.center); + this.Pan (moveDiff.x * panRatio, moveDiff.y * panRatio); + } + + this.Update (); + } + + OnTouchEnd (ev) + { + ev.preventDefault (); + this.touch.End (this.canvas, ev); + } + + OnMouseWheel (ev) + { + ev.preventDefault (); + let params = ev || window.event; + + let delta = 0; + if (params.detail) { + delta = -params.detail; + } else if (params.wheelDelta) { + delta = params.wheelDelta / 40; + } + + let ratio = 0.1; + if (delta < 0) { + ratio = ratio * -1.0; + } + + this.Zoom (ratio); + this.Update (); + } + + OnContextMenu (ev) + { + ev.preventDefault (); + } + + Orbit (angleX, angleY) + { + let radAngleX = angleX * OV.DegRad; + let radAngleY = angleY * OV.DegRad; + + let viewDirection = OV.SubCoord3D (this.camera.center, this.camera.eye).Normalize (); + let horizontalDirection = OV.CrossVector3D (viewDirection, this.camera.up).Normalize (); + let differentCenter = !OV.CoordIsEqual3D (this.orbitCenter, this.camera.center); + + if (this.fixUpVector) { + let originalAngle = OV.VectorAngle3D (viewDirection, this.camera.up); + let newAngle = originalAngle + radAngleY; + if (OV.IsGreater (newAngle, 0.0) && OV.IsLower (newAngle, Math.PI)) { + this.camera.eye.Rotate (horizontalDirection, -radAngleY, this.orbitCenter); + if (differentCenter) { + this.camera.center.Rotate (horizontalDirection, -radAngleY, this.orbitCenter); + } + } + this.camera.eye.Rotate (this.camera.up, -radAngleX, this.orbitCenter); + if (differentCenter) { + this.camera.center.Rotate (this.camera.up, -radAngleX, this.orbitCenter); + } + } else { + let verticalDirection = OV.CrossVector3D (horizontalDirection, viewDirection).Normalize (); + this.camera.eye.Rotate (horizontalDirection, -radAngleY, this.orbitCenter); + this.camera.eye.Rotate (verticalDirection, -radAngleX, this.orbitCenter); + if (differentCenter) { + this.camera.center.Rotate (horizontalDirection, -radAngleY, this.orbitCenter); + this.camera.center.Rotate (verticalDirection, -radAngleX, this.orbitCenter); + } + this.camera.up = verticalDirection; + } + } + + Pan (moveX, moveY) + { + let viewDirection = OV.SubCoord3D (this.camera.center, this.camera.eye).Normalize (); + let horizontalDirection = OV.CrossVector3D (viewDirection, this.camera.up).Normalize (); + let verticalDirection = OV.CrossVector3D (horizontalDirection, viewDirection).Normalize (); + + this.camera.eye.Offset (horizontalDirection, -moveX); + this.camera.center.Offset (horizontalDirection, -moveX); + + this.camera.eye.Offset (verticalDirection, moveY); + this.camera.center.Offset (verticalDirection, moveY); + } + + Zoom (ratio) + { + let direction = OV.SubCoord3D (this.camera.center, this.camera.eye); + let distance = direction.Length (); + let move = distance * ratio; + this.camera.eye.Offset (direction, move); + } + + Update () + { + if (this.onUpdate) { + this.onUpdate (); + } + } + + Click (button, isCtrlPressed, clientX, clientY) + { + if (this.onClick) { + let mouseCoords = OV.GetClientCoordinates (this.canvas, clientX, clientY); + this.onClick (button, isCtrlPressed, mouseCoords); + } + } +}; diff --git a/source/viewer/viewer.js b/source/viewer/viewer.js new file mode 100644 index 0000000..0a8a8fe --- /dev/null +++ b/source/viewer/viewer.js @@ -0,0 +1,375 @@ +OV.GetDefaultCamera = function (direction) +{ + if (direction === OV.Direction.X) { + return new OV.Camera ( + new OV.Coord3D (2.0, -3.0, 1.5), + new OV.Coord3D (0.0, 0.0, 0.0), + new OV.Coord3D (1.0, 0.0, 0.0) + ); + } else if (direction === OV.Direction.Y) { + return new OV.Camera ( + new OV.Coord3D (-1.5, 2.0, 3.0), + new OV.Coord3D (0.0, 0.0, 0.0), + new OV.Coord3D (0.0, 1.0, 0.0) + ); + } else if (direction === OV.Direction.Z) { + return new OV.Camera ( + new OV.Coord3D (-1.5, -3.0, 2.0), + new OV.Coord3D (0.0, 0.0, 0.0), + new OV.Coord3D (0.0, 0.0, 1.0) + ); + } + return null; +}; + +OV.UpVector = class +{ + constructor () + { + this.direction = OV.Direction.Z; + this.isFixed = true; + this.isFlipped = false; + } + + SetDirection (newDirection, oldCamera) + { + this.direction = newDirection; + this.isFlipped = false; + + let defaultCamera = OV.GetDefaultCamera (this.direction); + let defaultDir = OV.SubCoord3D (defaultCamera.eye, defaultCamera.center); + + let distance = OV.CoordDistance3D (oldCamera.center, oldCamera.eye); + let newEye = oldCamera.center.Clone ().Offset (defaultDir, distance); + + let newCamera = oldCamera.Clone (); + if (this.direction === OV.Direction.Y) { + newCamera.up = new OV.Coord3D (0.0, 1.0, 0.0); + newCamera.eye = newEye; + } else if (this.direction === OV.Direction.Z) { + newCamera.up = new OV.Coord3D (0.0, 0.0, 1.0); + newCamera.eye = newEye; + } + return newCamera; + } + + SetFixed (isFixed, oldCamera) + { + this.isFixed = isFixed; + if (this.isFixed) { + return this.SetDirection (this.direction, oldCamera); + } + return null; + } + + Flip (oldCamera) + { + this.isFlipped = !this.isFlipped; + let newCamera = oldCamera.Clone (); + newCamera.up.MultiplyScalar (-1.0); + return newCamera; + } +}; + +OV.Viewer = class +{ + constructor () + { + this.canvas = null; + this.renderer = null; + this.scene = null; + this.camera = null; + this.light = null; + this.navigation = null; + this.upVector = null; + this.settings = { + animationSteps : 40 + }; + } + + Init (canvas) + { + this.canvas = canvas; + this.canvas.id = 'viewer'; + this.canvas.addEventListener ('contenxtmenu', function (ev) { + ev.preventDefault (); + }); + + let parameters = { + canvas : this.canvas, + antialias : true + }; + + this.renderer = new THREE.WebGLRenderer (parameters); + this.renderer.setClearColor ('#ffffff', 1); + this.renderer.setSize (this.canvas.width, this.canvas.height); + + this.scene = new THREE.Scene (); + + this.InitCamera (); + this.InitLights (); + + this.Render (); + } + + SetClickHandler (onClick) + { + this.navigation.SetClickHandler (onClick); + } + + GetCamera () + { + return this.navigation.GetCamera (); + } + + SetCamera (camera) + { + this.navigation.SetCamera (camera); + this.Render (); + } + + Resize (width, height) + { + let innerSize = OV.GetInnerDimensions (this.canvas, width, height); + this.camera.aspect = innerSize.width / innerSize.height; + this.camera.updateProjectionMatrix (); + this.renderer.setSize (innerSize.width, innerSize.height); + this.Render (); + } + + FitToWindow (boundingSphere, animation) + { + if (boundingSphere === null) { + return; + } + let center = new OV.Coord3D (boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z); + let radius = boundingSphere.radius; + let fov = this.camera.fov; + if (animation) { + let newCamera = this.navigation.GetFitToSphereCamera (center, radius, fov); + this.navigation.MoveCamera (newCamera, this.settings.animationSteps); + } else { + this.navigation.FitToSphere (center, radius, fov); + } + } + + AdjustClippingPlanes (boundingSphere) + { + if (boundingSphere === null) { + return; + } + if (boundingSphere.radius < 10.0) { + this.camera.near = 0.01; + this.camera.far = 100.0; + } else if (boundingSphere.radius < 100.0) { + this.camera.near = 0.1; + this.camera.far = 1000.0; + } else if (boundingSphere.radius < 1000.0) { + this.camera.near = 10.0; + this.camera.far = 10000.0; + } else { + this.camera.near = 100.0; + this.camera.far = 1000000.0; + } + this.camera.updateProjectionMatrix (); + this.Render (); + } + + IsFixUpVector () + { + return this.navigation.IsFixUpVector (); + } + + SetFixUpVector (fixUpVector) + { + let oldCamera = this.navigation.GetCamera (); + let newCamera = this.upVector.SetFixed (fixUpVector, oldCamera); + this.navigation.SetFixUpVector (fixUpVector); + if (newCamera !== null) { + this.navigation.MoveCamera (newCamera, this.settings.animationSteps); + } + this.Render (); + } + + SetUpVector (upDirection, animate) + { + let oldCamera = this.navigation.GetCamera (); + let newCamera = this.upVector.SetDirection (upDirection, oldCamera); + let animationSteps = animate ? this.settings.animationSteps : 0; + this.navigation.MoveCamera (newCamera, animationSteps); + this.Render (); + } + + FlipUpVector () + { + let oldCamera = this.navigation.GetCamera (); + let newCamera = this.upVector.Flip (oldCamera); + this.navigation.MoveCamera (newCamera, 0); + this.Render (); + } + + Render () + { + let navigationCamera = this.navigation.GetCamera (); + this.camera.position.set (navigationCamera.eye.x, navigationCamera.eye.y, navigationCamera.eye.z); + this.camera.up.set (navigationCamera.up.x, navigationCamera.up.y, navigationCamera.up.z); + this.camera.lookAt (new THREE.Vector3 (navigationCamera.center.x, navigationCamera.center.y, navigationCamera.center.z)); + + let lightDir = OV.SubCoord3D (navigationCamera.eye, navigationCamera.center); + this.light.position.set (lightDir.x, lightDir.y, lightDir.z); + this.renderer.render (this.scene, this.camera); + } + + AddMeshes (meshes) + { + for (let i = 0; i < meshes.length; i++) { + let mesh = meshes[i]; + this.scene.add (mesh); + } + this.Render (); + } + + Clear () + { + this.ClearMeshes (); + this.Render (); + } + + SetMeshesVisibility (isVisible) + { + this.EnumerateMeshes (function (mesh) { + let visible = isVisible (mesh.userData); + if (mesh.visible !== visible) { + mesh.visible = visible; + } + }); + this.Render (); + } + + SetMeshesHighlight (highlightMaterial, isHighlighted) + { + function CreateHighlightMaterials (originalMaterials, highlightMaterial) + { + let highlightMaterials = []; + for (let i = 0; i < originalMaterials.length; i++) { + highlightMaterials.push (highlightMaterial); + } + return highlightMaterials; + } + + this.EnumerateMeshes (function (mesh) { + let highlighted = isHighlighted (mesh.userData); + if (highlighted) { + if (mesh.userData.threeMaterials === null) { + mesh.userData.threeMaterials = mesh.material; + mesh.material = CreateHighlightMaterials (mesh.material, highlightMaterial); + } + } else { + if (mesh.userData.threeMaterials !== null) { + mesh.material = mesh.userData.threeMaterials; + mesh.userData.threeMaterials = null; + } + } + }); + this.Render (); + } + + GetMeshUnderMouse (mouseCoords) + { + let raycaster = new THREE.Raycaster (); + let mousePos = new THREE.Vector2 (); + mousePos.x = (mouseCoords.x / this.canvas.width) * 2 - 1; + mousePos.y = -(mouseCoords.y / this.canvas.height) * 2 + 1; + raycaster.setFromCamera (mousePos, this.camera); + let iSectObjects = raycaster.intersectObjects (this.scene.children); + for (let i = 0; i < iSectObjects.length; i++) { + let iSectObject = iSectObjects[i]; + if (iSectObject.object.type === 'Mesh' && iSectObject.object.visible) { + return iSectObject.object.userData; + } + } + return null; + } + + GetBoundingBox (needToProcess) + { + let hasMesh = false; + let boundingBox = new THREE.Box3 (); + this.EnumerateMeshes (function (mesh) { + if (needToProcess (mesh.userData)) { + boundingBox.union (new THREE.Box3 ().setFromObject (mesh)); + hasMesh = true; + } + }); + + if (!hasMesh) { + return null; + } + return boundingBox; + } + + GetBoundingSphere (needToProcess) + { + let boundingBox = this.GetBoundingBox (needToProcess); + if (boundingBox === null) { + return null; + } + + let boundingSphere = new THREE.Sphere (); + boundingBox.getBoundingSphere (boundingSphere); + return boundingSphere; + } + + EnumerateMeshesUserData (enumerator) + { + this.EnumerateMeshes (function (mesh) { + enumerator (mesh.userData); + }); + } + + EnumerateMeshes (enumerator) + { + this.scene.traverse (function (object) { + if (object.isMesh) { + enumerator (object); + } + }); + } + + ClearMeshes () + { + for (let i = this.scene.children.length - 1; i >= 0; i--) { + let object = this.scene.children[i]; + if (object.isMesh) { + object.geometry.dispose (); + this.scene.remove (object); + } + } + } + + InitCamera () + { + this.camera = new THREE.PerspectiveCamera (45.0, this.canvas.width / this.canvas.height, 0.1, 1000.0); + this.scene.add (this.camera); + + let canvasElem = this.renderer.domElement; + let camera = OV.GetDefaultCamera (OV.Direction.Z); + + let obj = this; + this.navigation = new OV.Navigation (canvasElem, camera); + this.navigation.SetUpdateHandler (function () { + obj.Render (); + }); + + this.upVector = new OV.UpVector (); + } + + InitLights () + { + let ambientLight = new THREE.AmbientLight (0x888888); + this.scene.add (ambientLight); + + this.light = new THREE.DirectionalLight (0x888888); + this.scene.add (this.light); + } +}; diff --git a/test/framework/native_import.js b/test/framework/native_import.js new file mode 100644 index 0000000..214ff73 --- /dev/null +++ b/test/framework/native_import.js @@ -0,0 +1,14 @@ +module.exports = +{ + AddNativeSourceFile : function (fileName) + { + var path = require ('path'); + var rootDir = path.join (__dirname, '..'); + var fullPath = path.resolve (rootDir, fileName); + + var fs = require ('fs'); + var content = fs.readFileSync (fullPath).toString (); + + eval.apply (global, [content]); + } +} diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000..a91072a --- /dev/null +++ b/test/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "mocha": "*" + }, + "scripts": { + "test": "mocha" + } +} diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..4f1541c --- /dev/null +++ b/test/test.js @@ -0,0 +1,27 @@ +var fs = require ('fs'); +process.chdir (__dirname); + +global.atob = function (base64String) { + return Buffer.from (base64String, 'base64').toString('binary') +}; + +global.Blob = function () { + +}; + +global.URL = { + createObjectURL : function () { + return 'ObjectUrl'; + } +} + +require ('./utils/importall.js'); +var testDirName = './tests/'; +var files = fs.readdirSync (testDirName, { withFileTypes: true }); +var i, file; +for (i = 0; i < files.length; i++) { + file = files[i]; + if (file.isFile ()) { + require (testDirName + file.name); + } +} diff --git a/test/testfiles/3ds/cube_four_instances.3ds b/test/testfiles/3ds/cube_four_instances.3ds new file mode 100644 index 0000000000000000000000000000000000000000..eeb18d2305492d3ff8f0fbf60a9f6d66f18fb777 GIT binary patch literal 2409 zcmd5-F>ljA6#ncqZJHwFv=U+r3=9m&(26asT`_>vN`)YV5JMGW>Po0WQ6d<-b!N#N z$PeiK24FP50%b*FVhrEA%ei({f-?mABtL)eyLadBoqf-{yNAnwizn**gg0H%Q zEA$7QC^{-s1CmJ%1ec+PFS>>m`qrCXRICIf<~0DxWhmk7HN1-tyTxiql1U8&|Gx$V zKiFSh^;!`Sekb(8m~TW5Y1VkKQxkkXP6r9H;}+Yy^$0Df6zos;T0vn1F<%*Wo4VQs}y5jnfK%=(P};xg7J7wNjX`o zDe2ArUDVaBEU$MbN9f>&x}76s4==WxQ`WOz#PL>EuY=-x?@iYmSWWZP>&~Ee{qK6U T=6UKZ&7gN?Kf7 z(fokUZ%~ixuaH~?Pafmk2Kc)v4S3`sJMf#Cng zfcg*CmzUjU1ccuS{V?W<$R*7-UhK39K5eIy1lf6u?I?Z**TVfgc5PjY>ZPFs-v=ZVNIB?*A%!jz8wJQ!FwNfDnA;h5yF*OpZP?V@W_SSPR zIS29sy1xN9y1$~zl`F^aW;g5FRjG`Gpd)$w=I!iy-r76f+^p9Cg+%}rUaeL#53IIa z3{Mbnur@tzdjuni`|&>f(M_TT>h#0maM^+8Z}=d`PbL$aPY{l-bAG4+qrsQ7SEw!a7V7HFoUvKF}3cec! z*XVb8alBhf1JaoWf~%n6o6)dD-}yL*%Sk|LUjvX{1qo-bVK4d6FQ*|*XBr6pzXpUq z*k9faIx!HP68cfXHzJ2LZ#>wU2|gcZg9Q0;huvNBEDocm#QEn4FLplHvS-gMj&Dbg zvso@v?rt^572{^~lLK;oJXB3e6>}z1U?(O!Z+OL4x4>A@3op%D@+$Pg3sUB;I7h~+ zCU1^j#)HVGmo6h&9%E^U_RK1B6*3Jn<^(7+J&10Qu-}tirp6|37m`1K{56)aHIvQM zKQVp8Di`$%=Tx!rZ2jSrHWE@bEx!Y?F0Zxi8{iEnlyP^7THryx!2&^tbE%1%K4?%K!iX literal 0 HcmV?d00001 diff --git a/test/testfiles/3ds/cube_with_materials.3ds b/test/testfiles/3ds/cube_with_materials.3ds new file mode 100644 index 0000000000000000000000000000000000000000..04c6d0ee2d1e43bd5cffb0d69cde50f686c3f5a8 GIT binary patch literal 1881 zcmd5-Jx?1!5Pd$|*cgP)SVAeC6cj1YAtXA-z9>Z^1qtFPN>B=9d~iqzATB49Ta zy-7v*B0aKbrr1k8KbbGSevZd&1EW<&oOid^2{z8pjl1x%wtRPq`Dc=UUPTFiS^p-%EOzg6~?vGW~HU z2+roxfM}|L;2~(Z)*6=RTc^EXJ_(4-HUQB>kTBbZPvJ>-J`GVc)j;t7HK6f}_2sbF z3IP8nq3eg-5xJyE7~j@R)(<@L~~~ya#=EEGWrHMy1VDEkuc}U3{zy0Hv`EZK>iv_*qzE|>c5!! z!R(T%(C6{`)$^?vO@y3yQOWN>tj%Xp+2ZUd#n@A3pIjw#HHU>@GN~w$leDsu+U#wj ds@9XdUY!)7gU9M=ij+0H+n)SoJbNPg_1}zv;fMeL literal 0 HcmV?d00001 diff --git a/test/testfiles/3ds/cube_with_texture_transformations.3ds b/test/testfiles/3ds/cube_with_texture_transformations.3ds new file mode 100644 index 0000000000000000000000000000000000000000..70d02d33e09057e6644b41f5b70d618d7a0787f1 GIT binary patch literal 1881 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 I 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 +#include +#include +#include + +std::string DemangleTypeName (const char* name) +{ + int status = -4; + char* demangled = abi::__cxa_demangle (name, NULL, NULL, &status); + std::string result; + if (status == 0) { + result = demangled; + } else { + result = name; + } + delete[] demangled; + return result; +} + +class BinaryWriter +{ +public: + BinaryWriter (const std::string& logFileName, const std::string& binaryFileName) + { + logFile.open (logFileName.c_str (), std::ofstream::out); + binaryFile.open (binaryFileName.c_str (), std::ofstream::binary); + } + + ~BinaryWriter () + { + logFile.close (); + binaryFile.close (); + } + + template + void Write (Type value) + { + logFile << value << " (" << DemangleTypeName (typeid (value).name ()) << ", " << sizeof (value) << ")" << std::endl; + binaryFile.write ((char*) &value, sizeof (value)); + } + +private: + std::ofstream logFile; + std::ofstream binaryFile; +}; + +int main () +{ + BinaryWriter bw ("result.txt", "result.bin"); + + bw.Write ((bool) true); + bw.Write ((bool) false); + + bw.Write ((char) 'a'); + bw.Write ((char) 'A'); + bw.Write ((unsigned char) 'a'); + bw.Write ((unsigned char) 'A'); + + bw.Write ((short) 42); + bw.Write ((short) -42); + bw.Write ((short) 32000); + bw.Write ((short) -32000); + bw.Write ((unsigned short) 42); + bw.Write ((unsigned short) -42); + bw.Write ((unsigned short) 32000); + bw.Write ((unsigned short) -32000); + + bw.Write ((int) 42); + bw.Write ((int) -42); + bw.Write ((int) 32000); + bw.Write ((int) -32000); + bw.Write ((int) 2000000000); + bw.Write ((int) -2000000000); + bw.Write ((unsigned int) 42); + bw.Write ((unsigned int) -42); + bw.Write ((unsigned int) 32000); + bw.Write ((unsigned int) -32000); + bw.Write ((unsigned int) 2000000000); + bw.Write ((unsigned int) -2000000000); + + bw.Write ((long) 42); + bw.Write ((long) -42); + bw.Write ((long) 32000); + bw.Write ((long) -32000); + bw.Write ((long) 2000000000); + bw.Write ((long) -2000000000); + bw.Write ((unsigned long) 42); + bw.Write ((unsigned long) -42); + bw.Write ((unsigned long) 32000); + bw.Write ((unsigned long) -32000); + bw.Write ((unsigned long) 2000000000); + bw.Write ((unsigned long) -2000000000); + + bw.Write ((float) 42); + bw.Write ((float) -42); + bw.Write ((float) 12345.6789); + bw.Write ((float) -12345.6789); + + bw.Write ((double) 42); + bw.Write ((double) -42); + bw.Write ((double) 12345.6789); + bw.Write ((double) -12345.6789); + + return 0; +} diff --git a/test/testfiles/gltf/Box/README.md b/test/testfiles/gltf/Box/README.md new file mode 100644 index 0000000..ffb95a3 --- /dev/null +++ b/test/testfiles/gltf/Box/README.md @@ -0,0 +1,10 @@ +# Box +## Screenshot + +![screenshot](screenshot/screenshot.png) + +## License Information + +Donated by [Cesium](http://cesiumjs.org/) for glTF testing. + +This model is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). diff --git a/test/testfiles/gltf/Box/glTF-Binary/Box.glb b/test/testfiles/gltf/Box/glTF-Binary/Box.glb new file mode 100644 index 0000000000000000000000000000000000000000..95ec886b6b92b134291fd41d34ac9d5349306e0a GIT binary patch literal 1664 zcmb7EOK;jh5S}DW+O$p6v`u^8GeNd_1bm4oEftl43Q#VHgE0$OGB&bJ+Q_oRvHz-n zq(7!Jix*Y|3Dweg=e6_A%bt4u#xVe_&H(fXY|f(@CPIkBiUbn22;I3GyAPRY#|SxE#v~@J z-RZV!7Blr6`_bt&`^`?9nFdzn`eWB2AFOMR#W1rd(&eFRdl`st&r#1>1WTZ{gEyie zT(@AfoJ@Fl@A97_$mlWVoykNr7-KrYd=dEEkNb}c3{ujK0x6e1_PSp7z%Cj)?0>TUa1Jlw h71BAph6{KDmq-`z7OvnOyhpl%4{!}1;Sa&-1*Vq#=uU|`_jVdQ3DV2+RGVq_EuWr=y*>&EmSD9#9koXiZ2Kvh7BfteAg znwgo=fKh;%L1mgSmkJ9|5yO9W5XrC~fg9|(*+7aJ866lIKnB$V@qea;jvNdO08WYz A2><{9 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Box/glTF-Draco/Box.gltf b/test/testfiles/gltf/Box/glTF-Draco/Box.gltf new file mode 100644 index 0000000..d38bc8c --- /dev/null +++ b/test/testfiles/gltf/Box/glTF-Draco/Box.gltf @@ -0,0 +1,152 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0, + "extensions": { + "KHR_draco_mesh_compression": { + "bufferView": 0, + "attributes": { + "NORMAL": 0, + "POSITION": 1 + } + } + } + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "componentType": 5126, + "count": 24, + "max": [ + 1.007843137254902, + 1.007843137254902, + 1.007843137254902 + ], + "min": [ + -1.007843137254902, + -1.007843137254902, + -1.007843137254902 + ], + "type": "VEC3" + }, + { + "componentType": 5126, + "count": 24, + "max": [ + 0.5004885197850513, + 0.5004885197850513, + 0.5004885197850513 + ], + "min": [ + -0.5004885197850513, + -0.5004885197850513, + -0.5004885197850513 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0, + 0, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 1 + }, + "name": "Red", + "emissiveFactor": [ + 0, + 0, + 0 + ], + "alphaMode": "OPAQUE", + "doubleSided": false + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 118 + } + ], + "buffers": [ + { + "name": "Box", + "byteLength": 120, + "uri": "Box.bin" + } + ], + "extensionsRequired": [ + "KHR_draco_mesh_compression" + ], + "extensionsUsed": [ + "KHR_draco_mesh_compression" + ] +} diff --git a/test/testfiles/gltf/Box/glTF-Embedded/Box.gltf b/test/testfiles/gltf/Box/glTF-Embedded/Box.gltf new file mode 100644 index 0000000..ea0e8ad --- /dev/null +++ b/test/testfiles/gltf/Box/glTF-Embedded/Box.gltf @@ -0,0 +1,142 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "Red" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + ] +} diff --git a/test/testfiles/gltf/Box/glTF/Box.gltf b/test/testfiles/gltf/Box/glTF/Box.gltf new file mode 100644 index 0000000..7f603f0 --- /dev/null +++ b/test/testfiles/gltf/Box/glTF/Box.gltf @@ -0,0 +1,142 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "Red" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "Box0.bin" + } + ] +} diff --git a/test/testfiles/gltf/Box/glTF/Box0.bin b/test/testfiles/gltf/Box/glTF/Box0.bin new file mode 100644 index 0000000000000000000000000000000000000000..d7798abb5161eca17ac8a6883a1f53c6786b484d GIT binary patch literal 648 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/BoxInterleaved/glTF-Embedded/BoxInterleaved.gltf b/test/testfiles/gltf/BoxInterleaved/glTF-Embedded/BoxInterleaved.gltf new file mode 100644 index 0000000..48f80e9 --- /dev/null +++ b/test/testfiles/gltf/BoxInterleaved/glTF-Embedded/BoxInterleaved.gltf @@ -0,0 +1,140 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ] + } + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 24, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAIA/AAAAvwAAAL8AAAA/AAAAAAAAAAAAAIA/AAAAPwAAAL8AAAA/AAAAAAAAAAAAAIA/AAAAvwAAAD8AAAA/AAAAAAAAAAAAAIA/AAAAPwAAAD8AAAA/AAAAAAAAgL8AAAAAAAAAPwAAAL8AAAA/AAAAAAAAgL8AAAAAAAAAvwAAAL8AAAA/AAAAAAAAgL8AAAAAAAAAPwAAAL8AAAC/AAAAAAAAgL8AAAAAAAAAvwAAAL8AAAC/AACAPwAAAAAAAAAAAAAAPwAAAD8AAAA/AACAPwAAAAAAAAAAAAAAPwAAAL8AAAA/AACAPwAAAAAAAAAAAAAAPwAAAD8AAAC/AACAPwAAAAAAAAAAAAAAPwAAAL8AAAC/AAAAAAAAgD8AAAAAAAAAvwAAAD8AAAA/AAAAAAAAgD8AAAAAAAAAPwAAAD8AAAA/AAAAAAAAgD8AAAAAAAAAvwAAAD8AAAC/AAAAAAAAgD8AAAAAAAAAPwAAAD8AAAC/AACAvwAAAAAAAAAAAAAAvwAAAL8AAAA/AACAvwAAAAAAAAAAAAAAvwAAAD8AAAA/AACAvwAAAAAAAAAAAAAAvwAAAL8AAAC/AACAvwAAAAAAAAAAAAAAvwAAAD8AAAC/AAAAAAAAAAAAAIC/AAAAvwAAAL8AAAC/AAAAAAAAAAAAAIC/AAAAvwAAAD8AAAC/AAAAAAAAAAAAAIC/AAAAPwAAAL8AAAC/AAAAAAAAAAAAAIC/AAAAPwAAAD8AAAC/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + ] +} diff --git a/test/testfiles/gltf/BoxInterleaved/glTF/BoxInterleaved.bin b/test/testfiles/gltf/BoxInterleaved/glTF/BoxInterleaved.bin new file mode 100644 index 0000000000000000000000000000000000000000..c046b77b5db2c5706a60d23935fe8ae7b9086e4d GIT binary patch literal 648 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%0AI48PRRm5ilOc~OUhZQAgWP+|&KRch#zjgHb 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 YCHAOZ@c;k-07*qoM6N<$f&c&j0H0v?$N&HU literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/BoxTextured/glTF-Embedded/BoxTextured.gltf b/test/testfiles/gltf/BoxTextured/glTF-Embedded/BoxTextured.gltf new file mode 100644 index 0000000..4a6ab9c --- /dev/null +++ b/test/testfiles/gltf/BoxTextured/glTF-Embedded/BoxTextured.gltf @@ -0,0 +1,181 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2, + "TEXCOORD_0": 3 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 6.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0.0 + }, + "name": "Texture" + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + } + ], + "images": [ + { + "uri": "data:image/png;base64,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" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9986, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 768, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 192, + "byteStride": 8, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 840, + "uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AADAQAAAAAAAAKBAAAAAAAAAwED+/38/AACgQP7/fz8AAIBAAAAAAAAAoEAAAAAAAACAQAAAgD8AAKBAAACAPwAAAEAAAAAAAACAPwAAAAAAAABAAACAPwAAgD8AAIA/AABAQAAAAAAAAIBAAAAAAAAAQEAAAIA/AACAQAAAgD8AAEBAAAAAAAAAAEAAAAAAAABAQAAAgD8AAABAAACAPwAAAAAAAAAAAAAAAP7/fz8AAIA/AAAAAAAAgD/+/38/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + ] +} diff --git a/test/testfiles/gltf/BoxTextured/glTF/BoxTextured.gltf b/test/testfiles/gltf/BoxTextured/glTF/BoxTextured.gltf new file mode 100644 index 0000000..eff658f --- /dev/null +++ b/test/testfiles/gltf/BoxTextured/glTF/BoxTextured.gltf @@ -0,0 +1,181 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2, + "TEXCOORD_0": 3 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 6.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0.0 + }, + "name": "Texture" + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + } + ], + "images": [ + { + "uri": "CesiumLogoFlat.png" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9986, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 768, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + }, + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 192, + "byteStride": 8, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 840, + "uri": "BoxTextured0.bin" + } + ] +} diff --git a/test/testfiles/gltf/BoxTextured/glTF/BoxTextured0.bin b/test/testfiles/gltf/BoxTextured/glTF/BoxTextured0.bin new file mode 100644 index 0000000000000000000000000000000000000000..d2a73551f9456732c7ca85b9d70895f5d9ab8171 GIT binary patch literal 840 zcma)4TMmLS5FAugR8)K(r@fgRg`3F9)Sc2X4N+i|$-K6U9|D@%NdZH8sMCdXhgs?; z>8CE)+Yvq1hwmphbb0bSz9n3Qv{?B+?(fNy1()2HW=AbfwKB4_dS!i9PnJ%1er4>H zi~S!ZIHJM{XG4VxuDIcDxZ(qtxm=$B literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/BoxTextured/glTF/CesiumLogoFlat.png b/test/testfiles/gltf/BoxTextured/glTF/CesiumLogoFlat.png new file mode 100644 index 0000000000000000000000000000000000000000..8159c4c4afd64aa84c363b66f09e75881ff890eb GIT binary patch literal 23516 zcmY(q19T=)vo8F`nb^+cjcwbuF|lpiww+9@iIa(K8xz~MZ@zQRfBt)WtzNymx^|&g z?cGmRt&UKT6NiVvfdK#j@RAZDN&o=J_YedC4f%c1b}Tam0KnlbgoPC(g@u6%j&`ON z)+PV|M@)>Wjyawx8ehAU88OL}vNcPHa~VH8DSVO|%kRcEzl{wx+f+%me?-T|kC#*F zqf;Er?H|A8MHRdmPqWYly8rqEDIO5l_!{X`U`YQh04ewypMw;Rqe{*)xS2C7+Uhn< zF1_z^u5!IDTg|Q@j$11y*oYvdP1` zHT~KW?(@=HUEKK0`}0=}A06mGVAyb21{)p+a$TxA?h4}hnn1vRs`c~H@c1vIzyQ5x z%Z|}72yXOU+|TI_8T=T>CukjfOJJ-p4dC|u9b~XGv4-EYE}X=KVnqAuPY4)Qr<=&Obilo8pUe|%YtXj9X+~7SCZND;a zh8^E*lyh&74o+D!$Gtp6-d{UBBp!Vn^EfX~ypQjKQ)!{zi_?;W&7C~t!d4mJ*9G731A-!*A*>TdRs#&#m_h(@3uDE+JO}}j3GELWcBI~K zQ%u~W9-dpS#*E3{uD;~YkrBP1mzJqUD&sJ|K#Y2v_t+|od6S#U5N#t=eqS1PP<}FO zAj)dcv@Vn6V}b({2$4r5kL+U-UOlSu)$59swWux+`_e~8G_z7kmgoj&V|%{-7c-TN zw(@cn4MKA$@i^rhgih!CkY1hk2@Shq^DcHyoBGs?-pkoL(9B z_IjEAb88JJH&q-P$UThf*^I%6LHs+1n|*aeG2hhDjH8-+9Ue_PIs~z*G>BKr7d33T z7?G;`p!={!noe>bijSerNuM#FNuMd7ULDW`?(v+xt{pmi0w=wpN6R}Ltt~GM53Ijt zC#hCdQiR0T=sz(W``C6A4VZ4p;h>F#6juUL|D3&Hw9Qp;%oqP zx3RW$;&SID`Y#Ty@9}@g^hCh_VsWp01DeVngChpSm+pt_+WrQAdjQ5DVLIn z*#AubzT+h_cXqbtqNjIrbE9)(rn7T2qi5vg-xj6F@5&cKe{~rHsr?Z9W|F6l`>3`h%c98x*Pv{xx z80i03_V-kt|4_N)9W6}0HUCFGA0y9yasEHF|Ix!k{~zW5mofkC>3>nbUFCz}q5t34 z#s?$QN3IC~2mmBS1XbKYE;`-Zjn!SrA1k#f@?kjHxsLF#GbcIr?K$ugnRmmb_T-tV zy*g7rM*ZA7^Jr_9oB4iGk5gOGUPxq)U{4{4B8(a!Y)q16S-S$ckMQD|6$C(1g8Yuq zBV%j}0;m=$!@Wi=Rot(-yrw&k)|29PCNh{A%SwRxKn8L`{p_R$wInqp1*92ZKD7To zXc$l@EYL{6#Ll3)vO1CixWEMnL;xooh$!IjdbhHi8kzz$|It6N2QSp02;k&?v$%i` zJ^=$Bf(Qaus?RX6!MWerIIuO4MbAI%m+K7Do!*DKKVGvBZx<`;o$$=}xyrEkCxX1J z8v^hx5=KA4INSj|cJNEC@6de0AE}NBjgbh271;N5tCOrg6ka@A<{e91>n+FfLKnMu zPV>nhA@Q#MVztdL_Q{$kp1daWZbg*9DCz-E|4+}ubyx7zPFGj} z*}p?KmqX|WC`_Li#3I?|@YfJhG=P|pcwG>+!vM_tHZmP4JOc?%9BKP1pthr6dze09 z12;NRKRzF6He$FIso{Wh(i+s-lvwY5{Hci0KGTSTS=``g3&r<}L3F3_np+wT10_s^ zUknA35Gce$);9mD^0iM6js`L^?vjwC`x%9t5Oa;xD-H??2N`~BfD1WHg!LfKD0luC z=DviwYRD)!FG4)jAnOK$T4N_TgB1~kglZw!)$y-A>uW%=zi9d&bBIQ|f*6(JB}1OtM&8v7d?Rp)%+}|c$$HShNmAzf=Ub#E6WCR+Y{`wFS z6ee@7cR}-zh%tp(?L!*NVK{=iqClBNptH&qiosFYD58Wyb3*O#?P|vijjnUOaz~5# zQ`(O)1A|5tte{}9S_GK~fU@Xc#F#g=kwTIi=Uxv8(c&Bmf5Tn?q zLC47Yu%iDY9w1h}pw`)X6x}s)4g`*J43US61QOJ}7Es_u{Z{RRD>bI`8dOdS03Fb*Rh9bU_Ft&dRQ<4;t2l+nM5{kbH16EB1R|2UZ z{RrC1FmOUmgnWlhWgZa}G6ji*S0AQtJXfanweL_5uWp+vq05OxMz+(ummE#^gx6AT z;}0RXnRV$@{;WmcSSBFO3j*?@LE|!l}$XG zhvII?=;OE;`fk2lwMwtdUx*lc$RE<(+|dCJ+Z;ZqI3sMd)!_xjEJc)v2VBTaDp~m7 zt3?9Y*6}sGgD$H&4W<*MCW71tZG&YM{+XC1Vz3qDCK=ULRgP&`iIuPd-HymBCiWK?Q2xfn@{}-}9i9w3~O{dCfjC%|gQNb1# zbHSp~0-JF4Bx-qZG+`knWnFlG)*K+R0>T$XTa_8j3&XIO?+sL{gztfN{#; z`jH_h1I^)%^wtBSg73O*$DY_4!o|594bTP(Bm5BCj?b!wvLf2G$~U`>*mbQxG&He8 z$MI&vTTo!T+61J))4@?47E?yp5Rt#mQqdPr$lMW%GP-NkP{h zK*!Y_MO~S)?mu_9wa)VLF4xdu@1OXVpH|ZE+xF{eexuEAJvbExR%=XXAL%$tPzcD0 zdgz&T2QIL?9OS%-ZCYl7+4MSGwrz!f2pJKsmPc01^VFYrhWjjchbaV9!&by-jvJWi zZPF1Ssx7CA3}q@j)S(F0ujWRZv;YM<7Lv>y?+@|^PO*USFkSx$b~(gV`|30hicD8Mi-)7R z&onT85z?JjUw!|A-d8f%B~^&y0ra?S84a{UP?O8L0QfVjesg<<2IQ1JgEr6U5L(51Z~>P0XhMTs znW3FH9DCayiPE3IiK2AF+pO{1t#yGX?rEhC7}9BhzhPk@DLqEse@es+q&?scCe%pC z`VEiZqjCWfGqG#r2)tx?Cm<03WtCaRfr@iax1ngx`zU)bH7(eJ9i#_ANJtm#x|9HM zYN|5&+976UbY_mof2ayVqNJ^dn{>F<@S!Z2x;v06%1AA!;C;?SOw7WwyOyv&En)H_ z6GHnaF|4S^$|d)6Th3i)I-U+yVYQ$#jx*~DU|ynJaL?H38%BcHsq4*jJI#kukeLHj zaH6^;7@G@-0QDlfP3#z~I~sWqS9*;4<~(q}Pb(;)i$DVyH=ycI;ar%xeC%F6It+sX8Pe| zFg$COuL{nzfC}6l9SkUtNsC|E$w#K93l~f<(*D~c1E<4rydsQ(yqEE~2a)u*S*Zhk zq`NU95(HFH#XFPy1}yP_Gr%qa?w_Bqy6vW-R(=4;dK;-#_NbhE+YAiQ`cjeB^)rO+ zhf32%51A?pV4#`783ar!V8k$Z^f3>g#pnp0%fUV9M#D!FbrB7m2>`OHMT7w!M0jq= zYT+gSn14PfWCI}y5IICdz9#pa;8+<|(8VZ4i=+GIt_KCVWLb$C=H_VSa2+(@W$$j~)_M!V55>Q>T6k4?9oepxq z51a0h_dMs?X4~{d&hMZc5r&2qf3@H~rq>TntL_gG0Kd%!Fc^?OR1TM4@b@Xm{?$8h znC$nd31tBR*#XDm>sbN0T(#W`&J*wrBCq-3Z*0QJt>2rVOWbx6Yf(axZ~Xbbso><} zjKaV&@-Jlg6>fsnVu=a%fLZ1?5fDB>U-xcve~oJM<*#n>cIWY(25toVKNp5mFbsHt z6V>Yy{2m5AId)Y*-X#K{3%9PAcM9cTc|L0oEsEtnv$AA5$L*j;bW=J4`P7np?lLoa zMZ{<|XbCn#?_vSau#4jZIRtKNGwdicJnv|?M^B;Zg>O{gC|+z>`D^xJIiuo}9@vG6 z>fi$Ldb=-i%6on}iasO--^&J#4SWRNIS$;RXe*MfCPz|qAcxjZYZD2;_|%GR_lNZE z*l3h2^q#ED{L^1LMnn+E3XSxo8O9I^3ud6LpNQkOlC9n=>>&&wX}nzr5LZEyAnJIl zO4wQA%If5FBQebK9h)Hs!h+F=_3{2hB%X@9Im`w?heVTKv+QZG&kUoD@oLIfBF z`Y(_tchY)waPag$EXE}ia?U4w+SLV>jq)$hl{AEXGNT3Dtkq&X~8Tty39puJEWm#*DhMY#t zgYur)pL6W#S|{Fm6xH|Rz-!gz7eo+;f{5EZX!L^u>a?m3NW++x6)8gUgkspvAIR}6 z511`SxYFqs>BS@2RVt+DRgSZc5&(@dr-^)0mFsx}p)uxiHg-Z_b{@aXz|sA91X_%V z8b_5F{0W5SkmhjRG-@9M{>7gG)Pz#l9IR)~(*9^ndj~q|N~fUr`ZY%(K=8xWQ2=%m;1J4&X`k>m`XBWvRJ8y>@65b4lXbOEQQi2@q)Hb4_+Pr z95~{-J@EW2I7Q#jQMc`l98y|uS_x^IL?Byfxzh#G_LNsUc>9{5nQ;$eJEJan4_K8#W}CQHI;z!_(~rugd&xof6eGh{BZzJniY=5>+{<-KM_#K7`l8ltiMoD4 zapTlg%qFNbnG#~*W=Ypom!p-g4P6(0@M2{FK|`R)h{@5QLuR=Qdqf@isK+!@ImT%# z)c~5$`PrW|^Bc@`#U1rLzaCn$g$3jsETk=Mp6~2fkYA(|g?wAd9p=U}>O6D7zFucN zCo1dBvqcK@TC3x6RPm30g2lQqK8Yfr1!xKiYC6rnM!7yowRgxwTGt~=2GlI zc7Y@<4v7i1w*0U$*X`DgRY?BOls;Q60j|?6%;L>tY4CswGZLr(Xi5QM`4jX9(z5u( zb}qKr0(z_3!VHWMAqJ7mH;q_lQmT#5X&6N+w7+3qQ5_D#t!?Th)t<=n6W zG=^rG8`?Nv<-Z;osjFi$&9970x@ksPLpnerUCwvUbbp!7uDdfciYEmiu##e=mn%{m zqX0Qj2ur;K5QNggXn9zexwE1Zu&|ry4SPsE-A zIwy&Tn^}+{lg&HDe}=$@&k^SP(e#;XLXH{R3w=*3h~k_q_-Q-DQ#sF%yGGWXw^IyF zfk2;Ot+kDWOnz5HmedgbL_1pt#*#yDlCn#b;gx#{E^u7q&Kw~uOkUXhuKi4d^fe(U z@lb^bZVq{0+xQFeiAl(rHN`t|Fy9I#`v-CY3EV3e=Ls<7BxBpgnG{gp@~?+;B`HWv zO|tW(`_D9;QYRV}IL$g1${06E77>^%Qg@bSas7c{S^%YYv9zGvjV;eyzequ2e$;Z~ zCb)_^C@@E|>?(gc-$VetG}&xztp2J(smfMg6GzbZy%=HYXAQNG} z5fTnUwk;B*O;E=B)9am0`{|#?mrSbY_s8iMA@IC16|P}13UR8{?!y5iZ=mA2x78r~ z^uAY`H2+?&O4brao8a$Eo9U8EZd*WfHQ%wLxV;TWRo&NM8ln=*E{Z& zP+rxZ3?ha^BZ|QVUqzb3onV8dC1C~+ox04HHY)XJ`S3F#0O)HwhV9bn;W^#Nk8YEl zg|M1$Y!{^w9(r>68bvJJ(oXO1h1ptL7P?D(XYvc18Mx{jT#U)aFA;`yAqsAe52wGi zsOT-H6F7iA*5p*o7)I6B(O9n-qO^<_X3*xe90HIiQa`irs4azgk#&H70|h(kqP;kc{*Ot!-{s^ED zBRYw}{o&Z}ATzP(vUAN@yr==<$oVvLa?{;dO~@w-zj*@dY=w~_VrVpy?L_2>t_}z; zt_GAva+5I9-1bCNdKnRtT0d)=%~~`YKZtu;Y_71}pLKDsjT({5TqV+LNq%LlC{P0I z)W8KS(_$3QwnniI0Ltty%_Thh(B z;y4upMD&TgVvMCPOLE$`Pz5jxSH;Zb&~g8+jHrs3NJ%TyVvhetI@m;x3Omoi%E_;g ziq`s_6bi$AdaPx2;2YmbtQ!}xU}o#N@sGwfb1O&^Q==1KqJbE2K8VUzI6gd91--s` zl>JI`NIB|e_FFu2ze7*Orr&U>+e#lDPw*9mOKio)^bd4N_I=>{t@q-99N? zDm=0k_xjWo8j2k~O48gF?udRd=7d-H>lg&$W7r;nz68rGe2{J3dz7o zw+#!XJ!76wsf+(u{T|z3a5G!|O(a`IB2}N3F!b#wluVmX@E?CWQAjw+`-7+nwq!_2 zbI`7WSD>?jg9oqr62EJ zKPYM+-xq9QhSFnAdsaF_l-oY6>(QT4zKNT=^RB)g!oV&~yIBq@;hJI#ikn%cPpX}6 zoBn-KA_EvY-79>$C4oUp!yN8Ms9vfIlp=@6y=Ia@R-ag+zNh});iB$lQ4n_tP z-ZlW$E*GnZ^su|Z+|fWur##9L4uqcbuT=dbB0c>u`*I5fmlkVh{LlV+ruoD_3&B9q zK^4vbO=N$;Zfu{43v)JOvcZO*0<)Efg5Hs@*LM%?xRv(PD3}Se2wqA|UAl$gIeLfK4pOj)D}K7Y_)RAYiwO39`+n6VJnymXaJP{J|f*DIubx)P>dZpfWMl za%=+ad;MfZXG5~gVyyK3RkWwVgKezRnu$H02e<2{wsN#$uG;s%!jsl4^VZgj?+&(K zHYL-PsDRNo`linzFi86^benlO->K?RlOZr^9d~aXR*}c)v?Y*eKHIO*aYa=734 zIIvdPQe>iu-Wgtm(LqbRwEeTGsY>2fMy#ny<}C;!8K!$vusnI`o54-wk5}cR-UKQP$y2&z|tjkMNEU9VVPLU)|+5^N;!Q?cayVU ztK7Tob)jQx{QoxXqcrK2+eZwGyZsBned$f^(0(S~CM*qS`WYE00!(4ESN-IYrCf>0 zpC3{J-&yelKIN9gu4?W6{ORjYrmq}LEbpm0ze*dGM+2pq;Hhm02eGQ^Fj^T@F;Rc{iOB)c z$50miQcI!Yg*-eg-Lf^H#~v7HLu>L(hKNx2U>1eTJPSKx*=&)t6fTfBFYnn2i^mEmC2E32J!yOI~y< zheIgm!Um;bIo;g9GLDPDS%;5r^eNFam?E1O_hDBjb&-_pQ zLS&el+U}Wjw)2wGl+dac|L-P8caC#0?-;H^_BA}3`FNmRgznq{(= zIY>M()w+(YT*kC{nGDSgUgec{biO;J>s=Dev>9=7#s}6?>YBp^G>QXiHJS1<3@)bP zxjp50QaqKj&O{I!PxBF3Qeau4!iX&+B5U-lDsl6uK0{37MZH5I>57lB@%@vU$O*l$ zrkR#zaOuTFYsADi&i!?kbzbp=JIiW!)iuhdt|ZTM$q&5)X3M4Y0pSHSZ zBug`KJm-tgF%pQ-(j^A@i#nBN7fPOyE*u?jeNA;pG1MHCZ$%VX^w|`$KXVc5HcChal;`+)SvBD-J9L-28sKyw(4SrxO)a*aK+5io}tj4OI zr%JR$;_mk-`Xh5V6J;O5tS-IKl&v%)GMKtipB%r!vGUz;pJKL!)*SBP9}EZfLZ;>S za{qHWNWE=~s%>AYu^^%b58A8MEpAwa!&hI17{QJ9_}&v9c1 zJC6N*(jLyB9=5;k%W9cGkRg<6h2SIwAdO@)fKZpLm7WJVJzd$`S*Y8|@Pb zh!Yqf#a?eVf9q}M2!HwGe&Eae(-1|CF$!dDZ>5^07%vy?z=DS>T!-+!3h3_r?w&{e zgQ43GRvwNT=(sXQQ&W3k<}XBkM({>i}2|5N8H%-wQ0Pv2or?B4Bx z5HB)KMqb;uw7Z1=W1jzG>+0TU*UO_iIOpdjqa`2U_G7<}q?$UoJMcX**?+suY<_$n9~X=j(2)dmw<>&O$Ruhg6jz!6Yin)Yd1m)`~1CMo{d4L1fH+ zf2{Ht8%w~)g*T#yXEO}L%^p@$fffKN%$ zw)oVMlW9PHk!OdA#>*Yygk-Xk6*abIGjm;7uGU&}SLMpbpxyP&s-D8=GM-*Xa{L!r z_CyH^3K9Vy_Y;rq*S?4I(|G7isU!xmq|l437=jchVV`Mq8Mln{rC( ztxjB_aI(wi3|6e(zp$;#w>Ydvxa+J1)|UuuEI6|IPqp3C>w#XzI|?%r<~h+|K7g+y zNM;GmO(W?tyX3ZE@gL$hSqgf z&=)e4+y$95d%S5JyIoolS)2k|ym29l6b*Tn<@|Sd%>?%115s(OyPojDKkLMk-|vHh z?|FCG{H$FFLAc}Dw3|I7f5b8t0;;uoloUGW#bUsV5YPuAal|~Id{UB?wMEk9$47n7 z)3H9-hu_$Fve1_RM9B8R%*%Vj63#^)vw5`$7PZi@_|tEP@E*tE{3x6whNsu9bqK%G zRghgie1YRudJp0TS%V~j%UOC6l>>)Z({UHl@LcS5%=MVF5`rk-8CX#d(Qs@~@$1<7 z5VzPRLd~C~)Hb)lgornywq;%@;wE53R|Ao^m9jB&+x5i5}Q zK59s-ecRV7T9>`3S zSY+N?7H&Gc?{YODyylq!!5}dcLGV?m>nReLU{Rs|A>VVrVmoqK}Da5Dc5j-%_L7qee zK!Mse!@m`>bolcp;bBQCW4R{#r2d}aWe{1^`1T30)4wons}RL38(bi+t2DIw7_4sx zDOP7Sh@JlhJ&^Fjk}LXGBWeWA|$_RH~|=OQeP@ghyV7 zFPvAeW2%3TCdKt0Fn@QwO%&Pg5$tHkgq4K`5+6fY(j#QSq&xd>s&MI%d*WbA1R|D? zfz2G}H7V_B@8RQ%yz@^H2bEyD!OY4;6V|=o4B5R$TGgw`02*)){#(E_q)cit&445<{(MRjenE>!h47 zbh_poq7eD1S)~Ojg|W!VvUP3`yP4Y+5W)ppN%{F^<1$}}H zagIYkdz*aGpa+iZ|MXl6K#F)@I4FFco$?E*NW{p+ece+QI-@T+Da+;ZFLG7P)n<`$ zJE)n}ZO;G){s2v%E8ANAV&dcaP*zDh#;r@c2TFjSAHsM$zCvW@W9>dZlK7lOV><5f zH$;41sHDQ!F=Dp*1Lk!m&ESW;PN?exMFivzFSk#gZf-Zbg9){JeIGV6{#IYAIFSF< zb-0_4#`D*vx)otiOkis;>gKFR+j96~(q;;EkvVP6N%1BT49dND@ZlfqZMaH;Cn#KE z3(L@J@t{$`>vXvmf8M<}Ym-%cH1>%2p;tO+jN9-79=(3U4MQQ~_Bd`&fZs zc(vL!r|&bV-M;mX*)#vtEV64JD+pE1-&n!L6tqWow<;lD!?$^0#QOf)%TxyLCcn*K9GYi%CxdREhlJIX;z7TuhHBLp$7E3*HHKUWmdt;>XSQr9iXOKYe* z@x!B<1yT05{QRuh+Z@bB#bacm8k2y}^WZNIZwvCp!RS|+{(1V=rtpN1IFiZUNf|&3 z)V}jG(}v>D%O8v{tJvGOEIQiD)6|QKR=C1uU#uf1TXO1?8qo(m*nt^$Lk|>9Ec5)^ zCLJ!@m=j#i!h3V~SZUcf1uwqICx0fBfeTRd0^({ zc!UY^9i32W{T@a+`8PZP?jMJm(U(|S>`yA9Ji$_#@$U?G;_RsQv{V}#>%>6&i|(A~ zlgGj%xT@PXi+DqI0a~#U1yd`I(fl|MOOY+zHtpYs&=#q}ajvMGwH}E@$?oStn{%#N z4)pE#4w-6dw1)Oi|8T|~uXRd0%krSfH-hGilrl25Gjj@&zIB-*u z4Ki;c-cFYo7VD6IoUF0gGfkJz=YZt%mn-x;xS zx0K)=_xWSzN1a0`uJikGY^^^}Q8Axt?b!V_yga;XF}Y69=lgQmR%@am3MsidXIp96QzSD!mv_&To86^;Jsumm$e4fd z+=I!B>_NMTsMyJh=a&>_U)GnnbWn>!)Aw!$iiO?Zw&l%3F)$4U2f+1;*XCqa6@>;U z>ZB}~IM>X`K$#r@wJ1V>Z(Z~` zrG7+62{<-GlXQ{#2~y&*;&n*A;&m>2kKjh)wb!^j+MMDYh&Ze2P7GVB@ywTiVf7F9 z?tPfCBuGy@_Qt^S1GBy$F8AX2ePZ}`i!?Ku*${ki^Z@m-JrA$v1IUam8yYnFNaJw%yO0$P>E+RQK! z6U*o`7Na2_Q@i4r;2PjWX>C(t5sz~xWV?HMW{7c&FFjtD0AX-%{f9TL_AW}@;rjM$ z0hbo|c>t-VM9HC9M@$I{RH5OPnYbS(+(zqDn_AGFo>6URmEu38MRxl}vb$ziAHT@d zJJLn}T--a!9jJ%>$^8U5s>>5OUn%ZHy#X!1XLx7=eL|lozGmR8hQusH75$`|A$v1} zswB75haW+~@9*#YWbAky_3Mi`vnyQx*AtUTjO7rBkQIed=?YD-3VP-4@_dcUy~^PE*IxJ=UZsMG5W&Ll&$#aVUv7W!Y@FZOckS`M zyI#R!;hlso{FL}hDp1!^9zC0~s8wXr=41NiyMqVuf~oTB2E0En%Z28PZiIekhnx;S zbQ!Z|J?Y|wG?(1UB&!ybgcxi>1^~^0TAtC57DqpYtTP|TGCh&YjBp@gm8HSM`x#l9k_ASnW($#`KI-Di)dqT2&(2AAB$U zWc;?%2EJ^0c2yjuMfa2^)D58v`pF$L@3-Ei{{p65?YzH|mkH0P1j+~(F-SZ@F;jdA zxC|adc^u6JH;UGp+24gaG*o>2xl6`PL5@?iMNUMl?2Z1d*J!X-W3PeBx*uO39wK|m>{OQSJ*%Noe4jYO-$!zGTyR0oEut%8k;Mv zq*-k4mFV(wFP;a3?#un)@rBb2Sf%qreY1q89ZD9`uG{v(ygvaO>3-o(%LrCopq>-5 z@w#J%yzL3r&YTY*#t^}{Bg+^?b917kB}GAL(KDW*&yR3Td;R@223xIZqomUJ`MOJG zt3t{cLPTQtBvYd?Cg0H^JSzfll5v8~xtKBa%1h5Fa@`7&IU_x(ytlsSRKM8_NV{1b zOw;V9chmaCdz5@EEk{Ht>Du)H%?qJ7n1b+e3l$#faaI7sBM@v^`yCi8P=ld=ljcLt-y{9@m96^SG;wR?=h!{A1BPkKBJ@c0(QL_VB@%rnSBJ0y zYCR(nQ|lM^h_VOjjKvaskFv01+qK6~#`MyRAC^ygd&f=cl%lYYp$-Ys~_E<;rrq8;|{&uCdnrSCIkFpDn_%dchtyD4J2rIQXqA>?#Y zdqM)7B&mp3?}J z|9LO`Q&ZCQvXzFv_$XGHB4wQ@8d_Lg4qbly1lJKZ8*P??clmggvjnuZgh!b%E!Fyu zGJ4w|qh~@-&+h)#vtK?XgYq@Qe_-aaTsDIx`v(6tw#6gvn8KN7Wrg3H%t)qtWLMKy z+VgIooR*rW`@hr5csaXl$Jg&V6gscw?QE9hm2YcpAI^ao5y%J-B7PrEZm7`i5cD#? zKQ0{Kv+4UEoY%4L7#(sw;6tk6&sWNjdmN*Z*96a-M5{e>LNU#?%rd z8>YF9@-sZ

zcp)H$DRwobos^_z9*b)Py+BG1;?9=LPB%^d^Ph;NN08T-c4v`K2Kf#j@~z>hw@=m- z-b#9 z0x)=s^$V-Q<2fq>>+zmy{$1-1I5n3a+|i!KVUct+jCa3w5-Q~tQxnoy_8wC1Bmgp! zlmL?|No0T`eKw1-ijrz=GjoI7%K-P-a?qB^>GFim}v#pSYG<#lj z7446`x2?gGN^uw5wtQjuN_yU|-(u7QRG%QL)>@<#kwDxGl*3FX$Iix43@QPp6Q z0Lv;zO^nhY4lZ^~TYN9m2%%7!Z9^CAw zF6ojDAmNZXls&wD6B_m`S(tP%)~UI0Sw5VsT@7Zy}~L zd9C6$(UTm4M29{RFD_=n;~EDw&)ffUr?Tzw)8!QOr+xuOgwTvr-nvEnE@hkOT<<)i zMOUmK-)%=+hMvLIsQNZ6c-fbf-f#C(&Z0LT61JiKRyY@vC{`hvRbP;eHz7i;s$u2fc)U2UDn8+pm*W$3Ya2!ecDCsD`w3MY=C$tYocsAX zd>`@JQR<|o{2nMJxU>7y$oE5$$c!w@{3E9ki+6%%$SUh$vX$Os`w{Pjw)+0ukj1)d z<*ge=cE@pY!HoMnaajRomt^{PsR#gk#U;4zc|SadZ-b0Q1m%*2ap+yL{`0P^N!Isx zo?l1qQ&}BhCnW9@&No$x3HQMXGUIbJ2rdtpwCkhd77t-AI84TTeOOs9{qV!Su&uN5?ZEwa0a)$`8l} zB9-I43`bO_6iP+@->nUhs%MWD8sx*gB$nh8R!xE56=x?Rw=BHP_trUJX%5#Da(Hdm zeCKMp?;fW0vrg3(PsM~K@IjY^9kq9Uq6Eb2_m+tzKDZy8m*nKYE0f6wb0LYMO0xO_ zKW{xSbiLPzm>mfu^?%cQFFJlDy#3Y_CfpH|`|U z0BI=^%gMWzOKi7Yh$<7fbFqv^e1G0<{x-+v5#9A}&~dXW@9+)rg(M!#cNvs*4STQb zDhGLCN2Q#Gi-o}0LY-cMUp z8mu~SwG^*>H-!6!Qc&5@qhTeAHNfrWlLdAEg%T9IYG5c#@Bf_pDt=U^*?nQ6bMX_f zF_(_aPd`h;J?>SHjnWaXjXIf~(&jFp7C6;*<>>{*i=&|wPHva0zaPmYT{GSq9qmr- z6_>ZavNpl0&*dt-@y}XK-ZB$A#xxKkMfCk>i8Maq$T}-f(cn5^RzJ)~h=~>W?oxtf z9L&_zh1HFih;6lGJkHjNg@nLn!I%o=6Wt>If?$rSE}lDNqzX+{5+ree@MKw)`smMb zzew_%A^M1Bj70Z9N-r2*uU~_j>>$0nxoOp7C@aE%UyM@tRUL;#%B^o8OL@jVz_L#gDb?nC)g-!M*A1?x-`l1_;IW_sFp1ZnH39H}#Q z3{(mMHTIRE+Y+~8jGAJoc&e#b1|agLX9jDajH(Re#H-3>hKblrT98&U@^MU(M;S3I zt*=Sc^kJJ*xx+uapLe?1_aI*Qcgg>O0PE2u|2QZ9$L2KI{sTI z?ELu?^$V6W=sw7DpC{!5D6)-sMJu@RVu07d5||(mY%)@a#HrS<5Blu*2M@^=#j$j< zs+jPNuJU=J^t|S174P@T{H7neo%buX_W9AplU65yjr{tP;0g3!mL0Y#>=qY zF$M$hqsASooZz5pVt18l;=-T{WlgT^lNdV5PBZ)riSY+64>vXY0gO9nC_cv!@^RBa z1l=EYvyAq!5q6{!GBvpk^YY;wdcWGBRb$0|_LNf}C>;VCEpF1G8S$A4e$td1$hr(^ z^N*`+7^%#_dG=$$ilujNg>z-Xo@-m2kF*Dr|hF2upo!~am0ZK zBP12_mI4|kS2GO?RA^@#p}ZgNNg2PtYm6fPzvo8D<`%s08ZP8{0MZu4Ra7<$w}4QM zb+SdaN_2Dx$@qFd{cJfwXTC%!-noi#8uKCwpq8%U%yEXVM@7VUX=6HJ+5Y_>x4pR( z{|Ec1%5)Cw)(<9$#U1L6H*Cl^Bk!vlzo5{Hg{F!5UMUXI(K+fG7%`M3^#M^yLIh6? zpA1X5fNPE^ZQfuv#LsZgDx`$GTQSJ+36<%kvvw@a&yv$c3R+6yJ))BPg&zR398Xk^ zkU)dyj)`#hU#LZx*!=S&SFoPfqc?8Xv!i*6R@8!gFfVq$A{+Uod_Z7z%C559NZ}KQ!A?0l2jBF6wH^ zXT|;t9A-%XnDBvq;t@W;w4SvUvPr|1VE#)VHP^sMDD3(Ru%y1W>y41 zZj=*Olny>-*cDkMTP;MbZTCPcUfJ_=YHi==0v49mHd}Dg^Eno?9qv)!)06KqF~&!F zcAfRUf;_l>yZ3p#ee^Fd&)H1FL-zKrZj&Xxi8|E5*#BC`5{kbSoW<-8;Py&r^nG$&tpzv!#DL%2_m4Pw zc@NDD6>+&g@k0Uq6{2NiZi1Eb?}6QBPb{hurNRr3I{b`k-f*>V;#RM zR8ljpz2M~jIIJc7*JQ9_{rm@63cNHe4t&-GAhGP4E`TN!iJ{I^6Lx3F(}xd_yo#Mi z|1X5-I3fWos$~}f7Mcd#lQtHK{6FULWRwf=c!%-HvA6L0{=dQaI2}Tm^|Vl_ zck+vze^&}8W-*r2Z05nQKK?VN6WhshWA6ML=$9js?8G5lY(0VZSibx4mDe?7k-B+> z+N7R?-ReS1-6AajC|&_*_OsE20E`TeLG%HcX#Sv=!6`2j`Tr4J1J}s%=;NE7iLuU! zKFK!IO^A_Qjrf1x{2lB&{w^ag^HUs%&`y4-{RG}U@SpMGXMe}M0rPcrX3E8ShofHl z-85j$qAl9v)8)L=A^-{7dm!Lv=9D0*tG*i504p!PviI-t#=f7Sd+>_3fC+s-E`YC| zIROC@0h7rBW2h1T@ZR_E{=t_Jo`n}$rr~+^#sR#%=O6L*7k`Il=lo1RE-U>=a0I0hD+5Q;_ZgSL_6~L6mplIor>`8Q+}X!|^(_s4 zCxEE$lZSwbwdkVZI=r#}pD;MugJ&Q4KI+OBB;P@Xu9Uco4tYw+L#qHVp-kYSlY6Ra5vHNpT5|w3jyFhV8xvf{C*#t zPVq~gon&#X>l_nN9A;SWPJDLZpIL~ck!%h(k~~1Q{Dc74#$u{u^k4@|kpC?PJgw;N z@4@C(_hLcAQp()=W_+3&2nLMFx-!wM_$0*Q$Hlj&j=?bWdQ3C zs#X{f5D`sm>qoEr76%Dg|(pP;qpGLfArpN!PfPKb>P`KMZ{!ud`lHdjdt z^F)E`r3YN@0?~huP@-EV^4_j z@O<7ZiONjR%!l8@gz2KHt<1f#h`tT!%l?Tu=|%vgLs|GBm3Bje!!X!;G46B2JMN`? z)`xCZSnVC?!qCVlhCRJ-d%IY!tC!T=PdU-bdqvKdmukfU0a;6?iK7=@fMQ--&qWNm z-T30nAym2QP+wikG*%6)XWxk0iUv5#DzrmG2!mWd?i*p|sd2LRZuAUvvQkfncK_f= zFNVi^G0MH;4Gi%aCQTt$ym}(h{ztL0WecjApV7?3pW%o;r@!noT?v3BRfsaJQ%6rL zJ~{s?BL#ib;``}0K8#`3=5vqVp!+BnjYquMSgmPiO)7<#tV5ADGWv`mkXM-dV!(5Q z2f+~-dzi(xq#os^En4jcm!pOp0khiDgluJv`*1XapzIYKoz9mGo_J?|~bF4jHHDDn&FZ-4z2Be$DNbME{fue(eCLYI7UJk6N+s@jE3$=WPnVx6H34lyMbOALi z!f^kx?=g?LcyiJ8OQ{1gy|$|V0)l{~`VO&P;gcKx3JsOn3v9{`0iZ6xLLcv@$|cyb z?pc&rs#p&`-&0B#(C$$~EocZxh_l2&ten3ME1I^^<=2&Q**^iWtPlY42@ozo(nM`r z`WP#kE@oT+orN-3OCT{p^;bb4uOUEAIErypmNjC>nrGm&v)s0(o6io5oD~8PUjUXf zqC-QqZ86p^+=jY}WsLe#TtHrLPBplULmMs957l(v1Q>?Skt_n+dn6$m|0K2JAp-f1I#GF z;@WlCzWh0QJNDh_QuV!pKoLS924AS1fj&RL>Xy5h6{$9BTL0UDnH#brR)JVhOLDNP z={{^+_$(EKM(P9TAE26oKoLVgvwV@+ZLZmbyO)21%J3H2|AShRlw3?ZM+6`~RjDUe zURsGKwtOE|&UspcKb6YH04!TQF>v~*u$70YGIDFKj)3lXpw zZP?iSIMy$rJmf4#Fr@qga=9tgv-O97IKmmtJy_hZ9*?a0W35tBE>Hf%40BEZWFV3x z(qVOB`?9C8Y2lMF+XfI}0TI;{1d0O!28=Nw&eFQ4v18TKsC3llOy<8Go_Rq4WKa_K zTwlHzTbDkHO$+{rxlfr#Fn6NS?Ql|`6$EAt0dJrcOB=W2?iG(QLC!kv^&EKo++p;( zrv<;mbCUWx7z$uv%_@XeJjHb4ooMSjM;!qZ3eJ%{@JRtlT~t62puwAgK9yz5aX z=$7AQim$ujFxDWtsh@{9lo*Dp>&5<0vX&)oN4YGK5oDC>o*rXWy25RihU64Gd1SqdBIp4?)rW$> zWC#euDp`Fk78BMi-hxL~eqVEV6Ma@bX#FRTRo>^74&dhCSQUj{%4ODSY+m>%LcuT& zUWlQ0_%xFxEXYeh-WW6RP<$Ua4||GW<#mW#HSS!+-=1%W(+fY|yCreUmYc?R28K1GH0I?c^DKFsXI z_ooVyJSG6~sf40_)H#-5%aRB}F(3AwdV`u(shcLh=O<88T?BP~5kNo`)rJ6;G~SQ< zRz6Lo-#x67Em5xd-SScga4X0REHUn5mej@Aw&*ErUHO29{Hn;vtx!^*atHwp`GKm6 zay+r&U$PL+mV!Wjfmi_$fcV0S&vdP`2@kFKK2|SYPa+UuU3tIa0dlzS)uScjb%fG= z0Oc+lzIWeWqorm!qLKV@^qFam3Wfkk>O`Z#glZ;Fd}7_7;+|DcFvYkP-auzwDpzI# zy!yScAt1tMmQh7jM-dxlfB`>Jx2$p(y;OTDk%w05_)) z2zyamvPjFSVzHXB>+s7gJ{q9)P_(hiI&c$G>YaWNh)1VcEoDq?zZnm%eoiy>6@s?^ zPB17~0wCN#h&k1rmO5-%@Hi>59dGXc8G=DCHJcJZbf+n+?-c}Q2Z1OfRt?lcZD0R2 z+_&U8RF^hQvh&Zb&s^VCKuW-=K_w!A!&-s0bQ}J|2mc4uvaXsp+@|>oOnry?RzV;| z2=L(d2HW5$apGI|{xNne{e4uF)RWnaa|9{&mRFY>&YU?@__LU>0|cTTwD(`bXXoF* zvDV+f7_EiX%!oqO6a;1o0rBn|4|lMT%|lx0u4Rpzw7?#oJN#eFeTB_x7O)5~c}0Z} z0PLo6tZ3dyq_@FYQjL>s?_t#A=4Y4E3rq%=dOtG+c)CjtKZB`<4rtF&*Yp^c&s)z@ z_Z3=HU%Z3DMt+$?kr06RazvR{oMIY1u{OiysD#aK#Hp)?F+3K}E+q1sY6=1~K_G6* zi^1urz@qvccx2skSX{S8%T*yEy~WguL0uWy+LHJNOfF92U>^|`l&a}P5 zJnRiHvrM^a3Iex7K$Lp^a61;%-GfIqeHW|h?uU($r;@a`SX&VjfH)4l%7qqmDm8l(_O!5cw}bzf$EUcNv-K+nEMR{l4*cg2$|SW|-%vvY!HOmL1_ zA6CX6SX4TITcH)F+QJ1`3?-;5cVg?}M^RZ?hjX2u^E;v?}{D*ab=z#6=hA>TK8?NUAlp$zI#w=sbsZkU(wG$ zF~K=O0A#Wv$A#%RXkeo8dCoPc+qw`{SE_L8+Cg*`MZR9jQzxY0mT>1c! zFwKNTtnm3N1m@;9;piCFFMa?!RzHIkwc9m&|J;NGw|jAT0?uyvL_rvi1{p*YLbv-W z_Feup4xfLAdVvZ?89L|GNiaJI7RX)H;f13<1j7AT*t`bcSo_~$VclBR=PP3bX<^0h z>kaWaO#lR#LIjLPBh!xgwQ59NLpN~f%Imn;xd*IX&Nzb>MF{lXby@5$Kwpqh%#Haq z8}Q(o-$QfdN|vCTry)P30cwXL+8)T_kn-wLb4CYnC#Z{+ARGz9Y_OrJVkxR!4Kxu} zV_E%OINx~?S9j4ZduDOI}_GxQV5>9M*Ew zxaMKg%DZUSe+*7r4b8la5fNA3;&teoHN+JGm;rRMwc;mB1g*m-=|HrTro&xKJYuG@ zP*pCT0eqSNSu^W}$?kV!Y10nev+^5Q)AS(h^x`ubO>o4TqB!GECvB8n1;uD;U0CP%X1NzyFbUJt`Fe$0HxL{ znh=$HaSC8f?oyuglJn6Y?$fGSET~;aug=FXzj8gQ%BwXO?-GlX&OCF&g*Q2%&3u(2 z05ikrD_0015GNudl}+wo7rF*p(LK(qw$m?2E`Y*ERb|fcDEv6an}W z6tjCH#Yzm!Jzy|KFzoHX*^UFa)_xs>OhPj1@54BihT>jolxwtWMH8j8QBy-(^evKV zOO$r3vTHKIVXsDcNuw6Wv9Ng|<@~j1rVDQgMXpddhzKi2sWy8EC;~8h*nQw`<=;7>l4KmXKYp(EvpV;y~1}UW17cRMF;3X6FiLC6>-x zNi*IyEUa43ly6M!M!+R(_+ME7^+n1MPy`@lkR^9Rgt^Itg%uCOVQ&|%4Ian&wgb4* zc?3THDD?!@ns^`^o>U{bPK)g-Veuzy_oC3VQKQ#Vx1LD98S9!JK~33w!pWvNV8uDD zISQu?uDc=t83S&@Pe77O2H_8l!yoX&OXTkvyNc@r$8nX)!;XQgWMvtL$h~c4Qd5hm zlpCIoMn$;S#TGAIP$)9MnhtcZk4vYNb8jsUg1x2oehU zPc{7^pa_8eF#Sr83DH0-2vX&EJmkj6_#j5dM=<6c!+5}rL2oNMhtHv7a6g7T5xOCf zC{TB3GKhImPC-#RiZU_(DMP|WV z39Y;Q6&KtXMm4d=VsY>UuSKc72CkA?xa{>zv{Az>yJe^>uRwK09jcuTsI)h8%w}fa z5pBQpp^$#&-J|aniU8;f&sp^*h|4_2)CthMXp)j=eiDQ>42}1Y8|cO0NI!;0he;Sb zOkCpS@8SeAt~tX9;)sYL8E)hyr>EG$<9dZSd58~cGUp)gg{7YSU1I2yS?$CbJn`Lx z@-l7$HIqfRYYICli7mblR+EI++IXrvQ0{V}y1W*36-}sf%}14k^1RVbWapDLxnKPD zi$CR70;>7?R}p}GU73k-eTl+6+2y1i_IG0>(2ZXA4GemEs8<-LI59+V!mWuE{$PMe zMl911Jb}Q{*{z5@(fya--XsM#-wA<;f0BQNNHM=6<0HySojlE58ge`APO|n@^uM2v zy0QhD@4ZA;Chm+sb@H+M>UpPtPSy3{B-q4#^{64 zPYz*>brMIl>m?v2z+87y*IwLc1)+l>KcnLUJjKnhSw;311h;FhwBk-{vy{-@?qd2Z zCu~$s+RSu$mQ!C-Qc4~LqPd73G<`~_w8j}|PEV7GND7lvmu4LTDy}u_AW!dsq72j! zkfOrP)0utpgM5~=))^~D1=CuK@{Kl#`1eF^@j(#wTM%8EnBe5S+$VuEa>B=R9*9oC zNF^kZT9l9S;_nIFg*nKoNifT{tyt1pz%Epa_5-P*i;=2oxv;6agsEg;T>;5YPhx|39AG V_9gbHUhx0`002ovPDHLkV1k&E=!gIS literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/BoxTextured/screenshot/screenshot.png b/test/testfiles/gltf/BoxTextured/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..47c5d4ca378da34fe4d796e34926be3919cde4d2 GIT binary patch literal 10893 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 bD}t*}UhI?zf7e^JC?G4TBvJ9v@W=lEI;XVW literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/LICENSE b/test/testfiles/gltf/Mesh_PrimitiveMode/LICENSE new file mode 100644 index 0000000..8bf601d --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Khronos Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_00.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_00.bin new file mode 100644 index 0000000000000000000000000000000000000000..29c7c4b0d4a61999129ae8ecdfc38a1711e61a5a GIT binary patch literal 12288 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 rcd~7$6WTq<_6FbIIeVB#PeEDiu&Xao5G literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.gltf new file mode 100644 index 0000000..7a1b67d --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.gltf @@ -0,0 +1,71 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_04.bin", + "byteLength": 48 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "material": 0, + "mode": 5 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.bin new file mode 100644 index 0000000000000000000000000000000000000000..c16679daa320863633e50a3427e300dcf35522c3 GIT binary patch literal 48 dcmZQzV6bOkVAv1DAOK>6FbIIekl7$U0{~ZO1Ni^| literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.gltf new file mode 100644 index 0000000..ffee47a --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.gltf @@ -0,0 +1,71 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_05.bin", + "byteLength": 48 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "material": 0, + "mode": 6 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.bin new file mode 100644 index 0000000000000000000000000000000000000000..867693d15211913f35cd133cfc6b3bacdab85d04 GIT binary patch literal 72 ccmZQzVA#(9!9a?^9*qs+g8;f3WN|PX0Pc(h^#A|> literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.gltf new file mode 100644 index 0000000..87fa145 --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.gltf @@ -0,0 +1,70 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 6, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_06.bin", + "byteLength": 72 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 72, + "name": "Positions" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "material": 0 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.bin new file mode 100644 index 0000000000000000000000000000000000000000..cfc7d5d3e819ddcdab2ece975e6cde55e50a521a GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.gltf new file mode 100644 index 0000000..8b3bbaf --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.gltf @@ -0,0 +1,85 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 1024, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 1024, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_07.bin", + "byteLength": 16384 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 12288, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 12288, + "byteLength": 4096, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0, + "mode": 0 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.bin new file mode 100644 index 0000000000000000000000000000000000000000..77d730d6afd1c321f9939377e7f5d8c3ce516ef5 GIT binary patch literal 80 ucmZQzV6bOkVAv1DAONC~*&sO(u%9(^rX7UIz`zV-fG`sjGXiN41_1yye+AG0 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf new file mode 100644 index 0000000..6696ff3 --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf @@ -0,0 +1,85 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 8, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_08.bin", + "byteLength": 80 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 32, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0, + "mode": 1 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.bin new file mode 100644 index 0000000000000000000000000000000000000000..b828a7af2a9306bbe91fefec2e1d6481ebd095f0 GIT binary patch literal 64 qcmZQzV6bOkVAv1DAONC~*&sO(u%9(^rX7UIz`zV-Faa?m5CZ_%a0SW$ literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf new file mode 100644 index 0000000..39fe227 --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf @@ -0,0 +1,85 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 4, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_09.bin", + "byteLength": 64 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 16, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0, + "mode": 2 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb4e3f822f789101dff5379a42f8ec4fb1ab428d GIT binary patch literal 68 qcmZQzV6bOkVAv1DAONC~*&sO(u%9(^rX7UIz`zV-Faa?mQ~&_)m<7rJ literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf new file mode 100644 index 0000000..4a4cb2e --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf @@ -0,0 +1,85 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 5, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_10.bin", + "byteLength": 68 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 20, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0, + "mode": 3 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.bin new file mode 100644 index 0000000000000000000000000000000000000000..cf641b2e8ad340b45372084817e97f4c2a7a310b GIT binary patch literal 64 lcmZQzV6bOkVAv1DAONC~*&sO(0MRfu12d4r2*gZ43;?ez1OEU3 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.gltf new file mode 100644 index 0000000..b7352bf --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.gltf @@ -0,0 +1,85 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 4, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_11.bin", + "byteLength": 64 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 16, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0, + "mode": 5 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.bin new file mode 100644 index 0000000000000000000000000000000000000000..f0a45dc1e073d3206f7f7af11d01aac9da02e3a5 GIT binary patch literal 64 lcmZQzV6bOkVAv1DAONC~*&sO(0MRfu12d4r1jLL$3;?e%1OEU3 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.gltf new file mode 100644 index 0000000..51acab9 --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.gltf @@ -0,0 +1,85 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 4, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_12.bin", + "byteLength": 64 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 16, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0, + "mode": 6 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.bin new file mode 100644 index 0000000000000000000000000000000000000000..c3bea4f9c48633a564741f69dcc191eedcbd0e7b GIT binary patch literal 72 pcmZQzV6bOkVAv1DAONC~*&sO(0MTGJBbdv;zzn28Y!J-^!~oAU1Oos7 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.gltf new file mode 100644 index 0000000..c2b1af1 --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_13.gltf @@ -0,0 +1,84 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5125, + "count": 6, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_13.bin", + "byteLength": 72 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 24, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.bin new file mode 100644 index 0000000000000000000000000000000000000000..e25c8cdab353dd61c26273ccd9184b1485d7567a GIT binary patch literal 54 icmZQzV6bOkVAv1DAONC~*&sO(0MTGJBLg!dGZO%ZTLc3D literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.gltf new file mode 100644 index 0000000..fce1f8d --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_14.gltf @@ -0,0 +1,84 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5121, + "count": 6, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_14.bin", + "byteLength": 54 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 6, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.bin b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.bin new file mode 100644 index 0000000000000000000000000000000000000000..9968347aaae143d4499fc2f6c50cda3d2190bac7 GIT binary patch literal 60 lcmZQzV6bOkVAv1DAONC~*&sO(0MTGJBap$&zzD=l3;>@_1Oos7 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.gltf b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.gltf new file mode 100644 index 0000000..a688e29 --- /dev/null +++ b/test/testfiles/gltf/Mesh_PrimitiveMode/Mesh_PrimitiveMode_15.gltf @@ -0,0 +1,84 @@ +{ + "accessors": [ + { + "bufferView": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "max": [ + 0.5, + 0.5, + 0.0 + ], + "min": [ + -0.5, + -0.5, + 0.0 + ], + "name": "Positions Accessor" + }, + { + "bufferView": 1, + "componentType": 5123, + "count": 6, + "type": "SCALAR", + "name": "Indices Accessor" + } + ], + "asset": { + "generator": "glTF Asset Generator", + "version": "2.0" + }, + "buffers": [ + { + "uri": "Mesh_PrimitiveMode_15.bin", + "byteLength": 60 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 48, + "name": "Positions" + }, + { + "buffer": 0, + "byteOffset": 48, + "byteLength": 12, + "name": "Indices" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0 + }, + "indices": 1, + "material": 0 + } + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ] +} \ No newline at end of file diff --git a/test/testfiles/gltf/OrientationTest/README.md b/test/testfiles/gltf/OrientationTest/README.md new file mode 100644 index 0000000..0816d68 --- /dev/null +++ b/test/testfiles/gltf/OrientationTest/README.md @@ -0,0 +1,27 @@ +# Orientation Test + +## Screenshot + +![screenshot](screenshot/screenshot.png) + +## Description + +This model tests the orientation supplied by nodes in the hierarchy. The red, green, and blue arrows test X, Y, and Z rotations respectively expressed as quaternions in the nodes. The cyan, magenta, and yellow arrows test X, Y, and Z rotations respectively expressed with rotation matrices in the nodes. + +Each arrow has a target indicator of the same color, opposite the point. These target indicators have their positions and orientations baked into their vertex data, so do not rely on node transformations to appear correct. + +Thus, if each colored arrow points directly at a target of the same color, the test passes. If an arrow appears to have been rotated away from the target of the same color, it could indicate a misplaced matrix transpose or some other orientation problem. + +## Sample Test Failure + +![Sample Test Failure](screenshot/OrientationTestFail.png) + +This failed render shows what happens if the rotation quaternions are converted to transposed rotations (in this case, converted to a 3x3 rotation matrix that was transposed). This same effect is caused if there is confusion between row-major and column-major matrix ordering. + +This image shows the red, green, and blue arrows, which all use rotation quaternions on the three axes. On the opposite sides of the cube, the cyan, magenta, and yellow arrows perform the same kinds of tests (with slightly different angles) using node orientation matrices in the glTF directly. Thus, it's possible that only one set or the other set of arrows will fail the test. + +## License Information + +Copyright 2018 Analytical Graphics, Inc. +CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ +Model by Ed Mackey. diff --git a/test/testfiles/gltf/OrientationTest/glTF-Binary/OrientationTest.glb b/test/testfiles/gltf/OrientationTest/glTF-Binary/OrientationTest.glb new file mode 100644 index 0000000000000000000000000000000000000000..f8a6b7e4fd3bd1a8596e80970c5a0d9edcefda20 GIT binary patch literal 38920 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 G!T%3H2i0f* literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/OrientationTest/glTF-Embedded/OrientationTest.gltf b/test/testfiles/gltf/OrientationTest/glTF-Embedded/OrientationTest.gltf new file mode 100644 index 0000000..4c5fec7 --- /dev/null +++ b/test/testfiles/gltf/OrientationTest/glTF-Embedded/OrientationTest.gltf @@ -0,0 +1,1258 @@ +{ + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5121, + "count" : 78, + "max" : [ + 51 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 52, + "max" : [ + -0.6740907430648804, + 3.9529545307159424, + 5.33065128326416 + ], + "min" : [ + -1.3648574352264404, + 2.9005930423736572, + 4.66934871673584 + ], + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 52, + "max" : [ + 0.994742751121521, + 0.9659255146980286, + 1.0 + ], + "min" : [ + -0.8102691173553467, + -0.5860580801963806, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 3, + "componentType" : 5121, + "count" : 114, + "max" : [ + 73 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 4, + "componentType" : 5126, + "count" : 74, + "max" : [ + 0.7157971262931824, + 3.0, + 0.33065110445022583 + ], + "min" : [ + -0.7157971262931824, + -1.0, + -0.33065110445022583 + ], + "type" : "VEC3" + }, + { + "bufferView" : 5, + "componentType" : 5126, + "count" : 74, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 6, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 7, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.7157971262931824, + 0.33065134286880493, + 3.0 + ], + "min" : [ + -0.7157971262931824, + -0.3306511640548706, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 8, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 1.0, + 0.374779611825943 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 9, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 10, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.7157971262931824, + 0.33065131306648254, + 1.0 + ], + "min" : [ + -0.7157971262931824, + -0.330651193857193, + -3.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 11, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 1.0, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -0.374779611825943 + ], + "type" : "VEC3" + }, + { + "bufferView" : 12, + "componentType" : 5123, + "count" : 420, + "max" : [ + 271 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 13, + "componentType" : 5126, + "count" : 272, + "max" : [ + 5.000002384185791, + 5.0, + 5.000002861022949 + ], + "min" : [ + -5.000001907348633, + -5.0, + -5.000001907348633 + ], + "type" : "VEC3" + }, + { + "bufferView" : 14, + "componentType" : 5126, + "count" : 272, + "max" : [ + 1.0, + 1.0, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 15, + "componentType" : 5121, + "count" : 78, + "max" : [ + 49 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 16, + "componentType" : 5126, + "count" : 50, + "max" : [ + -0.46912679076194763, + -4.66934871673584, + 3.9916374683380127 + ], + "min" : [ + -1.1686336994171143, + -5.330650806427002, + 2.93727445602417 + ], + "type" : "VEC3" + }, + { + "bufferView" : 17, + "componentType" : 5126, + "count" : 50, + "max" : [ + 0.9880198836326599, + 1.0, + 0.9781473875045776 + ], + "min" : [ + -0.8398305773735046, + -1.0, + -0.542848527431488 + ], + "type" : "VEC3" + }, + { + "bufferView" : 18, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 19, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.3306511640548706, + 3.0, + 0.7157971262931824 + ], + "min" : [ + -0.3306511640548706, + -1.0, + -0.7157971262931824 + ], + "type" : "VEC3" + }, + { + "bufferView" : 20, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 21, + "componentType" : 5121, + "count" : 78, + "max" : [ + 53 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 22, + "componentType" : 5126, + "count" : 54, + "max" : [ + -4.66934871673584, + 4.039160251617432, + 0.6999828815460205 + ], + "min" : [ + -5.33065128326416, + 2.991360902786255, + -0.012430161237716675 + ], + "type" : "VEC3" + }, + { + "bufferView" : 23, + "componentType" : 5126, + "count" : 54, + "max" : [ + 1.0, + 0.9961948394775391, + 0.8997273445129395 + ], + "min" : [ + -1.0, + -0.4364525079727173, + -0.9618476033210754 + ], + "type" : "VEC3" + }, + { + "bufferView" : 24, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 25, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.3306511640548706, + 3.0, + 0.7157971262931824 + ], + "min" : [ + -0.3306511640548706, + -1.0, + -0.7157971262931824 + ], + "type" : "VEC3" + }, + { + "bufferView" : 26, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 27, + "componentType" : 5121, + "count" : 78, + "max" : [ + 51 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 28, + "componentType" : 5126, + "count" : 52, + "max" : [ + 3.864471435546875, + 5.33065128326416, + -1.0113166570663452 + ], + "min" : [ + 2.8218495845794678, + 4.669349193572998, + -1.6833229064941406 + ], + "type" : "VEC3" + }, + { + "bufferView" : 29, + "componentType" : 5126, + "count" : 52, + "max" : [ + 0.9749377965927124, + 1.0, + 0.9998826384544373 + ], + "min" : [ + -0.654447615146637, + -1.0, + -0.7971041202545166 + ], + "type" : "VEC3" + }, + { + "bufferView" : 30, + "componentType" : 5121, + "count" : 78, + "max" : [ + 49 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 31, + "componentType" : 5126, + "count" : 50, + "max" : [ + 1.4936277866363525, + 3.9211390018463135, + -4.66934871673584 + ], + "min" : [ + 0.8097413778305054, + 2.8717148303985596, + -5.33065128326416 + ], + "type" : "VEC3" + }, + { + "bufferView" : 32, + "componentType" : 5126, + "count" : 50, + "max" : [ + 0.7893224954605103, + 0.9619584083557129, + 1.0 + ], + "min" : [ + -0.9977105855941772, + -0.6139788627624512, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 33, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 34, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.7157971858978271, + 3.0, + 0.3306512236595154 + ], + "min" : [ + -0.7157971858978271, + -1.0, + -0.330651193857193 + ], + "type" : "VEC3" + }, + { + "bufferView" : 35, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 36, + "componentType" : 5121, + "count" : 78, + "max" : [ + 53 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 37, + "componentType" : 5126, + "count" : 54, + "max" : [ + 5.33065128326416, + 3.432579517364502, + -1.7226401567459106 + ], + "min" : [ + 4.66934871673584, + 2.4595587253570557, + -2.553251266479492 + ], + "type" : "VEC3" + }, + { + "bufferView" : 38, + "componentType" : 5126, + "count" : 54, + "max" : [ + 1.0, + 0.9992989301681519, + 0.9697774052619934 + ], + "min" : [ + -1.0, + -0.8278425335884094, + -0.9262295961380005 + ], + "type" : "VEC3" + } + ], + "asset" : { + "copyright" : "Copyright 2018 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey.", + "generator" : "Khronos Blender glTF 2.0 exporter, but with 3 quaternions manually converted to rotation matricies", + "version" : "2.0" + }, + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 0, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 80, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 704, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 1328, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 888, + "byteOffset" : 1444, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 888, + "byteOffset" : 2332, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 3220, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 3336, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 4272, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 5208, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 5324, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 6260, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 840, + "byteOffset" : 7196, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 3264, + "byteOffset" : 8036, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 3264, + "byteOffset" : 11300, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 14564, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 14644, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 15244, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 15844, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 15960, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 16896, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 17832, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 17912, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 18560, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 19208, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 19324, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 20260, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 21196, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 21276, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 21900, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 22524, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 22604, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 23204, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 23804, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 23920, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 24856, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 25792, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 25872, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 26520, + "target" : 34962 + } + ], + "buffers" : [ + { + "byteLength" : 27168, + "uri" : "data:application/octet-stream;base64,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AgADAAEAAAAEAAUABgAEAAcABQAIAAkACgALAAkACAAMAA0ADgAMAA8ADQAQABEAEgAQABMAEQAUABUAFgAUABcAFQAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAwADMAMQA0ADUANgA0ADcANQA4ADkAOgA4ADsAOQA8AD0APgA8AD8APQBAAEEAQgBAAEMAQQBEAEUARgBHAEUARABIAEkASgBIAEsASQBMAE0ATgBMAE8ATQBQAFEAUgBTAFEAUABUAFUAVgBUAFcAVQBYAFkAWgBYAFsAWQBcAF0AXgBfAF0AXABgAGEAYgBgAGMAYQBkAGUAZgBkAGcAZQBoAGkAagBoAGsAaQBsAG0AbgBsAG8AbQBwAHEAcgBwAHMAcQB0AHUAdgB0AHcAdQBgAHgAeQBgAGIAeAB6AHsAfAB6AH0AewB+AH8AgAB+AIEAfwCCAIMAhACFAIMAggCGAIcAiACGAIkAhwADAIoAiwADAAAAigCMAGMAjQBhAGMAjACOAI8AkACOAJEAjwCLAJIAkwCKAJIAiwCUAJUAlgCUAJcAlQCYAJkAmgCYAJsAmQCcAJ0AngCcAJ8AnQCgAKEAogCgAKMAoQCSAAEAkwACAAEAkgCkAKUApgCnAKUApAB4AI0AeQB4AIwAjQCoAKkAqgCrAKkAqACsAK0ArgCsAK8ArQCwALEAsgCwALMAsQC0ALUAtgC3ALUAtAC4ALkAugC4ALsAuQC8AL0AvgC8AL8AvQDAAMEAwgDAAMMAwQDEAMUAxgDEAMcAxQDIAMkAygDLAMkAyADMAM0AzgDMAM8AzQDQANEA0gDQANMA0QDUANUA1gDXANUA1ADYANkA2gDbANkA2ADcAN0A3gDcAN8A3QDgAOEA4gDgAOMA4QDkAOUA5gDnAOUA5ADoAOkA6gDoAOsA6QDsAO0A7gDsAO8A7QDwAPEA8gDwAPMA8QD0APUA9gD0APcA9QD4APkA+gD7APkA+AD8AP0A/gD/AP0A/AAAAQEBAgEAAQMBAQEEAQUBBgEEAQcBBQEIAQkBCgEIAQsBCQEMAQ0BDgEMAQ8BDQF7B4pAAACgwHwHikCT0JjAAACgwJDQmEB8B4rAAACgwHoHikCS0JhAAACgwJLQmEB6B4rAeweKQAAAoMAKzoFABs6BQAXilMAFzoHABs6BQArilMB/B4pAeweKQPv/n8D8/5/AeweKwIAHisD//5/AktCYQJLQmMD8/5/AktCYwJbQmMD//5/AeweKQHwHisCM0JhAktCYQAYAoEB/B4rAeweKQPz/n0B1B4pAeweKQAUAoECW0JjAktCYQPz/n0B6B4pAeweKwAAAoECT0JjAktCYwP7/n0CS0JhAktCYwAAAoEB8B4rAeweKwP7/n0AEAKDAktCYQI7QmEABAKDAeweKwHgHikABAKDAktCYwJDQmEAEAKDAeweKQHYHikAAAKBAktCYwJLQmMCS0JhAAACgwJLQmMCS0JhAktCYwAAAoMAAAKBAktCYwJLQmECS0JhAktCYwAAAoECS0JhAAACgwJLQmECT0JjAktCYwP7/n0ABAKDAktCYwJDQmECT0JjAAACgwJDQmECO0JjAktCYwAQAoMCO0JjAAACgwJbQmMD8/5/AktCYwJbQmMCX0JhAktCYQPv/n8CX0JhAAACgQI3QmMAFAKBAktCYQI3QmMCM0JhAktCYQAYAoED6/59AktCYQJjQmECM0JhAAACgQJjQmEAEAKDAktCYQI7QmECW0JjAktCYQPz/n0CW0JjAAACgQI7QmED//5/AktCYQJLQmMCR0JjAAACgQJLQmMCR0JjAktCYQAAAoMAAAKBAktCYwJLQmMCS0JhAAACgwJLQmECS0JhAAACgwJLQmMAAAKBAktCYwJLQmECO0JjAktCYwAQAoMCS0JhAAACgwJLQmMCO0JjAAACgwJbQmMCS0JhAktCYwAAAoMCX0JhAktCYQPv/n8AAAKBAktCYwJLQmMCS0JhAktCYwAAAoMAFAKBAktCYQI3QmMCS0JhAktCYwAAAoECT0JjAAACgwJDQmECS0JhAAACgwJLQmECT0JjAktCYwP7/n0D6/59AktCYQJjQmECS0JhAktCYwAAAoEAAAKBAktCYwJLQmECM0JhAktCYQAYAoECT0JjAAACgwJDQmED8/5/AktCYwJbQmMCO0JjAAACgwJbQmMABAKDAktCYwJDQmECW0JjAktCYQPz/n0ABAKDAktCYwJDQmECT0JjAktCYwP7/n0AEAKDAktCYQI7QmED//5/AktCYQJLQmMCO0JjAktCYwAQAoMD8/5/AktCYwJbQmMCR0JjAktCYQAAAoMAFAKBAktCYQI3QmMCM0JhAAACgQJjQmED6/59AktCYQJjQmECX0JhAAACgQI3QmMCR0JjAAACgQJLQmMCX0JhAktCYQPv/n8CR0JjAktCYQAAAoMCX0JhAAACgQI3QmMCM0JhAAACgQJjQmECW0JjAktCYQPz/n0CM0JhAktCYQAYAoECW0JjAAACgQI7QmEAEAKDAktCYQI7QmECR0JjAAACgQJLQmMD//5/AktCYQJLQmMCW0JjAAACgQI7QmECW0JjAAACgQI7QmEB1B4pAAACgQIAHikB+B4rAAACgQHYHikCM0JhAAACgQJjQmEAFAKBAeweKQHYHisAK4pRABs6BwAXOgcAAAKBAeweKwHoHisAP4pRABs6BQAHOgcAFAKBAeweKQHYHisAF4pRABs6BQAvOgUAP4pRABs6BQAHOgcD7/59AeweKQIAHikAFzoFABs6BwArilEB8B4rAeweKwP7/n0B6B4pAeweKwAAAoEAHzoHABs6BwAjilEB1B4pAAACgQIAHikAKzoFACuKUQAHOgcAAzoFACuKUQAvOgUB/B4pAAACgQHYHisAEAKDAeweKQHYHikAJ4pTABs6BQAbOgcAO4pTABs6BQALOgUD//5/AeweKQHwHisB6B4rAAACgQHwHisCR0JjAAACgQJLQmMAAAKBAeweKwHoHisAAAKBAktCYwJLQmEAAAKBAktCYwJLQmMAAAKBAeweKwHwHikCR0JjAktCYQAAAoMB3B4rAeweKwAQAoMCO0JjAktCYwAQAoMB6B4rAeweKQAAAoMAAAKBAeweKwHwHikD6/59AktCYQJjQmEAAAKBAktCYwJLQmED7/59AeweKQIAHikAEAKDAktCYQI7QmED//5/AeweKQHwHisAEAKDAeweKQHYHikD//5/AktCYQJLQmMB7B4pAAACgwHoHisCS0JhAAACgwJLQmMB/B4pAAACgQHYHisCX0JhAAACgQI3QmMCM0JhAktCYQAYAoEB6B4pAeweKwAAAoECS0JhAktCYwAAAoEB1B4pAeweKQAUAoEB3B4rAAACgwH4HisCO0JjAAACgwJbQmMAFAKBAktCYQI3QmMD7/59AeweKQIAHikAFAKBAeweKQHYHisD6/59AktCYQJjQmEABAKDAeweKwHgHikD8/5/AktCYwJbQmMABAKDAktCYwJDQmED8/5/AeweKwIAHisB3B4rAeweKwAQAoMCS0JhAktCYwAAAoMCO0JjAktCYwAQAoMB7B4pAeweKwAAAoMCR0JjAktCYQAAAoMB/B4pAeweKQPv/n8B6B4rAeweKQAAAoMCX0JhAktCYQPv/n8B7B4pAeweKwAAAoMCX0JhAktCYQPv/n8CS0JhAktCYwAAAoMB/B4pAeweKQPv/n8B8B4rAeweKwP7/n0CW0JjAktCYQPz/n0CT0JjAktCYwP7/n0B/B4rAeweKQPz/n0AFAKBAktCYQI3QmMAAAKBAeweKwHoHisAAAKBAktCYwJLQmMAFAKBAeweKQHYHisAFzoHABs6BQArilMAGzoFABs6BwArilMACzoHABs6BwA7ilMAKzoFABs6BQAXilMAGzoFACuKUwAbOgcAHzoHACuKUwATOgUACzoHACuKUwArOgcAGzoFACuKUwAbOgUAO4pTABs6BQALOgUAG4pTABs6BwArOgcAL4pTABs6BwATOgUAJ4pTABs6BQAbOgcAJzoHACuKUQAHOgUAKzoFACuKUQAHOgcAFzoHACuKUQAfOgcAAzoFACuKUQAvOgUAAzoFABs6BQA/ilEAHzoHABs6BwAjilEAFzoFABs6BwArilEAKzoHABs6BQAbilEAP4pRABs6BQAHOgcAK4pRABs6BwAfOgUAK4pRABs6BwAXOgcAF4pRABs6BQAvOgUAGzoFABs6BwArilMB/B4pAeweKQPv/n8B7B4pAeweKwAAAoMAKzoFABs6BQAXilMACzoHACuKUwArOgcB8B4rAAACgwHoHikB3B4rAAACgwH4HisAHzoHACuKUwATOgUB/B4pAAACgQHYHisAFzoHACuKUQAfOgcAKzoFACuKUQAHOgcB6B4rAAACgQHwHisB3B4rAeweKwAQAoMAGzoFABs6BwArilMB7B4pAeweKwAAAoMACzoHABs6BwA7ilMAHzoHABs6BwAjilEB/B4rAeweKQPz/n0B8B4rAeweKwP7/n0AKzoHABs6BQAbilEAL4pTABs6BwATOgUD8/5/AeweKwIAHisABAKDAeweKwHgHikAG4pTABs6BwArOgcB+B4rAAACgQHYHikAAzoFACuKUQAvOgUAJzoHACuKUQAHOgUB1B4pAAACgQIAHikB7B4pAAACgwHoHisACzoHACuKUwArOgcB3B4rA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spSqQO4jWUB2cgjATmuVQGKvW0BS1fu/TmuVQCXuS0DRIh/ATmuVQO1uQUB4aCPATmuVQMRCW0DcPQnATmuVQGKvW0BS1fu/TmuVQO1uQUB4aCPATmuVQGlpHUB6f9y/spSqQEQcQ0BQAyHAspSqQMwSWkDmNwDAspSqQK9WJUA4Zue/otqoQCXuS0DQIh/AspSqQO4jWUB2cgjAspSqQFh1SkBHah3AotqoQMRCW0DcPQnAotqoQMRCW0DcPQnAspSqQMwSWkDmNwDAspSqQO4jWUB2cgjAotqoQGKvW0BR1fu/otqoQCXuS0DQIh/AspSqQEQcQ0BQAyHAotqoQO5uQUB3aCPAspSqQFh1SkBHah3AotqoQO5uQUB3aCPAspSqQK9WJUA4Zue/otqoQGppHUB5f9y/spSqQEQcQ0BQAyHAspSqQK9WJUA4Zue/otqoQGKvW0BR1fu/otqoQGppHUB5f9y/spSqQMwSWkDmNwDATmuVQMRCW0DcPQnAotqoQCXuS0DQIh/ATmuVQCXuS0DRIh/AotqoQMRCW0DcPQnA/ihfMQ7Sfz/fWBm9/ihfMQ7Sfz/fWBm9/ihfMQ7Sfz/fWBm9/ihfMQ7Sfz/fWBm9Kb+bNOQAwT5iHW2/Kb+bNOQAwT5iHW2/Kb+bNOQAwT5iHW2/Kb+bNOQAwT5iHW2/b0gDNX3tU78fmw+/b0gDNX3tU78fmw+/b0gDNX3tU78fmw+/b0gDNX3tU78fmw+/AnB5tNjYeT5VQ3g/AnB5tNjYeT5VQ3g/AnB5tNjYeT5VQ3g/AnB5tNjYeT5VQ3g/AACAPwAAAIAAAAAAAACAPwAAAIAAAAAAAACAPwAAAIAAAAAAAACAPwAAAIAAAAAA//9/vwAAAAAAAACA//9/vwAAAAAAAACA//9/vwAAAAAAAACA//9/vwAAAAAAAACAAACAvwAAAAAAAACAAACAvwAAAAAAAACAAACAvwAAAAAAAACA//9/PwAAAAAAAAAA//9/PwAAAAAAAAAA//9/PwAAAAAAAAAAIzcJPw4JMT827Pe+IzcJPw4JMT827Pe+IzcJPw4JMT827Pe+IzcJPw4JMT827Pe+uJvtPgg4Yj8jQXu9uJvtPgg4Yj8jQXu9uJvtPgg4Yj8jQXu9uJvtPgg4Yj8jQXu9P+jwPk5Ntj4zr06/P+jwPk5Ntj4zr06/P+jwPk5Ntj4zr06/P+jwPk5Ntj4zr06/v1UsP59nHb89VtK+v1UsP59nHb89VtK+v1UsP59nHb89VtK+v1UsP59nHb89VtK+1EwoP8KrNz5iWzs/1EwoP8KrNz5iWzs/1EwoP8KrNz5iWzs/1EwoP8KrNz5iWzs/4sjcM/+zUT/W1RK/4sjcM/+zUT/W1RK/4sjcM/+zUT/W1RK/4sjcM/+zUT/W1RK/" + } + ], + "materials" : [ + { + "name" : "BaseMaterial", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.3401939868927002, + 0.6781029105186462, + 1.0, + 1.0 + ], + "roughnessFactor" : 0.5 + } + }, + { + "name" : "MatX1", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatX2", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.0, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatY1", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.0, + 0.800000011920929, + 0.0, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatY2", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.0, + 0.800000011920929, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatZ1", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.0, + 0.0, + 0.800000011920929, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatZ2", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.800000011920929, + 0.0, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + } + ], + "meshes" : [ + { + "name" : "TargetMeshZ1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 2, + "POSITION" : 1 + }, + "indices" : 0, + "material" : 5 + } + ] + }, + { + "name" : "ArrowMeshZ1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 5, + "POSITION" : 4 + }, + "indices" : 3, + "material" : 5 + } + ] + }, + { + "name" : "ArrowMeshY2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 8, + "POSITION" : 7 + }, + "indices" : 6, + "material" : 4 + } + ] + }, + { + "name" : "ArrowMeshY1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 11, + "POSITION" : 10 + }, + "indices" : 9, + "material" : 3 + } + ] + }, + { + "name" : "BaseCubeMesh", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 14, + "POSITION" : 13 + }, + "indices" : 12, + "material" : 0 + } + ] + }, + { + "name" : "TargetMeshY2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 17, + "POSITION" : 16 + }, + "indices" : 15, + "material" : 4 + } + ] + }, + { + "name" : "ArrowMeshX1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 20, + "POSITION" : 19 + }, + "indices" : 18, + "material" : 1 + } + ] + }, + { + "name" : "TargetMeshX2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 23, + "POSITION" : 22 + }, + "indices" : 21, + "material" : 2 + } + ] + }, + { + "name" : "ArrowMeshX2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 26, + "POSITION" : 25 + }, + "indices" : 24, + "material" : 2 + } + ] + }, + { + "name" : "TargetMeshY1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 29, + "POSITION" : 28 + }, + "indices" : 27, + "material" : 3 + } + ] + }, + { + "name" : "TargetMeshZ2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 32, + "POSITION" : 31 + }, + "indices" : 30, + "material" : 6 + } + ] + }, + { + "name" : "ArrowMeshZ2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 35, + "POSITION" : 34 + }, + "indices" : 33, + "material" : 6 + } + ] + }, + { + "name" : "TargetMeshX1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 38, + "POSITION" : 37 + }, + "indices" : 36, + "material" : 1 + } + ] + } + ], + "nodes" : [ + { + "mesh" : 6, + "name" : "ArrowX1", + "rotation" : [ + -0.30070576071739197, + 0.0, + -0.0, + 0.9537169933319092 + ], + "scale" : [ + 1.0, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + 5.0, + 0.0, + -0.0 + ] + }, + { + "mesh" : 8, + "name" : "ArrowX2", + "matrix": [ + 1.0000000221841605, + 0, + 0, + 0, + 0, + 0.9961947216654676, + 0.08715572783347625, + 0, + 0, + -0.08715572783347625, + 0.9961947216654676, + 0, + -5.0, + 0, + 0, + 1 + ] + }, + { + "mesh" : 3, + "name" : "ArrowY1", + "rotation" : [ + 0.0, + -0.5735764503479004, + -0.0, + 0.8191520571708679 + ], + "translation" : [ + 0.0, + 5.0, + -0.0 + ] + }, + { + "mesh" : 2, + "name" : "ArrowY2", + "matrix": [ + 0.9781476413655263, + 0, + 0.20791169731909154, + 0, + 0, + 1.000000041095523, + 0, + 0, + -0.20791169731909154, + 0, + 0.9781476413655263, + 0, + 0, + -5, + 0, + 1 + ] + }, + { + "mesh" : 1, + "name" : "ArrowZ1", + "rotation" : [ + 0.0, + 0.0, + 0.13052621483802795, + 0.9914449453353882 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 1.0 + ], + "translation" : [ + 0.0, + 0.0, + 5.0 + ] + }, + { + "mesh" : 11, + "name" : "ArrowZ2", + "matrix": [ + 0.9563047863767122, + -0.2923716890963366, + 0, + 0, + 0.2923716890963366, + 0.9563047863767122, + 0, + 0, + 0, + 0, + 1.0000000245160268, + 0, + 0, + 0, + -5, + 1 + ] + }, + { + "mesh" : 4, + "name" : "BaseCube" + }, + { + "mesh" : 12, + "name" : "TargetX1" + }, + { + "mesh" : 7, + "name" : "TargetX2" + }, + { + "mesh" : 9, + "name" : "TargetY1" + }, + { + "mesh" : 5, + "name" : "TargetY2" + }, + { + "mesh" : 0, + "name" : "TargetZ1" + }, + { + "mesh" : 10, + "name" : "TargetZ2" + } + ], + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 5, + 12, + 10, + 3, + 1, + 8, + 11, + 4, + 7, + 0, + 9, + 2, + 6 + ] + } + ] +} diff --git a/test/testfiles/gltf/OrientationTest/glTF/OrientationTest.bin b/test/testfiles/gltf/OrientationTest/glTF/OrientationTest.bin new file mode 100644 index 0000000000000000000000000000000000000000..efeb71225279d6866a466abe9bcbb7cbb7e6806e GIT binary patch literal 27168 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/OrientationTest/glTF/OrientationTest.gltf b/test/testfiles/gltf/OrientationTest/glTF/OrientationTest.gltf new file mode 100644 index 0000000..29fb9e9 --- /dev/null +++ b/test/testfiles/gltf/OrientationTest/glTF/OrientationTest.gltf @@ -0,0 +1,1258 @@ +{ + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5121, + "count" : 78, + "max" : [ + 51 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 52, + "max" : [ + -0.6740907430648804, + 3.9529545307159424, + 5.33065128326416 + ], + "min" : [ + -1.3648574352264404, + 2.9005930423736572, + 4.66934871673584 + ], + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 52, + "max" : [ + 0.994742751121521, + 0.9659255146980286, + 1.0 + ], + "min" : [ + -0.8102691173553467, + -0.5860580801963806, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 3, + "componentType" : 5121, + "count" : 114, + "max" : [ + 73 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 4, + "componentType" : 5126, + "count" : 74, + "max" : [ + 0.7157971262931824, + 3.0, + 0.33065110445022583 + ], + "min" : [ + -0.7157971262931824, + -1.0, + -0.33065110445022583 + ], + "type" : "VEC3" + }, + { + "bufferView" : 5, + "componentType" : 5126, + "count" : 74, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 6, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 7, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.7157971262931824, + 0.33065134286880493, + 3.0 + ], + "min" : [ + -0.7157971262931824, + -0.3306511640548706, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 8, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 1.0, + 0.374779611825943 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 9, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 10, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.7157971262931824, + 0.33065131306648254, + 1.0 + ], + "min" : [ + -0.7157971262931824, + -0.330651193857193, + -3.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 11, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 1.0, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -0.374779611825943 + ], + "type" : "VEC3" + }, + { + "bufferView" : 12, + "componentType" : 5123, + "count" : 420, + "max" : [ + 271 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 13, + "componentType" : 5126, + "count" : 272, + "max" : [ + 5.000002384185791, + 5.0, + 5.000002861022949 + ], + "min" : [ + -5.000001907348633, + -5.0, + -5.000001907348633 + ], + "type" : "VEC3" + }, + { + "bufferView" : 14, + "componentType" : 5126, + "count" : 272, + "max" : [ + 1.0, + 1.0, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 15, + "componentType" : 5121, + "count" : 78, + "max" : [ + 49 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 16, + "componentType" : 5126, + "count" : 50, + "max" : [ + -0.46912679076194763, + -4.66934871673584, + 3.9916374683380127 + ], + "min" : [ + -1.1686336994171143, + -5.330650806427002, + 2.93727445602417 + ], + "type" : "VEC3" + }, + { + "bufferView" : 17, + "componentType" : 5126, + "count" : 50, + "max" : [ + 0.9880198836326599, + 1.0, + 0.9781473875045776 + ], + "min" : [ + -0.8398305773735046, + -1.0, + -0.542848527431488 + ], + "type" : "VEC3" + }, + { + "bufferView" : 18, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 19, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.3306511640548706, + 3.0, + 0.7157971262931824 + ], + "min" : [ + -0.3306511640548706, + -1.0, + -0.7157971262931824 + ], + "type" : "VEC3" + }, + { + "bufferView" : 20, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 21, + "componentType" : 5121, + "count" : 78, + "max" : [ + 53 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 22, + "componentType" : 5126, + "count" : 54, + "max" : [ + -4.66934871673584, + 4.039160251617432, + 0.6999828815460205 + ], + "min" : [ + -5.33065128326416, + 2.991360902786255, + -0.012430161237716675 + ], + "type" : "VEC3" + }, + { + "bufferView" : 23, + "componentType" : 5126, + "count" : 54, + "max" : [ + 1.0, + 0.9961948394775391, + 0.8997273445129395 + ], + "min" : [ + -1.0, + -0.4364525079727173, + -0.9618476033210754 + ], + "type" : "VEC3" + }, + { + "bufferView" : 24, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 25, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.3306511640548706, + 3.0, + 0.7157971262931824 + ], + "min" : [ + -0.3306511640548706, + -1.0, + -0.7157971262931824 + ], + "type" : "VEC3" + }, + { + "bufferView" : 26, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 27, + "componentType" : 5121, + "count" : 78, + "max" : [ + 51 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 28, + "componentType" : 5126, + "count" : 52, + "max" : [ + 3.864471435546875, + 5.33065128326416, + -1.0113166570663452 + ], + "min" : [ + 2.8218495845794678, + 4.669349193572998, + -1.6833229064941406 + ], + "type" : "VEC3" + }, + { + "bufferView" : 29, + "componentType" : 5126, + "count" : 52, + "max" : [ + 0.9749377965927124, + 1.0, + 0.9998826384544373 + ], + "min" : [ + -0.654447615146637, + -1.0, + -0.7971041202545166 + ], + "type" : "VEC3" + }, + { + "bufferView" : 30, + "componentType" : 5121, + "count" : 78, + "max" : [ + 49 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 31, + "componentType" : 5126, + "count" : 50, + "max" : [ + 1.4936277866363525, + 3.9211390018463135, + -4.66934871673584 + ], + "min" : [ + 0.8097413778305054, + 2.8717148303985596, + -5.33065128326416 + ], + "type" : "VEC3" + }, + { + "bufferView" : 32, + "componentType" : 5126, + "count" : 50, + "max" : [ + 0.7893224954605103, + 0.9619584083557129, + 1.0 + ], + "min" : [ + -0.9977105855941772, + -0.6139788627624512, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 33, + "componentType" : 5121, + "count" : 114, + "max" : [ + 77 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 34, + "componentType" : 5126, + "count" : 78, + "max" : [ + 0.7157971858978271, + 3.0, + 0.3306512236595154 + ], + "min" : [ + -0.7157971858978271, + -1.0, + -0.330651193857193 + ], + "type" : "VEC3" + }, + { + "bufferView" : 35, + "componentType" : 5126, + "count" : 78, + "max" : [ + 1.0, + 0.374779611825943, + 1.0 + ], + "min" : [ + -1.0, + -1.0, + -1.0 + ], + "type" : "VEC3" + }, + { + "bufferView" : 36, + "componentType" : 5121, + "count" : 78, + "max" : [ + 53 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 37, + "componentType" : 5126, + "count" : 54, + "max" : [ + 5.33065128326416, + 3.432579517364502, + -1.7226401567459106 + ], + "min" : [ + 4.66934871673584, + 2.4595587253570557, + -2.553251266479492 + ], + "type" : "VEC3" + }, + { + "bufferView" : 38, + "componentType" : 5126, + "count" : 54, + "max" : [ + 1.0, + 0.9992989301681519, + 0.9697774052619934 + ], + "min" : [ + -1.0, + -0.8278425335884094, + -0.9262295961380005 + ], + "type" : "VEC3" + } + ], + "asset" : { + "copyright" : "Copyright 2018 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey.", + "generator" : "Khronos Blender glTF 2.0 exporter, but with 3 quaternions manually converted to rotation matricies", + "version" : "2.0" + }, + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 0, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 80, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 704, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 1328, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 888, + "byteOffset" : 1444, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 888, + "byteOffset" : 2332, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 3220, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 3336, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 4272, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 5208, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 5324, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 6260, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 840, + "byteOffset" : 7196, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 3264, + "byteOffset" : 8036, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 3264, + "byteOffset" : 11300, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 14564, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 14644, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 15244, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 15844, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 15960, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 16896, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 17832, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 17912, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 18560, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 19208, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 19324, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 20260, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 21196, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 21276, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 624, + "byteOffset" : 21900, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 22524, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 22604, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 600, + "byteOffset" : 23204, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 114, + "byteOffset" : 23804, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 23920, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 936, + "byteOffset" : 24856, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 78, + "byteOffset" : 25792, + "target" : 34963 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 25872, + "target" : 34962 + }, + { + "buffer" : 0, + "byteLength" : 648, + "byteOffset" : 26520, + "target" : 34962 + } + ], + "buffers" : [ + { + "byteLength" : 27168, + "uri" : "OrientationTest.bin" + } + ], + "materials" : [ + { + "name" : "BaseMaterial", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.3401939868927002, + 0.6781029105186462, + 1.0, + 1.0 + ], + "roughnessFactor" : 0.5 + } + }, + { + "name" : "MatX1", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatX2", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.0, + 0.800000011920929, + 0.800000011920929, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatY1", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.0, + 0.800000011920929, + 0.0, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatY2", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.0, + 0.800000011920929, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatZ1", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.0, + 0.0, + 0.800000011920929, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + }, + { + "name" : "MatZ2", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.800000011920929, + 0.0, + 1.0 + ], + "metallicFactor" : 0.4000000059604645, + "roughnessFactor" : 0.20000000298023224 + } + } + ], + "meshes" : [ + { + "name" : "TargetMeshZ1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 2, + "POSITION" : 1 + }, + "indices" : 0, + "material" : 5 + } + ] + }, + { + "name" : "ArrowMeshZ1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 5, + "POSITION" : 4 + }, + "indices" : 3, + "material" : 5 + } + ] + }, + { + "name" : "ArrowMeshY2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 8, + "POSITION" : 7 + }, + "indices" : 6, + "material" : 4 + } + ] + }, + { + "name" : "ArrowMeshY1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 11, + "POSITION" : 10 + }, + "indices" : 9, + "material" : 3 + } + ] + }, + { + "name" : "BaseCubeMesh", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 14, + "POSITION" : 13 + }, + "indices" : 12, + "material" : 0 + } + ] + }, + { + "name" : "TargetMeshY2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 17, + "POSITION" : 16 + }, + "indices" : 15, + "material" : 4 + } + ] + }, + { + "name" : "ArrowMeshX1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 20, + "POSITION" : 19 + }, + "indices" : 18, + "material" : 1 + } + ] + }, + { + "name" : "TargetMeshX2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 23, + "POSITION" : 22 + }, + "indices" : 21, + "material" : 2 + } + ] + }, + { + "name" : "ArrowMeshX2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 26, + "POSITION" : 25 + }, + "indices" : 24, + "material" : 2 + } + ] + }, + { + "name" : "TargetMeshY1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 29, + "POSITION" : 28 + }, + "indices" : 27, + "material" : 3 + } + ] + }, + { + "name" : "TargetMeshZ2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 32, + "POSITION" : 31 + }, + "indices" : 30, + "material" : 6 + } + ] + }, + { + "name" : "ArrowMeshZ2", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 35, + "POSITION" : 34 + }, + "indices" : 33, + "material" : 6 + } + ] + }, + { + "name" : "TargetMeshX1", + "primitives" : [ + { + "attributes" : { + "NORMAL" : 38, + "POSITION" : 37 + }, + "indices" : 36, + "material" : 1 + } + ] + } + ], + "nodes" : [ + { + "mesh" : 6, + "name" : "ArrowX1", + "rotation" : [ + -0.30070576071739197, + 0.0, + -0.0, + 0.9537169933319092 + ], + "scale" : [ + 1.0, + 0.9999999403953552, + 0.9999999403953552 + ], + "translation" : [ + 5.0, + 0.0, + -0.0 + ] + }, + { + "mesh" : 8, + "name" : "ArrowX2", + "matrix": [ + 1.0000000221841605, + 0, + 0, + 0, + 0, + 0.9961947216654676, + 0.08715572783347625, + 0, + 0, + -0.08715572783347625, + 0.9961947216654676, + 0, + -5.0, + 0, + 0, + 1 + ] + }, + { + "mesh" : 3, + "name" : "ArrowY1", + "rotation" : [ + 0.0, + -0.5735764503479004, + -0.0, + 0.8191520571708679 + ], + "translation" : [ + 0.0, + 5.0, + -0.0 + ] + }, + { + "mesh" : 2, + "name" : "ArrowY2", + "matrix": [ + 0.9781476413655263, + 0, + 0.20791169731909154, + 0, + 0, + 1.000000041095523, + 0, + 0, + -0.20791169731909154, + 0, + 0.9781476413655263, + 0, + 0, + -5, + 0, + 1 + ] + }, + { + "mesh" : 1, + "name" : "ArrowZ1", + "rotation" : [ + 0.0, + 0.0, + 0.13052621483802795, + 0.9914449453353882 + ], + "scale" : [ + 0.9999999403953552, + 0.9999999403953552, + 1.0 + ], + "translation" : [ + 0.0, + 0.0, + 5.0 + ] + }, + { + "mesh" : 11, + "name" : "ArrowZ2", + "matrix": [ + 0.9563047863767122, + -0.2923716890963366, + 0, + 0, + 0.2923716890963366, + 0.9563047863767122, + 0, + 0, + 0, + 0, + 1.0000000245160268, + 0, + 0, + 0, + -5, + 1 + ] + }, + { + "mesh" : 4, + "name" : "BaseCube" + }, + { + "mesh" : 12, + "name" : "TargetX1" + }, + { + "mesh" : 7, + "name" : "TargetX2" + }, + { + "mesh" : 9, + "name" : "TargetY1" + }, + { + "mesh" : 5, + "name" : "TargetY2" + }, + { + "mesh" : 0, + "name" : "TargetZ1" + }, + { + "mesh" : 10, + "name" : "TargetZ2" + } + ], + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 5, + 12, + 10, + 3, + 1, + 8, + 11, + 4, + 7, + 0, + 9, + 2, + 6 + ] + } + ] +} diff --git a/test/testfiles/gltf/OrientationTest/screenshot/OrientationTestFail.png b/test/testfiles/gltf/OrientationTest/screenshot/OrientationTestFail.png new file mode 100644 index 0000000000000000000000000000000000000000..14c3de278fb2742519ddf2d432f09167900bc2c8 GIT binary patch literal 58520 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/OrientationTest/screenshot/screenshot.png b/test/testfiles/gltf/OrientationTest/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a90b620213bf105b5932c1b850f2370b479e831e GIT binary patch literal 44099 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

PA<_$>l1|z53o!5cuomoP1wqQnEoMSO?=a%!i1? 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 T@j|V#00000NkvXXu0mjf3VAy& literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/SimpleMeshes/README.md b/test/testfiles/gltf/SimpleMeshes/README.md new file mode 100644 index 0000000..e74490b --- /dev/null +++ b/test/testfiles/gltf/SimpleMeshes/README.md @@ -0,0 +1,25 @@ +# SimpleMeshes + +This is an example showing how the same mesh may be appended to +several nodes, to be rendered multiple times. It also shows +how additional vertex attributes are defined in a `mesh.primitive` - +namely, attributes for the vertex normals. + +**Note:** The additional vertex normal attribute in this example is +not yet used by any technique. This may cause a warning to be +printed during the validation. The normal attribute will be used in +the [AdvancedMaterial](../AdvancedMaterial) example. + +## Screenshot + +![screenshot](screenshot/screenshot.png) + +## License Information + +Public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)) + +## Data layout + +The following image shows the data layout of this sample: + +![triangle](screenshot/triangle.png) diff --git a/test/testfiles/gltf/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf b/test/testfiles/gltf/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf new file mode 100644 index 0000000..cedd751 --- /dev/null +++ b/test/testfiles/gltf/SimpleMeshes/glTF-Embedded/SimpleMeshes.gltf @@ -0,0 +1,85 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0, 1] + } + ], + "nodes" : [ + { + "mesh" : 0 + }, + { + "mesh" : 0, + "translation" : [ 1.0, 0.0, 0.0 ] + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 1, + "NORMAL" : 2 + }, + "indices" : 0 + } ] + } + ], + + "buffers" : [ + { + "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8=", + "byteLength" : 80 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 6, + "target" : 34963 + }, + { + "buffer" : 0, + "byteOffset" : 8, + "byteLength" : 72, + "byteStride" : 12, + "target" : 34962 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 3, + "type" : "SCALAR", + "max" : [ 2 ], + "min" : [ 0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 36, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 0.0, 0.0, 1.0 ], + "min" : [ 0.0, 0.0, 1.0 ] + } + ], + + "asset" : { + "version" : "2.0" + } +} + diff --git a/test/testfiles/gltf/SimpleMeshes/glTF/SimpleMeshes.gltf b/test/testfiles/gltf/SimpleMeshes/glTF/SimpleMeshes.gltf new file mode 100644 index 0000000..0737634 --- /dev/null +++ b/test/testfiles/gltf/SimpleMeshes/glTF/SimpleMeshes.gltf @@ -0,0 +1,84 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0, 1] + } + ], + "nodes" : [ + { + "mesh" : 0 + }, + { + "mesh" : 0, + "translation" : [ 1.0, 0.0, 0.0 ] + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 1, + "NORMAL" : 2 + }, + "indices" : 0 + } ] + } + ], + + "buffers" : [ + { + "uri" : "triangle.bin", + "byteLength" : 80 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 6, + "target" : 34963 + }, + { + "buffer" : 0, + "byteOffset" : 8, + "byteLength" : 72, + "byteStride" : 12, + "target" : 34962 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 3, + "type" : "SCALAR", + "max" : [ 2 ], + "min" : [ 0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 36, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 0.0, 0.0, 1.0 ], + "min" : [ 0.0, 0.0, 1.0 ] + } + ], + + "asset" : { + "version" : "2.0" + } +} diff --git a/test/testfiles/gltf/SimpleMeshes/glTF/triangle.bin b/test/testfiles/gltf/SimpleMeshes/glTF/triangle.bin new file mode 100644 index 0000000000000000000000000000000000000000..291b43caea0a598bbf06420e6759b4dbc5ba9e5b GIT binary patch literal 80 YcmZQzU}RuoKnD%>s3Q3I$Z`$#0BP+5zW@LL literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/SimpleMeshes/screenshot/screenshot.png b/test/testfiles/gltf/SimpleMeshes/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..650bf8073992feccecf8466413d6c5a4c8b5f597 GIT binary patch literal 775 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

l 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 MboFyt=akR{0HL_omjD0& literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/SimpleSparseAccessor/README.md b/test/testfiles/gltf/SimpleSparseAccessor/README.md new file mode 100644 index 0000000..ed75c40 --- /dev/null +++ b/test/testfiles/gltf/SimpleSparseAccessor/README.md @@ -0,0 +1,22 @@ +# SimpleSparseAccessor + +## Screenshot + +![screenshot](screenshot/screenshot.png) + +## Data layout + +The following image shows the data layout of this sample: + +![simpleSparseAccessorStructure](screenshot/simpleSparseAccessorStructure.png) + +## Geometry + +The following image shows the substitution of the values that takes place for the sparse accessor: + +![SimpleSparseAccessorDescription](screenshot/SimpleSparseAccessorDescription.png) + +## License Information + +Public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)) + diff --git a/test/testfiles/gltf/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf b/test/testfiles/gltf/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf new file mode 100644 index 0000000..ca69e2f --- /dev/null +++ b/test/testfiles/gltf/SimpleSparseAccessor/glTF-Embedded/SimpleSparseAccessor.gltf @@ -0,0 +1,77 @@ +{ + "scene" : 0, + "scenes" : [ { + "nodes" : [ 0 ] + } ], + + "nodes" : [ { + "mesh" : 0 + } ], + + "meshes" : [ { + "primitives" : [ { + "attributes" : { + "POSITION" : 1 + }, + "indices" : 0 + } ] + } ], + + "buffers" : [ { + "uri" : "data:application/gltf-buffer;base64,AAAIAAcAAAABAAgAAQAJAAgAAQACAAkAAgAKAAkAAgADAAoAAwALAAoAAwAEAAsABAAMAAsABAAFAAwABQANAAwABQAGAA0AAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAQAAAAAAAAAAAAABAQAAAAAAAAAAAAACAQAAAAAAAAAAAAACgQAAAAAAAAAAAAADAQAAAAAAAAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAAAAQAAAgD8AAAAAAABAQAAAgD8AAAAAAACAQAAAgD8AAAAAAACgQAAAgD8AAAAAAADAQAAAgD8AAAAACAAKAAwAAAAAAIA/AAAAQAAAAAAAAEBAAABAQAAAAAAAAKBAAACAQAAAAAA=", + "byteLength" : 284 + } ], + + "bufferViews" : [ { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 72, + "target" : 34963 + }, { + "buffer" : 0, + "byteOffset" : 72, + "byteLength" : 168 + }, { + "buffer" : 0, + "byteOffset" : 240, + "byteLength" : 6 + }, { + "buffer" : 0, + "byteOffset" : 248, + "byteLength" : 36 + } ], + + "accessors" : [ { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 36, + "type" : "SCALAR", + "max" : [ 13 ], + "min" : [ 0 ] + }, { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 14, + "type" : "VEC3", + "max" : [ 6.0, 4.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ], + "sparse" : { + "count" : 3, + "indices" : { + "bufferView" : 2, + "byteOffset" : 0, + "componentType" : 5123 + }, + "values" : { + "bufferView" : 3, + "byteOffset" : 0 + } + } + } ], + + "asset" : { + "version" : "2.0" + } +} \ No newline at end of file diff --git a/test/testfiles/gltf/SimpleSparseAccessor/glTF/SimpleSparseAccessor.bin b/test/testfiles/gltf/SimpleSparseAccessor/glTF/SimpleSparseAccessor.bin new file mode 100644 index 0000000000000000000000000000000000000000..99eaf3351002c9614375e98d2c07dcead161cb25 GIT binary patch literal 284 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

1jt51X> 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 a`BVCU;y*$rTtGo*(o{RNH*?SNEB^=G2`;h# literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/SimpleSparseAccessor/screenshot/screenshot.png b/test/testfiles/gltf/SimpleSparseAccessor/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..76cbc3eced8d29e8c4290fc93fcd3ab615e9c710 GIT binary patch literal 7103 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/SimpleSparseAccessor/screenshot/simpleSparseAccessorStructure.png b/test/testfiles/gltf/SimpleSparseAccessor/screenshot/simpleSparseAccessorStructure.png new file mode 100644 index 0000000000000000000000000000000000000000..e44ac0d56aab939897252884994bbcebeb69cb38 GIT binary patch literal 107522 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

r*KOEa_!9IqooYs7e;lH8BIbSeT(H9 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Triangle/screenshot/screenshot.png b/test/testfiles/gltf/Triangle/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0c825f3ebfa8c02fc82e3efde517992a5ef32308 GIT binary patch literal 836 zcmZ9LTTBx{6ozNlA}sGE#VOuM3lsFG0S;b(noE;VlOqcQ*yIUN-3;jmd?B5q+e{0)jOTd$rZHcL{Nd}u zr;3`vsH=Vi;MZoTDU(6XJ+00Fn}YyWAA*(^Wb649)xM1uiXPqu*lmDxc_A24x?q5Y zWq_7A>s6J>KD!RbPx8QsrnY1KDBl0-5m$n*HTQS5{qdGR=tQ)5NO; zf!Xhx;wqGG+MJT|{kgh`61xvB0%U~BM$K!Je z@#m&i7OyAe9fN(?FCV9eQo!qHj2hLE3JN7O@CC|U$xeiLw9v@nz0zA5>`gWZtDD`A zk<&dYRCoSUEJ}F#T%gRi#1P`ed^L+V**(BuYto^&yrCeBeAZZl>T(w-G_03E*pw@T w6+ecsU^p3{KnsI?qkHXJ+<$lW?=rA64AaW{IiarabKti?l8896{b**zZ)f;R3;+NC literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/Triangle/screenshot/simpleTriangle.png b/test/testfiles/gltf/Triangle/screenshot/simpleTriangle.png new file mode 100644 index 0000000000000000000000000000000000000000..98df05c1739d41c134fd337b5660c7e037155687 GIT binary patch literal 43858 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

` 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/TriangleWithoutIndices/README.md b/test/testfiles/gltf/TriangleWithoutIndices/README.md new file mode 100644 index 0000000..40b03bc --- /dev/null +++ b/test/testfiles/gltf/TriangleWithoutIndices/README.md @@ -0,0 +1,15 @@ +# TriangleWithoutIndices + +## Screenshot + +![screenshot](screenshot/screenshot.png) + +## License Information + +Public domain ([CC0](https://creativecommons.org/publicdomain/zero/1.0/)) + +## Data layout + +The following image shows the data layout of this sample: + +![triangleWithoutIndices](screenshot/triangleWithoutIndices.png) \ No newline at end of file diff --git a/test/testfiles/gltf/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf b/test/testfiles/gltf/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf new file mode 100644 index 0000000..1c0736a --- /dev/null +++ b/test/testfiles/gltf/TriangleWithoutIndices/glTF-Embedded/TriangleWithoutIndices.gltf @@ -0,0 +1,54 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0 ] + } + ], + + "nodes" : [ + { + "mesh" : 0 + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 0 + } + } ] + } + ], + + "buffers" : [ + { + "uri" : "data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAA", + "byteLength" : 36 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 36, + "target" : 34962 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + } + ], + + "asset" : { + "version" : "2.0" + } +} \ No newline at end of file diff --git a/test/testfiles/gltf/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf b/test/testfiles/gltf/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf new file mode 100644 index 0000000..b9f75cd --- /dev/null +++ b/test/testfiles/gltf/TriangleWithoutIndices/glTF/TriangleWithoutIndices.gltf @@ -0,0 +1,55 @@ +{ + "scene" : 0, + "scenes" : [ + { + "nodes" : [ 0 ] + } + ], + + "nodes" : [ + { + "mesh" : 0 + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 0 + } + } ] + } + ], + + "buffers" : [ + { + "uri" : "triangleWithoutIndices.bin", + "byteLength" : 36 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 36, + "target" : 34962 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 3, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + } + ], + + "asset" : { + "version" : "2.0" + } +} + diff --git a/test/testfiles/gltf/TriangleWithoutIndices/glTF/triangleWithoutIndices.bin b/test/testfiles/gltf/TriangleWithoutIndices/glTF/triangleWithoutIndices.bin new file mode 100644 index 0000000000000000000000000000000000000000..f9f96d8665495c0f5b6ac9e627f202de360bd8d9 GIT binary patch literal 36 ScmZQzKn4x=$UFuH2p<3xiUEHB literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/TriangleWithoutIndices/screenshot/screenshot.png b/test/testfiles/gltf/TriangleWithoutIndices/screenshot/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0c825f3ebfa8c02fc82e3efde517992a5ef32308 GIT binary patch literal 836 zcmZ9LTTBx{6ozNlA}sGE#VOuM3lsFG0S;b(noE;VlOqcQ*yIUN-3;jmd?B5q+e{0)jOTd$rZHcL{Nd}u zr;3`vsH=Vi;MZoTDU(6XJ+00Fn}YyWAA*(^Wb649)xM1uiXPqu*lmDxc_A24x?q5Y zWq_7A>s6J>KD!RbPx8QsrnY1KDBl0-5m$n*HTQS5{qdGR=tQ)5NO; zf!Xhx;wqGG+MJT|{kgh`61xvB0%U~BM$K!Je z@#m&i7OyAe9fN(?FCV9eQo!qHj2hLE3JN7O@CC|U$xeiLw9v@nz0zA5>`gWZtDD`A zk<&dYRCoSUEJ}F#T%gRi#1P`ed^L+V**(BuYto^&yrCeBeAZZl>T(w-G_03E*pw@T w6+ecsU^p3{KnsI?qkHXJ+<$lW?=rA64AaW{IiarabKti?l8896{b**zZ)f;R3;+NC literal 0 HcmV?d00001 diff --git a/test/testfiles/gltf/TriangleWithoutIndices/screenshot/triangleWithoutIndices.png b/test/testfiles/gltf/TriangleWithoutIndices/screenshot/triangleWithoutIndices.png new file mode 100644 index 0000000000000000000000000000000000000000..9851598402a120946cfca5bb99851e548c4ef485 GIT binary patch literal 25349 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 z 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 literal 0 HcmV?d00001 diff --git a/test/testfiles/obj/cube with white spaces.mtl b/test/testfiles/obj/cube with white spaces.mtl new file mode 100644 index 0000000..4532a03 --- /dev/null +++ b/test/testfiles/obj/cube with white spaces.mtl @@ -0,0 +1,25 @@ +newmtl Red Color +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 + +newmtl Green Color +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.800000 0.000000 +Ks 0.500000 0.500000 0.500000 + +newmtl Blue Color +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.000000 0.800000 +Ks 0.500000 0.500000 0.500000 + +newmtl White Color +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 + +newmtl Texture Color +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +map_Kd cube_texture.png diff --git a/test/testfiles/obj/cube with white spaces.obj b/test/testfiles/obj/cube with white spaces.obj new file mode 100644 index 0000000..13abd80 --- /dev/null +++ b/test/testfiles/obj/cube with white spaces.obj @@ -0,0 +1,38 @@ +# Cube with Materials + +mtllib cube with white spaces.mtl # comment + +g Cube Mesh + +v 0.0 0.0 0.0 +v 1.0 0.0 0.0 +v 1.0 1.0 0.0 +v 0.0 1.0 0.0 +v 0.0 0.0 1.0 +v 1.0 0.0 1.0 +v 1.0 1.0 1.0 +v 0.0 1.0 1.0 + +vn 1.0 0.0 0.0 +vn -1.0 0.0 0.0 +vn 0.0 1.0 0.0 +vn 0.0 -1.0 0.0 +vn 0.0 0.0 1.0 +vn 0.0 0.0 -1.0 + +vt 0.0 0.0 +vt 1.0 0.0 +vt 1.0 1.0 +vt 0.0 1.0 + +usemtl Red Color +f 1/1/4 2/2/4 6/3/4 5/4/4 +usemtl Green Color +f 2/1/1 3/2/1 7/3/1 6/4/1 +usemtl Blue Color +f 3/1/3 4/2/3 8/3/3 7/4/3 +usemtl Texture Color +f 4/1/2 1/2/2 5/3/2 8/4/2 +usemtl White Color +f 1/1/6 4/2/6 3/3/6 2/4/6 +f 5/1/5 6/2/5 7/3/5 8/4/5 diff --git a/test/testfiles/obj/cube_rgb.mtl b/test/testfiles/obj/cube_rgb.mtl new file mode 100644 index 0000000..189b467 --- /dev/null +++ b/test/testfiles/obj/cube_rgb.mtl @@ -0,0 +1,20 @@ +newmtl Red +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 + +newmtl Green +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.800000 0.000000 +Ks 0.500000 0.500000 0.500000 + +newmtl Blue +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.000000 0.800000 +Ks 0.500000 0.500000 0.500000 + +newmtl White +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +d 0.5 diff --git a/test/testfiles/obj/cube_rgb.obj b/test/testfiles/obj/cube_rgb.obj new file mode 100644 index 0000000..3c9f46e --- /dev/null +++ b/test/testfiles/obj/cube_rgb.obj @@ -0,0 +1,37 @@ +# Cube with RGB Colors + +mtllib cube_rgb.mtl + +g Cube + +v 0.0 0.0 0.0 +v 1.0 0.0 0.0 +v 1.0 1.0 0.0 +v 0.0 1.0 0.0 +v 0.0 0.0 1.0 +v 1.0 0.0 1.0 +v 1.0 1.0 1.0 +v 0.0 1.0 1.0 + +vn 1.0 0.0 0.0 +vn -1.0 0.0 0.0 +vn 0.0 1.0 0.0 +vn 0.0 -1.0 0.0 +vn 0.0 0.0 1.0 +vn 0.0 0.0 -1.0 + +vt 0.0 0.0 +vt 1.0 0.0 +vt 1.0 1.0 +vt 0.0 1.0 + +usemtl Red +f 1/1/4 2/2/4 6/3/4 5/4/4 +usemtl Green +f 2/1/1 3/2/1 7/3/1 6/4/1 +usemtl Blue +f 3/1/3 4/2/3 8/3/3 7/4/3 +usemtl White +f 4/1/2 1/2/2 5/3/2 8/4/2 +f 1/1/6 4/2/6 3/3/6 2/4/6 +f 5/1/5 6/2/5 7/3/5 8/4/5 diff --git a/test/testfiles/obj/cube_texture.png b/test/testfiles/obj/cube_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..29ce540d1d1d396a8702702102af79136db75d6e GIT binary patch literal 56249 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 I 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 E7uL@`L;wH) literal 0 HcmV?d00001 diff --git a/test/testfiles/stl/single_triangle.stl b/test/testfiles/stl/single_triangle.stl new file mode 100644 index 0000000..9aec65c --- /dev/null +++ b/test/testfiles/stl/single_triangle.stl @@ -0,0 +1,9 @@ +solid MeshName +facet normal 0.0 0.0 1.0 + outer loop + vertex 0.0 0.0 0.0 + vertex 1.0 0.0 0.0 + vertex 1.0 1.0 0.0 + endloop +endfacet +endsolid MeshName diff --git a/test/testfiles/stl/single_triangle_no_normal.stl b/test/testfiles/stl/single_triangle_no_normal.stl new file mode 100644 index 0000000..0164b69 --- /dev/null +++ b/test/testfiles/stl/single_triangle_no_normal.stl @@ -0,0 +1,9 @@ +solid MeshName +facet + outer loop + vertex 0.0 0.0 0.0 + vertex 1.0 0.0 0.0 + vertex 1.0 1.0 0.0 + endloop +endfacet +endsolid MeshName diff --git a/test/testfiles/stl/single_triangle_with_comments.stl b/test/testfiles/stl/single_triangle_with_comments.stl new file mode 100644 index 0000000..33e4c4a --- /dev/null +++ b/test/testfiles/stl/single_triangle_with_comments.stl @@ -0,0 +1,19 @@ +# comment +solid MeshName # comment + # comment + # comment + # comment +facet normal 0.0 0.0 1.0 # comment + # comment + outer loop # comment + # comment + vertex 0.0 0.0 0.0 # comment + vertex 1.0 0.0 0.0 # comment + vertex 1.0 1.0 0.0 # comment + endloop # comment + # comment +endfacet # comment + # comment +endsolid MeshName # comment + # comment + \ No newline at end of file diff --git a/test/testfiles/stl/stl_ascii.stl b/test/testfiles/stl/stl_ascii.stl new file mode 100644 index 0000000..9441588 --- /dev/null +++ b/test/testfiles/stl/stl_ascii.stl @@ -0,0 +1,4006 @@ +solid Untitled-5427e5af +facet normal 0.0 0.0 -1.0 + outer loop + vertex 1.17 1.63 0.0 + vertex 0.0 0.0 0.0 + vertex 0.0 1.63 0.0 + endloop +endfacet +facet normal 0.0 0.0 -1.0 + outer loop + vertex 0.0 0.0 0.0 + vertex 1.17 1.63 0.0 + vertex 1.17 0.0 0.0 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 1.17 0.0 1.2 + vertex 0.0 1.63 1.2 + vertex 0.0 0.0 1.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 0.0 1.63 1.2 + vertex 1.17 0.0 1.2 + vertex 1.17 1.63 1.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 0.0 1.63 1.2 + vertex 0.0 0.0 0.0 + vertex 0.0 0.0 1.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 0.0 0.0 0.0 + vertex 0.0 1.63 1.2 + vertex 0.0 1.63 0.0 + endloop +endfacet +facet normal -0.0 1.0 0.0 + outer loop + vertex 0.0 1.63 1.2 + vertex 1.17 1.63 0.0 + vertex 0.0 1.63 0.0 + endloop +endfacet +facet normal -0.0 1.0 0.0 + outer loop + vertex 1.17 1.63 0.0 + vertex 0.0 1.63 1.2 + vertex 1.17 1.63 1.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 1.17 1.63 0.0 + vertex 1.17 0.0 1.2 + vertex 1.17 0.0 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 1.17 0.0 1.2 + vertex 1.17 1.63 0.0 + vertex 1.17 1.63 1.2 + endloop +endfacet +facet normal -0.0 -1.0 -0.0 + outer loop + vertex 1.17 0.0 1.2 + vertex 0.0 0.0 0.0 + vertex 1.17 0.0 0.0 + endloop +endfacet +facet normal -0.0 -1.0 -0.0 + outer loop + vertex 0.0 0.0 0.0 + vertex 1.17 0.0 1.2 + vertex 0.0 0.0 1.2 + endloop +endfacet +facet normal 0.0 0.0 -1.0 + outer loop + vertex 1.73120970770261 3.31831671830375 0.0 + vertex 1.69335580395681 1.58667960794511 0.0 + vertex 1.21240217992756 2.46342564388318 0.0 + endloop +endfacet +facet normal 0.0 0.0 -1.0 + outer loop + vertex 1.69335580395681 1.58667960794511 0.0 + vertex 1.73120970770261 3.31831671830375 0.0 + vertex 2.69311695576112 1.5648246464276 0.0 + endloop +endfacet +facet normal 0.0 0.0 -1.0 + outer loop + vertex 2.69311695576112 1.5648246464276 0.0 + vertex 1.73120970770261 3.31831671830375 0.0 + vertex 2.73097085950691 3.29646175678623 0.0 + endloop +endfacet +facet normal 0.0 0.0 -1.0 + outer loop + vertex 2.69311695576112 1.5648246464276 0.0 + vertex 2.73097085950691 3.29646175678623 0.0 + vertex 3.21192448353617 2.41971572084816 0.0 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 1.69335580395681 1.58667960794511 0.54 + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 1.21240217992756 2.46342564388318 0.54 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 1.69335580395681 1.58667960794511 0.54 + vertex 2.69311695576112 1.5648246464276 0.54 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 2.69311695576112 1.5648246464276 0.54 + vertex 2.73097085950691 3.29646175678623 0.54 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 2.73097085950691 3.29646175678623 0.54 + vertex 2.69311695576112 1.5648246464276 0.54 + vertex 3.21192448353617 2.41971572084816 0.54 + endloop +endfacet +facet normal -0.854891074420561 0.518807527775049 0.0 + outer loop + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 1.21240217992756 2.46342564388318 0.0 + vertex 1.21240217992756 2.46342564388318 0.54 + endloop +endfacet +facet normal -0.854891074420561 0.518807527775049 0.0 + outer loop + vertex 1.21240217992756 2.46342564388318 0.0 + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 1.73120970770261 3.31831671830375 0.0 + endloop +endfacet +facet normal 0.0218549615175129 0.999761151804304 0.0 + outer loop + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 2.73097085950691 3.29646175678623 0.0 + vertex 1.73120970770261 3.31831671830375 0.0 + endloop +endfacet +facet normal 0.0218549615175129 0.999761151804304 0.0 + outer loop + vertex 2.73097085950691 3.29646175678623 0.0 + vertex 1.73120970770261 3.31831671830375 0.54 + vertex 2.73097085950691 3.29646175678623 0.54 + endloop +endfacet +facet normal 0.876746035938074 0.480953624029254 0.0 + outer loop + vertex 2.73097085950691 3.29646175678623 0.0 + vertex 3.21192448353617 2.41971572084816 0.54 + vertex 3.21192448353617 2.41971572084816 0.0 + endloop +endfacet +facet normal 0.876746035938074 0.480953624029254 0.0 + outer loop + vertex 3.21192448353617 2.41971572084816 0.54 + vertex 2.73097085950691 3.29646175678623 0.0 + vertex 2.73097085950691 3.29646175678623 0.54 + endloop +endfacet +facet normal 0.854891074420561 -0.51880752777505 0.0 + outer loop + vertex 3.21192448353617 2.41971572084816 0.0 + vertex 2.69311695576112 1.5648246464276 0.54 + vertex 2.69311695576112 1.5648246464276 0.0 + endloop +endfacet +facet normal 0.854891074420561 -0.51880752777505 0.0 + outer loop + vertex 2.69311695576112 1.5648246464276 0.54 + vertex 3.21192448353617 2.41971572084816 0.0 + vertex 3.21192448353617 2.41971572084816 0.54 + endloop +endfacet +facet normal -0.0218549615175129 -0.999761151804304 -0.0 + outer loop + vertex 2.69311695576112 1.5648246464276 0.54 + vertex 1.69335580395681 1.58667960794511 0.0 + vertex 2.69311695576112 1.5648246464276 0.0 + endloop +endfacet +facet normal -0.0218549615175129 -0.999761151804304 -0.0 + outer loop + vertex 1.69335580395681 1.58667960794511 0.0 + vertex 2.69311695576112 1.5648246464276 0.54 + vertex 1.69335580395681 1.58667960794511 0.54 + endloop +endfacet +facet normal -0.876746035938074 -0.480953624029255 -0.0 + outer loop + vertex 1.21240217992756 2.46342564388318 0.54 + vertex 1.69335580395681 1.58667960794511 0.0 + vertex 1.69335580395681 1.58667960794511 0.54 + endloop +endfacet +facet normal -0.876746035938074 -0.480953624029255 -0.0 + outer loop + vertex 1.69335580395681 1.58667960794511 0.0 + vertex 1.21240217992756 2.46342564388318 0.54 + vertex 1.21240217992756 2.46342564388318 0.0 + endloop +endfacet +facet normal 7.93222929432366e-016 4.89694648390394e-016 -1.0 + outer loop + vertex 2.97826240317018 -0.636443757595701 1.44368526932165e-015 + vertex 1.4493076566905 -1.10792799192095 0.0 + vertex 2.10637516234703 0.776146996759498 1.44382245079469e-015 + endloop +endfacet +facet normal -7.93222929432366e-016 -4.89694648390394e-016 1.0 + outer loop + vertex 2.97826240317018 -0.636443757595701 0.880000000000001 + vertex 2.10637516234703 0.776146996759498 0.880000000000001 + vertex 1.4493076566905 -1.10792799192095 0.88 + endloop +endfacet +facet normal -0.944226355661639 0.329297113977544 -5.87726961439968e-016 + outer loop + vertex 2.10637516234703 0.776146996759498 0.880000000000001 + vertex 1.4493076566905 -1.10792799192095 0.0 + vertex 1.4493076566905 -1.10792799192095 0.88 + endloop +endfacet +facet normal -0.944226355661639 0.329297113977544 -5.87726961439968e-016 + outer loop + vertex 1.4493076566905 -1.10792799192095 0.0 + vertex 2.10637516234703 0.776146996759498 0.880000000000001 + vertex 2.10637516234703 0.776146996759498 1.44382245079469e-015 + endloop +endfacet +facet normal 0.850958285756144 0.525233277604309 9.32203549451609e-016 + outer loop + vertex 2.10637516234703 0.776146996759498 1.44382245079469e-015 + vertex 2.97826240317018 -0.636443757595701 0.880000000000001 + vertex 2.97826240317018 -0.636443757595701 1.44368526932165e-015 + endloop +endfacet +facet normal 0.850958285756144 0.525233277604309 9.32203549451609e-016 + outer loop + vertex 2.97826240317018 -0.636443757595701 0.880000000000001 + vertex 2.10637516234703 0.776146996759498 1.44382245079469e-015 + vertex 2.10637516234703 0.776146996759498 0.880000000000001 + endloop +endfacet +facet normal 0.294677646453279 -0.955596716549799 -2.34205532155964e-016 + outer loop + vertex 2.97826240317018 -0.636443757595701 1.44368526932165e-015 + vertex 1.4493076566905 -1.10792799192095 0.88 + vertex 1.4493076566905 -1.10792799192095 0.0 + endloop +endfacet +facet normal 0.294677646453279 -0.955596716549799 -2.34205532155964e-016 + outer loop + vertex 1.4493076566905 -1.10792799192095 0.88 + vertex 2.97826240317018 -0.636443757595701 1.44368526932165e-015 + vertex 2.97826240317018 -0.636443757595701 0.880000000000001 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.0 + vertex 3.16916924809083 0.370587344831611 0.0 + vertex 3.0733838074778 0.370587344831611 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.16916924809083 0.370587344831611 0.0 + vertex 3.3138052634165 1.0837099501956 0.0 + vertex 3.23382442050462 0.569821061306707 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.23382442050462 0.569821061306707 0.0 + vertex 3.3138052634165 1.0837099501956 0.0 + vertex 3.26016541667321 0.650759758624714 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.26016541667321 0.650759758624714 0.0 + vertex 3.3138052634165 1.0837099501956 0.0 + vertex 3.36983974617512 0.986966655176438 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.36983974617512 0.986966655176438 0.0 + vertex 3.3138052634165 1.0837099501956 0.0 + vertex 3.43066350096439 1.0837099501956 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.36983974617512 0.986966655176438 0.0 + vertex 3.43066350096439 1.0837099501956 0.0 + vertex 3.4799930028801 0.650759758624714 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.4799930028801 0.650759758624714 0.0 + vertex 3.43066350096439 1.0837099501956 0.0 + vertex 3.67108495690309 0.370587344831611 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.4799930028801 0.650759758624714 0.0 + vertex 3.67108495690309 0.370587344831611 0.0 + vertex 3.50633399904868 0.569821061306707 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.50633399904868 0.569821061306707 0.0 + vertex 3.67108495690309 0.370587344831611 0.0 + vertex 3.57098917146248 0.370587344831611 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.26016541667321 0.650759758624714 0.0 + vertex 3.50633399904868 0.569821061306707 0.0 + vertex 3.23382442050462 0.569821061306707 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.50633399904868 0.569821061306707 0.0 + vertex 3.26016541667321 0.650759758624714 0.0 + vertex 3.4799930028801 0.650759758624714 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.81895373084945 0.907105544065327 0.0 + vertex 3.79273246648164 0.767139068969542 0.0 + vertex 3.78491996648164 0.892887392724331 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.79273246648164 0.767139068969542 0.0 + vertex 3.81895373084945 0.907105544065327 0.0 + vertex 3.80039530173068 0.800185045981036 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.80039530173068 0.800185045981036 0.0 + vertex 3.81895373084945 0.907105544065327 0.0 + vertex 3.8233838074778 0.823652478931228 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.8233838074778 0.823652478931228 0.0 + vertex 3.81895373084945 0.907105544065327 0.0 + vertex 3.857477437746 0.915636434869925 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.8233838074778 0.823652478931228 0.0 + vertex 3.857477437746 0.915636434869925 0.0 + vertex 3.85750737069619 0.837661099620883 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.85750737069619 0.837661099620883 0.0 + vertex 3.857477437746 0.915636434869925 0.0 + vertex 3.90049108717129 0.918480065138124 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.85750737069619 0.837661099620883 0.0 + vertex 3.90049108717129 0.918480065138124 0.0 + vertex 3.89857537835903 0.842330639850768 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.89857537835903 0.842330639850768 0.0 + vertex 3.90049108717129 0.918480065138124 0.0 + vertex 3.94149922893374 0.838379490425481 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.94149922893374 0.838379490425481 0.0 + vertex 3.90049108717129 0.918480065138124 0.0 + vertex 3.99005047414447 0.907464739467626 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.94149922893374 0.838379490425481 0.0 + vertex 3.99005047414447 0.907464739467626 0.0 + vertex 3.98406388410616 0.826526042149619 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.98406388410616 0.826526042149619 0.0 + vertex 3.99005047414447 0.907464739467626 0.0 + vertex 4.02447336686478 0.807847881230078 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.02447336686478 0.807847881230078 0.0 + vertex 3.99005047414447 0.907464739467626 0.0 + vertex 4.06572097222876 0.879686961689848 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.02447336686478 0.807847881230078 0.0 + vertex 4.06572097222876 0.879686961689848 0.0 + vertex 4.06093170019811 0.783422593873756 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.06093170019811 0.783422593873756 0.0 + vertex 4.06572097222876 0.879686961689848 0.0 + vertex 4.06572097222876 0.783422593873756 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.70419079981497 0.789648647513603 0.0 + vertex 3.70772288793757 0.706375180080653 0.0 + vertex 3.70077844349313 0.755165888892914 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.70772288793757 0.706375180080653 0.0 + vertex 3.70419079981497 0.789648647513603 0.0 + vertex 3.71442786878049 0.820778915712837 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.70772288793757 0.706375180080653 0.0 + vertex 3.71442786878049 0.820778915712837 0.0 + vertex 3.72855622127091 0.665367038318201 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.72855622127091 0.665367038318201 0.0 + vertex 3.71442786878049 0.820778915712837 0.0 + vertex 3.73148965038968 0.848556693490615 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.72855622127091 0.665367038318201 0.0 + vertex 3.73148965038968 0.848556693490615 0.0 + vertex 3.76471522510232 0.633099318011688 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.73148965038968 0.848556693490615 0.0 + vertex 3.75537614464255 0.872981980846936 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.75537614464255 0.872981980846936 0.0 + vertex 3.78491996648164 0.892887392724331 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.78491996648164 0.892887392724331 0.0 + vertex 3.79273246648164 0.767139068969542 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.79273246648164 0.767139068969542 0.0 + vertex 3.79728227491075 0.737864643682186 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.79728227491075 0.737864643682186 0.0 + vertex 3.81763668104102 0.610529873567243 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.81763668104102 0.610529873567243 0.0 + vertex 3.79728227491075 0.737864643682186 0.0 + vertex 3.81093170019811 0.717091176249235 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.81763668104102 0.610529873567243 0.0 + vertex 3.81093170019811 0.717091176249235 0.0 + vertex 3.83463859674983 0.702064835253067 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.81763668104102 0.610529873567243 0.0 + vertex 3.83463859674983 0.702064835253067 0.0 + vertex 3.86888189176899 0.598077766287549 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.86888189176899 0.598077766287549 0.0 + vertex 3.83463859674983 0.702064835253067 0.0 + vertex 3.86936081897206 0.690031789276055 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.86888189176899 0.598077766287549 0.0 + vertex 3.86936081897206 0.690031789276055 0.0 + vertex 3.91390104885711 0.588020295023182 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.91390104885711 0.588020295023182 0.0 + vertex 3.86936081897206 0.690031789276055 0.0 + vertex 3.91414051245865 0.679734854410155 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.91390104885711 0.588020295023182 0.0 + vertex 3.91414051245865 0.679734854410155 0.0 + vertex 3.95167643199888 0.575687919544254 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.95167643199888 0.575687919544254 0.0 + vertex 3.91414051245865 0.679734854410155 0.0 + vertex 3.96610411399121 0.668001137935059 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.95167643199888 0.575687919544254 0.0 + vertex 3.96610411399121 0.668001137935059 0.0 + vertex 3.97592212165405 0.560721444448469 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.97592212165405 0.560721444448469 0.0 + vertex 3.96610411399121 0.668001137935059 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.97592212165405 0.560721444448469 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 3.98903275383796 0.540486770118967 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.98903275383796 0.540486770118967 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 3.99340296456593 0.512349796938891 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.99340296456593 0.512349796938891 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 4.00112566571535 0.38543408812663 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.00112566571535 0.38543408812663 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 4.03171714081114 0.406506885061496 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.03171714081114 0.406506885061496 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 4.05542403736286 0.61867163601935 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.03171714081114 0.406506885061496 0.0 + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.05488524425941 0.430752574716668 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.05488524425941 0.430752574716668 0.0 + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.07170756226708 0.459428341000193 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.07170756226708 0.459428341000193 0.0 + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.07787375000654 0.577962823758814 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.07170756226708 0.459428341000193 0.0 + vertex 4.07787375000654 0.577962823758814 0.0 + vertex 4.08194463123259 0.491217134103642 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.08194463123259 0.491217134103642 0.0 + vertex 4.07787375000654 0.577962823758814 0.0 + vertex 4.08535698755443 0.524801904218584 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.70317307950846 0.503729107283718 0.0 + vertex 3.6983838074778 0.402675467436975 0.0 + vertex 3.6983838074778 0.503729107283718 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.6983838074778 0.402675467436975 0.0 + vertex 3.70317307950846 0.503729107283718 0.0 + vertex 3.77573055077282 0.372024126440806 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.0 + vertex 3.70317307950846 0.503729107283718 0.0 + vertex 3.73023246648164 0.483614164754982 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.0 + vertex 3.73023246648164 0.483614164754982 0.0 + vertex 3.77165966954677 0.460625659007856 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.0 + vertex 3.77165966954677 0.460625659007856 0.0 + vertex 3.82218648947014 0.441947498088316 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.0 + vertex 3.82218648947014 0.441947498088316 0.0 + vertex 3.82416206418278 0.361248264371841 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.82416206418278 0.361248264371841 0.0 + vertex 3.82218648947014 0.441947498088316 0.0 + vertex 3.87941829023642 0.433805735636209 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.82416206418278 0.361248264371841 0.0 + vertex 3.87941829023642 0.433805735636209 0.0 + vertex 3.87606579981497 0.357656310348852 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.87606579981497 0.357656310348852 0.0 + vertex 3.87941829023642 0.433805735636209 0.0 + vertex 3.92605382663489 0.360769337168776 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.92605382663489 0.360769337168776 0.0 + vertex 3.87941829023642 0.433805735636209 0.0 + vertex 3.92539530173068 0.438834471268392 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.92605382663489 0.360769337168776 0.0 + vertex 3.92539530173068 0.438834471268392 0.0 + vertex 3.96179376916363 0.451526042149618 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.92605382663489 0.360769337168776 0.0 + vertex 3.96179376916363 0.451526042149618 0.0 + vertex 3.96682250479581 0.370108417628546 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.96682250479581 0.370108417628546 0.0 + vertex 3.96179376916363 0.451526042149618 0.0 + vertex 3.98597959291842 0.47499347509981 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 3.96682250479581 0.370108417628546 0.0 + vertex 3.98597959291842 0.47499347509981 0.0 + vertex 4.00112566571535 0.38543408812663 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.00112566571535 0.38543408812663 0.0 + vertex 3.98597959291842 0.47499347509981 0.0 + vertex 3.99340296456593 0.512349796938891 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.13702125958508 0.702962823758814 0.0 + vertex 4.13684166188393 0.571078245214753 0.0 + vertex 4.13229185345481 0.63734979693889 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.13684166188393 0.571078245214753 0.0 + vertex 4.13702125958508 0.702962823758814 0.0 + vertex 4.15049108717129 0.514026042149619 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.15049108717129 0.514026042149619 0.0 + vertex 4.13702125958508 0.702962823758814 0.0 + vertex 4.15120947797589 0.758997306517435 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.15049108717129 0.514026042149619 0.0 + vertex 4.15120947797589 0.758997306517435 0.0 + vertex 4.17240200671152 0.466073455942722 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.17240200671152 0.466073455942722 0.0 + vertex 4.15120947797589 0.758997306517435 0.0 + vertex 4.17329999521727 0.80617163601935 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.17240200671152 0.466073455942722 0.0 + vertex 4.17329999521727 0.80617163601935 0.0 + vertex 4.20173629789926 0.427100754793297 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.17329999521727 0.80617163601935 0.0 + vertex 4.20173629789926 0.845204203069159 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.20173629789926 0.845204203069159 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.22568265805252 0.63734979693889 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.22568265805252 0.63734979693889 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.22833172414447 0.68298257950594 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.22833172414447 0.68298257950594 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.23627892242033 0.723137632187933 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.23627892242033 0.723137632187933 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.2495242528801 0.757814954984868 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.2495242528801 0.757814954984868 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.28051982280347 0.899083513413986 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.2495242528801 0.757814954984868 0.0 + vertex 4.28051982280347 0.899083513413986 0.0 + vertex 4.26806771552378 0.787014547896745 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.26806771552378 0.787014547896745 0.0 + vertex 4.28051982280347 0.899083513413986 0.0 + vertex 4.29098138889543 0.810167684869925 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.29098138889543 0.810167684869925 0.0 + vertex 4.28051982280347 0.899083513413986 0.0 + vertex 4.3294302634165 0.913271731804791 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.29098138889543 0.810167684869925 0.0 + vertex 4.3294302634165 0.913271731804791 0.0 + vertex 4.31733735153911 0.826705639850768 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.31733735153911 0.826705639850768 0.0 + vertex 4.3294302634165 0.913271731804791 0.0 + vertex 4.34713560345482 0.836628412839274 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.34713560345482 0.836628412839274 0.0 + vertex 4.3294302634165 0.913271731804791 0.0 + vertex 4.38181292625175 0.918001137935059 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.34713560345482 0.836628412839274 0.0 + vertex 4.38181292625175 0.918001137935059 0.0 + vertex 4.38037614464255 0.839936003835442 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.38037614464255 0.839936003835442 0.0 + vertex 4.38181292625175 0.918001137935059 0.0 + vertex 4.4292267193552 0.832752095789465 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.4292267193552 0.832752095789465 0.0 + vertex 4.38181292625175 0.918001137935059 0.0 + vertex 4.42509597222876 0.914888111115136 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.4292267193552 0.832752095789465 0.0 + vertex 4.42509597222876 0.914888111115136 0.0 + vertex 4.46682250479581 0.905549030655366 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.4292267193552 0.832752095789465 0.0 + vertex 4.46682250479581 0.905549030655366 0.0 + vertex 4.47328802203719 0.815989643682186 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.47328802203719 0.815989643682186 0.0 + vertex 4.46682250479581 0.905549030655366 0.0 + vertex 4.53985890326324 0.876813398471458 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.47328802203719 0.815989643682186 0.0 + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.50992595307167 0.794437919544255 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.50992595307167 0.794437919544255 0.0 + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.53459070402953 0.775759758624714 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.53459070402953 0.775759758624714 0.0 + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.53985890326324 0.775759758624714 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.22568265805252 0.63734979693889 0.0 + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.20173629789926 0.427100754793297 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.22568265805252 0.63734979693889 0.0 + vertex 4.2282419252939 0.592555136977205 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.2282419252939 0.592555136977205 0.0 + vertex 4.23591972701803 0.552998743299044 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.23591972701803 0.552998743299044 0.0 + vertex 4.24871606322493 0.518680615904408 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.24871606322493 0.518680615904408 0.0 + vertex 4.28075928640501 0.375616080463795 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.28075928640501 0.375616080463795 0.0 + vertex 4.24871606322493 0.518680615904408 0.0 + vertex 4.26663093391458 0.489600754793297 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.28075928640501 0.375616080463795 0.0 + vertex 4.26663093391458 0.489600754793297 0.0 + vertex 4.28909561303336 0.466447617820117 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.28075928640501 0.375616080463795 0.0 + vertex 4.28909561303336 0.466447617820117 0.0 + vertex 4.32901120211382 0.362864643682186 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.32901120211382 0.362864643682186 0.0 + vertex 4.28909561303336 0.466447617820117 0.0 + vertex 4.31554137452761 0.449909662839274 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.32901120211382 0.362864643682186 0.0 + vertex 4.31554137452761 0.449909662839274 0.0 + vertex 4.34596821839734 0.439986889850768 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.32901120211382 0.362864643682186 0.0 + vertex 4.34596821839734 0.439986889850768 0.0 + vertex 4.38181292625175 0.358614164754983 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.38181292625175 0.358614164754983 0.0 + vertex 4.34596821839734 0.439986889850768 0.0 + vertex 4.38037614464255 0.436679298854599 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.38181292625175 0.358614164754983 0.0 + vertex 4.38037614464255 0.436679298854599 0.0 + vertex 4.42335986111765 0.441229107283718 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.38181292625175 0.358614164754983 0.0 + vertex 4.42335986111765 0.441229107283718 0.0 + vertex 4.42874779215213 0.362206118777971 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.42874779215213 0.362206118777971 0.0 + vertex 4.42335986111765 0.441229107283718 0.0 + vertex 4.46418840517895 0.454878532571074 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.42874779215213 0.362206118777971 0.0 + vertex 4.46418840517895 0.454878532571074 0.0 + vertex 4.46993553161574 0.372503053643871 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.46993553161574 0.372503053643871 0.0 + vertex 4.46418840517895 0.454878532571074 0.0 + vertex 4.5016644588188 0.475711865904408 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.46993553161574 0.372503053643871 0.0 + vertex 4.5016644588188 0.475711865904408 0.0 + vertex 4.50633399904869 0.385673551728163 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.50633399904869 0.385673551728163 0.0 + vertex 4.5016644588188 0.475711865904408 0.0 + vertex 4.53459070402953 0.501813398471458 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.50633399904869 0.385673551728163 0.0 + vertex 4.53459070402953 0.501813398471458 0.0 + vertex 4.53985890326324 0.400759758624714 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.53985890326324 0.400759758624714 0.0 + vertex 4.53459070402953 0.501813398471458 0.0 + vertex 4.53985890326324 0.501813398471458 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.71370947797589 0.905549030655366 0.0 + vertex 4.62367116379964 0.370587344831611 0.0 + vertex 4.62367116379964 0.905549030655366 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.62367116379964 0.370587344831611 0.0 + vertex 4.71370947797589 0.905549030655366 0.0 + vertex 4.71370947797589 0.370587344831611 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.71993553161574 1.08849922222625 0.0 + vertex 4.6174451101598 0.995108417628546 0.0 + vertex 4.6174451101598 1.08849922222625 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.6174451101598 0.995108417628546 0.0 + vertex 4.71993553161574 1.08849922222625 0.0 + vertex 4.71993553161574 0.995108417628546 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.93784740901037 0.905549030655366 0.0 + vertex 4.84780909483413 0.370587344831611 0.0 + vertex 4.84780909483413 0.905549030655366 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.84780909483413 0.370587344831611 0.0 + vertex 4.93784740901037 0.905549030655366 0.0 + vertex 4.93784740901037 0.370587344831611 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.94407346265022 1.08849922222625 0.0 + vertex 4.84158304119428 0.995108417628546 0.0 + vertex 4.84158304119428 1.08849922222625 0.0 + endloop +endfacet +facet normal -0.0 -0.0 -1.0 + outer loop + vertex 4.84158304119428 0.995108417628546 0.0 + vertex 4.94407346265022 1.08849922222625 0.0 + vertex 4.94407346265022 0.995108417628546 0.0 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.23382442050462 0.569821061306707 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.4799930028801 0.650759758624714 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.16916924809083 0.370587344831611 0.2 + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.0733838074778 0.370587344831611 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.16916924809083 0.370587344831611 0.2 + vertex 3.23382442050462 0.569821061306707 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.23382442050462 0.569821061306707 0.2 + vertex 3.26016541667321 0.650759758624714 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.36983974617512 0.986966655176438 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.36983974617512 0.986966655176438 0.2 + vertex 3.43066350096439 1.0837099501956 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.43066350096439 1.0837099501956 0.2 + vertex 3.36983974617512 0.986966655176438 0.2 + vertex 3.4799930028801 0.650759758624714 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.43066350096439 1.0837099501956 0.2 + vertex 3.4799930028801 0.650759758624714 0.2 + vertex 3.67108495690309 0.370587344831611 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.67108495690309 0.370587344831611 0.2 + vertex 3.4799930028801 0.650759758624714 0.2 + vertex 3.50633399904868 0.569821061306707 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.67108495690309 0.370587344831611 0.2 + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.57098917146248 0.370587344831611 0.2 + endloop +endfacet +facet normal -0.947595870336326 0.319471542584846 0.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.0733838074778 0.370587344831611 0.0 + vertex 3.0733838074778 0.370587344831611 0.2 + endloop +endfacet +facet normal -0.947595870336326 0.319471542584846 0.0 + outer loop + vertex 3.0733838074778 0.370587344831611 0.0 + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.3138052634165 1.0837099501956 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.43066350096439 1.0837099501956 0.0 + vertex 3.3138052634165 1.0837099501956 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 3.43066350096439 1.0837099501956 0.0 + vertex 3.3138052634165 1.0837099501956 0.2 + vertex 3.43066350096439 1.0837099501956 0.2 + endloop +endfacet +facet normal 0.947595870336326 0.319471542584846 0.0 + outer loop + vertex 3.43066350096439 1.0837099501956 0.0 + vertex 3.67108495690309 0.370587344831611 0.2 + vertex 3.67108495690309 0.370587344831611 0.0 + endloop +endfacet +facet normal 0.947595870336326 0.319471542584846 0.0 + outer loop + vertex 3.67108495690309 0.370587344831611 0.2 + vertex 3.43066350096439 1.0837099501956 0.0 + vertex 3.43066350096439 1.0837099501956 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 3.67108495690309 0.370587344831611 0.2 + vertex 3.57098917146248 0.370587344831611 0.0 + vertex 3.67108495690309 0.370587344831611 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 3.57098917146248 0.370587344831611 0.0 + vertex 3.67108495690309 0.370587344831611 0.2 + vertex 3.57098917146248 0.370587344831611 0.2 + endloop +endfacet +facet normal -0.951168400556076 -0.308672437680457 0.0 + outer loop + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.57098917146248 0.370587344831611 0.0 + vertex 3.57098917146248 0.370587344831611 0.2 + endloop +endfacet +facet normal -0.951168400556076 -0.308672437680457 0.0 + outer loop + vertex 3.57098917146248 0.370587344831611 0.0 + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.50633399904868 0.569821061306707 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.23382442050462 0.569821061306707 0.0 + vertex 3.50633399904868 0.569821061306707 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 3.23382442050462 0.569821061306707 0.0 + vertex 3.50633399904868 0.569821061306707 0.2 + vertex 3.23382442050462 0.569821061306707 0.2 + endloop +endfacet +facet normal 0.951168400556076 -0.308672437680457 0.0 + outer loop + vertex 3.23382442050462 0.569821061306707 0.0 + vertex 3.16916924809083 0.370587344831611 0.2 + vertex 3.16916924809083 0.370587344831611 0.0 + endloop +endfacet +facet normal 0.951168400556076 -0.308672437680457 0.0 + outer loop + vertex 3.16916924809083 0.370587344831611 0.2 + vertex 3.23382442050462 0.569821061306707 0.0 + vertex 3.23382442050462 0.569821061306707 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 3.16916924809083 0.370587344831611 0.2 + vertex 3.0733838074778 0.370587344831611 0.0 + vertex 3.16916924809083 0.370587344831611 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 3.0733838074778 0.370587344831611 0.0 + vertex 3.16916924809083 0.370587344831611 0.2 + vertex 3.0733838074778 0.370587344831611 0.2 + endloop +endfacet +facet normal -0.950295217341758 -0.311350284884052 0.0 + outer loop + vertex 3.36983974617512 0.986966655176438 0.2 + vertex 3.4799930028801 0.650759758624714 0.0 + vertex 3.4799930028801 0.650759758624714 0.2 + endloop +endfacet +facet normal -0.950295217341758 -0.311350284884052 0.0 + outer loop + vertex 3.4799930028801 0.650759758624714 0.0 + vertex 3.36983974617512 0.986966655176438 0.2 + vertex 3.36983974617512 0.986966655176438 0.0 + endloop +endfacet +facet normal 0.950695123572524 -0.310127041735196 0.0 + outer loop + vertex 3.36983974617512 0.986966655176438 0.0 + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.26016541667321 0.650759758624714 0.0 + endloop +endfacet +facet normal 0.950695123572524 -0.310127041735196 0.0 + outer loop + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.36983974617512 0.986966655176438 0.0 + vertex 3.36983974617512 0.986966655176438 0.2 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.4799930028801 0.650759758624714 0.0 + vertex 3.26016541667321 0.650759758624714 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 3.4799930028801 0.650759758624714 0.0 + vertex 3.26016541667321 0.650759758624714 0.2 + vertex 3.4799930028801 0.650759758624714 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.6983838074778 0.503729107283718 0.2 + vertex 3.6983838074778 0.402675467436975 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.6983838074778 0.503729107283718 0.2 + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.70317307950846 0.503729107283718 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.70317307950846 0.503729107283718 0.2 + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.73023246648164 0.483614164754982 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.73023246648164 0.483614164754982 0.2 + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.77165966954677 0.460625659007856 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.77165966954677 0.460625659007856 0.2 + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.82218648947014 0.441947498088316 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.82218648947014 0.441947498088316 0.2 + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.82416206418278 0.361248264371841 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.82218648947014 0.441947498088316 0.2 + vertex 3.82416206418278 0.361248264371841 0.2 + vertex 3.87941829023642 0.433805735636209 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.87941829023642 0.433805735636209 0.2 + vertex 3.82416206418278 0.361248264371841 0.2 + vertex 3.87606579981497 0.357656310348852 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.87941829023642 0.433805735636209 0.2 + vertex 3.87606579981497 0.357656310348852 0.2 + vertex 3.92605382663489 0.360769337168776 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.87941829023642 0.433805735636209 0.2 + vertex 3.92605382663489 0.360769337168776 0.2 + vertex 3.92539530173068 0.438834471268392 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.92539530173068 0.438834471268392 0.2 + vertex 3.92605382663489 0.360769337168776 0.2 + vertex 3.96179376916363 0.451526042149618 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.96179376916363 0.451526042149618 0.2 + vertex 3.92605382663489 0.360769337168776 0.2 + vertex 3.96682250479581 0.370108417628546 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.96179376916363 0.451526042149618 0.2 + vertex 3.96682250479581 0.370108417628546 0.2 + vertex 3.98597959291842 0.47499347509981 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.98597959291842 0.47499347509981 0.2 + vertex 3.96682250479581 0.370108417628546 0.2 + vertex 4.00112566571535 0.38543408812663 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.98597959291842 0.47499347509981 0.2 + vertex 4.00112566571535 0.38543408812663 0.2 + vertex 3.99340296456593 0.512349796938891 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.70772288793757 0.706375180080653 0.2 + vertex 3.70419079981497 0.789648647513603 0.2 + vertex 3.70077844349313 0.755165888892914 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.70419079981497 0.789648647513603 0.2 + vertex 3.70772288793757 0.706375180080653 0.2 + vertex 3.71442786878049 0.820778915712837 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.71442786878049 0.820778915712837 0.2 + vertex 3.70772288793757 0.706375180080653 0.2 + vertex 3.72855622127091 0.665367038318201 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.71442786878049 0.820778915712837 0.2 + vertex 3.72855622127091 0.665367038318201 0.2 + vertex 3.73148965038968 0.848556693490615 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.73148965038968 0.848556693490615 0.2 + vertex 3.72855622127091 0.665367038318201 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.73148965038968 0.848556693490615 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.75537614464255 0.872981980846936 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.75537614464255 0.872981980846936 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.78491996648164 0.892887392724331 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.78491996648164 0.892887392724331 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.79273246648164 0.767139068969542 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.79273246648164 0.767139068969542 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.79728227491075 0.737864643682186 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.79728227491075 0.737864643682186 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.81763668104102 0.610529873567243 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.79728227491075 0.737864643682186 0.2 + vertex 3.81763668104102 0.610529873567243 0.2 + vertex 3.81093170019811 0.717091176249235 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.81093170019811 0.717091176249235 0.2 + vertex 3.81763668104102 0.610529873567243 0.2 + vertex 3.83463859674983 0.702064835253067 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.83463859674983 0.702064835253067 0.2 + vertex 3.81763668104102 0.610529873567243 0.2 + vertex 3.86888189176899 0.598077766287549 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.83463859674983 0.702064835253067 0.2 + vertex 3.86888189176899 0.598077766287549 0.2 + vertex 3.86936081897206 0.690031789276055 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.86936081897206 0.690031789276055 0.2 + vertex 3.86888189176899 0.598077766287549 0.2 + vertex 3.91390104885711 0.588020295023182 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.86936081897206 0.690031789276055 0.2 + vertex 3.91390104885711 0.588020295023182 0.2 + vertex 3.91414051245865 0.679734854410155 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.91414051245865 0.679734854410155 0.2 + vertex 3.91390104885711 0.588020295023182 0.2 + vertex 3.95167643199888 0.575687919544254 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.91414051245865 0.679734854410155 0.2 + vertex 3.95167643199888 0.575687919544254 0.2 + vertex 3.96610411399121 0.668001137935059 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.96610411399121 0.668001137935059 0.2 + vertex 3.95167643199888 0.575687919544254 0.2 + vertex 3.97592212165405 0.560721444448469 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.96610411399121 0.668001137935059 0.2 + vertex 3.97592212165405 0.560721444448469 0.2 + vertex 4.01812758142416 0.648245390808622 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 3.97592212165405 0.560721444448469 0.2 + vertex 3.98903275383796 0.540486770118967 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 3.98903275383796 0.540486770118967 0.2 + vertex 3.99340296456593 0.512349796938891 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 3.99340296456593 0.512349796938891 0.2 + vertex 4.00112566571535 0.38543408812663 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 4.00112566571535 0.38543408812663 0.2 + vertex 4.03171714081114 0.406506885061496 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 4.03171714081114 0.406506885061496 0.2 + vertex 4.05542403736286 0.61867163601935 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.05542403736286 0.61867163601935 0.2 + vertex 4.03171714081114 0.406506885061496 0.2 + vertex 4.05488524425941 0.430752574716668 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.05542403736286 0.61867163601935 0.2 + vertex 4.05488524425941 0.430752574716668 0.2 + vertex 4.07170756226708 0.459428341000193 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.05542403736286 0.61867163601935 0.2 + vertex 4.07170756226708 0.459428341000193 0.2 + vertex 4.07787375000654 0.577962823758814 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.07787375000654 0.577962823758814 0.2 + vertex 4.07170756226708 0.459428341000193 0.2 + vertex 4.08194463123259 0.491217134103642 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.07787375000654 0.577962823758814 0.2 + vertex 4.08194463123259 0.491217134103642 0.2 + vertex 4.08535698755443 0.524801904218584 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.79273246648164 0.767139068969542 0.2 + vertex 3.81895373084945 0.907105544065327 0.2 + vertex 3.78491996648164 0.892887392724331 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.81895373084945 0.907105544065327 0.2 + vertex 3.79273246648164 0.767139068969542 0.2 + vertex 3.80039530173068 0.800185045981036 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.81895373084945 0.907105544065327 0.2 + vertex 3.80039530173068 0.800185045981036 0.2 + vertex 3.8233838074778 0.823652478931228 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.81895373084945 0.907105544065327 0.2 + vertex 3.8233838074778 0.823652478931228 0.2 + vertex 3.857477437746 0.915636434869925 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.857477437746 0.915636434869925 0.2 + vertex 3.8233838074778 0.823652478931228 0.2 + vertex 3.85750737069619 0.837661099620883 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.857477437746 0.915636434869925 0.2 + vertex 3.85750737069619 0.837661099620883 0.2 + vertex 3.90049108717129 0.918480065138124 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.90049108717129 0.918480065138124 0.2 + vertex 3.85750737069619 0.837661099620883 0.2 + vertex 3.89857537835903 0.842330639850768 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.90049108717129 0.918480065138124 0.2 + vertex 3.89857537835903 0.842330639850768 0.2 + vertex 3.94149922893374 0.838379490425481 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.90049108717129 0.918480065138124 0.2 + vertex 3.94149922893374 0.838379490425481 0.2 + vertex 3.99005047414447 0.907464739467626 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.99005047414447 0.907464739467626 0.2 + vertex 3.94149922893374 0.838379490425481 0.2 + vertex 3.98406388410616 0.826526042149619 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.99005047414447 0.907464739467626 0.2 + vertex 3.98406388410616 0.826526042149619 0.2 + vertex 4.02447336686478 0.807847881230078 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 3.99005047414447 0.907464739467626 0.2 + vertex 4.02447336686478 0.807847881230078 0.2 + vertex 4.06572097222876 0.879686961689848 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.06572097222876 0.879686961689848 0.2 + vertex 4.02447336686478 0.807847881230078 0.2 + vertex 4.06093170019811 0.783422593873756 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.06572097222876 0.879686961689848 0.2 + vertex 4.06093170019811 0.783422593873756 0.2 + vertex 4.06572097222876 0.783422593873756 0.2 + endloop +endfacet +facet normal -0.0034494236932481 -0.999994050720395 0.0 + outer loop + vertex 3.87606579981497 0.357656310348852 0.2 + vertex 3.82416206418278 0.361248264371841 0.0 + vertex 3.87606579981497 0.357656310348852 0.0 + endloop +endfacet +facet normal -0.143515065226195 -0.989648132445629 0.0 + outer loop + vertex 3.82416206418278 0.361248264371841 0.0 + vertex 3.87606579981497 0.357656310348852 0.2 + vertex 3.82416206418278 0.361248264371841 0.2 + endloop +endfacet +facet normal -0.143515065226195 -0.989648132445629 0.0 + outer loop + vertex 3.82416206418278 0.361248264371841 0.2 + vertex 3.77573055077282 0.372024126440806 0.0 + vertex 3.82416206418278 0.361248264371841 0.0 + endloop +endfacet +facet normal -0.29371898743818 -0.955891812088738 0.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.0 + vertex 3.82416206418278 0.361248264371841 0.2 + vertex 3.77573055077282 0.372024126440806 0.2 + endloop +endfacet +facet normal -0.29371898743818 -0.955891812088738 0.0 + outer loop + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.6983838074778 0.402675467436975 0.0 + vertex 3.77573055077282 0.372024126440806 0.0 + endloop +endfacet +facet normal -0.36841130465666 -0.929662901594539 0.0 + outer loop + vertex 3.6983838074778 0.402675467436975 0.0 + vertex 3.77573055077282 0.372024126440806 0.2 + vertex 3.6983838074778 0.402675467436975 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 3.6983838074778 0.503729107283718 0.2 + vertex 3.6983838074778 0.402675467436975 0.0 + vertex 3.6983838074778 0.402675467436975 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 3.6983838074778 0.402675467436975 0.0 + vertex 3.6983838074778 0.503729107283718 0.2 + vertex 3.6983838074778 0.503729107283718 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 3.6983838074778 0.503729107283718 0.2 + vertex 3.70317307950846 0.503729107283718 0.0 + vertex 3.6983838074778 0.503729107283718 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 3.70317307950846 0.503729107283718 0.0 + vertex 3.6983838074778 0.503729107283718 0.2 + vertex 3.70317307950846 0.503729107283718 0.2 + endloop +endfacet +facet normal 0.596585492351885 0.802549531378132 0.0 + outer loop + vertex 3.70317307950846 0.503729107283718 0.2 + vertex 3.73023246648164 0.483614164754982 0.0 + vertex 3.70317307950846 0.503729107283718 0.0 + endloop +endfacet +facet normal 0.542091186803624 0.840319668453523 0.0 + outer loop + vertex 3.73023246648164 0.483614164754982 0.0 + vertex 3.70317307950846 0.503729107283718 0.2 + vertex 3.73023246648164 0.483614164754982 0.2 + endloop +endfacet +facet normal 0.542091186803624 0.840319668453523 0.0 + outer loop + vertex 3.73023246648164 0.483614164754982 0.2 + vertex 3.77165966954677 0.460625659007856 0.0 + vertex 3.73023246648164 0.483614164754982 0.0 + endloop +endfacet +facet normal 0.417186946688829 0.908820692718015 0.0 + outer loop + vertex 3.77165966954677 0.460625659007856 0.0 + vertex 3.73023246648164 0.483614164754982 0.2 + vertex 3.77165966954677 0.460625659007856 0.2 + endloop +endfacet +facet normal 0.417186946688829 0.908820692718015 0.0 + outer loop + vertex 3.77165966954677 0.460625659007856 0.2 + vertex 3.82218648947014 0.441947498088316 0.0 + vertex 3.77165966954677 0.460625659007856 0.0 + endloop +endfacet +facet normal 0.245174475646029 0.969478971660394 0.0 + outer loop + vertex 3.82218648947014 0.441947498088316 0.0 + vertex 3.77165966954677 0.460625659007856 0.2 + vertex 3.82218648947014 0.441947498088316 0.2 + endloop +endfacet +facet normal 0.245174475646029 0.969478971660394 0.0 + outer loop + vertex 3.82218648947014 0.441947498088316 0.2 + vertex 3.87941829023642 0.433805735636209 0.0 + vertex 3.82218648947014 0.441947498088316 0.0 + endloop +endfacet +facet normal 0.0161839307351789 0.999869031616621 0.0 + outer loop + vertex 3.87941829023642 0.433805735636209 0.0 + vertex 3.82218648947014 0.441947498088316 0.2 + vertex 3.87941829023642 0.433805735636209 0.2 + endloop +endfacet +facet normal 0.0161839307351789 0.999869031616621 0.0 + outer loop + vertex 3.87941829023642 0.433805735636209 0.2 + vertex 3.92539530173068 0.438834471268392 0.0 + vertex 3.87941829023642 0.433805735636209 0.0 + endloop +endfacet +facet normal -0.220397575605247 0.975410123315998 0.0 + outer loop + vertex 3.92539530173068 0.438834471268392 0.0 + vertex 3.87941829023642 0.433805735636209 0.2 + vertex 3.92539530173068 0.438834471268392 0.2 + endloop +endfacet +facet normal -0.220397575605247 0.975410123315998 0.0 + outer loop + vertex 3.92539530173068 0.438834471268392 0.2 + vertex 3.96179376916363 0.451526042149618 0.0 + vertex 3.92539530173068 0.438834471268392 0.0 + endloop +endfacet +facet normal -0.525168442208563 0.85099830041442 0.0 + outer loop + vertex 3.96179376916363 0.451526042149618 0.0 + vertex 3.92539530173068 0.438834471268392 0.2 + vertex 3.96179376916363 0.451526042149618 0.2 + endloop +endfacet +facet normal -0.525168442208563 0.85099830041442 0.0 + outer loop + vertex 3.96179376916363 0.451526042149618 0.2 + vertex 3.98597959291842 0.47499347509981 0.0 + vertex 3.96179376916363 0.451526042149618 0.0 + endloop +endfacet +facet normal -0.696367753757026 0.71768513397408 0.0 + outer loop + vertex 3.98597959291842 0.47499347509981 0.0 + vertex 3.96179376916363 0.451526042149618 0.2 + vertex 3.98597959291842 0.47499347509981 0.2 + endloop +endfacet +facet normal -0.999778724496402 0.021035732560287 0.0 + outer loop + vertex 3.99340296456593 0.512349796938891 0.2 + vertex 3.98597959291842 0.47499347509981 0.0 + vertex 3.98597959291842 0.47499347509981 0.2 + endloop +endfacet +facet normal -0.980821750211741 0.194906886260025 0.0 + outer loop + vertex 3.98597959291842 0.47499347509981 0.0 + vertex 3.99340296456593 0.512349796938891 0.2 + vertex 3.99340296456593 0.512349796938891 0.0 + endloop +endfacet +facet normal -0.934301067909552 -0.356484942884087 0.0 + outer loop + vertex 3.98903275383796 0.540486770118967 0.2 + vertex 3.99340296456593 0.512349796938891 0.0 + vertex 3.99340296456593 0.512349796938891 0.2 + endloop +endfacet +facet normal -0.999778724496402 0.021035732560287 0.0 + outer loop + vertex 3.99340296456593 0.512349796938891 0.0 + vertex 3.98903275383796 0.540486770118967 0.2 + vertex 3.98903275383796 0.540486770118967 0.0 + endloop +endfacet +facet normal -0.699326547675998 -0.714802336115076 0.0 + outer loop + vertex 3.97592212165405 0.560721444448469 0.2 + vertex 3.98903275383796 0.540486770118967 0.0 + vertex 3.98903275383796 0.540486770118967 0.2 + endloop +endfacet +facet normal -0.934301067909552 -0.356484942884087 0.0 + outer loop + vertex 3.98903275383796 0.540486770118967 0.0 + vertex 3.97592212165405 0.560721444448469 0.2 + vertex 3.97592212165405 0.560721444448469 0.0 + endloop +endfacet +facet normal -0.699326547675998 -0.714802336115076 0.0 + outer loop + vertex 3.97592212165405 0.560721444448469 0.2 + vertex 3.95167643199888 0.575687919544254 0.0 + vertex 3.97592212165405 0.560721444448469 0.0 + endloop +endfacet +facet normal -0.420770342017246 -0.907167194776514 0.0 + outer loop + vertex 3.95167643199888 0.575687919544254 0.0 + vertex 3.97592212165405 0.560721444448469 0.2 + vertex 3.95167643199888 0.575687919544254 0.2 + endloop +endfacet +facet normal -0.420770342017246 -0.907167194776514 0.0 + outer loop + vertex 3.95167643199888 0.575687919544254 0.2 + vertex 3.91390104885711 0.588020295023182 0.0 + vertex 3.95167643199888 0.575687919544254 0.0 + endloop +endfacet +facet normal -0.264491049691579 -0.964388140031309 0.0 + outer loop + vertex 3.91390104885711 0.588020295023182 0.0 + vertex 3.95167643199888 0.575687919544254 0.2 + vertex 3.91390104885711 0.588020295023182 0.2 + endloop +endfacet +facet normal -0.264491049691579 -0.964388140031309 0.0 + outer loop + vertex 3.91390104885711 0.588020295023182 0.2 + vertex 3.86888189176899 0.598077766287549 0.0 + vertex 3.91390104885711 0.588020295023182 0.0 + endloop +endfacet +facet normal -0.227084527668728 -0.973875052197904 0.0 + outer loop + vertex 3.86888189176899 0.598077766287549 0.0 + vertex 3.91390104885711 0.588020295023182 0.2 + vertex 3.86888189176899 0.598077766287549 0.2 + endloop +endfacet +facet normal -0.227084527668728 -0.973875052197904 0.0 + outer loop + vertex 3.86888189176899 0.598077766287549 0.2 + vertex 3.81763668104102 0.610529873567243 0.0 + vertex 3.86888189176899 0.598077766287549 0.0 + endloop +endfacet +facet normal -0.315271954457167 -0.949001367086875 0.0 + outer loop + vertex 3.81763668104102 0.610529873567243 0.0 + vertex 3.86888189176899 0.598077766287549 0.2 + vertex 3.81763668104102 0.610529873567243 0.2 + endloop +endfacet +facet normal -0.315271954457167 -0.949001367086875 0.0 + outer loop + vertex 3.81763668104102 0.610529873567243 0.2 + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.81763668104102 0.610529873567243 0.0 + endloop +endfacet +facet normal -0.53613649635636 -0.844131303337773 0.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.0 + vertex 3.81763668104102 0.610529873567243 0.2 + vertex 3.76471522510232 0.633099318011688 0.2 + endloop +endfacet +facet normal -0.53613649635636 -0.844131303337773 0.0 + outer loop + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.72855622127091 0.665367038318201 0.0 + vertex 3.76471522510232 0.633099318011688 0.0 + endloop +endfacet +facet normal -0.792360540300353 -0.610053091275614 0.0 + outer loop + vertex 3.72855622127091 0.665367038318201 0.0 + vertex 3.76471522510232 0.633099318011688 0.2 + vertex 3.72855622127091 0.665367038318201 0.2 + endloop +endfacet +facet normal -0.953631698966797 -0.300976050086549 0.0 + outer loop + vertex 3.70772288793757 0.706375180080653 0.2 + vertex 3.72855622127091 0.665367038318201 0.0 + vertex 3.72855622127091 0.665367038318201 0.2 + endloop +endfacet +facet normal -0.792360540300353 -0.610053091275614 0.0 + outer loop + vertex 3.72855622127091 0.665367038318201 0.0 + vertex 3.70772288793757 0.706375180080653 0.2 + vertex 3.70772288793757 0.706375180080653 0.0 + endloop +endfacet +facet normal -0.999771622308441 -0.0213706159655532 0.0 + outer loop + vertex 3.70077844349313 0.755165888892914 0.2 + vertex 3.70772288793757 0.706375180080653 0.0 + vertex 3.70772288793757 0.706375180080653 0.2 + endloop +endfacet +facet normal -0.953631698966797 -0.300976050086549 0.0 + outer loop + vertex 3.70772288793757 0.706375180080653 0.0 + vertex 3.70077844349313 0.755165888892914 0.2 + vertex 3.70077844349313 0.755165888892914 0.0 + endloop +endfacet +facet normal -0.978410359122527 0.206671645761406 0.0 + outer loop + vertex 3.70419079981497 0.789648647513603 0.2 + vertex 3.70077844349313 0.755165888892914 0.0 + vertex 3.70077844349313 0.755165888892914 0.2 + endloop +endfacet +facet normal -0.999771622308441 -0.0213706159655532 0.0 + outer loop + vertex 3.70077844349313 0.755165888892914 0.0 + vertex 3.70419079981497 0.789648647513603 0.2 + vertex 3.70419079981497 0.789648647513603 0.0 + endloop +endfacet +facet normal -0.907181743274203 0.420738974507922 0.0 + outer loop + vertex 3.71442786878049 0.820778915712837 0.2 + vertex 3.70419079981497 0.789648647513603 0.0 + vertex 3.70419079981497 0.789648647513603 0.2 + endloop +endfacet +facet normal -0.978410359122527 0.206671645761406 0.0 + outer loop + vertex 3.70419079981497 0.789648647513603 0.0 + vertex 3.71442786878049 0.820778915712837 0.2 + vertex 3.71442786878049 0.820778915712837 0.0 + endloop +endfacet +facet normal -0.788438815616603 0.615113187981764 0.0 + outer loop + vertex 3.73148965038968 0.848556693490615 0.2 + vertex 3.71442786878049 0.820778915712837 0.0 + vertex 3.71442786878049 0.820778915712837 0.2 + endloop +endfacet +facet normal -0.907181743274203 0.420738974507922 0.0 + outer loop + vertex 3.71442786878049 0.820778915712837 0.0 + vertex 3.73148965038968 0.848556693490615 0.2 + vertex 3.73148965038968 0.848556693490615 0.0 + endloop +endfacet +facet normal -0.640172912233049 0.768230852311372 0.0 + outer loop + vertex 3.75537614464255 0.872981980846936 0.2 + vertex 3.73148965038968 0.848556693490615 0.0 + vertex 3.73148965038968 0.848556693490615 0.2 + endloop +endfacet +facet normal -0.788438815616603 0.615113187981764 0.0 + outer loop + vertex 3.73148965038968 0.848556693490615 0.0 + vertex 3.75537614464255 0.872981980846936 0.2 + vertex 3.75537614464255 0.872981980846936 0.0 + endloop +endfacet +facet normal -0.640172912233049 0.768230852311372 0.0 + outer loop + vertex 3.75537614464255 0.872981980846936 0.2 + vertex 3.78491996648164 0.892887392724331 0.0 + vertex 3.75537614464255 0.872981980846936 0.0 + endloop +endfacet +facet normal -0.474426136288194 0.880295314770365 0.0 + outer loop + vertex 3.78491996648164 0.892887392724331 0.0 + vertex 3.75537614464255 0.872981980846936 0.2 + vertex 3.78491996648164 0.892887392724331 0.2 + endloop +endfacet +facet normal -0.474426136288194 0.880295314770365 0.0 + outer loop + vertex 3.78491996648164 0.892887392724331 0.2 + vertex 3.81895373084945 0.907105544065327 0.0 + vertex 3.78491996648164 0.892887392724331 0.0 + endloop +endfacet +facet normal -0.302036254972224 0.953296439037907 0.0 + outer loop + vertex 3.81895373084945 0.907105544065327 0.0 + vertex 3.78491996648164 0.892887392724331 0.2 + vertex 3.81895373084945 0.907105544065327 0.2 + endloop +endfacet +facet normal -0.302036254972224 0.953296439037907 0.0 + outer loop + vertex 3.81895373084945 0.907105544065327 0.2 + vertex 3.857477437746 0.915636434869925 0.0 + vertex 3.81895373084945 0.907105544065327 0.0 + endloop +endfacet +facet normal -0.141494696370883 0.989939013727064 0.0 + outer loop + vertex 3.857477437746 0.915636434869925 0.0 + vertex 3.81895373084945 0.907105544065327 0.2 + vertex 3.857477437746 0.915636434869925 0.2 + endloop +endfacet +facet normal -0.141494696370883 0.989939013727064 0.0 + outer loop + vertex 3.857477437746 0.915636434869925 0.2 + vertex 3.90049108717129 0.918480065138124 0.0 + vertex 3.857477437746 0.915636434869925 0.0 + endloop +endfacet +facet normal 0.0281793303801236 0.999602883819034 0.0 + outer loop + vertex 3.90049108717129 0.918480065138124 0.0 + vertex 3.857477437746 0.915636434869925 0.2 + vertex 3.90049108717129 0.918480065138124 0.2 + endloop +endfacet +facet normal 0.0281793303801236 0.999602883819034 0.0 + outer loop + vertex 3.90049108717129 0.918480065138124 0.2 + vertex 3.99005047414447 0.907464739467626 0.0 + vertex 3.90049108717129 0.918480065138124 0.0 + endloop +endfacet +facet normal 0.234883143477802 0.972023615407561 0.0 + outer loop + vertex 3.99005047414447 0.907464739467626 0.0 + vertex 3.90049108717129 0.918480065138124 0.2 + vertex 3.99005047414447 0.907464739467626 0.2 + endloop +endfacet +facet normal 0.234883143477802 0.972023615407561 0.0 + outer loop + vertex 3.99005047414447 0.907464739467626 0.2 + vertex 4.06572097222876 0.879686961689848 0.0 + vertex 3.99005047414447 0.907464739467626 0.0 + endloop +endfacet +facet normal 0.344603779779219 0.938748227674426 0.0 + outer loop + vertex 4.06572097222876 0.879686961689848 0.0 + vertex 3.99005047414447 0.907464739467626 0.2 + vertex 4.06572097222876 0.879686961689848 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.06572097222876 0.879686961689848 0.0 + vertex 4.06572097222876 0.783422593873756 0.2 + vertex 4.06572097222876 0.783422593873756 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.06572097222876 0.783422593873756 0.2 + vertex 4.06572097222876 0.879686961689848 0.0 + vertex 4.06572097222876 0.879686961689848 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.06572097222876 0.783422593873756 0.2 + vertex 4.06093170019811 0.783422593873756 0.0 + vertex 4.06572097222876 0.783422593873756 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.06093170019811 0.783422593873756 0.0 + vertex 4.06572097222876 0.783422593873756 0.2 + vertex 4.06093170019811 0.783422593873756 0.2 + endloop +endfacet +facet normal -0.556587638965561 -0.830788902279479 0.0 + outer loop + vertex 4.06093170019811 0.783422593873756 0.2 + vertex 4.02447336686478 0.807847881230078 0.0 + vertex 4.06093170019811 0.783422593873756 0.0 + endloop +endfacet +facet normal -0.489592222603488 -0.871951521339447 0.0 + outer loop + vertex 4.02447336686478 0.807847881230078 0.0 + vertex 4.06093170019811 0.783422593873756 0.2 + vertex 4.02447336686478 0.807847881230078 0.2 + endloop +endfacet +facet normal -0.489592222603488 -0.871951521339447 0.0 + outer loop + vertex 4.02447336686478 0.807847881230078 0.2 + vertex 3.98406388410616 0.826526042149619 0.0 + vertex 4.02447336686478 0.807847881230078 0.0 + endloop +endfacet +facet normal -0.345043802382217 -0.938586583346268 0.0 + outer loop + vertex 3.98406388410616 0.826526042149619 0.0 + vertex 4.02447336686478 0.807847881230078 0.2 + vertex 3.98406388410616 0.826526042149619 0.2 + endloop +endfacet +facet normal -0.345043802382217 -0.938586583346268 0.0 + outer loop + vertex 3.98406388410616 0.826526042149619 0.2 + vertex 3.94149922893374 0.838379490425481 0.0 + vertex 3.98406388410616 0.826526042149619 0.0 + endloop +endfacet +facet normal -0.180697484689396 -0.983538722688093 0.0 + outer loop + vertex 3.94149922893374 0.838379490425481 0.0 + vertex 3.98406388410616 0.826526042149619 0.2 + vertex 3.94149922893374 0.838379490425481 0.2 + endloop +endfacet +facet normal -0.180697484689396 -0.983538722688093 0.0 + outer loop + vertex 3.94149922893374 0.838379490425481 0.2 + vertex 3.89857537835903 0.842330639850768 0.0 + vertex 3.94149922893374 0.838379490425481 0.0 + endloop +endfacet +facet normal 0.0107122258632747 -0.999942622462436 0.0 + outer loop + vertex 3.89857537835903 0.842330639850768 0.0 + vertex 3.94149922893374 0.838379490425481 0.2 + vertex 3.89857537835903 0.842330639850768 0.2 + endloop +endfacet +facet normal 0.0107122258632747 -0.999942622462436 0.0 + outer loop + vertex 3.89857537835903 0.842330639850768 0.2 + vertex 3.85750737069619 0.837661099620883 0.0 + vertex 3.89857537835903 0.842330639850768 0.0 + endloop +endfacet +facet normal 0.24874281702269 -0.968569569509396 0.0 + outer loop + vertex 3.85750737069619 0.837661099620883 0.0 + vertex 3.89857537835903 0.842330639850768 0.2 + vertex 3.85750737069619 0.837661099620883 0.2 + endloop +endfacet +facet normal 0.24874281702269 -0.968569569509396 0.0 + outer loop + vertex 3.85750737069619 0.837661099620883 0.2 + vertex 3.8233838074778 0.823652478931228 0.0 + vertex 3.85750737069619 0.837661099620883 0.0 + endloop +endfacet +facet normal 0.558542313018932 -0.829476030134362 0.0 + outer loop + vertex 3.8233838074778 0.823652478931228 0.0 + vertex 3.85750737069619 0.837661099620883 0.2 + vertex 3.8233838074778 0.823652478931228 0.2 + endloop +endfacet +facet normal 0.558542313018932 -0.829476030134362 0.0 + outer loop + vertex 3.8233838074778 0.823652478931228 0.0 + vertex 3.80039530173068 0.800185045981036 0.2 + vertex 3.80039530173068 0.800185045981036 0.0 + endloop +endfacet +facet normal 0.714358581375118 -0.699779834816444 0.0 + outer loop + vertex 3.80039530173068 0.800185045981036 0.2 + vertex 3.8233838074778 0.823652478931228 0.0 + vertex 3.8233838074778 0.823652478931228 0.2 + endloop +endfacet +facet normal 0.974152703703863 -0.225890482018285 0.0 + outer loop + vertex 3.80039530173068 0.800185045981036 0.0 + vertex 3.79273246648164 0.767139068969542 0.2 + vertex 3.79273246648164 0.767139068969542 0.0 + endloop +endfacet +facet normal 0.99932164254674 -0.0368273639796066 0.0 + outer loop + vertex 3.79273246648164 0.767139068969542 0.2 + vertex 3.80039530173068 0.800185045981036 0.0 + vertex 3.80039530173068 0.800185045981036 0.2 + endloop +endfacet +facet normal 0.99932164254674 -0.0368273639796066 0.0 + outer loop + vertex 3.79273246648164 0.767139068969542 0.0 + vertex 3.79728227491075 0.737864643682186 0.2 + vertex 3.79728227491075 0.737864643682186 0.0 + endloop +endfacet +facet normal 0.933137120913151 0.359520671970215 0.0 + outer loop + vertex 3.79728227491075 0.737864643682186 0.2 + vertex 3.79273246648164 0.767139068969542 0.0 + vertex 3.79273246648164 0.767139068969542 0.2 + endloop +endfacet +facet normal 0.933137120913151 0.359520671970215 0.0 + outer loop + vertex 3.79728227491075 0.737864643682186 0.0 + vertex 3.81093170019811 0.717091176249235 0.2 + vertex 3.81093170019811 0.717091176249235 0.0 + endloop +endfacet +facet normal 0.701287328298952 0.712878729635916 0.0 + outer loop + vertex 3.81093170019811 0.717091176249235 0.2 + vertex 3.79728227491075 0.737864643682186 0.0 + vertex 3.79728227491075 0.737864643682186 0.2 + endloop +endfacet +facet normal 0.701287328298952 0.712878729635916 0.0 + outer loop + vertex 3.81093170019811 0.717091176249235 0.2 + vertex 3.83463859674983 0.702064835253067 0.0 + vertex 3.81093170019811 0.717091176249235 0.0 + endloop +endfacet +facet normal 0.434303289715712 0.900766702616227 0.0 + outer loop + vertex 3.83463859674983 0.702064835253067 0.0 + vertex 3.81093170019811 0.717091176249235 0.2 + vertex 3.83463859674983 0.702064835253067 0.2 + endloop +endfacet +facet normal 0.434303289715712 0.900766702616227 0.0 + outer loop + vertex 3.83463859674983 0.702064835253067 0.2 + vertex 3.86936081897206 0.690031789276055 0.0 + vertex 3.83463859674983 0.702064835253067 0.0 + endloop +endfacet +facet normal 0.27617167833275 0.961108320683404 0.0 + outer loop + vertex 3.86936081897206 0.690031789276055 0.0 + vertex 3.83463859674983 0.702064835253067 0.2 + vertex 3.86936081897206 0.690031789276055 0.2 + endloop +endfacet +facet normal 0.27617167833275 0.961108320683404 0.0 + outer loop + vertex 3.86936081897206 0.690031789276055 0.2 + vertex 3.91414051245865 0.679734854410155 0.0 + vertex 3.86936081897206 0.690031789276055 0.0 + endloop +endfacet +facet normal 0.222179963498852 0.975005673737158 0.0 + outer loop + vertex 3.91414051245865 0.679734854410155 0.0 + vertex 3.86936081897206 0.690031789276055 0.2 + vertex 3.91414051245865 0.679734854410155 0.2 + endloop +endfacet +facet normal 0.222179963498852 0.975005673737158 0.0 + outer loop + vertex 3.91414051245865 0.679734854410155 0.2 + vertex 3.96610411399121 0.668001137935059 0.0 + vertex 3.91414051245865 0.679734854410155 0.0 + endloop +endfacet +facet normal 0.288350612204699 0.95752489494591 0.0 + outer loop + vertex 3.96610411399121 0.668001137935059 0.0 + vertex 3.91414051245865 0.679734854410155 0.2 + vertex 3.96610411399121 0.668001137935059 0.2 + endloop +endfacet +facet normal 0.288350612204699 0.95752489494591 0.0 + outer loop + vertex 3.96610411399121 0.668001137935059 0.2 + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 3.96610411399121 0.668001137935059 0.0 + endloop +endfacet +facet normal 0.493989893056549 0.869467644917267 0.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.0 + vertex 3.96610411399121 0.668001137935059 0.2 + vertex 4.01812758142416 0.648245390808622 0.2 + endloop +endfacet +facet normal 0.493989893056549 0.869467644917267 0.0 + outer loop + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.01812758142416 0.648245390808622 0.0 + endloop +endfacet +facet normal 0.763439764736457 0.645879033271048 0.0 + outer loop + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.01812758142416 0.648245390808622 0.2 + vertex 4.05542403736286 0.61867163601935 0.2 + endloop +endfacet +facet normal 0.763439764736457 0.645879033271048 0.0 + outer loop + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.07787375000654 0.577962823758814 0.2 + vertex 4.07787375000654 0.577962823758814 0.0 + endloop +endfacet +facet normal 0.948633107227256 0.316378298674802 0.0 + outer loop + vertex 4.07787375000654 0.577962823758814 0.2 + vertex 4.05542403736286 0.61867163601935 0.0 + vertex 4.05542403736286 0.61867163601935 0.2 + endloop +endfacet +facet normal 0.948633107227256 0.316378298674802 0.0 + outer loop + vertex 4.07787375000654 0.577962823758814 0.0 + vertex 4.08535698755443 0.524801904218584 0.2 + vertex 4.08535698755443 0.524801904218584 0.0 + endloop +endfacet +facet normal 0.999813856156834 0.0192938600803773 0.0 + outer loop + vertex 4.08535698755443 0.524801904218584 0.2 + vertex 4.07787375000654 0.577962823758814 0.0 + vertex 4.07787375000654 0.577962823758814 0.2 + endloop +endfacet +facet normal 0.999813856156834 0.0192938600803773 0.0 + outer loop + vertex 4.08535698755443 0.524801904218584 0.0 + vertex 4.08194463123259 0.491217134103642 0.2 + vertex 4.08194463123259 0.491217134103642 0.0 + endloop +endfacet +facet normal 0.978774660177288 -0.204939416889078 0.0 + outer loop + vertex 4.08194463123259 0.491217134103642 0.2 + vertex 4.08535698755443 0.524801904218584 0.0 + vertex 4.08535698755443 0.524801904218584 0.2 + endloop +endfacet +facet normal 0.978774660177288 -0.204939416889078 0.0 + outer loop + vertex 4.08194463123259 0.491217134103642 0.0 + vertex 4.07170756226708 0.459428341000193 0.2 + vertex 4.07170756226708 0.459428341000193 0.0 + endloop +endfacet +facet normal 0.912663557218166 -0.408711672607822 0.0 + outer loop + vertex 4.07170756226708 0.459428341000193 0.2 + vertex 4.08194463123259 0.491217134103642 0.0 + vertex 4.08194463123259 0.491217134103642 0.2 + endloop +endfacet +facet normal 0.912663557218166 -0.408711672607822 0.0 + outer loop + vertex 4.07170756226708 0.459428341000193 0.0 + vertex 4.05488524425941 0.430752574716668 0.2 + vertex 4.05488524425941 0.430752574716668 0.0 + endloop +endfacet +facet normal 0.798133217875601 -0.60248100926381 0.0 + outer loop + vertex 4.05488524425941 0.430752574716668 0.2 + vertex 4.07170756226708 0.459428341000193 0.0 + vertex 4.07170756226708 0.459428341000193 0.2 + endloop +endfacet +facet normal 0.798133217875601 -0.60248100926381 0.0 + outer loop + vertex 4.05488524425941 0.430752574716668 0.0 + vertex 4.03171714081114 0.406506885061496 0.2 + vertex 4.03171714081114 0.406506885061496 0.0 + endloop +endfacet +facet normal 0.648537069293553 -0.761183072428787 0.0 + outer loop + vertex 4.03171714081114 0.406506885061496 0.2 + vertex 4.05488524425941 0.430752574716668 0.0 + vertex 4.05488524425941 0.430752574716668 0.2 + endloop +endfacet +facet normal 0.648537069293553 -0.761183072428787 0.0 + outer loop + vertex 4.03171714081114 0.406506885061496 0.2 + vertex 4.00112566571535 0.38543408812663 0.0 + vertex 4.03171714081114 0.406506885061496 0.0 + endloop +endfacet +facet normal 0.489645436592736 -0.871921640070889 0.0 + outer loop + vertex 4.00112566571535 0.38543408812663 0.0 + vertex 4.03171714081114 0.406506885061496 0.2 + vertex 4.00112566571535 0.38543408812663 0.2 + endloop +endfacet +facet normal 0.489645436592736 -0.871921640070889 0.0 + outer loop + vertex 4.00112566571535 0.38543408812663 0.2 + vertex 3.96682250479581 0.370108417628546 0.0 + vertex 4.00112566571535 0.38543408812663 0.0 + endloop +endfacet +facet normal 0.317107169365693 -0.948389710581509 0.0 + outer loop + vertex 3.96682250479581 0.370108417628546 0.0 + vertex 4.00112566571535 0.38543408812663 0.2 + vertex 3.96682250479581 0.370108417628546 0.2 + endloop +endfacet +facet normal 0.317107169365693 -0.948389710581509 0.0 + outer loop + vertex 3.96682250479581 0.370108417628546 0.2 + vertex 3.92605382663489 0.360769337168776 0.0 + vertex 3.96682250479581 0.370108417628546 0.0 + endloop +endfacet +facet normal 0.143198383976245 -0.989694004643148 0.0 + outer loop + vertex 3.92605382663489 0.360769337168776 0.0 + vertex 3.96682250479581 0.370108417628546 0.2 + vertex 3.92605382663489 0.360769337168776 0.2 + endloop +endfacet +facet normal 0.143198383976245 -0.989694004643148 0.0 + outer loop + vertex 3.92605382663489 0.360769337168776 0.2 + vertex 3.87606579981497 0.357656310348852 0.0 + vertex 3.92605382663489 0.360769337168776 0.0 + endloop +endfacet +facet normal -0.0034494236932481 -0.999994050720395 0.0 + outer loop + vertex 3.87606579981497 0.357656310348852 0.0 + vertex 3.92605382663489 0.360769337168776 0.2 + vertex 3.87606579981497 0.357656310348852 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.13684166188393 0.571078245214753 0.2 + vertex 4.13702125958508 0.702962823758814 0.2 + vertex 4.13229185345481 0.63734979693889 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.13702125958508 0.702962823758814 0.2 + vertex 4.13684166188393 0.571078245214753 0.2 + vertex 4.15049108717129 0.514026042149619 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.13702125958508 0.702962823758814 0.2 + vertex 4.15049108717129 0.514026042149619 0.2 + vertex 4.15120947797589 0.758997306517435 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.15120947797589 0.758997306517435 0.2 + vertex 4.15049108717129 0.514026042149619 0.2 + vertex 4.17240200671152 0.466073455942722 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.15120947797589 0.758997306517435 0.2 + vertex 4.17240200671152 0.466073455942722 0.2 + vertex 4.17329999521727 0.80617163601935 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.17329999521727 0.80617163601935 0.2 + vertex 4.17240200671152 0.466073455942722 0.2 + vertex 4.20173629789926 0.427100754793297 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.17329999521727 0.80617163601935 0.2 + vertex 4.20173629789926 0.427100754793297 0.2 + vertex 4.20173629789926 0.845204203069159 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.20173629789926 0.845204203069159 0.2 + vertex 4.20173629789926 0.427100754793297 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.20173629789926 0.845204203069159 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.22568265805252 0.63734979693889 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.22568265805252 0.63734979693889 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.2282419252939 0.592555136977205 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.2282419252939 0.592555136977205 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.23591972701803 0.552998743299044 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.23591972701803 0.552998743299044 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.24871606322493 0.518680615904408 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.24871606322493 0.518680615904408 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.28075928640501 0.375616080463795 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.24871606322493 0.518680615904408 0.2 + vertex 4.28075928640501 0.375616080463795 0.2 + vertex 4.26663093391458 0.489600754793297 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.26663093391458 0.489600754793297 0.2 + vertex 4.28075928640501 0.375616080463795 0.2 + vertex 4.28909561303336 0.466447617820117 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.28909561303336 0.466447617820117 0.2 + vertex 4.28075928640501 0.375616080463795 0.2 + vertex 4.32901120211382 0.362864643682186 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.28909561303336 0.466447617820117 0.2 + vertex 4.32901120211382 0.362864643682186 0.2 + vertex 4.31554137452761 0.449909662839274 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.31554137452761 0.449909662839274 0.2 + vertex 4.32901120211382 0.362864643682186 0.2 + vertex 4.34596821839734 0.439986889850768 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.34596821839734 0.439986889850768 0.2 + vertex 4.32901120211382 0.362864643682186 0.2 + vertex 4.38181292625175 0.358614164754983 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.34596821839734 0.439986889850768 0.2 + vertex 4.38181292625175 0.358614164754983 0.2 + vertex 4.38037614464255 0.436679298854599 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.38037614464255 0.436679298854599 0.2 + vertex 4.38181292625175 0.358614164754983 0.2 + vertex 4.42335986111765 0.441229107283718 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.42335986111765 0.441229107283718 0.2 + vertex 4.38181292625175 0.358614164754983 0.2 + vertex 4.42874779215213 0.362206118777971 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.42335986111765 0.441229107283718 0.2 + vertex 4.42874779215213 0.362206118777971 0.2 + vertex 4.46418840517895 0.454878532571074 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.46418840517895 0.454878532571074 0.2 + vertex 4.42874779215213 0.362206118777971 0.2 + vertex 4.46993553161574 0.372503053643871 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.46418840517895 0.454878532571074 0.2 + vertex 4.46993553161574 0.372503053643871 0.2 + vertex 4.5016644588188 0.475711865904408 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.5016644588188 0.475711865904408 0.2 + vertex 4.46993553161574 0.372503053643871 0.2 + vertex 4.50633399904869 0.385673551728163 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.5016644588188 0.475711865904408 0.2 + vertex 4.50633399904869 0.385673551728163 0.2 + vertex 4.53459070402953 0.501813398471458 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.53459070402953 0.501813398471458 0.2 + vertex 4.50633399904869 0.385673551728163 0.2 + vertex 4.53985890326324 0.400759758624714 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.53459070402953 0.501813398471458 0.2 + vertex 4.53985890326324 0.400759758624714 0.2 + vertex 4.53985890326324 0.501813398471458 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.22568265805252 0.63734979693889 0.2 + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.20173629789926 0.845204203069159 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.22568265805252 0.63734979693889 0.2 + vertex 4.22833172414447 0.68298257950594 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.22833172414447 0.68298257950594 0.2 + vertex 4.23627892242033 0.723137632187933 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.23627892242033 0.723137632187933 0.2 + vertex 4.2495242528801 0.757814954984868 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.2495242528801 0.757814954984868 0.2 + vertex 4.28051982280347 0.899083513413986 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.28051982280347 0.899083513413986 0.2 + vertex 4.2495242528801 0.757814954984868 0.2 + vertex 4.26806771552378 0.787014547896745 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.28051982280347 0.899083513413986 0.2 + vertex 4.26806771552378 0.787014547896745 0.2 + vertex 4.29098138889543 0.810167684869925 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.28051982280347 0.899083513413986 0.2 + vertex 4.29098138889543 0.810167684869925 0.2 + vertex 4.3294302634165 0.913271731804791 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.3294302634165 0.913271731804791 0.2 + vertex 4.29098138889543 0.810167684869925 0.2 + vertex 4.31733735153911 0.826705639850768 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.3294302634165 0.913271731804791 0.2 + vertex 4.31733735153911 0.826705639850768 0.2 + vertex 4.34713560345482 0.836628412839274 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.3294302634165 0.913271731804791 0.2 + vertex 4.34713560345482 0.836628412839274 0.2 + vertex 4.38181292625175 0.918001137935059 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.38181292625175 0.918001137935059 0.2 + vertex 4.34713560345482 0.836628412839274 0.2 + vertex 4.38037614464255 0.839936003835442 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.38181292625175 0.918001137935059 0.2 + vertex 4.38037614464255 0.839936003835442 0.2 + vertex 4.4292267193552 0.832752095789465 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.38181292625175 0.918001137935059 0.2 + vertex 4.4292267193552 0.832752095789465 0.2 + vertex 4.42509597222876 0.914888111115136 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.42509597222876 0.914888111115136 0.2 + vertex 4.4292267193552 0.832752095789465 0.2 + vertex 4.46682250479581 0.905549030655366 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.46682250479581 0.905549030655366 0.2 + vertex 4.4292267193552 0.832752095789465 0.2 + vertex 4.47328802203719 0.815989643682186 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.46682250479581 0.905549030655366 0.2 + vertex 4.47328802203719 0.815989643682186 0.2 + vertex 4.53985890326324 0.876813398471458 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.53985890326324 0.876813398471458 0.2 + vertex 4.47328802203719 0.815989643682186 0.2 + vertex 4.50992595307167 0.794437919544255 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.53985890326324 0.876813398471458 0.2 + vertex 4.50992595307167 0.794437919544255 0.2 + vertex 4.53459070402953 0.775759758624714 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.53985890326324 0.876813398471458 0.2 + vertex 4.53459070402953 0.775759758624714 0.2 + vertex 4.53985890326324 0.775759758624714 0.2 + endloop +endfacet +facet normal -0.00197196685745208 -0.999998055671466 0.0 + outer loop + vertex 4.38181292625175 0.358614164754983 0.2 + vertex 4.32901120211382 0.362864643682186 0.0 + vertex 4.38181292625175 0.358614164754983 0.0 + endloop +endfacet +facet normal -0.168535418585088 -0.985695598388442 0.0 + outer loop + vertex 4.32901120211382 0.362864643682186 0.0 + vertex 4.38181292625175 0.358614164754983 0.2 + vertex 4.32901120211382 0.362864643682186 0.2 + endloop +endfacet +facet normal -0.168535418585088 -0.985695598388442 0.0 + outer loop + vertex 4.32901120211382 0.362864643682186 0.2 + vertex 4.28075928640501 0.375616080463795 0.0 + vertex 4.32901120211382 0.362864643682186 0.0 + endloop +endfacet +facet normal -0.35321427508086 -0.935542450067929 0.0 + outer loop + vertex 4.28075928640501 0.375616080463795 0.0 + vertex 4.32901120211382 0.362864643682186 0.2 + vertex 4.28075928640501 0.375616080463795 0.2 + endloop +endfacet +facet normal -0.35321427508086 -0.935542450067929 0.0 + outer loop + vertex 4.28075928640501 0.375616080463795 0.2 + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.28075928640501 0.375616080463795 0.0 + endloop +endfacet +facet normal -0.54653206616668 -0.837438177211655 0.0 + outer loop + vertex 4.23801503353144 0.396988206900576 0.0 + vertex 4.28075928640501 0.375616080463795 0.2 + vertex 4.23801503353144 0.396988206900576 0.2 + endloop +endfacet +facet normal -0.54653206616668 -0.837438177211655 0.0 + outer loop + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.23801503353144 0.396988206900576 0.0 + endloop +endfacet +facet normal -0.723723054552945 -0.690090530516507 0.0 + outer loop + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.23801503353144 0.396988206900576 0.2 + vertex 4.20173629789926 0.427100754793297 0.2 + endloop +endfacet +facet normal -0.859293185167977 -0.51148335449345 0.0 + outer loop + vertex 4.17240200671152 0.466073455942722 0.2 + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.20173629789926 0.427100754793297 0.2 + endloop +endfacet +facet normal -0.723723054552945 -0.690090530516507 0.0 + outer loop + vertex 4.20173629789926 0.427100754793297 0.0 + vertex 4.17240200671152 0.466073455942722 0.2 + vertex 4.17240200671152 0.466073455942722 0.0 + endloop +endfacet +facet normal -0.945484976783479 -0.325665716151923 0.0 + outer loop + vertex 4.15049108717129 0.514026042149619 0.2 + vertex 4.17240200671152 0.466073455942722 0.0 + vertex 4.17240200671152 0.466073455942722 0.2 + endloop +endfacet +facet normal -0.859293185167977 -0.51148335449345 0.0 + outer loop + vertex 4.17240200671152 0.466073455942722 0.0 + vertex 4.15049108717129 0.514026042149619 0.2 + vertex 4.15049108717129 0.514026042149619 0.0 + endloop +endfacet +facet normal -0.988517345545667 -0.151107437127855 0.0 + outer loop + vertex 4.13684166188393 0.571078245214753 0.2 + vertex 4.15049108717129 0.514026042149619 0.0 + vertex 4.15049108717129 0.514026042149619 0.2 + endloop +endfacet +facet normal -0.945484976783479 -0.325665716151923 0.0 + outer loop + vertex 4.15049108717129 0.514026042149619 0.0 + vertex 4.13684166188393 0.571078245214753 0.2 + vertex 4.13684166188393 0.571078245214753 0.0 + endloop +endfacet +facet normal -0.999998547010283 0.00170469273558899 0.0 + outer loop + vertex 4.13229185345481 0.63734979693889 0.2 + vertex 4.13684166188393 0.571078245214753 0.0 + vertex 4.13684166188393 0.571078245214753 0.2 + endloop +endfacet +facet normal -0.988517345545667 -0.151107437127855 0.0 + outer loop + vertex 4.13684166188393 0.571078245214753 0.0 + vertex 4.13229185345481 0.63734979693889 0.2 + vertex 4.13229185345481 0.63734979693889 0.0 + endloop +endfacet +facet normal -0.987231360085845 0.159292942916666 0.0 + outer loop + vertex 4.13702125958508 0.702962823758814 0.2 + vertex 4.13229185345481 0.63734979693889 0.0 + vertex 4.13229185345481 0.63734979693889 0.2 + endloop +endfacet +facet normal -0.999998547010283 0.00170469273558899 0.0 + outer loop + vertex 4.13229185345481 0.63734979693889 0.0 + vertex 4.13702125958508 0.702962823758814 0.2 + vertex 4.13702125958508 0.702962823758814 0.0 + endloop +endfacet +facet normal -0.941760169938163 0.336285269255199 0.0 + outer loop + vertex 4.15120947797589 0.758997306517435 0.2 + vertex 4.13702125958508 0.702962823758814 0.0 + vertex 4.13702125958508 0.702962823758814 0.2 + endloop +endfacet +facet normal -0.987231360085845 0.159292942916666 0.0 + outer loop + vertex 4.13702125958508 0.702962823758814 0.0 + vertex 4.15120947797589 0.758997306517435 0.2 + vertex 4.15120947797589 0.758997306517435 0.0 + endloop +endfacet +facet normal -0.860889261127337 0.508792374231009 0.0 + outer loop + vertex 4.17329999521727 0.80617163601935 0.2 + vertex 4.15120947797589 0.758997306517435 0.0 + vertex 4.15120947797589 0.758997306517435 0.2 + endloop +endfacet +facet normal -0.941760169938163 0.336285269255199 0.0 + outer loop + vertex 4.15120947797589 0.758997306517435 0.0 + vertex 4.17329999521727 0.80617163601935 0.2 + vertex 4.17329999521727 0.80617163601935 0.0 + endloop +endfacet +facet normal -0.737329141670924 0.675533668178588 0.0 + outer loop + vertex 4.20173629789926 0.845204203069159 0.2 + vertex 4.17329999521727 0.80617163601935 0.0 + vertex 4.17329999521727 0.80617163601935 0.2 + endloop +endfacet +facet normal -0.860889261127337 0.508792374231009 0.0 + outer loop + vertex 4.17329999521727 0.80617163601935 0.0 + vertex 4.20173629789926 0.845204203069159 0.2 + vertex 4.20173629789926 0.845204203069159 0.0 + endloop +endfacet +facet normal -0.737329141670924 0.675533668178588 0.0 + outer loop + vertex 4.20173629789926 0.845204203069159 0.2 + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.20173629789926 0.845204203069159 0.0 + endloop +endfacet +facet normal -0.566370220686766 0.824150940737936 0.0 + outer loop + vertex 4.23723677682646 0.876154873567243 0.0 + vertex 4.20173629789926 0.845204203069159 0.2 + vertex 4.23723677682646 0.876154873567243 0.2 + endloop +endfacet +facet normal -0.566370220686766 0.824150940737936 0.0 + outer loop + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.28051982280347 0.899083513413986 0.0 + vertex 4.23723677682646 0.876154873567243 0.0 + endloop +endfacet +facet normal -0.3753227198207 0.926894198917218 0.0 + outer loop + vertex 4.28051982280347 0.899083513413986 0.0 + vertex 4.23723677682646 0.876154873567243 0.2 + vertex 4.28051982280347 0.899083513413986 0.2 + endloop +endfacet +facet normal -0.3753227198207 0.926894198917218 0.0 + outer loop + vertex 4.28051982280347 0.899083513413986 0.2 + vertex 4.3294302634165 0.913271731804791 0.0 + vertex 4.28051982280347 0.899083513413986 0.0 + endloop +endfacet +facet normal -0.185115133291196 0.982716839901801 0.0 + outer loop + vertex 4.3294302634165 0.913271731804791 0.0 + vertex 4.28051982280347 0.899083513413986 0.2 + vertex 4.3294302634165 0.913271731804791 0.2 + endloop +endfacet +facet normal -0.185115133291196 0.982716839901801 0.0 + outer loop + vertex 4.3294302634165 0.913271731804791 0.2 + vertex 4.38181292625175 0.918001137935059 0.0 + vertex 4.3294302634165 0.913271731804791 0.0 + endloop +endfacet +facet normal -0.00912120952563407 0.999958400903152 0.0 + outer loop + vertex 4.38181292625175 0.918001137935059 0.0 + vertex 4.3294302634165 0.913271731804791 0.2 + vertex 4.38181292625175 0.918001137935059 0.2 + endloop +endfacet +facet normal -0.00912120952563407 0.999958400903152 0.0 + outer loop + vertex 4.38181292625175 0.918001137935059 0.2 + vertex 4.42509597222876 0.914888111115136 0.0 + vertex 4.38181292625175 0.918001137935059 0.0 + endloop +endfacet +facet normal 0.145475165786851 0.989361903521299 0.0 + outer loop + vertex 4.42509597222876 0.914888111115136 0.0 + vertex 4.38181292625175 0.918001137935059 0.2 + vertex 4.42509597222876 0.914888111115136 0.2 + endloop +endfacet +facet normal 0.145475165786851 0.989361903521299 0.0 + outer loop + vertex 4.42509597222876 0.914888111115136 0.2 + vertex 4.46682250479581 0.905549030655366 0.0 + vertex 4.42509597222876 0.914888111115136 0.0 + endloop +endfacet +facet normal 0.293144455107609 0.956068160979992 0.0 + outer loop + vertex 4.46682250479581 0.905549030655366 0.0 + vertex 4.42509597222876 0.914888111115136 0.2 + vertex 4.46682250479581 0.905549030655366 0.2 + endloop +endfacet +facet normal 0.293144455107609 0.956068160979992 0.0 + outer loop + vertex 4.46682250479581 0.905549030655366 0.2 + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.46682250479581 0.905549030655366 0.0 + endloop +endfacet +facet normal 0.366124308864546 0.930565951697385 0.0 + outer loop + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.46682250479581 0.905549030655366 0.2 + vertex 4.53985890326324 0.876813398471458 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.53985890326324 0.775759758624714 0.2 + vertex 4.53985890326324 0.775759758624714 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.53985890326324 0.775759758624714 0.2 + vertex 4.53985890326324 0.876813398471458 0.0 + vertex 4.53985890326324 0.876813398471458 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.53985890326324 0.775759758624714 0.2 + vertex 4.53459070402953 0.775759758624714 0.0 + vertex 4.53985890326324 0.775759758624714 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.53459070402953 0.775759758624714 0.0 + vertex 4.53985890326324 0.775759758624714 0.2 + vertex 4.53459070402953 0.775759758624714 0.2 + endloop +endfacet +facet normal -0.603708660405246 -0.797205025919747 0.0 + outer loop + vertex 4.53459070402953 0.775759758624714 0.2 + vertex 4.50992595307167 0.794437919544255 0.0 + vertex 4.53459070402953 0.775759758624714 0.0 + endloop +endfacet +facet normal -0.556306638945698 -0.830977089614955 0.0 + outer loop + vertex 4.50992595307167 0.794437919544255 0.0 + vertex 4.53459070402953 0.775759758624714 0.2 + vertex 4.50992595307167 0.794437919544255 0.2 + endloop +endfacet +facet normal -0.556306638945698 -0.830977089614955 0.0 + outer loop + vertex 4.50992595307167 0.794437919544255 0.2 + vertex 4.47328802203719 0.815989643682186 0.0 + vertex 4.50992595307167 0.794437919544255 0.0 + endloop +endfacet +facet normal -0.43282617311797 -0.901477400639668 0.0 + outer loop + vertex 4.47328802203719 0.815989643682186 0.0 + vertex 4.50992595307167 0.794437919544255 0.2 + vertex 4.47328802203719 0.815989643682186 0.2 + endloop +endfacet +facet normal -0.43282617311797 -0.901477400639668 0.0 + outer loop + vertex 4.47328802203719 0.815989643682186 0.2 + vertex 4.4292267193552 0.832752095789465 0.0 + vertex 4.47328802203719 0.815989643682186 0.0 + endloop +endfacet +facet normal -0.252022420714891 -0.967721395576747 0.0 + outer loop + vertex 4.4292267193552 0.832752095789465 0.0 + vertex 4.47328802203719 0.815989643682186 0.2 + vertex 4.4292267193552 0.832752095789465 0.2 + endloop +endfacet +facet normal -0.252022420714891 -0.967721395576747 0.0 + outer loop + vertex 4.4292267193552 0.832752095789465 0.2 + vertex 4.38037614464255 0.839936003835442 0.0 + vertex 4.4292267193552 0.832752095789465 0.0 + endloop +endfacet +facet normal -0.0234148588877288 -0.999725834608303 0.0 + outer loop + vertex 4.38037614464255 0.839936003835442 0.0 + vertex 4.4292267193552 0.832752095789465 0.2 + vertex 4.38037614464255 0.839936003835442 0.2 + endloop +endfacet +facet normal -0.0234148588877288 -0.999725834608303 0.0 + outer loop + vertex 4.38037614464255 0.839936003835442 0.2 + vertex 4.34713560345482 0.836628412839274 0.0 + vertex 4.38037614464255 0.839936003835442 0.0 + endloop +endfacet +facet normal 0.208766711475163 -0.977965469830017 0.0 + outer loop + vertex 4.34713560345482 0.836628412839274 0.0 + vertex 4.38037614464255 0.839936003835442 0.2 + vertex 4.34713560345482 0.836628412839274 0.2 + endloop +endfacet +facet normal 0.208766711475163 -0.977965469830017 0.0 + outer loop + vertex 4.34713560345482 0.836628412839274 0.2 + vertex 4.31733735153911 0.826705639850768 0.0 + vertex 4.34713560345482 0.836628412839274 0.0 + endloop +endfacet +facet normal 0.426768496452843 -0.904360907179971 0.0 + outer loop + vertex 4.31733735153911 0.826705639850768 0.0 + vertex 4.34713560345482 0.836628412839274 0.2 + vertex 4.31733735153911 0.826705639850768 0.2 + endloop +endfacet +facet normal 0.426768496452843 -0.904360907179971 0.0 + outer loop + vertex 4.31733735153911 0.826705639850768 0.2 + vertex 4.29098138889543 0.810167684869925 0.0 + vertex 4.31733735153911 0.826705639850768 0.0 + endloop +endfacet +facet normal 0.625279843247521 -0.780400613549449 0.0 + outer loop + vertex 4.29098138889543 0.810167684869925 0.0 + vertex 4.31733735153911 0.826705639850768 0.2 + vertex 4.29098138889543 0.810167684869925 0.2 + endloop +endfacet +facet normal 0.625279843247521 -0.780400613549449 0.0 + outer loop + vertex 4.29098138889543 0.810167684869925 0.0 + vertex 4.26806771552378 0.787014547896745 0.2 + vertex 4.26806771552378 0.787014547896745 0.0 + endloop +endfacet +facet normal 0.781955163451592 -0.623334679246545 0.0 + outer loop + vertex 4.26806771552378 0.787014547896745 0.2 + vertex 4.29098138889543 0.810167684869925 0.0 + vertex 4.29098138889543 0.810167684869925 0.2 + endloop +endfacet +facet normal 0.781955163451592 -0.623334679246545 0.0 + outer loop + vertex 4.26806771552378 0.787014547896745 0.0 + vertex 4.2495242528801 0.757814954984868 0.2 + vertex 4.2495242528801 0.757814954984868 0.0 + endloop +endfacet +facet normal 0.89367395924274 -0.448716898023025 0.0 + outer loop + vertex 4.2495242528801 0.757814954984868 0.2 + vertex 4.26806771552378 0.787014547896745 0.0 + vertex 4.26806771552378 0.787014547896745 0.2 + endloop +endfacet +facet normal 0.89367395924274 -0.448716898023025 0.0 + outer loop + vertex 4.2495242528801 0.757814954984868 0.0 + vertex 4.23627892242033 0.723137632187933 0.2 + vertex 4.23627892242033 0.723137632187933 0.0 + endloop +endfacet +facet normal 0.961021452644306 -0.276473809894227 0.0 + outer loop + vertex 4.23627892242033 0.723137632187933 0.2 + vertex 4.2495242528801 0.757814954984868 0.0 + vertex 4.2495242528801 0.757814954984868 0.2 + endloop +endfacet +facet normal 0.961021452644306 -0.276473809894227 0.0 + outer loop + vertex 4.23627892242033 0.723137632187933 0.0 + vertex 4.22833172414447 0.68298257950594 0.2 + vertex 4.22833172414447 0.68298257950594 0.0 + endloop +endfacet +facet normal 0.991985893896409 -0.126348669603372 0.0 + outer loop + vertex 4.22833172414447 0.68298257950594 0.2 + vertex 4.23627892242033 0.723137632187933 0.0 + vertex 4.23627892242033 0.723137632187933 0.2 + endloop +endfacet +facet normal 0.991985893896409 -0.126348669603372 0.0 + outer loop + vertex 4.22833172414447 0.68298257950594 0.0 + vertex 4.22568265805252 0.63734979693889 0.2 + vertex 4.22568265805252 0.63734979693889 0.0 + endloop +endfacet +facet normal 0.999999895238739 -0.000457736289950238 0.0 + outer loop + vertex 4.22568265805252 0.63734979693889 0.2 + vertex 4.22833172414447 0.68298257950594 0.0 + vertex 4.22833172414447 0.68298257950594 0.2 + endloop +endfacet +facet normal 0.999999895238739 -0.000457736289950238 0.0 + outer loop + vertex 4.22568265805252 0.63734979693889 0.0 + vertex 4.2282419252939 0.592555136977205 0.2 + vertex 4.2282419252939 0.592555136977205 0.0 + endloop +endfacet +facet normal 0.992273219682165 0.124071985160193 0.0 + outer loop + vertex 4.2282419252939 0.592555136977205 0.2 + vertex 4.22568265805252 0.63734979693889 0.0 + vertex 4.22568265805252 0.63734979693889 0.2 + endloop +endfacet +facet normal 0.992273219682165 0.124071985160193 0.0 + outer loop + vertex 4.2282419252939 0.592555136977205 0.0 + vertex 4.23591972701803 0.552998743299044 0.2 + vertex 4.23591972701803 0.552998743299044 0.0 + endloop +endfacet +facet normal 0.962612437510528 0.27088243787673 0.0 + outer loop + vertex 4.23591972701803 0.552998743299044 0.2 + vertex 4.2282419252939 0.592555136977205 0.0 + vertex 4.2282419252939 0.592555136977205 0.2 + endloop +endfacet +facet normal 0.962612437510528 0.27088243787673 0.0 + outer loop + vertex 4.23591972701803 0.552998743299044 0.0 + vertex 4.24871606322493 0.518680615904408 0.2 + vertex 4.24871606322493 0.518680615904408 0.0 + endloop +endfacet +facet normal 0.898470012927288 0.439034891404362 0.0 + outer loop + vertex 4.24871606322493 0.518680615904408 0.2 + vertex 4.23591972701803 0.552998743299044 0.0 + vertex 4.23591972701803 0.552998743299044 0.2 + endloop +endfacet +facet normal 0.898470012927288 0.439034891404362 0.0 + outer loop + vertex 4.24871606322493 0.518680615904408 0.0 + vertex 4.26663093391458 0.489600754793297 0.2 + vertex 4.26663093391458 0.489600754793297 0.0 + endloop +endfacet +facet normal 0.789240434800171 0.614084306977826 0.0 + outer loop + vertex 4.26663093391458 0.489600754793297 0.2 + vertex 4.24871606322493 0.518680615904408 0.0 + vertex 4.24871606322493 0.518680615904408 0.2 + endloop +endfacet +facet normal 0.789240434800171 0.614084306977826 0.0 + outer loop + vertex 4.26663093391458 0.489600754793297 0.0 + vertex 4.28909561303336 0.466447617820117 0.2 + vertex 4.28909561303336 0.466447617820117 0.0 + endloop +endfacet +facet normal 0.628537365803979 0.777779390179629 0.0 + outer loop + vertex 4.28909561303336 0.466447617820117 0.2 + vertex 4.26663093391458 0.489600754793297 0.0 + vertex 4.26663093391458 0.489600754793297 0.2 + endloop +endfacet +facet normal 0.628537365803979 0.777779390179629 0.0 + outer loop + vertex 4.28909561303336 0.466447617820117 0.2 + vertex 4.31554137452761 0.449909662839274 0.0 + vertex 4.28909561303336 0.466447617820117 0.0 + endloop +endfacet +facet normal 0.423267384808038 0.906004812877815 0.0 + outer loop + vertex 4.31554137452761 0.449909662839274 0.0 + vertex 4.28909561303336 0.466447617820117 0.2 + vertex 4.31554137452761 0.449909662839274 0.2 + endloop +endfacet +facet normal 0.423267384808038 0.906004812877815 0.0 + outer loop + vertex 4.31554137452761 0.449909662839274 0.2 + vertex 4.34596821839734 0.439986889850768 0.0 + vertex 4.31554137452761 0.449909662839274 0.0 + endloop +endfacet +facet normal 0.204094833430253 0.978951121847806 0.0 + outer loop + vertex 4.34596821839734 0.439986889850768 0.0 + vertex 4.31554137452761 0.449909662839274 0.2 + vertex 4.34596821839734 0.439986889850768 0.2 + endloop +endfacet +facet normal 0.204094833430253 0.978951121847806 0.0 + outer loop + vertex 4.34596821839734 0.439986889850768 0.2 + vertex 4.38037614464255 0.436679298854599 0.0 + vertex 4.34596821839734 0.439986889850768 0.0 + endloop +endfacet +facet normal -0.00481129071356181 0.999988425673852 0.0 + outer loop + vertex 4.38037614464255 0.436679298854599 0.0 + vertex 4.34596821839734 0.439986889850768 0.2 + vertex 4.38037614464255 0.436679298854599 0.2 + endloop +endfacet +facet normal -0.00481129071356181 0.999988425673852 0.0 + outer loop + vertex 4.38037614464255 0.436679298854599 0.2 + vertex 4.42335986111765 0.441229107283718 0.0 + vertex 4.38037614464255 0.436679298854599 0.0 + endloop +endfacet +facet normal -0.212412834660519 0.977180018047587 0.0 + outer loop + vertex 4.42335986111765 0.441229107283718 0.0 + vertex 4.38037614464255 0.436679298854599 0.2 + vertex 4.42335986111765 0.441229107283718 0.2 + endloop +endfacet +facet normal -0.212412834660519 0.977180018047587 0.0 + outer loop + vertex 4.42335986111765 0.441229107283718 0.2 + vertex 4.46418840517895 0.454878532571074 0.0 + vertex 4.42335986111765 0.441229107283718 0.0 + endloop +endfacet +facet normal -0.40318983395436 0.915116362981154 0.0 + outer loop + vertex 4.46418840517895 0.454878532571074 0.0 + vertex 4.42335986111765 0.441229107283718 0.2 + vertex 4.46418840517895 0.454878532571074 0.2 + endloop +endfacet +facet normal -0.40318983395436 0.915116362981154 0.0 + outer loop + vertex 4.46418840517895 0.454878532571074 0.2 + vertex 4.5016644588188 0.475711865904408 0.0 + vertex 4.46418840517895 0.454878532571074 0.0 + endloop +endfacet +facet normal -0.555388575177809 0.831590963492247 0.0 + outer loop + vertex 4.5016644588188 0.475711865904408 0.0 + vertex 4.46418840517895 0.454878532571074 0.2 + vertex 4.5016644588188 0.475711865904408 0.2 + endloop +endfacet +facet normal -0.555388575177809 0.831590963492247 0.0 + outer loop + vertex 4.5016644588188 0.475711865904408 0.2 + vertex 4.53459070402953 0.501813398471458 0.0 + vertex 4.5016644588188 0.475711865904408 0.0 + endloop +endfacet +facet normal -0.621213734155876 0.783641178407639 0.0 + outer loop + vertex 4.53459070402953 0.501813398471458 0.0 + vertex 4.5016644588188 0.475711865904408 0.2 + vertex 4.53459070402953 0.501813398471458 0.2 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.53459070402953 0.501813398471458 0.2 + vertex 4.53985890326324 0.501813398471458 0.0 + vertex 4.53459070402953 0.501813398471458 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.53985890326324 0.501813398471458 0.0 + vertex 4.53459070402953 0.501813398471458 0.2 + vertex 4.53985890326324 0.501813398471458 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.53985890326324 0.501813398471458 0.0 + vertex 4.53985890326324 0.400759758624714 0.2 + vertex 4.53985890326324 0.400759758624714 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.53985890326324 0.400759758624714 0.2 + vertex 4.53985890326324 0.501813398471458 0.0 + vertex 4.53985890326324 0.501813398471458 0.2 + endloop +endfacet +facet normal 0.410364677328798 -0.911921505175107 0.0 + outer loop + vertex 4.53985890326324 0.400759758624714 0.2 + vertex 4.50633399904869 0.385673551728163 0.0 + vertex 4.53985890326324 0.400759758624714 0.0 + endloop +endfacet +facet normal 0.375577351678058 -0.926791051373769 0.0 + outer loop + vertex 4.50633399904869 0.385673551728163 0.0 + vertex 4.53985890326324 0.400759758624714 0.2 + vertex 4.50633399904869 0.385673551728163 0.2 + endloop +endfacet +facet normal 0.375577351678058 -0.926791051373769 0.0 + outer loop + vertex 4.50633399904869 0.385673551728163 0.2 + vertex 4.46993553161574 0.372503053643871 0.0 + vertex 4.50633399904869 0.385673551728163 0.0 + endloop +endfacet +facet normal 0.291774960866941 -0.956486995317289 0.0 + outer loop + vertex 4.46993553161574 0.372503053643871 0.0 + vertex 4.50633399904869 0.385673551728163 0.2 + vertex 4.46993553161574 0.372503053643871 0.2 + endloop +endfacet +facet normal 0.291774960866941 -0.956486995317289 0.0 + outer loop + vertex 4.46993553161574 0.372503053643871 0.2 + vertex 4.42874779215213 0.362206118777971 0.0 + vertex 4.46993553161574 0.372503053643871 0.0 + endloop +endfacet +facet normal 0.159989675112747 -0.98711868782701 0.0 + outer loop + vertex 4.42874779215213 0.362206118777971 0.0 + vertex 4.46993553161574 0.372503053643871 0.2 + vertex 4.42874779215213 0.362206118777971 0.2 + endloop +endfacet +facet normal 0.159989675112747 -0.98711868782701 0.0 + outer loop + vertex 4.42874779215213 0.362206118777971 0.2 + vertex 4.38181292625175 0.358614164754983 0.0 + vertex 4.42874779215213 0.362206118777971 0.0 + endloop +endfacet +facet normal -0.00197196685745208 -0.999998055671466 0.0 + outer loop + vertex 4.38181292625175 0.358614164754983 0.0 + vertex 4.42874779215213 0.362206118777971 0.2 + vertex 4.38181292625175 0.358614164754983 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.71370947797589 0.370587344831611 0.2 + vertex 4.62367116379964 0.905549030655366 0.2 + vertex 4.62367116379964 0.370587344831611 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.62367116379964 0.905549030655366 0.2 + vertex 4.71370947797589 0.370587344831611 0.2 + vertex 4.71370947797589 0.905549030655366 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.71370947797589 0.370587344831611 0.2 + vertex 4.62367116379964 0.370587344831611 0.0 + vertex 4.71370947797589 0.370587344831611 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.62367116379964 0.370587344831611 0.0 + vertex 4.71370947797589 0.370587344831611 0.2 + vertex 4.62367116379964 0.370587344831611 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.62367116379964 0.905549030655366 0.2 + vertex 4.62367116379964 0.370587344831611 0.0 + vertex 4.62367116379964 0.370587344831611 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.62367116379964 0.370587344831611 0.0 + vertex 4.62367116379964 0.905549030655366 0.2 + vertex 4.62367116379964 0.905549030655366 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.62367116379964 0.905549030655366 0.2 + vertex 4.71370947797589 0.905549030655366 0.0 + vertex 4.62367116379964 0.905549030655366 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.71370947797589 0.905549030655366 0.0 + vertex 4.62367116379964 0.905549030655366 0.2 + vertex 4.71370947797589 0.905549030655366 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.71370947797589 0.905549030655366 0.0 + vertex 4.71370947797589 0.370587344831611 0.2 + vertex 4.71370947797589 0.370587344831611 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.71370947797589 0.370587344831611 0.2 + vertex 4.71370947797589 0.905549030655366 0.0 + vertex 4.71370947797589 0.905549030655366 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.71993553161574 0.995108417628546 0.2 + vertex 4.6174451101598 1.08849922222625 0.2 + vertex 4.6174451101598 0.995108417628546 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.6174451101598 1.08849922222625 0.2 + vertex 4.71993553161574 0.995108417628546 0.2 + vertex 4.71993553161574 1.08849922222625 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.71993553161574 0.995108417628546 0.2 + vertex 4.6174451101598 0.995108417628546 0.0 + vertex 4.71993553161574 0.995108417628546 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.6174451101598 0.995108417628546 0.0 + vertex 4.71993553161574 0.995108417628546 0.2 + vertex 4.6174451101598 0.995108417628546 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.6174451101598 1.08849922222625 0.2 + vertex 4.6174451101598 0.995108417628546 0.0 + vertex 4.6174451101598 0.995108417628546 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.6174451101598 0.995108417628546 0.0 + vertex 4.6174451101598 1.08849922222625 0.2 + vertex 4.6174451101598 1.08849922222625 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.6174451101598 1.08849922222625 0.2 + vertex 4.71993553161574 1.08849922222625 0.0 + vertex 4.6174451101598 1.08849922222625 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.71993553161574 1.08849922222625 0.0 + vertex 4.6174451101598 1.08849922222625 0.2 + vertex 4.71993553161574 1.08849922222625 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.71993553161574 1.08849922222625 0.0 + vertex 4.71993553161574 0.995108417628546 0.2 + vertex 4.71993553161574 0.995108417628546 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.71993553161574 0.995108417628546 0.2 + vertex 4.71993553161574 1.08849922222625 0.0 + vertex 4.71993553161574 1.08849922222625 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.93784740901037 0.370587344831611 0.2 + vertex 4.84780909483413 0.905549030655366 0.2 + vertex 4.84780909483413 0.370587344831611 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.84780909483413 0.905549030655366 0.2 + vertex 4.93784740901037 0.370587344831611 0.2 + vertex 4.93784740901037 0.905549030655366 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.93784740901037 0.370587344831611 0.2 + vertex 4.84780909483413 0.370587344831611 0.0 + vertex 4.93784740901037 0.370587344831611 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.84780909483413 0.370587344831611 0.0 + vertex 4.93784740901037 0.370587344831611 0.2 + vertex 4.84780909483413 0.370587344831611 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.84780909483413 0.905549030655366 0.2 + vertex 4.84780909483413 0.370587344831611 0.0 + vertex 4.84780909483413 0.370587344831611 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.84780909483413 0.370587344831611 0.0 + vertex 4.84780909483413 0.905549030655366 0.2 + vertex 4.84780909483413 0.905549030655366 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.84780909483413 0.905549030655366 0.2 + vertex 4.93784740901037 0.905549030655366 0.0 + vertex 4.84780909483413 0.905549030655366 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.93784740901037 0.905549030655366 0.0 + vertex 4.84780909483413 0.905549030655366 0.2 + vertex 4.93784740901037 0.905549030655366 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.93784740901037 0.905549030655366 0.0 + vertex 4.93784740901037 0.370587344831611 0.2 + vertex 4.93784740901037 0.370587344831611 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.93784740901037 0.370587344831611 0.2 + vertex 4.93784740901037 0.905549030655366 0.0 + vertex 4.93784740901037 0.905549030655366 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.94407346265022 0.995108417628546 0.2 + vertex 4.84158304119428 1.08849922222625 0.2 + vertex 4.84158304119428 0.995108417628546 0.2 + endloop +endfacet +facet normal 0.0 0.0 1.0 + outer loop + vertex 4.84158304119428 1.08849922222625 0.2 + vertex 4.94407346265022 0.995108417628546 0.2 + vertex 4.94407346265022 1.08849922222625 0.2 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.94407346265022 0.995108417628546 0.2 + vertex 4.84158304119428 0.995108417628546 0.0 + vertex 4.94407346265022 0.995108417628546 0.0 + endloop +endfacet +facet normal 0.0 -1.0 0.0 + outer loop + vertex 4.84158304119428 0.995108417628546 0.0 + vertex 4.94407346265022 0.995108417628546 0.2 + vertex 4.84158304119428 0.995108417628546 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.84158304119428 1.08849922222625 0.2 + vertex 4.84158304119428 0.995108417628546 0.0 + vertex 4.84158304119428 0.995108417628546 0.2 + endloop +endfacet +facet normal -1.0 0.0 0.0 + outer loop + vertex 4.84158304119428 0.995108417628546 0.0 + vertex 4.84158304119428 1.08849922222625 0.2 + vertex 4.84158304119428 1.08849922222625 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.84158304119428 1.08849922222625 0.2 + vertex 4.94407346265022 1.08849922222625 0.0 + vertex 4.84158304119428 1.08849922222625 0.0 + endloop +endfacet +facet normal 0.0 1.0 0.0 + outer loop + vertex 4.94407346265022 1.08849922222625 0.0 + vertex 4.84158304119428 1.08849922222625 0.2 + vertex 4.94407346265022 1.08849922222625 0.2 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.94407346265022 1.08849922222625 0.0 + vertex 4.94407346265022 0.995108417628546 0.2 + vertex 4.94407346265022 0.995108417628546 0.0 + endloop +endfacet +facet normal 1.0 0.0 0.0 + outer loop + vertex 4.94407346265022 0.995108417628546 0.2 + vertex 4.94407346265022 1.08849922222625 0.0 + vertex 4.94407346265022 1.08849922222625 0.2 + endloop +endfacet +endsolid Untitled-5427e5af diff --git a/test/testfiles/stl/stl_binary.stl b/test/testfiles/stl/stl_binary.stl new file mode 100644 index 0000000000000000000000000000000000000000..dcb5ab87cc2ac739c52e752ee98139f0e2619e01 GIT binary patch literal 36484 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', '', libFiles, None) + replacer.ReplaceTokenFileLinks ('', '', importerFiles, version) + replacer.ReplaceTokenFileLinks ('', '', websiteFiles, version) + metaFile = os.path.join (rootDir, 'tools', 'website_meta_data.txt') + if os.path.exists (metaFile): + metaContent = Tools.GetFileContent (metaFile) + replacer.ReplaceTokenContent ('', '', metaContent) + analyticsFile = os.path.join (rootDir, 'tools', 'website_analytics_data.txt') + if os.path.exists (analyticsFile): + analyticsContent = Tools.GetFileContent (analyticsFile) + replacer.ReplaceTokenContent ('', '', analyticsContent) + scriptFile = os.path.join (rootDir, 'tools', 'website_script_data.txt') + if os.path.exists (scriptFile): + scriptContent = Tools.GetFileContent (scriptFile) + replacer.ReplaceTokenContent ('', '', scriptContent) + replacer.WriteToFile (htmlFilePath) + +def CreatePackage (websiteDir, packageDir, version): + if not os.path.exists (packageDir): + os.makedirs (packageDir) + + zipPath = os.path.join (packageDir, 'o3dv_' + version + '.zip') + zip = zipfile.ZipFile (zipPath, mode = 'w', compression = zipfile.ZIP_DEFLATED) + zip.write (os.path.join (websiteDir, 'libs', 'three.min-126.js'), 'three.min.js') + zip.write (os.path.join (websiteDir, 'o3dv', 'o3dv.min.js'), 'o3dv.min.js') + zip.close () + return True + +def Main (argv): + currentDir = os.path.dirname (os.path.abspath (__file__)) + os.chdir (currentDir) + + rootDir = os.path.abspath ('..') + buildDir = os.path.join (rootDir, 'build') + websiteDir = os.path.join (buildDir, 'website') + packageDir = os.path.join (buildDir, 'package') + if os.path.exists (buildDir): + shutil.rmtree (buildDir) + + config = None + with open ('config.json') as configJson: + config = json.load (configJson) + + PrintInfo ('JSHint importer sources.') + jsHintResult = JSHintFolder (os.path.join (rootDir, 'source')) + if not jsHintResult: + PrintError ('JSHint importer sources failed.') + return 1 + + PrintInfo ('JSHint website sources.') + jsHintResult = JSHintFolder (os.path.join (rootDir, 'website', 'o3dv')) + if not jsHintResult: + PrintError ('JSHint website sources failed.') + return 1 + + version = GetVersion (rootDir) + PrintInfo ('Create build directory') + CreateDestinationDir (config, rootDir, websiteDir, version) + + PrintInfo ('Compress importer sources.') + compressResult = CompressFiles (config['importer_files'], os.path.join (websiteDir, 'o3dv', 'o3dv.min.js')) + if not compressResult: + PrintError ('Compress importer sources failed.') + return 1 + + PrintInfo ('Compress website sources.') + compressResult = CompressFiles (config['website_files'], os.path.join (websiteDir, 'o3dv', 'o3dv.website.min.js')) + if not compressResult: + PrintError ('Compress website sources failed.') + return 1 + + PrintInfo ('Create package.') + packageResult = CreatePackage (websiteDir, packageDir, version) + if not packageResult: + PrintError ('Create package failed.') + return 1 + + return 0 + +sys.exit (Main (sys.argv)) diff --git a/tools/generate_test_obj.py b/tools/generate_test_obj.py new file mode 100644 index 0000000..c1c7ab2 --- /dev/null +++ b/tools/generate_test_obj.py @@ -0,0 +1,192 @@ +import os +import sys +import subprocess +import json +import math + +from lib import tools_lib as Tools + +class ObjWriter: + def __init__ (self): + self.content = '' + self.offsetX = 0.0 + self.offsetY = 0.0 + self.offsetZ = 0.0 + self.scale = 1.0 + self.vertexCount = 0 + self.vertexOffset = 0 + + def GetContent (self): + return self.content + + def SetOffset (self, x, y, z): + self.offsetX = x + self.offsetY = y + self.offsetZ = z + + def SetScale (self, scale): + self.scale = scale + + def AddMesh (self, name): + self.AddLine ('g ' + name) + self.vertexOffset = self.vertexCount + + def AddVertex (self, x, y, z): + self.AddLine ('v ' + ' '.join ([str (x * self.scale + self.offsetX), str (y * self.scale + self.offsetY), str (z * self.scale + self.offsetZ)])) + self.vertexCount += 1 + + def AddFace (self, vertices): + objVertices = [] + for vertex in vertices: + objVertices.append (str (vertex + self.vertexOffset + 1)) + self.AddLine ('f ' + ' '.join (objVertices)) + + def AddLine (self, line): + self.content += line + '\n' + +def DistFromOrigin (x, y, z): + return math.sqrt (x * x + y * y + z * z) + +def Main (argv): + currentDir = os.path.dirname (os.path.abspath (__file__)) + os.chdir (currentDir) + + ow = ObjWriter () + + ow.AddMesh ('Tetrahedron') + a = 1.0 + ow.SetOffset (0.0, 0.0, 0.0) + ow.SetScale (1.0 / DistFromOrigin (a, a, a)) + ow.AddVertex (+a, +a, +a) + ow.AddVertex (-a, -a, +a) + ow.AddVertex (-a, +a, -a) + ow.AddVertex (+a, -a, -a) + ow.AddFace ([0, 1, 3]) + ow.AddFace ([0, 2, 1]) + ow.AddFace ([0, 3, 2]) + ow.AddFace ([1, 2, 3]) + + ow.AddMesh ('Hexahedron') + a = 1.0 + ow.SetOffset (0.0, 3.0, 0.0) + ow.SetScale (1.0 / DistFromOrigin (a, a, a)) + ow.AddVertex (+a, +a, +a) + ow.AddVertex (+a, +a, -a) + ow.AddVertex (+a, -a, +a) + ow.AddVertex (+a, -a, -a) + ow.AddVertex (-a, +a, +a) + ow.AddVertex (-a, +a, -a) + ow.AddVertex (-a, -a, +a) + ow.AddVertex (-a, -a, -a) + ow.AddFace ([0, 1, 5, 4]) + ow.AddFace ([0, 2, 3, 1]) + ow.AddFace ([0, 4, 6, 2]) + ow.AddFace ([1, 3, 7, 5]) + ow.AddFace ([2, 6, 7, 3]) + ow.AddFace ([4, 5, 7, 6]) + + ow.AddMesh ('Octahedron') + a = 1.0 + b = 0.0 + ow.SetOffset (3.0, 0.0, 0.0) + ow.SetScale (1.0 / DistFromOrigin (a, b, b)) + ow.AddVertex (+a, +b, +b) + ow.AddVertex (-a, +b, +b) + ow.AddVertex (+b, +a, +b) + ow.AddVertex (+b, -a, +b) + ow.AddVertex (+b, +b, +a) + ow.AddVertex (+b, +b, -a) + ow.AddFace ([0, 2, 4]) + ow.AddFace ([0, 3, 5]) + ow.AddFace ([0, 4, 3]) + ow.AddFace ([0, 5, 2]) + ow.AddFace ([1, 2, 5]) + ow.AddFace ([1, 3, 4]) + ow.AddFace ([1, 4, 2]) + ow.AddFace ([1, 5, 3]) + + ow.AddMesh ('Dodecahedron') + a = 1.0 + b = 0.0 + c = (1.0 + math.sqrt (5.0)) / 2.0 + d = 1.0 / c + ow.SetOffset (3.0, 3.0, 0.0) + ow.SetScale (1.0 / DistFromOrigin (a, a, a)) + ow.AddVertex (+a, +a, +a) + ow.AddVertex (+a, +a, -a) + ow.AddVertex (+a, -a, +a) + ow.AddVertex (-a, +a, +a) + ow.AddVertex (+a, -a, -a) + ow.AddVertex (-a, +a, -a) + ow.AddVertex (-a, -a, +a) + ow.AddVertex (-a, -a, -a) + ow.AddVertex (+b, +d, +c) + ow.AddVertex (+b, +d, -c) + ow.AddVertex (+b, -d, +c) + ow.AddVertex (+b, -d, -c) + ow.AddVertex (+d, +c, +b) + ow.AddVertex (+d, -c, +b) + ow.AddVertex (-d, +c, +b) + ow.AddVertex (-d, -c, +b) + ow.AddVertex (+c, +b, +d) + ow.AddVertex (-c, +b, +d) + ow.AddVertex (+c, +b, -d) + ow.AddVertex (-c, +b, -d) + ow.AddFace ([0, 8, 10, 2, 16]) + ow.AddFace ([0, 16, 18, 1, 12]) + ow.AddFace ([0, 12, 14, 3, 8]) + ow.AddFace ([1, 9, 5, 14, 12]) + ow.AddFace ([1, 18, 4, 11, 9]) + ow.AddFace ([2, 10, 6, 15, 13]) + ow.AddFace ([2, 13, 4, 18, 16]) + ow.AddFace ([3, 14, 5, 19, 17]) + ow.AddFace ([3, 17, 6, 10, 8]) + ow.AddFace ([4, 13, 15, 7, 11]) + ow.AddFace ([5, 9, 11, 7, 19]) + ow.AddFace ([6, 17, 19, 7, 15]) + + ow.AddMesh ('Icosahedron') + a = 1.0 + b = 0.0 + c = (1.0 + math.sqrt (5.0)) / 2.0 + ow.SetOffset (6.0, 1.5, 0.0) + ow.SetScale (1.0 / DistFromOrigin (b, a, c)) + ow.AddVertex (+b, +a, +c) + ow.AddVertex (+b, +a, -c) + ow.AddVertex (+b, -a, +c) + ow.AddVertex (+b, -a, -c) + ow.AddVertex (+a, +c, +b) + ow.AddVertex (+a, -c, +b) + ow.AddVertex (-a, +c, +b) + ow.AddVertex (-a, -c, +b) + ow.AddVertex (+c, +b, +a) + ow.AddVertex (+c, +b, -a) + ow.AddVertex (-c, +b, +a) + ow.AddVertex (-c, +b, -a) + ow.AddFace ([0, 2, 8]) + ow.AddFace ([0, 4, 6]) + ow.AddFace ([0, 6, 10]) + ow.AddFace ([0, 8, 4]) + ow.AddFace ([0, 10, 2]) + ow.AddFace ([1, 3, 11]) + ow.AddFace ([1, 4, 9]) + ow.AddFace ([1, 6, 4]) + ow.AddFace ([1, 9, 3]) + ow.AddFace ([1, 11, 6]) + ow.AddFace ([2, 5, 8]) + ow.AddFace ([2, 7, 5]) + ow.AddFace ([2, 10, 7]) + ow.AddFace ([3, 5, 7]) + ow.AddFace ([3, 7, 11]) + ow.AddFace ([3, 9, 5]) + ow.AddFace ([4, 8, 9]) + ow.AddFace ([5, 9, 8]) + ow.AddFace ([6, 11, 10]) + ow.AddFace ([7, 10, 11]) + + print (ow.GetContent ()) + Tools.WriteContentToFile ('solids.obj', ow.GetContent ()) + + return 0 + +sys.exit (Main (sys.argv)) diff --git a/tools/lib/tools_lib.py b/tools/lib/tools_lib.py new file mode 100644 index 0000000..c8f8337 --- /dev/null +++ b/tools/lib/tools_lib.py @@ -0,0 +1,111 @@ +import codecs +import os +import subprocess + +def GetFileContent (filePath): + fileObject = codecs.open (filePath, 'r', 'utf-8') + content = fileObject.read () + fileObject.close () + return content + +def WriteContentToFile (filePath, content): + fileObject = codecs.open (filePath, 'w', 'utf-8') + fileObject.write (content) + fileObject.close () + +def RunCommand (commands): + process = subprocess.Popen (commands, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True) + out, err = process.communicate () + if process.returncode != 0: + print (out.decode ()) + print (err.decode ()) + return process.returncode + +class TokenReplacer: + def __init__ (self, filePath, keepToken): + self.fileContent = GetFileContent (filePath) + self.eolChar = self.GetEOLChar () + self.keepToken = keepToken + + def ReplaceTokenContent (self, begToken, endToken, content): + begPosition, linePrefix = self.GetTokenBegPosition (begToken) + endPosition = self.GetTokenEndPosition (endToken) + if begPosition == -1 or endPosition == -1: + return + newContentLines = [] + for contentLine in content.splitlines (): + newContentLines.append (linePrefix + contentLine) + newContent = self.eolChar.join (newContentLines) + self.ReplaceContent (begToken, endToken, begPosition, endPosition + len (endToken), linePrefix, newContent) + + def ReplaceTokenFileLinks (self, begToken, endToken, fileUrls, version): + begPosition, linePrefix = self.GetTokenBegPosition (begToken) + endPosition = self.GetTokenEndPosition (endToken) + if begPosition == -1 or endPosition == -1: + return + fileLinks = [] + for fileUrl in fileUrls: + fileSourceUrl = fileUrl + if version != None: + fileSourceUrl += '?v=' + version + extension = os.path.splitext (fileUrl)[1] + if (extension == '.js'): + fileLinks.append (linePrefix + '') + elif (extension == '.css'): + fileLinks.append (linePrefix + '') + newContent = self.eolChar.join (fileLinks) + self.ReplaceContent (begToken, endToken, begPosition, endPosition + len (endToken), linePrefix, newContent) + + def WriteToFile (self, filePath): + WriteContentToFile (filePath, self.fileContent) + + def ReplaceContent (self, begToken, endToken, begPosition, endPosition, linePrefix, newContent): + if self.keepToken: + newContent = linePrefix + begToken + self.eolChar + newContent + self.eolChar + linePrefix + endToken + self.fileContent = self.fileContent.replace (self.fileContent[begPosition : endPosition], newContent) + + def GetTokenBegPosition (self, begToken): + begPosition = self.fileContent.find (begToken) + linePrefix = '' + if begPosition == -1: + return -1, '' + while begPosition > 0: + if self.fileContent[begPosition - 1] == '\n': + break + begPosition -= 1 + linePrefix = self.fileContent[begPosition] + linePrefix + return begPosition, linePrefix + + def GetTokenEndPosition (self, endToken): + return self.fileContent.find (endToken) + + def GetEOLChar (self): + if self.fileContent.count ('\r\n') > 0: + return '\r\n' + else: + return '\n' + +def ReplaceInFile (filePath, begToken, endToken, newContent): + content = GetFileContent (filePath) + begPosition = content.find (begToken) + endPosition = content.find (endToken) + if begPosition == -1 or endPosition == -1: + return + content = content.replace (content[begPosition : endPosition + len (endToken)], newContent) + WriteContentToFile (filePath, content) + +def CreateFileLinks (fileUrls, linePrefix, eolChar): + result = '' + for fileUrl in fileUrls: + extension = os.path.splitext (fileUrl)[1] + if (extension == '.js'): + result += linePrefix + '' + eolChar + elif (extension == '.css'): + result += linePrefix + '' + eolChar + return result + +def CreateFileList (fileList, replaceFrom, replaceTo): + result = [] + for item in fileList: + result.append (item.replace (replaceFrom, replaceTo)) + return result diff --git a/tools/optimize_svg_files.py b/tools/optimize_svg_files.py new file mode 100644 index 0000000..60ef502 --- /dev/null +++ b/tools/optimize_svg_files.py @@ -0,0 +1,15 @@ +import os +import sys +import subprocess +import json + +from lib import tools_lib as Tools + +def Main (argv): + currentDir = os.path.dirname (os.path.abspath (__file__)) + os.chdir (currentDir) + imagesPath = os.path.abspath (os.path.join ('..', 'website', 'assets', 'images')) + for i in range (0, 5): + Tools.RunCommand (['svgo', '-r', imagesPath]) + +sys.exit (Main (sys.argv)) diff --git a/tools/sandbox/index.html b/tools/sandbox/index.html new file mode 100644 index 0000000..d85c8a6 --- /dev/null +++ b/tools/sandbox/index.html @@ -0,0 +1,63 @@ + + + + + + + + Online 3D Viewer + + + + + + + + + + diff --git a/tools/update_includes.py b/tools/update_includes.py new file mode 100644 index 0000000..99ff3c9 --- /dev/null +++ b/tools/update_includes.py @@ -0,0 +1,34 @@ +import os +import sys +import subprocess +import json + +from lib import tools_lib as Tools + +def PrintInfo (message): + print ('INFO: ' + message) + +def PrintError (message): + print ('ERROR: ' + message) + +def Main (argv): + currentDir = os.path.dirname (os.path.abspath (__file__)) + os.chdir (currentDir) + + config = None + with open ('config.json') as configJson: + config = json.load (configJson) + + rootDir = os.path.abspath ('..') + for htmlFileName in ['index.html', 'embed.html', 'embed_selfhost.html']: + htmlFilePath = os.path.join (rootDir, 'website', htmlFileName) + replacer = Tools.TokenReplacer (htmlFilePath, True) + libFiles = Tools.CreateFileList (config['lib_files'], 'libs/', '../libs/') + importerFiles = Tools.CreateFileList (config['importer_files'], 'source/', '../source/') + websiteFiles = Tools.CreateFileList (config['website_files'], 'website/', '') + replacer.ReplaceTokenFileLinks ('', '', libFiles, None) + replacer.ReplaceTokenFileLinks ('', '', importerFiles, None) + replacer.ReplaceTokenFileLinks ('', '', websiteFiles, None) + replacer.WriteToFile (htmlFilePath) + +sys.exit (Main (sys.argv)) diff --git a/website/assets/fonts/Quicksand/OFL.txt b/website/assets/fonts/Quicksand/OFL.txt new file mode 100644 index 0000000..5186b46 --- /dev/null +++ b/website/assets/fonts/Quicksand/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Quicksand Project Authors (https://github.com/andrew-paglinawan/QuicksandFamily), with Reserved Font Name “Quicksand”. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/website/assets/fonts/Quicksand/Quicksand-Bold.ttf b/website/assets/fonts/Quicksand/Quicksand-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..edfa93f21b477d39cb6f1715d998fd306879b5f9 GIT binary patch literal 77028 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 RLoU?&(@!nLc}#@({{Y3(8zuk% literal 0 HcmV?d00001 diff --git a/website/assets/fonts/Quicksand/Quicksand-Medium.ttf b/website/assets/fonts/Quicksand/Quicksand-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7eadfad2fa6d8f258c865a843ee1754d80e8b317 GIT binary patch literal 77464 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 literal 0 HcmV?d00001 diff --git a/website/assets/fonts/Quicksand/Quicksand-Regular.ttf b/website/assets/fonts/Quicksand/Quicksand-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cb1596d5bc27f958c098dd04959cf9af5b0e2ed8 GIT binary patch literal 77420 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 literal 0 HcmV?d00001 diff --git a/website/assets/fonts/Quicksand/Quicksand-SemiBold.ttf b/website/assets/fonts/Quicksand/Quicksand-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b280a9d9befab777a91d2492c4792aa92f076d4d GIT binary patch literal 77396 zcmb?^2b>(mm3LS7n@af4}eeiP@P~)m5)vy?Uu$ zRZC2gq!2!Ak~FhyYI^efOaDcZp1lOnM`zZp-FTf zNs{E*zjkA#|0?h1s3iS-1od}r+_YrVC42Y$gT#91cWU=pyY^OpevX3j&q$KY10Gvh6Sb8IUCAlcaC{V$aFDPSS7alqKm06DS|v1Ayx>`^$J9eMrSU zXI*f~Ig{_Z8ReHqlJ9e8p0j(`)pOtKm!$vmq9i%iowe(dy~;v{k^G;#P(OF}uCq?Q zK)JpsNx%IZ26+13bI!kDRnT{#B;Dnbq{PX4&pUbV9>+gigYr+JzEe`9Hc66m@-32A z(xj{;Z5$kE>DR*1LQ8%~%^OS~9tsZ@SQOAQD><~b0{c#(P+L=|I&JLpvdvywZf7?* zZM9vpO}@TRnEOznAn$X`eN|yL`B?khHFk%*8Q&#Y3f13|&y{~FC8UfbEm0hfLcUZU ztg6GqM!#;Tx)$XSMX9zJY~^E)SWwrQQgbFl!Gz;YTRIYqJ08EWnBz?F6w+)%_ zvdrP;b9eCaz4EzAAUP*R{s-6l)oUI zBHh*~S1vQlo$~Y22PK~cf42pHPWlJwCKGq(!oZ#Ep$lvXV5>5=Oc}Bi=Gbo9kgR+~aoPc+xfh^I#TI@5@J$k{WW=){4=Qw z_~<(Lwp;>R1b|RR9_Syg4(o>Qa00n}k4!uda>`3}XV6;+rzeV|TbC9}lUs-KOVW{o zH|*BpW8=Bm_nb63wCl>%y<6o^dVAEM%^i%iPHi7uylb*06mr{xTBkP<_4RIh-?6K& z+A$OZ#W)t6V$cL!Dz)*IE8ryM1pImF-?^0Qte;6(TktoeCncghhgZgo54TdKR>J+te^?P4D0zBqmU)WFu6cK6&%9>N)1Vee8dvz5RV zq=Ek||0f>{Yz7&911Ewz*yY=D2ab_I$0}IDQNK2+4E51aWTfHCBbLJE0|3S&d1Q`TOn;K>OUiWq>1vRO$8jd za&0OoPuf)U`pOyey^=N+&=<$nL9G^=)hQ`;t*-(2<%b&R#G%dBJR9P0|&*ijeq* zmJWHk&+=4vU%6`4mAk9D<}|!o)}{o4Qx`3ty?81dNZuAm>3S-yKN8ZNsXXSFr0x4S z*G`+O@Oymi3OKD@0e@clwJGhXKCLnVe@^f;%s?;G|RG@kmfZI-mlhjVk91q$fv8Z zm^$}tG@H|m6i_gL0)Et1vpZ^4_G~;7L3t#0PjmOp-w733WA*hi#td4l=5z2r(myw3 zzI+9zwSYe-eMd+_NQvh92c;UG!f75*RRL%4rBu_pPN+=9joIDVFk#!?w0n%%T;ciPhu^2a=Cf3C2gkkw+TMW?Y& z>W6LTls{{@H|W<=L2n}2GMZ=KC17p!qEi-`tC8ioPT7DlIOIPqfR|8z2E!?Ht|X{a z{&W4u#Fh0qz*VksMeXN*2MJbx6VM2!lc@b%{cfUD{ht7jS*<`K{{TJKUj{VIC9-Ja zsh>2UdD{TyfS@HAP%Z@*NWaDmtp)6Mg}7Ke^K_bUUt8ZR-OlGtKo1hM{%6$vF_+Z> z`pkck-;)CL0fi(rL7nnT^*2aT*PjJ8MTI1_sQt<<)W&}UT2W|q259pc|GO%NohDbmY=h;dotZyP5S$?F(cy%mPd_%KNRr?wRCU8ndwc)r}Ig= z-lN)mZBYJ!AopGf3)m@a0k`!97B3*w!K6O$%)`JU&9Qg~9yz%1#Ed%^3K*Vff3~`3hdh>4hyVkxGwC2MNm52>+~{F7Wb60Dti5j#OX3a(E&y-3m0JUa)mSL zES0Ll$!x+$)01vC6Umjda4hK!1S3I5$l>y{L@CnReNtL)Li7nYdnr=sN(I%Z+vd`O z-jK~^#}nyrMT}sv44gn4J_7l5330l{2ccwTNb;(Tk10?h#O+-gaJ5x<^-jCPVKjS{=DOIRYe^RHx-kc}mu;SZ zcCc1!c0di5&jb>_i|tu|(s!{e-{EPdL1V6;kZ+})p^FR^oJP{Ip@qm_FFQ(L#|C6@ z_!?irS?gpW2WBAC2c%LqE}mC--wd@kp~gRIZu!4HEH+!t!#Q)W$Q08N8AK?ZqyG@jNyhNE_} zk%(&XjOL9y*vEqj`IcmK?#p`G<&-u5+?<+Bs`6GN<#x}#7GQ5ilcN9EY|tr~pYu&l zeb}1k4|7iCaKx_imPPtuE};eddFlJyZdhMmECXMRL%?5`4mPzzl2yQ;W_FV=_8wCI zAi-(v)kowTG42l2;vBA$W~v%&V15Fuk@K125uX=gnUt0(2AQLFsxPf+FyZ`~i+wJb z0TcABy(1QlrdXskxiZDxsn&edG(c`hKoGPQUeoGe!VQ+**}CbgSVc(^() zo2pUJd!9e|d<2x3me6z~=`{(jrnG3noRCDKt+V*cl$tOcj#PV0zNU%%&6D$^-o+)= z!Pn84@>#xKIK8l5%=y52X{PU+@B|v`@xxq(3;MnweFAipx!rdstWs4fz?2mn~m$+1CCu7w%a$xo5$GJ(J7!EM(hPU3Fr$dg4{9 z8h=+@v~1ahE9vth;7m5)ot#(RO*{l%>9ryXcXItK;D3fppm?vSPqwFkKQH~UX;Eh{l+S{ zS>;cgrmj!>7T_OF#YKP+X zA3JOwiM~`{z>n-#z>n-#zz^-0Ja7SjLAthS-al>O^Q?5I6tVCj+ezU63hZNxj@)_@ zaH0=+x`Mt*vwoS=mHWEjNAh(=Ir+Nu+W{=k}omm9vgf2pa z`EM*Jc0>1MrZSR96}xpK;PlyC2;;#lWBNNTG_u-;TVt*vSE>bGt=;Z*abry`Hx^#w zZ_@&lIOb0P^CuBIYn6sfxmBg$ESWD(_O}t<5=tWM?TWZV3D4Xg91;1uLi=Pmm3mdCN)@BPBi%08q0xM^;9ZNG8X%)570$^HmG9mv35 z2|elx$l+jlYU{w%d6U42tixX5q)B-mu_n_K5zs1Gpr-XJ!l01eJPdlq(DB2=#}EC~ zMTSR4dpgmXOm-%I?m?hq^u$Grb}tM))lhY{Z{$Z>T83MKwU_*)AE>Wx`3d;p&<_{S zcL0V_xHCv9qCgRS6N~SsH9bYz)O(xg=JvLyhmRYs9yj!ya5}G`u4*UbhI1`LnUi?` z*bJdnwL}SFRTU8-nT1v-mJ~5=ii>cowpulKWS#;f!^6toSX}aBk#u>{WNOi>!M?m2 zgUORh|9tDeb+(QUjkIPv0^zvr9htWkLC;bq9LvOf{+ycg&W4sI^|T)K_%wD^gMAx+ zo7tHB>6&~EW~hhud79!#oJP)aMmF$|hxSWlQnx%_jpTRzUvh4|{ zr!C}j+U=g!rNi-};f=nar`gG@FjnealBhiZ{^ywT_4Z|Ry*Y*bMkC<%n}9!$eLE4g zT}&gxdJ*u~r3d&r6z!0X6Y!U%t4#RbL+T%t;OScZlFSzMU%_6ffS-Fv{Wq~!O7>nE zwnG-&v54Dy*bt%6SbrlT0VXW>DCTCGK~yf}LD)t>&B!RUL|EJG-T|*SrG)~ejU#Q7 zZSAXv``3s!{nXiIOoMT3QjU)^lX>P&p#yXAsTBQ{5)CL{R?Bzf1S<(ld!NW~mc#^s6}~1r8LU6F594 zox`o9GA!`s`mdYTh^S8%xTya$_I1Qq_8wCIU^AS@Lc~}&+{8;*=&#A&k^e{%1bedx zB8e%pqDVb5XMF@Oj2_upg7Q>^cu~cc7N17i=0b#6Z_MBW#Z^mn=8Nmtk~OCDh5jTf zFKTI7R4R-vFAc>j3%Yw&Rx@%Yjs;d;ecpedWrPSMEkwStc(~UJ1G5l5|PhMY@38A%#Z-8rq5t#nNYF z|A$A{e@#k=oJ?{+1OX@)E_i-P5J}!xU z(8Tn+)~($)lZmO>%9^g;b$xO9Rw$fn)?G0(bHzHgkE@?+hSqj>uN|Ua)bIK_df@Bz zXB_`OA!<$0IsqrCCg6XTKE*u&0jG5;;Ll56F{LB5Lu*dJpTpWB&*boSUY0)2$1C9E z0f_ofNr+YQ`g>`_7W|;}MpJ#-{}J_{k$&8SCt2_U{*v?uvHyc{J*o6q@K@Oj(yvT> zp5)`D-9z%kl4d)5&H4h)Bg$5N>Q}&@k$z(J`y`KM3iwONxS=c#8rPHD+Z6B@qz^aY zPZqqu^I7S8+=3T$AZ;MvuSnN5)u;HUfWL@#gcbswZ2=Qb7CPV<2hs0~JUUS295c>k zkBE@w-7rY`7Axz@3x zG8!>q$8oFUk#ZS3I*qL;lUnB~Ke0yn7aFYvC!1G{{sr10ZNRzBOYk!CbpYqHs7ViE z^f^d@E9KjyIJXXA*i$kIB(T!ZnrcBEme*<-`uXb>fS1 zW;Cz-&YlPaQqF&Nf6kQ*`V;owDMdAuw0|S=8D~5ciaS0Q{JK3Q-=2;;J#$|PqW=&( z&sO^c{s5CL9%noq4$ZyAE(k^#L#*~Xm&`&uipsI#-29+PhmUgZ6mVLN0{$Fp<*QM^ zY1Ik%Q!L8qD&WNB0{#pe;5i~4$ca0KN1fw5O2VBbrCc3u?MLpNFg6%zH|&*A(h-Ou zm!e7UJ)^gWYina+_H%DO91GRPyg8qm@a?buG$h}K!31khudTAQ0F9nn=2vPfKNGA@jpF?A?;0GyN&Zf|{Atr_Zbw84cv|p-1cx3k!Kx_83HW#YVg%-t4;kF&;p-UYFRTeC*iPX& zFYv?6{bTkLp|7W+>HcNqsk0|0&YJ98KAg#>eo&cdYn!R`%;HmqD^puX3^A)jy4sU7 zm#tmDZ#vc0rz=~vOl_=poWVu8_9!1P5v;(K6wK5N16GT{#SkK4Ts zDA$8j+o7aSe~Ux+U{sB|W%&{5SMd7|eddftOG;)h@d)o%`KSfWo;nYu2$X0)H*P`Y z2O3cM-iwI)1m+J}(EXRpnb3-|p#fD|&Ys7xQFk80`DY5s$<{OZGsQEQD`nDx7S6G7 zQFdC;;##Y&{89rdKR7`gFEIR>1-+AJjFjp`t%M163Tj!k8&q`4cbi&4wDN{k{{iV^ zK%~+7<5uerZLe9-FI&+2kD(o=QoSNqz;{7uB}F^<9+JgYT)NR->>F;d0doxDW;t36~q1nXvZo;6Q7CUUzoB>nIEhW*%~Dc3(NJ z=?(`{FC(Fx))=Sawy1I+`I8p>$0oci-$xc1=}_r$X?3Gqe%PYVfweWzr@j7~aw_PP zluo2|iS&B*%w%i*aiTl=-WVxbBG)O;lfa~q-sXmcszru@I{Q6KXwkS+>c?< zKxW?J>{xL}D-sWf%At@RO4uFR*amy&hU!_Duv$p&7|&;_o$;PEmDb*zFBpu(^yH4g zjqjSAJ$IsS%TyaT%p;@%+fe@t=rj%awG>gKhWz4j4@y@oHwUT6b}x@BM$^!Vm~8FzSrZdyE-Nh? zY_TOtkRb^z9a3_Ai;Z3qV7-;;_V#HxF}-iyy31zbjwun_V#WX7+eqMjL|A%&tUGbV+5Tb)HZiZ8)8#Lm3Sz0etuZz@Wx&QSJjZu+Zi5O z-PyUaKU4OHqN;Ad16*_d;-weK38Ot3PJ04QhYJD|V$bIt(0XBKcY3rFSE7%7n`yU zPeK2hecuJ^eO}AV&r)MI^C;^Z+lTL{WtN>oTBc+9aP|-_Gb=xlGUl%2T82fsJCZY) zvVAjL%dmDBJ7)`eiBF0Gmg;ZFIyk3@cMd-Tb3raLCf<;jlrW#zWX zs+zVbk;wTYXGYRCn;Kcs;hNpIa%9)?_Pz}Rxdq2A?(o}_kw{hvPi{Tqf(6H2Iek+1 zno4D5ch}0^%9?KWW5pARXttDQDBf^HS3+Si>xwErVJne^DLIu^85ty|bU96a0yDzl z@{`D1fC|ItN#@VPAAw)2aQKByaEJWF4zm?o=X~qP#@K^iIH!Y#38~VcUz31Zs|Mc#M`$s4o@7D(aec#X(D`Z*(0flaS3^@>;`+}Y@eJ|2cxL|@4gFpq{Vt$N z%dUog*X2fC((m8n7RdZFI_Y=wnf#81&elo4o6y4UhE~-{znjqFq*a&nyMW3M4mR|= zPMOgr^v>hvDMPDLQ06Y+BH(*y_AEHZ(d3zCirszbd@IoUW-AX!S6fwV``Uv7)$Qc*`*q>WXE)e#gSUf9Y|EtMlk5+mP5Ap zH%51%(3g+7Dh~G{oT?_ksfD$ZLdAKqL08nRcXUHobB8>T)90xQ?QhcQz*0fIr!iKK zEy$Acm`p-cCclh*Tz(vNo_yFyAqhcGZ9OBJ zNJMKQ^Wt%j5sk*(S~fVxGY({RYRe;uDAkB2xQ#Z#ZL~gViD`q7573BVP+$x~62=!I zpwMVIRS{5lv<$|^5t=sDIXjdwC>3<};+goeQLhnnx%0ZGW6)T)-lydHCkoT&E?s)g zrrwq9?JIlxR&;c%kQ1rSo-kXdA=R}ubIck2*p%?)Lb}JLg#0Tej(2LEMMKE>Z9=YB zHbN8gY@rgeHY$A84~i9hwpjH9B^^jmr+lyUK651yoK~xV@0UJM7i$}ErPEfCSF)eV zU-=1grKkqyReFNflz8GU>Fy>t@jbyE^8F`!z`M{dtPWj+oGWe-So38n6zjL3u5(;r zYo}IaX~xt_2jb2R+a%&_=^K-cg(r>GUgs{hyRaaiUr-RgWU=G*f=BNu8Nd=5f4pB{ zvyhMX$@;HYJFuUwZy|h4xI=#Y7^)4Ak=2zOtlH1je=7Zi*WS}qoBV?xa$SKPC+TKR z1MmmNN{0%WG=cA5lq1;3J8T#4i)38UK=|$)`#Rx|)~Wt$TyBe2?n%H}sqaTqem;K! z`o}L}{$TM@U79}uz4una`z1hM<+CTC`)|kG)jtd9|8NN@pbvfk5~vQZm)W_56wo`r zK`n47A2~rwGN4>8C8U1=hDRAELF;>@Z}ZVl;2DSfND%t7{y4sWu?g?He~0#wZzoB= zlu34qULQDss`UfFCBh}AfIjpkTKfy?W9-9}Z^NivC)*(Xo;a(HPo{B+Dr(>VIrvfa zzaT^N*NEEiU1KXp(@N0{U^_}b#N1TiI+&{%f?_+Oj=iI)^)xNfbUNCc8sN$#(y4SJ zNjU(OjOxs@1KjG}5=(`{38N_+KuK${a6HOCfayFOjd9hVua8N$@^Nj% zxWFw?MvOy$CKa{+!dNN9cbC5B3!?4R41B)*!|$eTR?xur>G{k%^`!n|8xe<78;dAq+ z!G6epf_|L0(s}q=HlsseB*=f-N6tH(R{E#a$$z~~-e*(iCnMuC9g1i!yHgK%LkcoJ z1FD(vnXml?yiL>;SUoCp8Uw3~xh+air#y=th$zM|i}m=!rrM9_WY4YvUwmu6HdfOs zd^J5>zmT;w)qdh@V3j&zJj}p|BT~-H&#zj+1t*LRL+l%x%PWqoy1VQiM>HDr-Rbar zszF<%c={8*9kP<~`J;{y~xxbE@aT- zADtY*9^@g~MDW={FO&&IZl~*e2y4v7E>8DH*ook5J{s8#AK>rPZ5-=kX4Y`s7VYb5 zA1}=7wgPrC6NKBV92;+Ov``o=)(-Mtoa;wCdUx3%Y%pDJt~GXZZ0?cnBx|2!s$8P% zQTeSOK+3S)eAi9XCcQzm;rsIQ#nV`=z}$q=YW*tL;i5L_cG31-bgoNK;E?){0M01@ zTZ1S7=bxVq78#;PPNOw#joEgv%?8gB4IPCN1rVvS&dL*Io8OKaM6j<@swk^Jg4|}p z1hHJM3z{-T5kDHoR`F5UETFj6n5M-NK4PJW6Z1g5bEUwiDB01|`ioQ~p*y+My^khD zOvRD2_4WQGrLaxVYfSNSiO=bX%uz@bPR9$I=m;NkJ%{ocC9NUm=)g*fgHfz;0Y(($ zd$K}9nBgpBwKP@=_U$R?B`=t{WaWxWXJ#&4vGS6cle$(`dRBIKuk5L;>|)M!`=$}b zS-)>)X5aei`buSeb!bCR&j#Ql`uG!iKF8#x1JEZ8_&p{Zp5t!61tnXNYJ->d3BQ@} ze8ht8znsRzTUItTpi0a6U{UUS&)02={Wd*ws`X6%T=5LrSEejz;X>JJf42oK9%I#& zUui()2d8NNLX7ek7WB?D=35}|l12l|=L{J#^?vDi>F14SloQR;vV0ff=#6sP-K8i3 zX2&c)G;+K^{(}X-Tl$b0T_7sGX~7?mJ`Jhc!0ieP{xDlCk!>h&ehTpSm@~8A^y#Tz zsxRP=VBd0n7Rc8Z@VhPhp86&GOTZtX^Osip#B&69$OqOneAflsE))Fl2jnHpV@cSE znSW@vHOKN-E$IEnThvxQYeM169#6Z*_aF=BhDN{2)rXZ5mA=P$zDiUD&yT@hIE=^1 zexq|Z4hObFt(8C_D(I)fk2wCZc?q1>GnMHZO~k7yYl#$>bd`q^!GODw4eD%K8MTv# zN7@&Z6Ruc~HotOq%|zACOg!G$RfYsC)gJ@CEqsku=5syCQKVE)_BU4Tagn%}-Q-up z32$wOpZ)G_*Kjrw3j5fz!8lSpYetBb-eyUQSs|Qgt`LRil)vAK1}%^uwPx$UCTk99 zU))>;fSR*4zY6~8u+lrFGo<^ixqQ!IrL=+`7p2OtbGuJ`o^00)_BMWq zvBM|6xCG;0r^HB}O4^hcNkAtB$jL7tq14E#17*r?IU2|YQd51=j!bSalUp*_GIUIT zdSXoXC=p-YtB#e__EgJoF1x5NJG!}d^xO@BR=-;bWQ)w3PQ^2-%dHni+AGUS!Cb;$ z40vP@j+Uj8@l4d^(hJp&zNun6QAXfOGT@(08E_q!0UWN7_8@o}QW(OVcCPgd_ew=e`^PA%l);QO*L}39E?J#a zm$12pTT2qr@#4k4Tf07fGJ4neE6|HDv~i)s0yi zG^f$r;=r_#UnlZ|X-g5=l3eSE6XI}zZqidMz2KPYlH)4r-n87kZeV1`qRQfs2QwS= z=v>~N8EW&}0t=2CpFDLz zLiM#`G6Qa3VNvVgWZCW1Lt(?=&6c&+cCFNpQ~~4^e;j9-l1XG(lf(*vC6ALo1izY2 z%bBYWOh))~C!gDeja7;KXLxRlpQGpL<8nRaLv~cy=Zg+z!abd-wCqYo)kIQ_Ca#1; z>W%1NC^eRG#D;p=etsi`*&}A@X3iT=x)I9Zc-$)2Ams^)-52Sv{Dz1SxB~cDwI5qV zToJ)RPS#H*K%6B4`^nR+1`ERcM$a-3{A*{}AO)Wq16s^wb`s=bJ2e50* zvr!I{+B_0OBw)YS(ifb5+WBPdFIqS@o{|F??qBy@c;O!A|=)L^@2>~UmSwQ#irIjF{B&7uO!4Z;D0!q6W z0($3mfyEvgn+c_L@FTtsMD2Mj?&emsfRe>WZ8+rzqz^)-iMIF3q^$+~VfHSG`;(yD zUM_KwH;VfANW#*D*9$n+7x0FqN$v0DaXtZWSegP({R())(iCvAGzs3YGzFHAnb%z`lO*<-gO56FK$u!On5kDaMYu#EU zf^1fVkQ^uTFd^yI#yuGn*AeT+!7lEf&GwI_cHuBi6VHHmvRztFOG>3Qim139V|<`x zq&w$2fw3c5iCAptxST&*PHRb?IYF0JHAY666Xu-UXG%UXVxpO#!+{x#4$7_8hymsE z^;_wuSOGblCUD9sZdsBx(&<^`1d1&Yq$ZL|Qn+y25KKC5P;U%mqe+``n?DmwyKa?j zNm&hrYM*km^IKRv>hL>in=-PD6uGb4{O(}JZ2dvBjw~z0@gYDd;jxTXk%%W+7ok<0 z+Es~synp#?YFd`BcVt58z`4erKsuOpeAbpULUH?hj6MFANYrt9^1U8eO&fNPt+ojl zOvxG6CD;CF_U`s*Ss-?u%)(iu@*$P(j2x{98ta2HanElB&$8C~lNS6w3%(y`_1>`H zL^)CaPU(mBH!b*YE%@Ei0o-t)NLszd?v}%_>*M_N^HFmUaZpA?QXNhwLaDRy5Ie@3 zQ)A)U*SuLRob%l{a7~DfX-T{DhQVvXa#*Wv@Q0%~aq>-nSWD0SIiZFFzua)MCacMa zEA0H`if>akBJ5-AIYh8G-;iWvR+Ytm6PN0I!->wIH>YP)6o5;(-|4Bzb7zXPMl9-d z<|E;eV&AetC^R_JSzX&fa&N(CX(X4HBjCynTh1Qv`#920r=D9jJQZu{iuG+Cp~L}{ zzr1u&ZnVS#4QWW2Jq2oE$A@#?f0)vc;3VM)?vNW2j-VvV1oX}mge)T{>2A@+U65ra zTs~EfSnx;KuW$zgt$nIbGETJ8kZ}YhStDARmvIFDvQ@hwDF{ldNwh)hhQY3u*w1Az zMOWs}oMG)(nI`loCG$JM=*S!RBq`3?ty+RHyN7xIi+-{}H7VQOwZGc7C8BCF8}z9@ zcA}3|Xj*fJy|tU@46*2iX!f8JtFEgk%O<*V%VWrn%Gf=@k#+qGwhc3{!xi*4;19sIBqRhRHwq10LLIP_ASG$x0HV71&c|)1xMB zet=z_27JE>hjv{OY(SN(8c-!&CCYR`OXcK7U9ttC8%ZPg&p&gH^-N}jEC}AOa;*i; z4$edOSV!4{3zeD+IZjs3k&&a3;NI!iV%qwZnmKJj|9MH& z>JOwpTNEW7CwS~Yzl^(-GW9{Z4HTstF30E$=aM61OrV{h6&)KWlRGe9hg7qvL=aw6 zp|?m|I}t-;|F!Ux#S^D2TzJaF;!_sxo*AxAPgjR$J{*YILu)_ysa5aWJh^K?k7$`d zV7zr?OMmQ;Dl;R ze=L%Yd0lF}FQ4d2GVkC?9%oW_N1Pa`7!$>3{|8)&wToov2K4t9^xoN5Ehy;&QFs4} zml{x|-Gl~_vv8UG<)0AcMcdysOUSppwm#p^XRUVbFO!9p!TwZQejMJ+0Id%;Kru8E z{xgEhjKe3Cn1I*EY+snKFWZ~y{|D{8nf15K*H?`B`fSa7eR;SEKG6gp=X-bppDhH( zx(cxOvngaHXX)(p#(7zZ@%;NA3H}=`Nf@;;b2Tvjd)m%1(O5z zOh>7Z=_s)GSJqUzW;+%y8ENtBTHv*i8V#1p@zJ(r1KmA?L#>^Q(07D=fUUx5JmSE2 zIS ztk|vQ_f1lUFK1x<# ze%;WU1AGk7{&aE@WFxxqm2!B(BkSFC!NP?XY}$1G*x31-DwD0PlaOQtytmfKFIR6|8 zBm!Oi!#ftWZQR)LRm$Wkn0Ha(bnwN82oZ{O@sSPV?6{eJCFTq$%;SS9Wlrc_uCOmM z(9*iNt#wgLBoPZlHMjdmdhK;?RgER%UiXg@?pEJ|;|G^sxT?G&751gxV|RtL!bDg1 zXc`-FsxRXC&nN{fGEr~T{kx>iwP4qxp$59OJkkis8T}pJZcY}#raEq9^=Z#Y)PnS2Qy*Owa(xTn5%IfaYlD3wCaww5> z;H9m$?5D(`Iq7@3iD1xrOIUlxx9+gN$7}>*b$7cS2vGkBOTMH%y`{u)`+&w zF6wf}gFO@N?W@O%i%wnAx}YUHS}rflw=DE@t=iFFKKZPZ)@zEEj3gbt-lgliY({6g zII*cRe%km6h4FHEyi{6TE-uE7tu%%cUkd1lI|})ZEzWc`GY{RA@r!8I{-&??d(IfU z^{l;i(2=kuHLp(|&=VTsRmdou``2KYGEEl4C#0LZT9A_q9$hjY=i{rp>ZD5m=Gn1q z?wksfL={&J)09DVvVV|UN3x4fomhP8qSl3JN1~D$-ML`lj**t$7w9_ZzVvvdcl_+? zEb`Bgg*MAhj0A_47DrB~R!ro8b$WpM|eoIMl8 zg)P|yB|bUw9bGGT43tkg zaL7n~m~~120!RUn3DhaptH^EnJRrE}sXhuwU%kSHq)!3@#^q0C0BPs#lmJOf2II^FedHp<&U76ykD>Rqgd_k~zReFV~;qTcJ-=|W?H*AAEVmR0)0?y0uY zbWdffwLI0`QY_^0zo&oG;NYfy@wsZew=zz15B_ZhKKHTh4gMX1d>0cpFW|ow(jA?S zfHR_M$Avtqp))=F98%xyNx$YFbh4OQdo`@1t$qlU4t54S% zKNah0S0~)jKrl*@Yy|Y_LT<~5DanKlA#z7vfbuOAe-OAnCf?iY?~d? zP#~&@RnG>OY)@6P;7*)}3lhmyK{ecx{yB^Rb9C=)A?}0NI}nL+sG~im$UF+|-X)3zy+Xj+~~H_h6D7 zuX|`3^*?ESVKo?W_#Ey`G*Qf?BJqej7LcQI$p4v8G#dIyDv%3xx1{?r?bGgHAZP?a zh?n^?@o3KLOZh(H4nzZ?sQ&ISu8Qw(>sbJkium;)YiFn7?j!KD;8(6QVAPdM2sVlF z9%k8nv12Tk>RnQ5ZHX4!7Au3{#pS_8tz$*pi>JpjX>Zqbxo7>t7A=a61vWH1J}|nt zv$Qb3BpcIOa=MWNHM;6^tjM;~nPx7Lhar-MV&@m+LSKLx-ybj(C40mF_+KPmdR9-$x0^I z>h}8k(ttm%T|hzJZU1l=8=aV(lk`*byI*yW+&#e*Z`oe;j=Q{~FKv6f%wv{)_|({hj+8McY7 zmwyc@1{un>1JcS)mhO{(0SII$!|_Y0pB=|KID}$C#{n|JHX<~7E9yXovJ(I)vg6qn zMA*0tWm^I1W5=)|`Nx1jhVquFuXgzkKp;ce4%F#l+gTCkVYv)ty8!8C8`vmf1x~sT zl0Q`dq=!QwL(O)sW9t>K!y$L@J0@GP-*X=#*ABT;nnD}>?4MZ&|J}uZkFd|ME=5Lp zH~(Ek`4*@)hup)T?_<{j)7SC4B8}tu4Er=|S3LOLD=p<%UJop(yiZ!lalDR=^8WjI zdj)nK>*2o#q$%(&BDS&(=kc+Z#CaDtZt)chGh#^~<7S@;st9%0_5@`k;tR;9MRnC1 zoVzYcx~>z?J|+JG-dd-F_BY3OlE%x^euY{3-_51xQ)!WXh?n-`**W<(JlhS2v@DNH z@8|lm$iBqOd+P_~KZ>WJNYVCEdb*9>U_O0NQLLv?dVwhYt=aQIoNS`DD`wjt;BB|D z2YC4a+J1qT_c?jn+r-oVhFVNYv#Z%SC;~$R9wKB|3Cp*Hqg(hoScbg{xoLpk@s&u0 zLLDVKz4ic#0woj`K%oO)9bfl_mH1@Ecc<PbT9pr{XI8RpTjo zrU*S>Wq&fCImCMSM(g6%(m4K=O5^vnj<>dr7mKi@#<}ec%1hsseRvLDCg$Lf-ju_B zUq~H#^Ca-!y*c*5M6sBtU7WjjenjYZaeXt| zRc%3ewe+H_{)FD=l0%0dKwor2c{|-B4(o`!Q{Y$ZKM@V*0|fZhRMvV(*+1!VWsedI z8424SIbP)s#S`@TU4kgFun|W=to9jR@+5ucWAX`Me9nC#q_NxK1IFn8+LC7YSCT4S zdZxxOBcL1ZRlodboOPx(w+urjHls--4FvW&fRjxflvT13LlOBT!t4`E6x<10Cm=f= z{R3uH$2g48UrTG9%i3_^Sj&j+Z&jnVaQ?*VlGDdCBg;EwCQ~wN#iBo()G{nH)?FTL zNoYQAAkYyhb&Z`e*|TaSZ^v#GQWc&#WM1<1e&DEKUe?1`(J(KvlxLq~mvbI~8MTow zAqb5^9s-1xllVSrYs(m6$D}8jRG#ABol8Bbgd$(tp3wHEi+|vMNKsLH(l>Z}hqQ(k zaz@xW=}9H6r_lQdc>iI(t`HG9d|j#Uv>HA_wD-^|nm+ovIAq0L^frrxFgEI!;aw9s z-12DY8%yChmIX5ocB51C2h#T1E@$-WSj6j5mInfOjgj}QfAa^Zg`xUR`Q7zzgSSm< zs}UpE9x;pvdxJhdZ-nVjnD*&S`Db&;h;86^FUv_^VxPnBS;X044M-0_N<9aSxtwPQ z^s#=Fe-q`$@%w*FjPd(e^LYkIcsc6Nf@hf&fJa7edO|#7Do;1N4OJ0bDmM&3aAujZ zFNY~cM&Wmy2yhO8H=UH^L>pynhvKlUT!+JmomqRxFhY)Or!Gf3X9nU%$X}_17nw@!or?XkTJq_U41Fr2d*~lX-YgGT?17^H%6LYFQo~-KOBpNzvA$Go&Mft zM3go$?XJ0~kEWkmi=(w=qBYuqhr81VkkVVA%xS{Av(Uo*^z>Jp-mlYN`4%Jc)&a9U z`FX3oQhf&2<87otaL2m{j+lX=#)WW%E9>!l)}B$Vp1H>3kLr=}O&x8UCL*yPIeS0w z#VyC(^nre720l#J1@E7k`M`zkemzLqNk!XJqHSS~nR#+TW#iN&8ir@Ph#K73(Y6r{ zMtoj$Gjhfn&yO+z%`Y0fsNIJK9ewC(%NNiU@qM6v8u;`T@bPv;8faad299_MzjyH8 z>*}Y2>QCVJPN@y$ar|D!fA8YIOZ7`J?iW#hBCoIF_Z0uV8-6&}rSz)Ok5f!omt-N# z>z6&WB`#k_X{4{>p7~@F_lAo4?DuTb+tg1B58A^n@2aw^H@Td290v5k*w?lpe$YDm<_^Jkmw@#p7%vlfi!O5T1q_0KZs{|fv@ zyn+8tp}%+Y`t&;jTmHxF0B)tbh|b?(Kjxx0i0-&&g5AmC7vug8f?w<+eCf=^^Xve{ zL0}EgI|@h(5T847iwXDaZj1W&xm=g|qrr^t^fMi{Y=7jdKI{g6C1ON_!H)$$;Rrc3 z(xFXlZS05LNo_QODhBi+W@FZBEA2g1eY_9o!_ko)*1>g()3+12v5q3JGV*V#V!6B=Eb zJuLkU?+L>y*(mNzB=KkFn-5oEB!iQ&_|lPFIofp5zuU(Wt!itxJSvn()aAf2FHcyp z*@FC-7y8Sg?O)12Lx20E$80zLgs2RhrC$MO2llY&cSO3J{a7wwb}o=s;&&du@8rKP zdr}*vQMT!HH1%eX(mJbY*A#J@PK46Ss=N@tA7t3WcqGB8U!ESo*Y) zK)0x5=t#5a2sEOPJp91EL>J~don%kATsQo^FGE{HY`bezuC#8U1+>0A_sfcW#ozOS zG_o|vYkfxkHSnLn?#EH_KkPIBCIem$1|#xs`CtS;;&##v<`6Itm#d54EV3Gxj~Iq8 z67&W;vR%_19m{(PZ2>>Xg3CwvdA$WCc4PN24WpW`Z7Qb3g(GwyN!E>&250Xvqoc?6 z`TbrsP4|%??op^;A%9ybz&a>Mu%d+wY`z29Ajxv*t zHe3R6PdJ_ZXdxbN zRn=Bm#shG+mP8`nL_`k7{E_fd06a@WwXKl}_+OrhuvHY9^u*)nCe^p0e}I}A=-<${ zHP#+aw8vuYiFiAm6D-3+%_=3_XY@_TM<;e&{vCJQ*(i#~_Cs^$;C+ruxWxf_g+v)~ zrB3M%oIOdQlVK0L>WDj6$hDeRM2h%js)gH1Q=MJY?Ja|?PJV8UQoOY6h$mLmv|=n) zh(ro!^Zm~O`uqgFOzHdd@yYJB0|RTj)5EPv96H2Bb+fcQu_;h(+nDGy;vI=ZN8IR4 zJPp%^Y)~C0A50N$j^OMcc2G}&TqMtI+R~JmWioF}-^=`^;v9u}zYNp?1r-ikojm3c zkO!%MHbS4ZJLbQSFMHSa;eoCDmUnEx#Z)10K4Ofdr_Nk7apux=H5SSHLN3i19C?^t zrpFS{$)6-e%jl!_e(Pn67AG$~f7PZ77dE|*k)%wd{sj2<2avA44Z9N5CDB29cYL=~ zBfRtEnaw+%<^b2}ZF<zM4Ty0&h>A=P?ksBdyyr3$D7gDJ9 z-YmOr`FdHg#exxovG&f|-qkDEHSvfV!=6AS4qk%7!b!nfz)MqH*FJgI^?;Hze;>d7 zA2jD2_69Pr?e*8qclNj-agx~UL$<&Y!5*CrW?_HxJw9yb?}+NZ`_biOW4wob^qpSo zb0g@RA}gr2^Y3}X4_1Lze^%asU2Ni*Ww_(;Fzf12f8B|d(JZ-%YkCxt>G(#=1Q!1| zWDD7q*1n!FHc)CYm@qU~aHoEnEU?<`Y9gWHau9rew`0TFLbS{8R$W>&o7D!i#Il(Q zEnG-@Lb@Lgj20Ulw5|3VczKapJ$a^keM*aGvEl5{s>Sk1N;TA2@z?RF8jq{d_`XCm z5=$T)@Vi(n=(anO5iRTWxEKql0lP!71q>DMsdM@4i!^6pu%)zOdRczy?$MaxPvh-+ zE{7g3E-0jzPAyHBC$Jr)z^8bc9+vr!keZOtnBo` zbxPLmchZKpypz~s?i2wnm2O@OnfDrk9zu>eToz{P)^qVtm8(jH8{+brrU;B_f&A(Fze^? z;TDdV4^m^_`paf#FI!)`hQs%Xn}_Ka@Tk9rkH3JD8f71e-R&>_JGwhAGdDjmcAz9>fk}yJM)YZ)|mpRItf8ebj z1cp}uLwW-MBoM_kn#4U%?>W?N_A4SW22BK0|V;cM%+}y zCg+^V&BKBE+hKVgoq_urXGuRN{MvWI?I2zjjSGl0gbQST%Ac|s7SnqQcX18cgBR`! z#t>n`#xId;12#6%pMUoOW?7Ib6*0*BTs0SY629Yj7b)a4XrjpBn02*P9*4 zc;lTZ{w@TcH*vi+h;aL4KfU1~j@)6^vY^zvNGwtxJaeziTic9>X*qhlcN)3z>?Q|zKH;eCa73>$A|9`@+82zfe(zh~ zqj)d9@OTr2a-qr4^y3fJKkAg?$&N3;3QCpQoms(kj1U8xvvP zxP3w-9b~P6XfzqDJs5hq_6Tehq`|cWGvV--bVLoHFat>KpaxW6y8FsF5$`2D)`cDtL}N4xA^(LVAe%c5z^goIUD7Jaar-I}lVT{P)q zD{;elIOFxyzF=oN{hk!sbm`RQZ4Os1;t4tLSoM3S>WOACI}5P{D##_HeLTVaZ!-W> z!g7xS}Iaa_q?yAIp5eC9Y~T$>7}eIK0suub!Y(=Pi}b|Vll z93QYbucaBqvf)`Zu%YEa*#-Up27-o-9T)K6;Ul&Nd@i{;U_g9^ys<#-dY|9xXQ%mM zUNw@beZs*m_j|Pl=X~7kJ!V7i$zay|fu$d^Y5q_K>jAM?kqnvq2xLPBvLROcZzJ;wKod~ENxm{pmL>Lm zc(*tuv;?*U{3z_{3u6N8$|HUv3xI-~N3UR&vroroRxXbE@P0=<7)i$a%89Avs!**D6I{eeS^GY(P8(ni{dgd%!2kwka_uQf)(S2or*`a?aVheImCJ7cJmSM^N1 z4D*a++=J{cb{_DTP8P`F{^_^Do}H?Vjt?T1hweCX+USCTfX~nD(U6+x{qKmO`UAZ8 zaunYKe%=km{rja0igpE9&mEcz28 zjrlFqUy)bIAxPE&`QPNPQG}11ipWB#avP2UsXWV5K0MiWT_hQ1zfhz2QyWwF4{cxG z(Y74#rrExtqkU$_NZ*RK&e`7X6`frx{HaJJ!hRG;sXX2gol;XHfnv>k3_jAdNOj#w>s+79$Y=JtmWmw3>&*Hqw{vJ?1?5S3T>`ogCP?c||fuK|37B2-r5(H&IWYQcxO_Sms~n&EKH}s5sVJnoQ@DHN>+nA49Y@Gr zAznVpTaL)L;Nb5W=`(ZJP<%@sjmBcpy?W-%+#T7N5`OE2SXRlU4K0~A)bv}A0+xI0 z(O4FA@4z%aCVv6>+9ZvUpo9$`FrF#+TM!+_=1(JO|MYa8sgK&8P+30BR#8v2``q{X ze1B9}k$&YX+N-0Kg9ZHzZ?v$dLJ5DxA^Ux`S7bRBK(?#R zW1suiPzduw_iNJ)%3Kaiaqi_CD7pb&L2L@k&!D@t14jq}R+_nRS;y4op21ZM6Rk?? z!jFwkL-5kvFWXpzB=-&Pcwwthe^ zx=a45Sb`B3s+G1(Z&4*)rJu5+ytp&imUlVhHzZ>6LbB3dEKij5wt*CGb3qh$H+^=y z0+m)@Tn&CD26nYWPQI>4h>g?vp-$K}$Yy|5)sRVC>Ocrt`Id+jy=|GWxaMW-ZI$U# zX}Z!oRcf2+DdY?Je4)U8gVTED=}Luw-GJaNQkoN(#JEvDSRM-DLIw>u+ zXMeW8Y^^CvI9$yLehfTzZ_{8H3}s3x_T~r+M`g=eA6_Z0g`s=GKqRD5*-W zY0M~S7@1XELOloOlsADdnPNPZgx<1hlEYt0^;u=C--^-l(DCD2-LK89b3f?U^sZ2P zhp!lxGrXp8L{;|4K~)n6=Gs((7c1@@!O3f+*AZ)JS-l{bQ5VZ9M@W!(@~VgI=A1E-!Okx%w$Z=Q zL-eB5b)^UT9mzM=gbcYS54qE0=ectRbJm>x-P?SM{OJk50@ZUyh8bTMB^4HOR=+_O!1K&rJlA@B6SQ$ZE;X=bVq(vRg zm6e_W6YBd<9f9R#Qu-1x`xcX5R}`O@nK)ov*@TI%z~G>}y0Cx4=&ZUaep_m~&6YYW z*Eb;DS6rGndsfe$IjMQx%*?LDg0xJTG;(;%S-IL%~*0hX-tmNcCQjEpZwl-NNWO|bQPM^h{ znUc_tHRPW#5B~x*?0z(-Z0tsh(1`V~IpJjpHR19JBIBf*hB;w;8Ulx`K+E5aI=iE` zw&UzkBlYLV`o$9m44AmMe()kZCoCRU+cCJVqkdp%oYiIbxnuGDVn{C5?IvW$xqWuG zEjG2vR?~jYs4-{J#p-8`8Ffy3O+)d7C4+}7o?zC(rtM$F3oDU z=M2g#sL!<9trk~ojy*b>R;&83Z23d<0{Mc@ji0E`7Er%R6$}F_Y;)jpH8Mk898c*R z+Y12qOE&YY>)%I?5}t9!xa<=%i_#PET}evKW|I~hjs;7I_4Kz#*I^@JT$Melc<_Sy z`UQiB%pW{>{*bbdJVSmw&1Y(S-XEmHaQMHQ{bOok zQlAip0%lAG+#L?jPbgjTInt^0<5_-rf~QLP+Z4&16088dSiQ+J4B`1Uom>rOIH-&a z<@#8Qm zI!d<&s#+zBQLf~0Ae~bGcB{8rjU^lpA-x`1HEF8V;G35MGiqiumbTC8 zFQY~k`W6Zkf zjWuV3$)iT%(QX=L>^32F3+cc;ZCn^`eA5Fb}4YO<*Jb!5Y+(Cop)(@RO zcwSarF76`7e{NmYFJoM(R(UxVLg1jBBxkam;B@co!P4z;96k^uf2O&w!?z`6*lo%iec1f0diamDFE|ZT(bO(0aekZ^ z_akF=QKzX1R0S1_F{49$5K!Z=|4F(^ZOO55 z8FqWM+jEU8&Q)qnjEm2-*=t>1H7dsGP8g1_7r4{XR)eLLP;f`M-0@yqafw%?BBPF0? zg6wm~#YWnq9n8>eug{<8@%dC$Mwt)izhsp8ePtPgQz6~(wUuYqi;(uq)J~dd0##0N zV>%sQmQ-zZazSopv_7TiO;Je$aufR(uGJRR)o)n%~%uG-0 zmxi??(a{Nf<4sUu4~@DJIl>1aaII8Tim%mAkPz7Q5Y7q;2un(-3yIv%L)uUEu(;f` z{K8nb%i)qZx-r3Scf@&PqP-3~^gg@#AUY0vd*V}Z!@9$X^{_bU!JXucj&<3hBu*Ki z9wJeVl`C-*I@gv4)D}n^y$WJ3&}a}xpyY(8=qTKp>W_;~vQKa)K8ek)$3q>A)nCC8<_ z&viJH65|qV&cea!)6~*TPij1>W0EH}9-AynxNVP;n{Xq_LT*V_G-1Fk33XvqVM!7$ zH%$)Y#QOuWg)OuM539X9akJ_+3PCekMhIk^+Fm*)o^Rl$=SfA=BW?w;vV3+( z?>lI;6cK{Tr#HOJO9uh`y^m+AKizjt5;b2?OY;Dt+YH)DLqf zqU%%`KfF{F<&5?X@I~JAn2uW^%W5kfR=XqKVok|R@M29HZgHfu2Atj#bl-b;(w{n?6?tqOt7<`=!`1#S*%O^=udvX$S+(k0xmG(5G9lIa31}9ok+MO3$m`AZ#u295n>MhhU%$Ui ziSgQ9aaLQiD>*(kKH1%5kBUW`kD02js^7%;j5|8oJ=y^s0HcN)P%l#-%2wo= z`a`qMP@h0+NlamooP77x7>~mp6J>95rNqa?r?{GJAReDKRm-V&*l}o<%P~6I?T!X* zs~xi+#ElYlB3e0mES;acE08rDJt9Q%TJ?l@J2ZEX+m)AIm4q*P33#8NP7Dq}$;2jj z@?+ytyro$EM$&#Sr2TXMLutR)S00x3<-Yo~#H5r|Xa$tYBG6s0olP@QVQJ6$4a6%L zj0OcpkYFNdpO_|9b!lcz8SNOx_aqOF|MT|q2L@N-ODYNby;&K7@=QNY{!7YAPs~rx z^v95>CyDosJVP5qZDx|$W@Z-^9VjYN-$3&9gP%NAEB<*5>5oQ9ZQv;BU&Yct&h3Wu zPmIN-qG9Q8^SGV304P%WJDtan{-ICQcd|pfs8?4wqR!VG-3(6e+YBDW*8aJf8Ahu} zz^)rr8K04u?6Qrrx@^($wqvxC5*3mQwcr1j(*KpP^!K`skp9~5ae@p9wrFi^B zyc_C&BK=oD`hQ6B;n>oDJ;`e<+=GlD{UaD!2I>DUB%w3((_xYr^`W7V-XBrh#3;`w zCDfVEG~WEZOU}MWG{(cG|4?;+XBrELi02pO)xwJELT5jN2}~aY;$W zSu0Dimp2tM02^u$vmxi9L+)lhp(Hd>E)0D_9Hc%%ud3m}gHdf?$sJteuqWUHs?(91 zo|cRAHPD&b9Yyu`r}0 zlOj`1$7r~ir4p$==Aj6;TRGat^dcNL6)r8e}NKz8n)3MjXI>?q9mz;tF_-tbwUe$)V8^^q8Zz`?{ zb4+sBkj4@<99s1I-1`3ebw>?PEy?tx#m9QlDaPWWGk+QD%t19n4pdwte_h|d?b!PM z4A%E!JbmW5(SZYpPI7`P z7Ha`4wz|ZCKi=c0wpyU4$GE4eJDYGch{Ni(H>bK{n(Z!|BiiL0Nj=X%HC=XMj_BX( zCIft_&`r|P-}j}ar_s=DdRQ&NTzqOQmPw|?rbCmIL{r?!G+9$HiXGK^MFvO&QaNaZ zZjz+NV$?@^I{7y{W>QWN=#IV``B5sk-hZ~qRq6{<)*m?tte`HYufBryYEBFT-QFy_ zy~gd`;EJVDp(`n1x7E3lR9n0wCT_SJdmC_yPK_%r&KXUkLT{q}id-7wo4&msG{x`G z>rJ3szz<}b_!&AZ`d^a5H09k#l{K{z>$UnN=A}`tXkST2a!j<%?zP5xeFNxLK01=q zj*}>$$YNQB*Ndq>Z(>Y_$0)xfNE1Gv5Zoh~OhS@deB_tKJ2EP$z3bydk1rz;D}B`T zUmYg~u_NyqNMwu?kFka(LWv-$B}+U7{d1zRNXFv9qL|cRetHGe2wsMgknSy2ZP=_B zjm0OKX`X^~f2O_;C9yxc7Ag9xIpQOA$SD0Ii)nOhqI-fP$sOm9jhStAt2yz|#3tC? zNnUq~eGsj@r&fOeeeT)+(^h{VsVIZGjBuZuQOtdAP}AfT5I!nwS3Dmb~@XTCz5y37V=MGh)rD&RDc+n;pyM^p>o-Wv6z^Z)wRGw}o4BI$E^m z4!7jqp@z|tF%NSm)BKf|OhF@Bay?q{4sFA)wB#q9o~SW)dj@WMu-94R)MwFAlQ3-e zdOR_6U3NQ`2}2XsoN|@6k@pg^Hrcn;RzSb(iy4)IW{jm+erm=k8k9&?QBSDLQ-;yH-Y<>a`jJnwYK&*wzC2Mrk#EH zYwZmB4fl=OIXL5PJ4P*Z^TBFyKJdkA1nSLF><`}FlLGudFt@gW@uPrW&-hf}-^2Qa ztAP)yLGl`H4dIiW`0BR<>t?P6z6$dmf7PY}{}%KGqW_7Ylbi@YUt472{~>M=w7aWT z)yvzoX2M(PR+jg0mh~v$2dG+kxi*jRd7lEm1GVBj-~)0q_7C5VbDJ=mpy(7Nq4g78 zSdVZSQh>LJAMbm>{+A`rMN{rB%a6pksph%#Lv=&+nI{wAlZs@@{X5_3vihUCSN*6B)LOMRZML>tTdSR~J+8f={at%c+pT@0{bY%<#9M}2CRt9f zEVit*oNu|>a+~E*%ZrxnmR**;mV;6BnaPJGq`|0$s0mSbMLiO=+gffNY#nKxVr{oB zvz}tT*ZPAsWOLb)ZDqC-ZKv5Tv|VYt*>;!h5!(y4zuVrkePa90_6sEbQ2QwR8vD8S zXYH@p_u3CSG{;!S3`eKqM8`VEg^s^EB^2%k=UC?qXQ%T-=Q`)_oLezn=5=Mc2Ds+B zx?HEaE^uAxy2bU7>v`ATT_3x?a{cJGxs%;F?o#(4_i*JZF0@@m%ZK;(5!n)3eue(A(f0>z(eM>+SZg^Iqt^(tDHlPVd9s=e@6c z-}UbCe(ODyWKBxILd*V1l}R@y-I?^4q!*IMBu`J?l)NkX>*RwemK0A)W=c`Y>XZ*s zK2O=7DsUK4a_aG^i&9smo{@TK>UF8NraqMVOzO+2Z>4^m`eo{YG?f;emYSBER+=^> zZEV`(Y0syS>sLhy_u^{8-jJq@bnensV>TmT=^dIkE=wIbO!~bAr zbY^PiBmpebVJNN9|OL8~l-k$ql?$fz1=f0i$N#3-) z^?5hs-JbVg-qU$6=e?EpaX$9Y&_|G54$`~Ri?-}-Os|9<~3`~Ry@6uJtN3bP7}3kTtz_KAhF3KtZ17oJ}D zyTYpqZ!Wy6sHCW_XhhMZqNj_t6unvWQPEdLKNhRvnBuhJ{NiBokm6CrQ;V-Eey;ey zfPw*I2dp3PSxHLCl9IFW&g@)mFHGoRry@y)~Z0&z^aR@uC98f z>h0>}>e}iF)zhozR4=SvQN5=6%<4C5`qxaTSyOXc&094e)aYD0C*G;NBu5NDKlB51!8JIut zra@VQ1`N7pP*45v`nLMn^$!dlG5F5GUk@2FFVxWlhVPUTYT3f#zk+FE#(tGNtAGmd9K6w&u02XnlCNfB3z_ zKONCMV$aBaBmX=qYt$b`eLvbix_Wf`=!-{xHKt(9$z#48n?5#YY|+??v7^UM8hhN> ztH<6ncFWjpV}BV}KCW(D_qcnDSnrgd-+qe<(6SH|CWLTvrNgr<;-)nDa!uIuEqTfWCI7h$5pd6%*BI znEm@T^QxE_H3@!R6&g(BbE4%wG0}2AaD)C^X4G%;Kg6I}f#>5$->;d!i-}r^sKNb4 z6T?Qj0FM_F=_y^I&tVS3pf?ZQ0Q0?W#CW*Fguccz1J5sEc1uTSAD(aH^u=;ESA!Or z0_1g?{v?=9hW^y*jQ0hipH_|Zz+k3&VictV&!fzDgbRJ4eG}pK6Y}_fZ9YbvWR8ee z`#W$mkhZBXhXCJ+=YM5J;xxS9YQPT-YbVqa%tQT}c>(eLC(R}i&>j=sBaJ!(Ul~S- zgx_Q?z-aVHvk>Q4{vR0a649Rw;%ddZ<@{eYl$LstujTYjmt~ZWC%6BU!F>#VwHow) z%`_wJ%~%hvKfj_UMgaq1hUq5smiQ#}4a|2i*TcN08}%70qm~}VKZ@-@+_QGHU;M;Um|jGx^uZ44*V#bd%OU&#)%xXhyP#v zsZ_|~I8lTdq#~^V^EyJ5X{C4$!F!shkTZl&^~Y}6w{f=Paaa|yA1m$-qWq7;*`oWf zN()BaAp&AIW(sg0hwMSw-h_FQ*YUIhhp_5l%r4}D#;XR6SJA)IJJGxze7#;IV~^Ve zm{goMpAVBLuL1rV;7NkKb>JN1Lq=ZPONV^b(n z)L`__BT-j&q25jhZm?lup=Y^K7AGOjlf*EbNL{3YaHFr%H^X#^9IXR&Zh&xM|57UM zZ}8)UG9SVesXu|%SfqKZn1KE$$8s*xK2?-xFCpDe!ryA>5cvp?lfmRq!iRR?ldHj_ zFGZ91P7Ie%BD_Ns%0J+Fk|?rlLw-hL9UID-Xn;EdVDO0?ycMF}fa$#)rqp;ZGM*)P zVs!%6ZVEBVz>(j80TVrJ5oCIV4;xyagx$_`BLMBwVn1Qp^iK4!-VEO)1?{iuLz~h> zX(ZZu7}QUce}+7O{_AzDUilDf4$15Q4azr+bc=fAxl}GidAQI{yYajk{{IPc5GV89 zhWEQ+3Pph&F9yn&kk+3?e-5)8_;sSj^#2oRk^g5Q19ZP(-cY*2{KHu=m=DwQIDqRY zUU&}e^Nxg+Ynqjl3RMeL!)XsYPY>QCKP@&ITWu9*VjM*!84cdn ziPPoj@-lgayixv9J|N$cpUJP}_bOctz{x>1YKH1oPpN0stLj6|qPewLEnZ94a-wCDT|f2=>*pW)B)=lP5LrT!ZKApc1JB>!>#MgA`Tss8i)m-(;sU*o^Y|5Lyf zhzocFX#syA8#69tfr`MuKyzS4;FQ4c0)GtLidmOC1NUO)<&nS>fv2+)vv4YZR(@7V z)@&SmV9k!rPRRCRrp2FKlszJQPIhPB)}Lwp3;m*z>oSz{Mk6m9<^A#n`KkO;elHKH zLY&s3=jBQDjCxV+(1d0+@{*(Fn|ZPO-F}bX=MVUE{e}J#f3<(0ztKO&Khr{+ms4UXDXvqL7z( ziVJtmEuZCU;Z4NyddLr~l z=%LU9Jyg2C;rGv!-Rb0QH};q8p36}F?%(gee)r&AhjzVyzpHnBCB&}pcm0dpcD>E^ zBfB2i^~YV8?AoyNvz?C$vGX>Vi(#(ZdBM)ko!E)@!S}W(qsG685W8_}3jef#mW`Uz zthHi}xmCLmUu<;zrP_M!3hgHC4($OQ6KQLAY4>OkVy^fJ?J4aU?Ky2TW{qFe-omW$ z9_^4tSge*fO9F+!b2IEMFt0-99rYtuxIJfi0rm?PN?XLw@&vGk(b1NN^`|;dja8G> zcy+0I0<~wd>QHl4tJ;JUL6@ruYN{Hgrl>pBZR!p+5i53a-Y0fR=Ru}Hx5LRhZP>-v zDHezm#Y%Ao=FI;jZo}DrPm0arJ@LNSDRzmk)EqTjwWEzqL%+UHx@ENVU^cx%R$@MV z817M+g1bxFi6nKb&0we zwfs5Fss5_$YL&Vlw=HkhV$=)Rkz1{5uoC_+XwxG!yQ;zoajVrZHB>dIHpqE}Z|7h=O`=^+zzLHLViNSXc{uH4K2EHiCKf?sS^`aJv79NE zLhD;0=ZMvEo;Vqr-br#kbeOfMzt_qO#aZ%1akV^OY?4=q+o9{+DX$ZE$ZN&@=rbOM zp7M~qMf_R*Q9L8>6;I21#8c>NcE~N_E%}0YK|YN0|6dYs;A_iv`J(txz9#-D-xPar z>g@;O8;mHvmLH1s@=Wn6Zj68~D$~S5u^hd@DsdY6GY9&Xsj^v|jXv#f*o8krR*M@X z)9SRvAjgW|;mrMOug^617+@Q>Uo4YK?kHy^QZ@SExUz%hY;xmAYPCsWzyq)ivq{^?-U5tUk_0mq31?IZ(^$9(IBIt-=7tz8S< zu1l;Cr-*K`2vT$*T0{VP8`?c|mjL9_LP*yD_M)tY`&@jRTq)Yca_rd+hzSVOB^JYd zE{AG>pH=YR1^i057cjL|puQ3^t`vU@K!bd&79Eh^bK!FtusXeN&^Z~J-wM1h5KG~6 zIiQo-we%SAx58x^d@V)VOAN~Wp%DiVMvoc_$buvfX0<7@<#rJzUj7a%uFL8}{*yaaqJ!^)XK*gH8MrUlT^oEvZyovED0l}Ie62`QZqnp8d% zbHMOHA>lQ>aCTA?A>(HA+O zC%9PSi9v523wa+W<7EQ+{JGKtJ!!r4LYK;ia3$e1RiI)1h5t;3WD? zwB%0c8Cj6gTVxLIAIp>Z&^ijlR@{MB2-#bNyXgkV5?LzCAlv(6JbF+DS-+}6Pg;aK zFKT5SdZ}VL2t9B;`l;8TLA;JW>yR7WrAao+7WB-mqC^hID074yDMvxG86(Hy z4&L$5fXd_qXd@G$uT8>@SyM>AfZjF(n#Fu@Wt%(>`o%x6He$9sLC%3b*C7@_r<(^I z<4tH93*Tye-i+QBvt$?*Zj!e^zZry?g0G-6JSlIJx63=A z?cD_pXD~FKPvyPPBbuR0-H#FEpP`vPBp-&BvILslW6d>^{hNQ`WMk{`;CARF@;fmWqs1SfIqsMLg0^x%{wNR1pX4F=GtQvyCXGaQBlgOY+?;0?J3Z-9pY5w#941{6|G`atib&)DqbaswJH(!`QbYQeZ=xEcXXViZO%W1!K`#MovW#x~H6#VoN`O%zY4HjH*AV@xwuO%umscH%S4 z0?bs$safiHj5JQbXr-OUK=V|mny(h9g=!Hrl_k(vmSIHHg|Wtom^E05amQ+Pk~$gM z3+XVYs?*duoT77vI#WC+{wi+77~%$uI6OGPG6}PbDIygkk95p|odqrE9OyykVLWpI zG@;*NZshmsVvK4oW$ov3=s{OP2l@l+Ki8`3pbgysZRkdI6UIFovDRo4w4qzopD-r7 z9iy^4#Z%Dk{)L@hcR@e8N8Jl;a45zt7ht3oEAECacnfsFc=WTIpa(iJdP@+E7){*| z&FatULG_TBE#~0V^z^LPnD9w_Cw@vjjj`dg>N#UoU5{)SQ6OZYmx1=`$J^@@5`oU2~LjS@EXI=;x>CVqrI zP1^OF(68TycKr@%+2TB`;<{SBuReeV`z>a0A4flM8AfNB;t%2~ti!q;y~C~ea(ac> zpgzJ^%In2-7-e3oc0#j#5$nHlFn+jDoG*SaE)o}G>~@0qT%4_TiOp)a`lo16d(T8^_@U7aXzEj_;AJl&JFLglus1B;1)FJh=`UPWz9*hbE#tFDu z4f8@#7$4X)JH`x7j1$~iv=)Q0LLBCb60}6kqj|L?Em=#^QnfTKU0i~3?=JBX=I$;P zA3(qR7$f1Gn9X}v^Jy8HU&ConS{CLCaxhzvhuN8am~HB>6>3FVu{Hp6HKkgawV|WC z^Q2DO>g9{dTN+yQXJfVTEHj=#<5@}1vht>8{k?(T5w6L2H^Md48t)D4KUikaX$U`= zURkg#Xlq#3KDWDTxvimVLD%xmCC-NKMavho&t1K$)7H?UKRIb-wXUYQi@N8oUN(Pe z=Nf0zyslO4bLVz0U&S$$H&t4j=eC0o9^GB-j4f{|GtyPY`6?@K)#EL1sUu>{L3BRbl<^`OB9*NDDh%3Fe!YUC*ENV8;7Vy#Rq zSY{+J7|tUnw7jK>@hFi7+ejn9BlQGYN3L45bY7=xRNqL-$}2c8AYEe}!v$p>V=@!2 zjg~P;ww^}Qs}XyJ5o=|*JQ}RybQ0qtNK{top(~l+%fTFdeUoR9K4u7QZW(eP7i z9Uqb1=5ig~Y!qFy5plCogv|!YW<3u>yFE^+f$!`f$ zGki50Ol>KP9=~uks&V(~WlP&vGZVnt7Tfs9x=>|=uHv}L(288+S1xT|xiF&ER~nQn z^$HveHd)(rMzuvSs>;YkxsmEBBNyf27+S28B8XNSnXj&PO**1bgXIRJstr=r28n6| zU#BOeytdUc8CB3aIU*Ul-?Cu2!JcX(@zpKXDUoGU!9^HE8{jt45`I=kP3h%vixFX~ zk&u=!&kdq2Ezwhs<}upWlt>=eG}xx-)i`Pj2^Q-VuFQJGHMQ1h%of+QUN$(U&0Eyj z-MMnnO6#-*-R&oJx@Pn`>fvgQVs5Rp&R{P(y45I!3WH^>wbq$T-Z}G#_FEUUwwnw= zxpUiu@Tk!VH5!$-kr@R%w*%C5Bi;t1T{MKHuo14IP7mL}Z2}d}pwke38jLTiu(caZ zYB!{Ad#}`O?~JG_Wp%E(z1erpH8WzJXBIrftdWp1UC5L-Ra-kbf7Z?jU*(3cMkBjT zMzWiX=@#&S8zMGqSkL4U*+mw$47{RhJgQsygcePLXRt zZ?1@RS$VL+x!{P{g5{Qly<)b}wXkm(h}kOZBC{OJ%5`A_z8k3wwmKG-EbW@RbaLBh zJ^f*6)xv6_}FPh`iY-AXK&J2ol=uIss7%xUg zpnEfV1AcLGm%w0bZ|}hGu68a;hOG;9)Pi0XLbj43&iJ?pIm-y*F9}*hEZpg0IH;vi6uLx(61_D6BBKRpfx^*Gog$3c+J zmm20vSy>}DX*_kAU8ZXm!Lk~IFEs{VY7D;A7<{QQ_)=5n05>?Eg>L484zG00N6HM? z%}Fv|VmjLAE@4?(GPiwYXX1*^?nPbmXuJmHY98ZU9jliv?Oerh`VsEbYc@4ZW;bUq znWSTTi|K$!?p)eAUndsJuieafiad_qmvpW&J;WP`UN12#+Pl%8niTl8*V#FL(Sp@T zHx}5O|3sx^emX~$)CMD5C^~T2DRzh2a zUn5KGjZwYc^puntMTLPIHwArwS5~GEwK4MMqQ?{SR&BbM#;WMKT}!)`FGHEGYVSV9 zGOug-0-OpOZcTbE!BDW-vUE{*yAjBs-^krP9ILG>I#(jR;cT?LM(!k_*cj33I%&}8 z)$pvccP?A8>J)_JfaO8G$_2~#iDc?kvAn#((YbOJRHId$^K_r()z+1rbGw$$v$gBx zOz5%-Bf}MCH4c_|bGw#xI9Rw7WccAO41V?cUttXQDvU@g${HLj(jr1sMlbB@TGHOp zbrRw<>F7#8h2G7VRg^cn(ZO_dF6}zG*HcjMWpT!V9(hpjohpLdn93^jp?6t@uHoQW z#X=Do;Ywn>)bLA;nI-+z%vYq>#>kgoS71DAow^D@BEqS6UkvKK7lE-6y*Ir_o82wF#hAJUC()_*x8xEZsUEST zOIM8;c91%x2hsac3gXi1ay9B`c?4V*0oO&q6$Xrc-1JXy*gwHx{{&aqIalpVS6RkQ z88e2yD`9B~R(!?ci7(g2ho-9m(}_9y?Z1lvEx{Ksi4`}ez&;i8r4nB)JVN68(G1wf zVMT|;SC)%lUyQW`5??a@2Kyxi`k2|bVNIwD_l!u)*yGF=%syWX`%>)xk(hbD3idT> z18mGT!~VPa8M~G;v|RdX4MShu^_7o}cz4r`tlEjQPXCE{*6=(kW>Jx54PigPr?XGh z4>1DKHaVB4!G$xpmBB;hB3%_fp|m+P-QzX3Q;=bMS#;BTi^bI=g{i z*518Dq%B*rYzgMF$%TH3ebBdm4dJ3N(;XAn5v;Cwy>e^KX>hf}IMqGyHHzs5Fe`g4 z*7a<|*CBzgY|Z$}H346mF2t9kd+_yUr#yh~A8Gh9ai$95tHTi7SkZyG{##Xt_{0=c1UmqsoivzwjfXWhlD_BP}>EOcX z&;~UD-xJ+(D<+z^g?dzL=w~%Nv{#M5dfAa!K{*!b9w$7i4Y;Y;doV4uRXrcthccNK zI*9VDM}C}Y1Xl8n4E?0WA@oFHh3{|SdmsFKrk)1w8JOq66{``)ccAYyX#SIE3Maln zI^|VZDc*`55W~fCHA!@+cFf(+#rKv|@C{`xaL?mgF2#wuiL@W?6Uv8BQxR$iLd`>{ z#R%1iP~#8^B`n@U8iykt)4)3^58;F%o7@`eF;cXb-6&O4L;I1UkC69v^3jKogMZs?f`LrMh2jKq@{C|TyhC~#6^yrij(^OQ9XF@&rkmU`11`bobcn|xz zaKoCsGjs^CACg!@2miO~>0=&j3sJr8$9{i8THnJv&a=Y46UxK)fOaF~PaM}y(Akf- z5ORU|K*s_I|uA-y8>3*()D4hT=^KxjW!Pwox-3q2d!b96Xz zg}*~#U%gMH%lw6QgPIvo1wkEp(&l=AE&v8-*6BNQH8(H zuq)E^6M8*#Yv{|c|K2BJ*c19O{EjzHTW`90A=8hUdc+cuGji`6IwGwRVZwCSzn;DV zPXA}U6m&lZHRPFHjJW!yD6}*54!H8R9#`m7q~Qy!as3REG2(~aP9lVLsv*cy@=1JT zXFJ|G4HS}olq0zQ3!K<>WbO^yXH{Q&$Gv3)3()Jzxb{aU89B$>k5P66tOt`!$cT}qU1RaDRYT@3He9}5^dQ2d-}QaeCxhS>o>W^D*PVuY|GHQ%A+?7cL>L#NJ1__0uEq5%`GEkJW9 zv-AvF|Hb2IjvbAO3?ABm(!3D6??mW*;Ut-ZTt5pRex$887jJT^HiWLh^8oyR7rGG8 z52*VGAp7}8x2pp4GIC*tBL}AW1Df-#3lRvja(QCsy`bX%9B2#;FD zyEP~tlfL0cmrwi>`ZV;dj)lL7I>03tcKDU&vHkRslW2oTOP`u`Ok$*k{f~b}e-OEr zsUG*tUzg!i5sD+pb>wz0YCrRaQmIEDnO5{`^y4xMyX(Gw%|2E;_*K6~jA8eq z!bXK%dY@>KUxrgiZ6OTz`p_XAf23>JKXSX<;2FF_=0v_72)B2%eMqAtDfg{SNJF2! z4M+Qi|NT^#kIG%RhcaT&OCZDxVI#^7y+ZhhxXgNl{+FbI`5yM8Kg0O&v#)F98*&(? z0V#!Ff$kdWA-vw3M3%e`qs_1e5)O-JWKGlceWrViu-}G588J~xDq)hPSW1z09HND#j2K0{N-Yu;{wn)1AqA# zb=(5&ly+DYVC~?2Sm*a7{)({I;(4sReGz{p*sHJwDo6JTV6m1%>pZg7YJ7Y;gexEzCg+bI`&Zv@i!<%s~fpFp4=C#T<-c4n{EtqnLwH z%)uyduo>EZ3;x{TWh=^qxEaITjAd@dF*hB|&3JJ0Pl*3E{3S3?6Pc$T=Bbr=YGs~U znWt9fsg-$ZWu9VOfj=+S{Jf7*`cC{MWA)D-j5~?HcIIyi^H*ZuOEmU05PxZPXF0}w z6|zF4WAs>weGbHBCv!Q2x$I{yXEK)q%w;EY*$Mvs0eeNS2A8qB6=jdQgDdv=7PATS8 zB6G^aoN_Rayv!p9^T^SMM_sZDytoqeF^T!5m|srjR|@khmHDMHztWgr>C7)5^UKQo z%D{ZUP8#v5(b!Ep0qY2pQCDg1fld#@4p`K+o8AgtRha~ z8JmT?M`{^XWS@c+&8OmTwOEJQo0E9<=0TdhK?}s}4dx@3VNL5Cn!UlwSIpjE)hcFh zNnTb_3EXLEg8SdnOhopAT~}%oQ-#!rTON zE6iOm55PPM^AyZxm@P1`3z@%3sGLHWnJ{H+G?b&tsfM9h2aH5=--5x&BzGqa#vi$m z@43)>bD;(2LJPyiWE->_L5FCMfEkCe^=>>TGfw0|vgftJl)zNN z41^g5L%1;*Mbi#0iQPyAuwTNQf%064O`z9%Ho`_c29#|=h&KYanEfFR1BX})2yqz@ zVl*JcX+TIp1WuBOm&~y`;Z9?-*h*GMDU18!*GNIE<=xh_}&D*6W?kW?y4bX!E zKhHfT^f;hr2$zY{%|z+qeX9w*5QfOrvn}juK-iHpLBpyJ7Z|U;26W_u`Td zgVqN_l61WFrkl3Xpaf)Godd{$iz_`-UA%RFJadtWkPlniZLNdRa#O2cD{+L z6(Suu!uyagl=&%gzL#(WB{j3_tfUU&Y0`3-4#q4`8WqMR!8K_Dxe}!NW8BmuLXf|O z>~AgXRZNGVGYJYfVd5Bfz6o6%hR8MP3UVC#ac0;g6Y`l*wh0xOP>Bhdu_ad~&rTjjxlA5tLanC1F(%YzLeouXg%HUnG4GSW zaUV=}@@c@GO}OL>F&Tl@0_bs=2N}B5gsw6na=o5iH}=8Z#<+X>;GQ8Iwf)S^?D~QU zZ8f27CbT^aQHbOZIK=KgxX&5)O&{F;FfN%PlCc@6gDEM!5Xs_RTnYl{t|`_qlm?C% zxCDl-PI)-xiInF6`%Ngs zCe&?0rvuW{cdiLtWJ2pr=<1XWhQCcF?hX^W&xBq?PG2QX21;Nm2}*gxgm#$FMShV-z^ zp}kPX(PrTCy$OA4LU2tz78k80ncBS@~mJQ=0x@p;I zE0EH(w0i&-m{6q&p-vjEz@-gjf2}5Nm!4sG~I+|o6tNHT5Li{i$Ucy z6L+==U1&m=n$T4ybiD~}G@;u}=s{3^Jnb1Fa!}G)uX5hE1NS*YFPP9)6WV4%z5YHh zal6A%ItZj4Lfv;C0ewTbwEdB;=~njF2sS+{29PbtUKt!ohF}Aq3%`JHp={ynn=$3Hp*CUjQb^xP2yc z0It8Vs|w@TpPg|reQ+Me1%OL4p?rplO@C+l_WIuQ?erb=)tb-{6KXc02_`hkga~&& zhn;HTW|>fj2`x0C3Epnb4_sAPm?DnX*+UmwP0Y&W6ZIFCti93Pkva2cO7?i&-g--Hf@A)Njlj>Bz2 z8%!v{gi=gslL`4vs0=BqCQkb6VP-PaXhI`QXq*W_!WsVN0D^Rd4aw!dgQ2A+)NMj* zOz3nIq7WBxi1jA!Y7^RELYqwJML^GSi2FO6J1M<#>O?gm#z^ zq?_Ri36~jUe_xuoeI|6kgnkJ_nRXLWCPX- zCe&;~qfBUm2~9PjStitBLgxdzmbjL=%7oUM(3vLG>+fO{cSRVY@bt^PNq-X5JIj=L zE8g#7_Xhwy%Ft7QHZ!yZ(CaV}^B|d@;(af>exG?TvnODI{_BK^BU~T}#s`yqEQoy2 zFHq2{%afiR7{+Lc`#@G;ws4iD1a_0Q7IundH0)Z-O2RPQgfqINiq`(he*OS^6VBR_ za+mfk`@t<>2zxEtSZgQg4r|cCiMybqJ;M0w*`7l-PNyUPli4OeO-PGW%>px)*jo-) zbt$K6E8*pE_CK8A)szz4Y(exF;+7{VS8J4>6&l4ml>H3l*oTIYew@uS8~6q6zna5V za~|y!R>f#Ir%P5dg=;LBiI&9{qF-&n3@q@JqiUvH&1rCPj*2-))f(lfTB95-u+XYP zm!+IBl%r=TFY+vo>nx7ONktuXBhr8Ido_*GHs4k|{#XMifoLont)F^E;D6ix6d}E1W_+i-R zS^^AHsjXw0>ns_7@8cNPG5t2CwvtP5g?1hLyozlq&2<`hBJbnUY~#{g!Rh%UQ&_>N zTE`Ubvow%@%Sg7V+)u|EKB?|yj;-Uof5u@y<4`dSL(-9dhRzD?$I zPUhN$z61Uzv;WD=jj0@Js$~H1c^o#6Td0lOLLT#^A5+U?4&*VlD)yPoernmZifL9c z%_>gql}x#V`P{+&JD6Grr>cXgbuhIW=D>93;dLBpAyZq(u7lZiHoGolcp>MaLnA(S zaK1V;;&TU=P6vg>2@6znI<%c^QwzG1IsC1n6}cTmL7m3Doya~XGA5d1|A5o^0jKcK z9OE$dGmQMmDeNbg{p7Nrf)K3={)v62aXND~N>46hR1fI7(d zeQZC#Ho3NIX#0q9JNQt5FF{zVtjOM`s4Y-GBef~apF*Zn$TY`uY897z8P*s}S%}jr z=-Uu+rYba_ZO8{Tnf<@32-D1={7lEsdGs>{Kkk4-tz$ZV=73*Ojxsq%cFvJsQI7l^ zi=S!wDHfc$LAmpA?)-{!=U0@wX5zLup#2VTuI``nNULe!2X5pOsl|DA2LKP^^bBHZ z4V;oe9BL59IEZNu;@oA2rXtiD=36#l#2TERA!RnFXARcIN_<}={I!%{(M^LZ4~Vf!c8<+zs$@}KKT8PhM*7L%(+J$0EO0>I0c1VuZ3Nvt!MipvMHS^hd7Lz^{BlJ{>;5)JZD$e{eajWh6iTdS&UiT`UTqC9-*VV*wJQjwHX{DT zW%>AFA&!k?3At7!frl<` zeIBL;ogA*~Y)XhkPRM165h+%=# zZvbl~AziquL&_LVNsRg$uooxd5QcQu7_Nb_>Mi&`$hA5~J;8Vio5LmYDTlSFUl_li z?T2AUu>_9cSSnd3iQ!tEL+Qjx;jqPFbs5{Q!oNmxQXHmw2>iWl-wL~j^IIxUfS*D& z1Gd6$0BE+{@31BYsrwW#dF(TdVT_Ov_8gp`1Wl4Lm$B<;h8q}e$2u-4-p0B+^dRan zz{4qC*~Nak*v|ll=_G6De&UaCJwxt;{Q=`YU_ZGG7trnj_NTAu7>Lyy&C&|nX6#`3 z2&W0f&<+=@0ioS29_(~ED6;9aAl#`zdt+!_jpV&Gd=j{3#fB6&Oacrzra={r9 zHOvN>O)z&L>=qcJ_c{#ff~1~eC*1CXfn?PlhIs;LIq(uU}_CB1W)QIM!^t% z0?bsHS^O@=;!qE0f|sygV|zQ>i`ibwHaH5`t!!f~i?pP19*YrMEmoj4gZczeodsWu zLvvwo2`z%Xj^*L$EE`|rzI!`Mzr}2C2`z)4(@1v}=dhoxG)h9)m1f>0-u1j^^Gc&* z?W;oF!ueQ2Tnlp(%&jnY!8`!-D9lqZn_(#B7=>ePmcW`UA$G!i3bPmHdzgbTJ;%orGyJ>zC0%`dV)tY|kJmEbdkCBp#w( zQ#``>*CeD5&c}re6(2BuyM)Fmu4kWLG5i|iw@{14{vxvPR1d-)%l7^1ZorSJG}uqD zzVe#F=tXQ~pC7WlgYoN`=06zo3fq4rd52TXC{?U%<}(q z?h8)G3B$x2lJI|F`w_;!#yie#COsUyc^CF}bvx|!B>%-*I2R3d7Oe|)hO~OInC;WG za{!+Xc|oJvvtd8Rex6|XHSSY3YCD1dkVXf%e-+XPS{%{*2Wx1r(1=ECWuIHP_ur}! zhrUz?U_VVgj(C<`pQN5ne2Bg#+*+w*^&0EJhl%i>KQI!lnT&!@EASZn;~h_|dwc^j zGjcCr3hxD6ij|wRo?K3Dm>dwOd63ny97bUs8tv+`fnK~wz{=Y2Nqgjn;-Q^`VLvfP z`6>~%hM6q^(S{xE0kNj34fai=8)gQ?3uDKR35YM-#*YoiIGhp_kkt|KhIbkMws`GF z#e1yOIewEblAHfNr?e9J-}`d^CSTFN$ye-AzEaw;r&U}*TWH1gbLTEwAvUso*Sw{R z7Klgb{08yVeC+=hn}KK-uhPi^;tjTUu>BF+d)WSx?R{(?VEY$3OhKxy?s?0leI??O zaoC1GUnbEZBGR{Vb;nAXy>j)6m9l`2qacZex}euIiIth?_)L%)g za?Z!OocG|I$vbfR;#U0a4gXvZ3pfJc+|4rvOj8a)Q+ef*2&f@ z@YiFTg}=qNHMaG(CqR*?(%#qCu_KdC?tBENq3;Tx7E0%Y%Fp#PLL*NIrSn1QbkM$M zgUZADsi1PCa>zf)`&2+b&$G`dp40gZ&B!w|^;0tWL` zTn)z!H6ztXQGr?6xuTLz_ryIm%hhr*7(0DW#y-}kannH~w7)%~38z2W#0;GM7=zhH zocRb10)mjaiyjKKgfyL?sK<)w3D9rnp=Vel&PK0r6*QZj%8os&bTVoHu~%Z>YBG3N zq^ba=;7rtFRShUr<={S&8bE2_X^E-@l#UZpOH~~pA5KawQv(5I;KbB&jF2rjS+zg~ zaSEzMW#R+i;S|&3)bY^AhNxNKibd?hpTLS?4|J&!Y6N!DPE}JOm#MzeDq4L< zH(Zf!oForJwI2LM4^B_QR2xrfC&YP-tIWKUyzPCnLIT4F;tAtu2fKyq9qJ6Q7L?XA zC=Y1rCJifE62&;I7iT#gyI&)GU|$x|ooc2#n^TtnY$Ma59))}iG4X{4J|6j$;Cz4M zomzwxR_yN}JkvuVCeWmm;pyj7l$!<*19(QI0cl7VUBBKi!sGXbB^cd8!o}w*(8f1Q)l2 zXl@BH+!7MFB_wi7=+7;om|H@yH+QTRpsu5Sc_3M{(ax}MAFK9G zScg)R4jbu%9t&DHso-PqXP5c}KB>m=c?MJ)WGx$_heaoZL9LN8pJN~@RBtdxV!Tti zD~ytIaMJdq{}nlCMH+`8dfJUc>DnU{mre?oPCA!PmRYxbNFk;5T$o%Ke9R7~S#%p| z^mC3s#fTQ8R>)eCv=oL?j?(#GNwtMjDmbM{oYGWIX=ZOd!m0fvn~H(aN1Q$_>;D@t zCN4260m+NZ%0TiKuqVv~Y#Sp~$bwY>eE?J;4_2W7RsoDl;7P;R;67mlrb})lo(Ql7 z0P`iVTmY75pjZZ#nBe`6VBa$W(*`6IfG0~Zfer;WX7poX1*Q@|pg1FN{|>SVz?Le= X1P}?%>%hhBK(j!AsT_Fb6i6umT}#x! literal 0 HcmV?d00001 diff --git a/website/assets/images/3dviewer_net_favicon.png b/website/assets/images/3dviewer_net_favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a352604d0028e74c035ac95c9ab31a9b587e0f GIT binary patch literal 779 zcmV+m1N8ifP))H(ds1mq|B51YMLClth;mVg(|06GPun2T^;OdZ%YtZ+G7obJwsS27`M8__Nl21nBKGe@0180>02CmVh~_lT8e%er&Bgc0(z;{B*NG98T4%ui z`V$~1ii)g$10UT)Me8YQ?#@8m+0>C8g8%@n&AFztl^NQHr&!Q`Ggn?c#k;W~#DA^9 z*L4Ypdah(&oxXND5&ZZ%6$`E!XaGnjw~r{Yd~0#)VN+$>c|8C)n>*ob?#!7v_~i{R z#^VbLO$}xnWW<>5?M7G4VC~tfbrxUaj>YlYA!T-CAQ1Zeb~L>F=|;Y#0s!=mgO^=L zyXSi+wv@hUN%8kzUp6189RZN{H};aI*i(Ps>T4bc%i8ime*l4Z=WAj|jqm^f002ov JPDHLkV1icnUTy#Y literal 0 HcmV?d00001 diff --git a/website/assets/images/3dviewer_net_logo.svg b/website/assets/images/3dviewer_net_logo.svg new file mode 100644 index 0000000..47de5f4 --- /dev/null +++ b/website/assets/images/3dviewer_net_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/3dviewer_net_logo_social.png b/website/assets/images/3dviewer_net_logo_social.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5a3367cd4f8a236eabbe422ac586b559692c53 GIT binary patch literal 24660 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 LF)KQA_11p@GEFD! literal 0 HcmV?d00001 diff --git a/website/assets/images/3dviewer_net_logo_social.svg b/website/assets/images/3dviewer_net_logo_social.svg new file mode 100644 index 0000000..41d0099 --- /dev/null +++ b/website/assets/images/3dviewer_net_logo_social.svg @@ -0,0 +1,278 @@ + +image/svg+xml \ No newline at end of file diff --git a/website/assets/images/3dviewer_net_logo_text.svg b/website/assets/images/3dviewer_net_logo_text.svg new file mode 100644 index 0000000..a8fd738 --- /dev/null +++ b/website/assets/images/3dviewer_net_logo_text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/dialog/arrow_down.svg b/website/assets/images/dialog/arrow_down.svg new file mode 100644 index 0000000..bd5d33d --- /dev/null +++ b/website/assets/images/dialog/arrow_down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/dialog/file_download.svg b/website/assets/images/dialog/file_download.svg new file mode 100644 index 0000000..858b06c --- /dev/null +++ b/website/assets/images/dialog/file_download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/donate.svg b/website/assets/images/header/donate.svg new file mode 100644 index 0000000..428d2e9 --- /dev/null +++ b/website/assets/images/header/donate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/donate_hover.svg b/website/assets/images/header/donate_hover.svg new file mode 100644 index 0000000..919a877 --- /dev/null +++ b/website/assets/images/header/donate_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/feedback.svg b/website/assets/images/header/feedback.svg new file mode 100644 index 0000000..9aa4830 --- /dev/null +++ b/website/assets/images/header/feedback.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/feedback_hover.svg b/website/assets/images/header/feedback_hover.svg new file mode 100644 index 0000000..12dfeb7 --- /dev/null +++ b/website/assets/images/header/feedback_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/github.svg b/website/assets/images/header/github.svg new file mode 100644 index 0000000..b7779c8 --- /dev/null +++ b/website/assets/images/header/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/github_hover.svg b/website/assets/images/header/github_hover.svg new file mode 100644 index 0000000..1a7ddc8 --- /dev/null +++ b/website/assets/images/header/github_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/info.svg b/website/assets/images/header/info.svg new file mode 100644 index 0000000..9aa4830 --- /dev/null +++ b/website/assets/images/header/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/header/info_hover.svg b/website/assets/images/header/info_hover.svg new file mode 100644 index 0000000..12dfeb7 --- /dev/null +++ b/website/assets/images/header/info_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/embed.svg b/website/assets/images/toolbar/embed.svg new file mode 100644 index 0000000..a0d09e9 --- /dev/null +++ b/website/assets/images/toolbar/embed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/export.svg b/website/assets/images/toolbar/export.svg new file mode 100644 index 0000000..f63e483 --- /dev/null +++ b/website/assets/images/toolbar/export.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/fit.svg b/website/assets/images/toolbar/fit.svg new file mode 100644 index 0000000..08e471b --- /dev/null +++ b/website/assets/images/toolbar/fit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/fix_up_off.svg b/website/assets/images/toolbar/fix_up_off.svg new file mode 100644 index 0000000..c5541a2 --- /dev/null +++ b/website/assets/images/toolbar/fix_up_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/fix_up_on.svg b/website/assets/images/toolbar/fix_up_on.svg new file mode 100644 index 0000000..29da0e7 --- /dev/null +++ b/website/assets/images/toolbar/fix_up_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/flip.svg b/website/assets/images/toolbar/flip.svg new file mode 100644 index 0000000..b3cce76 --- /dev/null +++ b/website/assets/images/toolbar/flip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/open.svg b/website/assets/images/toolbar/open.svg new file mode 100644 index 0000000..3b042f1 --- /dev/null +++ b/website/assets/images/toolbar/open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/open_url.svg b/website/assets/images/toolbar/open_url.svg new file mode 100644 index 0000000..3a6e6d2 --- /dev/null +++ b/website/assets/images/toolbar/open_url.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/up_y.svg b/website/assets/images/toolbar/up_y.svg new file mode 100644 index 0000000..6150547 --- /dev/null +++ b/website/assets/images/toolbar/up_y.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/toolbar/up_z.svg b/website/assets/images/toolbar/up_z.svg new file mode 100644 index 0000000..f911e29 --- /dev/null +++ b/website/assets/images/toolbar/up_z.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/arrow_down.svg b/website/assets/images/tree/arrow_down.svg new file mode 100644 index 0000000..bd5d33d --- /dev/null +++ b/website/assets/images/tree/arrow_down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/arrow_up.svg b/website/assets/images/tree/arrow_up.svg new file mode 100644 index 0000000..91fa0b8 --- /dev/null +++ b/website/assets/images/tree/arrow_up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/details.svg b/website/assets/images/tree/details.svg new file mode 100644 index 0000000..73d2180 --- /dev/null +++ b/website/assets/images/tree/details.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/files.svg b/website/assets/images/tree/files.svg new file mode 100644 index 0000000..0109be9 --- /dev/null +++ b/website/assets/images/tree/files.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/fit_tree.svg b/website/assets/images/tree/fit_tree.svg new file mode 100644 index 0000000..90c6300 --- /dev/null +++ b/website/assets/images/tree/fit_tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/hidden.svg b/website/assets/images/tree/hidden.svg new file mode 100644 index 0000000..7df38b3 --- /dev/null +++ b/website/assets/images/tree/hidden.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/materials.svg b/website/assets/images/tree/materials.svg new file mode 100644 index 0000000..847df77 --- /dev/null +++ b/website/assets/images/tree/materials.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/meshes.svg b/website/assets/images/tree/meshes.svg new file mode 100644 index 0000000..f796218 --- /dev/null +++ b/website/assets/images/tree/meshes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/missing_files.svg b/website/assets/images/tree/missing_files.svg new file mode 100644 index 0000000..f3d4174 --- /dev/null +++ b/website/assets/images/tree/missing_files.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/model.svg b/website/assets/images/tree/model.svg new file mode 100644 index 0000000..b8a968b --- /dev/null +++ b/website/assets/images/tree/model.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/open.svg b/website/assets/images/tree/open.svg new file mode 100644 index 0000000..dbccf3e --- /dev/null +++ b/website/assets/images/tree/open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/images/tree/visible.svg b/website/assets/images/tree/visible.svg new file mode 100644 index 0000000..e84fe2a --- /dev/null +++ b/website/assets/images/tree/visible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/assets/models/logo.mtl b/website/assets/models/logo.mtl new file mode 100644 index 0000000..87eddba --- /dev/null +++ b/website/assets/models/logo.mtl @@ -0,0 +1,14 @@ +newmtl Blue_1 +Ka 0.000000 0.000000 0.000000 +Kd 0.392156 0.752941 1.000000 +Ks 0.500000 0.500000 0.500000 + +newmtl Blue_2 +Ka 0.000000 0.000000 0.000000 +Kd 0.274509 0.533333 0.705882 +Ks 0.500000 0.500000 0.500000 + +newmtl Blue_3 +Ka 0.000000 0.000000 0.000000 +Kd 0.160784 0.305882 0.403921 +Ks 0.500000 0.500000 0.500000 diff --git a/website/assets/models/logo.obj b/website/assets/models/logo.obj new file mode 100644 index 0000000..a52e932 --- /dev/null +++ b/website/assets/models/logo.obj @@ -0,0 +1,39 @@ +# 3dviewer.net logo + +mtllib logo.mtl + +v 0 0 0 +v 0 0 2 +v 1 0 2 +v 1 0 0 +v 2 0 2 +v 2 0 1 +v 1 0 1 +v 2 2 2 +v 2 2 1 +v 2 2 0 +v 2 1 0 +v 2 1 1 +v 1 2 0 +v 0 2 0 +v 1 1 0 +v 1 1 1 + +o Outer +usemtl Blue_1 +f 1 2 3 4 +f 3 5 6 7 +usemtl Blue_2 +f 5 8 9 6 +f 9 10 11 12 +usemtl Blue_3 +f 1 4 13 14 +f 10 13 15 11 + +o Inner +usemtl Blue_2 +f 4 7 16 15 +usemtl Blue_3 +f 6 12 16 7 +usemtl Blue_1 +f 11 15 16 12 diff --git a/website/assets/models/solids.mtl b/website/assets/models/solids.mtl new file mode 100644 index 0000000..39caf84 --- /dev/null +++ b/website/assets/models/solids.mtl @@ -0,0 +1,24 @@ +newmtl Red +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.200000 0.200000 +Ks 0.500000 0.500000 0.500000 + +newmtl Green +Ka 0.000000 0.000000 0.000000 +Kd 0.152940 0.607840 0.380390 +Ks 0.500000 0.500000 0.500000 + +newmtl Blue +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.541180 0.721570 +Ks 0.500000 0.500000 0.500000 + +newmtl Orange +Ka 0.000000 0.000000 0.000000 +Kd 1.000000 0.800000 0.200000 +Ks 0.500000 0.500000 0.500000 + +newmtl Purple +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.400000 0.600000 +Ks 0.500000 0.500000 0.500000 diff --git a/website/assets/models/solids.obj b/website/assets/models/solids.obj new file mode 100644 index 0000000..0d2ef40 --- /dev/null +++ b/website/assets/models/solids.obj @@ -0,0 +1,116 @@ +mtllib solids.mtl + +g Tetrahedron +usemtl Red +v 0.5773502691896258 0.5773502691896258 0.5773502691896258 +v -0.5773502691896258 -0.5773502691896258 0.5773502691896258 +v -0.5773502691896258 0.5773502691896258 -0.5773502691896258 +v 0.5773502691896258 -0.5773502691896258 -0.5773502691896258 +f 1 2 4 +f 1 3 2 +f 1 4 3 +f 2 3 4 + +g Hexahedron +usemtl Green +v 0.5773502691896258 3.5773502691896257 0.5773502691896258 +v 0.5773502691896258 3.5773502691896257 -0.5773502691896258 +v 0.5773502691896258 2.4226497308103743 0.5773502691896258 +v 0.5773502691896258 2.4226497308103743 -0.5773502691896258 +v -0.5773502691896258 3.5773502691896257 0.5773502691896258 +v -0.5773502691896258 3.5773502691896257 -0.5773502691896258 +v -0.5773502691896258 2.4226497308103743 0.5773502691896258 +v -0.5773502691896258 2.4226497308103743 -0.5773502691896258 +f 5 6 10 9 +f 5 7 8 6 +f 5 9 11 7 +f 6 8 12 10 +f 7 11 12 8 +f 9 10 12 11 + +g Octahedron +usemtl Blue +v 4.0 0.0 0.0 +v 2.0 0.0 0.0 +v 3.0 1.0 0.0 +v 3.0 -1.0 0.0 +v 3.0 0.0 1.0 +v 3.0 0.0 -1.0 +f 13 15 17 +f 13 16 18 +f 13 17 16 +f 13 18 15 +f 14 15 18 +f 14 16 17 +f 14 17 15 +f 14 18 16 + +g Dodecahedron +usemtl Orange +v 3.5773502691896257 3.5773502691896257 0.5773502691896258 +v 3.5773502691896257 3.5773502691896257 -0.5773502691896258 +v 3.5773502691896257 2.4226497308103743 0.5773502691896258 +v 2.4226497308103743 3.5773502691896257 0.5773502691896258 +v 3.5773502691896257 2.4226497308103743 -0.5773502691896258 +v 2.4226497308103743 3.5773502691896257 -0.5773502691896258 +v 2.4226497308103743 2.4226497308103743 0.5773502691896258 +v 2.4226497308103743 2.4226497308103743 -0.5773502691896258 +v 3.0 3.35682208977309 0.9341723589627159 +v 3.0 3.35682208977309 -0.9341723589627159 +v 3.0 2.64317791022691 0.9341723589627159 +v 3.0 2.64317791022691 -0.9341723589627159 +v 3.35682208977309 3.9341723589627158 0.0 +v 3.35682208977309 2.0658276410372842 0.0 +v 2.64317791022691 3.9341723589627158 0.0 +v 2.64317791022691 2.0658276410372842 0.0 +v 3.9341723589627158 3.0 0.35682208977308993 +v 2.0658276410372842 3.0 0.35682208977308993 +v 3.9341723589627158 3.0 -0.35682208977308993 +v 2.0658276410372842 3.0 -0.35682208977308993 +f 19 27 29 21 35 +f 19 35 37 20 31 +f 19 31 33 22 27 +f 20 28 24 33 31 +f 20 37 23 30 28 +f 21 29 25 34 32 +f 21 32 23 37 35 +f 22 33 24 38 36 +f 22 36 25 29 27 +f 23 32 34 26 30 +f 24 28 30 26 38 +f 25 36 38 26 34 + +g Icosahedron +usemtl Purple +v 6.0 2.0257311121191335 0.85065080835204 +v 6.0 2.0257311121191335 -0.85065080835204 +v 6.0 0.9742688878808664 0.85065080835204 +v 6.0 0.9742688878808664 -0.85065080835204 +v 6.525731112119134 2.35065080835204 0.0 +v 6.525731112119134 0.64934919164796 0.0 +v 5.474268887880866 2.35065080835204 0.0 +v 5.474268887880866 0.64934919164796 0.0 +v 6.85065080835204 1.5 0.5257311121191336 +v 6.85065080835204 1.5 -0.5257311121191336 +v 5.14934919164796 1.5 0.5257311121191336 +v 5.14934919164796 1.5 -0.5257311121191336 +f 39 41 47 +f 39 43 45 +f 39 45 49 +f 39 47 43 +f 39 49 41 +f 40 42 50 +f 40 43 48 +f 40 45 43 +f 40 48 42 +f 40 50 45 +f 41 44 47 +f 41 46 44 +f 41 49 46 +f 42 44 46 +f 42 46 50 +f 42 48 44 +f 43 47 48 +f 44 48 47 +f 45 50 49 +f 46 49 50 diff --git a/website/embed.html b/website/embed.html new file mode 100644 index 0000000..6407e96 --- /dev/null +++ b/website/embed.html @@ -0,0 +1,108 @@ + + + + + + + + + Online 3D Viewer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+ + + diff --git a/website/embed_iframe.html b/website/embed_iframe.html new file mode 100644 index 0000000..2c4258b --- /dev/null +++ b/website/embed_iframe.html @@ -0,0 +1,35 @@ + + + + + + + + + Online 3D Viewer + + + + + + + + + + diff --git a/website/embed_selfhost.html b/website/embed_selfhost.html new file mode 100644 index 0000000..71e94fd --- /dev/null +++ b/website/embed_selfhost.html @@ -0,0 +1,80 @@ + + + + + + + + + Online 3D Viewer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + diff --git a/website/examples.html b/website/examples.html new file mode 100644 index 0000000..06199d4 --- /dev/null +++ b/website/examples.html @@ -0,0 +1,24 @@ + + + + + + + + + Online 3D Viewer + + + + + + + diff --git a/website/index.html b/website/index.html new file mode 100644 index 0000000..738c6bd --- /dev/null +++ b/website/index.html @@ -0,0 +1,149 @@ + + + + + + + + + Online 3D Viewer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+ Drag and drop your 3D models here.
+ Supported formats: obj, 3ds, stl, ply, gltf, glb, off. +
+
+ Or you can use the browse button above. +
+
+
Example models:
+
+ logo + solids +
+
+
+ + + diff --git a/website/info/index.html b/website/info/index.html new file mode 100644 index 0000000..4970819 --- /dev/null +++ b/website/info/index.html @@ -0,0 +1,232 @@ + + + + + + + + + Online 3D Viewer Manual + + + + + + + + + + + + +
+

Online 3D Viewer Manual

+

+ This is the user manual for the 3dviewer.net website. + The website can open several 3D file formats and visualize the model in your browser. + Supported file formats: obj, 3ds, stl, ply, gltf, glb, and off. +

+

+

    +
  1. Supported file formats
  2. +
  3. Loading models
  4. +
      +
    1. Loading models from your computer
    2. +
    3. Loading models hosted on a web server
    4. +
    5. Missing files
    6. +
    +
  5. Embedding the viewer
  6. +
      +
    1. Embedding models hosted on GitHub
    2. +
    3. Embedding models hosted on DropBox
    4. +
    5. Self-hosted viewer
    6. +
    +
  7. Exporting models
  8. +
+

+ +

Supported file formats

+

+ The website supports several file formats for import and export. If a file format has an ascii and binary version, + usually it's recommended to use the binary version. During export an ascii file is created. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FormatImportExportComment
objasciiwith mtl and texture support
3dsbinarywith texture support
stlasciibinary version is preferred
binary-
plyasciibinary version is preferred
binarywith vertex and face color support
gltfascii (.gltf)version 2.0
binary (.glb)version 2.0
offascii-
binary-
+

+ +

Loading models

+

+ There are several ways to load models. You can use files from your computer or load files hosted on an external web server. +

+

+ Please note, that some 3D models are built up from multiple files (for example an obj file usually comes with an mtl file, + and some texture files). For the correct visualization you have to import all of the required files. See the Missing files + section for more details. +

+ +

Loading models from your computer

+

+ You can load models from your computer. In this case the model won't be uploaded to any web server, + the whole visualization happens in your browser. +

+

+ There are two ways to load models from your computer: +

    +
  1. + Use the open button on the toolbar (). Here you can select all the + relevant files. +
  2. +
  3. Drag and drop all the relevant files into the browser window.
  4. +
+

+ +

Loading models hosted on a web server

+

+ You can load models by url with the open url button on the toolbar (). + Here you can list all of the model files. You should place every file in a separate line. +

+

+ To make this work, CORS (Cross-Origin Resource Sharing) must be enabled on the server. +

+ +

Missing files

+

+ Sometimes you see missing files in the tree (). It means that your model + refers to another files, but they are not selected to import. To solve the issue you have to import the model again together with the referenced + files, or just import the missing files on their own. +

+ +

Embedding the viewer

+

+ The website allows you to embed a 3D model in your page. It works only if your models are hosted on a web server. + To get the embedding code, click on the embedding button () in the toolbar. +

+ +

Embedding models hosted on GitHub

+

+ To host your models on GitHub follow the steps below: +

+

+

    +
  1. Commit models to GitHub with all the required files.
  2. +
  3. Go to 3dviewer.net, and click on the open url button in the toolbar ().
  4. +
  5. + Open the files on GitHub, copy the link of the file from the address bar, and paste it in the dialog. See the example below. +
    + https://github.com/kovacsv/Online3DViewer/blob/master/embeddable/testfiles/textured%20cube.obj
    + https://github.com/kovacsv/Online3DViewer/blob/master/embeddable/testfiles/textured%20cube.mtl
    + https://github.com/kovacsv/Online3DViewer/blob/master/embeddable/testfiles/texture%20with%20space.png +
    +
  6. +
  7. Click on OK, and if the model is loaded, click on the embed button in the toolbar ().
  8. +
+

+ +

Embedding models hosted on DropBox

+

+ To host your models on DropBox follow the steps below: +

+

+

    +
  1. Upload models to DropBox with all the required files.
  2. +
  3. Go to 3dviewer.net, and click on the open url button in the toolbar ().
  4. +
  5. + Get the sharing link from DropBox for all of the files, and paste it in the dialog. See the example below. +
    + https://www.dropbox.com/s/wd6lt7h4xa8fuv0/cube_four_instances.3ds?dl=0
    + https://www.dropbox.com/s/6dfk1jveevbofxm/texture.png?dl=0 +
    +
  6. +
  7. Click on OK, and if the model is loaded, click on the embed button in the toolbar ().
  8. +
+

+ +

Self-hosted viewer

+

+ You can host the viewer and the models on your website. + See the developer documentation for details. +

+ +

Exporting models

+

+ You can export your model in several file formats. To achieve this, click on the export button in the toolbar (). + After that select the format you would like to export to, and download the resulting files one by one. +

+ +
+ + + diff --git a/website/info/info.css b/website/info/info.css new file mode 100644 index 0000000..9cf5435 --- /dev/null +++ b/website/info/info.css @@ -0,0 +1,153 @@ +@font-face +{ + font-family: Quicksand; + src: url('../assets/fonts/Quicksand/Quicksand-Regular.ttf'); +} + +html, body +{ + color: #000000; + background: #ffffff; + font-size: 16px; + font-family: Quicksand, Helvetica, sans-serif; + scroll-behavior: smooth +} + +a +{ + color: #3393bd; + text-decoration: none; +} + +a:hover +{ + text-decoration: underline; +} + +img.inline +{ + width: 18px; + height: 18px; + display: inline-block; + margin-left: 3px; + margin-right: 3px; + margin-bottom: -4px; +} + +h1 +{ + font-size: 27px; + font-weight: normal; + margin-top: 30px; + margin-bottom: 20px; + padding: 10px 0px; + border-bottom: 1px solid #dddddd; +} + +h1 a +{ + color: inherit; +} + +h1 a:hover +{ + text-decoration: none; +} + +h2 +{ + font-size: 25px; + font-weight: normal; + margin-top: 30px; + margin-bottom: 20px; + padding: 10px 0px; + border-bottom: 1px solid #dddddd; +} + +h3 +{ + font-size: 21px; + font-weight: normal; + margin-top: 30px; + margin-bottom: 20px; +} + +p +{ + margin: 10px 0px; + line-height: 25px; +} + +p.info +{ + background: #e4f4ff; + padding: 10px; + border-left: 3px solid #3393bd; +} + +ol, ul +{ + padding: 0px 25px; +} + +li +{ + margin: 10px 0px; +} + +table +{ + border-collapse: collapse; +} + +table td, th +{ + padding: 10px; + border: 1px solid #dddddd; +} + +table th +{ + background: #fafafa; +} + +table td.center +{ + text-align: center; +} + +table td.green +{ + background: #eeffee; +} + +table td.red +{ + background: #ffeeee; +} + +div.main +{ + width: 920px; + margin: 30px auto; +} + +div.code +{ + background: #f0f0f0; + font-family: monospace; + font-size: 14px; + margin: 10px 0px; + padding : 5px; +} + +@media only screen and (max-width: 1000px) +{ + +div.main +{ + width: auto; + margin: 0px 20px; +} + +} diff --git a/website/o3dv/dialogs.js b/website/o3dv/dialogs.js new file mode 100644 index 0000000..af4a83f --- /dev/null +++ b/website/o3dv/dialogs.js @@ -0,0 +1,373 @@ +OV.ProgressDialog = class +{ + constructor () + { + this.modal = new OV.Modal (); + this.modal.SetCloseable (false); + this.imageDiv = null; + this.textDiv = null; + } + + SetText (text) + { + this.textDiv.html (text); + } + + Show (text) + { + let contentDiv = this.modal.GetContentDiv (); + contentDiv.addClass ('ov_progress'); + + this.imageDiv = $('').addClass ('ov_progress_img').attr ('src', 'assets/images/3dviewer_net_logo.svg').appendTo (contentDiv); + this.textDiv = $('
').addClass ('ov_progress_text').appendTo (contentDiv); + + this.SetText (text); + this.modal.Open (); + } + + Hide () + { + this.modal.Close (); + } +}; + +OV.ButtonDialog = class +{ + constructor () + { + this.modal = new OV.Modal (); + } + + Init (title, buttons) + { + function AddButton (button, buttonsDiv) + { + let buttonDiv = $('
').addClass ('ov_dialog_button').html (button.name).appendTo (buttonsDiv); + if (button.subClass) { + buttonDiv.addClass (button.subClass); + } + buttonDiv.click (function () { + button.onClick (); + }); + } + + let contentDiv = this.modal.GetContentDiv (); + contentDiv.addClass ('ov_dialog'); + + let titleDiv = $('
').addClass ('ov_dialog_title').html (title).appendTo (contentDiv); + let dialogContentDiv = $('
').addClass ('ov_dialog_content').appendTo (contentDiv); + let buttonsDiv = $('
').addClass ('ov_dialog_buttons').appendTo (contentDiv); + let buttonsInnerDiv = $('
').addClass ('ov_dialog_buttons_inner').appendTo (buttonsDiv); + for (let i = 0; i < buttons.length; i++) { + AddButton (buttons[i], buttonsInnerDiv); + } + + return dialogContentDiv; + } + + Show () + { + this.modal.Open (); + } + + Hide () + { + this.modal.Close (); + } +}; + +OV.ListPopup = class +{ + constructor () + { + this.modal = new OV.Modal (); + this.listDiv = null; + } + + Init () + { + let contentDiv = this.modal.GetContentDiv (); + contentDiv.addClass ('ov_popup'); + this.listDiv = $('
').addClass ('ov_popup_list').addClass ('ov_thin_scrollbar').appendTo (contentDiv); + } + + SetCustomResizeHandler (customResizeHandler) + { + this.modal.SetCustomResizeHandler (customResizeHandler); + } + + AddListItem (item, callbacks) + { + let listItemDiv = $('
').addClass ('ov_popup_list_item').appendTo (this.listDiv); + if (item.color) { + $('
').addClass ('ov_popup_list_item_rgbbox').css ('background', '#' + item.color).appendTo (listItemDiv); + } + $('
').addClass ('ov_popup_list_item_name').html (item.name).appendTo (listItemDiv); + listItemDiv.click (callbacks.onClick); + if (OV.IsHoverEnabled () && callbacks.onHoverStart && callbacks.onHoverStop) { + listItemDiv.hover ( + function () { + callbacks.onHoverStart (); + }, + function () { + callbacks.onHoverStop (); + } + ); + } + } + + Show () + { + this.modal.Open (); + } + + Hide () + { + this.modal.Close (); + } +}; + +OV.ShowMessageDialog = function (title, message, subMessage) +{ + let dialog = new OV.ButtonDialog (); + let contentDiv = dialog.Init (title, [ + { + name : 'OK', + onClick () { + dialog.Hide (); + } + } + ]); + $('
').addClass ('ov_dialog_message').html (message).appendTo (contentDiv); + if (subMessage !== null) { + $('
').addClass ('ov_dialog_submessage').html ('' + subMessage + '').appendTo (contentDiv); + } + dialog.Show (); + return dialog; +}; + +OV.ShowOpenUrlDialog = function (onOk) +{ + function CorrectFileHostUrls (urls) + { + for (let i = 0; i < urls.length; i++) { + let url = urls[i]; + if (url.search ('www.dropbox.com') !== -1) { + url = url.replace ('www.dropbox.com', 'dl.dropbox.com'); + let separatorPos = url.indexOf ('?'); + if (separatorPos !== -1) { + url = url.substr (0, separatorPos); + } + urls[i] = url; + } else if (url.search ('github.com') !== -1) { + url = url.replace ('github.com', 'raw.githubusercontent.com'); + url = url.replace ('/blob', ''); + let separatorPos = url.indexOf ('?'); + if (separatorPos !== -1) { + url = url.substr (0, separatorPos); + } + urls[i] = url; + } + } + } + + let dialog = new OV.ButtonDialog (); + let urlsTextArea = $('