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,21 +1,23 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { nodeProxy } from '../shadernode/ShaderNode.js';
3
+ import { nodeObject } from '../shadernode/ShaderNode.js';
4
4
  import { attribute } from '../core/AttributeNode.js';
5
- import { uniform } from '../core/UniformNode.js';
5
+ import { reference, referenceBuffer } from './ReferenceNode.js';
6
6
  import { add } from '../math/OperatorNode.js';
7
- import { buffer } from './BufferNode.js';
8
7
  import { normalLocal } from './NormalNode.js';
9
8
  import { positionLocal } from './PositionNode.js';
10
9
  import { tangentLocal } from './TangentNode.js';
10
+ import { uniform } from '../core/UniformNode.js';
11
+ import { buffer } from './BufferNode.js';
11
12
 
12
13
  class SkinningNode extends Node {
13
14
 
14
- constructor( skinnedMesh ) {
15
+ constructor( skinnedMesh, useReference = false ) {
15
16
 
16
17
  super( 'void' );
17
18
 
18
19
  this.skinnedMesh = skinnedMesh;
20
+ this.useReference = useReference;
19
21
 
20
22
  this.updateType = NodeUpdateType.OBJECT;
21
23
 
@@ -24,9 +26,25 @@ class SkinningNode extends Node {
24
26
  this.skinIndexNode = attribute( 'skinIndex', 'uvec4' );
25
27
  this.skinWeightNode = attribute( 'skinWeight', 'vec4' );
26
28
 
27
- this.bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
28
- this.bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
29
- this.boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
29
+ let bindMatrixNode, bindMatrixInverseNode, boneMatricesNode;
30
+
31
+ if ( useReference ) {
32
+
33
+ bindMatrixNode = reference( 'bindMatrix', 'mat4' );
34
+ bindMatrixInverseNode = reference( 'bindMatrixInverse', 'mat4' );
35
+ boneMatricesNode = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );
36
+
37
+ } else {
38
+
39
+ bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
40
+ bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
41
+ boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
42
+
43
+ }
44
+
45
+ this.bindMatrixNode = bindMatrixNode;
46
+ this.bindMatrixInverseNode = bindMatrixInverseNode;
47
+ this.boneMatricesNode = boneMatricesNode;
30
48
 
31
49
  }
32
50
 
@@ -88,9 +106,11 @@ class SkinningNode extends Node {
88
106
 
89
107
  }
90
108
 
91
- update() {
109
+ update( frame ) {
110
+
111
+ const object = this.useReference ? frame.object : this.skinnedMesh;
92
112
 
93
- this.skinnedMesh.skeleton.update();
113
+ object.skeleton.update();
94
114
 
95
115
  }
96
116
 
@@ -98,6 +118,7 @@ class SkinningNode extends Node {
98
118
 
99
119
  export default SkinningNode;
100
120
 
101
- export const skinning = nodeProxy( SkinningNode );
121
+ export const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) );
122
+ export const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) );
102
123
 
103
124
  addNodeClass( 'SkinningNode', SkinningNode );
@@ -1,6 +1,9 @@
1
1
  import BufferNode from './BufferNode.js';
2
+ import { bufferAttribute } from './BufferAttributeNode.js';
2
3
  import { addNodeClass } from '../core/Node.js';
3
4
  import { nodeObject } from '../shadernode/ShaderNode.js';
5
+ import { varying } from '../core/VaryingNode.js';
6
+ import { storageElement } from '../utils/StorageArrayElementNode.js';
4
7
 
5
8
  class StorageBufferNode extends BufferNode {
6
9
 
@@ -10,6 +13,11 @@ class StorageBufferNode extends BufferNode {
10
13
 
11
14
  this.isStorageBufferNode = true;
12
15
 
16
+ this.bufferObject = false;
17
+
18
+ this._attribute = null;
19
+ this._varying = null;
20
+
13
21
  }
14
22
 
15
23
  getInputType( /*builder*/ ) {
@@ -18,10 +26,47 @@ class StorageBufferNode extends BufferNode {
18
26
 
19
27
  }
20
28
 
29
+ element( indexNode ) {
30
+
31
+ return storageElement( this, indexNode );
32
+
33
+ }
34
+
35
+ setBufferObject( value ) {
36
+
37
+ this.bufferObject = value;
38
+
39
+ return this;
40
+
41
+ }
42
+
43
+ generate( builder ) {
44
+
45
+ if ( builder.isAvailable( 'storageBuffer' ) ) return super.generate( builder );
46
+
47
+ const nodeType = this.getNodeType( builder );
48
+
49
+ if ( this._attribute === null ) {
50
+
51
+ this._attribute = bufferAttribute( this.value );
52
+ this._varying = varying( this._attribute );
53
+
54
+ }
55
+
56
+
57
+ const output = this._varying.build( builder, nodeType );
58
+
59
+ builder.registerTransform( output, this._attribute );
60
+
61
+ return output;
62
+
63
+ }
64
+
21
65
  }
22
66
 
23
67
  export default StorageBufferNode;
24
68
 
25
69
  export const storage = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ) );
70
+ export const storageObject = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ).setBufferObject( true ) );
26
71
 
27
72
  addNodeClass( 'StorageBufferNode', StorageBufferNode );
@@ -5,7 +5,7 @@ import { varying } from '../core/VaryingNode.js';
5
5
  import { normalize } from '../math/MathNode.js';
6
6
  import { cameraViewMatrix } from './CameraNode.js';
7
7
  import { modelViewMatrix } from './ModelNode.js';
8
- import { nodeImmutable } from '../shadernode/ShaderNode.js';
8
+ import { nodeImmutable, vec4 } from '../shadernode/ShaderNode.js';
9
9
 
10
10
  class TangentNode extends Node {
11
11
 
@@ -48,13 +48,19 @@ class TangentNode extends Node {
48
48
 
49
49
  outputNode = attribute( 'tangent', 'vec4' );
50
50
 
51
+ if ( builder.geometry.hasAttribute( 'tangent' ) === false ) {
52
+
53
+ builder.geometry.computeTangents();
54
+
55
+ }
56
+
51
57
  } else if ( scope === TangentNode.LOCAL ) {
52
58
 
53
59
  outputNode = varying( tangentGeometry.xyz );
54
60
 
55
61
  } else if ( scope === TangentNode.VIEW ) {
56
62
 
57
- const vertexNode = modelViewMatrix.mul( tangentLocal ).xyz;
63
+ const vertexNode = modelViewMatrix.mul( vec4( tangentLocal, 0 ) ).xyz;
58
64
  outputNode = normalize( varying( vertexNode ) );
59
65
 
60
66
  } else if ( scope === TangentNode.WORLD ) {
@@ -55,7 +55,7 @@ class TextureNode extends UniformNode {
55
55
 
56
56
  }
57
57
 
58
- updateReference( /*frame*/ ) {
58
+ setReference( /*state*/ ) {
59
59
 
60
60
  return this.value;
61
61
 
@@ -14,9 +14,52 @@ class TextureStoreNode extends TextureNode {
14
14
 
15
15
  }
16
16
 
17
- getNodeType( /*builder*/ ) {
17
+ getInputType( /*builder*/ ) {
18
18
 
19
- return 'void';
19
+ return 'storageTexture';
20
+
21
+ }
22
+
23
+ setup( builder ) {
24
+
25
+ super.setup( builder );
26
+
27
+ const properties = builder.getNodeProperties( this );
28
+ properties.storeNode = this.storeNode;
29
+
30
+ }
31
+
32
+ generate( builder, output ) {
33
+
34
+ let snippet;
35
+
36
+ if ( this.storeNode !== null ) {
37
+
38
+ snippet = this.generateStore( builder );
39
+
40
+ } else {
41
+
42
+ snippet = super.generate( builder, output );
43
+
44
+ }
45
+
46
+ return snippet;
47
+
48
+ }
49
+
50
+ generateStore( builder ) {
51
+
52
+ const properties = builder.getNodeProperties( this );
53
+
54
+ const { uvNode, storeNode } = properties;
55
+
56
+ const textureProperty = super.generate( builder, 'property' );
57
+ const uvSnippet = uvNode.build( builder, 'uvec2' );
58
+ const storeSnippet = storeNode.build( builder, 'vec4' );
59
+
60
+ const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, storeSnippet );
61
+
62
+ builder.addLineFlowCode( snippet );
20
63
 
21
64
  }
22
65
 
@@ -24,6 +67,16 @@ class TextureStoreNode extends TextureNode {
24
67
 
25
68
  export default TextureStoreNode;
26
69
 
27
- export const textureStore = nodeProxy( TextureStoreNode );
70
+ const textureStoreBase = nodeProxy( TextureStoreNode );
71
+
72
+ export const textureStore = ( value, uvNode, storeNode ) => {
73
+
74
+ const node = textureStoreBase( value, uvNode, storeNode );
75
+
76
+ if ( storeNode !== null ) node.append();
77
+
78
+ return node;
79
+
80
+ };
28
81
 
29
82
  addNodeClass( 'TextureStoreNode', TextureStoreNode );
@@ -0,0 +1,140 @@
1
+ import { addNodeClass } from '../core/Node.js';
2
+ import { nodeObject } from '../shadernode/ShaderNode.js';
3
+ import { NodeUpdateType } from '../core/constants.js';
4
+ import { getValueType } from '../core/NodeUtils.js';
5
+ import ArrayElementNode from '../utils/ArrayElementNode.js';
6
+ import BufferNode from './BufferNode.js';
7
+
8
+ class UniformsElementNode extends ArrayElementNode {
9
+
10
+ constructor( arrayBuffer, indexNode ) {
11
+
12
+ super( arrayBuffer, indexNode );
13
+
14
+ this.isArrayBufferElementNode = true;
15
+
16
+ }
17
+
18
+ getNodeType( builder ) {
19
+
20
+ return this.node.getElementType( builder );
21
+
22
+ }
23
+
24
+ generate( builder ) {
25
+
26
+ const snippet = super.generate( builder );
27
+ const type = this.getNodeType();
28
+
29
+ return builder.format( snippet, 'vec4', type );
30
+
31
+ }
32
+
33
+ }
34
+
35
+ class UniformsNode extends BufferNode {
36
+
37
+ constructor( value, elementType = null ) {
38
+
39
+ super( null, 'vec4' );
40
+
41
+ this.array = value;
42
+ this.elementType = elementType;
43
+
44
+ this._elementType = null;
45
+ this._elementLength = 0;
46
+
47
+ this.updateType = NodeUpdateType.RENDER;
48
+
49
+ this.isArrayBufferNode = true;
50
+
51
+ }
52
+
53
+ getElementType() {
54
+
55
+ return this.elementType || this._elementType;
56
+
57
+ }
58
+
59
+ getElementLength() {
60
+
61
+ return this._elementLength;
62
+
63
+ }
64
+
65
+ update( /*frame*/ ) {
66
+
67
+ const { array, value } = this;
68
+
69
+ const elementLength = this.getElementLength();
70
+ const elementType = this.getElementType();
71
+
72
+ if ( elementLength === 1 ) {
73
+
74
+ for ( let i = 0; i < array.length; i ++ ) {
75
+
76
+ const index = i * 4;
77
+
78
+ value[ index ] = array[ i ];
79
+
80
+ }
81
+
82
+ } else if ( elementType === 'color' ) {
83
+
84
+ for ( let i = 0; i < array.length; i ++ ) {
85
+
86
+ const index = i * 4;
87
+ const vector = array[ i ];
88
+
89
+ value[ index ] = vector.r;
90
+ value[ index + 1 ] = vector.g;
91
+ value[ index + 2 ] = vector.b || 0;
92
+ //value[ index + 3 ] = vector.a || 0;
93
+
94
+ }
95
+
96
+ } else {
97
+
98
+ for ( let i = 0; i < array.length; i ++ ) {
99
+
100
+ const index = i * 4;
101
+ const vector = array[ i ];
102
+
103
+ value[ index ] = vector.x;
104
+ value[ index + 1 ] = vector.y;
105
+ value[ index + 2 ] = vector.z || 0;
106
+ value[ index + 3 ] = vector.w || 0;
107
+
108
+ }
109
+
110
+ }
111
+
112
+ }
113
+
114
+ setup( builder ) {
115
+
116
+ const length = this.array.length;
117
+
118
+ this._elementType = this.elementType === null ? getValueType( this.array[ 0 ] ) : this.elementType;
119
+ this._elementLength = builder.getTypeLength( this._elementType );
120
+
121
+ this.value = new Float32Array( length * 4 );
122
+ this.bufferCount = length;
123
+
124
+ return super.setup( builder );
125
+
126
+ }
127
+
128
+ element( indexNode ) {
129
+
130
+ return nodeObject( new UniformsElementNode( this, nodeObject( indexNode ) ) );
131
+
132
+ }
133
+
134
+ }
135
+
136
+ export default UniformsNode;
137
+
138
+ export const uniforms = ( values, nodeType ) => nodeObject( new UniformsNode( values, nodeType ) );
139
+
140
+ addNodeClass( 'UniformsNode', UniformsNode );
@@ -0,0 +1,70 @@
1
+ import { addNodeClass } from '../core/Node.js';
2
+ import AttributeNode from '../core/AttributeNode.js';
3
+ import { nodeObject } from '../shadernode/ShaderNode.js';
4
+ import { Vector4 } from 'three';
5
+
6
+ class VertexColorNode extends AttributeNode {
7
+
8
+ constructor( index = 0 ) {
9
+
10
+ super( null, 'vec4' );
11
+
12
+ this.isVertexColorNode = true;
13
+
14
+ this.index = index;
15
+
16
+ }
17
+
18
+ getAttributeName( /*builder*/ ) {
19
+
20
+ const index = this.index;
21
+
22
+ return 'color' + ( index > 0 ? index : '' );
23
+
24
+ }
25
+
26
+ generate( builder ) {
27
+
28
+ const attributeName = this.getAttributeName( builder );
29
+ const geometryAttribute = builder.hasGeometryAttribute( attributeName );
30
+
31
+ let result;
32
+
33
+ if ( geometryAttribute === true ) {
34
+
35
+ result = super.generate( builder );
36
+
37
+ } else {
38
+
39
+ // Vertex color fallback should be white
40
+ result = builder.generateConst( this.nodeType, new Vector4( 1, 1, 1, 1 ) );
41
+
42
+ }
43
+
44
+ return result;
45
+
46
+ }
47
+
48
+ serialize( data ) {
49
+
50
+ super.serialize( data );
51
+
52
+ data.index = this.index;
53
+
54
+ }
55
+
56
+ deserialize( data ) {
57
+
58
+ super.deserialize( data );
59
+
60
+ this.index = data.index;
61
+
62
+ }
63
+
64
+ }
65
+
66
+ export default VertexColorNode;
67
+
68
+ export const vertexColor = ( ...params ) => nodeObject( new VertexColorNode( ...params ) );
69
+
70
+ addNodeClass( 'VertexColorNode', VertexColorNode );
@@ -16,6 +16,12 @@ class CodeNode extends Node {
16
16
 
17
17
  }
18
18
 
19
+ isGlobal() {
20
+
21
+ return true;
22
+
23
+ }
24
+
19
25
  setIncludes( includes ) {
20
26
 
21
27
  this.includes = includes;
@@ -1,6 +1,7 @@
1
1
  import { addNodeClass } from '../core/Node.js';
2
2
  import TempNode from '../core/TempNode.js';
3
3
  import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
4
+ import { vectorComponents } from '../core/constants.js';
4
5
 
5
6
  class AssignNode extends TempNode {
6
7
 
@@ -25,40 +26,95 @@ class AssignNode extends TempNode {
25
26
 
26
27
  }
27
28
 
29
+ needsSplitAssign( builder ) {
30
+
31
+ const { targetNode } = this;
32
+
33
+ if ( builder.isAvailable( 'swizzleAssign' ) === false && targetNode.isSplitNode && targetNode.components.length > 1 ) {
34
+
35
+ const targetLength = builder.getTypeLength( targetNode.node.getNodeType( builder ) );
36
+ const assignDiferentVector = vectorComponents.join( '' ).slice( 0, targetLength ) !== targetNode.components;
37
+
38
+ return assignDiferentVector;
39
+
40
+ }
41
+
42
+ return false;
43
+
44
+ }
45
+
28
46
  generate( builder, output ) {
29
47
 
30
- const targetNode = this.targetNode;
31
- const sourceNode = this.sourceNode;
48
+ const { targetNode, sourceNode } = this;
49
+
50
+ const needsSplitAssign = this.needsSplitAssign( builder );
32
51
 
33
52
  const targetType = targetNode.getNodeType( builder );
34
53
 
35
- const target = targetNode.build( builder );
54
+ const target = targetNode.context( { assign: true } ).build( builder );
36
55
  const source = sourceNode.build( builder, targetType );
37
56
 
38
- const snippet = `${ target } = ${ source }`;
57
+ const sourceType = sourceNode.getNodeType( builder );
58
+
59
+ const nodeData = builder.getDataFromNode( this );
60
+
61
+ //
39
62
 
40
- if ( output === 'void' ) {
63
+ let snippet;
41
64
 
42
- builder.addLineFlowCode( snippet );
65
+ if ( nodeData.initialized === true ) {
66
+
67
+ if ( output !== 'void' ) {
68
+
69
+ snippet = target;
70
+
71
+ }
43
72
 
44
- return;
73
+ } else if ( needsSplitAssign ) {
74
+
75
+ const sourceVar = builder.getVarFromNode( this, null, targetType );
76
+ const sourceProperty = builder.getPropertyName( sourceVar );
77
+
78
+ builder.addLineFlowCode( `${ sourceProperty } = ${ source }` );
79
+
80
+ const targetRoot = targetNode.node.context( { assign: true } ).build( builder );
81
+
82
+ for ( let i = 0; i < targetNode.components.length; i ++ ) {
83
+
84
+ const component = targetNode.components[ i ];
85
+
86
+ builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]` );
87
+
88
+ }
89
+
90
+ if ( output !== 'void' ) {
91
+
92
+ snippet = target;
93
+
94
+ }
45
95
 
46
96
  } else {
47
97
 
48
- const sourceType = sourceNode.getNodeType( builder );
98
+ snippet = `${ target } = ${ source }`;
49
99
 
50
- if ( sourceType === 'void' ) {
100
+ if ( output === 'void' || sourceType === 'void' ) {
51
101
 
52
102
  builder.addLineFlowCode( snippet );
53
103
 
54
- return target;
104
+ if ( output !== 'void' ) {
55
105
 
56
- }
106
+ snippet = target;
57
107
 
58
- return builder.format( snippet, targetType, output );
108
+ }
109
+
110
+ }
59
111
 
60
112
  }
61
113
 
114
+ nodeData.initialized = true;
115
+
116
+ return builder.format( snippet, targetType, output );
117
+
62
118
  }
63
119
 
64
120
  }
@@ -91,7 +91,7 @@ class AttributeNode extends Node {
91
91
 
92
92
  } else {
93
93
 
94
- console.warn( `AttributeNode: Attribute "${ attributeName }" not found.` );
94
+ console.warn( `AttributeNode: Vertex attribute "${ attributeName }" not found on geometry.` );
95
95
 
96
96
  return builder.generateConst( nodeType );
97
97
 
@@ -40,7 +40,7 @@ class Node extends EventDispatcher {
40
40
 
41
41
  }
42
42
 
43
- updateReference() {
43
+ setReference( /*state*/ ) {
44
44
 
45
45
  return this;
46
46
 
@@ -150,12 +150,20 @@ class Node extends EventDispatcher {
150
150
 
151
151
  }
152
152
 
153
- analyze( builder ) {
153
+ increaseUsage( builder ) {
154
154
 
155
155
  const nodeData = builder.getDataFromNode( this );
156
- nodeData.dependenciesCount = nodeData.dependenciesCount === undefined ? 1 : nodeData.dependenciesCount + 1;
156
+ nodeData.usageCount = nodeData.usageCount === undefined ? 1 : nodeData.usageCount + 1;
157
+
158
+ return nodeData.usageCount;
159
+
160
+ }
157
161
 
158
- if ( nodeData.dependenciesCount === 1 ) {
162
+ analyze( builder ) {
163
+
164
+ const usageCount = this.increaseUsage( builder );
165
+
166
+ if ( usageCount === 1 ) {
159
167
 
160
168
  // node flow children
161
169
 
@@ -223,6 +231,8 @@ class Node extends EventDispatcher {
223
231
 
224
232
  if ( buildStage === 'setup' ) {
225
233
 
234
+ this.setReference( builder );
235
+
226
236
  const properties = builder.getNodeProperties( this );
227
237
 
228
238
  if ( properties.initialized !== true || builder.context.tempRead === false ) {