super-three 0.168.0 → 0.169.1

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.
Files changed (288) hide show
  1. package/build/three.cjs +384 -700
  2. package/build/three.module.js +384 -700
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +24644 -22406
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +79941 -0
  7. package/build/three.webgpu.nodes.min.js +6 -0
  8. package/examples/jsm/Addons.js +0 -6
  9. package/examples/jsm/controls/TrackballControls.js +32 -12
  10. package/examples/jsm/controls/TransformControls.js +97 -62
  11. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  12. package/examples/jsm/exporters/EXRExporter.js +19 -11
  13. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  14. package/examples/jsm/exporters/OBJExporter.js +5 -1
  15. package/examples/jsm/exporters/PLYExporter.js +9 -7
  16. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  17. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  18. package/examples/jsm/helpers/LightProbeHelper.js +1 -1
  19. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  20. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  21. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  22. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  23. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  24. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  25. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  26. package/examples/jsm/loaders/FBXLoader.js +30 -20
  27. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  28. package/examples/jsm/loaders/KTX2Loader.js +10 -7
  29. package/examples/jsm/loaders/MTLLoader.js +4 -3
  30. package/examples/jsm/loaders/MaterialXLoader.js +29 -10
  31. package/examples/jsm/loaders/OBJLoader.js +5 -3
  32. package/examples/jsm/loaders/PCDLoader.js +5 -4
  33. package/examples/jsm/loaders/PDBLoader.js +3 -2
  34. package/examples/jsm/loaders/PLYLoader.js +8 -5
  35. package/examples/jsm/loaders/STLLoader.js +3 -2
  36. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  37. package/examples/jsm/loaders/VTKLoader.js +4 -3
  38. package/examples/jsm/loaders/XYZLoader.js +3 -2
  39. package/examples/jsm/misc/Timer.js +1 -1
  40. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  41. package/examples/jsm/objects/LensflareMesh.js +322 -0
  42. package/examples/jsm/objects/SkyMesh.js +1 -2
  43. package/examples/jsm/objects/Water2Mesh.js +2 -3
  44. package/examples/jsm/objects/WaterMesh.js +1 -2
  45. package/examples/jsm/physics/JoltPhysics.js +1 -1
  46. package/examples/jsm/physics/RapierPhysics.js +1 -1
  47. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  48. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  49. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  50. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  51. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  52. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  53. package/examples/jsm/utils/TextureUtils.js +1 -0
  54. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  55. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  56. package/package.json +2 -2
  57. package/src/Three.WebGPU.Nodes.js +200 -0
  58. package/src/Three.WebGPU.js +2 -1
  59. package/src/audio/Audio.js +2 -2
  60. package/src/constants.js +1 -1
  61. package/src/core/BufferAttribute.js +0 -9
  62. package/src/core/Clock.js +1 -1
  63. package/src/core/InterleavedBuffer.js +0 -9
  64. package/src/extras/Controls.js +1 -1
  65. package/src/geometries/CylinderGeometry.js +11 -4
  66. package/src/loaders/MaterialLoader.js +7 -1
  67. package/src/loaders/nodes/NodeLoader.js +24 -4
  68. package/src/loaders/nodes/NodeMaterialLoader.js +21 -17
  69. package/src/loaders/nodes/NodeObjectLoader.js +19 -0
  70. package/src/materials/nodes/InstancedPointsNodeMaterial.js +19 -34
  71. package/src/materials/nodes/Line2NodeMaterial.js +26 -26
  72. package/src/materials/nodes/LineBasicNodeMaterial.js +7 -3
  73. package/src/materials/nodes/LineDashedNodeMaterial.js +7 -3
  74. package/src/materials/nodes/MeshBasicNodeMaterial.js +7 -3
  75. package/src/materials/nodes/MeshLambertNodeMaterial.js +7 -3
  76. package/src/materials/nodes/MeshMatcapNodeMaterial.js +7 -3
  77. package/src/materials/nodes/MeshNormalNodeMaterial.js +7 -3
  78. package/src/materials/nodes/MeshPhongNodeMaterial.js +7 -3
  79. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +6 -3
  80. package/src/materials/nodes/MeshSSSNodeMaterial.js +6 -3
  81. package/src/materials/nodes/MeshStandardNodeMaterial.js +7 -3
  82. package/src/materials/nodes/MeshToonNodeMaterial.js +7 -3
  83. package/src/materials/nodes/NodeMaterial.js +20 -45
  84. package/src/materials/nodes/NodeMaterials.js +2 -0
  85. package/src/materials/nodes/PointsNodeMaterial.js +7 -3
  86. package/src/materials/nodes/ShadowNodeMaterial.js +7 -3
  87. package/src/materials/nodes/SpriteNodeMaterial.js +39 -6
  88. package/src/materials/nodes/VolumeNodeMaterial.js +13 -9
  89. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  90. package/src/math/Triangle.js +24 -0
  91. package/src/nodes/Nodes.js +3 -3
  92. package/src/nodes/TSL.js +96 -93
  93. package/src/nodes/accessors/BatchNode.js +7 -3
  94. package/src/nodes/accessors/BufferAttributeNode.js +6 -3
  95. package/src/nodes/accessors/BufferNode.js +6 -3
  96. package/src/nodes/accessors/Camera.js +10 -16
  97. package/src/nodes/accessors/ClippingNode.js +7 -3
  98. package/src/nodes/accessors/CubeTextureNode.js +6 -3
  99. package/src/nodes/accessors/InstanceNode.js +11 -11
  100. package/src/nodes/accessors/InstancedPointsMaterialNode.js +6 -3
  101. package/src/nodes/accessors/Lights.js +51 -0
  102. package/src/nodes/accessors/MaterialNode.js +8 -4
  103. package/src/nodes/accessors/MaterialReferenceNode.js +6 -3
  104. package/src/nodes/accessors/ModelNode.js +42 -7
  105. package/src/nodes/accessors/ModelViewProjectionNode.js +9 -5
  106. package/src/nodes/accessors/MorphNode.js +7 -3
  107. package/src/nodes/accessors/Normal.js +32 -6
  108. package/src/nodes/accessors/Object3DNode.js +11 -27
  109. package/src/nodes/accessors/PointUVNode.js +7 -3
  110. package/src/nodes/accessors/ReferenceBaseNode.js +32 -4
  111. package/src/nodes/accessors/ReferenceNode.js +40 -3
  112. package/src/nodes/accessors/RendererReferenceNode.js +9 -3
  113. package/src/nodes/accessors/SceneNode.js +7 -3
  114. package/src/nodes/accessors/SkinningNode.js +7 -3
  115. package/src/nodes/accessors/StorageBufferNode.js +21 -3
  116. package/src/nodes/accessors/StorageTextureNode.js +7 -4
  117. package/src/nodes/accessors/Texture3DNode.js +7 -4
  118. package/src/nodes/accessors/TextureNode.js +19 -8
  119. package/src/nodes/accessors/TextureSizeNode.js +8 -5
  120. package/src/nodes/accessors/UniformArrayNode.js +12 -9
  121. package/src/nodes/accessors/UserDataNode.js +9 -6
  122. package/src/nodes/accessors/VelocityNode.js +74 -23
  123. package/src/nodes/accessors/VertexColorNode.js +6 -3
  124. package/src/nodes/code/CodeNode.js +7 -3
  125. package/src/nodes/code/ExpressionNode.js +8 -4
  126. package/src/nodes/code/FunctionCallNode.js +6 -3
  127. package/src/nodes/code/FunctionNode.js +6 -3
  128. package/src/nodes/code/ScriptableNode.js +11 -6
  129. package/src/nodes/code/ScriptableValueNode.js +7 -3
  130. package/src/nodes/core/AssignNode.js +9 -6
  131. package/src/nodes/core/AttributeNode.js +7 -3
  132. package/src/nodes/core/BypassNode.js +8 -4
  133. package/src/nodes/core/CacheNode.js +8 -4
  134. package/src/nodes/core/ConstNode.js +6 -3
  135. package/src/nodes/core/ContextNode.js +7 -3
  136. package/src/nodes/core/IndexNode.js +25 -3
  137. package/src/nodes/core/InputNode.js +7 -3
  138. package/src/nodes/core/MRTNode.js +6 -3
  139. package/src/nodes/core/Node.js +10 -51
  140. package/src/nodes/core/NodeBuilder.js +71 -5
  141. package/src/nodes/core/NodeUtils.js +48 -6
  142. package/src/nodes/core/OutputStructNode.js +8 -4
  143. package/src/nodes/core/ParameterNode.js +6 -3
  144. package/src/nodes/core/PropertyNode.js +7 -3
  145. package/src/nodes/core/StackNode.js +7 -3
  146. package/src/nodes/core/StructTypeNode.js +7 -3
  147. package/src/nodes/core/TempNode.js +8 -4
  148. package/src/nodes/core/UniformGroupNode.js +10 -6
  149. package/src/nodes/core/UniformNode.js +6 -3
  150. package/src/nodes/core/VarNode.js +8 -4
  151. package/src/nodes/core/VaryingNode.js +7 -3
  152. package/src/nodes/display/AfterImageNode.js +6 -0
  153. package/src/nodes/display/AnaglyphPassNode.js +6 -0
  154. package/src/nodes/display/AnamorphicNode.js +6 -0
  155. package/src/nodes/display/BloomNode.js +6 -0
  156. package/src/nodes/display/BumpMapNode.js +6 -0
  157. package/src/nodes/display/ColorSpaceFunctions.js +4 -4
  158. package/src/nodes/display/ColorSpaceNode.js +43 -14
  159. package/src/nodes/display/DenoiseNode.js +6 -3
  160. package/src/nodes/display/DepthOfFieldNode.js +6 -3
  161. package/src/nodes/display/DotScreenNode.js +8 -5
  162. package/src/nodes/display/FXAANode.js +6 -3
  163. package/src/nodes/display/FilmNode.js +6 -3
  164. package/src/nodes/display/FrontFacingNode.js +7 -3
  165. package/src/nodes/display/GTAONode.js +6 -3
  166. package/src/nodes/display/GaussianBlurNode.js +6 -3
  167. package/src/nodes/display/Lut3DNode.js +6 -3
  168. package/src/nodes/display/NormalMapNode.js +8 -6
  169. package/src/nodes/display/ParallaxBarrierPassNode.js +8 -5
  170. package/src/nodes/display/PassNode.js +18 -7
  171. package/src/nodes/display/PixelationPassNode.js +12 -5
  172. package/src/nodes/display/PosterizeNode.js +6 -3
  173. package/src/nodes/display/RGBShiftNode.js +6 -3
  174. package/src/nodes/display/RenderOutputNode.js +12 -8
  175. package/src/nodes/display/SSAAPassNode.js +6 -3
  176. package/src/nodes/display/ScreenNode.js +181 -0
  177. package/src/nodes/display/SobelOperatorNode.js +6 -3
  178. package/src/nodes/display/StereoCompositePassNode.js +6 -3
  179. package/src/nodes/display/StereoPassNode.js +6 -3
  180. package/src/nodes/display/ToneMappingFunctions.js +12 -12
  181. package/src/nodes/display/ToneMappingNode.js +8 -7
  182. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  183. package/src/nodes/display/TransitionNode.js +6 -3
  184. package/src/nodes/display/ViewportDepthNode.js +7 -3
  185. package/src/nodes/display/ViewportDepthTextureNode.js +8 -5
  186. package/src/nodes/display/ViewportSharedTextureNode.js +8 -5
  187. package/src/nodes/display/ViewportTextureNode.js +8 -5
  188. package/src/nodes/fog/FogExp2Node.js +6 -3
  189. package/src/nodes/fog/FogNode.js +7 -3
  190. package/src/nodes/fog/FogRangeNode.js +6 -3
  191. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  192. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  193. package/src/nodes/geometry/RangeNode.js +7 -3
  194. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  195. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  196. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  197. package/src/nodes/gpgpu/ComputeNode.js +8 -4
  198. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  199. package/src/nodes/lighting/AONode.js +6 -3
  200. package/src/nodes/lighting/AmbientLightNode.js +6 -3
  201. package/src/nodes/lighting/AnalyticLightNode.js +198 -30
  202. package/src/nodes/lighting/BasicEnvironmentNode.js +6 -3
  203. package/src/nodes/lighting/BasicLightMapNode.js +6 -3
  204. package/src/nodes/lighting/DirectionalLightNode.js +7 -4
  205. package/src/nodes/lighting/EnvironmentNode.js +6 -3
  206. package/src/nodes/lighting/HemisphereLightNode.js +10 -6
  207. package/src/nodes/lighting/IESSpotLightNode.js +6 -3
  208. package/src/nodes/lighting/IrradianceNode.js +6 -3
  209. package/src/nodes/lighting/LightProbeNode.js +8 -31
  210. package/src/nodes/lighting/LightingContextNode.js +6 -3
  211. package/src/nodes/lighting/LightingNode.js +7 -3
  212. package/src/nodes/lighting/LightsNode.js +24 -5
  213. package/src/nodes/lighting/PointLightNode.js +11 -7
  214. package/src/nodes/lighting/RectAreaLightNode.js +11 -7
  215. package/src/nodes/lighting/SpotLightNode.js +13 -10
  216. package/src/nodes/math/ConditionalNode.js +23 -6
  217. package/src/nodes/math/MathNode.js +6 -3
  218. package/src/nodes/math/OperatorNode.js +6 -3
  219. package/src/nodes/pmrem/PMREMNode.js +6 -3
  220. package/src/nodes/utils/ArrayElementNode.js +8 -4
  221. package/src/nodes/utils/ConvertNode.js +7 -3
  222. package/src/nodes/utils/CubeMapNode.js +6 -3
  223. package/src/nodes/utils/EquirectUVNode.js +6 -3
  224. package/src/nodes/utils/FlipNode.js +7 -4
  225. package/src/nodes/utils/FunctionOverloadingNode.js +7 -3
  226. package/src/nodes/utils/JoinNode.js +6 -3
  227. package/src/nodes/utils/LoopNode.js +7 -3
  228. package/src/nodes/utils/MatcapUVNode.js +6 -3
  229. package/src/nodes/utils/MaxMipLevelNode.js +6 -3
  230. package/src/nodes/utils/OscNode.js +7 -3
  231. package/src/nodes/utils/RTTNode.js +6 -3
  232. package/src/nodes/utils/ReflectorNode.js +8 -5
  233. package/src/nodes/utils/RemapNode.js +7 -3
  234. package/src/nodes/utils/RotateNode.js +6 -3
  235. package/src/nodes/utils/SetNode.js +7 -4
  236. package/src/nodes/utils/SplitNode.js +7 -3
  237. package/src/nodes/utils/SpriteSheetUVNode.js +7 -3
  238. package/src/nodes/utils/StorageArrayElementNode.js +9 -8
  239. package/src/nodes/utils/TimerNode.js +6 -3
  240. package/src/nodes/utils/TriplanarTexturesNode.js +7 -3
  241. package/src/nodes/utils/ViewportUtils.js +2 -2
  242. package/src/objects/BatchedMesh.js +76 -10
  243. package/src/objects/LOD.js +21 -0
  244. package/src/objects/Line.js +1 -0
  245. package/src/objects/Mesh.js +7 -23
  246. package/src/objects/Points.js +2 -0
  247. package/src/renderers/WebGLRenderer.js +65 -50
  248. package/src/renderers/common/BundleGroup.js +26 -0
  249. package/src/renderers/common/ClippingContext.js +4 -3
  250. package/src/renderers/common/RenderContext.js +4 -5
  251. package/src/renderers/common/RenderObject.js +116 -5
  252. package/src/renderers/common/RenderObjects.js +8 -1
  253. package/src/renderers/common/Renderer.js +57 -49
  254. package/src/renderers/common/extras/PMREMGenerator.js +7 -9
  255. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  256. package/src/renderers/common/nodes/Nodes.js +33 -14
  257. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  258. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  259. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  260. package/src/renderers/webgl/WebGLProgram.js +2 -0
  261. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  262. package/src/renderers/webgl/WebGLState.js +21 -0
  263. package/src/renderers/webgl/WebGLTextures.js +22 -0
  264. package/src/renderers/webgl-fallback/WebGLBackend.js +50 -45
  265. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +4 -4
  266. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  267. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -4
  268. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +61 -16
  269. package/src/renderers/webgpu/WebGPUBackend.js +33 -25
  270. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  271. package/src/renderers/webgpu/WebGPURenderer.js +5 -2
  272. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  273. package/src/renderers/{common → webgpu}/nodes/StandardNodeLibrary.js +11 -11
  274. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +91 -11
  275. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  276. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +1 -1
  277. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +7 -5
  278. package/src/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  279. package/src/utils.js +33 -1
  280. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  281. package/examples/jsm/loaders/TiltLoader.js +0 -520
  282. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  283. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  284. package/src/nodes/display/ViewportNode.js +0 -138
  285. package/src/nodes/lighting/LightNode.js +0 -57
  286. package/src/renderers/common/StandardRenderer.js +0 -18
  287. package/src/renderers/webvr/WebVRManager.js +0 -495
  288. package/src/renderers/webvr/WebVRUtils.js +0 -66
@@ -22,7 +22,6 @@ import { Scene } from '../../scenes/Scene.js';
22
22
  import { Frustum } from '../../math/Frustum.js';
23
23
  import { Matrix4 } from '../../math/Matrix4.js';
24
24
  import { Vector2 } from '../../math/Vector2.js';
25
- import { Vector3 } from '../../math/Vector3.js';
26
25
  import { Vector4 } from '../../math/Vector4.js';
27
26
  import { RenderTarget } from '../../core/RenderTarget.js';
28
27
  import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
@@ -32,7 +31,7 @@ const _drawingBufferSize = /*@__PURE__*/ new Vector2();
32
31
  const _screen = /*@__PURE__*/ new Vector4();
33
32
  const _frustum = /*@__PURE__*/ new Frustum();
34
33
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
35
- const _vector3 = /*@__PURE__*/ new Vector3();
34
+ const _vector4 = /*@__PURE__*/ new Vector4();
36
35
 
37
36
  class Renderer {
38
37
 
@@ -45,6 +44,8 @@ class Renderer {
45
44
  const {
46
45
  logarithmicDepthBuffer = false,
47
46
  alpha = true,
47
+ depth = true,
48
+ stencil = false,
48
49
  antialias = false,
49
50
  samples = 0,
50
51
  getFallback = null
@@ -73,15 +74,17 @@ class Renderer {
73
74
 
74
75
  this.sortObjects = true;
75
76
 
76
- this.depth = true;
77
- this.stencil = false;
77
+ this.depth = depth;
78
+ this.stencil = stencil;
78
79
 
79
80
  this.clippingPlanes = [];
80
81
 
81
82
  this.info = new Info();
82
83
 
83
84
  this.nodes = {
84
- library: new NodeLibrary()
85
+ library: new NodeLibrary(),
86
+ modelViewMatrix: null,
87
+ modelNormalViewMatrix: null
85
88
  };
86
89
 
87
90
  // internals
@@ -408,20 +411,21 @@ class Renderer {
408
411
 
409
412
  _renderBundle( bundle, sceneRef, lightsNode ) {
410
413
 
411
- const { object, camera, renderList } = bundle;
414
+ const { bundleGroup, camera, renderList } = bundle;
412
415
 
413
416
  const renderContext = this._currentRenderContext;
414
417
 
415
418
  //
416
419
 
417
- const renderBundle = this._bundles.get( object, camera );
420
+ const renderBundle = this._bundles.get( bundleGroup, camera );
418
421
  const renderBundleData = this.backend.get( renderBundle );
419
422
 
420
423
  if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
421
424
 
422
425
  //
423
426
 
424
- const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || object.needsUpdate === true;
427
+ const needsUpdate = bundleGroup.version !== renderBundleData.version;
428
+ const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
425
429
 
426
430
  renderBundleData.renderContexts.add( renderContext );
427
431
 
@@ -429,7 +433,7 @@ class Renderer {
429
433
 
430
434
  this.backend.beginBundle( renderContext );
431
435
 
432
- if ( renderBundleData.renderObjects === undefined || object.needsUpdate === true ) {
436
+ if ( renderBundleData.renderObjects === undefined || needsUpdate ) {
433
437
 
434
438
  renderBundleData.renderObjects = [];
435
439
 
@@ -447,27 +451,26 @@ class Renderer {
447
451
 
448
452
  this.backend.finishBundle( renderContext, renderBundle );
449
453
 
450
- object.needsUpdate = false;
454
+ renderBundleData.version = bundleGroup.version;
451
455
 
452
456
  } else {
453
457
 
454
- const renderObjects = renderBundleData.renderObjects;
458
+ const { renderObjects } = renderBundleData;
455
459
 
456
460
  for ( let i = 0, l = renderObjects.length; i < l; i ++ ) {
457
461
 
458
462
  const renderObject = renderObjects[ i ];
459
463
 
460
- this._nodes.updateBefore( renderObject );
464
+ if ( this._nodes.needsRefresh( renderObject ) ) {
461
465
 
462
- //
466
+ this._nodes.updateBefore( renderObject );
463
467
 
464
- renderObject.object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, renderObject.object.matrixWorld );
465
- renderObject.object.normalMatrix.getNormalMatrix( renderObject.object.modelViewMatrix );
468
+ this._nodes.updateForRender( renderObject );
469
+ this._bindings.updateForRender( renderObject );
466
470
 
467
- this._nodes.updateForRender( renderObject );
468
- this._bindings.updateForRender( renderObject );
471
+ this._nodes.updateAfter( renderObject );
469
472
 
470
- this._nodes.updateAfter( renderObject );
473
+ }
471
474
 
472
475
  }
473
476
 
@@ -713,10 +716,12 @@ class Renderer {
713
716
 
714
717
  // process render lists
715
718
 
716
- const opaqueObjects = renderList.opaque;
717
- const transparentObjects = renderList.transparent;
718
- const bundles = renderList.bundles;
719
- const lightsNode = renderList.lightsNode;
719
+ const {
720
+ bundles,
721
+ lightsNode,
722
+ transparent: transparentObjects,
723
+ opaque: opaqueObjects
724
+ } = renderList;
720
725
 
721
726
  if ( bundles.length > 0 ) this._renderBundles( bundles, sceneRef, lightsNode );
722
727
  if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
@@ -1243,13 +1248,15 @@ class Renderer {
1243
1248
 
1244
1249
  }
1245
1250
 
1246
- copyFramebufferToTexture( framebufferTexture ) {
1251
+ copyFramebufferToTexture( framebufferTexture, rectangle = null ) {
1247
1252
 
1248
1253
  const renderContext = this._currentRenderContext;
1249
1254
 
1250
1255
  this._textures.updateTexture( framebufferTexture );
1251
1256
 
1252
- this.backend.copyFramebufferToTexture( framebufferTexture, renderContext );
1257
+ rectangle = rectangle === null ? _vector4.set( 0, 0, framebufferTexture.image.width, framebufferTexture.image.height ) : rectangle;
1258
+
1259
+ this.backend.copyFramebufferToTexture( framebufferTexture, renderContext, rectangle );
1253
1260
 
1254
1261
  }
1255
1262
 
@@ -1263,9 +1270,9 @@ class Renderer {
1263
1270
  }
1264
1271
 
1265
1272
 
1266
- readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0 ) {
1273
+ readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0, faceIndex = 0 ) {
1267
1274
 
1268
- return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height );
1275
+ return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height, faceIndex );
1269
1276
 
1270
1277
  }
1271
1278
 
@@ -1295,16 +1302,15 @@ class Renderer {
1295
1302
 
1296
1303
  if ( this.sortObjects === true ) {
1297
1304
 
1298
- _vector3.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
1305
+ _vector4.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );
1299
1306
 
1300
1307
  }
1301
1308
 
1302
- const geometry = object.geometry;
1303
- const material = object.material;
1309
+ const { geometry, material } = object;
1304
1310
 
1305
1311
  if ( material.visible ) {
1306
1312
 
1307
- renderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1313
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1308
1314
 
1309
1315
  }
1310
1316
 
@@ -1318,14 +1324,13 @@ class Renderer {
1318
1324
 
1319
1325
  if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1320
1326
 
1321
- const geometry = object.geometry;
1322
- const material = object.material;
1327
+ const { geometry, material } = object;
1323
1328
 
1324
1329
  if ( this.sortObjects === true ) {
1325
1330
 
1326
1331
  if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
1327
1332
 
1328
- _vector3
1333
+ _vector4
1329
1334
  .copy( geometry.boundingSphere.center )
1330
1335
  .applyMatrix4( object.matrixWorld )
1331
1336
  .applyMatrix4( _projScreenMatrix );
@@ -1343,7 +1348,7 @@ class Renderer {
1343
1348
 
1344
1349
  if ( groupMaterial && groupMaterial.visible ) {
1345
1350
 
1346
- renderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
1351
+ renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
1347
1352
 
1348
1353
  }
1349
1354
 
@@ -1351,7 +1356,7 @@ class Renderer {
1351
1356
 
1352
1357
  } else if ( material.visible ) {
1353
1358
 
1354
- renderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1359
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
1355
1360
 
1356
1361
  }
1357
1362
 
@@ -1361,7 +1366,7 @@ class Renderer {
1361
1366
 
1362
1367
  }
1363
1368
 
1364
- if ( object.static === true && this.backend.beginBundle !== undefined ) {
1369
+ if ( object.isBundleGroup === true && this.backend.beginBundle !== undefined ) {
1365
1370
 
1366
1371
  const baseRenderList = renderList;
1367
1372
 
@@ -1371,7 +1376,7 @@ class Renderer {
1371
1376
  renderList.begin();
1372
1377
 
1373
1378
  baseRenderList.pushBundle( {
1374
- object,
1379
+ bundleGroup: object,
1375
1380
  camera,
1376
1381
  renderList,
1377
1382
  } );
@@ -1571,22 +1576,24 @@ class Renderer {
1571
1576
  _renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
1572
1577
 
1573
1578
  const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1574
- renderObject.drawRange = group || object.geometry.drawRange;
1579
+ renderObject.drawRange = object.geometry.drawRange;
1580
+ renderObject.group = group;
1575
1581
 
1576
1582
  //
1577
1583
 
1578
- this._nodes.updateBefore( renderObject );
1584
+ const needsRefresh = this._nodes.needsRefresh( renderObject );
1579
1585
 
1580
- //
1586
+ if ( needsRefresh ) {
1581
1587
 
1582
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
1583
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
1588
+ this._nodes.updateBefore( renderObject );
1584
1589
 
1585
- //
1590
+ this._geometries.updateForRender( renderObject );
1591
+
1592
+ this._nodes.updateForRender( renderObject );
1593
+ this._bindings.updateForRender( renderObject );
1594
+
1595
+ }
1586
1596
 
1587
- this._nodes.updateForRender( renderObject );
1588
- this._geometries.updateForRender( renderObject );
1589
- this._bindings.updateForRender( renderObject );
1590
1597
  this._pipelines.updateForRender( renderObject );
1591
1598
 
1592
1599
  //
@@ -1597,11 +1604,13 @@ class Renderer {
1597
1604
 
1598
1605
  renderBundleData.renderObjects.push( renderObject );
1599
1606
 
1607
+ renderObject.bundle = this._currentRenderBundle.scene;
1608
+
1600
1609
  }
1601
1610
 
1602
1611
  this.backend.draw( renderObject, this.info );
1603
1612
 
1604
- this._nodes.updateAfter( renderObject );
1613
+ if ( needsRefresh ) this._nodes.updateAfter( renderObject );
1605
1614
 
1606
1615
  }
1607
1616
 
@@ -1613,10 +1622,9 @@ class Renderer {
1613
1622
 
1614
1623
  this._nodes.updateBefore( renderObject );
1615
1624
 
1616
- //
1625
+ this._geometries.updateForRender( renderObject );
1617
1626
 
1618
1627
  this._nodes.updateForRender( renderObject );
1619
- this._geometries.updateForRender( renderObject );
1620
1628
  this._bindings.updateForRender( renderObject );
1621
1629
 
1622
1630
  this._pipelines.getForRender( renderObject, this._compilationPromises );
@@ -176,12 +176,12 @@ class PMREMGenerator {
176
176
  * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
177
177
  * your texture's network fetch for increased concurrency.
178
178
  */
179
- compileCubemapShader() {
179
+ async compileCubemapShader() {
180
180
 
181
181
  if ( this._cubemapMaterial === null ) {
182
182
 
183
183
  this._cubemapMaterial = _getCubemapMaterial();
184
- this._compileMaterial( this._cubemapMaterial );
184
+ await this._compileMaterial( this._cubemapMaterial );
185
185
 
186
186
  }
187
187
 
@@ -191,12 +191,12 @@ class PMREMGenerator {
191
191
  * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
192
192
  * your texture's network fetch for increased concurrency.
193
193
  */
194
- compileEquirectangularShader() {
194
+ async compileEquirectangularShader() {
195
195
 
196
196
  if ( this._equirectMaterial === null ) {
197
197
 
198
198
  this._equirectMaterial = _getEquirectMaterial();
199
- this._compileMaterial( this._equirectMaterial );
199
+ await this._compileMaterial( this._equirectMaterial );
200
200
 
201
201
  }
202
202
 
@@ -316,12 +316,10 @@ class PMREMGenerator {
316
316
 
317
317
  }
318
318
 
319
- _compileMaterial( material ) {
319
+ async _compileMaterial( material ) {
320
320
 
321
- const tmpMesh = this._lodMeshes[ 0 ];
322
- tmpMesh.material = material;
323
-
324
- this._renderer.compile( tmpMesh, _flatCamera );
321
+ const tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );
322
+ await this._renderer.compile( tmpMesh, _flatCamera );
325
323
 
326
324
  }
327
325
 
@@ -2,7 +2,7 @@ import BindGroup from '../BindGroup.js';
2
2
 
3
3
  class NodeBuilderState {
4
4
 
5
- constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, instanceBindGroups = true, transforms = [] ) {
5
+ constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, monitor, transforms = [] ) {
6
6
 
7
7
  this.vertexShader = vertexShader;
8
8
  this.fragmentShader = fragmentShader;
@@ -16,7 +16,7 @@ class NodeBuilderState {
16
16
  this.updateBeforeNodes = updateBeforeNodes;
17
17
  this.updateAfterNodes = updateAfterNodes;
18
18
 
19
- this.instanceBindGroups = instanceBindGroups;
19
+ this.monitor = monitor;
20
20
 
21
21
  this.usedTimes = 0;
22
22
 
@@ -28,7 +28,7 @@ class NodeBuilderState {
28
28
 
29
29
  for ( const instanceGroup of this.bindings ) {
30
30
 
31
- const shared = this.instanceBindGroups && instanceGroup.bindings[ 0 ].groupNode.shared;
31
+ const shared = instanceGroup.bindings[ 0 ].groupNode.shared;
32
32
 
33
33
  if ( shared !== true ) {
34
34
 
@@ -3,9 +3,10 @@ import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
4
4
  import { cubeMapNode } from '../../../nodes/utils/CubeMapNode.js';
5
5
  import { NodeFrame } from '../../../nodes/Nodes.js';
6
- import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, normalWorld, pmremTexture, viewportUV } from '../../../nodes/TSL.js';
6
+ import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, normalWorld, pmremTexture, screenUV } from '../../../nodes/TSL.js';
7
7
 
8
- import { EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
8
+ import { CubeUVReflectionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
9
+ import { hashArray } from '../../../nodes/core/NodeUtils.js';
9
10
 
10
11
  const outputNodeMap = new WeakMap();
11
12
 
@@ -190,7 +191,7 @@ class Nodes extends DataMap {
190
191
  nodeBuilder.updateNodes,
191
192
  nodeBuilder.updateBeforeNodes,
192
193
  nodeBuilder.updateAfterNodes,
193
- nodeBuilder.instanceBindGroups,
194
+ nodeBuilder.monitor,
194
195
  nodeBuilder.transforms
195
196
  );
196
197
 
@@ -226,15 +227,17 @@ class Nodes extends DataMap {
226
227
  const environmentNode = this.getEnvironmentNode( scene );
227
228
  const fogNode = this.getFogNode( scene );
228
229
 
229
- const cacheKey = [];
230
+ const values = [];
230
231
 
231
- if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey( true ) );
232
- if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
233
- if ( fogNode ) cacheKey.push( fogNode.getCacheKey() );
232
+ if ( lightsNode ) values.push( lightsNode.getCacheKey( true ) );
233
+ if ( environmentNode ) values.push( environmentNode.getCacheKey() );
234
+ if ( fogNode ) values.push( fogNode.getCacheKey() );
235
+
236
+ values.push( this.renderer.shadowMap.enabled ? 1 : 0 );
234
237
 
235
238
  cacheKeyData = {
236
239
  callId,
237
- cacheKey: cacheKey.join( ',' )
240
+ cacheKey: hashArray( values )
238
241
  };
239
242
 
240
243
  this.callHashCache.set( chain, cacheKeyData );
@@ -272,9 +275,9 @@ class Nodes extends DataMap {
272
275
 
273
276
  let backgroundNode = null;
274
277
 
275
- if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
278
+ if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping || background.mapping === CubeUVReflectionMapping ) ) {
276
279
 
277
- if ( scene.backgroundBlurriness > 0 ) {
280
+ if ( scene.backgroundBlurriness > 0 || background.mapping === CubeUVReflectionMapping ) {
278
281
 
279
282
  backgroundNode = pmremTexture( background, normalWorld );
280
283
 
@@ -298,7 +301,7 @@ class Nodes extends DataMap {
298
301
 
299
302
  } else if ( background.isTexture === true ) {
300
303
 
301
- backgroundNode = texture( background, viewportUV.flipY() ).setUpdateMatrix( true );
304
+ backgroundNode = texture( background, screenUV.flipY() ).setUpdateMatrix( true );
302
305
 
303
306
  } else if ( background.isColor !== true ) {
304
307
 
@@ -334,11 +337,18 @@ class Nodes extends DataMap {
334
337
 
335
338
  if ( fog.isFogExp2 ) {
336
339
 
337
- fogNode = densityFog( reference( 'color', 'color', fog ), reference( 'density', 'float', fog ) );
340
+ const color = reference( 'color', 'color', fog ).setGroup( renderGroup );
341
+ const density = reference( 'density', 'float', fog ).setGroup( renderGroup );
342
+
343
+ fogNode = densityFog( color, density );
338
344
 
339
345
  } else if ( fog.isFog ) {
340
346
 
341
- fogNode = rangeFog( reference( 'color', 'color', fog ), reference( 'near', 'float', fog ), reference( 'far', 'float', fog ) );
347
+ const color = reference( 'color', 'color', fog ).setGroup( renderGroup );
348
+ const near = reference( 'near', 'float', fog ).setGroup( renderGroup );
349
+ const far = reference( 'far', 'float', fog ).setGroup( renderGroup );
350
+
351
+ fogNode = rangeFog( color, near, far );
342
352
 
343
353
  } else {
344
354
 
@@ -439,7 +449,7 @@ class Nodes extends DataMap {
439
449
  const renderer = this.renderer;
440
450
  const cacheKey = this.getOutputCacheKey();
441
451
 
442
- const output = texture( outputTexture, viewportUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
452
+ const output = texture( outputTexture, screenUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
443
453
 
444
454
  outputNodeMap.set( outputTexture, cacheKey );
445
455
 
@@ -501,6 +511,15 @@ class Nodes extends DataMap {
501
511
 
502
512
  }
503
513
 
514
+ needsRefresh( renderObject ) {
515
+
516
+ const nodeFrame = this.getNodeFrameForRender( renderObject );
517
+ const monitor = renderObject.getMonitor();
518
+
519
+ return monitor.needsRefresh( renderObject, nodeFrame );
520
+
521
+ }
522
+
504
523
  dispose() {
505
524
 
506
525
  super.dispose();
@@ -12,11 +12,9 @@ void main() {
12
12
 
13
13
  #include <uv_vertex>
14
14
 
15
- vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );
15
+ vec4 mvPosition = modelViewMatrix[ 3 ];
16
16
 
17
- vec2 scale;
18
- scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );
19
- scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );
17
+ vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );
20
18
 
21
19
  #ifndef USE_SIZEATTENUATION
22
20
 
@@ -76,40 +76,71 @@ function WebGLAttributes( gl ) {
76
76
  function updateBuffer( buffer, attribute, bufferType ) {
77
77
 
78
78
  const array = attribute.array;
79
- const updateRange = attribute._updateRange; // @deprecated, r159
80
79
  const updateRanges = attribute.updateRanges;
81
80
 
82
81
  gl.bindBuffer( bufferType, buffer );
83
82
 
84
- if ( updateRange.count === - 1 && updateRanges.length === 0 ) {
83
+ if ( updateRanges.length === 0 ) {
85
84
 
86
85
  // Not using update ranges
87
86
  gl.bufferSubData( bufferType, 0, array );
88
87
 
89
- }
88
+ } else {
90
89
 
91
- if ( updateRanges.length !== 0 ) {
90
+ // Before applying update ranges, we merge any adjacent / overlapping
91
+ // ranges to reduce load on `gl.bufferSubData`. Empirically, this has led
92
+ // to performance improvements for applications which make heavy use of
93
+ // update ranges. Likely due to GPU command overhead.
94
+ //
95
+ // Note that to reduce garbage collection between frames, we merge the
96
+ // update ranges in-place. This is safe because this method will clear the
97
+ // update ranges once updated.
92
98
 
93
- for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
99
+ updateRanges.sort( ( a, b ) => a.start - b.start );
100
+
101
+ // To merge the update ranges in-place, we work from left to right in the
102
+ // existing updateRanges array, merging ranges. This may result in a final
103
+ // array which is smaller than the original. This index tracks the last
104
+ // index representing a merged range, any data after this index can be
105
+ // trimmed once the merge algorithm is completed.
106
+ let mergeIndex = 0;
107
+
108
+ for ( let i = 1; i < updateRanges.length; i ++ ) {
94
109
 
110
+ const previousRange = updateRanges[ mergeIndex ];
95
111
  const range = updateRanges[ i ];
96
112
 
97
- gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
98
- array, range.start, range.count );
113
+ // We add one here to merge adjacent ranges. This is safe because ranges
114
+ // operate over positive integers.
115
+ if ( range.start <= previousRange.start + previousRange.count + 1 ) {
116
+
117
+ previousRange.count = Math.max(
118
+ previousRange.count,
119
+ range.start + range.count - previousRange.start
120
+ );
121
+
122
+ } else {
123
+
124
+ ++ mergeIndex;
125
+ updateRanges[ mergeIndex ] = range;
126
+
127
+ }
99
128
 
100
129
  }
101
130
 
102
- attribute.clearUpdateRanges();
131
+ // Trim the array to only contain the merged ranges.
132
+ updateRanges.length = mergeIndex + 1;
103
133
 
104
- }
134
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
135
+
136
+ const range = updateRanges[ i ];
105
137
 
106
- // @deprecated, r159
107
- if ( updateRange.count !== - 1 ) {
138
+ gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
139
+ array, range.start, range.count );
108
140
 
109
- gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
110
- array, updateRange.offset, updateRange.count );
141
+ }
111
142
 
112
- updateRange.count = - 1; // reset range
143
+ attribute.clearUpdateRanges();
113
144
 
114
145
  }
115
146
 
@@ -92,6 +92,14 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
92
92
  }
93
93
 
94
94
  const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
95
+ const reverseDepthBuffer = parameters.reverseDepthBuffer === true && extensions.has( 'EXT_clip_control' );
96
+
97
+ if ( reverseDepthBuffer === true ) {
98
+
99
+ const ext = extensions.get( 'EXT_clip_control' );
100
+ ext.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );
101
+
102
+ }
95
103
 
96
104
  const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
97
105
  const maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
@@ -119,6 +127,7 @@ function WebGLCapabilities( gl, extensions, parameters, utils ) {
119
127
 
120
128
  precision: precision,
121
129
  logarithmicDepthBuffer: logarithmicDepthBuffer,
130
+ reverseDepthBuffer: reverseDepthBuffer,
122
131
 
123
132
  maxTextures: maxTextures,
124
133
  maxVertexTextures: maxVertexTextures,
@@ -659,6 +659,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
659
659
  parameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',
660
660
 
661
661
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
662
+ parameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '',
662
663
 
663
664
  'uniform mat4 modelMatrix;',
664
665
  'uniform mat4 modelViewMatrix;',
@@ -824,6 +825,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
824
825
  parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
825
826
 
826
827
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
828
+ parameters.reverseDepthBuffer ? '#define USE_REVERSEDEPTHBUF' : '',
827
829
 
828
830
  'uniform mat4 viewMatrix;',
829
831
  'uniform vec3 cameraPosition;',