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/ColladaLoader.js
CHANGED
|
@@ -1,211 +1,255 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class ColladaLoader extends THREE.Loader {
|
|
1
|
+
import { Loader, LoaderUtils, FileLoader, Vector3, Quaternion, Matrix4, MeshBasicMaterial, Scene, TextureLoader, Euler, MathUtils, AnimationClip, VectorKeyframeTrack, QuaternionKeyframeTrack, MeshLambertMaterial, MeshPhongMaterial, Vector2, DoubleSide, FrontSide, PerspectiveCamera, OrthographicCamera, Color, AmbientLight, SpotLight, PointLight, DirectionalLight, BufferGeometry, Float32BufferAttribute, Skeleton, Bone, Group, LineBasicMaterial, SkinnedMesh, Mesh, Line, LineSegments, RepeatWrapping, ClampToEdgeWrapping } from 'three';
|
|
2
|
+
import { TGALoader } from './TGALoader.js';
|
|
3
|
+
|
|
4
|
+
class ColladaLoader extends Loader {
|
|
6
5
|
constructor(manager) {
|
|
7
6
|
super(manager);
|
|
8
7
|
}
|
|
8
|
+
|
|
9
9
|
load(url, onLoad, onProgress, onError) {
|
|
10
10
|
const scope = this;
|
|
11
|
-
const path = scope.path ===
|
|
12
|
-
const loader = new
|
|
11
|
+
const path = scope.path === '' ? LoaderUtils.extractUrlBase(url) : scope.path;
|
|
12
|
+
const loader = new FileLoader(scope.manager);
|
|
13
13
|
loader.setPath(scope.path);
|
|
14
14
|
loader.setRequestHeader(scope.requestHeader);
|
|
15
15
|
loader.setWithCredentials(scope.withCredentials);
|
|
16
|
-
loader.load(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
} else {
|
|
25
|
-
console.error(e);
|
|
26
|
-
}
|
|
27
|
-
scope.manager.itemError(url);
|
|
16
|
+
loader.load(url, function (text) {
|
|
17
|
+
try {
|
|
18
|
+
onLoad(scope.parse(text, path));
|
|
19
|
+
} catch (e) {
|
|
20
|
+
if (onError) {
|
|
21
|
+
onError(e);
|
|
22
|
+
} else {
|
|
23
|
+
console.error(e);
|
|
28
24
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
);
|
|
25
|
+
|
|
26
|
+
scope.manager.itemError(url);
|
|
27
|
+
}
|
|
28
|
+
}, onProgress, onError);
|
|
33
29
|
}
|
|
30
|
+
|
|
34
31
|
parse(text, path) {
|
|
35
|
-
function getElementsByTagName(
|
|
32
|
+
function getElementsByTagName(xml, name) {
|
|
33
|
+
// Non recursive xml.getElementsByTagName() ...
|
|
36
34
|
const array = [];
|
|
37
|
-
const childNodes =
|
|
35
|
+
const childNodes = xml.childNodes;
|
|
36
|
+
|
|
38
37
|
for (let i = 0, l = childNodes.length; i < l; i++) {
|
|
39
38
|
const child = childNodes[i];
|
|
39
|
+
|
|
40
40
|
if (child.nodeName === name) {
|
|
41
41
|
array.push(child);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
|
|
44
45
|
return array;
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const parts =
|
|
47
|
+
|
|
48
|
+
function parseStrings(text) {
|
|
49
|
+
if (text.length === 0) return [];
|
|
50
|
+
const parts = text.trim().split(/\s+/);
|
|
50
51
|
const array = new Array(parts.length);
|
|
52
|
+
|
|
51
53
|
for (let i = 0, l = parts.length; i < l; i++) {
|
|
52
54
|
array[i] = parts[i];
|
|
53
55
|
}
|
|
56
|
+
|
|
54
57
|
return array;
|
|
55
58
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const parts =
|
|
59
|
+
|
|
60
|
+
function parseFloats(text) {
|
|
61
|
+
if (text.length === 0) return [];
|
|
62
|
+
const parts = text.trim().split(/\s+/);
|
|
60
63
|
const array = new Array(parts.length);
|
|
64
|
+
|
|
61
65
|
for (let i = 0, l = parts.length; i < l; i++) {
|
|
62
66
|
array[i] = parseFloat(parts[i]);
|
|
63
67
|
}
|
|
68
|
+
|
|
64
69
|
return array;
|
|
65
70
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const parts =
|
|
71
|
+
|
|
72
|
+
function parseInts(text) {
|
|
73
|
+
if (text.length === 0) return [];
|
|
74
|
+
const parts = text.trim().split(/\s+/);
|
|
70
75
|
const array = new Array(parts.length);
|
|
76
|
+
|
|
71
77
|
for (let i = 0, l = parts.length; i < l; i++) {
|
|
72
78
|
array[i] = parseInt(parts[i]);
|
|
73
79
|
}
|
|
80
|
+
|
|
74
81
|
return array;
|
|
75
82
|
}
|
|
76
|
-
|
|
77
|
-
|
|
83
|
+
|
|
84
|
+
function parseId(text) {
|
|
85
|
+
return text.substring(1);
|
|
78
86
|
}
|
|
87
|
+
|
|
79
88
|
function generateId() {
|
|
80
|
-
return
|
|
89
|
+
return 'three_default_' + count++;
|
|
81
90
|
}
|
|
91
|
+
|
|
82
92
|
function isEmpty(object) {
|
|
83
93
|
return Object.keys(object).length === 0;
|
|
84
|
-
}
|
|
85
|
-
|
|
94
|
+
} // asset
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
function parseAsset(xml) {
|
|
86
98
|
return {
|
|
87
|
-
unit: parseAssetUnit(getElementsByTagName(
|
|
88
|
-
upAxis: parseAssetUpAxis(getElementsByTagName(
|
|
99
|
+
unit: parseAssetUnit(getElementsByTagName(xml, 'unit')[0]),
|
|
100
|
+
upAxis: parseAssetUpAxis(getElementsByTagName(xml, 'up_axis')[0])
|
|
89
101
|
};
|
|
90
102
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
103
|
+
|
|
104
|
+
function parseAssetUnit(xml) {
|
|
105
|
+
if (xml !== undefined && xml.hasAttribute('meter') === true) {
|
|
106
|
+
return parseFloat(xml.getAttribute('meter'));
|
|
94
107
|
} else {
|
|
95
|
-
return 1;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
108
|
+
return 1; // default 1 meter
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function parseAssetUpAxis(xml) {
|
|
113
|
+
return xml !== undefined ? xml.textContent : 'Y_UP';
|
|
114
|
+
} // library
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
function parseLibrary(xml, libraryName, nodeName, parser) {
|
|
118
|
+
const library = getElementsByTagName(xml, libraryName)[0];
|
|
119
|
+
|
|
120
|
+
if (library !== undefined) {
|
|
121
|
+
const elements = getElementsByTagName(library, nodeName);
|
|
122
|
+
|
|
105
123
|
for (let i = 0; i < elements.length; i++) {
|
|
106
124
|
parser(elements[i]);
|
|
107
125
|
}
|
|
108
126
|
}
|
|
109
127
|
}
|
|
128
|
+
|
|
110
129
|
function buildLibrary(data, builder) {
|
|
111
130
|
for (const name in data) {
|
|
112
131
|
const object = data[name];
|
|
113
132
|
object.build = builder(data[name]);
|
|
114
133
|
}
|
|
115
|
-
}
|
|
134
|
+
} // get
|
|
135
|
+
|
|
136
|
+
|
|
116
137
|
function getBuild(data, builder) {
|
|
117
|
-
if (data.build !==
|
|
118
|
-
return data.build;
|
|
138
|
+
if (data.build !== undefined) return data.build;
|
|
119
139
|
data.build = builder(data);
|
|
120
140
|
return data.build;
|
|
121
|
-
}
|
|
122
|
-
|
|
141
|
+
} // animation
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
function parseAnimation(xml) {
|
|
123
145
|
const data = {
|
|
124
146
|
sources: {},
|
|
125
147
|
samplers: {},
|
|
126
148
|
channels: {}
|
|
127
149
|
};
|
|
128
150
|
let hasChildren = false;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
151
|
+
|
|
152
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
153
|
+
const child = xml.childNodes[i];
|
|
154
|
+
if (child.nodeType !== 1) continue;
|
|
133
155
|
let id;
|
|
156
|
+
|
|
134
157
|
switch (child.nodeName) {
|
|
135
|
-
case
|
|
136
|
-
id = child.getAttribute(
|
|
158
|
+
case 'source':
|
|
159
|
+
id = child.getAttribute('id');
|
|
137
160
|
data.sources[id] = parseSource(child);
|
|
138
161
|
break;
|
|
139
|
-
|
|
140
|
-
|
|
162
|
+
|
|
163
|
+
case 'sampler':
|
|
164
|
+
id = child.getAttribute('id');
|
|
141
165
|
data.samplers[id] = parseAnimationSampler(child);
|
|
142
166
|
break;
|
|
143
|
-
|
|
144
|
-
|
|
167
|
+
|
|
168
|
+
case 'channel':
|
|
169
|
+
id = child.getAttribute('target');
|
|
145
170
|
data.channels[id] = parseAnimationChannel(child);
|
|
146
171
|
break;
|
|
147
|
-
|
|
172
|
+
|
|
173
|
+
case 'animation':
|
|
174
|
+
// hierarchy of related animations
|
|
148
175
|
parseAnimation(child);
|
|
149
176
|
hasChildren = true;
|
|
150
177
|
break;
|
|
178
|
+
|
|
151
179
|
default:
|
|
152
180
|
console.log(child);
|
|
153
181
|
}
|
|
154
182
|
}
|
|
183
|
+
|
|
155
184
|
if (hasChildren === false) {
|
|
156
|
-
|
|
185
|
+
// since 'id' attributes can be optional, it's necessary to generate a UUID for unqiue assignment
|
|
186
|
+
library.animations[xml.getAttribute('id') || MathUtils.generateUUID()] = data;
|
|
157
187
|
}
|
|
158
188
|
}
|
|
159
|
-
|
|
189
|
+
|
|
190
|
+
function parseAnimationSampler(xml) {
|
|
160
191
|
const data = {
|
|
161
192
|
inputs: {}
|
|
162
193
|
};
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
194
|
+
|
|
195
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
196
|
+
const child = xml.childNodes[i];
|
|
197
|
+
if (child.nodeType !== 1) continue;
|
|
198
|
+
|
|
167
199
|
switch (child.nodeName) {
|
|
168
|
-
case
|
|
169
|
-
const id = parseId(child.getAttribute(
|
|
170
|
-
const semantic = child.getAttribute(
|
|
200
|
+
case 'input':
|
|
201
|
+
const id = parseId(child.getAttribute('source'));
|
|
202
|
+
const semantic = child.getAttribute('semantic');
|
|
171
203
|
data.inputs[semantic] = id;
|
|
172
204
|
break;
|
|
173
205
|
}
|
|
174
206
|
}
|
|
207
|
+
|
|
175
208
|
return data;
|
|
176
209
|
}
|
|
177
|
-
|
|
210
|
+
|
|
211
|
+
function parseAnimationChannel(xml) {
|
|
178
212
|
const data = {};
|
|
179
|
-
const target =
|
|
180
|
-
|
|
213
|
+
const target = xml.getAttribute('target'); // parsing SID Addressing Syntax
|
|
214
|
+
|
|
215
|
+
let parts = target.split('/');
|
|
181
216
|
const id = parts.shift();
|
|
182
|
-
let sid = parts.shift();
|
|
183
|
-
|
|
184
|
-
const
|
|
217
|
+
let sid = parts.shift(); // check selection syntax
|
|
218
|
+
|
|
219
|
+
const arraySyntax = sid.indexOf('(') !== -1;
|
|
220
|
+
const memberSyntax = sid.indexOf('.') !== -1;
|
|
221
|
+
|
|
185
222
|
if (memberSyntax) {
|
|
186
|
-
|
|
223
|
+
// member selection access
|
|
224
|
+
parts = sid.split('.');
|
|
187
225
|
sid = parts.shift();
|
|
188
226
|
data.member = parts.shift();
|
|
189
227
|
} else if (arraySyntax) {
|
|
190
|
-
|
|
228
|
+
// array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices.
|
|
229
|
+
const indices = sid.split('(');
|
|
191
230
|
sid = indices.shift();
|
|
231
|
+
|
|
192
232
|
for (let i = 0; i < indices.length; i++) {
|
|
193
|
-
indices[i] = parseInt(indices[i].replace(/\)/,
|
|
233
|
+
indices[i] = parseInt(indices[i].replace(/\)/, ''));
|
|
194
234
|
}
|
|
235
|
+
|
|
195
236
|
data.indices = indices;
|
|
196
237
|
}
|
|
238
|
+
|
|
197
239
|
data.id = id;
|
|
198
240
|
data.sid = sid;
|
|
199
241
|
data.arraySyntax = arraySyntax;
|
|
200
242
|
data.memberSyntax = memberSyntax;
|
|
201
|
-
data.sampler = parseId(
|
|
243
|
+
data.sampler = parseId(xml.getAttribute('source'));
|
|
202
244
|
return data;
|
|
203
245
|
}
|
|
246
|
+
|
|
204
247
|
function buildAnimation(data) {
|
|
205
248
|
const tracks = [];
|
|
206
249
|
const channels = data.channels;
|
|
207
250
|
const samplers = data.samplers;
|
|
208
251
|
const sources = data.sources;
|
|
252
|
+
|
|
209
253
|
for (const target in channels) {
|
|
210
254
|
if (channels.hasOwnProperty(target)) {
|
|
211
255
|
const channel = channels[target];
|
|
@@ -218,11 +262,14 @@ class ColladaLoader extends THREE.Loader {
|
|
|
218
262
|
createKeyframeTracks(animation, tracks);
|
|
219
263
|
}
|
|
220
264
|
}
|
|
265
|
+
|
|
221
266
|
return tracks;
|
|
222
267
|
}
|
|
268
|
+
|
|
223
269
|
function getAnimation(id) {
|
|
224
270
|
return getBuild(library.animations[id], buildAnimation);
|
|
225
271
|
}
|
|
272
|
+
|
|
226
273
|
function buildAnimationChannel(channel, inputSource, outputSource) {
|
|
227
274
|
const node = library.nodes[channel.id];
|
|
228
275
|
const object3D = getNode(node.id);
|
|
@@ -230,14 +277,16 @@ class ColladaLoader extends THREE.Loader {
|
|
|
230
277
|
const defaultMatrix = node.matrix.clone().transpose();
|
|
231
278
|
let time, stride;
|
|
232
279
|
let i, il, j, jl;
|
|
233
|
-
const data = {};
|
|
280
|
+
const data = {}; // the collada spec allows the animation of data in various ways.
|
|
281
|
+
// depending on the transform type (matrix, translate, rotate, scale), we execute different logic
|
|
282
|
+
|
|
234
283
|
switch (transform) {
|
|
235
|
-
case
|
|
284
|
+
case 'matrix':
|
|
236
285
|
for (i = 0, il = inputSource.array.length; i < il; i++) {
|
|
237
286
|
time = inputSource.array[i];
|
|
238
287
|
stride = i * outputSource.stride;
|
|
239
|
-
if (data[time] ===
|
|
240
|
-
|
|
288
|
+
if (data[time] === undefined) data[time] = {};
|
|
289
|
+
|
|
241
290
|
if (channel.arraySyntax === true) {
|
|
242
291
|
const value = outputSource.array[stride];
|
|
243
292
|
const index = channel.indices[0] + 4 * channel.indices[1];
|
|
@@ -248,41 +297,58 @@ class ColladaLoader extends THREE.Loader {
|
|
|
248
297
|
}
|
|
249
298
|
}
|
|
250
299
|
}
|
|
300
|
+
|
|
251
301
|
break;
|
|
252
|
-
|
|
302
|
+
|
|
303
|
+
case 'translate':
|
|
253
304
|
console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform);
|
|
254
305
|
break;
|
|
255
|
-
|
|
306
|
+
|
|
307
|
+
case 'rotate':
|
|
256
308
|
console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform);
|
|
257
309
|
break;
|
|
258
|
-
|
|
310
|
+
|
|
311
|
+
case 'scale':
|
|
259
312
|
console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform);
|
|
260
313
|
break;
|
|
261
314
|
}
|
|
315
|
+
|
|
262
316
|
const keyframes = prepareAnimationData(data, defaultMatrix);
|
|
263
317
|
const animation = {
|
|
264
318
|
name: object3D.uuid,
|
|
265
|
-
keyframes
|
|
319
|
+
keyframes: keyframes
|
|
266
320
|
};
|
|
267
321
|
return animation;
|
|
268
322
|
}
|
|
323
|
+
|
|
269
324
|
function prepareAnimationData(data, defaultMatrix) {
|
|
270
|
-
const keyframes = [];
|
|
325
|
+
const keyframes = []; // transfer data into a sortable array
|
|
326
|
+
|
|
271
327
|
for (const time in data) {
|
|
272
|
-
keyframes.push({
|
|
273
|
-
|
|
274
|
-
|
|
328
|
+
keyframes.push({
|
|
329
|
+
time: parseFloat(time),
|
|
330
|
+
value: data[time]
|
|
331
|
+
});
|
|
332
|
+
} // ensure keyframes are sorted by time
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
keyframes.sort(ascending); // now we clean up all animation data, so we can use them for keyframe tracks
|
|
336
|
+
|
|
275
337
|
for (let i = 0; i < 16; i++) {
|
|
276
338
|
transformAnimationData(keyframes, i, defaultMatrix.elements[i]);
|
|
277
339
|
}
|
|
278
|
-
|
|
340
|
+
|
|
341
|
+
return keyframes; // array sort function
|
|
342
|
+
|
|
279
343
|
function ascending(a, b) {
|
|
280
344
|
return a.time - b.time;
|
|
281
345
|
}
|
|
282
346
|
}
|
|
283
|
-
|
|
284
|
-
const
|
|
285
|
-
const
|
|
347
|
+
|
|
348
|
+
const position = new Vector3();
|
|
349
|
+
const scale = new Vector3();
|
|
350
|
+
const quaternion = new Quaternion();
|
|
351
|
+
|
|
286
352
|
function createKeyframeTracks(animation, tracks) {
|
|
287
353
|
const keyframes = animation.keyframes;
|
|
288
354
|
const name = animation.name;
|
|
@@ -290,6 +356,7 @@ class ColladaLoader extends THREE.Loader {
|
|
|
290
356
|
const positionData = [];
|
|
291
357
|
const quaternionData = [];
|
|
292
358
|
const scaleData = [];
|
|
359
|
+
|
|
293
360
|
for (let i = 0, l = keyframes.length; i < l; i++) {
|
|
294
361
|
const keyframe = keyframes[i];
|
|
295
362
|
const time = keyframe.time;
|
|
@@ -301,219 +368,274 @@ class ColladaLoader extends THREE.Loader {
|
|
|
301
368
|
quaternionData.push(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
|
|
302
369
|
scaleData.push(scale.x, scale.y, scale.z);
|
|
303
370
|
}
|
|
304
|
-
|
|
305
|
-
|
|
371
|
+
|
|
372
|
+
if (positionData.length > 0) tracks.push(new VectorKeyframeTrack(name + '.position', times, positionData));
|
|
373
|
+
|
|
306
374
|
if (quaternionData.length > 0) {
|
|
307
|
-
tracks.push(new
|
|
375
|
+
tracks.push(new QuaternionKeyframeTrack(name + '.quaternion', times, quaternionData));
|
|
308
376
|
}
|
|
309
|
-
|
|
310
|
-
|
|
377
|
+
|
|
378
|
+
if (scaleData.length > 0) tracks.push(new VectorKeyframeTrack(name + '.scale', times, scaleData));
|
|
311
379
|
return tracks;
|
|
312
380
|
}
|
|
381
|
+
|
|
313
382
|
function transformAnimationData(keyframes, property, defaultValue) {
|
|
314
383
|
let keyframe;
|
|
315
384
|
let empty = true;
|
|
316
|
-
let i, l;
|
|
385
|
+
let i, l; // check, if values of a property are missing in our keyframes
|
|
386
|
+
|
|
317
387
|
for (i = 0, l = keyframes.length; i < l; i++) {
|
|
318
388
|
keyframe = keyframes[i];
|
|
319
|
-
|
|
320
|
-
|
|
389
|
+
|
|
390
|
+
if (keyframe.value[property] === undefined) {
|
|
391
|
+
keyframe.value[property] = null; // mark as missing
|
|
321
392
|
} else {
|
|
322
393
|
empty = false;
|
|
323
394
|
}
|
|
324
395
|
}
|
|
396
|
+
|
|
325
397
|
if (empty === true) {
|
|
398
|
+
// no values at all, so we set a default value
|
|
326
399
|
for (i = 0, l = keyframes.length; i < l; i++) {
|
|
327
400
|
keyframe = keyframes[i];
|
|
328
401
|
keyframe.value[property] = defaultValue;
|
|
329
402
|
}
|
|
330
403
|
} else {
|
|
404
|
+
// filling gaps
|
|
331
405
|
createMissingKeyframes(keyframes, property);
|
|
332
406
|
}
|
|
333
407
|
}
|
|
408
|
+
|
|
334
409
|
function createMissingKeyframes(keyframes, property) {
|
|
335
410
|
let prev, next;
|
|
411
|
+
|
|
336
412
|
for (let i = 0, l = keyframes.length; i < l; i++) {
|
|
337
413
|
const keyframe = keyframes[i];
|
|
414
|
+
|
|
338
415
|
if (keyframe.value[property] === null) {
|
|
339
416
|
prev = getPrev(keyframes, i, property);
|
|
340
417
|
next = getNext(keyframes, i, property);
|
|
418
|
+
|
|
341
419
|
if (prev === null) {
|
|
342
420
|
keyframe.value[property] = next.value[property];
|
|
343
421
|
continue;
|
|
344
422
|
}
|
|
423
|
+
|
|
345
424
|
if (next === null) {
|
|
346
425
|
keyframe.value[property] = prev.value[property];
|
|
347
426
|
continue;
|
|
348
427
|
}
|
|
428
|
+
|
|
349
429
|
interpolate(keyframe, prev, next, property);
|
|
350
430
|
}
|
|
351
431
|
}
|
|
352
432
|
}
|
|
433
|
+
|
|
353
434
|
function getPrev(keyframes, i, property) {
|
|
354
435
|
while (i >= 0) {
|
|
355
436
|
const keyframe = keyframes[i];
|
|
356
|
-
if (keyframe.value[property] !== null)
|
|
357
|
-
return keyframe;
|
|
437
|
+
if (keyframe.value[property] !== null) return keyframe;
|
|
358
438
|
i--;
|
|
359
439
|
}
|
|
440
|
+
|
|
360
441
|
return null;
|
|
361
442
|
}
|
|
443
|
+
|
|
362
444
|
function getNext(keyframes, i, property) {
|
|
363
445
|
while (i < keyframes.length) {
|
|
364
446
|
const keyframe = keyframes[i];
|
|
365
|
-
if (keyframe.value[property] !== null)
|
|
366
|
-
return keyframe;
|
|
447
|
+
if (keyframe.value[property] !== null) return keyframe;
|
|
367
448
|
i++;
|
|
368
449
|
}
|
|
450
|
+
|
|
369
451
|
return null;
|
|
370
452
|
}
|
|
453
|
+
|
|
371
454
|
function interpolate(key, prev, next, property) {
|
|
372
455
|
if (next.time - prev.time === 0) {
|
|
373
456
|
key.value[property] = prev.value[property];
|
|
374
457
|
return;
|
|
375
458
|
}
|
|
459
|
+
|
|
376
460
|
key.value[property] = (key.time - prev.time) * (next.value[property] - prev.value[property]) / (next.time - prev.time) + prev.value[property];
|
|
377
|
-
}
|
|
378
|
-
|
|
461
|
+
} // animation clips
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
function parseAnimationClip(xml) {
|
|
379
465
|
const data = {
|
|
380
|
-
name:
|
|
381
|
-
start: parseFloat(
|
|
382
|
-
end: parseFloat(
|
|
466
|
+
name: xml.getAttribute('id') || 'default',
|
|
467
|
+
start: parseFloat(xml.getAttribute('start') || 0),
|
|
468
|
+
end: parseFloat(xml.getAttribute('end') || 0),
|
|
383
469
|
animations: []
|
|
384
470
|
};
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
471
|
+
|
|
472
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
473
|
+
const child = xml.childNodes[i];
|
|
474
|
+
if (child.nodeType !== 1) continue;
|
|
475
|
+
|
|
389
476
|
switch (child.nodeName) {
|
|
390
|
-
case
|
|
391
|
-
data.animations.push(parseId(child.getAttribute(
|
|
477
|
+
case 'instance_animation':
|
|
478
|
+
data.animations.push(parseId(child.getAttribute('url')));
|
|
392
479
|
break;
|
|
393
480
|
}
|
|
394
481
|
}
|
|
395
|
-
|
|
482
|
+
|
|
483
|
+
library.clips[xml.getAttribute('id')] = data;
|
|
396
484
|
}
|
|
485
|
+
|
|
397
486
|
function buildAnimationClip(data) {
|
|
398
487
|
const tracks = [];
|
|
399
488
|
const name = data.name;
|
|
400
489
|
const duration = data.end - data.start || -1;
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
|
|
490
|
+
const animations = data.animations;
|
|
491
|
+
|
|
492
|
+
for (let i = 0, il = animations.length; i < il; i++) {
|
|
493
|
+
const animationTracks = getAnimation(animations[i]);
|
|
494
|
+
|
|
404
495
|
for (let j = 0, jl = animationTracks.length; j < jl; j++) {
|
|
405
496
|
tracks.push(animationTracks[j]);
|
|
406
497
|
}
|
|
407
498
|
}
|
|
408
|
-
|
|
499
|
+
|
|
500
|
+
return new AnimationClip(name, duration, tracks);
|
|
409
501
|
}
|
|
502
|
+
|
|
410
503
|
function getAnimationClip(id) {
|
|
411
504
|
return getBuild(library.clips[id], buildAnimationClip);
|
|
412
|
-
}
|
|
413
|
-
|
|
505
|
+
} // controller
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
function parseController(xml) {
|
|
414
509
|
const data = {};
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
510
|
+
|
|
511
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
512
|
+
const child = xml.childNodes[i];
|
|
513
|
+
if (child.nodeType !== 1) continue;
|
|
514
|
+
|
|
419
515
|
switch (child.nodeName) {
|
|
420
|
-
case
|
|
421
|
-
|
|
516
|
+
case 'skin':
|
|
517
|
+
// there is exactly one skin per controller
|
|
518
|
+
data.id = parseId(child.getAttribute('source'));
|
|
422
519
|
data.skin = parseSkin(child);
|
|
423
520
|
break;
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
521
|
+
|
|
522
|
+
case 'morph':
|
|
523
|
+
data.id = parseId(child.getAttribute('source'));
|
|
524
|
+
console.warn('THREE.ColladaLoader: Morph target animation not supported yet.');
|
|
427
525
|
break;
|
|
428
526
|
}
|
|
429
527
|
}
|
|
430
|
-
|
|
528
|
+
|
|
529
|
+
library.controllers[xml.getAttribute('id')] = data;
|
|
431
530
|
}
|
|
432
|
-
|
|
531
|
+
|
|
532
|
+
function parseSkin(xml) {
|
|
433
533
|
const data = {
|
|
434
534
|
sources: {}
|
|
435
535
|
};
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
536
|
+
|
|
537
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
538
|
+
const child = xml.childNodes[i];
|
|
539
|
+
if (child.nodeType !== 1) continue;
|
|
540
|
+
|
|
440
541
|
switch (child.nodeName) {
|
|
441
|
-
case
|
|
542
|
+
case 'bind_shape_matrix':
|
|
442
543
|
data.bindShapeMatrix = parseFloats(child.textContent);
|
|
443
544
|
break;
|
|
444
|
-
|
|
445
|
-
|
|
545
|
+
|
|
546
|
+
case 'source':
|
|
547
|
+
const id = child.getAttribute('id');
|
|
446
548
|
data.sources[id] = parseSource(child);
|
|
447
549
|
break;
|
|
448
|
-
|
|
550
|
+
|
|
551
|
+
case 'joints':
|
|
449
552
|
data.joints = parseJoints(child);
|
|
450
553
|
break;
|
|
451
|
-
|
|
554
|
+
|
|
555
|
+
case 'vertex_weights':
|
|
452
556
|
data.vertexWeights = parseVertexWeights(child);
|
|
453
557
|
break;
|
|
454
558
|
}
|
|
455
559
|
}
|
|
560
|
+
|
|
456
561
|
return data;
|
|
457
562
|
}
|
|
458
|
-
|
|
563
|
+
|
|
564
|
+
function parseJoints(xml) {
|
|
459
565
|
const data = {
|
|
460
566
|
inputs: {}
|
|
461
567
|
};
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
568
|
+
|
|
569
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
570
|
+
const child = xml.childNodes[i];
|
|
571
|
+
if (child.nodeType !== 1) continue;
|
|
572
|
+
|
|
466
573
|
switch (child.nodeName) {
|
|
467
|
-
case
|
|
468
|
-
const semantic = child.getAttribute(
|
|
469
|
-
const id = parseId(child.getAttribute(
|
|
574
|
+
case 'input':
|
|
575
|
+
const semantic = child.getAttribute('semantic');
|
|
576
|
+
const id = parseId(child.getAttribute('source'));
|
|
470
577
|
data.inputs[semantic] = id;
|
|
471
578
|
break;
|
|
472
579
|
}
|
|
473
580
|
}
|
|
581
|
+
|
|
474
582
|
return data;
|
|
475
583
|
}
|
|
476
|
-
|
|
584
|
+
|
|
585
|
+
function parseVertexWeights(xml) {
|
|
477
586
|
const data = {
|
|
478
587
|
inputs: {}
|
|
479
588
|
};
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
589
|
+
|
|
590
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
591
|
+
const child = xml.childNodes[i];
|
|
592
|
+
if (child.nodeType !== 1) continue;
|
|
593
|
+
|
|
484
594
|
switch (child.nodeName) {
|
|
485
|
-
case
|
|
486
|
-
const semantic = child.getAttribute(
|
|
487
|
-
const id = parseId(child.getAttribute(
|
|
488
|
-
const offset = parseInt(child.getAttribute(
|
|
489
|
-
data.inputs[semantic] = {
|
|
595
|
+
case 'input':
|
|
596
|
+
const semantic = child.getAttribute('semantic');
|
|
597
|
+
const id = parseId(child.getAttribute('source'));
|
|
598
|
+
const offset = parseInt(child.getAttribute('offset'));
|
|
599
|
+
data.inputs[semantic] = {
|
|
600
|
+
id: id,
|
|
601
|
+
offset: offset
|
|
602
|
+
};
|
|
490
603
|
break;
|
|
491
|
-
|
|
604
|
+
|
|
605
|
+
case 'vcount':
|
|
492
606
|
data.vcount = parseInts(child.textContent);
|
|
493
607
|
break;
|
|
494
|
-
|
|
608
|
+
|
|
609
|
+
case 'v':
|
|
495
610
|
data.v = parseInts(child.textContent);
|
|
496
611
|
break;
|
|
497
612
|
}
|
|
498
613
|
}
|
|
614
|
+
|
|
499
615
|
return data;
|
|
500
616
|
}
|
|
617
|
+
|
|
501
618
|
function buildController(data) {
|
|
502
619
|
const build = {
|
|
503
620
|
id: data.id
|
|
504
621
|
};
|
|
505
622
|
const geometry = library.geometries[build.id];
|
|
506
|
-
|
|
507
|
-
|
|
623
|
+
|
|
624
|
+
if (data.skin !== undefined) {
|
|
625
|
+
build.skin = buildSkin(data.skin); // we enhance the 'sources' property of the corresponding geometry with our skin data
|
|
626
|
+
|
|
508
627
|
geometry.sources.skinIndices = build.skin.indices;
|
|
509
628
|
geometry.sources.skinWeights = build.skin.weights;
|
|
510
629
|
}
|
|
630
|
+
|
|
511
631
|
return build;
|
|
512
632
|
}
|
|
633
|
+
|
|
513
634
|
function buildSkin(data) {
|
|
514
635
|
const BONE_LIMIT = 4;
|
|
515
636
|
const build = {
|
|
516
637
|
joints: [],
|
|
638
|
+
// this must be an array to preserve the joint order
|
|
517
639
|
indices: {
|
|
518
640
|
array: [],
|
|
519
641
|
stride: BONE_LIMIT
|
|
@@ -533,21 +655,33 @@ class ColladaLoader extends THREE.Loader {
|
|
|
533
655
|
const inverseSource = data.sources[data.joints.inputs.INV_BIND_MATRIX];
|
|
534
656
|
const weights = sources[vertexWeights.inputs.WEIGHT.id].array;
|
|
535
657
|
let stride = 0;
|
|
536
|
-
let i, j, l;
|
|
658
|
+
let i, j, l; // procces skin data for each vertex
|
|
659
|
+
|
|
537
660
|
for (i = 0, l = vcount.length; i < l; i++) {
|
|
538
|
-
const jointCount = vcount[i];
|
|
661
|
+
const jointCount = vcount[i]; // this is the amount of joints that affect a single vertex
|
|
662
|
+
|
|
539
663
|
const vertexSkinData = [];
|
|
664
|
+
|
|
540
665
|
for (j = 0; j < jointCount; j++) {
|
|
541
666
|
const skinIndex = v[stride + jointOffset];
|
|
542
667
|
const weightId = v[stride + weightOffset];
|
|
543
668
|
const skinWeight = weights[weightId];
|
|
544
|
-
vertexSkinData.push({
|
|
669
|
+
vertexSkinData.push({
|
|
670
|
+
index: skinIndex,
|
|
671
|
+
weight: skinWeight
|
|
672
|
+
});
|
|
545
673
|
stride += 2;
|
|
546
|
-
}
|
|
547
|
-
|
|
674
|
+
} // we sort the joints in descending order based on the weights.
|
|
675
|
+
// this ensures, we only procced the most important joints of the vertex
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
vertexSkinData.sort(descending); // now we provide for each vertex a set of four index and weight values.
|
|
679
|
+
// the order of the skin data matches the order of vertices
|
|
680
|
+
|
|
548
681
|
for (j = 0; j < BONE_LIMIT; j++) {
|
|
549
682
|
const d = vertexSkinData[j];
|
|
550
|
-
|
|
683
|
+
|
|
684
|
+
if (d !== undefined) {
|
|
551
685
|
build.indices.array.push(d.index);
|
|
552
686
|
build.weights.array.push(d.weight);
|
|
553
687
|
} else {
|
|
@@ -555,377 +689,468 @@ class ColladaLoader extends THREE.Loader {
|
|
|
555
689
|
build.weights.array.push(0);
|
|
556
690
|
}
|
|
557
691
|
}
|
|
558
|
-
}
|
|
692
|
+
} // setup bind matrix
|
|
693
|
+
|
|
694
|
+
|
|
559
695
|
if (data.bindShapeMatrix) {
|
|
560
|
-
build.bindMatrix = new
|
|
696
|
+
build.bindMatrix = new Matrix4().fromArray(data.bindShapeMatrix).transpose();
|
|
561
697
|
} else {
|
|
562
|
-
build.bindMatrix = new
|
|
563
|
-
}
|
|
698
|
+
build.bindMatrix = new Matrix4().identity();
|
|
699
|
+
} // process bones and inverse bind matrix data
|
|
700
|
+
|
|
701
|
+
|
|
564
702
|
for (i = 0, l = jointSource.array.length; i < l; i++) {
|
|
565
703
|
const name = jointSource.array[i];
|
|
566
|
-
const boneInverse = new
|
|
567
|
-
build.joints.push({
|
|
704
|
+
const boneInverse = new Matrix4().fromArray(inverseSource.array, i * inverseSource.stride).transpose();
|
|
705
|
+
build.joints.push({
|
|
706
|
+
name: name,
|
|
707
|
+
boneInverse: boneInverse
|
|
708
|
+
});
|
|
568
709
|
}
|
|
569
|
-
|
|
710
|
+
|
|
711
|
+
return build; // array sort function
|
|
712
|
+
|
|
570
713
|
function descending(a, b) {
|
|
571
714
|
return b.weight - a.weight;
|
|
572
715
|
}
|
|
573
716
|
}
|
|
717
|
+
|
|
574
718
|
function getController(id) {
|
|
575
719
|
return getBuild(library.controllers[id], buildController);
|
|
576
|
-
}
|
|
577
|
-
|
|
720
|
+
} // image
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
function parseImage(xml) {
|
|
578
724
|
const data = {
|
|
579
|
-
init_from: getElementsByTagName(
|
|
725
|
+
init_from: getElementsByTagName(xml, 'init_from')[0].textContent
|
|
580
726
|
};
|
|
581
|
-
library.images[
|
|
727
|
+
library.images[xml.getAttribute('id')] = data;
|
|
582
728
|
}
|
|
729
|
+
|
|
583
730
|
function buildImage(data) {
|
|
584
|
-
if (data.build !==
|
|
585
|
-
return data.build;
|
|
731
|
+
if (data.build !== undefined) return data.build;
|
|
586
732
|
return data.init_from;
|
|
587
733
|
}
|
|
734
|
+
|
|
588
735
|
function getImage(id) {
|
|
589
736
|
const data = library.images[id];
|
|
590
|
-
|
|
737
|
+
|
|
738
|
+
if (data !== undefined) {
|
|
591
739
|
return getBuild(data, buildImage);
|
|
592
740
|
}
|
|
741
|
+
|
|
593
742
|
console.warn("THREE.ColladaLoader: Couldn't find image with ID:", id);
|
|
594
743
|
return null;
|
|
595
|
-
}
|
|
596
|
-
|
|
744
|
+
} // effect
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
function parseEffect(xml) {
|
|
597
748
|
const data = {};
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
749
|
+
|
|
750
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
751
|
+
const child = xml.childNodes[i];
|
|
752
|
+
if (child.nodeType !== 1) continue;
|
|
753
|
+
|
|
602
754
|
switch (child.nodeName) {
|
|
603
|
-
case
|
|
755
|
+
case 'profile_COMMON':
|
|
604
756
|
data.profile = parseEffectProfileCOMMON(child);
|
|
605
757
|
break;
|
|
606
758
|
}
|
|
607
759
|
}
|
|
608
|
-
|
|
760
|
+
|
|
761
|
+
library.effects[xml.getAttribute('id')] = data;
|
|
609
762
|
}
|
|
610
|
-
|
|
763
|
+
|
|
764
|
+
function parseEffectProfileCOMMON(xml) {
|
|
611
765
|
const data = {
|
|
612
766
|
surfaces: {},
|
|
613
767
|
samplers: {}
|
|
614
768
|
};
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
769
|
+
|
|
770
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
771
|
+
const child = xml.childNodes[i];
|
|
772
|
+
if (child.nodeType !== 1) continue;
|
|
773
|
+
|
|
619
774
|
switch (child.nodeName) {
|
|
620
|
-
case
|
|
775
|
+
case 'newparam':
|
|
621
776
|
parseEffectNewparam(child, data);
|
|
622
777
|
break;
|
|
623
|
-
|
|
778
|
+
|
|
779
|
+
case 'technique':
|
|
624
780
|
data.technique = parseEffectTechnique(child);
|
|
625
781
|
break;
|
|
626
|
-
|
|
782
|
+
|
|
783
|
+
case 'extra':
|
|
627
784
|
data.extra = parseEffectExtra(child);
|
|
628
785
|
break;
|
|
629
786
|
}
|
|
630
787
|
}
|
|
788
|
+
|
|
631
789
|
return data;
|
|
632
790
|
}
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
791
|
+
|
|
792
|
+
function parseEffectNewparam(xml, data) {
|
|
793
|
+
const sid = xml.getAttribute('sid');
|
|
794
|
+
|
|
795
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
796
|
+
const child = xml.childNodes[i];
|
|
797
|
+
if (child.nodeType !== 1) continue;
|
|
798
|
+
|
|
639
799
|
switch (child.nodeName) {
|
|
640
|
-
case
|
|
800
|
+
case 'surface':
|
|
641
801
|
data.surfaces[sid] = parseEffectSurface(child);
|
|
642
802
|
break;
|
|
643
|
-
|
|
803
|
+
|
|
804
|
+
case 'sampler2D':
|
|
644
805
|
data.samplers[sid] = parseEffectSampler(child);
|
|
645
806
|
break;
|
|
646
807
|
}
|
|
647
808
|
}
|
|
648
809
|
}
|
|
649
|
-
|
|
810
|
+
|
|
811
|
+
function parseEffectSurface(xml) {
|
|
650
812
|
const data = {};
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
813
|
+
|
|
814
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
815
|
+
const child = xml.childNodes[i];
|
|
816
|
+
if (child.nodeType !== 1) continue;
|
|
817
|
+
|
|
655
818
|
switch (child.nodeName) {
|
|
656
|
-
case
|
|
819
|
+
case 'init_from':
|
|
657
820
|
data.init_from = child.textContent;
|
|
658
821
|
break;
|
|
659
822
|
}
|
|
660
823
|
}
|
|
824
|
+
|
|
661
825
|
return data;
|
|
662
826
|
}
|
|
663
|
-
|
|
827
|
+
|
|
828
|
+
function parseEffectSampler(xml) {
|
|
664
829
|
const data = {};
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
830
|
+
|
|
831
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
832
|
+
const child = xml.childNodes[i];
|
|
833
|
+
if (child.nodeType !== 1) continue;
|
|
834
|
+
|
|
669
835
|
switch (child.nodeName) {
|
|
670
|
-
case
|
|
836
|
+
case 'source':
|
|
671
837
|
data.source = child.textContent;
|
|
672
838
|
break;
|
|
673
839
|
}
|
|
674
840
|
}
|
|
841
|
+
|
|
675
842
|
return data;
|
|
676
843
|
}
|
|
677
|
-
|
|
844
|
+
|
|
845
|
+
function parseEffectTechnique(xml) {
|
|
678
846
|
const data = {};
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
847
|
+
|
|
848
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
849
|
+
const child = xml.childNodes[i];
|
|
850
|
+
if (child.nodeType !== 1) continue;
|
|
851
|
+
|
|
683
852
|
switch (child.nodeName) {
|
|
684
|
-
case
|
|
685
|
-
case
|
|
686
|
-
case
|
|
687
|
-
case
|
|
853
|
+
case 'constant':
|
|
854
|
+
case 'lambert':
|
|
855
|
+
case 'blinn':
|
|
856
|
+
case 'phong':
|
|
688
857
|
data.type = child.nodeName;
|
|
689
858
|
data.parameters = parseEffectParameters(child);
|
|
690
859
|
break;
|
|
691
|
-
|
|
860
|
+
|
|
861
|
+
case 'extra':
|
|
692
862
|
data.extra = parseEffectExtra(child);
|
|
693
863
|
break;
|
|
694
864
|
}
|
|
695
865
|
}
|
|
866
|
+
|
|
696
867
|
return data;
|
|
697
868
|
}
|
|
698
|
-
|
|
869
|
+
|
|
870
|
+
function parseEffectParameters(xml) {
|
|
699
871
|
const data = {};
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
872
|
+
|
|
873
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
874
|
+
const child = xml.childNodes[i];
|
|
875
|
+
if (child.nodeType !== 1) continue;
|
|
876
|
+
|
|
704
877
|
switch (child.nodeName) {
|
|
705
|
-
case
|
|
706
|
-
case
|
|
707
|
-
case
|
|
708
|
-
case
|
|
709
|
-
case
|
|
710
|
-
case
|
|
711
|
-
case
|
|
878
|
+
case 'emission':
|
|
879
|
+
case 'diffuse':
|
|
880
|
+
case 'specular':
|
|
881
|
+
case 'bump':
|
|
882
|
+
case 'ambient':
|
|
883
|
+
case 'shininess':
|
|
884
|
+
case 'transparency':
|
|
712
885
|
data[child.nodeName] = parseEffectParameter(child);
|
|
713
886
|
break;
|
|
714
|
-
|
|
887
|
+
|
|
888
|
+
case 'transparent':
|
|
715
889
|
data[child.nodeName] = {
|
|
716
|
-
opaque: child.hasAttribute(
|
|
890
|
+
opaque: child.hasAttribute('opaque') ? child.getAttribute('opaque') : 'A_ONE',
|
|
717
891
|
data: parseEffectParameter(child)
|
|
718
892
|
};
|
|
719
893
|
break;
|
|
720
894
|
}
|
|
721
895
|
}
|
|
896
|
+
|
|
722
897
|
return data;
|
|
723
898
|
}
|
|
724
|
-
|
|
899
|
+
|
|
900
|
+
function parseEffectParameter(xml) {
|
|
725
901
|
const data = {};
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
902
|
+
|
|
903
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
904
|
+
const child = xml.childNodes[i];
|
|
905
|
+
if (child.nodeType !== 1) continue;
|
|
906
|
+
|
|
730
907
|
switch (child.nodeName) {
|
|
731
|
-
case
|
|
908
|
+
case 'color':
|
|
732
909
|
data[child.nodeName] = parseFloats(child.textContent);
|
|
733
910
|
break;
|
|
734
|
-
|
|
911
|
+
|
|
912
|
+
case 'float':
|
|
735
913
|
data[child.nodeName] = parseFloat(child.textContent);
|
|
736
914
|
break;
|
|
737
|
-
|
|
738
|
-
|
|
915
|
+
|
|
916
|
+
case 'texture':
|
|
917
|
+
data[child.nodeName] = {
|
|
918
|
+
id: child.getAttribute('texture'),
|
|
919
|
+
extra: parseEffectParameterTexture(child)
|
|
920
|
+
};
|
|
739
921
|
break;
|
|
740
922
|
}
|
|
741
923
|
}
|
|
924
|
+
|
|
742
925
|
return data;
|
|
743
926
|
}
|
|
744
|
-
|
|
927
|
+
|
|
928
|
+
function parseEffectParameterTexture(xml) {
|
|
745
929
|
const data = {
|
|
746
930
|
technique: {}
|
|
747
931
|
};
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
932
|
+
|
|
933
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
934
|
+
const child = xml.childNodes[i];
|
|
935
|
+
if (child.nodeType !== 1) continue;
|
|
936
|
+
|
|
752
937
|
switch (child.nodeName) {
|
|
753
|
-
case
|
|
938
|
+
case 'extra':
|
|
754
939
|
parseEffectParameterTextureExtra(child, data);
|
|
755
940
|
break;
|
|
756
941
|
}
|
|
757
942
|
}
|
|
943
|
+
|
|
758
944
|
return data;
|
|
759
945
|
}
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
946
|
+
|
|
947
|
+
function parseEffectParameterTextureExtra(xml, data) {
|
|
948
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
949
|
+
const child = xml.childNodes[i];
|
|
950
|
+
if (child.nodeType !== 1) continue;
|
|
951
|
+
|
|
765
952
|
switch (child.nodeName) {
|
|
766
|
-
case
|
|
953
|
+
case 'technique':
|
|
767
954
|
parseEffectParameterTextureExtraTechnique(child, data);
|
|
768
955
|
break;
|
|
769
956
|
}
|
|
770
957
|
}
|
|
771
958
|
}
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
959
|
+
|
|
960
|
+
function parseEffectParameterTextureExtraTechnique(xml, data) {
|
|
961
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
962
|
+
const child = xml.childNodes[i];
|
|
963
|
+
if (child.nodeType !== 1) continue;
|
|
964
|
+
|
|
777
965
|
switch (child.nodeName) {
|
|
778
|
-
case
|
|
779
|
-
case
|
|
780
|
-
case
|
|
781
|
-
case
|
|
966
|
+
case 'repeatU':
|
|
967
|
+
case 'repeatV':
|
|
968
|
+
case 'offsetU':
|
|
969
|
+
case 'offsetV':
|
|
782
970
|
data.technique[child.nodeName] = parseFloat(child.textContent);
|
|
783
971
|
break;
|
|
784
|
-
|
|
785
|
-
case
|
|
786
|
-
|
|
972
|
+
|
|
973
|
+
case 'wrapU':
|
|
974
|
+
case 'wrapV':
|
|
975
|
+
// some files have values for wrapU/wrapV which become NaN via parseInt
|
|
976
|
+
if (child.textContent.toUpperCase() === 'TRUE') {
|
|
787
977
|
data.technique[child.nodeName] = 1;
|
|
788
|
-
} else if (child.textContent.toUpperCase() ===
|
|
978
|
+
} else if (child.textContent.toUpperCase() === 'FALSE') {
|
|
789
979
|
data.technique[child.nodeName] = 0;
|
|
790
980
|
} else {
|
|
791
981
|
data.technique[child.nodeName] = parseInt(child.textContent);
|
|
792
982
|
}
|
|
983
|
+
|
|
793
984
|
break;
|
|
794
|
-
|
|
985
|
+
|
|
986
|
+
case 'bump':
|
|
795
987
|
data[child.nodeName] = parseEffectExtraTechniqueBump(child);
|
|
796
988
|
break;
|
|
797
989
|
}
|
|
798
990
|
}
|
|
799
991
|
}
|
|
800
|
-
|
|
992
|
+
|
|
993
|
+
function parseEffectExtra(xml) {
|
|
801
994
|
const data = {};
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
995
|
+
|
|
996
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
997
|
+
const child = xml.childNodes[i];
|
|
998
|
+
if (child.nodeType !== 1) continue;
|
|
999
|
+
|
|
806
1000
|
switch (child.nodeName) {
|
|
807
|
-
case
|
|
1001
|
+
case 'technique':
|
|
808
1002
|
data.technique = parseEffectExtraTechnique(child);
|
|
809
1003
|
break;
|
|
810
1004
|
}
|
|
811
1005
|
}
|
|
1006
|
+
|
|
812
1007
|
return data;
|
|
813
1008
|
}
|
|
814
|
-
|
|
1009
|
+
|
|
1010
|
+
function parseEffectExtraTechnique(xml) {
|
|
815
1011
|
const data = {};
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
1012
|
+
|
|
1013
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1014
|
+
const child = xml.childNodes[i];
|
|
1015
|
+
if (child.nodeType !== 1) continue;
|
|
1016
|
+
|
|
820
1017
|
switch (child.nodeName) {
|
|
821
|
-
case
|
|
1018
|
+
case 'double_sided':
|
|
822
1019
|
data[child.nodeName] = parseInt(child.textContent);
|
|
823
1020
|
break;
|
|
824
|
-
|
|
1021
|
+
|
|
1022
|
+
case 'bump':
|
|
825
1023
|
data[child.nodeName] = parseEffectExtraTechniqueBump(child);
|
|
826
1024
|
break;
|
|
827
1025
|
}
|
|
828
1026
|
}
|
|
1027
|
+
|
|
829
1028
|
return data;
|
|
830
1029
|
}
|
|
831
|
-
|
|
1030
|
+
|
|
1031
|
+
function parseEffectExtraTechniqueBump(xml) {
|
|
832
1032
|
var data = {};
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
1033
|
+
|
|
1034
|
+
for (var i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1035
|
+
var child = xml.childNodes[i];
|
|
1036
|
+
if (child.nodeType !== 1) continue;
|
|
1037
|
+
|
|
837
1038
|
switch (child.nodeName) {
|
|
838
|
-
case
|
|
1039
|
+
case 'texture':
|
|
839
1040
|
data[child.nodeName] = {
|
|
840
|
-
id: child.getAttribute(
|
|
841
|
-
texcoord: child.getAttribute(
|
|
1041
|
+
id: child.getAttribute('texture'),
|
|
1042
|
+
texcoord: child.getAttribute('texcoord'),
|
|
842
1043
|
extra: parseEffectParameterTexture(child)
|
|
843
1044
|
};
|
|
844
1045
|
break;
|
|
845
1046
|
}
|
|
846
1047
|
}
|
|
1048
|
+
|
|
847
1049
|
return data;
|
|
848
1050
|
}
|
|
1051
|
+
|
|
849
1052
|
function buildEffect(data) {
|
|
850
1053
|
return data;
|
|
851
1054
|
}
|
|
1055
|
+
|
|
852
1056
|
function getEffect(id) {
|
|
853
1057
|
return getBuild(library.effects[id], buildEffect);
|
|
854
|
-
}
|
|
855
|
-
|
|
1058
|
+
} // material
|
|
1059
|
+
|
|
1060
|
+
|
|
1061
|
+
function parseMaterial(xml) {
|
|
856
1062
|
const data = {
|
|
857
|
-
name:
|
|
1063
|
+
name: xml.getAttribute('name')
|
|
858
1064
|
};
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
1065
|
+
|
|
1066
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1067
|
+
const child = xml.childNodes[i];
|
|
1068
|
+
if (child.nodeType !== 1) continue;
|
|
1069
|
+
|
|
863
1070
|
switch (child.nodeName) {
|
|
864
|
-
case
|
|
865
|
-
data.url = parseId(child.getAttribute(
|
|
1071
|
+
case 'instance_effect':
|
|
1072
|
+
data.url = parseId(child.getAttribute('url'));
|
|
866
1073
|
break;
|
|
867
1074
|
}
|
|
868
1075
|
}
|
|
869
|
-
|
|
1076
|
+
|
|
1077
|
+
library.materials[xml.getAttribute('id')] = data;
|
|
870
1078
|
}
|
|
1079
|
+
|
|
871
1080
|
function getTextureLoader(image) {
|
|
872
1081
|
let loader;
|
|
873
|
-
let extension = image.slice((image.lastIndexOf(
|
|
1082
|
+
let extension = image.slice((image.lastIndexOf('.') - 1 >>> 0) + 2); // http://www.jstips.co/en/javascript/get-file-extension/
|
|
1083
|
+
|
|
874
1084
|
extension = extension.toLowerCase();
|
|
1085
|
+
|
|
875
1086
|
switch (extension) {
|
|
876
|
-
case
|
|
1087
|
+
case 'tga':
|
|
877
1088
|
loader = tgaLoader;
|
|
878
1089
|
break;
|
|
1090
|
+
|
|
879
1091
|
default:
|
|
880
1092
|
loader = textureLoader;
|
|
881
1093
|
}
|
|
1094
|
+
|
|
882
1095
|
return loader;
|
|
883
1096
|
}
|
|
1097
|
+
|
|
884
1098
|
function buildMaterial(data) {
|
|
885
1099
|
const effect = getEffect(data.url);
|
|
886
1100
|
const technique = effect.profile.technique;
|
|
887
1101
|
let material;
|
|
1102
|
+
|
|
888
1103
|
switch (technique.type) {
|
|
889
|
-
case
|
|
890
|
-
case
|
|
891
|
-
material = new
|
|
1104
|
+
case 'phong':
|
|
1105
|
+
case 'blinn':
|
|
1106
|
+
material = new MeshPhongMaterial();
|
|
892
1107
|
break;
|
|
893
|
-
|
|
894
|
-
|
|
1108
|
+
|
|
1109
|
+
case 'lambert':
|
|
1110
|
+
material = new MeshLambertMaterial();
|
|
895
1111
|
break;
|
|
1112
|
+
|
|
896
1113
|
default:
|
|
897
|
-
material = new
|
|
1114
|
+
material = new MeshBasicMaterial();
|
|
898
1115
|
break;
|
|
899
1116
|
}
|
|
900
|
-
|
|
1117
|
+
|
|
1118
|
+
material.name = data.name || '';
|
|
1119
|
+
|
|
901
1120
|
function getTexture(textureObject) {
|
|
902
1121
|
const sampler = effect.profile.samplers[textureObject.id];
|
|
903
|
-
let image = null;
|
|
904
|
-
|
|
1122
|
+
let image = null; // get image
|
|
1123
|
+
|
|
1124
|
+
if (sampler !== undefined) {
|
|
905
1125
|
const surface = effect.profile.surfaces[sampler.source];
|
|
906
1126
|
image = getImage(surface.init_from);
|
|
907
1127
|
} else {
|
|
908
|
-
console.warn(
|
|
1128
|
+
console.warn('THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).');
|
|
909
1129
|
image = getImage(textureObject.id);
|
|
910
|
-
}
|
|
1130
|
+
} // create texture if image is avaiable
|
|
1131
|
+
|
|
1132
|
+
|
|
911
1133
|
if (image !== null) {
|
|
912
1134
|
const loader = getTextureLoader(image);
|
|
913
|
-
|
|
1135
|
+
|
|
1136
|
+
if (loader !== undefined) {
|
|
914
1137
|
const texture = loader.load(image);
|
|
915
1138
|
const extra = textureObject.extra;
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
texture.
|
|
920
|
-
texture.
|
|
921
|
-
texture.
|
|
1139
|
+
|
|
1140
|
+
if (extra !== undefined && extra.technique !== undefined && isEmpty(extra.technique) === false) {
|
|
1141
|
+
const technique = extra.technique;
|
|
1142
|
+
texture.wrapS = technique.wrapU ? RepeatWrapping : ClampToEdgeWrapping;
|
|
1143
|
+
texture.wrapT = technique.wrapV ? RepeatWrapping : ClampToEdgeWrapping;
|
|
1144
|
+
texture.offset.set(technique.offsetU || 0, technique.offsetV || 0);
|
|
1145
|
+
texture.repeat.set(technique.repeatU || 1, technique.repeatV || 1);
|
|
922
1146
|
} else {
|
|
923
|
-
texture.wrapS =
|
|
924
|
-
texture.wrapT =
|
|
1147
|
+
texture.wrapS = RepeatWrapping;
|
|
1148
|
+
texture.wrapT = RepeatWrapping;
|
|
925
1149
|
}
|
|
1150
|
+
|
|
926
1151
|
return texture;
|
|
927
1152
|
} else {
|
|
928
|
-
console.warn(
|
|
1153
|
+
console.warn('THREE.ColladaLoader: Loader for texture %s not found.', image);
|
|
929
1154
|
return null;
|
|
930
1155
|
}
|
|
931
1156
|
} else {
|
|
@@ -933,582 +1158,737 @@ class ColladaLoader extends THREE.Loader {
|
|
|
933
1158
|
return null;
|
|
934
1159
|
}
|
|
935
1160
|
}
|
|
1161
|
+
|
|
936
1162
|
const parameters = technique.parameters;
|
|
1163
|
+
|
|
937
1164
|
for (const key in parameters) {
|
|
938
1165
|
const parameter = parameters[key];
|
|
1166
|
+
|
|
939
1167
|
switch (key) {
|
|
940
|
-
case
|
|
941
|
-
if (parameter.color)
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
if (parameter.
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
if (transparency === void 0 && transparent) {
|
|
1168
|
+
case 'diffuse':
|
|
1169
|
+
if (parameter.color) material.color.fromArray(parameter.color);
|
|
1170
|
+
if (parameter.texture) material.map = getTexture(parameter.texture);
|
|
1171
|
+
break;
|
|
1172
|
+
|
|
1173
|
+
case 'specular':
|
|
1174
|
+
if (parameter.color && material.specular) material.specular.fromArray(parameter.color);
|
|
1175
|
+
if (parameter.texture) material.specularMap = getTexture(parameter.texture);
|
|
1176
|
+
break;
|
|
1177
|
+
|
|
1178
|
+
case 'bump':
|
|
1179
|
+
if (parameter.texture) material.normalMap = getTexture(parameter.texture);
|
|
1180
|
+
break;
|
|
1181
|
+
|
|
1182
|
+
case 'ambient':
|
|
1183
|
+
if (parameter.texture) material.lightMap = getTexture(parameter.texture);
|
|
1184
|
+
break;
|
|
1185
|
+
|
|
1186
|
+
case 'shininess':
|
|
1187
|
+
if (parameter.float && material.shininess) material.shininess = parameter.float;
|
|
1188
|
+
break;
|
|
1189
|
+
|
|
1190
|
+
case 'emission':
|
|
1191
|
+
if (parameter.color && material.emissive) material.emissive.fromArray(parameter.color);
|
|
1192
|
+
if (parameter.texture) material.emissiveMap = getTexture(parameter.texture);
|
|
1193
|
+
break;
|
|
1194
|
+
}
|
|
1195
|
+
} //
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
let transparent = parameters['transparent'];
|
|
1199
|
+
let transparency = parameters['transparency']; // <transparency> does not exist but <transparent>
|
|
1200
|
+
|
|
1201
|
+
if (transparency === undefined && transparent) {
|
|
975
1202
|
transparency = {
|
|
976
1203
|
float: 1
|
|
977
1204
|
};
|
|
978
|
-
}
|
|
979
|
-
|
|
1205
|
+
} // <transparent> does not exist but <transparency>
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
if (transparent === undefined && transparency) {
|
|
980
1209
|
transparent = {
|
|
981
|
-
opaque:
|
|
1210
|
+
opaque: 'A_ONE',
|
|
982
1211
|
data: {
|
|
983
1212
|
color: [1, 1, 1, 1]
|
|
984
1213
|
}
|
|
985
1214
|
};
|
|
986
1215
|
}
|
|
1216
|
+
|
|
987
1217
|
if (transparent && transparency) {
|
|
1218
|
+
// handle case if a texture exists but no color
|
|
988
1219
|
if (transparent.data.texture) {
|
|
1220
|
+
// we do not set an alpha map (see #13792)
|
|
989
1221
|
material.transparent = true;
|
|
990
1222
|
} else {
|
|
991
1223
|
const color = transparent.data.color;
|
|
1224
|
+
|
|
992
1225
|
switch (transparent.opaque) {
|
|
993
|
-
case
|
|
1226
|
+
case 'A_ONE':
|
|
994
1227
|
material.opacity = color[3] * transparency.float;
|
|
995
1228
|
break;
|
|
996
|
-
|
|
1229
|
+
|
|
1230
|
+
case 'RGB_ZERO':
|
|
997
1231
|
material.opacity = 1 - color[0] * transparency.float;
|
|
998
1232
|
break;
|
|
999
|
-
|
|
1233
|
+
|
|
1234
|
+
case 'A_ZERO':
|
|
1000
1235
|
material.opacity = 1 - color[3] * transparency.float;
|
|
1001
1236
|
break;
|
|
1002
|
-
|
|
1237
|
+
|
|
1238
|
+
case 'RGB_ONE':
|
|
1003
1239
|
material.opacity = color[0] * transparency.float;
|
|
1004
1240
|
break;
|
|
1241
|
+
|
|
1005
1242
|
default:
|
|
1006
1243
|
console.warn('THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.', transparent.opaque);
|
|
1007
1244
|
}
|
|
1008
|
-
|
|
1009
|
-
|
|
1245
|
+
|
|
1246
|
+
if (material.opacity < 1) material.transparent = true;
|
|
1010
1247
|
}
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1248
|
+
} //
|
|
1249
|
+
|
|
1250
|
+
|
|
1251
|
+
if (technique.extra !== undefined && technique.extra.technique !== undefined) {
|
|
1013
1252
|
const techniques = technique.extra.technique;
|
|
1253
|
+
|
|
1014
1254
|
for (const k in techniques) {
|
|
1015
1255
|
const v = techniques[k];
|
|
1256
|
+
|
|
1016
1257
|
switch (k) {
|
|
1017
|
-
case
|
|
1018
|
-
material.side = v === 1 ?
|
|
1258
|
+
case 'double_sided':
|
|
1259
|
+
material.side = v === 1 ? DoubleSide : FrontSide;
|
|
1019
1260
|
break;
|
|
1020
|
-
|
|
1261
|
+
|
|
1262
|
+
case 'bump':
|
|
1021
1263
|
material.normalMap = getTexture(v.texture);
|
|
1022
|
-
material.normalScale = new
|
|
1264
|
+
material.normalScale = new Vector2(1, 1);
|
|
1023
1265
|
break;
|
|
1024
1266
|
}
|
|
1025
1267
|
}
|
|
1026
1268
|
}
|
|
1269
|
+
|
|
1027
1270
|
return material;
|
|
1028
1271
|
}
|
|
1272
|
+
|
|
1029
1273
|
function getMaterial(id) {
|
|
1030
1274
|
return getBuild(library.materials[id], buildMaterial);
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1275
|
+
} // camera
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
function parseCamera(xml) {
|
|
1033
1279
|
const data = {
|
|
1034
|
-
name:
|
|
1280
|
+
name: xml.getAttribute('name')
|
|
1035
1281
|
};
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1282
|
+
|
|
1283
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1284
|
+
const child = xml.childNodes[i];
|
|
1285
|
+
if (child.nodeType !== 1) continue;
|
|
1286
|
+
|
|
1040
1287
|
switch (child.nodeName) {
|
|
1041
|
-
case
|
|
1288
|
+
case 'optics':
|
|
1042
1289
|
data.optics = parseCameraOptics(child);
|
|
1043
1290
|
break;
|
|
1044
1291
|
}
|
|
1045
1292
|
}
|
|
1046
|
-
|
|
1293
|
+
|
|
1294
|
+
library.cameras[xml.getAttribute('id')] = data;
|
|
1047
1295
|
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1296
|
+
|
|
1297
|
+
function parseCameraOptics(xml) {
|
|
1298
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1299
|
+
const child = xml.childNodes[i];
|
|
1300
|
+
|
|
1051
1301
|
switch (child.nodeName) {
|
|
1052
|
-
case
|
|
1302
|
+
case 'technique_common':
|
|
1053
1303
|
return parseCameraTechnique(child);
|
|
1054
1304
|
}
|
|
1055
1305
|
}
|
|
1306
|
+
|
|
1056
1307
|
return {};
|
|
1057
1308
|
}
|
|
1058
|
-
|
|
1309
|
+
|
|
1310
|
+
function parseCameraTechnique(xml) {
|
|
1059
1311
|
const data = {};
|
|
1060
|
-
|
|
1061
|
-
|
|
1312
|
+
|
|
1313
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1314
|
+
const child = xml.childNodes[i];
|
|
1315
|
+
|
|
1062
1316
|
switch (child.nodeName) {
|
|
1063
|
-
case
|
|
1064
|
-
case
|
|
1317
|
+
case 'perspective':
|
|
1318
|
+
case 'orthographic':
|
|
1065
1319
|
data.technique = child.nodeName;
|
|
1066
1320
|
data.parameters = parseCameraParameters(child);
|
|
1067
1321
|
break;
|
|
1068
1322
|
}
|
|
1069
1323
|
}
|
|
1324
|
+
|
|
1070
1325
|
return data;
|
|
1071
1326
|
}
|
|
1072
|
-
|
|
1327
|
+
|
|
1328
|
+
function parseCameraParameters(xml) {
|
|
1073
1329
|
const data = {};
|
|
1074
|
-
|
|
1075
|
-
|
|
1330
|
+
|
|
1331
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1332
|
+
const child = xml.childNodes[i];
|
|
1333
|
+
|
|
1076
1334
|
switch (child.nodeName) {
|
|
1077
|
-
case
|
|
1078
|
-
case
|
|
1079
|
-
case
|
|
1080
|
-
case
|
|
1081
|
-
case
|
|
1082
|
-
case
|
|
1083
|
-
case
|
|
1335
|
+
case 'xfov':
|
|
1336
|
+
case 'yfov':
|
|
1337
|
+
case 'xmag':
|
|
1338
|
+
case 'ymag':
|
|
1339
|
+
case 'znear':
|
|
1340
|
+
case 'zfar':
|
|
1341
|
+
case 'aspect_ratio':
|
|
1084
1342
|
data[child.nodeName] = parseFloat(child.textContent);
|
|
1085
1343
|
break;
|
|
1086
1344
|
}
|
|
1087
1345
|
}
|
|
1346
|
+
|
|
1088
1347
|
return data;
|
|
1089
1348
|
}
|
|
1349
|
+
|
|
1090
1350
|
function buildCamera(data) {
|
|
1091
1351
|
let camera;
|
|
1352
|
+
|
|
1092
1353
|
switch (data.optics.technique) {
|
|
1093
|
-
case
|
|
1094
|
-
camera = new
|
|
1095
|
-
data.optics.parameters.yfov,
|
|
1096
|
-
data.optics.parameters.aspect_ratio,
|
|
1097
|
-
data.optics.parameters.znear,
|
|
1098
|
-
data.optics.parameters.zfar
|
|
1099
|
-
);
|
|
1354
|
+
case 'perspective':
|
|
1355
|
+
camera = new PerspectiveCamera(data.optics.parameters.yfov, data.optics.parameters.aspect_ratio, data.optics.parameters.znear, data.optics.parameters.zfar);
|
|
1100
1356
|
break;
|
|
1101
|
-
|
|
1357
|
+
|
|
1358
|
+
case 'orthographic':
|
|
1102
1359
|
let ymag = data.optics.parameters.ymag;
|
|
1103
1360
|
let xmag = data.optics.parameters.xmag;
|
|
1104
1361
|
const aspectRatio = data.optics.parameters.aspect_ratio;
|
|
1105
|
-
xmag = xmag ===
|
|
1106
|
-
ymag = ymag ===
|
|
1362
|
+
xmag = xmag === undefined ? ymag * aspectRatio : xmag;
|
|
1363
|
+
ymag = ymag === undefined ? xmag / aspectRatio : ymag;
|
|
1107
1364
|
xmag *= 0.5;
|
|
1108
1365
|
ymag *= 0.5;
|
|
1109
|
-
camera = new
|
|
1110
|
-
|
|
1111
|
-
xmag,
|
|
1112
|
-
ymag,
|
|
1113
|
-
-ymag,
|
|
1114
|
-
data.optics.parameters.znear,
|
|
1115
|
-
data.optics.parameters.zfar
|
|
1116
|
-
);
|
|
1366
|
+
camera = new OrthographicCamera(-xmag, xmag, ymag, -ymag, // left, right, top, bottom
|
|
1367
|
+
data.optics.parameters.znear, data.optics.parameters.zfar);
|
|
1117
1368
|
break;
|
|
1369
|
+
|
|
1118
1370
|
default:
|
|
1119
|
-
camera = new
|
|
1371
|
+
camera = new PerspectiveCamera();
|
|
1120
1372
|
break;
|
|
1121
1373
|
}
|
|
1122
|
-
|
|
1374
|
+
|
|
1375
|
+
camera.name = data.name || '';
|
|
1123
1376
|
return camera;
|
|
1124
1377
|
}
|
|
1378
|
+
|
|
1125
1379
|
function getCamera(id) {
|
|
1126
1380
|
const data = library.cameras[id];
|
|
1127
|
-
|
|
1381
|
+
|
|
1382
|
+
if (data !== undefined) {
|
|
1128
1383
|
return getBuild(data, buildCamera);
|
|
1129
1384
|
}
|
|
1385
|
+
|
|
1130
1386
|
console.warn("THREE.ColladaLoader: Couldn't find camera with ID:", id);
|
|
1131
1387
|
return null;
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1388
|
+
} // light
|
|
1389
|
+
|
|
1390
|
+
|
|
1391
|
+
function parseLight(xml) {
|
|
1134
1392
|
let data = {};
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1393
|
+
|
|
1394
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1395
|
+
const child = xml.childNodes[i];
|
|
1396
|
+
if (child.nodeType !== 1) continue;
|
|
1397
|
+
|
|
1139
1398
|
switch (child.nodeName) {
|
|
1140
|
-
case
|
|
1399
|
+
case 'technique_common':
|
|
1141
1400
|
data = parseLightTechnique(child);
|
|
1142
1401
|
break;
|
|
1143
1402
|
}
|
|
1144
1403
|
}
|
|
1145
|
-
|
|
1404
|
+
|
|
1405
|
+
library.lights[xml.getAttribute('id')] = data;
|
|
1146
1406
|
}
|
|
1147
|
-
|
|
1407
|
+
|
|
1408
|
+
function parseLightTechnique(xml) {
|
|
1148
1409
|
const data = {};
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1410
|
+
|
|
1411
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1412
|
+
const child = xml.childNodes[i];
|
|
1413
|
+
if (child.nodeType !== 1) continue;
|
|
1414
|
+
|
|
1153
1415
|
switch (child.nodeName) {
|
|
1154
|
-
case
|
|
1155
|
-
case
|
|
1156
|
-
case
|
|
1157
|
-
case
|
|
1416
|
+
case 'directional':
|
|
1417
|
+
case 'point':
|
|
1418
|
+
case 'spot':
|
|
1419
|
+
case 'ambient':
|
|
1158
1420
|
data.technique = child.nodeName;
|
|
1159
1421
|
data.parameters = parseLightParameters(child);
|
|
1160
1422
|
}
|
|
1161
1423
|
}
|
|
1424
|
+
|
|
1162
1425
|
return data;
|
|
1163
1426
|
}
|
|
1164
|
-
|
|
1427
|
+
|
|
1428
|
+
function parseLightParameters(xml) {
|
|
1165
1429
|
const data = {};
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1430
|
+
|
|
1431
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1432
|
+
const child = xml.childNodes[i];
|
|
1433
|
+
if (child.nodeType !== 1) continue;
|
|
1434
|
+
|
|
1170
1435
|
switch (child.nodeName) {
|
|
1171
|
-
case
|
|
1436
|
+
case 'color':
|
|
1172
1437
|
const array = parseFloats(child.textContent);
|
|
1173
|
-
data.color = new
|
|
1438
|
+
data.color = new Color().fromArray(array);
|
|
1174
1439
|
break;
|
|
1175
|
-
|
|
1440
|
+
|
|
1441
|
+
case 'falloff_angle':
|
|
1176
1442
|
data.falloffAngle = parseFloat(child.textContent);
|
|
1177
1443
|
break;
|
|
1178
|
-
|
|
1444
|
+
|
|
1445
|
+
case 'quadratic_attenuation':
|
|
1179
1446
|
const f = parseFloat(child.textContent);
|
|
1180
1447
|
data.distance = f ? Math.sqrt(1 / f) : 0;
|
|
1181
1448
|
break;
|
|
1182
1449
|
}
|
|
1183
1450
|
}
|
|
1451
|
+
|
|
1184
1452
|
return data;
|
|
1185
1453
|
}
|
|
1454
|
+
|
|
1186
1455
|
function buildLight(data) {
|
|
1187
1456
|
let light;
|
|
1457
|
+
|
|
1188
1458
|
switch (data.technique) {
|
|
1189
|
-
case
|
|
1190
|
-
light = new
|
|
1459
|
+
case 'directional':
|
|
1460
|
+
light = new DirectionalLight();
|
|
1191
1461
|
break;
|
|
1192
|
-
|
|
1193
|
-
|
|
1462
|
+
|
|
1463
|
+
case 'point':
|
|
1464
|
+
light = new PointLight();
|
|
1194
1465
|
break;
|
|
1195
|
-
|
|
1196
|
-
|
|
1466
|
+
|
|
1467
|
+
case 'spot':
|
|
1468
|
+
light = new SpotLight();
|
|
1197
1469
|
break;
|
|
1198
|
-
|
|
1199
|
-
|
|
1470
|
+
|
|
1471
|
+
case 'ambient':
|
|
1472
|
+
light = new AmbientLight();
|
|
1200
1473
|
break;
|
|
1201
1474
|
}
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
if (data.parameters.distance)
|
|
1205
|
-
light.distance = data.parameters.distance;
|
|
1475
|
+
|
|
1476
|
+
if (data.parameters.color) light.color.copy(data.parameters.color);
|
|
1477
|
+
if (data.parameters.distance) light.distance = data.parameters.distance;
|
|
1206
1478
|
return light;
|
|
1207
1479
|
}
|
|
1480
|
+
|
|
1208
1481
|
function getLight(id) {
|
|
1209
1482
|
const data = library.lights[id];
|
|
1210
|
-
|
|
1483
|
+
|
|
1484
|
+
if (data !== undefined) {
|
|
1211
1485
|
return getBuild(data, buildLight);
|
|
1212
1486
|
}
|
|
1487
|
+
|
|
1213
1488
|
console.warn("THREE.ColladaLoader: Couldn't find light with ID:", id);
|
|
1214
1489
|
return null;
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1490
|
+
} // geometry
|
|
1491
|
+
|
|
1492
|
+
|
|
1493
|
+
function parseGeometry(xml) {
|
|
1217
1494
|
const data = {
|
|
1218
|
-
name:
|
|
1495
|
+
name: xml.getAttribute('name'),
|
|
1219
1496
|
sources: {},
|
|
1220
1497
|
vertices: {},
|
|
1221
1498
|
primitives: []
|
|
1222
1499
|
};
|
|
1223
|
-
const mesh = getElementsByTagName(
|
|
1224
|
-
|
|
1225
|
-
|
|
1500
|
+
const mesh = getElementsByTagName(xml, 'mesh')[0]; // the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep
|
|
1501
|
+
|
|
1502
|
+
if (mesh === undefined) return;
|
|
1503
|
+
|
|
1226
1504
|
for (let i = 0; i < mesh.childNodes.length; i++) {
|
|
1227
1505
|
const child = mesh.childNodes[i];
|
|
1228
|
-
if (child.nodeType !== 1)
|
|
1229
|
-
|
|
1230
|
-
|
|
1506
|
+
if (child.nodeType !== 1) continue;
|
|
1507
|
+
const id = child.getAttribute('id');
|
|
1508
|
+
|
|
1231
1509
|
switch (child.nodeName) {
|
|
1232
|
-
case
|
|
1510
|
+
case 'source':
|
|
1233
1511
|
data.sources[id] = parseSource(child);
|
|
1234
1512
|
break;
|
|
1235
|
-
|
|
1513
|
+
|
|
1514
|
+
case 'vertices':
|
|
1515
|
+
// data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];
|
|
1236
1516
|
data.vertices = parseGeometryVertices(child);
|
|
1237
1517
|
break;
|
|
1238
|
-
|
|
1239
|
-
|
|
1518
|
+
|
|
1519
|
+
case 'polygons':
|
|
1520
|
+
console.warn('THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName);
|
|
1240
1521
|
break;
|
|
1241
|
-
|
|
1242
|
-
case
|
|
1243
|
-
case
|
|
1244
|
-
case
|
|
1522
|
+
|
|
1523
|
+
case 'lines':
|
|
1524
|
+
case 'linestrips':
|
|
1525
|
+
case 'polylist':
|
|
1526
|
+
case 'triangles':
|
|
1245
1527
|
data.primitives.push(parseGeometryPrimitive(child));
|
|
1246
1528
|
break;
|
|
1529
|
+
|
|
1247
1530
|
default:
|
|
1248
1531
|
console.log(child);
|
|
1249
1532
|
}
|
|
1250
1533
|
}
|
|
1251
|
-
|
|
1534
|
+
|
|
1535
|
+
library.geometries[xml.getAttribute('id')] = data;
|
|
1252
1536
|
}
|
|
1253
|
-
|
|
1537
|
+
|
|
1538
|
+
function parseSource(xml) {
|
|
1254
1539
|
const data = {
|
|
1255
1540
|
array: [],
|
|
1256
1541
|
stride: 3
|
|
1257
1542
|
};
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1543
|
+
|
|
1544
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1545
|
+
const child = xml.childNodes[i];
|
|
1546
|
+
if (child.nodeType !== 1) continue;
|
|
1547
|
+
|
|
1262
1548
|
switch (child.nodeName) {
|
|
1263
|
-
case
|
|
1549
|
+
case 'float_array':
|
|
1264
1550
|
data.array = parseFloats(child.textContent);
|
|
1265
1551
|
break;
|
|
1266
|
-
|
|
1552
|
+
|
|
1553
|
+
case 'Name_array':
|
|
1267
1554
|
data.array = parseStrings(child.textContent);
|
|
1268
1555
|
break;
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1556
|
+
|
|
1557
|
+
case 'technique_common':
|
|
1558
|
+
const accessor = getElementsByTagName(child, 'accessor')[0];
|
|
1559
|
+
|
|
1560
|
+
if (accessor !== undefined) {
|
|
1561
|
+
data.stride = parseInt(accessor.getAttribute('stride'));
|
|
1273
1562
|
}
|
|
1563
|
+
|
|
1274
1564
|
break;
|
|
1275
1565
|
}
|
|
1276
1566
|
}
|
|
1567
|
+
|
|
1277
1568
|
return data;
|
|
1278
1569
|
}
|
|
1279
|
-
|
|
1570
|
+
|
|
1571
|
+
function parseGeometryVertices(xml) {
|
|
1280
1572
|
const data = {};
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
data[child.getAttribute(
|
|
1573
|
+
|
|
1574
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1575
|
+
const child = xml.childNodes[i];
|
|
1576
|
+
if (child.nodeType !== 1) continue;
|
|
1577
|
+
data[child.getAttribute('semantic')] = parseId(child.getAttribute('source'));
|
|
1286
1578
|
}
|
|
1579
|
+
|
|
1287
1580
|
return data;
|
|
1288
1581
|
}
|
|
1289
|
-
|
|
1582
|
+
|
|
1583
|
+
function parseGeometryPrimitive(xml) {
|
|
1290
1584
|
const primitive = {
|
|
1291
|
-
type:
|
|
1292
|
-
material:
|
|
1293
|
-
count: parseInt(
|
|
1585
|
+
type: xml.nodeName,
|
|
1586
|
+
material: xml.getAttribute('material'),
|
|
1587
|
+
count: parseInt(xml.getAttribute('count')),
|
|
1294
1588
|
inputs: {},
|
|
1295
1589
|
stride: 0,
|
|
1296
1590
|
hasUV: false
|
|
1297
1591
|
};
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1592
|
+
|
|
1593
|
+
for (let i = 0, l = xml.childNodes.length; i < l; i++) {
|
|
1594
|
+
const child = xml.childNodes[i];
|
|
1595
|
+
if (child.nodeType !== 1) continue;
|
|
1596
|
+
|
|
1302
1597
|
switch (child.nodeName) {
|
|
1303
|
-
case
|
|
1304
|
-
const id = parseId(child.getAttribute(
|
|
1305
|
-
const semantic = child.getAttribute(
|
|
1306
|
-
const offset = parseInt(child.getAttribute(
|
|
1307
|
-
const set = parseInt(child.getAttribute(
|
|
1598
|
+
case 'input':
|
|
1599
|
+
const id = parseId(child.getAttribute('source'));
|
|
1600
|
+
const semantic = child.getAttribute('semantic');
|
|
1601
|
+
const offset = parseInt(child.getAttribute('offset'));
|
|
1602
|
+
const set = parseInt(child.getAttribute('set'));
|
|
1308
1603
|
const inputname = set > 0 ? semantic + set : semantic;
|
|
1309
|
-
primitive.inputs[inputname] = {
|
|
1604
|
+
primitive.inputs[inputname] = {
|
|
1605
|
+
id: id,
|
|
1606
|
+
offset: offset
|
|
1607
|
+
};
|
|
1310
1608
|
primitive.stride = Math.max(primitive.stride, offset + 1);
|
|
1311
|
-
if (semantic ===
|
|
1312
|
-
primitive.hasUV = true;
|
|
1609
|
+
if (semantic === 'TEXCOORD') primitive.hasUV = true;
|
|
1313
1610
|
break;
|
|
1314
|
-
|
|
1611
|
+
|
|
1612
|
+
case 'vcount':
|
|
1315
1613
|
primitive.vcount = parseInts(child.textContent);
|
|
1316
1614
|
break;
|
|
1317
|
-
|
|
1615
|
+
|
|
1616
|
+
case 'p':
|
|
1318
1617
|
primitive.p = parseInts(child.textContent);
|
|
1319
1618
|
break;
|
|
1320
1619
|
}
|
|
1321
1620
|
}
|
|
1621
|
+
|
|
1322
1622
|
return primitive;
|
|
1323
1623
|
}
|
|
1624
|
+
|
|
1324
1625
|
function groupPrimitives(primitives) {
|
|
1325
1626
|
const build = {};
|
|
1627
|
+
|
|
1326
1628
|
for (let i = 0; i < primitives.length; i++) {
|
|
1327
1629
|
const primitive = primitives[i];
|
|
1328
|
-
if (build[primitive.type] ===
|
|
1329
|
-
build[primitive.type] = [];
|
|
1630
|
+
if (build[primitive.type] === undefined) build[primitive.type] = [];
|
|
1330
1631
|
build[primitive.type].push(primitive);
|
|
1331
1632
|
}
|
|
1633
|
+
|
|
1332
1634
|
return build;
|
|
1333
1635
|
}
|
|
1636
|
+
|
|
1334
1637
|
function checkUVCoordinates(primitives) {
|
|
1335
|
-
let
|
|
1638
|
+
let count = 0;
|
|
1639
|
+
|
|
1336
1640
|
for (let i = 0, l = primitives.length; i < l; i++) {
|
|
1337
1641
|
const primitive = primitives[i];
|
|
1642
|
+
|
|
1338
1643
|
if (primitive.hasUV === true) {
|
|
1339
|
-
|
|
1644
|
+
count++;
|
|
1340
1645
|
}
|
|
1341
1646
|
}
|
|
1342
|
-
|
|
1647
|
+
|
|
1648
|
+
if (count > 0 && count < primitives.length) {
|
|
1343
1649
|
primitives.uvsNeedsFix = true;
|
|
1344
1650
|
}
|
|
1345
1651
|
}
|
|
1652
|
+
|
|
1346
1653
|
function buildGeometry(data) {
|
|
1347
1654
|
const build = {};
|
|
1348
1655
|
const sources = data.sources;
|
|
1349
1656
|
const vertices = data.vertices;
|
|
1350
1657
|
const primitives = data.primitives;
|
|
1351
|
-
if (primitives.length === 0)
|
|
1352
|
-
|
|
1658
|
+
if (primitives.length === 0) return {}; // our goal is to create one buffer geometry for a single type of primitives
|
|
1659
|
+
// first, we group all primitives by their type
|
|
1660
|
+
|
|
1353
1661
|
const groupedPrimitives = groupPrimitives(primitives);
|
|
1662
|
+
|
|
1354
1663
|
for (const type in groupedPrimitives) {
|
|
1355
|
-
const primitiveType = groupedPrimitives[type];
|
|
1356
|
-
|
|
1664
|
+
const primitiveType = groupedPrimitives[type]; // second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines)
|
|
1665
|
+
|
|
1666
|
+
checkUVCoordinates(primitiveType); // third, create a buffer geometry for each type of primitives
|
|
1667
|
+
|
|
1357
1668
|
build[type] = buildGeometryType(primitiveType, sources, vertices);
|
|
1358
1669
|
}
|
|
1670
|
+
|
|
1359
1671
|
return build;
|
|
1360
1672
|
}
|
|
1673
|
+
|
|
1361
1674
|
function buildGeometryType(primitives, sources, vertices) {
|
|
1362
1675
|
const build = {};
|
|
1363
|
-
const
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
const
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1676
|
+
const position = {
|
|
1677
|
+
array: [],
|
|
1678
|
+
stride: 0
|
|
1679
|
+
};
|
|
1680
|
+
const normal = {
|
|
1681
|
+
array: [],
|
|
1682
|
+
stride: 0
|
|
1683
|
+
};
|
|
1684
|
+
const uv = {
|
|
1685
|
+
array: [],
|
|
1686
|
+
stride: 0
|
|
1687
|
+
};
|
|
1688
|
+
const uv2 = {
|
|
1689
|
+
array: [],
|
|
1690
|
+
stride: 0
|
|
1691
|
+
};
|
|
1692
|
+
const color = {
|
|
1693
|
+
array: [],
|
|
1694
|
+
stride: 0
|
|
1695
|
+
};
|
|
1696
|
+
const skinIndex = {
|
|
1697
|
+
array: [],
|
|
1698
|
+
stride: 4
|
|
1699
|
+
};
|
|
1700
|
+
const skinWeight = {
|
|
1701
|
+
array: [],
|
|
1702
|
+
stride: 4
|
|
1703
|
+
};
|
|
1704
|
+
const geometry = new BufferGeometry();
|
|
1371
1705
|
const materialKeys = [];
|
|
1372
1706
|
let start = 0;
|
|
1707
|
+
|
|
1373
1708
|
for (let p = 0; p < primitives.length; p++) {
|
|
1374
1709
|
const primitive = primitives[p];
|
|
1375
|
-
const inputs = primitive.inputs;
|
|
1376
|
-
|
|
1710
|
+
const inputs = primitive.inputs; // groups
|
|
1711
|
+
|
|
1712
|
+
let count = 0;
|
|
1713
|
+
|
|
1377
1714
|
switch (primitive.type) {
|
|
1378
|
-
case
|
|
1379
|
-
case
|
|
1380
|
-
|
|
1715
|
+
case 'lines':
|
|
1716
|
+
case 'linestrips':
|
|
1717
|
+
count = primitive.count * 2;
|
|
1381
1718
|
break;
|
|
1382
|
-
|
|
1383
|
-
|
|
1719
|
+
|
|
1720
|
+
case 'triangles':
|
|
1721
|
+
count = primitive.count * 3;
|
|
1384
1722
|
break;
|
|
1385
|
-
|
|
1723
|
+
|
|
1724
|
+
case 'polylist':
|
|
1386
1725
|
for (let g = 0; g < primitive.count; g++) {
|
|
1387
1726
|
const vc = primitive.vcount[g];
|
|
1727
|
+
|
|
1388
1728
|
switch (vc) {
|
|
1389
1729
|
case 3:
|
|
1390
|
-
|
|
1730
|
+
count += 3; // single triangle
|
|
1731
|
+
|
|
1391
1732
|
break;
|
|
1733
|
+
|
|
1392
1734
|
case 4:
|
|
1393
|
-
|
|
1735
|
+
count += 6; // quad, subdivided into two triangles
|
|
1736
|
+
|
|
1394
1737
|
break;
|
|
1738
|
+
|
|
1395
1739
|
default:
|
|
1396
|
-
|
|
1740
|
+
count += (vc - 2) * 3; // polylist with more than four vertices
|
|
1741
|
+
|
|
1397
1742
|
break;
|
|
1398
1743
|
}
|
|
1399
1744
|
}
|
|
1745
|
+
|
|
1400
1746
|
break;
|
|
1747
|
+
|
|
1401
1748
|
default:
|
|
1402
|
-
console.warn(
|
|
1749
|
+
console.warn('THREE.ColladaLoader: Unknow primitive type:', primitive.type);
|
|
1403
1750
|
}
|
|
1404
|
-
|
|
1405
|
-
start
|
|
1751
|
+
|
|
1752
|
+
geometry.addGroup(start, count, p);
|
|
1753
|
+
start += count; // material
|
|
1754
|
+
|
|
1406
1755
|
if (primitive.material) {
|
|
1407
1756
|
materialKeys.push(primitive.material);
|
|
1408
|
-
}
|
|
1757
|
+
} // geometry data
|
|
1758
|
+
|
|
1759
|
+
|
|
1409
1760
|
for (const name in inputs) {
|
|
1410
1761
|
const input = inputs[name];
|
|
1762
|
+
|
|
1411
1763
|
switch (name) {
|
|
1412
|
-
case
|
|
1764
|
+
case 'VERTEX':
|
|
1413
1765
|
for (const key in vertices) {
|
|
1414
1766
|
const id = vertices[key];
|
|
1767
|
+
|
|
1415
1768
|
switch (key) {
|
|
1416
|
-
case
|
|
1417
|
-
const prevLength =
|
|
1418
|
-
buildGeometryData(primitive, sources[id], input.offset,
|
|
1419
|
-
|
|
1769
|
+
case 'POSITION':
|
|
1770
|
+
const prevLength = position.array.length;
|
|
1771
|
+
buildGeometryData(primitive, sources[id], input.offset, position.array);
|
|
1772
|
+
position.stride = sources[id].stride;
|
|
1773
|
+
|
|
1420
1774
|
if (sources.skinWeights && sources.skinIndices) {
|
|
1421
1775
|
buildGeometryData(primitive, sources.skinIndices, input.offset, skinIndex.array);
|
|
1422
1776
|
buildGeometryData(primitive, sources.skinWeights, input.offset, skinWeight.array);
|
|
1423
|
-
}
|
|
1777
|
+
} // see #3803
|
|
1778
|
+
|
|
1779
|
+
|
|
1424
1780
|
if (primitive.hasUV === false && primitives.uvsNeedsFix === true) {
|
|
1425
|
-
const
|
|
1426
|
-
|
|
1781
|
+
const count = (position.array.length - prevLength) / position.stride;
|
|
1782
|
+
|
|
1783
|
+
for (let i = 0; i < count; i++) {
|
|
1784
|
+
// fill missing uv coordinates
|
|
1427
1785
|
uv.array.push(0, 0);
|
|
1428
1786
|
}
|
|
1429
1787
|
}
|
|
1788
|
+
|
|
1430
1789
|
break;
|
|
1431
|
-
|
|
1790
|
+
|
|
1791
|
+
case 'NORMAL':
|
|
1432
1792
|
buildGeometryData(primitive, sources[id], input.offset, normal.array);
|
|
1433
1793
|
normal.stride = sources[id].stride;
|
|
1434
1794
|
break;
|
|
1435
|
-
|
|
1795
|
+
|
|
1796
|
+
case 'COLOR':
|
|
1436
1797
|
buildGeometryData(primitive, sources[id], input.offset, color.array);
|
|
1437
1798
|
color.stride = sources[id].stride;
|
|
1438
1799
|
break;
|
|
1439
|
-
|
|
1800
|
+
|
|
1801
|
+
case 'TEXCOORD':
|
|
1440
1802
|
buildGeometryData(primitive, sources[id], input.offset, uv.array);
|
|
1441
1803
|
uv.stride = sources[id].stride;
|
|
1442
1804
|
break;
|
|
1443
|
-
|
|
1805
|
+
|
|
1806
|
+
case 'TEXCOORD1':
|
|
1444
1807
|
buildGeometryData(primitive, sources[id], input.offset, uv2.array);
|
|
1445
1808
|
uv.stride = sources[id].stride;
|
|
1446
1809
|
break;
|
|
1810
|
+
|
|
1447
1811
|
default:
|
|
1448
1812
|
console.warn('THREE.ColladaLoader: Semantic "%s" not handled in geometry build process.', key);
|
|
1449
1813
|
}
|
|
1450
1814
|
}
|
|
1815
|
+
|
|
1451
1816
|
break;
|
|
1452
|
-
|
|
1817
|
+
|
|
1818
|
+
case 'NORMAL':
|
|
1453
1819
|
buildGeometryData(primitive, sources[input.id], input.offset, normal.array);
|
|
1454
1820
|
normal.stride = sources[input.id].stride;
|
|
1455
1821
|
break;
|
|
1456
|
-
|
|
1822
|
+
|
|
1823
|
+
case 'COLOR':
|
|
1457
1824
|
buildGeometryData(primitive, sources[input.id], input.offset, color.array);
|
|
1458
1825
|
color.stride = sources[input.id].stride;
|
|
1459
1826
|
break;
|
|
1460
|
-
|
|
1827
|
+
|
|
1828
|
+
case 'TEXCOORD':
|
|
1461
1829
|
buildGeometryData(primitive, sources[input.id], input.offset, uv.array);
|
|
1462
1830
|
uv.stride = sources[input.id].stride;
|
|
1463
1831
|
break;
|
|
1464
|
-
|
|
1832
|
+
|
|
1833
|
+
case 'TEXCOORD1':
|
|
1465
1834
|
buildGeometryData(primitive, sources[input.id], input.offset, uv2.array);
|
|
1466
1835
|
uv2.stride = sources[input.id].stride;
|
|
1467
1836
|
break;
|
|
1468
1837
|
}
|
|
1469
1838
|
}
|
|
1839
|
+
} // build geometry
|
|
1840
|
+
|
|
1841
|
+
|
|
1842
|
+
if (position.array.length > 0) {
|
|
1843
|
+
geometry.setAttribute('position', new Float32BufferAttribute(position.array, position.stride));
|
|
1470
1844
|
}
|
|
1471
|
-
|
|
1472
|
-
geometry.setAttribute("position", new THREE.Float32BufferAttribute(position2.array, position2.stride));
|
|
1473
|
-
}
|
|
1845
|
+
|
|
1474
1846
|
if (normal.array.length > 0) {
|
|
1475
|
-
geometry.setAttribute(
|
|
1476
|
-
}
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
if (uv.array.length > 0)
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
geometry.setAttribute("uv2", new THREE.Float32BufferAttribute(uv2.array, uv2.stride));
|
|
1847
|
+
geometry.setAttribute('normal', new Float32BufferAttribute(normal.array, normal.stride));
|
|
1848
|
+
}
|
|
1849
|
+
|
|
1850
|
+
if (color.array.length > 0) geometry.setAttribute('color', new Float32BufferAttribute(color.array, color.stride));
|
|
1851
|
+
if (uv.array.length > 0) geometry.setAttribute('uv', new Float32BufferAttribute(uv.array, uv.stride));
|
|
1852
|
+
if (uv2.array.length > 0) geometry.setAttribute('uv2', new Float32BufferAttribute(uv2.array, uv2.stride));
|
|
1853
|
+
|
|
1483
1854
|
if (skinIndex.array.length > 0) {
|
|
1484
|
-
geometry.setAttribute(
|
|
1855
|
+
geometry.setAttribute('skinIndex', new Float32BufferAttribute(skinIndex.array, skinIndex.stride));
|
|
1485
1856
|
}
|
|
1857
|
+
|
|
1486
1858
|
if (skinWeight.array.length > 0) {
|
|
1487
|
-
geometry.setAttribute(
|
|
1859
|
+
geometry.setAttribute('skinWeight', new Float32BufferAttribute(skinWeight.array, skinWeight.stride));
|
|
1488
1860
|
}
|
|
1861
|
+
|
|
1489
1862
|
build.data = geometry;
|
|
1490
1863
|
build.type = primitives[0].type;
|
|
1491
1864
|
build.materialKeys = materialKeys;
|
|
1492
1865
|
return build;
|
|
1493
1866
|
}
|
|
1867
|
+
|
|
1494
1868
|
function buildGeometryData(primitive, source, offset, array) {
|
|
1495
1869
|
const indices = primitive.p;
|
|
1496
1870
|
const stride = primitive.stride;
|
|
1497
1871
|
const vcount = primitive.vcount;
|
|
1872
|
+
|
|
1498
1873
|
function pushVector(i) {
|
|
1499
1874
|
let index = indices[i + offset] * sourceStride;
|
|
1500
1875
|
const length = index + sourceStride;
|
|
1876
|
+
|
|
1501
1877
|
for (; index < length; index++) {
|
|
1502
1878
|
array.push(sourceArray[index]);
|
|
1503
1879
|
}
|
|
1504
1880
|
}
|
|
1881
|
+
|
|
1505
1882
|
const sourceArray = source.array;
|
|
1506
1883
|
const sourceStride = source.stride;
|
|
1507
|
-
|
|
1884
|
+
|
|
1885
|
+
if (primitive.vcount !== undefined) {
|
|
1508
1886
|
let index = 0;
|
|
1887
|
+
|
|
1509
1888
|
for (let i = 0, l = vcount.length; i < l; i++) {
|
|
1510
|
-
const
|
|
1511
|
-
|
|
1889
|
+
const count = vcount[i];
|
|
1890
|
+
|
|
1891
|
+
if (count === 4) {
|
|
1512
1892
|
const a = index + stride * 0;
|
|
1513
1893
|
const b = index + stride * 1;
|
|
1514
1894
|
const c = index + stride * 2;
|
|
@@ -1519,15 +1899,15 @@ class ColladaLoader extends THREE.Loader {
|
|
|
1519
1899
|
pushVector(b);
|
|
1520
1900
|
pushVector(c);
|
|
1521
1901
|
pushVector(d);
|
|
1522
|
-
} else if (
|
|
1902
|
+
} else if (count === 3) {
|
|
1523
1903
|
const a = index + stride * 0;
|
|
1524
1904
|
const b = index + stride * 1;
|
|
1525
1905
|
const c = index + stride * 2;
|
|
1526
1906
|
pushVector(a);
|
|
1527
1907
|
pushVector(b);
|
|
1528
1908
|
pushVector(c);
|
|
1529
|
-
} else if (
|
|
1530
|
-
for (let k = 1, kl =
|
|
1909
|
+
} else if (count > 4) {
|
|
1910
|
+
for (let k = 1, kl = count - 2; k <= kl; k++) {
|
|
1531
1911
|
const a = index + stride * 0;
|
|
1532
1912
|
const b = index + stride * k;
|
|
1533
1913
|
const c = index + stride * (k + 1);
|
|
@@ -1536,7 +1916,8 @@ class ColladaLoader extends THREE.Loader {
|
|
|
1536
1916
|
pushVector(c);
|
|
1537
1917
|
}
|
|
1538
1918
|
}
|
|
1539
|
-
|
|
1919
|
+
|
|
1920
|
+
index += stride * count;
|
|
1540
1921
|
}
|
|
1541
1922
|
} else {
|
|
1542
1923
|
for (let i = 0, l = indices.length; i < l; i += stride) {
|
|
@@ -1544,420 +1925,493 @@ class ColladaLoader extends THREE.Loader {
|
|
|
1544
1925
|
}
|
|
1545
1926
|
}
|
|
1546
1927
|
}
|
|
1928
|
+
|
|
1547
1929
|
function getGeometry(id) {
|
|
1548
1930
|
return getBuild(library.geometries[id], buildGeometry);
|
|
1549
|
-
}
|
|
1550
|
-
|
|
1931
|
+
} // kinematics
|
|
1932
|
+
|
|
1933
|
+
|
|
1934
|
+
function parseKinematicsModel(xml) {
|
|
1551
1935
|
const data = {
|
|
1552
|
-
name:
|
|
1936
|
+
name: xml.getAttribute('name') || '',
|
|
1553
1937
|
joints: {},
|
|
1554
1938
|
links: []
|
|
1555
1939
|
};
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1940
|
+
|
|
1941
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1942
|
+
const child = xml.childNodes[i];
|
|
1943
|
+
if (child.nodeType !== 1) continue;
|
|
1944
|
+
|
|
1560
1945
|
switch (child.nodeName) {
|
|
1561
|
-
case
|
|
1946
|
+
case 'technique_common':
|
|
1562
1947
|
parseKinematicsTechniqueCommon(child, data);
|
|
1563
1948
|
break;
|
|
1564
1949
|
}
|
|
1565
1950
|
}
|
|
1566
|
-
|
|
1951
|
+
|
|
1952
|
+
library.kinematicsModels[xml.getAttribute('id')] = data;
|
|
1567
1953
|
}
|
|
1954
|
+
|
|
1568
1955
|
function buildKinematicsModel(data) {
|
|
1569
|
-
if (data.build !==
|
|
1570
|
-
return data.build;
|
|
1956
|
+
if (data.build !== undefined) return data.build;
|
|
1571
1957
|
return data;
|
|
1572
1958
|
}
|
|
1959
|
+
|
|
1573
1960
|
function getKinematicsModel(id) {
|
|
1574
1961
|
return getBuild(library.kinematicsModels[id], buildKinematicsModel);
|
|
1575
1962
|
}
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1963
|
+
|
|
1964
|
+
function parseKinematicsTechniqueCommon(xml, data) {
|
|
1965
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1966
|
+
const child = xml.childNodes[i];
|
|
1967
|
+
if (child.nodeType !== 1) continue;
|
|
1968
|
+
|
|
1581
1969
|
switch (child.nodeName) {
|
|
1582
|
-
case
|
|
1583
|
-
data.joints[child.getAttribute(
|
|
1970
|
+
case 'joint':
|
|
1971
|
+
data.joints[child.getAttribute('sid')] = parseKinematicsJoint(child);
|
|
1584
1972
|
break;
|
|
1585
|
-
|
|
1973
|
+
|
|
1974
|
+
case 'link':
|
|
1586
1975
|
data.links.push(parseKinematicsLink(child));
|
|
1587
1976
|
break;
|
|
1588
1977
|
}
|
|
1589
1978
|
}
|
|
1590
1979
|
}
|
|
1591
|
-
|
|
1980
|
+
|
|
1981
|
+
function parseKinematicsJoint(xml) {
|
|
1592
1982
|
let data;
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1983
|
+
|
|
1984
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
1985
|
+
const child = xml.childNodes[i];
|
|
1986
|
+
if (child.nodeType !== 1) continue;
|
|
1987
|
+
|
|
1597
1988
|
switch (child.nodeName) {
|
|
1598
|
-
case
|
|
1599
|
-
case
|
|
1989
|
+
case 'prismatic':
|
|
1990
|
+
case 'revolute':
|
|
1600
1991
|
data = parseKinematicsJointParameter(child);
|
|
1601
1992
|
break;
|
|
1602
1993
|
}
|
|
1603
1994
|
}
|
|
1995
|
+
|
|
1604
1996
|
return data;
|
|
1605
1997
|
}
|
|
1606
|
-
|
|
1998
|
+
|
|
1999
|
+
function parseKinematicsJointParameter(xml) {
|
|
1607
2000
|
const data = {
|
|
1608
|
-
sid:
|
|
1609
|
-
name:
|
|
1610
|
-
axis: new
|
|
2001
|
+
sid: xml.getAttribute('sid'),
|
|
2002
|
+
name: xml.getAttribute('name') || '',
|
|
2003
|
+
axis: new Vector3(),
|
|
1611
2004
|
limits: {
|
|
1612
2005
|
min: 0,
|
|
1613
2006
|
max: 0
|
|
1614
2007
|
},
|
|
1615
|
-
type:
|
|
2008
|
+
type: xml.nodeName,
|
|
1616
2009
|
static: false,
|
|
1617
2010
|
zeroPosition: 0,
|
|
1618
2011
|
middlePosition: 0
|
|
1619
2012
|
};
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
2013
|
+
|
|
2014
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2015
|
+
const child = xml.childNodes[i];
|
|
2016
|
+
if (child.nodeType !== 1) continue;
|
|
2017
|
+
|
|
1624
2018
|
switch (child.nodeName) {
|
|
1625
|
-
case
|
|
2019
|
+
case 'axis':
|
|
1626
2020
|
const array = parseFloats(child.textContent);
|
|
1627
2021
|
data.axis.fromArray(array);
|
|
1628
2022
|
break;
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
const
|
|
2023
|
+
|
|
2024
|
+
case 'limits':
|
|
2025
|
+
const max = child.getElementsByTagName('max')[0];
|
|
2026
|
+
const min = child.getElementsByTagName('min')[0];
|
|
1632
2027
|
data.limits.max = parseFloat(max.textContent);
|
|
1633
2028
|
data.limits.min = parseFloat(min.textContent);
|
|
1634
2029
|
break;
|
|
1635
2030
|
}
|
|
1636
|
-
}
|
|
2031
|
+
} // if min is equal to or greater than max, consider the joint static
|
|
2032
|
+
|
|
2033
|
+
|
|
1637
2034
|
if (data.limits.min >= data.limits.max) {
|
|
1638
2035
|
data.static = true;
|
|
1639
|
-
}
|
|
1640
|
-
|
|
2036
|
+
} // calculate middle position
|
|
2037
|
+
|
|
2038
|
+
|
|
2039
|
+
data.middlePosition = (data.limits.min + data.limits.max) / 2.0;
|
|
1641
2040
|
return data;
|
|
1642
2041
|
}
|
|
1643
|
-
|
|
2042
|
+
|
|
2043
|
+
function parseKinematicsLink(xml) {
|
|
1644
2044
|
const data = {
|
|
1645
|
-
sid:
|
|
1646
|
-
name:
|
|
2045
|
+
sid: xml.getAttribute('sid'),
|
|
2046
|
+
name: xml.getAttribute('name') || '',
|
|
1647
2047
|
attachments: [],
|
|
1648
2048
|
transforms: []
|
|
1649
2049
|
};
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
2050
|
+
|
|
2051
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2052
|
+
const child = xml.childNodes[i];
|
|
2053
|
+
if (child.nodeType !== 1) continue;
|
|
2054
|
+
|
|
1654
2055
|
switch (child.nodeName) {
|
|
1655
|
-
case
|
|
2056
|
+
case 'attachment_full':
|
|
1656
2057
|
data.attachments.push(parseKinematicsAttachment(child));
|
|
1657
2058
|
break;
|
|
1658
|
-
|
|
1659
|
-
case
|
|
1660
|
-
case
|
|
2059
|
+
|
|
2060
|
+
case 'matrix':
|
|
2061
|
+
case 'translate':
|
|
2062
|
+
case 'rotate':
|
|
1661
2063
|
data.transforms.push(parseKinematicsTransform(child));
|
|
1662
2064
|
break;
|
|
1663
2065
|
}
|
|
1664
2066
|
}
|
|
2067
|
+
|
|
1665
2068
|
return data;
|
|
1666
2069
|
}
|
|
1667
|
-
|
|
2070
|
+
|
|
2071
|
+
function parseKinematicsAttachment(xml) {
|
|
1668
2072
|
const data = {
|
|
1669
|
-
joint:
|
|
2073
|
+
joint: xml.getAttribute('joint').split('/').pop(),
|
|
1670
2074
|
transforms: [],
|
|
1671
2075
|
links: []
|
|
1672
2076
|
};
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
2077
|
+
|
|
2078
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2079
|
+
const child = xml.childNodes[i];
|
|
2080
|
+
if (child.nodeType !== 1) continue;
|
|
2081
|
+
|
|
1677
2082
|
switch (child.nodeName) {
|
|
1678
|
-
case
|
|
2083
|
+
case 'link':
|
|
1679
2084
|
data.links.push(parseKinematicsLink(child));
|
|
1680
2085
|
break;
|
|
1681
|
-
|
|
1682
|
-
case
|
|
1683
|
-
case
|
|
2086
|
+
|
|
2087
|
+
case 'matrix':
|
|
2088
|
+
case 'translate':
|
|
2089
|
+
case 'rotate':
|
|
1684
2090
|
data.transforms.push(parseKinematicsTransform(child));
|
|
1685
2091
|
break;
|
|
1686
2092
|
}
|
|
1687
2093
|
}
|
|
2094
|
+
|
|
1688
2095
|
return data;
|
|
1689
2096
|
}
|
|
1690
|
-
|
|
2097
|
+
|
|
2098
|
+
function parseKinematicsTransform(xml) {
|
|
1691
2099
|
const data = {
|
|
1692
|
-
type:
|
|
2100
|
+
type: xml.nodeName
|
|
1693
2101
|
};
|
|
1694
|
-
const array = parseFloats(
|
|
2102
|
+
const array = parseFloats(xml.textContent);
|
|
2103
|
+
|
|
1695
2104
|
switch (data.type) {
|
|
1696
|
-
case
|
|
1697
|
-
data.obj = new
|
|
2105
|
+
case 'matrix':
|
|
2106
|
+
data.obj = new Matrix4();
|
|
1698
2107
|
data.obj.fromArray(array).transpose();
|
|
1699
2108
|
break;
|
|
1700
|
-
|
|
1701
|
-
|
|
2109
|
+
|
|
2110
|
+
case 'translate':
|
|
2111
|
+
data.obj = new Vector3();
|
|
1702
2112
|
data.obj.fromArray(array);
|
|
1703
2113
|
break;
|
|
1704
|
-
|
|
1705
|
-
|
|
2114
|
+
|
|
2115
|
+
case 'rotate':
|
|
2116
|
+
data.obj = new Vector3();
|
|
1706
2117
|
data.obj.fromArray(array);
|
|
1707
|
-
data.angle =
|
|
2118
|
+
data.angle = MathUtils.degToRad(array[3]);
|
|
1708
2119
|
break;
|
|
1709
2120
|
}
|
|
2121
|
+
|
|
1710
2122
|
return data;
|
|
1711
|
-
}
|
|
1712
|
-
|
|
2123
|
+
} // physics
|
|
2124
|
+
|
|
2125
|
+
|
|
2126
|
+
function parsePhysicsModel(xml) {
|
|
1713
2127
|
const data = {
|
|
1714
|
-
name:
|
|
2128
|
+
name: xml.getAttribute('name') || '',
|
|
1715
2129
|
rigidBodies: {}
|
|
1716
2130
|
};
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
2131
|
+
|
|
2132
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2133
|
+
const child = xml.childNodes[i];
|
|
2134
|
+
if (child.nodeType !== 1) continue;
|
|
2135
|
+
|
|
1721
2136
|
switch (child.nodeName) {
|
|
1722
|
-
case
|
|
1723
|
-
data.rigidBodies[child.getAttribute(
|
|
1724
|
-
parsePhysicsRigidBody(child, data.rigidBodies[child.getAttribute(
|
|
2137
|
+
case 'rigid_body':
|
|
2138
|
+
data.rigidBodies[child.getAttribute('name')] = {};
|
|
2139
|
+
parsePhysicsRigidBody(child, data.rigidBodies[child.getAttribute('name')]);
|
|
1725
2140
|
break;
|
|
1726
2141
|
}
|
|
1727
2142
|
}
|
|
1728
|
-
|
|
2143
|
+
|
|
2144
|
+
library.physicsModels[xml.getAttribute('id')] = data;
|
|
1729
2145
|
}
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
2146
|
+
|
|
2147
|
+
function parsePhysicsRigidBody(xml, data) {
|
|
2148
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2149
|
+
const child = xml.childNodes[i];
|
|
2150
|
+
if (child.nodeType !== 1) continue;
|
|
2151
|
+
|
|
1735
2152
|
switch (child.nodeName) {
|
|
1736
|
-
case
|
|
2153
|
+
case 'technique_common':
|
|
1737
2154
|
parsePhysicsTechniqueCommon(child, data);
|
|
1738
2155
|
break;
|
|
1739
2156
|
}
|
|
1740
2157
|
}
|
|
1741
2158
|
}
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
2159
|
+
|
|
2160
|
+
function parsePhysicsTechniqueCommon(xml, data) {
|
|
2161
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2162
|
+
const child = xml.childNodes[i];
|
|
2163
|
+
if (child.nodeType !== 1) continue;
|
|
2164
|
+
|
|
1747
2165
|
switch (child.nodeName) {
|
|
1748
|
-
case
|
|
2166
|
+
case 'inertia':
|
|
1749
2167
|
data.inertia = parseFloats(child.textContent);
|
|
1750
2168
|
break;
|
|
1751
|
-
|
|
2169
|
+
|
|
2170
|
+
case 'mass':
|
|
1752
2171
|
data.mass = parseFloats(child.textContent)[0];
|
|
1753
2172
|
break;
|
|
1754
2173
|
}
|
|
1755
2174
|
}
|
|
1756
|
-
}
|
|
1757
|
-
|
|
2175
|
+
} // scene
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
function parseKinematicsScene(xml) {
|
|
1758
2179
|
const data = {
|
|
1759
2180
|
bindJointAxis: []
|
|
1760
2181
|
};
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
2182
|
+
|
|
2183
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2184
|
+
const child = xml.childNodes[i];
|
|
2185
|
+
if (child.nodeType !== 1) continue;
|
|
2186
|
+
|
|
1765
2187
|
switch (child.nodeName) {
|
|
1766
|
-
case
|
|
2188
|
+
case 'bind_joint_axis':
|
|
1767
2189
|
data.bindJointAxis.push(parseKinematicsBindJointAxis(child));
|
|
1768
2190
|
break;
|
|
1769
2191
|
}
|
|
1770
2192
|
}
|
|
1771
|
-
|
|
2193
|
+
|
|
2194
|
+
library.kinematicsScenes[parseId(xml.getAttribute('url'))] = data;
|
|
1772
2195
|
}
|
|
1773
|
-
|
|
2196
|
+
|
|
2197
|
+
function parseKinematicsBindJointAxis(xml) {
|
|
1774
2198
|
const data = {
|
|
1775
|
-
target:
|
|
2199
|
+
target: xml.getAttribute('target').split('/').pop()
|
|
1776
2200
|
};
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
2201
|
+
|
|
2202
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2203
|
+
const child = xml.childNodes[i];
|
|
2204
|
+
if (child.nodeType !== 1) continue;
|
|
2205
|
+
|
|
1781
2206
|
switch (child.nodeName) {
|
|
1782
|
-
case
|
|
1783
|
-
const param = child.getElementsByTagName(
|
|
2207
|
+
case 'axis':
|
|
2208
|
+
const param = child.getElementsByTagName('param')[0];
|
|
1784
2209
|
data.axis = param.textContent;
|
|
1785
|
-
const tmpJointIndex = data.axis.split(
|
|
2210
|
+
const tmpJointIndex = data.axis.split('inst_').pop().split('axis')[0];
|
|
1786
2211
|
data.jointIndex = tmpJointIndex.substr(0, tmpJointIndex.length - 1);
|
|
1787
2212
|
break;
|
|
1788
2213
|
}
|
|
1789
2214
|
}
|
|
2215
|
+
|
|
1790
2216
|
return data;
|
|
1791
2217
|
}
|
|
2218
|
+
|
|
1792
2219
|
function buildKinematicsScene(data) {
|
|
1793
|
-
if (data.build !==
|
|
1794
|
-
return data.build;
|
|
2220
|
+
if (data.build !== undefined) return data.build;
|
|
1795
2221
|
return data;
|
|
1796
2222
|
}
|
|
2223
|
+
|
|
1797
2224
|
function getKinematicsScene(id) {
|
|
1798
2225
|
return getBuild(library.kinematicsScenes[id], buildKinematicsScene);
|
|
1799
2226
|
}
|
|
2227
|
+
|
|
1800
2228
|
function setupKinematics() {
|
|
1801
2229
|
const kinematicsModelId = Object.keys(library.kinematicsModels)[0];
|
|
1802
2230
|
const kinematicsSceneId = Object.keys(library.kinematicsScenes)[0];
|
|
1803
2231
|
const visualSceneId = Object.keys(library.visualScenes)[0];
|
|
1804
|
-
if (kinematicsModelId ===
|
|
1805
|
-
return;
|
|
2232
|
+
if (kinematicsModelId === undefined || kinematicsSceneId === undefined) return;
|
|
1806
2233
|
const kinematicsModel = getKinematicsModel(kinematicsModelId);
|
|
1807
2234
|
const kinematicsScene = getKinematicsScene(kinematicsSceneId);
|
|
1808
2235
|
const visualScene = getVisualScene(visualSceneId);
|
|
1809
2236
|
const bindJointAxis = kinematicsScene.bindJointAxis;
|
|
1810
2237
|
const jointMap = {};
|
|
2238
|
+
|
|
1811
2239
|
for (let i = 0, l = bindJointAxis.length; i < l; i++) {
|
|
1812
|
-
const axis = bindJointAxis[i];
|
|
2240
|
+
const axis = bindJointAxis[i]; // the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix'
|
|
2241
|
+
|
|
1813
2242
|
const targetElement = collada.querySelector('[sid="' + axis.target + '"]');
|
|
2243
|
+
|
|
1814
2244
|
if (targetElement) {
|
|
1815
|
-
|
|
2245
|
+
// get the parent of the transform element
|
|
2246
|
+
const parentVisualElement = targetElement.parentElement; // connect the joint of the kinematics model with the element in the visual scene
|
|
2247
|
+
|
|
1816
2248
|
connect(axis.jointIndex, parentVisualElement);
|
|
1817
2249
|
}
|
|
1818
2250
|
}
|
|
2251
|
+
|
|
1819
2252
|
function connect(jointIndex, visualElement) {
|
|
1820
|
-
const visualElementName = visualElement.getAttribute(
|
|
2253
|
+
const visualElementName = visualElement.getAttribute('name');
|
|
1821
2254
|
const joint = kinematicsModel.joints[jointIndex];
|
|
1822
|
-
visualScene.traverse(function(object) {
|
|
2255
|
+
visualScene.traverse(function (object) {
|
|
1823
2256
|
if (object.name === visualElementName) {
|
|
1824
2257
|
jointMap[jointIndex] = {
|
|
1825
|
-
object,
|
|
2258
|
+
object: object,
|
|
1826
2259
|
transforms: buildTransformList(visualElement),
|
|
1827
|
-
joint,
|
|
2260
|
+
joint: joint,
|
|
1828
2261
|
position: joint.zeroPosition
|
|
1829
2262
|
};
|
|
1830
2263
|
}
|
|
1831
2264
|
});
|
|
1832
2265
|
}
|
|
1833
|
-
|
|
2266
|
+
|
|
2267
|
+
const m0 = new Matrix4();
|
|
1834
2268
|
kinematics = {
|
|
1835
2269
|
joints: kinematicsModel && kinematicsModel.joints,
|
|
1836
|
-
getJointValue: function(jointIndex) {
|
|
2270
|
+
getJointValue: function (jointIndex) {
|
|
1837
2271
|
const jointData = jointMap[jointIndex];
|
|
2272
|
+
|
|
1838
2273
|
if (jointData) {
|
|
1839
2274
|
return jointData.position;
|
|
1840
2275
|
} else {
|
|
1841
|
-
console.warn(
|
|
2276
|
+
console.warn('THREE.ColladaLoader: Joint ' + jointIndex + " doesn't exist.");
|
|
1842
2277
|
}
|
|
1843
2278
|
},
|
|
1844
|
-
setJointValue: function(jointIndex, value) {
|
|
2279
|
+
setJointValue: function (jointIndex, value) {
|
|
1845
2280
|
const jointData = jointMap[jointIndex];
|
|
2281
|
+
|
|
1846
2282
|
if (jointData) {
|
|
1847
2283
|
const joint = jointData.joint;
|
|
2284
|
+
|
|
1848
2285
|
if (value > joint.limits.max || value < joint.limits.min) {
|
|
1849
|
-
console.warn(
|
|
1850
|
-
"THREE.ColladaLoader: Joint " + jointIndex + " value " + value + " outside of limits (min: " + joint.limits.min + ", max: " + joint.limits.max + ")."
|
|
1851
|
-
);
|
|
2286
|
+
console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').');
|
|
1852
2287
|
} else if (joint.static) {
|
|
1853
|
-
console.warn(
|
|
2288
|
+
console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' is static.');
|
|
1854
2289
|
} else {
|
|
1855
2290
|
const object = jointData.object;
|
|
1856
2291
|
const axis = joint.axis;
|
|
1857
2292
|
const transforms = jointData.transforms;
|
|
1858
|
-
matrix.identity();
|
|
2293
|
+
matrix.identity(); // each update, we have to apply all transforms in the correct order
|
|
2294
|
+
|
|
1859
2295
|
for (let i = 0; i < transforms.length; i++) {
|
|
1860
|
-
const transform = transforms[i];
|
|
2296
|
+
const transform = transforms[i]; // if there is a connection of the transform node with a joint, apply the joint value
|
|
2297
|
+
|
|
1861
2298
|
if (transform.sid && transform.sid.indexOf(jointIndex) !== -1) {
|
|
1862
2299
|
switch (joint.type) {
|
|
1863
|
-
case
|
|
1864
|
-
matrix.multiply(m0.makeRotationAxis(axis,
|
|
2300
|
+
case 'revolute':
|
|
2301
|
+
matrix.multiply(m0.makeRotationAxis(axis, MathUtils.degToRad(value)));
|
|
1865
2302
|
break;
|
|
1866
|
-
|
|
2303
|
+
|
|
2304
|
+
case 'prismatic':
|
|
1867
2305
|
matrix.multiply(m0.makeTranslation(axis.x * value, axis.y * value, axis.z * value));
|
|
1868
2306
|
break;
|
|
2307
|
+
|
|
1869
2308
|
default:
|
|
1870
|
-
console.warn(
|
|
2309
|
+
console.warn('THREE.ColladaLoader: Unknown joint type: ' + joint.type);
|
|
1871
2310
|
break;
|
|
1872
2311
|
}
|
|
1873
2312
|
} else {
|
|
1874
2313
|
switch (transform.type) {
|
|
1875
|
-
case
|
|
2314
|
+
case 'matrix':
|
|
1876
2315
|
matrix.multiply(transform.obj);
|
|
1877
2316
|
break;
|
|
1878
|
-
|
|
2317
|
+
|
|
2318
|
+
case 'translate':
|
|
1879
2319
|
matrix.multiply(m0.makeTranslation(transform.obj.x, transform.obj.y, transform.obj.z));
|
|
1880
2320
|
break;
|
|
1881
|
-
|
|
2321
|
+
|
|
2322
|
+
case 'scale':
|
|
1882
2323
|
matrix.scale(transform.obj);
|
|
1883
2324
|
break;
|
|
1884
|
-
|
|
2325
|
+
|
|
2326
|
+
case 'rotate':
|
|
1885
2327
|
matrix.multiply(m0.makeRotationAxis(transform.obj, transform.angle));
|
|
1886
2328
|
break;
|
|
1887
2329
|
}
|
|
1888
2330
|
}
|
|
1889
2331
|
}
|
|
2332
|
+
|
|
1890
2333
|
object.matrix.copy(matrix);
|
|
1891
2334
|
object.matrix.decompose(object.position, object.quaternion, object.scale);
|
|
1892
2335
|
jointMap[jointIndex].position = value;
|
|
1893
2336
|
}
|
|
1894
2337
|
} else {
|
|
1895
|
-
console.log(
|
|
2338
|
+
console.log('THREE.ColladaLoader: ' + jointIndex + ' does not exist.');
|
|
1896
2339
|
}
|
|
1897
2340
|
}
|
|
1898
2341
|
};
|
|
1899
2342
|
}
|
|
2343
|
+
|
|
1900
2344
|
function buildTransformList(node) {
|
|
1901
2345
|
const transforms = [];
|
|
1902
|
-
const
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
let array,
|
|
2346
|
+
const xml = collada.querySelector('[id="' + node.id + '"]');
|
|
2347
|
+
|
|
2348
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2349
|
+
const child = xml.childNodes[i];
|
|
2350
|
+
if (child.nodeType !== 1) continue;
|
|
2351
|
+
let array, vector;
|
|
2352
|
+
|
|
1908
2353
|
switch (child.nodeName) {
|
|
1909
|
-
case
|
|
2354
|
+
case 'matrix':
|
|
1910
2355
|
array = parseFloats(child.textContent);
|
|
1911
|
-
const
|
|
2356
|
+
const matrix = new Matrix4().fromArray(array).transpose();
|
|
1912
2357
|
transforms.push({
|
|
1913
|
-
sid: child.getAttribute(
|
|
2358
|
+
sid: child.getAttribute('sid'),
|
|
1914
2359
|
type: child.nodeName,
|
|
1915
|
-
obj:
|
|
2360
|
+
obj: matrix
|
|
1916
2361
|
});
|
|
1917
2362
|
break;
|
|
1918
|
-
|
|
1919
|
-
case
|
|
2363
|
+
|
|
2364
|
+
case 'translate':
|
|
2365
|
+
case 'scale':
|
|
1920
2366
|
array = parseFloats(child.textContent);
|
|
1921
|
-
|
|
2367
|
+
vector = new Vector3().fromArray(array);
|
|
1922
2368
|
transforms.push({
|
|
1923
|
-
sid: child.getAttribute(
|
|
2369
|
+
sid: child.getAttribute('sid'),
|
|
1924
2370
|
type: child.nodeName,
|
|
1925
|
-
obj:
|
|
2371
|
+
obj: vector
|
|
1926
2372
|
});
|
|
1927
2373
|
break;
|
|
1928
|
-
|
|
2374
|
+
|
|
2375
|
+
case 'rotate':
|
|
1929
2376
|
array = parseFloats(child.textContent);
|
|
1930
|
-
|
|
1931
|
-
const angle =
|
|
2377
|
+
vector = new Vector3().fromArray(array);
|
|
2378
|
+
const angle = MathUtils.degToRad(array[3]);
|
|
1932
2379
|
transforms.push({
|
|
1933
|
-
sid: child.getAttribute(
|
|
2380
|
+
sid: child.getAttribute('sid'),
|
|
1934
2381
|
type: child.nodeName,
|
|
1935
|
-
obj:
|
|
1936
|
-
angle
|
|
2382
|
+
obj: vector,
|
|
2383
|
+
angle: angle
|
|
1937
2384
|
});
|
|
1938
2385
|
break;
|
|
1939
2386
|
}
|
|
1940
2387
|
}
|
|
2388
|
+
|
|
1941
2389
|
return transforms;
|
|
1942
|
-
}
|
|
1943
|
-
|
|
1944
|
-
|
|
2390
|
+
} // nodes
|
|
2391
|
+
|
|
2392
|
+
|
|
2393
|
+
function prepareNodes(xml) {
|
|
2394
|
+
const elements = xml.getElementsByTagName('node'); // ensure all node elements have id attributes
|
|
2395
|
+
|
|
1945
2396
|
for (let i = 0; i < elements.length; i++) {
|
|
1946
2397
|
const element = elements[i];
|
|
1947
|
-
|
|
1948
|
-
|
|
2398
|
+
|
|
2399
|
+
if (element.hasAttribute('id') === false) {
|
|
2400
|
+
element.setAttribute('id', generateId());
|
|
1949
2401
|
}
|
|
1950
2402
|
}
|
|
1951
2403
|
}
|
|
1952
|
-
|
|
1953
|
-
const
|
|
1954
|
-
|
|
2404
|
+
|
|
2405
|
+
const matrix = new Matrix4();
|
|
2406
|
+
const vector = new Vector3();
|
|
2407
|
+
|
|
2408
|
+
function parseNode(xml) {
|
|
1955
2409
|
const data = {
|
|
1956
|
-
name:
|
|
1957
|
-
type:
|
|
1958
|
-
id:
|
|
1959
|
-
sid:
|
|
1960
|
-
matrix: new
|
|
2410
|
+
name: xml.getAttribute('name') || '',
|
|
2411
|
+
type: xml.getAttribute('type'),
|
|
2412
|
+
id: xml.getAttribute('id'),
|
|
2413
|
+
sid: xml.getAttribute('sid'),
|
|
2414
|
+
matrix: new Matrix4(),
|
|
1961
2415
|
nodes: [],
|
|
1962
2416
|
instanceCameras: [],
|
|
1963
2417
|
instanceControllers: [],
|
|
@@ -1966,183 +2420,238 @@ class ColladaLoader extends THREE.Loader {
|
|
|
1966
2420
|
instanceNodes: [],
|
|
1967
2421
|
transforms: {}
|
|
1968
2422
|
};
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
2423
|
+
|
|
2424
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2425
|
+
const child = xml.childNodes[i];
|
|
2426
|
+
if (child.nodeType !== 1) continue;
|
|
1973
2427
|
let array;
|
|
2428
|
+
|
|
1974
2429
|
switch (child.nodeName) {
|
|
1975
|
-
case
|
|
1976
|
-
data.nodes.push(child.getAttribute(
|
|
2430
|
+
case 'node':
|
|
2431
|
+
data.nodes.push(child.getAttribute('id'));
|
|
1977
2432
|
parseNode(child);
|
|
1978
2433
|
break;
|
|
1979
|
-
|
|
1980
|
-
|
|
2434
|
+
|
|
2435
|
+
case 'instance_camera':
|
|
2436
|
+
data.instanceCameras.push(parseId(child.getAttribute('url')));
|
|
1981
2437
|
break;
|
|
1982
|
-
|
|
2438
|
+
|
|
2439
|
+
case 'instance_controller':
|
|
1983
2440
|
data.instanceControllers.push(parseNodeInstance(child));
|
|
1984
2441
|
break;
|
|
1985
|
-
|
|
1986
|
-
|
|
2442
|
+
|
|
2443
|
+
case 'instance_light':
|
|
2444
|
+
data.instanceLights.push(parseId(child.getAttribute('url')));
|
|
1987
2445
|
break;
|
|
1988
|
-
|
|
2446
|
+
|
|
2447
|
+
case 'instance_geometry':
|
|
1989
2448
|
data.instanceGeometries.push(parseNodeInstance(child));
|
|
1990
2449
|
break;
|
|
1991
|
-
|
|
1992
|
-
|
|
2450
|
+
|
|
2451
|
+
case 'instance_node':
|
|
2452
|
+
data.instanceNodes.push(parseId(child.getAttribute('url')));
|
|
1993
2453
|
break;
|
|
1994
|
-
|
|
2454
|
+
|
|
2455
|
+
case 'matrix':
|
|
1995
2456
|
array = parseFloats(child.textContent);
|
|
1996
2457
|
data.matrix.multiply(matrix.fromArray(array).transpose());
|
|
1997
|
-
data.transforms[child.getAttribute(
|
|
2458
|
+
data.transforms[child.getAttribute('sid')] = child.nodeName;
|
|
1998
2459
|
break;
|
|
1999
|
-
|
|
2460
|
+
|
|
2461
|
+
case 'translate':
|
|
2000
2462
|
array = parseFloats(child.textContent);
|
|
2001
2463
|
vector.fromArray(array);
|
|
2002
2464
|
data.matrix.multiply(matrix.makeTranslation(vector.x, vector.y, vector.z));
|
|
2003
|
-
data.transforms[child.getAttribute(
|
|
2465
|
+
data.transforms[child.getAttribute('sid')] = child.nodeName;
|
|
2004
2466
|
break;
|
|
2005
|
-
|
|
2467
|
+
|
|
2468
|
+
case 'rotate':
|
|
2006
2469
|
array = parseFloats(child.textContent);
|
|
2007
|
-
const angle =
|
|
2470
|
+
const angle = MathUtils.degToRad(array[3]);
|
|
2008
2471
|
data.matrix.multiply(matrix.makeRotationAxis(vector.fromArray(array), angle));
|
|
2009
|
-
data.transforms[child.getAttribute(
|
|
2472
|
+
data.transforms[child.getAttribute('sid')] = child.nodeName;
|
|
2010
2473
|
break;
|
|
2011
|
-
|
|
2474
|
+
|
|
2475
|
+
case 'scale':
|
|
2012
2476
|
array = parseFloats(child.textContent);
|
|
2013
2477
|
data.matrix.scale(vector.fromArray(array));
|
|
2014
|
-
data.transforms[child.getAttribute(
|
|
2478
|
+
data.transforms[child.getAttribute('sid')] = child.nodeName;
|
|
2015
2479
|
break;
|
|
2016
|
-
|
|
2480
|
+
|
|
2481
|
+
case 'extra':
|
|
2017
2482
|
break;
|
|
2483
|
+
|
|
2018
2484
|
default:
|
|
2019
2485
|
console.log(child);
|
|
2020
2486
|
}
|
|
2021
2487
|
}
|
|
2488
|
+
|
|
2022
2489
|
if (hasNode(data.id)) {
|
|
2023
|
-
console.warn(
|
|
2024
|
-
"THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.",
|
|
2025
|
-
data.id
|
|
2026
|
-
);
|
|
2490
|
+
console.warn('THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id);
|
|
2027
2491
|
} else {
|
|
2028
2492
|
library.nodes[data.id] = data;
|
|
2029
2493
|
}
|
|
2494
|
+
|
|
2030
2495
|
return data;
|
|
2031
2496
|
}
|
|
2032
|
-
|
|
2497
|
+
|
|
2498
|
+
function parseNodeInstance(xml) {
|
|
2033
2499
|
const data = {
|
|
2034
|
-
id: parseId(
|
|
2500
|
+
id: parseId(xml.getAttribute('url')),
|
|
2035
2501
|
materials: {},
|
|
2036
2502
|
skeletons: []
|
|
2037
2503
|
};
|
|
2038
|
-
|
|
2039
|
-
|
|
2504
|
+
|
|
2505
|
+
for (let i = 0; i < xml.childNodes.length; i++) {
|
|
2506
|
+
const child = xml.childNodes[i];
|
|
2507
|
+
|
|
2040
2508
|
switch (child.nodeName) {
|
|
2041
|
-
case
|
|
2042
|
-
const instances = child.getElementsByTagName(
|
|
2509
|
+
case 'bind_material':
|
|
2510
|
+
const instances = child.getElementsByTagName('instance_material');
|
|
2511
|
+
|
|
2043
2512
|
for (let j = 0; j < instances.length; j++) {
|
|
2044
2513
|
const instance = instances[j];
|
|
2045
|
-
const symbol = instance.getAttribute(
|
|
2046
|
-
const target = instance.getAttribute(
|
|
2514
|
+
const symbol = instance.getAttribute('symbol');
|
|
2515
|
+
const target = instance.getAttribute('target');
|
|
2047
2516
|
data.materials[symbol] = parseId(target);
|
|
2048
2517
|
}
|
|
2518
|
+
|
|
2049
2519
|
break;
|
|
2050
|
-
|
|
2520
|
+
|
|
2521
|
+
case 'skeleton':
|
|
2051
2522
|
data.skeletons.push(parseId(child.textContent));
|
|
2052
2523
|
break;
|
|
2053
|
-
default:
|
|
2054
|
-
break;
|
|
2055
2524
|
}
|
|
2056
2525
|
}
|
|
2526
|
+
|
|
2057
2527
|
return data;
|
|
2058
2528
|
}
|
|
2529
|
+
|
|
2059
2530
|
function buildSkeleton(skeletons, joints) {
|
|
2060
2531
|
const boneData = [];
|
|
2061
2532
|
const sortedBoneData = [];
|
|
2062
|
-
let i, j, data;
|
|
2533
|
+
let i, j, data; // a skeleton can have multiple root bones. collada expresses this
|
|
2534
|
+
// situtation with multiple "skeleton" tags per controller instance
|
|
2535
|
+
|
|
2063
2536
|
for (i = 0; i < skeletons.length; i++) {
|
|
2064
2537
|
const skeleton = skeletons[i];
|
|
2065
2538
|
let root;
|
|
2539
|
+
|
|
2066
2540
|
if (hasNode(skeleton)) {
|
|
2067
2541
|
root = getNode(skeleton);
|
|
2068
2542
|
buildBoneHierarchy(root, joints, boneData);
|
|
2069
2543
|
} else if (hasVisualScene(skeleton)) {
|
|
2544
|
+
// handle case where the skeleton refers to the visual scene (#13335)
|
|
2070
2545
|
const visualScene = library.visualScenes[skeleton];
|
|
2071
2546
|
const children = visualScene.children;
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2547
|
+
|
|
2548
|
+
for (let j = 0; j < children.length; j++) {
|
|
2549
|
+
const child = children[j];
|
|
2550
|
+
|
|
2551
|
+
if (child.type === 'JOINT') {
|
|
2552
|
+
const root = getNode(child.id);
|
|
2553
|
+
buildBoneHierarchy(root, joints, boneData);
|
|
2077
2554
|
}
|
|
2078
2555
|
}
|
|
2079
2556
|
} else {
|
|
2080
|
-
console.error(
|
|
2557
|
+
console.error('THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton);
|
|
2081
2558
|
}
|
|
2082
|
-
}
|
|
2559
|
+
} // sort bone data (the order is defined in the corresponding controller)
|
|
2560
|
+
|
|
2561
|
+
|
|
2083
2562
|
for (i = 0; i < joints.length; i++) {
|
|
2084
2563
|
for (j = 0; j < boneData.length; j++) {
|
|
2085
2564
|
data = boneData[j];
|
|
2565
|
+
|
|
2086
2566
|
if (data.bone.name === joints[i].name) {
|
|
2087
2567
|
sortedBoneData[i] = data;
|
|
2088
2568
|
data.processed = true;
|
|
2089
2569
|
break;
|
|
2090
2570
|
}
|
|
2091
2571
|
}
|
|
2092
|
-
}
|
|
2572
|
+
} // add unprocessed bone data at the end of the list
|
|
2573
|
+
|
|
2574
|
+
|
|
2093
2575
|
for (i = 0; i < boneData.length; i++) {
|
|
2094
2576
|
data = boneData[i];
|
|
2577
|
+
|
|
2095
2578
|
if (data.processed === false) {
|
|
2096
2579
|
sortedBoneData.push(data);
|
|
2097
2580
|
data.processed = true;
|
|
2098
2581
|
}
|
|
2099
|
-
}
|
|
2582
|
+
} // setup arrays for skeleton creation
|
|
2583
|
+
|
|
2584
|
+
|
|
2100
2585
|
const bones = [];
|
|
2101
2586
|
const boneInverses = [];
|
|
2587
|
+
|
|
2102
2588
|
for (i = 0; i < sortedBoneData.length; i++) {
|
|
2103
2589
|
data = sortedBoneData[i];
|
|
2104
2590
|
bones.push(data.bone);
|
|
2105
2591
|
boneInverses.push(data.boneInverse);
|
|
2106
2592
|
}
|
|
2107
|
-
|
|
2593
|
+
|
|
2594
|
+
return new Skeleton(bones, boneInverses);
|
|
2108
2595
|
}
|
|
2596
|
+
|
|
2109
2597
|
function buildBoneHierarchy(root, joints, boneData) {
|
|
2110
|
-
|
|
2598
|
+
// setup bone data from visual scene
|
|
2599
|
+
root.traverse(function (object) {
|
|
2111
2600
|
if (object.isBone === true) {
|
|
2112
|
-
let boneInverse;
|
|
2601
|
+
let boneInverse; // retrieve the boneInverse from the controller data
|
|
2602
|
+
|
|
2113
2603
|
for (let i = 0; i < joints.length; i++) {
|
|
2114
2604
|
const joint = joints[i];
|
|
2605
|
+
|
|
2115
2606
|
if (joint.name === object.name) {
|
|
2116
2607
|
boneInverse = joint.boneInverse;
|
|
2117
2608
|
break;
|
|
2118
2609
|
}
|
|
2119
2610
|
}
|
|
2120
|
-
|
|
2121
|
-
|
|
2611
|
+
|
|
2612
|
+
if (boneInverse === undefined) {
|
|
2613
|
+
// Unfortunately, there can be joints in the visual scene that are not part of the
|
|
2614
|
+
// corresponding controller. In this case, we have to create a dummy boneInverse matrix
|
|
2615
|
+
// for the respective bone. This bone won't affect any vertices, because there are no skin indices
|
|
2616
|
+
// and weights defined for it. But we still have to add the bone to the sorted bone list in order to
|
|
2617
|
+
// ensure a correct animation of the model.
|
|
2618
|
+
boneInverse = new Matrix4();
|
|
2122
2619
|
}
|
|
2123
|
-
|
|
2620
|
+
|
|
2621
|
+
boneData.push({
|
|
2622
|
+
bone: object,
|
|
2623
|
+
boneInverse: boneInverse,
|
|
2624
|
+
processed: false
|
|
2625
|
+
});
|
|
2124
2626
|
}
|
|
2125
2627
|
});
|
|
2126
2628
|
}
|
|
2629
|
+
|
|
2127
2630
|
function buildNode(data) {
|
|
2128
2631
|
const objects = [];
|
|
2129
|
-
const
|
|
2632
|
+
const matrix = data.matrix;
|
|
2130
2633
|
const nodes = data.nodes;
|
|
2131
2634
|
const type = data.type;
|
|
2132
2635
|
const instanceCameras = data.instanceCameras;
|
|
2133
2636
|
const instanceControllers = data.instanceControllers;
|
|
2134
2637
|
const instanceLights = data.instanceLights;
|
|
2135
2638
|
const instanceGeometries = data.instanceGeometries;
|
|
2136
|
-
const instanceNodes = data.instanceNodes;
|
|
2639
|
+
const instanceNodes = data.instanceNodes; // nodes
|
|
2640
|
+
|
|
2137
2641
|
for (let i = 0, l = nodes.length; i < l; i++) {
|
|
2138
2642
|
objects.push(getNode(nodes[i]));
|
|
2139
|
-
}
|
|
2643
|
+
} // instance cameras
|
|
2644
|
+
|
|
2645
|
+
|
|
2140
2646
|
for (let i = 0, l = instanceCameras.length; i < l; i++) {
|
|
2141
2647
|
const instanceCamera = getCamera(instanceCameras[i]);
|
|
2648
|
+
|
|
2142
2649
|
if (instanceCamera !== null) {
|
|
2143
2650
|
objects.push(instanceCamera.clone());
|
|
2144
2651
|
}
|
|
2145
|
-
}
|
|
2652
|
+
} // instance controllers
|
|
2653
|
+
|
|
2654
|
+
|
|
2146
2655
|
for (let i = 0, l = instanceControllers.length; i < l; i++) {
|
|
2147
2656
|
const instance = instanceControllers[i];
|
|
2148
2657
|
const controller = getController(instance.id);
|
|
@@ -2151,196 +2660,272 @@ class ColladaLoader extends THREE.Loader {
|
|
|
2151
2660
|
const skeletons = instance.skeletons;
|
|
2152
2661
|
const joints = controller.skin.joints;
|
|
2153
2662
|
const skeleton = buildSkeleton(skeletons, joints);
|
|
2663
|
+
|
|
2154
2664
|
for (let j = 0, jl = newObjects.length; j < jl; j++) {
|
|
2155
|
-
const
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2665
|
+
const object = newObjects[j];
|
|
2666
|
+
|
|
2667
|
+
if (object.isSkinnedMesh) {
|
|
2668
|
+
object.bind(skeleton, controller.skin.bindMatrix);
|
|
2669
|
+
object.normalizeSkinWeights();
|
|
2159
2670
|
}
|
|
2160
|
-
|
|
2671
|
+
|
|
2672
|
+
objects.push(object);
|
|
2161
2673
|
}
|
|
2162
|
-
}
|
|
2674
|
+
} // instance lights
|
|
2675
|
+
|
|
2676
|
+
|
|
2163
2677
|
for (let i = 0, l = instanceLights.length; i < l; i++) {
|
|
2164
2678
|
const instanceLight = getLight(instanceLights[i]);
|
|
2679
|
+
|
|
2165
2680
|
if (instanceLight !== null) {
|
|
2166
2681
|
objects.push(instanceLight.clone());
|
|
2167
2682
|
}
|
|
2168
|
-
}
|
|
2683
|
+
} // instance geometries
|
|
2684
|
+
|
|
2685
|
+
|
|
2169
2686
|
for (let i = 0, l = instanceGeometries.length; i < l; i++) {
|
|
2170
|
-
const instance = instanceGeometries[i];
|
|
2687
|
+
const instance = instanceGeometries[i]; // a single geometry instance in collada can lead to multiple object3Ds.
|
|
2688
|
+
// this is the case when primitives are combined like triangles and lines
|
|
2689
|
+
|
|
2171
2690
|
const geometries = getGeometry(instance.id);
|
|
2172
2691
|
const newObjects = buildObjects(geometries, instance.materials);
|
|
2692
|
+
|
|
2173
2693
|
for (let j = 0, jl = newObjects.length; j < jl; j++) {
|
|
2174
2694
|
objects.push(newObjects[j]);
|
|
2175
2695
|
}
|
|
2176
|
-
}
|
|
2696
|
+
} // instance nodes
|
|
2697
|
+
|
|
2698
|
+
|
|
2177
2699
|
for (let i = 0, l = instanceNodes.length; i < l; i++) {
|
|
2178
2700
|
objects.push(getNode(instanceNodes[i]).clone());
|
|
2179
2701
|
}
|
|
2702
|
+
|
|
2180
2703
|
let object;
|
|
2704
|
+
|
|
2181
2705
|
if (nodes.length === 0 && objects.length === 1) {
|
|
2182
2706
|
object = objects[0];
|
|
2183
2707
|
} else {
|
|
2184
|
-
object = type ===
|
|
2708
|
+
object = type === 'JOINT' ? new Bone() : new Group();
|
|
2709
|
+
|
|
2185
2710
|
for (let i = 0; i < objects.length; i++) {
|
|
2186
2711
|
object.add(objects[i]);
|
|
2187
2712
|
}
|
|
2188
2713
|
}
|
|
2189
|
-
|
|
2190
|
-
object.
|
|
2714
|
+
|
|
2715
|
+
object.name = type === 'JOINT' ? data.sid : data.name;
|
|
2716
|
+
object.matrix.copy(matrix);
|
|
2191
2717
|
object.matrix.decompose(object.position, object.quaternion, object.scale);
|
|
2192
2718
|
return object;
|
|
2193
2719
|
}
|
|
2194
|
-
|
|
2720
|
+
|
|
2721
|
+
const fallbackMaterial = new MeshBasicMaterial({
|
|
2722
|
+
color: 0xff00ff
|
|
2723
|
+
});
|
|
2724
|
+
|
|
2195
2725
|
function resolveMaterialBinding(keys, instanceMaterials) {
|
|
2196
2726
|
const materials = [];
|
|
2727
|
+
|
|
2197
2728
|
for (let i = 0, l = keys.length; i < l; i++) {
|
|
2198
2729
|
const id = instanceMaterials[keys[i]];
|
|
2199
|
-
|
|
2200
|
-
|
|
2730
|
+
|
|
2731
|
+
if (id === undefined) {
|
|
2732
|
+
console.warn('THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[i]);
|
|
2201
2733
|
materials.push(fallbackMaterial);
|
|
2202
2734
|
} else {
|
|
2203
2735
|
materials.push(getMaterial(id));
|
|
2204
2736
|
}
|
|
2205
2737
|
}
|
|
2738
|
+
|
|
2206
2739
|
return materials;
|
|
2207
2740
|
}
|
|
2741
|
+
|
|
2208
2742
|
function buildObjects(geometries, instanceMaterials) {
|
|
2209
2743
|
const objects = [];
|
|
2744
|
+
|
|
2210
2745
|
for (const type in geometries) {
|
|
2211
2746
|
const geometry = geometries[type];
|
|
2212
|
-
const materials = resolveMaterialBinding(geometry.materialKeys, instanceMaterials);
|
|
2747
|
+
const materials = resolveMaterialBinding(geometry.materialKeys, instanceMaterials); // handle case if no materials are defined
|
|
2748
|
+
|
|
2213
2749
|
if (materials.length === 0) {
|
|
2214
|
-
if (type ===
|
|
2215
|
-
materials.push(new
|
|
2750
|
+
if (type === 'lines' || type === 'linestrips') {
|
|
2751
|
+
materials.push(new LineBasicMaterial());
|
|
2216
2752
|
} else {
|
|
2217
|
-
materials.push(new
|
|
2753
|
+
materials.push(new MeshPhongMaterial());
|
|
2218
2754
|
}
|
|
2219
|
-
}
|
|
2220
|
-
|
|
2221
|
-
|
|
2755
|
+
} // regard skinning
|
|
2756
|
+
|
|
2757
|
+
|
|
2758
|
+
const skinning = geometry.data.attributes.skinIndex !== undefined; // choose between a single or multi materials (material array)
|
|
2759
|
+
|
|
2760
|
+
const material = materials.length === 1 ? materials[0] : materials; // now create a specific 3D object
|
|
2761
|
+
|
|
2222
2762
|
let object;
|
|
2763
|
+
|
|
2223
2764
|
switch (type) {
|
|
2224
|
-
case
|
|
2225
|
-
object = new
|
|
2765
|
+
case 'lines':
|
|
2766
|
+
object = new LineSegments(geometry.data, material);
|
|
2226
2767
|
break;
|
|
2227
|
-
|
|
2228
|
-
|
|
2768
|
+
|
|
2769
|
+
case 'linestrips':
|
|
2770
|
+
object = new Line(geometry.data, material);
|
|
2229
2771
|
break;
|
|
2230
|
-
|
|
2231
|
-
case
|
|
2772
|
+
|
|
2773
|
+
case 'triangles':
|
|
2774
|
+
case 'polylist':
|
|
2232
2775
|
if (skinning) {
|
|
2233
|
-
object = new
|
|
2776
|
+
object = new SkinnedMesh(geometry.data, material);
|
|
2234
2777
|
} else {
|
|
2235
|
-
object = new
|
|
2778
|
+
object = new Mesh(geometry.data, material);
|
|
2236
2779
|
}
|
|
2780
|
+
|
|
2237
2781
|
break;
|
|
2238
2782
|
}
|
|
2783
|
+
|
|
2239
2784
|
objects.push(object);
|
|
2240
2785
|
}
|
|
2786
|
+
|
|
2241
2787
|
return objects;
|
|
2242
2788
|
}
|
|
2789
|
+
|
|
2243
2790
|
function hasNode(id) {
|
|
2244
|
-
return library.nodes[id] !==
|
|
2791
|
+
return library.nodes[id] !== undefined;
|
|
2245
2792
|
}
|
|
2793
|
+
|
|
2246
2794
|
function getNode(id) {
|
|
2247
2795
|
return getBuild(library.nodes[id], buildNode);
|
|
2248
|
-
}
|
|
2249
|
-
|
|
2796
|
+
} // visual scenes
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
function parseVisualScene(xml) {
|
|
2250
2800
|
const data = {
|
|
2251
|
-
name:
|
|
2801
|
+
name: xml.getAttribute('name'),
|
|
2252
2802
|
children: []
|
|
2253
2803
|
};
|
|
2254
|
-
prepareNodes(
|
|
2255
|
-
const elements = getElementsByTagName(
|
|
2804
|
+
prepareNodes(xml);
|
|
2805
|
+
const elements = getElementsByTagName(xml, 'node');
|
|
2806
|
+
|
|
2256
2807
|
for (let i = 0; i < elements.length; i++) {
|
|
2257
2808
|
data.children.push(parseNode(elements[i]));
|
|
2258
2809
|
}
|
|
2259
|
-
|
|
2810
|
+
|
|
2811
|
+
library.visualScenes[xml.getAttribute('id')] = data;
|
|
2260
2812
|
}
|
|
2813
|
+
|
|
2261
2814
|
function buildVisualScene(data) {
|
|
2262
|
-
const group = new
|
|
2815
|
+
const group = new Group();
|
|
2263
2816
|
group.name = data.name;
|
|
2264
2817
|
const children = data.children;
|
|
2818
|
+
|
|
2265
2819
|
for (let i = 0; i < children.length; i++) {
|
|
2266
2820
|
const child = children[i];
|
|
2267
2821
|
group.add(getNode(child.id));
|
|
2268
2822
|
}
|
|
2823
|
+
|
|
2269
2824
|
return group;
|
|
2270
2825
|
}
|
|
2826
|
+
|
|
2271
2827
|
function hasVisualScene(id) {
|
|
2272
|
-
return library.visualScenes[id] !==
|
|
2828
|
+
return library.visualScenes[id] !== undefined;
|
|
2273
2829
|
}
|
|
2830
|
+
|
|
2274
2831
|
function getVisualScene(id) {
|
|
2275
2832
|
return getBuild(library.visualScenes[id], buildVisualScene);
|
|
2276
|
-
}
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2833
|
+
} // scenes
|
|
2834
|
+
|
|
2835
|
+
|
|
2836
|
+
function parseScene(xml) {
|
|
2837
|
+
const instance = getElementsByTagName(xml, 'instance_visual_scene')[0];
|
|
2838
|
+
return getVisualScene(parseId(instance.getAttribute('url')));
|
|
2839
|
+
}
|
|
2840
|
+
|
|
2281
2841
|
function setupAnimations() {
|
|
2282
2842
|
const clips = library.clips;
|
|
2843
|
+
|
|
2283
2844
|
if (isEmpty(clips) === true) {
|
|
2284
2845
|
if (isEmpty(library.animations) === false) {
|
|
2846
|
+
// if there are animations but no clips, we create a default clip for playback
|
|
2285
2847
|
const tracks = [];
|
|
2848
|
+
|
|
2286
2849
|
for (const id in library.animations) {
|
|
2287
2850
|
const animationTracks = getAnimation(id);
|
|
2851
|
+
|
|
2288
2852
|
for (let i = 0, l = animationTracks.length; i < l; i++) {
|
|
2289
2853
|
tracks.push(animationTracks[i]);
|
|
2290
2854
|
}
|
|
2291
2855
|
}
|
|
2292
|
-
|
|
2856
|
+
|
|
2857
|
+
animations.push(new AnimationClip('default', -1, tracks));
|
|
2293
2858
|
}
|
|
2294
2859
|
} else {
|
|
2295
2860
|
for (const id in clips) {
|
|
2296
2861
|
animations.push(getAnimationClip(id));
|
|
2297
2862
|
}
|
|
2298
2863
|
}
|
|
2299
|
-
}
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2864
|
+
} // convert the parser error element into text with each child elements text
|
|
2865
|
+
// separated by new lines.
|
|
2866
|
+
|
|
2867
|
+
|
|
2868
|
+
function parserErrorToText(parserError) {
|
|
2869
|
+
let result = '';
|
|
2870
|
+
const stack = [parserError];
|
|
2871
|
+
|
|
2303
2872
|
while (stack.length) {
|
|
2304
2873
|
const node = stack.shift();
|
|
2874
|
+
|
|
2305
2875
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
2306
2876
|
result += node.textContent;
|
|
2307
2877
|
} else {
|
|
2308
|
-
result +=
|
|
2878
|
+
result += '\n';
|
|
2309
2879
|
stack.push.apply(stack, node.childNodes);
|
|
2310
2880
|
}
|
|
2311
2881
|
}
|
|
2882
|
+
|
|
2312
2883
|
return result.trim();
|
|
2313
2884
|
}
|
|
2885
|
+
|
|
2314
2886
|
if (text.length === 0) {
|
|
2315
|
-
return {
|
|
2887
|
+
return {
|
|
2888
|
+
scene: new Scene()
|
|
2889
|
+
};
|
|
2316
2890
|
}
|
|
2317
|
-
|
|
2318
|
-
const
|
|
2319
|
-
const
|
|
2320
|
-
|
|
2321
|
-
|
|
2891
|
+
|
|
2892
|
+
const xml = new DOMParser().parseFromString(text, 'application/xml');
|
|
2893
|
+
const collada = getElementsByTagName(xml, 'COLLADA')[0];
|
|
2894
|
+
const parserError = xml.getElementsByTagName('parsererror')[0];
|
|
2895
|
+
|
|
2896
|
+
if (parserError !== undefined) {
|
|
2897
|
+
// Chrome will return parser error with a div in it
|
|
2898
|
+
const errorElement = getElementsByTagName(parserError, 'div')[0];
|
|
2322
2899
|
let errorText;
|
|
2900
|
+
|
|
2323
2901
|
if (errorElement) {
|
|
2324
2902
|
errorText = errorElement.textContent;
|
|
2325
2903
|
} else {
|
|
2326
2904
|
errorText = parserErrorToText(parserError);
|
|
2327
2905
|
}
|
|
2328
|
-
|
|
2906
|
+
|
|
2907
|
+
console.error('THREE.ColladaLoader: Failed to parse collada file.\n', errorText);
|
|
2329
2908
|
return null;
|
|
2330
|
-
}
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
const
|
|
2334
|
-
|
|
2909
|
+
} // metadata
|
|
2910
|
+
|
|
2911
|
+
|
|
2912
|
+
const version = collada.getAttribute('version');
|
|
2913
|
+
console.log('THREE.ColladaLoader: File version', version);
|
|
2914
|
+
const asset = parseAsset(getElementsByTagName(collada, 'asset')[0]);
|
|
2915
|
+
const textureLoader = new TextureLoader(this.manager);
|
|
2335
2916
|
textureLoader.setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin);
|
|
2336
2917
|
let tgaLoader;
|
|
2337
|
-
|
|
2338
|
-
|
|
2918
|
+
|
|
2919
|
+
if (TGALoader) {
|
|
2920
|
+
tgaLoader = new TGALoader(this.manager);
|
|
2339
2921
|
tgaLoader.setPath(this.resourcePath || path);
|
|
2340
|
-
}
|
|
2922
|
+
} //
|
|
2923
|
+
|
|
2924
|
+
|
|
2341
2925
|
const animations = [];
|
|
2342
2926
|
let kinematics = {};
|
|
2343
|
-
let count = 0;
|
|
2927
|
+
let count = 0; //
|
|
2928
|
+
|
|
2344
2929
|
const library = {
|
|
2345
2930
|
animations: {},
|
|
2346
2931
|
clips: {},
|
|
@@ -2357,20 +2942,20 @@ class ColladaLoader extends THREE.Loader {
|
|
|
2357
2942
|
physicsModels: {},
|
|
2358
2943
|
kinematicsScenes: {}
|
|
2359
2944
|
};
|
|
2360
|
-
parseLibrary(collada,
|
|
2361
|
-
parseLibrary(collada,
|
|
2362
|
-
parseLibrary(collada,
|
|
2363
|
-
parseLibrary(collada,
|
|
2364
|
-
parseLibrary(collada,
|
|
2365
|
-
parseLibrary(collada,
|
|
2366
|
-
parseLibrary(collada,
|
|
2367
|
-
parseLibrary(collada,
|
|
2368
|
-
parseLibrary(collada,
|
|
2369
|
-
parseLibrary(collada,
|
|
2370
|
-
parseLibrary(collada,
|
|
2371
|
-
parseLibrary(collada,
|
|
2372
|
-
parseLibrary(collada,
|
|
2373
|
-
parseLibrary(collada,
|
|
2945
|
+
parseLibrary(collada, 'library_animations', 'animation', parseAnimation);
|
|
2946
|
+
parseLibrary(collada, 'library_animation_clips', 'animation_clip', parseAnimationClip);
|
|
2947
|
+
parseLibrary(collada, 'library_controllers', 'controller', parseController);
|
|
2948
|
+
parseLibrary(collada, 'library_images', 'image', parseImage);
|
|
2949
|
+
parseLibrary(collada, 'library_effects', 'effect', parseEffect);
|
|
2950
|
+
parseLibrary(collada, 'library_materials', 'material', parseMaterial);
|
|
2951
|
+
parseLibrary(collada, 'library_cameras', 'camera', parseCamera);
|
|
2952
|
+
parseLibrary(collada, 'library_lights', 'light', parseLight);
|
|
2953
|
+
parseLibrary(collada, 'library_geometries', 'geometry', parseGeometry);
|
|
2954
|
+
parseLibrary(collada, 'library_nodes', 'node', parseNode);
|
|
2955
|
+
parseLibrary(collada, 'library_visual_scenes', 'visual_scene', parseVisualScene);
|
|
2956
|
+
parseLibrary(collada, 'library_kinematics_models', 'kinematics_model', parseKinematicsModel);
|
|
2957
|
+
parseLibrary(collada, 'library_physics_models', 'physics_model', parsePhysicsModel);
|
|
2958
|
+
parseLibrary(collada, 'scene', 'instance_kinematics_scene', parseKinematicsScene);
|
|
2374
2959
|
buildLibrary(library.animations, buildAnimation);
|
|
2375
2960
|
buildLibrary(library.clips, buildAnimationClip);
|
|
2376
2961
|
buildLibrary(library.controllers, buildController);
|
|
@@ -2383,21 +2968,26 @@ class ColladaLoader extends THREE.Loader {
|
|
|
2383
2968
|
buildLibrary(library.visualScenes, buildVisualScene);
|
|
2384
2969
|
setupAnimations();
|
|
2385
2970
|
setupKinematics();
|
|
2386
|
-
const scene = parseScene(getElementsByTagName(collada,
|
|
2971
|
+
const scene = parseScene(getElementsByTagName(collada, 'scene')[0]);
|
|
2387
2972
|
scene.animations = animations;
|
|
2388
|
-
|
|
2389
|
-
|
|
2973
|
+
|
|
2974
|
+
if (asset.upAxis === 'Z_UP') {
|
|
2975
|
+
scene.quaternion.setFromEuler(new Euler(-Math.PI / 2, 0, 0));
|
|
2390
2976
|
}
|
|
2977
|
+
|
|
2391
2978
|
scene.scale.multiplyScalar(asset.unit);
|
|
2392
2979
|
return {
|
|
2393
2980
|
get animations() {
|
|
2394
|
-
console.warn(
|
|
2981
|
+
console.warn('THREE.ColladaLoader: Please access animations over scene.animations now.');
|
|
2395
2982
|
return animations;
|
|
2396
2983
|
},
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2984
|
+
|
|
2985
|
+
kinematics: kinematics,
|
|
2986
|
+
library: library,
|
|
2987
|
+
scene: scene
|
|
2400
2988
|
};
|
|
2401
2989
|
}
|
|
2990
|
+
|
|
2402
2991
|
}
|
|
2403
|
-
|
|
2992
|
+
|
|
2993
|
+
export { ColladaLoader };
|