super-three 0.161.0 → 0.163.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 (206) hide show
  1. package/build/three.cjs +822 -1332
  2. package/build/three.module.js +820 -1328
  3. package/build/three.module.min.js +1 -1
  4. package/examples/jsm/controls/DragControls.js +91 -30
  5. package/examples/jsm/controls/OrbitControls.js +32 -6
  6. package/examples/jsm/controls/TransformControls.js +9 -9
  7. package/examples/jsm/exporters/GLTFExporter.js +30 -3
  8. package/examples/jsm/exporters/USDZExporter.js +15 -0
  9. package/examples/jsm/geometries/TextGeometry.js +10 -2
  10. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  11. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  12. package/examples/jsm/libs/fflate.module.js +694 -496
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  15. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  16. package/examples/jsm/libs/tween.module.js +32 -14
  17. package/examples/jsm/lines/LineMaterial.js +0 -2
  18. package/examples/jsm/loaders/3DMLoader.js +13 -21
  19. package/examples/jsm/loaders/3MFLoader.js +2 -0
  20. package/examples/jsm/loaders/EXRLoader.js +89 -19
  21. package/examples/jsm/loaders/FBXLoader.js +1 -1
  22. package/examples/jsm/loaders/GLTFLoader.js +6 -0
  23. package/examples/jsm/loaders/KTX2Loader.js +2 -6
  24. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  25. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  26. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  27. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +6 -2
  30. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/nodes/Nodes.js +15 -8
  33. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  34. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  35. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  36. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  37. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  39. package/examples/jsm/nodes/accessors/MorphNode.js +20 -10
  40. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  41. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  42. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
  47. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  48. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  49. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  50. package/examples/jsm/nodes/core/Node.js +67 -6
  51. package/examples/jsm/nodes/core/NodeBuilder.js +23 -24
  52. package/examples/jsm/nodes/core/NodeFrame.js +8 -8
  53. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  54. package/examples/jsm/nodes/core/TempNode.js +1 -1
  55. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  56. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  57. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  58. package/examples/jsm/nodes/display/PassNode.js +17 -1
  59. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  60. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  61. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  62. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  63. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  64. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  65. package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
  66. package/examples/jsm/nodes/materials/NodeMaterial.js +70 -17
  67. package/examples/jsm/nodes/math/CondNode.js +42 -7
  68. package/examples/jsm/nodes/math/MathNode.js +20 -0
  69. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  70. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  71. package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
  72. package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
  73. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  74. package/examples/jsm/nodes/utils/LoopNode.js +2 -0
  75. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  76. package/examples/jsm/objects/QuadMesh.js +7 -23
  77. package/examples/jsm/physics/RapierPhysics.js +4 -4
  78. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  79. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  80. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  81. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  82. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  83. package/examples/jsm/renderers/common/Animation.js +3 -0
  84. package/examples/jsm/renderers/common/Background.js +3 -3
  85. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  86. package/examples/jsm/renderers/common/Info.js +11 -19
  87. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  88. package/examples/jsm/renderers/common/RenderContext.js +3 -1
  89. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  90. package/examples/jsm/renderers/common/RenderObject.js +46 -3
  91. package/examples/jsm/renderers/common/RenderObjects.js +2 -0
  92. package/examples/jsm/renderers/common/Renderer.js +113 -39
  93. package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
  94. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  95. package/examples/jsm/renderers/common/Textures.js +3 -13
  96. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  97. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
  98. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  99. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  100. package/examples/jsm/renderers/common/nodes/Nodes.js +6 -18
  101. package/examples/jsm/renderers/webgl/WebGLBackend.js +174 -30
  102. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
  103. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +136 -11
  104. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +8 -2
  105. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  106. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +90 -0
  107. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -1
  108. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
  109. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
  110. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +67 -37
  111. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +20 -43
  112. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +32 -1
  113. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  114. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +94 -20
  115. package/examples/jsm/shaders/OutputShader.js +4 -0
  116. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  117. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  118. package/examples/jsm/utils/TextureUtils.js +1 -1
  119. package/examples/jsm/webxr/VRButton.js +13 -5
  120. package/examples/jsm/webxr/XRButton.js +0 -1
  121. package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
  122. package/package.json +4 -3
  123. package/src/Three.Legacy.js +20 -0
  124. package/src/Three.js +0 -2
  125. package/src/animation/AnimationClip.js +1 -1
  126. package/src/constants.js +4 -7
  127. package/src/core/BufferAttribute.js +0 -11
  128. package/src/core/BufferGeometry.js +23 -29
  129. package/src/core/Object3D.js +21 -7
  130. package/src/core/Raycaster.js +18 -4
  131. package/src/core/RenderTarget.js +44 -21
  132. package/src/extras/PMREMGenerator.js +11 -0
  133. package/src/extras/curves/EllipseCurve.js +2 -2
  134. package/src/helpers/SpotLightHelper.js +18 -1
  135. package/src/loaders/DataTextureLoader.js +0 -4
  136. package/src/loaders/MaterialLoader.js +1 -0
  137. package/src/loaders/ObjectLoader.js +4 -1
  138. package/src/materials/Material.js +2 -1
  139. package/src/materials/MeshBasicMaterial.js +3 -0
  140. package/src/materials/MeshLambertMaterial.js +3 -0
  141. package/src/materials/MeshPhongMaterial.js +3 -0
  142. package/src/materials/MeshStandardMaterial.js +3 -0
  143. package/src/materials/ShaderMaterial.js +0 -4
  144. package/src/math/Quaternion.js +13 -12
  145. package/src/math/Spherical.js +4 -5
  146. package/src/math/Vector3.js +7 -7
  147. package/src/objects/BatchedMesh.js +4 -3
  148. package/src/objects/InstancedMesh.js +63 -0
  149. package/src/objects/Mesh.js +0 -1
  150. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  151. package/src/renderers/WebGLRenderer.js +70 -136
  152. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  153. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  154. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  155. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  156. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  157. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  158. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  159. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  160. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  161. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  162. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  163. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
  164. package/src/renderers/shaders/ShaderChunk.js +2 -0
  165. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  166. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  167. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  168. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
  169. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
  170. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
  171. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
  172. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
  173. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
  174. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
  175. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
  176. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  178. package/src/renderers/shaders/ShaderLib.js +3 -2
  179. package/src/renderers/shaders/UniformsLib.js +1 -0
  180. package/src/renderers/shaders/UniformsUtils.js +10 -1
  181. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  182. package/src/renderers/webgl/WebGLBackground.js +18 -0
  183. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  184. package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
  185. package/src/renderers/webgl/WebGLCapabilities.js +2 -12
  186. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  187. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  188. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
  189. package/src/renderers/webgl/WebGLLights.js +6 -32
  190. package/src/renderers/webgl/WebGLMaterials.js +26 -4
  191. package/src/renderers/webgl/WebGLMorphtargets.js +79 -210
  192. package/src/renderers/webgl/WebGLProgram.js +30 -48
  193. package/src/renderers/webgl/WebGLPrograms.js +5 -14
  194. package/src/renderers/webgl/WebGLRenderStates.js +8 -6
  195. package/src/renderers/webgl/WebGLState.js +21 -75
  196. package/src/renderers/webgl/WebGLTextures.js +143 -275
  197. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  198. package/src/renderers/webgl/WebGLUtils.js +6 -57
  199. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  200. package/src/renderers/webxr/WebXRManager.js +2 -2
  201. package/src/scenes/Scene.js +14 -0
  202. package/src/textures/Texture.js +6 -24
  203. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  204. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  205. package/src/renderers/WebGL1Renderer.js +0 -7
  206. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -50,11 +50,11 @@ class Background extends DataMap {
50
50
 
51
51
  if ( backgroundMesh === undefined ) {
52
52
 
53
- const backgroundMeshNode = context( vec4( backgroundNode ), {
53
+ const backgroundMeshNode = context( vec4( backgroundNode ).mul( backgroundIntensity ), {
54
54
  // @TODO: Add Texture2D support using node context
55
55
  getUV: () => normalWorld,
56
56
  getTextureLevel: () => backgroundBlurriness
57
- } ).mul( backgroundIntensity );
57
+ } );
58
58
 
59
59
  let viewProj = modelViewProjection();
60
60
  viewProj = viewProj.setZ( viewProj.w );
@@ -83,7 +83,7 @@ class Background extends DataMap {
83
83
 
84
84
  if ( sceneData.backgroundCacheKey !== backgroundCacheKey ) {
85
85
 
86
- sceneData.backgroundMeshNode.node = vec4( backgroundNode );
86
+ sceneData.backgroundMeshNode.node = vec4( backgroundNode ).mul( backgroundIntensity );
87
87
 
88
88
  backgroundMesh.material.needsUpdate = true;
89
89
 
@@ -0,0 +1,165 @@
1
+ import { Matrix3, Plane, Vector4 } from 'three';
2
+
3
+ const _plane = new Plane();
4
+ const _viewNormalMatrix = new Matrix3();
5
+
6
+ let _clippingContextVersion = 0;
7
+
8
+ class ClippingContext {
9
+
10
+ constructor() {
11
+
12
+ this.version = ++ _clippingContextVersion;
13
+
14
+ this.globalClippingCount = 0;
15
+
16
+ this.localClippingCount = 0;
17
+ this.localClippingEnabled = false;
18
+ this.localClipIntersection = false;
19
+
20
+ this.planes = [];
21
+
22
+ this.parentVersion = 0;
23
+
24
+ }
25
+
26
+ projectPlanes( source, offset ) {
27
+
28
+ const l = source.length;
29
+ const planes = this.planes;
30
+
31
+ for ( let i = 0; i < l; i ++ ) {
32
+
33
+ _plane.copy( source[ i ] ).applyMatrix4( this.viewMatrix, _viewNormalMatrix );
34
+
35
+ const v = planes[ offset + i ];
36
+ const normal = _plane.normal;
37
+
38
+ v.x = - normal.x;
39
+ v.y = - normal.y;
40
+ v.z = - normal.z;
41
+ v.w = _plane.constant;
42
+
43
+ }
44
+
45
+ }
46
+
47
+ updateGlobal( renderer, camera ) {
48
+
49
+ const rendererClippingPlanes = renderer.clippingPlanes;
50
+ this.viewMatrix = camera.matrixWorldInverse;
51
+
52
+ _viewNormalMatrix.getNormalMatrix( this.viewMatrix );
53
+
54
+ let update = false;
55
+
56
+ if ( Array.isArray( rendererClippingPlanes ) && rendererClippingPlanes.length !== 0 ) {
57
+
58
+ const l = rendererClippingPlanes.length;
59
+
60
+ if ( l !== this.globalClippingCount ) {
61
+
62
+ const planes = [];
63
+
64
+ for ( let i = 0; i < l; i ++ ) {
65
+
66
+ planes.push( new Vector4() );
67
+
68
+ }
69
+
70
+ this.globalClippingCount = l;
71
+ this.planes = planes;
72
+
73
+ update = true;
74
+
75
+ }
76
+
77
+ this.projectPlanes( rendererClippingPlanes, 0 );
78
+
79
+ } else if ( this.globalClippingCount !== 0 ) {
80
+
81
+ this.globalClippingCount = 0;
82
+ this.planes = [];
83
+ update = true;
84
+
85
+ }
86
+
87
+ if ( renderer.localClippingEnabled !== this.localClippingEnabled ) {
88
+
89
+ this.localClippingEnabled = renderer.localClippingEnabled;
90
+ update = true;
91
+
92
+ }
93
+
94
+ if ( update ) this.version = _clippingContextVersion ++;
95
+
96
+ }
97
+
98
+ update( parent, material ) {
99
+
100
+ let update = false;
101
+
102
+ if ( this !== parent && parent.version !== this.parentVersion ) {
103
+
104
+ this.globalClippingCount = material.isShadowNodeMaterial ? 0 : parent.globalClippingCount;
105
+ this.localClippingEnabled = parent.localClippingEnabled;
106
+ this.planes = Array.from( parent.planes );
107
+ this.parentVersion = parent.version;
108
+ this.viewMatrix = parent.viewMatrix;
109
+
110
+
111
+ update = true;
112
+
113
+ }
114
+
115
+ if ( this.localClippingEnabled ) {
116
+
117
+ const localClippingPlanes = material.clippingPlanes;
118
+
119
+ if ( ( Array.isArray( localClippingPlanes ) && localClippingPlanes.length !== 0 ) ) {
120
+
121
+ const l = localClippingPlanes.length;
122
+ const planes = this.planes;
123
+ const offset = this.globalClippingCount;
124
+
125
+ if ( update || l !== this.localClippingCount ) {
126
+
127
+ planes.length = offset + l;
128
+
129
+ for ( let i = 0; i < l; i ++ ) {
130
+
131
+ planes[ offset + i ] = new Vector4();
132
+
133
+ }
134
+
135
+ this.localClippingCount = l;
136
+ update = true;
137
+
138
+ }
139
+
140
+ this.projectPlanes( localClippingPlanes, offset );
141
+
142
+
143
+ } else if ( this.localClippingCount !== 0 ) {
144
+
145
+ this.localClippingCount = 0;
146
+ update = true;
147
+
148
+ }
149
+
150
+ if ( this.localClipIntersection !== material.clipIntersection ) {
151
+
152
+ this.localClipIntersection = material.clipIntersection;
153
+ update = true;
154
+
155
+ }
156
+
157
+ }
158
+
159
+ if ( update ) this.version = _clippingContextVersion ++;
160
+
161
+ }
162
+
163
+ }
164
+
165
+ export default ClippingContext;
@@ -12,12 +12,14 @@ class Info {
12
12
  drawCalls: 0,
13
13
  triangles: 0,
14
14
  points: 0,
15
- lines: 0
15
+ lines: 0,
16
+ timestamp: 0
16
17
  };
17
18
 
18
19
  this.compute = {
19
20
  calls: 0,
20
- computeCalls: 0
21
+ computeCalls: 0,
22
+ timestamp: 0
21
23
  };
22
24
 
23
25
  this.memory = {
@@ -25,11 +27,6 @@ class Info {
25
27
  textures: 0
26
28
  };
27
29
 
28
- this.timestamp = {
29
- compute: 0,
30
- render: 0
31
- };
32
-
33
30
  }
34
31
 
35
32
  update( object, count, instanceCount ) {
@@ -62,26 +59,21 @@ class Info {
62
59
 
63
60
  updateTimestamp( type, time ) {
64
61
 
65
- this.timestamp[ type ] += time;
66
-
67
- }
68
-
69
- resetCompute() {
70
-
71
- this.compute.computeCalls = 0;
72
-
73
- this.timestamp.compute = 0;
62
+ this[ type ].timestamp += time;
74
63
 
75
64
  }
76
65
 
77
66
  reset() {
78
67
 
79
68
  this.render.drawCalls = 0;
69
+ this.compute.computeCalls = 0;
70
+
80
71
  this.render.triangles = 0;
81
72
  this.render.points = 0;
82
73
  this.render.lines = 0;
83
74
 
84
- this.timestamp.render = 0;
75
+ this.render.timestamp = 0;
76
+ this.compute.timestamp = 0;
85
77
 
86
78
  }
87
79
 
@@ -94,8 +86,8 @@ class Info {
94
86
  this.render.calls = 0;
95
87
  this.compute.calls = 0;
96
88
 
97
- this.timestamp.compute = 0;
98
- this.timestamp.render = 0;
89
+ this.render.timestamp = 0;
90
+ this.compute.timestamp = 0;
99
91
  this.memory.geometries = 0;
100
92
  this.memory.textures = 0;
101
93
 
@@ -1,7 +1,7 @@
1
- import { vec4, MeshBasicNodeMaterial } from '../../nodes/Nodes.js';
1
+ import { vec4, NodeMaterial } from '../../nodes/Nodes.js';
2
2
  import QuadMesh from '../../objects/QuadMesh.js';
3
3
 
4
- const quadMesh = new QuadMesh( new MeshBasicNodeMaterial() );
4
+ const quadMesh = new QuadMesh( new NodeMaterial() );
5
5
 
6
6
  class PostProcessing {
7
7
 
@@ -12,11 +12,19 @@ class PostProcessing {
12
12
 
13
13
  }
14
14
 
15
- async render() {
15
+ render() {
16
16
 
17
17
  quadMesh.material.fragmentNode = this.outputNode;
18
18
 
19
- await quadMesh.render( this.renderer );
19
+ quadMesh.render( this.renderer );
20
+
21
+ }
22
+
23
+ renderAsync() {
24
+
25
+ quadMesh.material.fragmentNode = this.outputNode;
26
+
27
+ return quadMesh.renderAsync( this.renderer );
20
28
 
21
29
  }
22
30
 
@@ -16,7 +16,7 @@ class RenderContext {
16
16
  this.clearDepth = true;
17
17
  this.clearDepthValue = 1;
18
18
 
19
- this.stencil = true;
19
+ this.stencil = false;
20
20
  this.clearStencil = true;
21
21
  this.clearStencilValue = 1;
22
22
 
@@ -34,6 +34,8 @@ class RenderContext {
34
34
  this.width = 0;
35
35
  this.height = 0;
36
36
 
37
+ this.isRenderContext = true;
38
+
37
39
  }
38
40
 
39
41
  }
@@ -21,19 +21,8 @@ class RenderContexts {
21
21
 
22
22
  } else {
23
23
 
24
- let format, count;
25
-
26
- if ( renderTarget.isWebGLMultipleRenderTargets ) {
27
-
28
- format = renderTarget.texture[ 0 ].format;
29
- count = renderTarget.texture.length;
30
-
31
- } else {
32
-
33
- format = renderTarget.texture.format;
34
- count = 1;
35
-
36
- }
24
+ const format = renderTarget.texture.format;
25
+ const count = renderTarget.count;
37
26
 
38
27
  attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
39
28
 
@@ -1,3 +1,5 @@
1
+ import ClippingContext from './ClippingContext.js';
2
+
1
3
  let id = 0;
2
4
 
3
5
  export default class RenderObject {
@@ -24,6 +26,10 @@ export default class RenderObject {
24
26
  this.pipeline = null;
25
27
  this.vertexBuffers = null;
26
28
 
29
+ this.updateClipping( renderContext.clippingContext );
30
+
31
+ this.clippingContextVersion = this.clippingContext.version;
32
+
27
33
  this.initialNodesCacheKey = this.getNodesCacheKey();
28
34
  this.initialCacheKey = this.getCacheKey();
29
35
 
@@ -44,6 +50,41 @@ export default class RenderObject {
44
50
 
45
51
  }
46
52
 
53
+ updateClipping( parent ) {
54
+
55
+ const material = this.material;
56
+
57
+ let clippingContext = this.clippingContext;
58
+
59
+ if ( Array.isArray( material.clippingPlanes ) ) {
60
+
61
+ if ( clippingContext === parent || ! clippingContext ) {
62
+
63
+ clippingContext = new ClippingContext();
64
+ this.clippingContext = clippingContext;
65
+
66
+ }
67
+
68
+ clippingContext.update( parent, material );
69
+
70
+ } else if ( this.clippingContext !== parent ) {
71
+
72
+ this.clippingContext = parent;
73
+
74
+ }
75
+
76
+ }
77
+
78
+ get clippingNeedsUpdate() {
79
+
80
+ if ( this.clippingContext.version === this.clippingContextVersion ) return false;
81
+
82
+ this.clippingContextVersion = this.clippingContext.version;
83
+
84
+ return true;
85
+
86
+ }
87
+
47
88
  getNodeBuilderState() {
48
89
 
49
90
  return this._nodeBuilderState || ( this._nodeBuilderState = this._nodes.getForRender( this ) );
@@ -114,7 +155,7 @@ export default class RenderObject {
114
155
 
115
156
  for ( const property in material ) {
116
157
 
117
- if ( /^(is[A-Z])|^(visible|version|uuid|name|opacity|userData)$/.test( property ) ) continue;
158
+ if ( /^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test( property ) ) continue;
118
159
 
119
160
  let value = material[ property ];
120
161
 
@@ -131,9 +172,11 @@ export default class RenderObject {
131
172
 
132
173
  }
133
174
 
175
+ cacheKey += this.clippingContextVersion + ',';
176
+
134
177
  if ( object.skeleton ) {
135
178
 
136
- cacheKey += object.skeleton.uuid + ',';
179
+ cacheKey += object.skeleton.bones.length + ',';
137
180
 
138
181
  }
139
182
 
@@ -149,7 +192,7 @@ export default class RenderObject {
149
192
 
150
193
  get needsUpdate() {
151
194
 
152
- return this.initialNodesCacheKey !== this.getNodesCacheKey();
195
+ return this.initialNodesCacheKey !== this.getNodesCacheKey() || this.clippingNeedsUpdate;
153
196
 
154
197
  }
155
198
 
@@ -31,6 +31,8 @@ class RenderObjects {
31
31
 
32
32
  } else {
33
33
 
34
+ renderObject.updateClipping( renderContext.clippingContext );
35
+
34
36
  if ( renderObject.version !== material.version || renderObject.needsUpdate ) {
35
37
 
36
38
  if ( renderObject.initialCacheKey !== renderObject.getCacheKey() ) {
@@ -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();
@@ -56,7 +57,9 @@ class Renderer {
56
57
  this.sortObjects = true;
57
58
 
58
59
  this.depth = true;
59
- this.stencil = true;
60
+ this.stencil = false;
61
+
62
+ this.clippingPlanes = [];
60
63
 
61
64
  this.info = new Info();
62
65
 
@@ -223,6 +226,9 @@ class Renderer {
223
226
  renderContext.depth = this.depth;
224
227
  renderContext.stencil = this.stencil;
225
228
 
229
+ if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
230
+ renderContext.clippingContext.updateGlobal( this, camera );
231
+
226
232
  //
227
233
 
228
234
  sceneRef.onBeforeRender( this, scene, camera, renderTarget );
@@ -306,6 +312,28 @@ class Renderer {
306
312
 
307
313
  if ( this._initialized === false ) await this.init();
308
314
 
315
+ const renderContext = this._renderScene( 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.warn( 'THREE.Renderer: .render() called before the backend is initialized. Try using .renderAsync() instead.' );
326
+
327
+ return this.renderAsync( scene, camera );
328
+
329
+ }
330
+
331
+ this._renderScene( scene, camera );
332
+
333
+ }
334
+
335
+ _renderScene( scene, camera ) {
336
+
309
337
  // preserve render tree
310
338
 
311
339
  const nodeFrame = this._nodes.nodeFrame;
@@ -351,7 +379,6 @@ class Renderer {
351
379
 
352
380
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
353
381
 
354
- if ( this.info.autoReset === true ) this.info.reset();
355
382
 
356
383
  //
357
384
 
@@ -386,6 +413,9 @@ class Renderer {
386
413
  renderContext.scissorValue.width >>= activeMipmapLevel;
387
414
  renderContext.scissorValue.height >>= activeMipmapLevel;
388
415
 
416
+ if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
417
+ renderContext.clippingContext.updateGlobal( this, camera );
418
+
389
419
  //
390
420
 
391
421
  sceneRef.onBeforeRender( this, scene, camera, renderTarget );
@@ -477,8 +507,9 @@ class Renderer {
477
507
 
478
508
  sceneRef.onAfterRender( this, scene, camera, renderTarget );
479
509
 
510
+ //
480
511
 
481
- await this.backend.resolveTimestampAsync( renderContext, 'render' );
512
+ return renderContext;
482
513
 
483
514
  }
484
515
 
@@ -728,9 +759,15 @@ class Renderer {
728
759
 
729
760
  }
730
761
 
731
- async clearAsync( color = true, depth = true, stencil = true ) {
762
+ clear( color = true, depth = true, stencil = true ) {
732
763
 
733
- if ( this._initialized === false ) await this.init();
764
+ if ( this._initialized === false ) {
765
+
766
+ console.warn( 'THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead.' );
767
+
768
+ return this.clearAsync( color, depth, stencil );
769
+
770
+ }
734
771
 
735
772
  let renderTargetData = null;
736
773
  const renderTarget = this._renderTarget;
@@ -747,6 +784,32 @@ class Renderer {
747
784
 
748
785
  }
749
786
 
787
+ clearColor() {
788
+
789
+ return this.clear( true, false, false );
790
+
791
+ }
792
+
793
+ clearDepth() {
794
+
795
+ return this.clear( false, true, false );
796
+
797
+ }
798
+
799
+ clearStencil() {
800
+
801
+ return this.clear( false, false, true );
802
+
803
+ }
804
+
805
+ async clearAsync( color = true, depth = true, stencil = true ) {
806
+
807
+ if ( this._initialized === false ) await this.init();
808
+
809
+ this.clear( color, depth, stencil );
810
+
811
+ }
812
+
750
813
  clearColorAsync() {
751
814
 
752
815
  return this.clearAsync( true, false, false );
@@ -842,7 +905,6 @@ class Renderer {
842
905
  nodeFrame.renderId = this.info.calls;
843
906
 
844
907
  //
845
- if ( this.info.autoReset === true ) this.info.resetCompute();
846
908
 
847
909
  const backend = this.backend;
848
910
  const pipelines = this._pipelines;
@@ -924,6 +986,16 @@ class Renderer {
924
986
 
925
987
  }
926
988
 
989
+ copyTextureToTexture( position, srcTexture, dstTexture, level = 0 ) {
990
+
991
+ this._textures.updateTexture( srcTexture );
992
+ this._textures.updateTexture( dstTexture );
993
+
994
+ this.backend.copyTextureToTexture( position, srcTexture, dstTexture, level );
995
+
996
+ }
997
+
998
+
927
999
  readRenderTargetPixelsAsync( renderTarget, x, y, width, height ) {
928
1000
 
929
1001
  return this.backend.copyTextureToBuffer( renderTarget.texture, x, y, width, height );
@@ -1107,10 +1179,42 @@ class Renderer {
1107
1179
 
1108
1180
  }
1109
1181
 
1110
- if ( overrideMaterial.isShadowNodeMaterial && ( material.shadowNode && material.shadowNode.isNode ) ) {
1182
+ if ( overrideMaterial.isShadowNodeMaterial ) {
1183
+
1184
+ overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
1185
+
1186
+ if ( material.shadowNode && material.shadowNode.isNode ) {
1187
+
1188
+ overrideFragmentNode = overrideMaterial.fragmentNode;
1189
+ overrideMaterial.fragmentNode = material.shadowNode;
1190
+
1191
+ }
1192
+
1193
+ if ( this.localClippingEnabled ) {
1194
+
1195
+ if ( material.clipShadows ) {
1111
1196
 
1112
- overrideFragmentNode = overrideMaterial.fragmentNode;
1113
- overrideMaterial.fragmentNode = material.shadowNode;
1197
+ if ( overrideMaterial.clippingPlanes !== material.clippingPlanes ) {
1198
+
1199
+ overrideMaterial.clippingPlanes = material.clippingPlanes;
1200
+ overrideMaterial.needsUpdate = true;
1201
+
1202
+ }
1203
+
1204
+ if ( overrideMaterial.clipIntersection !== material.clipIntersection ) {
1205
+
1206
+ overrideMaterial.clipIntersection = material.clipIntersection;
1207
+
1208
+ }
1209
+
1210
+ } else if ( Array.isArray( overrideMaterial.clippingPlanes ) ) {
1211
+
1212
+ overrideMaterial.clippingPlanes = null;
1213
+ overrideMaterial.needsUpdate = true;
1214
+
1215
+ }
1216
+
1217
+ }
1114
1218
 
1115
1219
  }
1116
1220
 
@@ -1212,36 +1316,6 @@ class Renderer {
1212
1316
 
1213
1317
  }
1214
1318
 
1215
- get render() {
1216
-
1217
- return this.renderAsync;
1218
-
1219
- }
1220
-
1221
- get clear() {
1222
-
1223
- return this.clearAsync;
1224
-
1225
- }
1226
-
1227
- get clearColor() {
1228
-
1229
- return this.clearColorAsync;
1230
-
1231
- }
1232
-
1233
- get clearDepth() {
1234
-
1235
- return this.clearDepthAsync;
1236
-
1237
- }
1238
-
1239
- get clearStencil() {
1240
-
1241
- return this.clearStencilAsync;
1242
-
1243
- }
1244
-
1245
1319
  }
1246
1320
 
1247
1321
  export default Renderer;
@@ -1,6 +1,6 @@
1
- import { InstancedBufferAttribute } from 'three';
1
+ import { BufferAttribute } from 'three';
2
2
 
3
- class StorageBufferAttribute extends InstancedBufferAttribute {
3
+ class StorageBufferAttribute extends BufferAttribute {
4
4
 
5
5
  constructor( array, itemSize, typeClass = Float32Array ) {
6
6
 
@@ -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;