@needle-tools/three 0.162.12 → 0.169.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/build/three.cjs +29789 -1941
- package/build/three.module.js +29095 -1933
- package/build/three.module.min.js +2 -2
- package/build/three.webgpu.js +80003 -0
- package/build/three.webgpu.min.js +6 -0
- package/build/three.webgpu.nodes.js +79951 -0
- package/build/three.webgpu.nodes.min.js +6 -0
- package/examples/jsm/Addons.js +2 -5
- package/examples/jsm/animation/AnimationClipCreator.js +1 -1
- package/examples/jsm/animation/CCDIKSolver.js +4 -2
- package/examples/jsm/capabilities/WebGL.js +27 -21
- package/examples/jsm/controls/ArcballControls.js +174 -158
- package/examples/jsm/controls/DragControls.js +260 -132
- package/examples/jsm/controls/FirstPersonControls.js +175 -163
- package/examples/jsm/controls/FlyControls.js +194 -188
- package/examples/jsm/controls/OrbitControls.js +790 -797
- package/examples/jsm/controls/PointerLockControls.js +24 -15
- package/examples/jsm/controls/TrackballControls.js +469 -448
- package/examples/jsm/controls/TransformControls.js +98 -63
- package/examples/jsm/csm/CSMShader.js +4 -4
- package/examples/jsm/effects/AnaglyphEffect.js +6 -13
- package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
- package/examples/jsm/effects/StereoEffect.js +6 -1
- package/examples/jsm/environments/RoomEnvironment.js +2 -6
- package/examples/jsm/exporters/DRACOExporter.js +4 -2
- package/examples/jsm/exporters/EXRExporter.js +19 -11
- package/examples/jsm/exporters/GLTFExporter.js +77 -8
- package/examples/jsm/exporters/KTX2Exporter.js +21 -13
- package/examples/jsm/exporters/OBJExporter.js +5 -1
- package/examples/jsm/exporters/PLYExporter.js +9 -7
- package/examples/jsm/exporters/USDZExporter.js +55 -11
- package/examples/jsm/geometries/DecalGeometry.js +4 -1
- package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +1 -1
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/helpers/LightProbeHelper.js +43 -44
- package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
- package/examples/jsm/helpers/ViewHelper.js +75 -61
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
- package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
- package/examples/jsm/libs/draco/README.md +2 -2
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/lights/LightProbeGenerator.js +24 -10
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
- package/examples/jsm/lines/LineMaterial.js +1 -17
- package/examples/jsm/lines/LineSegments2.js +15 -0
- package/examples/jsm/lines/Wireframe.js +16 -1
- package/examples/jsm/lines/webgpu/Line2.js +20 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +9 -6
- package/examples/jsm/loaders/DRACOLoader.js +4 -2
- package/examples/jsm/loaders/EXRLoader.js +351 -97
- package/examples/jsm/loaders/FBXLoader.js +77 -78
- package/examples/jsm/loaders/GLTFLoader.js +76 -14
- package/examples/jsm/loaders/KTX2Loader.js +30 -22
- package/examples/jsm/loaders/LDrawLoader.js +3 -2
- package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
- package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
- package/examples/jsm/loaders/LUTImageLoader.js +0 -14
- package/examples/jsm/loaders/MMDLoader.js +31 -12
- package/examples/jsm/loaders/MTLLoader.js +4 -3
- package/examples/jsm/loaders/MaterialXLoader.js +45 -21
- package/examples/jsm/loaders/OBJLoader.js +5 -3
- package/examples/jsm/loaders/PCDLoader.js +14 -13
- package/examples/jsm/loaders/PDBLoader.js +3 -2
- package/examples/jsm/loaders/PLYLoader.js +8 -5
- package/examples/jsm/loaders/RGBMLoader.js +16 -0
- package/examples/jsm/loaders/STLLoader.js +3 -2
- package/examples/jsm/loaders/USDZLoader.js +124 -76
- package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
- package/examples/jsm/loaders/VRMLLoader.js +11 -11
- package/examples/jsm/loaders/VTKLoader.js +80 -6
- package/examples/jsm/loaders/XYZLoader.js +3 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
- package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
- package/examples/jsm/math/Octree.js +26 -20
- package/examples/jsm/misc/GPUComputationRenderer.js +9 -25
- package/examples/jsm/misc/Timer.js +1 -1
- package/examples/jsm/modifiers/CurveModifier.js +11 -9
- package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
- package/examples/jsm/objects/InstancedPoints.js +2 -2
- package/examples/jsm/objects/Lensflare.js +2 -2
- package/examples/jsm/objects/LensflareMesh.js +322 -0
- package/examples/jsm/objects/SkyMesh.js +187 -0
- package/examples/jsm/objects/Water2Mesh.js +158 -0
- package/examples/jsm/objects/WaterMesh.js +101 -0
- package/examples/jsm/physics/JoltPhysics.js +281 -0
- package/examples/jsm/physics/RapierPhysics.js +25 -5
- package/examples/jsm/postprocessing/GlitchPass.js +0 -3
- package/examples/jsm/postprocessing/LUTPass.js +5 -71
- package/examples/jsm/postprocessing/OutlinePass.js +31 -46
- package/examples/jsm/postprocessing/RenderPass.js +1 -1
- package/examples/jsm/postprocessing/RenderTransitionPass.js +168 -0
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
- package/examples/jsm/postprocessing/SSAOPass.js +6 -12
- package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
- package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -3
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +7 -4
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +19 -5
- package/examples/jsm/shaders/BleachBypassShader.js +1 -2
- package/examples/jsm/shaders/ColorifyShader.js +1 -2
- package/examples/jsm/shaders/FXAAShader.js +0 -2
- package/examples/jsm/shaders/GTAOShader.js +1 -1
- package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
- package/examples/jsm/shaders/OutputShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +47 -5
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
- package/examples/jsm/transpiler/TSLEncoder.js +24 -22
- package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
- package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
- package/examples/jsm/utils/SceneUtils.js +60 -1
- package/examples/jsm/utils/ShadowMapViewer.js +3 -8
- package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
- package/examples/jsm/utils/SkeletonUtils.js +84 -66
- package/examples/jsm/utils/SortUtils.js +8 -5
- package/examples/jsm/utils/TextureUtils.js +3 -2
- package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
- package/package.json +11 -8
- package/src/Three.WebGPU.Nodes.js +200 -0
- package/src/Three.WebGPU.js +201 -0
- package/src/Three.js +23 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
- package/src/animation/tracks/StringKeyframeTrack.js +10 -1
- package/src/audio/Audio.js +2 -2
- package/src/constants.js +6 -7
- package/src/core/BufferAttribute.js +0 -9
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +0 -9
- package/src/core/Object3D.js +34 -29
- package/src/core/Raycaster.js +6 -2
- package/src/core/RenderTarget.js +8 -0
- package/src/extras/Controls.js +32 -0
- package/src/extras/PMREMGenerator.js +12 -11
- package/src/extras/TextureUtils.js +210 -0
- package/src/geometries/CylinderGeometry.js +11 -4
- package/src/lights/Light.js +1 -0
- package/src/lights/LightShadow.js +5 -0
- package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
- package/src/loaders/FileLoader.js +5 -1
- package/src/loaders/LoaderUtils.js +3 -1
- package/src/loaders/MaterialLoader.js +8 -1
- package/src/loaders/ObjectLoader.js +36 -2
- package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeLoader.js +27 -5
- package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeMaterialLoader.js +22 -18
- package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeObjectLoader.js +21 -1
- package/src/materials/Material.js +4 -0
- package/src/materials/MeshPhysicalMaterial.js +20 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +156 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/Line2NodeMaterial.js +69 -68
- package/src/materials/nodes/LineBasicNodeMaterial.js +31 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/LineDashedNodeMaterial.js +15 -12
- package/src/materials/nodes/MeshBasicNodeMaterial.js +77 -0
- package/src/materials/nodes/MeshLambertNodeMaterial.js +47 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +57 -0
- package/src/materials/nodes/MeshNormalNodeMaterial.js +44 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +78 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +248 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshSSSNodeMaterial.js +10 -7
- package/src/materials/nodes/MeshStandardNodeMaterial.js +108 -0
- package/src/materials/nodes/MeshToonNodeMaterial.js +38 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/NodeMaterial.js +198 -157
- package/{examples/jsm/nodes/materials/Materials.js → src/materials/nodes/NodeMaterials.js} +7 -1
- package/{examples/jsm/nodes/materials → src/materials/nodes}/PointsNodeMaterial.js +10 -7
- package/src/materials/nodes/ShadowNodeMaterial.js +38 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +123 -0
- package/src/materials/nodes/VolumeNodeMaterial.js +108 -0
- package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
- package/src/math/Box2.js +4 -4
- package/src/math/Box3.js +6 -6
- package/src/math/ColorManagement.js +10 -0
- package/src/math/Matrix2.js +54 -0
- package/src/math/Spherical.js +4 -5
- package/src/math/Triangle.js +24 -0
- package/src/math/Vector4.js +13 -0
- package/src/nodes/Nodes.js +164 -0
- package/src/nodes/TSL.js +179 -0
- package/src/nodes/accessors/AccessorsUtils.js +25 -0
- package/src/nodes/accessors/BatchNode.js +128 -0
- package/src/nodes/accessors/Bitangent.js +13 -0
- package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +44 -6
- package/{examples/jsm → src}/nodes/accessors/BufferNode.js +13 -4
- package/src/nodes/accessors/Camera.js +13 -0
- package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +22 -15
- package/src/nodes/accessors/CubeTextureNode.js +79 -0
- package/src/nodes/accessors/InstanceNode.js +144 -0
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +24 -0
- package/src/nodes/accessors/Lights.js +51 -0
- package/src/nodes/accessors/MaterialNode.js +441 -0
- package/src/nodes/accessors/MaterialProperties.js +3 -0
- package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +10 -5
- package/src/nodes/accessors/ModelNode.js +72 -0
- package/src/nodes/accessors/ModelViewProjectionNode.js +42 -0
- package/{examples/jsm → src}/nodes/accessors/MorphNode.js +51 -33
- package/src/nodes/accessors/Normal.js +88 -0
- package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +18 -34
- package/src/nodes/accessors/PointUVNode.js +30 -0
- package/src/nodes/accessors/Position.js +10 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +171 -0
- package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +58 -9
- package/src/nodes/accessors/ReflectVector.js +10 -0
- package/src/nodes/accessors/RendererReferenceNode.js +35 -0
- package/{examples/jsm → src}/nodes/accessors/SceneNode.js +9 -6
- package/src/nodes/accessors/SkinningNode.js +191 -0
- package/src/nodes/accessors/StorageBufferNode.js +147 -0
- package/{examples/jsm/nodes/accessors/TextureStoreNode.js → src/nodes/accessors/StorageTextureNode.js} +35 -10
- package/src/nodes/accessors/Tangent.js +22 -0
- package/src/nodes/accessors/Texture3DNode.js +103 -0
- package/{examples/jsm/nodes/accessors/TextureBicubicNode.js → src/nodes/accessors/TextureBicubic.js} +3 -32
- package/{examples/jsm → src}/nodes/accessors/TextureNode.js +123 -39
- package/src/nodes/accessors/TextureSizeNode.js +36 -0
- package/src/nodes/accessors/UV.js +3 -0
- package/{examples/jsm/nodes/accessors/UniformsNode.js → src/nodes/accessors/UniformArrayNode.js} +33 -15
- package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +10 -7
- package/src/nodes/accessors/VelocityNode.js +134 -0
- package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +9 -5
- package/{examples/jsm → src}/nodes/code/CodeNode.js +9 -5
- package/{examples/jsm → src}/nodes/code/ExpressionNode.js +10 -6
- package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +8 -5
- package/{examples/jsm → src}/nodes/code/FunctionNode.js +8 -31
- package/{examples/jsm → src}/nodes/code/ScriptableNode.js +24 -7
- package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +11 -8
- package/{examples/jsm → src}/nodes/core/AssignNode.js +12 -9
- package/{examples/jsm → src}/nodes/core/AttributeNode.js +29 -12
- package/{examples/jsm → src}/nodes/core/BypassNode.js +11 -7
- package/src/nodes/core/CacheNode.js +50 -0
- package/{examples/jsm → src}/nodes/core/ConstNode.js +6 -3
- package/{examples/jsm → src}/nodes/core/ContextNode.js +27 -11
- package/src/nodes/core/IndexNode.js +99 -0
- package/{examples/jsm → src}/nodes/core/InputNode.js +7 -3
- package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
- package/src/nodes/core/MRTNode.js +85 -0
- package/{examples/jsm → src}/nodes/core/Node.js +114 -57
- package/{examples/jsm → src}/nodes/core/NodeBuilder.js +327 -90
- package/src/nodes/core/NodeCache.js +36 -0
- package/{examples/jsm → src}/nodes/core/NodeFrame.js +52 -10
- package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
- package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
- package/{examples/jsm → src}/nodes/core/NodeUtils.js +56 -8
- package/{examples/jsm → src}/nodes/core/OutputStructNode.js +13 -12
- package/{examples/jsm → src}/nodes/core/ParameterNode.js +7 -4
- package/src/nodes/core/PropertyNode.js +88 -0
- package/{examples/jsm → src}/nodes/core/StackNode.js +31 -11
- package/{examples/jsm → src}/nodes/core/StructTypeNode.js +7 -3
- package/{examples/jsm → src}/nodes/core/TempNode.js +10 -6
- package/src/nodes/core/UniformGroupNode.js +59 -0
- package/{examples/jsm → src}/nodes/core/UniformNode.js +37 -5
- package/{examples/jsm → src}/nodes/core/VarNode.js +14 -14
- package/src/nodes/core/VaryingNode.js +108 -0
- package/{examples/jsm → src}/nodes/display/AfterImageNode.js +38 -28
- package/src/nodes/display/AnaglyphPassNode.js +67 -0
- package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +33 -30
- package/src/nodes/display/BleachBypass.js +26 -0
- package/src/nodes/display/BlendMode.js +54 -0
- package/src/nodes/display/BloomNode.js +341 -0
- package/{examples/jsm → src}/nodes/display/BumpMapNode.js +20 -38
- package/src/nodes/display/ColorAdjustment.js +46 -0
- package/src/nodes/display/ColorSpaceFunctions.js +38 -0
- package/src/nodes/display/ColorSpaceNode.js +114 -0
- package/src/nodes/display/DenoiseNode.js +204 -0
- package/src/nodes/display/DepthOfFieldNode.js +124 -0
- package/src/nodes/display/DotScreenNode.js +66 -0
- package/src/nodes/display/FXAANode.js +332 -0
- package/src/nodes/display/FilmNode.js +56 -0
- package/src/nodes/display/FrontFacingNode.js +45 -0
- package/src/nodes/display/GTAONode.js +331 -0
- package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +47 -24
- package/src/nodes/display/Lut3DNode.js +57 -0
- package/src/nodes/display/MotionBlur.js +25 -0
- package/{examples/jsm → src}/nodes/display/NormalMapNode.js +14 -14
- package/src/nodes/display/ParallaxBarrierPassNode.js +58 -0
- package/src/nodes/display/PassNode.js +378 -0
- package/src/nodes/display/PixelationPassNode.js +213 -0
- package/{examples/jsm → src}/nodes/display/PosterizeNode.js +8 -7
- package/src/nodes/display/RGBShiftNode.js +53 -0
- package/src/nodes/display/RenderOutputNode.js +60 -0
- package/src/nodes/display/SSAAPassNode.js +287 -0
- package/src/nodes/display/ScreenNode.js +181 -0
- package/src/nodes/display/Sepia.js +17 -0
- package/src/nodes/display/SobelOperatorNode.js +126 -0
- package/src/nodes/display/StereoCompositePassNode.js +110 -0
- package/src/nodes/display/StereoPassNode.js +83 -0
- package/src/nodes/display/ToneMappingFunctions.js +190 -0
- package/src/nodes/display/ToneMappingNode.js +67 -0
- package/src/nodes/display/ToonOutlinePassNode.js +111 -0
- package/src/nodes/display/TransitionNode.js +80 -0
- package/src/nodes/display/ViewportDepthNode.js +125 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +33 -0
- package/src/nodes/display/ViewportSharedTextureNode.js +39 -0
- package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +20 -14
- package/src/nodes/fog/FogExp2Node.js +35 -0
- package/src/nodes/fog/FogNode.js +50 -0
- package/src/nodes/fog/FogRangeNode.js +36 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +59 -0
- package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
- package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +2 -2
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
- package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +2 -2
- package/src/nodes/functions/BSDF/LTC.js +131 -0
- package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -4
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
- package/src/nodes/functions/BasicLightingModel.js +78 -0
- package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +11 -9
- package/src/nodes/functions/PhysicalLightingModel.js +633 -0
- package/src/nodes/functions/ShadowMaskModel.js +31 -0
- package/src/nodes/functions/ToonLightingModel.js +51 -0
- package/src/nodes/functions/material/getGeometryRoughness.js +13 -0
- package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +2 -2
- package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
- package/{examples/jsm → src}/nodes/geometry/RangeNode.js +28 -11
- package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
- package/src/nodes/gpgpu/BarrierNode.js +40 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
- package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +10 -6
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
- package/src/nodes/lighting/AONode.js +27 -0
- package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +6 -8
- package/src/nodes/lighting/AnalyticLightNode.js +522 -0
- package/src/nodes/lighting/BasicEnvironmentNode.js +30 -0
- package/src/nodes/lighting/BasicLightMapNode.js +32 -0
- package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +7 -9
- package/src/nodes/lighting/EnvironmentNode.js +138 -0
- package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +12 -11
- package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +7 -9
- package/src/nodes/lighting/IrradianceNode.js +27 -0
- package/src/nodes/lighting/LightProbeNode.js +53 -0
- package/{examples/jsm → src}/nodes/lighting/LightUtils.js +3 -3
- package/src/nodes/lighting/LightingContextNode.js +67 -0
- package/{examples/jsm → src}/nodes/lighting/LightingNode.js +9 -3
- package/src/nodes/lighting/LightsNode.js +250 -0
- package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +12 -13
- package/src/nodes/lighting/RectAreaLightNode.js +97 -0
- package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +14 -16
- package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +2 -2
- package/src/nodes/materialx/lib/mx_hsv.js +127 -0
- package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +500 -603
- package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +3 -9
- package/{examples/jsm/nodes/math/CondNode.js → src/nodes/math/ConditionalNode.js} +48 -13
- package/src/nodes/math/Hash.js +13 -0
- package/src/nodes/math/MathNode.js +407 -0
- package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -7
- package/src/nodes/math/OperatorNode.js +319 -0
- package/{examples/jsm → src}/nodes/math/TriNoise3D.js +19 -29
- package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
- package/src/nodes/pmrem/PMREMNode.js +240 -0
- package/src/nodes/pmrem/PMREMUtils.js +288 -0
- package/src/nodes/procedural/Checker.js +14 -0
- package/src/nodes/tsl/TSLBase.js +30 -0
- package/{examples/jsm/nodes/shadernode/ShaderNode.js → src/nodes/tsl/TSLCore.js} +122 -96
- package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +9 -5
- package/{examples/jsm → src}/nodes/utils/ConvertNode.js +7 -3
- package/src/nodes/utils/CubeMapNode.js +160 -0
- package/src/nodes/utils/Discard.js +8 -0
- package/src/nodes/utils/EquirectUVNode.js +36 -0
- package/src/nodes/utils/FlipNode.js +68 -0
- package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +11 -5
- package/{examples/jsm → src}/nodes/utils/JoinNode.js +6 -3
- package/{examples/jsm → src}/nodes/utils/LoopNode.js +23 -12
- package/src/nodes/utils/MatcapUVNode.js +33 -0
- package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +16 -7
- package/{examples/jsm → src}/nodes/utils/OscNode.js +12 -8
- package/src/nodes/utils/Packing.js +4 -0
- package/src/nodes/utils/RTTNode.js +133 -0
- package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +21 -5
- package/{examples/jsm → src}/nodes/utils/RemapNode.js +12 -8
- package/{examples/jsm → src}/nodes/utils/RotateNode.js +8 -13
- package/{examples/jsm → src}/nodes/utils/SetNode.js +7 -4
- package/{examples/jsm → src}/nodes/utils/SplitNode.js +7 -3
- package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +10 -6
- package/src/nodes/utils/SpriteUtils.js +47 -0
- package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +11 -12
- package/{examples/jsm → src}/nodes/utils/TimerNode.js +8 -5
- package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +11 -9
- package/src/nodes/utils/UVUtils.js +19 -0
- package/src/nodes/utils/ViewportUtils.js +14 -0
- package/src/objects/BatchedMesh.js +302 -144
- package/src/objects/InstancedMesh.js +11 -1
- package/src/objects/LOD.js +21 -0
- package/src/objects/Line.js +67 -43
- package/src/objects/Mesh.js +7 -23
- package/src/objects/Points.js +2 -0
- package/src/renderers/WebGLRenderer.js +473 -224
- package/{examples/jsm → src}/renderers/common/Animation.js +3 -0
- package/{examples/jsm → src}/renderers/common/Attributes.js +4 -1
- package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
- package/{examples/jsm → src}/renderers/common/Background.js +18 -10
- package/src/renderers/common/BindGroup.js +18 -0
- package/src/renderers/common/Bindings.js +203 -0
- package/src/renderers/common/BundleGroup.js +26 -0
- package/src/renderers/common/ChainMap.js +59 -0
- package/{examples/jsm → src}/renderers/common/ClippingContext.js +24 -12
- package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
- package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +16 -4
- package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
- package/{examples/jsm → src}/renderers/common/Info.js +35 -15
- package/{examples/jsm → src}/renderers/common/Pipelines.js +2 -2
- package/src/renderers/common/PostProcessing.js +90 -0
- package/src/renderers/common/QuadMesh.js +55 -0
- package/src/renderers/common/RenderBundle.js +18 -0
- package/src/renderers/common/RenderBundles.js +38 -0
- package/{examples/jsm → src}/renderers/common/RenderContext.js +25 -2
- package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
- package/{examples/jsm → src}/renderers/common/RenderList.js +11 -2
- package/src/renderers/common/RenderObject.js +413 -0
- package/{examples/jsm → src}/renderers/common/RenderObjects.js +9 -2
- package/{examples/jsm → src}/renderers/common/Renderer.js +431 -83
- package/{examples/jsm → src}/renderers/common/SampledTexture.js +14 -5
- package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
- package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
- package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
- package/{examples/jsm → src}/renderers/common/Textures.js +15 -15
- package/{examples/jsm → src}/renderers/common/Uniform.js +10 -5
- package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
- package/src/renderers/common/extras/PMREMGenerator.js +771 -0
- package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
- package/src/renderers/common/nodes/NodeLibrary.js +118 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +64 -0
- package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +8 -1
- package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
- package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
- package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
- package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
- package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +106 -68
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +31 -1
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
- package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
- package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +38 -25
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +19 -11
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
- package/src/renderers/shaders/ShaderLib.js +2 -1
- package/src/renderers/shaders/UniformsLib.js +3 -0
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +42 -38
- package/src/renderers/webgl/WebGLBackground.js +24 -3
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +23 -22
- package/src/renderers/webgl/WebGLCapabilities.js +44 -13
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +7 -20
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +23 -21
- package/src/renderers/webgl/WebGLLights.js +21 -44
- package/src/renderers/webgl/WebGLMaterials.js +9 -8
- package/src/renderers/webgl/WebGLMorphtargets.js +78 -217
- package/src/renderers/webgl/WebGLProgram.js +46 -78
- package/src/renderers/webgl/WebGLPrograms.js +37 -40
- package/src/renderers/webgl/WebGLProperties.js +7 -0
- package/src/renderers/webgl/WebGLRenderStates.js +15 -9
- package/src/renderers/webgl/WebGLShadowMap.js +25 -25
- package/src/renderers/webgl/WebGLState.js +35 -58
- package/src/renderers/webgl/WebGLTextures.js +313 -358
- package/src/renderers/webgl/WebGLUniforms.js +12 -2
- package/src/renderers/webgl/WebGLUniformsGroups.js +8 -8
- package/src/renderers/webgl/WebGLUtils.js +9 -78
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +389 -152
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +145 -0
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +245 -44
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +7 -1
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +2 -0
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +21 -3
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +271 -43
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +6 -23
- package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +318 -141
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
- package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +10 -7
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +105 -0
- package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +424 -95
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +37 -18
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +86 -32
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +10 -1
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +68 -27
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +235 -68
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +43 -5
- package/src/renderers/webxr/WebXRDepthSensing.js +11 -6
- package/src/renderers/webxr/WebXRManager.js +53 -38
- package/src/scenes/Scene.js +7 -1
- package/src/textures/CompressedArrayTexture.js +14 -0
- package/src/textures/DataArrayTexture.js +14 -0
- package/src/textures/DepthTexture.js +1 -3
- package/src/textures/Texture.js +12 -2
- package/src/utils.js +62 -1
- package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
- package/examples/jsm/loaders/LogLuvLoader.js +0 -606
- package/examples/jsm/loaders/TiltLoader.js +0 -520
- package/examples/jsm/nodes/Nodes.js +0 -195
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +0 -10
- package/examples/jsm/nodes/accessors/BitangentNode.js +0 -89
- package/examples/jsm/nodes/accessors/CameraNode.js +0 -119
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +0 -61
- package/examples/jsm/nodes/accessors/InstanceNode.js +0 -71
- package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +0 -21
- package/examples/jsm/nodes/accessors/MaterialNode.js +0 -314
- package/examples/jsm/nodes/accessors/ModelNode.js +0 -33
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +0 -39
- package/examples/jsm/nodes/accessors/NormalNode.js +0 -96
- package/examples/jsm/nodes/accessors/PointUVNode.js +0 -26
- package/examples/jsm/nodes/accessors/PositionNode.js +0 -104
- package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -35
- package/examples/jsm/nodes/accessors/SkinningNode.js +0 -124
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +0 -72
- package/examples/jsm/nodes/accessors/TangentNode.js +0 -109
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +0 -35
- package/examples/jsm/nodes/accessors/UVNode.js +0 -47
- package/examples/jsm/nodes/core/CacheNode.js +0 -49
- package/examples/jsm/nodes/core/IndexNode.js +0 -66
- package/examples/jsm/nodes/core/NodeCache.js +0 -26
- package/examples/jsm/nodes/core/NodeKeywords.js +0 -80
- package/examples/jsm/nodes/core/PropertyNode.js +0 -72
- package/examples/jsm/nodes/core/UniformGroupNode.js +0 -36
- package/examples/jsm/nodes/core/VaryingNode.js +0 -65
- package/examples/jsm/nodes/display/BlendModeNode.js +0 -128
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +0 -99
- package/examples/jsm/nodes/display/ColorSpaceNode.js +0 -108
- package/examples/jsm/nodes/display/FrontFacingNode.js +0 -27
- package/examples/jsm/nodes/display/PassNode.js +0 -183
- package/examples/jsm/nodes/display/ToneMappingNode.js +0 -184
- package/examples/jsm/nodes/display/ViewportDepthNode.js +0 -97
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +0 -31
- package/examples/jsm/nodes/display/ViewportNode.js +0 -134
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +0 -31
- package/examples/jsm/nodes/fog/FogExp2Node.js +0 -35
- package/examples/jsm/nodes/fog/FogNode.js +0 -38
- package/examples/jsm/nodes/fog/FogRangeNode.js +0 -34
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +0 -40
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +0 -393
- package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +0 -13
- package/examples/jsm/nodes/lighting/AONode.js +0 -27
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -241
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -181
- package/examples/jsm/nodes/lighting/LightNode.js +0 -57
- package/examples/jsm/nodes/lighting/LightingContextNode.js +0 -66
- package/examples/jsm/nodes/lighting/LightsNode.js +0 -188
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +0 -162
- package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -28
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +0 -34
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -40
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -65
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +0 -155
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +0 -80
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -90
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +0 -130
- package/examples/jsm/nodes/math/HashNode.js +0 -34
- package/examples/jsm/nodes/math/MathNode.js +0 -391
- package/examples/jsm/nodes/math/OperatorNode.js +0 -274
- package/examples/jsm/nodes/procedural/CheckerNode.js +0 -42
- package/examples/jsm/nodes/utils/DiscardNode.js +0 -27
- package/examples/jsm/nodes/utils/EquirectUVNode.js +0 -33
- package/examples/jsm/nodes/utils/MatcapUVNode.js +0 -30
- package/examples/jsm/nodes/utils/PackingNode.js +0 -55
- package/examples/jsm/nodes/utils/RotateUVNode.js +0 -35
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- package/examples/jsm/objects/QuadMesh.js +0 -66
- package/examples/jsm/renderers/common/Bindings.js +0 -173
- package/examples/jsm/renderers/common/ChainMap.js +0 -89
- package/examples/jsm/renderers/common/PostProcessing.js +0 -25
- package/examples/jsm/renderers/common/RenderObject.js +0 -221
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +0 -49
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
- package/examples/jsm/utils/GPUStatsPanel.js +0 -128
- package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
- package/src/renderers/WebGL1Renderer.js +0 -7
- package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
- /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
- /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
- /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
- /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
- /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
- /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
- /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
- /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
- /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
- /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
- /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
- /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
- /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
- /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
- /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
- /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
- /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
- /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
- /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
- /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
- /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
- /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
- /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
- /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { BufferAttribute } from '../core/BufferAttribute.js';
|
|
2
2
|
import { BufferGeometry } from '../core/BufferGeometry.js';
|
|
3
3
|
import { DataTexture } from '../textures/DataTexture.js';
|
|
4
|
-
import { FloatType } from '../constants.js';
|
|
4
|
+
import { FloatType, RedIntegerFormat, UnsignedIntType } from '../constants.js';
|
|
5
5
|
import { Matrix4 } from '../math/Matrix4.js';
|
|
6
6
|
import { Mesh } from './Mesh.js';
|
|
7
7
|
import { RGBAFormat } from '../constants.js';
|
|
8
|
+
import { ColorManagement } from '../math/ColorManagement.js';
|
|
8
9
|
import { Box3 } from '../math/Box3.js';
|
|
9
10
|
import { Sphere } from '../math/Sphere.js';
|
|
10
11
|
import { Frustum } from '../math/Frustum.js';
|
|
11
12
|
import { Vector3 } from '../math/Vector3.js';
|
|
13
|
+
import { Color } from '../math/Color.js';
|
|
12
14
|
|
|
13
15
|
function sortOpaque( a, b ) {
|
|
14
16
|
|
|
@@ -32,7 +34,7 @@ class MultiDrawRenderList {
|
|
|
32
34
|
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
push( drawRange, z ) {
|
|
37
|
+
push( drawRange, z, index ) {
|
|
36
38
|
|
|
37
39
|
const pool = this.pool;
|
|
38
40
|
const list = this.list;
|
|
@@ -43,6 +45,7 @@ class MultiDrawRenderList {
|
|
|
43
45
|
start: - 1,
|
|
44
46
|
count: - 1,
|
|
45
47
|
z: - 1,
|
|
48
|
+
index: - 1,
|
|
46
49
|
|
|
47
50
|
} );
|
|
48
51
|
|
|
@@ -55,6 +58,7 @@ class MultiDrawRenderList {
|
|
|
55
58
|
item.start = drawRange.start;
|
|
56
59
|
item.count = drawRange.count;
|
|
57
60
|
item.z = z;
|
|
61
|
+
item.index = index;
|
|
58
62
|
|
|
59
63
|
}
|
|
60
64
|
|
|
@@ -67,15 +71,17 @@ class MultiDrawRenderList {
|
|
|
67
71
|
|
|
68
72
|
}
|
|
69
73
|
|
|
70
|
-
const ID_ATTR_NAME = 'batchId';
|
|
71
74
|
const _matrix = /*@__PURE__*/ new Matrix4();
|
|
72
75
|
const _invMatrixWorld = /*@__PURE__*/ new Matrix4();
|
|
73
76
|
const _identityMatrix = /*@__PURE__*/ new Matrix4();
|
|
77
|
+
const _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );
|
|
74
78
|
const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
|
|
75
79
|
const _frustum = /*@__PURE__*/ new Frustum();
|
|
76
80
|
const _box = /*@__PURE__*/ new Box3();
|
|
77
81
|
const _sphere = /*@__PURE__*/ new Sphere();
|
|
78
82
|
const _vector = /*@__PURE__*/ new Vector3();
|
|
83
|
+
const _forward = /*@__PURE__*/ new Vector3();
|
|
84
|
+
const _temp = /*@__PURE__*/ new Vector3();
|
|
79
85
|
const _renderList = /*@__PURE__*/ new MultiDrawRenderList();
|
|
80
86
|
const _mesh = /*@__PURE__*/ new Mesh();
|
|
81
87
|
const _batchIntersects = [];
|
|
@@ -119,13 +125,13 @@ function copyAttributeData( src, target, targetOffset = 0 ) {
|
|
|
119
125
|
|
|
120
126
|
class BatchedMesh extends Mesh {
|
|
121
127
|
|
|
122
|
-
get
|
|
128
|
+
get maxInstanceCount() {
|
|
123
129
|
|
|
124
|
-
return this.
|
|
130
|
+
return this._maxInstanceCount;
|
|
125
131
|
|
|
126
132
|
}
|
|
127
133
|
|
|
128
|
-
constructor(
|
|
134
|
+
constructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {
|
|
129
135
|
|
|
130
136
|
super( new BufferGeometry(), material );
|
|
131
137
|
|
|
@@ -136,28 +142,36 @@ class BatchedMesh extends Mesh {
|
|
|
136
142
|
this.boundingSphere = null;
|
|
137
143
|
this.customSort = null;
|
|
138
144
|
|
|
145
|
+
// stores visible, active, and geometry id per object
|
|
146
|
+
this._drawInfo = [];
|
|
147
|
+
|
|
148
|
+
// instance ids that have been set as inactive, and are available to be overwritten
|
|
149
|
+
this._availableInstanceIds = [];
|
|
150
|
+
|
|
151
|
+
// geometry information
|
|
139
152
|
this._drawRanges = [];
|
|
140
153
|
this._reservedRanges = [];
|
|
141
|
-
|
|
142
|
-
this._visibility = [];
|
|
143
|
-
this._active = [];
|
|
144
154
|
this._bounds = [];
|
|
145
155
|
|
|
146
|
-
this.
|
|
156
|
+
this._maxInstanceCount = maxInstanceCount;
|
|
147
157
|
this._maxVertexCount = maxVertexCount;
|
|
148
158
|
this._maxIndexCount = maxIndexCount;
|
|
149
159
|
|
|
150
160
|
this._geometryInitialized = false;
|
|
151
161
|
this._geometryCount = 0;
|
|
152
|
-
this._multiDrawCounts = new Int32Array(
|
|
153
|
-
this._multiDrawStarts = new Int32Array(
|
|
162
|
+
this._multiDrawCounts = new Int32Array( maxInstanceCount );
|
|
163
|
+
this._multiDrawStarts = new Int32Array( maxInstanceCount );
|
|
154
164
|
this._multiDrawCount = 0;
|
|
165
|
+
this._multiDrawInstances = null;
|
|
155
166
|
this._visibilityChanged = true;
|
|
156
167
|
|
|
157
168
|
// Local matrix per geometry by using data texture
|
|
158
169
|
this._matricesTexture = null;
|
|
170
|
+
this._indirectTexture = null;
|
|
171
|
+
this._colorsTexture = null;
|
|
159
172
|
|
|
160
173
|
this._initMatricesTexture();
|
|
174
|
+
this._initIndirectTexture();
|
|
161
175
|
|
|
162
176
|
}
|
|
163
177
|
|
|
@@ -170,7 +184,7 @@ class BatchedMesh extends Mesh {
|
|
|
170
184
|
// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)
|
|
171
185
|
// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)
|
|
172
186
|
|
|
173
|
-
let size = Math.sqrt( this.
|
|
187
|
+
let size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix
|
|
174
188
|
size = Math.ceil( size / 4 ) * 4;
|
|
175
189
|
size = Math.max( size, 4 );
|
|
176
190
|
|
|
@@ -181,11 +195,36 @@ class BatchedMesh extends Mesh {
|
|
|
181
195
|
|
|
182
196
|
}
|
|
183
197
|
|
|
198
|
+
_initIndirectTexture() {
|
|
199
|
+
|
|
200
|
+
let size = Math.sqrt( this._maxInstanceCount );
|
|
201
|
+
size = Math.ceil( size );
|
|
202
|
+
|
|
203
|
+
const indirectArray = new Uint32Array( size * size );
|
|
204
|
+
const indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );
|
|
205
|
+
|
|
206
|
+
this._indirectTexture = indirectTexture;
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
_initColorsTexture() {
|
|
211
|
+
|
|
212
|
+
let size = Math.sqrt( this._maxInstanceCount );
|
|
213
|
+
size = Math.ceil( size );
|
|
214
|
+
|
|
215
|
+
// 4 floats per RGBA pixel initialized to white
|
|
216
|
+
const colorsArray = new Float32Array( size * size * 4 ).fill( 1 );
|
|
217
|
+
const colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );
|
|
218
|
+
colorsTexture.colorSpace = ColorManagement.workingColorSpace;
|
|
219
|
+
|
|
220
|
+
this._colorsTexture = colorsTexture;
|
|
221
|
+
|
|
222
|
+
}
|
|
223
|
+
|
|
184
224
|
_initializeGeometry( reference ) {
|
|
185
225
|
|
|
186
226
|
const geometry = this.geometry;
|
|
187
227
|
const maxVertexCount = this._maxVertexCount;
|
|
188
|
-
const maxGeometryCount = this._maxGeometryCount;
|
|
189
228
|
const maxIndexCount = this._maxIndexCount;
|
|
190
229
|
if ( this._geometryInitialized === false ) {
|
|
191
230
|
|
|
@@ -203,7 +242,8 @@ class BatchedMesh extends Mesh {
|
|
|
203
242
|
|
|
204
243
|
if ( reference.getIndex() !== null ) {
|
|
205
244
|
|
|
206
|
-
|
|
245
|
+
// Reserve last u16 index for primitive restart.
|
|
246
|
+
const indexArray = maxVertexCount > 65535
|
|
207
247
|
? new Uint32Array( maxIndexCount )
|
|
208
248
|
: new Uint16Array( maxIndexCount );
|
|
209
249
|
|
|
@@ -211,27 +251,15 @@ class BatchedMesh extends Mesh {
|
|
|
211
251
|
|
|
212
252
|
}
|
|
213
253
|
|
|
214
|
-
const idArray = maxGeometryCount > 65536
|
|
215
|
-
? new Uint32Array( maxVertexCount )
|
|
216
|
-
: new Uint16Array( maxVertexCount );
|
|
217
|
-
geometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) );
|
|
218
|
-
|
|
219
254
|
this._geometryInitialized = true;
|
|
220
255
|
|
|
221
256
|
}
|
|
222
257
|
|
|
223
258
|
}
|
|
224
259
|
|
|
225
|
-
// Make sure the geometry is compatible with the existing combined geometry
|
|
260
|
+
// Make sure the geometry is compatible with the existing combined geometry attributes
|
|
226
261
|
_validateGeometry( geometry ) {
|
|
227
262
|
|
|
228
|
-
// check that the geometry doesn't have a version of our reserved id attribute
|
|
229
|
-
if ( geometry.getAttribute( ID_ATTR_NAME ) ) {
|
|
230
|
-
|
|
231
|
-
throw new Error( `BatchedMesh: Geometry cannot use attribute "${ ID_ATTR_NAME }"` );
|
|
232
|
-
|
|
233
|
-
}
|
|
234
|
-
|
|
235
263
|
// check to ensure the geometries are using consistent attributes and indices
|
|
236
264
|
const batchGeometry = this.geometry;
|
|
237
265
|
if ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {
|
|
@@ -242,12 +270,6 @@ class BatchedMesh extends Mesh {
|
|
|
242
270
|
|
|
243
271
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
244
272
|
|
|
245
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
246
|
-
|
|
247
|
-
continue;
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
|
|
251
273
|
if ( ! geometry.hasAttribute( attributeName ) ) {
|
|
252
274
|
|
|
253
275
|
throw new Error( `BatchedMesh: Added geometry missing "${ attributeName }". All geometries must have consistent attributes.` );
|
|
@@ -281,17 +303,17 @@ class BatchedMesh extends Mesh {
|
|
|
281
303
|
|
|
282
304
|
}
|
|
283
305
|
|
|
284
|
-
const geometryCount = this._geometryCount;
|
|
285
306
|
const boundingBox = this.boundingBox;
|
|
286
|
-
const
|
|
307
|
+
const drawInfo = this._drawInfo;
|
|
287
308
|
|
|
288
309
|
boundingBox.makeEmpty();
|
|
289
|
-
for ( let i = 0; i <
|
|
310
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
290
311
|
|
|
291
|
-
if (
|
|
312
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
292
313
|
|
|
314
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
293
315
|
this.getMatrixAt( i, _matrix );
|
|
294
|
-
this.getBoundingBoxAt(
|
|
316
|
+
this.getBoundingBoxAt( geometryId, _box ).applyMatrix4( _matrix );
|
|
295
317
|
boundingBox.union( _box );
|
|
296
318
|
|
|
297
319
|
}
|
|
@@ -306,23 +328,72 @@ class BatchedMesh extends Mesh {
|
|
|
306
328
|
|
|
307
329
|
}
|
|
308
330
|
|
|
309
|
-
const geometryCount = this._geometryCount;
|
|
310
331
|
const boundingSphere = this.boundingSphere;
|
|
311
|
-
const
|
|
332
|
+
const drawInfo = this._drawInfo;
|
|
312
333
|
|
|
313
334
|
boundingSphere.makeEmpty();
|
|
314
|
-
for ( let i = 0; i <
|
|
335
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
315
336
|
|
|
316
|
-
if (
|
|
337
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
317
338
|
|
|
339
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
318
340
|
this.getMatrixAt( i, _matrix );
|
|
319
|
-
this.getBoundingSphereAt(
|
|
341
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
320
342
|
boundingSphere.union( _sphere );
|
|
321
343
|
|
|
322
344
|
}
|
|
323
345
|
|
|
324
346
|
}
|
|
325
347
|
|
|
348
|
+
addInstance( geometryId ) {
|
|
349
|
+
|
|
350
|
+
const atCapacity = this._drawInfo.length >= this.maxInstanceCount;
|
|
351
|
+
|
|
352
|
+
// ensure we're not over geometry
|
|
353
|
+
if ( atCapacity && this._availableInstanceIds.length === 0 ) {
|
|
354
|
+
|
|
355
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
356
|
+
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const instanceDrawInfo = {
|
|
360
|
+
visible: true,
|
|
361
|
+
active: true,
|
|
362
|
+
geometryIndex: geometryId,
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
let drawId = null;
|
|
366
|
+
|
|
367
|
+
// Prioritize using previously freed instance ids
|
|
368
|
+
if ( this._availableInstanceIds.length > 0 ) {
|
|
369
|
+
|
|
370
|
+
drawId = this._availableInstanceIds.pop();
|
|
371
|
+
this._drawInfo[ drawId ] = instanceDrawInfo;
|
|
372
|
+
|
|
373
|
+
} else {
|
|
374
|
+
|
|
375
|
+
drawId = this._drawInfo.length;
|
|
376
|
+
this._drawInfo.push( instanceDrawInfo );
|
|
377
|
+
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const matricesTexture = this._matricesTexture;
|
|
381
|
+
const matricesArray = matricesTexture.image.data;
|
|
382
|
+
_identityMatrix.toArray( matricesArray, drawId * 16 );
|
|
383
|
+
matricesTexture.needsUpdate = true;
|
|
384
|
+
|
|
385
|
+
const colorsTexture = this._colorsTexture;
|
|
386
|
+
if ( colorsTexture ) {
|
|
387
|
+
|
|
388
|
+
_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );
|
|
389
|
+
colorsTexture.needsUpdate = true;
|
|
390
|
+
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return drawId;
|
|
394
|
+
|
|
395
|
+
}
|
|
396
|
+
|
|
326
397
|
addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {
|
|
327
398
|
|
|
328
399
|
this._initializeGeometry( geometry );
|
|
@@ -330,9 +401,9 @@ class BatchedMesh extends Mesh {
|
|
|
330
401
|
this._validateGeometry( geometry );
|
|
331
402
|
|
|
332
403
|
// ensure we're not over geometry
|
|
333
|
-
if ( this.
|
|
404
|
+
if ( this._drawInfo.length >= this._maxInstanceCount ) {
|
|
334
405
|
|
|
335
|
-
throw new Error( 'BatchedMesh: Maximum
|
|
406
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
336
407
|
|
|
337
408
|
}
|
|
338
409
|
|
|
@@ -410,23 +481,10 @@ class BatchedMesh extends Mesh {
|
|
|
410
481
|
|
|
411
482
|
}
|
|
412
483
|
|
|
413
|
-
const visibility = this._visibility;
|
|
414
|
-
const active = this._active;
|
|
415
|
-
const matricesTexture = this._matricesTexture;
|
|
416
|
-
const matricesArray = this._matricesTexture.image.data;
|
|
417
|
-
|
|
418
|
-
// push new visibility states
|
|
419
|
-
visibility.push( true );
|
|
420
|
-
active.push( true );
|
|
421
|
-
|
|
422
484
|
// update id
|
|
423
485
|
const geometryId = this._geometryCount;
|
|
424
486
|
this._geometryCount ++;
|
|
425
487
|
|
|
426
|
-
// initialize matrix information
|
|
427
|
-
_identityMatrix.toArray( matricesArray, geometryId * 16 );
|
|
428
|
-
matricesTexture.needsUpdate = true;
|
|
429
|
-
|
|
430
488
|
// add the reserved range and draw range objects
|
|
431
489
|
reservedRanges.push( reservedRange );
|
|
432
490
|
drawRanges.push( {
|
|
@@ -441,16 +499,6 @@ class BatchedMesh extends Mesh {
|
|
|
441
499
|
sphere: new Sphere()
|
|
442
500
|
} );
|
|
443
501
|
|
|
444
|
-
// set the id for the geometry
|
|
445
|
-
const idAttribute = this.geometry.getAttribute( ID_ATTR_NAME );
|
|
446
|
-
for ( let i = 0; i < reservedRange.vertexCount; i ++ ) {
|
|
447
|
-
|
|
448
|
-
idAttribute.setX( reservedRange.vertexStart + i, geometryId );
|
|
449
|
-
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
idAttribute.needsUpdate = true;
|
|
453
|
-
|
|
454
502
|
// update the geometry
|
|
455
503
|
this.setGeometryAt( geometryId, geometry );
|
|
456
504
|
|
|
@@ -458,9 +506,9 @@ class BatchedMesh extends Mesh {
|
|
|
458
506
|
|
|
459
507
|
}
|
|
460
508
|
|
|
461
|
-
setGeometryAt(
|
|
509
|
+
setGeometryAt( geometryId, geometry ) {
|
|
462
510
|
|
|
463
|
-
if (
|
|
511
|
+
if ( geometryId >= this._geometryCount ) {
|
|
464
512
|
|
|
465
513
|
throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
|
|
466
514
|
|
|
@@ -472,7 +520,7 @@ class BatchedMesh extends Mesh {
|
|
|
472
520
|
const hasIndex = batchGeometry.getIndex() !== null;
|
|
473
521
|
const dstIndex = batchGeometry.getIndex();
|
|
474
522
|
const srcIndex = geometry.getIndex();
|
|
475
|
-
const reservedRange = this._reservedRanges[
|
|
523
|
+
const reservedRange = this._reservedRanges[ geometryId ];
|
|
476
524
|
if (
|
|
477
525
|
hasIndex &&
|
|
478
526
|
srcIndex.count > reservedRange.indexCount ||
|
|
@@ -488,12 +536,6 @@ class BatchedMesh extends Mesh {
|
|
|
488
536
|
const vertexCount = reservedRange.vertexCount;
|
|
489
537
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
490
538
|
|
|
491
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
492
|
-
|
|
493
|
-
continue;
|
|
494
|
-
|
|
495
|
-
}
|
|
496
|
-
|
|
497
539
|
// copy attribute data
|
|
498
540
|
const srcAttribute = geometry.getAttribute( attributeName );
|
|
499
541
|
const dstAttribute = batchGeometry.getAttribute( attributeName );
|
|
@@ -542,7 +584,7 @@ class BatchedMesh extends Mesh {
|
|
|
542
584
|
}
|
|
543
585
|
|
|
544
586
|
// store the bounding boxes
|
|
545
|
-
const bound = this._bounds[
|
|
587
|
+
const bound = this._bounds[ geometryId ];
|
|
546
588
|
if ( geometry.boundingBox !== null ) {
|
|
547
589
|
|
|
548
590
|
bound.box.copy( geometry.boundingBox );
|
|
@@ -566,27 +608,34 @@ class BatchedMesh extends Mesh {
|
|
|
566
608
|
}
|
|
567
609
|
|
|
568
610
|
// set drawRange count
|
|
569
|
-
const drawRange = this._drawRanges[
|
|
611
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
570
612
|
const posAttr = geometry.getAttribute( 'position' );
|
|
571
613
|
drawRange.count = hasIndex ? srcIndex.count : posAttr.count;
|
|
572
614
|
this._visibilityChanged = true;
|
|
573
615
|
|
|
574
|
-
return
|
|
616
|
+
return geometryId;
|
|
575
617
|
|
|
576
618
|
}
|
|
577
619
|
|
|
620
|
+
/*
|
|
578
621
|
deleteGeometry( geometryId ) {
|
|
579
622
|
|
|
580
|
-
//
|
|
623
|
+
// TODO: delete geometry and associated instances
|
|
581
624
|
|
|
582
|
-
|
|
583
|
-
|
|
625
|
+
}
|
|
626
|
+
*/
|
|
627
|
+
|
|
628
|
+
deleteInstance( instanceId ) {
|
|
629
|
+
|
|
630
|
+
const drawInfo = this._drawInfo;
|
|
631
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
584
632
|
|
|
585
633
|
return this;
|
|
586
634
|
|
|
587
635
|
}
|
|
588
636
|
|
|
589
|
-
|
|
637
|
+
drawInfo[ instanceId ].active = false;
|
|
638
|
+
this._availableInstanceIds.push( instanceId );
|
|
590
639
|
this._visibilityChanged = true;
|
|
591
640
|
|
|
592
641
|
return this;
|
|
@@ -594,17 +643,16 @@ class BatchedMesh extends Mesh {
|
|
|
594
643
|
}
|
|
595
644
|
|
|
596
645
|
// get bounding box and compute it if it doesn't exist
|
|
597
|
-
getBoundingBoxAt(
|
|
646
|
+
getBoundingBoxAt( geometryId, target ) {
|
|
598
647
|
|
|
599
|
-
|
|
600
|
-
if ( active[ id ] === false ) {
|
|
648
|
+
if ( geometryId >= this._geometryCount ) {
|
|
601
649
|
|
|
602
650
|
return null;
|
|
603
651
|
|
|
604
652
|
}
|
|
605
653
|
|
|
606
654
|
// compute bounding box
|
|
607
|
-
const bound = this._bounds[
|
|
655
|
+
const bound = this._bounds[ geometryId ];
|
|
608
656
|
const box = bound.box;
|
|
609
657
|
const geometry = this.geometry;
|
|
610
658
|
if ( bound.boxInitialized === false ) {
|
|
@@ -613,7 +661,7 @@ class BatchedMesh extends Mesh {
|
|
|
613
661
|
|
|
614
662
|
const index = geometry.index;
|
|
615
663
|
const position = geometry.attributes.position;
|
|
616
|
-
const drawRange = this._drawRanges[
|
|
664
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
617
665
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
618
666
|
|
|
619
667
|
let iv = i;
|
|
@@ -637,29 +685,28 @@ class BatchedMesh extends Mesh {
|
|
|
637
685
|
}
|
|
638
686
|
|
|
639
687
|
// get bounding sphere and compute it if it doesn't exist
|
|
640
|
-
getBoundingSphereAt(
|
|
688
|
+
getBoundingSphereAt( geometryId, target ) {
|
|
641
689
|
|
|
642
|
-
|
|
643
|
-
if ( active[ id ] === false ) {
|
|
690
|
+
if ( geometryId >= this._geometryCount ) {
|
|
644
691
|
|
|
645
692
|
return null;
|
|
646
693
|
|
|
647
694
|
}
|
|
648
695
|
|
|
649
696
|
// compute bounding sphere
|
|
650
|
-
const bound = this._bounds[
|
|
697
|
+
const bound = this._bounds[ geometryId ];
|
|
651
698
|
const sphere = bound.sphere;
|
|
652
699
|
const geometry = this.geometry;
|
|
653
700
|
if ( bound.sphereInitialized === false ) {
|
|
654
701
|
|
|
655
702
|
sphere.makeEmpty();
|
|
656
703
|
|
|
657
|
-
this.getBoundingBoxAt(
|
|
704
|
+
this.getBoundingBoxAt( geometryId, _box );
|
|
658
705
|
_box.getCenter( sphere.center );
|
|
659
706
|
|
|
660
707
|
const index = geometry.index;
|
|
661
708
|
const position = geometry.attributes.position;
|
|
662
|
-
const drawRange = this._drawRanges[
|
|
709
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
663
710
|
|
|
664
711
|
let maxRadiusSq = 0;
|
|
665
712
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
@@ -686,91 +733,175 @@ class BatchedMesh extends Mesh {
|
|
|
686
733
|
|
|
687
734
|
}
|
|
688
735
|
|
|
689
|
-
setMatrixAt(
|
|
736
|
+
setMatrixAt( instanceId, matrix ) {
|
|
690
737
|
|
|
691
738
|
// @TODO: Map geometryId to index of the arrays because
|
|
692
739
|
// optimize() can make geometryId mismatch the index
|
|
693
740
|
|
|
694
|
-
const
|
|
741
|
+
const drawInfo = this._drawInfo;
|
|
695
742
|
const matricesTexture = this._matricesTexture;
|
|
696
743
|
const matricesArray = this._matricesTexture.image.data;
|
|
697
|
-
|
|
698
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
744
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
699
745
|
|
|
700
746
|
return this;
|
|
701
747
|
|
|
702
748
|
}
|
|
703
749
|
|
|
704
|
-
matrix.toArray( matricesArray,
|
|
750
|
+
matrix.toArray( matricesArray, instanceId * 16 );
|
|
705
751
|
matricesTexture.needsUpdate = true;
|
|
706
752
|
|
|
707
753
|
return this;
|
|
708
754
|
|
|
709
755
|
}
|
|
710
756
|
|
|
711
|
-
getMatrixAt(
|
|
757
|
+
getMatrixAt( instanceId, matrix ) {
|
|
712
758
|
|
|
713
|
-
const
|
|
759
|
+
const drawInfo = this._drawInfo;
|
|
714
760
|
const matricesArray = this._matricesTexture.image.data;
|
|
715
|
-
|
|
716
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
761
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
717
762
|
|
|
718
763
|
return null;
|
|
719
764
|
|
|
720
765
|
}
|
|
721
766
|
|
|
722
|
-
return matrix.fromArray( matricesArray,
|
|
767
|
+
return matrix.fromArray( matricesArray, instanceId * 16 );
|
|
723
768
|
|
|
724
769
|
}
|
|
725
770
|
|
|
726
|
-
|
|
771
|
+
setColorAt( instanceId, color ) {
|
|
772
|
+
|
|
773
|
+
if ( this._colorsTexture === null ) {
|
|
727
774
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
775
|
+
this._initColorsTexture();
|
|
776
|
+
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// @TODO: Map id to index of the arrays because
|
|
780
|
+
// optimize() can make id mismatch the index
|
|
781
|
+
|
|
782
|
+
const colorsTexture = this._colorsTexture;
|
|
783
|
+
const colorsArray = this._colorsTexture.image.data;
|
|
784
|
+
const drawInfo = this._drawInfo;
|
|
785
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
786
|
+
|
|
787
|
+
return this;
|
|
788
|
+
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
color.toArray( colorsArray, instanceId * 4 );
|
|
792
|
+
colorsTexture.needsUpdate = true;
|
|
793
|
+
|
|
794
|
+
return this;
|
|
795
|
+
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
getColorAt( instanceId, color ) {
|
|
799
|
+
|
|
800
|
+
const colorsArray = this._colorsTexture.image.data;
|
|
801
|
+
const drawInfo = this._drawInfo;
|
|
802
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
803
|
+
|
|
804
|
+
return null;
|
|
805
|
+
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
return color.fromArray( colorsArray, instanceId * 4 );
|
|
809
|
+
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
setVisibleAt( instanceId, value ) {
|
|
731
813
|
|
|
732
814
|
// if the geometry is out of range, not active, or visibility state
|
|
733
815
|
// does not change then return early
|
|
816
|
+
const drawInfo = this._drawInfo;
|
|
734
817
|
if (
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
818
|
+
instanceId >= drawInfo.length ||
|
|
819
|
+
drawInfo[ instanceId ].active === false ||
|
|
820
|
+
drawInfo[ instanceId ].visible === value
|
|
738
821
|
) {
|
|
739
822
|
|
|
740
823
|
return this;
|
|
741
824
|
|
|
742
825
|
}
|
|
743
826
|
|
|
744
|
-
|
|
827
|
+
drawInfo[ instanceId ].visible = value;
|
|
745
828
|
this._visibilityChanged = true;
|
|
746
829
|
|
|
747
830
|
return this;
|
|
748
831
|
|
|
749
832
|
}
|
|
750
833
|
|
|
751
|
-
getVisibleAt(
|
|
752
|
-
|
|
753
|
-
const visibility = this._visibility;
|
|
754
|
-
const active = this._active;
|
|
755
|
-
const geometryCount = this._geometryCount;
|
|
834
|
+
getVisibleAt( instanceId ) {
|
|
756
835
|
|
|
757
836
|
// return early if the geometry is out of range or not active
|
|
758
|
-
|
|
837
|
+
const drawInfo = this._drawInfo;
|
|
838
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
759
839
|
|
|
760
840
|
return false;
|
|
761
841
|
|
|
762
842
|
}
|
|
763
843
|
|
|
764
|
-
return
|
|
844
|
+
return drawInfo[ instanceId ].visible;
|
|
845
|
+
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
setGeometryIdAt( instanceId, geometryId ) {
|
|
849
|
+
|
|
850
|
+
// return early if the geometry is out of range or not active
|
|
851
|
+
const drawInfo = this._drawInfo;
|
|
852
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
853
|
+
|
|
854
|
+
return null;
|
|
855
|
+
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// check if the provided geometryId is within the valid range
|
|
859
|
+
if ( geometryId < 0 || geometryId >= this._geometryCount ) {
|
|
860
|
+
|
|
861
|
+
return null;
|
|
862
|
+
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
drawInfo[ instanceId ].geometryIndex = geometryId;
|
|
866
|
+
|
|
867
|
+
return this;
|
|
868
|
+
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
getGeometryIdAt( instanceId ) {
|
|
872
|
+
|
|
873
|
+
const drawInfo = this._drawInfo;
|
|
874
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
875
|
+
|
|
876
|
+
return - 1;
|
|
877
|
+
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
return drawInfo[ instanceId ].geometryIndex;
|
|
881
|
+
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
getGeometryRangeAt( geometryId, target = {} ) {
|
|
885
|
+
|
|
886
|
+
if ( geometryId < 0 || geometryId >= this._geometryCount ) {
|
|
887
|
+
|
|
888
|
+
return null;
|
|
889
|
+
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
893
|
+
|
|
894
|
+
target.start = drawRange.start;
|
|
895
|
+
target.count = drawRange.count;
|
|
896
|
+
|
|
897
|
+
return target;
|
|
765
898
|
|
|
766
899
|
}
|
|
767
900
|
|
|
768
901
|
raycast( raycaster, intersects ) {
|
|
769
902
|
|
|
770
|
-
const
|
|
771
|
-
const active = this._active;
|
|
903
|
+
const drawInfo = this._drawInfo;
|
|
772
904
|
const drawRanges = this._drawRanges;
|
|
773
|
-
const geometryCount = this._geometryCount;
|
|
774
905
|
const matrixWorld = this.matrixWorld;
|
|
775
906
|
const batchGeometry = this.geometry;
|
|
776
907
|
|
|
@@ -790,21 +921,22 @@ class BatchedMesh extends Mesh {
|
|
|
790
921
|
|
|
791
922
|
}
|
|
792
923
|
|
|
793
|
-
for ( let i = 0; i <
|
|
924
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
794
925
|
|
|
795
|
-
if ( !
|
|
926
|
+
if ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {
|
|
796
927
|
|
|
797
928
|
continue;
|
|
798
929
|
|
|
799
930
|
}
|
|
800
931
|
|
|
801
|
-
const
|
|
932
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
933
|
+
const drawRange = drawRanges[ geometryId ];
|
|
802
934
|
_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );
|
|
803
935
|
|
|
804
936
|
// ge the intersects
|
|
805
937
|
this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );
|
|
806
|
-
this.getBoundingBoxAt(
|
|
807
|
-
this.getBoundingSphereAt(
|
|
938
|
+
this.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );
|
|
939
|
+
this.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );
|
|
808
940
|
_mesh.raycast( raycaster, _batchIntersects );
|
|
809
941
|
|
|
810
942
|
// add batch id to the intersects
|
|
@@ -841,8 +973,7 @@ class BatchedMesh extends Mesh {
|
|
|
841
973
|
this._drawRanges = source._drawRanges.map( range => ( { ...range } ) );
|
|
842
974
|
this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );
|
|
843
975
|
|
|
844
|
-
this.
|
|
845
|
-
this._active = source._active.slice();
|
|
976
|
+
this._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );
|
|
846
977
|
this._bounds = source._bounds.map( bound => ( {
|
|
847
978
|
boxInitialized: bound.boxInitialized,
|
|
848
979
|
box: bound.box.clone(),
|
|
@@ -851,7 +982,7 @@ class BatchedMesh extends Mesh {
|
|
|
851
982
|
sphere: bound.sphere.clone()
|
|
852
983
|
} ) );
|
|
853
984
|
|
|
854
|
-
this.
|
|
985
|
+
this._maxInstanceCount = source._maxInstanceCount;
|
|
855
986
|
this._maxVertexCount = source._maxVertexCount;
|
|
856
987
|
this._maxIndexCount = source._maxIndexCount;
|
|
857
988
|
|
|
@@ -861,7 +992,14 @@ class BatchedMesh extends Mesh {
|
|
|
861
992
|
this._multiDrawStarts = source._multiDrawStarts.slice();
|
|
862
993
|
|
|
863
994
|
this._matricesTexture = source._matricesTexture.clone();
|
|
864
|
-
this._matricesTexture.image.data = this._matricesTexture.image.slice();
|
|
995
|
+
this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
|
|
996
|
+
|
|
997
|
+
if ( this._colorsTexture !== null ) {
|
|
998
|
+
|
|
999
|
+
this._colorsTexture = source._colorsTexture.clone();
|
|
1000
|
+
this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
|
|
1001
|
+
|
|
1002
|
+
}
|
|
865
1003
|
|
|
866
1004
|
return this;
|
|
867
1005
|
|
|
@@ -874,6 +1012,17 @@ class BatchedMesh extends Mesh {
|
|
|
874
1012
|
|
|
875
1013
|
this._matricesTexture.dispose();
|
|
876
1014
|
this._matricesTexture = null;
|
|
1015
|
+
|
|
1016
|
+
this._indirectTexture.dispose();
|
|
1017
|
+
this._indirectTexture = null;
|
|
1018
|
+
|
|
1019
|
+
if ( this._colorsTexture !== null ) {
|
|
1020
|
+
|
|
1021
|
+
this._colorsTexture.dispose();
|
|
1022
|
+
this._colorsTexture = null;
|
|
1023
|
+
|
|
1024
|
+
}
|
|
1025
|
+
|
|
877
1026
|
return this;
|
|
878
1027
|
|
|
879
1028
|
}
|
|
@@ -893,12 +1042,13 @@ class BatchedMesh extends Mesh {
|
|
|
893
1042
|
const index = geometry.getIndex();
|
|
894
1043
|
const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
|
|
895
1044
|
|
|
896
|
-
const
|
|
897
|
-
const visibility = this._visibility;
|
|
1045
|
+
const drawInfo = this._drawInfo;
|
|
898
1046
|
const multiDrawStarts = this._multiDrawStarts;
|
|
899
1047
|
const multiDrawCounts = this._multiDrawCounts;
|
|
900
1048
|
const drawRanges = this._drawRanges;
|
|
901
1049
|
const perObjectFrustumCulled = this.perObjectFrustumCulled;
|
|
1050
|
+
const indirectTexture = this._indirectTexture;
|
|
1051
|
+
const indirectArray = indirectTexture.image.data;
|
|
902
1052
|
|
|
903
1053
|
// prepare the frustum in the local frame
|
|
904
1054
|
if ( perObjectFrustumCulled ) {
|
|
@@ -919,14 +1069,17 @@ class BatchedMesh extends Mesh {
|
|
|
919
1069
|
// get the camera position in the local frame
|
|
920
1070
|
_invMatrixWorld.copy( this.matrixWorld ).invert();
|
|
921
1071
|
_vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );
|
|
1072
|
+
_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );
|
|
922
1073
|
|
|
923
|
-
for ( let i = 0, l =
|
|
1074
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
924
1075
|
|
|
925
|
-
if (
|
|
1076
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
1077
|
+
|
|
1078
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
926
1079
|
|
|
927
1080
|
// get the bounds in world space
|
|
928
1081
|
this.getMatrixAt( i, _matrix );
|
|
929
|
-
this.getBoundingSphereAt(
|
|
1082
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
930
1083
|
|
|
931
1084
|
// determine whether the batched geometry is within the frustum
|
|
932
1085
|
let culled = false;
|
|
@@ -939,8 +1092,8 @@ class BatchedMesh extends Mesh {
|
|
|
939
1092
|
if ( ! culled ) {
|
|
940
1093
|
|
|
941
1094
|
// get the distance from camera used for sorting
|
|
942
|
-
const z =
|
|
943
|
-
_renderList.push( drawRanges[
|
|
1095
|
+
const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
|
|
1096
|
+
_renderList.push( drawRanges[ geometryId ], z, i );
|
|
944
1097
|
|
|
945
1098
|
}
|
|
946
1099
|
|
|
@@ -966,6 +1119,7 @@ class BatchedMesh extends Mesh {
|
|
|
966
1119
|
const item = list[ i ];
|
|
967
1120
|
multiDrawStarts[ count ] = item.start * bytesPerElement;
|
|
968
1121
|
multiDrawCounts[ count ] = item.count;
|
|
1122
|
+
indirectArray[ count ] = item.index;
|
|
969
1123
|
count ++;
|
|
970
1124
|
|
|
971
1125
|
}
|
|
@@ -974,9 +1128,11 @@ class BatchedMesh extends Mesh {
|
|
|
974
1128
|
|
|
975
1129
|
} else {
|
|
976
1130
|
|
|
977
|
-
for ( let i = 0, l =
|
|
1131
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
1132
|
+
|
|
1133
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
978
1134
|
|
|
979
|
-
|
|
1135
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
980
1136
|
|
|
981
1137
|
// determine whether the batched geometry is within the frustum
|
|
982
1138
|
let culled = false;
|
|
@@ -984,16 +1140,17 @@ class BatchedMesh extends Mesh {
|
|
|
984
1140
|
|
|
985
1141
|
// get the bounds in world space
|
|
986
1142
|
this.getMatrixAt( i, _matrix );
|
|
987
|
-
this.getBoundingSphereAt(
|
|
1143
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
988
1144
|
culled = ! _frustum.intersectsSphere( _sphere );
|
|
989
1145
|
|
|
990
1146
|
}
|
|
991
1147
|
|
|
992
1148
|
if ( ! culled ) {
|
|
993
1149
|
|
|
994
|
-
const range = drawRanges[
|
|
1150
|
+
const range = drawRanges[ geometryId ];
|
|
995
1151
|
multiDrawStarts[ count ] = range.start * bytesPerElement;
|
|
996
1152
|
multiDrawCounts[ count ] = range.count;
|
|
1153
|
+
indirectArray[ count ] = i;
|
|
997
1154
|
count ++;
|
|
998
1155
|
|
|
999
1156
|
}
|
|
@@ -1004,6 +1161,7 @@ class BatchedMesh extends Mesh {
|
|
|
1004
1161
|
|
|
1005
1162
|
}
|
|
1006
1163
|
|
|
1164
|
+
indirectTexture.needsUpdate = true;
|
|
1007
1165
|
this._multiDrawCount = count;
|
|
1008
1166
|
this._visibilityChanged = false;
|
|
1009
1167
|
|