super-three 0.165.0 → 0.168.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 +854 -410
- package/build/three.module.js +849 -411
- package/build/three.module.min.js +1 -1
- package/build/three.webgpu.js +77755 -0
- package/build/three.webgpu.min.js +6 -0
- package/examples/jsm/Addons.js +5 -2
- package/examples/jsm/animation/AnimationClipCreator.js +1 -1
- package/examples/jsm/capabilities/WebGL.js +27 -21
- package/examples/jsm/controls/ArcballControls.js +174 -158
- package/examples/jsm/controls/DragControls.js +260 -132
- package/examples/jsm/controls/FirstPersonControls.js +175 -163
- package/examples/jsm/controls/FlyControls.js +194 -188
- package/examples/jsm/controls/OrbitControls.js +777 -786
- package/examples/jsm/controls/PointerLockControls.js +24 -15
- package/examples/jsm/controls/TrackballControls.js +453 -452
- package/examples/jsm/csm/CSMShader.js +4 -4
- package/examples/jsm/effects/AnaglyphEffect.js +6 -13
- package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
- package/examples/jsm/effects/StereoEffect.js +6 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +13 -4
- package/examples/jsm/exporters/USDZExporter.js +29 -8
- package/examples/jsm/geometries/TeapotGeometry.js +1 -1
- package/examples/jsm/helpers/LightProbeHelper.js +42 -43
- 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/KTX2Loader.js +19 -7
- package/examples/jsm/loaders/MaterialXLoader.js +10 -10
- package/examples/jsm/loaders/PCDLoader.js +9 -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/objects/SkyMesh.js +188 -0
- package/examples/jsm/objects/Water2Mesh.js +159 -0
- package/examples/jsm/objects/WaterMesh.js +102 -0
- package/examples/jsm/physics/RapierPhysics.js +20 -0
- package/examples/jsm/postprocessing/OutlinePass.js +31 -46
- package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
- package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
- package/examples/jsm/postprocessing/SSAOPass.js +6 -9
- package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
- package/examples/jsm/shaders/BleachBypassShader.js +1 -2
- package/examples/jsm/shaders/ColorifyShader.js +1 -2
- package/examples/jsm/shaders/FXAAShader.js +0 -2
- package/examples/jsm/shaders/GTAOShader.js +1 -1
- package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
- package/examples/jsm/shaders/OutputShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
- package/examples/jsm/transpiler/TSLEncoder.js +24 -22
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/package.json +8 -6
- package/src/Three.WebGPU.js +200 -0
- package/src/Three.js +3 -0
- package/src/constants.js +4 -1
- package/src/core/Object3D.js +22 -22
- package/src/extras/Controls.js +32 -0
- 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/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeLoader.js +6 -4
- package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeMaterialLoader.js +2 -2
- package/{examples/jsm/nodes/loaders → src/loaders/nodes}/NodeObjectLoader.js +2 -1
- package/src/materials/Material.js +7 -1
- package/{examples/jsm/nodes/materials → src/materials/nodes}/InstancedPointsNodeMaterial.js +36 -27
- package/{examples/jsm/nodes/materials → src/materials/nodes}/Line2NodeMaterial.js +37 -40
- package/src/materials/nodes/LineBasicNodeMaterial.js +27 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/LineDashedNodeMaterial.js +10 -11
- package/src/materials/nodes/MeshBasicNodeMaterial.js +73 -0
- package/src/materials/nodes/MeshLambertNodeMaterial.js +43 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +53 -0
- package/src/materials/nodes/MeshNormalNodeMaterial.js +40 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +74 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshPhysicalNodeMaterial.js +22 -20
- package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshSSSNodeMaterial.js +6 -6
- package/{examples/jsm/nodes/materials → src/materials/nodes}/MeshStandardNodeMaterial.js +28 -11
- package/src/materials/nodes/MeshToonNodeMaterial.js +34 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/NodeMaterial.js +142 -96
- package/{examples/jsm/nodes/materials/Materials.js → src/materials/nodes/NodeMaterials.js} +1 -1
- package/{examples/jsm/nodes/materials → src/materials/nodes}/PointsNodeMaterial.js +5 -6
- package/src/materials/nodes/ShadowNodeMaterial.js +34 -0
- package/{examples/jsm/nodes/materials → src/materials/nodes}/SpriteNodeMaterial.js +13 -13
- package/{examples/jsm/nodes/materials → src/materials/nodes}/VolumeNodeMaterial.js +14 -16
- 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/src/nodes/Nodes.js +164 -0
- package/src/nodes/TSL.js +176 -0
- package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +8 -8
- package/src/nodes/accessors/BatchNode.js +124 -0
- package/{examples/jsm/nodes/accessors/BitangentNode.js → src/nodes/accessors/Bitangent.js} +9 -9
- package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +41 -6
- package/{examples/jsm → src}/nodes/accessors/BufferNode.js +4 -4
- package/src/nodes/accessors/Camera.js +19 -0
- package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +16 -14
- package/src/nodes/accessors/CubeTextureNode.js +76 -0
- package/src/nodes/accessors/InstanceNode.js +144 -0
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
- package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +66 -49
- package/src/nodes/accessors/MaterialProperties.js +3 -0
- package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +6 -4
- package/src/nodes/accessors/ModelNode.js +37 -0
- package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +6 -7
- package/{examples/jsm → src}/nodes/accessors/MorphNode.js +35 -31
- package/src/nodes/accessors/Normal.js +62 -0
- package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +11 -11
- package/src/nodes/accessors/PointUVNode.js +26 -0
- package/src/nodes/accessors/Position.js +10 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +143 -0
- package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +14 -8
- package/src/nodes/accessors/ReflectVector.js +10 -0
- package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +6 -6
- package/{examples/jsm → src}/nodes/accessors/SceneNode.js +5 -6
- package/src/nodes/accessors/SkinningNode.js +187 -0
- package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +54 -6
- package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +16 -7
- package/src/nodes/accessors/Tangent.js +22 -0
- package/{examples/jsm → src}/nodes/accessors/Texture3DNode.js +11 -11
- package/{examples/jsm/nodes/accessors/TextureBicubicNode.js → src/nodes/accessors/TextureBicubic.js} +3 -32
- package/{examples/jsm → src}/nodes/accessors/TextureNode.js +69 -37
- package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +4 -6
- package/{examples/jsm/nodes/accessors/UniformsNode.js → src/nodes/accessors/UniformArrayNode.js} +24 -9
- package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +4 -4
- package/src/nodes/accessors/VelocityNode.js +83 -0
- package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +6 -5
- package/{examples/jsm → src}/nodes/code/CodeNode.js +5 -5
- package/{examples/jsm → src}/nodes/code/ExpressionNode.js +4 -4
- package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +5 -5
- package/{examples/jsm → src}/nodes/code/FunctionNode.js +5 -23
- package/{examples/jsm → src}/nodes/code/ScriptableNode.js +18 -6
- package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +6 -7
- package/{examples/jsm → src}/nodes/core/AssignNode.js +5 -5
- package/{examples/jsm → src}/nodes/core/AttributeNode.js +22 -21
- package/{examples/jsm → src}/nodes/core/BypassNode.js +5 -5
- package/src/nodes/core/CacheNode.js +46 -0
- package/{examples/jsm → src}/nodes/core/ConstNode.js +2 -2
- package/{examples/jsm → src}/nodes/core/ContextNode.js +17 -11
- package/{examples/jsm → src}/nodes/core/IndexNode.js +17 -6
- package/{examples/jsm → src}/nodes/core/InputNode.js +2 -2
- package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
- package/src/nodes/core/MRTNode.js +82 -0
- package/{examples/jsm → src}/nodes/core/Node.js +57 -31
- package/{examples/jsm → src}/nodes/core/NodeBuilder.js +216 -65
- 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 +7 -1
- package/{examples/jsm → src}/nodes/core/OutputStructNode.js +4 -4
- package/{examples/jsm → src}/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +84 -0
- package/{examples/jsm → src}/nodes/core/StackNode.js +26 -10
- package/{examples/jsm → src}/nodes/core/StructTypeNode.js +2 -2
- package/{examples/jsm → src}/nodes/core/TempNode.js +4 -4
- package/src/nodes/core/UniformGroupNode.js +55 -0
- package/{examples/jsm → src}/nodes/core/UniformNode.js +14 -5
- package/{examples/jsm → src}/nodes/core/VarNode.js +8 -12
- package/{examples/jsm → src}/nodes/core/VaryingNode.js +13 -5
- package/{examples/jsm → src}/nodes/display/AfterImageNode.js +27 -35
- package/src/nodes/display/AnaglyphPassNode.js +61 -0
- package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +27 -30
- package/src/nodes/display/BleachBypass.js +26 -0
- package/src/nodes/display/BlendMode.js +54 -0
- package/src/nodes/display/BloomNode.js +335 -0
- package/{examples/jsm → src}/nodes/display/BumpMapNode.js +7 -12
- package/src/nodes/display/ColorAdjustment.js +46 -0
- package/src/nodes/display/ColorSpaceFunctions.js +38 -0
- package/src/nodes/display/ColorSpaceNode.js +85 -0
- package/src/nodes/display/DenoiseNode.js +201 -0
- package/src/nodes/display/DepthOfFieldNode.js +121 -0
- package/src/nodes/display/DotScreenNode.js +63 -0
- package/src/nodes/display/FXAANode.js +329 -0
- package/src/nodes/display/FilmNode.js +53 -0
- package/src/nodes/display/FrontFacingNode.js +41 -0
- package/src/nodes/display/GTAONode.js +328 -0
- package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +44 -24
- package/src/nodes/display/Lut3DNode.js +54 -0
- package/src/nodes/display/MotionBlur.js +25 -0
- package/{examples/jsm → src}/nodes/display/NormalMapNode.js +9 -11
- package/src/nodes/display/ParallaxBarrierPassNode.js +55 -0
- package/src/nodes/display/PassNode.js +367 -0
- package/src/nodes/display/PixelationPassNode.js +206 -0
- package/{examples/jsm → src}/nodes/display/PosterizeNode.js +4 -6
- package/src/nodes/display/RGBShiftNode.js +50 -0
- package/src/nodes/display/RenderOutputNode.js +56 -0
- package/src/nodes/display/SSAAPassNode.js +284 -0
- package/src/nodes/display/Sepia.js +17 -0
- package/src/nodes/display/SobelOperatorNode.js +123 -0
- package/src/nodes/display/StereoCompositePassNode.js +107 -0
- package/src/nodes/display/StereoPassNode.js +80 -0
- package/src/nodes/display/ToneMappingFunctions.js +190 -0
- package/src/nodes/display/ToneMappingNode.js +66 -0
- package/src/nodes/display/TransitionNode.js +77 -0
- package/src/nodes/display/ViewportDepthNode.js +121 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +30 -0
- package/{examples/jsm → src}/nodes/display/ViewportNode.js +28 -26
- package/src/nodes/display/ViewportSharedTextureNode.js +36 -0
- package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +12 -12
- package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +4 -6
- package/{examples/jsm → src}/nodes/fog/FogNode.js +5 -7
- package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +4 -6
- package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +4 -4
- package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
- package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
- package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +2 -2
- package/src/nodes/functions/BSDF/LTC.js +131 -0
- package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
- package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/BasicLightingModel.js +78 -0
- package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +10 -8
- package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +73 -31
- package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +1 -1
- package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +6 -4
- package/src/nodes/functions/material/getGeometryRoughness.js +13 -0
- package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +2 -2
- package/{examples/jsm → src}/nodes/geometry/RangeNode.js +23 -10
- package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +5 -5
- package/src/nodes/lighting/AONode.js +24 -0
- package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +2 -7
- package/src/nodes/lighting/AnalyticLightNode.js +354 -0
- package/src/nodes/lighting/BasicEnvironmentNode.js +27 -0
- package/src/nodes/lighting/BasicLightMapNode.js +29 -0
- package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +3 -9
- package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +23 -21
- package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +4 -7
- package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +3 -8
- package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +2 -2
- package/{examples/jsm → src}/nodes/lighting/LightNode.js +5 -5
- package/src/nodes/lighting/LightProbeNode.js +76 -0
- package/{examples/jsm → src}/nodes/lighting/LightUtils.js +3 -3
- package/src/nodes/lighting/LightingContextNode.js +64 -0
- package/{examples/jsm → src}/nodes/lighting/LightingNode.js +4 -2
- package/src/nodes/lighting/LightsNode.js +231 -0
- package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +4 -10
- package/src/nodes/lighting/RectAreaLightNode.js +93 -0
- package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +4 -10
- package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +2 -2
- package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +43 -46
- package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +500 -603
- package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +3 -9
- package/{examples/jsm/nodes/math/CondNode.js → src/nodes/math/ConditionalNode.js} +31 -13
- package/src/nodes/math/Hash.js +13 -0
- package/src/nodes/math/MathNode.js +404 -0
- package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -7
- package/{examples/jsm → src}/nodes/math/OperatorNode.js +100 -58
- package/{examples/jsm → src}/nodes/math/TriNoise3D.js +19 -29
- package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
- package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +60 -16
- package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +46 -46
- package/src/nodes/procedural/Checker.js +14 -0
- package/src/nodes/tsl/TSLBase.js +30 -0
- package/{examples/jsm/nodes/shadernode/ShaderNode.js → src/nodes/tsl/TSLCore.js} +106 -96
- package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +2 -2
- package/{examples/jsm → src}/nodes/utils/ConvertNode.js +2 -2
- package/src/nodes/utils/CubeMapNode.js +157 -0
- package/src/nodes/utils/Discard.js +8 -0
- package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +5 -5
- package/src/nodes/utils/FlipNode.js +65 -0
- package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +7 -5
- package/{examples/jsm → src}/nodes/utils/JoinNode.js +2 -2
- package/{examples/jsm → src}/nodes/utils/LoopNode.js +19 -12
- package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +6 -6
- package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +12 -6
- package/{examples/jsm → src}/nodes/utils/OscNode.js +7 -7
- package/src/nodes/utils/Packing.js +4 -0
- package/src/nodes/utils/RTTNode.js +130 -0
- package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +17 -4
- package/{examples/jsm → src}/nodes/utils/RemapNode.js +7 -7
- package/{examples/jsm → src}/nodes/utils/RotateNode.js +4 -12
- package/{examples/jsm → src}/nodes/utils/SetNode.js +2 -2
- package/{examples/jsm → src}/nodes/utils/SplitNode.js +2 -2
- package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +5 -5
- package/src/nodes/utils/SpriteUtils.js +47 -0
- package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +4 -6
- package/{examples/jsm → src}/nodes/utils/TimerNode.js +5 -5
- package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +7 -9
- package/src/nodes/utils/UVUtils.js +19 -0
- package/src/nodes/utils/ViewportUtils.js +14 -0
- package/src/objects/BatchedMesh.js +169 -190
- package/src/objects/InstancedMesh.js +1 -1
- package/src/renderers/WebGLRenderer.js +60 -23
- 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 +12 -4
- package/src/renderers/common/BindGroup.js +18 -0
- package/{examples/jsm → src}/renderers/common/Bindings.js +45 -32
- package/{examples/jsm → src}/renderers/common/ClippingContext.js +18 -7
- package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
- package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +16 -4
- package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
- package/{examples/jsm → src}/renderers/common/Info.js +34 -6
- package/src/renderers/common/PostProcessing.js +90 -0
- package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +8 -3
- package/{examples/jsm → src}/renderers/common/RenderContext.js +25 -1
- package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
- package/{examples/jsm → src}/renderers/common/RenderList.js +1 -1
- package/{examples/jsm → src}/renderers/common/RenderObject.js +45 -12
- package/{examples/jsm → src}/renderers/common/Renderer.js +151 -73
- package/{examples/jsm → src}/renderers/common/SampledTexture.js +14 -5
- package/src/renderers/common/StandardRenderer.js +18 -0
- 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 +14 -14
- 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 +25 -25
- package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
- package/src/renderers/common/nodes/NodeLibrary.js +118 -0
- package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +8 -7
- 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 +69 -21
- package/src/renderers/common/nodes/StandardNodeLibrary.js +105 -0
- 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/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
- 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 +27 -1
- package/src/renderers/webgl/WebGLPrograms.js +1 -1
- package/src/renderers/webgl/WebGLProperties.js +7 -0
- package/src/renderers/webgl/WebGLTextures.js +75 -57
- 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 +242 -120
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +227 -44
- 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 +22 -1
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +62 -23
- package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
- package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +242 -136
- package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +9 -9
- package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +281 -107
- 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 +64 -33
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +4 -1
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +34 -36
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +76 -44
- package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +42 -4
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
- package/src/renderers/webxr/WebXRManager.js +37 -24
- package/src/textures/CompressedArrayTexture.js +1 -1
- package/examples/jsm/loaders/LogLuvLoader.js +0 -606
- package/examples/jsm/nodes/Nodes.js +0 -202
- package/examples/jsm/nodes/accessors/BatchNode.js +0 -78
- package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +0 -61
- package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
- package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +0 -21
- package/examples/jsm/nodes/accessors/ModelNode.js +0 -36
- package/examples/jsm/nodes/accessors/NormalNode.js +0 -14
- package/examples/jsm/nodes/accessors/PointUVNode.js +0 -26
- package/examples/jsm/nodes/accessors/PositionNode.js +0 -10
- package/examples/jsm/nodes/accessors/ReflectVectorNode.js +0 -6
- package/examples/jsm/nodes/accessors/SkinningNode.js +0 -124
- package/examples/jsm/nodes/accessors/TangentNode.js +0 -23
- package/examples/jsm/nodes/core/CacheNode.js +0 -49
- package/examples/jsm/nodes/core/NodeCache.js +0 -26
- package/examples/jsm/nodes/core/NodeKeywords.js +0 -80
- package/examples/jsm/nodes/core/PropertyNode.js +0 -83
- package/examples/jsm/nodes/core/UniformGroupNode.js +0 -36
- package/examples/jsm/nodes/display/BlendModeNode.js +0 -128
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +0 -99
- package/examples/jsm/nodes/display/ColorSpaceNode.js +0 -108
- package/examples/jsm/nodes/display/FrontFacingNode.js +0 -40
- package/examples/jsm/nodes/display/PassNode.js +0 -201
- package/examples/jsm/nodes/display/ToneMappingNode.js +0 -188
- package/examples/jsm/nodes/display/ViewportDepthNode.js +0 -97
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +0 -31
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +0 -37
- package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +0 -13
- package/examples/jsm/nodes/lighting/AONode.js +0 -27
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
- package/examples/jsm/nodes/lighting/LightingContextNode.js +0 -66
- package/examples/jsm/nodes/lighting/LightsNode.js +0 -215
- package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -28
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +0 -34
- package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +0 -52
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -38
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -65
- package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +0 -34
- package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +0 -34
- package/examples/jsm/nodes/math/HashNode.js +0 -34
- package/examples/jsm/nodes/math/MathNode.js +0 -391
- package/examples/jsm/nodes/procedural/CheckerNode.js +0 -42
- package/examples/jsm/nodes/utils/DiscardNode.js +0 -27
- package/examples/jsm/nodes/utils/PackingNode.js +0 -55
- package/examples/jsm/nodes/utils/RotateUVNode.js +0 -35
- 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/nodes/accessors/UVNode.js → src/nodes/accessors/UV.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/UniformGroup.js +0 -0
- /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
- /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
- /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
- /package/{examples/jsm → src}/renderers/common/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/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
|
@@ -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._maxInstanceCount );
|
|
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.` );
|
|
@@ -304,17 +300,17 @@ class BatchedMesh extends Mesh {
|
|
|
304
300
|
|
|
305
301
|
}
|
|
306
302
|
|
|
307
|
-
const geometryCount = this._geometryCount;
|
|
308
303
|
const boundingBox = this.boundingBox;
|
|
309
|
-
const
|
|
304
|
+
const drawInfo = this._drawInfo;
|
|
310
305
|
|
|
311
306
|
boundingBox.makeEmpty();
|
|
312
|
-
for ( let i = 0; i <
|
|
307
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
313
308
|
|
|
314
|
-
if (
|
|
309
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
315
310
|
|
|
311
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
316
312
|
this.getMatrixAt( i, _matrix );
|
|
317
|
-
this.getBoundingBoxAt(
|
|
313
|
+
this.getBoundingBoxAt( geometryId, _box ).applyMatrix4( _matrix );
|
|
318
314
|
boundingBox.union( _box );
|
|
319
315
|
|
|
320
316
|
}
|
|
@@ -329,23 +325,59 @@ class BatchedMesh extends Mesh {
|
|
|
329
325
|
|
|
330
326
|
}
|
|
331
327
|
|
|
332
|
-
const geometryCount = this._geometryCount;
|
|
333
328
|
const boundingSphere = this.boundingSphere;
|
|
334
|
-
const
|
|
329
|
+
const drawInfo = this._drawInfo;
|
|
335
330
|
|
|
336
331
|
boundingSphere.makeEmpty();
|
|
337
|
-
for ( let i = 0; i <
|
|
332
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
338
333
|
|
|
339
|
-
if (
|
|
334
|
+
if ( drawInfo[ i ].active === false ) continue;
|
|
340
335
|
|
|
336
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
341
337
|
this.getMatrixAt( i, _matrix );
|
|
342
|
-
this.getBoundingSphereAt(
|
|
338
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
343
339
|
boundingSphere.union( _sphere );
|
|
344
340
|
|
|
345
341
|
}
|
|
346
342
|
|
|
347
343
|
}
|
|
348
344
|
|
|
345
|
+
addInstance( geometryId ) {
|
|
346
|
+
|
|
347
|
+
// ensure we're not over geometry
|
|
348
|
+
if ( this._drawInfo.length >= this._maxInstanceCount ) {
|
|
349
|
+
|
|
350
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
351
|
+
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
this._drawInfo.push( {
|
|
355
|
+
|
|
356
|
+
visible: true,
|
|
357
|
+
active: true,
|
|
358
|
+
geometryIndex: geometryId,
|
|
359
|
+
|
|
360
|
+
} );
|
|
361
|
+
|
|
362
|
+
// initialize the matrix
|
|
363
|
+
const drawId = this._drawInfo.length - 1;
|
|
364
|
+
const matricesTexture = this._matricesTexture;
|
|
365
|
+
const matricesArray = matricesTexture.image.data;
|
|
366
|
+
_identityMatrix.toArray( matricesArray, drawId * 16 );
|
|
367
|
+
matricesTexture.needsUpdate = true;
|
|
368
|
+
|
|
369
|
+
const colorsTexture = this._colorsTexture;
|
|
370
|
+
if ( colorsTexture ) {
|
|
371
|
+
|
|
372
|
+
_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );
|
|
373
|
+
colorsTexture.needsUpdate = true;
|
|
374
|
+
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return drawId;
|
|
378
|
+
|
|
379
|
+
}
|
|
380
|
+
|
|
349
381
|
addGeometry( geometry, vertexCount = - 1, indexCount = - 1 ) {
|
|
350
382
|
|
|
351
383
|
this._initializeGeometry( geometry );
|
|
@@ -353,9 +385,9 @@ class BatchedMesh extends Mesh {
|
|
|
353
385
|
this._validateGeometry( geometry );
|
|
354
386
|
|
|
355
387
|
// ensure we're not over geometry
|
|
356
|
-
if ( this.
|
|
388
|
+
if ( this._drawInfo.length >= this._maxInstanceCount ) {
|
|
357
389
|
|
|
358
|
-
throw new Error( 'BatchedMesh: Maximum
|
|
390
|
+
throw new Error( 'BatchedMesh: Maximum item count reached.' );
|
|
359
391
|
|
|
360
392
|
}
|
|
361
393
|
|
|
@@ -433,32 +465,10 @@ class BatchedMesh extends Mesh {
|
|
|
433
465
|
|
|
434
466
|
}
|
|
435
467
|
|
|
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
468
|
// update id
|
|
447
469
|
const geometryId = this._geometryCount;
|
|
448
470
|
this._geometryCount ++;
|
|
449
471
|
|
|
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
472
|
// add the reserved range and draw range objects
|
|
463
473
|
reservedRanges.push( reservedRange );
|
|
464
474
|
drawRanges.push( {
|
|
@@ -473,16 +483,6 @@ class BatchedMesh extends Mesh {
|
|
|
473
483
|
sphere: new Sphere()
|
|
474
484
|
} );
|
|
475
485
|
|
|
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
486
|
// update the geometry
|
|
487
487
|
this.setGeometryAt( geometryId, geometry );
|
|
488
488
|
|
|
@@ -490,9 +490,9 @@ class BatchedMesh extends Mesh {
|
|
|
490
490
|
|
|
491
491
|
}
|
|
492
492
|
|
|
493
|
-
setGeometryAt(
|
|
493
|
+
setGeometryAt( geometryId, geometry ) {
|
|
494
494
|
|
|
495
|
-
if (
|
|
495
|
+
if ( geometryId >= this._geometryCount ) {
|
|
496
496
|
|
|
497
497
|
throw new Error( 'BatchedMesh: Maximum geometry count reached.' );
|
|
498
498
|
|
|
@@ -504,7 +504,7 @@ class BatchedMesh extends Mesh {
|
|
|
504
504
|
const hasIndex = batchGeometry.getIndex() !== null;
|
|
505
505
|
const dstIndex = batchGeometry.getIndex();
|
|
506
506
|
const srcIndex = geometry.getIndex();
|
|
507
|
-
const reservedRange = this._reservedRanges[
|
|
507
|
+
const reservedRange = this._reservedRanges[ geometryId ];
|
|
508
508
|
if (
|
|
509
509
|
hasIndex &&
|
|
510
510
|
srcIndex.count > reservedRange.indexCount ||
|
|
@@ -520,12 +520,6 @@ class BatchedMesh extends Mesh {
|
|
|
520
520
|
const vertexCount = reservedRange.vertexCount;
|
|
521
521
|
for ( const attributeName in batchGeometry.attributes ) {
|
|
522
522
|
|
|
523
|
-
if ( attributeName === ID_ATTR_NAME ) {
|
|
524
|
-
|
|
525
|
-
continue;
|
|
526
|
-
|
|
527
|
-
}
|
|
528
|
-
|
|
529
523
|
// copy attribute data
|
|
530
524
|
const srcAttribute = geometry.getAttribute( attributeName );
|
|
531
525
|
const dstAttribute = batchGeometry.getAttribute( attributeName );
|
|
@@ -574,7 +568,7 @@ class BatchedMesh extends Mesh {
|
|
|
574
568
|
}
|
|
575
569
|
|
|
576
570
|
// store the bounding boxes
|
|
577
|
-
const bound = this._bounds[
|
|
571
|
+
const bound = this._bounds[ geometryId ];
|
|
578
572
|
if ( geometry.boundingBox !== null ) {
|
|
579
573
|
|
|
580
574
|
bound.box.copy( geometry.boundingBox );
|
|
@@ -598,67 +592,54 @@ class BatchedMesh extends Mesh {
|
|
|
598
592
|
}
|
|
599
593
|
|
|
600
594
|
// set drawRange count
|
|
601
|
-
const drawRange = this._drawRanges[
|
|
595
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
602
596
|
const posAttr = geometry.getAttribute( 'position' );
|
|
603
597
|
drawRange.count = hasIndex ? srcIndex.count : posAttr.count;
|
|
604
598
|
this._visibilityChanged = true;
|
|
605
599
|
|
|
606
|
-
return
|
|
600
|
+
return geometryId;
|
|
607
601
|
|
|
608
602
|
}
|
|
609
603
|
|
|
604
|
+
/*
|
|
610
605
|
deleteGeometry( geometryId ) {
|
|
611
606
|
|
|
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;
|
|
607
|
+
// TODO: delete geometry and associated instances
|
|
625
608
|
|
|
626
609
|
}
|
|
610
|
+
*/
|
|
627
611
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
if ( this._multiDrawInstances === null ) return null;
|
|
631
|
-
|
|
632
|
-
return this._multiDrawInstances[ id ];
|
|
633
|
-
|
|
634
|
-
}
|
|
612
|
+
/*
|
|
613
|
+
deleteInstance( instanceId ) {
|
|
635
614
|
|
|
636
|
-
|
|
615
|
+
// Note: User needs to call optimize() afterward to pack the data.
|
|
637
616
|
|
|
638
|
-
|
|
617
|
+
const drawInfo = this._drawInfo;
|
|
618
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
639
619
|
|
|
640
|
-
|
|
620
|
+
return this;
|
|
641
621
|
|
|
642
622
|
}
|
|
643
623
|
|
|
644
|
-
|
|
624
|
+
drawInfo[ instanceId ].active = false;
|
|
625
|
+
this._visibilityChanged = true;
|
|
645
626
|
|
|
646
|
-
return
|
|
627
|
+
return this;
|
|
647
628
|
|
|
648
629
|
}
|
|
630
|
+
*/
|
|
649
631
|
|
|
650
632
|
// get bounding box and compute it if it doesn't exist
|
|
651
|
-
getBoundingBoxAt(
|
|
633
|
+
getBoundingBoxAt( geometryId, target ) {
|
|
652
634
|
|
|
653
|
-
|
|
654
|
-
if ( active[ id ] === false ) {
|
|
635
|
+
if ( geometryId >= this._geometryCount ) {
|
|
655
636
|
|
|
656
637
|
return null;
|
|
657
638
|
|
|
658
639
|
}
|
|
659
640
|
|
|
660
641
|
// compute bounding box
|
|
661
|
-
const bound = this._bounds[
|
|
642
|
+
const bound = this._bounds[ geometryId ];
|
|
662
643
|
const box = bound.box;
|
|
663
644
|
const geometry = this.geometry;
|
|
664
645
|
if ( bound.boxInitialized === false ) {
|
|
@@ -667,7 +648,7 @@ class BatchedMesh extends Mesh {
|
|
|
667
648
|
|
|
668
649
|
const index = geometry.index;
|
|
669
650
|
const position = geometry.attributes.position;
|
|
670
|
-
const drawRange = this._drawRanges[
|
|
651
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
671
652
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
672
653
|
|
|
673
654
|
let iv = i;
|
|
@@ -691,29 +672,28 @@ class BatchedMesh extends Mesh {
|
|
|
691
672
|
}
|
|
692
673
|
|
|
693
674
|
// get bounding sphere and compute it if it doesn't exist
|
|
694
|
-
getBoundingSphereAt(
|
|
675
|
+
getBoundingSphereAt( geometryId, target ) {
|
|
695
676
|
|
|
696
|
-
|
|
697
|
-
if ( active[ id ] === false ) {
|
|
677
|
+
if ( geometryId >= this._geometryCount ) {
|
|
698
678
|
|
|
699
679
|
return null;
|
|
700
680
|
|
|
701
681
|
}
|
|
702
682
|
|
|
703
683
|
// compute bounding sphere
|
|
704
|
-
const bound = this._bounds[
|
|
684
|
+
const bound = this._bounds[ geometryId ];
|
|
705
685
|
const sphere = bound.sphere;
|
|
706
686
|
const geometry = this.geometry;
|
|
707
687
|
if ( bound.sphereInitialized === false ) {
|
|
708
688
|
|
|
709
689
|
sphere.makeEmpty();
|
|
710
690
|
|
|
711
|
-
this.getBoundingBoxAt(
|
|
691
|
+
this.getBoundingBoxAt( geometryId, _box );
|
|
712
692
|
_box.getCenter( sphere.center );
|
|
713
693
|
|
|
714
694
|
const index = geometry.index;
|
|
715
695
|
const position = geometry.attributes.position;
|
|
716
|
-
const drawRange = this._drawRanges[
|
|
696
|
+
const drawRange = this._drawRanges[ geometryId ];
|
|
717
697
|
|
|
718
698
|
let maxRadiusSq = 0;
|
|
719
699
|
for ( let i = drawRange.start, l = drawRange.start + drawRange.count; i < l; i ++ ) {
|
|
@@ -740,44 +720,42 @@ class BatchedMesh extends Mesh {
|
|
|
740
720
|
|
|
741
721
|
}
|
|
742
722
|
|
|
743
|
-
setMatrixAt(
|
|
723
|
+
setMatrixAt( instanceId, matrix ) {
|
|
744
724
|
|
|
745
725
|
// @TODO: Map geometryId to index of the arrays because
|
|
746
726
|
// optimize() can make geometryId mismatch the index
|
|
747
727
|
|
|
748
|
-
const
|
|
728
|
+
const drawInfo = this._drawInfo;
|
|
749
729
|
const matricesTexture = this._matricesTexture;
|
|
750
730
|
const matricesArray = this._matricesTexture.image.data;
|
|
751
|
-
|
|
752
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
731
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
753
732
|
|
|
754
733
|
return this;
|
|
755
734
|
|
|
756
735
|
}
|
|
757
736
|
|
|
758
|
-
matrix.toArray( matricesArray,
|
|
737
|
+
matrix.toArray( matricesArray, instanceId * 16 );
|
|
759
738
|
matricesTexture.needsUpdate = true;
|
|
760
739
|
|
|
761
740
|
return this;
|
|
762
741
|
|
|
763
742
|
}
|
|
764
743
|
|
|
765
|
-
getMatrixAt(
|
|
744
|
+
getMatrixAt( instanceId, matrix ) {
|
|
766
745
|
|
|
767
|
-
const
|
|
746
|
+
const drawInfo = this._drawInfo;
|
|
768
747
|
const matricesArray = this._matricesTexture.image.data;
|
|
769
|
-
|
|
770
|
-
if ( geometryId >= geometryCount || active[ geometryId ] === false ) {
|
|
748
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
771
749
|
|
|
772
750
|
return null;
|
|
773
751
|
|
|
774
752
|
}
|
|
775
753
|
|
|
776
|
-
return matrix.fromArray( matricesArray,
|
|
754
|
+
return matrix.fromArray( matricesArray, instanceId * 16 );
|
|
777
755
|
|
|
778
756
|
}
|
|
779
757
|
|
|
780
|
-
setColorAt(
|
|
758
|
+
setColorAt( instanceId, color ) {
|
|
781
759
|
|
|
782
760
|
if ( this._colorsTexture === null ) {
|
|
783
761
|
|
|
@@ -785,89 +763,79 @@ class BatchedMesh extends Mesh {
|
|
|
785
763
|
|
|
786
764
|
}
|
|
787
765
|
|
|
788
|
-
// @TODO: Map
|
|
789
|
-
// optimize() can make
|
|
766
|
+
// @TODO: Map id to index of the arrays because
|
|
767
|
+
// optimize() can make id mismatch the index
|
|
790
768
|
|
|
791
|
-
const active = this._active;
|
|
792
769
|
const colorsTexture = this._colorsTexture;
|
|
793
770
|
const colorsArray = this._colorsTexture.image.data;
|
|
794
|
-
const
|
|
795
|
-
if (
|
|
771
|
+
const drawInfo = this._drawInfo;
|
|
772
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
796
773
|
|
|
797
774
|
return this;
|
|
798
775
|
|
|
799
776
|
}
|
|
800
777
|
|
|
801
|
-
color.toArray( colorsArray,
|
|
778
|
+
color.toArray( colorsArray, instanceId * 4 );
|
|
802
779
|
colorsTexture.needsUpdate = true;
|
|
803
780
|
|
|
804
781
|
return this;
|
|
805
782
|
|
|
806
783
|
}
|
|
807
784
|
|
|
808
|
-
getColorAt(
|
|
785
|
+
getColorAt( instanceId, color ) {
|
|
809
786
|
|
|
810
|
-
const active = this._active;
|
|
811
787
|
const colorsArray = this._colorsTexture.image.data;
|
|
812
|
-
const
|
|
813
|
-
if (
|
|
788
|
+
const drawInfo = this._drawInfo;
|
|
789
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
814
790
|
|
|
815
791
|
return null;
|
|
816
792
|
|
|
817
793
|
}
|
|
818
794
|
|
|
819
|
-
return color.fromArray( colorsArray,
|
|
795
|
+
return color.fromArray( colorsArray, instanceId * 4 );
|
|
820
796
|
|
|
821
797
|
}
|
|
822
798
|
|
|
823
|
-
setVisibleAt(
|
|
824
|
-
|
|
825
|
-
const visibility = this._visibility;
|
|
826
|
-
const active = this._active;
|
|
827
|
-
const geometryCount = this._geometryCount;
|
|
799
|
+
setVisibleAt( instanceId, value ) {
|
|
828
800
|
|
|
829
801
|
// if the geometry is out of range, not active, or visibility state
|
|
830
802
|
// does not change then return early
|
|
803
|
+
const drawInfo = this._drawInfo;
|
|
831
804
|
if (
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
805
|
+
instanceId >= drawInfo.length ||
|
|
806
|
+
drawInfo[ instanceId ].active === false ||
|
|
807
|
+
drawInfo[ instanceId ].visible === value
|
|
835
808
|
) {
|
|
836
809
|
|
|
837
810
|
return this;
|
|
838
811
|
|
|
839
812
|
}
|
|
840
813
|
|
|
841
|
-
|
|
814
|
+
drawInfo[ instanceId ].visible = value;
|
|
842
815
|
this._visibilityChanged = true;
|
|
843
816
|
|
|
844
817
|
return this;
|
|
845
818
|
|
|
846
819
|
}
|
|
847
820
|
|
|
848
|
-
getVisibleAt(
|
|
849
|
-
|
|
850
|
-
const visibility = this._visibility;
|
|
851
|
-
const active = this._active;
|
|
852
|
-
const geometryCount = this._geometryCount;
|
|
821
|
+
getVisibleAt( instanceId ) {
|
|
853
822
|
|
|
854
823
|
// return early if the geometry is out of range or not active
|
|
855
|
-
|
|
824
|
+
const drawInfo = this._drawInfo;
|
|
825
|
+
if ( instanceId >= drawInfo.length || drawInfo[ instanceId ].active === false ) {
|
|
856
826
|
|
|
857
827
|
return false;
|
|
858
828
|
|
|
859
829
|
}
|
|
860
830
|
|
|
861
|
-
return
|
|
831
|
+
return drawInfo[ instanceId ].visible;
|
|
862
832
|
|
|
863
833
|
}
|
|
864
834
|
|
|
865
835
|
raycast( raycaster, intersects ) {
|
|
866
836
|
|
|
867
|
-
const
|
|
868
|
-
const active = this._active;
|
|
837
|
+
const drawInfo = this._drawInfo;
|
|
869
838
|
const drawRanges = this._drawRanges;
|
|
870
|
-
const geometryCount = this._geometryCount;
|
|
871
839
|
const matrixWorld = this.matrixWorld;
|
|
872
840
|
const batchGeometry = this.geometry;
|
|
873
841
|
|
|
@@ -887,21 +855,22 @@ class BatchedMesh extends Mesh {
|
|
|
887
855
|
|
|
888
856
|
}
|
|
889
857
|
|
|
890
|
-
for ( let i = 0; i <
|
|
858
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
891
859
|
|
|
892
|
-
if ( !
|
|
860
|
+
if ( ! drawInfo[ i ].visible || ! drawInfo[ i ].active ) {
|
|
893
861
|
|
|
894
862
|
continue;
|
|
895
863
|
|
|
896
864
|
}
|
|
897
865
|
|
|
898
|
-
const
|
|
866
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
867
|
+
const drawRange = drawRanges[ geometryId ];
|
|
899
868
|
_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );
|
|
900
869
|
|
|
901
870
|
// ge the intersects
|
|
902
871
|
this.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );
|
|
903
|
-
this.getBoundingBoxAt(
|
|
904
|
-
this.getBoundingSphereAt(
|
|
872
|
+
this.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );
|
|
873
|
+
this.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );
|
|
905
874
|
_mesh.raycast( raycaster, _batchIntersects );
|
|
906
875
|
|
|
907
876
|
// add batch id to the intersects
|
|
@@ -938,8 +907,7 @@ class BatchedMesh extends Mesh {
|
|
|
938
907
|
this._drawRanges = source._drawRanges.map( range => ( { ...range } ) );
|
|
939
908
|
this._reservedRanges = source._reservedRanges.map( range => ( { ...range } ) );
|
|
940
909
|
|
|
941
|
-
this.
|
|
942
|
-
this._active = source._active.slice();
|
|
910
|
+
this._drawInfo = source._drawInfo.map( inf => ( { ...inf } ) );
|
|
943
911
|
this._bounds = source._bounds.map( bound => ( {
|
|
944
912
|
boxInitialized: bound.boxInitialized,
|
|
945
913
|
box: bound.box.clone(),
|
|
@@ -948,7 +916,7 @@ class BatchedMesh extends Mesh {
|
|
|
948
916
|
sphere: bound.sphere.clone()
|
|
949
917
|
} ) );
|
|
950
918
|
|
|
951
|
-
this.
|
|
919
|
+
this._maxInstanceCount = source._maxInstanceCount;
|
|
952
920
|
this._maxVertexCount = source._maxVertexCount;
|
|
953
921
|
this._maxIndexCount = source._maxIndexCount;
|
|
954
922
|
|
|
@@ -958,12 +926,12 @@ class BatchedMesh extends Mesh {
|
|
|
958
926
|
this._multiDrawStarts = source._multiDrawStarts.slice();
|
|
959
927
|
|
|
960
928
|
this._matricesTexture = source._matricesTexture.clone();
|
|
961
|
-
this._matricesTexture.image.data = this._matricesTexture.image.slice();
|
|
929
|
+
this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
|
|
962
930
|
|
|
963
931
|
if ( this._colorsTexture !== null ) {
|
|
964
932
|
|
|
965
933
|
this._colorsTexture = source._colorsTexture.clone();
|
|
966
|
-
this._colorsTexture.image.data = this._colorsTexture.image.slice();
|
|
934
|
+
this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
|
|
967
935
|
|
|
968
936
|
}
|
|
969
937
|
|
|
@@ -979,6 +947,9 @@ class BatchedMesh extends Mesh {
|
|
|
979
947
|
this._matricesTexture.dispose();
|
|
980
948
|
this._matricesTexture = null;
|
|
981
949
|
|
|
950
|
+
this._indirectTexture.dispose();
|
|
951
|
+
this._indirectTexture = null;
|
|
952
|
+
|
|
982
953
|
if ( this._colorsTexture !== null ) {
|
|
983
954
|
|
|
984
955
|
this._colorsTexture.dispose();
|
|
@@ -1005,12 +976,13 @@ class BatchedMesh extends Mesh {
|
|
|
1005
976
|
const index = geometry.getIndex();
|
|
1006
977
|
const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
|
|
1007
978
|
|
|
1008
|
-
const
|
|
1009
|
-
const visibility = this._visibility;
|
|
979
|
+
const drawInfo = this._drawInfo;
|
|
1010
980
|
const multiDrawStarts = this._multiDrawStarts;
|
|
1011
981
|
const multiDrawCounts = this._multiDrawCounts;
|
|
1012
982
|
const drawRanges = this._drawRanges;
|
|
1013
983
|
const perObjectFrustumCulled = this.perObjectFrustumCulled;
|
|
984
|
+
const indirectTexture = this._indirectTexture;
|
|
985
|
+
const indirectArray = indirectTexture.image.data;
|
|
1014
986
|
|
|
1015
987
|
// prepare the frustum in the local frame
|
|
1016
988
|
if ( perObjectFrustumCulled ) {
|
|
@@ -1033,13 +1005,15 @@ class BatchedMesh extends Mesh {
|
|
|
1033
1005
|
_vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _invMatrixWorld );
|
|
1034
1006
|
_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _invMatrixWorld );
|
|
1035
1007
|
|
|
1036
|
-
for ( let i = 0, l =
|
|
1008
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
1037
1009
|
|
|
1038
|
-
if (
|
|
1010
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
1011
|
+
|
|
1012
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
1039
1013
|
|
|
1040
1014
|
// get the bounds in world space
|
|
1041
1015
|
this.getMatrixAt( i, _matrix );
|
|
1042
|
-
this.getBoundingSphereAt(
|
|
1016
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
1043
1017
|
|
|
1044
1018
|
// determine whether the batched geometry is within the frustum
|
|
1045
1019
|
let culled = false;
|
|
@@ -1053,7 +1027,7 @@ class BatchedMesh extends Mesh {
|
|
|
1053
1027
|
|
|
1054
1028
|
// get the distance from camera used for sorting
|
|
1055
1029
|
const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
|
|
1056
|
-
_renderList.push( drawRanges[
|
|
1030
|
+
_renderList.push( drawRanges[ geometryId ], z, i );
|
|
1057
1031
|
|
|
1058
1032
|
}
|
|
1059
1033
|
|
|
@@ -1079,6 +1053,7 @@ class BatchedMesh extends Mesh {
|
|
|
1079
1053
|
const item = list[ i ];
|
|
1080
1054
|
multiDrawStarts[ count ] = item.start * bytesPerElement;
|
|
1081
1055
|
multiDrawCounts[ count ] = item.count;
|
|
1056
|
+
indirectArray[ count ] = item.index;
|
|
1082
1057
|
count ++;
|
|
1083
1058
|
|
|
1084
1059
|
}
|
|
@@ -1087,9 +1062,11 @@ class BatchedMesh extends Mesh {
|
|
|
1087
1062
|
|
|
1088
1063
|
} else {
|
|
1089
1064
|
|
|
1090
|
-
for ( let i = 0, l =
|
|
1065
|
+
for ( let i = 0, l = drawInfo.length; i < l; i ++ ) {
|
|
1066
|
+
|
|
1067
|
+
if ( drawInfo[ i ].visible && drawInfo[ i ].active ) {
|
|
1091
1068
|
|
|
1092
|
-
|
|
1069
|
+
const geometryId = drawInfo[ i ].geometryIndex;
|
|
1093
1070
|
|
|
1094
1071
|
// determine whether the batched geometry is within the frustum
|
|
1095
1072
|
let culled = false;
|
|
@@ -1097,16 +1074,17 @@ class BatchedMesh extends Mesh {
|
|
|
1097
1074
|
|
|
1098
1075
|
// get the bounds in world space
|
|
1099
1076
|
this.getMatrixAt( i, _matrix );
|
|
1100
|
-
this.getBoundingSphereAt(
|
|
1077
|
+
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
1101
1078
|
culled = ! _frustum.intersectsSphere( _sphere );
|
|
1102
1079
|
|
|
1103
1080
|
}
|
|
1104
1081
|
|
|
1105
1082
|
if ( ! culled ) {
|
|
1106
1083
|
|
|
1107
|
-
const range = drawRanges[
|
|
1084
|
+
const range = drawRanges[ geometryId ];
|
|
1108
1085
|
multiDrawStarts[ count ] = range.start * bytesPerElement;
|
|
1109
1086
|
multiDrawCounts[ count ] = range.count;
|
|
1087
|
+
indirectArray[ count ] = i;
|
|
1110
1088
|
count ++;
|
|
1111
1089
|
|
|
1112
1090
|
}
|
|
@@ -1117,6 +1095,7 @@ class BatchedMesh extends Mesh {
|
|
|
1117
1095
|
|
|
1118
1096
|
}
|
|
1119
1097
|
|
|
1098
|
+
indirectTexture.needsUpdate = true;
|
|
1120
1099
|
this._multiDrawCount = count;
|
|
1121
1100
|
this._visibilityChanged = false;
|
|
1122
1101
|
|