@needle-tools/three 0.145.4 → 0.146.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/README.md +1 -1
- package/build/three.cjs +32586 -35951
- package/build/three.js +32600 -35965
- package/build/three.min.js +6 -7
- package/build/three.module.js +1547 -1154
- package/examples/js/animation/AnimationClipCreator.js +0 -8
- package/examples/js/animation/CCDIKSolver.js +49 -66
- package/examples/js/animation/MMDAnimationHelper.js +66 -137
- package/examples/js/animation/MMDPhysics.js +70 -134
- package/examples/js/cameras/CinematicCamera.js +33 -22
- package/examples/js/controls/ArcballControls.js +138 -405
- package/examples/js/controls/DragControls.js +8 -33
- package/examples/js/controls/FirstPersonControls.js +32 -54
- package/examples/js/controls/FlyControls.js +29 -55
- package/examples/js/controls/OrbitControls.js +85 -95
- package/examples/js/controls/PointerLockControls.js +5 -14
- package/examples/js/controls/TrackballControls.js +33 -86
- package/examples/js/controls/TransformControls.js +84 -169
- package/examples/js/csm/CSM.js +4 -39
- package/examples/js/csm/CSMFrustum.js +3 -9
- package/examples/js/csm/CSMHelper.js +24 -4
- package/examples/js/csm/CSMShader.js +2 -6
- package/examples/js/curves/CurveExtras.js +27 -27
- package/examples/js/curves/NURBSCurve.js +4 -16
- package/examples/js/curves/NURBSSurface.js +3 -9
- package/examples/js/curves/NURBSUtils.js +8 -45
- package/examples/js/effects/AnaglyphEffect.js +4 -18
- package/examples/js/effects/AsciiEffect.js +32 -31
- package/examples/js/effects/OutlineEffect.js +26 -30
- package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
- package/examples/js/effects/PeppersGhostEffect.js +12 -39
- package/examples/js/effects/StereoEffect.js +0 -4
- package/examples/js/environments/RoomEnvironment.js +12 -10
- package/examples/js/exporters/ColladaExporter.js +48 -65
- package/examples/js/exporters/DRACOExporter.js +22 -22
- package/examples/js/exporters/EXRExporter.js +15 -18
- package/examples/js/exporters/GLTFExporter.js +143 -261
- package/examples/js/exporters/MMDExporter.js +5 -12
- package/examples/js/exporters/OBJExporter.js +42 -33
- package/examples/js/exporters/PLYExporter.js +38 -33
- package/examples/js/exporters/STLExporter.js +5 -7
- package/examples/js/exporters/USDZExporter.js +110 -25
- package/examples/js/geometries/BoxLineGeometry.js +0 -1
- package/examples/js/geometries/ConvexGeometry.js +11 -6
- package/examples/js/geometries/DecalGeometry.js +53 -20
- package/examples/js/geometries/LightningStrike.js +54 -67
- package/examples/js/geometries/ParametricGeometries.js +8 -7
- package/examples/js/geometries/ParametricGeometry.js +25 -12
- package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
- package/examples/js/geometries/TeapotGeometry.js +54 -50
- package/examples/js/geometries/TextGeometry.js +6 -4
- package/examples/js/helpers/LightProbeHelper.js +1 -2
- package/examples/js/helpers/OctreeHelper.js +22 -20
- package/examples/js/helpers/PositionalAudioHelper.js +8 -6
- package/examples/js/helpers/RectAreaLightHelper.js +6 -7
- package/examples/js/helpers/VertexNormalsHelper.js +15 -13
- package/examples/js/helpers/VertexTangentsHelper.js +15 -9
- package/examples/js/helpers/ViewHelper.js +31 -16
- package/examples/js/interactive/HTMLMesh.js +22 -33
- package/examples/js/interactive/InteractiveGroup.js +6 -12
- package/examples/js/interactive/SelectionBox.js +3 -70
- package/examples/js/interactive/SelectionHelper.js +0 -8
- package/examples/js/lights/LightProbeGenerator.js +32 -39
- package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
- package/examples/js/lines/LineGeometry.js +3 -5
- package/examples/js/lines/LineMaterial.js +4 -11
- package/examples/js/lines/LineSegments2.js +38 -89
- package/examples/js/lines/LineSegmentsGeometry.js +7 -28
- package/examples/js/lines/Wireframe.js +2 -7
- package/examples/js/lines/WireframeGeometry2.js +3 -1
- package/examples/js/loaders/3DMLoader.js +58 -155
- package/examples/js/loaders/3MFLoader.js +72 -106
- package/examples/js/loaders/AMFLoader.js +0 -25
- package/examples/js/loaders/BVHLoader.js +44 -43
- package/examples/js/loaders/BasisTextureLoader.js +16 -46
- package/examples/js/loaders/ColladaLoader.js +201 -359
- package/examples/js/loaders/DDSLoader.js +24 -25
- package/examples/js/loaders/DRACOLoader.js +29 -66
- package/examples/js/loaders/EXRLoader.js +67 -164
- package/examples/js/loaders/FBXLoader.js +286 -441
- package/examples/js/loaders/FontLoader.js +6 -15
- package/examples/js/loaders/GCodeLoader.js +15 -16
- package/examples/js/loaders/GLTFLoader.js +354 -405
- package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
- package/examples/js/loaders/KMZLoader.js +3 -7
- package/examples/js/loaders/KTXLoader.js +12 -30
- package/examples/js/loaders/LDrawLoader.js +178 -289
- package/examples/js/loaders/LUT3dlLoader.js +7 -11
- package/examples/js/loaders/LUTCubeLoader.js +0 -8
- package/examples/js/loaders/LWOLoader.js +59 -124
- package/examples/js/loaders/LogLuvLoader.js +27 -77
- package/examples/js/loaders/LottieLoader.js +4 -4
- package/examples/js/loaders/MD2Loader.js +26 -27
- package/examples/js/loaders/MDDLoader.js +6 -10
- package/examples/js/loaders/MMDLoader.js +180 -189
- package/examples/js/loaders/MTLLoader.js +18 -47
- package/examples/js/loaders/MaterialXLoader.js +392 -0
- package/examples/js/loaders/NRRDLoader.js +44 -84
- package/examples/js/loaders/OBJLoader.js +50 -65
- package/examples/js/loaders/PCDLoader.js +34 -29
- package/examples/js/loaders/PDBLoader.js +17 -13
- package/examples/js/loaders/PLYLoader.js +9 -39
- package/examples/js/loaders/PRWMLoader.js +11 -22
- package/examples/js/loaders/PVRLoader.js +7 -16
- package/examples/js/loaders/RGBELoader.js +36 -61
- package/examples/js/loaders/RGBMLoader.js +26 -87
- package/examples/js/loaders/STLLoader.js +20 -27
- package/examples/js/loaders/SVGLoader.js +361 -233
- package/examples/js/loaders/TDSLoader.js +81 -118
- package/examples/js/loaders/TGALoader.js +39 -41
- package/examples/js/loaders/TIFFLoader.js +0 -1
- package/examples/js/loaders/TTFLoader.js +0 -8
- package/examples/js/loaders/TiltLoader.js +14 -15
- package/examples/js/loaders/VOXLoader.js +8 -16
- package/examples/js/loaders/VRMLLoader.js +243 -340
- package/examples/js/loaders/VTKLoader.js +101 -118
- package/examples/js/loaders/XYZLoader.js +2 -4
- package/examples/js/loaders/lwo/IFFParser.js +55 -136
- package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
- package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
- package/examples/js/materials/MeshGouraudMaterial.js +15 -13
- package/examples/js/math/Capsule.js +0 -17
- package/examples/js/math/ColorConverter.js +3 -3
- package/examples/js/math/ConvexHull.js +183 -139
- package/examples/js/math/ImprovedNoise.js +1 -1
- package/examples/js/math/Lut.js +8 -15
- package/examples/js/math/MeshSurfaceSampler.js +6 -28
- package/examples/js/math/OBB.js +90 -49
- package/examples/js/math/Octree.js +2 -57
- package/examples/js/math/SimplexNoise.js +74 -88
- package/examples/js/misc/ConvexObjectBreaker.js +37 -48
- package/examples/js/misc/GPUComputationRenderer.js +14 -18
- package/examples/js/misc/Gyroscope.js +5 -9
- package/examples/js/misc/MD2Character.js +14 -23
- package/examples/js/misc/MD2CharacterComplex.js +73 -54
- package/examples/js/misc/MorphAnimMesh.js +0 -6
- package/examples/js/misc/MorphBlendMesh.js +3 -30
- package/examples/js/misc/ProgressiveLightMap.js +47 -43
- package/examples/js/misc/RollerCoaster.js +17 -24
- package/examples/js/misc/TubePainter.js +18 -12
- package/examples/js/misc/Volume.js +16 -45
- package/examples/js/misc/VolumeSlice.js +14 -24
- package/examples/js/modifiers/CurveModifier.js +19 -21
- package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
- package/examples/js/modifiers/SimplifyModifier.js +56 -59
- package/examples/js/modifiers/TessellateModifier.js +2 -9
- package/examples/js/objects/GroundProjectedEnv.js +2 -14
- package/examples/js/objects/Lensflare.js +47 -38
- package/examples/js/objects/LightningStorm.js +10 -13
- package/examples/js/objects/MarchingCubes.js +80 -59
- package/examples/js/objects/Reflector.js +22 -20
- package/examples/js/objects/ReflectorForSSRPass.js +19 -23
- package/examples/js/objects/Refractor.js +52 -30
- package/examples/js/objects/ShadowMesh.js +1 -2
- package/examples/js/objects/Sky.js +2 -7
- package/examples/js/objects/Water.js +23 -18
- package/examples/js/objects/Water2.js +20 -19
- package/examples/js/physics/AmmoPhysics.js +23 -20
- package/examples/js/physics/OimoPhysics.js +19 -17
- package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
- package/examples/js/postprocessing/AfterimagePass.js +19 -12
- package/examples/js/postprocessing/BloomPass.js +38 -17
- package/examples/js/postprocessing/BokehPass.js +29 -12
- package/examples/js/postprocessing/ClearPass.js +1 -6
- package/examples/js/postprocessing/CubeTexturePass.js +12 -9
- package/examples/js/postprocessing/DotScreenPass.js +7 -5
- package/examples/js/postprocessing/EffectComposer.js +25 -32
- package/examples/js/postprocessing/FilmPass.js +7 -5
- package/examples/js/postprocessing/GlitchPass.js +10 -11
- package/examples/js/postprocessing/HalftonePass.js +9 -9
- package/examples/js/postprocessing/LUTPass.js +2 -15
- package/examples/js/postprocessing/MaskPass.js +20 -17
- package/examples/js/postprocessing/OutlinePass.js +45 -36
- package/examples/js/postprocessing/Pass.js +11 -14
- package/examples/js/postprocessing/RenderPass.js +3 -7
- package/examples/js/postprocessing/SAOPass.js +40 -32
- package/examples/js/postprocessing/SMAAPass.js +34 -17
- package/examples/js/postprocessing/SSAARenderPass.js +14 -14
- package/examples/js/postprocessing/SSAOPass.js +56 -42
- package/examples/js/postprocessing/SSRPass.js +78 -61
- package/examples/js/postprocessing/SavePass.js +14 -6
- package/examples/js/postprocessing/ShaderPass.js +9 -8
- package/examples/js/postprocessing/TAARenderPass.js +11 -9
- package/examples/js/postprocessing/TexturePass.js +7 -4
- package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
- package/examples/js/renderers/CSS2DRenderer.js +2 -21
- package/examples/js/renderers/CSS3DRenderer.js +3 -24
- package/examples/js/renderers/Projector.js +29 -85
- package/examples/js/renderers/SVGRenderer.js +4 -50
- package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
- package/examples/js/shaders/AfterimageShader.js +3 -6
- package/examples/js/shaders/BasicShader.js +3 -6
- package/examples/js/shaders/BleachBypassShader.js +3 -6
- package/examples/js/shaders/BlendShader.js +3 -6
- package/examples/js/shaders/BokehShader.js +3 -6
- package/examples/js/shaders/BokehShader2.js +4 -13
- package/examples/js/shaders/BrightnessContrastShader.js +3 -6
- package/examples/js/shaders/ColorCorrectionShader.js +2 -6
- package/examples/js/shaders/ColorifyShader.js +2 -6
- package/examples/js/shaders/ConvolutionShader.js +5 -10
- package/examples/js/shaders/CopyShader.js +3 -6
- package/examples/js/shaders/DOFMipMapShader.js +3 -6
- package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
- package/examples/js/shaders/DigitalGlitch.js +3 -6
- package/examples/js/shaders/DotScreenShader.js +2 -6
- package/examples/js/shaders/FXAAShader.js +1 -3
- package/examples/js/shaders/FilmShader.js +3 -6
- package/examples/js/shaders/FocusShader.js +3 -6
- package/examples/js/shaders/FreiChenShader.js +2 -6
- package/examples/js/shaders/GammaCorrectionShader.js +3 -6
- package/examples/js/shaders/GodRaysShader.js +11 -24
- package/examples/js/shaders/HalftoneShader.js +3 -6
- package/examples/js/shaders/HorizontalBlurShader.js +3 -6
- package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
- package/examples/js/shaders/HueSaturationShader.js +3 -6
- package/examples/js/shaders/KaleidoShader.js +3 -6
- package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
- package/examples/js/shaders/LuminosityShader.js +3 -6
- package/examples/js/shaders/MMDToonShader.js +2 -6
- package/examples/js/shaders/MirrorShader.js +3 -6
- package/examples/js/shaders/NormalMapShader.js +2 -6
- package/examples/js/shaders/RGBShiftShader.js +3 -6
- package/examples/js/shaders/SAOShader.js +2 -6
- package/examples/js/shaders/SMAAShader.js +6 -18
- package/examples/js/shaders/SSAOShader.js +2 -6
- package/examples/js/shaders/SSRShader.js +6 -18
- package/examples/js/shaders/SepiaShader.js +3 -6
- package/examples/js/shaders/SobelOperatorShader.js +2 -6
- package/examples/js/shaders/TechnicolorShader.js +3 -6
- package/examples/js/shaders/ToneMapShader.js +3 -6
- package/examples/js/shaders/ToonShader.js +8 -24
- package/examples/js/shaders/TriangleBlurShader.js +2 -6
- package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
- package/examples/js/shaders/VelocityShader.js +126 -0
- package/examples/js/shaders/VerticalBlurShader.js +3 -6
- package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
- package/examples/js/shaders/VignetteShader.js +3 -6
- package/examples/js/shaders/VolumeShader.js +2 -6
- package/examples/js/shaders/WaterRefractionShader.js +2 -6
- package/examples/js/textures/FlakesTexture.js +0 -1
- package/examples/js/utils/BufferGeometryUtils.js +234 -168
- package/examples/js/utils/CameraUtils.js +5 -20
- package/examples/js/utils/GPUStatsPanel.js +3 -12
- package/examples/js/utils/GeometryCompressionUtils.js +19 -44
- package/examples/js/utils/GeometryUtils.js +13 -18
- package/examples/js/utils/LDrawUtils.js +8 -11
- package/examples/js/utils/PackedPhongMaterial.js +6 -4
- package/examples/js/utils/SceneUtils.js +117 -6
- package/examples/js/utils/ShadowMapViewer.js +17 -14
- package/examples/js/utils/SkeletonUtils.js +13 -27
- package/examples/js/utils/UVsDebug.js +20 -12
- package/examples/js/utils/WorkerPool.js +1 -11
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/capabilities/WebGPU.js +3 -1
- package/examples/jsm/controls/OrbitControls.js +44 -4
- package/examples/jsm/exporters/GLTFExporter.js +17 -131
- package/examples/jsm/exporters/USDZExporter.js +75 -19
- package/examples/jsm/interactive/HTMLMesh.js +2 -0
- package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -2
- package/examples/jsm/loaders/ColladaLoader.js +28 -0
- package/examples/jsm/loaders/FBXLoader.js +16 -2
- package/examples/jsm/loaders/GLTFLoader.js +204 -377
- package/examples/jsm/loaders/KTX2Loader.js +68 -29
- package/examples/jsm/loaders/LDrawLoader.js +14 -13
- package/examples/jsm/loaders/LottieLoader.js +4 -2
- package/examples/jsm/loaders/MaterialXLoader.js +728 -0
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +68 -16
- package/examples/jsm/loaders/SVGLoader.js +227 -14
- package/examples/jsm/loaders/USDZLoader.js +31 -16
- package/examples/jsm/nodes/Nodes.js +14 -2
- package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +1 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
- package/examples/jsm/nodes/core/NodeFrame.js +2 -2
- package/examples/jsm/nodes/core/NodeVarying.js +7 -4
- package/examples/jsm/nodes/core/VaryingNode.js +6 -4
- package/examples/jsm/nodes/core/constants.js +13 -13
- package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
- package/examples/jsm/nodes/display/ViewportNode.js +106 -0
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
- package/examples/jsm/nodes/materials/Materials.js +9 -7
- package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
- package/examples/jsm/nodes/math/MathNode.js +5 -0
- package/examples/jsm/nodes/math/OperatorNode.js +6 -1
- package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
- package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
- package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
- package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
- package/examples/jsm/nodes/utils/JoinNode.js +8 -2
- package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
- package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
- package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
- package/examples/jsm/nodes/utils/TimerNode.js +1 -1
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
- package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
- package/examples/jsm/postprocessing/BloomPass.js +22 -3
- package/examples/jsm/postprocessing/BokehPass.js +18 -4
- package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
- package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
- package/examples/jsm/postprocessing/EffectComposer.js +9 -0
- package/examples/jsm/postprocessing/FilmPass.js +8 -0
- package/examples/jsm/postprocessing/GlitchPass.js +13 -1
- package/examples/jsm/postprocessing/HalftonePass.js +8 -0
- package/examples/jsm/postprocessing/OutlinePass.js +10 -0
- package/examples/jsm/postprocessing/Pass.js +2 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
- package/examples/jsm/postprocessing/SAOPass.js +20 -0
- package/examples/jsm/postprocessing/SMAAPass.js +16 -0
- package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
- package/examples/jsm/postprocessing/SavePass.js +17 -1
- package/examples/jsm/postprocessing/ShaderPass.js +8 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
- package/examples/jsm/postprocessing/TexturePass.js +8 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
- package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
- package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
- package/examples/jsm/shaders/MMDToonShader.js +0 -2
- package/examples/jsm/shaders/VelocityShader.js +128 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
- package/examples/jsm/utils/SceneUtils.js +129 -4
- package/examples/jsm/utils/TextureUtils.js +85 -0
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
- package/package.json +11 -12
- package/src/Three.js +1 -0
- package/src/audio/AudioContext.js +5 -5
- package/src/cameras/CubeCamera.js +14 -14
- package/src/constants.js +1 -1
- package/src/core/InstancedBufferGeometry.js +1 -7
- package/src/extras/Earcut.js +67 -67
- package/src/helpers/DirectionalLightHelper.js +5 -1
- package/src/helpers/HemisphereLightHelper.js +4 -1
- package/src/helpers/PointLightHelper.js +2 -1
- package/src/helpers/SpotLightHelper.js +4 -2
- package/src/lights/PointLight.js +2 -2
- package/src/lights/SpotLight.js +2 -2
- package/src/loaders/FileLoader.js +4 -1
- package/src/loaders/ObjectLoader.js +5 -1
- package/src/materials/Material.js +1 -1
- package/src/math/Color.js +5 -5
- package/src/math/Matrix3.js +53 -18
- package/src/math/Ray.js +2 -5
- package/src/math/Sphere.js +19 -26
- package/src/objects/InstancedMesh.js +7 -0
- package/src/objects/LOD.js +25 -6
- package/src/renderers/WebGL3DRenderTarget.js +1 -1
- package/src/renderers/WebGLArrayRenderTarget.js +1 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
- package/src/renderers/WebGLRenderTarget.js +1 -1
- package/src/renderers/WebGLRenderer.js +36 -62
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk.js +3 -0
- package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +20 -6
- package/src/renderers/shaders/UniformsLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +15 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -0
- package/src/renderers/webgl/WebGLBackground.js +15 -7
- package/src/renderers/webgl/WebGLLights.js +0 -4
- package/src/renderers/webgl/WebGLMaterials.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -1
- package/src/renderers/webgl/WebGLState.js +31 -1
- package/src/renderers/webgl/WebGLTextures.js +71 -18
- package/src/renderers/webgl/WebGLUniforms.js +116 -20
- package/src/renderers/webgl/WebGLUtils.js +1 -1
- package/src/renderers/webxr/WebXRController.js +46 -13
- package/src/renderers/webxr/WebXRManager.js +85 -3
- package/src/scenes/Scene.js +8 -0
- package/src/textures/CompressedArrayTexture.js +18 -0
- package/examples/js/libs/lottie_canvas.js +0 -12751
- package/examples/js/shaders/PixelShader.js +0 -51
- package/examples/jsm/shaders/PixelShader.js +0 -44
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
* - The entire file is contained in one top level FORM
|
|
34
34
|
*
|
|
35
35
|
**/
|
|
36
|
-
|
|
37
36
|
function IFFParser() {
|
|
38
37
|
|
|
39
|
-
this.debugger = new Debugger();
|
|
38
|
+
this.debugger = new Debugger();
|
|
39
|
+
// this.debugger.enable(); // un-comment to log IFF hierarchy.
|
|
40
40
|
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -50,23 +50,21 @@
|
|
|
50
50
|
layers: [],
|
|
51
51
|
tags: [],
|
|
52
52
|
textures: []
|
|
53
|
-
};
|
|
53
|
+
};
|
|
54
54
|
|
|
55
|
+
// start out at the top level to add any data before first layer is encountered
|
|
55
56
|
this.currentLayer = this.tree;
|
|
56
57
|
this.currentForm = this.tree;
|
|
57
58
|
this.parseTopForm();
|
|
58
59
|
if ( this.tree.format === undefined ) return;
|
|
59
|
-
|
|
60
60
|
if ( this.tree.format === 'LWO2' ) {
|
|
61
61
|
|
|
62
62
|
this.parser = new THREE.LWO2Parser( this );
|
|
63
|
-
|
|
64
63
|
while ( ! this.reader.endOfFile() ) this.parser.parseBlock();
|
|
65
64
|
|
|
66
65
|
} else if ( this.tree.format === 'LWO3' ) {
|
|
67
66
|
|
|
68
67
|
this.parser = new THREE.LWO3Parser( this );
|
|
69
|
-
|
|
70
68
|
while ( ! this.reader.endOfFile() ) this.parser.parseBlock();
|
|
71
69
|
|
|
72
70
|
}
|
|
@@ -76,12 +74,10 @@
|
|
|
76
74
|
return this.tree;
|
|
77
75
|
|
|
78
76
|
},
|
|
79
|
-
|
|
80
77
|
parseTopForm() {
|
|
81
78
|
|
|
82
79
|
this.debugger.offset = this.reader.offset;
|
|
83
80
|
var topForm = this.reader.getIDTag();
|
|
84
|
-
|
|
85
81
|
if ( topForm !== 'FORM' ) {
|
|
86
82
|
|
|
87
83
|
console.warn( 'LWOLoader: Top-level FORM missing.' );
|
|
@@ -93,7 +89,6 @@
|
|
|
93
89
|
this.debugger.dataOffset = this.reader.offset;
|
|
94
90
|
this.debugger.length = length;
|
|
95
91
|
var type = this.reader.getIDTag();
|
|
96
|
-
|
|
97
92
|
if ( type === 'LWO2' ) {
|
|
98
93
|
|
|
99
94
|
this.tree.format = type;
|
|
@@ -110,42 +105,37 @@
|
|
|
110
105
|
return;
|
|
111
106
|
|
|
112
107
|
},
|
|
113
|
-
|
|
114
108
|
///
|
|
115
109
|
// FORM PARSING METHODS
|
|
116
110
|
///
|
|
111
|
+
|
|
117
112
|
// Forms are organisational and can contain any number of sub chunks and sub forms
|
|
118
113
|
// FORM ::= 'FORM'[ID4], length[U4], type[ID4], ( chunk[CHUNK] | form[FORM] ) * }
|
|
119
114
|
parseForm( length ) {
|
|
120
115
|
|
|
121
116
|
var type = this.reader.getIDTag();
|
|
122
|
-
|
|
123
117
|
switch ( type ) {
|
|
124
118
|
|
|
125
119
|
// SKIPPED FORMS
|
|
126
120
|
// if skipForm( length ) is called, the entire form and any sub forms and chunks are skipped
|
|
127
|
-
case 'ISEQ': // Image sequence
|
|
128
121
|
|
|
122
|
+
case 'ISEQ': // Image sequence
|
|
129
123
|
case 'ANIM': // plug in animation
|
|
130
|
-
|
|
131
124
|
case 'STCC': // Color-cycling Still
|
|
132
|
-
|
|
133
125
|
case 'VPVL':
|
|
134
126
|
case 'VPRM':
|
|
135
127
|
case 'NROT':
|
|
136
128
|
case 'WRPW': // image wrap w ( for cylindrical and spherical projections)
|
|
137
|
-
|
|
138
129
|
case 'WRPH': // image wrap h
|
|
139
|
-
|
|
140
130
|
case 'FUNC':
|
|
141
131
|
case 'FALL':
|
|
142
132
|
case 'OPAC':
|
|
143
133
|
case 'GRAD': // gradient texture
|
|
144
|
-
|
|
145
134
|
case 'ENVS':
|
|
146
135
|
case 'VMOP':
|
|
147
|
-
case 'VMBG':
|
|
136
|
+
case 'VMBG':
|
|
148
137
|
|
|
138
|
+
// Car Material FORMS
|
|
149
139
|
case 'OMAX':
|
|
150
140
|
case 'STEX':
|
|
151
141
|
case 'CKBG':
|
|
@@ -154,48 +144,40 @@
|
|
|
154
144
|
case 'VMLB':
|
|
155
145
|
this.debugger.skipped = true;
|
|
156
146
|
this.skipForm( length ); // not currently supported
|
|
157
|
-
|
|
158
147
|
break;
|
|
148
|
+
|
|
159
149
|
// if break; is called directly, the position in the lwoTree is not created
|
|
160
150
|
// any sub chunks and forms are added to the parent form instead
|
|
161
|
-
|
|
162
151
|
case 'META':
|
|
163
152
|
case 'NNDS':
|
|
164
153
|
case 'NODS':
|
|
165
154
|
case 'NDTA':
|
|
166
155
|
case 'ADAT':
|
|
167
156
|
case 'AOVS':
|
|
168
|
-
case 'BLOK':
|
|
157
|
+
case 'BLOK':
|
|
169
158
|
|
|
159
|
+
// used by texture nodes
|
|
170
160
|
case 'IBGC': // imageBackgroundColor
|
|
171
|
-
|
|
172
161
|
case 'IOPC': // imageOpacity
|
|
173
|
-
|
|
174
162
|
case 'IIMG': // hold reference to image path
|
|
175
|
-
|
|
176
163
|
case 'TXTR':
|
|
177
164
|
// this.setupForm( type, length );
|
|
178
165
|
this.debugger.length = 4;
|
|
179
166
|
this.debugger.skipped = true;
|
|
180
167
|
break;
|
|
181
|
-
|
|
182
168
|
case 'IFAL': // imageFallof
|
|
183
|
-
|
|
184
169
|
case 'ISCL': // imageScale
|
|
185
|
-
|
|
186
170
|
case 'IPOS': // imagePosition
|
|
187
|
-
|
|
188
171
|
case 'IROT': // imageRotation
|
|
189
|
-
|
|
190
172
|
case 'IBMP':
|
|
191
173
|
case 'IUTD':
|
|
192
174
|
case 'IVTD':
|
|
193
175
|
this.parseTextureNodeAttribute( type );
|
|
194
176
|
break;
|
|
195
|
-
|
|
196
177
|
case 'ENVL':
|
|
197
178
|
this.parseEnvelope( length );
|
|
198
179
|
break;
|
|
180
|
+
|
|
199
181
|
// CLIP FORM AND SUB FORMS
|
|
200
182
|
|
|
201
183
|
case 'CLIP':
|
|
@@ -210,93 +192,81 @@
|
|
|
210
192
|
}
|
|
211
193
|
|
|
212
194
|
break;
|
|
213
|
-
|
|
214
195
|
case 'STIL':
|
|
215
196
|
this.parseImage();
|
|
216
197
|
break;
|
|
217
|
-
|
|
218
198
|
case 'XREF':
|
|
219
199
|
// clone of another STIL
|
|
220
200
|
this.reader.skip( 8 ); // unknown
|
|
221
|
-
|
|
222
201
|
this.currentForm.referenceTexture = {
|
|
223
202
|
index: this.reader.getUint32(),
|
|
224
203
|
refName: this.reader.getString() // internal unique ref
|
|
225
|
-
|
|
226
204
|
};
|
|
205
|
+
|
|
227
206
|
break;
|
|
207
|
+
|
|
228
208
|
// Not in spec, used by texture nodes
|
|
229
209
|
|
|
230
210
|
case 'IMST':
|
|
231
211
|
this.parseImageStateForm( length );
|
|
232
212
|
break;
|
|
213
|
+
|
|
233
214
|
// SURF FORM AND SUB FORMS
|
|
234
215
|
|
|
235
216
|
case 'SURF':
|
|
236
217
|
this.parseSurfaceForm( length );
|
|
237
218
|
break;
|
|
238
|
-
|
|
239
219
|
case 'VALU':
|
|
240
220
|
// Not in spec
|
|
241
221
|
this.parseValueForm( length );
|
|
242
222
|
break;
|
|
243
|
-
|
|
244
223
|
case 'NTAG':
|
|
245
224
|
this.parseSubNode( length );
|
|
246
225
|
break;
|
|
247
|
-
|
|
248
226
|
case 'ATTR': // BSDF Node Attributes
|
|
249
|
-
|
|
250
227
|
case 'SATR':
|
|
251
228
|
// Standard Node Attributes
|
|
252
229
|
this.setupForm( 'attributes', length );
|
|
253
230
|
break;
|
|
254
|
-
|
|
255
231
|
case 'NCON':
|
|
256
232
|
this.parseConnections( length );
|
|
257
233
|
break;
|
|
258
|
-
|
|
259
234
|
case 'SSHA':
|
|
260
235
|
this.parentForm = this.currentForm;
|
|
261
236
|
this.currentForm = this.currentSurface;
|
|
262
237
|
this.setupForm( 'surfaceShader', length );
|
|
263
238
|
break;
|
|
264
|
-
|
|
265
239
|
case 'SSHD':
|
|
266
240
|
this.setupForm( 'surfaceShaderData', length );
|
|
267
241
|
break;
|
|
268
|
-
|
|
269
242
|
case 'ENTR':
|
|
270
243
|
// Not in spec
|
|
271
244
|
this.parseEntryForm( length );
|
|
272
245
|
break;
|
|
246
|
+
|
|
273
247
|
// Image Map Layer
|
|
274
248
|
|
|
275
249
|
case 'IMAP':
|
|
276
250
|
this.parseImageMap( length );
|
|
277
251
|
break;
|
|
278
|
-
|
|
279
252
|
case 'TAMP':
|
|
280
253
|
this.parseXVAL( 'amplitude', length );
|
|
281
254
|
break;
|
|
255
|
+
|
|
282
256
|
//Texture Mapping Form
|
|
283
257
|
|
|
284
258
|
case 'TMAP':
|
|
285
259
|
this.setupForm( 'textureMap', length );
|
|
286
260
|
break;
|
|
287
|
-
|
|
288
261
|
case 'CNTR':
|
|
289
262
|
this.parseXVAL3( 'center', length );
|
|
290
263
|
break;
|
|
291
|
-
|
|
292
264
|
case 'SIZE':
|
|
293
265
|
this.parseXVAL3( 'scale', length );
|
|
294
266
|
break;
|
|
295
|
-
|
|
296
267
|
case 'ROTA':
|
|
297
268
|
this.parseXVAL3( 'rotation', length );
|
|
298
269
|
break;
|
|
299
|
-
|
|
300
270
|
default:
|
|
301
271
|
this.parseUnknownForm( type, length );
|
|
302
272
|
|
|
@@ -307,13 +277,11 @@
|
|
|
307
277
|
this.debugger.log();
|
|
308
278
|
|
|
309
279
|
},
|
|
310
|
-
|
|
311
280
|
setupForm( type, length ) {
|
|
312
281
|
|
|
313
282
|
if ( ! this.currentForm ) this.currentForm = this.currentNode;
|
|
314
283
|
this.currentFormEnd = this.reader.offset + length;
|
|
315
284
|
this.parentForm = this.currentForm;
|
|
316
|
-
|
|
317
285
|
if ( ! this.currentForm[ type ] ) {
|
|
318
286
|
|
|
319
287
|
this.currentForm[ type ] = {};
|
|
@@ -328,13 +296,11 @@
|
|
|
328
296
|
}
|
|
329
297
|
|
|
330
298
|
},
|
|
331
|
-
|
|
332
299
|
skipForm( length ) {
|
|
333
300
|
|
|
334
301
|
this.reader.skip( length - 4 );
|
|
335
302
|
|
|
336
303
|
},
|
|
337
|
-
|
|
338
304
|
parseUnknownForm( type, length ) {
|
|
339
305
|
|
|
340
306
|
console.warn( 'LWOLoader: unknown FORM encountered: ' + type, length );
|
|
@@ -342,7 +308,6 @@
|
|
|
342
308
|
this.reader.skip( length - 4 );
|
|
343
309
|
|
|
344
310
|
},
|
|
345
|
-
|
|
346
311
|
parseSurfaceForm( length ) {
|
|
347
312
|
|
|
348
313
|
this.reader.skip( 8 ); // unknown Uint32 x2
|
|
@@ -364,7 +329,6 @@
|
|
|
364
329
|
this.currentFormEnd = this.reader.offset + length;
|
|
365
330
|
|
|
366
331
|
},
|
|
367
|
-
|
|
368
332
|
parseSurfaceLwo2( length ) {
|
|
369
333
|
|
|
370
334
|
var name = this.reader.getString();
|
|
@@ -383,14 +347,13 @@
|
|
|
383
347
|
this.currentFormEnd = this.reader.offset + length;
|
|
384
348
|
|
|
385
349
|
},
|
|
386
|
-
|
|
387
350
|
parseSubNode( length ) {
|
|
388
351
|
|
|
389
352
|
// parse the NRNM CHUNK of the subnode FORM to get
|
|
390
353
|
// a meaningful name for the subNode
|
|
391
354
|
// some subnodes can be renamed, but Input and Surface cannot
|
|
392
|
-
this.reader.skip( 8 ); // NRNM + length
|
|
393
355
|
|
|
356
|
+
this.reader.skip( 8 ); // NRNM + length
|
|
394
357
|
var name = this.reader.getString();
|
|
395
358
|
var node = {
|
|
396
359
|
name: name
|
|
@@ -400,7 +363,6 @@
|
|
|
400
363
|
this.currentFormEnd = this.reader.offset + length;
|
|
401
364
|
|
|
402
365
|
},
|
|
403
|
-
|
|
404
366
|
// collect attributes from all nodes at the top level of a surface
|
|
405
367
|
parseConnections( length ) {
|
|
406
368
|
|
|
@@ -409,18 +371,15 @@
|
|
|
409
371
|
this.currentForm = this.currentSurface.connections;
|
|
410
372
|
|
|
411
373
|
},
|
|
412
|
-
|
|
413
374
|
// surface node attribute data, e.g. specular, roughness etc
|
|
414
375
|
parseEntryForm( length ) {
|
|
415
376
|
|
|
416
377
|
this.reader.skip( 8 ); // NAME + length
|
|
417
|
-
|
|
418
378
|
var name = this.reader.getString();
|
|
419
379
|
this.currentForm = this.currentNode.attributes;
|
|
420
380
|
this.setupForm( name, length );
|
|
421
381
|
|
|
422
382
|
},
|
|
423
|
-
|
|
424
383
|
// parse values from material - doesn't match up to other LWO3 data types
|
|
425
384
|
// sub form of entry form
|
|
426
385
|
parseValueForm() {
|
|
@@ -428,7 +387,6 @@
|
|
|
428
387
|
this.reader.skip( 8 ); // unknown + length
|
|
429
388
|
|
|
430
389
|
var valueType = this.reader.getString();
|
|
431
|
-
|
|
432
390
|
if ( valueType === 'double' ) {
|
|
433
391
|
|
|
434
392
|
this.currentForm.value = this.reader.getUint64();
|
|
@@ -450,7 +408,6 @@
|
|
|
450
408
|
}
|
|
451
409
|
|
|
452
410
|
},
|
|
453
|
-
|
|
454
411
|
// holds various data about texture node image state
|
|
455
412
|
// Data other thanmipMapLevel unknown
|
|
456
413
|
parseImageStateForm() {
|
|
@@ -460,7 +417,6 @@
|
|
|
460
417
|
this.currentForm.mipMapLevel = this.reader.getFloat32();
|
|
461
418
|
|
|
462
419
|
},
|
|
463
|
-
|
|
464
420
|
// LWO2 style image data node OR LWO3 textures defined at top level in editor (not as SURF node)
|
|
465
421
|
parseImageMap( length ) {
|
|
466
422
|
|
|
@@ -485,27 +441,21 @@
|
|
|
485
441
|
case 'ISCL':
|
|
486
442
|
this.currentNode.scale = this.reader.getFloat32Array( 3 );
|
|
487
443
|
break;
|
|
488
|
-
|
|
489
444
|
case 'IPOS':
|
|
490
445
|
this.currentNode.position = this.reader.getFloat32Array( 3 );
|
|
491
446
|
break;
|
|
492
|
-
|
|
493
447
|
case 'IROT':
|
|
494
448
|
this.currentNode.rotation = this.reader.getFloat32Array( 3 );
|
|
495
449
|
break;
|
|
496
|
-
|
|
497
450
|
case 'IFAL':
|
|
498
451
|
this.currentNode.falloff = this.reader.getFloat32Array( 3 );
|
|
499
452
|
break;
|
|
500
|
-
|
|
501
453
|
case 'IBMP':
|
|
502
454
|
this.currentNode.amplitude = this.reader.getFloat32();
|
|
503
455
|
break;
|
|
504
|
-
|
|
505
456
|
case 'IUTD':
|
|
506
457
|
this.currentNode.uTiles = this.reader.getFloat32();
|
|
507
458
|
break;
|
|
508
|
-
|
|
509
459
|
case 'IVTD':
|
|
510
460
|
this.currentNode.vTiles = this.reader.getFloat32();
|
|
511
461
|
break;
|
|
@@ -526,21 +476,23 @@
|
|
|
526
476
|
///
|
|
527
477
|
// CHUNK PARSING METHODS
|
|
528
478
|
///
|
|
479
|
+
|
|
529
480
|
// clips can either be defined inside a surface node, or at the top
|
|
530
481
|
// level and they have a different format in each case
|
|
531
482
|
parseClip( length ) {
|
|
532
483
|
|
|
533
|
-
var tag = this.reader.getIDTag();
|
|
484
|
+
var tag = this.reader.getIDTag();
|
|
534
485
|
|
|
486
|
+
// inside surface node
|
|
535
487
|
if ( tag === 'FORM' ) {
|
|
536
488
|
|
|
537
489
|
this.reader.skip( 16 );
|
|
538
490
|
this.currentNode.fileName = this.reader.getString();
|
|
539
491
|
return;
|
|
540
492
|
|
|
541
|
-
}
|
|
542
|
-
|
|
493
|
+
}
|
|
543
494
|
|
|
495
|
+
// otherwise top level
|
|
544
496
|
this.reader.setOffset( this.reader.offset - 4 );
|
|
545
497
|
this.currentFormEnd = this.reader.offset + length;
|
|
546
498
|
this.parentForm = this.currentForm;
|
|
@@ -553,19 +505,18 @@
|
|
|
553
505
|
this.currentForm = texture;
|
|
554
506
|
|
|
555
507
|
},
|
|
556
|
-
|
|
557
508
|
parseClipLwo2( length ) {
|
|
558
509
|
|
|
559
510
|
var texture = {
|
|
560
511
|
index: this.reader.getUint32(),
|
|
561
512
|
fileName: ''
|
|
562
|
-
};
|
|
513
|
+
};
|
|
563
514
|
|
|
515
|
+
// seach STIL block
|
|
564
516
|
while ( true ) {
|
|
565
517
|
|
|
566
518
|
var tag = this.reader.getIDTag();
|
|
567
519
|
var n_length = this.reader.getUint16();
|
|
568
|
-
|
|
569
520
|
if ( tag === 'STIL' ) {
|
|
570
521
|
|
|
571
522
|
texture.fileName = this.reader.getString();
|
|
@@ -585,15 +536,12 @@
|
|
|
585
536
|
this.currentForm = texture;
|
|
586
537
|
|
|
587
538
|
},
|
|
588
|
-
|
|
589
539
|
parseImage() {
|
|
590
540
|
|
|
591
541
|
this.reader.skip( 8 ); // unknown
|
|
592
|
-
|
|
593
542
|
this.currentForm.fileName = this.reader.getString();
|
|
594
543
|
|
|
595
544
|
},
|
|
596
|
-
|
|
597
545
|
parseXVAL( type, length ) {
|
|
598
546
|
|
|
599
547
|
var endOffset = this.reader.offset + length - 4;
|
|
@@ -615,7 +563,6 @@
|
|
|
615
563
|
this.reader.setOffset( endOffset );
|
|
616
564
|
|
|
617
565
|
},
|
|
618
|
-
|
|
619
566
|
// Tags associated with an object
|
|
620
567
|
// OTAG { type[ID4], tag-string[S0] }
|
|
621
568
|
parseObjectTag() {
|
|
@@ -626,7 +573,6 @@
|
|
|
626
573
|
};
|
|
627
574
|
|
|
628
575
|
},
|
|
629
|
-
|
|
630
576
|
// Signals the start of a new layer. All the data chunks which follow will be included in this layer until another layer chunk is encountered.
|
|
631
577
|
// LAYR: number[U2], flags[U2], pivot[VEC12], name[S0], parent[U2]
|
|
632
578
|
parseLayer( length ) {
|
|
@@ -642,8 +588,8 @@
|
|
|
642
588
|
this.tree.layers.push( layer );
|
|
643
589
|
this.currentLayer = layer;
|
|
644
590
|
var parsedLength = 16 + stringOffset( this.currentLayer.name ); // index ( 2 ) + flags( 2 ) + pivot( 12 ) + stringlength
|
|
645
|
-
// if we have not reached then end of the layer block, there must be a parent defined
|
|
646
591
|
|
|
592
|
+
// if we have not reached then end of the layer block, there must be a parent defined
|
|
647
593
|
this.currentLayer.parent = parsedLength < length ? this.reader.getUint16() : - 1; // omitted or -1 for no parent
|
|
648
594
|
|
|
649
595
|
},
|
|
@@ -654,7 +600,6 @@
|
|
|
654
600
|
parsePoints( length ) {
|
|
655
601
|
|
|
656
602
|
this.currentPoints = [];
|
|
657
|
-
|
|
658
603
|
for ( var i = 0; i < length / 4; i += 3 ) {
|
|
659
604
|
|
|
660
605
|
// z -> -z to match three.js right handed coords
|
|
@@ -663,10 +608,10 @@
|
|
|
663
608
|
}
|
|
664
609
|
|
|
665
610
|
},
|
|
666
|
-
|
|
667
611
|
// parse VMAP or VMAD
|
|
668
612
|
// Associates a set of floating-point vectors with a set of points.
|
|
669
613
|
// VMAP: { type[ID4], dimension[U2], name[S0], ( vert[VX], value[F4] # dimension ) * }
|
|
614
|
+
|
|
670
615
|
// VMAD Associates a set of floating-point vectors with the vertices of specific polygons.
|
|
671
616
|
// Similar to VMAP UVs, but associates with polygon vertices rather than points
|
|
672
617
|
// to solve to problem of UV seams: VMAD chunks are paired with VMAPs of the same name,
|
|
@@ -677,36 +622,30 @@
|
|
|
677
622
|
|
|
678
623
|
var finalOffset = this.reader.offset + length;
|
|
679
624
|
var channelName = this.reader.getString();
|
|
680
|
-
|
|
681
625
|
if ( this.reader.offset === finalOffset ) {
|
|
682
626
|
|
|
683
627
|
// then we are in a texture node and the VMAP chunk is just a reference to a UV channel name
|
|
684
628
|
this.currentForm.UVChannel = channelName;
|
|
685
629
|
return;
|
|
686
630
|
|
|
687
|
-
}
|
|
688
|
-
|
|
631
|
+
}
|
|
689
632
|
|
|
633
|
+
// otherwise reset to initial length and parse normal VMAP CHUNK
|
|
690
634
|
this.reader.setOffset( this.reader.offset - stringOffset( channelName ) );
|
|
691
635
|
var type = this.reader.getIDTag();
|
|
692
636
|
this.reader.getUint16(); // dimension
|
|
693
|
-
|
|
694
637
|
var name = this.reader.getString();
|
|
695
638
|
var remainingLength = length - 6 - stringOffset( name );
|
|
696
|
-
|
|
697
639
|
switch ( type ) {
|
|
698
640
|
|
|
699
641
|
case 'TXUV':
|
|
700
642
|
this.parseUVMapping( name, finalOffset, discontinuous );
|
|
701
643
|
break;
|
|
702
|
-
|
|
703
644
|
case 'MORF':
|
|
704
645
|
case 'SPOT':
|
|
705
646
|
this.parseMorphTargets( name, finalOffset, type ); // can't be discontinuous
|
|
706
|
-
|
|
707
647
|
break;
|
|
708
648
|
// unsupported VMAPs
|
|
709
|
-
|
|
710
649
|
case 'APSL':
|
|
711
650
|
case 'NORM':
|
|
712
651
|
case 'WGHT':
|
|
@@ -716,7 +655,6 @@
|
|
|
716
655
|
case 'RGBA':
|
|
717
656
|
this.reader.skip( remainingLength );
|
|
718
657
|
break;
|
|
719
|
-
|
|
720
658
|
default:
|
|
721
659
|
console.warn( 'LWOLoader: unknown vertex map type: ' + type );
|
|
722
660
|
this.reader.skip( remainingLength );
|
|
@@ -724,13 +662,11 @@
|
|
|
724
662
|
}
|
|
725
663
|
|
|
726
664
|
},
|
|
727
|
-
|
|
728
665
|
parseUVMapping( name, finalOffset, discontinuous ) {
|
|
729
666
|
|
|
730
667
|
var uvIndices = [];
|
|
731
668
|
var polyIndices = [];
|
|
732
669
|
var uvs = [];
|
|
733
|
-
|
|
734
670
|
while ( this.reader.offset < finalOffset ) {
|
|
735
671
|
|
|
736
672
|
uvIndices.push( this.reader.getVariableLengthIndex() );
|
|
@@ -759,17 +695,15 @@
|
|
|
759
695
|
}
|
|
760
696
|
|
|
761
697
|
},
|
|
762
|
-
|
|
763
698
|
parseMorphTargets( name, finalOffset, type ) {
|
|
764
699
|
|
|
765
700
|
var indices = [];
|
|
766
701
|
var points = [];
|
|
767
702
|
type = type === 'MORF' ? 'relative' : 'absolute';
|
|
768
|
-
|
|
769
703
|
while ( this.reader.offset < finalOffset ) {
|
|
770
704
|
|
|
771
|
-
indices.push( this.reader.getVariableLengthIndex() );
|
|
772
|
-
|
|
705
|
+
indices.push( this.reader.getVariableLengthIndex() );
|
|
706
|
+
// z -> -z to match three.js right handed coords
|
|
773
707
|
points.push( this.reader.getFloat32(), this.reader.getFloat32(), - this.reader.getFloat32() );
|
|
774
708
|
|
|
775
709
|
}
|
|
@@ -782,25 +716,23 @@
|
|
|
782
716
|
};
|
|
783
717
|
|
|
784
718
|
},
|
|
785
|
-
|
|
786
719
|
// A list of polygons for the current layer.
|
|
787
720
|
// POLS { type[ID4], ( numvert+flags[U2], vert[VX] # numvert ) * }
|
|
788
721
|
parsePolygonList( length ) {
|
|
789
722
|
|
|
790
723
|
var finalOffset = this.reader.offset + length;
|
|
791
724
|
var type = this.reader.getIDTag();
|
|
792
|
-
var indices = [];
|
|
725
|
+
var indices = [];
|
|
793
726
|
|
|
727
|
+
// hold a list of polygon sizes, to be split up later
|
|
794
728
|
var polygonDimensions = [];
|
|
795
|
-
|
|
796
729
|
while ( this.reader.offset < finalOffset ) {
|
|
797
730
|
|
|
798
|
-
var numverts = this.reader.getUint16();
|
|
731
|
+
var numverts = this.reader.getUint16();
|
|
799
732
|
|
|
733
|
+
//var flags = numverts & 64512; // 6 high order bits are flags - ignoring for now
|
|
800
734
|
numverts = numverts & 1023; // remaining ten low order bits are vertex num
|
|
801
|
-
|
|
802
735
|
polygonDimensions.push( numverts );
|
|
803
|
-
|
|
804
736
|
for ( var j = 0; j < numverts; j ++ ) indices.push( this.reader.getVariableLengthIndex() );
|
|
805
737
|
|
|
806
738
|
}
|
|
@@ -810,13 +742,13 @@
|
|
|
810
742
|
vertexIndices: indices,
|
|
811
743
|
polygonDimensions: polygonDimensions,
|
|
812
744
|
points: this.currentPoints
|
|
813
|
-
};
|
|
745
|
+
};
|
|
814
746
|
|
|
747
|
+
// Note: assuming that all polys will be lines or points if the first is
|
|
815
748
|
if ( polygonDimensions[ 0 ] === 1 ) geometryData.type = 'points'; else if ( polygonDimensions[ 0 ] === 2 ) geometryData.type = 'lines';
|
|
816
749
|
this.currentLayer.geometry = geometryData;
|
|
817
750
|
|
|
818
751
|
},
|
|
819
|
-
|
|
820
752
|
// Lists the tag strings that can be associated with polygons by the PTAG chunk.
|
|
821
753
|
// TAGS { tag-string[S0] * }
|
|
822
754
|
parseTagStrings( length ) {
|
|
@@ -824,7 +756,6 @@
|
|
|
824
756
|
this.tree.tags = this.reader.getStringArray( length );
|
|
825
757
|
|
|
826
758
|
},
|
|
827
|
-
|
|
828
759
|
// Associates tags of a given type with polygons in the most recent POLS chunk.
|
|
829
760
|
// PTAG { type[ID4], ( poly[VX], tag[U2] ) * }
|
|
830
761
|
parsePolygonTagMapping( length ) {
|
|
@@ -834,17 +765,16 @@
|
|
|
834
765
|
if ( type === 'SURF' ) this.parseMaterialIndices( finalOffset ); else {
|
|
835
766
|
|
|
836
767
|
//PART, SMGP, COLR not supported
|
|
768
|
+
|
|
837
769
|
this.reader.skip( length - 4 );
|
|
838
770
|
|
|
839
771
|
}
|
|
840
772
|
|
|
841
773
|
},
|
|
842
|
-
|
|
843
774
|
parseMaterialIndices( finalOffset ) {
|
|
844
775
|
|
|
845
776
|
// array holds polygon index followed by material index
|
|
846
777
|
this.currentLayer.geometry.materialIndices = [];
|
|
847
|
-
|
|
848
778
|
while ( this.reader.offset < finalOffset ) {
|
|
849
779
|
|
|
850
780
|
var polygonIndex = this.reader.getVariableLengthIndex();
|
|
@@ -854,19 +784,18 @@
|
|
|
854
784
|
}
|
|
855
785
|
|
|
856
786
|
},
|
|
857
|
-
|
|
858
787
|
parseUnknownCHUNK( blockID, length ) {
|
|
859
788
|
|
|
860
|
-
console.warn( 'LWOLoader: unknown chunk type: ' + blockID + ' length: ' + length );
|
|
789
|
+
console.warn( 'LWOLoader: unknown chunk type: ' + blockID + ' length: ' + length );
|
|
790
|
+
|
|
791
|
+
// print the chunk plus some bytes padding either side
|
|
861
792
|
// printBuffer( this.reader.dv.buffer, this.reader.offset - 20, length + 40 );
|
|
862
793
|
|
|
863
794
|
var data = this.reader.getString( length );
|
|
864
795
|
this.currentForm[ blockID ] = data;
|
|
865
796
|
|
|
866
797
|
}
|
|
867
|
-
|
|
868
798
|
};
|
|
869
|
-
|
|
870
799
|
function DataViewReader( buffer ) {
|
|
871
800
|
|
|
872
801
|
this.dv = new DataView( buffer );
|
|
@@ -881,7 +810,6 @@
|
|
|
881
810
|
return this.dv.buffer.byteLength;
|
|
882
811
|
|
|
883
812
|
},
|
|
884
|
-
|
|
885
813
|
setOffset( offset ) {
|
|
886
814
|
|
|
887
815
|
if ( offset > 0 && offset < this.dv.buffer.byteLength ) {
|
|
@@ -895,7 +823,6 @@
|
|
|
895
823
|
}
|
|
896
824
|
|
|
897
825
|
},
|
|
898
|
-
|
|
899
826
|
endOfFile: function () {
|
|
900
827
|
|
|
901
828
|
if ( this.offset >= this.size() ) return true;
|
|
@@ -953,7 +880,6 @@
|
|
|
953
880
|
getFloat32Array: function ( size ) {
|
|
954
881
|
|
|
955
882
|
var a = [];
|
|
956
|
-
|
|
957
883
|
for ( var i = 0; i < size; i ++ ) {
|
|
958
884
|
|
|
959
885
|
a.push( this.getFloat32() );
|
|
@@ -973,7 +899,6 @@
|
|
|
973
899
|
getFloat64Array: function ( size ) {
|
|
974
900
|
|
|
975
901
|
var a = [];
|
|
976
|
-
|
|
977
902
|
for ( var i = 0; i < size; i ++ ) {
|
|
978
903
|
|
|
979
904
|
a.push( this.getFloat64() );
|
|
@@ -983,7 +908,6 @@
|
|
|
983
908
|
return a;
|
|
984
909
|
|
|
985
910
|
},
|
|
986
|
-
|
|
987
911
|
// get variable-length index data type
|
|
988
912
|
// VX ::= index[U2] | (index + 0xFF000000)[U4]
|
|
989
913
|
// If the index value is less than 65,280 (0xFF00),then VX === U2
|
|
@@ -993,7 +917,6 @@
|
|
|
993
917
|
getVariableLengthIndex() {
|
|
994
918
|
|
|
995
919
|
var firstByte = this.getUint8();
|
|
996
|
-
|
|
997
920
|
if ( firstByte === 255 ) {
|
|
998
921
|
|
|
999
922
|
return this.getUint8() * 65536 + this.getUint8() * 256 + this.getUint8();
|
|
@@ -1003,20 +926,18 @@
|
|
|
1003
926
|
return firstByte * 256 + this.getUint8();
|
|
1004
927
|
|
|
1005
928
|
},
|
|
1006
|
-
|
|
1007
929
|
// An ID tag is a sequence of 4 bytes containing 7-bit ASCII values
|
|
1008
930
|
getIDTag() {
|
|
1009
931
|
|
|
1010
932
|
return this.getString( 4 );
|
|
1011
933
|
|
|
1012
934
|
},
|
|
1013
|
-
|
|
1014
935
|
getString: function ( size ) {
|
|
1015
936
|
|
|
1016
|
-
if ( size === 0 ) return;
|
|
937
|
+
if ( size === 0 ) return;
|
|
1017
938
|
|
|
939
|
+
// note: safari 9 doesn't support Uint8Array.indexOf; create intermediate array instead
|
|
1018
940
|
var a = [];
|
|
1019
|
-
|
|
1020
941
|
if ( size ) {
|
|
1021
942
|
|
|
1022
943
|
for ( var i = 0; i < size; i ++ ) {
|
|
@@ -1029,7 +950,6 @@
|
|
|
1029
950
|
|
|
1030
951
|
var currentChar;
|
|
1031
952
|
var len = 0;
|
|
1032
|
-
|
|
1033
953
|
while ( currentChar !== 0 ) {
|
|
1034
954
|
|
|
1035
955
|
currentChar = this.getUint8();
|
|
@@ -1052,7 +972,9 @@
|
|
|
1052
972
|
return a.filter( Boolean ); // return array with any empty strings removed
|
|
1053
973
|
|
|
1054
974
|
}
|
|
1055
|
-
};
|
|
975
|
+
};
|
|
976
|
+
|
|
977
|
+
// ************** DEBUGGER **************
|
|
1056
978
|
|
|
1057
979
|
function Debugger() {
|
|
1058
980
|
|
|
@@ -1073,17 +995,14 @@
|
|
|
1073
995
|
|
|
1074
996
|
if ( ! this.active ) return;
|
|
1075
997
|
var nodeType;
|
|
1076
|
-
|
|
1077
998
|
switch ( this.node ) {
|
|
1078
999
|
|
|
1079
1000
|
case 0:
|
|
1080
1001
|
nodeType = 'FORM';
|
|
1081
1002
|
break;
|
|
1082
|
-
|
|
1083
1003
|
case 1:
|
|
1084
1004
|
nodeType = 'CHK';
|
|
1085
1005
|
break;
|
|
1086
|
-
|
|
1087
1006
|
case 2:
|
|
1088
1007
|
nodeType = 'S-CHK';
|
|
1089
1008
|
break;
|
|
@@ -1091,7 +1010,6 @@
|
|
|
1091
1010
|
}
|
|
1092
1011
|
|
|
1093
1012
|
console.log( '| '.repeat( this.depth ) + nodeType, this.nodeID, `( ${this.offset} ) -> ( ${this.dataOffset + this.length} )`, this.node == 0 ? ' {' : '', this.skipped ? 'SKIPPED' : '', this.node == 0 && this.skipped ? '}' : '' );
|
|
1094
|
-
|
|
1095
1013
|
if ( this.node == 0 && ! this.skipped ) {
|
|
1096
1014
|
|
|
1097
1015
|
this.depth += 1;
|
|
@@ -1105,7 +1023,6 @@
|
|
|
1105
1023
|
closeForms: function () {
|
|
1106
1024
|
|
|
1107
1025
|
if ( ! this.active ) return;
|
|
1108
|
-
|
|
1109
1026
|
for ( var i = this.formList.length - 1; i >= 0; i -- ) {
|
|
1110
1027
|
|
|
1111
1028
|
if ( this.offset >= this.formList[ i ] ) {
|
|
@@ -1119,24 +1036,26 @@
|
|
|
1119
1036
|
}
|
|
1120
1037
|
|
|
1121
1038
|
}
|
|
1122
|
-
};
|
|
1039
|
+
};
|
|
1040
|
+
|
|
1041
|
+
// ************** UTILITY FUNCTIONS **************
|
|
1123
1042
|
|
|
1124
1043
|
function isEven( num ) {
|
|
1125
1044
|
|
|
1126
1045
|
return num % 2;
|
|
1127
1046
|
|
|
1128
|
-
}
|
|
1129
|
-
// this will be string.length + nullbyte + optional padbyte to make the length even
|
|
1130
|
-
|
|
1047
|
+
}
|
|
1131
1048
|
|
|
1049
|
+
// calculate the length of the string in the buffer
|
|
1050
|
+
// this will be string.length + nullbyte + optional padbyte to make the length even
|
|
1132
1051
|
function stringOffset( string ) {
|
|
1133
1052
|
|
|
1134
1053
|
return string.length + 1 + ( isEven( string.length + 1 ) ? 1 : 0 );
|
|
1135
1054
|
|
|
1136
|
-
}
|
|
1137
|
-
// printBuffer( this.reader.dv.buffer, this.reader.offset, length );
|
|
1138
|
-
|
|
1055
|
+
}
|
|
1139
1056
|
|
|
1057
|
+
// for testing purposes, dump buffer to console
|
|
1058
|
+
// printBuffer( this.reader.dv.buffer, this.reader.offset, length );
|
|
1140
1059
|
function printBuffer( buffer, from, to ) {
|
|
1141
1060
|
|
|
1142
1061
|
console.log( THREE.LoaderUtils.decodeText( new Uint8Array( buffer, from, to ) ) );
|