super-three 0.160.1 → 0.162.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 (225) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +867 -499
  3. package/build/three.module.js +867 -496
  4. package/build/three.module.min.js +1 -1
  5. package/examples/jsm/Addons.js +5 -1
  6. package/examples/jsm/capabilities/WebGPU.js +13 -9
  7. package/examples/jsm/controls/DragControls.js +91 -30
  8. package/examples/jsm/controls/OrbitControls.js +130 -15
  9. package/examples/jsm/controls/TransformControls.js +6 -6
  10. package/examples/jsm/curves/NURBSUtils.js +59 -4
  11. package/examples/jsm/curves/NURBSVolume.js +62 -0
  12. package/examples/jsm/exporters/GLTFExporter.js +11 -1
  13. package/examples/jsm/exporters/USDZExporter.js +8 -7
  14. package/examples/jsm/helpers/TextureHelper.js +3 -3
  15. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  16. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  17. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  18. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  19. package/examples/jsm/libs/tween.module.js +32 -14
  20. package/examples/jsm/loaders/3DMLoader.js +57 -64
  21. package/examples/jsm/loaders/DDSLoader.js +1 -0
  22. package/examples/jsm/loaders/KTX2Loader.js +20 -5
  23. package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
  24. package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
  25. package/examples/jsm/loaders/LUTImageLoader.js +3 -2
  26. package/examples/jsm/loaders/MaterialXLoader.js +115 -16
  27. package/examples/jsm/loaders/SVGLoader.js +4 -3
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +7 -3
  30. package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/misc/Timer.js +13 -4
  33. package/examples/jsm/nodes/Nodes.js +24 -11
  34. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  35. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
  36. package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
  37. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  38. package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
  39. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  41. package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
  42. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +45 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
  48. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  49. package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
  50. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  51. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  52. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  53. package/examples/jsm/nodes/core/Node.js +14 -4
  54. package/examples/jsm/nodes/core/NodeBuilder.js +26 -27
  55. package/examples/jsm/nodes/core/NodeFrame.js +18 -10
  56. package/examples/jsm/nodes/core/TempNode.js +1 -1
  57. package/examples/jsm/nodes/core/constants.js +1 -0
  58. package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
  59. package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
  60. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  61. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
  62. package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
  63. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  64. package/examples/jsm/nodes/display/PassNode.js +3 -2
  65. package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
  66. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
  67. package/examples/jsm/nodes/display/ViewportNode.js +0 -2
  68. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
  69. package/examples/jsm/nodes/fog/FogNode.js +2 -1
  70. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
  72. package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
  73. package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
  77. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -10
  78. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
  79. package/examples/jsm/nodes/math/CondNode.js +42 -7
  80. package/examples/jsm/nodes/math/MathNode.js +32 -2
  81. package/examples/jsm/nodes/math/MathUtils.js +15 -0
  82. package/examples/jsm/nodes/math/OperatorNode.js +13 -5
  83. package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
  85. package/examples/jsm/nodes/utils/JoinNode.js +2 -2
  86. package/examples/jsm/nodes/utils/LoopNode.js +5 -3
  87. package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
  88. package/examples/jsm/nodes/utils/RotateNode.js +68 -0
  89. package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
  90. package/examples/jsm/nodes/utils/SplitNode.js +4 -4
  91. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  92. package/examples/jsm/objects/GroundedSkybox.js +50 -0
  93. package/examples/jsm/objects/QuadMesh.js +8 -2
  94. package/examples/jsm/objects/Water2.js +8 -8
  95. package/examples/jsm/postprocessing/GTAOPass.js +11 -1
  96. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  97. package/examples/jsm/renderers/common/Backend.js +14 -0
  98. package/examples/jsm/renderers/common/Background.js +2 -2
  99. package/examples/jsm/renderers/common/Bindings.js +1 -1
  100. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  101. package/examples/jsm/renderers/common/DataMap.js +1 -1
  102. package/examples/jsm/renderers/common/Info.js +25 -1
  103. package/examples/jsm/renderers/common/Pipelines.js +8 -8
  104. package/examples/jsm/renderers/common/PostProcessing.js +2 -2
  105. package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
  106. package/examples/jsm/renderers/common/RenderContext.js +2 -0
  107. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  108. package/examples/jsm/renderers/common/RenderObject.js +46 -1
  109. package/examples/jsm/renderers/common/RenderObjects.js +3 -1
  110. package/examples/jsm/renderers/common/Renderer.js +290 -17
  111. package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
  112. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  113. package/examples/jsm/renderers/common/Textures.js +28 -18
  114. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  115. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
  116. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  117. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  118. package/examples/jsm/renderers/common/nodes/Nodes.js +5 -2
  119. package/examples/jsm/renderers/webgl/WebGLBackend.js +653 -272
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +171 -39
  121. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +95 -8
  122. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
  123. package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
  124. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +424 -11
  125. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
  126. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
  127. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
  128. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +300 -112
  129. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
  130. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +71 -79
  131. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -1
  132. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
  133. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +87 -14
  134. package/examples/jsm/shaders/OutputShader.js +4 -0
  135. package/examples/jsm/transpiler/AST.js +1 -1
  136. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  137. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  138. package/examples/jsm/transpiler/TSLEncoder.js +1 -1
  139. package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
  140. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  141. package/examples/jsm/utils/SortUtils.js +2 -0
  142. package/examples/jsm/webxr/ARButton.js +12 -2
  143. package/examples/jsm/webxr/VRButton.js +25 -7
  144. package/examples/jsm/webxr/XRButton.js +12 -3
  145. package/examples/jsm/webxr/XRControllerModelFactory.js +14 -1
  146. package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
  147. package/package.json +5 -4
  148. package/src/Three.Legacy.js +20 -0
  149. package/src/Three.js +0 -1
  150. package/src/audio/Audio.js +1 -3
  151. package/src/cameras/PerspectiveCamera.js +35 -0
  152. package/src/constants.js +2 -6
  153. package/src/core/BufferAttribute.js +2 -12
  154. package/src/core/BufferGeometry.js +23 -29
  155. package/src/core/InterleavedBuffer.js +2 -1
  156. package/src/core/InterleavedBufferAttribute.js +20 -0
  157. package/src/core/Object3D.js +11 -0
  158. package/src/core/Raycaster.js +18 -4
  159. package/src/core/RenderTarget.js +44 -21
  160. package/src/extras/PMREMGenerator.js +2 -0
  161. package/src/extras/curves/EllipseCurve.js +2 -2
  162. package/src/helpers/SpotLightHelper.js +18 -1
  163. package/src/loaders/DataTextureLoader.js +0 -4
  164. package/src/loaders/MaterialLoader.js +1 -0
  165. package/src/loaders/ObjectLoader.js +2 -1
  166. package/src/materials/Material.js +2 -1
  167. package/src/materials/MeshBasicMaterial.js +3 -0
  168. package/src/materials/MeshLambertMaterial.js +3 -0
  169. package/src/materials/MeshPhongMaterial.js +3 -0
  170. package/src/materials/MeshStandardMaterial.js +3 -0
  171. package/src/materials/ShaderMaterial.js +2 -1
  172. package/src/math/Quaternion.js +13 -12
  173. package/src/math/Triangle.js +0 -30
  174. package/src/math/Vector3.js +7 -7
  175. package/src/objects/BatchedMesh.js +6 -7
  176. package/src/objects/InstancedMesh.js +53 -0
  177. package/src/objects/Mesh.js +0 -1
  178. package/src/objects/SkinnedMesh.js +0 -8
  179. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  180. package/src/renderers/WebGLRenderer.js +20 -23
  181. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
  182. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
  183. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  184. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  185. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  186. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  187. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  188. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  189. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +38 -7
  190. package/src/renderers/shaders/ShaderChunk.js +2 -0
  191. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  192. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -2
  193. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +3 -2
  194. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -1
  195. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -2
  196. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  197. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
  198. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +4 -1
  199. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  200. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -1
  201. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -1
  202. package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -1
  203. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  204. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderLib.js +2 -1
  206. package/src/renderers/shaders/UniformsLib.js +1 -0
  207. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  208. package/src/renderers/webgl/WebGLBackground.js +18 -0
  209. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  210. package/src/renderers/webgl/WebGLMaterials.js +24 -1
  211. package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
  212. package/src/renderers/webgl/WebGLProgram.js +42 -4
  213. package/src/renderers/webgl/WebGLPrograms.js +38 -27
  214. package/src/renderers/webgl/WebGLState.js +11 -21
  215. package/src/renderers/webgl/WebGLTextures.js +170 -66
  216. package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
  217. package/src/renderers/webxr/WebXRManager.js +46 -0
  218. package/src/scenes/Scene.js +8 -0
  219. package/src/textures/Source.js +1 -0
  220. package/src/textures/Texture.js +1 -29
  221. package/build/three.js +0 -54519
  222. package/build/three.min.js +0 -7
  223. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  224. package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
  225. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -11,6 +11,7 @@ import Textures from './Textures.js';
11
11
  import Background from './Background.js';
12
12
  import Nodes from './nodes/Nodes.js';
13
13
  import Color4 from './Color4.js';
14
+ import ClippingContext from './ClippingContext.js';
14
15
  import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
15
16
 
16
17
  const _scene = new Scene();
@@ -30,6 +31,7 @@ class Renderer {
30
31
 
31
32
  const {
32
33
  logarithmicDepthBuffer = false,
34
+ alpha = true
33
35
  } = parameters;
34
36
 
35
37
  // public
@@ -43,6 +45,8 @@ class Renderer {
43
45
  this.autoClearDepth = true;
44
46
  this.autoClearStencil = true;
45
47
 
48
+ this.alpha = alpha;
49
+
46
50
  this.logarithmicDepthBuffer = logarithmicDepthBuffer;
47
51
 
48
52
  this.outputColorSpace = SRGBColorSpace;
@@ -55,6 +59,8 @@ class Renderer {
55
59
  this.depth = true;
56
60
  this.stencil = true;
57
61
 
62
+ this.clippingPlanes = [];
63
+
58
64
  this.info = new Info();
59
65
 
60
66
  // internals
@@ -67,7 +73,6 @@ class Renderer {
67
73
  this._scissor = new Vector4( 0, 0, this._width, this._height );
68
74
  this._scissorTest = false;
69
75
 
70
- this._properties = null;
71
76
  this._attributes = null;
72
77
  this._geometries = null;
73
78
  this._nodes = null;
@@ -85,7 +90,10 @@ class Renderer {
85
90
  this._opaqueSort = null;
86
91
  this._transparentSort = null;
87
92
 
88
- this._clearColor = new Color4( 0x000000 );
93
+
94
+ const alphaClear = this.alpha === true ? 0 : 1;
95
+
96
+ this._clearColor = new Color4( 0, 0, 0, alphaClear );
89
97
  this._clearDepth = 1;
90
98
  this._clearStencil = 0;
91
99
 
@@ -96,9 +104,13 @@ class Renderer {
96
104
  this._renderObjectFunction = null;
97
105
  this._currentRenderObjectFunction = null;
98
106
 
107
+ this._handleObjectFunction = this._renderObjectDirect;
108
+
99
109
  this._initialized = false;
100
110
  this._initPromise = null;
101
111
 
112
+ this._compilationPromises = null;
113
+
102
114
  // backwards compatibility
103
115
 
104
116
  this.shadowMap = {
@@ -146,7 +158,7 @@ class Renderer {
146
158
  this._attributes = new Attributes( backend );
147
159
  this._background = new Background( this, this._nodes );
148
160
  this._geometries = new Geometries( this._attributes, this.info );
149
- this._textures = new Textures( backend, this.info );
161
+ this._textures = new Textures( this, backend, this.info );
150
162
  this._pipelines = new Pipelines( backend, this._nodes );
151
163
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
152
164
  this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
@@ -171,16 +183,156 @@ class Renderer {
171
183
 
172
184
  }
173
185
 
174
- async compile( /*scene, camera*/ ) {
186
+ async compileAsync( scene, camera, targetScene = null ) {
187
+
188
+ if ( this._initialized === false ) await this.init();
189
+
190
+ // preserve render tree
191
+
192
+ const nodeFrame = this._nodes.nodeFrame;
193
+
194
+ const previousRenderId = nodeFrame.renderId;
195
+ const previousRenderContext = this._currentRenderContext;
196
+ const previousRenderObjectFunction = this._currentRenderObjectFunction;
197
+ const previousCompilationPromises = this._compilationPromises;
198
+
199
+ //
200
+
201
+ const sceneRef = ( scene.isScene === true ) ? scene : _scene;
202
+
203
+ if ( targetScene === null ) targetScene = scene;
204
+
205
+ const renderTarget = this._renderTarget;
206
+ const renderContext = this._renderContexts.get( targetScene, camera, renderTarget );
207
+ const activeMipmapLevel = this._activeMipmapLevel;
208
+
209
+ const compilationPromises = [];
210
+
211
+ this._currentRenderContext = renderContext;
212
+ this._currentRenderObjectFunction = this.renderObject;
213
+
214
+ this._handleObjectFunction = this._createObjectPipeline;
215
+
216
+ this._compilationPromises = compilationPromises;
217
+
218
+ nodeFrame.renderId ++;
219
+
220
+ //
221
+
222
+ nodeFrame.update();
223
+
224
+ //
225
+
226
+ renderContext.depth = this.depth;
227
+ renderContext.stencil = this.stencil;
228
+
229
+ if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
230
+ renderContext.clippingContext.updateGlobal( this, camera );
231
+
232
+ //
233
+
234
+ sceneRef.onBeforeRender( this, scene, camera, renderTarget );
235
+
236
+ //
237
+
238
+ const renderList = this._renderLists.get( scene, camera );
239
+ renderList.begin();
240
+
241
+ this._projectObject( scene, camera, 0, renderList );
242
+
243
+ // include lights from target scene
244
+ if ( targetScene !== scene ) {
245
+
246
+ targetScene.traverseVisible( function ( object ) {
247
+
248
+ if ( object.isLight && object.layers.test( camera.layers ) ) {
249
+
250
+ renderList.pushLight( object );
251
+
252
+ }
253
+
254
+ } );
255
+
256
+ }
257
+
258
+ renderList.finish();
259
+
260
+ //
261
+
262
+ if ( renderTarget !== null ) {
263
+
264
+ this._textures.updateRenderTarget( renderTarget, activeMipmapLevel );
265
+
266
+ const renderTargetData = this._textures.get( renderTarget );
267
+
268
+ renderContext.textures = renderTargetData.textures;
269
+ renderContext.depthTexture = renderTargetData.depthTexture;
270
+
271
+ } else {
272
+
273
+ renderContext.textures = null;
274
+ renderContext.depthTexture = null;
275
+
276
+ }
175
277
 
176
- console.warn( 'THREE.Renderer: .compile() is not implemented yet.' );
278
+ //
279
+
280
+ this._nodes.updateScene( sceneRef );
281
+
282
+ //
283
+
284
+ this._background.update( sceneRef, renderList, renderContext );
285
+
286
+ // process render lists
287
+
288
+ const opaqueObjects = renderList.opaque;
289
+ const transparentObjects = renderList.transparent;
290
+ const lightsNode = renderList.lightsNode;
291
+
292
+ if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
293
+ if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode );
294
+
295
+ // restore render tree
296
+
297
+ nodeFrame.renderId = previousRenderId;
298
+
299
+ this._currentRenderContext = previousRenderContext;
300
+ this._currentRenderObjectFunction = previousRenderObjectFunction;
301
+ this._compilationPromises = previousCompilationPromises;
302
+
303
+ this._handleObjectFunction = this._renderObjectDirect;
304
+
305
+ // wait for all promises setup by backends awaiting compilation/linking/pipeline creation to complete
306
+
307
+ await Promise.all( compilationPromises );
177
308
 
178
309
  }
179
310
 
180
- async render( scene, camera ) {
311
+ async renderAsync( scene, camera ) {
181
312
 
182
313
  if ( this._initialized === false ) await this.init();
183
314
 
315
+ const renderContext = this._renderContext( scene, camera );
316
+
317
+ await this.backend.resolveTimestampAsync( renderContext, 'render' );
318
+
319
+ }
320
+
321
+ render( scene, camera ) {
322
+
323
+ if ( this._initialized === false ) {
324
+
325
+ console.error( 'THREE.Renderer: .render() called before the backend is initialized. Try using .renderAsync() instead.' );
326
+ return;
327
+
328
+ }
329
+
330
+ this._renderContext( scene, camera );
331
+
332
+ }
333
+
334
+ _renderContext( scene, camera ) {
335
+
184
336
  // preserve render tree
185
337
 
186
338
  const nodeFrame = this._nodes.nodeFrame;
@@ -261,8 +413,8 @@ class Renderer {
261
413
  renderContext.scissorValue.width >>= activeMipmapLevel;
262
414
  renderContext.scissorValue.height >>= activeMipmapLevel;
263
415
 
264
- renderContext.depth = this.depth;
265
- renderContext.stencil = this.stencil;
416
+ if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
417
+ renderContext.clippingContext.updateGlobal( this, camera );
266
418
 
267
419
  //
268
420
 
@@ -299,6 +451,8 @@ class Renderer {
299
451
  renderContext.width = renderTargetData.width;
300
452
  renderContext.height = renderTargetData.height;
301
453
  renderContext.renderTarget = renderTarget;
454
+ renderContext.depth = renderTarget.depthBuffer;
455
+ renderContext.stencil = renderTarget.stencilBuffer;
302
456
 
303
457
  } else {
304
458
 
@@ -306,6 +460,8 @@ class Renderer {
306
460
  renderContext.depthTexture = null;
307
461
  renderContext.width = this.domElement.width;
308
462
  renderContext.height = this.domElement.height;
463
+ renderContext.depth = this.depth;
464
+ renderContext.stencil = this.stencil;
309
465
 
310
466
  }
311
467
 
@@ -351,6 +507,10 @@ class Renderer {
351
507
 
352
508
  sceneRef.onAfterRender( this, scene, camera, renderTarget );
353
509
 
510
+ //
511
+
512
+ return renderContext;
513
+
354
514
  }
355
515
 
356
516
  getMaxAnisotropy() {
@@ -395,7 +555,7 @@ class Renderer {
395
555
 
396
556
  getContext() {
397
557
 
398
- return this._context;
558
+ return this.backend.getContext();
399
559
 
400
560
  }
401
561
 
@@ -513,6 +673,8 @@ class Renderer {
513
673
 
514
674
  this._scissorTest = boolean;
515
675
 
676
+ this.backend.setScissorTest( boolean );
677
+
516
678
  }
517
679
 
518
680
  getViewport( target ) {
@@ -616,19 +778,45 @@ class Renderer {
616
778
 
617
779
  clearColor() {
618
780
 
619
- this.clear( true, false, false );
781
+ return this.clear( true, false, false );
620
782
 
621
783
  }
622
784
 
623
785
  clearDepth() {
624
786
 
625
- this.clear( false, true, false );
787
+ return this.clear( false, true, false );
626
788
 
627
789
  }
628
790
 
629
791
  clearStencil() {
630
792
 
631
- this.clear( false, false, true );
793
+ return this.clear( false, false, true );
794
+
795
+ }
796
+
797
+ async clearAsync( color = true, depth = true, stencil = true ) {
798
+
799
+ if ( this._initialized === false ) await this.init();
800
+
801
+ this.clear( color, depth, stencil );
802
+
803
+ }
804
+
805
+ clearColorAsync() {
806
+
807
+ return this.clearAsync( true, false, false );
808
+
809
+ }
810
+
811
+ clearDepthAsync() {
812
+
813
+ return this.clearAsync( false, true, false );
814
+
815
+ }
816
+
817
+ clearStencilAsync() {
818
+
819
+ return this.clearAsync( false, false, true );
632
820
 
633
821
  }
634
822
 
@@ -654,7 +842,6 @@ class Renderer {
654
842
 
655
843
  this._animation.dispose();
656
844
  this._objects.dispose();
657
- this._properties.dispose();
658
845
  this._pipelines.dispose();
659
846
  this._nodes.dispose();
660
847
  this._bindings.dispose();
@@ -693,7 +880,7 @@ class Renderer {
693
880
 
694
881
  }
695
882
 
696
- async compute( computeNodes ) {
883
+ async computeAsync( computeNodes ) {
697
884
 
698
885
  if ( this._initialized === false ) await this.init();
699
886
 
@@ -705,10 +892,12 @@ class Renderer {
705
892
 
706
893
  this.info.calls ++;
707
894
  this.info.compute.calls ++;
895
+ this.info.compute.computeCalls ++;
708
896
 
709
897
  nodeFrame.renderId = this.info.calls;
710
898
 
711
899
  //
900
+ if ( this.info.autoReset === true ) this.info.resetCompute();
712
901
 
713
902
  const backend = this.backend;
714
903
  const pipelines = this._pipelines;
@@ -760,12 +949,20 @@ class Renderer {
760
949
 
761
950
  backend.finishCompute( computeNodes );
762
951
 
952
+ await this.backend.resolveTimestampAsync( computeNodes, 'compute' );
953
+
763
954
  //
764
955
 
765
956
  nodeFrame.renderId = previousRenderId;
766
957
 
767
958
  }
768
959
 
960
+ hasFeatureAsync( name ) {
961
+
962
+ return this.backend.hasFeatureAsync( name );
963
+
964
+ }
965
+
769
966
  hasFeature( name ) {
770
967
 
771
968
  return this.backend.hasFeature( name );
@@ -943,6 +1140,7 @@ class Renderer {
943
1140
  renderObject( object, scene, camera, geometry, material, group, lightsNode ) {
944
1141
 
945
1142
  let overridePositionNode;
1143
+ let overrideFragmentNode;
946
1144
 
947
1145
  //
948
1146
 
@@ -964,6 +1162,45 @@ class Renderer {
964
1162
 
965
1163
  }
966
1164
 
1165
+ if ( overrideMaterial.isShadowNodeMaterial ) {
1166
+
1167
+ overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
1168
+
1169
+ if ( material.shadowNode && material.shadowNode.isNode ) {
1170
+
1171
+ overrideFragmentNode = overrideMaterial.fragmentNode;
1172
+ overrideMaterial.fragmentNode = material.shadowNode;
1173
+
1174
+ }
1175
+
1176
+ if ( this.localClippingEnabled ) {
1177
+
1178
+ if ( material.clipShadows ) {
1179
+
1180
+ if ( overrideMaterial.clippingPlanes !== material.clippingPlanes ) {
1181
+
1182
+ overrideMaterial.clippingPlanes = material.clippingPlanes;
1183
+ overrideMaterial.needsUpdate = true;
1184
+
1185
+ }
1186
+
1187
+ if ( overrideMaterial.clipIntersection !== material.clipIntersection ) {
1188
+
1189
+ overrideMaterial.clipIntersection = material.clipIntersection;
1190
+
1191
+ }
1192
+
1193
+ } else if ( Array.isArray( overrideMaterial.clippingPlanes ) ) {
1194
+
1195
+ overrideMaterial.clippingPlanes = null;
1196
+ overrideMaterial.needsUpdate = true;
1197
+
1198
+ }
1199
+
1200
+ }
1201
+
1202
+ }
1203
+
967
1204
  material = overrideMaterial;
968
1205
 
969
1206
  }
@@ -973,16 +1210,16 @@ class Renderer {
973
1210
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
974
1211
 
975
1212
  material.side = BackSide;
976
- this._renderObjectDirect( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
1213
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
977
1214
 
978
1215
  material.side = FrontSide;
979
- this._renderObjectDirect( object, material, scene, camera, lightsNode ); // use default pass id
1216
+ this._handleObjectFunction( object, material, scene, camera, lightsNode ); // use default pass id
980
1217
 
981
1218
  material.side = DoubleSide;
982
1219
 
983
1220
  } else {
984
1221
 
985
- this._renderObjectDirect( object, material, scene, camera, lightsNode );
1222
+ this._handleObjectFunction( object, material, scene, camera, lightsNode );
986
1223
 
987
1224
  }
988
1225
 
@@ -994,6 +1231,12 @@ class Renderer {
994
1231
 
995
1232
  }
996
1233
 
1234
+ if ( overrideFragmentNode !== undefined ) {
1235
+
1236
+ scene.overrideMaterial.fragmentNode = overrideFragmentNode;
1237
+
1238
+ }
1239
+
997
1240
  //
998
1241
 
999
1242
  object.onAfterRender( this, scene, camera, geometry, material, group );
@@ -1026,6 +1269,36 @@ class Renderer {
1026
1269
 
1027
1270
  }
1028
1271
 
1272
+ _createObjectPipeline( object, material, scene, camera, lightsNode, passId ) {
1273
+
1274
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1275
+
1276
+ //
1277
+
1278
+ this._nodes.updateBefore( renderObject );
1279
+
1280
+ //
1281
+
1282
+ this._nodes.updateForRender( renderObject );
1283
+ this._geometries.updateForRender( renderObject );
1284
+ this._bindings.updateForRender( renderObject );
1285
+
1286
+ this._pipelines.getForRender( renderObject, this._compilationPromises );
1287
+
1288
+ }
1289
+
1290
+ get compute() {
1291
+
1292
+ return this.computeAsync;
1293
+
1294
+ }
1295
+
1296
+ get compile() {
1297
+
1298
+ return this.compileAsync;
1299
+
1300
+ }
1301
+
1029
1302
  }
1030
1303
 
1031
1304
  export default Renderer;
@@ -0,0 +1,17 @@
1
+ import { BufferAttribute } from 'three';
2
+
3
+ class StorageBufferAttribute extends BufferAttribute {
4
+
5
+ constructor( array, itemSize, typeClass = Float32Array ) {
6
+
7
+ if ( ArrayBuffer.isView( array ) === false ) array = new typeClass( array * itemSize );
8
+
9
+ super( array, itemSize );
10
+
11
+ this.isStorageBufferAttribute = true;
12
+
13
+ }
14
+
15
+ }
16
+
17
+ export default StorageBufferAttribute;
@@ -0,0 +1,17 @@
1
+ import { InstancedBufferAttribute } from 'three';
2
+
3
+ class StorageInstancedBufferAttribute extends InstancedBufferAttribute {
4
+
5
+ constructor( array, itemSize, typeClass = Float32Array ) {
6
+
7
+ if ( ArrayBuffer.isView( array ) === false ) array = new typeClass( array * itemSize );
8
+
9
+ super( array, itemSize );
10
+
11
+ this.isStorageInstancedBufferAttribute = true;
12
+
13
+ }
14
+
15
+ }
16
+
17
+ export default StorageInstancedBufferAttribute;
@@ -1,15 +1,16 @@
1
1
  import DataMap from './DataMap.js';
2
2
 
3
- import { Vector3, DepthTexture, DepthStencilFormat, UnsignedInt248Type, LinearFilter, NearestFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeReflectionMapping, CubeRefractionMapping } from 'three';
3
+ import { Vector3, DepthTexture, DepthStencilFormat, DepthFormat, UnsignedIntType, UnsignedInt248Type, LinearFilter, NearestFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeReflectionMapping, CubeRefractionMapping, UnsignedByteType } from 'three';
4
4
 
5
5
  const _size = new Vector3();
6
6
 
7
7
  class Textures extends DataMap {
8
8
 
9
- constructor( backend, info ) {
9
+ constructor( renderer, backend, info ) {
10
10
 
11
11
  super();
12
12
 
13
+ this.renderer = renderer;
13
14
  this.backend = backend;
14
15
  this.info = info;
15
16
 
@@ -22,19 +23,8 @@ class Textures extends DataMap {
22
23
  const sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
23
24
  const depthTextureMips = renderTargetData.depthTextureMips || ( renderTargetData.depthTextureMips = {} );
24
25
 
25
- let texture, textures;
26
-
27
- if ( renderTarget.isWebGLMultipleRenderTargets ) {
28
-
29
- textures = renderTarget.texture;
30
- texture = renderTarget.texture[ 0 ];
31
-
32
- } else {
33
-
34
- textures = [ renderTarget.texture ];
35
- texture = renderTarget.texture;
36
-
37
- }
26
+ const texture = renderTarget.texture;
27
+ const textures = renderTarget.textures;
38
28
 
39
29
  const size = this.getSize( texture );
40
30
 
@@ -47,8 +37,8 @@ class Textures extends DataMap {
47
37
  if ( depthTexture === undefined ) {
48
38
 
49
39
  depthTexture = new DepthTexture();
50
- depthTexture.format = DepthStencilFormat;
51
- depthTexture.type = UnsignedInt248Type;
40
+ depthTexture.format = renderTarget.stencilBuffer ? DepthStencilFormat : DepthFormat;
41
+ depthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType;
52
42
  depthTexture.image.width = mipWidth;
53
43
  depthTexture.image.height = mipHeight;
54
44
 
@@ -72,6 +62,7 @@ class Textures extends DataMap {
72
62
  renderTargetData.depthTexture = depthTexture;
73
63
  renderTargetData.depth = renderTarget.depthBuffer;
74
64
  renderTargetData.stencil = renderTarget.stencilBuffer;
65
+ renderTargetData.renderTarget = renderTarget;
75
66
 
76
67
  if ( renderTargetData.sampleCount !== sampleCount ) {
77
68
 
@@ -153,6 +144,25 @@ class Textures extends DataMap {
153
144
 
154
145
  //
155
146
 
147
+ if ( texture.isFramebufferTexture ) {
148
+
149
+ const renderer = this.renderer;
150
+ const renderTarget = renderer.getRenderTarget();
151
+
152
+ if ( renderTarget ) {
153
+
154
+ texture.type = renderTarget.texture.type;
155
+
156
+ } else {
157
+
158
+ texture.type = UnsignedByteType;
159
+
160
+ }
161
+
162
+ }
163
+
164
+ //
165
+
156
166
  const { width, height, depth } = this.getSize( texture );
157
167
 
158
168
  options.width = width;
@@ -214,7 +224,7 @@ class Textures extends DataMap {
214
224
 
215
225
  }
216
226
 
217
- backend.updateTexture( texture, options );
227
+ if ( texture.source.dataReady === true ) backend.updateTexture( texture, options );
218
228
 
219
229
  if ( options.needsMipmaps && texture.mipmaps.length === 0 ) backend.generateMipmaps( texture );
220
230
 
@@ -63,6 +63,8 @@ class UniformsGroup extends UniformBuffer {
63
63
 
64
64
  const uniform = this.uniforms[ i ];
65
65
 
66
+ const { boundary, itemSize } = uniform;
67
+
66
68
  // offset within a single chunk in bytes
67
69
 
68
70
  const chunkOffset = offset % GPU_CHUNK_BYTES;
@@ -70,23 +72,23 @@ class UniformsGroup extends UniformBuffer {
70
72
 
71
73
  // conformance tests
72
74
 
73
- if ( chunkOffset !== 0 && ( remainingSizeInChunk - uniform.boundary ) < 0 ) {
75
+ if ( chunkOffset !== 0 && ( remainingSizeInChunk - boundary ) < 0 ) {
74
76
 
75
77
  // check for chunk overflow
76
78
 
77
79
  offset += ( GPU_CHUNK_BYTES - chunkOffset );
78
80
 
79
- } else if ( chunkOffset % uniform.boundary !== 0 ) {
81
+ } else if ( chunkOffset % boundary !== 0 ) {
80
82
 
81
83
  // check for correct alignment
82
84
 
83
- offset += ( chunkOffset % uniform.boundary );
85
+ offset += ( chunkOffset % boundary );
84
86
 
85
87
  }
86
88
 
87
89
  uniform.offset = ( offset / this.bytesPerElement );
88
90
 
89
- offset += ( uniform.itemSize * this.bytesPerElement );
91
+ offset += ( itemSize * this.bytesPerElement );
90
92
 
91
93
  }
92
94
 
@@ -1,10 +1,11 @@
1
1
  class NodeBuilderState {
2
2
 
3
- constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes ) {
3
+ constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, transforms = [] ) {
4
4
 
5
5
  this.vertexShader = vertexShader;
6
6
  this.fragmentShader = fragmentShader;
7
7
  this.computeShader = computeShader;
8
+ this.transforms = transforms;
8
9
 
9
10
  this.nodeAttributes = nodeAttributes;
10
11
  this.bindings = bindings;
@@ -0,0 +1,23 @@
1
+ import StorageBuffer from '../StorageBuffer.js';
2
+
3
+ let _id = 0;
4
+
5
+ class NodeStorageBuffer extends StorageBuffer {
6
+
7
+ constructor( nodeUniform ) {
8
+
9
+ super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
10
+
11
+ this.nodeUniform = nodeUniform;
12
+
13
+ }
14
+
15
+ get buffer() {
16
+
17
+ return this.nodeUniform.value;
18
+
19
+ }
20
+
21
+ }
22
+
23
+ export default NodeStorageBuffer;