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/LDrawLoader.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { Vector3, Ray, Loader, FileLoader, MeshStandardMaterial, LineBasicMaterial, ShaderMaterial, UniformsUtils, UniformsLib, Color, BufferGeometry, BufferAttribute, LineSegments, Mesh, Matrix4, Group } from 'three';
|
|
2
|
+
|
|
3
|
+
// Note: "MATERIAL" tag (e.g. GLITTER, SPECKLE) is not implemented
|
|
4
|
+
|
|
4
5
|
const FINISH_TYPE_DEFAULT = 0;
|
|
5
6
|
const FINISH_TYPE_CHROME = 1;
|
|
6
7
|
const FINISH_TYPE_PEARLESCENT = 2;
|
|
7
8
|
const FINISH_TYPE_RUBBER = 3;
|
|
8
9
|
const FINISH_TYPE_MATTE_METALLIC = 4;
|
|
9
|
-
const FINISH_TYPE_METAL = 5;
|
|
10
|
+
const FINISH_TYPE_METAL = 5; // State machine to search a subobject path.
|
|
11
|
+
// The LDraw standard establishes these various possible subfolders.
|
|
12
|
+
|
|
10
13
|
const FILE_LOCATION_AS_IS = 0;
|
|
11
14
|
const FILE_LOCATION_TRY_PARTS = 1;
|
|
12
15
|
const FILE_LOCATION_TRY_P = 2;
|
|
@@ -14,25 +17,27 @@ const FILE_LOCATION_TRY_MODELS = 3;
|
|
|
14
17
|
const FILE_LOCATION_TRY_RELATIVE = 4;
|
|
15
18
|
const FILE_LOCATION_TRY_ABSOLUTE = 5;
|
|
16
19
|
const FILE_LOCATION_NOT_FOUND = 6;
|
|
17
|
-
const MAIN_COLOUR_CODE =
|
|
18
|
-
const MAIN_EDGE_COLOUR_CODE =
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
20
|
+
const MAIN_COLOUR_CODE = '16';
|
|
21
|
+
const MAIN_EDGE_COLOUR_CODE = '24';
|
|
22
|
+
|
|
23
|
+
const _tempVec0 = new Vector3();
|
|
24
|
+
|
|
25
|
+
const _tempVec1 = new Vector3();
|
|
26
|
+
|
|
27
|
+
class LDrawConditionalLineMaterial extends ShaderMaterial {
|
|
22
28
|
constructor(parameters) {
|
|
23
29
|
super({
|
|
24
|
-
uniforms:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
opacity: {
|
|
31
|
-
value: 1
|
|
32
|
-
}
|
|
30
|
+
uniforms: UniformsUtils.merge([UniformsLib.fog, {
|
|
31
|
+
diffuse: {
|
|
32
|
+
value: new Color()
|
|
33
|
+
},
|
|
34
|
+
opacity: {
|
|
35
|
+
value: 1.0
|
|
33
36
|
}
|
|
34
|
-
]),
|
|
35
|
-
vertexShader:
|
|
37
|
+
}]),
|
|
38
|
+
vertexShader:
|
|
39
|
+
/* glsl */
|
|
40
|
+
`
|
|
36
41
|
attribute vec3 control0;
|
|
37
42
|
attribute vec3 control1;
|
|
38
43
|
attribute vec3 direction;
|
|
@@ -80,7 +85,9 @@ class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
|
|
|
80
85
|
#include <fog_vertex>
|
|
81
86
|
}
|
|
82
87
|
`,
|
|
83
|
-
fragmentShader:
|
|
88
|
+
fragmentShader:
|
|
89
|
+
/* glsl */
|
|
90
|
+
`
|
|
84
91
|
uniform vec3 diffuse;
|
|
85
92
|
uniform float opacity;
|
|
86
93
|
varying float discardFlag;
|
|
@@ -110,15 +117,15 @@ class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
|
|
|
110
117
|
});
|
|
111
118
|
Object.defineProperties(this, {
|
|
112
119
|
opacity: {
|
|
113
|
-
get: function() {
|
|
120
|
+
get: function () {
|
|
114
121
|
return this.uniforms.opacity.value;
|
|
115
122
|
},
|
|
116
|
-
set: function(value) {
|
|
123
|
+
set: function (value) {
|
|
117
124
|
this.uniforms.opacity.value = value;
|
|
118
125
|
}
|
|
119
126
|
},
|
|
120
127
|
color: {
|
|
121
|
-
get: function() {
|
|
128
|
+
get: function () {
|
|
122
129
|
return this.uniforms.diffuse.value;
|
|
123
130
|
}
|
|
124
131
|
}
|
|
@@ -126,13 +133,17 @@ class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
|
|
|
126
133
|
this.setValues(parameters);
|
|
127
134
|
this.isLDrawConditionalLineMaterial = true;
|
|
128
135
|
}
|
|
136
|
+
|
|
129
137
|
}
|
|
130
|
-
|
|
138
|
+
|
|
139
|
+
class ConditionalLineSegments extends LineSegments {
|
|
131
140
|
constructor(geometry, material) {
|
|
132
141
|
super(geometry, material);
|
|
133
142
|
this.isConditionalLine = true;
|
|
134
143
|
}
|
|
144
|
+
|
|
135
145
|
}
|
|
146
|
+
|
|
136
147
|
function generateFaceNormals(faces) {
|
|
137
148
|
for (let i = 0, l = faces.length; i < l; i++) {
|
|
138
149
|
const face = faces[i];
|
|
@@ -140,179 +151,263 @@ function generateFaceNormals(faces) {
|
|
|
140
151
|
const v0 = vertices[0];
|
|
141
152
|
const v1 = vertices[1];
|
|
142
153
|
const v2 = vertices[2];
|
|
154
|
+
|
|
143
155
|
_tempVec0.subVectors(v1, v0);
|
|
156
|
+
|
|
144
157
|
_tempVec1.subVectors(v2, v1);
|
|
145
|
-
|
|
158
|
+
|
|
159
|
+
face.faceNormal = new Vector3().crossVectors(_tempVec0, _tempVec1).normalize();
|
|
146
160
|
}
|
|
147
161
|
}
|
|
148
|
-
|
|
162
|
+
|
|
163
|
+
const _ray = new Ray();
|
|
164
|
+
|
|
149
165
|
function smoothNormals(faces, lineSegments, checkSubSegments = false) {
|
|
150
|
-
|
|
166
|
+
// NOTE: 1e2 is pretty coarse but was chosen to quantize the resulting value because
|
|
167
|
+
// it allows edges to be smoothed as expected (see minifig arms).
|
|
168
|
+
// --
|
|
169
|
+
// And the vector values are initialize multiplied by 1 + 1e-10 to account for floating
|
|
170
|
+
// point errors on vertices along quantization boundaries. Ie after matrix multiplication
|
|
171
|
+
// vertices that should be merged might be set to "1.7" and "1.6999..." meaning they won't
|
|
172
|
+
// get merged. This added epsilon attempts to push these error values to the same quantized
|
|
173
|
+
// value for the sake of hashing. See "AT-ST mini" dishes. See mrdoob/three#23169.
|
|
174
|
+
const hashMultiplier = (1 + 1e-10) * 1e2;
|
|
175
|
+
|
|
151
176
|
function hashVertex(v) {
|
|
152
177
|
const x = ~~(v.x * hashMultiplier);
|
|
153
178
|
const y = ~~(v.y * hashMultiplier);
|
|
154
179
|
const z = ~~(v.z * hashMultiplier);
|
|
155
180
|
return `${x},${y},${z}`;
|
|
156
181
|
}
|
|
182
|
+
|
|
157
183
|
function hashEdge(v0, v1) {
|
|
158
184
|
return `${hashVertex(v0)}_${hashVertex(v1)}`;
|
|
159
|
-
}
|
|
185
|
+
} // converts the two vertices to a ray with a normalized direction and origin of 0, 0, 0 projected
|
|
186
|
+
// onto the original line.
|
|
187
|
+
|
|
188
|
+
|
|
160
189
|
function toNormalizedRay(v0, v1, targetRay) {
|
|
161
190
|
targetRay.direction.subVectors(v1, v0).normalize();
|
|
162
191
|
const scalar = v0.dot(targetRay.direction);
|
|
163
192
|
targetRay.origin.copy(v0).addScaledVector(targetRay.direction, -scalar);
|
|
164
193
|
return targetRay;
|
|
165
194
|
}
|
|
195
|
+
|
|
166
196
|
function hashRay(ray) {
|
|
167
197
|
return hashEdge(ray.origin, ray.direction);
|
|
168
198
|
}
|
|
169
|
-
|
|
170
|
-
const
|
|
199
|
+
|
|
200
|
+
const hardEdges = new Set();
|
|
201
|
+
const hardEdgeRays = new Map();
|
|
171
202
|
const halfEdgeList = {};
|
|
172
|
-
const normals = [];
|
|
203
|
+
const normals = []; // Save the list of hard edges by hash
|
|
204
|
+
|
|
173
205
|
for (let i = 0, l = lineSegments.length; i < l; i++) {
|
|
174
206
|
const ls = lineSegments[i];
|
|
175
207
|
const vertices = ls.vertices;
|
|
176
208
|
const v0 = vertices[0];
|
|
177
209
|
const v1 = vertices[1];
|
|
178
210
|
hardEdges.add(hashEdge(v0, v1));
|
|
179
|
-
hardEdges.add(hashEdge(v1, v0));
|
|
211
|
+
hardEdges.add(hashEdge(v1, v0)); // only generate the hard edge ray map if we're checking subsegments because it's more expensive to check
|
|
212
|
+
// and requires more memory.
|
|
213
|
+
|
|
180
214
|
if (checkSubSegments) {
|
|
181
|
-
|
|
215
|
+
// add both ray directions to the map
|
|
216
|
+
const ray = toNormalizedRay(v0, v1, new Ray());
|
|
182
217
|
const rh1 = hashRay(ray);
|
|
218
|
+
|
|
183
219
|
if (!hardEdgeRays.has(rh1)) {
|
|
184
220
|
toNormalizedRay(v1, v0, ray);
|
|
185
221
|
const rh2 = hashRay(ray);
|
|
186
|
-
const
|
|
222
|
+
const info = {
|
|
187
223
|
ray,
|
|
188
224
|
distances: []
|
|
189
225
|
};
|
|
190
|
-
hardEdgeRays.set(rh1,
|
|
191
|
-
hardEdgeRays.set(rh2,
|
|
192
|
-
}
|
|
226
|
+
hardEdgeRays.set(rh1, info);
|
|
227
|
+
hardEdgeRays.set(rh2, info);
|
|
228
|
+
} // store both segments ends in min, max order in the distances array to check if a face edge is a
|
|
229
|
+
// subsegment later.
|
|
230
|
+
|
|
231
|
+
|
|
193
232
|
const info = hardEdgeRays.get(rh1);
|
|
194
233
|
let d0 = info.ray.direction.dot(v0);
|
|
195
234
|
let d1 = info.ray.direction.dot(v1);
|
|
235
|
+
|
|
196
236
|
if (d0 > d1) {
|
|
197
|
-
;
|
|
198
237
|
[d0, d1] = [d1, d0];
|
|
199
238
|
}
|
|
239
|
+
|
|
200
240
|
info.distances.push(d0, d1);
|
|
201
241
|
}
|
|
202
|
-
}
|
|
242
|
+
} // track the half edges associated with each triangle
|
|
243
|
+
|
|
244
|
+
|
|
203
245
|
for (let i = 0, l = faces.length; i < l; i++) {
|
|
204
246
|
const tri = faces[i];
|
|
205
247
|
const vertices = tri.vertices;
|
|
206
248
|
const vertCount = vertices.length;
|
|
249
|
+
|
|
207
250
|
for (let i2 = 0; i2 < vertCount; i2++) {
|
|
208
251
|
const index = i2;
|
|
209
252
|
const next = (i2 + 1) % vertCount;
|
|
210
253
|
const v0 = vertices[index];
|
|
211
254
|
const v1 = vertices[next];
|
|
212
|
-
const hash = hashEdge(v0, v1);
|
|
255
|
+
const hash = hashEdge(v0, v1); // don't add the triangle if the edge is supposed to be hard
|
|
256
|
+
|
|
213
257
|
if (hardEdges.has(hash)) {
|
|
214
258
|
continue;
|
|
215
|
-
}
|
|
259
|
+
} // if checking subsegments then check to see if this edge lies on a hard edge ray and whether its within any ray bounds
|
|
260
|
+
|
|
261
|
+
|
|
216
262
|
if (checkSubSegments) {
|
|
217
263
|
toNormalizedRay(v0, v1, _ray);
|
|
218
264
|
const rayHash = hashRay(_ray);
|
|
265
|
+
|
|
219
266
|
if (hardEdgeRays.has(rayHash)) {
|
|
220
|
-
const
|
|
221
|
-
const {
|
|
267
|
+
const info = hardEdgeRays.get(rayHash);
|
|
268
|
+
const {
|
|
269
|
+
ray,
|
|
270
|
+
distances
|
|
271
|
+
} = info;
|
|
222
272
|
let d0 = ray.direction.dot(v0);
|
|
223
273
|
let d1 = ray.direction.dot(v1);
|
|
274
|
+
|
|
224
275
|
if (d0 > d1) {
|
|
225
|
-
;
|
|
226
276
|
[d0, d1] = [d1, d0];
|
|
227
|
-
}
|
|
277
|
+
} // return early if the face edge is found to be a subsegment of a line edge meaning the edge will have "hard" normals
|
|
278
|
+
|
|
279
|
+
|
|
228
280
|
let found = false;
|
|
229
|
-
|
|
230
|
-
|
|
281
|
+
|
|
282
|
+
for (let i = 0, l = distances.length; i < l; i += 2) {
|
|
283
|
+
if (d0 >= distances[i] && d1 <= distances[i + 1]) {
|
|
231
284
|
found = true;
|
|
232
285
|
break;
|
|
233
286
|
}
|
|
234
287
|
}
|
|
288
|
+
|
|
235
289
|
if (found) {
|
|
236
290
|
continue;
|
|
237
291
|
}
|
|
238
292
|
}
|
|
239
293
|
}
|
|
294
|
+
|
|
240
295
|
const info = {
|
|
241
|
-
index,
|
|
242
|
-
tri
|
|
296
|
+
index: index,
|
|
297
|
+
tri: tri
|
|
243
298
|
};
|
|
244
299
|
halfEdgeList[hash] = info;
|
|
245
300
|
}
|
|
246
|
-
}
|
|
301
|
+
} // Iterate until we've tried to connect all faces to share normals
|
|
302
|
+
|
|
303
|
+
|
|
247
304
|
while (true) {
|
|
305
|
+
// Stop if there are no more faces left
|
|
248
306
|
let halfEdge = null;
|
|
307
|
+
|
|
249
308
|
for (const key in halfEdgeList) {
|
|
250
309
|
halfEdge = halfEdgeList[key];
|
|
251
310
|
break;
|
|
252
311
|
}
|
|
312
|
+
|
|
253
313
|
if (halfEdge === null) {
|
|
254
314
|
break;
|
|
255
|
-
}
|
|
315
|
+
} // Exhaustively find all connected faces
|
|
316
|
+
|
|
317
|
+
|
|
256
318
|
const queue = [halfEdge];
|
|
319
|
+
|
|
257
320
|
while (queue.length > 0) {
|
|
321
|
+
// initialize all vertex normals in this triangle
|
|
258
322
|
const tri = queue.pop().tri;
|
|
259
323
|
const vertices = tri.vertices;
|
|
260
324
|
const vertNormals = tri.normals;
|
|
261
|
-
const faceNormal = tri.faceNormal;
|
|
325
|
+
const faceNormal = tri.faceNormal; // Check if any edge is connected to another triangle edge
|
|
326
|
+
|
|
262
327
|
const vertCount = vertices.length;
|
|
328
|
+
|
|
263
329
|
for (let i2 = 0; i2 < vertCount; i2++) {
|
|
264
330
|
const index = i2;
|
|
265
331
|
const next = (i2 + 1) % vertCount;
|
|
266
332
|
const v0 = vertices[index];
|
|
267
|
-
const v1 = vertices[next];
|
|
333
|
+
const v1 = vertices[next]; // delete this triangle from the list so it won't be found again
|
|
334
|
+
|
|
268
335
|
const hash = hashEdge(v0, v1);
|
|
269
336
|
delete halfEdgeList[hash];
|
|
270
337
|
const reverseHash = hashEdge(v1, v0);
|
|
271
338
|
const otherInfo = halfEdgeList[reverseHash];
|
|
339
|
+
|
|
272
340
|
if (otherInfo) {
|
|
273
341
|
const otherTri = otherInfo.tri;
|
|
274
342
|
const otherIndex = otherInfo.index;
|
|
275
343
|
const otherNormals = otherTri.normals;
|
|
276
344
|
const otherVertCount = otherNormals.length;
|
|
277
|
-
const otherFaceNormal = otherTri.faceNormal;
|
|
345
|
+
const otherFaceNormal = otherTri.faceNormal; // NOTE: If the angle between faces is > 67.5 degrees then assume it's
|
|
346
|
+
// hard edge. There are some cases where the line segments do not line up exactly
|
|
347
|
+
// with or span multiple triangle edges (see Lunar Vehicle wheels).
|
|
348
|
+
|
|
278
349
|
if (Math.abs(otherTri.faceNormal.dot(tri.faceNormal)) < 0.25) {
|
|
279
350
|
continue;
|
|
280
|
-
}
|
|
351
|
+
} // if this triangle has already been traversed then it won't be in
|
|
352
|
+
// the halfEdgeList. If it has not then add it to the queue and delete
|
|
353
|
+
// it so it won't be found again.
|
|
354
|
+
|
|
355
|
+
|
|
281
356
|
if (reverseHash in halfEdgeList) {
|
|
282
357
|
queue.push(otherInfo);
|
|
283
358
|
delete halfEdgeList[reverseHash];
|
|
284
|
-
}
|
|
359
|
+
} // share the first normal
|
|
360
|
+
|
|
361
|
+
|
|
285
362
|
const otherNext = (otherIndex + 1) % otherVertCount;
|
|
363
|
+
|
|
286
364
|
if (vertNormals[index] && otherNormals[otherNext] && vertNormals[index] !== otherNormals[otherNext]) {
|
|
287
365
|
otherNormals[otherNext].norm.add(vertNormals[index].norm);
|
|
288
366
|
vertNormals[index].norm = otherNormals[otherNext].norm;
|
|
289
367
|
}
|
|
368
|
+
|
|
290
369
|
let sharedNormal1 = vertNormals[index] || otherNormals[otherNext];
|
|
370
|
+
|
|
291
371
|
if (sharedNormal1 === null) {
|
|
292
|
-
|
|
372
|
+
// it's possible to encounter an edge of a triangle that has already been traversed meaning
|
|
373
|
+
// both edges already have different normals defined and shared. To work around this we create
|
|
374
|
+
// a wrapper object so when those edges are merged the normals can be updated everywhere.
|
|
375
|
+
sharedNormal1 = {
|
|
376
|
+
norm: new Vector3()
|
|
377
|
+
};
|
|
293
378
|
normals.push(sharedNormal1.norm);
|
|
294
379
|
}
|
|
380
|
+
|
|
295
381
|
if (vertNormals[index] === null) {
|
|
296
382
|
vertNormals[index] = sharedNormal1;
|
|
297
383
|
sharedNormal1.norm.add(faceNormal);
|
|
298
384
|
}
|
|
385
|
+
|
|
299
386
|
if (otherNormals[otherNext] === null) {
|
|
300
387
|
otherNormals[otherNext] = sharedNormal1;
|
|
301
388
|
sharedNormal1.norm.add(otherFaceNormal);
|
|
302
|
-
}
|
|
389
|
+
} // share the second normal
|
|
390
|
+
|
|
391
|
+
|
|
303
392
|
if (vertNormals[next] && otherNormals[otherIndex] && vertNormals[next] !== otherNormals[otherIndex]) {
|
|
304
393
|
otherNormals[otherIndex].norm.add(vertNormals[next].norm);
|
|
305
394
|
vertNormals[next].norm = otherNormals[otherIndex].norm;
|
|
306
395
|
}
|
|
396
|
+
|
|
307
397
|
let sharedNormal2 = vertNormals[next] || otherNormals[otherIndex];
|
|
398
|
+
|
|
308
399
|
if (sharedNormal2 === null) {
|
|
309
|
-
sharedNormal2 = {
|
|
400
|
+
sharedNormal2 = {
|
|
401
|
+
norm: new Vector3()
|
|
402
|
+
};
|
|
310
403
|
normals.push(sharedNormal2.norm);
|
|
311
404
|
}
|
|
405
|
+
|
|
312
406
|
if (vertNormals[next] === null) {
|
|
313
407
|
vertNormals[next] = sharedNormal2;
|
|
314
408
|
sharedNormal2.norm.add(faceNormal);
|
|
315
409
|
}
|
|
410
|
+
|
|
316
411
|
if (otherNormals[otherIndex] === null) {
|
|
317
412
|
otherNormals[otherIndex] = sharedNormal2;
|
|
318
413
|
sharedNormal2.norm.add(otherFaceNormal);
|
|
@@ -320,94 +415,119 @@ function smoothNormals(faces, lineSegments, checkSubSegments = false) {
|
|
|
320
415
|
}
|
|
321
416
|
}
|
|
322
417
|
}
|
|
323
|
-
}
|
|
418
|
+
} // The normals of each face have been added up so now we average them by normalizing the vector.
|
|
419
|
+
|
|
420
|
+
|
|
324
421
|
for (let i = 0, l = normals.length; i < l; i++) {
|
|
325
422
|
normals[i].normalize();
|
|
326
423
|
}
|
|
327
424
|
}
|
|
425
|
+
|
|
328
426
|
function isPartType(type) {
|
|
329
|
-
return type ===
|
|
427
|
+
return type === 'Part' || type === 'Unofficial_Part';
|
|
330
428
|
}
|
|
429
|
+
|
|
331
430
|
function isPrimitiveType(type) {
|
|
332
|
-
return /primitive/i.test(type) || type ===
|
|
431
|
+
return /primitive/i.test(type) || type === 'Subpart';
|
|
333
432
|
}
|
|
433
|
+
|
|
334
434
|
class LineParser {
|
|
335
435
|
constructor(line, lineNumber) {
|
|
336
436
|
this.line = line;
|
|
337
437
|
this.lineLength = line.length;
|
|
338
438
|
this.currentCharIndex = 0;
|
|
339
|
-
this.currentChar =
|
|
439
|
+
this.currentChar = ' ';
|
|
340
440
|
this.lineNumber = lineNumber;
|
|
341
441
|
}
|
|
442
|
+
|
|
342
443
|
seekNonSpace() {
|
|
343
444
|
while (this.currentCharIndex < this.lineLength) {
|
|
344
445
|
this.currentChar = this.line.charAt(this.currentCharIndex);
|
|
345
|
-
|
|
446
|
+
|
|
447
|
+
if (this.currentChar !== ' ' && this.currentChar !== '\t') {
|
|
346
448
|
return;
|
|
347
449
|
}
|
|
450
|
+
|
|
348
451
|
this.currentCharIndex++;
|
|
349
452
|
}
|
|
350
453
|
}
|
|
454
|
+
|
|
351
455
|
getToken() {
|
|
352
|
-
const pos0 = this.currentCharIndex++;
|
|
456
|
+
const pos0 = this.currentCharIndex++; // Seek space
|
|
457
|
+
|
|
353
458
|
while (this.currentCharIndex < this.lineLength) {
|
|
354
459
|
this.currentChar = this.line.charAt(this.currentCharIndex);
|
|
355
|
-
|
|
460
|
+
|
|
461
|
+
if (this.currentChar === ' ' || this.currentChar === '\t') {
|
|
356
462
|
break;
|
|
357
463
|
}
|
|
464
|
+
|
|
358
465
|
this.currentCharIndex++;
|
|
359
466
|
}
|
|
467
|
+
|
|
360
468
|
const pos1 = this.currentCharIndex;
|
|
361
469
|
this.seekNonSpace();
|
|
362
470
|
return this.line.substring(pos0, pos1);
|
|
363
471
|
}
|
|
472
|
+
|
|
364
473
|
getVector() {
|
|
365
|
-
return new
|
|
474
|
+
return new Vector3(parseFloat(this.getToken()), parseFloat(this.getToken()), parseFloat(this.getToken()));
|
|
366
475
|
}
|
|
476
|
+
|
|
367
477
|
getRemainingString() {
|
|
368
478
|
return this.line.substring(this.currentCharIndex, this.lineLength);
|
|
369
479
|
}
|
|
480
|
+
|
|
370
481
|
isAtTheEnd() {
|
|
371
482
|
return this.currentCharIndex >= this.lineLength;
|
|
372
483
|
}
|
|
484
|
+
|
|
373
485
|
setToEnd() {
|
|
374
486
|
this.currentCharIndex = this.lineLength;
|
|
375
487
|
}
|
|
488
|
+
|
|
376
489
|
getLineNumberString() {
|
|
377
|
-
return this.lineNumber >= 0 ?
|
|
490
|
+
return this.lineNumber >= 0 ? ' at line ' + this.lineNumber : '';
|
|
378
491
|
}
|
|
379
|
-
|
|
492
|
+
|
|
493
|
+
} // Fetches and parses an intermediate representation of LDraw parts files.
|
|
494
|
+
|
|
495
|
+
|
|
380
496
|
class LDrawParsedCache {
|
|
381
497
|
constructor(loader) {
|
|
382
498
|
this.loader = loader;
|
|
383
499
|
this._cache = {};
|
|
384
500
|
}
|
|
501
|
+
|
|
385
502
|
cloneResult(original) {
|
|
386
|
-
const result = {};
|
|
387
|
-
|
|
503
|
+
const result = {}; // vertices are transformed and normals computed before being converted to geometry
|
|
504
|
+
// so these pieces must be cloned.
|
|
505
|
+
|
|
506
|
+
result.faces = original.faces.map(face => {
|
|
388
507
|
return {
|
|
389
508
|
colorCode: face.colorCode,
|
|
390
509
|
material: face.material,
|
|
391
|
-
vertices: face.vertices.map(
|
|
510
|
+
vertices: face.vertices.map(v => v.clone()),
|
|
392
511
|
normals: face.normals.map(() => null),
|
|
393
512
|
faceNormal: null
|
|
394
513
|
};
|
|
395
514
|
});
|
|
396
|
-
result.conditionalSegments = original.conditionalSegments.map(
|
|
515
|
+
result.conditionalSegments = original.conditionalSegments.map(face => {
|
|
397
516
|
return {
|
|
398
517
|
colorCode: face.colorCode,
|
|
399
518
|
material: face.material,
|
|
400
|
-
vertices: face.vertices.map(
|
|
401
|
-
controlPoints: face.controlPoints.map(
|
|
519
|
+
vertices: face.vertices.map(v => v.clone()),
|
|
520
|
+
controlPoints: face.controlPoints.map(v => v.clone())
|
|
402
521
|
};
|
|
403
522
|
});
|
|
404
|
-
result.lineSegments = original.lineSegments.map(
|
|
523
|
+
result.lineSegments = original.lineSegments.map(face => {
|
|
405
524
|
return {
|
|
406
525
|
colorCode: face.colorCode,
|
|
407
526
|
material: face.material,
|
|
408
|
-
vertices: face.vertices.map(
|
|
527
|
+
vertices: face.vertices.map(v => v.clone())
|
|
409
528
|
};
|
|
410
|
-
});
|
|
529
|
+
}); // none if this is subsequently modified
|
|
530
|
+
|
|
411
531
|
result.type = original.type;
|
|
412
532
|
result.category = original.category;
|
|
413
533
|
result.keywords = original.keywords;
|
|
@@ -418,74 +538,95 @@ class LDrawParsedCache {
|
|
|
418
538
|
result.group = null;
|
|
419
539
|
return result;
|
|
420
540
|
}
|
|
541
|
+
|
|
421
542
|
async fetchData(fileName) {
|
|
422
543
|
let triedLowerCase = false;
|
|
423
544
|
let locationState = FILE_LOCATION_AS_IS;
|
|
545
|
+
|
|
424
546
|
while (locationState !== FILE_LOCATION_NOT_FOUND) {
|
|
425
547
|
let subobjectURL = fileName;
|
|
548
|
+
|
|
426
549
|
switch (locationState) {
|
|
427
550
|
case FILE_LOCATION_AS_IS:
|
|
428
551
|
locationState = locationState + 1;
|
|
429
552
|
break;
|
|
553
|
+
|
|
430
554
|
case FILE_LOCATION_TRY_PARTS:
|
|
431
|
-
subobjectURL =
|
|
555
|
+
subobjectURL = 'parts/' + subobjectURL;
|
|
432
556
|
locationState = locationState + 1;
|
|
433
557
|
break;
|
|
558
|
+
|
|
434
559
|
case FILE_LOCATION_TRY_P:
|
|
435
|
-
subobjectURL =
|
|
560
|
+
subobjectURL = 'p/' + subobjectURL;
|
|
436
561
|
locationState = locationState + 1;
|
|
437
562
|
break;
|
|
563
|
+
|
|
438
564
|
case FILE_LOCATION_TRY_MODELS:
|
|
439
|
-
subobjectURL =
|
|
565
|
+
subobjectURL = 'models/' + subobjectURL;
|
|
440
566
|
locationState = locationState + 1;
|
|
441
567
|
break;
|
|
568
|
+
|
|
442
569
|
case FILE_LOCATION_TRY_RELATIVE:
|
|
443
|
-
subobjectURL = fileName.substring(0, fileName.lastIndexOf(
|
|
570
|
+
subobjectURL = fileName.substring(0, fileName.lastIndexOf('/') + 1) + subobjectURL;
|
|
444
571
|
locationState = locationState + 1;
|
|
445
572
|
break;
|
|
573
|
+
|
|
446
574
|
case FILE_LOCATION_TRY_ABSOLUTE:
|
|
447
575
|
if (triedLowerCase) {
|
|
576
|
+
// Try absolute path
|
|
448
577
|
locationState = FILE_LOCATION_NOT_FOUND;
|
|
449
578
|
} else {
|
|
579
|
+
// Next attempt is lower case
|
|
450
580
|
fileName = fileName.toLowerCase();
|
|
451
581
|
subobjectURL = fileName;
|
|
452
582
|
triedLowerCase = true;
|
|
453
583
|
locationState = FILE_LOCATION_AS_IS;
|
|
454
584
|
}
|
|
585
|
+
|
|
455
586
|
break;
|
|
456
587
|
}
|
|
588
|
+
|
|
457
589
|
const loader = this.loader;
|
|
458
|
-
const fileLoader = new
|
|
590
|
+
const fileLoader = new FileLoader(loader.manager);
|
|
459
591
|
fileLoader.setPath(loader.partsLibraryPath);
|
|
460
592
|
fileLoader.setRequestHeader(loader.requestHeader);
|
|
461
593
|
fileLoader.setWithCredentials(loader.withCredentials);
|
|
594
|
+
|
|
462
595
|
try {
|
|
463
596
|
const text = await fileLoader.loadAsync(subobjectURL);
|
|
464
597
|
return text;
|
|
465
|
-
} catch
|
|
598
|
+
} catch {
|
|
466
599
|
continue;
|
|
467
600
|
}
|
|
468
601
|
}
|
|
602
|
+
|
|
469
603
|
throw new Error('LDrawLoader: Subobject "' + fileName + '" could not be loaded.');
|
|
470
604
|
}
|
|
605
|
+
|
|
471
606
|
parse(text, fileName = null) {
|
|
472
|
-
const loader = this.loader;
|
|
607
|
+
const loader = this.loader; // final results
|
|
608
|
+
|
|
473
609
|
const faces = [];
|
|
474
610
|
const lineSegments = [];
|
|
475
611
|
const conditionalSegments = [];
|
|
476
612
|
const subobjects = [];
|
|
477
613
|
const materials = {};
|
|
478
|
-
|
|
614
|
+
|
|
615
|
+
const getLocalMaterial = colorCode => {
|
|
479
616
|
return materials[colorCode] || null;
|
|
480
617
|
};
|
|
481
|
-
|
|
618
|
+
|
|
619
|
+
let type = 'Model';
|
|
482
620
|
let category = null;
|
|
483
621
|
let keywords = null;
|
|
484
|
-
let totalFaces = 0;
|
|
485
|
-
|
|
486
|
-
|
|
622
|
+
let totalFaces = 0; // split into lines
|
|
623
|
+
|
|
624
|
+
if (text.indexOf('\r\n') !== -1) {
|
|
625
|
+
// This is faster than String.split with regex that splits on both
|
|
626
|
+
text = text.replace(/\r\n/g, '\n');
|
|
487
627
|
}
|
|
488
|
-
|
|
628
|
+
|
|
629
|
+
const lines = text.split('\n');
|
|
489
630
|
const numLines = lines.length;
|
|
490
631
|
let parsingEmbeddedFiles = false;
|
|
491
632
|
let currentEmbeddedFileName = null;
|
|
@@ -494,26 +635,35 @@ class LDrawParsedCache {
|
|
|
494
635
|
let bfcCCW = true;
|
|
495
636
|
let bfcInverted = false;
|
|
496
637
|
let bfcCull = true;
|
|
497
|
-
let startingConstructionStep = false;
|
|
638
|
+
let startingConstructionStep = false; // Parse all line commands
|
|
639
|
+
|
|
498
640
|
for (let lineIndex = 0; lineIndex < numLines; lineIndex++) {
|
|
499
641
|
const line = lines[lineIndex];
|
|
500
|
-
if (line.length === 0)
|
|
501
|
-
|
|
642
|
+
if (line.length === 0) continue;
|
|
643
|
+
|
|
502
644
|
if (parsingEmbeddedFiles) {
|
|
503
|
-
if (line.startsWith(
|
|
504
|
-
|
|
645
|
+
if (line.startsWith('0 FILE ')) {
|
|
646
|
+
// Save previous embedded file in the cache
|
|
647
|
+
this.setData(currentEmbeddedFileName, currentEmbeddedText); // New embedded text file
|
|
648
|
+
|
|
505
649
|
currentEmbeddedFileName = line.substring(7);
|
|
506
|
-
currentEmbeddedText =
|
|
650
|
+
currentEmbeddedText = '';
|
|
507
651
|
} else {
|
|
508
|
-
currentEmbeddedText += line +
|
|
652
|
+
currentEmbeddedText += line + '\n';
|
|
509
653
|
}
|
|
654
|
+
|
|
510
655
|
continue;
|
|
511
656
|
}
|
|
657
|
+
|
|
512
658
|
const lp = new LineParser(line, lineIndex + 1);
|
|
513
659
|
lp.seekNonSpace();
|
|
660
|
+
|
|
514
661
|
if (lp.isAtTheEnd()) {
|
|
662
|
+
// Empty line
|
|
515
663
|
continue;
|
|
516
|
-
}
|
|
664
|
+
} // Parse the line type
|
|
665
|
+
|
|
666
|
+
|
|
517
667
|
const lineType = lp.getToken();
|
|
518
668
|
let material;
|
|
519
669
|
let colorCode;
|
|
@@ -521,80 +671,105 @@ class LDrawParsedCache {
|
|
|
521
671
|
let ccw;
|
|
522
672
|
let doubleSided;
|
|
523
673
|
let v0, v1, v2, v3, c0, c1;
|
|
674
|
+
|
|
524
675
|
switch (lineType) {
|
|
525
|
-
|
|
676
|
+
// Line type 0: Comment or META
|
|
677
|
+
case '0':
|
|
678
|
+
// Parse meta directive
|
|
526
679
|
const meta = lp.getToken();
|
|
680
|
+
|
|
527
681
|
if (meta) {
|
|
528
682
|
switch (meta) {
|
|
529
|
-
case
|
|
683
|
+
case '!LDRAW_ORG':
|
|
530
684
|
type = lp.getToken();
|
|
531
685
|
break;
|
|
532
|
-
|
|
686
|
+
|
|
687
|
+
case '!COLOUR':
|
|
533
688
|
material = loader.parseColorMetaDirective(lp);
|
|
689
|
+
|
|
534
690
|
if (material) {
|
|
535
691
|
materials[material.userData.code] = material;
|
|
536
692
|
} else {
|
|
537
|
-
console.warn(
|
|
693
|
+
console.warn('LDrawLoader: Error parsing material' + lp.getLineNumberString());
|
|
538
694
|
}
|
|
695
|
+
|
|
539
696
|
break;
|
|
540
|
-
|
|
697
|
+
|
|
698
|
+
case '!CATEGORY':
|
|
541
699
|
category = lp.getToken();
|
|
542
700
|
break;
|
|
543
|
-
|
|
544
|
-
|
|
701
|
+
|
|
702
|
+
case '!KEYWORDS':
|
|
703
|
+
const newKeywords = lp.getRemainingString().split(',');
|
|
704
|
+
|
|
545
705
|
if (newKeywords.length > 0) {
|
|
546
706
|
if (!keywords) {
|
|
547
707
|
keywords = [];
|
|
548
708
|
}
|
|
549
|
-
|
|
709
|
+
|
|
710
|
+
newKeywords.forEach(function (keyword) {
|
|
550
711
|
keywords.push(keyword.trim());
|
|
551
712
|
});
|
|
552
713
|
}
|
|
714
|
+
|
|
553
715
|
break;
|
|
554
|
-
|
|
716
|
+
|
|
717
|
+
case 'FILE':
|
|
555
718
|
if (lineIndex > 0) {
|
|
719
|
+
// Start embedded text files parsing
|
|
556
720
|
parsingEmbeddedFiles = true;
|
|
557
721
|
currentEmbeddedFileName = lp.getRemainingString();
|
|
558
|
-
currentEmbeddedText =
|
|
722
|
+
currentEmbeddedText = '';
|
|
559
723
|
bfcCertified = false;
|
|
560
724
|
bfcCCW = true;
|
|
561
725
|
}
|
|
726
|
+
|
|
562
727
|
break;
|
|
563
|
-
|
|
728
|
+
|
|
729
|
+
case 'BFC':
|
|
730
|
+
// Changes to the backface culling state
|
|
564
731
|
while (!lp.isAtTheEnd()) {
|
|
565
732
|
const token = lp.getToken();
|
|
733
|
+
|
|
566
734
|
switch (token) {
|
|
567
|
-
case
|
|
568
|
-
case
|
|
569
|
-
bfcCertified = token ===
|
|
735
|
+
case 'CERTIFY':
|
|
736
|
+
case 'NOCERTIFY':
|
|
737
|
+
bfcCertified = token === 'CERTIFY';
|
|
570
738
|
bfcCCW = true;
|
|
571
739
|
break;
|
|
572
|
-
|
|
573
|
-
case
|
|
574
|
-
|
|
740
|
+
|
|
741
|
+
case 'CW':
|
|
742
|
+
case 'CCW':
|
|
743
|
+
bfcCCW = token === 'CCW';
|
|
575
744
|
break;
|
|
576
|
-
|
|
745
|
+
|
|
746
|
+
case 'INVERTNEXT':
|
|
577
747
|
bfcInverted = true;
|
|
578
748
|
break;
|
|
579
|
-
|
|
580
|
-
case
|
|
581
|
-
|
|
749
|
+
|
|
750
|
+
case 'CLIP':
|
|
751
|
+
case 'NOCLIP':
|
|
752
|
+
bfcCull = token === 'CLIP';
|
|
582
753
|
break;
|
|
754
|
+
|
|
583
755
|
default:
|
|
584
756
|
console.warn('THREE.LDrawLoader: BFC directive "' + token + '" is unknown.');
|
|
585
757
|
break;
|
|
586
758
|
}
|
|
587
759
|
}
|
|
760
|
+
|
|
588
761
|
break;
|
|
589
|
-
|
|
762
|
+
|
|
763
|
+
case 'STEP':
|
|
590
764
|
startingConstructionStep = true;
|
|
591
765
|
break;
|
|
592
|
-
default:
|
|
593
|
-
break;
|
|
594
766
|
}
|
|
595
767
|
}
|
|
768
|
+
|
|
596
769
|
break;
|
|
597
|
-
|
|
770
|
+
// Line type 1: Sub-object file
|
|
771
|
+
|
|
772
|
+
case '1':
|
|
598
773
|
colorCode = lp.getToken();
|
|
599
774
|
material = getLocalMaterial(colorCode);
|
|
600
775
|
const posX = parseFloat(lp.getToken());
|
|
@@ -609,40 +784,48 @@ class LDrawParsedCache {
|
|
|
609
784
|
const m6 = parseFloat(lp.getToken());
|
|
610
785
|
const m7 = parseFloat(lp.getToken());
|
|
611
786
|
const m8 = parseFloat(lp.getToken());
|
|
612
|
-
const matrix = new
|
|
613
|
-
let
|
|
614
|
-
|
|
615
|
-
|
|
787
|
+
const matrix = new Matrix4().set(m0, m1, m2, posX, m3, m4, m5, posY, m6, m7, m8, posZ, 0, 0, 0, 1);
|
|
788
|
+
let fileName = lp.getRemainingString().trim().replace(/\\/g, '/');
|
|
789
|
+
|
|
790
|
+
if (loader.fileMap[fileName]) {
|
|
791
|
+
// Found the subobject path in the preloaded file path map
|
|
792
|
+
fileName = loader.fileMap[fileName];
|
|
616
793
|
} else {
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
794
|
+
// Standardized subfolders
|
|
795
|
+
if (fileName.startsWith('s/')) {
|
|
796
|
+
fileName = 'parts/' + fileName;
|
|
797
|
+
} else if (fileName.startsWith('48/')) {
|
|
798
|
+
fileName = 'p/' + fileName;
|
|
621
799
|
}
|
|
622
800
|
}
|
|
801
|
+
|
|
623
802
|
subobjects.push({
|
|
624
|
-
material,
|
|
625
|
-
colorCode,
|
|
626
|
-
matrix,
|
|
627
|
-
fileName:
|
|
803
|
+
material: material,
|
|
804
|
+
colorCode: colorCode,
|
|
805
|
+
matrix: matrix,
|
|
806
|
+
fileName: fileName,
|
|
628
807
|
inverted: bfcInverted,
|
|
629
|
-
startingConstructionStep
|
|
808
|
+
startingConstructionStep: startingConstructionStep
|
|
630
809
|
});
|
|
631
810
|
bfcInverted = false;
|
|
632
811
|
break;
|
|
633
|
-
|
|
812
|
+
// Line type 2: Line segment
|
|
813
|
+
|
|
814
|
+
case '2':
|
|
634
815
|
colorCode = lp.getToken();
|
|
635
816
|
material = getLocalMaterial(colorCode);
|
|
636
817
|
v0 = lp.getVector();
|
|
637
818
|
v1 = lp.getVector();
|
|
638
819
|
segment = {
|
|
639
|
-
material,
|
|
640
|
-
colorCode,
|
|
820
|
+
material: material,
|
|
821
|
+
colorCode: colorCode,
|
|
641
822
|
vertices: [v0, v1]
|
|
642
823
|
};
|
|
643
824
|
lineSegments.push(segment);
|
|
644
825
|
break;
|
|
645
|
-
|
|
826
|
+
// Line type 5: Conditional Line segment
|
|
827
|
+
|
|
828
|
+
case '5':
|
|
646
829
|
colorCode = lp.getToken();
|
|
647
830
|
material = getLocalMaterial(colorCode);
|
|
648
831
|
v0 = lp.getVector();
|
|
@@ -650,18 +833,21 @@ class LDrawParsedCache {
|
|
|
650
833
|
c0 = lp.getVector();
|
|
651
834
|
c1 = lp.getVector();
|
|
652
835
|
segment = {
|
|
653
|
-
material,
|
|
654
|
-
colorCode,
|
|
836
|
+
material: material,
|
|
837
|
+
colorCode: colorCode,
|
|
655
838
|
vertices: [v0, v1],
|
|
656
839
|
controlPoints: [c0, c1]
|
|
657
840
|
};
|
|
658
841
|
conditionalSegments.push(segment);
|
|
659
842
|
break;
|
|
660
|
-
|
|
843
|
+
// Line type 3: Triangle
|
|
844
|
+
|
|
845
|
+
case '3':
|
|
661
846
|
colorCode = lp.getToken();
|
|
662
847
|
material = getLocalMaterial(colorCode);
|
|
663
848
|
ccw = bfcCCW;
|
|
664
849
|
doubleSided = !bfcCertified || !bfcCull;
|
|
850
|
+
|
|
665
851
|
if (ccw === true) {
|
|
666
852
|
v0 = lp.getVector();
|
|
667
853
|
v1 = lp.getVector();
|
|
@@ -671,30 +857,36 @@ class LDrawParsedCache {
|
|
|
671
857
|
v1 = lp.getVector();
|
|
672
858
|
v0 = lp.getVector();
|
|
673
859
|
}
|
|
860
|
+
|
|
674
861
|
faces.push({
|
|
675
|
-
material,
|
|
676
|
-
colorCode,
|
|
862
|
+
material: material,
|
|
863
|
+
colorCode: colorCode,
|
|
677
864
|
faceNormal: null,
|
|
678
865
|
vertices: [v0, v1, v2],
|
|
679
866
|
normals: [null, null, null]
|
|
680
867
|
});
|
|
681
868
|
totalFaces++;
|
|
869
|
+
|
|
682
870
|
if (doubleSided === true) {
|
|
683
871
|
faces.push({
|
|
684
|
-
material,
|
|
685
|
-
colorCode,
|
|
872
|
+
material: material,
|
|
873
|
+
colorCode: colorCode,
|
|
686
874
|
faceNormal: null,
|
|
687
875
|
vertices: [v2, v1, v0],
|
|
688
876
|
normals: [null, null, null]
|
|
689
877
|
});
|
|
690
878
|
totalFaces++;
|
|
691
879
|
}
|
|
880
|
+
|
|
692
881
|
break;
|
|
693
|
-
|
|
882
|
+
// Line type 4: Quadrilateral
|
|
883
|
+
|
|
884
|
+
case '4':
|
|
694
885
|
colorCode = lp.getToken();
|
|
695
886
|
material = getLocalMaterial(colorCode);
|
|
696
887
|
ccw = bfcCCW;
|
|
697
888
|
doubleSided = !bfcCertified || !bfcCull;
|
|
889
|
+
|
|
698
890
|
if (ccw === true) {
|
|
699
891
|
v0 = lp.getVector();
|
|
700
892
|
v1 = lp.getVector();
|
|
@@ -705,33 +897,41 @@ class LDrawParsedCache {
|
|
|
705
897
|
v2 = lp.getVector();
|
|
706
898
|
v1 = lp.getVector();
|
|
707
899
|
v0 = lp.getVector();
|
|
708
|
-
}
|
|
900
|
+
} // specifically place the triangle diagonal in the v0 and v1 slots so we can
|
|
901
|
+
// account for the doubling of vertices later when smoothing normals.
|
|
902
|
+
|
|
903
|
+
|
|
709
904
|
faces.push({
|
|
710
|
-
material,
|
|
711
|
-
colorCode,
|
|
905
|
+
material: material,
|
|
906
|
+
colorCode: colorCode,
|
|
712
907
|
faceNormal: null,
|
|
713
908
|
vertices: [v0, v1, v2, v3],
|
|
714
909
|
normals: [null, null, null, null]
|
|
715
910
|
});
|
|
716
911
|
totalFaces += 2;
|
|
912
|
+
|
|
717
913
|
if (doubleSided === true) {
|
|
718
914
|
faces.push({
|
|
719
|
-
material,
|
|
720
|
-
colorCode,
|
|
915
|
+
material: material,
|
|
916
|
+
colorCode: colorCode,
|
|
721
917
|
faceNormal: null,
|
|
722
918
|
vertices: [v3, v2, v1, v0],
|
|
723
919
|
normals: [null, null, null, null]
|
|
724
920
|
});
|
|
725
921
|
totalFaces += 2;
|
|
726
922
|
}
|
|
923
|
+
|
|
727
924
|
break;
|
|
925
|
+
|
|
728
926
|
default:
|
|
729
|
-
throw new Error('LDrawLoader: Unknown line type "' + lineType + '"' + lp.getLineNumberString() +
|
|
927
|
+
throw new Error('LDrawLoader: Unknown line type "' + lineType + '"' + lp.getLineNumberString() + '.');
|
|
730
928
|
}
|
|
731
929
|
}
|
|
930
|
+
|
|
732
931
|
if (parsingEmbeddedFiles) {
|
|
733
932
|
this.setData(currentEmbeddedFileName, currentEmbeddedText);
|
|
734
933
|
}
|
|
934
|
+
|
|
735
935
|
return {
|
|
736
936
|
faces,
|
|
737
937
|
conditionalSegments,
|
|
@@ -746,114 +946,155 @@ class LDrawParsedCache {
|
|
|
746
946
|
fileName,
|
|
747
947
|
group: null
|
|
748
948
|
};
|
|
749
|
-
}
|
|
949
|
+
} // returns an (optionally cloned) instance of the data
|
|
950
|
+
|
|
951
|
+
|
|
750
952
|
getData(fileName, clone = true) {
|
|
751
953
|
const key = fileName.toLowerCase();
|
|
752
954
|
const result = this._cache[key];
|
|
955
|
+
|
|
753
956
|
if (result === null || result instanceof Promise) {
|
|
754
957
|
return null;
|
|
755
958
|
}
|
|
959
|
+
|
|
756
960
|
if (clone) {
|
|
757
961
|
return this.cloneResult(result);
|
|
758
962
|
} else {
|
|
759
963
|
return result;
|
|
760
964
|
}
|
|
761
|
-
}
|
|
965
|
+
} // kicks off a fetch and parse of the requested data if it hasn't already been loaded. Returns when
|
|
966
|
+
// the data is ready to use and can be retrieved synchronously with "getData".
|
|
967
|
+
|
|
968
|
+
|
|
762
969
|
async ensureDataLoaded(fileName) {
|
|
763
970
|
const key = fileName.toLowerCase();
|
|
971
|
+
|
|
764
972
|
if (!(key in this._cache)) {
|
|
765
|
-
|
|
973
|
+
// replace the promise with a copy of the parsed data for immediate processing
|
|
974
|
+
this._cache[key] = this.fetchData(fileName).then(text => {
|
|
766
975
|
const info = this.parse(text, fileName);
|
|
767
976
|
this._cache[key] = info;
|
|
768
977
|
return info;
|
|
769
978
|
});
|
|
770
979
|
}
|
|
980
|
+
|
|
771
981
|
await this._cache[key];
|
|
772
|
-
}
|
|
982
|
+
} // sets the data in the cache from parsed data
|
|
983
|
+
|
|
984
|
+
|
|
773
985
|
setData(fileName, text) {
|
|
774
986
|
const key = fileName.toLowerCase();
|
|
775
987
|
this._cache[key] = this.parse(text, fileName);
|
|
776
988
|
}
|
|
777
|
-
|
|
989
|
+
|
|
990
|
+
} // returns the material for an associated color code. If the color code is 16 for a face or 24 for
|
|
991
|
+
// an edge then the passthroughColorCode is used.
|
|
992
|
+
|
|
993
|
+
|
|
778
994
|
function getMaterialFromCode(colorCode, parentColorCode, materialHierarchy, forEdge) {
|
|
779
995
|
const isPassthrough = !forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;
|
|
996
|
+
|
|
780
997
|
if (isPassthrough) {
|
|
781
998
|
colorCode = parentColorCode;
|
|
782
999
|
}
|
|
1000
|
+
|
|
783
1001
|
return materialHierarchy[colorCode] || null;
|
|
784
|
-
}
|
|
1002
|
+
} // Class used to parse and build LDraw parts as three.js objects and cache them if they're a "Part" type.
|
|
1003
|
+
|
|
1004
|
+
|
|
785
1005
|
class LDrawPartsGeometryCache {
|
|
786
1006
|
constructor(loader) {
|
|
787
1007
|
this.loader = loader;
|
|
788
1008
|
this.parseCache = new LDrawParsedCache(loader);
|
|
789
1009
|
this._cache = {};
|
|
790
|
-
}
|
|
1010
|
+
} // Convert the given file information into a mesh by processing subobjects.
|
|
1011
|
+
|
|
1012
|
+
|
|
791
1013
|
async processIntoMesh(info) {
|
|
792
1014
|
const loader = this.loader;
|
|
793
1015
|
const parseCache = this.parseCache;
|
|
794
|
-
const faceMaterials =
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
1016
|
+
const faceMaterials = new Set(); // Processes the part subobject information to load child parts and merge geometry onto part
|
|
1017
|
+
// piece object.
|
|
1018
|
+
|
|
1019
|
+
const processInfoSubobjects = async (info, subobject = null) => {
|
|
1020
|
+
const subobjects = info.subobjects;
|
|
1021
|
+
const promises = []; // Trigger load of all subobjects. If a subobject isn't a primitive then load it as a separate
|
|
1022
|
+
// group which lets instruction steps apply correctly.
|
|
1023
|
+
|
|
798
1024
|
for (let i = 0, l = subobjects.length; i < l; i++) {
|
|
799
|
-
const
|
|
800
|
-
const promise = parseCache.ensureDataLoaded(
|
|
801
|
-
const subobjectInfo = parseCache.getData(
|
|
1025
|
+
const subobject = subobjects[i];
|
|
1026
|
+
const promise = parseCache.ensureDataLoaded(subobject.fileName).then(() => {
|
|
1027
|
+
const subobjectInfo = parseCache.getData(subobject.fileName, false);
|
|
1028
|
+
|
|
802
1029
|
if (!isPrimitiveType(subobjectInfo.type)) {
|
|
803
|
-
return this.loadModel(
|
|
1030
|
+
return this.loadModel(subobject.fileName).catch(error => {
|
|
804
1031
|
console.warn(error);
|
|
805
1032
|
return null;
|
|
806
1033
|
});
|
|
807
1034
|
}
|
|
808
|
-
|
|
1035
|
+
|
|
1036
|
+
return processInfoSubobjects(parseCache.getData(subobject.fileName), subobject);
|
|
809
1037
|
});
|
|
810
1038
|
promises.push(promise);
|
|
811
1039
|
}
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
1040
|
+
|
|
1041
|
+
const group = new Group();
|
|
1042
|
+
group.userData.category = info.category;
|
|
1043
|
+
group.userData.keywords = info.keywords;
|
|
1044
|
+
info.group = group;
|
|
816
1045
|
const subobjectInfos = await Promise.all(promises);
|
|
1046
|
+
|
|
817
1047
|
for (let i = 0, l = subobjectInfos.length; i < l; i++) {
|
|
818
|
-
const
|
|
1048
|
+
const subobject = info.subobjects[i];
|
|
819
1049
|
const subobjectInfo = subobjectInfos[i];
|
|
1050
|
+
|
|
820
1051
|
if (subobjectInfo === null) {
|
|
1052
|
+
// the subobject failed to load
|
|
821
1053
|
continue;
|
|
822
|
-
}
|
|
1054
|
+
} // if the subobject was loaded as a separate group then apply the parent scopes materials
|
|
1055
|
+
|
|
1056
|
+
|
|
823
1057
|
if (subobjectInfo.isGroup) {
|
|
824
1058
|
const subobjectGroup = subobjectInfo;
|
|
825
|
-
|
|
826
|
-
subobjectGroup.userData.startingConstructionStep =
|
|
827
|
-
subobjectGroup.name =
|
|
828
|
-
loader.applyMaterialsToMesh(subobjectGroup,
|
|
829
|
-
|
|
1059
|
+
subobject.matrix.decompose(subobjectGroup.position, subobjectGroup.quaternion, subobjectGroup.scale);
|
|
1060
|
+
subobjectGroup.userData.startingConstructionStep = subobject.startingConstructionStep;
|
|
1061
|
+
subobjectGroup.name = subobject.fileName;
|
|
1062
|
+
loader.applyMaterialsToMesh(subobjectGroup, subobject.colorCode, info.materials);
|
|
1063
|
+
group.add(subobjectGroup);
|
|
830
1064
|
continue;
|
|
831
|
-
}
|
|
1065
|
+
} // add the subobject group if it has children in case it has both children and primitives
|
|
1066
|
+
|
|
1067
|
+
|
|
832
1068
|
if (subobjectInfo.group.children.length) {
|
|
833
|
-
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
1069
|
+
group.add(subobjectInfo.group);
|
|
1070
|
+
} // transform the primitives into the local space of the parent piece and append them to
|
|
1071
|
+
// to the parent primitives list.
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
const parentLineSegments = info.lineSegments;
|
|
1075
|
+
const parentConditionalSegments = info.conditionalSegments;
|
|
1076
|
+
const parentFaces = info.faces;
|
|
838
1077
|
const lineSegments = subobjectInfo.lineSegments;
|
|
839
1078
|
const conditionalSegments = subobjectInfo.conditionalSegments;
|
|
840
1079
|
const faces = subobjectInfo.faces;
|
|
841
|
-
const matrix =
|
|
842
|
-
const inverted =
|
|
1080
|
+
const matrix = subobject.matrix;
|
|
1081
|
+
const inverted = subobject.inverted;
|
|
843
1082
|
const matrixScaleInverted = matrix.determinant() < 0;
|
|
844
|
-
const colorCode =
|
|
1083
|
+
const colorCode = subobject.colorCode;
|
|
845
1084
|
const lineColorCode = colorCode === MAIN_COLOUR_CODE ? MAIN_EDGE_COLOUR_CODE : colorCode;
|
|
846
|
-
|
|
847
|
-
|
|
1085
|
+
|
|
1086
|
+
for (let i = 0, l = lineSegments.length; i < l; i++) {
|
|
1087
|
+
const ls = lineSegments[i];
|
|
848
1088
|
const vertices = ls.vertices;
|
|
849
1089
|
vertices[0].applyMatrix4(matrix);
|
|
850
1090
|
vertices[1].applyMatrix4(matrix);
|
|
851
1091
|
ls.colorCode = ls.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : ls.colorCode;
|
|
852
|
-
ls.material = ls.material || getMaterialFromCode(ls.colorCode, ls.colorCode,
|
|
1092
|
+
ls.material = ls.material || getMaterialFromCode(ls.colorCode, ls.colorCode, info.materials, true);
|
|
853
1093
|
parentLineSegments.push(ls);
|
|
854
1094
|
}
|
|
855
|
-
|
|
856
|
-
|
|
1095
|
+
|
|
1096
|
+
for (let i = 0, l = conditionalSegments.length; i < l; i++) {
|
|
1097
|
+
const os = conditionalSegments[i];
|
|
857
1098
|
const vertices = os.vertices;
|
|
858
1099
|
const controlPoints = os.controlPoints;
|
|
859
1100
|
vertices[0].applyMatrix4(matrix);
|
|
@@ -861,54 +1102,77 @@ class LDrawPartsGeometryCache {
|
|
|
861
1102
|
controlPoints[0].applyMatrix4(matrix);
|
|
862
1103
|
controlPoints[1].applyMatrix4(matrix);
|
|
863
1104
|
os.colorCode = os.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : os.colorCode;
|
|
864
|
-
os.material = os.material || getMaterialFromCode(os.colorCode, os.colorCode,
|
|
1105
|
+
os.material = os.material || getMaterialFromCode(os.colorCode, os.colorCode, info.materials, true);
|
|
865
1106
|
parentConditionalSegments.push(os);
|
|
866
1107
|
}
|
|
867
|
-
|
|
868
|
-
|
|
1108
|
+
|
|
1109
|
+
for (let i = 0, l = faces.length; i < l; i++) {
|
|
1110
|
+
const tri = faces[i];
|
|
869
1111
|
const vertices = tri.vertices;
|
|
870
|
-
|
|
871
|
-
|
|
1112
|
+
|
|
1113
|
+
for (let i = 0, l = vertices.length; i < l; i++) {
|
|
1114
|
+
vertices[i].applyMatrix4(matrix);
|
|
872
1115
|
}
|
|
1116
|
+
|
|
873
1117
|
tri.colorCode = tri.colorCode === MAIN_COLOUR_CODE ? colorCode : tri.colorCode;
|
|
874
|
-
tri.material = tri.material || getMaterialFromCode(tri.colorCode, colorCode,
|
|
875
|
-
faceMaterials.add(tri.colorCode);
|
|
1118
|
+
tri.material = tri.material || getMaterialFromCode(tri.colorCode, colorCode, info.materials, false);
|
|
1119
|
+
faceMaterials.add(tri.colorCode); // If the scale of the object is negated then the triangle winding order
|
|
1120
|
+
// needs to be flipped.
|
|
1121
|
+
|
|
876
1122
|
if (matrixScaleInverted !== inverted) {
|
|
877
1123
|
vertices.reverse();
|
|
878
1124
|
}
|
|
1125
|
+
|
|
879
1126
|
parentFaces.push(tri);
|
|
880
1127
|
}
|
|
881
|
-
|
|
882
|
-
|
|
1128
|
+
|
|
1129
|
+
info.totalFaces += subobjectInfo.totalFaces;
|
|
1130
|
+
} // Apply the parent subobjects pass through material code to this object. This is done several times due
|
|
1131
|
+
// to material scoping.
|
|
1132
|
+
|
|
1133
|
+
|
|
883
1134
|
if (subobject) {
|
|
884
|
-
loader.applyMaterialsToMesh(
|
|
1135
|
+
loader.applyMaterialsToMesh(group, subobject.colorCode, info.materials);
|
|
885
1136
|
}
|
|
886
|
-
|
|
887
|
-
|
|
1137
|
+
|
|
1138
|
+
return info;
|
|
1139
|
+
}; // Track material use to see if we need to use the normal smooth slow path for hard edges.
|
|
1140
|
+
|
|
1141
|
+
|
|
888
1142
|
for (let i = 0, l = info.faces; i < l; i++) {
|
|
889
1143
|
faceMaterials.add(info.faces[i].colorCode);
|
|
890
1144
|
}
|
|
1145
|
+
|
|
891
1146
|
await processInfoSubobjects(info);
|
|
1147
|
+
|
|
892
1148
|
if (loader.smoothNormals) {
|
|
893
1149
|
const checkSubSegments = faceMaterials.size > 1;
|
|
894
1150
|
generateFaceNormals(info.faces);
|
|
895
1151
|
smoothNormals(info.faces, info.lineSegments, checkSubSegments);
|
|
896
|
-
}
|
|
1152
|
+
} // Add the primitive objects and metadata.
|
|
1153
|
+
|
|
1154
|
+
|
|
897
1155
|
const group = info.group;
|
|
1156
|
+
|
|
898
1157
|
if (info.faces.length > 0) {
|
|
899
1158
|
group.add(createObject(info.faces, 3, false, info.totalFaces));
|
|
900
1159
|
}
|
|
1160
|
+
|
|
901
1161
|
if (info.lineSegments.length > 0) {
|
|
902
1162
|
group.add(createObject(info.lineSegments, 2));
|
|
903
1163
|
}
|
|
1164
|
+
|
|
904
1165
|
if (info.conditionalSegments.length > 0) {
|
|
905
1166
|
group.add(createObject(info.conditionalSegments, 2, true));
|
|
906
1167
|
}
|
|
1168
|
+
|
|
907
1169
|
return group;
|
|
908
1170
|
}
|
|
1171
|
+
|
|
909
1172
|
hasCachedModel(fileName) {
|
|
910
1173
|
return fileName !== null && fileName.toLowerCase() in this._cache;
|
|
911
1174
|
}
|
|
1175
|
+
|
|
912
1176
|
async getCachedModel(fileName) {
|
|
913
1177
|
if (fileName !== null && this.hasCachedModel(fileName)) {
|
|
914
1178
|
const key = fileName.toLowerCase();
|
|
@@ -917,61 +1181,90 @@ class LDrawPartsGeometryCache {
|
|
|
917
1181
|
} else {
|
|
918
1182
|
return null;
|
|
919
1183
|
}
|
|
920
|
-
}
|
|
1184
|
+
} // Loads and parses the model with the given file name. Returns a cached copy if available.
|
|
1185
|
+
|
|
1186
|
+
|
|
921
1187
|
async loadModel(fileName) {
|
|
922
1188
|
const parseCache = this.parseCache;
|
|
923
1189
|
const key = fileName.toLowerCase();
|
|
1190
|
+
|
|
924
1191
|
if (this.hasCachedModel(fileName)) {
|
|
1192
|
+
// Return cached model if available.
|
|
925
1193
|
return this.getCachedModel(fileName);
|
|
926
1194
|
} else {
|
|
1195
|
+
// Otherwise parse a new model.
|
|
1196
|
+
// Ensure the file data is loaded and pre parsed.
|
|
927
1197
|
await parseCache.ensureDataLoaded(fileName);
|
|
928
1198
|
const info = parseCache.getData(fileName);
|
|
929
|
-
const promise = this.processIntoMesh(info);
|
|
1199
|
+
const promise = this.processIntoMesh(info); // Now that the file has loaded it's possible that another part parse has been waiting in parallel
|
|
1200
|
+
// so check the cache again to see if it's been added since the last async operation so we don't
|
|
1201
|
+
// do unnecessary work.
|
|
1202
|
+
|
|
930
1203
|
if (this.hasCachedModel(fileName)) {
|
|
931
1204
|
return this.getCachedModel(fileName);
|
|
932
|
-
}
|
|
1205
|
+
} // Cache object if it's a part so it can be reused later.
|
|
1206
|
+
|
|
1207
|
+
|
|
933
1208
|
if (isPartType(info.type)) {
|
|
934
1209
|
this._cache[key] = promise;
|
|
935
|
-
}
|
|
1210
|
+
} // return a copy
|
|
1211
|
+
|
|
1212
|
+
|
|
936
1213
|
const group = await promise;
|
|
937
1214
|
return group.clone();
|
|
938
1215
|
}
|
|
939
|
-
}
|
|
1216
|
+
} // parses the given model text into a renderable object. Returns cached copy if available.
|
|
1217
|
+
|
|
1218
|
+
|
|
940
1219
|
async parseModel(text) {
|
|
941
1220
|
const parseCache = this.parseCache;
|
|
942
1221
|
const info = parseCache.parse(text);
|
|
1222
|
+
|
|
943
1223
|
if (isPartType(info.type) && this.hasCachedModel(info.fileName)) {
|
|
944
1224
|
return this.getCachedModel(info.fileName);
|
|
945
1225
|
}
|
|
1226
|
+
|
|
946
1227
|
return this.processIntoMesh(info);
|
|
947
1228
|
}
|
|
1229
|
+
|
|
948
1230
|
}
|
|
1231
|
+
|
|
949
1232
|
function sortByMaterial(a, b) {
|
|
950
1233
|
if (a.colorCode === b.colorCode) {
|
|
951
1234
|
return 0;
|
|
952
1235
|
}
|
|
1236
|
+
|
|
953
1237
|
if (a.colorCode < b.colorCode) {
|
|
954
1238
|
return -1;
|
|
955
1239
|
}
|
|
1240
|
+
|
|
956
1241
|
return 1;
|
|
957
1242
|
}
|
|
1243
|
+
|
|
958
1244
|
function createObject(elements, elementSize, isConditionalSegments = false, totalElements = null) {
|
|
1245
|
+
// Creates a LineSegments (elementSize = 2) or a Mesh (elementSize = 3 )
|
|
1246
|
+
// With per face / segment material, implemented with mesh groups and materials array
|
|
1247
|
+
// Sort the faces or line segments by color code to make later the mesh groups
|
|
959
1248
|
elements.sort(sortByMaterial);
|
|
1249
|
+
|
|
960
1250
|
if (totalElements === null) {
|
|
961
1251
|
totalElements = elements.length;
|
|
962
1252
|
}
|
|
1253
|
+
|
|
963
1254
|
const positions = new Float32Array(elementSize * totalElements * 3);
|
|
964
1255
|
const normals = elementSize === 3 ? new Float32Array(elementSize * totalElements * 3) : null;
|
|
965
1256
|
const materials = [];
|
|
966
1257
|
const quadArray = new Array(6);
|
|
967
|
-
const bufferGeometry = new
|
|
1258
|
+
const bufferGeometry = new BufferGeometry();
|
|
968
1259
|
let prevMaterial = null;
|
|
969
1260
|
let index0 = 0;
|
|
970
1261
|
let numGroupVerts = 0;
|
|
971
1262
|
let offset = 0;
|
|
1263
|
+
|
|
972
1264
|
for (let iElem = 0, nElem = elements.length; iElem < nElem; iElem++) {
|
|
973
1265
|
const elem = elements[iElem];
|
|
974
1266
|
let vertices = elem.vertices;
|
|
1267
|
+
|
|
975
1268
|
if (vertices.length === 4) {
|
|
976
1269
|
quadArray[0] = vertices[0];
|
|
977
1270
|
quadArray[1] = vertices[1];
|
|
@@ -981,23 +1274,31 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
|
|
|
981
1274
|
quadArray[5] = vertices[3];
|
|
982
1275
|
vertices = quadArray;
|
|
983
1276
|
}
|
|
1277
|
+
|
|
984
1278
|
for (let j = 0, l = vertices.length; j < l; j++) {
|
|
985
1279
|
const v = vertices[j];
|
|
986
1280
|
const index = offset + j * 3;
|
|
987
1281
|
positions[index + 0] = v.x;
|
|
988
1282
|
positions[index + 1] = v.y;
|
|
989
1283
|
positions[index + 2] = v.z;
|
|
990
|
-
}
|
|
1284
|
+
} // create the normals array if this is a set of faces
|
|
1285
|
+
|
|
1286
|
+
|
|
991
1287
|
if (elementSize === 3) {
|
|
992
1288
|
if (!elem.faceNormal) {
|
|
993
1289
|
const v0 = vertices[0];
|
|
994
1290
|
const v1 = vertices[1];
|
|
995
1291
|
const v2 = vertices[2];
|
|
1292
|
+
|
|
996
1293
|
_tempVec0.subVectors(v1, v0);
|
|
1294
|
+
|
|
997
1295
|
_tempVec1.subVectors(v2, v1);
|
|
998
|
-
|
|
1296
|
+
|
|
1297
|
+
elem.faceNormal = new Vector3().crossVectors(_tempVec0, _tempVec1).normalize();
|
|
999
1298
|
}
|
|
1299
|
+
|
|
1000
1300
|
let elemNormals = elem.normals;
|
|
1301
|
+
|
|
1001
1302
|
if (elemNormals.length === 4) {
|
|
1002
1303
|
quadArray[0] = elemNormals[0];
|
|
1003
1304
|
quadArray[1] = elemNormals[1];
|
|
@@ -1007,22 +1308,29 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
|
|
|
1007
1308
|
quadArray[5] = elemNormals[3];
|
|
1008
1309
|
elemNormals = quadArray;
|
|
1009
1310
|
}
|
|
1311
|
+
|
|
1010
1312
|
for (let j = 0, l = elemNormals.length; j < l; j++) {
|
|
1313
|
+
// use face normal if a vertex normal is not provided
|
|
1011
1314
|
let n = elem.faceNormal;
|
|
1315
|
+
|
|
1012
1316
|
if (elemNormals[j]) {
|
|
1013
1317
|
n = elemNormals[j].norm;
|
|
1014
1318
|
}
|
|
1319
|
+
|
|
1015
1320
|
const index = offset + j * 3;
|
|
1016
1321
|
normals[index + 0] = n.x;
|
|
1017
1322
|
normals[index + 1] = n.y;
|
|
1018
1323
|
normals[index + 2] = n.z;
|
|
1019
1324
|
}
|
|
1020
1325
|
}
|
|
1326
|
+
|
|
1021
1327
|
if (prevMaterial !== elem.colorCode) {
|
|
1022
1328
|
if (prevMaterial !== null) {
|
|
1023
1329
|
bufferGeometry.addGroup(index0, numGroupVerts, materials.length - 1);
|
|
1024
1330
|
}
|
|
1331
|
+
|
|
1025
1332
|
const material = elem.material;
|
|
1333
|
+
|
|
1026
1334
|
if (material !== null) {
|
|
1027
1335
|
if (elementSize === 3) {
|
|
1028
1336
|
materials.push(material);
|
|
@@ -1038,38 +1346,49 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
|
|
|
1038
1346
|
}
|
|
1039
1347
|
}
|
|
1040
1348
|
} else {
|
|
1349
|
+
// If a material has not been made available yet then keep the color code string in the material array
|
|
1350
|
+
// to save the spot for the material once a parent scopes materials are being applied to the object.
|
|
1041
1351
|
materials.push(elem.colorCode);
|
|
1042
1352
|
}
|
|
1353
|
+
|
|
1043
1354
|
prevMaterial = elem.colorCode;
|
|
1044
1355
|
index0 = offset / 3;
|
|
1045
1356
|
numGroupVerts = vertices.length;
|
|
1046
1357
|
} else {
|
|
1047
1358
|
numGroupVerts += vertices.length;
|
|
1048
1359
|
}
|
|
1360
|
+
|
|
1049
1361
|
offset += 3 * vertices.length;
|
|
1050
1362
|
}
|
|
1363
|
+
|
|
1051
1364
|
if (numGroupVerts > 0) {
|
|
1052
1365
|
bufferGeometry.addGroup(index0, Infinity, materials.length - 1);
|
|
1053
1366
|
}
|
|
1054
|
-
|
|
1367
|
+
|
|
1368
|
+
bufferGeometry.setAttribute('position', new BufferAttribute(positions, 3));
|
|
1369
|
+
|
|
1055
1370
|
if (normals !== null) {
|
|
1056
|
-
bufferGeometry.setAttribute(
|
|
1371
|
+
bufferGeometry.setAttribute('normal', new BufferAttribute(normals, 3));
|
|
1057
1372
|
}
|
|
1373
|
+
|
|
1058
1374
|
let object3d = null;
|
|
1375
|
+
|
|
1059
1376
|
if (elementSize === 2) {
|
|
1060
1377
|
if (isConditionalSegments) {
|
|
1061
1378
|
object3d = new ConditionalLineSegments(bufferGeometry, materials.length === 1 ? materials[0] : materials);
|
|
1062
1379
|
} else {
|
|
1063
|
-
object3d = new
|
|
1380
|
+
object3d = new LineSegments(bufferGeometry, materials.length === 1 ? materials[0] : materials);
|
|
1064
1381
|
}
|
|
1065
1382
|
} else if (elementSize === 3) {
|
|
1066
|
-
object3d = new
|
|
1383
|
+
object3d = new Mesh(bufferGeometry, materials.length === 1 ? materials[0] : materials);
|
|
1067
1384
|
}
|
|
1385
|
+
|
|
1068
1386
|
if (isConditionalSegments) {
|
|
1069
1387
|
object3d.isConditionalLine = true;
|
|
1070
1388
|
const controlArray0 = new Float32Array(elements.length * 3 * 2);
|
|
1071
1389
|
const controlArray1 = new Float32Array(elements.length * 3 * 2);
|
|
1072
1390
|
const directionArray = new Float32Array(elements.length * 3 * 2);
|
|
1391
|
+
|
|
1073
1392
|
for (let i = 0, l = elements.length; i < l; i++) {
|
|
1074
1393
|
const os = elements[i];
|
|
1075
1394
|
const vertices = os.vertices;
|
|
@@ -1098,29 +1417,41 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
|
|
|
1098
1417
|
directionArray[index + 4] = v1.y - v0.y;
|
|
1099
1418
|
directionArray[index + 5] = v1.z - v0.z;
|
|
1100
1419
|
}
|
|
1101
|
-
|
|
1102
|
-
bufferGeometry.setAttribute(
|
|
1103
|
-
bufferGeometry.setAttribute(
|
|
1420
|
+
|
|
1421
|
+
bufferGeometry.setAttribute('control0', new BufferAttribute(controlArray0, 3, false));
|
|
1422
|
+
bufferGeometry.setAttribute('control1', new BufferAttribute(controlArray1, 3, false));
|
|
1423
|
+
bufferGeometry.setAttribute('direction', new BufferAttribute(directionArray, 3, false));
|
|
1104
1424
|
}
|
|
1425
|
+
|
|
1105
1426
|
return object3d;
|
|
1106
|
-
}
|
|
1107
|
-
|
|
1427
|
+
} //
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
class LDrawLoader extends Loader {
|
|
1108
1431
|
constructor(manager) {
|
|
1109
|
-
super(manager);
|
|
1432
|
+
super(manager); // Array of THREE.Material
|
|
1433
|
+
|
|
1110
1434
|
this.materials = [];
|
|
1111
|
-
this.materialLibrary = {};
|
|
1112
|
-
|
|
1113
|
-
this.
|
|
1114
|
-
|
|
1115
|
-
this.
|
|
1116
|
-
|
|
1435
|
+
this.materialLibrary = {}; // This also allows to handle the embedded text files ("0 FILE" lines)
|
|
1436
|
+
|
|
1437
|
+
this.partsCache = new LDrawPartsGeometryCache(this); // This object is a map from file names to paths. It agilizes the paths search. If it is not set then files will be searched by trial and error.
|
|
1438
|
+
|
|
1439
|
+
this.fileMap = {}; // Initializes the materials library with default materials
|
|
1440
|
+
|
|
1441
|
+
this.setMaterials([]); // If this flag is set to true the vertex normals will be smoothed.
|
|
1442
|
+
|
|
1443
|
+
this.smoothNormals = true; // The path to load parts from the LDraw parts library from.
|
|
1444
|
+
|
|
1445
|
+
this.partsLibraryPath = '';
|
|
1117
1446
|
}
|
|
1447
|
+
|
|
1118
1448
|
setPartsLibraryPath(path) {
|
|
1119
1449
|
this.partsLibraryPath = path;
|
|
1120
1450
|
return this;
|
|
1121
1451
|
}
|
|
1452
|
+
|
|
1122
1453
|
async preloadMaterials(url) {
|
|
1123
|
-
const fileLoader = new
|
|
1454
|
+
const fileLoader = new FileLoader(this.manager);
|
|
1124
1455
|
fileLoader.setPath(this.path);
|
|
1125
1456
|
fileLoader.setRequestHeader(this.requestHeader);
|
|
1126
1457
|
fileLoader.setWithCredentials(this.withCredentials);
|
|
@@ -1128,75 +1459,89 @@ class LDrawLoader extends THREE.Loader {
|
|
|
1128
1459
|
const colorLineRegex = /^0 !COLOUR/;
|
|
1129
1460
|
const lines = text.split(/[\n\r]/g);
|
|
1130
1461
|
const materials = [];
|
|
1462
|
+
|
|
1131
1463
|
for (let i = 0, l = lines.length; i < l; i++) {
|
|
1132
1464
|
const line = lines[i];
|
|
1465
|
+
|
|
1133
1466
|
if (colorLineRegex.test(line)) {
|
|
1134
|
-
const directive = line.replace(colorLineRegex,
|
|
1467
|
+
const directive = line.replace(colorLineRegex, '');
|
|
1135
1468
|
const material = this.parseColorMetaDirective(new LineParser(directive));
|
|
1136
1469
|
materials.push(material);
|
|
1137
1470
|
}
|
|
1138
1471
|
}
|
|
1472
|
+
|
|
1139
1473
|
this.setMaterials(materials);
|
|
1140
1474
|
}
|
|
1475
|
+
|
|
1141
1476
|
load(url, onLoad, onProgress, onError) {
|
|
1142
|
-
const fileLoader = new
|
|
1477
|
+
const fileLoader = new FileLoader(this.manager);
|
|
1143
1478
|
fileLoader.setPath(this.path);
|
|
1144
1479
|
fileLoader.setRequestHeader(this.requestHeader);
|
|
1145
1480
|
fileLoader.setWithCredentials(this.withCredentials);
|
|
1146
|
-
fileLoader.load(
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
this.
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
}).catch(onError);
|
|
1154
|
-
},
|
|
1155
|
-
onProgress,
|
|
1156
|
-
onError
|
|
1157
|
-
);
|
|
1481
|
+
fileLoader.load(url, text => {
|
|
1482
|
+
this.partsCache.parseModel(text, this.materialLibrary).then(group => {
|
|
1483
|
+
this.applyMaterialsToMesh(group, MAIN_COLOUR_CODE, this.materialLibrary, true);
|
|
1484
|
+
this.computeConstructionSteps(group);
|
|
1485
|
+
onLoad(group);
|
|
1486
|
+
}).catch(onError);
|
|
1487
|
+
}, onProgress, onError);
|
|
1158
1488
|
}
|
|
1489
|
+
|
|
1159
1490
|
parse(text, onLoad) {
|
|
1160
|
-
this.partsCache.parseModel(text, this.materialLibrary).then(
|
|
1491
|
+
this.partsCache.parseModel(text, this.materialLibrary).then(group => {
|
|
1161
1492
|
this.computeConstructionSteps(group);
|
|
1162
1493
|
onLoad(group);
|
|
1163
1494
|
});
|
|
1164
1495
|
}
|
|
1496
|
+
|
|
1165
1497
|
setMaterials(materials) {
|
|
1166
1498
|
this.materialLibrary = {};
|
|
1167
1499
|
this.materials = [];
|
|
1500
|
+
|
|
1168
1501
|
for (let i = 0, l = materials.length; i < l; i++) {
|
|
1169
1502
|
this.addMaterial(materials[i]);
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
|
-
|
|
1503
|
+
} // Add default main triangle and line edge materials (used in pieces that can be colored with a main color)
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
this.addMaterial(this.parseColorMetaDirective(new LineParser('Main_Colour CODE 16 VALUE #FF8080 EDGE #333333')));
|
|
1507
|
+
this.addMaterial(this.parseColorMetaDirective(new LineParser('Edge_Colour CODE 24 VALUE #A0A0A0 EDGE #333333')));
|
|
1173
1508
|
return this;
|
|
1174
1509
|
}
|
|
1510
|
+
|
|
1175
1511
|
setFileMap(fileMap) {
|
|
1176
1512
|
this.fileMap = fileMap;
|
|
1177
1513
|
return this;
|
|
1178
1514
|
}
|
|
1515
|
+
|
|
1179
1516
|
addMaterial(material) {
|
|
1517
|
+
// Adds a material to the material library which is on top of the parse scopes stack. And also to the materials array
|
|
1180
1518
|
const matLib = this.materialLibrary;
|
|
1519
|
+
|
|
1181
1520
|
if (!matLib[material.userData.code]) {
|
|
1182
1521
|
this.materials.push(material);
|
|
1183
1522
|
matLib[material.userData.code] = material;
|
|
1184
1523
|
}
|
|
1524
|
+
|
|
1185
1525
|
return this;
|
|
1186
1526
|
}
|
|
1527
|
+
|
|
1187
1528
|
getMaterial(colorCode) {
|
|
1188
|
-
if (colorCode.startsWith(
|
|
1529
|
+
if (colorCode.startsWith('0x2')) {
|
|
1530
|
+
// Special 'direct' material value (RGB color)
|
|
1189
1531
|
const color = colorCode.substring(3);
|
|
1190
|
-
return this.parseColorMetaDirective(
|
|
1191
|
-
new LineParser("Direct_Color_" + color + " CODE -1 VALUE #" + color + " EDGE #" + color)
|
|
1192
|
-
);
|
|
1532
|
+
return this.parseColorMetaDirective(new LineParser('Direct_Color_' + color + ' CODE -1 VALUE #' + color + ' EDGE #' + color + ''));
|
|
1193
1533
|
}
|
|
1534
|
+
|
|
1194
1535
|
return this.materialLibrary[colorCode] || null;
|
|
1195
|
-
}
|
|
1536
|
+
} // Applies the appropriate materials to a prebuilt hierarchy of geometry. Assumes that color codes are present
|
|
1537
|
+
// in the material array if they need to be filled in.
|
|
1538
|
+
|
|
1539
|
+
|
|
1196
1540
|
applyMaterialsToMesh(group, parentColorCode, materialHierarchy, finalMaterialPass = false) {
|
|
1541
|
+
// find any missing materials as indicated by a color code string and replace it with a material from the current material lib
|
|
1197
1542
|
const loader = this;
|
|
1198
1543
|
const parentIsPassthrough = parentColorCode === MAIN_COLOUR_CODE;
|
|
1199
|
-
group.traverse(
|
|
1544
|
+
group.traverse(c => {
|
|
1200
1545
|
if (c.isMesh || c.isLineSegments) {
|
|
1201
1546
|
if (Array.isArray(c.material)) {
|
|
1202
1547
|
for (let i = 0, l = c.material.length; i < l; i++) {
|
|
@@ -1208,177 +1553,259 @@ class LDrawLoader extends THREE.Loader {
|
|
|
1208
1553
|
c.material = getMaterial(c, c.material);
|
|
1209
1554
|
}
|
|
1210
1555
|
}
|
|
1211
|
-
});
|
|
1556
|
+
}); // Returns the appropriate material for the object (line or face) given color code. If the code is "pass through"
|
|
1557
|
+
// (24 for lines, 16 for edges) then the pass through color code is used. If that is also pass through then it's
|
|
1558
|
+
// simply returned for the subsequent material application.
|
|
1559
|
+
|
|
1212
1560
|
function getMaterial(c, colorCode) {
|
|
1561
|
+
// if our parent is a passthrough color code and we don't have the current material color available then
|
|
1562
|
+
// return early.
|
|
1213
1563
|
if (parentIsPassthrough && !(colorCode in materialHierarchy) && !finalMaterialPass) {
|
|
1214
1564
|
return colorCode;
|
|
1215
1565
|
}
|
|
1566
|
+
|
|
1216
1567
|
const forEdge = c.isLineSegments || c.isConditionalLine;
|
|
1217
1568
|
const isPassthrough = !forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;
|
|
1569
|
+
|
|
1218
1570
|
if (isPassthrough) {
|
|
1219
1571
|
colorCode = parentColorCode;
|
|
1220
1572
|
}
|
|
1573
|
+
|
|
1221
1574
|
let material = null;
|
|
1575
|
+
|
|
1222
1576
|
if (colorCode in materialHierarchy) {
|
|
1223
1577
|
material = materialHierarchy[colorCode];
|
|
1224
1578
|
} else if (finalMaterialPass) {
|
|
1579
|
+
// see if we can get the final material from from the "getMaterial" function which will attempt to
|
|
1580
|
+
// parse the "direct" colors
|
|
1225
1581
|
material = loader.getMaterial(colorCode);
|
|
1582
|
+
|
|
1226
1583
|
if (material === null) {
|
|
1584
|
+
// otherwise throw an error if this is final opportunity to set the material
|
|
1227
1585
|
throw new Error(`LDrawLoader: Material properties for code ${colorCode} not available.`);
|
|
1228
1586
|
}
|
|
1229
1587
|
} else {
|
|
1230
1588
|
return colorCode;
|
|
1231
1589
|
}
|
|
1590
|
+
|
|
1232
1591
|
if (c.isLineSegments) {
|
|
1233
1592
|
material = material.userData.edgeMaterial;
|
|
1593
|
+
|
|
1234
1594
|
if (c.isConditionalLine) {
|
|
1235
1595
|
material = material.userData.conditionalEdgeMaterial;
|
|
1236
1596
|
}
|
|
1237
1597
|
}
|
|
1598
|
+
|
|
1238
1599
|
return material;
|
|
1239
1600
|
}
|
|
1240
1601
|
}
|
|
1602
|
+
|
|
1241
1603
|
getMainMaterial() {
|
|
1242
1604
|
return this.getMaterial(MAIN_COLOUR_CODE);
|
|
1243
1605
|
}
|
|
1606
|
+
|
|
1244
1607
|
getMainEdgeMaterial() {
|
|
1245
1608
|
return this.getMaterial(MAIN_EDGE_COLOUR_CODE);
|
|
1246
1609
|
}
|
|
1610
|
+
|
|
1247
1611
|
parseColorMetaDirective(lineParser) {
|
|
1248
|
-
|
|
1249
|
-
let
|
|
1250
|
-
|
|
1612
|
+
// Parses a color definition and returns a THREE.Material
|
|
1613
|
+
let code = null; // Triangle and line colors
|
|
1614
|
+
|
|
1615
|
+
let color = 0xff00ff;
|
|
1616
|
+
let edgeColor = 0xff00ff; // Transparency
|
|
1617
|
+
|
|
1251
1618
|
let alpha = 1;
|
|
1252
|
-
let isTransparent = false;
|
|
1619
|
+
let isTransparent = false; // Self-illumination:
|
|
1620
|
+
|
|
1253
1621
|
let luminance = 0;
|
|
1254
1622
|
let finishType = FINISH_TYPE_DEFAULT;
|
|
1255
1623
|
let edgeMaterial = null;
|
|
1256
1624
|
const name = lineParser.getToken();
|
|
1625
|
+
|
|
1257
1626
|
if (!name) {
|
|
1258
|
-
throw new Error(
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1627
|
+
throw new Error('LDrawLoader: Material name was expected after "!COLOUR tag' + lineParser.getLineNumberString() + '.');
|
|
1628
|
+
} // Parse tag tokens and their parameters
|
|
1629
|
+
|
|
1630
|
+
|
|
1262
1631
|
let token = null;
|
|
1632
|
+
|
|
1263
1633
|
while (true) {
|
|
1264
1634
|
token = lineParser.getToken();
|
|
1635
|
+
|
|
1265
1636
|
if (!token) {
|
|
1266
1637
|
break;
|
|
1267
1638
|
}
|
|
1639
|
+
|
|
1268
1640
|
switch (token.toUpperCase()) {
|
|
1269
|
-
case
|
|
1641
|
+
case 'CODE':
|
|
1270
1642
|
code = lineParser.getToken();
|
|
1271
1643
|
break;
|
|
1272
|
-
|
|
1644
|
+
|
|
1645
|
+
case 'VALUE':
|
|
1273
1646
|
color = lineParser.getToken();
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
);
|
|
1647
|
+
|
|
1648
|
+
if (color.startsWith('0x')) {
|
|
1649
|
+
color = '#' + color.substring(2);
|
|
1650
|
+
} else if (!color.startsWith('#')) {
|
|
1651
|
+
throw new Error('LDrawLoader: Invalid color while parsing material' + lineParser.getLineNumberString() + '.');
|
|
1280
1652
|
}
|
|
1653
|
+
|
|
1281
1654
|
break;
|
|
1282
|
-
|
|
1655
|
+
|
|
1656
|
+
case 'EDGE':
|
|
1283
1657
|
edgeColor = lineParser.getToken();
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1658
|
+
|
|
1659
|
+
if (edgeColor.startsWith('0x')) {
|
|
1660
|
+
edgeColor = '#' + edgeColor.substring(2);
|
|
1661
|
+
} else if (!edgeColor.startsWith('#')) {
|
|
1662
|
+
// Try to see if edge color is a color code
|
|
1287
1663
|
edgeMaterial = this.getMaterial(edgeColor);
|
|
1664
|
+
|
|
1288
1665
|
if (!edgeMaterial) {
|
|
1289
|
-
throw new Error(
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1666
|
+
throw new Error('LDrawLoader: Invalid edge color while parsing material' + lineParser.getLineNumberString() + '.');
|
|
1667
|
+
} // Get the edge material for this triangle material
|
|
1668
|
+
|
|
1669
|
+
|
|
1293
1670
|
edgeMaterial = edgeMaterial.userData.edgeMaterial;
|
|
1294
1671
|
}
|
|
1672
|
+
|
|
1295
1673
|
break;
|
|
1296
|
-
|
|
1674
|
+
|
|
1675
|
+
case 'ALPHA':
|
|
1297
1676
|
alpha = parseInt(lineParser.getToken());
|
|
1677
|
+
|
|
1298
1678
|
if (isNaN(alpha)) {
|
|
1299
|
-
throw new Error(
|
|
1300
|
-
"LDrawLoader: Invalid alpha value in material definition" + lineParser.getLineNumberString() + "."
|
|
1301
|
-
);
|
|
1679
|
+
throw new Error('LDrawLoader: Invalid alpha value in material definition' + lineParser.getLineNumberString() + '.');
|
|
1302
1680
|
}
|
|
1681
|
+
|
|
1303
1682
|
alpha = Math.max(0, Math.min(1, alpha / 255));
|
|
1683
|
+
|
|
1304
1684
|
if (alpha < 1) {
|
|
1305
1685
|
isTransparent = true;
|
|
1306
1686
|
}
|
|
1687
|
+
|
|
1307
1688
|
break;
|
|
1308
|
-
|
|
1689
|
+
|
|
1690
|
+
case 'LUMINANCE':
|
|
1309
1691
|
luminance = parseInt(lineParser.getToken());
|
|
1692
|
+
|
|
1310
1693
|
if (isNaN(luminance)) {
|
|
1311
|
-
throw new Error(
|
|
1312
|
-
"LDrawLoader: Invalid luminance value in material definition" + LineParser.getLineNumberString() + "."
|
|
1313
|
-
);
|
|
1694
|
+
throw new Error('LDrawLoader: Invalid luminance value in material definition' + LineParser.getLineNumberString() + '.');
|
|
1314
1695
|
}
|
|
1696
|
+
|
|
1315
1697
|
luminance = Math.max(0, Math.min(1, luminance / 255));
|
|
1316
1698
|
break;
|
|
1317
|
-
|
|
1699
|
+
|
|
1700
|
+
case 'CHROME':
|
|
1318
1701
|
finishType = FINISH_TYPE_CHROME;
|
|
1319
1702
|
break;
|
|
1320
|
-
|
|
1703
|
+
|
|
1704
|
+
case 'PEARLESCENT':
|
|
1321
1705
|
finishType = FINISH_TYPE_PEARLESCENT;
|
|
1322
1706
|
break;
|
|
1323
|
-
|
|
1707
|
+
|
|
1708
|
+
case 'RUBBER':
|
|
1324
1709
|
finishType = FINISH_TYPE_RUBBER;
|
|
1325
1710
|
break;
|
|
1326
|
-
|
|
1711
|
+
|
|
1712
|
+
case 'MATTE_METALLIC':
|
|
1327
1713
|
finishType = FINISH_TYPE_MATTE_METALLIC;
|
|
1328
1714
|
break;
|
|
1329
|
-
|
|
1715
|
+
|
|
1716
|
+
case 'METAL':
|
|
1330
1717
|
finishType = FINISH_TYPE_METAL;
|
|
1331
1718
|
break;
|
|
1332
|
-
|
|
1719
|
+
|
|
1720
|
+
case 'MATERIAL':
|
|
1721
|
+
// Not implemented
|
|
1333
1722
|
lineParser.setToEnd();
|
|
1334
1723
|
break;
|
|
1724
|
+
|
|
1335
1725
|
default:
|
|
1336
|
-
throw new Error(
|
|
1337
|
-
'LDrawLoader: Unknown token "' + token + '" while parsing material' + lineParser.getLineNumberString() + "."
|
|
1338
|
-
);
|
|
1726
|
+
throw new Error('LDrawLoader: Unknown token "' + token + '" while parsing material' + lineParser.getLineNumberString() + '.');
|
|
1339
1727
|
}
|
|
1340
1728
|
}
|
|
1729
|
+
|
|
1341
1730
|
let material = null;
|
|
1731
|
+
|
|
1342
1732
|
switch (finishType) {
|
|
1343
1733
|
case FINISH_TYPE_DEFAULT:
|
|
1344
|
-
material = new
|
|
1734
|
+
material = new MeshStandardMaterial({
|
|
1735
|
+
color: color,
|
|
1736
|
+
roughness: 0.3,
|
|
1737
|
+
metalness: 0
|
|
1738
|
+
});
|
|
1345
1739
|
break;
|
|
1740
|
+
|
|
1346
1741
|
case FINISH_TYPE_PEARLESCENT:
|
|
1347
|
-
|
|
1742
|
+
// Try to imitate pearlescency by making the surface glossy
|
|
1743
|
+
material = new MeshStandardMaterial({
|
|
1744
|
+
color: color,
|
|
1745
|
+
roughness: 0.3,
|
|
1746
|
+
metalness: 0.25
|
|
1747
|
+
});
|
|
1348
1748
|
break;
|
|
1749
|
+
|
|
1349
1750
|
case FINISH_TYPE_CHROME:
|
|
1350
|
-
|
|
1751
|
+
// Mirror finish surface
|
|
1752
|
+
material = new MeshStandardMaterial({
|
|
1753
|
+
color: color,
|
|
1754
|
+
roughness: 0,
|
|
1755
|
+
metalness: 1
|
|
1756
|
+
});
|
|
1351
1757
|
break;
|
|
1758
|
+
|
|
1352
1759
|
case FINISH_TYPE_RUBBER:
|
|
1353
|
-
|
|
1760
|
+
// Rubber finish
|
|
1761
|
+
material = new MeshStandardMaterial({
|
|
1762
|
+
color: color,
|
|
1763
|
+
roughness: 0.9,
|
|
1764
|
+
metalness: 0
|
|
1765
|
+
});
|
|
1354
1766
|
break;
|
|
1767
|
+
|
|
1355
1768
|
case FINISH_TYPE_MATTE_METALLIC:
|
|
1356
|
-
|
|
1769
|
+
// Brushed metal finish
|
|
1770
|
+
material = new MeshStandardMaterial({
|
|
1771
|
+
color: color,
|
|
1772
|
+
roughness: 0.8,
|
|
1773
|
+
metalness: 0.4
|
|
1774
|
+
});
|
|
1357
1775
|
break;
|
|
1776
|
+
|
|
1358
1777
|
case FINISH_TYPE_METAL:
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1778
|
+
// Average metal finish
|
|
1779
|
+
material = new MeshStandardMaterial({
|
|
1780
|
+
color: color,
|
|
1781
|
+
roughness: 0.2,
|
|
1782
|
+
metalness: 0.85
|
|
1783
|
+
});
|
|
1362
1784
|
break;
|
|
1363
1785
|
}
|
|
1786
|
+
|
|
1364
1787
|
material.transparent = isTransparent;
|
|
1365
1788
|
material.premultipliedAlpha = true;
|
|
1366
1789
|
material.opacity = alpha;
|
|
1367
1790
|
material.depthWrite = !isTransparent;
|
|
1368
1791
|
material.polygonOffset = true;
|
|
1369
1792
|
material.polygonOffsetFactor = 1;
|
|
1793
|
+
|
|
1370
1794
|
if (luminance !== 0) {
|
|
1371
1795
|
material.emissive.set(material.color).multiplyScalar(luminance);
|
|
1372
1796
|
}
|
|
1797
|
+
|
|
1373
1798
|
if (!edgeMaterial) {
|
|
1374
|
-
|
|
1799
|
+
// This is the material used for edges
|
|
1800
|
+
edgeMaterial = new LineBasicMaterial({
|
|
1375
1801
|
color: edgeColor,
|
|
1376
1802
|
transparent: isTransparent,
|
|
1377
1803
|
opacity: alpha,
|
|
1378
1804
|
depthWrite: !isTransparent
|
|
1379
1805
|
});
|
|
1380
1806
|
edgeMaterial.userData.code = code;
|
|
1381
|
-
edgeMaterial.name = name +
|
|
1807
|
+
edgeMaterial.name = name + ' - Edge'; // This is the material used for conditional edges
|
|
1808
|
+
|
|
1382
1809
|
edgeMaterial.userData.conditionalEdgeMaterial = new LDrawConditionalLineMaterial({
|
|
1383
1810
|
fog: true,
|
|
1384
1811
|
transparent: isTransparent,
|
|
@@ -1387,23 +1814,29 @@ class LDrawLoader extends THREE.Loader {
|
|
|
1387
1814
|
opacity: alpha
|
|
1388
1815
|
});
|
|
1389
1816
|
}
|
|
1817
|
+
|
|
1390
1818
|
material.userData.code = code;
|
|
1391
1819
|
material.name = name;
|
|
1392
1820
|
material.userData.edgeMaterial = edgeMaterial;
|
|
1393
1821
|
this.addMaterial(material);
|
|
1394
1822
|
return material;
|
|
1395
1823
|
}
|
|
1824
|
+
|
|
1396
1825
|
computeConstructionSteps(model) {
|
|
1826
|
+
// Sets userdata.constructionStep number in Group objects and userData.numConstructionSteps number in the root Group object.
|
|
1397
1827
|
let stepNumber = 0;
|
|
1398
|
-
model.traverse(
|
|
1828
|
+
model.traverse(c => {
|
|
1399
1829
|
if (c.isGroup) {
|
|
1400
1830
|
if (c.userData.startingConstructionStep) {
|
|
1401
1831
|
stepNumber++;
|
|
1402
1832
|
}
|
|
1833
|
+
|
|
1403
1834
|
c.userData.constructionStep = stepNumber;
|
|
1404
1835
|
}
|
|
1405
1836
|
});
|
|
1406
1837
|
model.userData.numConstructionSteps = stepNumber + 1;
|
|
1407
1838
|
}
|
|
1839
|
+
|
|
1408
1840
|
}
|
|
1409
|
-
|
|
1841
|
+
|
|
1842
|
+
export { LDrawLoader };
|