super-three 0.179.0 → 0.184.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 +14522 -12207
- package/build/three.core.js +12005 -10954
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +2270 -1005
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +63 -18
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +16573 -7890
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +16533 -7888
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +12 -4
- package/examples/jsm/animation/CCDIKSolver.js +8 -4
- package/examples/jsm/controls/ArcballControls.js +15 -12
- package/examples/jsm/controls/DragControls.js +9 -59
- package/examples/jsm/controls/FirstPersonControls.js +61 -57
- package/examples/jsm/controls/FlyControls.js +5 -1
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +113 -10
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +9 -9
- package/examples/jsm/controls/TransformControls.js +35 -3
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +2 -2
- package/examples/jsm/exporters/GLTFExporter.js +185 -34
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +31 -5
- package/examples/jsm/geometries/DecalGeometry.js +3 -3
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +21 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +110 -13
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +542 -0
- package/examples/jsm/inspector/RendererInspector.js +425 -0
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- 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 +238 -0
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +380 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +268 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +2072 -0
- package/examples/jsm/inspector/ui/Style.js +1667 -0
- package/examples/jsm/inspector/ui/Tab.js +265 -0
- package/examples/jsm/inspector/ui/Values.js +476 -0
- package/examples/jsm/inspector/ui/utils.js +69 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineMaterial.js +7 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +3 -3
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +27 -4029
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +692 -53
- package/examples/jsm/loaders/FBXLoader.js +237 -39
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +159 -185
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +485 -0
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +162 -53
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +9 -41
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- 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/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -2
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +91 -7
- package/examples/jsm/objects/SkyMesh.js +151 -17
- package/examples/jsm/objects/Water.js +7 -6
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +11 -13
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- 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/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +175 -61
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +21 -8
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +7 -6
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +52 -10
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +23 -9
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
- package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- 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 +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +59 -9
- package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
- package/examples/jsm/tsl/display/GodraysNode.js +615 -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 +81 -20
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- 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 +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +638 -0
- package/examples/jsm/tsl/display/SSRNode.js +186 -69
- package/examples/jsm/tsl/display/SSSNode.js +490 -0
- 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 +381 -75
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- 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/utils/BufferGeometryUtils.js +3 -4
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
- package/package.json +27 -38
- package/src/Three.Core.js +7 -3
- package/src/Three.TSL.js +61 -16
- package/src/Three.WebGPU.Nodes.js +7 -0
- package/src/Three.WebGPU.js +11 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +21 -5
- package/src/animation/AnimationMixer.js +9 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +54 -14
- package/src/animation/PropertyBinding.js +12 -11
- 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 +11 -10
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +100 -7
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +24 -12
- package/src/core/Clock.js +7 -0
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +55 -6
- package/src/core/Raycaster.js +4 -3
- package/src/core/RenderTarget.js +14 -5
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +259 -57
- package/src/extras/TextureUtils.js +6 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +10 -8
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +9 -3
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +4 -1
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- 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/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +13 -2
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +30 -2
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +4 -4
- package/src/loaders/ImageBitmapLoader.js +17 -13
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +9 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +6 -4
- package/src/loaders/ObjectLoader.js +57 -17
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +5 -4
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +18 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +11 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +11 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +2 -1
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +22 -3
- package/src/materials/nodes/Line2NodeMaterial.js +36 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +95 -35
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +23 -21
- package/src/math/Matrix2.js +14 -10
- package/src/math/Matrix3.js +15 -11
- package/src/math/Matrix4.js +94 -81
- package/src/math/Plane.js +5 -4
- package/src/math/Quaternion.js +60 -84
- package/src/math/Sphere.js +1 -1
- package/src/math/Spherical.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -65
- package/src/nodes/TSL.js +11 -8
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +30 -3
- package/src/nodes/accessors/Camera.js +260 -13
- package/src/nodes/accessors/ClippingNode.js +10 -9
- package/src/nodes/accessors/CubeTextureNode.js +32 -6
- package/src/nodes/accessors/InstanceNode.js +164 -39
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +16 -15
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +51 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
- package/src/nodes/accessors/ReferenceNode.js +11 -10
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -24
- package/src/nodes/accessors/StorageTextureNode.js +62 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +41 -31
- package/src/nodes/accessors/TextureNode.js +193 -63
- 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 +25 -5
- package/src/nodes/code/FunctionNode.js +25 -3
- package/src/nodes/core/ArrayNode.js +22 -2
- package/src/nodes/core/AssignNode.js +6 -5
- package/src/nodes/core/AttributeNode.js +5 -4
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +133 -15
- package/src/nodes/core/IndexNode.js +4 -3
- package/src/nodes/core/InputNode.js +3 -2
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +264 -46
- package/src/nodes/core/NodeBuilder.js +453 -87
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +31 -23
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +25 -97
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +34 -3
- package/src/nodes/core/PropertyNode.js +26 -3
- package/src/nodes/core/StackNode.js +99 -23
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +22 -8
- package/src/nodes/core/StructTypeNode.js +13 -18
- package/src/nodes/core/SubBuildNode.js +4 -4
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +37 -13
- package/src/nodes/core/VarNode.js +96 -34
- package/src/nodes/core/VaryingNode.js +2 -18
- package/src/nodes/display/BlendModes.js +0 -63
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +18 -1
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +41 -5
- package/src/nodes/display/PassNode.js +175 -25
- package/src/nodes/display/RenderOutputNode.js +35 -9
- package/src/nodes/display/ScreenNode.js +47 -15
- package/src/nodes/display/ToneMappingNode.js +32 -5
- package/src/nodes/display/ToonOutlinePassNode.js +10 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +72 -14
- package/src/nodes/fog/Fog.js +18 -34
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- 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/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +128 -46
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +44 -6
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
- package/src/nodes/gpgpu/ComputeNode.js +76 -38
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +34 -9
- package/src/nodes/lighting/LightsNode.js +10 -32
- package/src/nodes/lighting/PointShadowNode.js +167 -148
- package/src/nodes/lighting/ShadowFilterNode.js +55 -65
- package/src/nodes/lighting/ShadowNode.js +189 -44
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +25 -8
- package/src/nodes/math/MathNode.js +98 -57
- package/src/nodes/math/OperatorNode.js +8 -5
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +111 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -3
- package/src/nodes/tsl/TSLCore.js +488 -166
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +14 -13
- package/src/nodes/utils/EventNode.js +67 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +7 -4
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +60 -8
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +60 -1
- package/src/nodes/utils/RTTNode.js +14 -4
- package/src/nodes/utils/ReflectorNode.js +61 -11
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +12 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +46 -18
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +3 -2
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +12 -2
- package/src/objects/SkinnedMesh.js +29 -10
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +372 -179
- package/src/renderers/common/Animation.js +16 -4
- package/src/renderers/common/Attributes.js +16 -2
- package/src/renderers/common/Backend.js +137 -35
- package/src/renderers/common/Background.js +28 -14
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +83 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +55 -3
- package/src/renderers/common/Info.js +337 -6
- package/src/renderers/common/InspectorBase.js +151 -0
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +41 -8
- package/src/renderers/common/PostProcessing.js +9 -226
- package/src/renderers/common/QuadMesh.js +7 -1
- 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 +18 -2
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +32 -6
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +22 -6
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +927 -335
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +52 -14
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +208 -47
- package/src/renderers/common/TimestampQueryPool.js +70 -6
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +64 -2
- package/src/renderers/common/XRManager.js +79 -51
- package/src/renderers/common/extras/PMREMGenerator.js +176 -79
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +49 -0
- 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 +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.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 +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -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 +221 -190
- 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 +1 -1
- 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 +4 -1
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- 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 +8 -5
- package/src/renderers/shaders/UniformsUtils.js +52 -9
- 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 +11 -5
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- 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 +270 -0
- package/src/renderers/webgl/WebGLProgram.js +63 -122
- package/src/renderers/webgl/WebGLPrograms.js +65 -52
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +191 -26
- package/src/renderers/webgl/WebGLState.js +79 -40
- package/src/renderers/webgl/WebGLTextures.js +234 -68
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
- package/src/renderers/webgl/WebGLUtils.js +8 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
- 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/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
- package/src/renderers/webgpu/WebGPUBackend.js +403 -253
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +5 -3
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
- package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +45 -29
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +5 -4
- package/src/textures/Texture.js +19 -7
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +344 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- 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/src/nodes/accessors/SceneNode.js +0 -144
- 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 -30
- 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,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Group,
|
|
6
|
-
NoColorSpace,
|
|
7
|
-
Mesh,
|
|
8
|
-
MeshPhysicalMaterial,
|
|
9
|
-
MirroredRepeatWrapping,
|
|
10
|
-
RepeatWrapping,
|
|
11
|
-
SRGBColorSpace,
|
|
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+(.+)$/;
|
|
16
5
|
|
|
17
6
|
class USDAParser {
|
|
18
7
|
|
|
19
8
|
parseText( text ) {
|
|
20
9
|
|
|
10
|
+
// Preprocess: strip comments and normalize multiline values
|
|
11
|
+
text = this._preprocess( text );
|
|
12
|
+
|
|
21
13
|
const root = {};
|
|
22
14
|
|
|
23
15
|
const lines = text.split( '\n' );
|
|
@@ -27,18 +19,22 @@ class USDAParser {
|
|
|
27
19
|
|
|
28
20
|
const stack = [ root ];
|
|
29
21
|
|
|
30
|
-
// Parse USDA file
|
|
31
|
-
|
|
32
22
|
for ( const line of lines ) {
|
|
33
23
|
|
|
34
|
-
// console.log( line );
|
|
35
|
-
|
|
36
24
|
if ( line.includes( '=' ) ) {
|
|
37
25
|
|
|
38
|
-
|
|
26
|
+
// Find the first '=' that's not inside quotes
|
|
27
|
+
const eqIdx = this._findAssignmentOperator( line );
|
|
28
|
+
|
|
29
|
+
if ( eqIdx === - 1 ) {
|
|
30
|
+
|
|
31
|
+
string = line.trim();
|
|
32
|
+
continue;
|
|
39
33
|
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const lhs = line.slice( 0, eqIdx ).trim();
|
|
37
|
+
const rhs = line.slice( eqIdx + 1 ).trim();
|
|
42
38
|
|
|
43
39
|
if ( rhs.endsWith( '{' ) ) {
|
|
44
40
|
|
|
@@ -66,6 +62,20 @@ class USDAParser {
|
|
|
66
62
|
|
|
67
63
|
}
|
|
68
64
|
|
|
65
|
+
} else if ( line.includes( ':' ) && ! line.includes( '=' ) ) {
|
|
66
|
+
|
|
67
|
+
// Handle dictionary entries like "0: [(...)...]" for timeSamples
|
|
68
|
+
const colonIdx = line.indexOf( ':' );
|
|
69
|
+
const key = line.slice( 0, colonIdx ).trim();
|
|
70
|
+
const value = line.slice( colonIdx + 1 ).trim();
|
|
71
|
+
|
|
72
|
+
// Only process if key looks like a number (timeSamples frame)
|
|
73
|
+
if ( /^[\d.]+$/.test( key ) ) {
|
|
74
|
+
|
|
75
|
+
target[ key ] = value;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
69
79
|
} else if ( line.endsWith( '{' ) ) {
|
|
70
80
|
|
|
71
81
|
const group = target[ string ] || {};
|
|
@@ -98,7 +108,7 @@ class USDAParser {
|
|
|
98
108
|
|
|
99
109
|
target = stack[ stack.length - 1 ];
|
|
100
110
|
|
|
101
|
-
} else {
|
|
111
|
+
} else if ( line.trim() ) {
|
|
102
112
|
|
|
103
113
|
string = line.trim();
|
|
104
114
|
|
|
@@ -110,629 +120,706 @@ class USDAParser {
|
|
|
110
120
|
|
|
111
121
|
}
|
|
112
122
|
|
|
113
|
-
|
|
123
|
+
_preprocess( text ) {
|
|
114
124
|
|
|
115
|
-
|
|
125
|
+
// Remove block comments /* ... */
|
|
126
|
+
text = this._stripBlockComments( text );
|
|
116
127
|
|
|
117
|
-
//
|
|
128
|
+
// Collapse triple-quoted strings into single lines
|
|
129
|
+
text = this._collapseTripleQuotedStrings( text );
|
|
118
130
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
131
|
+
// Remove line comments # ... (but preserve #usda header)
|
|
132
|
+
// Only remove # comments that aren't at the start of a line or after whitespace
|
|
133
|
+
const lines = text.split( '\n' );
|
|
134
|
+
const processed = [];
|
|
122
135
|
|
|
123
|
-
|
|
136
|
+
let inMultilineValue = false;
|
|
137
|
+
let bracketDepth = 0;
|
|
138
|
+
let parenDepth = 0;
|
|
139
|
+
let accumulated = '';
|
|
124
140
|
|
|
125
|
-
|
|
126
|
-
const parts = reference.split( '@' );
|
|
127
|
-
const path = parts[ 1 ].replace( /^.\//, '' );
|
|
128
|
-
const id = parts[ 2 ].replace( /^<\//, '' ).replace( />$/, '' );
|
|
141
|
+
for ( let i = 0; i < lines.length; i ++ ) {
|
|
129
142
|
|
|
130
|
-
|
|
143
|
+
let line = lines[ i ];
|
|
131
144
|
|
|
132
|
-
|
|
145
|
+
// Strip inline comments (but not inside strings)
|
|
146
|
+
line = this._stripInlineComment( line );
|
|
133
147
|
|
|
134
|
-
|
|
148
|
+
// Track bracket/paren depth for multiline values
|
|
149
|
+
const trimmed = line.trim();
|
|
135
150
|
|
|
136
|
-
|
|
151
|
+
if ( inMultilineValue ) {
|
|
137
152
|
|
|
138
|
-
|
|
153
|
+
// Continue accumulating multiline value
|
|
154
|
+
accumulated += ' ' + trimmed;
|
|
139
155
|
|
|
140
|
-
|
|
156
|
+
// Update depths
|
|
157
|
+
for ( const ch of trimmed ) {
|
|
141
158
|
|
|
142
|
-
|
|
159
|
+
if ( ch === '[' ) bracketDepth ++;
|
|
160
|
+
else if ( ch === ']' ) bracketDepth --;
|
|
161
|
+
else if ( ch === '(' && bracketDepth > 0 ) parenDepth ++;
|
|
162
|
+
else if ( ch === ')' && bracketDepth > 0 ) parenDepth --;
|
|
143
163
|
|
|
144
|
-
|
|
164
|
+
}
|
|
145
165
|
|
|
146
|
-
|
|
166
|
+
// Check if multiline value is complete
|
|
167
|
+
if ( bracketDepth === 0 && parenDepth === 0 ) {
|
|
147
168
|
|
|
148
|
-
|
|
169
|
+
processed.push( accumulated );
|
|
170
|
+
accumulated = '';
|
|
171
|
+
inMultilineValue = false;
|
|
149
172
|
|
|
150
173
|
}
|
|
151
174
|
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
for ( const name in data ) {
|
|
175
|
+
} else {
|
|
155
176
|
|
|
156
|
-
|
|
177
|
+
// Check if this line starts a multiline array value
|
|
178
|
+
// Look for patterns like "attr = [" or "attr = @path@[" without closing ]
|
|
179
|
+
if ( trimmed.includes( '=' ) ) {
|
|
157
180
|
|
|
158
|
-
|
|
181
|
+
const eqIdx = this._findAssignmentOperator( trimmed );
|
|
159
182
|
|
|
160
|
-
|
|
183
|
+
if ( eqIdx !== - 1 ) {
|
|
161
184
|
|
|
162
|
-
|
|
185
|
+
const rhs = trimmed.slice( eqIdx + 1 ).trim();
|
|
163
186
|
|
|
187
|
+
// Count brackets in the value part
|
|
188
|
+
let openBrackets = 0;
|
|
189
|
+
let closeBrackets = 0;
|
|
164
190
|
|
|
165
|
-
|
|
191
|
+
for ( const ch of rhs ) {
|
|
166
192
|
|
|
167
|
-
|
|
193
|
+
if ( ch === '[' ) openBrackets ++;
|
|
194
|
+
else if ( ch === ']' ) closeBrackets ++;
|
|
168
195
|
|
|
169
|
-
|
|
196
|
+
}
|
|
170
197
|
|
|
171
|
-
|
|
198
|
+
if ( openBrackets > closeBrackets ) {
|
|
172
199
|
|
|
173
|
-
|
|
200
|
+
// Multiline array detected
|
|
201
|
+
inMultilineValue = true;
|
|
202
|
+
bracketDepth = openBrackets - closeBrackets;
|
|
203
|
+
parenDepth = 0;
|
|
204
|
+
accumulated = trimmed;
|
|
205
|
+
continue;
|
|
174
206
|
|
|
175
|
-
|
|
207
|
+
}
|
|
176
208
|
|
|
177
|
-
|
|
209
|
+
}
|
|
178
210
|
|
|
179
|
-
|
|
211
|
+
}
|
|
180
212
|
|
|
181
|
-
|
|
182
|
-
let indices = null;
|
|
183
|
-
let counts = null;
|
|
184
|
-
let uvs = null;
|
|
213
|
+
processed.push( trimmed );
|
|
185
214
|
|
|
186
|
-
|
|
215
|
+
}
|
|
187
216
|
|
|
188
|
-
|
|
217
|
+
}
|
|
189
218
|
|
|
190
|
-
|
|
219
|
+
return processed.join( '\n' );
|
|
191
220
|
|
|
192
|
-
|
|
221
|
+
}
|
|
193
222
|
|
|
194
|
-
|
|
223
|
+
_stripBlockComments( text ) {
|
|
195
224
|
|
|
196
|
-
|
|
225
|
+
// Iteratively remove /* ... */ comments without regex backtracking
|
|
226
|
+
let result = '';
|
|
227
|
+
let i = 0;
|
|
197
228
|
|
|
198
|
-
|
|
229
|
+
while ( i < text.length ) {
|
|
199
230
|
|
|
200
|
-
|
|
201
|
-
|
|
231
|
+
// Check for block comment start
|
|
232
|
+
if ( text[ i ] === '/' && i + 1 < text.length && text[ i + 1 ] === '*' ) {
|
|
202
233
|
|
|
203
|
-
|
|
234
|
+
// Find the closing */
|
|
235
|
+
let j = i + 2;
|
|
204
236
|
|
|
205
|
-
|
|
237
|
+
while ( j < text.length ) {
|
|
206
238
|
|
|
207
|
-
|
|
239
|
+
if ( text[ j ] === '*' && j + 1 < text.length && text[ j + 1 ] === '/' ) {
|
|
208
240
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
241
|
+
// Found closing, skip past it
|
|
242
|
+
j += 2;
|
|
243
|
+
break;
|
|
212
244
|
|
|
213
|
-
|
|
245
|
+
}
|
|
214
246
|
|
|
215
|
-
|
|
247
|
+
j ++;
|
|
216
248
|
|
|
217
|
-
|
|
249
|
+
}
|
|
218
250
|
|
|
219
|
-
|
|
251
|
+
// Move past the comment (or to end if unclosed)
|
|
252
|
+
i = j;
|
|
220
253
|
|
|
221
|
-
|
|
254
|
+
} else {
|
|
222
255
|
|
|
223
|
-
|
|
256
|
+
result += text[ i ];
|
|
257
|
+
i ++;
|
|
224
258
|
|
|
225
259
|
}
|
|
226
260
|
|
|
227
|
-
|
|
261
|
+
}
|
|
228
262
|
|
|
229
|
-
|
|
230
|
-
let attribute = new BufferAttribute( new Float32Array( uvs ), 2 );
|
|
263
|
+
return result;
|
|
231
264
|
|
|
232
|
-
|
|
265
|
+
}
|
|
233
266
|
|
|
234
|
-
|
|
267
|
+
_collapseTripleQuotedStrings( text ) {
|
|
235
268
|
|
|
236
|
-
|
|
269
|
+
let result = '';
|
|
270
|
+
let i = 0;
|
|
237
271
|
|
|
238
|
-
|
|
272
|
+
while ( i < text.length ) {
|
|
239
273
|
|
|
240
|
-
|
|
274
|
+
if ( i + 2 < text.length ) {
|
|
241
275
|
|
|
242
|
-
const
|
|
243
|
-
let indices = JSON.parse( data[ 'int[] primvars:st:indices' ] );
|
|
244
|
-
indices = toTriangleIndices( indices, counts );
|
|
245
|
-
geometry.setAttribute( 'uv', toFlatBufferAttribute( attribute, indices ) );
|
|
276
|
+
const triple = text.slice( i, i + 3 );
|
|
246
277
|
|
|
247
|
-
|
|
278
|
+
if ( triple === '\'\'\'' || triple === '"""' ) {
|
|
248
279
|
|
|
249
|
-
|
|
280
|
+
const quoteChar = triple;
|
|
281
|
+
result += quoteChar;
|
|
282
|
+
i += 3;
|
|
250
283
|
|
|
251
|
-
|
|
284
|
+
while ( i < text.length ) {
|
|
252
285
|
|
|
253
|
-
|
|
254
|
-
let attribute = new BufferAttribute( new Float32Array( normals ), 3 );
|
|
286
|
+
if ( i + 2 < text.length && text.slice( i, i + 3 ) === quoteChar ) {
|
|
255
287
|
|
|
256
|
-
|
|
288
|
+
result += quoteChar;
|
|
289
|
+
i += 3;
|
|
290
|
+
break;
|
|
257
291
|
|
|
258
|
-
|
|
292
|
+
} else {
|
|
259
293
|
|
|
260
|
-
|
|
294
|
+
if ( text[ i ] === '\n' ) {
|
|
261
295
|
|
|
262
|
-
|
|
296
|
+
result += '\\n';
|
|
263
297
|
|
|
264
|
-
|
|
298
|
+
} else if ( text[ i ] !== '\r' ) {
|
|
265
299
|
|
|
266
|
-
|
|
300
|
+
result += text[ i ];
|
|
267
301
|
|
|
268
|
-
|
|
269
|
-
indices = toTriangleIndices( indices, counts );
|
|
270
|
-
attribute = toFlatBufferAttribute( attribute, indices );
|
|
302
|
+
}
|
|
271
303
|
|
|
272
|
-
|
|
304
|
+
i ++;
|
|
273
305
|
|
|
274
|
-
|
|
306
|
+
}
|
|
275
307
|
|
|
276
|
-
|
|
308
|
+
}
|
|
277
309
|
|
|
278
|
-
|
|
310
|
+
continue;
|
|
279
311
|
|
|
280
|
-
|
|
312
|
+
}
|
|
281
313
|
|
|
282
314
|
}
|
|
283
315
|
|
|
284
|
-
|
|
316
|
+
result += text[ i ];
|
|
317
|
+
i ++;
|
|
285
318
|
|
|
286
319
|
}
|
|
287
320
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
const indices = [];
|
|
291
|
-
|
|
292
|
-
for ( let i = 0; i < counts.length; i ++ ) {
|
|
321
|
+
return result;
|
|
293
322
|
|
|
294
|
-
|
|
323
|
+
}
|
|
295
324
|
|
|
296
|
-
|
|
325
|
+
_stripInlineComment( line ) {
|
|
297
326
|
|
|
298
|
-
|
|
327
|
+
// Don't strip if line starts with #usda
|
|
328
|
+
if ( line.trim().startsWith( '#usda' ) ) return line;
|
|
299
329
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
330
|
+
// Find # that's not inside a string
|
|
331
|
+
let inString = false;
|
|
332
|
+
let stringChar = null;
|
|
333
|
+
let escaped = false;
|
|
303
334
|
|
|
304
|
-
|
|
335
|
+
for ( let i = 0; i < line.length; i ++ ) {
|
|
305
336
|
|
|
306
|
-
|
|
337
|
+
const ch = line[ i ];
|
|
307
338
|
|
|
308
|
-
|
|
309
|
-
const b = rawIndices[ stride + 1 ];
|
|
310
|
-
const c = rawIndices[ stride + 2 ];
|
|
311
|
-
const d = rawIndices[ stride + 3 ];
|
|
339
|
+
if ( escaped ) {
|
|
312
340
|
|
|
313
|
-
|
|
314
|
-
|
|
341
|
+
escaped = false;
|
|
342
|
+
continue;
|
|
315
343
|
|
|
316
|
-
|
|
344
|
+
}
|
|
317
345
|
|
|
318
|
-
|
|
346
|
+
if ( ch === '\\' ) {
|
|
319
347
|
|
|
320
|
-
|
|
348
|
+
escaped = true;
|
|
349
|
+
continue;
|
|
321
350
|
|
|
322
351
|
}
|
|
323
352
|
|
|
324
|
-
|
|
353
|
+
if ( ! inString && ( ch === '"' || ch === '\'' ) ) {
|
|
325
354
|
|
|
326
|
-
|
|
355
|
+
inString = true;
|
|
356
|
+
stringChar = ch;
|
|
327
357
|
|
|
328
|
-
|
|
358
|
+
} else if ( inString && ch === stringChar ) {
|
|
329
359
|
|
|
330
|
-
|
|
331
|
-
|
|
360
|
+
inString = false;
|
|
361
|
+
stringChar = null;
|
|
332
362
|
|
|
333
|
-
|
|
363
|
+
} else if ( ! inString && ch === '#' ) {
|
|
334
364
|
|
|
335
|
-
|
|
365
|
+
// Found comment start outside of string
|
|
366
|
+
return line.slice( 0, i ).trimEnd();
|
|
336
367
|
|
|
337
|
-
|
|
368
|
+
}
|
|
338
369
|
|
|
339
|
-
|
|
370
|
+
}
|
|
340
371
|
|
|
341
|
-
|
|
372
|
+
return line;
|
|
342
373
|
|
|
343
|
-
|
|
374
|
+
}
|
|
344
375
|
|
|
345
|
-
|
|
376
|
+
_findAssignmentOperator( line ) {
|
|
346
377
|
|
|
347
|
-
|
|
378
|
+
// Find the first '=' that's not inside quotes
|
|
379
|
+
let inString = false;
|
|
380
|
+
let stringChar = null;
|
|
381
|
+
let escaped = false;
|
|
348
382
|
|
|
349
|
-
|
|
383
|
+
for ( let i = 0; i < line.length; i ++ ) {
|
|
350
384
|
|
|
351
|
-
|
|
385
|
+
const ch = line[ i ];
|
|
352
386
|
|
|
353
|
-
|
|
387
|
+
if ( escaped ) {
|
|
354
388
|
|
|
355
|
-
|
|
389
|
+
escaped = false;
|
|
390
|
+
continue;
|
|
356
391
|
|
|
357
|
-
|
|
392
|
+
}
|
|
358
393
|
|
|
359
|
-
|
|
360
|
-
const id = reference.replace( /^<\//, '' ).replace( />$/, '' );
|
|
361
|
-
const parts = id.split( '/' );
|
|
394
|
+
if ( ch === '\\' ) {
|
|
362
395
|
|
|
363
|
-
|
|
396
|
+
escaped = true;
|
|
397
|
+
continue;
|
|
364
398
|
|
|
365
399
|
}
|
|
366
400
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
}
|
|
401
|
+
if ( ! inString && ( ch === '"' || ch === '\'' ) ) {
|
|
370
402
|
|
|
371
|
-
|
|
403
|
+
inString = true;
|
|
404
|
+
stringChar = ch;
|
|
372
405
|
|
|
373
|
-
|
|
406
|
+
} else if ( inString && ch === stringChar ) {
|
|
374
407
|
|
|
375
|
-
|
|
408
|
+
inString = false;
|
|
409
|
+
stringChar = null;
|
|
376
410
|
|
|
377
|
-
|
|
411
|
+
} else if ( ! inString && ch === '=' ) {
|
|
378
412
|
|
|
379
|
-
|
|
413
|
+
return i;
|
|
380
414
|
|
|
381
|
-
|
|
415
|
+
}
|
|
382
416
|
|
|
383
|
-
|
|
417
|
+
}
|
|
384
418
|
|
|
385
|
-
|
|
419
|
+
return - 1;
|
|
386
420
|
|
|
387
|
-
|
|
421
|
+
}
|
|
388
422
|
|
|
389
|
-
|
|
423
|
+
/**
|
|
424
|
+
* Parse USDA text and return raw spec data in specsByPath format.
|
|
425
|
+
* Used by USDComposer for unified scene composition.
|
|
426
|
+
*/
|
|
427
|
+
parseData( text ) {
|
|
390
428
|
|
|
391
|
-
|
|
429
|
+
const root = this.parseText( text );
|
|
430
|
+
const specsByPath = {};
|
|
392
431
|
|
|
393
|
-
|
|
432
|
+
// Spec types (must match USDCParser/USDComposer)
|
|
433
|
+
const SpecType = {
|
|
434
|
+
Attribute: 1,
|
|
435
|
+
Prim: 6,
|
|
436
|
+
Relationship: 8
|
|
437
|
+
};
|
|
394
438
|
|
|
395
|
-
|
|
439
|
+
// Parse root metadata
|
|
440
|
+
const rootFields = {};
|
|
441
|
+
if ( '#usda 1.0' in root ) {
|
|
396
442
|
|
|
397
|
-
|
|
443
|
+
const header = root[ '#usda 1.0' ];
|
|
398
444
|
|
|
399
|
-
if (
|
|
445
|
+
if ( header.upAxis ) {
|
|
400
446
|
|
|
401
|
-
|
|
447
|
+
rootFields.upAxis = header.upAxis.replace( /"/g, '' );
|
|
402
448
|
|
|
403
449
|
}
|
|
404
450
|
|
|
405
|
-
if (
|
|
451
|
+
if ( header.defaultPrim ) {
|
|
406
452
|
|
|
407
|
-
|
|
453
|
+
rootFields.defaultPrim = header.defaultPrim.replace( /"/g, '' );
|
|
408
454
|
|
|
409
455
|
}
|
|
410
456
|
|
|
411
|
-
if (
|
|
457
|
+
if ( header.metersPerUnit !== undefined ) {
|
|
412
458
|
|
|
413
|
-
|
|
459
|
+
rootFields.metersPerUnit = parseFloat( header.metersPerUnit );
|
|
414
460
|
|
|
415
461
|
}
|
|
416
462
|
|
|
417
463
|
}
|
|
418
464
|
|
|
419
|
-
|
|
465
|
+
specsByPath[ '/' ] = { specType: SpecType.Prim, fields: rootFields };
|
|
420
466
|
|
|
421
|
-
|
|
467
|
+
// Walk the tree and build specsByPath
|
|
468
|
+
const walkTree = ( data, parentPath ) => {
|
|
422
469
|
|
|
423
|
-
|
|
470
|
+
const primChildren = [];
|
|
424
471
|
|
|
425
|
-
|
|
472
|
+
for ( const key in data ) {
|
|
426
473
|
|
|
427
|
-
|
|
474
|
+
// Skip metadata
|
|
475
|
+
if ( key === '#usda 1.0' ) continue;
|
|
476
|
+
if ( key === 'variants' ) continue;
|
|
428
477
|
|
|
429
|
-
|
|
478
|
+
// Check for primitive definitions
|
|
479
|
+
// Matches both 'def TypeName "name"' and 'def "name"' (no type)
|
|
480
|
+
const defMatch = key.match( DEF_MATCH_REGEX );
|
|
481
|
+
if ( defMatch ) {
|
|
430
482
|
|
|
431
|
-
const
|
|
483
|
+
const typeName = defMatch[ 1 ] || '';
|
|
484
|
+
const name = defMatch[ 2 ];
|
|
485
|
+
const path = parentPath === '/' ? '/' + name : parentPath + '/' + name;
|
|
432
486
|
|
|
433
|
-
|
|
487
|
+
primChildren.push( name );
|
|
434
488
|
|
|
435
|
-
|
|
436
|
-
|
|
489
|
+
const primFields = { typeName };
|
|
490
|
+
const primData = data[ key ];
|
|
437
491
|
|
|
438
|
-
|
|
492
|
+
// Extract attributes and relationships from this prim
|
|
493
|
+
this._extractPrimData( primData, path, primFields, specsByPath, SpecType );
|
|
439
494
|
|
|
440
|
-
|
|
495
|
+
specsByPath[ path ] = { specType: SpecType.Prim, fields: primFields };
|
|
441
496
|
|
|
442
|
-
|
|
497
|
+
// Recurse into children
|
|
498
|
+
walkTree( primData, path );
|
|
443
499
|
|
|
444
|
-
|
|
500
|
+
}
|
|
445
501
|
|
|
446
|
-
|
|
447
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
502
|
+
}
|
|
448
503
|
|
|
449
|
-
|
|
450
|
-
|
|
504
|
+
// Add primChildren to parent spec
|
|
505
|
+
if ( primChildren.length > 0 && specsByPath[ parentPath ] ) {
|
|
451
506
|
|
|
452
|
-
|
|
507
|
+
specsByPath[ parentPath ].fields.primChildren = primChildren;
|
|
453
508
|
|
|
454
|
-
|
|
509
|
+
}
|
|
455
510
|
|
|
456
|
-
|
|
511
|
+
};
|
|
457
512
|
|
|
458
|
-
|
|
513
|
+
walkTree( root, '/' );
|
|
459
514
|
|
|
460
|
-
|
|
461
|
-
material.color.fromArray( JSON.parse( '[' + color + ']' ) );
|
|
515
|
+
return { specsByPath };
|
|
462
516
|
|
|
463
|
-
|
|
517
|
+
}
|
|
464
518
|
|
|
465
|
-
|
|
519
|
+
_extractPrimData( data, path, primFields, specsByPath, SpecType ) {
|
|
466
520
|
|
|
467
|
-
|
|
468
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
521
|
+
if ( ! data || typeof data !== 'object' ) return;
|
|
469
522
|
|
|
470
|
-
|
|
471
|
-
material.emissiveMap.colorSpace = SRGBColorSpace;
|
|
472
|
-
material.emissive.set( 0xffffff );
|
|
523
|
+
for ( const key in data ) {
|
|
473
524
|
|
|
474
|
-
|
|
525
|
+
// Skip nested defs (handled by walkTree)
|
|
526
|
+
if ( key.startsWith( 'def ' ) ) continue;
|
|
475
527
|
|
|
476
|
-
|
|
528
|
+
if ( key === 'prepend references' ) {
|
|
477
529
|
|
|
478
|
-
|
|
530
|
+
primFields.references = [ data[ key ] ];
|
|
531
|
+
continue;
|
|
479
532
|
|
|
480
|
-
|
|
533
|
+
}
|
|
481
534
|
|
|
482
|
-
|
|
483
|
-
material.emissive.fromArray( JSON.parse( '[' + color + ']' ) );
|
|
535
|
+
if ( key === 'payload' ) {
|
|
484
536
|
|
|
485
|
-
|
|
537
|
+
primFields.payload = data[ key ];
|
|
538
|
+
continue;
|
|
486
539
|
|
|
487
|
-
|
|
540
|
+
}
|
|
488
541
|
|
|
489
|
-
|
|
490
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
542
|
+
if ( key === 'variants' ) {
|
|
491
543
|
|
|
492
|
-
|
|
493
|
-
|
|
544
|
+
const variantSelection = {};
|
|
545
|
+
const variants = data[ key ];
|
|
494
546
|
|
|
495
|
-
|
|
547
|
+
for ( const vKey in variants ) {
|
|
496
548
|
|
|
497
|
-
|
|
549
|
+
const match = vKey.match( VARIANT_STRING_REGEX );
|
|
550
|
+
if ( match ) {
|
|
498
551
|
|
|
499
|
-
|
|
552
|
+
const variantSetName = match[ 1 ];
|
|
553
|
+
const variantValue = variants[ vKey ].replace( /"/g, '' );
|
|
554
|
+
variantSelection[ variantSetName ] = variantValue;
|
|
500
555
|
|
|
501
556
|
}
|
|
502
557
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
const path = surface[ 'float inputs:roughness.connect' ];
|
|
506
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
507
|
-
|
|
508
|
-
material.roughness = 1.0;
|
|
509
|
-
material.roughnessMap = buildTexture( sampler );
|
|
510
|
-
material.roughnessMap.colorSpace = NoColorSpace;
|
|
511
|
-
|
|
512
|
-
if ( 'def Shader "Transform2d_roughness"' in data ) {
|
|
513
|
-
|
|
514
|
-
setTextureParams( material.roughnessMap, data[ 'def Shader "Transform2d_roughness"' ] );
|
|
515
|
-
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
} else if ( 'float inputs:roughness' in surface ) {
|
|
558
|
+
}
|
|
519
559
|
|
|
520
|
-
|
|
560
|
+
if ( Object.keys( variantSelection ).length > 0 ) {
|
|
521
561
|
|
|
522
|
-
|
|
562
|
+
primFields.variantSelection = variantSelection;
|
|
523
563
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
const path = surface[ 'float inputs:metallic.connect' ];
|
|
527
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
564
|
+
}
|
|
528
565
|
|
|
529
|
-
|
|
530
|
-
material.metalnessMap = buildTexture( sampler );
|
|
531
|
-
material.metalnessMap.colorSpace = NoColorSpace;
|
|
566
|
+
continue;
|
|
532
567
|
|
|
533
|
-
|
|
568
|
+
}
|
|
534
569
|
|
|
535
|
-
|
|
570
|
+
if ( key.startsWith( 'rel ' ) ) {
|
|
536
571
|
|
|
537
|
-
|
|
572
|
+
const relName = key.slice( 4 );
|
|
573
|
+
const relPath = path + '.' + relName;
|
|
574
|
+
const target = data[ key ].replace( /[<>]/g, '' );
|
|
575
|
+
specsByPath[ relPath ] = {
|
|
576
|
+
specType: SpecType.Relationship,
|
|
577
|
+
fields: { targetPaths: [ target ] }
|
|
578
|
+
};
|
|
579
|
+
continue;
|
|
538
580
|
|
|
539
|
-
|
|
581
|
+
}
|
|
540
582
|
|
|
541
|
-
|
|
583
|
+
// Handle xformOpOrder
|
|
584
|
+
if ( key.includes( 'xformOpOrder' ) ) {
|
|
542
585
|
|
|
543
|
-
|
|
586
|
+
const ops = data[ key ]
|
|
587
|
+
.replace( /[\[\]]/g, '' )
|
|
588
|
+
.split( ',' )
|
|
589
|
+
.map( s => s.trim().replace( /"/g, '' ) );
|
|
590
|
+
primFields.xformOpOrder = ops;
|
|
591
|
+
continue;
|
|
544
592
|
|
|
545
|
-
|
|
593
|
+
}
|
|
546
594
|
|
|
547
|
-
|
|
548
|
-
|
|
595
|
+
// Handle typed attributes
|
|
596
|
+
// Format: [qualifier] type attrName (e.g., "uniform token[] joints", "float3 position")
|
|
597
|
+
const attrMatch = key.match( ATTR_MATCH_REGEX );
|
|
598
|
+
if ( attrMatch ) {
|
|
549
599
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
600
|
+
const valueType = attrMatch[ 1 ];
|
|
601
|
+
const attrName = attrMatch[ 2 ];
|
|
602
|
+
const rawValue = data[ key ];
|
|
553
603
|
|
|
554
|
-
|
|
604
|
+
// Handle connection attributes (e.g., "inputs:normal.connect = </path>")
|
|
605
|
+
if ( attrName.endsWith( '.connect' ) ) {
|
|
555
606
|
|
|
556
|
-
|
|
607
|
+
const baseAttrName = attrName.slice( 0, - 8 ); // Remove '.connect'
|
|
608
|
+
const attrPath = path + '.' + baseAttrName;
|
|
557
609
|
|
|
558
|
-
|
|
610
|
+
// Parse connection path - extract from <path> format
|
|
611
|
+
let connPath = String( rawValue ).trim();
|
|
612
|
+
if ( connPath.startsWith( '<' ) ) connPath = connPath.slice( 1 );
|
|
613
|
+
if ( connPath.endsWith( '>' ) ) connPath = connPath.slice( 0, - 1 );
|
|
559
614
|
|
|
560
|
-
|
|
615
|
+
// Get or create the attribute spec
|
|
616
|
+
if ( ! specsByPath[ attrPath ] ) {
|
|
561
617
|
|
|
562
|
-
|
|
618
|
+
specsByPath[ attrPath ] = {
|
|
619
|
+
specType: SpecType.Attribute,
|
|
620
|
+
fields: { typeName: valueType }
|
|
621
|
+
};
|
|
563
622
|
|
|
564
623
|
}
|
|
565
624
|
|
|
566
|
-
|
|
625
|
+
specsByPath[ attrPath ].fields.connectionPaths = [ connPath ];
|
|
626
|
+
continue;
|
|
567
627
|
|
|
568
|
-
|
|
569
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
628
|
+
}
|
|
570
629
|
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
material.clearcoatRoughnessMap.colorSpace = NoColorSpace;
|
|
630
|
+
// Handle timeSamples attributes specially
|
|
631
|
+
if ( attrName.endsWith( '.timeSamples' ) && typeof rawValue === 'object' ) {
|
|
574
632
|
|
|
575
|
-
|
|
633
|
+
const baseAttrName = attrName.slice( 0, - 12 ); // Remove '.timeSamples'
|
|
634
|
+
const attrPath = path + '.' + baseAttrName;
|
|
576
635
|
|
|
577
|
-
|
|
636
|
+
// Parse timeSamples dictionary into times and values arrays
|
|
637
|
+
const times = [];
|
|
638
|
+
const values = [];
|
|
578
639
|
|
|
579
|
-
|
|
640
|
+
for ( const frameKey in rawValue ) {
|
|
580
641
|
|
|
581
|
-
|
|
642
|
+
const frame = parseFloat( frameKey );
|
|
643
|
+
if ( isNaN( frame ) ) continue;
|
|
582
644
|
|
|
583
|
-
|
|
645
|
+
times.push( frame );
|
|
646
|
+
values.push( this._parseAttributeValue( valueType, rawValue[ frameKey ] ) );
|
|
584
647
|
|
|
585
648
|
}
|
|
586
649
|
|
|
587
|
-
|
|
650
|
+
// Sort by time
|
|
651
|
+
const sorted = times.map( ( t, i ) => ( { t, v: values[ i ] } ) ).sort( ( a, b ) => a.t - b.t );
|
|
588
652
|
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
|
|
597
|
-
|
|
598
|
-
material.aoMap = buildTexture( sampler );
|
|
599
|
-
material.aoMap.colorSpace = NoColorSpace;
|
|
600
|
-
|
|
601
|
-
if ( 'def Shader "Transform2d_occlusion"' in data ) {
|
|
653
|
+
specsByPath[ attrPath ] = {
|
|
654
|
+
specType: SpecType.Attribute,
|
|
655
|
+
fields: {
|
|
656
|
+
timeSamples: { times: sorted.map( s => s.t ), values: sorted.map( s => s.v ) },
|
|
657
|
+
typeName: valueType
|
|
658
|
+
}
|
|
659
|
+
};
|
|
602
660
|
|
|
603
|
-
|
|
661
|
+
} else {
|
|
604
662
|
|
|
605
|
-
|
|
663
|
+
// Parse value based on type
|
|
664
|
+
const parsedValue = this._parseAttributeValue( valueType, rawValue );
|
|
606
665
|
|
|
607
|
-
|
|
666
|
+
// Store as attribute spec
|
|
667
|
+
const attrPath = path + '.' + attrName;
|
|
668
|
+
specsByPath[ attrPath ] = {
|
|
669
|
+
specType: SpecType.Attribute,
|
|
670
|
+
fields: { default: parsedValue, typeName: valueType }
|
|
671
|
+
};
|
|
608
672
|
|
|
609
673
|
}
|
|
610
674
|
|
|
611
675
|
}
|
|
612
676
|
|
|
613
|
-
return material;
|
|
614
|
-
|
|
615
677
|
}
|
|
616
678
|
|
|
617
|
-
|
|
679
|
+
}
|
|
618
680
|
|
|
619
|
-
|
|
681
|
+
_parseAttributeValue( valueType, rawValue ) {
|
|
620
682
|
|
|
621
|
-
|
|
683
|
+
if ( rawValue === undefined || rawValue === null ) return undefined;
|
|
622
684
|
|
|
623
|
-
|
|
685
|
+
const str = String( rawValue ).trim();
|
|
624
686
|
|
|
625
|
-
|
|
687
|
+
// Array types
|
|
688
|
+
if ( valueType.endsWith( '[]' ) ) {
|
|
626
689
|
|
|
627
|
-
|
|
690
|
+
// Parse JSON-like arrays
|
|
691
|
+
try {
|
|
628
692
|
|
|
629
|
-
|
|
693
|
+
// Handle arrays with parentheses like [(1,2,3), (4,5,6)]
|
|
694
|
+
// Remove trailing comma (valid in USDA but not JSON)
|
|
695
|
+
let cleaned = str.replace( /\(/g, '[' ).replace( /\)/g, ']' );
|
|
696
|
+
if ( cleaned.endsWith( ',' ) ) cleaned = cleaned.slice( 0, - 1 );
|
|
697
|
+
const parsed = JSON.parse( cleaned );
|
|
630
698
|
|
|
631
|
-
|
|
699
|
+
// Flatten nested arrays for types like point3f[]
|
|
700
|
+
if ( Array.isArray( parsed ) && Array.isArray( parsed[ 0 ] ) ) {
|
|
632
701
|
|
|
633
|
-
|
|
702
|
+
return parsed.flat();
|
|
634
703
|
|
|
635
704
|
}
|
|
636
705
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
}
|
|
706
|
+
return parsed;
|
|
640
707
|
|
|
641
|
-
|
|
708
|
+
} catch ( e ) {
|
|
642
709
|
|
|
643
|
-
|
|
710
|
+
// Try simple array parsing
|
|
711
|
+
const cleaned = str.replace( /[\[\]]/g, '' );
|
|
712
|
+
return cleaned.split( ',' ).map( s => {
|
|
644
713
|
|
|
645
|
-
|
|
714
|
+
const trimmed = s.trim();
|
|
715
|
+
const num = parseFloat( trimmed );
|
|
716
|
+
return isNaN( num ) ? trimmed.replace( /"/g, '' ) : num;
|
|
646
717
|
|
|
647
|
-
|
|
718
|
+
} );
|
|
648
719
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
const map = {
|
|
652
|
-
'"clamp"': ClampToEdgeWrapping,
|
|
653
|
-
'"mirror"': MirroredRepeatWrapping,
|
|
654
|
-
'"repeat"': RepeatWrapping
|
|
655
|
-
};
|
|
720
|
+
}
|
|
656
721
|
|
|
657
|
-
|
|
722
|
+
}
|
|
658
723
|
|
|
659
|
-
|
|
724
|
+
// Vector types (double3, float3, point3f, etc.)
|
|
725
|
+
if ( valueType.includes( '3' ) || valueType.includes( '2' ) || valueType.includes( '4' ) ) {
|
|
660
726
|
|
|
661
|
-
|
|
727
|
+
// Parse (x, y, z) format
|
|
728
|
+
const cleaned = str.replace( /[()]/g, '' );
|
|
729
|
+
const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
|
|
730
|
+
return values;
|
|
662
731
|
|
|
663
|
-
|
|
732
|
+
}
|
|
664
733
|
|
|
665
|
-
|
|
734
|
+
// Quaternion types (quatf, quatd, quath)
|
|
735
|
+
// Text format is (w, x, y, z), convert to (x, y, z, w)
|
|
736
|
+
if ( valueType.startsWith( 'quat' ) ) {
|
|
666
737
|
|
|
667
|
-
|
|
738
|
+
const cleaned = str.replace( /[()]/g, '' );
|
|
739
|
+
const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
|
|
740
|
+
return [ values[ 1 ], values[ 2 ], values[ 3 ], values[ 0 ] ];
|
|
668
741
|
|
|
669
|
-
|
|
742
|
+
}
|
|
670
743
|
|
|
671
|
-
|
|
744
|
+
// Matrix types
|
|
745
|
+
if ( valueType.includes( 'matrix' ) ) {
|
|
672
746
|
|
|
673
|
-
|
|
747
|
+
const cleaned = str.replace( /[()]/g, '' );
|
|
748
|
+
const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
|
|
749
|
+
return values;
|
|
674
750
|
|
|
675
751
|
}
|
|
676
752
|
|
|
677
|
-
|
|
753
|
+
// Scalar numeric types
|
|
754
|
+
if ( valueType === 'float' || valueType === 'double' || valueType === 'int' ) {
|
|
678
755
|
|
|
679
|
-
|
|
680
|
-
const material = buildMaterial( findMeshMaterial( data ) );
|
|
756
|
+
return parseFloat( str );
|
|
681
757
|
|
|
682
|
-
|
|
758
|
+
}
|
|
683
759
|
|
|
684
|
-
|
|
760
|
+
// String/token types
|
|
761
|
+
if ( valueType === 'string' || valueType === 'token' ) {
|
|
685
762
|
|
|
686
|
-
|
|
763
|
+
return this._parseString( str );
|
|
687
764
|
|
|
688
|
-
|
|
689
|
-
mesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );
|
|
765
|
+
}
|
|
690
766
|
|
|
691
|
-
|
|
767
|
+
// Asset path
|
|
768
|
+
if ( valueType === 'asset' ) {
|
|
692
769
|
|
|
693
|
-
return
|
|
770
|
+
return str.replace( /@/g, '' ).replace( /"/g, '' );
|
|
694
771
|
|
|
695
772
|
}
|
|
696
773
|
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
for ( const name in data ) {
|
|
774
|
+
// Default: return as string with quotes removed
|
|
775
|
+
return this._parseString( str );
|
|
700
776
|
|
|
701
|
-
|
|
777
|
+
}
|
|
702
778
|
|
|
703
|
-
|
|
779
|
+
_parseString( str ) {
|
|
704
780
|
|
|
705
|
-
|
|
781
|
+
// Remove surrounding quotes
|
|
782
|
+
if ( ( str.startsWith( '"' ) && str.endsWith( '"' ) ) ||
|
|
783
|
+
( str.startsWith( '\'' ) && str.endsWith( '\'' ) ) ) {
|
|
706
784
|
|
|
707
|
-
|
|
785
|
+
str = str.slice( 1, - 1 );
|
|
708
786
|
|
|
709
|
-
|
|
787
|
+
}
|
|
710
788
|
|
|
711
|
-
|
|
789
|
+
// Handle escape sequences
|
|
790
|
+
let result = '';
|
|
791
|
+
let i = 0;
|
|
712
792
|
|
|
713
|
-
|
|
793
|
+
while ( i < str.length ) {
|
|
714
794
|
|
|
715
|
-
|
|
795
|
+
if ( str[ i ] === '\\' && i + 1 < str.length ) {
|
|
716
796
|
|
|
717
|
-
|
|
797
|
+
const next = str[ i + 1 ];
|
|
718
798
|
|
|
719
|
-
|
|
799
|
+
switch ( next ) {
|
|
720
800
|
|
|
721
|
-
|
|
801
|
+
case 'n': result += '\n'; break;
|
|
802
|
+
case 't': result += '\t'; break;
|
|
803
|
+
case 'r': result += '\r'; break;
|
|
804
|
+
case '\\': result += '\\'; break;
|
|
805
|
+
case '"': result += '"'; break;
|
|
806
|
+
case '\'': result += '\''; break;
|
|
807
|
+
default: result += next; break;
|
|
722
808
|
|
|
723
|
-
|
|
809
|
+
}
|
|
724
810
|
|
|
725
|
-
|
|
811
|
+
i += 2;
|
|
726
812
|
|
|
727
|
-
|
|
813
|
+
} else {
|
|
728
814
|
|
|
729
|
-
|
|
815
|
+
result += str[ i ];
|
|
816
|
+
i ++;
|
|
730
817
|
|
|
731
|
-
|
|
818
|
+
}
|
|
732
819
|
|
|
733
820
|
}
|
|
734
821
|
|
|
735
|
-
return
|
|
822
|
+
return result;
|
|
736
823
|
|
|
737
824
|
}
|
|
738
825
|
|