super-three 0.164.0 → 0.167.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/README.md +3 -3
- package/build/three.cjs +1273 -503
- package/build/three.module.js +1269 -504
- package/build/three.module.min.js +1 -1
- package/build/three.webgpu.js +76086 -0
- package/build/three.webgpu.min.js +6 -0
- package/examples/jsm/Addons.js +2 -1
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/csm/CSMShader.js +4 -4
- package/examples/jsm/environments/RoomEnvironment.js +1 -5
- package/examples/jsm/exporters/GLTFExporter.js +8 -4
- package/examples/jsm/exporters/USDZExporter.js +6 -4
- package/examples/jsm/geometries/TeapotGeometry.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +75 -61
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
- package/examples/jsm/lines/LineMaterial.js +1 -15
- 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/DRACOLoader.js +1 -1
- package/examples/jsm/loaders/FBXLoader.js +47 -58
- package/examples/jsm/loaders/GLTFLoader.js +12 -4
- package/examples/jsm/loaders/LDrawLoader.js +3 -2
- package/examples/jsm/loaders/MMDLoader.js +31 -12
- package/examples/jsm/loaders/MaterialXLoader.js +2 -9
- package/examples/jsm/loaders/USDZLoader.js +124 -76
- package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
- package/examples/jsm/loaders/VTKLoader.js +76 -3
- package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
- package/examples/jsm/modifiers/CurveModifier.js +11 -9
- 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/postprocessing/RenderPass.js +1 -1
- package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
- package/examples/jsm/postprocessing/SSAOPass.js +6 -9
- 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/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/transpiler/GLSLDecoder.js +46 -4
- package/examples/jsm/transpiler/TSLEncoder.js +17 -15
- package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
- package/examples/jsm/utils/GPUStatsPanel.js +2 -0
- package/examples/jsm/utils/SortUtils.js +8 -5
- package/package.json +9 -7
- package/src/Three.WebGPU.js +194 -0
- package/src/Three.js +2 -0
- 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/constants.js +4 -1
- package/src/core/Object3D.js +24 -22
- package/src/core/Raycaster.js +6 -2
- package/src/extras/TextureUtils.js +210 -0
- 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 +4 -0
- package/src/loaders/LoaderUtils.js +3 -1
- package/src/loaders/ObjectLoader.js +34 -2
- package/src/materials/Material.js +13 -4
- 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/Vector4.js +13 -0
- package/{examples/jsm → src}/nodes/Nodes.js +39 -20
- package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
- package/src/nodes/accessors/BitangentNode.js +13 -0
- package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
- package/{examples/jsm → src}/nodes/accessors/BufferNode.js +6 -0
- package/src/nodes/accessors/CameraNode.js +19 -0
- package/{examples/jsm → src}/nodes/accessors/CubeTextureNode.js +22 -5
- package/src/nodes/accessors/InstanceNode.js +140 -0
- package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +24 -2
- package/{examples/jsm → src}/nodes/accessors/ModelNode.js +4 -0
- package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
- package/src/nodes/accessors/NormalNode.js +14 -0
- package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/PositionNode.js +10 -0
- package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +7 -1
- package/src/nodes/accessors/ReflectVectorNode.js +10 -0
- package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
- package/{examples/jsm/nodes/accessors/TextureStoreNode.js → src/nodes/accessors/StorageTextureNode.js} +28 -6
- package/src/nodes/accessors/TangentNode.js +23 -0
- package/src/nodes/accessors/Texture3DNode.js +100 -0
- package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
- package/src/nodes/accessors/UVNode.js +3 -0
- package/{examples/jsm → src}/nodes/accessors/UniformsNode.js +7 -1
- package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +2 -1
- package/{examples/jsm → src}/nodes/code/ScriptableNode.js +14 -0
- package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +2 -1
- package/{examples/jsm → src}/nodes/core/AttributeNode.js +34 -8
- package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
- package/{examples/jsm → src}/nodes/core/ContextNode.js +6 -0
- package/{examples/jsm → src}/nodes/core/IndexNode.js +6 -0
- package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
- package/src/nodes/core/MRTNode.js +76 -0
- package/{examples/jsm → src}/nodes/core/Node.js +33 -14
- package/{examples/jsm → src}/nodes/core/NodeBuilder.js +194 -45
- package/src/nodes/core/NodeCache.js +36 -0
- package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
- package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
- package/{examples/jsm → src}/nodes/core/NodeKeywords.js +1 -1
- package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
- package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
- package/{examples/jsm → src}/nodes/core/OutputStructNode.js +1 -5
- package/{examples/jsm → src}/nodes/core/PropertyNode.js +2 -0
- package/{examples/jsm → src}/nodes/core/TempNode.js +2 -2
- package/{examples/jsm → src}/nodes/core/UniformGroupNode.js +20 -0
- package/{examples/jsm → src}/nodes/core/UniformNode.js +10 -1
- package/{examples/jsm → src}/nodes/core/VarNode.js +2 -6
- package/src/nodes/core/VaryingNode.js +104 -0
- package/{examples/jsm → src}/nodes/display/AfterImageNode.js +24 -20
- package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +18 -21
- package/src/nodes/display/BloomNode.js +333 -0
- package/{examples/jsm → src}/nodes/display/ColorAdjustmentNode.js +7 -2
- package/{examples/jsm → src}/nodes/display/ColorSpaceNode.js +1 -1
- package/src/nodes/display/DenoiseNode.js +198 -0
- package/src/nodes/display/DepthOfFieldNode.js +119 -0
- package/src/nodes/display/DotScreenNode.js +75 -0
- package/src/nodes/display/FXAANode.js +327 -0
- package/src/nodes/display/FilmNode.js +52 -0
- package/{examples/jsm → src}/nodes/display/FrontFacingNode.js +2 -1
- package/src/nodes/display/GTAONode.js +324 -0
- package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +34 -17
- package/src/nodes/display/Lut3DNode.js +53 -0
- package/{examples/jsm → src}/nodes/display/NormalMapNode.js +1 -1
- package/src/nodes/display/PassNode.js +291 -0
- package/src/nodes/display/PixelationPassNode.js +201 -0
- package/src/nodes/display/RGBShiftNode.js +49 -0
- package/src/nodes/display/RenderOutputNode.js +56 -0
- package/src/nodes/display/SobelOperatorNode.js +121 -0
- package/{examples/jsm → src}/nodes/display/ToneMappingNode.js +44 -5
- package/src/nodes/display/TransitionNode.js +76 -0
- package/{examples/jsm → src}/nodes/display/ViewportDepthNode.js +39 -16
- package/{examples/jsm → src}/nodes/display/ViewportDepthTextureNode.js +2 -1
- package/{examples/jsm → src}/nodes/display/ViewportNode.js +3 -2
- package/{examples/jsm → src}/nodes/display/ViewportSharedTextureNode.js +2 -1
- package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +5 -2
- package/src/nodes/functions/BSDF/LTC.js +131 -0
- package/src/nodes/functions/BasicLightingModel.js +78 -0
- package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +5 -3
- package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +103 -18
- package/src/nodes/functions/ToonLightingModel.js +51 -0
- package/{examples/jsm → src}/nodes/geometry/RangeNode.js +19 -6
- package/{examples/jsm → src}/nodes/lighting/AONode.js +1 -4
- package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +1 -1
- package/src/nodes/lighting/AnalyticLightNode.js +333 -0
- package/src/nodes/lighting/BasicEnvironmentNode.js +26 -0
- package/src/nodes/lighting/BasicLightMapNode.js +29 -0
- package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +2 -3
- package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +5 -4
- package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +2 -1
- package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +1 -1
- package/{examples/jsm → src}/nodes/lighting/LightingNode.js +2 -0
- package/{examples/jsm → src}/nodes/lighting/LightsNode.js +18 -3
- package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +2 -3
- package/src/nodes/lighting/RectAreaLightNode.js +97 -0
- package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +2 -3
- package/{examples/jsm → src}/nodes/loaders/NodeLoader.js +3 -1
- package/{examples/jsm → src}/nodes/loaders/NodeMaterialLoader.js +2 -1
- package/{examples/jsm → src}/nodes/loaders/NodeObjectLoader.js +2 -1
- package/{examples/jsm → src}/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
- package/{examples/jsm → src}/nodes/materials/Line2NodeMaterial.js +4 -4
- package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
- package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
- package/{examples/jsm → src}/nodes/materials/Materials.js +3 -0
- package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
- package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
- package/src/nodes/materials/MeshMatcapNodeMaterial.js +53 -0
- package/{examples/jsm → src}/nodes/materials/MeshNormalNodeMaterial.js +5 -3
- package/{examples/jsm → src}/nodes/materials/MeshPhongNodeMaterial.js +11 -3
- package/{examples/jsm → src}/nodes/materials/MeshPhysicalNodeMaterial.js +26 -8
- package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
- package/src/nodes/materials/MeshToonNodeMaterial.js +34 -0
- package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +97 -24
- package/{examples/jsm → src}/nodes/materials/PointsNodeMaterial.js +3 -3
- package/{examples/jsm → src}/nodes/materials/ShadowNodeMaterial.js +3 -3
- package/{examples/jsm → src}/nodes/materials/SpriteNodeMaterial.js +3 -3
- package/src/nodes/materials/VolumeNodeMaterial.js +106 -0
- package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +9 -17
- package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +474 -577
- package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +2 -8
- package/{examples/jsm → src}/nodes/math/CondNode.js +13 -6
- package/{examples/jsm → src}/nodes/math/HashNode.js +2 -2
- package/{examples/jsm → src}/nodes/math/MathNode.js +14 -1
- package/{examples/jsm → src}/nodes/math/OperatorNode.js +6 -6
- package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
- package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +2 -1
- package/{examples/jsm → src}/nodes/shadernode/ShaderNode.js +57 -33
- package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +1 -1
- package/{examples/jsm → src}/nodes/utils/DiscardNode.js +1 -0
- package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +2 -0
- package/{examples/jsm → src}/nodes/utils/LoopNode.js +7 -6
- package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +1 -1
- package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +8 -2
- package/src/nodes/utils/RTTNode.js +130 -0
- package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
- package/{examples/jsm → src}/nodes/utils/TimerNode.js +1 -1
- package/src/objects/BatchedMesh.js +232 -162
- package/src/objects/InstancedMesh.js +1 -1
- package/src/renderers/WebGLRenderer.js +312 -68
- 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 +9 -3
- package/src/renderers/common/BindGroup.js +16 -0
- package/{examples/jsm → src}/renderers/common/Bindings.js +54 -22
- package/src/renderers/common/ChainMap.js +59 -0
- package/{examples/jsm → src}/renderers/common/ClippingContext.js +8 -6
- package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
- package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +7 -1
- package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
- package/{examples/jsm → src}/renderers/common/Info.js +34 -6
- package/{examples/jsm → src}/renderers/common/Pipelines.js +2 -2
- package/src/renderers/common/PostProcessing.js +87 -0
- package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
- package/src/renderers/common/RenderBundle.js +18 -0
- package/src/renderers/common/RenderBundles.js +38 -0
- package/{examples/jsm → src}/renderers/common/RenderContext.js +1 -1
- package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
- package/{examples/jsm → src}/renderers/common/RenderList.js +9 -0
- package/{examples/jsm → src}/renderers/common/RenderObject.js +50 -11
- package/{examples/jsm → src}/renderers/common/Renderer.js +220 -40
- package/{examples/jsm → src}/renderers/common/SampledTexture.js +2 -2
- 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 +6 -2
- package/{examples/jsm → src}/renderers/common/Uniform.js +10 -5
- package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
- package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +13 -12
- package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
- package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +19 -4
- 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 +37 -16
- 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/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 +7 -4
- 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/ShaderLib/depth.glsl.js +8 -0
- package/src/renderers/shaders/UniformsLib.js +3 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -2
- package/src/renderers/webgl/WebGLBackground.js +6 -0
- package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
- package/src/renderers/webgl/WebGLExtensions.js +3 -1
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
- package/src/renderers/webgl/WebGLLights.js +15 -12
- package/src/renderers/webgl/WebGLMaterials.js +1 -5
- package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
- package/src/renderers/webgl/WebGLProgram.js +28 -31
- package/src/renderers/webgl/WebGLPrograms.js +15 -15
- package/src/renderers/webgl/WebGLRenderStates.js +2 -2
- package/src/renderers/webgl/WebGLTextures.js +100 -70
- package/src/renderers/webgl/WebGLUniforms.js +12 -2
- package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +156 -54
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +188 -41
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -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 +1 -1
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +126 -7
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
- package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +212 -78
- package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
- package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +245 -49
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +30 -14
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +9 -1
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +74 -24
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +101 -25
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
- package/src/renderers/webxr/WebXRDepthSensing.js +9 -3
- package/src/renderers/webxr/WebXRManager.js +12 -2
- package/src/textures/CompressedArrayTexture.js +14 -0
- package/src/textures/DataArrayTexture.js +14 -0
- package/src/textures/DepthTexture.js +1 -3
- package/src/utils.js +30 -1
- package/examples/jsm/nodes/accessors/BitangentNode.js +0 -89
- package/examples/jsm/nodes/accessors/CameraNode.js +0 -119
- package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
- package/examples/jsm/nodes/accessors/NormalNode.js +0 -106
- package/examples/jsm/nodes/accessors/PositionNode.js +0 -104
- package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -35
- package/examples/jsm/nodes/accessors/TangentNode.js +0 -109
- package/examples/jsm/nodes/accessors/UVNode.js +0 -47
- package/examples/jsm/nodes/core/NodeCache.js +0 -26
- package/examples/jsm/nodes/core/VaryingNode.js +0 -65
- package/examples/jsm/nodes/display/PassNode.js +0 -199
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -255
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
- package/examples/jsm/renderers/common/ChainMap.js +0 -89
- package/examples/jsm/renderers/common/PostProcessing.js +0 -33
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
- /package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/InstancedPointsMaterialNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/PointUVNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/SceneNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/SkinningNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/TextureBicubicNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +0 -0
- /package/{examples/jsm → src}/nodes/code/CodeNode.js +0 -0
- /package/{examples/jsm → src}/nodes/code/ExpressionNode.js +0 -0
- /package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +0 -0
- /package/{examples/jsm → src}/nodes/code/FunctionNode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/AssignNode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/BypassNode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/ConstNode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/InputNode.js +0 -0
- /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/ParameterNode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/StackNode.js +0 -0
- /package/{examples/jsm → src}/nodes/core/StructTypeNode.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/display/BlendModeNode.js +0 -0
- /package/{examples/jsm → src}/nodes/display/BumpMapNode.js +0 -0
- /package/{examples/jsm → src}/nodes/display/PosterizeNode.js +0 -0
- /package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +0 -0
- /package/{examples/jsm → src}/nodes/fog/FogNode.js +0 -0
- /package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/material/getGeometryRoughness.js +0 -0
- /package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +0 -0
- /package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +0 -0
- /package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +0 -0
- /package/{examples/jsm → src}/nodes/lighting/LightNode.js +0 -0
- /package/{examples/jsm → src}/nodes/lighting/LightUtils.js +0 -0
- /package/{examples/jsm → src}/nodes/lighting/LightingContextNode.js +0 -0
- /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
- /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
- /package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +0 -0
- /package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -0
- /package/{examples/jsm → src}/nodes/math/TriNoise3D.js +0 -0
- /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
- /package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +0 -0
- /package/{examples/jsm → src}/nodes/procedural/CheckerNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/ConvertNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/JoinNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/OscNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/PackingNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/RemapNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/RotateNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/RotateUVNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/SetNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/SplitNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +0 -0
- /package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +0 -0
- /package/{examples/jsm → src}/renderers/common/Animation.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/RenderObjects.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}/WebGLBufferRenderer.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
- /package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.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,29 +142,33 @@ 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
|
+
// geometry information
|
|
139
149
|
this._drawRanges = [];
|
|
140
150
|
this._reservedRanges = [];
|
|
141
|
-
|
|
142
|
-
this._visibility = [];
|
|
143
|
-
this._active = [];
|
|
144
151
|
this._bounds = [];
|
|
145
152
|
|
|
146
|
-
this.
|
|
153
|
+
this._maxInstanceCount = maxInstanceCount;
|
|
147
154
|
this._maxVertexCount = maxVertexCount;
|
|
148
155
|
this._maxIndexCount = maxIndexCount;
|
|
149
156
|
|
|
150
157
|
this._geometryInitialized = false;
|
|
151
158
|
this._geometryCount = 0;
|
|
152
|
-
this._multiDrawCounts = new Int32Array(
|
|
153
|
-
this._multiDrawStarts = new Int32Array(
|
|
159
|
+
this._multiDrawCounts = new Int32Array( maxInstanceCount );
|
|
160
|
+
this._multiDrawStarts = new Int32Array( maxInstanceCount );
|
|
154
161
|
this._multiDrawCount = 0;
|
|
155
162
|
this._multiDrawInstances = null;
|
|
156
163
|
this._visibilityChanged = true;
|
|
157
164
|
|
|
158
165
|
// Local matrix per geometry by using data texture
|
|
159
166
|
this._matricesTexture = null;
|
|
167
|
+
this._indirectTexture = null;
|
|
168
|
+
this._colorsTexture = null;
|
|
160
169
|
|
|
161
170
|
this._initMatricesTexture();
|
|
171
|
+
this._initIndirectTexture();
|
|
162
172
|
|
|
163
173
|
}
|
|
164
174
|
|
|
@@ -171,7 +181,7 @@ class BatchedMesh extends Mesh {
|
|
|
171
181
|
// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)
|
|
172
182
|
// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)
|
|
173
183
|
|
|
174
|
-
let size = Math.sqrt( this.
|
|
184
|
+
let size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix
|
|
175
185
|
size = Math.ceil( size / 4 ) * 4;
|
|
176
186
|
size = Math.max( size, 4 );
|
|
177
187
|
|
|
@@ -182,11 +192,36 @@ class BatchedMesh extends Mesh {
|
|
|
182
192
|
|
|
183
193
|
}
|
|
184
194
|
|
|
195
|
+
_initIndirectTexture() {
|
|
196
|
+
|
|
197
|
+
let size = Math.sqrt( this._maxInstanceCount );
|
|
198
|
+
size = Math.ceil( size );
|
|
199
|
+
|
|
200
|
+
const indirectArray = new Uint32Array( size * size );
|
|
201
|
+
const indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );
|
|
202
|
+
|
|
203
|
+
this._indirectTexture = indirectTexture;
|
|
204
|
+
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
_initColorsTexture() {
|
|
208
|
+
|
|
209
|
+
let size = Math.sqrt( this._maxIndexCount );
|
|
210
|
+
size = Math.ceil( size );
|
|
211
|
+
|
|
212
|
+
// 4 floats per RGBA pixel initialized to white
|
|
213
|
+
const colorsArray = new Float32Array( size * size * 4 ).fill( 1 );
|
|
214
|
+
const colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );
|
|
215
|
+
colorsTexture.colorSpace = ColorManagement.workingColorSpace;
|
|
216
|
+
|
|
217
|
+
this._colorsTexture = colorsTexture;
|
|
218
|
+
|
|
219
|
+
}
|
|
220
|
+
|
|
185
221
|
_initializeGeometry( reference ) {
|
|
186
222
|
|
|
187
223
|
const geometry = this.geometry;
|
|
188
224
|
const maxVertexCount = this._maxVertexCount;
|
|
189
|
-
const maxGeometryCount = this._maxGeometryCount;
|
|
190
225
|
const maxIndexCount = this._maxIndexCount;
|
|
191
226
|
if ( this._geometryInitialized === false ) {
|
|
192
227
|
|
|
@@ -204,7 +239,8 @@ class BatchedMesh extends Mesh {
|
|
|
204
239
|
|
|
205
240
|
if ( reference.getIndex() !== null ) {
|
|
206
241
|
|
|
207
|
-
|
|
242
|
+
// Reserve last u16 index for primitive restart.
|
|
243
|
+
const indexArray = maxVertexCount > 65535
|
|
208
244
|
? new Uint32Array( maxIndexCount )
|
|
209
245
|
: new Uint16Array( maxIndexCount );
|
|
210
246
|
|
|
@@ -212,11 +248,6 @@ class BatchedMesh extends Mesh {
|
|
|
212
248
|
|
|
213
249
|
}
|
|
214
250
|
|
|
215
|
-
const idArray = maxGeometryCount > 65536
|
|
216
|
-
? new Uint32Array( maxVertexCount )
|
|
217
|
-
: new Uint16Array( maxVertexCount );
|
|
218
|
-
geometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) );
|
|
219
|
-
|
|
220
251
|
this._geometryInitialized = true;
|
|
221
252
|
|
|
222
253
|
}
|
|
@@ -226,13 +257,6 @@ class BatchedMesh extends Mesh {
|
|
|
226
257
|
// Make sure the geometry is compatible with the existing combined geometry attributes
|
|
227
258
|
_validateGeometry( geometry ) {
|
|
228
259
|
|
|
229
|
-
// check that the geometry doesn't have a version of our reserved id attribute
|
|
230
|
-
if ( geometry.getAttribute( ID_ATTR_NAME ) ) {
|
|
231
|
-
|
|
232
|
-
throw new Error( `BatchedMesh: Geometry cannot use attribute "${ ID_ATTR_NAME }"` );
|
|
233
|
-
|
|
234
|
-
}
|
|
235
|
-
|
|
236
260
|
// check to ensure the geometries are using consistent attributes and indices
|
|
237
261
|
const batchGeometry = this.geometry;
|
|
238
262
|
if ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {
|
|
@@ -243,12 +267,6 @@ class BatchedMesh extends Mesh {
|
|
|
243
267
|
|
|
244
268
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
245
269
|
|
|
246
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
247
|
-
|
|
248
|
-
continue;
|
|
249
|
-
|
|
250
|
-
}
|
|
251
|
-
|
|
252
270
|
if ( ! geometry.hasAttribute( attributeName ) ) {
|
|
253
271
|
|
|
254
272
|
throw new Error( `BatchedMesh: Added geometry missing "${ attributeName }". All geometries must have consistent attributes.` );
|
|
@@ -284,15 +302,16 @@ class BatchedMesh extends Mesh {
|
|
|
284
302
|
|
|
285
303
|
const geometryCount = this._geometryCount;
|
|
286
304
|
const boundingBox = this.boundingBox;
|
|
287
|
-
const
|
|
305
|
+
const drawInfo = this._drawInfo;
|
|
288
306
|
|
|
289
307
|
boundingBox.makeEmpty();
|
|
290
308
|
for ( let i = 0; i < geometryCount; i ++ ) {
|
|
291
309
|
|
|
292
|
-
if (
|
|
310
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
293
311
|
|
|
312
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
294
313
|
this.getMatrixAt( i, _matrix );
|
|
295
|
-
this.getBoundingBoxAt(
|
|
314
|
+
this.getBoundingBoxAt( geometryId, _box ).applyMatrix4( _matrix );
|
|
296
315
|
boundingBox.union( _box );
|
|
297
316
|
|
|
298
317
|
}
|
|
@@ -307,23 +326,59 @@ class BatchedMesh extends Mesh {
|
|
|
307
326
|
|
|
308
327
|
}
|
|
309
328
|
|
|
310
|
-
const geometryCount = this._geometryCount;
|
|
311
329
|
const boundingSphere = this.boundingSphere;
|
|
312
|
-
const
|
|
330
|
+
const drawInfo = this._drawInfo;
|
|
313
331
|
|
|
314
332
|
boundingSphere.makeEmpty();
|
|
315
|
-
for ( let i = 0; i <
|
|
333
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
316
334
|
|
|
317
|
-
if (
|
|
335
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
318
336
|
|
|
337
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
319
338
|
this.getMatrixAt( i, _matrix );
|
|
320
|
-
this.getBoundingSphereAt(
|
|
339
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
321
340
|
boundingSphere.union( _sphere );
|
|
322
341
|
|
|
323
342
|
}
|
|
324
343
|
|
|
325
344
|
}
|
|
326
345
|
|
|
346
|
+
addInstance( geometryId ) {
|
|
347
|
+
|
|
348
|
+
// ensure we're not over geometry
|
|
349
|
+
if ( this._drawInfo.length >= this._maxInstanceCount ) {
|
|
350
|
+
|
|
351
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
352
|
+
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
this._drawInfo.push( {
|
|
356
|
+
|
|
357
|
+
visible: true,
|
|
358
|
+
active: true,
|
|
359
|
+
geometryIndex: geometryId,
|
|
360
|
+
|
|
361
|
+
} );
|
|
362
|
+
|
|
363
|
+
// initialize the matrix
|
|
364
|
+
const drawId = this._drawInfo.length - 1;
|
|
365
|
+
const matricesTexture = this._matricesTexture;
|
|
366
|
+
const matricesArray = matricesTexture.image.data;
|
|
367
|
+
_identityMatrix.toArray( matricesArray, drawId * 16 );
|
|
368
|
+
matricesTexture.needsUpdate = true;
|
|
369
|
+
|
|
370
|
+
const colorsTexture = this._colorsTexture;
|
|
371
|
+
if ( colorsTexture ) {
|
|
372
|
+
|
|
373
|
+
_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );
|
|
374
|
+
colorsTexture.needsUpdate = true;
|
|
375
|
+
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return drawId;
|
|
379
|
+
|
|
380
|
+
}
|
|
381
|
+
|
|
327
382
|
addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {
|
|
328
383
|
|
|
329
384
|
this._initializeGeometry( geometry );
|
|
@@ -331,9 +386,9 @@ class BatchedMesh extends Mesh {
|
|
|
331
386
|
this._validateGeometry( geometry );
|
|
332
387
|
|
|
333
388
|
// ensure we're not over geometry
|
|
334
|
-
if ( this.
|
|
389
|
+
if ( this._drawInfo.length >= this._maxInstanceCount ) {
|
|
335
390
|
|
|
336
|
-
throw new Error( 'BatchedMesh: Maximum
|
|
391
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
337
392
|
|
|
338
393
|
}
|
|
339
394
|
|
|
@@ -411,23 +466,10 @@ class BatchedMesh extends Mesh {
|
|
|
411
466
|
|
|
412
467
|
}
|
|
413
468
|
|
|
414
|
-
const visibility = this._visibility;
|
|
415
|
-
const active = this._active;
|
|
416
|
-
const matricesTexture = this._matricesTexture;
|
|
417
|
-
const matricesArray = this._matricesTexture.image.data;
|
|
418
|
-
|
|
419
|
-
// push new visibility states
|
|
420
|
-
visibility.push( true );
|
|
421
|
-
active.push( true );
|
|
422
|
-
|
|
423
469
|
// update id
|
|
424
470
|
const geometryId = this._geometryCount;
|
|
425
471
|
this._geometryCount ++;
|
|
426
472
|
|
|
427
|
-
// initialize matrix information
|
|
428
|
-
_identityMatrix.toArray( matricesArray, geometryId * 16 );
|
|
429
|
-
matricesTexture.needsUpdate = true;
|
|
430
|
-
|
|
431
473
|
// add the reserved range and draw range objects
|
|
432
474
|
reservedRanges.push( reservedRange );
|
|
433
475
|
drawRanges.push( {
|
|
@@ -442,16 +484,6 @@ class BatchedMesh extends Mesh {
|
|
|
442
484
|
sphere: new Sphere()
|
|
443
485
|
} );
|
|
444
486
|
|
|
445
|
-
// set the id for the geometry
|
|
446
|
-
const idAttribute = this.geometry.getAttribute( ID_ATTR_NAME );
|
|
447
|
-
for ( let i = 0; i < reservedRange.vertexCount; i ++ ) {
|
|
448
|
-
|
|
449
|
-
idAttribute.setX( reservedRange.vertexStart + i, geometryId );
|
|
450
|
-
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
idAttribute.needsUpdate = true;
|
|
454
|
-
|
|
455
487
|
// update the geometry
|
|
456
488
|
this.setGeometryAt( geometryId, geometry );
|
|
457
489
|
|
|
@@ -459,9 +491,9 @@ class BatchedMesh extends Mesh {
|
|
|
459
491
|
|
|
460
492
|
}
|
|
461
493
|
|
|
462
|
-
setGeometryAt(
|
|
494
|
+
setGeometryAt( geometryId, geometry ) {
|
|
463
495
|
|
|
464
|
-
if (
|
|
496
|
+
if ( geometryId >= this._geometryCount ) {
|
|
465
497
|
|
|
466
498
|
throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
|
|
467
499
|
|
|
@@ -473,7 +505,7 @@ class BatchedMesh extends Mesh {
|
|
|
473
505
|
const hasIndex = batchGeometry.getIndex() !== null;
|
|
474
506
|
const dstIndex = batchGeometry.getIndex();
|
|
475
507
|
const srcIndex = geometry.getIndex();
|
|
476
|
-
const reservedRange = this._reservedRanges[
|
|
508
|
+
const reservedRange = this._reservedRanges[ geometryId ];
|
|
477
509
|
if (
|
|
478
510
|
hasIndex &&
|
|
479
511
|
srcIndex.count > reservedRange.indexCount ||
|
|
@@ -489,12 +521,6 @@ class BatchedMesh extends Mesh {
|
|
|
489
521
|
const vertexCount = reservedRange.vertexCount;
|
|
490
522
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
491
523
|
|
|
492
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
493
|
-
|
|
494
|
-
continue;
|
|
495
|
-
|
|
496
|
-
}
|
|
497
|
-
|
|
498
524
|
// copy attribute data
|
|
499
525
|
const srcAttribute = geometry.getAttribute( attributeName );
|
|
500
526
|
const dstAttribute = batchGeometry.getAttribute( attributeName );
|
|
@@ -543,7 +569,7 @@ class BatchedMesh extends Mesh {
|
|
|
543
569
|
}
|
|
544
570
|
|
|
545
571
|
// store the bounding boxes
|
|
546
|
-
const bound = this._bounds[
|
|
572
|
+
const bound = this._bounds[ geometryId ];
|
|
547
573
|
if ( geometry.boundingBox !== null ) {
|
|
548
574
|
|
|
549
575
|
bound.box.copy( geometry.boundingBox );
|
|
@@ -567,67 +593,54 @@ class BatchedMesh extends Mesh {
|
|
|
567
593
|
}
|
|
568
594
|
|
|
569
595
|
// set drawRange count
|
|
570
|
-
const drawRange = this._drawRanges[
|
|
596
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
571
597
|
const posAttr = geometry.getAttribute( 'position' );
|
|
572
598
|
drawRange.count = hasIndex ? srcIndex.count : posAttr.count;
|
|
573
599
|
this._visibilityChanged = true;
|
|
574
600
|
|
|
575
|
-
return
|
|
601
|
+
return geometryId;
|
|
576
602
|
|
|
577
603
|
}
|
|
578
604
|
|
|
605
|
+
/*
|
|
579
606
|
deleteGeometry( geometryId ) {
|
|
580
607
|
|
|
581
|
-
//
|
|
582
|
-
|
|
583
|
-
const active = this._active;
|
|
584
|
-
if ( geometryId >= active.length || active[ geometryId ] === false ) {
|
|
585
|
-
|
|
586
|
-
return this;
|
|
587
|
-
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
active[ geometryId ] = false;
|
|
591
|
-
this._visibilityChanged = true;
|
|
592
|
-
|
|
593
|
-
return this;
|
|
608
|
+
// TODO: delete geometry and associated instances
|
|
594
609
|
|
|
595
610
|
}
|
|
611
|
+
*/
|
|
596
612
|
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
if ( this._multiDrawInstances === null ) return null;
|
|
613
|
+
/*
|
|
614
|
+
deleteInstance( instanceId ) {
|
|
600
615
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
setInstanceCountAt( id, instanceCount ) {
|
|
616
|
+
// Note: User needs to call optimize() afterward to pack the data.
|
|
606
617
|
|
|
607
|
-
|
|
618
|
+
const drawInfo = this._drawInfo;
|
|
619
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
608
620
|
|
|
609
|
-
|
|
621
|
+
return this;
|
|
610
622
|
|
|
611
623
|
}
|
|
612
624
|
|
|
613
|
-
|
|
625
|
+
drawInfo[ instanceId ].active = false;
|
|
626
|
+
this._visibilityChanged = true;
|
|
614
627
|
|
|
615
|
-
return
|
|
628
|
+
return this;
|
|
616
629
|
|
|
617
630
|
}
|
|
631
|
+
*/
|
|
618
632
|
|
|
619
633
|
// get bounding box and compute it if it doesn't exist
|
|
620
|
-
getBoundingBoxAt(
|
|
634
|
+
getBoundingBoxAt( geometryId, target ) {
|
|
621
635
|
|
|
622
|
-
|
|
623
|
-
if ( active[ id ] === false ) {
|
|
636
|
+
if ( geometryId >= this._geometryCount ) {
|
|
624
637
|
|
|
625
638
|
return null;
|
|
626
639
|
|
|
627
640
|
}
|
|
628
641
|
|
|
629
642
|
// compute bounding box
|
|
630
|
-
const bound = this._bounds[
|
|
643
|
+
const bound = this._bounds[ geometryId ];
|
|
631
644
|
const box = bound.box;
|
|
632
645
|
const geometry = this.geometry;
|
|
633
646
|
if ( bound.boxInitialized === false ) {
|
|
@@ -636,7 +649,7 @@ class BatchedMesh extends Mesh {
|
|
|
636
649
|
|
|
637
650
|
const index = geometry.index;
|
|
638
651
|
const position = geometry.attributes.position;
|
|
639
|
-
const drawRange = this._drawRanges[
|
|
652
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
640
653
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
641
654
|
|
|
642
655
|
let iv = i;
|
|
@@ -660,29 +673,28 @@ class BatchedMesh extends Mesh {
|
|
|
660
673
|
}
|
|
661
674
|
|
|
662
675
|
// get bounding sphere and compute it if it doesn't exist
|
|
663
|
-
getBoundingSphereAt(
|
|
676
|
+
getBoundingSphereAt( geometryId, target ) {
|
|
664
677
|
|
|
665
|
-
|
|
666
|
-
if ( active[ id ] === false ) {
|
|
678
|
+
if ( geometryId >= this._geometryCount ) {
|
|
667
679
|
|
|
668
680
|
return null;
|
|
669
681
|
|
|
670
682
|
}
|
|
671
683
|
|
|
672
684
|
// compute bounding sphere
|
|
673
|
-
const bound = this._bounds[
|
|
685
|
+
const bound = this._bounds[ geometryId ];
|
|
674
686
|
const sphere = bound.sphere;
|
|
675
687
|
const geometry = this.geometry;
|
|
676
688
|
if ( bound.sphereInitialized === false ) {
|
|
677
689
|
|
|
678
690
|
sphere.makeEmpty();
|
|
679
691
|
|
|
680
|
-
this.getBoundingBoxAt(
|
|
692
|
+
this.getBoundingBoxAt( geometryId, _box );
|
|
681
693
|
_box.getCenter( sphere.center );
|
|
682
694
|
|
|
683
695
|
const index = geometry.index;
|
|
684
696
|
const position = geometry.attributes.position;
|
|
685
|
-
const drawRange = this._drawRanges[
|
|
697
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
686
698
|
|
|
687
699
|
let maxRadiusSq = 0;
|
|
688
700
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
@@ -709,91 +721,122 @@ class BatchedMesh extends Mesh {
|
|
|
709
721
|
|
|
710
722
|
}
|
|
711
723
|
|
|
712
|
-
setMatrixAt(
|
|
724
|
+
setMatrixAt( instanceId, matrix ) {
|
|
713
725
|
|
|
714
726
|
// @TODO: Map geometryId to index of the arrays because
|
|
715
727
|
// optimize() can make geometryId mismatch the index
|
|
716
728
|
|
|
717
|
-
const
|
|
729
|
+
const drawInfo = this._drawInfo;
|
|
718
730
|
const matricesTexture = this._matricesTexture;
|
|
719
731
|
const matricesArray = this._matricesTexture.image.data;
|
|
720
|
-
|
|
721
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
732
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
722
733
|
|
|
723
734
|
return this;
|
|
724
735
|
|
|
725
736
|
}
|
|
726
737
|
|
|
727
|
-
matrix.toArray( matricesArray,
|
|
738
|
+
matrix.toArray( matricesArray, instanceId * 16 );
|
|
728
739
|
matricesTexture.needsUpdate = true;
|
|
729
740
|
|
|
730
741
|
return this;
|
|
731
742
|
|
|
732
743
|
}
|
|
733
744
|
|
|
734
|
-
getMatrixAt(
|
|
745
|
+
getMatrixAt( instanceId, matrix ) {
|
|
735
746
|
|
|
736
|
-
const
|
|
747
|
+
const drawInfo = this._drawInfo;
|
|
737
748
|
const matricesArray = this._matricesTexture.image.data;
|
|
738
|
-
|
|
739
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
749
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
740
750
|
|
|
741
751
|
return null;
|
|
742
752
|
|
|
743
753
|
}
|
|
744
754
|
|
|
745
|
-
return matrix.fromArray( matricesArray,
|
|
755
|
+
return matrix.fromArray( matricesArray, instanceId * 16 );
|
|
746
756
|
|
|
747
757
|
}
|
|
748
758
|
|
|
749
|
-
|
|
759
|
+
setColorAt( instanceId, color ) {
|
|
750
760
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
761
|
+
if ( this._colorsTexture === null ) {
|
|
762
|
+
|
|
763
|
+
this._initColorsTexture();
|
|
764
|
+
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// @TODO: Map id to index of the arrays because
|
|
768
|
+
// optimize() can make id mismatch the index
|
|
769
|
+
|
|
770
|
+
const colorsTexture = this._colorsTexture;
|
|
771
|
+
const colorsArray = this._colorsTexture.image.data;
|
|
772
|
+
const drawInfo = this._drawInfo;
|
|
773
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
774
|
+
|
|
775
|
+
return this;
|
|
776
|
+
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
color.toArray( colorsArray, instanceId * 4 );
|
|
780
|
+
colorsTexture.needsUpdate = true;
|
|
781
|
+
|
|
782
|
+
return this;
|
|
783
|
+
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
getColorAt( instanceId, color ) {
|
|
787
|
+
|
|
788
|
+
const colorsArray = this._colorsTexture.image.data;
|
|
789
|
+
const drawInfo = this._drawInfo;
|
|
790
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
791
|
+
|
|
792
|
+
return null;
|
|
793
|
+
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
return color.fromArray( colorsArray, instanceId * 4 );
|
|
797
|
+
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
setVisibleAt( instanceId, value ) {
|
|
754
801
|
|
|
755
802
|
// if the geometry is out of range, not active, or visibility state
|
|
756
803
|
// does not change then return early
|
|
804
|
+
const drawInfo = this._drawInfo;
|
|
757
805
|
if (
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
806
|
+
instanceId >= drawInfo.length ||
|
|
807
|
+
drawInfo[ instanceId ].active === false ||
|
|
808
|
+
drawInfo[ instanceId ].visible === value
|
|
761
809
|
) {
|
|
762
810
|
|
|
763
811
|
return this;
|
|
764
812
|
|
|
765
813
|
}
|
|
766
814
|
|
|
767
|
-
|
|
815
|
+
drawInfo[ instanceId ].visible = value;
|
|
768
816
|
this._visibilityChanged = true;
|
|
769
817
|
|
|
770
818
|
return this;
|
|
771
819
|
|
|
772
820
|
}
|
|
773
821
|
|
|
774
|
-
getVisibleAt(
|
|
775
|
-
|
|
776
|
-
const visibility = this._visibility;
|
|
777
|
-
const active = this._active;
|
|
778
|
-
const geometryCount = this._geometryCount;
|
|
822
|
+
getVisibleAt( instanceId ) {
|
|
779
823
|
|
|
780
824
|
// return early if the geometry is out of range or not active
|
|
781
|
-
|
|
825
|
+
const drawInfo = this._drawInfo;
|
|
826
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
782
827
|
|
|
783
828
|
return false;
|
|
784
829
|
|
|
785
830
|
}
|
|
786
831
|
|
|
787
|
-
return
|
|
832
|
+
return drawInfo[ instanceId ].visible;
|
|
788
833
|
|
|
789
834
|
}
|
|
790
835
|
|
|
791
836
|
raycast( raycaster, intersects ) {
|
|
792
837
|
|
|
793
|
-
const
|
|
794
|
-
const active = this._active;
|
|
838
|
+
const drawInfo = this._drawInfo;
|
|
795
839
|
const drawRanges = this._drawRanges;
|
|
796
|
-
const geometryCount = this._geometryCount;
|
|
797
840
|
const matrixWorld = this.matrixWorld;
|
|
798
841
|
const batchGeometry = this.geometry;
|
|
799
842
|
|
|
@@ -813,21 +856,22 @@ class BatchedMesh extends Mesh {
|
|
|
813
856
|
|
|
814
857
|
}
|
|
815
858
|
|
|
816
|
-
for ( let i = 0; i <
|
|
859
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
817
860
|
|
|
818
|
-
if ( !
|
|
861
|
+
if ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {
|
|
819
862
|
|
|
820
863
|
continue;
|
|
821
864
|
|
|
822
865
|
}
|
|
823
866
|
|
|
824
|
-
const
|
|
867
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
868
|
+
const drawRange = drawRanges[ geometryId ];
|
|
825
869
|
_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );
|
|
826
870
|
|
|
827
871
|
// ge the intersects
|
|
828
872
|
this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );
|
|
829
|
-
this.getBoundingBoxAt(
|
|
830
|
-
this.getBoundingSphereAt(
|
|
873
|
+
this.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );
|
|
874
|
+
this.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );
|
|
831
875
|
_mesh.raycast( raycaster, _batchIntersects );
|
|
832
876
|
|
|
833
877
|
// add batch id to the intersects
|
|
@@ -864,8 +908,7 @@ class BatchedMesh extends Mesh {
|
|
|
864
908
|
this._drawRanges = source._drawRanges.map( range => ( { ...range } ) );
|
|
865
909
|
this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );
|
|
866
910
|
|
|
867
|
-
this.
|
|
868
|
-
this._active = source._active.slice();
|
|
911
|
+
this._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );
|
|
869
912
|
this._bounds = source._bounds.map( bound => ( {
|
|
870
913
|
boxInitialized: bound.boxInitialized,
|
|
871
914
|
box: bound.box.clone(),
|
|
@@ -874,7 +917,7 @@ class BatchedMesh extends Mesh {
|
|
|
874
917
|
sphere: bound.sphere.clone()
|
|
875
918
|
} ) );
|
|
876
919
|
|
|
877
|
-
this.
|
|
920
|
+
this._maxInstanceCount = source._maxInstanceCount;
|
|
878
921
|
this._maxVertexCount = source._maxVertexCount;
|
|
879
922
|
this._maxIndexCount = source._maxIndexCount;
|
|
880
923
|
|
|
@@ -884,7 +927,14 @@ class BatchedMesh extends Mesh {
|
|
|
884
927
|
this._multiDrawStarts = source._multiDrawStarts.slice();
|
|
885
928
|
|
|
886
929
|
this._matricesTexture = source._matricesTexture.clone();
|
|
887
|
-
this._matricesTexture.image.data = this._matricesTexture.image.slice();
|
|
930
|
+
this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
|
|
931
|
+
|
|
932
|
+
if ( this._colorsTexture !== null ) {
|
|
933
|
+
|
|
934
|
+
this._colorsTexture = source._colorsTexture.clone();
|
|
935
|
+
this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
|
|
936
|
+
|
|
937
|
+
}
|
|
888
938
|
|
|
889
939
|
return this;
|
|
890
940
|
|
|
@@ -897,6 +947,17 @@ class BatchedMesh extends Mesh {
|
|
|
897
947
|
|
|
898
948
|
this._matricesTexture.dispose();
|
|
899
949
|
this._matricesTexture = null;
|
|
950
|
+
|
|
951
|
+
this._indirectTexture.dispose();
|
|
952
|
+
this._indirectTexture = null;
|
|
953
|
+
|
|
954
|
+
if ( this._colorsTexture !== null ) {
|
|
955
|
+
|
|
956
|
+
this._colorsTexture.dispose();
|
|
957
|
+
this._colorsTexture = null;
|
|
958
|
+
|
|
959
|
+
}
|
|
960
|
+
|
|
900
961
|
return this;
|
|
901
962
|
|
|
902
963
|
}
|
|
@@ -916,12 +977,13 @@ class BatchedMesh extends Mesh {
|
|
|
916
977
|
const index = geometry.getIndex();
|
|
917
978
|
const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
|
|
918
979
|
|
|
919
|
-
const
|
|
920
|
-
const visibility = this._visibility;
|
|
980
|
+
const drawInfo = this._drawInfo;
|
|
921
981
|
const multiDrawStarts = this._multiDrawStarts;
|
|
922
982
|
const multiDrawCounts = this._multiDrawCounts;
|
|
923
983
|
const drawRanges = this._drawRanges;
|
|
924
984
|
const perObjectFrustumCulled = this.perObjectFrustumCulled;
|
|
985
|
+
const indirectTexture = this._indirectTexture;
|
|
986
|
+
const indirectArray = indirectTexture.image.data;
|
|
925
987
|
|
|
926
988
|
// prepare the frustum in the local frame
|
|
927
989
|
if ( perObjectFrustumCulled ) {
|
|
@@ -942,14 +1004,17 @@ class BatchedMesh extends Mesh {
|
|
|
942
1004
|
// get the camera position in the local frame
|
|
943
1005
|
_invMatrixWorld.copy( this.matrixWorld ).invert();
|
|
944
1006
|
_vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );
|
|
1007
|
+
_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );
|
|
1008
|
+
|
|
1009
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
945
1010
|
|
|
946
|
-
|
|
1011
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
947
1012
|
|
|
948
|
-
|
|
1013
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
949
1014
|
|
|
950
1015
|
// get the bounds in world space
|
|
951
1016
|
this.getMatrixAt( i, _matrix );
|
|
952
|
-
this.getBoundingSphereAt(
|
|
1017
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
953
1018
|
|
|
954
1019
|
// determine whether the batched geometry is within the frustum
|
|
955
1020
|
let culled = false;
|
|
@@ -962,8 +1027,8 @@ class BatchedMesh extends Mesh {
|
|
|
962
1027
|
if ( ! culled ) {
|
|
963
1028
|
|
|
964
1029
|
// get the distance from camera used for sorting
|
|
965
|
-
const z =
|
|
966
|
-
_renderList.push( drawRanges[
|
|
1030
|
+
const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
|
|
1031
|
+
_renderList.push( drawRanges[ geometryId ], z, i );
|
|
967
1032
|
|
|
968
1033
|
}
|
|
969
1034
|
|
|
@@ -989,6 +1054,7 @@ class BatchedMesh extends Mesh {
|
|
|
989
1054
|
const item = list[ i ];
|
|
990
1055
|
multiDrawStarts[ count ] = item.start * bytesPerElement;
|
|
991
1056
|
multiDrawCounts[ count ] = item.count;
|
|
1057
|
+
indirectArray[ count ] = item.index;
|
|
992
1058
|
count ++;
|
|
993
1059
|
|
|
994
1060
|
}
|
|
@@ -997,9 +1063,11 @@ class BatchedMesh extends Mesh {
|
|
|
997
1063
|
|
|
998
1064
|
} else {
|
|
999
1065
|
|
|
1000
|
-
for ( let i = 0, l =
|
|
1066
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
1067
|
+
|
|
1068
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
1001
1069
|
|
|
1002
|
-
|
|
1070
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
1003
1071
|
|
|
1004
1072
|
// determine whether the batched geometry is within the frustum
|
|
1005
1073
|
let culled = false;
|
|
@@ -1007,16 +1075,17 @@ class BatchedMesh extends Mesh {
|
|
|
1007
1075
|
|
|
1008
1076
|
// get the bounds in world space
|
|
1009
1077
|
this.getMatrixAt( i, _matrix );
|
|
1010
|
-
this.getBoundingSphereAt(
|
|
1078
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
1011
1079
|
culled = ! _frustum.intersectsSphere( _sphere );
|
|
1012
1080
|
|
|
1013
1081
|
}
|
|
1014
1082
|
|
|
1015
1083
|
if ( ! culled ) {
|
|
1016
1084
|
|
|
1017
|
-
const range = drawRanges[
|
|
1085
|
+
const range = drawRanges[ geometryId ];
|
|
1018
1086
|
multiDrawStarts[ count ] = range.start * bytesPerElement;
|
|
1019
1087
|
multiDrawCounts[ count ] = range.count;
|
|
1088
|
+
indirectArray[ count ] = i;
|
|
1020
1089
|
count ++;
|
|
1021
1090
|
|
|
1022
1091
|
}
|
|
@@ -1027,6 +1096,7 @@ class BatchedMesh extends Mesh {
|
|
|
1027
1096
|
|
|
1028
1097
|
}
|
|
1029
1098
|
|
|
1099
|
+
indirectTexture.needsUpdate = true;
|
|
1030
1100
|
this._multiDrawCount = count;
|
|
1031
1101
|
this._visibilityChanged = false;
|
|
1032
1102
|
|