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
@@ -7,7 +7,7 @@ import NodeKeywords from './NodeKeywords.js';
7
7
  import NodeCache from './NodeCache.js';
8
8
  import ParameterNode from './ParameterNode.js';
9
9
  import FunctionNode from '../code/FunctionNode.js';
10
- import { createNodeMaterialFromType } from '../materials/NodeMaterial.js';
10
+ import { createNodeMaterialFromType, default as NodeMaterial } from '../materials/NodeMaterial.js';
11
11
  import { NodeUpdateType, defaultBuildStages, shaderStages } from './constants.js';
12
12
 
13
13
  import {
@@ -15,7 +15,7 @@ import {
15
15
  ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
16
16
  } from '../../renderers/common/nodes/NodeUniform.js';
17
17
 
18
- import { REVISION, RenderTarget, NoColorSpace, LinearEncoding, sRGBEncoding, SRGBColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
18
+ import { REVISION, RenderTarget, NoColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
19
19
 
20
20
  import { stack } from './StackNode.js';
21
21
  import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
@@ -72,6 +72,8 @@ class NodeBuilder {
72
72
  this.fogNode = null;
73
73
  this.toneMappingNode = null;
74
74
 
75
+ this.clippingContext = null;
76
+
75
77
  this.vertexShader = null;
76
78
  this.fragmentShader = null;
77
79
  this.computeShader = null;
@@ -462,7 +464,7 @@ class NodeBuilder {
462
464
 
463
465
  isReference( type ) {
464
466
 
465
- return type === 'void' || type === 'property' || type === 'sampler' || type === 'texture' || type === 'cubeTexture';
467
+ return type === 'void' || type === 'property' || type === 'sampler' || type === 'texture' || type === 'cubeTexture' || type === 'storageTexture';
466
468
 
467
469
  }
468
470
 
@@ -472,14 +474,6 @@ class NodeBuilder {
472
474
 
473
475
  }
474
476
 
475
- /** @deprecated, r152 */
476
- getTextureEncodingFromMap( map ) {
477
-
478
- console.warn( 'THREE.NodeBuilder: Method .getTextureEncodingFromMap replaced by .getTextureColorSpaceFromMap in r152+.' );
479
- return this.getTextureColorSpaceFromMap( map ) === SRGBColorSpace ? sRGBEncoding : LinearEncoding;
480
-
481
- }
482
-
483
477
  getTextureColorSpaceFromMap( map ) {
484
478
 
485
479
  let colorSpace;
@@ -523,7 +517,7 @@ class NodeBuilder {
523
517
  getVectorType( type ) {
524
518
 
525
519
  if ( type === 'color' ) return 'vec3';
526
- if ( type === 'texture' ) return 'vec4';
520
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' ) return 'vec4';
527
521
 
528
522
  return type;
529
523
 
@@ -575,6 +569,7 @@ class NodeBuilder {
575
569
 
576
570
  if ( vecNum !== null ) return Number( vecNum[ 1 ] );
577
571
  if ( vecType === 'float' || vecType === 'bool' || vecType === 'int' || vecType === 'uint' ) return 1;
572
+ if ( /mat2/.test( type ) === true ) return 4;
578
573
  if ( /mat3/.test( type ) === true ) return 9;
579
574
  if ( /mat4/.test( type ) === true ) return 16;
580
575
 
@@ -1089,7 +1084,23 @@ class NodeBuilder {
1089
1084
 
1090
1085
  }
1091
1086
 
1092
- build() {
1087
+ build( convertMaterial = true ) {
1088
+
1089
+ const { object, material } = this;
1090
+
1091
+ if ( convertMaterial ) {
1092
+
1093
+ if ( material !== null ) {
1094
+
1095
+ NodeMaterial.fromMaterial( material ).build( this );
1096
+
1097
+ } else {
1098
+
1099
+ this.addFlow( 'compute', object );
1100
+
1101
+ }
1102
+
1103
+ }
1093
1104
 
1094
1105
  // setup() -> stage 1: create possible new nodes and returns an output reference node
1095
1106
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
@@ -1155,24 +1166,12 @@ class NodeBuilder {
1155
1166
 
1156
1167
  }
1157
1168
 
1158
- createNodeMaterial( type ) {
1169
+ createNodeMaterial( type = 'NodeMaterial' ) {
1159
1170
 
1160
1171
  return createNodeMaterialFromType( type );
1161
1172
 
1162
1173
  }
1163
1174
 
1164
- getPrimitiveType( type ) {
1165
-
1166
- let primitiveType;
1167
-
1168
- if ( type[ 0 ] === 'i' ) primitiveType = 'int';
1169
- else if ( type[ 0 ] === 'u' ) primitiveType = 'uint';
1170
- else primitiveType = 'float';
1171
-
1172
- return primitiveType;
1173
-
1174
- }
1175
-
1176
1175
  format( snippet, fromType, toType ) {
1177
1176
 
1178
1177
  fromType = this.getVectorType( fromType );
@@ -1232,7 +1231,7 @@ class NodeBuilder {
1232
1231
  // convert a number value to vector type, e.g:
1233
1232
  // vec3( 1u ) -> vec3( float( 1u ) )
1234
1233
 
1235
- snippet = `${ this.getType( this.getPrimitiveType( toType ) ) }( ${ snippet } )`;
1234
+ snippet = `${ this.getType( this.getComponentType( toType ) ) }( ${ snippet } )`;
1236
1235
 
1237
1236
  }
1238
1237
 
@@ -45,7 +45,7 @@ class NodeFrame {
45
45
  updateBeforeNode( node ) {
46
46
 
47
47
  const updateType = node.getUpdateBeforeType();
48
- const reference = node.updateReference( this );
48
+ const reference = node.setReference( this );
49
49
 
50
50
  if ( updateType === NodeUpdateType.FRAME ) {
51
51
 
@@ -53,9 +53,11 @@ class NodeFrame {
53
53
 
54
54
  if ( frameMap.get( node ) !== this.frameId ) {
55
55
 
56
- frameMap.set( node, this.frameId );
56
+ if ( node.updateBefore( this ) !== false ) {
57
57
 
58
- node.updateBefore( this );
58
+ frameMap.set( node, this.frameId );
59
+
60
+ }
59
61
 
60
62
  }
61
63
 
@@ -65,9 +67,11 @@ class NodeFrame {
65
67
 
66
68
  if ( renderMap.get( node ) !== this.renderId ) {
67
69
 
68
- renderMap.set( node, this.renderId );
70
+ if ( node.updateBefore( this ) !== false ) {
71
+
72
+ renderMap.set( node, this.renderId );
69
73
 
70
- node.updateBefore( this );
74
+ }
71
75
 
72
76
  }
73
77
 
@@ -82,7 +86,7 @@ class NodeFrame {
82
86
  updateNode( node ) {
83
87
 
84
88
  const updateType = node.getUpdateType();
85
- const reference = node.updateReference( this );
89
+ const reference = node.setReference( this );
86
90
 
87
91
  if ( updateType === NodeUpdateType.FRAME ) {
88
92
 
@@ -90,9 +94,11 @@ class NodeFrame {
90
94
 
91
95
  if ( frameMap.get( node ) !== this.frameId ) {
92
96
 
93
- frameMap.set( node, this.frameId );
97
+ if ( node.update( this ) !== false ) {
94
98
 
95
- node.update( this );
99
+ frameMap.set( node, this.frameId );
100
+
101
+ }
96
102
 
97
103
  }
98
104
 
@@ -102,9 +108,11 @@ class NodeFrame {
102
108
 
103
109
  if ( renderMap.get( node ) !== this.renderId ) {
104
110
 
105
- renderMap.set( node, this.renderId );
111
+ if ( node.update( this ) !== false ) {
112
+
113
+ renderMap.set( node, this.renderId );
106
114
 
107
- node.update( this );
115
+ }
108
116
 
109
117
  }
110
118
 
@@ -12,7 +12,7 @@ class TempNode extends Node {
12
12
 
13
13
  hasDependencies( builder ) {
14
14
 
15
- return builder.getDataFromNode( this ).dependenciesCount > 1;
15
+ return builder.getDataFromNode( this ).usageCount > 1;
16
16
 
17
17
  }
18
18
 
@@ -17,6 +17,7 @@ export const NodeType = {
17
17
  VECTOR2: 'vec2',
18
18
  VECTOR3: 'vec3',
19
19
  VECTOR4: 'vec4',
20
+ MATRIX2: 'mat2',
20
21
  MATRIX3: 'mat3',
21
22
  MATRIX4: 'mat4'
22
23
  };
@@ -0,0 +1,148 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { nodeObject, addNodeElement, tslFn, float, vec4 } from '../shadernode/ShaderNode.js';
3
+ import { NodeUpdateType } from '../core/constants.js';
4
+ import { uv } from '../accessors/UVNode.js';
5
+ import { texture } from '../accessors/TextureNode.js';
6
+ import { texturePass } from './PassNode.js';
7
+ import { uniform } from '../core/UniformNode.js';
8
+ import { RenderTarget } from 'three';
9
+ import { sign, max } from '../math/MathNode.js';
10
+ import QuadMesh from '../../objects/QuadMesh.js';
11
+
12
+ const quadMeshComp = new QuadMesh();
13
+
14
+ class AfterImageNode extends TempNode {
15
+
16
+ constructor( textureNode, damp = 0.96 ) {
17
+
18
+ super( textureNode );
19
+
20
+ this.textureNode = textureNode;
21
+ this.textureNodeOld = texture();
22
+ this.damp = uniform( damp );
23
+
24
+ this._compRT = new RenderTarget();
25
+ this._compRT.texture.name = 'AfterImageNode.comp';
26
+
27
+ this._oldRT = new RenderTarget();
28
+ this._oldRT.texture.name = 'AfterImageNode.old';
29
+
30
+ this._textureNode = texturePass( this, this._compRT.texture );
31
+
32
+ this.updateBeforeType = NodeUpdateType.RENDER;
33
+
34
+ }
35
+
36
+ getTextureNode() {
37
+
38
+ return this._textureNode;
39
+
40
+ }
41
+
42
+ setSize( width, height ) {
43
+
44
+ this._compRT.setSize( width, height );
45
+ this._oldRT.setSize( width, height );
46
+
47
+ }
48
+
49
+ updateBefore( frame ) {
50
+
51
+ const { renderer } = frame;
52
+
53
+ const textureNode = this.textureNode;
54
+ const map = textureNode.value;
55
+
56
+ const textureType = map.type;
57
+
58
+ this._compRT.texture.type = textureType;
59
+ this._oldRT.texture.type = textureType;
60
+
61
+ const currentRenderTarget = renderer.getRenderTarget();
62
+ const currentTexture = textureNode.value;
63
+
64
+ this.textureNodeOld.value = this._oldRT.texture;
65
+
66
+ // comp
67
+ renderer.setRenderTarget( this._compRT );
68
+ quadMeshComp.render( renderer );
69
+
70
+ // Swap the textures
71
+ const temp = this._oldRT;
72
+ this._oldRT = this._compRT;
73
+ this._compRT = temp;
74
+
75
+ // set size before swapping fails
76
+ this.setSize( map.image.width, map.image.height );
77
+
78
+ renderer.setRenderTarget( currentRenderTarget );
79
+ textureNode.value = currentTexture;
80
+
81
+ }
82
+
83
+ setup( builder ) {
84
+
85
+ const textureNode = this.textureNode;
86
+ const textureNodeOld = this.textureNodeOld;
87
+
88
+ if ( textureNode.isTextureNode !== true ) {
89
+
90
+ console.error( 'AfterImageNode requires a TextureNode.' );
91
+
92
+ return vec4();
93
+
94
+ }
95
+
96
+ //
97
+
98
+ const uvNode = textureNode.uvNode || uv();
99
+
100
+ textureNodeOld.uvNode = uvNode;
101
+
102
+ const sampleTexture = ( uv ) => textureNode.cache().context( { getUV: () => uv, forceUVContext: true } );
103
+
104
+ const when_gt = tslFn( ( [ x_immutable, y_immutable ] ) => {
105
+
106
+ const y = float( y_immutable ).toVar();
107
+ const x = vec4( x_immutable ).toVar();
108
+
109
+ return max( sign( x.sub( y ) ), 0.0 );
110
+
111
+ } );
112
+
113
+ const afterImg = tslFn( () => {
114
+
115
+ const texelOld = vec4( textureNodeOld );
116
+ const texelNew = vec4( sampleTexture( uvNode ) );
117
+
118
+ texelOld.mulAssign( this.damp.mul( when_gt( texelOld, 0.1 ) ) );
119
+ return max( texelNew, texelOld );
120
+
121
+ } );
122
+
123
+ //
124
+
125
+ const materialComposed = this._materialComposed || ( this._materialComposed = builder.createNodeMaterial() );
126
+ materialComposed.fragmentNode = afterImg();
127
+
128
+ quadMeshComp.material = materialComposed;
129
+
130
+ //
131
+
132
+ const properties = builder.getNodeProperties( this );
133
+ properties.textureNode = textureNode;
134
+
135
+ //
136
+
137
+ return this._textureNode;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ export const afterImage = ( node, damp ) => nodeObject( new AfterImageNode( nodeObject( node ), damp ) );
144
+
145
+ addNodeElement( 'afterImage', afterImage );
146
+
147
+ export default AfterImageNode;
148
+
@@ -0,0 +1,148 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { nodeObject, addNodeElement, tslFn, float, vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
3
+ import { loop } from '../utils/LoopNode.js';
4
+ import { uniform } from '../core/UniformNode.js';
5
+ import { NodeUpdateType } from '../core/constants.js';
6
+ import { threshold } from './ColorAdjustmentNode.js';
7
+ import { uv } from '../accessors/UVNode.js';
8
+ import { texturePass } from './PassNode.js';
9
+ import { Vector2, RenderTarget } from 'three';
10
+ import QuadMesh from '../../objects/QuadMesh.js';
11
+
12
+ const quadMesh = new QuadMesh();
13
+
14
+ class AnamorphicNode extends TempNode {
15
+
16
+ constructor( textureNode, tresholdNode, scaleNode, samples ) {
17
+
18
+ super( 'vec4' );
19
+
20
+ this.textureNode = textureNode;
21
+ this.tresholdNode = tresholdNode;
22
+ this.scaleNode = scaleNode;
23
+ this.colorNode = vec3( 0.1, 0.0, 1.0 );
24
+ this.samples = samples;
25
+ this.resolution = new Vector2( 1, 1 );
26
+
27
+ this._renderTarget = new RenderTarget();
28
+ this._renderTarget.texture.name = 'anamorphic';
29
+
30
+ this._invSize = uniform( new Vector2() );
31
+
32
+ this._textureNode = texturePass( this, this._renderTarget.texture );
33
+
34
+ this.updateBeforeType = NodeUpdateType.RENDER;
35
+
36
+ }
37
+
38
+ getTextureNode() {
39
+
40
+ return this._textureNode;
41
+
42
+ }
43
+
44
+ setSize( width, height ) {
45
+
46
+ this._invSize.value.set( 1 / width, 1 / height );
47
+
48
+ width = Math.max( Math.round( width * this.resolution.x ), 1 );
49
+ height = Math.max( Math.round( height * this.resolution.y ), 1 );
50
+
51
+ this._renderTarget.setSize( width, height );
52
+
53
+ }
54
+
55
+ updateBefore( frame ) {
56
+
57
+ const { renderer } = frame;
58
+
59
+ const textureNode = this.textureNode;
60
+ const map = textureNode.value;
61
+
62
+ this._renderTarget.texture.type = map.type;
63
+
64
+ const currentRenderTarget = renderer.getRenderTarget();
65
+ const currentTexture = textureNode.value;
66
+
67
+ quadMesh.material = this._material;
68
+
69
+ this.setSize( map.image.width, map.image.height );
70
+
71
+ // render
72
+
73
+ renderer.setRenderTarget( this._renderTarget );
74
+
75
+ quadMesh.render( renderer );
76
+
77
+ // restore
78
+
79
+ renderer.setRenderTarget( currentRenderTarget );
80
+ textureNode.value = currentTexture;
81
+
82
+ }
83
+
84
+ setup( builder ) {
85
+
86
+ const textureNode = this.textureNode;
87
+
88
+ if ( textureNode.isTextureNode !== true ) {
89
+
90
+ console.error( 'AnamorphNode requires a TextureNode.' );
91
+
92
+ return vec4();
93
+
94
+ }
95
+
96
+ //
97
+
98
+ const uvNode = textureNode.uvNode || uv();
99
+
100
+ const sampleTexture = ( uv ) => textureNode.cache().context( { getUV: () => uv, forceUVContext: true } );
101
+
102
+ const anamorph = tslFn( () => {
103
+
104
+ const samples = this.samples;
105
+ const halfSamples = Math.floor( samples / 2 );
106
+
107
+ const total = vec3( 0 ).toVar();
108
+
109
+ loop( { start: - halfSamples, end: halfSamples }, ( { i } ) => {
110
+
111
+ const softness = float( i ).abs().div( halfSamples ).oneMinus();
112
+
113
+ const uv = vec2( uvNode.x.add( this._invSize.x.mul( i ).mul( this.scaleNode ) ), uvNode.y );
114
+ const color = sampleTexture( uv );
115
+ const pass = threshold( color, this.tresholdNode ).mul( softness );
116
+
117
+ total.addAssign( pass );
118
+
119
+ } );
120
+
121
+ return total.mul( this.colorNode );
122
+
123
+ } );
124
+
125
+ //
126
+
127
+ const material = this._material || ( this._material = builder.createNodeMaterial() );
128
+ material.fragmentNode = anamorph();
129
+
130
+ //
131
+
132
+ const properties = builder.getNodeProperties( this );
133
+ properties.textureNode = textureNode;
134
+
135
+ //
136
+
137
+ return this._textureNode;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ export const anamorphic = ( node, threshold = .9, scale = 3, samples = 32 ) => nodeObject( new AnamorphicNode( nodeObject( node ), nodeObject( threshold ), nodeObject( scale ), samples ) );
144
+
145
+ addNodeElement( 'anamorphic', anamorphic );
146
+
147
+ export default AnamorphicNode;
148
+
@@ -1,5 +1,5 @@
1
1
  import TempNode from '../core/TempNode.js';
2
- import { EPSILON } from '../math/MathNode.js';
2
+ import { /*mix, step,*/ EPSILON } from '../math/MathNode.js';
3
3
  import { addNodeClass } from '../core/Node.js';
4
4
  import { addNodeElement, tslFn, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
5
5
 
@@ -9,6 +9,13 @@ export const BurnNode = tslFn( ( { base, blend } ) => {
9
9
 
10
10
  return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) );
11
11
 
12
+ } ).setLayout( {
13
+ name: 'burnColor',
14
+ type: 'vec3',
15
+ inputs: [
16
+ { name: 'base', type: 'vec3' },
17
+ { name: 'blend', type: 'vec3' }
18
+ ]
12
19
  } );
13
20
 
14
21
  export const DodgeNode = tslFn( ( { base, blend } ) => {
@@ -17,6 +24,13 @@ export const DodgeNode = tslFn( ( { base, blend } ) => {
17
24
 
18
25
  return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) );
19
26
 
27
+ } ).setLayout( {
28
+ name: 'dodgeColor',
29
+ type: 'vec3',
30
+ inputs: [
31
+ { name: 'base', type: 'vec3' },
32
+ { name: 'blend', type: 'vec3' }
33
+ ]
20
34
  } );
21
35
 
22
36
  export const ScreenNode = tslFn( ( { base, blend } ) => {
@@ -25,14 +39,29 @@ export const ScreenNode = tslFn( ( { base, blend } ) => {
25
39
 
26
40
  return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) );
27
41
 
42
+ } ).setLayout( {
43
+ name: 'screenColor',
44
+ type: 'vec3',
45
+ inputs: [
46
+ { name: 'base', type: 'vec3' },
47
+ { name: 'blend', type: 'vec3' }
48
+ ]
28
49
  } );
29
50
 
30
51
  export const OverlayNode = tslFn( ( { base, blend } ) => {
31
52
 
32
53
  const fn = ( c ) => base[ c ].lessThan( 0.5 ).cond( base[ c ].mul( blend[ c ], 2.0 ), base[ c ].oneMinus().mul( blend[ c ].oneMinus() ).oneMinus() );
54
+ //const fn = ( c ) => mix( base[ c ].oneMinus().mul( blend[ c ].oneMinus() ).oneMinus(), base[ c ].mul( blend[ c ], 2.0 ), step( base[ c ], 0.5 ) );
33
55
 
34
56
  return vec3( fn( 'x' ), fn( 'y' ), fn( 'z' ) );
35
57
 
58
+ } ).setLayout( {
59
+ name: 'overlayColor',
60
+ type: 'vec3',
61
+ inputs: [
62
+ { name: 'base', type: 'vec3' },
63
+ { name: 'blend', type: 'vec3' }
64
+ ]
36
65
  } );
37
66
 
38
67
  class BlendModeNode extends TempNode {
@@ -89,8 +89,11 @@ export const hue = nodeProxy( ColorAdjustmentNode, ColorAdjustmentNode.HUE );
89
89
  export const lumaCoeffs = vec3( 0.2125, 0.7154, 0.0721 );
90
90
  export const luminance = ( color, luma = lumaCoeffs ) => dot( color, luma );
91
91
 
92
+ export const threshold = ( color, threshold ) => mix( vec3( 0.0 ), color, luminance( color ).sub( threshold ).max( 0 ) );
93
+
92
94
  addNodeElement( 'saturation', saturation );
93
95
  addNodeElement( 'vibrance', vibrance );
94
96
  addNodeElement( 'hue', hue );
97
+ addNodeElement( 'threshold', threshold );
95
98
 
96
99
  addNodeClass( 'ColorAdjustmentNode', ColorAdjustmentNode );