super-three 0.181.0 → 0.185.0
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/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +21332 -19201
- package/build/three.core.js +20908 -19853
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1947 -862
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +37 -16
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +33628 -25197
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +33394 -25000
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +14 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +13 -6
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +127 -86
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +102 -17
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMFrustum.js +31 -6
- package/examples/jsm/csm/CSMShadowNode.js +10 -3
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +14 -1
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +27 -6
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +266 -21
- package/examples/jsm/exporters/PLYExporter.js +286 -73
- package/examples/jsm/exporters/USDZExporter.js +353 -99
- package/examples/jsm/generators/CityGenerator.js +346 -0
- package/examples/jsm/generators/ForestGenerator.js +347 -0
- package/examples/jsm/generators/TerrainGenerator.js +504 -0
- package/examples/jsm/generators/TreeGenerator.js +377 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
- package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/LoftGeometry.js +355 -0
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelper.js +5 -4
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +83 -14
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +244 -91
- package/examples/jsm/inspector/RendererInspector.js +165 -39
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +241 -25
- package/examples/jsm/inspector/tabs/Memory.js +136 -0
- package/examples/jsm/inspector/tabs/Parameters.js +115 -7
- package/examples/jsm/inspector/tabs/Performance.js +24 -9
- package/examples/jsm/inspector/tabs/Settings.js +306 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
- package/examples/jsm/inspector/tabs/Viewer.js +723 -9
- package/examples/jsm/inspector/ui/Graph.js +162 -25
- package/examples/jsm/inspector/ui/Item.js +92 -13
- package/examples/jsm/inspector/ui/List.js +2 -2
- package/examples/jsm/inspector/ui/Profiler.js +1991 -44
- package/examples/jsm/inspector/ui/Style.js +1943 -543
- package/examples/jsm/inspector/ui/Tab.js +226 -5
- package/examples/jsm/inspector/ui/Values.js +126 -8
- package/examples/jsm/inspector/ui/utils.js +143 -10
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/basis/README.md +0 -1
- package/examples/jsm/libs/demuxer_mp4.js +3 -3
- package/examples/jsm/libs/draco/README.md +0 -1
- package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
- package/examples/jsm/libs/mikktspace.module.js +34 -9
- package/examples/jsm/lighting/ClusteredLighting.js +55 -0
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +681 -0
- package/examples/jsm/lines/LineMaterial.js +45 -16
- package/examples/jsm/lines/LineSegments2.js +8 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
- package/examples/jsm/loaders/3DMLoader.js +6 -5
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +51 -18
- package/examples/jsm/loaders/EXRLoader.js +701 -90
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +7 -30
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +58 -17
- package/examples/jsm/loaders/LDrawLoader.js +49 -58
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
- package/examples/jsm/loaders/LWOLoader.js +11 -39
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MaterialXLoader.js +31 -9
- package/examples/jsm/loaders/NRRDLoader.js +5 -5
- package/examples/jsm/loaders/PCDLoader.js +11 -9
- package/examples/jsm/loaders/PLYLoader.js +218 -55
- package/examples/jsm/loaders/SVGLoader.js +549 -497
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +1 -1
- package/examples/jsm/loaders/USDLoader.js +127 -43
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +80 -3
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/usd/USDAParser.js +504 -344
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
- package/examples/jsm/misc/Volume.js +2 -3
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/GroundedSkybox.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +72 -25
- package/examples/jsm/objects/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/Water2Mesh.js +1 -1
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +27 -15
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +36 -7
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/shaders/VolumeShader.js +31 -44
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
- package/examples/jsm/transpiler/Linker.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +75 -25
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +13 -14
- package/examples/jsm/tsl/display/GTAONode.js +40 -17
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +69 -19
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
- package/examples/jsm/tsl/display/SSGINode.js +96 -62
- package/examples/jsm/tsl/display/SSRNode.js +831 -134
- package/examples/jsm/tsl/display/SSSNode.js +8 -6
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +315 -126
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/tsl/math/curlNoise.js +107 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
- package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
- package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
- package/examples/jsm/tsl/utils/RNoise.js +51 -0
- package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/SceneOptimizer.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/ARButton.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +28 -34
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +35 -14
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +13 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +18 -4
- package/src/animation/AnimationClip.js +0 -139
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyBinding.js +2 -2
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +34 -4
- package/src/cameras/CubeCamera.js +20 -0
- package/src/cameras/StereoCamera.js +5 -2
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +43 -9
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +69 -11
- package/src/core/Raycaster.js +3 -3
- package/src/core/RenderTarget.js +19 -6
- package/src/extras/PMREMGenerator.js +13 -22
- package/src/extras/TextureUtils.js +6 -2
- package/src/extras/core/ShapePath.js +149 -160
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/SphereGeometry.js +8 -3
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +6 -1
- package/src/helpers/HemisphereLightHelper.js +5 -0
- package/src/helpers/PointLightHelper.js +3 -25
- package/src/helpers/SpotLightHelper.js +4 -1
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +75 -42
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/LoadingManager.js +5 -0
- package/src/loaders/MaterialLoader.js +37 -266
- package/src/loaders/ObjectLoader.js +48 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/LineBasicMaterial.js +4 -0
- package/src/materials/Material.js +198 -1
- package/src/materials/MeshBasicMaterial.js +24 -0
- package/src/materials/MeshDepthMaterial.js +10 -0
- package/src/materials/MeshDistanceMaterial.js +10 -0
- package/src/materials/MeshLambertMaterial.js +49 -1
- package/src/materials/MeshMatcapMaterial.js +25 -1
- package/src/materials/MeshNormalMaterial.js +9 -1
- package/src/materials/MeshPhongMaterial.js +49 -1
- package/src/materials/MeshPhysicalMaterial.js +38 -0
- package/src/materials/MeshStandardMaterial.js +42 -1
- package/src/materials/MeshToonMaterial.js +35 -2
- package/src/materials/PointsMaterial.js +7 -0
- package/src/materials/ShaderMaterial.js +106 -1
- package/src/materials/SpriteMaterial.js +7 -0
- package/src/materials/nodes/Line2NodeMaterial.js +380 -297
- package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
- package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
- package/src/materials/nodes/NodeMaterial.js +153 -89
- package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
- package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
- package/src/math/Box3.js +5 -0
- package/src/math/FrustumArray.js +103 -133
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +12 -12
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +24 -9
- package/src/math/Matrix4.js +112 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +13 -9
- package/src/math/Vector3.js +17 -15
- package/src/math/Vector4.js +15 -11
- package/src/math/interpolants/BezierInterpolant.js +106 -0
- package/src/nodes/Nodes.js +86 -71
- package/src/nodes/TSL.js +15 -13
- package/src/nodes/accessors/Arrays.js +5 -5
- package/src/nodes/accessors/Batch.js +108 -0
- package/src/nodes/accessors/Bitangent.js +7 -7
- package/src/nodes/accessors/BufferAttributeNode.js +120 -17
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +5 -5
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/Instance.js +264 -0
- package/src/nodes/accessors/MaterialNode.js +27 -3
- package/src/nodes/accessors/MaterialProperties.js +6 -8
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
- package/src/nodes/accessors/Normal.js +24 -24
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +39 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +9 -8
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/Skinning.js +263 -0
- package/src/nodes/accessors/StorageBufferNode.js +16 -27
- package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
- package/src/nodes/accessors/StorageTextureNode.js +74 -11
- package/src/nodes/accessors/Tangent.js +8 -18
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +124 -25
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +4 -19
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +55 -4
- package/src/nodes/core/Node.js +151 -17
- package/src/nodes/core/NodeBuilder.js +479 -101
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +20 -18
- package/src/nodes/core/OutputStructNode.js +13 -11
- package/src/nodes/core/OverrideContextNode.js +153 -0
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +66 -4
- package/src/nodes/core/StackNode.js +91 -20
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +20 -8
- package/src/nodes/core/StructTypeNode.js +17 -23
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +56 -23
- package/src/nodes/core/VaryingNode.js +14 -21
- package/src/nodes/display/BlendModes.js +1 -105
- package/src/nodes/display/BumpMapNode.js +6 -1
- package/src/nodes/display/ColorAdjustment.js +27 -9
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +38 -9
- package/src/nodes/display/NormalMapNode.js +41 -6
- package/src/nodes/display/PassNode.js +157 -56
- package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
- package/src/nodes/display/RenderOutputNode.js +19 -10
- package/src/nodes/display/ScreenNode.js +4 -2
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/functions/VolumetricLightingModel.js +40 -7
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +30 -5
- package/src/nodes/lighting/IESSpotLightNode.js +40 -2
- package/src/nodes/lighting/LightingContextNode.js +10 -2
- package/src/nodes/lighting/LightsNode.js +97 -65
- package/src/nodes/lighting/PointShadowNode.js +166 -148
- package/src/nodes/lighting/ShadowFilterNode.js +74 -117
- package/src/nodes/lighting/ShadowNode.js +149 -51
- package/src/nodes/materialx/lib/mx_noise.js +2 -2
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +6 -6
- package/src/nodes/math/MathNode.js +115 -52
- package/src/nodes/math/OperatorNode.js +24 -23
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +34 -3
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +99 -33
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EquirectUV.js +30 -5
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- package/src/nodes/utils/Packing.js +48 -5
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +41 -25
- package/src/nodes/utils/ReflectorNode.js +4 -4
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/StorageArrayElementNode.js +1 -1
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +66 -30
- package/src/objects/InstancedMesh.js +19 -3
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +344 -156
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +78 -13
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +141 -57
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ClippingContext.js +10 -2
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +374 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +51 -19
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +41 -4
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +88 -16
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +700 -163
- package/src/renderers/common/Sampler.js +16 -48
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +121 -9
- package/src/renderers/common/TimestampQueryPool.js +6 -4
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +84 -1
- package/src/renderers/common/XRManager.js +377 -51
- package/src/renderers/common/extras/PMREMGenerator.js +40 -61
- package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/src/renderers/common/nodes/NodeLibrary.js +4 -4
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +271 -0
- package/src/renderers/webgl/WebGLProgram.js +54 -113
- package/src/renderers/webgl/WebGLPrograms.js +74 -55
- package/src/renderers/webgl/WebGLRenderLists.js +24 -1
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShaderCache.js +5 -11
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +230 -56
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
- package/src/renderers/webgpu/WebGPUBackend.js +733 -302
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
- package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
- package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
- package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
- package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
- package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
- package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
- package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
- package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
- package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
- package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
- package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
- package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
- package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
- package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/DepthTexture.js +1 -1
- package/src/textures/ExternalTexture.js +0 -3
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -3
- package/examples/fonts/LICENSE +0 -13
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
- package/examples/fonts/README.md +0 -11
- package/examples/fonts/droid/NOTICE +0 -190
- package/examples/fonts/droid/README.txt +0 -18
- package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
- package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
- package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
- package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
- package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
- package/examples/fonts/gentilis_bold.typeface.json +0 -1
- package/examples/fonts/gentilis_regular.typeface.json +0 -1
- package/examples/fonts/helvetiker_bold.typeface.json +0 -1
- package/examples/fonts/helvetiker_regular.typeface.json +0 -1
- package/examples/fonts/optimer_bold.typeface.json +0 -1
- package/examples/fonts/optimer_regular.typeface.json +0 -1
- package/examples/fonts/ttf/README.md +0 -9
- package/examples/fonts/ttf/kenpixel.ttf +0 -0
- package/examples/jsm/libs/ammo.wasm.js +0 -822
- package/examples/jsm/libs/ammo.wasm.wasm +0 -0
- package/examples/jsm/libs/draco/draco_encoder.js +0 -33
- package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
- package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
- package/examples/jsm/libs/opentype.module.js +0 -14506
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/lighting/TiledLighting.js +0 -42
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
- package/src/nodes/accessors/BatchNode.js +0 -163
- package/src/nodes/accessors/InstanceNode.js +0 -244
- package/src/nodes/accessors/InstancedMeshNode.js +0 -50
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/accessors/SkinningNode.js +0 -327
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
TextureLoader,
|
|
13
|
-
Object3D,
|
|
14
|
-
Vector2
|
|
15
|
-
} from 'three';
|
|
1
|
+
// Pre-compiled regex patterns for performance
|
|
2
|
+
const DEF_MATCH_REGEX = /^def\s+(?:(\w+)\s+)?"?([^"]+)"?$/;
|
|
3
|
+
const VARIANT_STRING_REGEX = /^string\s+(\w+)$/;
|
|
4
|
+
const ATTR_MATCH_REGEX = /^(?:uniform\s+)?(\w+(?:\[\])?)\s+(.+)$/;
|
|
5
|
+
|
|
6
|
+
// Spec types (must match USDCParser/USDComposer)
|
|
7
|
+
const SpecType = {
|
|
8
|
+
Attribute: 1,
|
|
9
|
+
Prim: 6,
|
|
10
|
+
Relationship: 8
|
|
11
|
+
};
|
|
16
12
|
|
|
17
13
|
class USDAParser {
|
|
18
14
|
|
|
19
15
|
parseText( text ) {
|
|
20
16
|
|
|
17
|
+
// Preprocess: strip comments and normalize multiline values
|
|
18
|
+
text = this._preprocess( text );
|
|
19
|
+
|
|
21
20
|
const root = {};
|
|
22
21
|
|
|
23
22
|
const lines = text.split( '\n' );
|
|
@@ -27,18 +26,22 @@ class USDAParser {
|
|
|
27
26
|
|
|
28
27
|
const stack = [ root ];
|
|
29
28
|
|
|
30
|
-
// Parse USDA file
|
|
31
|
-
|
|
32
29
|
for ( const line of lines ) {
|
|
33
30
|
|
|
34
|
-
// console.log( line );
|
|
35
|
-
|
|
36
31
|
if ( line.includes( '=' ) ) {
|
|
37
32
|
|
|
38
|
-
|
|
33
|
+
// Find the first '=' that's not inside quotes
|
|
34
|
+
const eqIdx = this._findAssignmentOperator( line );
|
|
39
35
|
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
if ( eqIdx === - 1 ) {
|
|
37
|
+
|
|
38
|
+
string = line.trim();
|
|
39
|
+
continue;
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const lhs = line.slice( 0, eqIdx ).trim();
|
|
44
|
+
const rhs = line.slice( eqIdx + 1 ).trim();
|
|
42
45
|
|
|
43
46
|
if ( rhs.endsWith( '{' ) ) {
|
|
44
47
|
|
|
@@ -66,8 +69,24 @@ class USDAParser {
|
|
|
66
69
|
|
|
67
70
|
}
|
|
68
71
|
|
|
72
|
+
} else if ( line.includes( ':' ) && ! line.includes( '=' ) ) {
|
|
73
|
+
|
|
74
|
+
// Handle dictionary entries like "0: [(...)...]" for timeSamples
|
|
75
|
+
const colonIdx = line.indexOf( ':' );
|
|
76
|
+
const key = line.slice( 0, colonIdx ).trim();
|
|
77
|
+
const value = line.slice( colonIdx + 1 ).trim();
|
|
78
|
+
|
|
79
|
+
// Only process if key looks like a number (timeSamples frame)
|
|
80
|
+
if ( /^[\d.]+$/.test( key ) ) {
|
|
81
|
+
|
|
82
|
+
target[ key ] = value;
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
69
86
|
} else if ( line.endsWith( '{' ) ) {
|
|
70
87
|
|
|
88
|
+
string = line.slice( 0, - 1 ).trim() || string;
|
|
89
|
+
|
|
71
90
|
const group = target[ string ] || {};
|
|
72
91
|
stack.push( group );
|
|
73
92
|
|
|
@@ -98,7 +117,7 @@ class USDAParser {
|
|
|
98
117
|
|
|
99
118
|
target = stack[ stack.length - 1 ];
|
|
100
119
|
|
|
101
|
-
} else {
|
|
120
|
+
} else if ( line.trim() ) {
|
|
102
121
|
|
|
103
122
|
string = line.trim();
|
|
104
123
|
|
|
@@ -110,499 +129,604 @@ class USDAParser {
|
|
|
110
129
|
|
|
111
130
|
}
|
|
112
131
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const root = this.parseText( text );
|
|
132
|
+
_preprocess( text ) {
|
|
116
133
|
|
|
117
|
-
//
|
|
134
|
+
// Remove block comments /* ... */
|
|
135
|
+
text = this._stripBlockComments( text );
|
|
118
136
|
|
|
119
|
-
|
|
137
|
+
// Collapse triple-quoted strings into single lines
|
|
138
|
+
text = this._collapseTripleQuotedStrings( text );
|
|
120
139
|
|
|
121
|
-
|
|
140
|
+
// Remove line comments # ... (but preserve #usda header)
|
|
141
|
+
// Only remove # comments that aren't at the start of a line or after whitespace
|
|
142
|
+
const lines = text.split( '\n' );
|
|
143
|
+
const processed = [];
|
|
122
144
|
|
|
123
|
-
|
|
145
|
+
let inMultilineValue = false;
|
|
146
|
+
let bracketDepth = 0;
|
|
147
|
+
let parenDepth = 0;
|
|
148
|
+
let accumulated = '';
|
|
124
149
|
|
|
125
|
-
|
|
126
|
-
const parts = reference.split( '@' );
|
|
127
|
-
const path = parts[ 1 ].replace( /^.\//, '' );
|
|
128
|
-
const id = parts[ 2 ].replace( /^<\//, '' ).replace( />$/, '' );
|
|
150
|
+
for ( let i = 0; i < lines.length; i ++ ) {
|
|
129
151
|
|
|
130
|
-
|
|
152
|
+
let line = lines[ i ];
|
|
131
153
|
|
|
132
|
-
|
|
154
|
+
// Strip inline comments (but not inside strings)
|
|
155
|
+
line = this._stripInlineComment( line );
|
|
133
156
|
|
|
134
|
-
|
|
157
|
+
// Track bracket/paren depth for multiline values
|
|
158
|
+
const trimmed = line.trim();
|
|
135
159
|
|
|
136
|
-
|
|
160
|
+
if ( inMultilineValue ) {
|
|
137
161
|
|
|
138
|
-
|
|
162
|
+
// Continue accumulating multiline value
|
|
163
|
+
accumulated += ' ' + trimmed;
|
|
139
164
|
|
|
140
|
-
|
|
165
|
+
// Update depths
|
|
166
|
+
for ( const ch of trimmed ) {
|
|
141
167
|
|
|
142
|
-
|
|
168
|
+
if ( ch === '[' ) bracketDepth ++;
|
|
169
|
+
else if ( ch === ']' ) bracketDepth --;
|
|
170
|
+
else if ( ch === '(' && bracketDepth > 0 ) parenDepth ++;
|
|
171
|
+
else if ( ch === ')' && bracketDepth > 0 ) parenDepth --;
|
|
143
172
|
|
|
144
|
-
|
|
173
|
+
}
|
|
145
174
|
|
|
146
|
-
|
|
175
|
+
// Check if multiline value is complete
|
|
176
|
+
if ( bracketDepth === 0 && parenDepth === 0 ) {
|
|
147
177
|
|
|
148
|
-
|
|
178
|
+
processed.push( accumulated );
|
|
179
|
+
accumulated = '';
|
|
180
|
+
inMultilineValue = false;
|
|
149
181
|
|
|
150
182
|
}
|
|
151
183
|
|
|
152
|
-
}
|
|
184
|
+
} else {
|
|
153
185
|
|
|
154
|
-
|
|
186
|
+
// Check if this line starts a multiline array value
|
|
187
|
+
// Look for patterns like "attr = [" or "attr = @path@[" without closing ]
|
|
188
|
+
if ( trimmed.includes( '=' ) ) {
|
|
155
189
|
|
|
156
|
-
|
|
190
|
+
const eqIdx = this._findAssignmentOperator( trimmed );
|
|
157
191
|
|
|
158
|
-
|
|
192
|
+
if ( eqIdx !== - 1 ) {
|
|
159
193
|
|
|
160
|
-
|
|
194
|
+
const rhs = trimmed.slice( eqIdx + 1 ).trim();
|
|
161
195
|
|
|
162
|
-
|
|
196
|
+
// Count brackets in the value part
|
|
197
|
+
let openBrackets = 0;
|
|
198
|
+
let closeBrackets = 0;
|
|
199
|
+
|
|
200
|
+
for ( const ch of rhs ) {
|
|
201
|
+
|
|
202
|
+
if ( ch === '[' ) openBrackets ++;
|
|
203
|
+
else if ( ch === ']' ) closeBrackets ++;
|
|
204
|
+
|
|
205
|
+
}
|
|
163
206
|
|
|
207
|
+
if ( openBrackets > closeBrackets ) {
|
|
164
208
|
|
|
165
|
-
|
|
209
|
+
// Multiline array detected
|
|
210
|
+
inMultilineValue = true;
|
|
211
|
+
bracketDepth = openBrackets - closeBrackets;
|
|
212
|
+
parenDepth = 0;
|
|
213
|
+
accumulated = trimmed;
|
|
214
|
+
continue;
|
|
166
215
|
|
|
167
|
-
|
|
216
|
+
}
|
|
168
217
|
|
|
169
|
-
|
|
218
|
+
}
|
|
170
219
|
|
|
171
220
|
}
|
|
172
221
|
|
|
222
|
+
processed.push( trimmed );
|
|
223
|
+
|
|
173
224
|
}
|
|
174
225
|
|
|
175
226
|
}
|
|
176
227
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if ( ! data ) return undefined;
|
|
228
|
+
return processed.join( '\n' );
|
|
180
229
|
|
|
181
|
-
|
|
182
|
-
let indices = null;
|
|
183
|
-
let counts = null;
|
|
184
|
-
let uvs = null;
|
|
230
|
+
}
|
|
185
231
|
|
|
186
|
-
|
|
232
|
+
_stripBlockComments( text ) {
|
|
187
233
|
|
|
188
|
-
|
|
234
|
+
// Iteratively remove /* ... */ comments without regex backtracking
|
|
235
|
+
let result = '';
|
|
236
|
+
let i = 0;
|
|
189
237
|
|
|
190
|
-
|
|
238
|
+
while ( i < text.length ) {
|
|
191
239
|
|
|
192
|
-
|
|
240
|
+
// Check for block comment start
|
|
241
|
+
if ( text[ i ] === '/' && i + 1 < text.length && text[ i + 1 ] === '*' ) {
|
|
193
242
|
|
|
194
|
-
|
|
243
|
+
// Find the closing */
|
|
244
|
+
let j = i + 2;
|
|
195
245
|
|
|
196
|
-
|
|
246
|
+
while ( j < text.length ) {
|
|
197
247
|
|
|
198
|
-
|
|
248
|
+
if ( text[ j ] === '*' && j + 1 < text.length && text[ j + 1 ] === '/' ) {
|
|
199
249
|
|
|
200
|
-
|
|
201
|
-
|
|
250
|
+
// Found closing, skip past it
|
|
251
|
+
j += 2;
|
|
252
|
+
break;
|
|
202
253
|
|
|
203
|
-
|
|
254
|
+
}
|
|
204
255
|
|
|
205
|
-
|
|
256
|
+
j ++;
|
|
206
257
|
|
|
207
|
-
|
|
258
|
+
}
|
|
208
259
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
let attribute = new BufferAttribute( new Float32Array( positions ), 3 );
|
|
260
|
+
// Move past the comment (or to end if unclosed)
|
|
261
|
+
i = j;
|
|
212
262
|
|
|
213
|
-
|
|
263
|
+
} else {
|
|
214
264
|
|
|
215
|
-
|
|
265
|
+
result += text[ i ];
|
|
266
|
+
i ++;
|
|
216
267
|
|
|
217
268
|
}
|
|
218
269
|
|
|
219
|
-
|
|
270
|
+
}
|
|
220
271
|
|
|
221
|
-
|
|
272
|
+
return result;
|
|
222
273
|
|
|
223
|
-
|
|
274
|
+
}
|
|
224
275
|
|
|
225
|
-
|
|
276
|
+
_collapseTripleQuotedStrings( text ) {
|
|
226
277
|
|
|
227
|
-
|
|
278
|
+
let result = '';
|
|
279
|
+
let i = 0;
|
|
228
280
|
|
|
229
|
-
|
|
230
|
-
let attribute = new BufferAttribute( new Float32Array( uvs ), 2 );
|
|
281
|
+
while ( i < text.length ) {
|
|
231
282
|
|
|
232
|
-
|
|
283
|
+
if ( i + 2 < text.length ) {
|
|
233
284
|
|
|
234
|
-
|
|
285
|
+
const triple = text.slice( i, i + 3 );
|
|
235
286
|
|
|
236
|
-
|
|
287
|
+
if ( triple === '\'\'\'' || triple === '"""' ) {
|
|
237
288
|
|
|
238
|
-
|
|
289
|
+
const quoteChar = triple;
|
|
290
|
+
result += quoteChar;
|
|
291
|
+
i += 3;
|
|
239
292
|
|
|
240
|
-
|
|
293
|
+
while ( i < text.length ) {
|
|
241
294
|
|
|
242
|
-
|
|
243
|
-
let indices = JSON.parse( data[ 'int[] primvars:st:indices' ] );
|
|
244
|
-
indices = toTriangleIndices( indices, counts );
|
|
245
|
-
geometry.setAttribute( 'uv', toFlatBufferAttribute( attribute, indices ) );
|
|
295
|
+
if ( i + 2 < text.length && text.slice( i, i + 3 ) === quoteChar ) {
|
|
246
296
|
|
|
247
|
-
|
|
297
|
+
result += quoteChar;
|
|
298
|
+
i += 3;
|
|
299
|
+
break;
|
|
248
300
|
|
|
249
|
-
|
|
301
|
+
} else {
|
|
250
302
|
|
|
251
|
-
|
|
303
|
+
if ( text[ i ] === '\n' ) {
|
|
252
304
|
|
|
253
|
-
|
|
254
|
-
let attribute = new BufferAttribute( new Float32Array( normals ), 3 );
|
|
305
|
+
result += '\\n';
|
|
255
306
|
|
|
256
|
-
|
|
307
|
+
} else if ( text[ i ] !== '\r' ) {
|
|
257
308
|
|
|
258
|
-
|
|
309
|
+
result += text[ i ];
|
|
259
310
|
|
|
260
|
-
|
|
311
|
+
}
|
|
261
312
|
|
|
262
|
-
|
|
313
|
+
i ++;
|
|
263
314
|
|
|
264
|
-
|
|
315
|
+
}
|
|
265
316
|
|
|
266
|
-
|
|
317
|
+
}
|
|
267
318
|
|
|
268
|
-
|
|
269
|
-
indices = toTriangleIndices( indices, counts );
|
|
270
|
-
attribute = toFlatBufferAttribute( attribute, indices );
|
|
319
|
+
continue;
|
|
271
320
|
|
|
272
321
|
}
|
|
273
322
|
|
|
274
|
-
|
|
323
|
+
}
|
|
275
324
|
|
|
276
|
-
|
|
325
|
+
result += text[ i ];
|
|
326
|
+
i ++;
|
|
277
327
|
|
|
278
|
-
|
|
328
|
+
}
|
|
279
329
|
|
|
280
|
-
|
|
330
|
+
return result;
|
|
281
331
|
|
|
282
|
-
|
|
332
|
+
}
|
|
283
333
|
|
|
284
|
-
|
|
334
|
+
_stripInlineComment( line ) {
|
|
285
335
|
|
|
286
|
-
|
|
336
|
+
// Don't strip if line starts with #usda
|
|
337
|
+
if ( line.trim().startsWith( '#usda' ) ) return line;
|
|
287
338
|
|
|
288
|
-
|
|
339
|
+
// Find # that's not inside a string
|
|
340
|
+
let inString = false;
|
|
341
|
+
let stringChar = null;
|
|
342
|
+
let escaped = false;
|
|
289
343
|
|
|
290
|
-
|
|
344
|
+
for ( let i = 0; i < line.length; i ++ ) {
|
|
291
345
|
|
|
292
|
-
|
|
346
|
+
const ch = line[ i ];
|
|
293
347
|
|
|
294
|
-
|
|
348
|
+
if ( escaped ) {
|
|
295
349
|
|
|
296
|
-
|
|
350
|
+
escaped = false;
|
|
351
|
+
continue;
|
|
352
|
+
|
|
353
|
+
}
|
|
297
354
|
|
|
298
|
-
|
|
355
|
+
if ( ch === '\\' ) {
|
|
299
356
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
const c = rawIndices[ stride + 2 ];
|
|
357
|
+
escaped = true;
|
|
358
|
+
continue;
|
|
303
359
|
|
|
304
|
-
|
|
360
|
+
}
|
|
305
361
|
|
|
306
|
-
|
|
362
|
+
if ( ! inString && ( ch === '"' || ch === '\'' ) ) {
|
|
307
363
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const c = rawIndices[ stride + 2 ];
|
|
311
|
-
const d = rawIndices[ stride + 3 ];
|
|
364
|
+
inString = true;
|
|
365
|
+
stringChar = ch;
|
|
312
366
|
|
|
313
|
-
|
|
314
|
-
indices.push( a, c, d );
|
|
367
|
+
} else if ( inString && ch === stringChar ) {
|
|
315
368
|
|
|
316
|
-
|
|
369
|
+
inString = false;
|
|
370
|
+
stringChar = null;
|
|
317
371
|
|
|
318
|
-
|
|
372
|
+
} else if ( ! inString && ch === '#' ) {
|
|
319
373
|
|
|
320
|
-
|
|
374
|
+
// Found comment start outside of string
|
|
375
|
+
return line.slice( 0, i ).trimEnd();
|
|
321
376
|
|
|
322
377
|
}
|
|
323
378
|
|
|
324
|
-
return indices;
|
|
325
|
-
|
|
326
379
|
}
|
|
327
380
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
const array = attribute.array;
|
|
331
|
-
const itemSize = attribute.itemSize;
|
|
381
|
+
return line;
|
|
332
382
|
|
|
333
|
-
|
|
383
|
+
}
|
|
334
384
|
|
|
335
|
-
|
|
385
|
+
_findAssignmentOperator( line ) {
|
|
336
386
|
|
|
337
|
-
|
|
387
|
+
// Find the first '=' that's not inside quotes
|
|
388
|
+
let inString = false;
|
|
389
|
+
let stringChar = null;
|
|
390
|
+
let escaped = false;
|
|
338
391
|
|
|
339
|
-
|
|
392
|
+
for ( let i = 0; i < line.length; i ++ ) {
|
|
340
393
|
|
|
341
|
-
|
|
394
|
+
const ch = line[ i ];
|
|
342
395
|
|
|
343
|
-
|
|
396
|
+
if ( escaped ) {
|
|
344
397
|
|
|
345
|
-
|
|
398
|
+
escaped = false;
|
|
399
|
+
continue;
|
|
346
400
|
|
|
347
401
|
}
|
|
348
402
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
403
|
+
if ( ch === '\\' ) {
|
|
352
404
|
|
|
353
|
-
|
|
405
|
+
escaped = true;
|
|
406
|
+
continue;
|
|
354
407
|
|
|
355
|
-
|
|
408
|
+
}
|
|
356
409
|
|
|
357
|
-
if (
|
|
410
|
+
if ( ! inString && ( ch === '"' || ch === '\'' ) ) {
|
|
358
411
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
const parts = id.split( '/' );
|
|
412
|
+
inString = true;
|
|
413
|
+
stringChar = ch;
|
|
362
414
|
|
|
363
|
-
|
|
415
|
+
} else if ( inString && ch === stringChar ) {
|
|
364
416
|
|
|
365
|
-
|
|
417
|
+
inString = false;
|
|
418
|
+
stringChar = null;
|
|
366
419
|
|
|
367
|
-
|
|
420
|
+
} else if ( ! inString && ch === '=' ) {
|
|
368
421
|
|
|
369
|
-
|
|
422
|
+
return i;
|
|
370
423
|
|
|
371
|
-
|
|
424
|
+
}
|
|
372
425
|
|
|
373
|
-
|
|
426
|
+
}
|
|
374
427
|
|
|
375
|
-
|
|
428
|
+
return - 1;
|
|
376
429
|
|
|
377
|
-
|
|
430
|
+
}
|
|
378
431
|
|
|
379
|
-
|
|
432
|
+
/**
|
|
433
|
+
* Parse USDA text and return raw spec data in specsByPath format.
|
|
434
|
+
* Used by USDComposer for unified scene composition.
|
|
435
|
+
*/
|
|
436
|
+
parseData( text ) {
|
|
380
437
|
|
|
381
|
-
|
|
438
|
+
const root = this.parseText( text );
|
|
439
|
+
const specsByPath = {};
|
|
382
440
|
|
|
383
|
-
|
|
441
|
+
// Parse root metadata
|
|
442
|
+
const rootFields = {};
|
|
443
|
+
if ( '#usda 1.0' in root ) {
|
|
384
444
|
|
|
385
|
-
|
|
445
|
+
const header = root[ '#usda 1.0' ];
|
|
386
446
|
|
|
387
|
-
|
|
447
|
+
if ( header.upAxis ) {
|
|
388
448
|
|
|
389
|
-
|
|
449
|
+
rootFields.upAxis = header.upAxis.replace( /"/g, '' );
|
|
390
450
|
|
|
391
451
|
}
|
|
392
452
|
|
|
393
|
-
|
|
453
|
+
if ( header.defaultPrim ) {
|
|
394
454
|
|
|
395
|
-
|
|
455
|
+
rootFields.defaultPrim = header.defaultPrim.replace( /"/g, '' );
|
|
396
456
|
|
|
397
|
-
|
|
457
|
+
}
|
|
398
458
|
|
|
399
|
-
if (
|
|
459
|
+
if ( header.metersPerUnit !== undefined ) {
|
|
400
460
|
|
|
401
|
-
|
|
461
|
+
rootFields.metersPerUnit = parseFloat( header.metersPerUnit );
|
|
402
462
|
|
|
403
463
|
}
|
|
404
464
|
|
|
405
|
-
if (
|
|
465
|
+
if ( header.framesPerSecond !== undefined ) {
|
|
406
466
|
|
|
407
|
-
|
|
467
|
+
rootFields.framesPerSecond = parseFloat( header.framesPerSecond );
|
|
408
468
|
|
|
409
469
|
}
|
|
410
470
|
|
|
411
|
-
if (
|
|
471
|
+
if ( header.timeCodesPerSecond !== undefined ) {
|
|
412
472
|
|
|
413
|
-
|
|
473
|
+
rootFields.timeCodesPerSecond = parseFloat( header.timeCodesPerSecond );
|
|
414
474
|
|
|
415
475
|
}
|
|
416
476
|
|
|
417
477
|
}
|
|
418
478
|
|
|
419
|
-
|
|
479
|
+
specsByPath[ '/' ] = { specType: SpecType.Prim, fields: rootFields };
|
|
420
480
|
|
|
421
|
-
|
|
481
|
+
// Walk the tree and build specsByPath
|
|
482
|
+
const walkTree = ( data, parentPath ) => {
|
|
422
483
|
|
|
423
|
-
|
|
484
|
+
const primChildren = [];
|
|
424
485
|
|
|
425
|
-
|
|
486
|
+
for ( const key in data ) {
|
|
426
487
|
|
|
427
|
-
|
|
488
|
+
// Skip metadata
|
|
489
|
+
if ( key === '#usda 1.0' ) continue;
|
|
490
|
+
if ( key === 'variants' ) continue;
|
|
428
491
|
|
|
429
|
-
|
|
492
|
+
// Check for primitive definitions
|
|
493
|
+
// Matches both 'def TypeName "name"' and 'def "name"' (no type)
|
|
494
|
+
const defMatch = key.match( DEF_MATCH_REGEX );
|
|
495
|
+
if ( defMatch ) {
|
|
430
496
|
|
|
431
|
-
const
|
|
497
|
+
const typeName = defMatch[ 1 ] || '';
|
|
498
|
+
const name = defMatch[ 2 ];
|
|
499
|
+
const path = parentPath === '/' ? '/' + name : parentPath + '/' + name;
|
|
432
500
|
|
|
433
|
-
|
|
501
|
+
primChildren.push( name );
|
|
434
502
|
|
|
435
|
-
|
|
436
|
-
|
|
503
|
+
const primFields = { typeName };
|
|
504
|
+
const primData = data[ key ];
|
|
437
505
|
|
|
438
|
-
|
|
506
|
+
// Extract attributes and relationships from this prim
|
|
507
|
+
this._extractPrimData( primData, path, primFields, specsByPath, SpecType );
|
|
508
|
+
|
|
509
|
+
specsByPath[ path ] = { specType: SpecType.Prim, fields: primFields };
|
|
510
|
+
|
|
511
|
+
// Recurse into children
|
|
512
|
+
walkTree( primData, path );
|
|
439
513
|
|
|
440
514
|
}
|
|
441
515
|
|
|
442
|
-
|
|
516
|
+
}
|
|
443
517
|
|
|
444
|
-
|
|
518
|
+
// Add primChildren to parent spec
|
|
519
|
+
if ( primChildren.length > 0 && specsByPath[ parentPath ] ) {
|
|
445
520
|
|
|
446
|
-
|
|
447
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
521
|
+
specsByPath[ parentPath ].fields.primChildren = primChildren;
|
|
448
522
|
|
|
449
|
-
|
|
450
|
-
material.map.colorSpace = SRGBColorSpace;
|
|
523
|
+
}
|
|
451
524
|
|
|
452
|
-
|
|
525
|
+
};
|
|
453
526
|
|
|
454
|
-
|
|
527
|
+
walkTree( root, '/' );
|
|
455
528
|
|
|
456
|
-
|
|
529
|
+
// Fallback: infer elementSize for primvars:skel:jointIndices/jointWeights
|
|
530
|
+
// when not explicitly declared in the USDA text
|
|
531
|
+
this._inferSkelElementSize( specsByPath );
|
|
457
532
|
|
|
458
|
-
|
|
533
|
+
return { specsByPath };
|
|
459
534
|
|
|
460
|
-
|
|
461
|
-
material.color.fromArray( JSON.parse( '[' + color + ']' ) );
|
|
535
|
+
}
|
|
462
536
|
|
|
463
|
-
|
|
537
|
+
_inferSkelElementSize( specsByPath ) {
|
|
464
538
|
|
|
465
|
-
|
|
539
|
+
// For each mesh prim with primvars:skel:jointIndices/jointWeights but no
|
|
540
|
+
// elementSize, infer it from the data: elementSize = array.length / numVertices.
|
|
541
|
+
for ( const path in specsByPath ) {
|
|
466
542
|
|
|
467
|
-
|
|
468
|
-
|
|
543
|
+
const spec = specsByPath[ path ];
|
|
544
|
+
if ( spec.specType !== SpecType.Prim || spec.fields.typeName !== 'Mesh' ) continue;
|
|
469
545
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
material.emissive.set( 0xffffff );
|
|
546
|
+
const pointsSpec = specsByPath[ path + '.points' ];
|
|
547
|
+
if ( ! pointsSpec || ! pointsSpec.fields.default ) continue;
|
|
473
548
|
|
|
474
|
-
|
|
549
|
+
const numVertices = pointsSpec.fields.default.length / 3;
|
|
550
|
+
if ( numVertices === 0 ) continue;
|
|
475
551
|
|
|
476
|
-
|
|
552
|
+
this._inferElementSize( specsByPath[ path + '.primvars:skel:jointIndices' ], numVertices );
|
|
553
|
+
this._inferElementSize( specsByPath[ path + '.primvars:skel:jointWeights' ], numVertices );
|
|
477
554
|
|
|
478
|
-
|
|
555
|
+
}
|
|
479
556
|
|
|
480
|
-
|
|
557
|
+
}
|
|
481
558
|
|
|
482
|
-
|
|
483
|
-
material.emissive.fromArray( JSON.parse( '[' + color + ']' ) );
|
|
559
|
+
_inferElementSize( attrSpec, numVertices ) {
|
|
484
560
|
|
|
485
|
-
|
|
561
|
+
if ( ! attrSpec || attrSpec.fields.elementSize !== undefined || ! attrSpec.fields.default ) return;
|
|
486
562
|
|
|
487
|
-
|
|
563
|
+
const len = attrSpec.fields.default.length;
|
|
564
|
+
if ( len > 0 && len % numVertices === 0 ) attrSpec.fields.elementSize = len / numVertices;
|
|
488
565
|
|
|
489
|
-
|
|
490
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
566
|
+
}
|
|
491
567
|
|
|
492
|
-
|
|
493
|
-
material.normalMap.colorSpace = NoColorSpace;
|
|
568
|
+
_extractPrimData( data, path, primFields, specsByPath, SpecType ) {
|
|
494
569
|
|
|
495
|
-
|
|
570
|
+
if ( ! data || typeof data !== 'object' ) return;
|
|
496
571
|
|
|
497
|
-
|
|
572
|
+
for ( const key in data ) {
|
|
498
573
|
|
|
499
|
-
|
|
574
|
+
// Skip nested defs (handled by walkTree)
|
|
575
|
+
if ( key.startsWith( 'def ' ) ) continue;
|
|
500
576
|
|
|
501
|
-
|
|
577
|
+
if ( key === 'prepend references' ) {
|
|
502
578
|
|
|
503
|
-
|
|
579
|
+
primFields.references = [ data[ key ] ];
|
|
580
|
+
continue;
|
|
504
581
|
|
|
505
|
-
|
|
506
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
582
|
+
}
|
|
507
583
|
|
|
508
|
-
|
|
509
|
-
material.roughnessMap = buildTexture( sampler );
|
|
510
|
-
material.roughnessMap.colorSpace = NoColorSpace;
|
|
584
|
+
if ( key === 'payload' ) {
|
|
511
585
|
|
|
512
|
-
|
|
586
|
+
primFields.payload = data[ key ];
|
|
587
|
+
continue;
|
|
513
588
|
|
|
514
|
-
|
|
589
|
+
}
|
|
515
590
|
|
|
516
|
-
|
|
591
|
+
if ( key === 'variants' ) {
|
|
517
592
|
|
|
518
|
-
|
|
593
|
+
const variantSelection = {};
|
|
594
|
+
const variants = data[ key ];
|
|
519
595
|
|
|
520
|
-
|
|
596
|
+
for ( const vKey in variants ) {
|
|
597
|
+
|
|
598
|
+
const match = vKey.match( VARIANT_STRING_REGEX );
|
|
599
|
+
if ( match ) {
|
|
600
|
+
|
|
601
|
+
const variantSetName = match[ 1 ];
|
|
602
|
+
const variantValue = variants[ vKey ].replace( /"/g, '' );
|
|
603
|
+
variantSelection[ variantSetName ] = variantValue;
|
|
521
604
|
|
|
522
605
|
}
|
|
523
606
|
|
|
524
|
-
|
|
607
|
+
}
|
|
525
608
|
|
|
526
|
-
|
|
527
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
609
|
+
if ( Object.keys( variantSelection ).length > 0 ) {
|
|
528
610
|
|
|
529
|
-
|
|
530
|
-
material.metalnessMap = buildTexture( sampler );
|
|
531
|
-
material.metalnessMap.colorSpace = NoColorSpace;
|
|
611
|
+
primFields.variantSelection = variantSelection;
|
|
532
612
|
|
|
533
|
-
|
|
613
|
+
}
|
|
534
614
|
|
|
535
|
-
|
|
615
|
+
continue;
|
|
536
616
|
|
|
537
|
-
|
|
617
|
+
}
|
|
538
618
|
|
|
539
|
-
|
|
619
|
+
if ( key.startsWith( 'rel ' ) ) {
|
|
540
620
|
|
|
541
|
-
|
|
621
|
+
const relName = key.slice( 4 );
|
|
622
|
+
const relPath = path + '.' + relName;
|
|
623
|
+
const target = data[ key ].replace( /[<>]/g, '' );
|
|
624
|
+
specsByPath[ relPath ] = {
|
|
625
|
+
specType: SpecType.Relationship,
|
|
626
|
+
fields: { targetPaths: [ target ] }
|
|
627
|
+
};
|
|
628
|
+
continue;
|
|
542
629
|
|
|
543
|
-
|
|
630
|
+
}
|
|
544
631
|
|
|
545
|
-
|
|
632
|
+
// Handle xformOpOrder
|
|
633
|
+
if ( key.includes( 'xformOpOrder' ) ) {
|
|
546
634
|
|
|
547
|
-
|
|
548
|
-
|
|
635
|
+
const ops = data[ key ]
|
|
636
|
+
.replace( /[\[\]]/g, '' )
|
|
637
|
+
.split( ',' )
|
|
638
|
+
.map( s => s.trim().replace( /"/g, '' ) );
|
|
639
|
+
primFields.xformOpOrder = ops;
|
|
640
|
+
continue;
|
|
549
641
|
|
|
550
|
-
|
|
551
|
-
material.clearcoatMap = buildTexture( sampler );
|
|
552
|
-
material.clearcoatMap.colorSpace = NoColorSpace;
|
|
642
|
+
}
|
|
553
643
|
|
|
554
|
-
|
|
644
|
+
// Handle typed attributes
|
|
645
|
+
// Format: [qualifier] type attrName (e.g., "uniform token[] joints", "float3 position")
|
|
646
|
+
const attrMatch = key.match( ATTR_MATCH_REGEX );
|
|
647
|
+
if ( attrMatch ) {
|
|
555
648
|
|
|
556
|
-
|
|
649
|
+
const valueType = attrMatch[ 1 ];
|
|
650
|
+
const attrName = attrMatch[ 2 ];
|
|
651
|
+
const rawValue = data[ key ];
|
|
557
652
|
|
|
558
|
-
|
|
653
|
+
// Handle connection attributes (e.g., "inputs:normal.connect = </path>")
|
|
654
|
+
if ( attrName.endsWith( '.connect' ) ) {
|
|
655
|
+
|
|
656
|
+
const baseAttrName = attrName.slice( 0, - 8 ); // Remove '.connect'
|
|
657
|
+
const attrPath = path + '.' + baseAttrName;
|
|
559
658
|
|
|
560
|
-
|
|
659
|
+
// Parse connection path - extract from <path> format
|
|
660
|
+
let connPath = String( rawValue ).trim();
|
|
661
|
+
if ( connPath.startsWith( '<' ) ) connPath = connPath.slice( 1 );
|
|
662
|
+
if ( connPath.endsWith( '>' ) ) connPath = connPath.slice( 0, - 1 );
|
|
561
663
|
|
|
562
|
-
|
|
664
|
+
// Get or create the attribute spec
|
|
665
|
+
if ( ! specsByPath[ attrPath ] ) {
|
|
666
|
+
|
|
667
|
+
specsByPath[ attrPath ] = {
|
|
668
|
+
specType: SpecType.Attribute,
|
|
669
|
+
fields: { typeName: valueType }
|
|
670
|
+
};
|
|
563
671
|
|
|
564
672
|
}
|
|
565
673
|
|
|
566
|
-
|
|
674
|
+
specsByPath[ attrPath ].fields.connectionPaths = [ connPath ];
|
|
675
|
+
continue;
|
|
567
676
|
|
|
568
|
-
|
|
569
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
677
|
+
}
|
|
570
678
|
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
material.clearcoatRoughnessMap.colorSpace = NoColorSpace;
|
|
679
|
+
// Handle timeSamples attributes specially
|
|
680
|
+
if ( attrName.endsWith( '.timeSamples' ) && typeof rawValue === 'object' ) {
|
|
574
681
|
|
|
575
|
-
|
|
682
|
+
const baseAttrName = attrName.slice( 0, - 12 ); // Remove '.timeSamples'
|
|
683
|
+
const attrPath = path + '.' + baseAttrName;
|
|
576
684
|
|
|
577
|
-
|
|
685
|
+
// Parse timeSamples dictionary into times and values arrays
|
|
686
|
+
const times = [];
|
|
687
|
+
const values = [];
|
|
578
688
|
|
|
579
|
-
|
|
689
|
+
for ( const frameKey in rawValue ) {
|
|
580
690
|
|
|
581
|
-
|
|
691
|
+
const frame = parseFloat( frameKey );
|
|
692
|
+
if ( isNaN( frame ) ) continue;
|
|
582
693
|
|
|
583
|
-
|
|
694
|
+
times.push( frame );
|
|
695
|
+
values.push( this._parseAttributeValue( valueType, rawValue[ frameKey ] ) );
|
|
584
696
|
|
|
585
697
|
}
|
|
586
698
|
|
|
587
|
-
|
|
699
|
+
// Sort by time
|
|
700
|
+
const sorted = times.map( ( t, i ) => ( { t, v: values[ i ] } ) ).sort( ( a, b ) => a.t - b.t );
|
|
588
701
|
|
|
589
|
-
|
|
702
|
+
specsByPath[ attrPath ] = {
|
|
703
|
+
specType: SpecType.Attribute,
|
|
704
|
+
fields: {
|
|
705
|
+
timeSamples: { times: sorted.map( s => s.t ), values: sorted.map( s => s.v ) },
|
|
706
|
+
typeName: valueType
|
|
707
|
+
}
|
|
708
|
+
};
|
|
590
709
|
|
|
591
|
-
|
|
710
|
+
} else {
|
|
592
711
|
|
|
593
|
-
|
|
712
|
+
// Parse value based on type
|
|
713
|
+
const parsedValue = this._parseAttributeValue( valueType, rawValue );
|
|
594
714
|
|
|
595
|
-
|
|
596
|
-
|
|
715
|
+
// Store as attribute spec, preserving any existing fields
|
|
716
|
+
// (e.g. connectionPaths set by an earlier `.connect` form)
|
|
717
|
+
const attrPath = path + '.' + attrName;
|
|
597
718
|
|
|
598
|
-
|
|
599
|
-
material.aoMap.colorSpace = NoColorSpace;
|
|
719
|
+
if ( specsByPath[ attrPath ] ) {
|
|
600
720
|
|
|
601
|
-
|
|
721
|
+
specsByPath[ attrPath ].fields.default = parsedValue;
|
|
722
|
+
specsByPath[ attrPath ].fields.typeName = valueType;
|
|
602
723
|
|
|
603
|
-
|
|
724
|
+
} else {
|
|
604
725
|
|
|
605
|
-
|
|
726
|
+
specsByPath[ attrPath ] = {
|
|
727
|
+
specType: SpecType.Attribute,
|
|
728
|
+
fields: { default: parsedValue, typeName: valueType }
|
|
729
|
+
};
|
|
606
730
|
|
|
607
731
|
}
|
|
608
732
|
|
|
@@ -610,129 +734,165 @@ class USDAParser {
|
|
|
610
734
|
|
|
611
735
|
}
|
|
612
736
|
|
|
613
|
-
return material;
|
|
614
|
-
|
|
615
737
|
}
|
|
616
738
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
for ( const name in data ) {
|
|
739
|
+
}
|
|
620
740
|
|
|
621
|
-
|
|
741
|
+
_parseAttributeValue( valueType, rawValue ) {
|
|
622
742
|
|
|
623
|
-
|
|
743
|
+
if ( rawValue === undefined || rawValue === null ) return undefined;
|
|
624
744
|
|
|
625
|
-
|
|
745
|
+
const str = String( rawValue ).trim();
|
|
626
746
|
|
|
627
|
-
|
|
747
|
+
// Array types
|
|
748
|
+
if ( valueType.endsWith( '[]' ) ) {
|
|
628
749
|
|
|
629
|
-
|
|
750
|
+
let result;
|
|
630
751
|
|
|
631
|
-
|
|
752
|
+
// Parse JSON-like arrays
|
|
753
|
+
try {
|
|
632
754
|
|
|
633
|
-
|
|
755
|
+
// Handle arrays with parentheses like [(1,2,3), (4,5,6)]
|
|
756
|
+
// Remove trailing comma (valid in USDA but not JSON)
|
|
757
|
+
let cleaned = str.replace( /\(/g, '[' ).replace( /\)/g, ']' );
|
|
758
|
+
if ( cleaned.endsWith( ',' ) ) cleaned = cleaned.slice( 0, - 1 );
|
|
759
|
+
const parsed = JSON.parse( cleaned );
|
|
634
760
|
|
|
635
|
-
|
|
761
|
+
// Flatten nested arrays for types like point3f[]
|
|
762
|
+
result = Array.isArray( parsed ) && Array.isArray( parsed[ 0 ] ) ? parsed.flat() : parsed;
|
|
636
763
|
|
|
637
|
-
}
|
|
764
|
+
} catch ( e ) {
|
|
638
765
|
|
|
639
|
-
|
|
766
|
+
// Try simple array parsing
|
|
767
|
+
const cleaned = str.replace( /[\[\]]/g, '' );
|
|
768
|
+
result = cleaned.split( ',' ).map( s => {
|
|
640
769
|
|
|
641
|
-
|
|
770
|
+
const trimmed = s.trim();
|
|
771
|
+
const num = parseFloat( trimmed );
|
|
772
|
+
return isNaN( num ) ? trimmed.replace( /"/g, '' ) : num;
|
|
642
773
|
|
|
643
|
-
|
|
774
|
+
} );
|
|
644
775
|
|
|
645
|
-
|
|
776
|
+
}
|
|
646
777
|
|
|
647
|
-
|
|
778
|
+
//reorder (w, x, y, z) to (x, y, z, w)
|
|
779
|
+
if ( valueType.startsWith( 'quat' ) ) {
|
|
648
780
|
|
|
649
|
-
|
|
781
|
+
for ( let i = 0; i < result.length; i += 4 ) {
|
|
650
782
|
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
783
|
+
const w = result[ i ];
|
|
784
|
+
result[ i ] = result[ i + 1 ];
|
|
785
|
+
result[ i + 1 ] = result[ i + 2 ];
|
|
786
|
+
result[ i + 2 ] = result[ i + 3 ];
|
|
787
|
+
result[ i + 3 ] = w;
|
|
656
788
|
|
|
657
|
-
|
|
789
|
+
}
|
|
658
790
|
|
|
659
|
-
|
|
791
|
+
}
|
|
660
792
|
|
|
661
|
-
|
|
793
|
+
return result;
|
|
662
794
|
|
|
663
|
-
|
|
795
|
+
}
|
|
664
796
|
|
|
665
|
-
|
|
797
|
+
// Vector types (double3, float3, point3f, etc.)
|
|
798
|
+
if ( valueType.includes( '3' ) || valueType.includes( '2' ) || valueType.includes( '4' ) ) {
|
|
666
799
|
|
|
667
|
-
|
|
800
|
+
// Parse (x, y, z) format
|
|
801
|
+
const cleaned = str.replace( /[()]/g, '' );
|
|
802
|
+
const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
|
|
803
|
+
return values;
|
|
668
804
|
|
|
669
|
-
|
|
805
|
+
}
|
|
670
806
|
|
|
671
|
-
|
|
807
|
+
// Quaternion types (quatf, quatd, quath)
|
|
808
|
+
// Text format is (w, x, y, z), convert to (x, y, z, w)
|
|
809
|
+
if ( valueType.startsWith( 'quat' ) ) {
|
|
672
810
|
|
|
673
|
-
|
|
811
|
+
const cleaned = str.replace( /[()]/g, '' );
|
|
812
|
+
const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
|
|
813
|
+
return [ values[ 1 ], values[ 2 ], values[ 3 ], values[ 0 ] ];
|
|
674
814
|
|
|
675
815
|
}
|
|
676
816
|
|
|
677
|
-
|
|
817
|
+
// Matrix types
|
|
818
|
+
if ( valueType.includes( 'matrix' ) ) {
|
|
678
819
|
|
|
679
|
-
const
|
|
680
|
-
const
|
|
820
|
+
const cleaned = str.replace( /[()]/g, '' );
|
|
821
|
+
const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
|
|
822
|
+
return values;
|
|
681
823
|
|
|
682
|
-
|
|
824
|
+
}
|
|
683
825
|
|
|
684
|
-
|
|
826
|
+
// Scalar numeric types
|
|
827
|
+
if ( valueType === 'float' || valueType === 'double' || valueType === 'int' ) {
|
|
685
828
|
|
|
686
|
-
|
|
829
|
+
return parseFloat( str );
|
|
687
830
|
|
|
688
|
-
|
|
689
|
-
mesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );
|
|
831
|
+
}
|
|
690
832
|
|
|
691
|
-
|
|
833
|
+
// String/token types
|
|
834
|
+
if ( valueType === 'string' || valueType === 'token' ) {
|
|
692
835
|
|
|
693
|
-
return
|
|
836
|
+
return this._parseString( str );
|
|
694
837
|
|
|
695
838
|
}
|
|
696
839
|
|
|
697
|
-
|
|
840
|
+
// Asset path
|
|
841
|
+
if ( valueType === 'asset' ) {
|
|
698
842
|
|
|
699
|
-
|
|
843
|
+
return str.replace( /@/g, '' ).replace( /"/g, '' );
|
|
700
844
|
|
|
701
|
-
|
|
845
|
+
}
|
|
702
846
|
|
|
703
|
-
|
|
847
|
+
// Default: return as string with quotes removed
|
|
848
|
+
return this._parseString( str );
|
|
704
849
|
|
|
705
|
-
|
|
850
|
+
}
|
|
706
851
|
|
|
707
|
-
|
|
852
|
+
_parseString( str ) {
|
|
708
853
|
|
|
709
|
-
|
|
854
|
+
// Remove surrounding quotes
|
|
855
|
+
if ( ( str.startsWith( '"' ) && str.endsWith( '"' ) ) ||
|
|
856
|
+
( str.startsWith( '\'' ) && str.endsWith( '\'' ) ) ) {
|
|
710
857
|
|
|
711
|
-
|
|
858
|
+
str = str.slice( 1, - 1 );
|
|
712
859
|
|
|
713
|
-
|
|
860
|
+
}
|
|
714
861
|
|
|
715
|
-
|
|
862
|
+
// Handle escape sequences
|
|
863
|
+
let result = '';
|
|
864
|
+
let i = 0;
|
|
716
865
|
|
|
717
|
-
|
|
866
|
+
while ( i < str.length ) {
|
|
718
867
|
|
|
719
|
-
|
|
868
|
+
if ( str[ i ] === '\\' && i + 1 < str.length ) {
|
|
720
869
|
|
|
721
|
-
|
|
870
|
+
const next = str[ i + 1 ];
|
|
722
871
|
|
|
723
|
-
|
|
872
|
+
switch ( next ) {
|
|
724
873
|
|
|
725
|
-
|
|
874
|
+
case 'n': result += '\n'; break;
|
|
875
|
+
case 't': result += '\t'; break;
|
|
876
|
+
case 'r': result += '\r'; break;
|
|
877
|
+
case '\\': result += '\\'; break;
|
|
878
|
+
case '"': result += '"'; break;
|
|
879
|
+
case '\'': result += '\''; break;
|
|
880
|
+
default: result += next; break;
|
|
726
881
|
|
|
727
|
-
|
|
882
|
+
}
|
|
728
883
|
|
|
729
|
-
|
|
884
|
+
i += 2;
|
|
730
885
|
|
|
731
|
-
|
|
886
|
+
} else {
|
|
887
|
+
|
|
888
|
+
result += str[ i ];
|
|
889
|
+
i ++;
|
|
890
|
+
|
|
891
|
+
}
|
|
732
892
|
|
|
733
893
|
}
|
|
734
894
|
|
|
735
|
-
return
|
|
895
|
+
return result;
|
|
736
896
|
|
|
737
897
|
}
|
|
738
898
|
|