super-three 0.158.0 → 0.160.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 (191) hide show
  1. package/build/three.cjs +1719 -379
  2. package/build/three.js +1719 -379
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +1718 -380
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/controls/OrbitControls.js +50 -40
  8. package/examples/jsm/csm/CSMShader.js +52 -47
  9. package/examples/jsm/exporters/GLTFExporter.js +79 -1
  10. package/examples/jsm/exporters/USDZExporter.js +27 -19
  11. package/examples/jsm/helpers/TextureHelper.js +237 -0
  12. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  13. package/examples/jsm/lines/LineMaterial.js +16 -33
  14. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  15. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  16. package/examples/jsm/loaders/FBXLoader.js +294 -124
  17. package/examples/jsm/loaders/GLTFLoader.js +71 -3
  18. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  19. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  20. package/examples/jsm/loaders/SVGLoader.js +4 -4
  21. package/examples/jsm/loaders/USDZLoader.js +3 -17
  22. package/examples/jsm/math/Octree.js +15 -4
  23. package/examples/jsm/misc/Timer.js +119 -0
  24. package/examples/jsm/misc/TubePainter.js +3 -6
  25. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  26. package/examples/jsm/nodes/Nodes.js +11 -7
  27. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  28. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  29. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  30. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  31. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  32. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  33. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  34. package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
  35. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  36. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  37. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  38. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  39. package/examples/jsm/nodes/core/Node.js +6 -3
  40. package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
  41. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  42. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  43. package/examples/jsm/nodes/core/NodeUtils.js +3 -7
  44. package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
  45. package/examples/jsm/nodes/core/PropertyNode.js +17 -2
  46. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  47. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  48. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  49. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  50. package/examples/jsm/nodes/core/VarNode.js +2 -0
  51. package/examples/jsm/nodes/core/VaryingNode.js +1 -7
  52. package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
  53. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  54. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  55. package/examples/jsm/nodes/display/PassNode.js +182 -0
  56. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  57. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  58. package/examples/jsm/nodes/display/ViewportNode.js +5 -8
  59. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
  61. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
  62. package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
  63. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
  64. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
  65. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  66. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
  67. package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
  68. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  69. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  70. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  71. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  72. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  73. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  74. package/examples/jsm/nodes/math/MathNode.js +2 -0
  75. package/examples/jsm/nodes/math/OperatorNode.js +19 -6
  76. package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
  77. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  78. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  79. package/examples/jsm/nodes/utils/SplitNode.js +8 -2
  80. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  81. package/examples/jsm/objects/QuadMesh.js +60 -0
  82. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  83. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  84. package/examples/jsm/renderers/common/Animation.js +10 -21
  85. package/examples/jsm/renderers/common/Backend.js +19 -3
  86. package/examples/jsm/renderers/common/Background.js +20 -22
  87. package/examples/jsm/renderers/common/Bindings.js +30 -21
  88. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  89. package/examples/jsm/renderers/common/Color4.js +37 -0
  90. package/examples/jsm/renderers/common/Geometries.js +4 -4
  91. package/examples/jsm/renderers/common/Info.js +12 -2
  92. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  93. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  94. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  95. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  96. package/examples/jsm/renderers/common/RenderObject.js +13 -1
  97. package/examples/jsm/renderers/common/RenderObjects.js +4 -2
  98. package/examples/jsm/renderers/common/Renderer.js +137 -37
  99. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  100. package/examples/jsm/renderers/common/Textures.js +4 -1
  101. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  102. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  103. package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
  104. package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
  105. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
  106. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
  107. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  108. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  109. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  110. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
  115. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  116. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  119. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  120. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  121. package/examples/jsm/shaders/FXAAShader.js +133 -133
  122. package/examples/jsm/shaders/GTAOShader.js +424 -0
  123. package/examples/jsm/shaders/OutputShader.js +4 -0
  124. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  125. package/examples/jsm/shaders/SAOShader.js +2 -3
  126. package/examples/jsm/shaders/SSAOShader.js +2 -3
  127. package/examples/jsm/transpiler/AST.js +40 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
  130. package/examples/jsm/transpiler/TSLEncoder.js +124 -20
  131. package/examples/jsm/utils/SortUtils.js +158 -0
  132. package/examples/jsm/utils/TextureUtils.js +33 -21
  133. package/examples/jsm/webxr/ARButton.js +14 -0
  134. package/examples/jsm/webxr/VRButton.js +23 -8
  135. package/examples/jsm/webxr/XRButton.js +25 -11
  136. package/package.json +5 -6
  137. package/src/Three.js +1 -0
  138. package/src/constants.js +2 -1
  139. package/src/core/BufferAttribute.js +21 -2
  140. package/src/core/InterleavedBuffer.js +21 -1
  141. package/src/core/Object3D.js +60 -12
  142. package/src/core/UniformsGroup.js +7 -1
  143. package/src/extras/curves/LineCurve3.js +4 -0
  144. package/src/loaders/AudioLoader.js +1 -1
  145. package/src/loaders/BufferGeometryLoader.js +0 -7
  146. package/src/loaders/ImageBitmapLoader.js +25 -1
  147. package/src/loaders/ObjectLoader.js +49 -0
  148. package/src/materials/ShaderMaterial.js +2 -1
  149. package/src/math/ColorManagement.js +0 -16
  150. package/src/math/Quaternion.js +5 -4
  151. package/src/math/Sphere.js +2 -0
  152. package/src/math/Triangle.js +17 -5
  153. package/src/objects/BatchedMesh.js +1020 -0
  154. package/src/objects/Skeleton.js +1 -3
  155. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  156. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  157. package/src/renderers/WebGLRenderer.js +23 -18
  158. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  159. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  160. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  161. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  162. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  163. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  164. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  165. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  166. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  167. package/src/renderers/shaders/ShaderChunk.js +4 -0
  168. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  169. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  170. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  171. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  172. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  173. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  174. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  175. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
  176. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  178. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  179. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  180. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  181. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  182. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  183. package/src/renderers/webgl/WebGLLights.js +11 -2
  184. package/src/renderers/webgl/WebGLProgram.js +20 -1
  185. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  186. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  187. package/src/renderers/webgl/WebGLTextures.js +7 -11
  188. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  189. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  190. package/src/renderers/webxr/WebXRManager.js +16 -0
  191. package/examples/jsm/objects/BatchedMesh.js +0 -586
@@ -0,0 +1,572 @@
1
+ import {
2
+ AddEquation,
3
+ Color,
4
+ CustomBlending,
5
+ DataTexture,
6
+ DepthTexture,
7
+ DepthStencilFormat,
8
+ DstAlphaFactor,
9
+ DstColorFactor,
10
+ HalfFloatType,
11
+ MeshNormalMaterial,
12
+ NearestFilter,
13
+ NoBlending,
14
+ RepeatWrapping,
15
+ RGBAFormat,
16
+ ShaderMaterial,
17
+ UniformsUtils,
18
+ UnsignedByteType,
19
+ UnsignedInt248Type,
20
+ WebGLRenderTarget,
21
+ ZeroFactor
22
+ } from 'three';
23
+ import { Pass, FullScreenQuad } from './Pass.js';
24
+ import { generateMagicSquareNoise, GTAOShader, GTAODepthShader, GTAOBlendShader } from '../shaders/GTAOShader.js';
25
+ import { generatePdSamplePointInitializer, PoissonDenoiseShader } from '../shaders/PoissonDenoiseShader.js';
26
+ import { CopyShader } from '../shaders/CopyShader.js';
27
+ import { SimplexNoise } from '../math/SimplexNoise.js';
28
+
29
+ class GTAOPass extends Pass {
30
+
31
+ constructor( scene, camera, width, height, parameters, aoParameters, pdParameters ) {
32
+
33
+ super();
34
+
35
+ this.width = ( width !== undefined ) ? width : 512;
36
+ this.height = ( height !== undefined ) ? height : 512;
37
+ this.clear = true;
38
+ this.camera = camera;
39
+ this.scene = scene;
40
+ this.output = 0;
41
+ this._renderGBuffer = true;
42
+ this._visibilityCache = new Map();
43
+ this.blendIntensity = 1.;
44
+
45
+ this.pdRings = 2.;
46
+ this.pdRadiusExponent = 2.;
47
+ this.pdSamples = 16;
48
+
49
+ this.gtaoNoiseTexture = generateMagicSquareNoise();
50
+ this.pdNoiseTexture = this.generateNoise();
51
+
52
+ this.gtaoRenderTarget = new WebGLRenderTarget( this.width, this.height, { type: HalfFloatType } );
53
+ this.pdRenderTarget = this.gtaoRenderTarget.clone();
54
+
55
+ this.gtaoMaterial = new ShaderMaterial( {
56
+ defines: Object.assign( {}, GTAOShader.defines ),
57
+ uniforms: UniformsUtils.clone( GTAOShader.uniforms ),
58
+ vertexShader: GTAOShader.vertexShader,
59
+ fragmentShader: GTAOShader.fragmentShader,
60
+ blending: NoBlending,
61
+ depthTest: false,
62
+ depthWrite: false,
63
+ } );
64
+ this.gtaoMaterial.definesPERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0;
65
+ this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture;
66
+ this.gtaoMaterial.uniforms.resolution.value.set( this.width, this.height );
67
+ this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near;
68
+ this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far;
69
+
70
+ this.normalMaterial = new MeshNormalMaterial();
71
+ this.normalMaterial.blending = NoBlending;
72
+
73
+ this.pdMaterial = new ShaderMaterial( {
74
+ defines: Object.assign( {}, PoissonDenoiseShader.defines ),
75
+ uniforms: UniformsUtils.clone( PoissonDenoiseShader.uniforms ),
76
+ vertexShader: PoissonDenoiseShader.vertexShader,
77
+ fragmentShader: PoissonDenoiseShader.fragmentShader,
78
+ depthTest: false,
79
+ depthWrite: false,
80
+ } );
81
+ this.pdMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture;
82
+ this.pdMaterial.uniforms.tNoise.value = this.pdNoiseTexture;
83
+ this.pdMaterial.uniforms.resolution.value.set( this.width, this.height );
84
+ this.pdMaterial.uniforms.lumaPhi.value = 10;
85
+ this.pdMaterial.uniforms.depthPhi.value = 2;
86
+ this.pdMaterial.uniforms.normalPhi.value = 3;
87
+ this.pdMaterial.uniforms.radius.value = 8;
88
+
89
+ this.depthRenderMaterial = new ShaderMaterial( {
90
+ defines: Object.assign( {}, GTAODepthShader.defines ),
91
+ uniforms: UniformsUtils.clone( GTAODepthShader.uniforms ),
92
+ vertexShader: GTAODepthShader.vertexShader,
93
+ fragmentShader: GTAODepthShader.fragmentShader,
94
+ blending: NoBlending
95
+ } );
96
+ this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near;
97
+ this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far;
98
+
99
+ this.copyMaterial = new ShaderMaterial( {
100
+ uniforms: UniformsUtils.clone( CopyShader.uniforms ),
101
+ vertexShader: CopyShader.vertexShader,
102
+ fragmentShader: CopyShader.fragmentShader,
103
+ transparent: true,
104
+ depthTest: false,
105
+ depthWrite: false,
106
+ blendSrc: DstColorFactor,
107
+ blendDst: ZeroFactor,
108
+ blendEquation: AddEquation,
109
+ blendSrcAlpha: DstAlphaFactor,
110
+ blendDstAlpha: ZeroFactor,
111
+ blendEquationAlpha: AddEquation
112
+ } );
113
+
114
+ this.blendMaterial = new ShaderMaterial( {
115
+ uniforms: UniformsUtils.clone( GTAOBlendShader.uniforms ),
116
+ vertexShader: GTAOBlendShader.vertexShader,
117
+ fragmentShader: GTAOBlendShader.fragmentShader,
118
+ transparent: true,
119
+ depthTest: false,
120
+ depthWrite: false,
121
+ blending: CustomBlending,
122
+ blendSrc: DstColorFactor,
123
+ blendDst: ZeroFactor,
124
+ blendEquation: AddEquation,
125
+ blendSrcAlpha: DstAlphaFactor,
126
+ blendDstAlpha: ZeroFactor,
127
+ blendEquationAlpha: AddEquation
128
+ } );
129
+
130
+ this.fsQuad = new FullScreenQuad( null );
131
+
132
+ this.originalClearColor = new Color();
133
+
134
+ this.setGBuffer( parameters ? parameters.depthTexture : undefined, parameters ? parameters.normalTexture : undefined );
135
+
136
+ if ( aoParameters !== undefined ) {
137
+
138
+ this.updateGtaoMaterial( aoParameters );
139
+
140
+ }
141
+
142
+ if ( pdParameters !== undefined ) {
143
+
144
+ this.updatePdMaterial( pdParameters );
145
+
146
+ }
147
+
148
+ }
149
+
150
+ dispose() {
151
+
152
+ this.gtaoNoiseTexture.dispose();
153
+ this.pdNoiseTexture.dispose();
154
+ this.normalRenderTarget.dispose();
155
+ this.gtaoRenderTarget.dispose();
156
+ this.pdRenderTarget.dispose();
157
+ this.normalMaterial.dispose();
158
+ this.pdMaterial.dispose();
159
+ this.copyMaterial.dispose();
160
+ this.depthRenderMaterial.dispose();
161
+ this.fsQuad.dispose();
162
+
163
+ }
164
+
165
+ setGBuffer( depthTexture, normalTexture ) {
166
+
167
+ if ( depthTexture !== undefined ) {
168
+
169
+ this.depthTexture = depthTexture;
170
+ this.normalTexture = normalTexture;
171
+ this._renderGBuffer = false;
172
+
173
+ } else {
174
+
175
+ this.depthTexture = new DepthTexture();
176
+ this.depthTexture.format = DepthStencilFormat;
177
+ this.depthTexture.type = UnsignedInt248Type;
178
+ this.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {
179
+ minFilter: NearestFilter,
180
+ magFilter: NearestFilter,
181
+ type: HalfFloatType,
182
+ depthTexture: this.depthTexture
183
+ } );
184
+ this.normalTexture = this.normalRenderTarget.texture;
185
+ this._renderGBuffer = true;
186
+
187
+ }
188
+
189
+ const normalVectorType = ( this.normalTexture ) ? 1 : 0;
190
+ const depthValueSource = ( this.depthTexture === this.normalTexture ) ? 'w' : 'x';
191
+
192
+ this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = normalVectorType;
193
+ this.gtaoMaterial.defines.DEPTH_SWIZZLING = depthValueSource;
194
+ this.gtaoMaterial.uniforms.tNormal.value = this.normalTexture;
195
+ this.gtaoMaterial.uniforms.tDepth.value = this.depthTexture;
196
+
197
+ this.pdMaterial.defines.NORMAL_VECTOR_TYPE = normalVectorType;
198
+ this.pdMaterial.defines.DEPTH_SWIZZLING = depthValueSource;
199
+ this.pdMaterial.uniforms.tNormal.value = this.normalTexture;
200
+ this.pdMaterial.uniforms.tDepth.value = this.depthTexture;
201
+
202
+ this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture;
203
+
204
+ }
205
+
206
+ setSceneClipBox( box ) {
207
+
208
+ if ( box ) {
209
+
210
+ this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX !== 1;
211
+ this.gtaoMaterial.defines.SCENE_CLIP_BOX = 1;
212
+ this.gtaoMaterial.uniforms.sceneBoxMin.value.copy( box.min );
213
+ this.gtaoMaterial.uniforms.sceneBoxMax.value.copy( box.max );
214
+
215
+ } else {
216
+
217
+ this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX === 0;
218
+ this.gtaoMaterial.defines.SCENE_CLIP_BOX = 0;
219
+
220
+ }
221
+
222
+ }
223
+
224
+ updateGtaoMaterial( parameters ) {
225
+
226
+ if ( parameters.radius !== undefined ) {
227
+
228
+ this.gtaoMaterial.uniforms.radius.value = parameters.radius;
229
+
230
+ }
231
+
232
+ if ( parameters.distanceExponent !== undefined ) {
233
+
234
+ this.gtaoMaterial.uniforms.distanceExponent.value = parameters.distanceExponent;
235
+
236
+ }
237
+
238
+ if ( parameters.thickness !== undefined ) {
239
+
240
+ this.gtaoMaterial.uniforms.thickness.value = parameters.thickness;
241
+
242
+ }
243
+
244
+ if ( parameters.distanceFallOff !== undefined ) {
245
+
246
+ this.gtaoMaterial.uniforms.distanceFallOff.value = parameters.distanceFallOff;
247
+ this.gtaoMaterial.needsUpdate = true;
248
+
249
+ }
250
+
251
+ if ( parameters.scale !== undefined ) {
252
+
253
+ this.gtaoMaterial.uniforms.scale.value = parameters.scale;
254
+
255
+ }
256
+
257
+ if ( parameters.samples !== undefined && parameters.samples !== this.gtaoMaterial.defines.SAMPLES ) {
258
+
259
+ this.gtaoMaterial.defines.SAMPLES = parameters.samples;
260
+ this.gtaoMaterial.needsUpdate = true;
261
+
262
+ }
263
+
264
+ if ( parameters.screenSpaceRadius !== undefined && ( parameters.screenSpaceRadius ? 1 : 0 ) !== this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS ) {
265
+
266
+ this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS = parameters.screenSpaceRadius ? 1 : 0;
267
+ this.gtaoMaterial.needsUpdate = true;
268
+
269
+ }
270
+
271
+ }
272
+
273
+ updatePdMaterial( parameters ) {
274
+
275
+ let updateShader = false;
276
+
277
+ if ( parameters.lumaPhi !== undefined ) {
278
+
279
+ this.pdMaterial.uniforms.lumaPhi.value = parameters.lumaPhi;
280
+
281
+ }
282
+
283
+ if ( parameters.depthPhi !== undefined ) {
284
+
285
+ this.pdMaterial.uniforms.depthPhi.value = parameters.depthPhi;
286
+
287
+ }
288
+
289
+ if ( parameters.normalPhi !== undefined ) {
290
+
291
+ this.pdMaterial.uniforms.normalPhi.value = parameters.normalPhi;
292
+
293
+ }
294
+
295
+ if ( parameters.radius !== undefined && parameters.radius !== this.radius ) {
296
+
297
+ this.pdMaterial.uniforms.radius.value = parameters.radius;
298
+
299
+ }
300
+
301
+ if ( parameters.radiusExponent !== undefined && parameters.radiusExponent !== this.pdRadiusExponent ) {
302
+
303
+ this.pdRadiusExponent = parameters.radiusExponent;
304
+ updateShader = true;
305
+
306
+ }
307
+
308
+ if ( parameters.rings !== undefined && parameters.rings !== this.pdRings ) {
309
+
310
+ this.pdRings = parameters.rings;
311
+ updateShader = true;
312
+
313
+ }
314
+
315
+ if ( parameters.samples !== undefined && parameters.samples !== this.pdSamples ) {
316
+
317
+ this.pdSamples = parameters.samples;
318
+ updateShader = true;
319
+
320
+ }
321
+
322
+ if ( updateShader ) {
323
+
324
+ this.pdMaterial.defines.SAMPLES = this.pdSamples;
325
+ this.pdMaterial.defines.SAMPLE_VECTORS = generatePdSamplePointInitializer( this.pdSamples, this.pdRings, this.pdRadiusExponent );
326
+ this.pdMaterial.needsUpdate = true;
327
+
328
+ }
329
+
330
+ }
331
+
332
+ render( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {
333
+
334
+ // render normals and depth (honor only meshes, points and lines do not contribute to AO)
335
+
336
+ if ( this._renderGBuffer ) {
337
+
338
+ this.overrideVisibility();
339
+ this.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );
340
+ this.restoreVisibility();
341
+
342
+ }
343
+
344
+ // render AO
345
+
346
+ this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near;
347
+ this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far;
348
+ this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy( this.camera.projectionMatrix );
349
+ this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
350
+ this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy( this.camera.matrixWorld );
351
+ this.renderPass( renderer, this.gtaoMaterial, this.gtaoRenderTarget, 0xffffff, 1.0 );
352
+
353
+ // render poisson denoise
354
+
355
+ this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
356
+ this.renderPass( renderer, this.pdMaterial, this.pdRenderTarget, 0xffffff, 1.0 );
357
+
358
+ // output result to screen
359
+
360
+ switch ( this.output ) {
361
+
362
+ case GTAOPass.OUTPUT.Diffuse:
363
+
364
+ this.copyMaterial.uniforms.tDiffuse.value = readBuffer.texture;
365
+ this.copyMaterial.blending = NoBlending;
366
+ this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
367
+
368
+ break;
369
+
370
+ case GTAOPass.OUTPUT.AO:
371
+
372
+ this.copyMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture;
373
+ this.copyMaterial.blending = NoBlending;
374
+ this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
375
+
376
+ break;
377
+
378
+ case GTAOPass.OUTPUT.Denoise:
379
+
380
+ this.copyMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture;
381
+ this.copyMaterial.blending = NoBlending;
382
+ this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
383
+
384
+ break;
385
+
386
+ case GTAOPass.OUTPUT.Depth:
387
+
388
+ this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near;
389
+ this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far;
390
+ this.renderPass( renderer, this.depthRenderMaterial, this.renderToScreen ? null : writeBuffer );
391
+
392
+ break;
393
+
394
+ case GTAOPass.OUTPUT.Normal:
395
+
396
+ this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture;
397
+ this.copyMaterial.blending = NoBlending;
398
+ this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
399
+
400
+ break;
401
+
402
+ case GTAOPass.OUTPUT.Default:
403
+
404
+ this.copyMaterial.uniforms.tDiffuse.value = readBuffer.texture;
405
+ this.copyMaterial.blending = NoBlending;
406
+ this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
407
+
408
+ this.blendMaterial.uniforms.intensity.value = this.blendIntensity;
409
+ this.blendMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture;
410
+ this.renderPass( renderer, this.blendMaterial, this.renderToScreen ? null : writeBuffer );
411
+
412
+ break;
413
+
414
+ default:
415
+ console.warn( 'THREE.GTAOPass: Unknown output type.' );
416
+
417
+ }
418
+
419
+ }
420
+
421
+ renderPass( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) {
422
+
423
+ // save original state
424
+ renderer.getClearColor( this.originalClearColor );
425
+ const originalClearAlpha = renderer.getClearAlpha();
426
+ const originalAutoClear = renderer.autoClear;
427
+
428
+ renderer.setRenderTarget( renderTarget );
429
+
430
+ // setup pass state
431
+ renderer.autoClear = false;
432
+ if ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {
433
+
434
+ renderer.setClearColor( clearColor );
435
+ renderer.setClearAlpha( clearAlpha || 0.0 );
436
+ renderer.clear();
437
+
438
+ }
439
+
440
+ this.fsQuad.material = passMaterial;
441
+ this.fsQuad.render( renderer );
442
+
443
+ // restore original state
444
+ renderer.autoClear = originalAutoClear;
445
+ renderer.setClearColor( this.originalClearColor );
446
+ renderer.setClearAlpha( originalClearAlpha );
447
+
448
+ }
449
+
450
+ renderOverride( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {
451
+
452
+ renderer.getClearColor( this.originalClearColor );
453
+ const originalClearAlpha = renderer.getClearAlpha();
454
+ const originalAutoClear = renderer.autoClear;
455
+
456
+ renderer.setRenderTarget( renderTarget );
457
+ renderer.autoClear = false;
458
+
459
+ clearColor = overrideMaterial.clearColor || clearColor;
460
+ clearAlpha = overrideMaterial.clearAlpha || clearAlpha;
461
+
462
+ if ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {
463
+
464
+ renderer.setClearColor( clearColor );
465
+ renderer.setClearAlpha( clearAlpha || 0.0 );
466
+ renderer.clear();
467
+
468
+ }
469
+
470
+ this.scene.overrideMaterial = overrideMaterial;
471
+ renderer.render( this.scene, this.camera );
472
+ this.scene.overrideMaterial = null;
473
+
474
+ renderer.autoClear = originalAutoClear;
475
+ renderer.setClearColor( this.originalClearColor );
476
+ renderer.setClearAlpha( originalClearAlpha );
477
+
478
+ }
479
+
480
+ setSize( width, height ) {
481
+
482
+ this.width = width;
483
+ this.height = height;
484
+
485
+ this.gtaoRenderTarget.setSize( width, height );
486
+ this.normalRenderTarget.setSize( width, height );
487
+ this.pdRenderTarget.setSize( width, height );
488
+
489
+ this.gtaoMaterial.uniforms.resolution.value.set( width, height );
490
+ this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy( this.camera.projectionMatrix );
491
+ this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
492
+
493
+ this.pdMaterial.uniforms.resolution.value.set( width, height );
494
+ this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
495
+
496
+ }
497
+
498
+ overrideVisibility() {
499
+
500
+ const scene = this.scene;
501
+ const cache = this._visibilityCache;
502
+
503
+ scene.traverse( function ( object ) {
504
+
505
+ cache.set( object, object.visible );
506
+
507
+ if ( object.isPoints || object.isLine ) object.visible = false;
508
+
509
+ } );
510
+
511
+ }
512
+
513
+ restoreVisibility() {
514
+
515
+ const scene = this.scene;
516
+ const cache = this._visibilityCache;
517
+
518
+ scene.traverse( function ( object ) {
519
+
520
+ const visible = cache.get( object );
521
+ object.visible = visible;
522
+
523
+ } );
524
+
525
+ cache.clear();
526
+
527
+ }
528
+
529
+ generateNoise( size = 64 ) {
530
+
531
+ const simplex = new SimplexNoise();
532
+
533
+ const arraySize = size * size * 4;
534
+ const data = new Uint8Array( arraySize );
535
+
536
+ for ( let i = 0; i < size; i ++ ) {
537
+
538
+ for ( let j = 0; j < size; j ++ ) {
539
+
540
+ const x = i;
541
+ const y = j;
542
+
543
+ data[ ( i * size + j ) * 4 ] = ( simplex.noise( x, y ) * 0.5 + 0.5 ) * 255;
544
+ data[ ( i * size + j ) * 4 + 1 ] = ( simplex.noise( x + size, y ) * 0.5 + 0.5 ) * 255;
545
+ data[ ( i * size + j ) * 4 + 2 ] = ( simplex.noise( x, y + size ) * 0.5 + 0.5 ) * 255;
546
+ data[ ( i * size + j ) * 4 + 3 ] = ( simplex.noise( x + size, y + size ) * 0.5 + 0.5 ) * 255;
547
+
548
+ }
549
+
550
+ }
551
+
552
+ const noiseTexture = new DataTexture( data, size, size, RGBAFormat, UnsignedByteType );
553
+ noiseTexture.wrapS = RepeatWrapping;
554
+ noiseTexture.wrapT = RepeatWrapping;
555
+ noiseTexture.needsUpdate = true;
556
+
557
+ return noiseTexture;
558
+
559
+ }
560
+
561
+ }
562
+
563
+ GTAOPass.OUTPUT = {
564
+ 'Default': 0,
565
+ 'Diffuse': 1,
566
+ 'Depth': 2,
567
+ 'Normal': 3,
568
+ 'AO': 4,
569
+ 'Denoise': 5,
570
+ };
571
+
572
+ export { GTAOPass };
@@ -5,6 +5,7 @@ import {
5
5
  LinearToneMapping,
6
6
  ReinhardToneMapping,
7
7
  CineonToneMapping,
8
+ AgXToneMapping,
8
9
  ACESFilmicToneMapping,
9
10
  SRGBTransfer
10
11
  } from 'three';
@@ -59,6 +60,7 @@ class OutputPass extends Pass {
59
60
  else if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';
60
61
  else if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';
61
62
  else if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';
63
+ else if ( this._toneMapping === AgXToneMapping ) this.material.defines.AGX_TONE_MAPPING = '';
62
64
 
63
65
  this.material.needsUpdate = true;
64
66
 
@@ -1,23 +1,18 @@
1
1
  class Animation {
2
2
 
3
- constructor() {
3
+ constructor( nodes, info ) {
4
4
 
5
- this.nodes = null;
5
+ this.nodes = nodes;
6
+ this.info = info;
6
7
 
7
8
  this.animationLoop = null;
8
9
  this.requestId = null;
9
10
 
10
- this.isAnimating = false;
11
-
12
- this.context = self;
11
+ this._init();
13
12
 
14
13
  }
15
14
 
16
- start() {
17
-
18
- if ( this.isAnimating === true || this.animationLoop === null || this.nodes === null ) return;
19
-
20
- this.isAnimating = true;
15
+ _init() {
21
16
 
22
17
  const update = ( time, frame ) => {
23
18
 
@@ -25,20 +20,20 @@ class Animation {
25
20
 
26
21
  this.nodes.nodeFrame.update();
27
22
 
28
- this.animationLoop( time, frame );
23
+ this.info.frame = this.nodes.nodeFrame.frameId;
24
+
25
+ if ( this.animationLoop !== null ) this.animationLoop( time, frame );
29
26
 
30
27
  };
31
28
 
32
- this.requestId = self.requestAnimationFrame( update );
29
+ update();
33
30
 
34
31
  }
35
32
 
36
- stop() {
33
+ dispose() {
37
34
 
38
35
  self.cancelAnimationFrame( this.requestId );
39
36
 
40
- this.isAnimating = false;
41
-
42
37
  }
43
38
 
44
39
  setAnimationLoop( callback ) {
@@ -47,12 +42,6 @@ class Animation {
47
42
 
48
43
  }
49
44
 
50
- setNodes( nodes ) {
51
-
52
- this.nodes = nodes;
53
-
54
- }
55
-
56
45
  }
57
46
 
58
47
  export default Animation;
@@ -1,6 +1,8 @@
1
1
  let vector2 = null;
2
2
  let vector4 = null;
3
+ let color4 = null;
3
4
 
5
+ import Color4 from './Color4.js';
4
6
  import { Vector2, Vector4, REVISION, createCanvasElement } from 'three';
5
7
 
6
8
  class Backend {
@@ -52,9 +54,9 @@ class Backend {
52
54
 
53
55
  // cache key
54
56
 
55
- needsUpdate( renderObject ) { } // return Boolean ( fast test )
57
+ needsRenderUpdate( renderObject ) { } // return Boolean ( fast test )
56
58
 
57
- getCacheKey( renderObject ) { } // return String
59
+ getRenderCacheKey( renderObject ) { } // return String
58
60
 
59
61
  // node builder
60
62
 
@@ -112,6 +114,20 @@ class Backend {
112
114
 
113
115
  }
114
116
 
117
+ getClearColor() {
118
+
119
+ const renderer = this.renderer;
120
+
121
+ color4 = color4 || new Color4();
122
+
123
+ renderer.getClearColor( color4 );
124
+
125
+ color4.getRGB( color4, this.renderer.currentColorSpace );
126
+
127
+ return color4;
128
+
129
+ }
130
+
115
131
  getDomElement() {
116
132
 
117
133
  let domElement = this.domElement;
@@ -121,7 +137,7 @@ class Backend {
121
137
  domElement = ( this.parameters.canvas !== undefined ) ? this.parameters.canvas : createCanvasElement();
122
138
 
123
139
  // OffscreenCanvas does not have setAttribute, see #22811
124
- if ( 'setAttribute' in domElement ) domElement.setAttribute( 'data-engine', `three.js r${REVISION}` );
140
+ if ( 'setAttribute' in domElement ) domElement.setAttribute( 'data-engine', `three.js r${REVISION} webgpu` );
125
141
 
126
142
  this.domElement = domElement;
127
143