super-three 0.165.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/build/three.cjs +706 -383
- package/build/three.module.js +702 -384
- 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/csm/CSMShader.js +4 -4
- package/examples/jsm/exporters/GLTFExporter.js +7 -3
- package/examples/jsm/geometries/TeapotGeometry.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +51 -2
- package/examples/jsm/libs/tween.module.js +64 -75
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
- package/examples/jsm/lines/webgpu/Line2.js +20 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
- package/examples/jsm/loaders/FBXLoader.js +23 -45
- package/examples/jsm/loaders/GLTFLoader.js +10 -4
- 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/SimplifyModifier.js +2 -1
- package/examples/jsm/objects/InstancedPoints.js +2 -2
- 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/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/package.json +7 -6
- package/src/Three.WebGPU.js +194 -0
- package/src/Three.js +2 -0
- package/src/constants.js +4 -1
- package/src/core/Object3D.js +22 -22
- 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/ObjectLoader.js +33 -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 +30 -12
- package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
- package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
- 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 +22 -2
- package/{examples/jsm → src}/nodes/accessors/ModelNode.js +2 -1
- package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
- package/{examples/jsm → src}/nodes/accessors/NormalNode.js +1 -1
- package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
- package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +1 -1
- package/{examples/jsm → src}/nodes/accessors/ReflectVectorNode.js +4 -0
- package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
- package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +12 -3
- package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
- 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 +20 -6
- package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
- 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 +18 -12
- package/{examples/jsm → src}/nodes/core/NodeBuilder.js +175 -37
- 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/NodeUniform.js +1 -2
- package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
- package/{examples/jsm → src}/nodes/core/PropertyNode.js +1 -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/{examples/jsm → src}/nodes/core/VaryingNode.js +8 -0
- package/{examples/jsm → src}/nodes/display/AfterImageNode.js +19 -27
- 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 +2 -1
- 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 +42 -1
- package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +3 -1
- 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 +1 -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 +3 -3
- package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
- package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
- package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
- package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
- package/{examples/jsm → src}/nodes/materials/MeshMatcapNodeMaterial.js +6 -5
- 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 +5 -4
- package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
- package/{examples/jsm → src}/nodes/materials/MeshToonNodeMaterial.js +3 -3
- package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +85 -20
- 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/{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/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 +2 -0
- 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/MaxMipLevelNode.js +8 -2
- package/src/nodes/utils/RTTNode.js +130 -0
- package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
- package/src/objects/BatchedMesh.js +168 -188
- package/src/objects/InstancedMesh.js +1 -1
- package/src/renderers/WebGLRenderer.js +38 -25
- package/{examples/jsm → src}/renderers/common/Attributes.js +2 -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 +38 -23
- package/{examples/jsm → src}/renderers/common/ClippingContext.js +4 -2
- 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/src/renderers/common/PostProcessing.js +87 -0
- package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
- 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/RenderObject.js +44 -11
- package/{examples/jsm → src}/renderers/common/Renderer.js +84 -32
- 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 +9 -4
- 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 +6 -5
- package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +2 -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 +16 -1
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +1 -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/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/WebGLBufferRenderer.js +6 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
- package/src/renderers/webgl/WebGLLights.js +6 -0
- package/src/renderers/webgl/WebGLProgram.js +26 -0
- package/src/renderers/webgl/WebGLPrograms.js +1 -1
- package/src/renderers/webgl/WebGLTextures.js +14 -53
- 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 +178 -43
- 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 +34 -2
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
- package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +164 -76
- package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
- package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +194 -56
- 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 +20 -13
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +3 -1
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +28 -21
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +40 -23
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
- package/src/renderers/webxr/WebXRManager.js +6 -0
- package/src/textures/CompressedArrayTexture.js +1 -1
- package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
- package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
- package/examples/jsm/nodes/core/NodeCache.js +0 -26
- package/examples/jsm/nodes/display/PassNode.js +0 -201
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
- 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/BitangentNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/BufferNode.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/PositionNode.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/TangentNode.js +0 -0
- /package/{examples/jsm → src}/nodes/accessors/Texture3DNode.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/UVNode.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/ContextNode.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/NodeKeywords.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/OutputStructNode.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/Materials.js +0 -0
- /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
- /package/{examples/jsm → src}/nodes/materials/VolumeNodeMaterial.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/HashNode.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/ArrayElementNode.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/MatcapUVNode.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/TimerNode.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/ChainMap.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/Pipelines.js +0 -0
- /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
- /package/{examples/jsm → src}/renderers/common/RenderBundle.js +0 -0
- /package/{examples/jsm → src}/renderers/common/RenderBundles.js +0 -0
- /package/{examples/jsm → src}/renderers/common/RenderList.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,7 +1,7 @@
|
|
|
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';
|
|
@@ -34,7 +34,7 @@ class MultiDrawRenderList {
|
|
|
34
34
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
push( drawRange, z ) {
|
|
37
|
+
push( drawRange, z, index ) {
|
|
38
38
|
|
|
39
39
|
const pool = this.pool;
|
|
40
40
|
const list = this.list;
|
|
@@ -45,6 +45,7 @@ class MultiDrawRenderList {
|
|
|
45
45
|
start: - 1,
|
|
46
46
|
count: - 1,
|
|
47
47
|
z: - 1,
|
|
48
|
+
index: - 1,
|
|
48
49
|
|
|
49
50
|
} );
|
|
50
51
|
|
|
@@ -57,6 +58,7 @@ class MultiDrawRenderList {
|
|
|
57
58
|
item.start = drawRange.start;
|
|
58
59
|
item.count = drawRange.count;
|
|
59
60
|
item.z = z;
|
|
61
|
+
item.index = index;
|
|
60
62
|
|
|
61
63
|
}
|
|
62
64
|
|
|
@@ -69,7 +71,6 @@ class MultiDrawRenderList {
|
|
|
69
71
|
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
const ID_ATTR_NAME = 'batchId';
|
|
73
74
|
const _matrix = /*@__PURE__*/ new Matrix4();
|
|
74
75
|
const _invMatrixWorld = /*@__PURE__*/ new Matrix4();
|
|
75
76
|
const _identityMatrix = /*@__PURE__*/ new Matrix4();
|
|
@@ -124,13 +125,13 @@ function copyAttributeData( src, target, targetOffset = 0 ) {
|
|
|
124
125
|
|
|
125
126
|
class BatchedMesh extends Mesh {
|
|
126
127
|
|
|
127
|
-
get
|
|
128
|
+
get maxInstanceCount() {
|
|
128
129
|
|
|
129
|
-
return this.
|
|
130
|
+
return this._maxInstanceCount;
|
|
130
131
|
|
|
131
132
|
}
|
|
132
133
|
|
|
133
|
-
constructor(
|
|
134
|
+
constructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {
|
|
134
135
|
|
|
135
136
|
super( new BufferGeometry(), material );
|
|
136
137
|
|
|
@@ -141,32 +142,33 @@ class BatchedMesh extends Mesh {
|
|
|
141
142
|
this.boundingSphere = null;
|
|
142
143
|
this.customSort = null;
|
|
143
144
|
|
|
145
|
+
// stores visible, active, and geometry id per object
|
|
146
|
+
this._drawInfo = [];
|
|
147
|
+
|
|
148
|
+
// geometry information
|
|
144
149
|
this._drawRanges = [];
|
|
145
150
|
this._reservedRanges = [];
|
|
146
|
-
|
|
147
|
-
this._visibility = [];
|
|
148
|
-
this._active = [];
|
|
149
151
|
this._bounds = [];
|
|
150
152
|
|
|
151
|
-
this.
|
|
153
|
+
this._maxInstanceCount = maxInstanceCount;
|
|
152
154
|
this._maxVertexCount = maxVertexCount;
|
|
153
155
|
this._maxIndexCount = maxIndexCount;
|
|
154
156
|
|
|
155
157
|
this._geometryInitialized = false;
|
|
156
158
|
this._geometryCount = 0;
|
|
157
|
-
this._multiDrawCounts = new Int32Array(
|
|
158
|
-
this._multiDrawStarts = new Int32Array(
|
|
159
|
+
this._multiDrawCounts = new Int32Array( maxInstanceCount );
|
|
160
|
+
this._multiDrawStarts = new Int32Array( maxInstanceCount );
|
|
159
161
|
this._multiDrawCount = 0;
|
|
160
162
|
this._multiDrawInstances = null;
|
|
161
163
|
this._visibilityChanged = true;
|
|
162
164
|
|
|
163
165
|
// Local matrix per geometry by using data texture
|
|
164
166
|
this._matricesTexture = null;
|
|
167
|
+
this._indirectTexture = null;
|
|
168
|
+
this._colorsTexture = null;
|
|
165
169
|
|
|
166
170
|
this._initMatricesTexture();
|
|
167
|
-
|
|
168
|
-
// Local color per geometry by using data texture
|
|
169
|
-
this._colorsTexture = null;
|
|
171
|
+
this._initIndirectTexture();
|
|
170
172
|
|
|
171
173
|
}
|
|
172
174
|
|
|
@@ -179,7 +181,7 @@ class BatchedMesh extends Mesh {
|
|
|
179
181
|
// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)
|
|
180
182
|
// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)
|
|
181
183
|
|
|
182
|
-
let size = Math.sqrt( this.
|
|
184
|
+
let size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix
|
|
183
185
|
size = Math.ceil( size / 4 ) * 4;
|
|
184
186
|
size = Math.max( size, 4 );
|
|
185
187
|
|
|
@@ -190,9 +192,21 @@ class BatchedMesh extends Mesh {
|
|
|
190
192
|
|
|
191
193
|
}
|
|
192
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
|
+
|
|
193
207
|
_initColorsTexture() {
|
|
194
208
|
|
|
195
|
-
let size = Math.sqrt( this.
|
|
209
|
+
let size = Math.sqrt( this._maxIndexCount );
|
|
196
210
|
size = Math.ceil( size );
|
|
197
211
|
|
|
198
212
|
// 4 floats per RGBA pixel initialized to white
|
|
@@ -208,7 +222,6 @@ class BatchedMesh extends Mesh {
|
|
|
208
222
|
|
|
209
223
|
const geometry = this.geometry;
|
|
210
224
|
const maxVertexCount = this._maxVertexCount;
|
|
211
|
-
const maxGeometryCount = this._maxGeometryCount;
|
|
212
225
|
const maxIndexCount = this._maxIndexCount;
|
|
213
226
|
if ( this._geometryInitialized === false ) {
|
|
214
227
|
|
|
@@ -226,7 +239,8 @@ class BatchedMesh extends Mesh {
|
|
|
226
239
|
|
|
227
240
|
if ( reference.getIndex() !== null ) {
|
|
228
241
|
|
|
229
|
-
|
|
242
|
+
// Reserve last u16 index for primitive restart.
|
|
243
|
+
const indexArray = maxVertexCount > 65535
|
|
230
244
|
? new Uint32Array( maxIndexCount )
|
|
231
245
|
: new Uint16Array( maxIndexCount );
|
|
232
246
|
|
|
@@ -234,11 +248,6 @@ class BatchedMesh extends Mesh {
|
|
|
234
248
|
|
|
235
249
|
}
|
|
236
250
|
|
|
237
|
-
const idArray = maxGeometryCount > 65536
|
|
238
|
-
? new Uint32Array( maxVertexCount )
|
|
239
|
-
: new Uint16Array( maxVertexCount );
|
|
240
|
-
geometry.setAttribute( ID_ATTR_NAME, new BufferAttribute( idArray, 1 ) );
|
|
241
|
-
|
|
242
251
|
this._geometryInitialized = true;
|
|
243
252
|
|
|
244
253
|
}
|
|
@@ -248,13 +257,6 @@ class BatchedMesh extends Mesh {
|
|
|
248
257
|
// Make sure the geometry is compatible with the existing combined geometry attributes
|
|
249
258
|
_validateGeometry( geometry ) {
|
|
250
259
|
|
|
251
|
-
// check that the geometry doesn't have a version of our reserved id attribute
|
|
252
|
-
if ( geometry.getAttribute( ID_ATTR_NAME ) ) {
|
|
253
|
-
|
|
254
|
-
throw new Error( `BatchedMesh: Geometry cannot use attribute "${ ID_ATTR_NAME }"` );
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
|
|
258
260
|
// check to ensure the geometries are using consistent attributes and indices
|
|
259
261
|
const batchGeometry = this.geometry;
|
|
260
262
|
if ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {
|
|
@@ -265,12 +267,6 @@ class BatchedMesh extends Mesh {
|
|
|
265
267
|
|
|
266
268
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
267
269
|
|
|
268
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
269
|
-
|
|
270
|
-
continue;
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
270
|
if ( ! geometry.hasAttribute( attributeName ) ) {
|
|
275
271
|
|
|
276
272
|
throw new Error( `BatchedMesh: Added geometry missing "${ attributeName }". All geometries must have consistent attributes.` );
|
|
@@ -306,15 +302,16 @@ class BatchedMesh extends Mesh {
|
|
|
306
302
|
|
|
307
303
|
const geometryCount = this._geometryCount;
|
|
308
304
|
const boundingBox = this.boundingBox;
|
|
309
|
-
const
|
|
305
|
+
const drawInfo = this._drawInfo;
|
|
310
306
|
|
|
311
307
|
boundingBox.makeEmpty();
|
|
312
308
|
for ( let i = 0; i < geometryCount; i ++ ) {
|
|
313
309
|
|
|
314
|
-
if (
|
|
310
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
315
311
|
|
|
312
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
316
313
|
this.getMatrixAt( i, _matrix );
|
|
317
|
-
this.getBoundingBoxAt(
|
|
314
|
+
this.getBoundingBoxAt( geometryId, _box ).applyMatrix4( _matrix );
|
|
318
315
|
boundingBox.union( _box );
|
|
319
316
|
|
|
320
317
|
}
|
|
@@ -329,23 +326,59 @@ class BatchedMesh extends Mesh {
|
|
|
329
326
|
|
|
330
327
|
}
|
|
331
328
|
|
|
332
|
-
const geometryCount = this._geometryCount;
|
|
333
329
|
const boundingSphere = this.boundingSphere;
|
|
334
|
-
const
|
|
330
|
+
const drawInfo = this._drawInfo;
|
|
335
331
|
|
|
336
332
|
boundingSphere.makeEmpty();
|
|
337
|
-
for ( let i = 0; i <
|
|
333
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
338
334
|
|
|
339
|
-
if (
|
|
335
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
340
336
|
|
|
337
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
341
338
|
this.getMatrixAt( i, _matrix );
|
|
342
|
-
this.getBoundingSphereAt(
|
|
339
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
343
340
|
boundingSphere.union( _sphere );
|
|
344
341
|
|
|
345
342
|
}
|
|
346
343
|
|
|
347
344
|
}
|
|
348
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
|
+
|
|
349
382
|
addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {
|
|
350
383
|
|
|
351
384
|
this._initializeGeometry( geometry );
|
|
@@ -353,9 +386,9 @@ class BatchedMesh extends Mesh {
|
|
|
353
386
|
this._validateGeometry( geometry );
|
|
354
387
|
|
|
355
388
|
// ensure we're not over geometry
|
|
356
|
-
if ( this.
|
|
389
|
+
if ( this._drawInfo.length >= this._maxInstanceCount ) {
|
|
357
390
|
|
|
358
|
-
throw new Error( 'BatchedMesh: Maximum
|
|
391
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
359
392
|
|
|
360
393
|
}
|
|
361
394
|
|
|
@@ -433,32 +466,10 @@ class BatchedMesh extends Mesh {
|
|
|
433
466
|
|
|
434
467
|
}
|
|
435
468
|
|
|
436
|
-
const visibility = this._visibility;
|
|
437
|
-
const active = this._active;
|
|
438
|
-
const matricesTexture = this._matricesTexture;
|
|
439
|
-
const matricesArray = this._matricesTexture.image.data;
|
|
440
|
-
const colorsTexture = this._colorsTexture;
|
|
441
|
-
|
|
442
|
-
// push new visibility states
|
|
443
|
-
visibility.push( true );
|
|
444
|
-
active.push( true );
|
|
445
|
-
|
|
446
469
|
// update id
|
|
447
470
|
const geometryId = this._geometryCount;
|
|
448
471
|
this._geometryCount ++;
|
|
449
472
|
|
|
450
|
-
// initialize matrix information
|
|
451
|
-
_identityMatrix.toArray( matricesArray, geometryId * 16 );
|
|
452
|
-
matricesTexture.needsUpdate = true;
|
|
453
|
-
|
|
454
|
-
// initialize the color to white
|
|
455
|
-
if ( colorsTexture !== null ) {
|
|
456
|
-
|
|
457
|
-
_whiteColor.toArray( colorsTexture.image.data, geometryId * 4 );
|
|
458
|
-
colorsTexture.needsUpdate = true;
|
|
459
|
-
|
|
460
|
-
}
|
|
461
|
-
|
|
462
473
|
// add the reserved range and draw range objects
|
|
463
474
|
reservedRanges.push( reservedRange );
|
|
464
475
|
drawRanges.push( {
|
|
@@ -473,16 +484,6 @@ class BatchedMesh extends Mesh {
|
|
|
473
484
|
sphere: new Sphere()
|
|
474
485
|
} );
|
|
475
486
|
|
|
476
|
-
// set the id for the geometry
|
|
477
|
-
const idAttribute = this.geometry.getAttribute( ID_ATTR_NAME );
|
|
478
|
-
for ( let i = 0; i < reservedRange.vertexCount; i ++ ) {
|
|
479
|
-
|
|
480
|
-
idAttribute.setX( reservedRange.vertexStart + i, geometryId );
|
|
481
|
-
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
idAttribute.needsUpdate = true;
|
|
485
|
-
|
|
486
487
|
// update the geometry
|
|
487
488
|
this.setGeometryAt( geometryId, geometry );
|
|
488
489
|
|
|
@@ -490,9 +491,9 @@ class BatchedMesh extends Mesh {
|
|
|
490
491
|
|
|
491
492
|
}
|
|
492
493
|
|
|
493
|
-
setGeometryAt(
|
|
494
|
+
setGeometryAt( geometryId, geometry ) {
|
|
494
495
|
|
|
495
|
-
if (
|
|
496
|
+
if ( geometryId >= this._geometryCount ) {
|
|
496
497
|
|
|
497
498
|
throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
|
|
498
499
|
|
|
@@ -504,7 +505,7 @@ class BatchedMesh extends Mesh {
|
|
|
504
505
|
const hasIndex = batchGeometry.getIndex() !== null;
|
|
505
506
|
const dstIndex = batchGeometry.getIndex();
|
|
506
507
|
const srcIndex = geometry.getIndex();
|
|
507
|
-
const reservedRange = this._reservedRanges[
|
|
508
|
+
const reservedRange = this._reservedRanges[ geometryId ];
|
|
508
509
|
if (
|
|
509
510
|
hasIndex &&
|
|
510
511
|
srcIndex.count > reservedRange.indexCount ||
|
|
@@ -520,12 +521,6 @@ class BatchedMesh extends Mesh {
|
|
|
520
521
|
const vertexCount = reservedRange.vertexCount;
|
|
521
522
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
522
523
|
|
|
523
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
524
|
-
|
|
525
|
-
continue;
|
|
526
|
-
|
|
527
|
-
}
|
|
528
|
-
|
|
529
524
|
// copy attribute data
|
|
530
525
|
const srcAttribute = geometry.getAttribute( attributeName );
|
|
531
526
|
const dstAttribute = batchGeometry.getAttribute( attributeName );
|
|
@@ -574,7 +569,7 @@ class BatchedMesh extends Mesh {
|
|
|
574
569
|
}
|
|
575
570
|
|
|
576
571
|
// store the bounding boxes
|
|
577
|
-
const bound = this._bounds[
|
|
572
|
+
const bound = this._bounds[ geometryId ];
|
|
578
573
|
if ( geometry.boundingBox !== null ) {
|
|
579
574
|
|
|
580
575
|
bound.box.copy( geometry.boundingBox );
|
|
@@ -598,67 +593,54 @@ class BatchedMesh extends Mesh {
|
|
|
598
593
|
}
|
|
599
594
|
|
|
600
595
|
// set drawRange count
|
|
601
|
-
const drawRange = this._drawRanges[
|
|
596
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
602
597
|
const posAttr = geometry.getAttribute( 'position' );
|
|
603
598
|
drawRange.count = hasIndex ? srcIndex.count : posAttr.count;
|
|
604
599
|
this._visibilityChanged = true;
|
|
605
600
|
|
|
606
|
-
return
|
|
601
|
+
return geometryId;
|
|
607
602
|
|
|
608
603
|
}
|
|
609
604
|
|
|
605
|
+
/*
|
|
610
606
|
deleteGeometry( geometryId ) {
|
|
611
607
|
|
|
612
|
-
//
|
|
613
|
-
|
|
614
|
-
const active = this._active;
|
|
615
|
-
if ( geometryId >= active.length || active[ geometryId ] === false ) {
|
|
616
|
-
|
|
617
|
-
return this;
|
|
618
|
-
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
active[ geometryId ] = false;
|
|
622
|
-
this._visibilityChanged = true;
|
|
623
|
-
|
|
624
|
-
return this;
|
|
608
|
+
// TODO: delete geometry and associated instances
|
|
625
609
|
|
|
626
610
|
}
|
|
611
|
+
*/
|
|
627
612
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
if ( this._multiDrawInstances === null ) return null;
|
|
631
|
-
|
|
632
|
-
return this._multiDrawInstances[ id ];
|
|
613
|
+
/*
|
|
614
|
+
deleteInstance( instanceId ) {
|
|
633
615
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
setInstanceCountAt( id, instanceCount ) {
|
|
616
|
+
// Note: User needs to call optimize() afterward to pack the data.
|
|
637
617
|
|
|
638
|
-
|
|
618
|
+
const drawInfo = this._drawInfo;
|
|
619
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
639
620
|
|
|
640
|
-
|
|
621
|
+
return this;
|
|
641
622
|
|
|
642
623
|
}
|
|
643
624
|
|
|
644
|
-
|
|
625
|
+
drawInfo[ instanceId ].active = false;
|
|
626
|
+
this._visibilityChanged = true;
|
|
645
627
|
|
|
646
|
-
return
|
|
628
|
+
return this;
|
|
647
629
|
|
|
648
630
|
}
|
|
631
|
+
*/
|
|
649
632
|
|
|
650
633
|
// get bounding box and compute it if it doesn't exist
|
|
651
|
-
getBoundingBoxAt(
|
|
634
|
+
getBoundingBoxAt( geometryId, target ) {
|
|
652
635
|
|
|
653
|
-
|
|
654
|
-
if ( active[ id ] === false ) {
|
|
636
|
+
if ( geometryId >= this._geometryCount ) {
|
|
655
637
|
|
|
656
638
|
return null;
|
|
657
639
|
|
|
658
640
|
}
|
|
659
641
|
|
|
660
642
|
// compute bounding box
|
|
661
|
-
const bound = this._bounds[
|
|
643
|
+
const bound = this._bounds[ geometryId ];
|
|
662
644
|
const box = bound.box;
|
|
663
645
|
const geometry = this.geometry;
|
|
664
646
|
if ( bound.boxInitialized === false ) {
|
|
@@ -667,7 +649,7 @@ class BatchedMesh extends Mesh {
|
|
|
667
649
|
|
|
668
650
|
const index = geometry.index;
|
|
669
651
|
const position = geometry.attributes.position;
|
|
670
|
-
const drawRange = this._drawRanges[
|
|
652
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
671
653
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
672
654
|
|
|
673
655
|
let iv = i;
|
|
@@ -691,29 +673,28 @@ class BatchedMesh extends Mesh {
|
|
|
691
673
|
}
|
|
692
674
|
|
|
693
675
|
// get bounding sphere and compute it if it doesn't exist
|
|
694
|
-
getBoundingSphereAt(
|
|
676
|
+
getBoundingSphereAt( geometryId, target ) {
|
|
695
677
|
|
|
696
|
-
|
|
697
|
-
if ( active[ id ] === false ) {
|
|
678
|
+
if ( geometryId >= this._geometryCount ) {
|
|
698
679
|
|
|
699
680
|
return null;
|
|
700
681
|
|
|
701
682
|
}
|
|
702
683
|
|
|
703
684
|
// compute bounding sphere
|
|
704
|
-
const bound = this._bounds[
|
|
685
|
+
const bound = this._bounds[ geometryId ];
|
|
705
686
|
const sphere = bound.sphere;
|
|
706
687
|
const geometry = this.geometry;
|
|
707
688
|
if ( bound.sphereInitialized === false ) {
|
|
708
689
|
|
|
709
690
|
sphere.makeEmpty();
|
|
710
691
|
|
|
711
|
-
this.getBoundingBoxAt(
|
|
692
|
+
this.getBoundingBoxAt( geometryId, _box );
|
|
712
693
|
_box.getCenter( sphere.center );
|
|
713
694
|
|
|
714
695
|
const index = geometry.index;
|
|
715
696
|
const position = geometry.attributes.position;
|
|
716
|
-
const drawRange = this._drawRanges[
|
|
697
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
717
698
|
|
|
718
699
|
let maxRadiusSq = 0;
|
|
719
700
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
@@ -740,44 +721,42 @@ class BatchedMesh extends Mesh {
|
|
|
740
721
|
|
|
741
722
|
}
|
|
742
723
|
|
|
743
|
-
setMatrixAt(
|
|
724
|
+
setMatrixAt( instanceId, matrix ) {
|
|
744
725
|
|
|
745
726
|
// @TODO: Map geometryId to index of the arrays because
|
|
746
727
|
// optimize() can make geometryId mismatch the index
|
|
747
728
|
|
|
748
|
-
const
|
|
729
|
+
const drawInfo = this._drawInfo;
|
|
749
730
|
const matricesTexture = this._matricesTexture;
|
|
750
731
|
const matricesArray = this._matricesTexture.image.data;
|
|
751
|
-
|
|
752
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
732
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
753
733
|
|
|
754
734
|
return this;
|
|
755
735
|
|
|
756
736
|
}
|
|
757
737
|
|
|
758
|
-
matrix.toArray( matricesArray,
|
|
738
|
+
matrix.toArray( matricesArray, instanceId * 16 );
|
|
759
739
|
matricesTexture.needsUpdate = true;
|
|
760
740
|
|
|
761
741
|
return this;
|
|
762
742
|
|
|
763
743
|
}
|
|
764
744
|
|
|
765
|
-
getMatrixAt(
|
|
745
|
+
getMatrixAt( instanceId, matrix ) {
|
|
766
746
|
|
|
767
|
-
const
|
|
747
|
+
const drawInfo = this._drawInfo;
|
|
768
748
|
const matricesArray = this._matricesTexture.image.data;
|
|
769
|
-
|
|
770
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
749
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
771
750
|
|
|
772
751
|
return null;
|
|
773
752
|
|
|
774
753
|
}
|
|
775
754
|
|
|
776
|
-
return matrix.fromArray( matricesArray,
|
|
755
|
+
return matrix.fromArray( matricesArray, instanceId * 16 );
|
|
777
756
|
|
|
778
757
|
}
|
|
779
758
|
|
|
780
|
-
setColorAt(
|
|
759
|
+
setColorAt( instanceId, color ) {
|
|
781
760
|
|
|
782
761
|
if ( this._colorsTexture === null ) {
|
|
783
762
|
|
|
@@ -785,89 +764,79 @@ class BatchedMesh extends Mesh {
|
|
|
785
764
|
|
|
786
765
|
}
|
|
787
766
|
|
|
788
|
-
// @TODO: Map
|
|
789
|
-
// optimize() can make
|
|
767
|
+
// @TODO: Map id to index of the arrays because
|
|
768
|
+
// optimize() can make id mismatch the index
|
|
790
769
|
|
|
791
|
-
const active = this._active;
|
|
792
770
|
const colorsTexture = this._colorsTexture;
|
|
793
771
|
const colorsArray = this._colorsTexture.image.data;
|
|
794
|
-
const
|
|
795
|
-
if (
|
|
772
|
+
const drawInfo = this._drawInfo;
|
|
773
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
796
774
|
|
|
797
775
|
return this;
|
|
798
776
|
|
|
799
777
|
}
|
|
800
778
|
|
|
801
|
-
color.toArray( colorsArray,
|
|
779
|
+
color.toArray( colorsArray, instanceId * 4 );
|
|
802
780
|
colorsTexture.needsUpdate = true;
|
|
803
781
|
|
|
804
782
|
return this;
|
|
805
783
|
|
|
806
784
|
}
|
|
807
785
|
|
|
808
|
-
getColorAt(
|
|
786
|
+
getColorAt( instanceId, color ) {
|
|
809
787
|
|
|
810
|
-
const active = this._active;
|
|
811
788
|
const colorsArray = this._colorsTexture.image.data;
|
|
812
|
-
const
|
|
813
|
-
if (
|
|
789
|
+
const drawInfo = this._drawInfo;
|
|
790
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
814
791
|
|
|
815
792
|
return null;
|
|
816
793
|
|
|
817
794
|
}
|
|
818
795
|
|
|
819
|
-
return color.fromArray( colorsArray,
|
|
796
|
+
return color.fromArray( colorsArray, instanceId * 4 );
|
|
820
797
|
|
|
821
798
|
}
|
|
822
799
|
|
|
823
|
-
setVisibleAt(
|
|
824
|
-
|
|
825
|
-
const visibility = this._visibility;
|
|
826
|
-
const active = this._active;
|
|
827
|
-
const geometryCount = this._geometryCount;
|
|
800
|
+
setVisibleAt( instanceId, value ) {
|
|
828
801
|
|
|
829
802
|
// if the geometry is out of range, not active, or visibility state
|
|
830
803
|
// does not change then return early
|
|
804
|
+
const drawInfo = this._drawInfo;
|
|
831
805
|
if (
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
806
|
+
instanceId >= drawInfo.length ||
|
|
807
|
+
drawInfo[ instanceId ].active === false ||
|
|
808
|
+
drawInfo[ instanceId ].visible === value
|
|
835
809
|
) {
|
|
836
810
|
|
|
837
811
|
return this;
|
|
838
812
|
|
|
839
813
|
}
|
|
840
814
|
|
|
841
|
-
|
|
815
|
+
drawInfo[ instanceId ].visible = value;
|
|
842
816
|
this._visibilityChanged = true;
|
|
843
817
|
|
|
844
818
|
return this;
|
|
845
819
|
|
|
846
820
|
}
|
|
847
821
|
|
|
848
|
-
getVisibleAt(
|
|
849
|
-
|
|
850
|
-
const visibility = this._visibility;
|
|
851
|
-
const active = this._active;
|
|
852
|
-
const geometryCount = this._geometryCount;
|
|
822
|
+
getVisibleAt( instanceId ) {
|
|
853
823
|
|
|
854
824
|
// return early if the geometry is out of range or not active
|
|
855
|
-
|
|
825
|
+
const drawInfo = this._drawInfo;
|
|
826
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
856
827
|
|
|
857
828
|
return false;
|
|
858
829
|
|
|
859
830
|
}
|
|
860
831
|
|
|
861
|
-
return
|
|
832
|
+
return drawInfo[ instanceId ].visible;
|
|
862
833
|
|
|
863
834
|
}
|
|
864
835
|
|
|
865
836
|
raycast( raycaster, intersects ) {
|
|
866
837
|
|
|
867
|
-
const
|
|
868
|
-
const active = this._active;
|
|
838
|
+
const drawInfo = this._drawInfo;
|
|
869
839
|
const drawRanges = this._drawRanges;
|
|
870
|
-
const geometryCount = this._geometryCount;
|
|
871
840
|
const matrixWorld = this.matrixWorld;
|
|
872
841
|
const batchGeometry = this.geometry;
|
|
873
842
|
|
|
@@ -887,21 +856,22 @@ class BatchedMesh extends Mesh {
|
|
|
887
856
|
|
|
888
857
|
}
|
|
889
858
|
|
|
890
|
-
for ( let i = 0; i <
|
|
859
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
891
860
|
|
|
892
|
-
if ( !
|
|
861
|
+
if ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {
|
|
893
862
|
|
|
894
863
|
continue;
|
|
895
864
|
|
|
896
865
|
}
|
|
897
866
|
|
|
898
|
-
const
|
|
867
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
868
|
+
const drawRange = drawRanges[ geometryId ];
|
|
899
869
|
_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );
|
|
900
870
|
|
|
901
871
|
// ge the intersects
|
|
902
872
|
this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );
|
|
903
|
-
this.getBoundingBoxAt(
|
|
904
|
-
this.getBoundingSphereAt(
|
|
873
|
+
this.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );
|
|
874
|
+
this.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );
|
|
905
875
|
_mesh.raycast( raycaster, _batchIntersects );
|
|
906
876
|
|
|
907
877
|
// add batch id to the intersects
|
|
@@ -938,8 +908,7 @@ class BatchedMesh extends Mesh {
|
|
|
938
908
|
this._drawRanges = source._drawRanges.map( range => ( { ...range } ) );
|
|
939
909
|
this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );
|
|
940
910
|
|
|
941
|
-
this.
|
|
942
|
-
this._active = source._active.slice();
|
|
911
|
+
this._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );
|
|
943
912
|
this._bounds = source._bounds.map( bound => ( {
|
|
944
913
|
boxInitialized: bound.boxInitialized,
|
|
945
914
|
box: bound.box.clone(),
|
|
@@ -948,7 +917,7 @@ class BatchedMesh extends Mesh {
|
|
|
948
917
|
sphere: bound.sphere.clone()
|
|
949
918
|
} ) );
|
|
950
919
|
|
|
951
|
-
this.
|
|
920
|
+
this._maxInstanceCount = source._maxInstanceCount;
|
|
952
921
|
this._maxVertexCount = source._maxVertexCount;
|
|
953
922
|
this._maxIndexCount = source._maxIndexCount;
|
|
954
923
|
|
|
@@ -958,12 +927,12 @@ class BatchedMesh extends Mesh {
|
|
|
958
927
|
this._multiDrawStarts = source._multiDrawStarts.slice();
|
|
959
928
|
|
|
960
929
|
this._matricesTexture = source._matricesTexture.clone();
|
|
961
|
-
this._matricesTexture.image.data = this._matricesTexture.image.slice();
|
|
930
|
+
this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
|
|
962
931
|
|
|
963
932
|
if ( this._colorsTexture !== null ) {
|
|
964
933
|
|
|
965
934
|
this._colorsTexture = source._colorsTexture.clone();
|
|
966
|
-
this._colorsTexture.image.data = this._colorsTexture.image.slice();
|
|
935
|
+
this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
|
|
967
936
|
|
|
968
937
|
}
|
|
969
938
|
|
|
@@ -979,6 +948,9 @@ class BatchedMesh extends Mesh {
|
|
|
979
948
|
this._matricesTexture.dispose();
|
|
980
949
|
this._matricesTexture = null;
|
|
981
950
|
|
|
951
|
+
this._indirectTexture.dispose();
|
|
952
|
+
this._indirectTexture = null;
|
|
953
|
+
|
|
982
954
|
if ( this._colorsTexture !== null ) {
|
|
983
955
|
|
|
984
956
|
this._colorsTexture.dispose();
|
|
@@ -1005,12 +977,13 @@ class BatchedMesh extends Mesh {
|
|
|
1005
977
|
const index = geometry.getIndex();
|
|
1006
978
|
const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
|
|
1007
979
|
|
|
1008
|
-
const
|
|
1009
|
-
const visibility = this._visibility;
|
|
980
|
+
const drawInfo = this._drawInfo;
|
|
1010
981
|
const multiDrawStarts = this._multiDrawStarts;
|
|
1011
982
|
const multiDrawCounts = this._multiDrawCounts;
|
|
1012
983
|
const drawRanges = this._drawRanges;
|
|
1013
984
|
const perObjectFrustumCulled = this.perObjectFrustumCulled;
|
|
985
|
+
const indirectTexture = this._indirectTexture;
|
|
986
|
+
const indirectArray = indirectTexture.image.data;
|
|
1014
987
|
|
|
1015
988
|
// prepare the frustum in the local frame
|
|
1016
989
|
if ( perObjectFrustumCulled ) {
|
|
@@ -1033,13 +1006,15 @@ class BatchedMesh extends Mesh {
|
|
|
1033
1006
|
_vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );
|
|
1034
1007
|
_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );
|
|
1035
1008
|
|
|
1036
|
-
for ( let i = 0, l =
|
|
1009
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
1010
|
+
|
|
1011
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
1037
1012
|
|
|
1038
|
-
|
|
1013
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
1039
1014
|
|
|
1040
1015
|
// get the bounds in world space
|
|
1041
1016
|
this.getMatrixAt( i, _matrix );
|
|
1042
|
-
this.getBoundingSphereAt(
|
|
1017
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
1043
1018
|
|
|
1044
1019
|
// determine whether the batched geometry is within the frustum
|
|
1045
1020
|
let culled = false;
|
|
@@ -1053,7 +1028,7 @@ class BatchedMesh extends Mesh {
|
|
|
1053
1028
|
|
|
1054
1029
|
// get the distance from camera used for sorting
|
|
1055
1030
|
const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
|
|
1056
|
-
_renderList.push( drawRanges[
|
|
1031
|
+
_renderList.push( drawRanges[ geometryId ], z, i );
|
|
1057
1032
|
|
|
1058
1033
|
}
|
|
1059
1034
|
|
|
@@ -1079,6 +1054,7 @@ class BatchedMesh extends Mesh {
|
|
|
1079
1054
|
const item = list[ i ];
|
|
1080
1055
|
multiDrawStarts[ count ] = item.start * bytesPerElement;
|
|
1081
1056
|
multiDrawCounts[ count ] = item.count;
|
|
1057
|
+
indirectArray[ count ] = item.index;
|
|
1082
1058
|
count ++;
|
|
1083
1059
|
|
|
1084
1060
|
}
|
|
@@ -1087,9 +1063,11 @@ class BatchedMesh extends Mesh {
|
|
|
1087
1063
|
|
|
1088
1064
|
} else {
|
|
1089
1065
|
|
|
1090
|
-
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 ) {
|
|
1091
1069
|
|
|
1092
|
-
|
|
1070
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
1093
1071
|
|
|
1094
1072
|
// determine whether the batched geometry is within the frustum
|
|
1095
1073
|
let culled = false;
|
|
@@ -1097,16 +1075,17 @@ class BatchedMesh extends Mesh {
|
|
|
1097
1075
|
|
|
1098
1076
|
// get the bounds in world space
|
|
1099
1077
|
this.getMatrixAt( i, _matrix );
|
|
1100
|
-
this.getBoundingSphereAt(
|
|
1078
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
1101
1079
|
culled = ! _frustum.intersectsSphere( _sphere );
|
|
1102
1080
|
|
|
1103
1081
|
}
|
|
1104
1082
|
|
|
1105
1083
|
if ( ! culled ) {
|
|
1106
1084
|
|
|
1107
|
-
const range = drawRanges[
|
|
1085
|
+
const range = drawRanges[ geometryId ];
|
|
1108
1086
|
multiDrawStarts[ count ] = range.start * bytesPerElement;
|
|
1109
1087
|
multiDrawCounts[ count ] = range.count;
|
|
1088
|
+
indirectArray[ count ] = i;
|
|
1110
1089
|
count ++;
|
|
1111
1090
|
|
|
1112
1091
|
}
|
|
@@ -1117,6 +1096,7 @@ class BatchedMesh extends Mesh {
|
|
|
1117
1096
|
|
|
1118
1097
|
}
|
|
1119
1098
|
|
|
1099
|
+
indirectTexture.needsUpdate = true;
|
|
1120
1100
|
this._multiDrawCount = count;
|
|
1121
1101
|
this._visibilityChanged = false;
|
|
1122
1102
|
|