@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -8,12 +8,13 @@ import {
8
8
  SRGBColorSpace,
9
9
  Vector3
10
10
  } from 'three';
11
+
11
12
  import {
12
13
  Projector,
13
14
  RenderableFace,
14
15
  RenderableLine,
15
16
  RenderableSprite
16
- } from '../renderers/Projector.js';
17
+ } from './Projector.js';
17
18
 
18
19
  /**
19
20
  * Can be used to wrap SVG elements into a 3D object.
@@ -87,6 +88,8 @@ class SVGRenderer {
87
88
 
88
89
  _svgNode,
89
90
  _pathCount = 0,
91
+ _svgObjectCount = 0,
92
+ _renderListCount = 0,
90
93
 
91
94
  _precision = null,
92
95
  _quality = 1,
@@ -113,6 +116,8 @@ class SVGRenderer {
113
116
  _viewProjectionMatrix = new Matrix4(),
114
117
 
115
118
  _svgPathPool = [],
119
+ _svgObjectsPool = [],
120
+ _renderListPool = [],
116
121
 
117
122
  _projector = new Projector(),
118
123
  _svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );
@@ -183,8 +188,8 @@ class SVGRenderer {
183
188
  };
184
189
 
185
190
  /**
186
- * Sets the render quality. Setting to `high` means This value indicates that the browser
187
- * tries to improve the SVG quality over rendering speed and geometric precision.
191
+ * Sets the render quality. Setting to `high` makes the browser improve SVG quality
192
+ * over rendering speed and geometric precision.
188
193
  *
189
194
  * @param {('low'|'high')} quality - The quality.
190
195
  */
@@ -275,6 +280,49 @@ class SVGRenderer {
275
280
 
276
281
  }
277
282
 
283
+ function renderSort( a, b ) {
284
+
285
+ const aOrder = a.data.renderOrder !== undefined ? a.data.renderOrder : 0;
286
+ const bOrder = b.data.renderOrder !== undefined ? b.data.renderOrder : 0;
287
+
288
+ if ( aOrder !== bOrder ) {
289
+
290
+ return aOrder - bOrder;
291
+
292
+ } else {
293
+
294
+ const aZ = a.data.z !== undefined ? a.data.z : 0;
295
+ const bZ = b.data.z !== undefined ? b.data.z : 0;
296
+
297
+ return bZ - aZ; // Painter's algorithm: far to near
298
+
299
+ }
300
+
301
+ }
302
+
303
+ function arraySortStable( array, start, length ) {
304
+
305
+ // A stable insertion sort for sorting the render list
306
+ // This avoids the GC overhead of Array.prototype.sort()
307
+
308
+ for ( let i = start + 1; i < start + length; i ++ ) {
309
+
310
+ const item = array[ i ];
311
+ let j = i - 1;
312
+
313
+ while ( j >= start && renderSort( array[ j ], item ) > 0 ) {
314
+
315
+ array[ j + 1 ] = array[ j ];
316
+ j --;
317
+
318
+ }
319
+
320
+ array[ j + 1 ] = item;
321
+
322
+ }
323
+
324
+ }
325
+
278
326
  /**
279
327
  * Performs a manual clear with the defined clear color.
280
328
  */
@@ -327,10 +375,7 @@ class SVGRenderer {
327
375
 
328
376
  calculateLights( _lights );
329
377
 
330
- // reset accumulated path
331
-
332
- _currentPath = '';
333
- _currentStyle = '';
378
+ _renderListCount = 0;
334
379
 
335
380
  for ( let e = 0, el = _elements.length; e < el; e ++ ) {
336
381
 
@@ -339,88 +384,126 @@ class SVGRenderer {
339
384
 
340
385
  if ( material === undefined || material.opacity === 0 ) continue;
341
386
 
342
- _elemBox.makeEmpty();
387
+ getRenderItem( _renderListCount ++, 'element', element, material );
343
388
 
344
- if ( element instanceof RenderableSprite ) {
389
+ }
345
390
 
346
- _v1 = element;
347
- _v1.x *= _svgWidthHalf; _v1.y *= - _svgHeightHalf;
391
+ _svgObjectCount = 0;
348
392
 
349
- renderSprite( _v1, element, material );
393
+ scene.traverseVisible( function ( object ) {
350
394
 
351
- } else if ( element instanceof RenderableLine ) {
395
+ if ( object.isSVGObject ) {
352
396
 
353
- _v1 = element.v1; _v2 = element.v2;
397
+ _vector3.setFromMatrixPosition( object.matrixWorld );
398
+ _vector3.applyMatrix4( _viewProjectionMatrix );
354
399
 
355
- _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;
356
- _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;
400
+ if ( _vector3.z < - 1 || _vector3.z > 1 ) return;
357
401
 
358
- _elemBox.setFromPoints( [ _v1.positionScreen, _v2.positionScreen ] );
402
+ const x = _vector3.x * _svgWidthHalf;
403
+ const y = - _vector3.y * _svgHeightHalf;
359
404
 
360
- if ( _clipBox.intersectsBox( _elemBox ) === true ) {
405
+ const svgObject = getSVGObjectData( _svgObjectCount ++ );
361
406
 
362
- renderLine( _v1, _v2, material );
407
+ svgObject.node = object.node;
408
+ svgObject.x = x;
409
+ svgObject.y = y;
410
+ svgObject.z = _vector3.z;
411
+ svgObject.renderOrder = object.renderOrder;
363
412
 
364
- }
413
+ getRenderItem( _renderListCount ++, 'svgObject', svgObject, null );
365
414
 
366
- } else if ( element instanceof RenderableFace ) {
415
+ }
367
416
 
368
- _v1 = element.v1; _v2 = element.v2; _v3 = element.v3;
417
+ } );
369
418
 
370
- if ( _v1.positionScreen.z < - 1 || _v1.positionScreen.z > 1 ) continue;
371
- if ( _v2.positionScreen.z < - 1 || _v2.positionScreen.z > 1 ) continue;
372
- if ( _v3.positionScreen.z < - 1 || _v3.positionScreen.z > 1 ) continue;
419
+ if ( this.sortElements ) {
373
420
 
374
- _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;
375
- _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;
376
- _v3.positionScreen.x *= _svgWidthHalf; _v3.positionScreen.y *= - _svgHeightHalf;
421
+ arraySortStable( _renderListPool, 0, _renderListCount );
377
422
 
378
- if ( this.overdraw > 0 ) {
423
+ }
379
424
 
380
- expand( _v1.positionScreen, _v2.positionScreen, this.overdraw );
381
- expand( _v2.positionScreen, _v3.positionScreen, this.overdraw );
382
- expand( _v3.positionScreen, _v1.positionScreen, this.overdraw );
425
+ // Reset accumulated path
426
+ _currentPath = '';
427
+ _currentStyle = '';
383
428
 
384
- }
429
+ // Render in sorted order
430
+ for ( let i = 0; i < _renderListCount; i ++ ) {
385
431
 
386
- _elemBox.setFromPoints( [
387
- _v1.positionScreen,
388
- _v2.positionScreen,
389
- _v3.positionScreen
390
- ] );
432
+ const item = _renderListPool[ i ];
391
433
 
392
- if ( _clipBox.intersectsBox( _elemBox ) === true ) {
434
+ if ( item.type === 'svgObject' ) {
393
435
 
394
- renderFace3( _v1, _v2, _v3, element, material );
436
+ flushPath(); // Flush any accumulated paths before inserting SVG node
395
437
 
396
- }
438
+ const svgObject = item.data;
439
+ const node = svgObject.node;
440
+ node.setAttribute( 'transform', 'translate(' + svgObject.x + ',' + svgObject.y + ')' );
441
+ _svg.appendChild( node );
397
442
 
398
- }
443
+ } else {
399
444
 
400
- }
445
+ const element = item.data;
446
+ const material = item.material;
401
447
 
402
- flushPath(); // just to flush last svg:path
448
+ _elemBox.makeEmpty();
403
449
 
404
- scene.traverseVisible( function ( object ) {
450
+ if ( element instanceof RenderableSprite ) {
405
451
 
406
- if ( object.isSVGObject ) {
452
+ _v1 = element;
453
+ _v1.x *= _svgWidthHalf; _v1.y *= - _svgHeightHalf;
407
454
 
408
- _vector3.setFromMatrixPosition( object.matrixWorld );
409
- _vector3.applyMatrix4( _viewProjectionMatrix );
455
+ renderSprite( _v1, element, material );
410
456
 
411
- if ( _vector3.z < - 1 || _vector3.z > 1 ) return;
457
+ } else if ( element instanceof RenderableLine ) {
412
458
 
413
- const x = _vector3.x * _svgWidthHalf;
414
- const y = - _vector3.y * _svgHeightHalf;
459
+ _v1 = element.v1; _v2 = element.v2;
415
460
 
416
- const node = object.node;
417
- node.setAttribute( 'transform', 'translate(' + x + ',' + y + ')' );
461
+ _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;
462
+ _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;
418
463
 
419
- _svg.appendChild( node );
464
+ _elemBox.setFromPoints( [ _v1.positionScreen, _v2.positionScreen ] );
465
+
466
+ if ( _clipBox.intersectsBox( _elemBox ) === true ) {
467
+
468
+ renderLine( _v1, _v2, material );
469
+
470
+ }
471
+
472
+ } else if ( element instanceof RenderableFace ) {
473
+
474
+ _v1 = element.v1; _v2 = element.v2; _v3 = element.v3;
475
+
476
+ _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;
477
+ _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;
478
+ _v3.positionScreen.x *= _svgWidthHalf; _v3.positionScreen.y *= - _svgHeightHalf;
479
+
480
+ if ( this.overdraw > 0 ) {
481
+
482
+ expand( _v1.positionScreen, _v2.positionScreen, this.overdraw );
483
+ expand( _v2.positionScreen, _v3.positionScreen, this.overdraw );
484
+ expand( _v3.positionScreen, _v1.positionScreen, this.overdraw );
485
+
486
+ }
487
+
488
+ _elemBox.setFromPoints( [
489
+ _v1.positionScreen,
490
+ _v2.positionScreen,
491
+ _v3.positionScreen
492
+ ] );
493
+
494
+ if ( _clipBox.intersectsBox( _elemBox ) === true ) {
495
+
496
+ renderFace3( _v1, _v2, _v3, element, material );
497
+
498
+ }
499
+
500
+ }
420
501
 
421
502
  }
422
503
 
423
- } );
504
+ }
505
+
506
+ flushPath(); // Flush any remaining paths
424
507
 
425
508
  };
426
509
 
@@ -660,21 +743,71 @@ class SVGRenderer {
660
743
 
661
744
  function getPathNode( id ) {
662
745
 
663
- if ( _svgPathPool[ id ] == null ) {
746
+ let path = _svgPathPool[ id ];
664
747
 
665
- _svgPathPool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );
748
+ if ( path === undefined ) {
749
+
750
+ path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );
666
751
 
667
752
  if ( _quality == 0 ) {
668
753
 
669
- _svgPathPool[ id ].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed
754
+ path.setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed
670
755
 
671
756
  }
672
757
 
673
- return _svgPathPool[ id ];
758
+ _svgPathPool[ id ] = path;
759
+
760
+ }
761
+
762
+ return path;
763
+
764
+ }
765
+
766
+ function getSVGObjectData( id ) {
767
+
768
+ let svgObject = _svgObjectsPool[ id ];
769
+
770
+ if ( svgObject === undefined ) {
771
+
772
+ svgObject = {
773
+ node: null,
774
+ x: 0,
775
+ y: 0,
776
+ z: 0,
777
+ renderOrder: 0
778
+ };
779
+
780
+ _svgObjectsPool[ id ] = svgObject;
674
781
 
675
782
  }
676
783
 
677
- return _svgPathPool[ id ];
784
+ return svgObject;
785
+
786
+ }
787
+
788
+ function getRenderItem( id, type, data, material ) {
789
+
790
+ let item = _renderListPool[ id ];
791
+
792
+ if ( item === undefined ) {
793
+
794
+ item = {
795
+ type: type,
796
+ data: data,
797
+ material: material
798
+ };
799
+
800
+ _renderListPool[ id ] = item;
801
+
802
+ return item;
803
+
804
+ }
805
+
806
+ item.type = type;
807
+ item.data = data;
808
+ item.material = material;
809
+
810
+ return item;
678
811
 
679
812
  }
680
813
 
@@ -91,8 +91,12 @@ const GTAOShader = {
91
91
  #define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)
92
92
  #endif
93
93
 
94
- vec3 getViewPosition(const in vec2 screenPosition, const in float depth) {
95
- vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);
94
+ vec3 getViewPosition( const in vec2 screenPosition, const in float depth ) {
95
+ #ifdef USE_REVERSED_DEPTH_BUFFER
96
+ vec4 clipSpacePosition = vec4( vec2( screenPosition ) * 2.0 - 1.0, depth, 1.0 );
97
+ #else
98
+ vec4 clipSpacePosition = vec4( vec3( screenPosition, depth ) * 2.0 - 1.0, 1.0 );
99
+ #endif
96
100
  vec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;
97
101
  return viewSpacePosition.xyz / viewSpacePosition.w;
98
102
  }
@@ -154,10 +158,19 @@ const GTAOShader = {
154
158
 
155
159
  void main() {
156
160
  float depth = getDepth(vUv.xy);
157
- if (depth >= 1.0) {
158
- discard;
159
- return;
160
- }
161
+
162
+ #ifdef USE_REVERSED_DEPTH_BUFFER
163
+ if (depth <= 0.0) {
164
+ discard;
165
+ return;
166
+ }
167
+ #else
168
+ if (depth >= 1.0) {
169
+ discard;
170
+ return;
171
+ }
172
+ #endif
173
+
161
174
  vec3 viewPos = getViewPosition(vUv, depth);
162
175
  vec3 viewNormal = getViewNormal(vUv);
163
176
 
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * Used by {@link HalftonePass}.
10
10
  *
11
- * Shape (1 = Dot, 2 = Ellipse, 3 = Line, 4 = Square)
11
+ * Shape (1 = Dot, 2 = Ellipse, 3 = Line, 4 = Square, 5 = Diamond)
12
12
  * Blending Mode (1 = Linear, 2 = Multiply, 3 = Add, 4 = Lighter, 5 = Darker)
13
13
  *
14
14
  * @constant
@@ -49,11 +49,13 @@ const HalftoneShader = {
49
49
 
50
50
  #define SQRT2_MINUS_ONE 0.41421356
51
51
  #define SQRT2_HALF_MINUS_ONE 0.20710678
52
+ #define PI 3.14159265
52
53
  #define PI2 6.28318531
53
54
  #define SHAPE_DOT 1
54
55
  #define SHAPE_ELLIPSE 2
55
56
  #define SHAPE_LINE 3
56
57
  #define SHAPE_SQUARE 4
58
+ #define SHAPE_DIAMOND 5
57
59
  #define BLENDING_LINEAR 1
58
60
  #define BLENDING_MULTIPLY 2
59
61
  #define BLENDING_ADD 3
@@ -129,6 +131,15 @@ const HalftoneShader = {
129
131
  rad = pow( abs( rad ), 1.4 );
130
132
  rad = rad_max * ( rad + ( ( sin_t > cos_t ) ? rad - sin_t * rad : rad - cos_t * rad ) );
131
133
 
134
+ } else if ( shape == SHAPE_DIAMOND ) {
135
+
136
+ float angle45 = PI / 4.0;
137
+ float theta = atan( p.y - coord.y, p.x - coord.x ) - angle - angle45;
138
+ float sin_t = abs( sin( theta ) );
139
+ float cos_t = abs( cos( theta ) );
140
+ rad = pow( abs( rad ), 1.4 );
141
+ rad = rad_max * ( rad + ( ( sin_t > cos_t ) ? rad - sin_t * rad : rad - cos_t * rad ) );
142
+
132
143
  }
133
144
 
134
145
  return rad - dist;
@@ -86,8 +86,12 @@ const PoissonDenoiseShader = {
86
86
 
87
87
  const vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;
88
88
 
89
- vec3 getViewPosition(const in vec2 screenPosition, const in float depth) {
90
- vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);
89
+ vec3 getViewPosition( const in vec2 screenPosition, const in float depth ) {
90
+ #ifdef USE_REVERSED_DEPTH_BUFFER
91
+ vec4 clipSpacePosition = vec4( vec2( screenPosition ) * 2.0 - 1.0, depth, 1.0 );
92
+ #else
93
+ vec4 clipSpacePosition = vec4( vec3( screenPosition, depth ) * 2.0 - 1.0, 1.0 );
94
+ #endif
91
95
  vec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;
92
96
  return viewSpacePosition.xyz / viewSpacePosition.w;
93
97
  }
@@ -153,9 +153,15 @@ const SAOShader = {
153
153
  angle += ANGLE_STEP;
154
154
 
155
155
  float sampleDepth = getDepth( sampleUv );
156
- if( sampleDepth >= ( 1.0 - EPSILON ) ) {
156
+ #ifdef USE_REVERSED_DEPTH_BUFFER
157
+ if( sampleDepth <= 0.0 + EPSILON ) {
157
158
  continue;
158
159
  }
160
+ #else
161
+ if( sampleDepth >= 1.0 - EPSILON ) {
162
+ continue;
163
+ }
164
+ #endif
159
165
 
160
166
  float sampleViewZ = getViewZ( sampleDepth );
161
167
  vec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );
@@ -170,9 +176,16 @@ const SAOShader = {
170
176
 
171
177
  void main() {
172
178
  float centerDepth = getDepth( vUv );
173
- if( centerDepth >= ( 1.0 - EPSILON ) ) {
174
- discard;
175
- }
179
+
180
+ #ifdef USE_REVERSED_DEPTH_BUFFER
181
+ if( centerDepth <= 0.0 + EPSILON ) {
182
+ discard;
183
+ }
184
+ #else
185
+ if( centerDepth >= 1.0 - EPSILON ) {
186
+ discard;
187
+ }
188
+ #endif
176
189
 
177
190
  float centerViewZ = getViewZ( centerDepth );
178
191
  vec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );
@@ -79,6 +79,16 @@ const SSAOShader = {
79
79
 
80
80
  #include <packing>
81
81
 
82
+ #ifdef USE_REVERSED_DEPTH_BUFFER
83
+
84
+ const float depthThreshold = 0.0;
85
+
86
+ #else
87
+
88
+ const float depthThreshold = 1.0;
89
+
90
+ #endif
91
+
82
92
  float getDepth( const in vec2 screenPosition ) {
83
93
 
84
94
  return texture2D( tDepth, screenPosition ).x;
@@ -137,7 +147,7 @@ const SSAOShader = {
137
147
 
138
148
  float depth = getDepth( vUv );
139
149
 
140
- if ( depth == 1.0 ) {
150
+ if ( depth == depthThreshold ) {
141
151
 
142
152
  gl_FragColor = vec4( 1.0 ); // don't influence background
143
153
 
@@ -96,7 +96,7 @@ const SSRShader = {
96
96
  float x0=point.x,y0=point.y,z0=point.z;
97
97
  float x=planePoint.x,y=planePoint.y,z=planePoint.z;
98
98
  float d=-(a*x+b*y+c*z);
99
- float distance=(a*x0+b*y0+c*z0+d)/sqrt(a*a+b*b+c*c);
99
+ float distance=a*x0+b*y0+c*z0+d;
100
100
  return distance;
101
101
  }
102
102
  float getDepth( const in vec2 uv ) {
@@ -170,17 +170,17 @@ const SSRShader = {
170
170
  #endif
171
171
  d1=viewPositionToXY(d1viewPosition);
172
172
 
173
- float totalLen=length(d1-d0);
174
173
  float xLen=d1.x-d0.x;
175
174
  float yLen=d1.y-d0.y;
176
175
  float totalStep=max(abs(xLen),abs(yLen));
177
176
  float xSpan=xLen/totalStep;
178
177
  float ySpan=yLen/totalStep;
179
- for(float i=0.;i<float(MAX_STEP);i++){
178
+ float sStep=1./totalStep;
179
+ float s=sStep; // start at sStep since loop starts at i=1
180
+ for(float i=1.;i<float(MAX_STEP);i++){
180
181
  if(i>=totalStep) break;
181
182
  vec2 xy=vec2(d0.x+i*xSpan,d0.y+i*ySpan);
182
183
  if(xy.x<0.||xy.x>resolution.x||xy.y<0.||xy.y>resolution.y) break;
183
- float s=length(xy-d0)/totalLen;
184
184
  vec2 uv=xy/resolution;
185
185
 
186
186
  float d = getDepth(uv);
@@ -221,7 +221,7 @@ const SSRShader = {
221
221
 
222
222
  if(hit){
223
223
  vec3 vN=getViewNormal( uv );
224
- if(dot(viewReflectDir,vN)>=0.) continue;
224
+ if(dot(viewReflectDir,vN)>=0.) break; // treat backfaces as opaque
225
225
  float distance=pointPlaneDistance(vP,viewPosition,viewNormal);
226
226
  if(distance>maxDistance) break;
227
227
  float op=opacity;
@@ -240,6 +240,7 @@ const SSRShader = {
240
240
  break;
241
241
  }
242
242
  }
243
+ s+=sStep;
243
244
  }
244
245
  }
245
246
  `
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  /**
7
- * Unpack RGBA depth shader that shows RGBA encoded depth as monochrome color.
7
+ * Depth visualization shader that shows depth values as monochrome color.
8
8
  *
9
9
  * @constant
10
10
  * @type {ShaderMaterial~Shader}
@@ -39,11 +39,9 @@ const UnpackDepthRGBAShader = {
39
39
 
40
40
  varying vec2 vUv;
41
41
 
42
- #include <packing>
43
-
44
42
  void main() {
45
43
 
46
- float depth = unpackRGBAToDepth( texture2D( tDiffuse, vUv ) );
44
+ float depth = texture2D( tDiffuse, vUv ).r;
47
45
 
48
46
  #ifdef USE_REVERSED_DEPTH_BUFFER
49
47
 
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  /**
7
- * Based on [PaintEffect postprocess from ro.me](http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js).
7
+ * Based on [PaintEffect postprocess from ro.me](https://github.com/dataarts/3-dreams-of-black/blob/master/deploy/js/effects/PaintEffect.js).
8
8
  *
9
9
  * @constant
10
10
  * @type {ShaderMaterial~Shader}
@@ -46,6 +46,20 @@ export class ASTNode {
46
46
 
47
47
  }
48
48
 
49
+ getProgram() {
50
+
51
+ let current = this;
52
+
53
+ while ( current.parent !== null ) {
54
+
55
+ current = current.parent;
56
+
57
+ }
58
+
59
+ return current.isProgram === true ? current : null;
60
+
61
+ }
62
+
49
63
  getParent( parents = [] ) {
50
64
 
51
65
  if ( this.parent === null ) {
@@ -114,6 +128,7 @@ export class Program extends ASTNode {
114
128
  super();
115
129
 
116
130
  this.body = body;
131
+ this.structTypes = new Map();
117
132
 
118
133
  this.isProgram = true;
119
134
 
@@ -629,3 +644,32 @@ export class SwitchCase extends ASTNode {
629
644
  }
630
645
 
631
646
  }
647
+
648
+ // helper class for StructDefinition
649
+ export class StructMember {
650
+
651
+ constructor( type, name ) {
652
+
653
+ this.type = type;
654
+ this.name = name;
655
+ this.isStructMember = true;
656
+
657
+ }
658
+
659
+ }
660
+
661
+ export class StructDefinition extends ASTNode {
662
+
663
+ constructor( name, members = [] ) {
664
+
665
+ super();
666
+
667
+ this.name = name;
668
+ this.members = members;
669
+ this.isStructDefinition = true;
670
+
671
+ this.initialize();
672
+
673
+ }
674
+
675
+ }