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
@@ -1,15 +1,16 @@
1
- import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial } from '../../../nodes/Nodes.js';
1
+ import { MathNode, GLSLNodeParser, NodeBuilder, UniformNode, vectorComponents } from '../../../nodes/Nodes.js';
2
2
 
3
- import UniformBuffer from '../../common/UniformBuffer.js';
3
+ import NodeUniformBuffer from '../../common/nodes/NodeUniformBuffer.js';
4
4
  import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
5
5
 
6
6
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
7
7
 
8
- import { IntType } from 'three';
8
+ import { RedFormat, RGFormat, IntType, DataTexture, RGBAFormat, FloatType } from 'three';
9
9
 
10
10
  const glslMethods = {
11
11
  [ MathNode.ATAN2 ]: 'atan',
12
- textureDimensions: 'textureSize'
12
+ textureDimensions: 'textureSize',
13
+ equals: 'equal'
13
14
  };
14
15
 
15
16
  const precisionLib = {
@@ -19,7 +20,8 @@ const precisionLib = {
19
20
  };
20
21
 
21
22
  const supports = {
22
- instance: true
23
+ instance: true,
24
+ swizzleAssign: true
23
25
  };
24
26
 
25
27
  const defaultPrecisions = `
@@ -36,6 +38,7 @@ class GLSLNodeBuilder extends NodeBuilder {
36
38
  super( object, renderer, new GLSLNodeParser(), scene );
37
39
 
38
40
  this.uniformGroups = {};
41
+ this.transforms = [];
39
42
 
40
43
  }
41
44
 
@@ -83,6 +86,130 @@ ${ flowData.code }
83
86
 
84
87
  }
85
88
 
89
+ setupPBO( storageBufferNode ) {
90
+
91
+ const attribute = storageBufferNode.value;
92
+
93
+ if ( attribute.pbo === undefined ) {
94
+
95
+ const originalArray = attribute.array;
96
+ const numElements = attribute.count * attribute.itemSize;
97
+
98
+ const { itemSize } = attribute;
99
+ let format = RedFormat;
100
+
101
+ if ( itemSize === 2 ) {
102
+
103
+ format = RGFormat;
104
+
105
+ } else if ( itemSize === 3 ) {
106
+
107
+ format = 6407; // patch since legacy doesn't use RGBFormat for rendering but here it's needed for packing optimization
108
+
109
+ } else if ( itemSize === 4 ) {
110
+
111
+ format = RGBAFormat;
112
+
113
+ }
114
+
115
+ const width = Math.pow( 2, Math.ceil( Math.log2( Math.sqrt( numElements / itemSize ) ) ) );
116
+ let height = Math.ceil( ( numElements / itemSize ) / width );
117
+ if ( width * height * itemSize < numElements ) height ++; // Ensure enough space
118
+
119
+ const newSize = width * height * itemSize;
120
+
121
+ const newArray = new Float32Array( newSize );
122
+
123
+ newArray.set( originalArray, 0 );
124
+
125
+ attribute.array = newArray;
126
+
127
+ const pboTexture = new DataTexture( attribute.array, width, height, format, FloatType );
128
+ pboTexture.needsUpdate = true;
129
+ pboTexture.isPBOTexture = true;
130
+
131
+ const pbo = new UniformNode( pboTexture );
132
+ pbo.setPrecision( 'high' );
133
+
134
+ attribute.pboNode = pbo;
135
+ attribute.pbo = pbo.value;
136
+
137
+ this.getUniformFromNode( attribute.pboNode, 'texture', this.shaderStage, this.context.label );
138
+
139
+ }
140
+
141
+ }
142
+
143
+ generatePBO( storageArrayElementNode ) {
144
+
145
+ const { node, indexNode } = storageArrayElementNode;
146
+ const attribute = node.value;
147
+
148
+ if ( this.renderer.backend.has( attribute ) ) {
149
+
150
+ const attributeData = this.renderer.backend.get( attribute );
151
+ attributeData.pbo = attribute.pbo;
152
+
153
+ }
154
+
155
+
156
+ const nodeUniform = this.getUniformFromNode( attribute.pboNode, 'texture', this.shaderStage, this.context.label );
157
+ const textureName = this.getPropertyName( nodeUniform );
158
+
159
+ indexNode.increaseUsage( this ); // force cache generate to be used as index in x,y
160
+ const indexSnippet = indexNode.build( this, 'uint' );
161
+
162
+ const elementNodeData = this.getDataFromNode( storageArrayElementNode );
163
+
164
+ let propertyName = elementNodeData.propertyName;
165
+
166
+ if ( propertyName === undefined ) {
167
+
168
+ // property element
169
+
170
+ const nodeVar = this.getVarFromNode( storageArrayElementNode );
171
+
172
+ propertyName = this.getPropertyName( nodeVar );
173
+
174
+ // property size
175
+
176
+ const bufferNodeData = this.getDataFromNode( node );
177
+
178
+ let propertySizeName = bufferNodeData.propertySizeName;
179
+
180
+ if ( propertySizeName === undefined ) {
181
+
182
+ propertySizeName = propertyName + 'Size';
183
+
184
+ this.getVarFromNode( node, propertySizeName, 'uint' );
185
+
186
+ this.addLineFlowCode( `${ propertySizeName } = uint( textureSize( ${ textureName }, 0 ).x )` );
187
+
188
+ bufferNodeData.propertySizeName = propertySizeName;
189
+
190
+ }
191
+
192
+ //
193
+
194
+ const { itemSize } = attribute;
195
+
196
+ const channel = '.' + vectorComponents.join( '' ).slice( 0, itemSize );
197
+ const uvSnippet = `ivec2(${indexSnippet} % ${ propertySizeName }, ${indexSnippet} / ${ propertySizeName })`;
198
+
199
+ const snippet = this.generateTextureLoad( null, textureName, uvSnippet, null, '0' );
200
+
201
+ //
202
+
203
+ this.addLineFlowCode( `${ propertyName } = ${ snippet + channel }` );
204
+
205
+ elementNodeData.propertyName = propertyName;
206
+
207
+ }
208
+
209
+ return propertyName;
210
+
211
+ }
212
+
86
213
  generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0' ) {
87
214
 
88
215
  if ( depthSnippet ) {
@@ -99,11 +226,7 @@ ${ flowData.code }
99
226
 
100
227
  generateTexture( texture, textureProperty, uvSnippet, depthSnippet ) {
101
228
 
102
- if ( texture.isTextureCube ) {
103
-
104
- return `textureCube( ${ textureProperty }, ${ uvSnippet } )`;
105
-
106
- } else if ( texture.isDepthTexture ) {
229
+ if ( texture.isDepthTexture ) {
107
230
 
108
231
  return `texture( ${ textureProperty }, ${ uvSnippet } ).x`;
109
232
 
@@ -283,7 +406,7 @@ ${ flowData.code }
283
406
 
284
407
  let snippet = '';
285
408
 
286
- if ( shaderStage === 'vertex' ) {
409
+ if ( shaderStage === 'vertex' || shaderStage === 'compute' ) {
287
410
 
288
411
  const attributes = this.getAttributesArray();
289
412
 
@@ -350,10 +473,11 @@ ${ flowData.code }
350
473
 
351
474
  const varyings = this.varyings;
352
475
 
353
- if ( shaderStage === 'vertex' ) {
476
+ if ( shaderStage === 'vertex' || shaderStage === 'compute' ) {
354
477
 
355
478
  for ( const varying of varyings ) {
356
479
 
480
+ if ( shaderStage === 'compute' ) varying.needsInterpolation = true;
357
481
  const type = varying.type;
358
482
  const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
359
483
 
@@ -418,13 +542,38 @@ ${ flowData.code }
418
542
 
419
543
  }
420
544
 
421
-
422
545
  isFlipY() {
423
546
 
424
547
  return true;
425
548
 
426
549
  }
427
550
 
551
+ registerTransform( varyingName, attributeNode ) {
552
+
553
+ this.transforms.push( { varyingName, attributeNode } );
554
+
555
+ }
556
+
557
+ getTransforms( /* shaderStage */ ) {
558
+
559
+ const transforms = this.transforms;
560
+
561
+ let snippet = '';
562
+
563
+ for ( let i = 0; i < transforms.length; i ++ ) {
564
+
565
+ const transform = transforms[ i ];
566
+
567
+ const attributeName = this.getPropertyName( transform.attributeNode );
568
+
569
+ snippet += `${ transform.varyingName } = ${ attributeName };\n\t`;
570
+
571
+ }
572
+
573
+ return snippet;
574
+
575
+ }
576
+
428
577
  _getGLSLUniformStruct( name, vars ) {
429
578
 
430
579
  return `
@@ -460,6 +609,9 @@ void main() {
460
609
  // vars
461
610
  ${shaderData.vars}
462
611
 
612
+ // transforms
613
+ ${shaderData.transforms}
614
+
463
615
  // flow
464
616
  ${shaderData.flow}
465
617
 
@@ -562,6 +714,7 @@ void main() {
562
714
  stageData.vars = this.getVars( shaderStage );
563
715
  stageData.structs = this.getStructs( shaderStage );
564
716
  stageData.codes = this.getCodes( shaderStage );
717
+ stageData.transforms = this.getTransforms( shaderStage );
565
718
  stageData.flow = flow;
566
719
 
567
720
  }
@@ -573,8 +726,7 @@ void main() {
573
726
 
574
727
  } else {
575
728
 
576
- console.warn( 'GLSLNodeBuilder: compute shaders are not supported.' );
577
- //this.computeShader = this._getGLSLComputeCode( shadersData.compute );
729
+ this.computeShader = this._getGLSLVertexCode( shadersData.compute );
578
730
 
579
731
  }
580
732
 
@@ -603,11 +755,11 @@ void main() {
603
755
 
604
756
  } else if ( type === 'buffer' ) {
605
757
 
606
- node.name = `NodeBuffer_${node.id}`;
607
-
608
- const buffer = new UniformBuffer( node.name, node.value );
758
+ node.name = `NodeBuffer_${ node.id }`;
759
+ uniformNode.name = `buffer${ node.id }`;
609
760
 
610
- uniformNode.name = `buffer${node.id}`;
761
+ const buffer = new NodeUniformBuffer( node );
762
+ buffer.name = node.name;
611
763
 
612
764
  this.bindings[ shaderStage ].push( buffer );
613
765
 
@@ -647,26 +799,6 @@ void main() {
647
799
 
648
800
  }
649
801
 
650
- build() {
651
-
652
- // @TODO: Move this code to super.build()
653
-
654
- const { object, material } = this;
655
-
656
- if ( material !== null ) {
657
-
658
- NodeMaterial.fromMaterial( material ).build( this );
659
-
660
- } else {
661
-
662
- this.addFlow( 'compute', object );
663
-
664
- }
665
-
666
- return super.build();
667
-
668
- }
669
-
670
802
  }
671
803
 
672
804
  export default GLSLNodeBuilder;
@@ -1,5 +1,51 @@
1
1
  import { IntType } from 'three';
2
2
 
3
+ let _id = 0;
4
+
5
+ class DualAttributeData {
6
+
7
+ constructor( attributeData, dualBuffer ) {
8
+
9
+ this.buffers = [ attributeData.bufferGPU, dualBuffer ];
10
+ this.type = attributeData.type;
11
+ this.bufferType = attributeData.bufferType;
12
+ this.pbo = attributeData.pbo;
13
+ this.byteLength = attributeData.byteLength;
14
+ this.bytesPerElement = attributeData.BYTES_PER_ELEMENT;
15
+ this.version = attributeData.version;
16
+ this.isInteger = attributeData.isInteger;
17
+ this.activeBufferIndex = 0;
18
+ this.baseId = attributeData.id;
19
+
20
+ }
21
+
22
+
23
+ get id() {
24
+
25
+ return `${ this.baseId }|${ this.activeBufferIndex }`;
26
+
27
+ }
28
+
29
+ get bufferGPU() {
30
+
31
+ return this.buffers[ this.activeBufferIndex ];
32
+
33
+ }
34
+
35
+ get transformBuffer() {
36
+
37
+ return this.buffers[ this.activeBufferIndex ^ 1 ];
38
+
39
+ }
40
+
41
+ switchBuffers() {
42
+
43
+ this.activeBufferIndex ^= 1;
44
+
45
+ }
46
+
47
+ }
48
+
3
49
  class WebGLAttributeUtils {
4
50
 
5
51
  constructor( backend ) {
@@ -23,11 +69,7 @@ class WebGLAttributeUtils {
23
69
 
24
70
  if ( bufferGPU === undefined ) {
25
71
 
26
- bufferGPU = gl.createBuffer();
27
-
28
- gl.bindBuffer( bufferType, bufferGPU );
29
- gl.bufferData( bufferType, array, usage );
30
- gl.bindBuffer( bufferType, null );
72
+ bufferGPU = this._createBuffer( gl, bufferType, array, usage );
31
73
 
32
74
  bufferData.bufferGPU = bufferGPU;
33
75
  bufferData.bufferType = bufferType;
@@ -85,13 +127,27 @@ class WebGLAttributeUtils {
85
127
 
86
128
  }
87
129
 
88
- backend.set( attribute, {
130
+ let attributeData = {
89
131
  bufferGPU,
132
+ bufferType,
90
133
  type,
134
+ byteLength: array.byteLength,
91
135
  bytesPerElement: array.BYTES_PER_ELEMENT,
92
136
  version: attribute.version,
93
- isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType
94
- } );
137
+ pbo: attribute.pbo,
138
+ isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType,
139
+ id: _id ++
140
+ };
141
+
142
+ if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {
143
+
144
+ // create buffer for tranform feedback use
145
+ const bufferGPUDual = this._createBuffer( gl, bufferType, array, usage );
146
+ attributeData = new DualAttributeData( attributeData, bufferGPUDual );
147
+
148
+ }
149
+
150
+ backend.set( attribute, attributeData );
95
151
 
96
152
  }
97
153
 
@@ -134,6 +190,25 @@ class WebGLAttributeUtils {
134
190
 
135
191
  }
136
192
 
193
+ destroyAttribute( attribute ) {
194
+
195
+ const backend = this.backend;
196
+ const { gl } = backend;
197
+
198
+ if ( attribute.isInterleavedBufferAttribute ) {
199
+
200
+ backend.delete( attribute.data );
201
+
202
+ }
203
+
204
+ const attributeData = backend.get( attribute );
205
+
206
+ gl.deleteBuffer( attributeData.bufferGPU );
207
+
208
+ backend.delete( attribute );
209
+
210
+ }
211
+
137
212
  async getArrayBufferAsync( attribute ) {
138
213
 
139
214
  const backend = this.backend;
@@ -166,6 +241,18 @@ class WebGLAttributeUtils {
166
241
 
167
242
  }
168
243
 
244
+ _createBuffer( gl, bufferType, array, usage ) {
245
+
246
+ const bufferGPU = gl.createBuffer();
247
+
248
+ gl.bindBuffer( bufferType, bufferGPU );
249
+ gl.bufferData( bufferType, array, usage );
250
+ gl.bindBuffer( bufferType, null );
251
+
252
+ return bufferGPU;
253
+
254
+ }
255
+
169
256
  }
170
257
 
171
258
  export default WebGLAttributeUtils;
@@ -0,0 +1,11 @@
1
+ export const GLFeatureName = {
2
+
3
+ 'WEBGL_compressed_texture_astc': 'texture-compression-astc',
4
+ 'WEBGL_compressed_texture_etc': 'texture-compression-etc2',
5
+ 'WEBGL_compressed_texture_etc1': 'texture-compression-etc1',
6
+ 'WEBGL_compressed_texture_pvrtc': 'texture-compression-pvrtc',
7
+ 'WEBKIT_WEBGL_compressed_texture_pvrtc': 'texture-compression-pvrtc',
8
+ 'WEBGL_compressed_texture_s3tc': 'texture-compression-bc',
9
+ 'EXT_texture_compression_bptc': 'texture-compression-bptc',
10
+
11
+ };
@@ -40,6 +40,14 @@ class WebGLState {
40
40
  this.currentStencilZFail = null;
41
41
  this.currentStencilZPass = null;
42
42
  this.currentStencilMask = null;
43
+ this.currentLineWidth = null;
44
+
45
+ this.currentBoundFramebuffers = {};
46
+ this.currentDrawbuffers = new WeakMap();
47
+
48
+ this.maxTextures = this.gl.getParameter( this.gl.MAX_TEXTURE_IMAGE_UNITS );
49
+ this.currentTextureSlot = null;
50
+ this.currentBoundTextures = {};
43
51
 
44
52
  if ( initialized === false ) {
45
53
 
@@ -161,6 +169,21 @@ class WebGLState {
161
169
 
162
170
  }
163
171
 
172
+ setLineWidth( width ) {
173
+
174
+ const { currentLineWidth, gl } = this;
175
+
176
+ if ( width !== currentLineWidth ) {
177
+
178
+ gl.lineWidth( width );
179
+
180
+ this.currentLineWidth = width;
181
+
182
+ }
183
+
184
+ }
185
+
186
+
164
187
  setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {
165
188
 
166
189
  const { gl } = this;
@@ -535,6 +558,180 @@ class WebGLState {
535
558
 
536
559
  }
537
560
 
561
+ // framebuffer
562
+
563
+
564
+ bindFramebuffer( target, framebuffer ) {
565
+
566
+ const { gl, currentBoundFramebuffers } = this;
567
+
568
+ if ( currentBoundFramebuffers[ target ] !== framebuffer ) {
569
+
570
+ gl.bindFramebuffer( target, framebuffer );
571
+
572
+ currentBoundFramebuffers[ target ] = framebuffer;
573
+
574
+ // gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER
575
+
576
+ if ( target === gl.DRAW_FRAMEBUFFER ) {
577
+
578
+ currentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;
579
+
580
+ }
581
+
582
+ if ( target === gl.FRAMEBUFFER ) {
583
+
584
+ currentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;
585
+
586
+ }
587
+
588
+ return true;
589
+
590
+ }
591
+
592
+ return false;
593
+
594
+ }
595
+
596
+ drawBuffers( renderContext, framebuffer ) {
597
+
598
+ const { gl } = this;
599
+
600
+ let drawBuffers = [];
601
+
602
+ let needsUpdate = false;
603
+
604
+ if ( renderContext.textures !== null ) {
605
+
606
+ drawBuffers = this.currentDrawbuffers.get( framebuffer );
607
+
608
+ if ( drawBuffers === undefined ) {
609
+
610
+ drawBuffers = [];
611
+ this.currentDrawbuffers.set( framebuffer, drawBuffers );
612
+
613
+ }
614
+
615
+
616
+ const textures = renderContext.textures;
617
+
618
+ if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
619
+
620
+ for ( let i = 0, il = textures.length; i < il; i ++ ) {
621
+
622
+ drawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;
623
+
624
+ }
625
+
626
+ drawBuffers.length = textures.length;
627
+
628
+ needsUpdate = true;
629
+
630
+ }
631
+
632
+
633
+ } else {
634
+
635
+ if ( drawBuffers[ 0 ] !== gl.BACK ) {
636
+
637
+ drawBuffers[ 0 ] = gl.BACK;
638
+
639
+ needsUpdate = true;
640
+
641
+ }
642
+
643
+ }
644
+
645
+ if ( needsUpdate ) {
646
+
647
+ gl.drawBuffers( drawBuffers );
648
+
649
+ }
650
+
651
+
652
+ }
653
+
654
+
655
+ // texture
656
+
657
+ activeTexture( webglSlot ) {
658
+
659
+ const { gl, currentTextureSlot, maxTextures } = this;
660
+
661
+ if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;
662
+
663
+ if ( currentTextureSlot !== webglSlot ) {
664
+
665
+ gl.activeTexture( webglSlot );
666
+ this.currentTextureSlot = webglSlot;
667
+
668
+ }
669
+
670
+ }
671
+
672
+ bindTexture( webglType, webglTexture, webglSlot ) {
673
+
674
+ const { gl, currentTextureSlot, currentBoundTextures, maxTextures } = this;
675
+
676
+ if ( webglSlot === undefined ) {
677
+
678
+ if ( currentTextureSlot === null ) {
679
+
680
+ webglSlot = gl.TEXTURE0 + maxTextures - 1;
681
+
682
+ } else {
683
+
684
+ webglSlot = currentTextureSlot;
685
+
686
+ }
687
+
688
+ }
689
+
690
+ let boundTexture = currentBoundTextures[ webglSlot ];
691
+
692
+ if ( boundTexture === undefined ) {
693
+
694
+ boundTexture = { type: undefined, texture: undefined };
695
+ currentBoundTextures[ webglSlot ] = boundTexture;
696
+
697
+ }
698
+
699
+ if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {
700
+
701
+ if ( currentTextureSlot !== webglSlot ) {
702
+
703
+ gl.activeTexture( webglSlot );
704
+ this.currentTextureSlot = webglSlot;
705
+
706
+ }
707
+
708
+ gl.bindTexture( webglType, webglTexture );
709
+
710
+ boundTexture.type = webglType;
711
+ boundTexture.texture = webglTexture;
712
+
713
+
714
+ }
715
+
716
+
717
+ }
718
+
719
+ unbindTexture() {
720
+
721
+ const { gl, currentTextureSlot, currentBoundTextures } = this;
722
+
723
+ const boundTexture = currentBoundTextures[ currentTextureSlot ];
724
+
725
+ if ( boundTexture !== undefined && boundTexture.type !== undefined ) {
726
+
727
+ gl.bindTexture( boundTexture.type, null );
728
+
729
+ boundTexture.type = undefined;
730
+ boundTexture.texture = undefined;
731
+
732
+ }
733
+
734
+ }
538
735
 
539
736
  }
540
737