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
package/loaders/MMDLoader.js
CHANGED
|
@@ -1,201 +1,331 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Loader, FileLoader, LoaderUtils, SkinnedMesh, Skeleton, Bone, Vector3, Float32BufferAttribute, BufferGeometry, Uint16BufferAttribute, TextureLoader, Color, MultiplyOperation, AddOperation, MeshToonMaterial, NearestFilter, RepeatWrapping, AnimationClip, VectorKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack, Quaternion, Euler, Interpolant, CustomBlending, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, DoubleSide, FrontSide } from 'three';
|
|
2
|
+
import { TGALoader } from './TGALoader.js';
|
|
3
|
+
import { Parser } from 'mmd-parser';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Dependencies
|
|
7
|
+
* - mmd-parser https://github.com/takahirox/mmd-parser
|
|
8
|
+
* - TGALoader
|
|
9
|
+
* - OutlineEffect
|
|
10
|
+
*
|
|
11
|
+
* MMDLoader creates Three.js Objects from MMD resources as
|
|
12
|
+
* PMD, PMX, VMD, and VPD files.
|
|
13
|
+
*
|
|
14
|
+
* PMD/PMX is a model data format, VMD is a motion data format
|
|
15
|
+
* VPD is a posing data format used in MMD(Miku Miku Dance).
|
|
16
|
+
*
|
|
17
|
+
* MMD official site
|
|
18
|
+
* - https://sites.google.com/view/evpvp/
|
|
19
|
+
*
|
|
20
|
+
* PMD, VMD format (in Japanese)
|
|
21
|
+
* - http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4
|
|
22
|
+
*
|
|
23
|
+
* PMX format
|
|
24
|
+
* - https://gist.github.com/felixjones/f8a06bd48f9da9a4539f
|
|
25
|
+
*
|
|
26
|
+
* TODO
|
|
27
|
+
* - light motion in vmd support.
|
|
28
|
+
* - SDEF support.
|
|
29
|
+
* - uv/material/bone morphing support.
|
|
30
|
+
* - more precise grant skinning support.
|
|
31
|
+
* - shadow support.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param {THREE.LoadingManager} manager
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
class MMDLoader extends Loader {
|
|
7
39
|
constructor(manager) {
|
|
8
40
|
super(manager);
|
|
9
|
-
this.loader = new
|
|
10
|
-
this.parser = null;
|
|
41
|
+
this.loader = new FileLoader(this.manager);
|
|
42
|
+
this.parser = null; // lazy generation
|
|
43
|
+
|
|
11
44
|
this.meshBuilder = new MeshBuilder(this.manager);
|
|
12
45
|
this.animationBuilder = new AnimationBuilder();
|
|
13
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* @param {string} animationPath
|
|
49
|
+
* @return {MMDLoader}
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
|
|
14
53
|
setAnimationPath(animationPath) {
|
|
15
54
|
this.animationPath = animationPath;
|
|
16
55
|
return this;
|
|
17
|
-
}
|
|
56
|
+
} // Load MMD assets as Three.js Object
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Loads Model file (.pmd or .pmx) as a SkinnedMesh.
|
|
60
|
+
*
|
|
61
|
+
* @param {string} url - url to Model(.pmd or .pmx) file
|
|
62
|
+
* @param {function} onLoad
|
|
63
|
+
* @param {function} onProgress
|
|
64
|
+
* @param {function} onError
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
|
|
18
68
|
load(url, onLoad, onProgress, onError) {
|
|
19
|
-
const builder = this.meshBuilder.setCrossOrigin(this.crossOrigin);
|
|
69
|
+
const builder = this.meshBuilder.setCrossOrigin(this.crossOrigin); // resource path
|
|
70
|
+
|
|
20
71
|
let resourcePath;
|
|
21
|
-
|
|
72
|
+
|
|
73
|
+
if (this.resourcePath !== '') {
|
|
22
74
|
resourcePath = this.resourcePath;
|
|
23
|
-
} else if (this.path !==
|
|
75
|
+
} else if (this.path !== '') {
|
|
24
76
|
resourcePath = this.path;
|
|
25
77
|
} else {
|
|
26
|
-
resourcePath =
|
|
78
|
+
resourcePath = LoaderUtils.extractUrlBase(url);
|
|
27
79
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
80
|
+
|
|
81
|
+
const modelExtension = this._extractExtension(url).toLowerCase(); // Should I detect by seeing header?
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
if (modelExtension !== 'pmd' && modelExtension !== 'pmx') {
|
|
85
|
+
if (onError) onError(new Error('THREE.MMDLoader: Unknown model file extension .' + modelExtension + '.'));
|
|
32
86
|
return;
|
|
33
87
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
},
|
|
39
|
-
onProgress,
|
|
40
|
-
onError
|
|
41
|
-
);
|
|
88
|
+
|
|
89
|
+
this[modelExtension === 'pmd' ? 'loadPMD' : 'loadPMX'](url, function (data) {
|
|
90
|
+
onLoad(builder.build(data, resourcePath, onProgress, onError));
|
|
91
|
+
}, onProgress, onError);
|
|
42
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Loads Motion file(s) (.vmd) as a AnimationClip.
|
|
95
|
+
* If two or more files are specified, they'll be merged.
|
|
96
|
+
*
|
|
97
|
+
* @param {string|Array<string>} url - url(s) to animation(.vmd) file(s)
|
|
98
|
+
* @param {SkinnedMesh|THREE.Camera} object - tracks will be fitting to this object
|
|
99
|
+
* @param {function} onLoad
|
|
100
|
+
* @param {function} onProgress
|
|
101
|
+
* @param {function} onError
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
|
|
43
105
|
loadAnimation(url, object, onLoad, onProgress, onError) {
|
|
44
106
|
const builder = this.animationBuilder;
|
|
45
|
-
this.loadVMD(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
onLoad(object.isCamera ? builder.buildCameraAnimation(vmd) : builder.build(vmd, object));
|
|
49
|
-
},
|
|
50
|
-
onProgress,
|
|
51
|
-
onError
|
|
52
|
-
);
|
|
107
|
+
this.loadVMD(url, function (vmd) {
|
|
108
|
+
onLoad(object.isCamera ? builder.buildCameraAnimation(vmd) : builder.build(vmd, object));
|
|
109
|
+
}, onProgress, onError);
|
|
53
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Loads mode file and motion file(s) as an object containing
|
|
113
|
+
* a SkinnedMesh and a AnimationClip.
|
|
114
|
+
* Tracks of AnimationClip are fitting to the model.
|
|
115
|
+
*
|
|
116
|
+
* @param {string} modelUrl - url to Model(.pmd or .pmx) file
|
|
117
|
+
* @param {string|Array{string}} vmdUrl - url(s) to animation(.vmd) file
|
|
118
|
+
* @param {function} onLoad
|
|
119
|
+
* @param {function} onProgress
|
|
120
|
+
* @param {function} onError
|
|
121
|
+
*/
|
|
122
|
+
|
|
123
|
+
|
|
54
124
|
loadWithAnimation(modelUrl, vmdUrl, onLoad, onProgress, onError) {
|
|
55
125
|
const scope = this;
|
|
56
|
-
this.load(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
126
|
+
this.load(modelUrl, function (mesh) {
|
|
127
|
+
scope.loadAnimation(vmdUrl, mesh, function (animation) {
|
|
128
|
+
onLoad({
|
|
129
|
+
mesh: mesh,
|
|
130
|
+
animation: animation
|
|
131
|
+
});
|
|
132
|
+
}, onProgress, onError);
|
|
133
|
+
}, onProgress, onError);
|
|
134
|
+
} // Load MMD assets as Object data parsed by MMDParser
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Loads .pmd file as an Object.
|
|
138
|
+
*
|
|
139
|
+
* @param {string} url - url to .pmd file
|
|
140
|
+
* @param {function} onLoad
|
|
141
|
+
* @param {function} onProgress
|
|
142
|
+
* @param {function} onError
|
|
143
|
+
*/
|
|
144
|
+
|
|
145
|
+
|
|
76
146
|
loadPMD(url, onLoad, onProgress, onError) {
|
|
77
147
|
const parser = this._getParser();
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
},
|
|
83
|
-
onProgress,
|
|
84
|
-
onError
|
|
85
|
-
);
|
|
148
|
+
|
|
149
|
+
this.loader.setMimeType(undefined).setPath(this.path).setResponseType('arraybuffer').setRequestHeader(this.requestHeader).setWithCredentials(this.withCredentials).load(url, function (buffer) {
|
|
150
|
+
onLoad(parser.parsePmd(buffer, true));
|
|
151
|
+
}, onProgress, onError);
|
|
86
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Loads .pmx file as an Object.
|
|
155
|
+
*
|
|
156
|
+
* @param {string} url - url to .pmx file
|
|
157
|
+
* @param {function} onLoad
|
|
158
|
+
* @param {function} onProgress
|
|
159
|
+
* @param {function} onError
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
|
|
87
163
|
loadPMX(url, onLoad, onProgress, onError) {
|
|
88
164
|
const parser = this._getParser();
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
onProgress,
|
|
95
|
-
onError
|
|
96
|
-
);
|
|
165
|
+
|
|
166
|
+
this.loader.setMimeType(undefined).setPath(this.path).setResponseType('arraybuffer').setRequestHeader(this.requestHeader).setWithCredentials(this.withCredentials).load(url, function (buffer) {
|
|
167
|
+
onLoad(parser.parsePmx(buffer, true));
|
|
168
|
+
}, onProgress, onError);
|
|
97
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Loads .vmd file as an Object. If two or more files are specified
|
|
172
|
+
* they'll be merged.
|
|
173
|
+
*
|
|
174
|
+
* @param {string|Array<string>} url - url(s) to .vmd file(s)
|
|
175
|
+
* @param {function} onLoad
|
|
176
|
+
* @param {function} onProgress
|
|
177
|
+
* @param {function} onError
|
|
178
|
+
*/
|
|
179
|
+
|
|
180
|
+
|
|
98
181
|
loadVMD(url, onLoad, onProgress, onError) {
|
|
99
182
|
const urls = Array.isArray(url) ? url : [url];
|
|
100
183
|
const vmds = [];
|
|
101
184
|
const vmdNum = urls.length;
|
|
185
|
+
|
|
102
186
|
const parser = this._getParser();
|
|
103
|
-
|
|
187
|
+
|
|
188
|
+
this.loader.setMimeType(undefined).setPath(this.animationPath).setResponseType('arraybuffer').setRequestHeader(this.requestHeader).setWithCredentials(this.withCredentials);
|
|
189
|
+
|
|
104
190
|
for (let i = 0, il = urls.length; i < il; i++) {
|
|
105
|
-
this.loader.load(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (vmds.length === vmdNum)
|
|
110
|
-
onLoad(parser.mergeVmds(vmds));
|
|
111
|
-
},
|
|
112
|
-
onProgress,
|
|
113
|
-
onError
|
|
114
|
-
);
|
|
191
|
+
this.loader.load(urls[i], function (buffer) {
|
|
192
|
+
vmds.push(parser.parseVmd(buffer, true));
|
|
193
|
+
if (vmds.length === vmdNum) onLoad(parser.mergeVmds(vmds));
|
|
194
|
+
}, onProgress, onError);
|
|
115
195
|
}
|
|
116
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Loads .vpd file as an Object.
|
|
199
|
+
*
|
|
200
|
+
* @param {string} url - url to .vpd file
|
|
201
|
+
* @param {boolean} isUnicode
|
|
202
|
+
* @param {function} onLoad
|
|
203
|
+
* @param {function} onProgress
|
|
204
|
+
* @param {function} onError
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
|
|
117
208
|
loadVPD(url, isUnicode, onLoad, onProgress, onError) {
|
|
118
209
|
const parser = this._getParser();
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
);
|
|
127
|
-
}
|
|
210
|
+
|
|
211
|
+
this.loader.setMimeType(isUnicode ? undefined : 'text/plain; charset=shift_jis').setPath(this.animationPath).setResponseType('text').setRequestHeader(this.requestHeader).setWithCredentials(this.withCredentials).load(url, function (text) {
|
|
212
|
+
onLoad(parser.parseVpd(text, true));
|
|
213
|
+
}, onProgress, onError);
|
|
214
|
+
} // private methods
|
|
215
|
+
|
|
216
|
+
|
|
128
217
|
_extractExtension(url) {
|
|
129
|
-
const index = url.lastIndexOf(
|
|
130
|
-
return index < 0 ?
|
|
218
|
+
const index = url.lastIndexOf('.');
|
|
219
|
+
return index < 0 ? '' : url.slice(index + 1);
|
|
131
220
|
}
|
|
221
|
+
|
|
132
222
|
_getParser() {
|
|
133
223
|
if (this.parser === null) {
|
|
134
|
-
this.parser = new
|
|
224
|
+
this.parser = new Parser(); // eslint-disable-line no-undef
|
|
135
225
|
}
|
|
226
|
+
|
|
136
227
|
return this.parser;
|
|
137
228
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
229
|
+
|
|
230
|
+
} // Utilities
|
|
231
|
+
|
|
232
|
+
/*
|
|
233
|
+
* base64 encoded defalut toon textures toon00.bmp - toon10.bmp.
|
|
234
|
+
* We don't need to request external toon image files.
|
|
235
|
+
* This idea is from http://www20.atpages.jp/katwat/three.js_r58/examples/mytest37/mmd.three.js
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
const DEFAULT_TOON_TEXTURES = ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAN0lEQVRYR+3WQREAMBACsZ5/bWiiMvgEBTt5cW37hjsBBAgQIECAwFwgyfYPCCBAgAABAgTWAh8aBHZBl14e8wAAAABJRU5ErkJggg==', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOUlEQVRYR+3WMREAMAwDsYY/yoDI7MLwIiP40+RJklfcCCBAgAABAgTqArfb/QMCCBAgQIAAgbbAB3z/e0F3js2cAAAAAElFTkSuQmCC', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAN0lEQVRYR+3WQREAMBACsZ5/B5ilMvgEBTt5cW37hjsBBAgQIECAwFwgyfYPCCBAgAABAgTWAh81dWyx0gFwKAAAAABJRU5ErkJggg==', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOklEQVRYR+3WoREAMAwDsWb/UQtCy9wxTOQJ/oQ8SXKKGwEECBAgQIBAXeDt7f4BAQQIECBAgEBb4AOz8Hzx7WLY4wAAAABJRU5ErkJggg==', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABPUlEQVRYR+1XwW7CMAy1+f9fZOMysSEOEweEOPRNdm3HbdOyIhAcklPrOs/PLy9RygBALxzcCDQFmgJNgaZAU6Ap0BR4PwX8gsRMVLssMRH5HcpzJEaWL7EVg9F1IHRlyqQohgVr4FGUlUcMJSjcUlDw0zvjeun70cLWmneoyf7NgBTQSniBTQQSuJAZsOnnaczjIMb5hCiuHKxokCrJfVnrctyZL0PkJAJe1HMil4nxeyi3Ypfn1kX51jpPvo/JeCNC4PhVdHdJw2XjBR8brF8PEIhNVn12AgP7uHsTBguBn53MUZCqv7Lp07Pn5k1Ro+uWmUNn7D+M57rtk7aG0Vo73xyF/fbFf0bPJjDXngnGocDTdFhygZjwUQrMNrDcmZlQT50VJ/g/UwNyHpu778+yW+/ksOz/BFo54P4AsUXMfRq7XWsAAAAASUVORK5CYII=', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACMElEQVRYR+2Xv4pTQRTGf2dubhLdICiii2KnYKHVolhauKWPoGAnNr6BD6CvIVaihYuI2i1ia0BY0MZGRHQXjZj/mSPnnskfNWiWZUlzJ5k7M2cm833nO5Mziej2DWWJRUoCpQKlAntSQCqgw39/iUWAGmh37jrRnVsKlgpiqmkoGVABA7E57fvY+pJDdgKqF6HzFCSADkDq+F6AHABtQ+UMVE5D7zXod7fFNhTEckTbj5XQgHzNN+5tQvc5NG7C6BNkp6D3EmpXHDR+dQAjFLchW3VS9rlw3JBh+B7ys5Cf9z0GW1C/7P32AyBAOAz1q4jGliIH3YPuBnSfQX4OGreTIgEYQb/pBDtPnEQ4CivXYPAWBk13oHrB54yA9QuSn2H4AcKRpEILDt0BUzj+RLR1V5EqjD66NPRBVpLcQwjHoHYJOhsQv6U4mnzmrIXJCFr4LDwm/xBUoboG9XX4cc9VKdYoSA2yk5NQLJaKDUjTBoveG3Z2TElTxwjNK4M3LEZgUdDdruvcXzKBpStgp2NPiWi3ks9ZXxIoFVi+AvHLdc9TqtjL3/aYjpPlrzOcEnK62Szhimdd7xX232zFDTgtxezOu3WNMRLjiKgjtOhHVMd1loynVHvOgjuIIJMaELEqhJAV/RCSLbWTcfPFakFgFlALTRRvx+ok6Hlp/Q+v3fmx90bMyUzaEAhmM3KvHlXTL5DxnbGf/1M8RNNACLL5MNtPxP/mypJAqcDSFfgFhpYqWUzhTEAAAAAASUVORK5CYII=', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=']; // Builders. They build Three.js object from Object data parsed by MMDParser.
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* @param {THREE.LoadingManager} manager
|
|
243
|
+
*/
|
|
244
|
+
|
|
152
245
|
class MeshBuilder {
|
|
153
246
|
constructor(manager) {
|
|
154
|
-
this.crossOrigin =
|
|
247
|
+
this.crossOrigin = 'anonymous';
|
|
155
248
|
this.geometryBuilder = new GeometryBuilder();
|
|
156
249
|
this.materialBuilder = new MaterialBuilder(manager);
|
|
157
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* @param {string} crossOrigin
|
|
253
|
+
* @return {MeshBuilder}
|
|
254
|
+
*/
|
|
255
|
+
|
|
256
|
+
|
|
158
257
|
setCrossOrigin(crossOrigin) {
|
|
159
258
|
this.crossOrigin = crossOrigin;
|
|
160
259
|
return this;
|
|
161
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* @param {Object} data - parsed PMD/PMX data
|
|
263
|
+
* @param {string} resourcePath
|
|
264
|
+
* @param {function} onProgress
|
|
265
|
+
* @param {function} onError
|
|
266
|
+
* @return {SkinnedMesh}
|
|
267
|
+
*/
|
|
268
|
+
|
|
269
|
+
|
|
162
270
|
build(data, resourcePath, onProgress, onError) {
|
|
163
271
|
const geometry = this.geometryBuilder.build(data);
|
|
164
272
|
const material = this.materialBuilder.setCrossOrigin(this.crossOrigin).setResourcePath(resourcePath).build(data, geometry, onProgress, onError);
|
|
165
|
-
const mesh = new
|
|
166
|
-
const skeleton = new
|
|
167
|
-
mesh.bind(skeleton);
|
|
273
|
+
const mesh = new SkinnedMesh(geometry, material);
|
|
274
|
+
const skeleton = new Skeleton(initBones(mesh));
|
|
275
|
+
mesh.bind(skeleton); // console.log( mesh ); // for console debug
|
|
276
|
+
|
|
168
277
|
return mesh;
|
|
169
278
|
}
|
|
170
|
-
|
|
279
|
+
|
|
280
|
+
} // TODO: Try to remove this function
|
|
281
|
+
|
|
282
|
+
|
|
171
283
|
function initBones(mesh) {
|
|
172
284
|
const geometry = mesh.geometry;
|
|
173
285
|
const bones = [];
|
|
174
|
-
|
|
286
|
+
|
|
287
|
+
if (geometry && geometry.bones !== undefined) {
|
|
288
|
+
// first, create array of 'Bone' objects from geometry data
|
|
175
289
|
for (let i = 0, il = geometry.bones.length; i < il; i++) {
|
|
176
|
-
const gbone = geometry.bones[i];
|
|
177
|
-
|
|
178
|
-
|
|
290
|
+
const gbone = geometry.bones[i]; // create new 'Bone' object
|
|
291
|
+
|
|
292
|
+
const bone = new Bone();
|
|
293
|
+
bones.push(bone); // apply values
|
|
294
|
+
|
|
179
295
|
bone.name = gbone.name;
|
|
180
296
|
bone.position.fromArray(gbone.pos);
|
|
181
297
|
bone.quaternion.fromArray(gbone.rotq);
|
|
182
|
-
if (gbone.scl !==
|
|
183
|
-
|
|
184
|
-
|
|
298
|
+
if (gbone.scl !== undefined) bone.scale.fromArray(gbone.scl);
|
|
299
|
+
} // second, create bone hierarchy
|
|
300
|
+
|
|
301
|
+
|
|
185
302
|
for (let i = 0, il = geometry.bones.length; i < il; i++) {
|
|
186
303
|
const gbone = geometry.bones[i];
|
|
187
|
-
|
|
304
|
+
|
|
305
|
+
if (gbone.parent !== -1 && gbone.parent !== null && bones[gbone.parent] !== undefined) {
|
|
306
|
+
// subsequent bones in the hierarchy
|
|
188
307
|
bones[gbone.parent].add(bones[i]);
|
|
189
308
|
} else {
|
|
309
|
+
// topmost bone, immediate child of the skinned mesh
|
|
190
310
|
mesh.add(bones[i]);
|
|
191
311
|
}
|
|
192
312
|
}
|
|
193
|
-
}
|
|
313
|
+
} // now the bones are part of the scene graph and children of the skinned mesh.
|
|
314
|
+
// let's update the corresponding matrices
|
|
315
|
+
|
|
316
|
+
|
|
194
317
|
mesh.updateMatrixWorld(true);
|
|
195
318
|
return bones;
|
|
196
|
-
}
|
|
319
|
+
} //
|
|
320
|
+
|
|
321
|
+
|
|
197
322
|
class GeometryBuilder {
|
|
323
|
+
/**
|
|
324
|
+
* @param {Object} data - parsed PMD/PMX data
|
|
325
|
+
* @return {BufferGeometry}
|
|
326
|
+
*/
|
|
198
327
|
build(data) {
|
|
328
|
+
// for geometry
|
|
199
329
|
const positions = [];
|
|
200
330
|
const uvs = [];
|
|
201
331
|
const normals = [];
|
|
@@ -209,33 +339,45 @@ class GeometryBuilder {
|
|
|
209
339
|
const iks = [];
|
|
210
340
|
const grants = [];
|
|
211
341
|
const rigidBodies = [];
|
|
212
|
-
const constraints = [];
|
|
342
|
+
const constraints = []; // for work
|
|
343
|
+
|
|
213
344
|
let offset = 0;
|
|
214
|
-
const boneTypeTable = {};
|
|
345
|
+
const boneTypeTable = {}; // positions, normals, uvs, skinIndices, skinWeights
|
|
346
|
+
|
|
215
347
|
for (let i = 0; i < data.metadata.vertexCount; i++) {
|
|
216
348
|
const v = data.vertices[i];
|
|
349
|
+
|
|
217
350
|
for (let j = 0, jl = v.position.length; j < jl; j++) {
|
|
218
351
|
positions.push(v.position[j]);
|
|
219
352
|
}
|
|
353
|
+
|
|
220
354
|
for (let j = 0, jl = v.normal.length; j < jl; j++) {
|
|
221
355
|
normals.push(v.normal[j]);
|
|
222
356
|
}
|
|
357
|
+
|
|
223
358
|
for (let j = 0, jl = v.uv.length; j < jl; j++) {
|
|
224
359
|
uvs.push(v.uv[j]);
|
|
225
360
|
}
|
|
361
|
+
|
|
226
362
|
for (let j = 0; j < 4; j++) {
|
|
227
|
-
skinIndices.push(v.skinIndices.length - 1 >= j ? v.skinIndices[j] : 0);
|
|
363
|
+
skinIndices.push(v.skinIndices.length - 1 >= j ? v.skinIndices[j] : 0.0);
|
|
228
364
|
}
|
|
365
|
+
|
|
229
366
|
for (let j = 0; j < 4; j++) {
|
|
230
|
-
skinWeights.push(v.skinWeights.length - 1 >= j ? v.skinWeights[j] : 0);
|
|
367
|
+
skinWeights.push(v.skinWeights.length - 1 >= j ? v.skinWeights[j] : 0.0);
|
|
231
368
|
}
|
|
232
|
-
}
|
|
369
|
+
} // indices
|
|
370
|
+
|
|
371
|
+
|
|
233
372
|
for (let i = 0; i < data.metadata.faceCount; i++) {
|
|
234
373
|
const face = data.faces[i];
|
|
374
|
+
|
|
235
375
|
for (let j = 0, jl = face.indices.length; j < jl; j++) {
|
|
236
376
|
indices.push(face.indices[j]);
|
|
237
377
|
}
|
|
238
|
-
}
|
|
378
|
+
} // groups
|
|
379
|
+
|
|
380
|
+
|
|
239
381
|
for (let i = 0; i < data.metadata.materialCount; i++) {
|
|
240
382
|
const material = data.materials[i];
|
|
241
383
|
groups.push({
|
|
@@ -243,13 +385,17 @@ class GeometryBuilder {
|
|
|
243
385
|
count: material.faceCount * 3
|
|
244
386
|
});
|
|
245
387
|
offset += material.faceCount;
|
|
246
|
-
}
|
|
388
|
+
} // bones
|
|
389
|
+
|
|
390
|
+
|
|
247
391
|
for (let i = 0; i < data.metadata.rigidBodyCount; i++) {
|
|
248
392
|
const body = data.rigidBodies[i];
|
|
249
|
-
let value = boneTypeTable[body.boneIndex];
|
|
250
|
-
|
|
393
|
+
let value = boneTypeTable[body.boneIndex]; // keeps greater number if already value is set without any special reasons
|
|
394
|
+
|
|
395
|
+
value = value === undefined ? body.type : Math.max(body.type, value);
|
|
251
396
|
boneTypeTable[body.boneIndex] = value;
|
|
252
397
|
}
|
|
398
|
+
|
|
253
399
|
for (let i = 0; i < data.metadata.boneCount; i++) {
|
|
254
400
|
const boneData = data.bones[i];
|
|
255
401
|
const bone = {
|
|
@@ -260,16 +406,21 @@ class GeometryBuilder {
|
|
|
260
406
|
pos: boneData.position.slice(0, 3),
|
|
261
407
|
rotq: [0, 0, 0, 1],
|
|
262
408
|
scl: [1, 1, 1],
|
|
263
|
-
rigidBodyType: boneTypeTable[i] !==
|
|
409
|
+
rigidBodyType: boneTypeTable[i] !== undefined ? boneTypeTable[i] : -1
|
|
264
410
|
};
|
|
411
|
+
|
|
265
412
|
if (bone.parent !== -1) {
|
|
266
413
|
bone.pos[0] -= data.bones[bone.parent].position[0];
|
|
267
414
|
bone.pos[1] -= data.bones[bone.parent].position[1];
|
|
268
415
|
bone.pos[2] -= data.bones[bone.parent].position[2];
|
|
269
416
|
}
|
|
417
|
+
|
|
270
418
|
bones.push(bone);
|
|
271
|
-
}
|
|
272
|
-
|
|
419
|
+
} // iks
|
|
420
|
+
// TODO: remove duplicated codes between PMD and PMX
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
if (data.metadata.format === 'pmd') {
|
|
273
424
|
for (let i = 0; i < data.metadata.ikCount; i++) {
|
|
274
425
|
const ik = data.iks[i];
|
|
275
426
|
const param = {
|
|
@@ -279,22 +430,25 @@ class GeometryBuilder {
|
|
|
279
430
|
maxAngle: ik.maxAngle * 4,
|
|
280
431
|
links: []
|
|
281
432
|
};
|
|
433
|
+
|
|
282
434
|
for (let j = 0, jl = ik.links.length; j < jl; j++) {
|
|
283
435
|
const link = {};
|
|
284
436
|
link.index = ik.links[j].index;
|
|
285
437
|
link.enabled = true;
|
|
286
|
-
|
|
287
|
-
|
|
438
|
+
|
|
439
|
+
if (data.bones[link.index].name.indexOf('ひざ') >= 0) {
|
|
440
|
+
link.limitation = new Vector3(1.0, 0.0, 0.0);
|
|
288
441
|
}
|
|
442
|
+
|
|
289
443
|
param.links.push(link);
|
|
290
444
|
}
|
|
445
|
+
|
|
291
446
|
iks.push(param);
|
|
292
447
|
}
|
|
293
448
|
} else {
|
|
294
449
|
for (let i = 0; i < data.metadata.boneCount; i++) {
|
|
295
450
|
const ik = data.bones[i].ik;
|
|
296
|
-
if (ik ===
|
|
297
|
-
continue;
|
|
451
|
+
if (ik === undefined) continue;
|
|
298
452
|
const param = {
|
|
299
453
|
target: i,
|
|
300
454
|
effector: ik.effector,
|
|
@@ -302,47 +456,48 @@ class GeometryBuilder {
|
|
|
302
456
|
maxAngle: ik.maxAngle,
|
|
303
457
|
links: []
|
|
304
458
|
};
|
|
459
|
+
|
|
305
460
|
for (let j = 0, jl = ik.links.length; j < jl; j++) {
|
|
306
461
|
const link = {};
|
|
307
462
|
link.index = ik.links[j].index;
|
|
308
463
|
link.enabled = true;
|
|
464
|
+
|
|
309
465
|
if (ik.links[j].angleLimitation === 1) {
|
|
466
|
+
// Revert if rotationMin/Max doesn't work well
|
|
467
|
+
// link.limitation = new Vector3( 1.0, 0.0, 0.0 );
|
|
310
468
|
const rotationMin = ik.links[j].lowerLimitationAngle;
|
|
311
|
-
const rotationMax = ik.links[j].upperLimitationAngle;
|
|
469
|
+
const rotationMax = ik.links[j].upperLimitationAngle; // Convert Left to Right coordinate by myself because
|
|
470
|
+
// MMDParser doesn't convert. It's a MMDParser's bug
|
|
471
|
+
|
|
312
472
|
const tmp1 = -rotationMax[0];
|
|
313
473
|
const tmp2 = -rotationMax[1];
|
|
314
474
|
rotationMax[0] = -rotationMin[0];
|
|
315
475
|
rotationMax[1] = -rotationMin[1];
|
|
316
476
|
rotationMin[0] = tmp1;
|
|
317
477
|
rotationMin[1] = tmp2;
|
|
318
|
-
link.rotationMin = new
|
|
319
|
-
link.rotationMax = new
|
|
478
|
+
link.rotationMin = new Vector3().fromArray(rotationMin);
|
|
479
|
+
link.rotationMax = new Vector3().fromArray(rotationMax);
|
|
320
480
|
}
|
|
481
|
+
|
|
321
482
|
param.links.push(link);
|
|
322
483
|
}
|
|
323
|
-
|
|
484
|
+
|
|
485
|
+
iks.push(param); // Save the reference even from bone data for efficiently
|
|
486
|
+
// simulating PMX animation system
|
|
487
|
+
|
|
324
488
|
bones[i].ik = param;
|
|
325
489
|
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
bones[entry.param.index].grant = entry.param;
|
|
332
|
-
}
|
|
333
|
-
entry.visited = true;
|
|
334
|
-
for (let i = 0, il = entry.children.length; i < il; i++) {
|
|
335
|
-
const child = entry.children[i];
|
|
336
|
-
if (!child.visited)
|
|
337
|
-
traverse(child);
|
|
338
|
-
}
|
|
339
|
-
};
|
|
490
|
+
} // grants
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
if (data.metadata.format === 'pmx') {
|
|
494
|
+
// bone index -> grant entry map
|
|
340
495
|
const grantEntryMap = {};
|
|
496
|
+
|
|
341
497
|
for (let i = 0; i < data.metadata.boneCount; i++) {
|
|
342
498
|
const boneData = data.bones[i];
|
|
343
499
|
const grant = boneData.grant;
|
|
344
|
-
if (grant ===
|
|
345
|
-
continue;
|
|
500
|
+
if (grant === undefined) continue;
|
|
346
501
|
const param = {
|
|
347
502
|
index: i,
|
|
348
503
|
parentIndex: grant.parentIndex,
|
|
@@ -352,74 +507,122 @@ class GeometryBuilder {
|
|
|
352
507
|
affectPosition: grant.affectPosition,
|
|
353
508
|
transformationClass: boneData.transformationClass
|
|
354
509
|
};
|
|
355
|
-
grantEntryMap[i] = {
|
|
510
|
+
grantEntryMap[i] = {
|
|
511
|
+
parent: null,
|
|
512
|
+
children: [],
|
|
513
|
+
param: param,
|
|
514
|
+
visited: false
|
|
515
|
+
};
|
|
356
516
|
}
|
|
357
|
-
|
|
517
|
+
|
|
518
|
+
const rootEntry = {
|
|
519
|
+
parent: null,
|
|
520
|
+
children: [],
|
|
521
|
+
param: null,
|
|
522
|
+
visited: false
|
|
523
|
+
}; // Build a tree representing grant hierarchy
|
|
524
|
+
|
|
358
525
|
for (const boneIndex in grantEntryMap) {
|
|
359
526
|
const grantEntry = grantEntryMap[boneIndex];
|
|
360
527
|
const parentGrantEntry = grantEntryMap[grantEntry.parentIndex] || rootEntry;
|
|
361
528
|
grantEntry.parent = parentGrantEntry;
|
|
362
529
|
parentGrantEntry.children.push(grantEntry);
|
|
530
|
+
} // Sort grant parameters from parents to children because
|
|
531
|
+
// grant uses parent's transform that parent's grant is already applied
|
|
532
|
+
// so grant should be applied in order from parents to children
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
function traverse(entry) {
|
|
536
|
+
if (entry.param) {
|
|
537
|
+
grants.push(entry.param); // Save the reference even from bone data for efficiently
|
|
538
|
+
// simulating PMX animation system
|
|
539
|
+
|
|
540
|
+
bones[entry.param.index].grant = entry.param;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
entry.visited = true;
|
|
544
|
+
|
|
545
|
+
for (let i = 0, il = entry.children.length; i < il; i++) {
|
|
546
|
+
const child = entry.children[i]; // Cut off a loop if exists. (Is a grant loop invalid?)
|
|
547
|
+
|
|
548
|
+
if (!child.visited) traverse(child);
|
|
549
|
+
}
|
|
363
550
|
}
|
|
551
|
+
|
|
364
552
|
traverse(rootEntry);
|
|
365
|
-
}
|
|
553
|
+
} // morph
|
|
554
|
+
|
|
555
|
+
|
|
366
556
|
function updateAttributes(attribute, morph, ratio) {
|
|
367
557
|
for (let i = 0; i < morph.elementCount; i++) {
|
|
368
558
|
const element = morph.elements[i];
|
|
369
559
|
let index;
|
|
370
|
-
|
|
560
|
+
|
|
561
|
+
if (data.metadata.format === 'pmd') {
|
|
371
562
|
index = data.morphs[0].elements[element.index].index;
|
|
372
563
|
} else {
|
|
373
564
|
index = element.index;
|
|
374
565
|
}
|
|
566
|
+
|
|
375
567
|
attribute.array[index * 3 + 0] += element.position[0] * ratio;
|
|
376
568
|
attribute.array[index * 3 + 1] += element.position[1] * ratio;
|
|
377
569
|
attribute.array[index * 3 + 2] += element.position[2] * ratio;
|
|
378
570
|
}
|
|
379
571
|
}
|
|
572
|
+
|
|
380
573
|
for (let i = 0; i < data.metadata.morphCount; i++) {
|
|
381
574
|
const morph = data.morphs[i];
|
|
382
|
-
const params = {
|
|
383
|
-
|
|
575
|
+
const params = {
|
|
576
|
+
name: morph.name
|
|
577
|
+
};
|
|
578
|
+
const attribute = new Float32BufferAttribute(data.metadata.vertexCount * 3, 3);
|
|
384
579
|
attribute.name = morph.name;
|
|
580
|
+
|
|
385
581
|
for (let j = 0; j < data.metadata.vertexCount * 3; j++) {
|
|
386
582
|
attribute.array[j] = positions[j];
|
|
387
583
|
}
|
|
388
|
-
|
|
584
|
+
|
|
585
|
+
if (data.metadata.format === 'pmd') {
|
|
389
586
|
if (i !== 0) {
|
|
390
|
-
updateAttributes(attribute, morph, 1);
|
|
587
|
+
updateAttributes(attribute, morph, 1.0);
|
|
391
588
|
}
|
|
392
589
|
} else {
|
|
393
590
|
if (morph.type === 0) {
|
|
591
|
+
// group
|
|
394
592
|
for (let j = 0; j < morph.elementCount; j++) {
|
|
395
593
|
const morph2 = data.morphs[morph.elements[j].index];
|
|
396
594
|
const ratio = morph.elements[j].ratio;
|
|
595
|
+
|
|
397
596
|
if (morph2.type === 1) {
|
|
398
597
|
updateAttributes(attribute, morph2, ratio);
|
|
399
|
-
} else {
|
|
400
598
|
}
|
|
401
599
|
}
|
|
402
600
|
} else if (morph.type === 1) {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
} else if (morph.type === 3)
|
|
406
|
-
} else if (morph.type === 4) {
|
|
407
|
-
} else if (morph.type === 5) {
|
|
408
|
-
} else if (morph.type === 6) {
|
|
409
|
-
} else if (morph.type === 7) {
|
|
410
|
-
} else if (morph.type === 8) {
|
|
411
|
-
}
|
|
601
|
+
// vertex
|
|
602
|
+
updateAttributes(attribute, morph, 1.0);
|
|
603
|
+
} else if (morph.type === 2) ; else if (morph.type === 3) ; else if (morph.type === 4) ; else if (morph.type === 5) ; else if (morph.type === 6) ; else if (morph.type === 7) ; else if (morph.type === 8) ;
|
|
412
604
|
}
|
|
605
|
+
|
|
413
606
|
morphTargets.push(params);
|
|
414
607
|
morphPositions.push(attribute);
|
|
415
|
-
}
|
|
608
|
+
} // rigid bodies from rigidBodies field.
|
|
609
|
+
|
|
610
|
+
|
|
416
611
|
for (let i = 0; i < data.metadata.rigidBodyCount; i++) {
|
|
417
612
|
const rigidBody = data.rigidBodies[i];
|
|
418
613
|
const params = {};
|
|
614
|
+
|
|
419
615
|
for (const key in rigidBody) {
|
|
420
616
|
params[key] = rigidBody[key];
|
|
421
617
|
}
|
|
422
|
-
|
|
618
|
+
/*
|
|
619
|
+
* RigidBody position parameter in PMX seems global position
|
|
620
|
+
* while the one in PMD seems offset from corresponding bone.
|
|
621
|
+
* So unify being offset.
|
|
622
|
+
*/
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
if (data.metadata.format === 'pmx') {
|
|
423
626
|
if (params.boneIndex !== -1) {
|
|
424
627
|
const bone = data.bones[params.boneIndex];
|
|
425
628
|
params.position[0] -= bone.position[0];
|
|
@@ -427,168 +630,250 @@ class GeometryBuilder {
|
|
|
427
630
|
params.position[2] -= bone.position[2];
|
|
428
631
|
}
|
|
429
632
|
}
|
|
633
|
+
|
|
430
634
|
rigidBodies.push(params);
|
|
431
|
-
}
|
|
635
|
+
} // constraints from constraints field.
|
|
636
|
+
|
|
637
|
+
|
|
432
638
|
for (let i = 0; i < data.metadata.constraintCount; i++) {
|
|
433
639
|
const constraint = data.constraints[i];
|
|
434
640
|
const params = {};
|
|
641
|
+
|
|
435
642
|
for (const key in constraint) {
|
|
436
643
|
params[key] = constraint[key];
|
|
437
644
|
}
|
|
645
|
+
|
|
438
646
|
const bodyA = rigidBodies[params.rigidBodyIndex1];
|
|
439
|
-
const bodyB = rigidBodies[params.rigidBodyIndex2];
|
|
647
|
+
const bodyB = rigidBodies[params.rigidBodyIndex2]; // Refer to http://www20.atpages.jp/katwat/wp/?p=4135
|
|
648
|
+
|
|
440
649
|
if (bodyA.type !== 0 && bodyB.type === 2) {
|
|
441
650
|
if (bodyA.boneIndex !== -1 && bodyB.boneIndex !== -1 && data.bones[bodyB.boneIndex].parentIndex === bodyA.boneIndex) {
|
|
442
651
|
bodyB.type = 1;
|
|
443
652
|
}
|
|
444
653
|
}
|
|
654
|
+
|
|
445
655
|
constraints.push(params);
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
geometry
|
|
450
|
-
geometry.setAttribute(
|
|
451
|
-
geometry.setAttribute(
|
|
452
|
-
geometry.setAttribute(
|
|
656
|
+
} // build BufferGeometry.
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
const geometry = new BufferGeometry();
|
|
660
|
+
geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
|
|
661
|
+
geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3));
|
|
662
|
+
geometry.setAttribute('uv', new Float32BufferAttribute(uvs, 2));
|
|
663
|
+
geometry.setAttribute('skinIndex', new Uint16BufferAttribute(skinIndices, 4));
|
|
664
|
+
geometry.setAttribute('skinWeight', new Float32BufferAttribute(skinWeights, 4));
|
|
453
665
|
geometry.setIndex(indices);
|
|
666
|
+
|
|
454
667
|
for (let i = 0, il = groups.length; i < il; i++) {
|
|
455
668
|
geometry.addGroup(groups[i].offset, groups[i].count, i);
|
|
456
669
|
}
|
|
670
|
+
|
|
457
671
|
geometry.bones = bones;
|
|
458
672
|
geometry.morphTargets = morphTargets;
|
|
459
673
|
geometry.morphAttributes.position = morphPositions;
|
|
460
674
|
geometry.morphTargetsRelative = false;
|
|
461
675
|
geometry.userData.MMD = {
|
|
462
|
-
bones,
|
|
463
|
-
iks,
|
|
464
|
-
grants,
|
|
465
|
-
rigidBodies,
|
|
466
|
-
constraints,
|
|
676
|
+
bones: bones,
|
|
677
|
+
iks: iks,
|
|
678
|
+
grants: grants,
|
|
679
|
+
rigidBodies: rigidBodies,
|
|
680
|
+
constraints: constraints,
|
|
467
681
|
format: data.metadata.format
|
|
468
682
|
};
|
|
469
683
|
geometry.computeBoundingSphere();
|
|
470
684
|
return geometry;
|
|
471
685
|
}
|
|
472
|
-
|
|
686
|
+
|
|
687
|
+
} //
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* @param {THREE.LoadingManager} manager
|
|
691
|
+
*/
|
|
692
|
+
|
|
693
|
+
|
|
473
694
|
class MaterialBuilder {
|
|
474
695
|
constructor(manager) {
|
|
475
696
|
this.manager = manager;
|
|
476
|
-
this.textureLoader = new
|
|
477
|
-
this.tgaLoader = null;
|
|
478
|
-
|
|
479
|
-
this.
|
|
697
|
+
this.textureLoader = new TextureLoader(this.manager);
|
|
698
|
+
this.tgaLoader = null; // lazy generation
|
|
699
|
+
|
|
700
|
+
this.crossOrigin = 'anonymous';
|
|
701
|
+
this.resourcePath = undefined;
|
|
480
702
|
}
|
|
703
|
+
/**
|
|
704
|
+
* @param {string} crossOrigin
|
|
705
|
+
* @return {MaterialBuilder}
|
|
706
|
+
*/
|
|
707
|
+
|
|
708
|
+
|
|
481
709
|
setCrossOrigin(crossOrigin) {
|
|
482
710
|
this.crossOrigin = crossOrigin;
|
|
483
711
|
return this;
|
|
484
712
|
}
|
|
713
|
+
/**
|
|
714
|
+
* @param {string} resourcePath
|
|
715
|
+
* @return {MaterialBuilder}
|
|
716
|
+
*/
|
|
717
|
+
|
|
718
|
+
|
|
485
719
|
setResourcePath(resourcePath) {
|
|
486
720
|
this.resourcePath = resourcePath;
|
|
487
721
|
return this;
|
|
488
722
|
}
|
|
489
|
-
|
|
723
|
+
/**
|
|
724
|
+
* @param {Object} data - parsed PMD/PMX data
|
|
725
|
+
* @param {BufferGeometry} geometry - some properties are dependend on geometry
|
|
726
|
+
* @param {function} onProgress
|
|
727
|
+
* @param {function} onError
|
|
728
|
+
* @return {Array<MeshToonMaterial>}
|
|
729
|
+
*/
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
build(data, geometry
|
|
733
|
+
/*, onProgress, onError */
|
|
734
|
+
) {
|
|
490
735
|
const materials = [];
|
|
491
736
|
const textures = {};
|
|
492
|
-
this.textureLoader.setCrossOrigin(this.crossOrigin);
|
|
737
|
+
this.textureLoader.setCrossOrigin(this.crossOrigin); // materials
|
|
738
|
+
|
|
493
739
|
for (let i = 0; i < data.metadata.materialCount; i++) {
|
|
494
740
|
const material = data.materials[i];
|
|
495
|
-
const params = {
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
params.
|
|
741
|
+
const params = {
|
|
742
|
+
userData: {}
|
|
743
|
+
};
|
|
744
|
+
if (material.name !== undefined) params.name = material.name;
|
|
745
|
+
/*
|
|
746
|
+
* Color
|
|
747
|
+
*
|
|
748
|
+
* MMD MeshToonMaterial
|
|
749
|
+
* diffuse - color
|
|
750
|
+
* ambient - emissive * a
|
|
751
|
+
* (a = 1.0 without map texture or 0.2 with map texture)
|
|
752
|
+
*
|
|
753
|
+
* MeshToonMaterial doesn't have ambient. Set it to emissive instead.
|
|
754
|
+
* It'll be too bright if material has map texture so using coef 0.2.
|
|
755
|
+
*/
|
|
756
|
+
|
|
757
|
+
params.color = new Color().fromArray(material.diffuse);
|
|
499
758
|
params.opacity = material.diffuse[3];
|
|
500
|
-
params.emissive = new
|
|
501
|
-
params.transparent = params.opacity !== 1;
|
|
759
|
+
params.emissive = new Color().fromArray(material.ambient);
|
|
760
|
+
params.transparent = params.opacity !== 1.0; //
|
|
761
|
+
|
|
502
762
|
params.skinning = geometry.bones.length > 0 ? true : false;
|
|
503
763
|
params.morphTargets = geometry.morphTargets.length > 0 ? true : false;
|
|
504
|
-
params.fog = true;
|
|
505
|
-
|
|
506
|
-
params.
|
|
507
|
-
params.
|
|
508
|
-
params.
|
|
509
|
-
params.
|
|
510
|
-
|
|
511
|
-
|
|
764
|
+
params.fog = true; // blend
|
|
765
|
+
|
|
766
|
+
params.blending = CustomBlending;
|
|
767
|
+
params.blendSrc = SrcAlphaFactor;
|
|
768
|
+
params.blendDst = OneMinusSrcAlphaFactor;
|
|
769
|
+
params.blendSrcAlpha = SrcAlphaFactor;
|
|
770
|
+
params.blendDstAlpha = DstAlphaFactor; // side
|
|
771
|
+
|
|
772
|
+
if (data.metadata.format === 'pmx' && (material.flag & 0x1) === 1) {
|
|
773
|
+
params.side = DoubleSide;
|
|
512
774
|
} else {
|
|
513
|
-
params.side = params.opacity === 1 ?
|
|
775
|
+
params.side = params.opacity === 1.0 ? FrontSide : DoubleSide;
|
|
514
776
|
}
|
|
515
|
-
|
|
777
|
+
|
|
778
|
+
if (data.metadata.format === 'pmd') {
|
|
779
|
+
// map, envMap
|
|
516
780
|
if (material.fileName) {
|
|
517
781
|
const fileName = material.fileName;
|
|
518
|
-
const fileNames = fileName.split(
|
|
782
|
+
const fileNames = fileName.split('*'); // fileNames[ 0 ]: mapFileName
|
|
783
|
+
// fileNames[ 1 ]: envMapFileName( optional )
|
|
784
|
+
|
|
519
785
|
params.map = this._loadTexture(fileNames[0], textures);
|
|
786
|
+
|
|
520
787
|
if (fileNames.length > 1) {
|
|
521
788
|
const extension = fileNames[1].slice(-4).toLowerCase();
|
|
522
789
|
params.envMap = this._loadTexture(fileNames[1], textures);
|
|
523
|
-
params.combine = extension ===
|
|
790
|
+
params.combine = extension === '.sph' ? MultiplyOperation : AddOperation;
|
|
524
791
|
}
|
|
525
|
-
}
|
|
526
|
-
|
|
792
|
+
} // gradientMap
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
const toonFileName = material.toonIndex === -1 ? 'toon00.bmp' : data.toonTextures[material.toonIndex].fileName;
|
|
527
796
|
params.gradientMap = this._loadTexture(toonFileName, textures, {
|
|
528
797
|
isToonTexture: true,
|
|
529
798
|
isDefaultToonTexture: this._isDefaultToonTexture(toonFileName)
|
|
530
|
-
});
|
|
799
|
+
}); // parameters for OutlineEffect
|
|
800
|
+
|
|
531
801
|
params.userData.outlineParameters = {
|
|
532
|
-
thickness: material.edgeFlag === 1 ?
|
|
802
|
+
thickness: material.edgeFlag === 1 ? 0.003 : 0.0,
|
|
533
803
|
color: [0, 0, 0],
|
|
534
|
-
alpha: 1,
|
|
804
|
+
alpha: 1.0,
|
|
535
805
|
visible: material.edgeFlag === 1
|
|
536
806
|
};
|
|
537
807
|
} else {
|
|
808
|
+
// map
|
|
538
809
|
if (material.textureIndex !== -1) {
|
|
539
810
|
params.map = this._loadTexture(data.textures[material.textureIndex], textures);
|
|
540
|
-
}
|
|
811
|
+
} // envMap TODO: support m.envFlag === 3
|
|
812
|
+
|
|
813
|
+
|
|
541
814
|
if (material.envTextureIndex !== -1 && (material.envFlag === 1 || material.envFlag == 2)) {
|
|
542
815
|
params.envMap = this._loadTexture(data.textures[material.envTextureIndex], textures);
|
|
543
|
-
params.combine = material.envFlag === 1 ?
|
|
544
|
-
}
|
|
816
|
+
params.combine = material.envFlag === 1 ? MultiplyOperation : AddOperation;
|
|
817
|
+
} // gradientMap
|
|
818
|
+
|
|
819
|
+
|
|
545
820
|
let toonFileName, isDefaultToon;
|
|
821
|
+
|
|
546
822
|
if (material.toonIndex === -1 || material.toonFlag !== 0) {
|
|
547
|
-
toonFileName =
|
|
823
|
+
toonFileName = 'toon' + ('0' + (material.toonIndex + 1)).slice(-2) + '.bmp';
|
|
548
824
|
isDefaultToon = true;
|
|
549
825
|
} else {
|
|
550
826
|
toonFileName = data.textures[material.toonIndex];
|
|
551
827
|
isDefaultToon = false;
|
|
552
828
|
}
|
|
829
|
+
|
|
553
830
|
params.gradientMap = this._loadTexture(toonFileName, textures, {
|
|
554
831
|
isToonTexture: true,
|
|
555
832
|
isDefaultToonTexture: isDefaultToon
|
|
556
|
-
});
|
|
833
|
+
}); // parameters for OutlineEffect
|
|
834
|
+
|
|
557
835
|
params.userData.outlineParameters = {
|
|
558
836
|
thickness: material.edgeSize / 300,
|
|
837
|
+
// TODO: better calculation?
|
|
559
838
|
color: material.edgeColor.slice(0, 3),
|
|
560
839
|
alpha: material.edgeColor[3],
|
|
561
|
-
visible: (material.flag &
|
|
840
|
+
visible: (material.flag & 0x10) !== 0 && material.edgeSize > 0.0
|
|
562
841
|
};
|
|
563
842
|
}
|
|
564
|
-
|
|
843
|
+
|
|
844
|
+
if (params.map !== undefined) {
|
|
565
845
|
if (!params.transparent) {
|
|
566
846
|
this._checkImageTransparency(params.map, geometry, i);
|
|
567
847
|
}
|
|
848
|
+
|
|
568
849
|
params.emissive.multiplyScalar(0.2);
|
|
569
850
|
}
|
|
570
|
-
|
|
851
|
+
|
|
852
|
+
materials.push(new MeshToonMaterial(params));
|
|
571
853
|
}
|
|
572
|
-
|
|
573
|
-
|
|
854
|
+
|
|
855
|
+
if (data.metadata.format === 'pmx') {
|
|
856
|
+
// set transparent true if alpha morph is defined.
|
|
857
|
+
function checkAlphaMorph(elements, materials) {
|
|
574
858
|
for (let i = 0, il = elements.length; i < il; i++) {
|
|
575
859
|
const element = elements[i];
|
|
576
|
-
if (element.index === -1)
|
|
577
|
-
|
|
578
|
-
|
|
860
|
+
if (element.index === -1) continue;
|
|
861
|
+
const material = materials[element.index];
|
|
862
|
+
|
|
579
863
|
if (material.opacity !== element.diffuse[3]) {
|
|
580
864
|
material.transparent = true;
|
|
581
865
|
}
|
|
582
866
|
}
|
|
583
|
-
}
|
|
867
|
+
}
|
|
868
|
+
|
|
584
869
|
for (let i = 0, il = data.morphs.length; i < il; i++) {
|
|
585
870
|
const morph = data.morphs[i];
|
|
586
871
|
const elements = morph.elements;
|
|
872
|
+
|
|
587
873
|
if (morph.type === 0) {
|
|
588
874
|
for (let j = 0, jl = elements.length; j < jl; j++) {
|
|
589
875
|
const morph2 = data.morphs[elements[j].index];
|
|
590
|
-
if (morph2.type !== 8)
|
|
591
|
-
continue;
|
|
876
|
+
if (morph2.type !== 8) continue;
|
|
592
877
|
checkAlphaMorph(morph2.elements, materials);
|
|
593
878
|
}
|
|
594
879
|
} else if (morph.type === 8) {
|
|
@@ -596,175 +881,227 @@ class MaterialBuilder {
|
|
|
596
881
|
}
|
|
597
882
|
}
|
|
598
883
|
}
|
|
884
|
+
|
|
599
885
|
return materials;
|
|
600
|
-
}
|
|
886
|
+
} // private methods
|
|
887
|
+
|
|
888
|
+
|
|
601
889
|
_getTGALoader() {
|
|
602
890
|
if (this.tgaLoader === null) {
|
|
603
|
-
if (TGALoader
|
|
604
|
-
throw new Error(
|
|
891
|
+
if (TGALoader === undefined) {
|
|
892
|
+
throw new Error('THREE.MMDLoader: Import TGALoader');
|
|
605
893
|
}
|
|
606
|
-
|
|
894
|
+
|
|
895
|
+
this.tgaLoader = new TGALoader(this.manager);
|
|
607
896
|
}
|
|
897
|
+
|
|
608
898
|
return this.tgaLoader;
|
|
609
899
|
}
|
|
900
|
+
|
|
610
901
|
_isDefaultToonTexture(name) {
|
|
611
|
-
if (name.length !== 10)
|
|
612
|
-
return false;
|
|
902
|
+
if (name.length !== 10) return false;
|
|
613
903
|
return /toon(10|0[0-9])\.bmp/.test(name);
|
|
614
904
|
}
|
|
905
|
+
|
|
615
906
|
_loadTexture(filePath, textures, params, onProgress, onError) {
|
|
616
907
|
params = params || {};
|
|
617
908
|
const scope = this;
|
|
618
909
|
let fullPath;
|
|
910
|
+
|
|
619
911
|
if (params.isDefaultToonTexture === true) {
|
|
620
912
|
let index;
|
|
913
|
+
|
|
621
914
|
try {
|
|
622
915
|
index = parseInt(filePath.match(/toon([0-9]{2})\.bmp$/)[1]);
|
|
623
916
|
} catch (e) {
|
|
624
|
-
console.warn(
|
|
625
|
-
"THREE.MMDLoader: " + filePath + " seems like a not right default texture path. Using toon00.bmp instead."
|
|
626
|
-
);
|
|
917
|
+
console.warn('THREE.MMDLoader: ' + filePath + ' seems like a ' + 'not right default texture path. Using toon00.bmp instead.');
|
|
627
918
|
index = 0;
|
|
628
919
|
}
|
|
920
|
+
|
|
629
921
|
fullPath = DEFAULT_TOON_TEXTURES[index];
|
|
630
922
|
} else {
|
|
631
923
|
fullPath = this.resourcePath + filePath;
|
|
632
924
|
}
|
|
633
|
-
|
|
634
|
-
|
|
925
|
+
|
|
926
|
+
if (textures[fullPath] !== undefined) return textures[fullPath];
|
|
635
927
|
let loader = this.manager.getHandler(fullPath);
|
|
928
|
+
|
|
636
929
|
if (loader === null) {
|
|
637
|
-
loader = filePath.slice(-4).toLowerCase() ===
|
|
930
|
+
loader = filePath.slice(-4).toLowerCase() === '.tga' ? this._getTGALoader() : this.textureLoader;
|
|
638
931
|
}
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
t.
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
932
|
+
|
|
933
|
+
const texture = loader.load(fullPath, function (t) {
|
|
934
|
+
// MMD toon texture is Axis-Y oriented
|
|
935
|
+
// but Three.js gradient map is Axis-X oriented.
|
|
936
|
+
// So here replaces the toon texture image with the rotated one.
|
|
937
|
+
if (params.isToonTexture === true) {
|
|
938
|
+
t.image = scope._getRotatedImage(t.image);
|
|
939
|
+
t.magFilter = NearestFilter;
|
|
940
|
+
t.minFilter = NearestFilter;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
t.flipY = false;
|
|
944
|
+
t.wrapS = RepeatWrapping;
|
|
945
|
+
t.wrapT = RepeatWrapping;
|
|
946
|
+
|
|
947
|
+
for (let i = 0; i < texture.readyCallbacks.length; i++) {
|
|
948
|
+
texture.readyCallbacks[i](texture);
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
delete texture.readyCallbacks;
|
|
952
|
+
}, onProgress, onError);
|
|
658
953
|
texture.readyCallbacks = [];
|
|
659
954
|
textures[fullPath] = texture;
|
|
660
955
|
return texture;
|
|
661
956
|
}
|
|
957
|
+
|
|
662
958
|
_getRotatedImage(image) {
|
|
663
|
-
const canvas = document.createElement(
|
|
664
|
-
const context = canvas.getContext(
|
|
959
|
+
const canvas = document.createElement('canvas');
|
|
960
|
+
const context = canvas.getContext('2d');
|
|
665
961
|
const width = image.width;
|
|
666
962
|
const height = image.height;
|
|
667
963
|
canvas.width = width;
|
|
668
964
|
canvas.height = height;
|
|
669
965
|
context.clearRect(0, 0, width, height);
|
|
670
|
-
context.translate(width / 2, height / 2);
|
|
671
|
-
context.rotate(0.5 * Math.PI);
|
|
672
|
-
|
|
966
|
+
context.translate(width / 2.0, height / 2.0);
|
|
967
|
+
context.rotate(0.5 * Math.PI); // 90.0 * Math.PI / 180.0
|
|
968
|
+
|
|
969
|
+
context.translate(-width / 2.0, -height / 2.0);
|
|
673
970
|
context.drawImage(image, 0, 0);
|
|
674
971
|
return context.getImageData(0, 0, width, height);
|
|
675
|
-
}
|
|
972
|
+
} // Check if the partial image area used by the texture is transparent.
|
|
973
|
+
|
|
974
|
+
|
|
676
975
|
_checkImageTransparency(map, geometry, groupIndex) {
|
|
677
|
-
map.readyCallbacks.push(function(texture) {
|
|
976
|
+
map.readyCallbacks.push(function (texture) {
|
|
977
|
+
// Is there any efficient ways?
|
|
678
978
|
function createImageData(image) {
|
|
679
|
-
const canvas = document.createElement(
|
|
979
|
+
const canvas = document.createElement('canvas');
|
|
680
980
|
canvas.width = image.width;
|
|
681
981
|
canvas.height = image.height;
|
|
682
|
-
const context = canvas.getContext(
|
|
982
|
+
const context = canvas.getContext('2d');
|
|
683
983
|
context.drawImage(image, 0, 0);
|
|
684
984
|
return context.getImageData(0, 0, canvas.width, canvas.height);
|
|
685
985
|
}
|
|
986
|
+
|
|
686
987
|
function detectImageTransparency(image, uvs, indices) {
|
|
687
988
|
const width = image.width;
|
|
688
989
|
const height = image.height;
|
|
689
990
|
const data = image.data;
|
|
690
991
|
const threshold = 253;
|
|
691
|
-
if (data.length / (width * height) !== 4)
|
|
692
|
-
|
|
992
|
+
if (data.length / (width * height) !== 4) return false;
|
|
993
|
+
|
|
693
994
|
for (let i = 0; i < indices.length; i += 3) {
|
|
694
|
-
const centerUV = {
|
|
995
|
+
const centerUV = {
|
|
996
|
+
x: 0.0,
|
|
997
|
+
y: 0.0
|
|
998
|
+
};
|
|
999
|
+
|
|
695
1000
|
for (let j = 0; j < 3; j++) {
|
|
696
1001
|
const index = indices[i * 3 + j];
|
|
697
|
-
const uv = {
|
|
698
|
-
|
|
699
|
-
|
|
1002
|
+
const uv = {
|
|
1003
|
+
x: uvs[index * 2 + 0],
|
|
1004
|
+
y: uvs[index * 2 + 1]
|
|
1005
|
+
};
|
|
1006
|
+
if (getAlphaByUv(image, uv) < threshold) return true;
|
|
700
1007
|
centerUV.x += uv.x;
|
|
701
1008
|
centerUV.y += uv.y;
|
|
702
1009
|
}
|
|
1010
|
+
|
|
703
1011
|
centerUV.x /= 3;
|
|
704
1012
|
centerUV.y /= 3;
|
|
705
|
-
if (getAlphaByUv(image, centerUV) < threshold)
|
|
706
|
-
return true;
|
|
1013
|
+
if (getAlphaByUv(image, centerUV) < threshold) return true;
|
|
707
1014
|
}
|
|
1015
|
+
|
|
708
1016
|
return false;
|
|
709
1017
|
}
|
|
1018
|
+
/*
|
|
1019
|
+
* This method expects
|
|
1020
|
+
* texture.flipY = false
|
|
1021
|
+
* texture.wrapS = RepeatWrapping
|
|
1022
|
+
* texture.wrapT = RepeatWrapping
|
|
1023
|
+
* TODO: more precise
|
|
1024
|
+
*/
|
|
1025
|
+
|
|
1026
|
+
|
|
710
1027
|
function getAlphaByUv(image, uv) {
|
|
711
1028
|
const width = image.width;
|
|
712
1029
|
const height = image.height;
|
|
713
1030
|
let x = Math.round(uv.x * width) % width;
|
|
714
1031
|
let y = Math.round(uv.y * height) % height;
|
|
715
|
-
if (x < 0)
|
|
716
|
-
|
|
717
|
-
if (y < 0)
|
|
718
|
-
y += height;
|
|
1032
|
+
if (x < 0) x += width;
|
|
1033
|
+
if (y < 0) y += height;
|
|
719
1034
|
const index = y * width + x;
|
|
720
1035
|
return image.data[index * 4 + 3];
|
|
721
1036
|
}
|
|
722
|
-
|
|
1037
|
+
|
|
1038
|
+
const imageData = texture.image.data !== undefined ? texture.image : createImageData(texture.image);
|
|
723
1039
|
const group = geometry.groups[groupIndex];
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
geometry.attributes.uv.array,
|
|
727
|
-
geometry.index.array.slice(group.start, group.start + group.count)
|
|
728
|
-
)) {
|
|
1040
|
+
|
|
1041
|
+
if (detectImageTransparency(imageData, geometry.attributes.uv.array, geometry.index.array.slice(group.start, group.start + group.count))) {
|
|
729
1042
|
map.transparent = true;
|
|
730
1043
|
}
|
|
731
1044
|
});
|
|
732
1045
|
}
|
|
733
|
-
|
|
1046
|
+
|
|
1047
|
+
} //
|
|
1048
|
+
|
|
1049
|
+
|
|
734
1050
|
class AnimationBuilder {
|
|
1051
|
+
/**
|
|
1052
|
+
* @param {Object} vmd - parsed VMD data
|
|
1053
|
+
* @param {SkinnedMesh} mesh - tracks will be fitting to mesh
|
|
1054
|
+
* @return {AnimationClip}
|
|
1055
|
+
*/
|
|
735
1056
|
build(vmd, mesh) {
|
|
1057
|
+
// combine skeletal and morph animations
|
|
736
1058
|
const tracks = this.buildSkeletalAnimation(vmd, mesh).tracks;
|
|
737
1059
|
const tracks2 = this.buildMorphAnimation(vmd, mesh).tracks;
|
|
1060
|
+
|
|
738
1061
|
for (let i = 0, il = tracks2.length; i < il; i++) {
|
|
739
1062
|
tracks.push(tracks2[i]);
|
|
740
1063
|
}
|
|
741
|
-
|
|
1064
|
+
|
|
1065
|
+
return new AnimationClip('', -1, tracks);
|
|
742
1066
|
}
|
|
1067
|
+
/**
|
|
1068
|
+
* @param {Object} vmd - parsed VMD data
|
|
1069
|
+
* @param {SkinnedMesh} mesh - tracks will be fitting to mesh
|
|
1070
|
+
* @return {AnimationClip}
|
|
1071
|
+
*/
|
|
1072
|
+
|
|
1073
|
+
|
|
743
1074
|
buildSkeletalAnimation(vmd, mesh) {
|
|
744
1075
|
function pushInterpolation(array, interpolation, index) {
|
|
745
|
-
array.push(interpolation[index + 0] / 127);
|
|
746
|
-
|
|
747
|
-
array.push(interpolation[index +
|
|
748
|
-
|
|
1076
|
+
array.push(interpolation[index + 0] / 127); // x1
|
|
1077
|
+
|
|
1078
|
+
array.push(interpolation[index + 8] / 127); // x2
|
|
1079
|
+
|
|
1080
|
+
array.push(interpolation[index + 4] / 127); // y1
|
|
1081
|
+
|
|
1082
|
+
array.push(interpolation[index + 12] / 127); // y2
|
|
749
1083
|
}
|
|
1084
|
+
|
|
750
1085
|
const tracks = [];
|
|
751
1086
|
const motions = {};
|
|
752
1087
|
const bones = mesh.skeleton.bones;
|
|
753
1088
|
const boneNameDictionary = {};
|
|
1089
|
+
|
|
754
1090
|
for (let i = 0, il = bones.length; i < il; i++) {
|
|
755
1091
|
boneNameDictionary[bones[i].name] = true;
|
|
756
1092
|
}
|
|
1093
|
+
|
|
757
1094
|
for (let i = 0; i < vmd.metadata.motionCount; i++) {
|
|
758
1095
|
const motion = vmd.motions[i];
|
|
759
1096
|
const boneName = motion.boneName;
|
|
760
|
-
if (boneNameDictionary[boneName] ===
|
|
761
|
-
continue;
|
|
1097
|
+
if (boneNameDictionary[boneName] === undefined) continue;
|
|
762
1098
|
motions[boneName] = motions[boneName] || [];
|
|
763
1099
|
motions[boneName].push(motion);
|
|
764
1100
|
}
|
|
1101
|
+
|
|
765
1102
|
for (const key in motions) {
|
|
766
1103
|
const array = motions[key];
|
|
767
|
-
array.sort(function(a, b) {
|
|
1104
|
+
array.sort(function (a, b) {
|
|
768
1105
|
return a.frameNum - b.frameNum;
|
|
769
1106
|
});
|
|
770
1107
|
const times = [];
|
|
@@ -773,75 +1110,100 @@ class AnimationBuilder {
|
|
|
773
1110
|
const pInterpolations = [];
|
|
774
1111
|
const rInterpolations = [];
|
|
775
1112
|
const basePosition = mesh.skeleton.getBoneByName(key).position.toArray();
|
|
1113
|
+
|
|
776
1114
|
for (let i = 0, il = array.length; i < il; i++) {
|
|
777
1115
|
const time = array[i].frameNum / 30;
|
|
778
1116
|
const position = array[i].position;
|
|
779
1117
|
const rotation = array[i].rotation;
|
|
780
1118
|
const interpolation = array[i].interpolation;
|
|
781
1119
|
times.push(time);
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
1120
|
+
|
|
1121
|
+
for (let j = 0; j < 3; j++) positions.push(basePosition[j] + position[j]);
|
|
1122
|
+
|
|
1123
|
+
for (let j = 0; j < 4; j++) rotations.push(rotation[j]);
|
|
1124
|
+
|
|
1125
|
+
for (let j = 0; j < 3; j++) pushInterpolation(pInterpolations, interpolation, j);
|
|
1126
|
+
|
|
788
1127
|
pushInterpolation(rInterpolations, interpolation, 3);
|
|
789
1128
|
}
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
tracks.push(
|
|
793
|
-
|
|
794
|
-
);
|
|
1129
|
+
|
|
1130
|
+
const targetName = '.bones[' + key + ']';
|
|
1131
|
+
tracks.push(this._createTrack(targetName + '.position', VectorKeyframeTrack, times, positions, pInterpolations));
|
|
1132
|
+
tracks.push(this._createTrack(targetName + '.quaternion', QuaternionKeyframeTrack, times, rotations, rInterpolations));
|
|
795
1133
|
}
|
|
796
|
-
|
|
1134
|
+
|
|
1135
|
+
return new AnimationClip('', -1, tracks);
|
|
797
1136
|
}
|
|
1137
|
+
/**
|
|
1138
|
+
* @param {Object} vmd - parsed VMD data
|
|
1139
|
+
* @param {SkinnedMesh} mesh - tracks will be fitting to mesh
|
|
1140
|
+
* @return {AnimationClip}
|
|
1141
|
+
*/
|
|
1142
|
+
|
|
1143
|
+
|
|
798
1144
|
buildMorphAnimation(vmd, mesh) {
|
|
799
1145
|
const tracks = [];
|
|
800
1146
|
const morphs = {};
|
|
801
1147
|
const morphTargetDictionary = mesh.morphTargetDictionary;
|
|
1148
|
+
|
|
802
1149
|
for (let i = 0; i < vmd.metadata.morphCount; i++) {
|
|
803
1150
|
const morph = vmd.morphs[i];
|
|
804
1151
|
const morphName = morph.morphName;
|
|
805
|
-
if (morphTargetDictionary[morphName] ===
|
|
806
|
-
continue;
|
|
1152
|
+
if (morphTargetDictionary[morphName] === undefined) continue;
|
|
807
1153
|
morphs[morphName] = morphs[morphName] || [];
|
|
808
1154
|
morphs[morphName].push(morph);
|
|
809
1155
|
}
|
|
1156
|
+
|
|
810
1157
|
for (const key in morphs) {
|
|
811
1158
|
const array = morphs[key];
|
|
812
|
-
array.sort(function(a, b) {
|
|
1159
|
+
array.sort(function (a, b) {
|
|
813
1160
|
return a.frameNum - b.frameNum;
|
|
814
1161
|
});
|
|
815
1162
|
const times = [];
|
|
816
1163
|
const values = [];
|
|
1164
|
+
|
|
817
1165
|
for (let i = 0, il = array.length; i < il; i++) {
|
|
818
1166
|
times.push(array[i].frameNum / 30);
|
|
819
1167
|
values.push(array[i].weight);
|
|
820
1168
|
}
|
|
821
|
-
|
|
1169
|
+
|
|
1170
|
+
tracks.push(new NumberKeyframeTrack('.morphTargetInfluences[' + morphTargetDictionary[key] + ']', times, values));
|
|
822
1171
|
}
|
|
823
|
-
|
|
1172
|
+
|
|
1173
|
+
return new AnimationClip('', -1, tracks);
|
|
824
1174
|
}
|
|
1175
|
+
/**
|
|
1176
|
+
* @param {Object} vmd - parsed VMD data
|
|
1177
|
+
* @return {AnimationClip}
|
|
1178
|
+
*/
|
|
1179
|
+
|
|
1180
|
+
|
|
825
1181
|
buildCameraAnimation(vmd) {
|
|
826
1182
|
function pushVector3(array, vec) {
|
|
827
1183
|
array.push(vec.x);
|
|
828
1184
|
array.push(vec.y);
|
|
829
1185
|
array.push(vec.z);
|
|
830
1186
|
}
|
|
1187
|
+
|
|
831
1188
|
function pushQuaternion(array, q) {
|
|
832
1189
|
array.push(q.x);
|
|
833
1190
|
array.push(q.y);
|
|
834
1191
|
array.push(q.z);
|
|
835
1192
|
array.push(q.w);
|
|
836
1193
|
}
|
|
1194
|
+
|
|
837
1195
|
function pushInterpolation(array, interpolation, index) {
|
|
838
|
-
array.push(interpolation[index * 4 + 0] / 127);
|
|
839
|
-
|
|
840
|
-
array.push(interpolation[index * 4 +
|
|
841
|
-
|
|
1196
|
+
array.push(interpolation[index * 4 + 0] / 127); // x1
|
|
1197
|
+
|
|
1198
|
+
array.push(interpolation[index * 4 + 1] / 127); // x2
|
|
1199
|
+
|
|
1200
|
+
array.push(interpolation[index * 4 + 2] / 127); // y1
|
|
1201
|
+
|
|
1202
|
+
array.push(interpolation[index * 4 + 3] / 127); // y2
|
|
842
1203
|
}
|
|
843
|
-
|
|
844
|
-
cameras.
|
|
1204
|
+
|
|
1205
|
+
const cameras = vmd.cameras === undefined ? [] : vmd.cameras.slice();
|
|
1206
|
+
cameras.sort(function (a, b) {
|
|
845
1207
|
return a.frameNum - b.frameNum;
|
|
846
1208
|
});
|
|
847
1209
|
const times = [];
|
|
@@ -853,10 +1215,11 @@ class AnimationBuilder {
|
|
|
853
1215
|
const qInterpolations = [];
|
|
854
1216
|
const pInterpolations = [];
|
|
855
1217
|
const fInterpolations = [];
|
|
856
|
-
const quaternion = new
|
|
857
|
-
const euler = new
|
|
858
|
-
const position = new
|
|
859
|
-
const center = new
|
|
1218
|
+
const quaternion = new Quaternion();
|
|
1219
|
+
const euler = new Euler();
|
|
1220
|
+
const position = new Vector3();
|
|
1221
|
+
const center = new Vector3();
|
|
1222
|
+
|
|
860
1223
|
for (let i = 0, il = cameras.length; i < il; i++) {
|
|
861
1224
|
const motion = cameras[i];
|
|
862
1225
|
const time = motion.frameNum / 30;
|
|
@@ -876,23 +1239,36 @@ class AnimationBuilder {
|
|
|
876
1239
|
pushQuaternion(quaternions, quaternion);
|
|
877
1240
|
pushVector3(positions, position);
|
|
878
1241
|
fovs.push(fov);
|
|
1242
|
+
|
|
879
1243
|
for (let j = 0; j < 3; j++) {
|
|
880
1244
|
pushInterpolation(cInterpolations, interpolation, j);
|
|
881
1245
|
}
|
|
882
|
-
|
|
1246
|
+
|
|
1247
|
+
pushInterpolation(qInterpolations, interpolation, 3); // use the same parameter for x, y, z axis.
|
|
1248
|
+
|
|
883
1249
|
for (let j = 0; j < 3; j++) {
|
|
884
1250
|
pushInterpolation(pInterpolations, interpolation, 4);
|
|
885
1251
|
}
|
|
1252
|
+
|
|
886
1253
|
pushInterpolation(fInterpolations, interpolation, 5);
|
|
887
1254
|
}
|
|
888
|
-
|
|
889
|
-
tracks
|
|
890
|
-
|
|
891
|
-
tracks.push(this._createTrack(
|
|
892
|
-
tracks.push(this._createTrack(
|
|
893
|
-
|
|
894
|
-
|
|
1255
|
+
|
|
1256
|
+
const tracks = []; // I expect an object whose name 'target' exists under THREE.Camera
|
|
1257
|
+
|
|
1258
|
+
tracks.push(this._createTrack('target.position', VectorKeyframeTrack, times, centers, cInterpolations));
|
|
1259
|
+
tracks.push(this._createTrack('.quaternion', QuaternionKeyframeTrack, times, quaternions, qInterpolations));
|
|
1260
|
+
tracks.push(this._createTrack('.position', VectorKeyframeTrack, times, positions, pInterpolations));
|
|
1261
|
+
tracks.push(this._createTrack('.fov', NumberKeyframeTrack, times, fovs, fInterpolations));
|
|
1262
|
+
return new AnimationClip('', -1, tracks);
|
|
1263
|
+
} // private method
|
|
1264
|
+
|
|
1265
|
+
|
|
895
1266
|
_createTrack(node, typedKeyframeTrack, times, values, interpolations) {
|
|
1267
|
+
/*
|
|
1268
|
+
* optimizes here not to let KeyframeTrackPrototype optimize
|
|
1269
|
+
* because KeyframeTrackPrototype optimizes times and values but
|
|
1270
|
+
* doesn't optimize interpolations.
|
|
1271
|
+
*/
|
|
896
1272
|
if (times.length > 2) {
|
|
897
1273
|
times = times.slice();
|
|
898
1274
|
values = values.slice();
|
|
@@ -900,6 +1276,7 @@ class AnimationBuilder {
|
|
|
900
1276
|
const stride = values.length / times.length;
|
|
901
1277
|
const interpolateStride = interpolations.length / times.length;
|
|
902
1278
|
let index = 1;
|
|
1279
|
+
|
|
903
1280
|
for (let aheadIndex = 2, endIndex = times.length; aheadIndex < endIndex; aheadIndex++) {
|
|
904
1281
|
for (let i = 0; i < stride; i++) {
|
|
905
1282
|
if (values[index * stride + i] !== values[(index - 1) * stride + i] || values[index * stride + i] !== values[aheadIndex * stride + i]) {
|
|
@@ -907,92 +1284,151 @@ class AnimationBuilder {
|
|
|
907
1284
|
break;
|
|
908
1285
|
}
|
|
909
1286
|
}
|
|
1287
|
+
|
|
910
1288
|
if (aheadIndex > index) {
|
|
911
1289
|
times[index] = times[aheadIndex];
|
|
1290
|
+
|
|
912
1291
|
for (let i = 0; i < stride; i++) {
|
|
913
1292
|
values[index * stride + i] = values[aheadIndex * stride + i];
|
|
914
1293
|
}
|
|
1294
|
+
|
|
915
1295
|
for (let i = 0; i < interpolateStride; i++) {
|
|
916
1296
|
interpolations[index * interpolateStride + i] = interpolations[aheadIndex * interpolateStride + i];
|
|
917
1297
|
}
|
|
918
1298
|
}
|
|
919
1299
|
}
|
|
1300
|
+
|
|
920
1301
|
times.length = index + 1;
|
|
921
1302
|
values.length = (index + 1) * stride;
|
|
922
1303
|
interpolations.length = (index + 1) * interpolateStride;
|
|
923
1304
|
}
|
|
1305
|
+
|
|
924
1306
|
const track = new typedKeyframeTrack(node, times, values);
|
|
1307
|
+
|
|
925
1308
|
track.createInterpolant = function InterpolantFactoryMethodCubicBezier(result) {
|
|
926
|
-
return new CubicBezierInterpolation(
|
|
927
|
-
this.times,
|
|
928
|
-
this.values,
|
|
929
|
-
this.getValueSize(),
|
|
930
|
-
result,
|
|
931
|
-
new Float32Array(interpolations)
|
|
932
|
-
);
|
|
1309
|
+
return new CubicBezierInterpolation(this.times, this.values, this.getValueSize(), result, new Float32Array(interpolations));
|
|
933
1310
|
};
|
|
1311
|
+
|
|
934
1312
|
return track;
|
|
935
1313
|
}
|
|
936
|
-
|
|
937
|
-
|
|
1314
|
+
|
|
1315
|
+
} // interpolation
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
class CubicBezierInterpolation extends Interpolant {
|
|
938
1319
|
constructor(parameterPositions, sampleValues, sampleSize, resultBuffer, params) {
|
|
939
1320
|
super(parameterPositions, sampleValues, sampleSize, resultBuffer);
|
|
940
1321
|
this.interpolationParams = params;
|
|
941
1322
|
}
|
|
1323
|
+
|
|
942
1324
|
interpolate_(i1, t0, t, t1) {
|
|
943
1325
|
const result = this.resultBuffer;
|
|
944
1326
|
const values = this.sampleValues;
|
|
945
1327
|
const stride = this.valueSize;
|
|
946
1328
|
const params = this.interpolationParams;
|
|
947
1329
|
const offset1 = i1 * stride;
|
|
948
|
-
const offset0 = offset1 - stride;
|
|
949
|
-
|
|
1330
|
+
const offset0 = offset1 - stride; // No interpolation if next key frame is in one frame in 30fps.
|
|
1331
|
+
// This is from MMD animation spec.
|
|
1332
|
+
// '1.5' is for precision loss. times are Float32 in Three.js Animation system.
|
|
1333
|
+
|
|
1334
|
+
const weight1 = t1 - t0 < 1 / 30 * 1.5 ? 0.0 : (t - t0) / (t1 - t0);
|
|
1335
|
+
|
|
950
1336
|
if (stride === 4) {
|
|
1337
|
+
// Quaternion
|
|
951
1338
|
const x1 = params[i1 * 4 + 0];
|
|
952
1339
|
const x2 = params[i1 * 4 + 1];
|
|
953
1340
|
const y1 = params[i1 * 4 + 2];
|
|
954
1341
|
const y2 = params[i1 * 4 + 3];
|
|
1342
|
+
|
|
955
1343
|
const ratio = this._calculate(x1, x2, y1, y2, weight1);
|
|
956
|
-
|
|
1344
|
+
|
|
1345
|
+
Quaternion.slerpFlat(result, 0, values, offset0, values, offset1, ratio);
|
|
957
1346
|
} else if (stride === 3) {
|
|
1347
|
+
// Vector3
|
|
958
1348
|
for (let i = 0; i !== stride; ++i) {
|
|
959
1349
|
const x1 = params[i1 * 12 + i * 4 + 0];
|
|
960
1350
|
const x2 = params[i1 * 12 + i * 4 + 1];
|
|
961
1351
|
const y1 = params[i1 * 12 + i * 4 + 2];
|
|
962
1352
|
const y2 = params[i1 * 12 + i * 4 + 3];
|
|
1353
|
+
|
|
963
1354
|
const ratio = this._calculate(x1, x2, y1, y2, weight1);
|
|
1355
|
+
|
|
964
1356
|
result[i] = values[offset0 + i] * (1 - ratio) + values[offset1 + i] * ratio;
|
|
965
1357
|
}
|
|
966
1358
|
} else {
|
|
1359
|
+
// Number
|
|
967
1360
|
const x1 = params[i1 * 4 + 0];
|
|
968
1361
|
const x2 = params[i1 * 4 + 1];
|
|
969
1362
|
const y1 = params[i1 * 4 + 2];
|
|
970
1363
|
const y2 = params[i1 * 4 + 3];
|
|
1364
|
+
|
|
971
1365
|
const ratio = this._calculate(x1, x2, y1, y2, weight1);
|
|
1366
|
+
|
|
972
1367
|
result[0] = values[offset0] * (1 - ratio) + values[offset1] * ratio;
|
|
973
1368
|
}
|
|
1369
|
+
|
|
974
1370
|
return result;
|
|
975
1371
|
}
|
|
1372
|
+
|
|
976
1373
|
_calculate(x1, x2, y1, y2, x) {
|
|
1374
|
+
/*
|
|
1375
|
+
* Cubic Bezier curves
|
|
1376
|
+
* https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves
|
|
1377
|
+
*
|
|
1378
|
+
* B(t) = ( 1 - t ) ^ 3 * P0
|
|
1379
|
+
* + 3 * ( 1 - t ) ^ 2 * t * P1
|
|
1380
|
+
* + 3 * ( 1 - t ) * t^2 * P2
|
|
1381
|
+
* + t ^ 3 * P3
|
|
1382
|
+
* ( 0 <= t <= 1 )
|
|
1383
|
+
*
|
|
1384
|
+
* MMD uses Cubic Bezier curves for bone and camera animation interpolation.
|
|
1385
|
+
* http://d.hatena.ne.jp/edvakf/20111016/1318716097
|
|
1386
|
+
*
|
|
1387
|
+
* x = ( 1 - t ) ^ 3 * x0
|
|
1388
|
+
* + 3 * ( 1 - t ) ^ 2 * t * x1
|
|
1389
|
+
* + 3 * ( 1 - t ) * t^2 * x2
|
|
1390
|
+
* + t ^ 3 * x3
|
|
1391
|
+
* y = ( 1 - t ) ^ 3 * y0
|
|
1392
|
+
* + 3 * ( 1 - t ) ^ 2 * t * y1
|
|
1393
|
+
* + 3 * ( 1 - t ) * t^2 * y2
|
|
1394
|
+
* + t ^ 3 * y3
|
|
1395
|
+
* ( x0 = 0, y0 = 0 )
|
|
1396
|
+
* ( x3 = 1, y3 = 1 )
|
|
1397
|
+
* ( 0 <= t, x1, x2, y1, y2 <= 1 )
|
|
1398
|
+
*
|
|
1399
|
+
* Here solves this equation with Bisection method,
|
|
1400
|
+
* https://en.wikipedia.org/wiki/Bisection_method
|
|
1401
|
+
* gets t, and then calculate y.
|
|
1402
|
+
*
|
|
1403
|
+
* f(t) = 3 * ( 1 - t ) ^ 2 * t * x1
|
|
1404
|
+
* + 3 * ( 1 - t ) * t^2 * x2
|
|
1405
|
+
* + t ^ 3 - x = 0
|
|
1406
|
+
*
|
|
1407
|
+
* (Another option: Newton's method
|
|
1408
|
+
* https://en.wikipedia.org/wiki/Newton%27s_method)
|
|
1409
|
+
*/
|
|
977
1410
|
let c = 0.5;
|
|
978
1411
|
let t = c;
|
|
979
|
-
let s = 1 - t;
|
|
1412
|
+
let s = 1.0 - t;
|
|
980
1413
|
const loop = 15;
|
|
981
1414
|
const eps = 1e-5;
|
|
982
1415
|
const math = Math;
|
|
983
1416
|
let sst3, stt3, ttt;
|
|
1417
|
+
|
|
984
1418
|
for (let i = 0; i < loop; i++) {
|
|
985
|
-
sst3 = 3 * s * s * t;
|
|
986
|
-
stt3 = 3 * s * t * t;
|
|
1419
|
+
sst3 = 3.0 * s * s * t;
|
|
1420
|
+
stt3 = 3.0 * s * t * t;
|
|
987
1421
|
ttt = t * t * t;
|
|
988
1422
|
const ft = sst3 * x1 + stt3 * x2 + ttt - x;
|
|
989
|
-
if (math.abs(ft) < eps)
|
|
990
|
-
|
|
991
|
-
c /= 2;
|
|
1423
|
+
if (math.abs(ft) < eps) break;
|
|
1424
|
+
c /= 2.0;
|
|
992
1425
|
t += ft < 0 ? c : -c;
|
|
993
|
-
s = 1 - t;
|
|
1426
|
+
s = 1.0 - t;
|
|
994
1427
|
}
|
|
1428
|
+
|
|
995
1429
|
return sst3 * y1 + stt3 * y2 + ttt;
|
|
996
1430
|
}
|
|
1431
|
+
|
|
997
1432
|
}
|
|
998
|
-
|
|
1433
|
+
|
|
1434
|
+
export { MMDLoader };
|