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
@@ -2,49 +2,63 @@ import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
  import { texture } from './TextureNode.js';
5
+ import { buffer } from './BufferNode.js';
5
6
  import { nodeObject } from '../shadernode/ShaderNode.js';
7
+ import { uniforms } from './UniformsNode.js';
8
+ import ArrayElementNode from '../utils/ArrayElementNode.js';
6
9
 
7
- class ReferenceNode extends Node {
10
+ class ReferenceElementNode extends ArrayElementNode {
8
11
 
9
- constructor( property, uniformType, object = null ) {
12
+ constructor( referenceNode, indexNode ) {
10
13
 
11
- super();
14
+ super( referenceNode, indexNode );
12
15
 
13
- this.property = property;
14
- this.index = null;
16
+ this.referenceNode = referenceNode;
15
17
 
16
- this.uniformType = uniformType;
17
-
18
- this.object = object;
19
- this.reference = null;
18
+ this.isReferenceElementNode = true;
20
19
 
21
- this.node = null;
20
+ }
22
21
 
23
- this.updateType = NodeUpdateType.OBJECT;
22
+ getNodeType() {
24
23
 
25
- this.setNodeType( uniformType );
24
+ return this.referenceNode.uniformType;
26
25
 
27
26
  }
28
27
 
29
- updateReference( frame ) {
28
+ generate( builder ) {
30
29
 
31
- this.reference = this.object !== null ? this.object : frame.object;
30
+ const snippet = super.generate( builder );
31
+ const arrayType = this.referenceNode.getNodeType();
32
+ const elementType = this.getNodeType();
32
33
 
33
- return this.reference;
34
+ return builder.format( snippet, arrayType, elementType );
34
35
 
35
36
  }
36
37
 
37
- setIndex( index ) {
38
+ }
38
39
 
39
- this.index = index;
40
+ class ReferenceNode extends Node {
40
41
 
41
- return this;
42
+ constructor( property, uniformType, object = null, count = null ) {
43
+
44
+ super();
45
+
46
+ this.property = property;
47
+ this.uniformType = uniformType;
48
+ this.object = object;
49
+ this.count = count;
50
+
51
+ this.properties = property.split( '.' );
52
+ this.reference = null;
53
+ this.node = null;
54
+
55
+ this.updateType = NodeUpdateType.OBJECT;
42
56
 
43
57
  }
44
58
 
45
- getIndex() {
59
+ element( indexNode ) {
46
60
 
47
- return this.index;
61
+ return nodeObject( new ReferenceElementNode( this, nodeObject( indexNode ) ) );
48
62
 
49
63
  }
50
64
 
@@ -52,13 +66,21 @@ class ReferenceNode extends Node {
52
66
 
53
67
  let node = null;
54
68
 
55
- if ( uniformType === 'texture' ) {
69
+ if ( this.count !== null ) {
70
+
71
+ node = buffer( null, uniformType, this.count );
72
+
73
+ } else if ( Array.isArray( this.getValueFromReference() ) ) {
74
+
75
+ node = uniforms( null, uniformType );
76
+
77
+ } else if ( uniformType === 'texture' ) {
56
78
 
57
79
  node = texture( null );
58
80
 
59
81
  } else {
60
82
 
61
- node = uniform( uniformType );
83
+ node = uniform( null, uniformType );
62
84
 
63
85
  }
64
86
 
@@ -72,31 +94,67 @@ class ReferenceNode extends Node {
72
94
 
73
95
  }
74
96
 
75
- update( /*frame*/ ) {
97
+ getValueFromReference( object = this.reference ) {
76
98
 
77
- let value = this.reference[ this.property ];
99
+ const { properties } = this;
78
100
 
79
- if ( this.index !== null ) {
101
+ let value = object[ properties[ 0 ] ];
80
102
 
81
- value = value[ this.index ];
103
+ for ( let i = 1; i < properties.length; i ++ ) {
104
+
105
+ value = value[ properties[ i ] ];
82
106
 
83
107
  }
84
108
 
85
- this.node.value = value;
109
+ return value;
110
+
111
+ }
112
+
113
+ updateReference( state ) {
114
+
115
+ this.reference = this.object !== null ? this.object : state.object;
116
+
117
+ return this.reference;
86
118
 
87
119
  }
88
120
 
89
- setup( /*builder*/ ) {
121
+ setup() {
122
+
123
+ this.updateValue();
90
124
 
91
125
  return this.node;
92
126
 
93
127
  }
94
128
 
129
+ update( /*frame*/ ) {
130
+
131
+ this.updateValue();
132
+
133
+ }
134
+
135
+ updateValue() {
136
+
137
+ if ( this.node === null ) this.setNodeType( this.uniformType );
138
+
139
+ const value = this.getValueFromReference();
140
+
141
+ if ( Array.isArray( value ) ) {
142
+
143
+ this.node.array = value;
144
+
145
+ } else {
146
+
147
+ this.node.value = value;
148
+
149
+ }
150
+
151
+ }
152
+
95
153
  }
96
154
 
97
155
  export default ReferenceNode;
98
156
 
99
157
  export const reference = ( name, type, object ) => nodeObject( new ReferenceNode( name, type, object ) );
100
- export const referenceIndex = ( name, index, type, object ) => nodeObject( new ReferenceNode( name, type, object ).setIndex( index ) );
158
+ export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceNode( name, type, object, count ) );
101
159
 
102
160
  addNodeClass( 'ReferenceNode', ReferenceNode );
@@ -0,0 +1,29 @@
1
+ import ReferenceNode from './ReferenceNode.js';
2
+ import { addNodeClass } from '../core/Node.js';
3
+ import { nodeObject } from '../shadernode/ShaderNode.js';
4
+
5
+ class RendererReferenceNode extends ReferenceNode {
6
+
7
+ constructor( property, inputType, renderer = null ) {
8
+
9
+ super( property, inputType, renderer );
10
+
11
+ this.renderer = renderer;
12
+
13
+ }
14
+
15
+ updateReference( state ) {
16
+
17
+ this.reference = this.renderer !== null ? this.renderer : state.renderer;
18
+
19
+ return this.reference;
20
+
21
+ }
22
+
23
+ }
24
+
25
+ export default RendererReferenceNode;
26
+
27
+ export const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) );
28
+
29
+ addNodeClass( 'RendererReferenceNode', RendererReferenceNode );
@@ -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 );
@@ -3,6 +3,7 @@ import { bufferAttribute } from './BufferAttributeNode.js';
3
3
  import { addNodeClass } from '../core/Node.js';
4
4
  import { nodeObject } from '../shadernode/ShaderNode.js';
5
5
  import { varying } from '../core/VaryingNode.js';
6
+ import { storageElement } from '../utils/StorageArrayElementNode.js';
6
7
 
7
8
  class StorageBufferNode extends BufferNode {
8
9
 
@@ -12,6 +13,8 @@ class StorageBufferNode extends BufferNode {
12
13
 
13
14
  this.isStorageBufferNode = true;
14
15
 
16
+ this.bufferObject = false;
17
+
15
18
  this._attribute = null;
16
19
  this._varying = null;
17
20
 
@@ -23,6 +26,20 @@ class StorageBufferNode extends BufferNode {
23
26
 
24
27
  }
25
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
+
26
43
  generate( builder ) {
27
44
 
28
45
  if ( builder.isAvailable( 'storageBuffer' ) ) return super.generate( builder );
@@ -50,5 +67,6 @@ class StorageBufferNode extends BufferNode {
50
67
  export default StorageBufferNode;
51
68
 
52
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 ) );
53
71
 
54
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 ) {
@@ -25,10 +25,34 @@ class TextureNode extends UniformNode {
25
25
  this.updateMatrix = false;
26
26
  this.updateType = NodeUpdateType.NONE;
27
27
 
28
+ this.referenceNode = null;
29
+
30
+ this._value = value;
31
+
28
32
  this.setUpdateMatrix( uvNode === null );
29
33
 
30
34
  }
31
35
 
36
+ set value( value ) {
37
+
38
+ if ( this.referenceNode ) {
39
+
40
+ this.referenceNode.value = value;
41
+
42
+ } else {
43
+
44
+ this._value = value;
45
+
46
+ }
47
+
48
+ }
49
+
50
+ get value() {
51
+
52
+ return this.referenceNode ? this.referenceNode.value : this._value;
53
+
54
+ }
55
+
32
56
  getUniformHash( /*builder*/ ) {
33
57
 
34
58
  return this.value.uuid;
@@ -55,7 +79,7 @@ class TextureNode extends UniformNode {
55
79
 
56
80
  }
57
81
 
58
- updateReference( /*frame*/ ) {
82
+ updateReference( /*state*/ ) {
59
83
 
60
84
  return this.value;
61
85
 
@@ -126,12 +150,6 @@ class TextureNode extends UniformNode {
126
150
 
127
151
  }
128
152
 
129
- if ( levelNode !== null && builder.context.getTextureLevelAlgorithm !== undefined ) {
130
-
131
- levelNode = builder.context.getTextureLevelAlgorithm( this, levelNode );
132
-
133
- }
134
-
135
153
  //
136
154
 
137
155
  properties.uvNode = uvNode;
@@ -264,6 +282,7 @@ class TextureNode extends UniformNode {
264
282
 
265
283
  const textureNode = this.clone();
266
284
  textureNode.uvNode = uvNode;
285
+ textureNode.referenceNode = this;
267
286
 
268
287
  return nodeObject( textureNode );
269
288
 
@@ -273,6 +292,7 @@ class TextureNode extends UniformNode {
273
292
 
274
293
  const textureNode = this.clone();
275
294
  textureNode.levelNode = levelNode.mul( maxMipLevel( textureNode ) );
295
+ textureNode.referenceNode = this;
276
296
 
277
297
  return nodeObject( textureNode );
278
298
 
@@ -282,6 +302,7 @@ class TextureNode extends UniformNode {
282
302
 
283
303
  const textureNode = this.clone();
284
304
  textureNode.levelNode = levelNode;
305
+ textureNode.referenceNode = this;
285
306
 
286
307
  return textureNode;
287
308
 
@@ -297,6 +318,7 @@ class TextureNode extends UniformNode {
297
318
 
298
319
  const textureNode = this.clone();
299
320
  textureNode.compareNode = nodeObject( compareNode );
321
+ textureNode.referenceNode = this;
300
322
 
301
323
  return nodeObject( textureNode );
302
324
 
@@ -306,6 +328,7 @@ class TextureNode extends UniformNode {
306
328
 
307
329
  const textureNode = this.clone();
308
330
  textureNode.depthNode = nodeObject( depthNode );
331
+ textureNode.referenceNode = this;
309
332
 
310
333
  return nodeObject( textureNode );
311
334
 
@@ -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 );
@@ -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;