super-three 0.167.0 → 0.169.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.
Files changed (387) hide show
  1. package/build/three.cjs +532 -173
  2. package/build/three.module.js +532 -174
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +18173 -14266
  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 -4
  9. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  10. package/examples/jsm/capabilities/WebGL.js +27 -21
  11. package/examples/jsm/controls/ArcballControls.js +174 -158
  12. package/examples/jsm/controls/DragControls.js +260 -132
  13. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  14. package/examples/jsm/controls/FlyControls.js +194 -188
  15. package/examples/jsm/controls/OrbitControls.js +777 -786
  16. package/examples/jsm/controls/PointerLockControls.js +24 -15
  17. package/examples/jsm/controls/TrackballControls.js +469 -448
  18. package/examples/jsm/controls/TransformControls.js +97 -62
  19. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  20. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  21. package/examples/jsm/effects/StereoEffect.js +6 -1
  22. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  23. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  24. package/examples/jsm/exporters/EXRExporter.js +19 -11
  25. package/examples/jsm/exporters/GLTFExporter.js +6 -1
  26. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  27. package/examples/jsm/exporters/OBJExporter.js +5 -1
  28. package/examples/jsm/exporters/PLYExporter.js +9 -7
  29. package/examples/jsm/exporters/USDZExporter.js +29 -8
  30. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  31. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  32. package/examples/jsm/helpers/LightProbeHelper.js +43 -44
  33. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  34. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  35. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  36. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  37. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  38. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  39. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  40. package/examples/jsm/loaders/FBXLoader.js +30 -20
  41. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  42. package/examples/jsm/loaders/KTX2Loader.js +27 -12
  43. package/examples/jsm/loaders/MTLLoader.js +4 -3
  44. package/examples/jsm/loaders/MaterialXLoader.js +40 -14
  45. package/examples/jsm/loaders/OBJLoader.js +5 -3
  46. package/examples/jsm/loaders/PCDLoader.js +14 -13
  47. package/examples/jsm/loaders/PDBLoader.js +3 -2
  48. package/examples/jsm/loaders/PLYLoader.js +8 -5
  49. package/examples/jsm/loaders/STLLoader.js +3 -2
  50. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  51. package/examples/jsm/loaders/VTKLoader.js +4 -3
  52. package/examples/jsm/loaders/XYZLoader.js +3 -2
  53. package/examples/jsm/misc/Timer.js +1 -1
  54. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  55. package/examples/jsm/objects/LensflareMesh.js +322 -0
  56. package/examples/jsm/objects/SkyMesh.js +187 -0
  57. package/examples/jsm/objects/Water2Mesh.js +158 -0
  58. package/examples/jsm/objects/WaterMesh.js +101 -0
  59. package/examples/jsm/physics/JoltPhysics.js +1 -1
  60. package/examples/jsm/physics/RapierPhysics.js +21 -1
  61. package/examples/jsm/postprocessing/OutlinePass.js +31 -46
  62. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  63. package/examples/jsm/shaders/BleachBypassShader.js +1 -2
  64. package/examples/jsm/shaders/OutputShader.js +1 -1
  65. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  66. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  67. package/examples/jsm/transpiler/TSLEncoder.js +8 -8
  68. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  69. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  70. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  71. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  72. package/examples/jsm/utils/TextureUtils.js +2 -1
  73. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  74. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  75. package/package.json +3 -2
  76. package/src/Three.WebGPU.Nodes.js +200 -0
  77. package/src/Three.WebGPU.js +7 -0
  78. package/src/Three.js +1 -0
  79. package/src/audio/Audio.js +2 -2
  80. package/src/constants.js +1 -1
  81. package/src/core/BufferAttribute.js +0 -9
  82. package/src/core/Clock.js +1 -1
  83. package/src/core/InterleavedBuffer.js +0 -9
  84. package/src/extras/Controls.js +32 -0
  85. package/src/geometries/CylinderGeometry.js +11 -4
  86. package/src/loaders/MaterialLoader.js +7 -1
  87. package/src/loaders/ObjectLoader.js +3 -3
  88. package/src/{nodes/loaders → loaders/nodes}/NodeLoader.js +25 -5
  89. package/src/{nodes/loaders → loaders/nodes}/NodeMaterialLoader.js +21 -18
  90. package/src/{nodes/loaders → loaders/nodes}/NodeObjectLoader.js +19 -0
  91. package/src/materials/Material.js +4 -7
  92. package/src/materials/nodes/InstancedPointsNodeMaterial.js +156 -0
  93. package/src/{nodes/materials → materials/nodes}/Line2NodeMaterial.js +56 -59
  94. package/src/{nodes/materials → materials/nodes}/LineBasicNodeMaterial.js +8 -5
  95. package/src/{nodes/materials → materials/nodes}/LineDashedNodeMaterial.js +12 -10
  96. package/src/{nodes/materials → materials/nodes}/MeshBasicNodeMaterial.js +16 -12
  97. package/src/{nodes/materials → materials/nodes}/MeshLambertNodeMaterial.js +10 -6
  98. package/src/{nodes/materials → materials/nodes}/MeshMatcapNodeMaterial.js +13 -9
  99. package/src/{nodes/materials → materials/nodes}/MeshNormalNodeMaterial.js +13 -9
  100. package/src/{nodes/materials → materials/nodes}/MeshPhongNodeMaterial.js +14 -9
  101. package/src/{nodes/materials → materials/nodes}/MeshPhysicalNodeMaterial.js +22 -18
  102. package/src/{nodes/materials → materials/nodes}/MeshSSSNodeMaterial.js +10 -7
  103. package/src/{nodes/materials → materials/nodes}/MeshStandardNodeMaterial.js +22 -12
  104. package/src/{nodes/materials → materials/nodes}/MeshToonNodeMaterial.js +9 -5
  105. package/src/{nodes/materials → materials/nodes}/NodeMaterial.js +71 -115
  106. package/src/{nodes/materials/Materials.js → materials/nodes/NodeMaterials.js} +3 -1
  107. package/src/{nodes/materials → materials/nodes}/PointsNodeMaterial.js +8 -5
  108. package/src/{nodes/materials → materials/nodes}/ShadowNodeMaterial.js +9 -5
  109. package/src/{nodes/materials → materials/nodes}/SpriteNodeMaterial.js +47 -14
  110. package/src/{nodes/materials → materials/nodes}/VolumeNodeMaterial.js +24 -22
  111. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  112. package/src/math/Triangle.js +24 -0
  113. package/src/nodes/Nodes.js +103 -159
  114. package/src/nodes/TSL.js +179 -0
  115. package/src/nodes/accessors/AccessorsUtils.js +8 -8
  116. package/src/nodes/accessors/BatchNode.js +53 -21
  117. package/src/nodes/accessors/{BitangentNode.js → Bitangent.js} +9 -9
  118. package/src/nodes/accessors/BufferAttributeNode.js +8 -5
  119. package/src/nodes/accessors/BufferNode.js +7 -4
  120. package/src/nodes/accessors/Camera.js +13 -0
  121. package/src/nodes/accessors/ClippingNode.js +19 -13
  122. package/src/nodes/accessors/CubeTextureNode.js +9 -8
  123. package/src/nodes/accessors/InstanceNode.js +19 -15
  124. package/src/nodes/accessors/InstancedPointsMaterialNode.js +8 -5
  125. package/src/nodes/accessors/Lights.js +51 -0
  126. package/src/nodes/accessors/MaterialNode.js +56 -55
  127. package/src/nodes/accessors/MaterialProperties.js +3 -0
  128. package/src/nodes/accessors/MaterialReferenceNode.js +9 -4
  129. package/src/nodes/accessors/ModelNode.js +47 -12
  130. package/src/nodes/accessors/ModelViewProjectionNode.js +12 -9
  131. package/src/nodes/accessors/MorphNode.js +17 -13
  132. package/src/nodes/accessors/Normal.js +88 -0
  133. package/src/nodes/accessors/Object3DNode.js +17 -33
  134. package/src/nodes/accessors/PointUVNode.js +9 -5
  135. package/src/nodes/accessors/Position.js +10 -0
  136. package/src/nodes/accessors/ReferenceBaseNode.js +171 -0
  137. package/src/nodes/accessors/ReferenceNode.js +50 -7
  138. package/src/nodes/accessors/ReflectVector.js +10 -0
  139. package/src/nodes/accessors/RendererReferenceNode.js +12 -6
  140. package/src/nodes/accessors/SceneNode.js +9 -6
  141. package/src/nodes/accessors/SkinningNode.js +88 -21
  142. package/src/nodes/accessors/StorageBufferNode.js +22 -5
  143. package/src/nodes/accessors/StorageTextureNode.js +9 -6
  144. package/src/nodes/accessors/Tangent.js +22 -0
  145. package/src/nodes/accessors/Texture3DNode.js +16 -13
  146. package/src/nodes/accessors/{TextureBicubicNode.js → TextureBicubic.js} +3 -32
  147. package/src/nodes/accessors/TextureNode.js +29 -23
  148. package/src/nodes/accessors/TextureSizeNode.js +10 -9
  149. package/src/nodes/accessors/{UniformsNode.js → UniformArrayNode.js} +26 -14
  150. package/src/nodes/accessors/UserDataNode.js +10 -7
  151. package/src/nodes/accessors/VelocityNode.js +134 -0
  152. package/src/nodes/accessors/VertexColorNode.js +7 -4
  153. package/src/nodes/code/CodeNode.js +9 -5
  154. package/src/nodes/code/ExpressionNode.js +10 -6
  155. package/src/nodes/code/FunctionCallNode.js +8 -5
  156. package/src/nodes/code/FunctionNode.js +8 -23
  157. package/src/nodes/code/ScriptableNode.js +13 -10
  158. package/src/nodes/code/ScriptableValueNode.js +9 -7
  159. package/src/nodes/core/AssignNode.js +12 -9
  160. package/src/nodes/core/AttributeNode.js +12 -21
  161. package/src/nodes/core/BypassNode.js +11 -7
  162. package/src/nodes/core/CacheNode.js +10 -6
  163. package/src/nodes/core/ConstNode.js +6 -3
  164. package/src/nodes/core/ContextNode.js +21 -11
  165. package/src/nodes/core/IndexNode.js +35 -8
  166. package/src/nodes/core/InputNode.js +7 -3
  167. package/src/nodes/core/MRTNode.js +16 -7
  168. package/src/nodes/core/Node.js +19 -40
  169. package/src/nodes/core/NodeBuilder.js +117 -38
  170. package/src/nodes/core/NodeUtils.js +49 -6
  171. package/src/nodes/core/OutputStructNode.js +10 -6
  172. package/src/nodes/core/ParameterNode.js +7 -4
  173. package/src/nodes/core/PropertyNode.js +36 -32
  174. package/src/nodes/core/StackNode.js +31 -11
  175. package/src/nodes/core/StructTypeNode.js +7 -3
  176. package/src/nodes/core/TempNode.js +8 -4
  177. package/src/nodes/core/UniformGroupNode.js +14 -11
  178. package/src/nodes/core/UniformNode.js +7 -4
  179. package/src/nodes/core/VarNode.js +12 -8
  180. package/src/nodes/core/VaryingNode.js +10 -6
  181. package/src/nodes/display/AfterImageNode.js +15 -9
  182. package/src/nodes/display/AnaglyphPassNode.js +67 -0
  183. package/src/nodes/display/AnamorphicNode.js +17 -11
  184. package/src/nodes/display/BleachBypass.js +26 -0
  185. package/src/nodes/display/BlendMode.js +54 -0
  186. package/src/nodes/display/BloomNode.js +27 -19
  187. package/src/nodes/display/BumpMapNode.js +13 -12
  188. package/src/nodes/display/ColorAdjustment.js +46 -0
  189. package/src/nodes/display/ColorSpaceFunctions.js +38 -0
  190. package/src/nodes/display/ColorSpaceNode.js +67 -61
  191. package/src/nodes/display/DenoiseNode.js +23 -17
  192. package/src/nodes/display/DepthOfFieldNode.js +12 -7
  193. package/src/nodes/display/DotScreenNode.js +13 -22
  194. package/src/nodes/display/FXAANode.js +21 -16
  195. package/src/nodes/display/FilmNode.js +11 -7
  196. package/src/nodes/display/FrontFacingNode.js +10 -6
  197. package/src/nodes/display/GTAONode.js +22 -15
  198. package/src/nodes/display/GaussianBlurNode.js +14 -8
  199. package/src/nodes/display/Lut3DNode.js +10 -6
  200. package/src/nodes/display/MotionBlur.js +25 -0
  201. package/src/nodes/display/NormalMapNode.js +13 -13
  202. package/src/nodes/display/ParallaxBarrierPassNode.js +58 -0
  203. package/src/nodes/display/PassNode.js +95 -8
  204. package/src/nodes/display/PixelationPassNode.js +20 -8
  205. package/src/nodes/display/PosterizeNode.js +8 -7
  206. package/src/nodes/display/RGBShiftNode.js +11 -7
  207. package/src/nodes/display/RenderOutputNode.js +15 -11
  208. package/src/nodes/display/SSAAPassNode.js +287 -0
  209. package/src/nodes/display/ScreenNode.js +181 -0
  210. package/src/nodes/display/Sepia.js +17 -0
  211. package/src/nodes/display/SobelOperatorNode.js +13 -8
  212. package/src/nodes/display/StereoCompositePassNode.js +110 -0
  213. package/src/nodes/display/StereoPassNode.js +83 -0
  214. package/src/nodes/display/ToneMappingFunctions.js +190 -0
  215. package/src/nodes/display/ToneMappingNode.js +15 -175
  216. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  217. package/src/nodes/display/TransitionNode.js +12 -8
  218. package/src/nodes/display/ViewportDepthNode.js +34 -29
  219. package/src/nodes/display/ViewportDepthTextureNode.js +10 -9
  220. package/src/nodes/display/ViewportSharedTextureNode.js +10 -9
  221. package/src/nodes/display/ViewportTextureNode.js +11 -11
  222. package/src/nodes/fog/FogExp2Node.js +8 -7
  223. package/src/nodes/fog/FogNode.js +10 -8
  224. package/src/nodes/fog/FogRangeNode.js +8 -7
  225. package/src/nodes/functions/BSDF/BRDF_GGX.js +4 -4
  226. package/src/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  227. package/src/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  228. package/src/nodes/functions/BSDF/DFGApprox.js +2 -2
  229. package/src/nodes/functions/BSDF/D_GGX.js +2 -2
  230. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
  231. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  232. package/src/nodes/functions/BSDF/F_Schlick.js +2 -2
  233. package/src/nodes/functions/BSDF/LTC.js +6 -6
  234. package/src/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  235. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  236. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  237. package/src/nodes/functions/BasicLightingModel.js +1 -1
  238. package/src/nodes/functions/PhongLightingModel.js +5 -5
  239. package/src/nodes/functions/PhysicalLightingModel.js +34 -33
  240. package/src/nodes/functions/ShadowMaskModel.js +1 -1
  241. package/src/nodes/functions/ToonLightingModel.js +3 -3
  242. package/src/nodes/functions/material/getGeometryRoughness.js +4 -4
  243. package/src/nodes/functions/material/getRoughness.js +2 -2
  244. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  245. package/src/nodes/geometry/RangeNode.js +9 -5
  246. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  247. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  248. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  249. package/src/nodes/gpgpu/ComputeNode.js +10 -6
  250. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  251. package/src/nodes/lighting/AONode.js +6 -3
  252. package/src/nodes/lighting/AmbientLightNode.js +6 -8
  253. package/src/nodes/lighting/AnalyticLightNode.js +225 -36
  254. package/src/nodes/lighting/BasicEnvironmentNode.js +8 -4
  255. package/src/nodes/lighting/BasicLightMapNode.js +7 -4
  256. package/src/nodes/lighting/DirectionalLightNode.js +7 -9
  257. package/src/nodes/lighting/EnvironmentNode.js +23 -19
  258. package/src/nodes/lighting/HemisphereLightNode.js +11 -11
  259. package/src/nodes/lighting/IESSpotLightNode.js +7 -9
  260. package/src/nodes/lighting/IrradianceNode.js +6 -3
  261. package/src/nodes/lighting/LightProbeNode.js +53 -0
  262. package/src/nodes/lighting/LightUtils.js +3 -3
  263. package/src/nodes/lighting/LightingContextNode.js +19 -18
  264. package/src/nodes/lighting/LightingNode.js +7 -3
  265. package/src/nodes/lighting/LightsNode.js +112 -75
  266. package/src/nodes/lighting/PointLightNode.js +12 -13
  267. package/src/nodes/lighting/RectAreaLightNode.js +11 -11
  268. package/src/nodes/lighting/SpotLightNode.js +14 -16
  269. package/src/nodes/materialx/MaterialXNodes.js +2 -2
  270. package/src/nodes/materialx/lib/mx_hsv.js +36 -31
  271. package/src/nodes/materialx/lib/mx_noise.js +96 -96
  272. package/src/nodes/materialx/lib/mx_transform_color.js +2 -2
  273. package/src/nodes/math/{CondNode.js → ConditionalNode.js} +38 -10
  274. package/src/nodes/math/Hash.js +13 -0
  275. package/src/nodes/math/MathNode.js +127 -124
  276. package/src/nodes/math/MathUtils.js +0 -7
  277. package/src/nodes/math/OperatorNode.js +97 -52
  278. package/src/nodes/math/TriNoise3D.js +19 -29
  279. package/src/nodes/pmrem/PMREMNode.js +61 -15
  280. package/src/nodes/pmrem/PMREMUtils.js +46 -46
  281. package/src/nodes/procedural/Checker.js +14 -0
  282. package/src/nodes/tsl/TSLBase.js +30 -0
  283. package/src/nodes/{shadernode/ShaderNode.js → tsl/TSLCore.js} +105 -97
  284. package/src/nodes/utils/ArrayElementNode.js +8 -4
  285. package/src/nodes/utils/ConvertNode.js +7 -3
  286. package/src/nodes/utils/CubeMapNode.js +160 -0
  287. package/src/nodes/utils/Discard.js +8 -0
  288. package/src/nodes/utils/EquirectUVNode.js +9 -6
  289. package/src/nodes/utils/FlipNode.js +68 -0
  290. package/src/nodes/utils/FunctionOverloadingNode.js +9 -5
  291. package/src/nodes/utils/JoinNode.js +6 -3
  292. package/src/nodes/utils/LoopNode.js +16 -6
  293. package/src/nodes/utils/MatcapUVNode.js +10 -7
  294. package/src/nodes/utils/MaxMipLevelNode.js +8 -5
  295. package/src/nodes/utils/OscNode.js +12 -8
  296. package/src/nodes/utils/Packing.js +4 -0
  297. package/src/nodes/utils/RTTNode.js +11 -8
  298. package/src/nodes/utils/ReflectorNode.js +12 -4
  299. package/src/nodes/utils/RemapNode.js +12 -8
  300. package/src/nodes/utils/RotateNode.js +8 -13
  301. package/src/nodes/utils/SetNode.js +7 -4
  302. package/src/nodes/utils/SplitNode.js +7 -3
  303. package/src/nodes/utils/SpriteSheetUVNode.js +10 -6
  304. package/src/nodes/utils/SpriteUtils.js +47 -0
  305. package/src/nodes/utils/StorageArrayElementNode.js +11 -12
  306. package/src/nodes/utils/TimerNode.js +8 -5
  307. package/src/nodes/utils/TriplanarTexturesNode.js +11 -9
  308. package/src/nodes/utils/UVUtils.js +19 -0
  309. package/src/nodes/utils/ViewportUtils.js +14 -0
  310. package/src/objects/BatchedMesh.js +78 -13
  311. package/src/objects/LOD.js +21 -0
  312. package/src/objects/Line.js +1 -0
  313. package/src/objects/Mesh.js +7 -23
  314. package/src/objects/Points.js +2 -0
  315. package/src/renderers/WebGLRenderer.js +88 -41
  316. package/src/renderers/common/Backend.js +2 -2
  317. package/src/renderers/common/Background.js +3 -1
  318. package/src/renderers/common/BindGroup.js +3 -1
  319. package/src/renderers/common/Bindings.js +13 -15
  320. package/src/renderers/common/BundleGroup.js +26 -0
  321. package/src/renderers/common/ClippingContext.js +15 -5
  322. package/src/renderers/common/CubeRenderTarget.js +9 -3
  323. package/src/renderers/common/PostProcessing.js +4 -1
  324. package/src/renderers/common/QuadMesh.js +2 -0
  325. package/src/renderers/common/RenderContext.js +23 -0
  326. package/src/renderers/common/RenderList.js +1 -1
  327. package/src/renderers/common/RenderObject.js +117 -6
  328. package/src/renderers/common/RenderObjects.js +8 -1
  329. package/src/renderers/common/Renderer.js +128 -94
  330. package/src/renderers/common/SampledTexture.js +12 -3
  331. package/src/renderers/common/Textures.js +8 -12
  332. package/src/renderers/common/extras/PMREMGenerator.js +19 -22
  333. package/src/renderers/common/nodes/NodeBuilderState.js +4 -4
  334. package/src/renderers/common/nodes/NodeLibrary.js +118 -0
  335. package/src/renderers/common/nodes/NodeSampledTexture.js +2 -2
  336. package/src/renderers/common/nodes/Nodes.js +65 -19
  337. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
  338. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  339. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  340. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  341. package/src/renderers/webgl/WebGLProgram.js +3 -1
  342. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  343. package/src/renderers/webgl/WebGLProperties.js +7 -0
  344. package/src/renderers/webgl/WebGLState.js +21 -0
  345. package/src/renderers/webgl/WebGLTextures.js +83 -4
  346. package/src/renderers/webgl-fallback/WebGLBackend.js +135 -110
  347. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +60 -12
  348. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  349. package/src/renderers/webgl-fallback/utils/WebGLState.js +20 -2
  350. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +89 -37
  351. package/src/renderers/webgpu/WebGPUBackend.js +112 -86
  352. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  353. package/src/renderers/webgpu/WebGPURenderer.js +9 -6
  354. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  355. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +105 -0
  356. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +189 -73
  357. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  358. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +45 -21
  359. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -1
  360. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +7 -16
  361. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
  362. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +43 -26
  363. package/src/renderers/webgpu/utils/WebGPUUtils.js +19 -2
  364. package/src/renderers/webxr/WebXRManager.js +32 -25
  365. package/src/utils.js +33 -1
  366. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  367. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  368. package/examples/jsm/loaders/TiltLoader.js +0 -520
  369. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  370. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  371. package/src/nodes/accessors/CameraNode.js +0 -19
  372. package/src/nodes/accessors/NormalNode.js +0 -14
  373. package/src/nodes/accessors/PositionNode.js +0 -10
  374. package/src/nodes/accessors/ReflectVectorNode.js +0 -10
  375. package/src/nodes/accessors/TangentNode.js +0 -23
  376. package/src/nodes/core/NodeKeywords.js +0 -80
  377. package/src/nodes/display/BlendModeNode.js +0 -128
  378. package/src/nodes/display/ColorAdjustmentNode.js +0 -104
  379. package/src/nodes/display/ViewportNode.js +0 -137
  380. package/src/nodes/lighting/LightNode.js +0 -57
  381. package/src/nodes/materials/InstancedPointsNodeMaterial.js +0 -162
  382. package/src/nodes/math/HashNode.js +0 -34
  383. package/src/nodes/procedural/CheckerNode.js +0 -42
  384. package/src/nodes/utils/DiscardNode.js +0 -28
  385. package/src/nodes/utils/PackingNode.js +0 -55
  386. package/src/nodes/utils/RotateUVNode.js +0 -35
  387. /package/src/nodes/accessors/{UVNode.js → UV.js} +0 -0
@@ -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,11 +28,11 @@ 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
 
35
- const bindingsGroup = new BindGroup( instanceGroup.name );
35
+ const bindingsGroup = new BindGroup( instanceGroup.name, [], instanceGroup.index, instanceGroup );
36
36
  bindings.push( bindingsGroup );
37
37
 
38
38
  for ( const instanceBinding of instanceGroup.bindings ) {
@@ -0,0 +1,118 @@
1
+ class NodeLibrary {
2
+
3
+ constructor() {
4
+
5
+ this.lightNodes = new WeakMap();
6
+ this.materialNodes = new Map();
7
+ this.toneMappingNodes = new Map();
8
+ this.colorSpaceNodes = new Map();
9
+
10
+ }
11
+
12
+ fromMaterial( material ) {
13
+
14
+ if ( material.isNodeMaterial ) return material;
15
+
16
+ let nodeMaterial = null;
17
+
18
+ const nodeMaterialClass = this.getMaterialNodeClass( material.type );
19
+
20
+ if ( nodeMaterialClass !== null ) {
21
+
22
+ nodeMaterial = new nodeMaterialClass();
23
+
24
+ for ( const key in material ) {
25
+
26
+ nodeMaterial[ key ] = material[ key ];
27
+
28
+ }
29
+
30
+ }
31
+
32
+ return nodeMaterial;
33
+
34
+ }
35
+
36
+ addColorSpace( colorSpaceNode, colorSpace ) {
37
+
38
+ this.addType( colorSpaceNode, colorSpace, this.colorSpaceNodes );
39
+
40
+ }
41
+
42
+ getColorSpaceFunction( colorSpace ) {
43
+
44
+ return this.colorSpaceNodes.get( colorSpace ) || null;
45
+
46
+ }
47
+
48
+ addToneMapping( toneMappingNode, toneMapping ) {
49
+
50
+ this.addType( toneMappingNode, toneMapping, this.toneMappingNodes );
51
+
52
+ }
53
+
54
+ getToneMappingFunction( toneMapping ) {
55
+
56
+ return this.toneMappingNodes.get( toneMapping ) || null;
57
+
58
+ }
59
+
60
+ getMaterialNodeClass( materialType ) {
61
+
62
+ return this.materialNodes.get( materialType ) || null;
63
+
64
+ }
65
+
66
+ addMaterial( materialNodeClass, materialClass ) {
67
+
68
+ this.addType( materialNodeClass, materialClass.name, this.materialNodes );
69
+
70
+ }
71
+
72
+ getLightNodeClass( light ) {
73
+
74
+ return this.lightNodes.get( light ) || null;
75
+
76
+ }
77
+
78
+ addLight( lightNodeClass, lightClass ) {
79
+
80
+ this.addClass( lightNodeClass, lightClass, this.lightNodes );
81
+
82
+ }
83
+
84
+ addType( nodeClass, type, library ) {
85
+
86
+ if ( library.has( type ) ) {
87
+
88
+ console.warn( `Redefinition of node ${ type }` );
89
+ return;
90
+
91
+ }
92
+
93
+ if ( typeof nodeClass !== 'function' ) throw new Error( `Node class ${ nodeClass.name } is not a class.` );
94
+ if ( typeof type === 'function' || typeof type === 'object' ) throw new Error( `Base class ${ type } is not a class.` );
95
+
96
+ library.set( type, nodeClass );
97
+
98
+ }
99
+
100
+ addClass( nodeClass, baseClass, library ) {
101
+
102
+ if ( library.has( baseClass ) ) {
103
+
104
+ console.warn( `Redefinition of node ${ baseClass.name }` );
105
+ return;
106
+
107
+ }
108
+
109
+ if ( typeof nodeClass !== 'function' ) throw new Error( `Node class ${ nodeClass.name } is not a class.` );
110
+ if ( typeof baseClass !== 'function' ) throw new Error( `Base class ${ baseClass.name } is not a class.` );
111
+
112
+ library.set( baseClass, nodeClass );
113
+
114
+ }
115
+
116
+ }
117
+
118
+ export default NodeLibrary;
@@ -13,9 +13,9 @@ class NodeSampledTexture extends SampledTexture {
13
13
 
14
14
  }
15
15
 
16
- get needsBindingsUpdate() {
16
+ needsBindingsUpdate( generation ) {
17
17
 
18
- return this.textureNode.value !== this.texture || super.needsBindingsUpdate;
18
+ return this.textureNode.value !== this.texture || super.needsBindingsUpdate( generation );
19
19
 
20
20
  }
21
21
 
@@ -1,9 +1,12 @@
1
1
  import DataMap from '../DataMap.js';
2
2
  import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
4
- import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
4
+ import { cubeMapNode } from '../../../nodes/utils/CubeMapNode.js';
5
+ import { NodeFrame } from '../../../nodes/Nodes.js';
6
+ import { objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, normalWorld, pmremTexture, screenUV } from '../../../nodes/TSL.js';
5
7
 
6
- import { EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
8
+ import { CubeUVReflectionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
9
+ import { hashArray } from '../../../nodes/core/NodeUtils.js';
7
10
 
8
11
  const outputNodeMap = new WeakMap();
9
12
 
@@ -188,7 +191,7 @@ class Nodes extends DataMap {
188
191
  nodeBuilder.updateNodes,
189
192
  nodeBuilder.updateBeforeNodes,
190
193
  nodeBuilder.updateAfterNodes,
191
- nodeBuilder.instanceBindGroups,
194
+ nodeBuilder.monitor,
192
195
  nodeBuilder.transforms
193
196
  );
194
197
 
@@ -224,15 +227,17 @@ class Nodes extends DataMap {
224
227
  const environmentNode = this.getEnvironmentNode( scene );
225
228
  const fogNode = this.getFogNode( scene );
226
229
 
227
- const cacheKey = [];
230
+ const values = [];
228
231
 
229
- if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey( true ) );
230
- if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
231
- 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 );
232
237
 
233
238
  cacheKeyData = {
234
239
  callId,
235
- cacheKey: cacheKey.join( ',' )
240
+ cacheKey: hashArray( values )
236
241
  };
237
242
 
238
243
  this.callHashCache.set( chain, cacheKeyData );
@@ -264,17 +269,39 @@ class Nodes extends DataMap {
264
269
 
265
270
  if ( background ) {
266
271
 
267
- if ( sceneData.background !== background ) {
272
+ const forceUpdate = ( scene.backgroundBlurriness === 0 && sceneData.backgroundBlurriness > 0 ) || ( scene.backgroundBlurriness > 0 && sceneData.backgroundBlurriness === 0 );
273
+
274
+ if ( sceneData.background !== background || forceUpdate ) {
268
275
 
269
276
  let backgroundNode = null;
270
277
 
271
- if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
278
+ if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping || background.mapping === CubeUVReflectionMapping ) ) {
279
+
280
+ if ( scene.backgroundBlurriness > 0 || background.mapping === CubeUVReflectionMapping ) {
281
+
282
+ backgroundNode = pmremTexture( background, normalWorld );
283
+
284
+ } else {
285
+
286
+ let envMap;
287
+
288
+ if ( background.isCubeTexture === true ) {
289
+
290
+ envMap = cubeTexture( background );
291
+
292
+ } else {
293
+
294
+ envMap = texture( background );
295
+
296
+ }
297
+
298
+ backgroundNode = cubeMapNode( envMap );
272
299
 
273
- backgroundNode = pmremTexture( background, normalWorld );
300
+ }
274
301
 
275
302
  } else if ( background.isTexture === true ) {
276
303
 
277
- backgroundNode = texture( background, viewportBottomLeft ).setUpdateMatrix( true );
304
+ backgroundNode = texture( background, screenUV.flipY() ).setUpdateMatrix( true );
278
305
 
279
306
  } else if ( background.isColor !== true ) {
280
307
 
@@ -284,6 +311,7 @@ class Nodes extends DataMap {
284
311
 
285
312
  sceneData.backgroundNode = backgroundNode;
286
313
  sceneData.background = background;
314
+ sceneData.backgroundBlurriness = scene.backgroundBlurriness;
287
315
 
288
316
  }
289
317
 
@@ -309,11 +337,18 @@ class Nodes extends DataMap {
309
337
 
310
338
  if ( fog.isFogExp2 ) {
311
339
 
312
- 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 );
313
344
 
314
345
  } else if ( fog.isFog ) {
315
346
 
316
- 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 );
317
352
 
318
353
  } else {
319
354
 
@@ -414,7 +449,7 @@ class Nodes extends DataMap {
414
449
  const renderer = this.renderer;
415
450
  const cacheKey = this.getOutputCacheKey();
416
451
 
417
- const output = texture( outputTexture, viewportTopLeft ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
452
+ const output = texture( outputTexture, screenUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );
418
453
 
419
454
  outputNodeMap.set( outputTexture, cacheKey );
420
455
 
@@ -424,12 +459,13 @@ class Nodes extends DataMap {
424
459
 
425
460
  updateBefore( renderObject ) {
426
461
 
427
- const nodeFrame = this.getNodeFrameForRender( renderObject );
428
462
  const nodeBuilder = renderObject.getNodeBuilderState();
429
463
 
430
464
  for ( const node of nodeBuilder.updateBeforeNodes ) {
431
465
 
432
- nodeFrame.updateBeforeNode( node );
466
+ // update frame state for each node
467
+
468
+ this.getNodeFrameForRender( renderObject ).updateBeforeNode( node );
433
469
 
434
470
  }
435
471
 
@@ -437,12 +473,13 @@ class Nodes extends DataMap {
437
473
 
438
474
  updateAfter( renderObject ) {
439
475
 
440
- const nodeFrame = this.getNodeFrameForRender( renderObject );
441
476
  const nodeBuilder = renderObject.getNodeBuilderState();
442
477
 
443
478
  for ( const node of nodeBuilder.updateAfterNodes ) {
444
479
 
445
- nodeFrame.updateAfterNode( node );
480
+ // update frame state for each node
481
+
482
+ this.getNodeFrameForRender( renderObject ).updateAfterNode( node );
446
483
 
447
484
  }
448
485
 
@@ -474,6 +511,15 @@ class Nodes extends DataMap {
474
511
 
475
512
  }
476
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
+
477
523
  dispose() {
478
524
 
479
525
  super.dispose();
@@ -22,9 +22,9 @@ vec3 ReinhardToneMapping( vec3 color ) {
22
22
  }
23
23
 
24
24
  // source: http://filmicworlds.com/blog/filmic-tonemapping-operators/
25
- vec3 OptimizedCineonToneMapping( vec3 color ) {
25
+ vec3 CineonToneMapping( vec3 color ) {
26
26
 
27
- // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson
27
+ // filmic operator by Jim Hejl and Richard Burgess-Dawson
28
28
  color *= toneMappingExposure;
29
29
  color = max( vec3( 0.0 ), color - 0.004 );
30
30
  return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );
@@ -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,
@@ -114,7 +114,7 @@ function getToneMappingFunction( functionName, toneMapping ) {
114
114
  break;
115
115
 
116
116
  case CineonToneMapping:
117
- toneMappingName = 'OptimizedCineon';
117
+ toneMappingName = 'Cineon';
118
118
  break;
119
119
 
120
120
  case ACESFilmicToneMapping:
@@ -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;',
@@ -14,6 +14,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
14
14
  const programs = [];
15
15
 
16
16
  const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
17
+ const reverseDepthBuffer = capabilities.reverseDepthBuffer;
17
18
  const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
18
19
 
19
20
  let precision = capabilities.precision;
@@ -308,6 +309,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
308
309
 
309
310
  sizeAttenuation: material.sizeAttenuation === true,
310
311
  logarithmicDepthBuffer: logarithmicDepthBuffer,
312
+ reverseDepthBuffer: reverseDepthBuffer,
311
313
 
312
314
  skinning: object.isSkinnedMesh === true,
313
315
 
@@ -527,40 +529,42 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
527
529
  _programLayers.enable( 2 );
528
530
  if ( parameters.logarithmicDepthBuffer )
529
531
  _programLayers.enable( 3 );
530
- if ( parameters.skinning )
532
+ if ( parameters.reverseDepthBuffer )
531
533
  _programLayers.enable( 4 );
532
- if ( parameters.morphTargets )
534
+ if ( parameters.skinning )
533
535
  _programLayers.enable( 5 );
534
- if ( parameters.morphNormals )
536
+ if ( parameters.morphTargets )
535
537
  _programLayers.enable( 6 );
536
- if ( parameters.morphColors )
538
+ if ( parameters.morphNormals )
537
539
  _programLayers.enable( 7 );
538
- if ( parameters.premultipliedAlpha )
540
+ if ( parameters.morphColors )
539
541
  _programLayers.enable( 8 );
540
- if ( parameters.shadowMapEnabled )
542
+ if ( parameters.premultipliedAlpha )
541
543
  _programLayers.enable( 9 );
542
- if ( parameters.doubleSided )
544
+ if ( parameters.shadowMapEnabled )
543
545
  _programLayers.enable( 10 );
544
- if ( parameters.flipSided )
546
+ if ( parameters.doubleSided )
545
547
  _programLayers.enable( 11 );
546
- if ( parameters.useDepthPacking )
548
+ if ( parameters.flipSided )
547
549
  _programLayers.enable( 12 );
548
- if ( parameters.dithering )
550
+ if ( parameters.useDepthPacking )
549
551
  _programLayers.enable( 13 );
550
- if ( parameters.transmission )
552
+ if ( parameters.dithering )
551
553
  _programLayers.enable( 14 );
552
- if ( parameters.sheen )
554
+ if ( parameters.transmission )
553
555
  _programLayers.enable( 15 );
554
- if ( parameters.opaque )
556
+ if ( parameters.sheen )
555
557
  _programLayers.enable( 16 );
556
- if ( parameters.pointsUvs )
558
+ if ( parameters.opaque )
557
559
  _programLayers.enable( 17 );
558
- if ( parameters.decodeVideoTexture )
560
+ if ( parameters.pointsUvs )
559
561
  _programLayers.enable( 18 );
560
- if ( parameters.alphaToCoverage )
562
+ if ( parameters.decodeVideoTexture )
561
563
  _programLayers.enable( 19 );
562
- if ( parameters.numMultiviewViews )
564
+ if ( parameters.alphaToCoverage )
563
565
  _programLayers.enable( 20 );
566
+ if ( parameters.numMultiviewViews )
567
+ _programLayers.enable( 21 );
564
568
 
565
569
  array.push( _programLayers.mask );
566
570
 
@@ -2,6 +2,12 @@ function WebGLProperties() {
2
2
 
3
3
  let properties = new WeakMap();
4
4
 
5
+ function has( object ) {
6
+
7
+ return properties.has( object );
8
+
9
+ }
10
+
5
11
  function get( object ) {
6
12
 
7
13
  let map = properties.get( object );
@@ -36,6 +42,7 @@ function WebGLProperties() {
36
42
  }
37
43
 
38
44
  return {
45
+ has: has,
39
46
  get: get,
40
47
  remove: remove,
41
48
  update: update,
@@ -2,6 +2,18 @@ import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDe
2
2
  import { Color } from '../../math/Color.js';
3
3
  import { Vector4 } from '../../math/Vector4.js';
4
4
 
5
+ const reversedFuncs = {
6
+ [ NeverDepth ]: AlwaysDepth,
7
+ [ LessDepth ]: GreaterDepth,
8
+ [ EqualDepth ]: NotEqualDepth,
9
+ [ LessEqualDepth ]: GreaterEqualDepth,
10
+
11
+ [ AlwaysDepth ]: NeverDepth,
12
+ [ GreaterDepth ]: LessDepth,
13
+ [ NotEqualDepth ]: EqualDepth,
14
+ [ GreaterEqualDepth ]: LessEqualDepth,
15
+ };
16
+
5
17
  function WebGLState( gl ) {
6
18
 
7
19
  function ColorBuffer() {
@@ -66,6 +78,7 @@ function WebGLState( gl ) {
66
78
  function DepthBuffer() {
67
79
 
68
80
  let locked = false;
81
+ let reversed = false;
69
82
 
70
83
  let currentDepthMask = null;
71
84
  let currentDepthFunc = null;
@@ -73,6 +86,12 @@ function WebGLState( gl ) {
73
86
 
74
87
  return {
75
88
 
89
+ setReversed: function ( value ) {
90
+
91
+ reversed = value;
92
+
93
+ },
94
+
76
95
  setTest: function ( depthTest ) {
77
96
 
78
97
  if ( depthTest ) {
@@ -100,6 +119,8 @@ function WebGLState( gl ) {
100
119
 
101
120
  setFunc: function ( depthFunc ) {
102
121
 
122
+ if ( reversed ) depthFunc = reversedFuncs[ depthFunc ];
123
+
103
124
  if ( currentDepthFunc !== depthFunc ) {
104
125
 
105
126
  switch ( depthFunc ) {