three-stdlib 2.16.0 → 2.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BufferGeometryUtils-1a7a235c.js +655 -0
- package/BufferGeometryUtils-971dfde3.js +1 -0
- package/Nodes-4f766d71.js +471 -0
- package/Nodes-9aa16d74.js +1 -0
- package/animation/AnimationClipCreator.cjs.js +1 -0
- package/animation/AnimationClipCreator.js +52 -32
- package/animation/CCDIKSolver.cjs.js +1 -0
- package/animation/CCDIKSolver.js +143 -64
- package/animation/MMDAnimationHelper.cjs.js +1 -0
- package/animation/MMDAnimationHelper.js +341 -150
- package/animation/MMDPhysics.cjs.js +1 -0
- package/animation/MMDPhysics.js +361 -154
- package/cameras/CinematicCamera.cjs.js +1 -0
- package/cameras/CinematicCamera.js +77 -67
- package/controls/ArcballControls.cjs.js +1 -0
- package/controls/ArcballControls.js +1449 -544
- package/controls/DeviceOrientationControls.cjs.js +1 -0
- package/controls/DeviceOrientationControls.js +97 -52
- package/controls/DragControls.cjs.js +1 -0
- package/controls/DragControls.js +187 -85
- package/controls/FirstPersonControls.cjs.js +1 -0
- package/controls/FirstPersonControls.js +193 -123
- package/controls/FlyControls.cjs.js +1 -0
- package/controls/FlyControls.d.ts +5 -4
- package/controls/FlyControls.js +160 -90
- package/controls/OrbitControls.cjs.js +1 -0
- package/controls/OrbitControls.js +481 -232
- package/controls/PointerLockControls.cjs.js +1 -0
- package/controls/PointerLockControls.js +99 -63
- package/controls/TrackballControls.cjs.js +1 -0
- package/controls/TrackballControls.js +383 -211
- package/controls/TransformControls.cjs.js +1 -0
- package/controls/TransformControls.js +782 -575
- package/controls/experimental/CameraControls.cjs.js +1 -0
- package/controls/experimental/CameraControls.js +609 -329
- package/csm/CSM.cjs.js +1 -0
- package/csm/CSM.js +108 -47
- package/csm/CSMFrustum.cjs.js +1 -0
- package/csm/CSMFrustum.js +29 -14
- package/csm/CSMHelper.cjs.js +1 -0
- package/csm/CSMHelper.js +34 -20
- package/csm/CSMShader.cjs.js +1 -0
- package/csm/CSMShader.js +11 -7
- package/curves/CurveExtras.cjs.js +1 -0
- package/curves/CurveExtras.js +115 -73
- package/curves/NURBSCurve.cjs.js +1 -0
- package/curves/NURBSCurve.js +43 -15
- package/curves/NURBSSurface.cjs.js +1 -0
- package/curves/NURBSSurface.js +27 -11
- package/curves/NURBSUtils.cjs.js +1 -0
- package/curves/NURBSUtils.js +203 -54
- package/custom.d.cjs.js +1 -0
- package/{shaders/types.mjs → custom.d.js} +0 -0
- package/deprecated/Geometry.cjs.js +1 -0
- package/deprecated/Geometry.js +486 -191
- package/effects/AnaglyphEffect.cjs.js +1 -0
- package/effects/AnaglyphEffect.js +60 -95
- package/effects/AsciiEffect.cjs.js +1 -0
- package/effects/AsciiEffect.js +110 -80
- package/effects/OutlineEffect.cjs.js +1 -0
- package/effects/OutlineEffect.js +204 -121
- package/effects/ParallaxBarrierEffect.cjs.js +1 -0
- package/effects/ParallaxBarrierEffect.js +38 -39
- package/effects/PeppersGhostEffect.cjs.js +1 -0
- package/effects/PeppersGhostEffect.js +68 -19
- package/effects/StereoEffect.cjs.js +1 -0
- package/effects/StereoEffect.js +16 -12
- package/environments/RoomEnvironment.cjs.js +1 -0
- package/environments/RoomEnvironment.js +47 -52
- package/exporters/ColladaExporter.cjs.js +1 -0
- package/exporters/ColladaExporter.js +241 -115
- package/exporters/DRACOExporter.cjs.js +1 -0
- package/exporters/DRACOExporter.js +121 -67
- package/exporters/GLTFExporter.cjs.js +1 -0
- package/exporters/GLTFExporter.js +1014 -463
- package/exporters/MMDExporter.cjs.js +1 -0
- package/exporters/MMDExporter.js +102 -44
- package/exporters/OBJExporter.cjs.js +1 -0
- package/exporters/OBJExporter.js +140 -78
- package/exporters/PLYExporter.cjs.js +1 -0
- package/exporters/PLYExporter.js +154 -93
- package/exporters/STLExporter.cjs.js +1 -0
- package/exporters/STLExporter.js +81 -30
- package/exporters/USDZExporter.cjs.js +1 -0
- package/exporters/USDZExporter.js +144 -84
- package/geometries/BoxLineGeometry.cjs.js +1 -0
- package/geometries/BoxLineGeometry.js +14 -7
- package/geometries/ConvexGeometry.cjs.js +1 -0
- package/geometries/ConvexGeometry.js +23 -14
- package/geometries/DecalGeometry.cjs.js +1 -0
- package/geometries/DecalGeometry.js +162 -108
- package/geometries/LightningStrike.cjs.js +1 -0
- package/geometries/LightningStrike.js +294 -101
- package/geometries/ParametricGeometries.cjs.js +1 -0
- package/geometries/ParametricGeometries.js +76 -26
- package/geometries/ParametricGeometry.cjs.js +1 -0
- package/geometries/ParametricGeometry.js +48 -24
- package/geometries/RoundedBoxGeometry.cjs.js +1 -0
- package/geometries/RoundedBoxGeometry.js +64 -33
- package/geometries/TeapotGeometry.cjs.js +1 -0
- package/geometries/TeapotGeometry.js +174 -1434
- package/geometries/TextGeometry.cjs.js +1 -0
- package/geometries/TextGeometry.js +17 -9
- package/helpers/LightProbeHelper.cjs.js +1 -0
- package/helpers/LightProbeHelper.js +21 -53
- package/helpers/PositionalAudioHelper.cjs.js +1 -0
- package/helpers/PositionalAudioHelper.js +30 -23
- package/helpers/RectAreaLightHelper.cjs.js +1 -0
- package/helpers/RectAreaLightHelper.js +33 -17
- package/helpers/VertexNormalsHelper.cjs.js +1 -0
- package/helpers/VertexNormalsHelper.js +41 -20
- package/helpers/VertexTangentsHelper.cjs.js +1 -0
- package/helpers/VertexTangentsHelper.js +36 -18
- package/index.cjs.js +1 -0
- package/index.js +333 -969
- package/interactive/InteractiveGroup.cjs.js +1 -0
- package/interactive/InteractiveGroup.d.ts +5 -0
- package/interactive/InteractiveGroup.js +87 -0
- package/interactive/SelectionBox.cjs.js +1 -0
- package/interactive/SelectionBox.js +46 -31
- package/interactive/SelectionHelper.cjs.js +1 -0
- package/interactive/SelectionHelper.js +21 -16
- package/libs/MeshoptDecoder.cjs.js +1 -0
- package/libs/MeshoptDecoder.js +58 -147
- package/libs/MotionControllers.cjs.js +1 -0
- package/libs/MotionControllers.js +208 -66
- package/lights/LightProbeGenerator.cjs.js +1 -0
- package/lights/LightProbeGenerator.js +96 -40
- package/lights/RectAreaLightUniformsLib.cjs.js +1 -0
- package/lights/RectAreaLightUniformsLib.js +9 -32842
- package/lines/Line2.cjs.js +1 -0
- package/lines/Line2.js +12 -9
- package/lines/LineGeometry.cjs.js +1 -0
- package/lines/LineGeometry.js +19 -7
- package/lines/LineMaterial.cjs.js +1 -0
- package/lines/LineMaterial.js +89 -51
- package/lines/LineSegments2.cjs.js +1 -0
- package/lines/LineSegments2.js +165 -56
- package/lines/LineSegmentsGeometry.cjs.js +1 -0
- package/lines/LineSegmentsGeometry.js +71 -29
- package/lines/Wireframe.cjs.js +1 -0
- package/lines/Wireframe.js +29 -15
- package/lines/WireframeGeometry2.cjs.js +1 -0
- package/lines/WireframeGeometry2.js +9 -8
- package/loaders/3DMLoader.cjs.js +1 -0
- package/loaders/3DMLoader.js +469 -234
- package/loaders/3MFLoader.cjs.js +1 -0
- package/loaders/3MFLoader.js +555 -340
- package/loaders/AMFLoader.cjs.js +1 -0
- package/loaders/AMFLoader.js +219 -114
- package/loaders/AssimpLoader.cjs.js +1 -0
- package/loaders/AssimpLoader.js +725 -328
- package/loaders/BVHLoader.cjs.js +1 -0
- package/loaders/BVHLoader.js +200 -94
- package/loaders/BasisTextureLoader.cjs.js +1 -0
- package/loaders/BasisTextureLoader.js +357 -229
- package/loaders/ColladaLoader.cjs.js +1 -0
- package/loaders/ColladaLoader.js +1522 -932
- package/loaders/DDSLoader.cjs.js +1 -0
- package/loaders/DDSLoader.js +108 -42
- package/loaders/DRACOLoader.cjs.js +1 -0
- package/loaders/DRACOLoader.js +210 -103
- package/loaders/EXRLoader.cjs.js +1 -0
- package/loaders/EXRLoader.js +809 -461
- package/loaders/FBXLoader.cjs.js +1 -0
- package/loaders/FBXLoader.js +1397 -842
- package/loaders/FontLoader.cjs.js +1 -0
- package/loaders/FontLoader.js +66 -33
- package/loaders/GCodeLoader.cjs.js +1 -0
- package/loaders/GCodeLoader.js +111 -63
- package/loaders/GLTFLoader.cjs.js +1 -0
- package/loaders/GLTFLoader.js +1484 -771
- package/loaders/HDRCubeTextureLoader.cjs.js +1 -0
- package/loaders/HDRCubeTextureLoader.js +50 -45
- package/loaders/KMZLoader.cjs.js +1 -0
- package/loaders/KMZLoader.js +55 -42
- package/loaders/KTX2Loader.cjs.js +1 -0
- package/loaders/KTX2Loader.js +362 -229
- package/loaders/KTXLoader.cjs.js +1 -0
- package/loaders/KTXLoader.js +99 -37
- package/loaders/LDrawLoader.cjs.js +1 -0
- package/loaders/LDrawLoader.js +746 -313
- package/loaders/LUT3dlLoader.cjs.js +1 -0
- package/loaders/LUT3dlLoader.js +62 -50
- package/loaders/LUTCubeLoader.cjs.js +1 -0
- package/loaders/LUTCubeLoader.js +56 -45
- package/loaders/LWOLoader.cjs.js +1 -0
- package/loaders/LWOLoader.js +339 -227
- package/loaders/LottieLoader.cjs.js +1 -0
- package/loaders/LottieLoader.js +38 -36
- package/loaders/MD2Loader.cjs.js +1 -0
- package/loaders/MD2Loader.js +91 -248
- package/loaders/MDDLoader.cjs.js +1 -0
- package/loaders/MDDLoader.js +45 -25
- package/loaders/MMDLoader.cjs.js +1 -0
- package/loaders/MMDLoader.js +795 -359
- package/loaders/MTLLoader.cjs.js +1 -0
- package/loaders/MTLLoader.js +201 -91
- package/loaders/NRRDLoader.cjs.js +1 -0
- package/loaders/NRRDLoader.js +263 -182
- package/loaders/NodeMaterialLoader.cjs.js +1 -0
- package/loaders/NodeMaterialLoader.js +14 -121
- package/loaders/OBJLoader.cjs.js +1 -0
- package/loaders/OBJLoader.js +283 -161
- package/loaders/PCDLoader.cjs.js +1 -0
- package/loaders/PCDLoader.js +164 -145
- package/loaders/PDBLoader.cjs.js +1 -0
- package/loaders/PDBLoader.js +63 -45
- package/loaders/PLYLoader.cjs.js +1 -0
- package/loaders/PLYLoader.js +203 -106
- package/loaders/PRWMLoader.cjs.js +1 -0
- package/loaders/PRWMLoader.js +110 -73
- package/loaders/PVRLoader.cjs.js +1 -0
- package/loaders/PVRLoader.js +93 -32
- package/loaders/RGBELoader.cjs.js +1 -0
- package/loaders/RGBELoader.js +233 -96
- package/loaders/RGBMLoader.cjs.js +1 -0
- package/loaders/RGBMLoader.js +514 -344
- package/loaders/STLLoader.cjs.js +1 -0
- package/loaders/STLLoader.js +165 -59
- package/loaders/SVGLoader.cjs.js +1 -0
- package/loaders/SVGLoader.js +851 -481
- package/loaders/TDSLoader.cjs.js +1 -0
- package/loaders/TDSLoader.js +527 -137
- package/loaders/TGALoader.cjs.js +1 -0
- package/loaders/TGALoader.js +205 -94
- package/loaders/TTFLoader.cjs.js +1 -0
- package/loaders/TTFLoader.js +79 -58
- package/loaders/TiltLoader.cjs.js +1 -0
- package/loaders/TiltLoader.js +167 -129
- package/loaders/VOXLoader.cjs.js +1 -0
- package/loaders/VOXLoader.js +84 -320
- package/loaders/VRMLLoader.cjs.js +1 -0
- package/loaders/VRMLLoader.js +1268 -786
- package/loaders/VRMLoader.cjs.js +1 -0
- package/loaders/VRMLoader.js +31 -23
- package/loaders/VTKLoader.cjs.js +1 -0
- package/loaders/VTKLoader.js +407 -219
- package/loaders/XLoader.cjs.js +1 -0
- package/loaders/XLoader.js +1259 -1083
- package/loaders/XYZLoader.cjs.js +1 -0
- package/loaders/XYZLoader.js +34 -28
- package/loaders/lwo/IFFParser.cjs.js +1 -0
- package/loaders/lwo/IFFParser.js +492 -238
- package/loaders/lwo/LWO2Parser.cjs.js +1 -0
- package/loaders/lwo/LWO2Parser.js +279 -176
- package/loaders/lwo/LWO3Parser.cjs.js +1 -0
- package/loaders/lwo/LWO3Parser.js +247 -160
- package/math/Capsule.cjs.js +1 -0
- package/math/Capsule.js +43 -56
- package/math/ColorConverter.cjs.js +1 -0
- package/math/ColorConverter.js +32 -18
- package/math/ConvexHull.cjs.js +1 -0
- package/math/ConvexHull.js +357 -97
- package/math/ImprovedNoise.cjs.js +1 -0
- package/math/ImprovedNoise.js +32 -282
- package/math/Lut.cjs.js +1 -0
- package/math/Lut.js +35 -51
- package/math/MeshSurfaceSampler.cjs.js +1 -0
- package/math/MeshSurfaceSampler.js +68 -25
- package/math/OBB.cjs.js +1 -0
- package/math/OBB.js +152 -91
- package/math/Octree.cjs.js +1 -0
- package/math/Octree.js +139 -76
- package/math/SimplexNoise.cjs.js +1 -0
- package/math/SimplexNoise.js +238 -217
- package/misc/ConvexObjectBreaker.cjs.js +1 -0
- package/misc/ConvexObjectBreaker.js +185 -79
- package/misc/GPUComputationRenderer.cjs.js +1 -0
- package/misc/GPUComputationRenderer.js +194 -69
- package/misc/Gyroscope.cjs.js +1 -0
- package/misc/Gyroscope.js +22 -16
- package/misc/MD2Character.cjs.js +1 -0
- package/misc/MD2Character.js +74 -52
- package/misc/MD2CharacterComplex.cjs.js +1 -0
- package/misc/MD2CharacterComplex.js +163 -112
- package/misc/MorphAnimMesh.cjs.js +1 -0
- package/misc/MorphAnimMesh.js +28 -20
- package/misc/MorphBlendMesh.cjs.js +1 -0
- package/misc/MorphBlendMesh.js +69 -45
- package/misc/ProgressiveLightmap.cjs.js +1 -0
- package/misc/ProgressiveLightmap.js +187 -70
- package/misc/RollerCoaster.cjs.js +1 -0
- package/misc/RollerCoaster.js +135 -106
- package/misc/TubePainter.cjs.js +1 -0
- package/misc/TubePainter.js +92 -74
- package/misc/Volume.cjs.js +1 -0
- package/misc/Volume.js +270 -108
- package/misc/VolumeSlice.cjs.js +1 -0
- package/misc/VolumeSlice.js +122 -34
- package/misc/WebGL.cjs.js +1 -0
- package/misc/WebGL.js +34 -37
- package/modifiers/CurveModifier.cjs.js +1 -0
- package/modifiers/CurveModifier.js +151 -46
- package/modifiers/EdgeSplitModifier.cjs.js +1 -0
- package/modifiers/EdgeSplitModifier.js +90 -46
- package/modifiers/SimplifyModifier.cjs.js +1 -0
- package/modifiers/SimplifyModifier.js +202 -77
- package/modifiers/TessellateModifier.cjs.js +1 -0
- package/modifiers/TessellateModifier.js +90 -65
- package/nodes/Nodes.cjs.js +1 -0
- package/nodes/Nodes.js +140 -274
- package/nodes/ShaderNode.cjs.js +1 -0
- package/nodes/ShaderNode.js +196 -296
- package/nodes/accessors/BufferNode.cjs.js +1 -0
- package/nodes/accessors/BufferNode.js +8 -4
- package/nodes/accessors/CameraNode.cjs.js +1 -0
- package/nodes/accessors/CameraNode.js +25 -20
- package/nodes/accessors/CubeTextureNode.cjs.js +1 -0
- package/nodes/accessors/CubeTextureNode.js +26 -14
- package/nodes/accessors/MaterialNode.cjs.js +1 -0
- package/nodes/accessors/MaterialNode.js +53 -43
- package/nodes/accessors/MaterialReferenceNode.cjs.js +1 -0
- package/nodes/accessors/MaterialReferenceNode.js +6 -3
- package/nodes/accessors/ModelNode.cjs.js +1 -0
- package/nodes/accessors/ModelNode.js +5 -3
- package/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
- package/nodes/accessors/ModelViewProjectionNode.js +13 -14
- package/nodes/accessors/NormalNode.cjs.js +1 -0
- package/nodes/accessors/NormalNode.js +39 -40
- package/nodes/accessors/Object3DNode.cjs.js +1 -0
- package/nodes/accessors/Object3DNode.js +50 -40
- package/nodes/accessors/PointUVNode.cjs.js +1 -0
- package/nodes/accessors/PointUVNode.js +9 -5
- package/nodes/accessors/PositionNode.cjs.js +1 -0
- package/nodes/accessors/PositionNode.js +41 -42
- package/nodes/accessors/ReferenceNode.cjs.js +1 -0
- package/nodes/accessors/ReferenceNode.js +17 -10
- package/nodes/accessors/ReflectNode.cjs.js +1 -0
- package/nodes/accessors/ReflectNode.js +26 -23
- package/nodes/accessors/SkinningNode.cjs.js +1 -0
- package/nodes/accessors/SkinningNode.js +48 -46
- package/nodes/accessors/TextureNode.cjs.js +1 -0
- package/nodes/accessors/TextureNode.js +29 -14
- package/nodes/accessors/UVNode.cjs.js +1 -0
- package/nodes/accessors/UVNode.js +11 -5
- package/nodes/core/ArrayUniformNode.cjs.js +1 -0
- package/nodes/core/ArrayUniformNode.js +7 -3
- package/nodes/core/AttributeNode.cjs.js +1 -0
- package/nodes/core/AttributeNode.js +12 -5
- package/nodes/core/BypassNode.cjs.js +1 -0
- package/nodes/core/BypassNode.js +12 -5
- package/nodes/core/CodeNode.cjs.js +1 -0
- package/nodes/core/CodeNode.js +12 -4
- package/nodes/core/ConstNode.cjs.js +1 -0
- package/nodes/core/ConstNode.js +7 -3
- package/nodes/core/ContextNode.cjs.js +1 -0
- package/nodes/core/ContextNode.js +8 -3
- package/nodes/core/ExpressionNode.cjs.js +1 -0
- package/nodes/core/ExpressionNode.js +9 -5
- package/nodes/core/FunctionCallNode.cjs.js +1 -0
- package/nodes/core/FunctionCallNode.js +15 -6
- package/nodes/core/FunctionNode.cjs.js +1 -0
- package/nodes/core/FunctionNode.js +25 -10
- package/nodes/core/InputNode.cjs.js +1 -0
- package/nodes/core/InputNode.js +23 -12
- package/nodes/core/Node.cjs.js +1 -0
- package/nodes/core/Node.js +75 -35
- package/nodes/core/NodeAttribute.cjs.js +1 -0
- package/nodes/core/NodeAttribute.js +4 -2
- package/nodes/core/NodeBuilder.cjs.js +1 -0
- package/nodes/core/NodeBuilder.js +224 -110
- package/nodes/core/NodeCode.cjs.js +1 -0
- package/nodes/core/NodeCode.js +7 -4
- package/nodes/core/NodeFrame.cjs.js +1 -0
- package/nodes/core/NodeFrame.js +12 -9
- package/nodes/core/NodeFunction.cjs.js +1 -0
- package/nodes/core/NodeFunction.js +17 -0
- package/nodes/core/NodeFunctionInput.cjs.js +1 -0
- package/nodes/core/NodeFunctionInput.js +5 -3
- package/nodes/core/NodeKeywords.cjs.js +1 -0
- package/nodes/core/NodeKeywords.js +16 -5
- package/nodes/core/NodeParser.cjs.js +1 -0
- package/nodes/core/NodeParser.js +8 -0
- package/nodes/core/NodeUniform.cjs.js +1 -0
- package/nodes/core/NodeUniform.js +7 -3
- package/nodes/core/NodeUtils.cjs.js +1 -0
- package/nodes/core/NodeUtils.js +43 -39
- package/nodes/core/NodeVar.cjs.js +1 -0
- package/nodes/core/NodeVar.js +4 -2
- package/nodes/core/NodeVary.cjs.js +1 -0
- package/nodes/core/NodeVary.js +4 -2
- package/nodes/core/PropertyNode.cjs.js +1 -0
- package/nodes/core/PropertyNode.js +10 -4
- package/nodes/core/TempNode.cjs.js +1 -0
- package/nodes/core/TempNode.js +11 -5
- package/nodes/core/UniformNode.cjs.js +1 -0
- package/nodes/core/UniformNode.js +10 -4
- package/nodes/core/VarNode.cjs.js +1 -0
- package/nodes/core/VarNode.js +11 -3
- package/nodes/core/VaryNode.cjs.js +1 -0
- package/nodes/core/VaryNode.js +15 -6
- package/nodes/core/constants.cjs.js +1 -0
- package/nodes/core/constants.js +7 -20
- package/nodes/display/ColorSpaceNode.cjs.js +1 -0
- package/nodes/display/ColorSpaceNode.js +38 -34
- package/nodes/display/NormalMapNode.cjs.js +1 -0
- package/nodes/display/NormalMapNode.js +53 -35
- package/nodes/fog/FogNode.cjs.js +1 -0
- package/nodes/fog/FogNode.js +9 -5
- package/nodes/fog/FogRangeNode.cjs.js +1 -0
- package/nodes/fog/FogRangeNode.js +9 -5
- package/nodes/functions/BSDFs.cjs.js +1 -0
- package/nodes/functions/BSDFs.js +118 -61
- package/nodes/functions/PhysicalMaterialFunctions.cjs.js +1 -0
- package/nodes/functions/PhysicalMaterialFunctions.js +57 -0
- package/nodes/lights/LightContextNode.cjs.js +1 -0
- package/nodes/lights/LightContextNode.js +23 -14
- package/nodes/lights/LightNode.cjs.js +1 -0
- package/nodes/lights/LightNode.js +31 -27
- package/nodes/lights/LightsNode.cjs.js +1 -0
- package/nodes/lights/LightsNode.js +28 -9
- package/nodes/loaders/NodeLoader.cjs.js +1 -0
- package/nodes/loaders/NodeLoader.js +42 -27
- package/nodes/loaders/NodeMaterialLoader.cjs.js +1 -0
- package/nodes/loaders/NodeMaterialLoader.js +10 -4
- package/nodes/loaders/NodeObjectLoader.cjs.js +1 -0
- package/nodes/loaders/NodeObjectLoader.js +19 -9
- package/nodes/materials/LineBasicNodeMaterial.cjs.js +1 -0
- package/nodes/materials/LineBasicNodeMaterial.js +10 -5
- package/nodes/materials/Materials.cjs.js +1 -0
- package/nodes/materials/Materials.js +17 -14
- package/nodes/materials/MeshBasicNodeMaterial.cjs.js +1 -0
- package/nodes/materials/MeshBasicNodeMaterial.js +10 -5
- package/nodes/materials/MeshStandardNodeMaterial.cjs.js +1 -0
- package/nodes/materials/MeshStandardNodeMaterial.js +8 -5
- package/nodes/materials/NodeMaterial.cjs.js +1 -0
- package/nodes/materials/NodeMaterial.js +36 -20
- package/nodes/materials/PointsNodeMaterial.cjs.js +1 -0
- package/nodes/materials/PointsNodeMaterial.js +10 -5
- package/nodes/math/CondNode.cjs.js +1 -0
- package/nodes/math/CondNode.js +23 -11
- package/nodes/math/MathNode.cjs.js +1 -0
- package/nodes/math/MathNode.js +142 -98
- package/nodes/math/OperatorNode.cjs.js +1 -0
- package/nodes/math/OperatorNode.js +46 -24
- package/nodes/parsers/GLSLNodeFunction.cjs.js +1 -0
- package/nodes/parsers/GLSLNodeFunction.js +101 -0
- package/nodes/parsers/GLSLNodeParser.cjs.js +1 -0
- package/nodes/parsers/GLSLNodeParser.js +13 -0
- package/nodes/parsers/WGSLNodeFunction.cjs.js +1 -0
- package/nodes/parsers/WGSLNodeFunction.js +71 -0
- package/nodes/parsers/WGSLNodeParser.cjs.js +1 -0
- package/nodes/parsers/WGSLNodeParser.js +13 -0
- package/nodes/procedural/CheckerNode.cjs.js +1 -0
- package/nodes/procedural/CheckerNode.js +19 -13
- package/nodes/utils/ArrayElementNode.cjs.js +1 -0
- package/nodes/utils/ArrayElementNode.js +8 -4
- package/nodes/utils/ConvertNode.cjs.js +1 -0
- package/nodes/utils/ConvertNode.js +8 -3
- package/nodes/utils/JoinNode.cjs.js +1 -0
- package/nodes/utils/JoinNode.js +11 -7
- package/nodes/utils/MatcapUVNode.cjs.js +1 -0
- package/nodes/utils/MatcapUVNode.js +11 -8
- package/nodes/utils/OscNode.cjs.js +1 -0
- package/nodes/utils/OscNode.js +33 -27
- package/nodes/utils/SplitNode.cjs.js +1 -0
- package/nodes/utils/SplitNode.js +20 -6
- package/nodes/utils/SpriteSheetUVNode.cjs.js +1 -0
- package/nodes/utils/SpriteSheetUVNode.js +23 -23
- package/nodes/utils/TimerNode.cjs.js +1 -0
- package/nodes/utils/TimerNode.js +24 -20
- package/objects/GroundProjectedEnv.cjs.js +1 -0
- package/objects/GroundProjectedEnv.js +37 -22
- package/objects/Lensflare.cjs.js +1 -0
- package/objects/Lensflare.js +156 -86
- package/objects/LightningStorm.cjs.js +1 -0
- package/objects/LightningStorm.js +102 -38
- package/objects/MarchingCubes.cjs.js +1 -0
- package/objects/MarchingCubes.js +303 -150
- package/objects/Reflector.cjs.js +1 -0
- package/objects/Reflector.js +72 -50
- package/objects/ReflectorForSSRPass.cjs.js +1 -0
- package/objects/ReflectorForSSRPass.js +131 -80
- package/objects/ReflectorRTT.cjs.js +1 -0
- package/objects/ReflectorRTT.js +7 -6
- package/objects/Refractor.cjs.js +1 -0
- package/objects/Refractor.js +106 -64
- package/objects/ShadowMesh.cjs.js +1 -0
- package/objects/ShadowMesh.js +17 -8
- package/objects/Sky.cjs.js +1 -0
- package/objects/Sky.js +80 -119
- package/objects/Water.cjs.js +1 -0
- package/objects/Water.js +127 -83
- package/objects/Water2.cjs.js +1 -0
- package/objects/Water2.js +108 -72
- package/offscreen/jank.cjs.js +1 -0
- package/offscreen/jank.js +14 -10
- package/offscreen/offscreen.cjs.js +1 -0
- package/offscreen/offscreen.js +5 -4
- package/offscreen/scene.cjs.js +1 -0
- package/offscreen/scene.js +48 -45
- package/package.json +3 -3
- package/physics/AmmoPhysics.cjs.js +1 -0
- package/physics/AmmoPhysics.js +71 -30
- package/postprocessing/AdaptiveToneMappingPass.cjs.js +1 -0
- package/postprocessing/AdaptiveToneMappingPass.js +123 -97
- package/postprocessing/AfterimagePass.cjs.js +1 -0
- package/postprocessing/AfterimagePass.js +49 -28
- package/postprocessing/BloomPass.cjs.js +1 -0
- package/postprocessing/BloomPass.js +69 -43
- package/postprocessing/BokehPass.cjs.js +1 -0
- package/postprocessing/BokehPass.js +69 -39
- package/postprocessing/ClearPass.cjs.js +1 -0
- package/postprocessing/ClearPass.js +25 -10
- package/postprocessing/CubeTexturePass.cjs.js +1 -0
- package/postprocessing/CubeTexturePass.js +27 -28
- package/postprocessing/DotScreenPass.cjs.js +1 -0
- package/postprocessing/DotScreenPass.js +32 -24
- package/postprocessing/EffectComposer.cjs.js +1 -0
- package/postprocessing/EffectComposer.js +86 -39
- package/postprocessing/FilmPass.cjs.js +1 -0
- package/postprocessing/FilmPass.js +30 -25
- package/postprocessing/GlitchPass.cjs.js +1 -0
- package/postprocessing/GlitchPass.js +61 -38
- package/postprocessing/HalftonePass.cjs.js +1 -0
- package/postprocessing/HalftonePass.js +39 -19
- package/postprocessing/LUTPass.cjs.js +1 -0
- package/postprocessing/LUTPass.js +38 -13
- package/postprocessing/MaskPass.cjs.js +1 -0
- package/postprocessing/MaskPass.js +38 -19
- package/postprocessing/OutlinePass.cjs.js +1 -0
- package/postprocessing/OutlinePass.js +277 -135
- package/postprocessing/Pass.cjs.js +1 -0
- package/postprocessing/Pass.js +44 -20
- package/postprocessing/RenderPass.cjs.js +1 -0
- package/postprocessing/RenderPass.js +36 -13
- package/postprocessing/RenderPixelatedPass.cjs.js +1 -0
- package/postprocessing/RenderPixelatedPass.js +58 -44
- package/postprocessing/SAOPass.cjs.js +1 -0
- package/postprocessing/SAOPass.js +189 -154
- package/postprocessing/SMAAPass.cjs.js +1 -0
- package/postprocessing/SMAAPass.js +84 -64
- package/postprocessing/SSAARenderPass.cjs.js +1 -0
- package/postprocessing/SSAARenderPass.js +69 -121
- package/postprocessing/SSAOPass.cjs.js +1 -0
- package/postprocessing/SSAOPass.js +172 -123
- package/postprocessing/SSRPass.cjs.js +1 -0
- package/postprocessing/SSRPass.js +280 -211
- package/postprocessing/SavePass.cjs.js +1 -0
- package/postprocessing/SavePass.js +25 -20
- package/postprocessing/ShaderPass.cjs.js +1 -0
- package/postprocessing/ShaderPass.js +30 -14
- package/postprocessing/TAARenderPass.cjs.js +1 -0
- package/postprocessing/TAARenderPass.js +61 -42
- package/postprocessing/TexturePass.cjs.js +1 -0
- package/postprocessing/TexturePass.js +22 -21
- package/postprocessing/UnrealBloomPass.cjs.js +1 -0
- package/postprocessing/UnrealBloomPass.js +213 -105
- package/renderers/CSS2DRenderer.cjs.js +1 -0
- package/renderers/CSS2DRenderer.js +56 -44
- package/renderers/CSS3DRenderer.cjs.js +1 -0
- package/renderers/CSS3DRenderer.js +86 -53
- package/renderers/Projector.cjs.js +1 -0
- package/renderers/Projector.js +274 -107
- package/renderers/SVGRenderer.cjs.js +1 -0
- package/renderers/SVGRenderer.js +182 -72
- package/renderers/nodes/accessors/CameraNode.cjs.js +1 -0
- package/renderers/nodes/accessors/CameraNode.js +40 -29
- package/renderers/nodes/accessors/ModelNode.cjs.js +1 -0
- package/renderers/nodes/accessors/ModelNode.js +37 -28
- package/renderers/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
- package/renderers/nodes/accessors/ModelViewProjectionNode.js +23 -10
- package/renderers/nodes/accessors/NormalNode.cjs.js +1 -0
- package/renderers/nodes/accessors/NormalNode.js +45 -35
- package/renderers/nodes/accessors/PositionNode.cjs.js +1 -0
- package/renderers/nodes/accessors/PositionNode.js +19 -18
- package/renderers/nodes/accessors/UVNode.cjs.js +1 -0
- package/renderers/nodes/accessors/UVNode.js +10 -5
- package/renderers/nodes/core/AttributeNode.cjs.js +1 -0
- package/renderers/nodes/core/AttributeNode.js +14 -5
- package/renderers/nodes/core/InputNode.cjs.js +1 -0
- package/renderers/nodes/core/InputNode.js +14 -4
- package/renderers/nodes/core/Node.cjs.js +1 -0
- package/renderers/nodes/core/Node.js +17 -7
- package/renderers/nodes/core/NodeAttribute.cjs.js +1 -0
- package/renderers/nodes/core/NodeAttribute.js +6 -3
- package/renderers/nodes/core/NodeBuilder.cjs.js +1 -0
- package/renderers/nodes/core/NodeBuilder.js +154 -87
- package/renderers/nodes/core/NodeFrame.cjs.js +1 -0
- package/renderers/nodes/core/NodeFrame.js +12 -9
- package/renderers/nodes/core/NodeSlot.cjs.js +1 -0
- package/renderers/nodes/core/NodeSlot.js +3 -2
- package/renderers/nodes/core/NodeUniform.cjs.js +1 -0
- package/renderers/nodes/core/NodeUniform.js +9 -4
- package/renderers/nodes/core/NodeVary.cjs.js +1 -0
- package/renderers/nodes/core/NodeVary.js +7 -4
- package/renderers/nodes/core/VaryNode.cjs.js +1 -0
- package/renderers/nodes/core/VaryNode.js +12 -6
- package/renderers/nodes/core/constants.cjs.js +1 -0
- package/renderers/nodes/core/constants.js +13 -16
- package/renderers/nodes/inputs/ColorNode.cjs.js +1 -0
- package/renderers/nodes/inputs/ColorNode.js +11 -5
- package/renderers/nodes/inputs/FloatNode.cjs.js +1 -0
- package/renderers/nodes/inputs/FloatNode.js +11 -5
- package/renderers/nodes/inputs/Matrix3Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Matrix3Node.js +13 -7
- package/renderers/nodes/inputs/Matrix4Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Matrix4Node.js +13 -7
- package/renderers/nodes/inputs/TextureNode.cjs.js +1 -0
- package/renderers/nodes/inputs/TextureNode.js +15 -7
- package/renderers/nodes/inputs/Vector2Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Vector2Node.js +11 -5
- package/renderers/nodes/inputs/Vector3Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Vector3Node.js +13 -7
- package/renderers/nodes/inputs/Vector4Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Vector4Node.js +13 -7
- package/renderers/nodes/math/MathNode.cjs.js +1 -0
- package/renderers/nodes/math/MathNode.js +30 -20
- package/renderers/nodes/math/OperatorNode.cjs.js +1 -0
- package/renderers/nodes/math/OperatorNode.js +20 -4
- package/renderers/nodes/utils/SwitchNode.cjs.js +1 -0
- package/renderers/nodes/utils/SwitchNode.js +9 -4
- package/renderers/nodes/utils/TimerNode.cjs.js +1 -0
- package/renderers/nodes/utils/TimerNode.js +10 -5
- package/renderers/webgpu/WebGPU.cjs.js +1 -0
- package/renderers/webgpu/WebGPU.js +16 -14
- package/renderers/webgpu/WebGPUAttributes.cjs.js +1 -0
- package/renderers/webgpu/WebGPUAttributes.js +23 -16
- package/renderers/webgpu/WebGPUBackground.cjs.js +1 -0
- package/renderers/webgpu/WebGPUBackground.js +30 -13
- package/renderers/webgpu/WebGPUBinding.cjs.js +1 -0
- package/renderers/webgpu/WebGPUBinding.js +7 -4
- package/renderers/webgpu/WebGPUBindings.cjs.js +1 -0
- package/renderers/webgpu/WebGPUBindings.js +57 -21
- package/renderers/webgpu/WebGPUComputePipelines.cjs.js +1 -0
- package/renderers/webgpu/WebGPUComputePipelines.js +25 -14
- package/renderers/webgpu/WebGPUGeometries.cjs.js +1 -0
- package/renderers/webgpu/WebGPUGeometries.js +15 -5
- package/renderers/webgpu/WebGPUInfo.cjs.js +1 -0
- package/renderers/webgpu/WebGPUInfo.js +8 -3
- package/renderers/webgpu/WebGPUObjects.cjs.js +1 -0
- package/renderers/webgpu/WebGPUObjects.js +10 -5
- package/renderers/webgpu/WebGPUProperties.cjs.js +1 -0
- package/renderers/webgpu/WebGPUProperties.js +11 -5
- package/renderers/webgpu/WebGPURenderLists.cjs.js +1 -0
- package/renderers/webgpu/WebGPURenderLists.js +36 -20
- package/renderers/webgpu/WebGPURenderPipelines.cjs.js +1 -0
- package/renderers/webgpu/WebGPURenderPipelines.js +387 -260
- package/renderers/webgpu/WebGPURenderer.cjs.js +1 -0
- package/renderers/webgpu/WebGPURenderer.js +262 -124
- package/renderers/webgpu/WebGPUSampledTexture.cjs.js +1 -0
- package/renderers/webgpu/WebGPUSampledTexture.js +31 -18
- package/renderers/webgpu/WebGPUSampler.cjs.js +1 -0
- package/renderers/webgpu/WebGPUSampler.js +12 -7
- package/renderers/webgpu/WebGPUStorageBuffer.cjs.js +1 -0
- package/renderers/webgpu/WebGPUStorageBuffer.js +12 -7
- package/renderers/webgpu/WebGPUTextureRenderer.cjs.js +1 -0
- package/renderers/webgpu/WebGPUTextureRenderer.js +11 -5
- package/renderers/webgpu/WebGPUTextureUtils.cjs.js +1 -0
- package/renderers/webgpu/WebGPUTextureUtils.js +40 -29
- package/renderers/webgpu/WebGPUTextures.cjs.js +1 -0
- package/renderers/webgpu/WebGPUTextures.js +333 -186
- package/renderers/webgpu/WebGPUUniform.cjs.js +1 -0
- package/renderers/webgpu/WebGPUUniform.js +51 -25
- package/renderers/webgpu/WebGPUUniformsGroup.cjs.js +1 -0
- package/renderers/webgpu/WebGPUUniformsGroup.js +72 -32
- package/renderers/webgpu/constants.cjs.js +1 -0
- package/renderers/webgpu/constants.js +181 -190
- package/renderers/webgpu/nodes/ShaderLib.cjs.js +1 -0
- package/renderers/webgpu/nodes/ShaderLib.js +2 -2
- package/renderers/webgpu/nodes/WebGPUNodeBuilder.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodeBuilder.js +124 -53
- package/renderers/webgpu/nodes/WebGPUNodeUniform.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodeUniform.js +31 -17
- package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +9 -8
- package/renderers/webgpu/nodes/WebGPUNodes.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodes.js +45 -7
- package/shaders/ACESFilmicToneMappingShader.cjs.js +1 -0
- package/shaders/ACESFilmicToneMappingShader.js +24 -44
- package/shaders/AfterimageShader.cjs.js +1 -0
- package/shaders/AfterimageShader.js +18 -28
- package/shaders/BasicShader.cjs.js +1 -0
- package/shaders/BasicShader.js +7 -9
- package/shaders/BleachBypassShader.cjs.js +1 -0
- package/shaders/BleachBypassShader.js +15 -31
- package/shaders/BlendShader.cjs.js +1 -0
- package/shaders/BlendShader.js +19 -26
- package/shaders/BokehShader.cjs.js +1 -0
- package/shaders/BokehShader.js +36 -98
- package/shaders/BokehShader2.cjs.js +1 -0
- package/shaders/BokehShader2.js +90 -261
- package/shaders/BrightnessContrastShader.cjs.js +1 -0
- package/shaders/BrightnessContrastShader.js +19 -28
- package/shaders/ColorCorrectionShader.cjs.js +1 -0
- package/shaders/ColorCorrectionShader.js +22 -26
- package/shaders/ColorifyShader.cjs.js +1 -0
- package/shaders/ColorifyShader.js +16 -24
- package/shaders/ConvolutionShader.cjs.js +1 -0
- package/shaders/ConvolutionShader.js +36 -40
- package/shaders/CopyShader.cjs.js +1 -0
- package/shaders/CopyShader.js +13 -21
- package/shaders/DOFMipMapShader.cjs.js +1 -0
- package/shaders/DOFMipMapShader.js +21 -28
- package/shaders/DepthLimitedBlurShader.cjs.js +1 -0
- package/shaders/DepthLimitedBlurShader.js +40 -85
- package/shaders/DigitalGlitch.cjs.js +1 -0
- package/shaders/DigitalGlitch.js +46 -74
- package/shaders/DotScreenShader.cjs.js +1 -0
- package/shaders/DotScreenShader.js +27 -35
- package/shaders/FXAAShader.cjs.js +1 -0
- package/shaders/FXAAShader.js +19 -1094
- package/shaders/FilmShader.cjs.js +1 -0
- package/shaders/FilmShader.js +52 -38
- package/shaders/FocusShader.cjs.js +1 -0
- package/shaders/FocusShader.js +24 -51
- package/shaders/FreiChenShader.cjs.js +1 -0
- package/shaders/FreiChenShader.js +24 -57
- package/shaders/FresnelShader.cjs.js +1 -0
- package/shaders/FresnelShader.js +22 -43
- package/shaders/GammaCorrectionShader.cjs.js +1 -0
- package/shaders/GammaCorrectionShader.js +11 -19
- package/shaders/GodRaysShader.cjs.js +1 -0
- package/shaders/GodRaysShader.js +94 -103
- package/shaders/HalftoneShader.cjs.js +1 -0
- package/shaders/HalftoneShader.js +65 -208
- package/shaders/HorizontalBlurShader.cjs.js +1 -0
- package/shaders/HorizontalBlurShader.js +23 -7
- package/shaders/HorizontalTiltShiftShader.cjs.js +1 -0
- package/shaders/HorizontalTiltShiftShader.js +21 -33
- package/shaders/HueSaturationShader.cjs.js +1 -0
- package/shaders/HueSaturationShader.js +21 -37
- package/shaders/KaleidoShader.cjs.js +1 -0
- package/shaders/KaleidoShader.js +22 -30
- package/shaders/LuminosityHighPassShader.cjs.js +1 -0
- package/shaders/LuminosityHighPassShader.js +27 -33
- package/shaders/LuminosityShader.cjs.js +1 -0
- package/shaders/LuminosityShader.js +11 -21
- package/shaders/MirrorShader.cjs.js +1 -0
- package/shaders/MirrorShader.js +16 -31
- package/shaders/NormalMapShader.cjs.js +1 -0
- package/shaders/NormalMapShader.js +23 -27
- package/shaders/ParallaxShader.cjs.js +1 -0
- package/shaders/ParallaxShader.js +48 -107
- package/shaders/PixelShader.cjs.js +1 -0
- package/shaders/PixelShader.js +16 -24
- package/shaders/RGBShiftShader.cjs.js +1 -0
- package/shaders/RGBShiftShader.js +22 -26
- package/shaders/SAOShader.cjs.js +1 -0
- package/shaders/SAOShader.js +48 -132
- package/shaders/SMAAShader.cjs.js +1 -0
- package/shaders/SMAAShader.js +135 -256
- package/shaders/SSAOShader.cjs.js +1 -0
- package/shaders/SSAOShader.js +81 -153
- package/shaders/SSRShader.cjs.js +1 -0
- package/shaders/SSRShader.js +87 -32
- package/shaders/SepiaShader.cjs.js +1 -0
- package/shaders/SepiaShader.js +15 -25
- package/shaders/SobelOperatorShader.cjs.js +1 -0
- package/shaders/SobelOperatorShader.js +29 -40
- package/shaders/SubsurfaceScatteringShader.cjs.js +1 -0
- package/shaders/SubsurfaceScatteringShader.js +39 -53
- package/shaders/TechnicolorShader.cjs.js +1 -0
- package/shaders/TechnicolorShader.js +13 -20
- package/shaders/ToneMapShader.cjs.js +1 -0
- package/shaders/ToneMapShader.js +28 -44
- package/shaders/ToonShader.cjs.js +1 -0
- package/shaders/ToonShader.js +96 -172
- package/shaders/TriangleBlurShader.cjs.js +1 -0
- package/shaders/TriangleBlurShader.js +23 -32
- package/shaders/UnpackDepthRGBAShader.cjs.js +1 -0
- package/shaders/UnpackDepthRGBAShader.js +14 -22
- package/shaders/VerticalBlurShader.cjs.js +1 -0
- package/shaders/VerticalBlurShader.js +23 -7
- package/shaders/VerticalTiltShiftShader.cjs.js +1 -0
- package/shaders/VerticalTiltShiftShader.js +21 -33
- package/shaders/VignetteShader.cjs.js +1 -0
- package/shaders/VignetteShader.js +28 -24
- package/shaders/VolumeShader.cjs.js +1 -0
- package/shaders/VolumeShader.js +77 -174
- package/shaders/WaterRefractionShader.cjs.js +1 -0
- package/shaders/WaterRefractionShader.js +6 -38
- package/shaders/types.cjs.js +1 -0
- package/shaders/types.js +1 -1
- package/textures/FlakesTexture.cjs.js +1 -0
- package/textures/FlakesTexture.js +10 -8
- package/types/helpers.cjs.js +1 -0
- package/types/helpers.js +2 -3
- package/types/shared.cjs.js +1 -0
- package/types/shared.js +1 -0
- package/types/utils.cjs.js +1 -0
- package/types/utils.js +1 -0
- package/utils/BufferGeometryUtils.cjs.js +1 -0
- package/utils/BufferGeometryUtils.js +325 -251
- package/utils/GeometryCompressionUtils.cjs.js +1 -0
- package/utils/GeometryCompressionUtils.js +239 -241
- package/utils/GeometryUtils.cjs.js +1 -0
- package/utils/GeometryUtils.js +94 -41
- package/utils/LDrawUtils.cjs.js +1 -0
- package/utils/LDrawUtils.d.ts +5 -0
- package/utils/LDrawUtils.js +144 -0
- package/utils/RoughnessMipmapper.cjs.js +1 -0
- package/utils/RoughnessMipmapper.js +82 -38
- package/utils/SceneUtils.cjs.js +1 -0
- package/utils/SceneUtils.js +20 -15
- package/utils/ShadowMapViewer.cjs.js +1 -0
- package/utils/ShadowMapViewer.js +95 -49
- package/utils/SkeletonUtils.cjs.js +1 -0
- package/utils/SkeletonUtils.js +165 -74
- package/utils/UVsDebug.cjs.js +1 -0
- package/utils/UVsDebug.js +62 -32
- package/utils/WorkerPool.cjs.js +1 -0
- package/utils/WorkerPool.js +33 -13
- package/webxr/ARButton.cjs.js +1 -0
- package/webxr/ARButton.js +98 -72
- package/webxr/OculusHandModel.cjs.js +1 -0
- package/webxr/OculusHandModel.js +37 -18
- package/webxr/OculusHandPointerModel.cjs.js +1 -0
- package/webxr/OculusHandPointerModel.js +80 -58
- package/webxr/Text2D.cjs.js +1 -0
- package/webxr/Text2D.js +19 -37
- package/webxr/VRButton.cjs.js +1 -0
- package/webxr/VRButton.js +90 -59
- package/webxr/XRControllerModelFactory.cjs.js +1 -0
- package/webxr/XRControllerModelFactory.js +116 -58
- package/webxr/XREstimatedLight.cjs.js +1 -0
- package/webxr/XREstimatedLight.js +66 -39
- package/webxr/XRHandMeshModel.cjs.js +1 -0
- package/webxr/XRHandMeshModel.js +29 -40
- package/webxr/XRHandModelFactory.cjs.js +1 -0
- package/webxr/XRHandModelFactory.js +31 -28
- package/webxr/XRHandPrimitiveModel.cjs.js +1 -0
- package/webxr/XRHandPrimitiveModel.js +27 -41
- package/animation/AnimationClipCreator.mjs +0 -57
- package/animation/CCDIKSolver.mjs +0 -223
- package/animation/MMDAnimationHelper.mjs +0 -514
- package/animation/MMDPhysics.mjs +0 -769
- package/cameras/CinematicCamera.mjs +0 -129
- package/controls/ArcballControls.mjs +0 -1737
- package/controls/DeviceOrientationControls.mjs +0 -74
- package/controls/DragControls.mjs +0 -172
- package/controls/FirstPersonControls.mjs +0 -220
- package/controls/FlyControls.mjs +0 -239
- package/controls/OrbitControls.mjs +0 -731
- package/controls/PointerLockControls.mjs +0 -88
- package/controls/TrackballControls.mjs +0 -481
- package/controls/TransformControls.mjs +0 -1068
- package/controls/experimental/CameraControls.mjs +0 -673
- package/csm/CSM.mjs +0 -244
- package/csm/CSMFrustum.mjs +0 -75
- package/csm/CSMHelper.mjs +0 -114
- package/csm/CSMShader.mjs +0 -251
- package/curves/CurveExtras.mjs +0 -224
- package/curves/NURBSCurve.mjs +0 -35
- package/curves/NURBSSurface.mjs +0 -28
- package/curves/NURBSUtils.mjs +0 -226
- package/deprecated/Geometry.mjs +0 -966
- package/effects/AnaglyphEffect.mjs +0 -120
- package/effects/AsciiEffect.mjs +0 -173
- package/effects/OutlineEffect.mjs +0 -295
- package/effects/ParallaxBarrierEffect.mjs +0 -64
- package/effects/PeppersGhostEffect.mjs +0 -85
- package/effects/StereoEffect.mjs +0 -32
- package/environments/RoomEnvironment.mjs +0 -78
- package/exporters/ColladaExporter.mjs +0 -299
- package/exporters/DRACOExporter.mjs +0 -132
- package/exporters/GLTFExporter.mjs +0 -1381
- package/exporters/MMDExporter.mjs +0 -102
- package/exporters/OBJExporter.mjs +0 -166
- package/exporters/PLYExporter.mjs +0 -278
- package/exporters/STLExporter.mjs +0 -129
- package/exporters/USDZExporter.mjs +0 -328
- package/geometries/BoxLineGeometry.mjs +0 -45
- package/geometries/ConvexGeometry.mjs +0 -29
- package/geometries/DecalGeometry.mjs +0 -184
- package/geometries/LightningStrike.mjs +0 -547
- package/geometries/ParametricGeometries.mjs +0 -129
- package/geometries/ParametricGeometry.mjs +0 -63
- package/geometries/RoundedBoxGeometry.mjs +0 -91
- package/geometries/TeapotGeometry.mjs +0 -1557
- package/geometries/TextGeometry.mjs +0 -23
- package/helpers/LightProbeHelper.mjs +0 -72
- package/helpers/PositionalAudioHelper.mjs +0 -68
- package/helpers/RectAreaLightHelper.mjs +0 -44
- package/helpers/VertexNormalsHelper.mjs +0 -54
- package/helpers/VertexTangentsHelper.mjs +0 -45
- package/index.mjs +0 -969
- package/interactive/SelectionBox.mjs +0 -137
- package/interactive/SelectionHelper.mjs +0 -54
- package/libs/MeshoptDecoder.mjs +0 -210
- package/libs/MotionControllers.mjs +0 -261
- package/lights/LightProbeGenerator.mjs +0 -145
- package/lights/RectAreaLightUniformsLib.mjs +0 -32842
- package/lines/Line2.mjs +0 -13
- package/lines/LineGeometry.mjs +0 -44
- package/lines/LineMaterial.mjs +0 -539
- package/lines/LineSegments2.mjs +0 -202
- package/lines/LineSegmentsGeometry.mjs +0 -124
- package/lines/Wireframe.mjs +0 -31
- package/lines/WireframeGeometry2.mjs +0 -13
- package/loaders/3DMLoader.mjs +0 -802
- package/loaders/3MFLoader.mjs +0 -837
- package/loaders/AMFLoader.mjs +0 -284
- package/loaders/AssimpLoader.mjs +0 -1396
- package/loaders/BVHLoader.mjs +0 -207
- package/loaders/BasisTextureLoader.mjs +0 -474
- package/loaders/ColladaLoader.mjs +0 -2403
- package/loaders/DDSLoader.mjs +0 -148
- package/loaders/DRACOLoader.mjs +0 -340
- package/loaders/EXRLoader.mjs +0 -1351
- package/loaders/FBXLoader.mjs +0 -2362
- package/loaders/FontLoader.mjs +0 -111
- package/loaders/GCodeLoader.mjs +0 -141
- package/loaders/GLTFLoader.mjs +0 -2316
- package/loaders/HDRCubeTextureLoader.mjs +0 -77
- package/loaders/KMZLoader.mjs +0 -75
- package/loaders/KTX2Loader.mjs +0 -427
- package/loaders/KTXLoader.mjs +0 -87
- package/loaders/LDrawLoader.mjs +0 -1409
- package/loaders/LUT3dlLoader.mjs +0 -100
- package/loaders/LUTCubeLoader.mjs +0 -104
- package/loaders/LWOLoader.mjs +0 -625
- package/loaders/LottieLoader.mjs +0 -47
- package/loaders/MD2Loader.mjs +0 -359
- package/loaders/MDDLoader.mjs +0 -58
- package/loaders/MMDLoader.mjs +0 -998
- package/loaders/MTLLoader.mjs +0 -280
- package/loaders/NRRDLoader.mjs +0 -401
- package/loaders/NodeMaterialLoader.mjs +0 -146
- package/loaders/OBJLoader.mjs +0 -487
- package/loaders/PCDLoader.mjs +0 -248
- package/loaders/PDBLoader.mjs +0 -246
- package/loaders/PLYLoader.mjs +0 -317
- package/loaders/PRWMLoader.mjs +0 -160
- package/loaders/PVRLoader.mjs +0 -131
- package/loaders/RGBELoader.mjs +0 -244
- package/loaders/RGBMLoader.mjs +0 -998
- package/loaders/STLLoader.mjs +0 -190
- package/loaders/SVGLoader.mjs +0 -1709
- package/loaders/TDSLoader.mjs +0 -480
- package/loaders/TGALoader.mjs +0 -285
- package/loaders/TTFLoader.mjs +0 -131
- package/loaders/TiltLoader.mjs +0 -373
- package/loaders/VOXLoader.mjs +0 -431
- package/loaders/VRMLLoader.mjs +0 -2093
- package/loaders/VRMLoader.mjs +0 -38
- package/loaders/VTKLoader.mjs +0 -646
- package/loaders/XLoader.mjs +0 -1258
- package/loaders/XYZLoader.mjs +0 -60
- package/loaders/lwo/IFFParser.mjs +0 -697
- package/loaders/lwo/LWO2Parser.mjs +0 -327
- package/loaders/lwo/LWO3Parser.mjs +0 -298
- package/math/Capsule.mjs +0 -100
- package/math/ColorConverter.mjs +0 -51
- package/math/ConvexHull.mjs +0 -574
- package/math/ImprovedNoise.mjs +0 -302
- package/math/Lut.mjs +0 -135
- package/math/MeshSurfaceSampler.mjs +0 -107
- package/math/OBB.mjs +0 -235
- package/math/Octree.mjs +0 -278
- package/math/SimplexNoise.mjs +0 -425
- package/misc/ConvexObjectBreaker.mjs +0 -292
- package/misc/GPUComputationRenderer.mjs +0 -171
- package/misc/Gyroscope.mjs +0 -35
- package/misc/MD2Character.mjs +0 -162
- package/misc/MD2CharacterComplex.mjs +0 -328
- package/misc/MorphAnimMesh.mjs +0 -40
- package/misc/MorphBlendMesh.mjs +0 -179
- package/misc/ProgressiveLightmap.mjs +0 -166
- package/misc/RollerCoaster.mjs +0 -346
- package/misc/TubePainter.mjs +0 -123
- package/misc/Volume.mjs +0 -244
- package/misc/VolumeSlice.mjs +0 -106
- package/misc/WebGL.mjs +0 -74
- package/modifiers/CurveModifier.mjs +0 -182
- package/modifiers/EdgeSplitModifier.mjs +0 -162
- package/modifiers/SimplifyModifier.mjs +0 -282
- package/modifiers/TessellateModifier.mjs +0 -206
- package/nodes/Nodes.mjs +0 -400
- package/nodes/ShaderNode.mjs +0 -408
- package/nodes/accessors/BufferNode.mjs +0 -15
- package/nodes/accessors/CameraNode.mjs +0 -44
- package/nodes/accessors/CubeTextureNode.mjs +0 -42
- package/nodes/accessors/MaterialNode.mjs +0 -71
- package/nodes/accessors/MaterialReferenceNode.mjs +0 -14
- package/nodes/accessors/ModelNode.mjs +0 -9
- package/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
- package/nodes/accessors/NormalNode.mjs +0 -62
- package/nodes/accessors/Object3DNode.mjs +0 -76
- package/nodes/accessors/PointUVNode.mjs +0 -13
- package/nodes/accessors/PositionNode.mjs +0 -65
- package/nodes/accessors/ReferenceNode.mjs +0 -37
- package/nodes/accessors/ReflectNode.mjs +0 -43
- package/nodes/accessors/SkinningNode.mjs +0 -58
- package/nodes/accessors/TextureNode.mjs +0 -54
- package/nodes/accessors/UVNode.mjs +0 -23
- package/nodes/core/ArrayUniformNode.mjs +0 -14
- package/nodes/core/AttributeNode.mjs +0 -30
- package/nodes/core/BypassNode.mjs +0 -22
- package/nodes/core/CodeNode.mjs +0 -28
- package/nodes/core/ConstNode.mjs +0 -14
- package/nodes/core/ContextNode.mjs +0 -22
- package/nodes/core/ExpressionNode.mjs +0 -19
- package/nodes/core/FunctionCallNode.mjs +0 -37
- package/nodes/core/FunctionNode.mjs +0 -56
- package/nodes/core/InputNode.mjs +0 -38
- package/nodes/core/Node.mjs +0 -139
- package/nodes/core/NodeAttribute.mjs +0 -10
- package/nodes/core/NodeBuilder.mjs +0 -395
- package/nodes/core/NodeCode.mjs +0 -11
- package/nodes/core/NodeFrame.mjs +0 -35
- package/nodes/core/NodeFunctionInput.mjs +0 -13
- package/nodes/core/NodeKeywords.mjs +0 -44
- package/nodes/core/NodeUniform.mjs +0 -18
- package/nodes/core/NodeUtils.mjs +0 -57
- package/nodes/core/NodeVar.mjs +0 -10
- package/nodes/core/NodeVary.mjs +0 -10
- package/nodes/core/PropertyNode.mjs +0 -21
- package/nodes/core/TempNode.mjs +0 -25
- package/nodes/core/UniformNode.mjs +0 -23
- package/nodes/core/VarNode.mjs +0 -31
- package/nodes/core/VaryNode.mjs +0 -30
- package/nodes/core/constants.mjs +0 -24
- package/nodes/display/ColorSpaceNode.mjs +0 -63
- package/nodes/display/NormalMapNode.mjs +0 -54
- package/nodes/fog/FogNode.mjs +0 -15
- package/nodes/fog/FogRangeNode.mjs +0 -17
- package/nodes/functions/BSDFs.mjs +0 -64
- package/nodes/lights/LightContextNode.mjs +0 -35
- package/nodes/lights/LightNode.mjs +0 -58
- package/nodes/lights/LightsNode.mjs +0 -59
- package/nodes/loaders/NodeLoader.mjs +0 -66
- package/nodes/loaders/NodeMaterialLoader.mjs +0 -24
- package/nodes/loaders/NodeObjectLoader.mjs +0 -40
- package/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
- package/nodes/materials/Materials.mjs +0 -28
- package/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
- package/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
- package/nodes/materials/NodeMaterial.mjs +0 -64
- package/nodes/materials/PointsNodeMaterial.mjs +0 -30
- package/nodes/math/CondNode.mjs +0 -38
- package/nodes/math/MathNode.mjs +0 -163
- package/nodes/math/OperatorNode.mjs +0 -103
- package/nodes/procedural/CheckerNode.mjs +0 -21
- package/nodes/utils/ArrayElementNode.mjs +0 -19
- package/nodes/utils/ConvertNode.mjs +0 -25
- package/nodes/utils/JoinNode.mjs +0 -26
- package/nodes/utils/MatcapUVNode.mjs +0 -16
- package/nodes/utils/OscNode.mjs +0 -50
- package/nodes/utils/SplitNode.mjs +0 -45
- package/nodes/utils/SpriteSheetUVNode.mjs +0 -40
- package/nodes/utils/TimerNode.mjs +0 -44
- package/objects/GroundProjectedEnv.mjs +0 -130
- package/objects/Lensflare.mjs +0 -262
- package/objects/LightningStorm.mjs +0 -110
- package/objects/MarchingCubes.mjs +0 -457
- package/objects/Reflector.mjs +0 -166
- package/objects/ReflectorForSSRPass.mjs +0 -247
- package/objects/ReflectorRTT.mjs +0 -10
- package/objects/Refractor.mjs +0 -178
- package/objects/ShadowMesh.mjs +0 -41
- package/objects/Sky.mjs +0 -124
- package/objects/Water.mjs +0 -235
- package/objects/Water2.mjs +0 -252
- package/offscreen/jank.mjs +0 -27
- package/offscreen/offscreen.mjs +0 -5
- package/offscreen/scene.mjs +0 -52
- package/physics/AmmoPhysics.mjs +0 -165
- package/postprocessing/AdaptiveToneMappingPass.mjs +0 -221
- package/postprocessing/AfterimagePass.mjs +0 -55
- package/postprocessing/BloomPass.mjs +0 -90
- package/postprocessing/BokehPass.mjs +0 -76
- package/postprocessing/ClearPass.mjs +0 -27
- package/postprocessing/CubeTexturePass.mjs +0 -49
- package/postprocessing/DotScreenPass.mjs +0 -40
- package/postprocessing/EffectComposer.mjs +0 -139
- package/postprocessing/FilmPass.mjs +0 -42
- package/postprocessing/GlitchPass.mjs +0 -75
- package/postprocessing/HalftonePass.mjs +0 -44
- package/postprocessing/LUTPass.mjs +0 -136
- package/postprocessing/MaskPass.mjs +0 -60
- package/postprocessing/OutlinePass.mjs +0 -438
- package/postprocessing/Pass.mjs +0 -37
- package/postprocessing/RenderPass.mjs +0 -48
- package/postprocessing/RenderPixelatedPass.mjs +0 -199
- package/postprocessing/SAOPass.mjs +0 -282
- package/postprocessing/SMAAPass.mjs +0 -112
- package/postprocessing/SSAARenderPass.mjs +0 -170
- package/postprocessing/SSAOPass.mjs +0 -265
- package/postprocessing/SSRPass.mjs +0 -432
- package/postprocessing/SavePass.mjs +0 -37
- package/postprocessing/ShaderPass.mjs +0 -39
- package/postprocessing/TAARenderPass.mjs +0 -88
- package/postprocessing/TexturePass.mjs +0 -39
- package/postprocessing/UnrealBloomPass.mjs +0 -220
- package/renderers/CSS2DRenderer.mjs +0 -112
- package/renderers/CSS3DRenderer.mjs +0 -133
- package/renderers/Projector.mjs +0 -511
- package/renderers/SVGRenderer.mjs +0 -306
- package/renderers/nodes/accessors/CameraNode.mjs +0 -63
- package/renderers/nodes/accessors/ModelNode.mjs +0 -61
- package/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
- package/renderers/nodes/accessors/NormalNode.mjs +0 -61
- package/renderers/nodes/accessors/PositionNode.mjs +0 -30
- package/renderers/nodes/accessors/UVNode.mjs +0 -13
- package/renderers/nodes/core/AttributeNode.mjs +0 -35
- package/renderers/nodes/core/InputNode.mjs +0 -31
- package/renderers/nodes/core/Node.mjs +0 -34
- package/renderers/nodes/core/NodeAttribute.mjs +0 -10
- package/renderers/nodes/core/NodeBuilder.mjs +0 -243
- package/renderers/nodes/core/NodeFrame.mjs +0 -35
- package/renderers/nodes/core/NodeSlot.mjs +0 -10
- package/renderers/nodes/core/NodeUniform.mjs +0 -18
- package/renderers/nodes/core/NodeVary.mjs +0 -11
- package/renderers/nodes/core/VaryNode.mjs +0 -22
- package/renderers/nodes/core/constants.mjs +0 -22
- package/renderers/nodes/inputs/ColorNode.mjs +0 -11
- package/renderers/nodes/inputs/FloatNode.mjs +0 -11
- package/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
- package/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
- package/renderers/nodes/inputs/TextureNode.mjs +0 -20
- package/renderers/nodes/inputs/Vector2Node.mjs +0 -11
- package/renderers/nodes/inputs/Vector3Node.mjs +0 -12
- package/renderers/nodes/inputs/Vector4Node.mjs +0 -12
- package/renderers/nodes/math/MathNode.mjs +0 -55
- package/renderers/nodes/math/OperatorNode.mjs +0 -42
- package/renderers/nodes/utils/SwitchNode.mjs +0 -20
- package/renderers/nodes/utils/TimerNode.mjs +0 -14
- package/renderers/webgpu/WebGPU.mjs +0 -24
- package/renderers/webgpu/WebGPUAttributes.mjs +0 -69
- package/renderers/webgpu/WebGPUBackground.mjs +0 -61
- package/renderers/webgpu/WebGPUBinding.mjs +0 -14
- package/renderers/webgpu/WebGPUBindings.mjs +0 -155
- package/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
- package/renderers/webgpu/WebGPUGeometries.mjs +0 -41
- package/renderers/webgpu/WebGPUInfo.mjs +0 -46
- package/renderers/webgpu/WebGPUObjects.mjs +0 -25
- package/renderers/webgpu/WebGPUProperties.mjs +0 -22
- package/renderers/webgpu/WebGPURenderLists.mjs +0 -119
- package/renderers/webgpu/WebGPURenderPipelines.mjs +0 -545
- package/renderers/webgpu/WebGPURenderer.mjs +0 -574
- package/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
- package/renderers/webgpu/WebGPUSampler.mjs +0 -15
- package/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
- package/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
- package/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
- package/renderers/webgpu/WebGPUTextures.mjs +0 -484
- package/renderers/webgpu/WebGPUUniform.mjs +0 -81
- package/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
- package/renderers/webgpu/constants.mjs +0 -230
- package/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
- package/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
- package/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
- package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
- package/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
- package/shaders/ACESFilmicToneMappingShader.mjs +0 -48
- package/shaders/AfterimageShader.mjs +0 -32
- package/shaders/BasicShader.mjs +0 -12
- package/shaders/BleachBypassShader.mjs +0 -35
- package/shaders/BlendShader.mjs +0 -30
- package/shaders/BokehShader.mjs +0 -106
- package/shaders/BokehShader2.mjs +0 -269
- package/shaders/BrightnessContrastShader.mjs +0 -32
- package/shaders/ColorCorrectionShader.mjs +0 -30
- package/shaders/ColorifyShader.mjs +0 -28
- package/shaders/ConvolutionShader.mjs +0 -55
- package/shaders/CopyShader.mjs +0 -25
- package/shaders/DOFMipMapShader.mjs +0 -32
- package/shaders/DepthLimitedBlurShader.mjs +0 -114
- package/shaders/DigitalGlitch.mjs +0 -78
- package/shaders/DotScreenShader.mjs +0 -39
- package/shaders/FXAAShader.mjs +0 -1098
- package/shaders/FilmShader.mjs +0 -42
- package/shaders/FocusShader.mjs +0 -55
- package/shaders/FreiChenShader.mjs +0 -61
- package/shaders/FresnelShader.mjs +0 -47
- package/shaders/GammaCorrectionShader.mjs +0 -23
- package/shaders/GodRaysShader.mjs +0 -146
- package/shaders/HalftoneShader.mjs +0 -212
- package/shaders/HorizontalBlurShader.mjs +0 -43
- package/shaders/HorizontalTiltShiftShader.mjs +0 -37
- package/shaders/HueSaturationShader.mjs +0 -41
- package/shaders/KaleidoShader.mjs +0 -34
- package/shaders/LuminosityHighPassShader.mjs +0 -37
- package/shaders/LuminosityShader.mjs +0 -25
- package/shaders/MirrorShader.mjs +0 -35
- package/shaders/NormalMapShader.mjs +0 -31
- package/shaders/ParallaxShader.mjs +0 -113
- package/shaders/PixelShader.mjs +0 -28
- package/shaders/RGBShiftShader.mjs +0 -30
- package/shaders/SAOShader.mjs +0 -144
- package/shaders/SMAAShader.mjs +0 -272
- package/shaders/SSAOShader.mjs +0 -172
- package/shaders/SSRShader.mjs +0 -324
- package/shaders/SepiaShader.mjs +0 -29
- package/shaders/SobelOperatorShader.mjs +0 -44
- package/shaders/SubsurfaceScatteringShader.mjs +0 -59
- package/shaders/TechnicolorShader.mjs +0 -24
- package/shaders/ToneMapShader.mjs +0 -48
- package/shaders/ToonShader.mjs +0 -188
- package/shaders/TriangleBlurShader.mjs +0 -36
- package/shaders/UnpackDepthRGBAShader.mjs +0 -26
- package/shaders/VerticalBlurShader.mjs +0 -44
- package/shaders/VerticalTiltShiftShader.mjs +0 -37
- package/shaders/VignetteShader.mjs +0 -28
- package/shaders/VolumeShader.mjs +0 -178
- package/shaders/WaterRefractionShader.mjs +0 -57
- package/textures/FlakesTexture.mjs +0 -30
- package/types/helpers.mjs +0 -4
- package/utils/BufferGeometryUtils.mjs +0 -570
- package/utils/GeometryCompressionUtils.mjs +0 -547
- package/utils/GeometryUtils.mjs +0 -108
- package/utils/RoughnessMipmapper.mjs +0 -213
- package/utils/SceneUtils.mjs +0 -36
- package/utils/ShadowMapViewer.mjs +0 -114
- package/utils/SkeletonUtils.mjs +0 -292
- package/utils/UVsDebug.mjs +0 -85
- package/utils/WorkerPool.mjs +0 -62
- package/webxr/ARButton.mjs +0 -119
- package/webxr/OculusHandModel.mjs +0 -71
- package/webxr/OculusHandPointerModel.mjs +0 -207
- package/webxr/Text2D.mjs +0 -31
- package/webxr/VRButton.mjs +0 -105
- package/webxr/XRControllerModelFactory.mjs +0 -146
- package/webxr/XREstimatedLight.mjs +0 -126
- package/webxr/XRHandMeshModel.mjs +0 -73
- package/webxr/XRHandModelFactory.mjs +0 -61
- package/webxr/XRHandPrimitiveModel.mjs +0 -68
|
@@ -1,64 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
|
|
2
|
+
import { PropertyBinding, InterpolateLinear, Vector3, RGBAFormat, ShaderMaterial, MeshStandardMaterial, MeshBasicMaterial, MeshPhysicalMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshToonMaterial, MeshLambertMaterial, DoubleSide, LineSegments, LineLoop, Line, Points, MeshDepthMaterial, InterleavedBufferAttribute, BufferAttribute, Object3D, Material, OrthographicCamera, PerspectiveCamera, MathUtils, InterpolateDiscrete, SkinnedMesh, Matrix4, Mesh, Camera, Scene, DirectionalLight, PointLight, SpotLight, NearestFilter, NearestMipmapNearestFilter, NearestMipmapLinearFilter, LinearFilter, LinearMipmapNearestFilter, LinearMipmapLinearFilter, ClampToEdgeWrapping, RepeatWrapping, MirroredRepeatWrapping } from 'three';
|
|
3
|
+
|
|
4
4
|
class GLTFExporter {
|
|
5
5
|
constructor() {
|
|
6
|
+
_defineProperty(this, "pluginCallbacks", void 0);
|
|
7
|
+
|
|
6
8
|
this.pluginCallbacks = [];
|
|
7
|
-
this.register(function(writer) {
|
|
9
|
+
this.register(function (writer) {
|
|
8
10
|
return new GLTFLightExtension(writer);
|
|
9
11
|
});
|
|
10
|
-
this.register(function(writer) {
|
|
12
|
+
this.register(function (writer) {
|
|
11
13
|
return new GLTFMaterialsUnlitExtension(writer);
|
|
12
14
|
});
|
|
13
|
-
this.register(function(writer) {
|
|
15
|
+
this.register(function (writer) {
|
|
14
16
|
return new GLTFMaterialsPBRSpecularGlossiness(writer);
|
|
15
17
|
});
|
|
16
|
-
this.register(function(writer) {
|
|
18
|
+
this.register(function (writer) {
|
|
17
19
|
return new GLTFMaterialsTransmissionExtension(writer);
|
|
18
20
|
});
|
|
19
|
-
this.register(function(writer) {
|
|
21
|
+
this.register(function (writer) {
|
|
20
22
|
return new GLTFMaterialsVolumeExtension(writer);
|
|
21
23
|
});
|
|
22
24
|
}
|
|
25
|
+
|
|
23
26
|
register(callback) {
|
|
24
27
|
if (this.pluginCallbacks.indexOf(callback) === -1) {
|
|
25
28
|
this.pluginCallbacks.push(callback);
|
|
26
29
|
}
|
|
30
|
+
|
|
27
31
|
return this;
|
|
28
32
|
}
|
|
33
|
+
|
|
29
34
|
unregister(callback) {
|
|
30
35
|
if (this.pluginCallbacks.indexOf(callback) !== -1) {
|
|
31
36
|
this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(callback), 1);
|
|
32
37
|
}
|
|
38
|
+
|
|
33
39
|
return this;
|
|
34
40
|
}
|
|
41
|
+
|
|
35
42
|
parse(input, onDone, options) {
|
|
36
43
|
const writer = new GLTFWriter();
|
|
37
44
|
const plugins = [];
|
|
45
|
+
|
|
38
46
|
for (let i = 0, il = this.pluginCallbacks.length; i < il; i++) {
|
|
39
47
|
plugins.push(this.pluginCallbacks[i](writer));
|
|
40
48
|
}
|
|
49
|
+
|
|
41
50
|
writer.setPlugins(plugins);
|
|
42
51
|
writer.write(input, onDone, options);
|
|
43
52
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Static utility functions
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
} //------------------------------------------------------------------------------
|
|
59
|
+
// Constants
|
|
60
|
+
//------------------------------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
_defineProperty(GLTFExporter, "Utils", {
|
|
64
|
+
insertKeyframe: function (track, time) {
|
|
65
|
+
const tolerance = 0.001; // 1ms
|
|
66
|
+
|
|
67
|
+
const valueSize = track.getValueSize(); // @ts-expect-error
|
|
68
|
+
|
|
69
|
+
const times = new track.TimeBufferType(track.times.length + 1); // @ts-expect-error
|
|
70
|
+
|
|
50
71
|
const values = new track.ValueBufferType(track.values.length + valueSize);
|
|
72
|
+
/**
|
|
73
|
+
* NOTE: createInterpolant does not exist in the type, but it does exist as a property of the class
|
|
74
|
+
* https://github.com/mrdoob/three.js/blob/77480d339d737b7505b335101ffd3cf29a30738d/src/animation/KeyframeTrack.js#L117
|
|
75
|
+
*/
|
|
76
|
+
// @ts-expect-error
|
|
77
|
+
|
|
51
78
|
const interpolant = track.createInterpolant(new track.ValueBufferType(valueSize));
|
|
52
79
|
let index;
|
|
80
|
+
|
|
53
81
|
if (track.times.length === 0) {
|
|
54
82
|
times[0] = time;
|
|
83
|
+
|
|
55
84
|
for (let i = 0; i < valueSize; i++) {
|
|
56
85
|
values[i] = 0;
|
|
57
86
|
}
|
|
87
|
+
|
|
58
88
|
index = 0;
|
|
59
89
|
} else if (time < track.times[0]) {
|
|
60
|
-
if (Math.abs(track.times[0] - time) < tolerance)
|
|
61
|
-
return 0;
|
|
90
|
+
if (Math.abs(track.times[0] - time) < tolerance) return 0;
|
|
62
91
|
times[0] = time;
|
|
63
92
|
times.set(track.times, 1);
|
|
64
93
|
values.set(interpolant.evaluate(time), 0);
|
|
@@ -68,6 +97,7 @@ GLTFExporter.Utils = {
|
|
|
68
97
|
if (Math.abs(track.times[track.times.length - 1] - time) < tolerance) {
|
|
69
98
|
return track.times.length - 1;
|
|
70
99
|
}
|
|
100
|
+
|
|
71
101
|
times[times.length - 1] = time;
|
|
72
102
|
times.set(track.times, 0);
|
|
73
103
|
values.set(track.values, 0);
|
|
@@ -75,8 +105,8 @@ GLTFExporter.Utils = {
|
|
|
75
105
|
index = times.length - 1;
|
|
76
106
|
} else {
|
|
77
107
|
for (let i = 0; i < track.times.length; i++) {
|
|
78
|
-
if (Math.abs(track.times[i] - time) < tolerance)
|
|
79
|
-
|
|
108
|
+
if (Math.abs(track.times[i] - time) < tolerance) return i;
|
|
109
|
+
|
|
80
110
|
if (track.times[i] < time && track.times[i + 1] > time) {
|
|
81
111
|
times.set(track.times.slice(0, i + 1), 0);
|
|
82
112
|
times[i + 1] = time;
|
|
@@ -89,183 +119,264 @@ GLTFExporter.Utils = {
|
|
|
89
119
|
}
|
|
90
120
|
}
|
|
91
121
|
}
|
|
122
|
+
|
|
92
123
|
track.times = times;
|
|
93
124
|
track.values = values;
|
|
94
125
|
return index;
|
|
95
126
|
},
|
|
96
|
-
mergeMorphTargetTracks: function(clip, root) {
|
|
127
|
+
mergeMorphTargetTracks: function (clip, root) {
|
|
97
128
|
const tracks = [];
|
|
98
129
|
const mergedTracks = {};
|
|
99
130
|
const sourceTracks = clip.tracks;
|
|
131
|
+
|
|
100
132
|
for (let i = 0; i < sourceTracks.length; ++i) {
|
|
101
133
|
let sourceTrack = sourceTracks[i];
|
|
102
|
-
const sourceTrackBinding =
|
|
103
|
-
const sourceTrackNode =
|
|
104
|
-
|
|
134
|
+
const sourceTrackBinding = PropertyBinding.parseTrackName(sourceTrack.name);
|
|
135
|
+
const sourceTrackNode = PropertyBinding.findNode(root, sourceTrackBinding.nodeName);
|
|
136
|
+
|
|
137
|
+
if (sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined) {
|
|
138
|
+
// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.
|
|
105
139
|
tracks.push(sourceTrack);
|
|
106
140
|
continue;
|
|
107
141
|
}
|
|
108
|
-
|
|
142
|
+
|
|
143
|
+
if ( // @ts-expect-error
|
|
144
|
+
sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete && // @ts-expect-error
|
|
145
|
+
sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear) {
|
|
146
|
+
// @ts-expect-error
|
|
109
147
|
if (sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) {
|
|
110
|
-
|
|
148
|
+
// This should never happen, because glTF morph target animations
|
|
149
|
+
// affect all targets already.
|
|
150
|
+
throw new Error('THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.');
|
|
111
151
|
}
|
|
112
|
-
|
|
152
|
+
|
|
153
|
+
console.warn('THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.');
|
|
113
154
|
sourceTrack = sourceTrack.clone();
|
|
114
|
-
sourceTrack.setInterpolation(
|
|
155
|
+
sourceTrack.setInterpolation(InterpolateLinear);
|
|
115
156
|
}
|
|
157
|
+
|
|
116
158
|
const targetCount = sourceTrackNode.morphTargetInfluences.length;
|
|
117
159
|
const targetIndex = sourceTrackNode.morphTargetDictionary[sourceTrackBinding.propertyIndex];
|
|
118
|
-
|
|
119
|
-
|
|
160
|
+
|
|
161
|
+
if (targetIndex === undefined) {
|
|
162
|
+
throw new Error('THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex);
|
|
120
163
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
164
|
+
|
|
165
|
+
let mergedTrack; // If this is the first time we've seen this object, create a new
|
|
166
|
+
// track to store merged keyframe data for each morph target.
|
|
167
|
+
|
|
168
|
+
if (mergedTracks[sourceTrackNode.uuid] === undefined) {
|
|
169
|
+
mergedTrack = sourceTrack.clone(); // @ts-expect-error
|
|
170
|
+
|
|
124
171
|
const values = new mergedTrack.ValueBufferType(targetCount * mergedTrack.times.length);
|
|
172
|
+
|
|
125
173
|
for (let j = 0; j < mergedTrack.times.length; j++) {
|
|
126
174
|
values[j * targetCount + targetIndex] = mergedTrack.values[j];
|
|
127
|
-
}
|
|
128
|
-
|
|
175
|
+
} // We need to take into consideration the intended target node
|
|
176
|
+
// of our original un-merged morphTarget animation.
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
mergedTrack.name = (sourceTrackBinding.nodeName || '') + '.morphTargetInfluences';
|
|
129
180
|
mergedTrack.values = values;
|
|
130
181
|
mergedTracks[sourceTrackNode.uuid] = mergedTrack;
|
|
131
182
|
tracks.push(mergedTrack);
|
|
132
183
|
continue;
|
|
133
|
-
}
|
|
184
|
+
} // @ts-expect-error
|
|
185
|
+
|
|
186
|
+
|
|
134
187
|
const sourceInterpolant = sourceTrack.createInterpolant(new sourceTrack.ValueBufferType(1));
|
|
135
|
-
mergedTrack = mergedTracks[sourceTrackNode.uuid];
|
|
188
|
+
mergedTrack = mergedTracks[sourceTrackNode.uuid]; // For every existing keyframe of the merged track, write a (possibly
|
|
189
|
+
// interpolated) value from the source track.
|
|
190
|
+
|
|
136
191
|
for (let j = 0; j < mergedTrack.times.length; j++) {
|
|
137
192
|
mergedTrack.values[j * targetCount + targetIndex] = sourceInterpolant.evaluate(mergedTrack.times[j]);
|
|
138
|
-
}
|
|
193
|
+
} // For every existing keyframe of the source track, write a (possibly
|
|
194
|
+
// new) keyframe to the merged track. Values from the previous loop may
|
|
195
|
+
// be written again, but keyframes are de-duplicated.
|
|
196
|
+
|
|
197
|
+
|
|
139
198
|
for (let j = 0; j < sourceTrack.times.length; j++) {
|
|
140
199
|
const keyframeIndex = this.insertKeyframe(mergedTrack, sourceTrack.times[j]);
|
|
141
200
|
mergedTrack.values[keyframeIndex * targetCount + targetIndex] = sourceTrack.values[j];
|
|
142
201
|
}
|
|
143
202
|
}
|
|
203
|
+
|
|
144
204
|
clip.tracks = tracks;
|
|
145
205
|
return clip;
|
|
146
206
|
}
|
|
147
|
-
};
|
|
207
|
+
});
|
|
208
|
+
|
|
148
209
|
const WEBGL_CONSTANTS = {
|
|
149
|
-
POINTS:
|
|
150
|
-
LINES:
|
|
151
|
-
LINE_LOOP:
|
|
152
|
-
LINE_STRIP:
|
|
153
|
-
TRIANGLES:
|
|
154
|
-
TRIANGLE_STRIP:
|
|
155
|
-
TRIANGLE_FAN:
|
|
156
|
-
UNSIGNED_BYTE:
|
|
157
|
-
UNSIGNED_SHORT:
|
|
158
|
-
FLOAT:
|
|
159
|
-
UNSIGNED_INT:
|
|
160
|
-
ARRAY_BUFFER:
|
|
161
|
-
ELEMENT_ARRAY_BUFFER:
|
|
162
|
-
NEAREST:
|
|
163
|
-
LINEAR:
|
|
164
|
-
NEAREST_MIPMAP_NEAREST:
|
|
165
|
-
LINEAR_MIPMAP_NEAREST:
|
|
166
|
-
NEAREST_MIPMAP_LINEAR:
|
|
167
|
-
LINEAR_MIPMAP_LINEAR:
|
|
210
|
+
POINTS: 0x0000,
|
|
211
|
+
LINES: 0x0001,
|
|
212
|
+
LINE_LOOP: 0x0002,
|
|
213
|
+
LINE_STRIP: 0x0003,
|
|
214
|
+
TRIANGLES: 0x0004,
|
|
215
|
+
TRIANGLE_STRIP: 0x0005,
|
|
216
|
+
TRIANGLE_FAN: 0x0006,
|
|
217
|
+
UNSIGNED_BYTE: 0x1401,
|
|
218
|
+
UNSIGNED_SHORT: 0x1403,
|
|
219
|
+
FLOAT: 0x1406,
|
|
220
|
+
UNSIGNED_INT: 0x1405,
|
|
221
|
+
ARRAY_BUFFER: 0x8892,
|
|
222
|
+
ELEMENT_ARRAY_BUFFER: 0x8893,
|
|
223
|
+
NEAREST: 0x2600,
|
|
224
|
+
LINEAR: 0x2601,
|
|
225
|
+
NEAREST_MIPMAP_NEAREST: 0x2700,
|
|
226
|
+
LINEAR_MIPMAP_NEAREST: 0x2701,
|
|
227
|
+
NEAREST_MIPMAP_LINEAR: 0x2702,
|
|
228
|
+
LINEAR_MIPMAP_LINEAR: 0x2703,
|
|
168
229
|
CLAMP_TO_EDGE: 33071,
|
|
169
230
|
MIRRORED_REPEAT: 33648,
|
|
170
231
|
REPEAT: 10497
|
|
171
232
|
};
|
|
172
233
|
const THREE_TO_WEBGL = {};
|
|
173
|
-
THREE_TO_WEBGL[
|
|
174
|
-
THREE_TO_WEBGL[
|
|
175
|
-
THREE_TO_WEBGL[
|
|
176
|
-
THREE_TO_WEBGL[
|
|
177
|
-
THREE_TO_WEBGL[
|
|
178
|
-
THREE_TO_WEBGL[
|
|
179
|
-
THREE_TO_WEBGL[
|
|
180
|
-
THREE_TO_WEBGL[
|
|
181
|
-
THREE_TO_WEBGL[
|
|
234
|
+
THREE_TO_WEBGL[NearestFilter] = WEBGL_CONSTANTS.NEAREST;
|
|
235
|
+
THREE_TO_WEBGL[NearestMipmapNearestFilter] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;
|
|
236
|
+
THREE_TO_WEBGL[NearestMipmapLinearFilter] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;
|
|
237
|
+
THREE_TO_WEBGL[LinearFilter] = WEBGL_CONSTANTS.LINEAR;
|
|
238
|
+
THREE_TO_WEBGL[LinearMipmapNearestFilter] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;
|
|
239
|
+
THREE_TO_WEBGL[LinearMipmapLinearFilter] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;
|
|
240
|
+
THREE_TO_WEBGL[ClampToEdgeWrapping] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;
|
|
241
|
+
THREE_TO_WEBGL[RepeatWrapping] = WEBGL_CONSTANTS.REPEAT;
|
|
242
|
+
THREE_TO_WEBGL[MirroredRepeatWrapping] = WEBGL_CONSTANTS.MIRRORED_REPEAT;
|
|
182
243
|
const PATH_PROPERTIES = {
|
|
183
|
-
scale:
|
|
184
|
-
position:
|
|
185
|
-
quaternion:
|
|
186
|
-
morphTargetInfluences:
|
|
187
|
-
};
|
|
244
|
+
scale: 'scale',
|
|
245
|
+
position: 'translation',
|
|
246
|
+
quaternion: 'rotation',
|
|
247
|
+
morphTargetInfluences: 'weights'
|
|
248
|
+
}; // GLB constants
|
|
249
|
+
// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
|
|
250
|
+
|
|
188
251
|
const GLB_HEADER_BYTES = 12;
|
|
189
|
-
const GLB_HEADER_MAGIC =
|
|
252
|
+
const GLB_HEADER_MAGIC = 0x46546c67;
|
|
190
253
|
const GLB_VERSION = 2;
|
|
191
254
|
const GLB_CHUNK_PREFIX_BYTES = 8;
|
|
192
|
-
const GLB_CHUNK_TYPE_JSON =
|
|
193
|
-
const GLB_CHUNK_TYPE_BIN =
|
|
255
|
+
const GLB_CHUNK_TYPE_JSON = 0x4e4f534a;
|
|
256
|
+
const GLB_CHUNK_TYPE_BIN = 0x004e4942;
|
|
257
|
+
/**
|
|
258
|
+
* Writer
|
|
259
|
+
*/
|
|
260
|
+
|
|
194
261
|
class GLTFWriter {
|
|
195
262
|
constructor() {
|
|
263
|
+
_defineProperty(this, "plugins", void 0);
|
|
264
|
+
|
|
265
|
+
_defineProperty(this, "options", void 0);
|
|
266
|
+
|
|
267
|
+
_defineProperty(this, "pending", void 0);
|
|
268
|
+
|
|
269
|
+
_defineProperty(this, "buffers", void 0);
|
|
270
|
+
|
|
271
|
+
_defineProperty(this, "byteOffset", void 0);
|
|
272
|
+
|
|
273
|
+
_defineProperty(this, "nodeMap", void 0);
|
|
274
|
+
|
|
275
|
+
_defineProperty(this, "skins", void 0);
|
|
276
|
+
|
|
277
|
+
_defineProperty(this, "extensionsUsed", void 0);
|
|
278
|
+
|
|
279
|
+
_defineProperty(this, "uids", void 0);
|
|
280
|
+
|
|
281
|
+
_defineProperty(this, "uid", void 0);
|
|
282
|
+
|
|
283
|
+
_defineProperty(this, "json", void 0);
|
|
284
|
+
|
|
285
|
+
_defineProperty(this, "cache", void 0);
|
|
286
|
+
|
|
287
|
+
_defineProperty(this, "cachedCanvas", void 0);
|
|
288
|
+
|
|
196
289
|
this.plugins = [];
|
|
197
290
|
this.options = {};
|
|
198
291
|
this.pending = [];
|
|
199
292
|
this.buffers = [];
|
|
200
293
|
this.byteOffset = 0;
|
|
201
|
-
this.nodeMap =
|
|
294
|
+
this.nodeMap = new Map();
|
|
202
295
|
this.skins = [];
|
|
203
296
|
this.extensionsUsed = {};
|
|
204
|
-
this.uids =
|
|
297
|
+
this.uids = new Map();
|
|
205
298
|
this.uid = 0;
|
|
206
299
|
this.json = {
|
|
207
300
|
asset: {
|
|
208
|
-
version:
|
|
209
|
-
generator:
|
|
301
|
+
version: '2.0',
|
|
302
|
+
generator: 'THREE.GLTFExporter'
|
|
210
303
|
}
|
|
211
304
|
};
|
|
212
305
|
this.cache = {
|
|
213
|
-
meshes:
|
|
214
|
-
attributes:
|
|
215
|
-
attributesNormalized:
|
|
216
|
-
materials:
|
|
217
|
-
textures:
|
|
218
|
-
images:
|
|
306
|
+
meshes: new Map(),
|
|
307
|
+
attributes: new Map(),
|
|
308
|
+
attributesNormalized: new Map(),
|
|
309
|
+
materials: new Map(),
|
|
310
|
+
textures: new Map(),
|
|
311
|
+
images: new Map()
|
|
219
312
|
};
|
|
220
313
|
this.cachedCanvas = null;
|
|
221
314
|
}
|
|
315
|
+
|
|
222
316
|
setPlugins(plugins) {
|
|
223
317
|
this.plugins = plugins;
|
|
224
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* Parse scenes and generate GLTF output
|
|
321
|
+
* @param {Scene or [THREE.Scenes]} input Scene or Array of THREE.Scenes
|
|
322
|
+
* @param {Function} onDone Callback on completed
|
|
323
|
+
* @param {Object} options options
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
|
|
225
327
|
write(input, onDone, options) {
|
|
226
|
-
this.options = Object.assign(
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (this.options.animations !== void 0 && this.options.animations.length > 0) {
|
|
328
|
+
this.options = Object.assign({}, {
|
|
329
|
+
// default options
|
|
330
|
+
binary: false,
|
|
331
|
+
trs: false,
|
|
332
|
+
onlyVisible: true,
|
|
333
|
+
truncateDrawRange: true,
|
|
334
|
+
embedImages: true,
|
|
335
|
+
maxTextureSize: Infinity,
|
|
336
|
+
animations: [],
|
|
337
|
+
includeCustomExtensions: false
|
|
338
|
+
}, options);
|
|
339
|
+
|
|
340
|
+
if (this.options.animations !== undefined && this.options.animations.length > 0) {
|
|
341
|
+
// Only TRS properties, and not matrices, may be targeted by animation.
|
|
241
342
|
this.options.trs = true;
|
|
242
343
|
}
|
|
344
|
+
|
|
243
345
|
this.processInput(input);
|
|
244
346
|
const writer = this;
|
|
245
347
|
Promise.all(this.pending).then(() => {
|
|
246
348
|
const buffers = writer.buffers;
|
|
247
349
|
const json = writer.json;
|
|
248
|
-
const
|
|
249
|
-
const extensionsUsed = writer.extensionsUsed;
|
|
250
|
-
|
|
350
|
+
const options = writer.options;
|
|
351
|
+
const extensionsUsed = writer.extensionsUsed; // Merge buffers.
|
|
352
|
+
|
|
353
|
+
const blob = new Blob(buffers, {
|
|
354
|
+
type: 'application/octet-stream'
|
|
355
|
+
}); // Declare extensions.
|
|
356
|
+
|
|
251
357
|
const extensionsUsedList = Object.keys(extensionsUsed);
|
|
252
|
-
if (extensionsUsedList.length > 0)
|
|
253
|
-
|
|
254
|
-
if (json.buffers && json.buffers.length > 0)
|
|
255
|
-
|
|
256
|
-
if (
|
|
358
|
+
if (extensionsUsedList.length > 0) json.extensionsUsed = extensionsUsedList; // Update bytelength of the single buffer.
|
|
359
|
+
|
|
360
|
+
if (json.buffers && json.buffers.length > 0) json.buffers[0].byteLength = blob.size;
|
|
361
|
+
|
|
362
|
+
if (options.binary) {
|
|
363
|
+
// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
|
|
257
364
|
const reader = new window.FileReader();
|
|
258
365
|
reader.readAsArrayBuffer(blob);
|
|
366
|
+
|
|
259
367
|
reader.onloadend = () => {
|
|
260
|
-
if (reader.result !== null && typeof reader.result !==
|
|
368
|
+
if (reader.result !== null && typeof reader.result !== 'string') {
|
|
369
|
+
// Binary chunk.
|
|
261
370
|
const binaryChunk = this.getPaddedArrayBuffer(reader.result);
|
|
262
371
|
const binaryChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));
|
|
263
372
|
binaryChunkPrefix.setUint32(0, binaryChunk.byteLength, true);
|
|
264
|
-
binaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true);
|
|
265
|
-
|
|
373
|
+
binaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true); // JSON chunk.
|
|
374
|
+
|
|
375
|
+
const jsonChunk = this.getPaddedArrayBuffer(this.stringToArrayBuffer(JSON.stringify(json)), 0x20);
|
|
266
376
|
const jsonChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));
|
|
267
377
|
jsonChunkPrefix.setUint32(0, jsonChunk.byteLength, true);
|
|
268
|
-
jsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true);
|
|
378
|
+
jsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true); // GLB header.
|
|
379
|
+
|
|
269
380
|
const header = new ArrayBuffer(GLB_HEADER_BYTES);
|
|
270
381
|
const headerView = new DataView(header);
|
|
271
382
|
headerView.setUint32(0, GLB_HEADER_MAGIC, true);
|
|
@@ -273,12 +384,13 @@ class GLTFWriter {
|
|
|
273
384
|
const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength;
|
|
274
385
|
headerView.setUint32(8, totalByteLength, true);
|
|
275
386
|
const glbBlob = new Blob([header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk], {
|
|
276
|
-
type:
|
|
387
|
+
type: 'application/octet-stream'
|
|
277
388
|
});
|
|
278
389
|
const glbReader = new window.FileReader();
|
|
279
390
|
glbReader.readAsArrayBuffer(glbBlob);
|
|
280
|
-
|
|
281
|
-
|
|
391
|
+
|
|
392
|
+
glbReader.onloadend = function () {
|
|
393
|
+
if (glbReader.result !== null && typeof glbReader.result !== 'string') {
|
|
282
394
|
onDone(glbReader.result);
|
|
283
395
|
}
|
|
284
396
|
};
|
|
@@ -288,9 +400,11 @@ class GLTFWriter {
|
|
|
288
400
|
if (json.buffers && json.buffers.length > 0) {
|
|
289
401
|
const reader = new window.FileReader();
|
|
290
402
|
reader.readAsDataURL(blob);
|
|
291
|
-
|
|
403
|
+
|
|
404
|
+
reader.onloadend = function () {
|
|
292
405
|
const base64data = reader.result;
|
|
293
|
-
|
|
406
|
+
|
|
407
|
+
if (json.buffers !== undefined && base64data !== null) {
|
|
294
408
|
json.buffers[0].uri = base64data;
|
|
295
409
|
onDone(json);
|
|
296
410
|
}
|
|
@@ -301,100 +415,171 @@ class GLTFWriter {
|
|
|
301
415
|
}
|
|
302
416
|
});
|
|
303
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Serializes a userData.
|
|
420
|
+
*
|
|
421
|
+
* @param {THREE.Object3D|THREE.Material} object
|
|
422
|
+
* @param {Object} objectDef
|
|
423
|
+
*/
|
|
424
|
+
|
|
425
|
+
|
|
304
426
|
serializeUserData(object, objectDef) {
|
|
305
|
-
if (Object.keys(object.userData).length === 0)
|
|
306
|
-
return;
|
|
427
|
+
if (Object.keys(object.userData).length === 0) return;
|
|
307
428
|
const options = this.options;
|
|
308
429
|
const extensionsUsed = this.extensionsUsed;
|
|
430
|
+
|
|
309
431
|
try {
|
|
310
432
|
const json = JSON.parse(JSON.stringify(object.userData));
|
|
433
|
+
|
|
311
434
|
if (options.includeCustomExtensions && json.gltfExtensions) {
|
|
312
|
-
if (objectDef.extensions ===
|
|
313
|
-
|
|
435
|
+
if (objectDef.extensions === undefined) objectDef.extensions = {};
|
|
436
|
+
|
|
314
437
|
for (const extensionName in json.gltfExtensions) {
|
|
315
438
|
objectDef.extensions[extensionName] = json.gltfExtensions[extensionName];
|
|
316
439
|
extensionsUsed[extensionName] = true;
|
|
317
440
|
}
|
|
441
|
+
|
|
318
442
|
delete json.gltfExtensions;
|
|
319
443
|
}
|
|
320
|
-
|
|
321
|
-
|
|
444
|
+
|
|
445
|
+
if (Object.keys(json).length > 0) objectDef.extras = json;
|
|
322
446
|
} catch (error) {
|
|
323
447
|
if (error instanceof Error) {
|
|
324
|
-
console.warn(
|
|
325
|
-
"THREE.GLTFExporter: userData of '" + object.name + "' won't be serialized because of JSON.stringify error - " + error.message
|
|
326
|
-
);
|
|
448
|
+
console.warn("THREE.GLTFExporter: userData of '" + object.name + "' " + "won't be serialized because of JSON.stringify error - " + error.message);
|
|
327
449
|
}
|
|
328
450
|
}
|
|
329
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* Assign and return a temporal unique id for an object
|
|
454
|
+
* especially which doesn't have .uuid
|
|
455
|
+
* @param {Object} object
|
|
456
|
+
* @return {Integer}
|
|
457
|
+
*/
|
|
458
|
+
|
|
459
|
+
|
|
330
460
|
getUID(object) {
|
|
331
|
-
if (!this.uids.has(object))
|
|
332
|
-
this.uids.set(object, this.uid++);
|
|
461
|
+
if (!this.uids.has(object)) this.uids.set(object, this.uid++);
|
|
333
462
|
return this.uids.get(object);
|
|
334
463
|
}
|
|
464
|
+
/**
|
|
465
|
+
* Checks if normal attribute values are normalized.
|
|
466
|
+
*
|
|
467
|
+
* @param {BufferAttribute} normal
|
|
468
|
+
* @returns {Boolean}
|
|
469
|
+
*/
|
|
470
|
+
|
|
471
|
+
|
|
335
472
|
isNormalizedNormalAttribute(normal) {
|
|
336
473
|
const cache = this.cache;
|
|
337
|
-
if (cache.attributesNormalized.has(normal))
|
|
338
|
-
|
|
339
|
-
|
|
474
|
+
if (cache.attributesNormalized.has(normal)) return false;
|
|
475
|
+
const v = new Vector3();
|
|
476
|
+
|
|
340
477
|
for (let i = 0, il = normal.count; i < il; i++) {
|
|
341
|
-
|
|
342
|
-
|
|
478
|
+
// 0.0005 is from glTF-validator
|
|
479
|
+
if (Math.abs(v.fromBufferAttribute(normal, i).length() - 1.0) > 0.0005) return false;
|
|
343
480
|
}
|
|
481
|
+
|
|
344
482
|
return true;
|
|
345
483
|
}
|
|
484
|
+
/**
|
|
485
|
+
* Creates normalized normal buffer attribute.
|
|
486
|
+
*
|
|
487
|
+
* @param {BufferAttribute} normal
|
|
488
|
+
* @returns {BufferAttribute}
|
|
489
|
+
*
|
|
490
|
+
*/
|
|
491
|
+
|
|
492
|
+
|
|
346
493
|
createNormalizedNormalAttribute(normal) {
|
|
347
494
|
const cache = this.cache;
|
|
348
|
-
if (cache.attributesNormalized.has(normal))
|
|
349
|
-
return cache.attributesNormalized.get(normal);
|
|
495
|
+
if (cache.attributesNormalized.has(normal)) return cache.attributesNormalized.get(normal);
|
|
350
496
|
const attribute = normal.clone();
|
|
351
|
-
const v = new
|
|
497
|
+
const v = new Vector3();
|
|
498
|
+
|
|
352
499
|
for (let i = 0, il = attribute.count; i < il; i++) {
|
|
353
500
|
v.fromBufferAttribute(attribute, i);
|
|
501
|
+
|
|
354
502
|
if (v.x === 0 && v.y === 0 && v.z === 0) {
|
|
355
|
-
|
|
503
|
+
// if values can't be normalized set (1, 0, 0)
|
|
504
|
+
v.setX(1.0);
|
|
356
505
|
} else {
|
|
357
506
|
v.normalize();
|
|
358
507
|
}
|
|
508
|
+
|
|
359
509
|
attribute.setXYZ(i, v.x, v.y, v.z);
|
|
360
510
|
}
|
|
511
|
+
|
|
361
512
|
cache.attributesNormalized.set(normal, attribute);
|
|
362
513
|
return attribute;
|
|
363
514
|
}
|
|
515
|
+
/**
|
|
516
|
+
* Applies a texture transform, if present, to the map definition. Requires
|
|
517
|
+
* the KHR_texture_transform extension.
|
|
518
|
+
*
|
|
519
|
+
* @param {Object} mapDef
|
|
520
|
+
* @param {THREE.Texture} texture
|
|
521
|
+
*/
|
|
522
|
+
|
|
523
|
+
|
|
364
524
|
applyTextureTransform(mapDef, texture) {
|
|
365
525
|
let didTransform = false;
|
|
366
526
|
const transformDef = {};
|
|
527
|
+
|
|
367
528
|
if (texture.offset.x !== 0 || texture.offset.y !== 0) {
|
|
368
529
|
transformDef.offset = texture.offset.toArray();
|
|
369
530
|
didTransform = true;
|
|
370
531
|
}
|
|
532
|
+
|
|
371
533
|
if (texture.rotation !== 0) {
|
|
372
534
|
transformDef.rotation = texture.rotation;
|
|
373
535
|
didTransform = true;
|
|
374
536
|
}
|
|
537
|
+
|
|
375
538
|
if (texture.repeat.x !== 1 || texture.repeat.y !== 1) {
|
|
376
539
|
transformDef.scale = texture.repeat.toArray();
|
|
377
540
|
didTransform = true;
|
|
378
541
|
}
|
|
542
|
+
|
|
379
543
|
if (didTransform) {
|
|
380
544
|
mapDef.extensions = mapDef.extensions || {};
|
|
381
|
-
mapDef.extensions[
|
|
382
|
-
this.extensionsUsed[
|
|
545
|
+
mapDef.extensions['KHR_texture_transform'] = transformDef;
|
|
546
|
+
this.extensionsUsed['KHR_texture_transform'] = true;
|
|
383
547
|
}
|
|
384
548
|
}
|
|
549
|
+
/**
|
|
550
|
+
* Process a buffer to append to the default one.
|
|
551
|
+
* @param {ArrayBuffer} buffer
|
|
552
|
+
* @return {Integer}
|
|
553
|
+
*/
|
|
554
|
+
|
|
555
|
+
|
|
385
556
|
processBuffer(buffer) {
|
|
386
557
|
const json = this.json;
|
|
387
558
|
const buffers = this.buffers;
|
|
388
|
-
if (!json.buffers)
|
|
389
|
-
|
|
559
|
+
if (!json.buffers) json.buffers = [{
|
|
560
|
+
byteLength: 0
|
|
561
|
+
}]; // All buffers are merged before export.
|
|
562
|
+
|
|
390
563
|
buffers.push(buffer);
|
|
391
564
|
return 0;
|
|
392
565
|
}
|
|
566
|
+
/**
|
|
567
|
+
* Process and generate a BufferView
|
|
568
|
+
* @param {BufferAttribute} attribute
|
|
569
|
+
* @param {number} componentType
|
|
570
|
+
* @param {number} start
|
|
571
|
+
* @param {number} count
|
|
572
|
+
* @param {number} target (Optional) Target usage of the BufferView
|
|
573
|
+
* @return {Object}
|
|
574
|
+
*/
|
|
575
|
+
|
|
576
|
+
|
|
393
577
|
processBufferView(attribute, componentType, start, count, target) {
|
|
394
578
|
const json = this.json;
|
|
395
|
-
if (!json.bufferViews)
|
|
396
|
-
|
|
579
|
+
if (!json.bufferViews) json.bufferViews = []; // Create a new dataview and dump the attribute's array into it
|
|
580
|
+
|
|
397
581
|
let componentSize;
|
|
582
|
+
|
|
398
583
|
if (componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE) {
|
|
399
584
|
componentSize = 1;
|
|
400
585
|
} else if (componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT) {
|
|
@@ -402,25 +587,23 @@ class GLTFWriter {
|
|
|
402
587
|
} else {
|
|
403
588
|
componentSize = 4;
|
|
404
589
|
}
|
|
590
|
+
|
|
405
591
|
const byteLength = this.getPaddedBufferSize(count * attribute.itemSize * componentSize);
|
|
406
592
|
const dataView = new DataView(new ArrayBuffer(byteLength));
|
|
407
593
|
let offset = 0;
|
|
594
|
+
|
|
408
595
|
for (let i = start; i < start + count; i++) {
|
|
409
596
|
for (let a = 0; a < attribute.itemSize; a++) {
|
|
410
597
|
let value;
|
|
598
|
+
|
|
411
599
|
if (attribute.itemSize > 4) {
|
|
600
|
+
// no support for interleaved data for itemSize > 4
|
|
412
601
|
value = attribute.array[i * attribute.itemSize + a];
|
|
413
602
|
} else {
|
|
414
|
-
if (a === 0)
|
|
415
|
-
value = attribute.getX(i);
|
|
416
|
-
else if (a === 1)
|
|
417
|
-
value = attribute.getY(i);
|
|
418
|
-
else if (a === 2)
|
|
419
|
-
value = attribute.getZ(i);
|
|
420
|
-
else if (a === 3)
|
|
421
|
-
value = attribute.getW(i);
|
|
603
|
+
if (a === 0) value = attribute.getX(i);else if (a === 1) value = attribute.getY(i);else if (a === 2) value = attribute.getZ(i);else if (a === 3) value = attribute.getW(i);
|
|
422
604
|
}
|
|
423
|
-
|
|
605
|
+
|
|
606
|
+
if (value !== undefined) {
|
|
424
607
|
if (componentType === WEBGL_CONSTANTS.FLOAT) {
|
|
425
608
|
dataView.setFloat32(offset, value, true);
|
|
426
609
|
} else if (componentType === WEBGL_CONSTANTS.UNSIGNED_INT) {
|
|
@@ -431,37 +614,49 @@ class GLTFWriter {
|
|
|
431
614
|
dataView.setUint8(offset, value);
|
|
432
615
|
}
|
|
433
616
|
}
|
|
617
|
+
|
|
434
618
|
offset += componentSize;
|
|
435
619
|
}
|
|
436
620
|
}
|
|
621
|
+
|
|
437
622
|
const bufferViewDef = {
|
|
438
623
|
buffer: this.processBuffer(dataView.buffer),
|
|
439
624
|
byteOffset: this.byteOffset,
|
|
440
|
-
byteLength
|
|
625
|
+
byteLength: byteLength
|
|
441
626
|
};
|
|
442
|
-
if (target !==
|
|
443
|
-
|
|
627
|
+
if (target !== undefined) bufferViewDef.target = target;
|
|
628
|
+
|
|
444
629
|
if (target === WEBGL_CONSTANTS.ARRAY_BUFFER) {
|
|
630
|
+
// Only define byteStride for vertex attributes.
|
|
445
631
|
bufferViewDef.byteStride = attribute.itemSize * componentSize;
|
|
446
632
|
}
|
|
633
|
+
|
|
447
634
|
this.byteOffset += byteLength;
|
|
448
|
-
json.bufferViews.push(bufferViewDef);
|
|
635
|
+
json.bufferViews.push(bufferViewDef); // @TODO Merge bufferViews where possible.
|
|
636
|
+
|
|
449
637
|
const output = {
|
|
450
638
|
id: json.bufferViews.length - 1,
|
|
451
639
|
byteLength: 0
|
|
452
640
|
};
|
|
453
641
|
return output;
|
|
454
642
|
}
|
|
643
|
+
/**
|
|
644
|
+
* Process and generate a BufferView from an image Blob.
|
|
645
|
+
* @param {Blob} blob
|
|
646
|
+
* @return {Promise<Integer>}
|
|
647
|
+
*/
|
|
648
|
+
|
|
649
|
+
|
|
455
650
|
processBufferViewImage(blob) {
|
|
456
651
|
const writer = this;
|
|
457
652
|
const json = writer.json;
|
|
458
|
-
if (!json.bufferViews)
|
|
459
|
-
|
|
460
|
-
return new Promise((resolve) => {
|
|
653
|
+
if (!json.bufferViews) json.bufferViews = [];
|
|
654
|
+
return new Promise(resolve => {
|
|
461
655
|
const reader = new window.FileReader();
|
|
462
656
|
reader.readAsArrayBuffer(blob);
|
|
657
|
+
|
|
463
658
|
reader.onloadend = () => {
|
|
464
|
-
if (reader.result !== null && typeof reader.result !==
|
|
659
|
+
if (reader.result !== null && typeof reader.result !== 'string' && json.bufferViews !== undefined) {
|
|
465
660
|
const buffer = this.getPaddedArrayBuffer(reader.result);
|
|
466
661
|
const bufferViewDef = {
|
|
467
662
|
buffer: writer.processBuffer(buffer),
|
|
@@ -474,17 +669,28 @@ class GLTFWriter {
|
|
|
474
669
|
};
|
|
475
670
|
});
|
|
476
671
|
}
|
|
672
|
+
/**
|
|
673
|
+
* Process attribute to generate an accessor
|
|
674
|
+
* @param {BufferAttribute} attribute Attribute to process
|
|
675
|
+
* @param {THREE.BufferGeometry} geometry (Optional) Geometry used for truncated draw range
|
|
676
|
+
* @param {Integer} start (Optional)
|
|
677
|
+
* @param {Integer} count (Optional)
|
|
678
|
+
* @return {Integer|null} Index of the processed accessor on the "accessors" array
|
|
679
|
+
*/
|
|
680
|
+
|
|
681
|
+
|
|
477
682
|
processAccessor(attribute, geometry, start, count) {
|
|
478
683
|
const options = this.options;
|
|
479
684
|
const json = this.json;
|
|
480
685
|
const types = {
|
|
481
|
-
1:
|
|
482
|
-
2:
|
|
483
|
-
3:
|
|
484
|
-
4:
|
|
485
|
-
16:
|
|
686
|
+
1: 'SCALAR',
|
|
687
|
+
2: 'VEC2',
|
|
688
|
+
3: 'VEC3',
|
|
689
|
+
4: 'VEC4',
|
|
690
|
+
16: 'MAT4'
|
|
486
691
|
};
|
|
487
|
-
let componentType;
|
|
692
|
+
let componentType; // Detect the component type of the attribute array (float, uint or ushort)
|
|
693
|
+
|
|
488
694
|
if (attribute.array.constructor === Float32Array) {
|
|
489
695
|
componentType = WEBGL_CONSTANTS.FLOAT;
|
|
490
696
|
} else if (attribute.array.constructor === Uint32Array) {
|
|
@@ -494,80 +700,95 @@ class GLTFWriter {
|
|
|
494
700
|
} else if (attribute.array.constructor === Uint8Array) {
|
|
495
701
|
componentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;
|
|
496
702
|
} else {
|
|
497
|
-
throw new Error(
|
|
703
|
+
throw new Error('THREE.GLTFExporter: Unsupported bufferAttribute component type.');
|
|
498
704
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
if (count ===
|
|
502
|
-
|
|
503
|
-
if (options.truncateDrawRange && geometry !==
|
|
705
|
+
|
|
706
|
+
if (start === undefined) start = 0;
|
|
707
|
+
if (count === undefined) count = attribute.count; // @TODO Indexed buffer geometry with drawRange not supported yet
|
|
708
|
+
|
|
709
|
+
if (options.truncateDrawRange && geometry !== undefined && geometry.index === null) {
|
|
504
710
|
const end = start + count;
|
|
505
711
|
const end2 = geometry.drawRange.count === Infinity ? attribute.count : geometry.drawRange.start + geometry.drawRange.count;
|
|
506
712
|
start = Math.max(start, geometry.drawRange.start);
|
|
507
713
|
count = Math.min(end, end2) - start;
|
|
508
|
-
if (count < 0)
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
714
|
+
if (count < 0) count = 0;
|
|
715
|
+
} // Skip creating an accessor if the attribute doesn't have data to export
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
if (count === 0) return null;
|
|
513
719
|
const minMax = this.getMinMax(attribute, start, count);
|
|
514
|
-
let bufferViewTarget;
|
|
515
|
-
|
|
720
|
+
let bufferViewTarget; // If geometry isn't provided, don't infer the target usage of the bufferView. For
|
|
721
|
+
// animation samplers, target must not be set.
|
|
722
|
+
|
|
723
|
+
if (geometry !== undefined) {
|
|
516
724
|
bufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;
|
|
517
725
|
}
|
|
518
|
-
|
|
726
|
+
|
|
727
|
+
if (bufferViewTarget !== undefined) {
|
|
519
728
|
const bufferView = this.processBufferView(attribute, componentType, start, count, bufferViewTarget);
|
|
520
729
|
const accessorDef = {
|
|
521
730
|
bufferView: bufferView.id,
|
|
522
731
|
byteOffset: bufferView.byteOffset,
|
|
523
|
-
componentType,
|
|
524
|
-
count,
|
|
732
|
+
componentType: componentType,
|
|
733
|
+
count: count,
|
|
525
734
|
max: minMax.max,
|
|
526
735
|
min: minMax.min,
|
|
527
736
|
type: types[attribute.itemSize]
|
|
528
737
|
};
|
|
529
|
-
if (attribute.normalized)
|
|
530
|
-
|
|
531
|
-
if (!json.accessors)
|
|
532
|
-
json.accessors = [];
|
|
738
|
+
if (attribute.normalized) accessorDef.normalized = true;
|
|
739
|
+
if (!json.accessors) json.accessors = [];
|
|
533
740
|
return json.accessors.push(accessorDef) - 1;
|
|
534
741
|
}
|
|
535
742
|
}
|
|
743
|
+
/**
|
|
744
|
+
* Process image
|
|
745
|
+
* @param {Image} image to process
|
|
746
|
+
* @param {Integer} format of the image (RGBAFormat)
|
|
747
|
+
* @param {Boolean} flipY before writing out the image
|
|
748
|
+
* @return {Integer} Index of the processed texture in the "images" array
|
|
749
|
+
*/
|
|
750
|
+
|
|
751
|
+
|
|
536
752
|
processImage(image, format, flipY) {
|
|
537
753
|
const writer = this;
|
|
538
754
|
const cache = writer.cache;
|
|
539
755
|
const json = writer.json;
|
|
540
756
|
const options = writer.options;
|
|
541
757
|
const pending = writer.pending;
|
|
542
|
-
if (!cache.images.has(image))
|
|
543
|
-
cache.images.set(image, {});
|
|
758
|
+
if (!cache.images.has(image)) cache.images.set(image, {});
|
|
544
759
|
const cachedImages = cache.images.get(image);
|
|
545
|
-
const mimeType = format ===
|
|
546
|
-
const key = mimeType +
|
|
547
|
-
if (cachedImages !==
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
760
|
+
const mimeType = format === RGBAFormat ? 'image/png' : 'image/jpeg';
|
|
761
|
+
const key = mimeType + ':flipY/' + flipY.toString();
|
|
762
|
+
if (cachedImages !== undefined && cachedImages[key] !== undefined) return cachedImages[key];
|
|
763
|
+
if (!json.images) json.images = [];
|
|
764
|
+
const imageDef = {
|
|
765
|
+
mimeType: mimeType
|
|
766
|
+
};
|
|
767
|
+
|
|
768
|
+
if (options.embedImages && options.maxTextureSize !== undefined) {
|
|
769
|
+
const canvas = this.cachedCanvas = this.cachedCanvas || document.createElement('canvas');
|
|
554
770
|
canvas.width = Math.min(image.width, options.maxTextureSize);
|
|
555
771
|
canvas.height = Math.min(image.height, options.maxTextureSize);
|
|
556
|
-
const ctx = canvas.getContext(
|
|
772
|
+
const ctx = canvas.getContext('2d');
|
|
773
|
+
|
|
557
774
|
if (flipY) {
|
|
558
|
-
ctx
|
|
559
|
-
ctx
|
|
775
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.translate(0, canvas.height);
|
|
776
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.scale(1, -1);
|
|
560
777
|
}
|
|
561
|
-
|
|
562
|
-
|
|
778
|
+
|
|
779
|
+
if (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement || typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas || typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) {
|
|
780
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
563
781
|
} else {
|
|
564
|
-
if (format !==
|
|
565
|
-
console.error(
|
|
782
|
+
if (format !== RGBAFormat) {
|
|
783
|
+
console.error('GLTFExporter: Only RGBA format is supported.');
|
|
566
784
|
}
|
|
785
|
+
|
|
567
786
|
if (image.width > options.maxTextureSize || image.height > options.maxTextureSize) {
|
|
568
|
-
console.warn(
|
|
787
|
+
console.warn('GLTFExporter: Image size is bigger than maxTextureSize', image);
|
|
569
788
|
}
|
|
789
|
+
|
|
570
790
|
const data = new Uint8ClampedArray(image.height * image.width * 4);
|
|
791
|
+
|
|
571
792
|
if (image instanceof ImageData) {
|
|
572
793
|
for (let i = 0; i < data.length; i += 4) {
|
|
573
794
|
data[i + 0] = image.data[i + 0];
|
|
@@ -576,36 +797,43 @@ class GLTFWriter {
|
|
|
576
797
|
data[i + 3] = image.data[i + 3];
|
|
577
798
|
}
|
|
578
799
|
}
|
|
579
|
-
|
|
800
|
+
|
|
801
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.putImageData(new ImageData(data, image.width, image.height), 0, 0);
|
|
580
802
|
}
|
|
803
|
+
|
|
581
804
|
if (options.binary) {
|
|
582
|
-
pending.push(
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
);
|
|
805
|
+
pending.push(new Promise(function (resolve) {
|
|
806
|
+
canvas.toBlob(function (blob) {
|
|
807
|
+
if (blob !== null) {
|
|
808
|
+
writer.processBufferViewImage(blob).then(function (bufferViewIndex) {
|
|
809
|
+
imageDef.bufferView = bufferViewIndex; // @ts-expect-error
|
|
810
|
+
|
|
811
|
+
resolve();
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
}, mimeType);
|
|
815
|
+
}));
|
|
594
816
|
} else {
|
|
595
817
|
imageDef.uri = canvas.toDataURL(mimeType);
|
|
596
818
|
}
|
|
597
819
|
} else if (image instanceof Image) {
|
|
598
820
|
imageDef.uri = image.src;
|
|
599
821
|
}
|
|
822
|
+
|
|
600
823
|
const index = json.images.push(imageDef) - 1;
|
|
601
|
-
if (cachedImages !==
|
|
602
|
-
cachedImages[key] = index;
|
|
824
|
+
if (cachedImages !== undefined) cachedImages[key] = index;
|
|
603
825
|
return index;
|
|
604
826
|
}
|
|
827
|
+
/**
|
|
828
|
+
* Process sampler
|
|
829
|
+
* @param {Texture} map Texture to process
|
|
830
|
+
* @return {Integer} Index of the processed texture in the "samplers" array
|
|
831
|
+
*/
|
|
832
|
+
|
|
833
|
+
|
|
605
834
|
processSampler(map) {
|
|
606
835
|
const json = this.json;
|
|
607
|
-
if (!json.samplers)
|
|
608
|
-
json.samplers = [];
|
|
836
|
+
if (!json.samplers) json.samplers = [];
|
|
609
837
|
const samplerDef = {
|
|
610
838
|
magFilter: THREE_TO_WEBGL[map.magFilter],
|
|
611
839
|
minFilter: THREE_TO_WEBGL[map.minFilter],
|
|
@@ -614,129 +842,189 @@ class GLTFWriter {
|
|
|
614
842
|
};
|
|
615
843
|
return json.samplers.push(samplerDef) - 1;
|
|
616
844
|
}
|
|
845
|
+
/**
|
|
846
|
+
* Process texture
|
|
847
|
+
* @param {Texture} map Map to process
|
|
848
|
+
* @return {Integer} Index of the processed texture in the "textures" array
|
|
849
|
+
*/
|
|
850
|
+
|
|
851
|
+
|
|
617
852
|
processTexture(map) {
|
|
618
853
|
const cache = this.cache;
|
|
619
854
|
const json = this.json;
|
|
620
|
-
if (cache.textures.has(map))
|
|
621
|
-
|
|
622
|
-
if (!json.textures)
|
|
623
|
-
json.textures = [];
|
|
855
|
+
if (cache.textures.has(map)) return cache.textures.get(map);
|
|
856
|
+
if (!json.textures) json.textures = [];
|
|
624
857
|
const textureDef = {
|
|
625
858
|
sampler: this.processSampler(map),
|
|
626
859
|
source: this.processImage(map.image, map.format, map.flipY)
|
|
627
860
|
};
|
|
628
|
-
if (map.name)
|
|
629
|
-
|
|
630
|
-
this._invokeAll(function(ext) {
|
|
861
|
+
if (map.name) textureDef.name = map.name;
|
|
862
|
+
|
|
863
|
+
this._invokeAll(function (ext) {
|
|
631
864
|
ext.writeTexture && ext.writeTexture(map, textureDef);
|
|
632
865
|
});
|
|
866
|
+
|
|
633
867
|
const index = json.textures.push(textureDef) - 1;
|
|
634
868
|
cache.textures.set(map, index);
|
|
635
869
|
return index;
|
|
636
870
|
}
|
|
871
|
+
/**
|
|
872
|
+
* Process material
|
|
873
|
+
* @param {THREE.Material} material Material to process
|
|
874
|
+
* @return {Integer|null} Index of the processed material in the "materials" array
|
|
875
|
+
*/
|
|
876
|
+
|
|
877
|
+
|
|
637
878
|
processMaterial(material) {
|
|
638
879
|
const cache = this.cache;
|
|
639
880
|
const json = this.json;
|
|
640
|
-
if (cache.materials.has(material))
|
|
641
|
-
|
|
642
|
-
if (material instanceof
|
|
643
|
-
console.warn(
|
|
881
|
+
if (cache.materials.has(material)) return cache.materials.get(material);
|
|
882
|
+
|
|
883
|
+
if (material instanceof ShaderMaterial && material.isShaderMaterial) {
|
|
884
|
+
console.warn('GLTFExporter: THREE.ShaderMaterial not supported.');
|
|
644
885
|
return null;
|
|
645
886
|
}
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
}
|
|
652
|
-
|
|
887
|
+
|
|
888
|
+
if (!json.materials) json.materials = []; // @QUESTION Should we avoid including any attribute that has the default value?
|
|
889
|
+
|
|
890
|
+
const materialDef = {
|
|
891
|
+
pbrMetallicRoughness: {}
|
|
892
|
+
};
|
|
893
|
+
|
|
894
|
+
if (!(material instanceof MeshStandardMaterial && material.isMeshStandardMaterial && material instanceof MeshBasicMaterial && // @ts-expect-error
|
|
895
|
+
material.isMeshBasicMaterial)) {
|
|
896
|
+
console.warn('GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.');
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
if (material instanceof MeshStandardMaterial || material instanceof MeshPhysicalMaterial) {
|
|
900
|
+
// pbrMetallicRoughness.baseColorFactor
|
|
653
901
|
const color = material.color.toArray().concat([material.opacity]);
|
|
902
|
+
|
|
654
903
|
if (!this.equalArray(color, [1, 1, 1, 1])) {
|
|
655
904
|
materialDef.pbrMetallicRoughness.baseColorFactor = color;
|
|
656
905
|
}
|
|
657
906
|
}
|
|
658
|
-
|
|
907
|
+
|
|
908
|
+
if (material instanceof MeshStandardMaterial && material.isMeshStandardMaterial) {
|
|
659
909
|
materialDef.pbrMetallicRoughness.metallicFactor = material.metalness;
|
|
660
910
|
materialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;
|
|
661
911
|
} else {
|
|
662
912
|
materialDef.pbrMetallicRoughness.metallicFactor = 0.5;
|
|
663
913
|
materialDef.pbrMetallicRoughness.roughnessFactor = 0.5;
|
|
664
|
-
}
|
|
665
|
-
|
|
914
|
+
} // pbrMetallicRoughness.metallicRoughnessTexture
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
if (material instanceof MeshStandardMaterial && material.metalnessMap || material instanceof MeshStandardMaterial && material.roughnessMap) {
|
|
666
918
|
if (material.metalnessMap === material.roughnessMap && material.metalnessMap !== null) {
|
|
667
|
-
const metalRoughMapDef = {
|
|
919
|
+
const metalRoughMapDef = {
|
|
920
|
+
index: this.processTexture(material.metalnessMap)
|
|
921
|
+
};
|
|
668
922
|
this.applyTextureTransform(metalRoughMapDef, material.metalnessMap);
|
|
669
923
|
materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;
|
|
670
924
|
} else {
|
|
671
|
-
console.warn(
|
|
672
|
-
"THREE.GLTFExporter: Ignoring metalnessMap and roughnessMap because they are not the same Texture."
|
|
673
|
-
);
|
|
925
|
+
console.warn('THREE.GLTFExporter: Ignoring metalnessMap and roughnessMap because they are not the same Texture.');
|
|
674
926
|
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
|
|
927
|
+
} // pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
if ((material instanceof MeshStandardMaterial || material instanceof MeshPhysicalMaterial) && material.map) {
|
|
931
|
+
const baseColorMapDef = {
|
|
932
|
+
index: this.processTexture(material.map)
|
|
933
|
+
};
|
|
678
934
|
this.applyTextureTransform(baseColorMapDef, material.map);
|
|
679
935
|
materialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;
|
|
680
936
|
}
|
|
681
|
-
|
|
937
|
+
|
|
938
|
+
if ((material instanceof MeshStandardMaterial || material instanceof MeshPhysicalMaterial) && material.emissive) {
|
|
939
|
+
// note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.
|
|
682
940
|
const emissive = material.emissive.clone().multiplyScalar(material.emissiveIntensity);
|
|
683
941
|
const maxEmissiveComponent = Math.max(emissive.r, emissive.g, emissive.b);
|
|
942
|
+
|
|
684
943
|
if (maxEmissiveComponent > 1) {
|
|
685
944
|
emissive.multiplyScalar(1 / maxEmissiveComponent);
|
|
686
|
-
console.warn(
|
|
945
|
+
console.warn('THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited');
|
|
687
946
|
}
|
|
947
|
+
|
|
688
948
|
if (maxEmissiveComponent > 0) {
|
|
689
949
|
materialDef.emissiveFactor = emissive.toArray();
|
|
690
|
-
}
|
|
950
|
+
} // emissiveTexture
|
|
951
|
+
|
|
952
|
+
|
|
691
953
|
if (material.emissiveMap) {
|
|
692
|
-
const emissiveMapDef = {
|
|
954
|
+
const emissiveMapDef = {
|
|
955
|
+
index: this.processTexture(material.emissiveMap)
|
|
956
|
+
};
|
|
693
957
|
this.applyTextureTransform(emissiveMapDef, material.emissiveMap);
|
|
694
958
|
materialDef.emissiveTexture = emissiveMapDef;
|
|
695
959
|
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
|
|
960
|
+
} // normalTexture
|
|
961
|
+
|
|
962
|
+
|
|
963
|
+
if ((material instanceof MeshMatcapMaterial || material instanceof MeshNormalMaterial || material instanceof MeshPhongMaterial || material instanceof MeshStandardMaterial || material instanceof MeshToonMaterial) && material.normalMap) {
|
|
964
|
+
const normalMapDef = {
|
|
965
|
+
index: this.processTexture(material.normalMap)
|
|
966
|
+
};
|
|
967
|
+
|
|
699
968
|
if (material.normalScale && material.normalScale.x !== 1) {
|
|
969
|
+
// glTF normal scale is univariate. Ignore `y`, which may be flipped.
|
|
970
|
+
// Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995
|
|
700
971
|
normalMapDef.scale = material.normalScale.x;
|
|
701
972
|
}
|
|
973
|
+
|
|
702
974
|
this.applyTextureTransform(normalMapDef, material.normalMap);
|
|
703
975
|
materialDef.normalTexture = normalMapDef;
|
|
704
|
-
}
|
|
705
|
-
|
|
976
|
+
} // occlusionTexture
|
|
977
|
+
|
|
978
|
+
|
|
979
|
+
if ((material instanceof MeshBasicMaterial || material instanceof MeshLambertMaterial || material instanceof MeshPhongMaterial || material instanceof MeshStandardMaterial || material instanceof MeshToonMaterial) && material.aoMap) {
|
|
706
980
|
const occlusionMapDef = {
|
|
707
981
|
index: this.processTexture(material.aoMap),
|
|
708
982
|
texCoord: 1
|
|
709
983
|
};
|
|
710
|
-
|
|
984
|
+
|
|
985
|
+
if (material.aoMapIntensity !== 1.0) {
|
|
711
986
|
occlusionMapDef.strength = material.aoMapIntensity;
|
|
712
987
|
}
|
|
988
|
+
|
|
713
989
|
this.applyTextureTransform(occlusionMapDef, material.aoMap);
|
|
714
990
|
materialDef.occlusionTexture = occlusionMapDef;
|
|
715
|
-
}
|
|
991
|
+
} // alphaMode
|
|
992
|
+
|
|
993
|
+
|
|
716
994
|
if (material.transparent) {
|
|
717
|
-
materialDef.alphaMode =
|
|
995
|
+
materialDef.alphaMode = 'BLEND';
|
|
718
996
|
} else {
|
|
719
|
-
if (material.alphaTest > 0) {
|
|
720
|
-
materialDef.alphaMode =
|
|
997
|
+
if (material.alphaTest > 0.0) {
|
|
998
|
+
materialDef.alphaMode = 'MASK';
|
|
721
999
|
materialDef.alphaCutoff = material.alphaTest;
|
|
722
1000
|
}
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
if (material.
|
|
727
|
-
|
|
1001
|
+
} // doubleSided
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
if (material.side === DoubleSide) materialDef.doubleSided = true;
|
|
1005
|
+
if (material.name !== '') materialDef.name = material.name;
|
|
728
1006
|
this.serializeUserData(material, materialDef);
|
|
729
|
-
|
|
1007
|
+
|
|
1008
|
+
this._invokeAll(function (ext) {
|
|
730
1009
|
ext.writeMaterial && ext.writeMaterial(material, materialDef);
|
|
731
1010
|
});
|
|
1011
|
+
|
|
732
1012
|
const index = json.materials.push(materialDef) - 1;
|
|
733
1013
|
cache.materials.set(material, index);
|
|
734
1014
|
return index;
|
|
735
1015
|
}
|
|
1016
|
+
/**
|
|
1017
|
+
* Process mesh
|
|
1018
|
+
* @param {THREE.Mesh} mesh Mesh to process
|
|
1019
|
+
* @return {Integer|null} Index of the processed mesh in the "meshes" array
|
|
1020
|
+
*/
|
|
1021
|
+
|
|
1022
|
+
|
|
736
1023
|
processMesh(mesh) {
|
|
737
1024
|
const cache = this.cache;
|
|
738
1025
|
const json = this.json;
|
|
739
1026
|
const meshCacheKeyParts = [mesh.geometry.uuid];
|
|
1027
|
+
|
|
740
1028
|
if (Array.isArray(mesh.material)) {
|
|
741
1029
|
for (let i = 0, l = mesh.material.length; i < l; i++) {
|
|
742
1030
|
meshCacheKeyParts.push(mesh.material[i].uuid);
|
|
@@ -744,245 +1032,325 @@ class GLTFWriter {
|
|
|
744
1032
|
} else {
|
|
745
1033
|
meshCacheKeyParts.push(mesh.material.uuid);
|
|
746
1034
|
}
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
1035
|
+
|
|
1036
|
+
const meshCacheKey = meshCacheKeyParts.join(':');
|
|
1037
|
+
if (cache.meshes.has(meshCacheKey)) return cache.meshes.get(meshCacheKey);
|
|
750
1038
|
const geometry = mesh.geometry;
|
|
751
|
-
let mode;
|
|
752
|
-
|
|
1039
|
+
let mode; // Use the correct mode
|
|
1040
|
+
|
|
1041
|
+
if (mesh instanceof LineSegments && mesh.isLineSegments) {
|
|
753
1042
|
mode = WEBGL_CONSTANTS.LINES;
|
|
754
|
-
} else if (mesh instanceof
|
|
1043
|
+
} else if (mesh instanceof LineLoop && mesh.isLineLoop) {
|
|
755
1044
|
mode = WEBGL_CONSTANTS.LINE_LOOP;
|
|
756
|
-
} else if (mesh instanceof
|
|
1045
|
+
} else if (mesh instanceof Line && mesh.isLine) {
|
|
757
1046
|
mode = WEBGL_CONSTANTS.LINE_STRIP;
|
|
758
|
-
} else if (mesh instanceof
|
|
1047
|
+
} else if (mesh instanceof Points && mesh.isPoints) {
|
|
759
1048
|
mode = WEBGL_CONSTANTS.POINTS;
|
|
760
1049
|
} else {
|
|
761
|
-
mode = (mesh.material instanceof
|
|
1050
|
+
mode = (mesh.material instanceof MeshBasicMaterial || mesh.material instanceof MeshDepthMaterial || mesh.material instanceof MeshLambertMaterial || mesh.material instanceof MeshNormalMaterial || mesh.material instanceof MeshPhongMaterial || mesh.material instanceof MeshStandardMaterial || mesh.material instanceof MeshToonMaterial || mesh.material instanceof ShaderMaterial) && mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;
|
|
762
1051
|
}
|
|
1052
|
+
|
|
763
1053
|
if (!geometry.isBufferGeometry) {
|
|
764
|
-
throw new Error(
|
|
1054
|
+
throw new Error('THREE.GLTFExporter: Geometry is not of type THREE.BufferGeometry.');
|
|
765
1055
|
}
|
|
1056
|
+
|
|
766
1057
|
const meshDef = {};
|
|
767
1058
|
const attributes = {};
|
|
768
1059
|
const primitives = [];
|
|
769
|
-
const targets = [];
|
|
1060
|
+
const targets = []; // Conversion between attributes names in threejs and gltf spec
|
|
1061
|
+
|
|
770
1062
|
const nameConversion = {
|
|
771
|
-
uv:
|
|
772
|
-
uv2:
|
|
773
|
-
color:
|
|
774
|
-
skinWeight:
|
|
775
|
-
skinIndex:
|
|
1063
|
+
uv: 'TEXCOORD_0',
|
|
1064
|
+
uv2: 'TEXCOORD_1',
|
|
1065
|
+
color: 'COLOR_0',
|
|
1066
|
+
skinWeight: 'WEIGHTS_0',
|
|
1067
|
+
skinIndex: 'JOINTS_0'
|
|
776
1068
|
};
|
|
777
|
-
const originalNormal = geometry.getAttribute(
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
1069
|
+
const originalNormal = geometry.getAttribute('normal');
|
|
1070
|
+
|
|
1071
|
+
if (originalNormal !== undefined && !(originalNormal instanceof InterleavedBufferAttribute) && !this.isNormalizedNormalAttribute(originalNormal)) {
|
|
1072
|
+
console.warn('THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.');
|
|
1073
|
+
geometry.setAttribute('normal', this.createNormalizedNormalAttribute(originalNormal));
|
|
1074
|
+
} // @QUESTION Detect if .vertexColors = true?
|
|
1075
|
+
// For every attribute create an accessor
|
|
1076
|
+
|
|
1077
|
+
|
|
782
1078
|
let modifiedAttribute = null;
|
|
1079
|
+
|
|
783
1080
|
for (let attributeName in geometry.attributes) {
|
|
784
|
-
|
|
785
|
-
|
|
1081
|
+
// Ignore morph target attributes, which are exported later.
|
|
1082
|
+
if (attributeName.substr(0, 5) === 'morph') continue;
|
|
786
1083
|
const attribute = geometry.attributes[attributeName];
|
|
787
|
-
attributeName = nameConversion[attributeName] || attributeName.toUpperCase();
|
|
1084
|
+
attributeName = nameConversion[attributeName] || attributeName.toUpperCase(); // Prefix all geometry attributes except the ones specifically
|
|
1085
|
+
// listed in the spec; non-spec attributes are considered custom.
|
|
1086
|
+
|
|
788
1087
|
const validVertexAttributes = /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/;
|
|
789
|
-
if (!validVertexAttributes.test(attributeName))
|
|
790
|
-
|
|
1088
|
+
if (!validVertexAttributes.test(attributeName)) attributeName = '_' + attributeName;
|
|
1089
|
+
|
|
791
1090
|
if (cache.attributes.has(this.getUID(attribute))) {
|
|
792
1091
|
attributes[attributeName] = cache.attributes.get(this.getUID(attribute));
|
|
793
1092
|
continue;
|
|
794
|
-
}
|
|
1093
|
+
} // JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT.
|
|
1094
|
+
|
|
1095
|
+
|
|
795
1096
|
modifiedAttribute = null;
|
|
796
1097
|
const array = attribute.array;
|
|
797
|
-
|
|
1098
|
+
|
|
1099
|
+
if (attributeName === 'JOINTS_0' && !(array instanceof Uint16Array) && !(array instanceof Uint8Array)) {
|
|
798
1100
|
console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.');
|
|
799
|
-
modifiedAttribute = new
|
|
1101
|
+
modifiedAttribute = new BufferAttribute(new Uint16Array(array), attribute.itemSize, attribute.normalized);
|
|
800
1102
|
}
|
|
1103
|
+
|
|
801
1104
|
const accessor = modifiedAttribute !== null && this.processAccessor(modifiedAttribute || attribute, geometry);
|
|
1105
|
+
|
|
802
1106
|
if (accessor) {
|
|
803
1107
|
attributes[attributeName] = accessor;
|
|
804
1108
|
cache.attributes.set(this.getUID(attribute), accessor);
|
|
805
1109
|
}
|
|
806
1110
|
}
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
1111
|
+
|
|
1112
|
+
if (originalNormal !== undefined) geometry.setAttribute('normal', originalNormal); // Skip if no exportable attributes found
|
|
1113
|
+
|
|
1114
|
+
if (Object.keys(attributes).length === 0) return null; // Morph targets
|
|
1115
|
+
|
|
1116
|
+
if (mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0) {
|
|
812
1117
|
const weights = [];
|
|
813
1118
|
const targetNames = [];
|
|
814
1119
|
const reverseDictionary = {};
|
|
815
|
-
|
|
1120
|
+
|
|
1121
|
+
if (mesh.morphTargetDictionary !== undefined) {
|
|
816
1122
|
for (const key in mesh.morphTargetDictionary) {
|
|
817
1123
|
reverseDictionary[mesh.morphTargetDictionary[key]] = key;
|
|
818
1124
|
}
|
|
819
1125
|
}
|
|
1126
|
+
|
|
820
1127
|
for (let i = 0; i < mesh.morphTargetInfluences.length; ++i) {
|
|
821
1128
|
const target = {};
|
|
822
1129
|
let warned = false;
|
|
1130
|
+
|
|
823
1131
|
for (const attributeName in geometry.morphAttributes) {
|
|
824
|
-
|
|
1132
|
+
// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.
|
|
1133
|
+
// Three.js doesn't support TANGENT yet.
|
|
1134
|
+
if (attributeName !== 'position' && attributeName !== 'normal') {
|
|
825
1135
|
if (!warned) {
|
|
826
|
-
console.warn(
|
|
1136
|
+
console.warn('GLTFExporter: Only POSITION and NORMAL morph are supported.');
|
|
827
1137
|
warned = true;
|
|
828
1138
|
}
|
|
1139
|
+
|
|
829
1140
|
continue;
|
|
830
1141
|
}
|
|
1142
|
+
|
|
831
1143
|
const attribute = geometry.morphAttributes[attributeName][i];
|
|
832
|
-
const gltfAttributeName = attributeName.toUpperCase();
|
|
1144
|
+
const gltfAttributeName = attributeName.toUpperCase(); // Three.js morph attribute has absolute values while the one of glTF has relative values.
|
|
1145
|
+
//
|
|
1146
|
+
// glTF 2.0 Specification:
|
|
1147
|
+
// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets
|
|
1148
|
+
|
|
833
1149
|
const baseAttribute = geometry.attributes[attributeName];
|
|
1150
|
+
|
|
834
1151
|
if (cache.attributes.has(this.getUID(attribute))) {
|
|
835
1152
|
target[gltfAttributeName] = cache.attributes.get(this.getUID(attribute));
|
|
836
1153
|
continue;
|
|
837
|
-
}
|
|
1154
|
+
} // Clones attribute not to override
|
|
1155
|
+
|
|
1156
|
+
|
|
838
1157
|
const relativeAttribute = attribute.clone();
|
|
1158
|
+
|
|
839
1159
|
if (!geometry.morphTargetsRelative) {
|
|
840
1160
|
for (let j = 0, jl = attribute.count; j < jl; j++) {
|
|
841
|
-
relativeAttribute.setXYZ(
|
|
842
|
-
j,
|
|
843
|
-
attribute.getX(j) - baseAttribute.getX(j),
|
|
844
|
-
attribute.getY(j) - baseAttribute.getY(j),
|
|
845
|
-
attribute.getZ(j) - baseAttribute.getZ(j)
|
|
846
|
-
);
|
|
1161
|
+
relativeAttribute.setXYZ(j, attribute.getX(j) - baseAttribute.getX(j), attribute.getY(j) - baseAttribute.getY(j), attribute.getZ(j) - baseAttribute.getZ(j));
|
|
847
1162
|
}
|
|
848
1163
|
}
|
|
1164
|
+
|
|
849
1165
|
const accessor = this.processAccessor(relativeAttribute, geometry);
|
|
850
|
-
|
|
1166
|
+
|
|
1167
|
+
if (accessor != undefined) {
|
|
851
1168
|
target[gltfAttributeName] = accessor;
|
|
852
1169
|
}
|
|
1170
|
+
|
|
853
1171
|
cache.attributes.set(this.getUID(baseAttribute), target[gltfAttributeName]);
|
|
854
1172
|
}
|
|
1173
|
+
|
|
855
1174
|
targets.push(target);
|
|
856
1175
|
weights.push(mesh.morphTargetInfluences[i]);
|
|
857
|
-
if (mesh.morphTargetDictionary !==
|
|
858
|
-
targetNames.push(reverseDictionary[i]);
|
|
1176
|
+
if (mesh.morphTargetDictionary !== undefined) targetNames.push(reverseDictionary[i]);
|
|
859
1177
|
}
|
|
1178
|
+
|
|
860
1179
|
meshDef.weights = weights;
|
|
1180
|
+
|
|
861
1181
|
if (targetNames.length > 0) {
|
|
862
1182
|
meshDef.extras = {};
|
|
863
1183
|
meshDef.extras.targetNames = targetNames;
|
|
864
1184
|
}
|
|
865
1185
|
}
|
|
1186
|
+
|
|
866
1187
|
const isMultiMaterial = Array.isArray(mesh.material);
|
|
867
|
-
if (isMultiMaterial && geometry.groups.length === 0)
|
|
868
|
-
return null;
|
|
1188
|
+
if (isMultiMaterial && geometry.groups.length === 0) return null;
|
|
869
1189
|
const materials = isMultiMaterial ? mesh.material : [mesh.material];
|
|
870
|
-
const groups = isMultiMaterial ? geometry.groups : [{
|
|
1190
|
+
const groups = isMultiMaterial ? geometry.groups : [{
|
|
1191
|
+
materialIndex: 0,
|
|
1192
|
+
start: undefined,
|
|
1193
|
+
count: undefined
|
|
1194
|
+
}];
|
|
1195
|
+
|
|
871
1196
|
for (let i = 0, il = groups.length; i < il; i++) {
|
|
872
1197
|
const primitive = {
|
|
873
|
-
mode,
|
|
874
|
-
attributes
|
|
1198
|
+
mode: mode,
|
|
1199
|
+
attributes: attributes
|
|
875
1200
|
};
|
|
876
|
-
|
|
1201
|
+
|
|
1202
|
+
if (geometry instanceof Object3D || geometry instanceof Material) {
|
|
877
1203
|
this.serializeUserData(geometry, primitive);
|
|
878
1204
|
}
|
|
879
|
-
|
|
880
|
-
|
|
1205
|
+
|
|
1206
|
+
if (targets.length > 0) primitive.targets = targets;
|
|
1207
|
+
|
|
881
1208
|
if (geometry.index !== null) {
|
|
882
1209
|
let cacheKey = this.getUID(geometry.index);
|
|
883
|
-
|
|
1210
|
+
|
|
1211
|
+
if (groups[i].start !== undefined || groups[i].count !== undefined) {
|
|
1212
|
+
// @ts-expect-error
|
|
884
1213
|
cacheKey += `:${groups[i].start}:${groups[i].count}`;
|
|
885
1214
|
}
|
|
1215
|
+
|
|
886
1216
|
if (cache.attributes.has(cacheKey)) {
|
|
887
1217
|
primitive.indices = cache.attributes.get(cacheKey);
|
|
888
1218
|
} else {
|
|
889
1219
|
primitive.indices = this.processAccessor(geometry.index, geometry, groups[i].start, groups[i].count);
|
|
890
1220
|
cache.attributes.set(cacheKey, primitive.indices);
|
|
891
1221
|
}
|
|
892
|
-
|
|
893
|
-
|
|
1222
|
+
|
|
1223
|
+
if (primitive.indices === null) delete primitive.indices;
|
|
894
1224
|
}
|
|
1225
|
+
|
|
895
1226
|
const materialIndex = groups[i].materialIndex;
|
|
896
|
-
|
|
1227
|
+
|
|
1228
|
+
if (materialIndex !== undefined && Array.isArray(materials)) {
|
|
897
1229
|
const targetMaterials = materials[materialIndex];
|
|
1230
|
+
|
|
898
1231
|
if (!Array.isArray(targetMaterials)) {
|
|
899
1232
|
const material = this.processMaterial(targetMaterials);
|
|
900
|
-
if (material !== null)
|
|
901
|
-
primitive.material = material;
|
|
1233
|
+
if (material !== null) primitive.material = material;
|
|
902
1234
|
primitives.push(primitive);
|
|
903
1235
|
}
|
|
904
1236
|
}
|
|
905
1237
|
}
|
|
1238
|
+
|
|
906
1239
|
meshDef.primitives = primitives;
|
|
907
|
-
if (!json.meshes)
|
|
908
|
-
|
|
909
|
-
this._invokeAll(function(ext) {
|
|
1240
|
+
if (!json.meshes) json.meshes = [];
|
|
1241
|
+
|
|
1242
|
+
this._invokeAll(function (ext) {
|
|
910
1243
|
ext.writeMesh && ext.writeMesh(mesh, meshDef);
|
|
911
1244
|
});
|
|
1245
|
+
|
|
912
1246
|
const index = json.meshes.push(meshDef) - 1;
|
|
913
1247
|
cache.meshes.set(meshCacheKey, index);
|
|
914
1248
|
return index;
|
|
915
1249
|
}
|
|
1250
|
+
/**
|
|
1251
|
+
* Process camera
|
|
1252
|
+
* @param {THREE.Camera} camera Camera to process
|
|
1253
|
+
* @return {Integer} Index of the processed mesh in the "camera" array
|
|
1254
|
+
*/
|
|
1255
|
+
|
|
1256
|
+
|
|
916
1257
|
processCamera(camera) {
|
|
917
1258
|
const json = this.json;
|
|
918
|
-
if (!json.cameras)
|
|
919
|
-
|
|
920
|
-
const isOrtho = camera instanceof THREE.OrthographicCamera && camera.isOrthographicCamera;
|
|
1259
|
+
if (!json.cameras) json.cameras = [];
|
|
1260
|
+
const isOrtho = camera instanceof OrthographicCamera && camera.isOrthographicCamera;
|
|
921
1261
|
const cameraDef = {
|
|
922
|
-
type: isOrtho ?
|
|
1262
|
+
type: isOrtho ? 'orthographic' : 'perspective'
|
|
923
1263
|
};
|
|
924
|
-
|
|
1264
|
+
|
|
1265
|
+
if (camera instanceof OrthographicCamera && isOrtho) {
|
|
925
1266
|
cameraDef.orthographic = {
|
|
926
1267
|
xmag: camera.right * 2,
|
|
927
1268
|
ymag: camera.top * 2,
|
|
928
|
-
zfar: camera.far <= 0 ?
|
|
1269
|
+
zfar: camera.far <= 0 ? 0.001 : camera.far,
|
|
929
1270
|
znear: camera.near < 0 ? 0 : camera.near
|
|
930
1271
|
};
|
|
931
|
-
} else if (camera instanceof
|
|
1272
|
+
} else if (camera instanceof PerspectiveCamera) {
|
|
932
1273
|
cameraDef.perspective = {
|
|
933
1274
|
aspectRatio: camera.aspect,
|
|
934
|
-
yfov:
|
|
935
|
-
zfar: camera.far <= 0 ?
|
|
1275
|
+
yfov: MathUtils.degToRad(camera.fov),
|
|
1276
|
+
zfar: camera.far <= 0 ? 0.001 : camera.far,
|
|
936
1277
|
znear: camera.near < 0 ? 0 : camera.near
|
|
937
1278
|
};
|
|
938
|
-
}
|
|
939
|
-
|
|
940
|
-
|
|
1279
|
+
} // Question: Is saving "type" as name intentional?
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
if (camera.name !== '') cameraDef.name = camera.type;
|
|
941
1283
|
return json.cameras.push(cameraDef) - 1;
|
|
942
1284
|
}
|
|
1285
|
+
/**
|
|
1286
|
+
* Creates glTF animation entry from AnimationClip object.
|
|
1287
|
+
*
|
|
1288
|
+
* Status:
|
|
1289
|
+
* - Only properties listed in PATH_PROPERTIES may be animated.
|
|
1290
|
+
*
|
|
1291
|
+
* @param {THREE.AnimationClip} clip
|
|
1292
|
+
* @param {THREE.Object3D} root
|
|
1293
|
+
* @return {number|null}
|
|
1294
|
+
*/
|
|
1295
|
+
|
|
1296
|
+
|
|
943
1297
|
processAnimation(clip, root) {
|
|
944
1298
|
const json = this.json;
|
|
945
1299
|
const nodeMap = this.nodeMap;
|
|
946
|
-
if (!json.animations)
|
|
947
|
-
json.animations = [];
|
|
1300
|
+
if (!json.animations) json.animations = [];
|
|
948
1301
|
clip = GLTFExporter.Utils.mergeMorphTargetTracks(clip.clone(), root);
|
|
949
1302
|
const tracks = clip.tracks;
|
|
950
1303
|
const channels = [];
|
|
951
1304
|
const samplers = [];
|
|
1305
|
+
|
|
952
1306
|
for (let i = 0; i < tracks.length; ++i) {
|
|
953
1307
|
const track = tracks[i];
|
|
954
|
-
const trackBinding =
|
|
955
|
-
let trackNode =
|
|
1308
|
+
const trackBinding = PropertyBinding.parseTrackName(track.name);
|
|
1309
|
+
let trackNode = PropertyBinding.findNode(root, trackBinding.nodeName);
|
|
956
1310
|
const trackProperty = PATH_PROPERTIES[trackBinding.propertyName];
|
|
957
|
-
|
|
1311
|
+
|
|
1312
|
+
if (trackBinding.objectName === 'bones') {
|
|
958
1313
|
if (trackNode.isSkinnedMesh) {
|
|
959
1314
|
trackNode = trackNode.skeleton.getBoneByName(trackBinding.objectIndex);
|
|
960
1315
|
} else {
|
|
961
|
-
trackNode =
|
|
1316
|
+
trackNode = undefined;
|
|
962
1317
|
}
|
|
963
1318
|
}
|
|
1319
|
+
|
|
964
1320
|
if (!trackNode || !trackProperty) {
|
|
965
1321
|
console.warn('THREE.GLTFExporter: Could not export animation track "%s".', track.name);
|
|
966
1322
|
return null;
|
|
967
1323
|
}
|
|
1324
|
+
|
|
968
1325
|
const inputItemSize = 1;
|
|
969
1326
|
let outputItemSize = track.values.length / track.times.length;
|
|
1327
|
+
|
|
970
1328
|
if (trackProperty === PATH_PROPERTIES.morphTargetInfluences) {
|
|
971
1329
|
outputItemSize /= trackNode.morphTargetInfluences.length;
|
|
972
1330
|
}
|
|
973
|
-
|
|
1331
|
+
|
|
1332
|
+
let interpolation; // @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE
|
|
1333
|
+
// Detecting glTF cubic spline interpolant by checking factory method's special property
|
|
1334
|
+
// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return
|
|
1335
|
+
// valid value from .getInterpolation().
|
|
1336
|
+
// @ts-expect-error
|
|
1337
|
+
|
|
974
1338
|
if (track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) {
|
|
975
|
-
interpolation =
|
|
1339
|
+
interpolation = 'CUBICSPLINE'; // itemSize of CUBICSPLINE keyframe is 9
|
|
1340
|
+
// (VEC3 * 3: inTangent, splineVertex, and outTangent)
|
|
1341
|
+
// but needs to be stored as VEC3 so dividing by 3 here.
|
|
1342
|
+
|
|
976
1343
|
outputItemSize /= 3;
|
|
977
|
-
} else if (track.getInterpolation() ===
|
|
978
|
-
interpolation =
|
|
1344
|
+
} else if (track.getInterpolation() === InterpolateDiscrete) {
|
|
1345
|
+
interpolation = 'STEP';
|
|
979
1346
|
} else {
|
|
980
|
-
interpolation =
|
|
1347
|
+
interpolation = 'LINEAR';
|
|
981
1348
|
}
|
|
1349
|
+
|
|
982
1350
|
samplers.push({
|
|
983
|
-
input: this.processAccessor(new
|
|
984
|
-
output: this.processAccessor(new
|
|
985
|
-
interpolation
|
|
1351
|
+
input: this.processAccessor(new BufferAttribute(track.times, inputItemSize)),
|
|
1352
|
+
output: this.processAccessor(new BufferAttribute(track.values, outputItemSize)),
|
|
1353
|
+
interpolation: interpolation
|
|
986
1354
|
});
|
|
987
1355
|
channels.push({
|
|
988
1356
|
sampler: samplers.length - 1,
|
|
@@ -992,37 +1360,44 @@ class GLTFWriter {
|
|
|
992
1360
|
}
|
|
993
1361
|
});
|
|
994
1362
|
}
|
|
1363
|
+
|
|
995
1364
|
json.animations.push({
|
|
996
|
-
name: clip.name ||
|
|
997
|
-
samplers,
|
|
998
|
-
channels
|
|
1365
|
+
name: clip.name || 'clip_' + json.animations.length,
|
|
1366
|
+
samplers: samplers,
|
|
1367
|
+
channels: channels
|
|
999
1368
|
});
|
|
1000
1369
|
return json.animations.length - 1;
|
|
1001
1370
|
}
|
|
1371
|
+
/**
|
|
1372
|
+
* @param {THREE.Object3D} object
|
|
1373
|
+
* @return {number|null}
|
|
1374
|
+
*/
|
|
1375
|
+
|
|
1376
|
+
|
|
1002
1377
|
processSkin(object) {
|
|
1003
1378
|
const json = this.json;
|
|
1004
1379
|
const nodeMap = this.nodeMap;
|
|
1005
|
-
|
|
1380
|
+
|
|
1381
|
+
if (json.nodes !== undefined && object instanceof SkinnedMesh) {
|
|
1006
1382
|
const node = json.nodes[nodeMap.get(object)];
|
|
1007
1383
|
const skeleton = object.skeleton;
|
|
1008
|
-
if (skeleton ===
|
|
1009
|
-
return null;
|
|
1384
|
+
if (skeleton === undefined) return null;
|
|
1010
1385
|
const rootJoint = object.skeleton.bones[0];
|
|
1011
|
-
if (rootJoint ===
|
|
1012
|
-
return null;
|
|
1386
|
+
if (rootJoint === undefined) return null;
|
|
1013
1387
|
const joints = [];
|
|
1014
1388
|
const inverseBindMatrices = new Float32Array(skeleton.bones.length * 16);
|
|
1015
|
-
const temporaryBoneInverse = new
|
|
1389
|
+
const temporaryBoneInverse = new Matrix4();
|
|
1390
|
+
|
|
1016
1391
|
for (let i = 0; i < skeleton.bones.length; ++i) {
|
|
1017
1392
|
joints.push(nodeMap.get(skeleton.bones[i]));
|
|
1018
1393
|
temporaryBoneInverse.copy(skeleton.boneInverses[i]);
|
|
1019
1394
|
temporaryBoneInverse.multiply(object.bindMatrix).toArray(inverseBindMatrices, i * 16);
|
|
1020
1395
|
}
|
|
1021
|
-
|
|
1022
|
-
|
|
1396
|
+
|
|
1397
|
+
if (json.skins === undefined) json.skins = [];
|
|
1023
1398
|
json.skins.push({
|
|
1024
|
-
inverseBindMatrices: this.processAccessor(new
|
|
1025
|
-
joints,
|
|
1399
|
+
inverseBindMatrices: this.processAccessor(new BufferAttribute(inverseBindMatrices, 16)),
|
|
1400
|
+
joints: joints,
|
|
1026
1401
|
skeleton: nodeMap.get(rootJoint)
|
|
1027
1402
|
});
|
|
1028
1403
|
const skinIndex = node.skin = json.skins.length - 1;
|
|
@@ -1031,23 +1406,33 @@ class GLTFWriter {
|
|
|
1031
1406
|
return null;
|
|
1032
1407
|
}
|
|
1033
1408
|
}
|
|
1409
|
+
/**
|
|
1410
|
+
* Process Object3D node
|
|
1411
|
+
* @param {THREE.Object3D} node Object3D to processNode
|
|
1412
|
+
* @return {Integer} Index of the node in the nodes list
|
|
1413
|
+
*/
|
|
1414
|
+
|
|
1415
|
+
|
|
1034
1416
|
processNode(object) {
|
|
1035
1417
|
const json = this.json;
|
|
1036
1418
|
const options = this.options;
|
|
1037
1419
|
const nodeMap = this.nodeMap;
|
|
1038
|
-
if (!json.nodes)
|
|
1039
|
-
json.nodes = [];
|
|
1420
|
+
if (!json.nodes) json.nodes = [];
|
|
1040
1421
|
const nodeDef = {};
|
|
1422
|
+
|
|
1041
1423
|
if (options.trs) {
|
|
1042
1424
|
const rotation = object.quaternion.toArray();
|
|
1043
1425
|
const position = object.position.toArray();
|
|
1044
1426
|
const scale = object.scale.toArray();
|
|
1427
|
+
|
|
1045
1428
|
if (!this.equalArray(rotation, [0, 0, 0, 1])) {
|
|
1046
1429
|
nodeDef.rotation = rotation;
|
|
1047
1430
|
}
|
|
1431
|
+
|
|
1048
1432
|
if (!this.equalArray(position, [0, 0, 0])) {
|
|
1049
1433
|
nodeDef.translation = position;
|
|
1050
1434
|
}
|
|
1435
|
+
|
|
1051
1436
|
if (!this.equalArray(scale, [1, 1, 1])) {
|
|
1052
1437
|
nodeDef.scale = scale;
|
|
1053
1438
|
}
|
|
@@ -1055,315 +1440,477 @@ class GLTFWriter {
|
|
|
1055
1440
|
if (object.matrixAutoUpdate) {
|
|
1056
1441
|
object.updateMatrix();
|
|
1057
1442
|
}
|
|
1443
|
+
|
|
1058
1444
|
if (!this.isIdentityMatrix(object.matrix)) {
|
|
1059
1445
|
nodeDef.matrix = object.matrix.elements;
|
|
1060
1446
|
}
|
|
1061
|
-
}
|
|
1062
|
-
|
|
1063
|
-
|
|
1447
|
+
} // We don't export empty strings name because it represents no-name in Three.js.
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
if (object.name !== '') nodeDef.name = String(object.name);
|
|
1064
1451
|
this.serializeUserData(object, nodeDef);
|
|
1065
|
-
|
|
1452
|
+
|
|
1453
|
+
if ((object instanceof Mesh && object.isMesh || object instanceof Line && object.isLine || object instanceof Points && object.isPoints) && object instanceof Mesh) {
|
|
1066
1454
|
const meshIndex = this.processMesh(object);
|
|
1067
|
-
if (meshIndex !== null)
|
|
1068
|
-
|
|
1069
|
-
} else if (object instanceof THREE.Camera && object.isCamera) {
|
|
1455
|
+
if (meshIndex !== null) nodeDef.mesh = meshIndex;
|
|
1456
|
+
} else if (object instanceof Camera && object.isCamera) {
|
|
1070
1457
|
nodeDef.camera = this.processCamera(object);
|
|
1071
1458
|
}
|
|
1072
|
-
|
|
1073
|
-
|
|
1459
|
+
|
|
1460
|
+
if (object instanceof SkinnedMesh && object.isSkinnedMesh) this.skins.push(object);
|
|
1461
|
+
|
|
1074
1462
|
if (object.children.length > 0) {
|
|
1075
1463
|
const children = [];
|
|
1464
|
+
|
|
1076
1465
|
for (let i = 0, l = object.children.length; i < l; i++) {
|
|
1077
1466
|
const child = object.children[i];
|
|
1467
|
+
|
|
1078
1468
|
if (child.visible || !options.onlyVisible) {
|
|
1079
|
-
const
|
|
1080
|
-
if (
|
|
1081
|
-
children.push(nodeIndex2);
|
|
1469
|
+
const nodeIndex = this.processNode(child);
|
|
1470
|
+
if (nodeIndex !== null) children.push(nodeIndex);
|
|
1082
1471
|
}
|
|
1083
1472
|
}
|
|
1084
|
-
|
|
1085
|
-
|
|
1473
|
+
|
|
1474
|
+
if (children.length > 0) nodeDef.children = children;
|
|
1086
1475
|
}
|
|
1087
|
-
|
|
1476
|
+
|
|
1477
|
+
this._invokeAll(function (ext) {
|
|
1088
1478
|
ext.writeNode && ext.writeNode(object, nodeDef);
|
|
1089
1479
|
});
|
|
1480
|
+
|
|
1090
1481
|
const nodeIndex = json.nodes.push(nodeDef) - 1;
|
|
1091
1482
|
nodeMap.set(object, nodeIndex);
|
|
1092
1483
|
return nodeIndex;
|
|
1093
1484
|
}
|
|
1485
|
+
/**
|
|
1486
|
+
* Process Scene
|
|
1487
|
+
* @param {Scene} node Scene to process
|
|
1488
|
+
*/
|
|
1489
|
+
|
|
1490
|
+
|
|
1094
1491
|
processScene(scene) {
|
|
1095
1492
|
const json = this.json;
|
|
1096
1493
|
const options = this.options;
|
|
1494
|
+
|
|
1097
1495
|
if (!json.scenes) {
|
|
1098
1496
|
json.scenes = [];
|
|
1099
1497
|
json.scene = 0;
|
|
1100
1498
|
}
|
|
1499
|
+
|
|
1101
1500
|
const sceneDef = {};
|
|
1102
|
-
if (scene.name !==
|
|
1103
|
-
sceneDef.name = scene.name;
|
|
1501
|
+
if (scene.name !== '') sceneDef.name = scene.name;
|
|
1104
1502
|
json.scenes.push(sceneDef);
|
|
1105
1503
|
const nodes = [];
|
|
1504
|
+
|
|
1106
1505
|
for (let i = 0, l = scene.children.length; i < l; i++) {
|
|
1107
1506
|
const child = scene.children[i];
|
|
1507
|
+
|
|
1108
1508
|
if (child.visible || !options.onlyVisible) {
|
|
1109
1509
|
const nodeIndex = this.processNode(child);
|
|
1110
|
-
if (nodeIndex !== null)
|
|
1111
|
-
nodes.push(nodeIndex);
|
|
1510
|
+
if (nodeIndex !== null) nodes.push(nodeIndex);
|
|
1112
1511
|
}
|
|
1113
1512
|
}
|
|
1114
|
-
|
|
1115
|
-
|
|
1513
|
+
|
|
1514
|
+
if (nodes.length > 0) sceneDef.nodes = nodes;
|
|
1116
1515
|
this.serializeUserData(scene, sceneDef);
|
|
1117
1516
|
}
|
|
1517
|
+
|
|
1118
1518
|
processObjects(objects) {
|
|
1119
|
-
const scene = new
|
|
1120
|
-
scene.name =
|
|
1519
|
+
const scene = new Scene();
|
|
1520
|
+
scene.name = 'AuxScene';
|
|
1521
|
+
|
|
1121
1522
|
for (let i = 0; i < objects.length; i++) {
|
|
1523
|
+
// We push directly to children instead of calling `add` to prevent
|
|
1524
|
+
// modify the .parent and break its original scene and hierarchy
|
|
1122
1525
|
scene.children.push(objects[i]);
|
|
1123
1526
|
}
|
|
1527
|
+
|
|
1124
1528
|
this.processScene(scene);
|
|
1125
1529
|
}
|
|
1530
|
+
/**
|
|
1531
|
+
* @param {THREE.Object3D|Array<THREE.Object3D>} input
|
|
1532
|
+
*/
|
|
1533
|
+
|
|
1534
|
+
|
|
1126
1535
|
processInput(input) {
|
|
1127
1536
|
const options = this.options;
|
|
1128
1537
|
input = input instanceof Array ? input : [input];
|
|
1129
|
-
|
|
1538
|
+
|
|
1539
|
+
this._invokeAll(function (ext) {
|
|
1130
1540
|
ext.beforeParse && ext.beforeParse(input);
|
|
1131
1541
|
});
|
|
1542
|
+
|
|
1132
1543
|
const objectsWithoutScene = [];
|
|
1544
|
+
|
|
1133
1545
|
for (let i = 0; i < input.length; i++) {
|
|
1134
1546
|
const inputScene = input[i];
|
|
1135
|
-
|
|
1547
|
+
|
|
1548
|
+
if (inputScene instanceof Scene) {
|
|
1136
1549
|
this.processScene(inputScene);
|
|
1137
1550
|
} else {
|
|
1138
1551
|
objectsWithoutScene.push(input[i]);
|
|
1139
1552
|
}
|
|
1140
1553
|
}
|
|
1141
|
-
|
|
1142
|
-
|
|
1554
|
+
|
|
1555
|
+
if (objectsWithoutScene.length > 0) this.processObjects(objectsWithoutScene);
|
|
1556
|
+
|
|
1143
1557
|
for (let i = 0; i < this.skins.length; ++i) {
|
|
1144
1558
|
this.processSkin(this.skins[i]);
|
|
1145
1559
|
}
|
|
1146
|
-
|
|
1560
|
+
|
|
1561
|
+
for (let i = 0; options.animations !== undefined && i < options.animations.length; ++i) {
|
|
1147
1562
|
this.processAnimation(options.animations[i], input[0]);
|
|
1148
1563
|
}
|
|
1149
|
-
|
|
1564
|
+
|
|
1565
|
+
this._invokeAll(function (ext) {
|
|
1150
1566
|
ext.afterParse && ext.afterParse(input);
|
|
1151
1567
|
});
|
|
1152
1568
|
}
|
|
1569
|
+
|
|
1153
1570
|
_invokeAll(func) {
|
|
1154
1571
|
for (let i = 0, il = this.plugins.length; i < il; i++) {
|
|
1155
1572
|
func(this.plugins[i]);
|
|
1156
1573
|
}
|
|
1157
|
-
}
|
|
1574
|
+
} //------------------------------------------------------------------------------
|
|
1575
|
+
// Utility functions
|
|
1576
|
+
//------------------------------------------------------------------------------
|
|
1577
|
+
|
|
1578
|
+
/**
|
|
1579
|
+
* Compare two arrays
|
|
1580
|
+
* @param {Array} array1 Array 1 to compare
|
|
1581
|
+
* @param {Array} array2 Array 2 to compare
|
|
1582
|
+
* @return {Boolean} Returns true if both arrays are equal
|
|
1583
|
+
*/
|
|
1584
|
+
|
|
1585
|
+
|
|
1158
1586
|
equalArray(array1, array2) {
|
|
1159
|
-
return array1.length === array2.length && array1.every(function(element, index) {
|
|
1587
|
+
return array1.length === array2.length && array1.every(function (element, index) {
|
|
1160
1588
|
return element === array2[index];
|
|
1161
1589
|
});
|
|
1162
1590
|
}
|
|
1591
|
+
/**
|
|
1592
|
+
* Converts a string to an ArrayBuffer.
|
|
1593
|
+
* @param {string} text
|
|
1594
|
+
* @return {ArrayBuffer}
|
|
1595
|
+
*/
|
|
1596
|
+
|
|
1597
|
+
|
|
1163
1598
|
stringToArrayBuffer(text) {
|
|
1164
|
-
if (window.TextEncoder !==
|
|
1599
|
+
if (window.TextEncoder !== undefined) {
|
|
1165
1600
|
return new TextEncoder().encode(text).buffer;
|
|
1166
1601
|
}
|
|
1602
|
+
|
|
1167
1603
|
const array = new Uint8Array(new ArrayBuffer(text.length));
|
|
1604
|
+
|
|
1168
1605
|
for (let i = 0, il = text.length; i < il; i++) {
|
|
1169
|
-
const value = text.charCodeAt(i);
|
|
1170
|
-
|
|
1606
|
+
const value = text.charCodeAt(i); // Replacing multi-byte character with space(0x20).
|
|
1607
|
+
|
|
1608
|
+
array[i] = value > 0xff ? 0x20 : value;
|
|
1171
1609
|
}
|
|
1610
|
+
|
|
1172
1611
|
return array.buffer;
|
|
1173
1612
|
}
|
|
1613
|
+
|
|
1174
1614
|
isIdentityMatrix(matrix) {
|
|
1175
1615
|
return this.equalArray(matrix.elements, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
1176
1616
|
}
|
|
1617
|
+
|
|
1177
1618
|
getMinMax(attribute, start, count) {
|
|
1178
1619
|
const output = {
|
|
1179
1620
|
min: new Array(attribute.itemSize).fill(Number.POSITIVE_INFINITY),
|
|
1180
1621
|
max: new Array(attribute.itemSize).fill(Number.NEGATIVE_INFINITY)
|
|
1181
1622
|
};
|
|
1623
|
+
|
|
1182
1624
|
for (let i = start; i < start + count; i++) {
|
|
1183
1625
|
for (let a = 0; a < attribute.itemSize; a++) {
|
|
1184
1626
|
let value;
|
|
1627
|
+
|
|
1185
1628
|
if (attribute.itemSize > 4) {
|
|
1629
|
+
// no support for interleaved data for itemSize > 4
|
|
1186
1630
|
value = attribute.array[i * attribute.itemSize + a];
|
|
1187
1631
|
} else {
|
|
1188
|
-
if (a === 0)
|
|
1189
|
-
value = attribute.getX(i);
|
|
1190
|
-
else if (a === 1)
|
|
1191
|
-
value = attribute.getY(i);
|
|
1192
|
-
else if (a === 2)
|
|
1193
|
-
value = attribute.getZ(i);
|
|
1194
|
-
else if (a === 3)
|
|
1195
|
-
value = attribute.getW(i);
|
|
1632
|
+
if (a === 0) value = attribute.getX(i);else if (a === 1) value = attribute.getY(i);else if (a === 2) value = attribute.getZ(i);else if (a === 3) value = attribute.getW(i);
|
|
1196
1633
|
}
|
|
1197
|
-
|
|
1634
|
+
|
|
1635
|
+
if (value !== undefined) {
|
|
1198
1636
|
output.min[a] = Math.min(output.min[a], value);
|
|
1199
1637
|
output.max[a] = Math.max(output.max[a], value);
|
|
1200
1638
|
}
|
|
1201
1639
|
}
|
|
1202
1640
|
}
|
|
1641
|
+
|
|
1203
1642
|
return output;
|
|
1204
1643
|
}
|
|
1644
|
+
/**
|
|
1645
|
+
* Get the required size + padding for a buffer, rounded to the next 4-byte boundary.
|
|
1646
|
+
* https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment
|
|
1647
|
+
*/
|
|
1648
|
+
|
|
1649
|
+
|
|
1205
1650
|
getPaddedBufferSize(bufferSize) {
|
|
1206
1651
|
return Math.ceil(bufferSize / 4) * 4;
|
|
1207
1652
|
}
|
|
1653
|
+
/**
|
|
1654
|
+
* Returns a buffer aligned to 4-byte boundary.
|
|
1655
|
+
*
|
|
1656
|
+
* @param {ArrayBuffer} arrayBuffer Buffer to pad
|
|
1657
|
+
* @param {Integer} paddingByte (Optional)
|
|
1658
|
+
* @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer
|
|
1659
|
+
*/
|
|
1660
|
+
|
|
1661
|
+
|
|
1208
1662
|
getPaddedArrayBuffer(arrayBuffer, paddingByte = 0) {
|
|
1209
1663
|
const paddedLength = this.getPaddedBufferSize(arrayBuffer.byteLength);
|
|
1664
|
+
|
|
1210
1665
|
if (paddedLength !== arrayBuffer.byteLength) {
|
|
1211
1666
|
const array = new Uint8Array(paddedLength);
|
|
1212
1667
|
array.set(new Uint8Array(arrayBuffer));
|
|
1668
|
+
|
|
1213
1669
|
if (paddingByte !== 0) {
|
|
1214
1670
|
for (let i = arrayBuffer.byteLength; i < paddedLength; i++) {
|
|
1215
1671
|
array[i] = paddingByte;
|
|
1216
1672
|
}
|
|
1217
1673
|
}
|
|
1674
|
+
|
|
1218
1675
|
return array.buffer;
|
|
1219
1676
|
}
|
|
1677
|
+
|
|
1220
1678
|
return arrayBuffer;
|
|
1221
1679
|
}
|
|
1680
|
+
|
|
1222
1681
|
}
|
|
1682
|
+
/**
|
|
1683
|
+
* Punctual Lights Extension
|
|
1684
|
+
*
|
|
1685
|
+
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual
|
|
1686
|
+
*/
|
|
1687
|
+
|
|
1688
|
+
|
|
1223
1689
|
class GLTFLightExtension {
|
|
1224
1690
|
constructor(writer) {
|
|
1691
|
+
_defineProperty(this, "writer", void 0);
|
|
1692
|
+
|
|
1693
|
+
_defineProperty(this, "name", void 0);
|
|
1694
|
+
|
|
1225
1695
|
this.writer = writer;
|
|
1226
|
-
this.name =
|
|
1696
|
+
this.name = 'KHR_lights_punctual';
|
|
1227
1697
|
}
|
|
1698
|
+
|
|
1228
1699
|
writeNode(light, nodeDef) {
|
|
1229
|
-
if (!light.isLight)
|
|
1230
|
-
|
|
1231
|
-
if (!(light instanceof
|
|
1232
|
-
|
|
1700
|
+
if (!light.isLight) return;
|
|
1701
|
+
|
|
1702
|
+
if (!(light instanceof DirectionalLight && light.isDirectionalLight) && // @ts-expect-error
|
|
1703
|
+
!(light instanceof PointLight && light.isPointLight) && !(light instanceof SpotLight && light.isSpotLight)) {
|
|
1704
|
+
console.warn('THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light);
|
|
1233
1705
|
return;
|
|
1234
1706
|
}
|
|
1707
|
+
|
|
1235
1708
|
const writer = this.writer;
|
|
1236
1709
|
const json = writer.json;
|
|
1237
1710
|
const extensionsUsed = writer.extensionsUsed;
|
|
1238
1711
|
const lightDef = {};
|
|
1239
|
-
if (light.name)
|
|
1240
|
-
lightDef.name = light.name;
|
|
1712
|
+
if (light.name) lightDef.name = light.name;
|
|
1241
1713
|
lightDef.color = light.color.toArray();
|
|
1242
1714
|
lightDef.intensity = light.intensity;
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1715
|
+
|
|
1716
|
+
if (light instanceof DirectionalLight && light.isDirectionalLight) {
|
|
1717
|
+
lightDef.type = 'directional';
|
|
1718
|
+
} else if (light instanceof PointLight && // @ts-expect-error
|
|
1719
|
+
light.isPointLight) {
|
|
1720
|
+
lightDef.type = 'point';
|
|
1721
|
+
if (light.distance > 0) lightDef.range = light.distance;
|
|
1722
|
+
} else if (light instanceof SpotLight && light.isSpotLight) {
|
|
1723
|
+
lightDef.type = 'spot';
|
|
1724
|
+
if (light.distance > 0) lightDef.range = light.distance;
|
|
1253
1725
|
lightDef.spot = {};
|
|
1254
|
-
lightDef.spot.innerConeAngle = (light.penumbra - 1) * light.angle * -1;
|
|
1726
|
+
lightDef.spot.innerConeAngle = (light.penumbra - 1.0) * light.angle * -1.0;
|
|
1255
1727
|
lightDef.spot.outerConeAngle = light.angle;
|
|
1256
1728
|
}
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
);
|
|
1729
|
+
|
|
1730
|
+
if (!(light instanceof DirectionalLight) && light.decay !== undefined && light.decay !== 2) {
|
|
1731
|
+
console.warn('THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, ' + 'and expects light.decay=2.');
|
|
1261
1732
|
}
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
);
|
|
1733
|
+
|
|
1734
|
+
if (!(light instanceof PointLight) && light.target && (light.target.parent !== light || light.target.position.x !== 0 || light.target.position.y !== 0 || light.target.position.z !== -1)) {
|
|
1735
|
+
console.warn('THREE.GLTFExporter: Light direction may be lost. For best results, ' + 'make light.target a child of the light with position 0,0,-1.');
|
|
1266
1736
|
}
|
|
1737
|
+
|
|
1267
1738
|
if (!extensionsUsed[this.name]) {
|
|
1268
1739
|
json.extensions = json.extensions || {};
|
|
1269
|
-
json.extensions[this.name] = {
|
|
1740
|
+
json.extensions[this.name] = {
|
|
1741
|
+
lights: []
|
|
1742
|
+
};
|
|
1270
1743
|
extensionsUsed[this.name] = true;
|
|
1271
1744
|
}
|
|
1272
|
-
|
|
1745
|
+
|
|
1746
|
+
if (json.extensions !== undefined) {
|
|
1273
1747
|
const lights = json.extensions[this.name].lights;
|
|
1274
1748
|
lights.push(lightDef);
|
|
1275
1749
|
nodeDef.extensions = nodeDef.extensions || {};
|
|
1276
|
-
nodeDef.extensions[this.name] = {
|
|
1750
|
+
nodeDef.extensions[this.name] = {
|
|
1751
|
+
light: lights.length - 1
|
|
1752
|
+
};
|
|
1277
1753
|
}
|
|
1278
1754
|
}
|
|
1755
|
+
|
|
1279
1756
|
}
|
|
1757
|
+
/**
|
|
1758
|
+
* Unlit Materials Extension
|
|
1759
|
+
*
|
|
1760
|
+
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit
|
|
1761
|
+
*/
|
|
1762
|
+
|
|
1763
|
+
|
|
1280
1764
|
class GLTFMaterialsUnlitExtension {
|
|
1281
1765
|
constructor(writer) {
|
|
1766
|
+
_defineProperty(this, "writer", void 0);
|
|
1767
|
+
|
|
1768
|
+
_defineProperty(this, "name", void 0);
|
|
1769
|
+
|
|
1282
1770
|
this.writer = writer;
|
|
1283
|
-
this.name =
|
|
1771
|
+
this.name = 'KHR_materials_unlit';
|
|
1284
1772
|
}
|
|
1773
|
+
|
|
1285
1774
|
writeMaterial(material, materialDef) {
|
|
1286
|
-
if (!(material instanceof
|
|
1775
|
+
if (!(material instanceof MeshBasicMaterial && // @ts-expect-error
|
|
1776
|
+
material.isMeshBasicMaterial)) {
|
|
1287
1777
|
return;
|
|
1288
1778
|
}
|
|
1779
|
+
|
|
1289
1780
|
const writer = this.writer;
|
|
1290
1781
|
const extensionsUsed = writer.extensionsUsed;
|
|
1291
1782
|
materialDef.extensions = materialDef.extensions || {};
|
|
1292
1783
|
materialDef.extensions[this.name] = {};
|
|
1293
1784
|
extensionsUsed[this.name] = true;
|
|
1294
|
-
materialDef.pbrMetallicRoughness.metallicFactor = 0;
|
|
1785
|
+
materialDef.pbrMetallicRoughness.metallicFactor = 0.0;
|
|
1295
1786
|
materialDef.pbrMetallicRoughness.roughnessFactor = 0.9;
|
|
1296
1787
|
}
|
|
1788
|
+
|
|
1297
1789
|
}
|
|
1790
|
+
/**
|
|
1791
|
+
* Specular-Glossiness Extension
|
|
1792
|
+
*
|
|
1793
|
+
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness
|
|
1794
|
+
*/
|
|
1795
|
+
|
|
1796
|
+
|
|
1298
1797
|
class GLTFMaterialsPBRSpecularGlossiness {
|
|
1299
1798
|
constructor(writer) {
|
|
1799
|
+
_defineProperty(this, "writer", void 0);
|
|
1800
|
+
|
|
1801
|
+
_defineProperty(this, "name", void 0);
|
|
1802
|
+
|
|
1300
1803
|
this.writer = writer;
|
|
1301
|
-
this.name =
|
|
1804
|
+
this.name = 'KHR_materials_pbrSpecularGlossiness';
|
|
1302
1805
|
}
|
|
1806
|
+
|
|
1303
1807
|
writeMaterial(material, materialDef) {
|
|
1304
|
-
|
|
1305
|
-
|
|
1808
|
+
// @ts-expect-error
|
|
1809
|
+
if (!material.isGLTFSpecularGlossinessMaterial) return;
|
|
1306
1810
|
const writer = this.writer;
|
|
1307
1811
|
const extensionsUsed = writer.extensionsUsed;
|
|
1308
1812
|
const extensionDef = {};
|
|
1813
|
+
|
|
1309
1814
|
if (materialDef.pbrMetallicRoughness.baseColorFactor) {
|
|
1310
1815
|
extensionDef.diffuseFactor = materialDef.pbrMetallicRoughness.baseColorFactor;
|
|
1311
1816
|
}
|
|
1312
|
-
|
|
1817
|
+
|
|
1818
|
+
if (material instanceof MeshPhongMaterial) {
|
|
1313
1819
|
const specularFactor = [1, 1, 1];
|
|
1314
1820
|
material.specular.toArray(specularFactor, 0);
|
|
1315
1821
|
extensionDef.specularFactor = specularFactor;
|
|
1316
|
-
extensionDef.glossinessFactor =
|
|
1822
|
+
extensionDef.glossinessFactor = // @ts-expect-error
|
|
1823
|
+
material.glossiness;
|
|
1317
1824
|
}
|
|
1825
|
+
|
|
1318
1826
|
if (materialDef.pbrMetallicRoughness.baseColorTexture) {
|
|
1319
1827
|
extensionDef.diffuseTexture = materialDef.pbrMetallicRoughness.baseColorTexture;
|
|
1320
1828
|
}
|
|
1321
|
-
|
|
1322
|
-
|
|
1829
|
+
|
|
1830
|
+
if ((material instanceof MeshBasicMaterial || material instanceof MeshLambertMaterial || material instanceof MeshPhongMaterial) && material.specularMap) {
|
|
1831
|
+
const specularMapDef = {
|
|
1832
|
+
index: writer.processTexture(material.specularMap)
|
|
1833
|
+
};
|
|
1323
1834
|
writer.applyTextureTransform(specularMapDef, material.specularMap);
|
|
1324
1835
|
extensionDef.specularGlossinessTexture = specularMapDef;
|
|
1325
1836
|
}
|
|
1837
|
+
|
|
1326
1838
|
materialDef.extensions = materialDef.extensions || {};
|
|
1327
1839
|
materialDef.extensions[this.name] = extensionDef;
|
|
1328
1840
|
extensionsUsed[this.name] = true;
|
|
1329
1841
|
}
|
|
1842
|
+
|
|
1330
1843
|
}
|
|
1844
|
+
/**
|
|
1845
|
+
* Transmission Materials Extension
|
|
1846
|
+
*
|
|
1847
|
+
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission
|
|
1848
|
+
*/
|
|
1849
|
+
|
|
1850
|
+
|
|
1331
1851
|
class GLTFMaterialsTransmissionExtension {
|
|
1332
1852
|
constructor(writer) {
|
|
1853
|
+
_defineProperty(this, "writer", void 0);
|
|
1854
|
+
|
|
1855
|
+
_defineProperty(this, "name", void 0);
|
|
1856
|
+
|
|
1333
1857
|
this.writer = writer;
|
|
1334
|
-
this.name =
|
|
1858
|
+
this.name = 'KHR_materials_transmission';
|
|
1335
1859
|
}
|
|
1860
|
+
|
|
1336
1861
|
writeMaterial(material, materialDef) {
|
|
1337
|
-
if (!(material instanceof
|
|
1862
|
+
if (!(material instanceof MeshPhysicalMaterial && // @ts-expect-error
|
|
1863
|
+
material.isMeshPhysicalMaterial) || material.transmission === 0) {
|
|
1338
1864
|
return;
|
|
1339
1865
|
}
|
|
1866
|
+
|
|
1340
1867
|
const writer = this.writer;
|
|
1341
1868
|
const extensionsUsed = writer.extensionsUsed;
|
|
1342
1869
|
const extensionDef = {};
|
|
1343
1870
|
extensionDef.transmissionFactor = material.transmission;
|
|
1871
|
+
|
|
1344
1872
|
if (material.transmissionMap) {
|
|
1345
|
-
const transmissionMapDef = {
|
|
1873
|
+
const transmissionMapDef = {
|
|
1874
|
+
index: writer.processTexture(material.transmissionMap)
|
|
1875
|
+
};
|
|
1346
1876
|
writer.applyTextureTransform(transmissionMapDef, material.transmissionMap);
|
|
1347
1877
|
extensionDef.transmissionTexture = transmissionMapDef;
|
|
1348
1878
|
}
|
|
1879
|
+
|
|
1349
1880
|
materialDef.extensions = materialDef.extensions || {};
|
|
1350
1881
|
materialDef.extensions[this.name] = extensionDef;
|
|
1351
1882
|
extensionsUsed[this.name] = true;
|
|
1352
1883
|
}
|
|
1884
|
+
|
|
1353
1885
|
}
|
|
1886
|
+
/**
|
|
1887
|
+
* Materials Volume Extension
|
|
1888
|
+
*
|
|
1889
|
+
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume
|
|
1890
|
+
*/
|
|
1891
|
+
|
|
1892
|
+
|
|
1354
1893
|
class GLTFMaterialsVolumeExtension {
|
|
1355
1894
|
constructor(writer) {
|
|
1895
|
+
_defineProperty(this, "writer", void 0);
|
|
1896
|
+
|
|
1897
|
+
_defineProperty(this, "name", void 0);
|
|
1898
|
+
|
|
1356
1899
|
this.writer = writer;
|
|
1357
|
-
this.name =
|
|
1900
|
+
this.name = 'KHR_materials_volume';
|
|
1358
1901
|
}
|
|
1902
|
+
|
|
1359
1903
|
writeMaterial(material, materialDef) {
|
|
1360
|
-
if (!(material instanceof
|
|
1904
|
+
if (!(material instanceof MeshPhysicalMaterial && // @ts-expect-error
|
|
1905
|
+
material.isMeshPhysicalMaterial) || material.thickness === 0) {
|
|
1361
1906
|
return;
|
|
1362
1907
|
}
|
|
1908
|
+
|
|
1363
1909
|
const writer = this.writer;
|
|
1364
1910
|
const extensionsUsed = writer.extensionsUsed;
|
|
1365
1911
|
const extensionDef = {};
|
|
1366
1912
|
extensionDef.thickness = material.thickness;
|
|
1913
|
+
|
|
1367
1914
|
if (material.thicknessMap) {
|
|
1368
1915
|
const thicknessMapDef = {
|
|
1369
1916
|
index: writer.processTexture(material.thicknessMap)
|
|
@@ -1371,11 +1918,15 @@ class GLTFMaterialsVolumeExtension {
|
|
|
1371
1918
|
writer.applyTextureTransform(thicknessMapDef, material.thicknessMap);
|
|
1372
1919
|
extensionDef.thicknessTexture = thicknessMapDef;
|
|
1373
1920
|
}
|
|
1921
|
+
|
|
1374
1922
|
extensionDef.attenuationDistance = material.attenuationDistance;
|
|
1375
|
-
extensionDef.attenuationColor =
|
|
1923
|
+
extensionDef.attenuationColor = //@ts-expect-error
|
|
1924
|
+
material.attenuationTint.toArray();
|
|
1376
1925
|
materialDef.extensions = materialDef.extensions || {};
|
|
1377
1926
|
materialDef.extensions[this.name] = extensionDef;
|
|
1378
1927
|
extensionsUsed[this.name] = true;
|
|
1379
1928
|
}
|
|
1929
|
+
|
|
1380
1930
|
}
|
|
1381
|
-
|
|
1931
|
+
|
|
1932
|
+
export { GLTFExporter };
|