super-three 0.168.0 → 0.169.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 (286) hide show
  1. package/build/three.cjs +369 -131
  2. package/build/three.module.js +369 -131
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +24644 -22406
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +79941 -0
  7. package/build/three.webgpu.nodes.min.js +6 -0
  8. package/examples/jsm/Addons.js +0 -6
  9. package/examples/jsm/controls/TrackballControls.js +32 -12
  10. package/examples/jsm/controls/TransformControls.js +97 -62
  11. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  12. package/examples/jsm/exporters/EXRExporter.js +19 -11
  13. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  14. package/examples/jsm/exporters/OBJExporter.js +5 -1
  15. package/examples/jsm/exporters/PLYExporter.js +9 -7
  16. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  17. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  18. package/examples/jsm/helpers/LightProbeHelper.js +1 -1
  19. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  20. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  21. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  22. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  23. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  24. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  25. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  26. package/examples/jsm/loaders/FBXLoader.js +30 -20
  27. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  28. package/examples/jsm/loaders/KTX2Loader.js +10 -7
  29. package/examples/jsm/loaders/MTLLoader.js +4 -3
  30. package/examples/jsm/loaders/MaterialXLoader.js +29 -10
  31. package/examples/jsm/loaders/OBJLoader.js +5 -3
  32. package/examples/jsm/loaders/PCDLoader.js +5 -4
  33. package/examples/jsm/loaders/PDBLoader.js +3 -2
  34. package/examples/jsm/loaders/PLYLoader.js +8 -5
  35. package/examples/jsm/loaders/STLLoader.js +3 -2
  36. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  37. package/examples/jsm/loaders/VTKLoader.js +4 -3
  38. package/examples/jsm/loaders/XYZLoader.js +3 -2
  39. package/examples/jsm/misc/Timer.js +1 -1
  40. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  41. package/examples/jsm/objects/LensflareMesh.js +322 -0
  42. package/examples/jsm/objects/SkyMesh.js +1 -2
  43. package/examples/jsm/objects/Water2Mesh.js +2 -3
  44. package/examples/jsm/objects/WaterMesh.js +1 -2
  45. package/examples/jsm/physics/JoltPhysics.js +1 -1
  46. package/examples/jsm/physics/RapierPhysics.js +1 -1
  47. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  48. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  49. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  50. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  51. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  52. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  53. package/examples/jsm/utils/TextureUtils.js +1 -0
  54. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  55. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  56. package/package.json +2 -2
  57. package/src/Three.WebGPU.Nodes.js +200 -0
  58. package/src/Three.WebGPU.js +2 -1
  59. package/src/audio/Audio.js +2 -2
  60. package/src/constants.js +1 -1
  61. package/src/core/BufferAttribute.js +0 -9
  62. package/src/core/Clock.js +1 -1
  63. package/src/core/InterleavedBuffer.js +0 -9
  64. package/src/extras/Controls.js +1 -1
  65. package/src/geometries/CylinderGeometry.js +11 -4
  66. package/src/loaders/MaterialLoader.js +7 -1
  67. package/src/loaders/nodes/NodeLoader.js +24 -4
  68. package/src/loaders/nodes/NodeMaterialLoader.js +21 -17
  69. package/src/loaders/nodes/NodeObjectLoader.js +19 -0
  70. package/src/materials/nodes/InstancedPointsNodeMaterial.js +19 -34
  71. package/src/materials/nodes/Line2NodeMaterial.js +26 -26
  72. package/src/materials/nodes/LineBasicNodeMaterial.js +7 -3
  73. package/src/materials/nodes/LineDashedNodeMaterial.js +7 -3
  74. package/src/materials/nodes/MeshBasicNodeMaterial.js +7 -3
  75. package/src/materials/nodes/MeshLambertNodeMaterial.js +7 -3
  76. package/src/materials/nodes/MeshMatcapNodeMaterial.js +7 -3
  77. package/src/materials/nodes/MeshNormalNodeMaterial.js +7 -3
  78. package/src/materials/nodes/MeshPhongNodeMaterial.js +7 -3
  79. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +6 -3
  80. package/src/materials/nodes/MeshSSSNodeMaterial.js +6 -3
  81. package/src/materials/nodes/MeshStandardNodeMaterial.js +7 -3
  82. package/src/materials/nodes/MeshToonNodeMaterial.js +7 -3
  83. package/src/materials/nodes/NodeMaterial.js +20 -45
  84. package/src/materials/nodes/NodeMaterials.js +2 -0
  85. package/src/materials/nodes/PointsNodeMaterial.js +7 -3
  86. package/src/materials/nodes/ShadowNodeMaterial.js +7 -3
  87. package/src/materials/nodes/SpriteNodeMaterial.js +39 -6
  88. package/src/materials/nodes/VolumeNodeMaterial.js +13 -9
  89. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  90. package/src/math/Triangle.js +24 -0
  91. package/src/nodes/Nodes.js +3 -3
  92. package/src/nodes/TSL.js +96 -93
  93. package/src/nodes/accessors/BatchNode.js +7 -3
  94. package/src/nodes/accessors/BufferAttributeNode.js +6 -3
  95. package/src/nodes/accessors/BufferNode.js +6 -3
  96. package/src/nodes/accessors/Camera.js +10 -16
  97. package/src/nodes/accessors/ClippingNode.js +7 -3
  98. package/src/nodes/accessors/CubeTextureNode.js +6 -3
  99. package/src/nodes/accessors/InstanceNode.js +11 -11
  100. package/src/nodes/accessors/InstancedPointsMaterialNode.js +6 -3
  101. package/src/nodes/accessors/Lights.js +51 -0
  102. package/src/nodes/accessors/MaterialNode.js +8 -4
  103. package/src/nodes/accessors/MaterialReferenceNode.js +6 -3
  104. package/src/nodes/accessors/ModelNode.js +42 -7
  105. package/src/nodes/accessors/ModelViewProjectionNode.js +9 -5
  106. package/src/nodes/accessors/MorphNode.js +7 -3
  107. package/src/nodes/accessors/Normal.js +32 -6
  108. package/src/nodes/accessors/Object3DNode.js +11 -27
  109. package/src/nodes/accessors/PointUVNode.js +7 -3
  110. package/src/nodes/accessors/ReferenceBaseNode.js +32 -4
  111. package/src/nodes/accessors/ReferenceNode.js +40 -3
  112. package/src/nodes/accessors/RendererReferenceNode.js +9 -3
  113. package/src/nodes/accessors/SceneNode.js +7 -3
  114. package/src/nodes/accessors/SkinningNode.js +7 -3
  115. package/src/nodes/accessors/StorageBufferNode.js +21 -3
  116. package/src/nodes/accessors/StorageTextureNode.js +7 -4
  117. package/src/nodes/accessors/Texture3DNode.js +7 -4
  118. package/src/nodes/accessors/TextureNode.js +19 -8
  119. package/src/nodes/accessors/TextureSizeNode.js +8 -5
  120. package/src/nodes/accessors/UniformArrayNode.js +12 -9
  121. package/src/nodes/accessors/UserDataNode.js +9 -6
  122. package/src/nodes/accessors/VelocityNode.js +74 -23
  123. package/src/nodes/accessors/VertexColorNode.js +6 -3
  124. package/src/nodes/code/CodeNode.js +7 -3
  125. package/src/nodes/code/ExpressionNode.js +8 -4
  126. package/src/nodes/code/FunctionCallNode.js +6 -3
  127. package/src/nodes/code/FunctionNode.js +6 -3
  128. package/src/nodes/code/ScriptableNode.js +11 -6
  129. package/src/nodes/code/ScriptableValueNode.js +7 -3
  130. package/src/nodes/core/AssignNode.js +9 -6
  131. package/src/nodes/core/AttributeNode.js +7 -3
  132. package/src/nodes/core/BypassNode.js +8 -4
  133. package/src/nodes/core/CacheNode.js +8 -4
  134. package/src/nodes/core/ConstNode.js +6 -3
  135. package/src/nodes/core/ContextNode.js +7 -3
  136. package/src/nodes/core/IndexNode.js +25 -3
  137. package/src/nodes/core/InputNode.js +7 -3
  138. package/src/nodes/core/MRTNode.js +6 -3
  139. package/src/nodes/core/Node.js +10 -51
  140. package/src/nodes/core/NodeBuilder.js +71 -5
  141. package/src/nodes/core/NodeUtils.js +48 -6
  142. package/src/nodes/core/OutputStructNode.js +8 -4
  143. package/src/nodes/core/ParameterNode.js +6 -3
  144. package/src/nodes/core/PropertyNode.js +7 -3
  145. package/src/nodes/core/StackNode.js +7 -3
  146. package/src/nodes/core/StructTypeNode.js +7 -3
  147. package/src/nodes/core/TempNode.js +8 -4
  148. package/src/nodes/core/UniformGroupNode.js +10 -6
  149. package/src/nodes/core/UniformNode.js +6 -3
  150. package/src/nodes/core/VarNode.js +8 -4
  151. package/src/nodes/core/VaryingNode.js +7 -3
  152. package/src/nodes/display/AfterImageNode.js +6 -0
  153. package/src/nodes/display/AnaglyphPassNode.js +6 -0
  154. package/src/nodes/display/AnamorphicNode.js +6 -0
  155. package/src/nodes/display/BloomNode.js +6 -0
  156. package/src/nodes/display/BumpMapNode.js +6 -0
  157. package/src/nodes/display/ColorSpaceFunctions.js +4 -4
  158. package/src/nodes/display/ColorSpaceNode.js +43 -14
  159. package/src/nodes/display/DenoiseNode.js +6 -3
  160. package/src/nodes/display/DepthOfFieldNode.js +6 -3
  161. package/src/nodes/display/DotScreenNode.js +8 -5
  162. package/src/nodes/display/FXAANode.js +6 -3
  163. package/src/nodes/display/FilmNode.js +6 -3
  164. package/src/nodes/display/FrontFacingNode.js +7 -3
  165. package/src/nodes/display/GTAONode.js +6 -3
  166. package/src/nodes/display/GaussianBlurNode.js +6 -3
  167. package/src/nodes/display/Lut3DNode.js +6 -3
  168. package/src/nodes/display/NormalMapNode.js +8 -6
  169. package/src/nodes/display/ParallaxBarrierPassNode.js +8 -5
  170. package/src/nodes/display/PassNode.js +18 -7
  171. package/src/nodes/display/PixelationPassNode.js +12 -5
  172. package/src/nodes/display/PosterizeNode.js +6 -3
  173. package/src/nodes/display/RGBShiftNode.js +6 -3
  174. package/src/nodes/display/RenderOutputNode.js +12 -8
  175. package/src/nodes/display/SSAAPassNode.js +6 -3
  176. package/src/nodes/display/ScreenNode.js +181 -0
  177. package/src/nodes/display/SobelOperatorNode.js +6 -3
  178. package/src/nodes/display/StereoCompositePassNode.js +6 -3
  179. package/src/nodes/display/StereoPassNode.js +6 -3
  180. package/src/nodes/display/ToneMappingFunctions.js +12 -12
  181. package/src/nodes/display/ToneMappingNode.js +8 -7
  182. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  183. package/src/nodes/display/TransitionNode.js +6 -3
  184. package/src/nodes/display/ViewportDepthNode.js +7 -3
  185. package/src/nodes/display/ViewportDepthTextureNode.js +8 -5
  186. package/src/nodes/display/ViewportSharedTextureNode.js +8 -5
  187. package/src/nodes/display/ViewportTextureNode.js +8 -5
  188. package/src/nodes/fog/FogExp2Node.js +6 -3
  189. package/src/nodes/fog/FogNode.js +7 -3
  190. package/src/nodes/fog/FogRangeNode.js +6 -3
  191. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  192. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  193. package/src/nodes/geometry/RangeNode.js +7 -3
  194. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  195. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  196. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  197. package/src/nodes/gpgpu/ComputeNode.js +8 -4
  198. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  199. package/src/nodes/lighting/AONode.js +6 -3
  200. package/src/nodes/lighting/AmbientLightNode.js +6 -3
  201. package/src/nodes/lighting/AnalyticLightNode.js +198 -30
  202. package/src/nodes/lighting/BasicEnvironmentNode.js +6 -3
  203. package/src/nodes/lighting/BasicLightMapNode.js +6 -3
  204. package/src/nodes/lighting/DirectionalLightNode.js +7 -4
  205. package/src/nodes/lighting/EnvironmentNode.js +6 -3
  206. package/src/nodes/lighting/HemisphereLightNode.js +10 -6
  207. package/src/nodes/lighting/IESSpotLightNode.js +6 -3
  208. package/src/nodes/lighting/IrradianceNode.js +6 -3
  209. package/src/nodes/lighting/LightProbeNode.js +8 -31
  210. package/src/nodes/lighting/LightingContextNode.js +6 -3
  211. package/src/nodes/lighting/LightingNode.js +7 -3
  212. package/src/nodes/lighting/LightsNode.js +24 -5
  213. package/src/nodes/lighting/PointLightNode.js +11 -7
  214. package/src/nodes/lighting/RectAreaLightNode.js +11 -7
  215. package/src/nodes/lighting/SpotLightNode.js +13 -10
  216. package/src/nodes/math/ConditionalNode.js +23 -6
  217. package/src/nodes/math/MathNode.js +6 -3
  218. package/src/nodes/math/OperatorNode.js +6 -3
  219. package/src/nodes/pmrem/PMREMNode.js +6 -3
  220. package/src/nodes/utils/ArrayElementNode.js +8 -4
  221. package/src/nodes/utils/ConvertNode.js +7 -3
  222. package/src/nodes/utils/CubeMapNode.js +6 -3
  223. package/src/nodes/utils/EquirectUVNode.js +6 -3
  224. package/src/nodes/utils/FlipNode.js +7 -4
  225. package/src/nodes/utils/FunctionOverloadingNode.js +7 -3
  226. package/src/nodes/utils/JoinNode.js +6 -3
  227. package/src/nodes/utils/LoopNode.js +7 -3
  228. package/src/nodes/utils/MatcapUVNode.js +6 -3
  229. package/src/nodes/utils/MaxMipLevelNode.js +6 -3
  230. package/src/nodes/utils/OscNode.js +7 -3
  231. package/src/nodes/utils/RTTNode.js +6 -3
  232. package/src/nodes/utils/ReflectorNode.js +8 -5
  233. package/src/nodes/utils/RemapNode.js +7 -3
  234. package/src/nodes/utils/RotateNode.js +6 -3
  235. package/src/nodes/utils/SetNode.js +7 -4
  236. package/src/nodes/utils/SplitNode.js +7 -3
  237. package/src/nodes/utils/SpriteSheetUVNode.js +7 -3
  238. package/src/nodes/utils/StorageArrayElementNode.js +9 -8
  239. package/src/nodes/utils/TimerNode.js +6 -3
  240. package/src/nodes/utils/TriplanarTexturesNode.js +7 -3
  241. package/src/nodes/utils/ViewportUtils.js +2 -2
  242. package/src/objects/BatchedMesh.js +76 -10
  243. package/src/objects/LOD.js +21 -0
  244. package/src/objects/Line.js +1 -0
  245. package/src/objects/Mesh.js +7 -23
  246. package/src/objects/Points.js +2 -0
  247. package/src/renderers/WebGLRenderer.js +64 -41
  248. package/src/renderers/common/BundleGroup.js +26 -0
  249. package/src/renderers/common/ClippingContext.js +4 -3
  250. package/src/renderers/common/RenderContext.js +4 -5
  251. package/src/renderers/common/RenderObject.js +116 -5
  252. package/src/renderers/common/RenderObjects.js +8 -1
  253. package/src/renderers/common/Renderer.js +57 -49
  254. package/src/renderers/common/extras/PMREMGenerator.js +7 -9
  255. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  256. package/src/renderers/common/nodes/Nodes.js +33 -14
  257. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  258. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  259. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  260. package/src/renderers/webgl/WebGLProgram.js +2 -0
  261. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  262. package/src/renderers/webgl/WebGLState.js +21 -0
  263. package/src/renderers/webgl/WebGLTextures.js +22 -0
  264. package/src/renderers/webgl-fallback/WebGLBackend.js +50 -45
  265. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +4 -4
  266. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  267. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -4
  268. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +61 -16
  269. package/src/renderers/webgpu/WebGPUBackend.js +33 -25
  270. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  271. package/src/renderers/webgpu/WebGPURenderer.js +5 -2
  272. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  273. package/src/renderers/{common → webgpu}/nodes/StandardNodeLibrary.js +11 -11
  274. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +91 -11
  275. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  276. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +1 -1
  277. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +7 -5
  278. package/src/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  279. package/src/utils.js +33 -1
  280. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  281. package/examples/jsm/loaders/TiltLoader.js +0 -520
  282. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  283. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  284. package/src/nodes/display/ViewportNode.js +0 -138
  285. package/src/nodes/lighting/LightNode.js +0 -57
  286. package/src/renderers/common/StandardRenderer.js +0 -18
@@ -0,0 +1,233 @@
1
+ // Original src: https://github.com/zz85/threejs-path-flow
2
+ const CHANNELS = 4;
3
+ const TEXTURE_WIDTH = 1024;
4
+ const TEXTURE_HEIGHT = 4;
5
+
6
+ import {
7
+ DataTexture,
8
+ DataUtils,
9
+ RGBAFormat,
10
+ HalfFloatType,
11
+ RepeatWrapping,
12
+ Mesh,
13
+ InstancedMesh,
14
+ LinearFilter
15
+ } from 'three';
16
+
17
+ import { modelWorldMatrix, normalLocal, vec2, vec3, vec4, mat3, varyingProperty, texture, reference, Fn, select, positionLocal } from 'three/tsl';
18
+
19
+ /**
20
+ * Make a new DataTexture to store the descriptions of the curves.
21
+ *
22
+ * @param { number } numberOfCurves the number of curves needed to be described by this texture.
23
+ */
24
+ export function initSplineTexture( numberOfCurves = 1 ) {
25
+
26
+ const dataArray = new Uint16Array( TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS );
27
+ const dataTexture = new DataTexture(
28
+ dataArray,
29
+ TEXTURE_WIDTH,
30
+ TEXTURE_HEIGHT * numberOfCurves,
31
+ RGBAFormat,
32
+ HalfFloatType
33
+ );
34
+
35
+ dataTexture.wrapS = RepeatWrapping;
36
+ dataTexture.wrapY = RepeatWrapping;
37
+ dataTexture.magFilter = LinearFilter;
38
+ dataTexture.minFilter = LinearFilter;
39
+ dataTexture.needsUpdate = true;
40
+
41
+ return dataTexture;
42
+
43
+ }
44
+
45
+ /**
46
+ * Write the curve description to the data texture
47
+ *
48
+ * @param { DataTexture } texture The DataTexture to write to
49
+ * @param { Curve } splineCurve The curve to describe
50
+ * @param { number } offset Which curve slot to write to
51
+ */
52
+ export function updateSplineTexture( texture, splineCurve, offset = 0 ) {
53
+
54
+ const numberOfPoints = Math.floor( TEXTURE_WIDTH * ( TEXTURE_HEIGHT / 4 ) );
55
+ splineCurve.arcLengthDivisions = numberOfPoints / 2;
56
+ splineCurve.updateArcLengths();
57
+ const points = splineCurve.getSpacedPoints( numberOfPoints );
58
+ const frenetFrames = splineCurve.computeFrenetFrames( numberOfPoints, true );
59
+
60
+ for ( let i = 0; i < numberOfPoints; i ++ ) {
61
+
62
+ const rowOffset = Math.floor( i / TEXTURE_WIDTH );
63
+ const rowIndex = i % TEXTURE_WIDTH;
64
+
65
+ let pt = points[ i ];
66
+ setTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + ( TEXTURE_HEIGHT * offset ) );
67
+ pt = frenetFrames.tangents[ i ];
68
+ setTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + ( TEXTURE_HEIGHT * offset ) );
69
+ pt = frenetFrames.normals[ i ];
70
+ setTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + ( TEXTURE_HEIGHT * offset ) );
71
+ pt = frenetFrames.binormals[ i ];
72
+ setTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + ( TEXTURE_HEIGHT * offset ) );
73
+
74
+ }
75
+
76
+ texture.needsUpdate = true;
77
+
78
+ }
79
+
80
+
81
+ function setTextureValue( texture, index, x, y, z, o ) {
82
+
83
+ const image = texture.image;
84
+ const { data } = image;
85
+ const i = CHANNELS * TEXTURE_WIDTH * o; // Row Offset
86
+
87
+ data[ index * CHANNELS + i + 0 ] = DataUtils.toHalfFloat( x );
88
+ data[ index * CHANNELS + i + 1 ] = DataUtils.toHalfFloat( y );
89
+ data[ index * CHANNELS + i + 2 ] = DataUtils.toHalfFloat( z );
90
+ data[ index * CHANNELS + i + 3 ] = DataUtils.toHalfFloat( 1 );
91
+
92
+ }
93
+
94
+ /**
95
+ * Create a new set of uniforms for describing the curve modifier
96
+ *
97
+ * @param { DataTexture } Texture which holds the curve description
98
+ */
99
+ export function getUniforms( splineTexture ) {
100
+
101
+ return {
102
+ spineTexture: splineTexture,
103
+ pathOffset: 0, // time of path curve
104
+ pathSegment: 1, // fractional length of path
105
+ spineOffset: 161,
106
+ spineLength: 400,
107
+ flow: 1, // int
108
+ };
109
+
110
+ }
111
+
112
+ export function modifyShader( material, uniforms, numberOfCurves ) {
113
+
114
+ const spineTexture = uniforms.spineTexture;
115
+
116
+ const pathOffset = reference( 'pathOffset', 'float', uniforms );
117
+ const pathSegment = reference( 'pathSegment', 'float', uniforms );
118
+ const spineOffset = reference( 'spineOffset', 'float', uniforms );
119
+ const spineLength = reference( 'spineLength', 'float', uniforms );
120
+ const flow = reference( 'flow', 'float', uniforms );
121
+
122
+ material.positionNode = Fn( () => {
123
+
124
+ const textureStacks = TEXTURE_HEIGHT / 4;
125
+ const textureScale = TEXTURE_HEIGHT * numberOfCurves;
126
+
127
+ const worldPos = modelWorldMatrix.mul( vec4( positionLocal, 1 ) ).toVar();
128
+
129
+ const bend = flow.greaterThan( 0 ).toVar();
130
+ const xWeight = select( bend, 0, 1 ).toVar();
131
+
132
+ const spinePortion = select( bend, worldPos.x.add( spineOffset ).div( spineLength ), 0 );
133
+ const mt = spinePortion.mul( pathSegment ).add( pathOffset ).mul( textureStacks ).toVar();
134
+
135
+ mt.assign( mt.mod( textureStacks ) );
136
+
137
+ const rowOffset = mt.floor().toVar();
138
+
139
+ const spinePos = texture( spineTexture, vec2( mt, rowOffset.add( 0.5 ).div( textureScale ) ) ).xyz;
140
+
141
+ const a = texture( spineTexture, vec2( mt, rowOffset.add( 1.5 ).div( textureScale ) ) ).xyz;
142
+ const b = texture( spineTexture, vec2( mt, rowOffset.add( 2.5 ).div( textureScale ) ) ).xyz;
143
+ const c = texture( spineTexture, vec2( mt, rowOffset.add( 3.5 ).div( textureScale ) ) ).xyz;
144
+
145
+ const basis = mat3( a, b, c ).toVar();
146
+
147
+ varyingProperty( 'vec3', 'curveNormal' ).assign( basis.mul( normalLocal ) );
148
+
149
+ return basis.mul( vec3( worldPos.x.mul( xWeight ), worldPos.y, worldPos.z ) ).add( spinePos );
150
+
151
+ } )();
152
+
153
+ material.normalNode = varyingProperty( 'vec3', 'curveNormal' );
154
+
155
+ }
156
+
157
+ /**
158
+ * A helper class for making meshes bend aroudn curves
159
+ */
160
+ export class Flow {
161
+
162
+ /**
163
+ * @param {Mesh} mesh The mesh to clone and modify to bend around the curve
164
+ * @param {number} numberOfCurves The amount of space that should preallocated for additional curves
165
+ */
166
+ constructor( mesh, numberOfCurves = 1 ) {
167
+
168
+ const obj3D = mesh.clone();
169
+ const splineTexure = initSplineTexture( numberOfCurves );
170
+ const uniforms = getUniforms( splineTexure );
171
+
172
+ obj3D.traverse( function ( child ) {
173
+
174
+ if (
175
+ child instanceof Mesh ||
176
+ child instanceof InstancedMesh
177
+ ) {
178
+
179
+ if ( Array.isArray( child.material ) ) {
180
+
181
+ const materials = [];
182
+
183
+ for ( const material of child.material ) {
184
+
185
+ const newMaterial = material.clone();
186
+ modifyShader( newMaterial, uniforms, numberOfCurves );
187
+ materials.push( newMaterial );
188
+
189
+ }
190
+
191
+ child.material = materials;
192
+
193
+ } else {
194
+
195
+ child.material = child.material.clone();
196
+ modifyShader( child.material, uniforms, numberOfCurves );
197
+
198
+ }
199
+
200
+ }
201
+
202
+ } );
203
+
204
+ this.curveArray = new Array( numberOfCurves );
205
+ this.curveLengthArray = new Array( numberOfCurves );
206
+
207
+ this.object3D = obj3D;
208
+ this.splineTexure = splineTexure;
209
+ this.uniforms = uniforms;
210
+
211
+ }
212
+
213
+ updateCurve( index, curve ) {
214
+
215
+ if ( index >= this.curveArray.length ) throw Error( 'Index out of range for Flow' );
216
+
217
+ const curveLength = curve.getLength();
218
+
219
+ this.uniforms.spineLength = curveLength;
220
+ this.curveLengthArray[ index ] = curveLength;
221
+ this.curveArray[ index ] = curve;
222
+
223
+ updateSplineTexture( this.splineTexure, curve, index );
224
+
225
+ }
226
+
227
+ moveAlongCurve( amount ) {
228
+
229
+ this.uniforms.pathOffset += amount;
230
+
231
+ }
232
+
233
+ }
@@ -0,0 +1,322 @@
1
+ import {
2
+ AdditiveBlending,
3
+ Box2,
4
+ BufferGeometry,
5
+ Color,
6
+ FramebufferTexture,
7
+ InterleavedBuffer,
8
+ InterleavedBufferAttribute,
9
+ Mesh,
10
+ MeshBasicNodeMaterial,
11
+ NodeMaterial,
12
+ UnsignedByteType,
13
+ Vector2,
14
+ Vector3,
15
+ Vector4 } from 'three';
16
+
17
+ import { texture, textureLoad, uv, ivec2, vec2, vec4, positionGeometry, reference, varyingProperty, materialReference, Fn, Node } from 'three/tsl';
18
+
19
+ class LensflareMesh extends Mesh {
20
+
21
+ constructor() {
22
+
23
+ super( LensflareMesh.Geometry, new MeshBasicNodeMaterial( { opacity: 0, transparent: true } ) );
24
+
25
+ this.isLensflare = true;
26
+
27
+ this.type = 'LensflareMesh';
28
+ this.frustumCulled = false;
29
+ this.renderOrder = Infinity;
30
+
31
+ //
32
+
33
+ const positionView = new Vector3();
34
+
35
+ // textures
36
+
37
+ const tempMap = new FramebufferTexture( 16, 16 );
38
+ const occlusionMap = new FramebufferTexture( 16, 16 );
39
+
40
+ let currentType = UnsignedByteType;
41
+
42
+ const geometry = LensflareMesh.Geometry;
43
+
44
+ // values for shared material uniforms
45
+
46
+ const sharedValues = {
47
+ scale: new Vector2(),
48
+ positionScreen: new Vector3()
49
+ };
50
+
51
+ // materials
52
+
53
+ const scale = reference( 'scale', 'vec2', sharedValues );
54
+ const screenPosition = reference( 'positionScreen', 'vec3', sharedValues );
55
+
56
+ const vertexNode = vec4( positionGeometry.xy.mul( scale ).add( screenPosition.xy ), screenPosition.z, 1.0 );
57
+
58
+ const material1a = new NodeMaterial();
59
+
60
+ material1a.depthTest = true;
61
+ material1a.depthWrite = false;
62
+ material1a.transparent = false;
63
+ material1a.fog = false;
64
+ material1a.type = 'Lensflare-1a';
65
+
66
+ material1a.vertexNode = vertexNode;
67
+ material1a.fragmentNode = vec4( 1.0, 0.0, 1.0, 1.0 );
68
+
69
+ const material1b = new NodeMaterial();
70
+
71
+ material1b.depthTest = false;
72
+ material1b.depthWrite = false;
73
+ material1b.transparent = false;
74
+ material1b.fog = false;
75
+ material1b.type = 'Lensflare-1b';
76
+
77
+ material1b.vertexNode = vertexNode;
78
+ material1b.fragmentNode = texture( tempMap, vec2( uv().flipY() ) );
79
+
80
+ // the following object is used for occlusionMap generation
81
+
82
+ const mesh1 = new Mesh( geometry, material1a );
83
+
84
+ //
85
+
86
+ const elements = [];
87
+ const elementMeshes = [];
88
+
89
+ const material2 = new NodeMaterial();
90
+
91
+ material2.transparent = true;
92
+ material2.blending = AdditiveBlending;
93
+ material2.depthWrite = false;
94
+ material2.depthTest = false;
95
+ material2.fog = false;
96
+ material2.type = 'Lensflare-2';
97
+
98
+ material2.screenPosition = new Vector3();
99
+ material2.scale = new Vector2();
100
+ material2.occlusionMap = occlusionMap;
101
+
102
+ material2.vertexNode = Fn( ( { material } ) => {
103
+
104
+ const scale = materialReference( 'scale', 'vec2' );
105
+ const screenPosition = materialReference( 'screenPosition', 'vec3' );
106
+
107
+ const occlusionMap = material.occlusionMap;
108
+
109
+ const pos = positionGeometry.xy.toVar();
110
+
111
+ const visibility = textureLoad( occlusionMap, ivec2( 2, 2 ) ).toVar();
112
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 8, 2 ) ) );
113
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 14, 2 ) ) );
114
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 14, 8 ) ) );
115
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 14, 14 ) ) );
116
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 8, 14 ) ) );
117
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 2, 14 ) ) );
118
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 2, 8 ) ) );
119
+ visibility.addAssign( textureLoad( occlusionMap, ivec2( 8, 8 ) ) );
120
+
121
+ const vVisibility = varyingProperty( 'float', 'vVisibility' );
122
+
123
+ vVisibility.assign( visibility.r.div( 9.0 ) );
124
+ vVisibility.mulAssign( visibility.g.div( 9.0 ).oneMinus() );
125
+ vVisibility.mulAssign( visibility.b.div( 9.0 ) );
126
+
127
+ return vec4( ( pos.mul( scale ).add( screenPosition.xy ).xy ), screenPosition.z, 1.0 );
128
+
129
+ } )();
130
+
131
+ material2.fragmentNode = Fn( () => {
132
+
133
+ const color = reference( 'color', 'color' );
134
+ const map = reference( 'map', 'texture' );
135
+
136
+ const vVisibility = varyingProperty( 'float', 'vVisibility' );
137
+
138
+ const output = map.toVar();
139
+
140
+ output.a.mulAssign( vVisibility );
141
+ output.rgb.mulAssign( color );
142
+
143
+ return output;
144
+
145
+ } )();
146
+
147
+
148
+ this.addElement = function ( element ) {
149
+
150
+ elements.push( element );
151
+
152
+ };
153
+
154
+ //
155
+
156
+ const positionScreen = sharedValues.positionScreen;
157
+ const screenPositionPixels = new Vector4( 0, 0, 16, 16 );
158
+ const validArea = new Box2();
159
+ const viewport = new Vector4();
160
+
161
+ // dummy node for renderer.renderObject()
162
+ const lightsNode = new Node();
163
+
164
+ this.onBeforeRender = ( renderer, scene, camera ) => {
165
+
166
+ renderer.getViewport( viewport );
167
+
168
+ viewport.multiplyScalar( window.devicePixelRatio );
169
+
170
+ const renderTarget = renderer.getRenderTarget();
171
+ const type = ( renderTarget !== null ) ? renderTarget.texture.type : UnsignedByteType;
172
+
173
+ if ( currentType !== type ) {
174
+
175
+ tempMap.dispose();
176
+ occlusionMap.dispose();
177
+
178
+ tempMap.type = occlusionMap.type = type;
179
+
180
+ currentType = type;
181
+
182
+ }
183
+
184
+ const invAspect = viewport.w / viewport.z;
185
+ const halfViewportWidth = viewport.z / 2.0;
186
+ const halfViewportHeight = viewport.w / 2.0;
187
+
188
+ const size = 16 / viewport.w;
189
+
190
+ sharedValues.scale.set( size * invAspect, size );
191
+
192
+ validArea.min.set( viewport.x, viewport.y );
193
+ validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );
194
+
195
+ // calculate position in screen space
196
+
197
+ positionView.setFromMatrixPosition( this.matrixWorld );
198
+ positionView.applyMatrix4( camera.matrixWorldInverse );
199
+
200
+ if ( positionView.z > 0 ) return; // lensflare is behind the camera
201
+
202
+ positionScreen.copy( positionView ).applyMatrix4( camera.projectionMatrix );
203
+
204
+ // horizontal and vertical coordinate of the lower left corner of the pixels to copy
205
+
206
+ screenPositionPixels.x = viewport.x + ( positionScreen.x * halfViewportWidth ) + halfViewportWidth - 8;
207
+ screenPositionPixels.y = viewport.y - ( positionScreen.y * halfViewportHeight ) + halfViewportHeight - 8;
208
+
209
+ // screen cull
210
+
211
+ if ( validArea.containsPoint( screenPositionPixels ) ) {
212
+
213
+ // save current RGB to temp texture
214
+
215
+ renderer.copyFramebufferToTexture( tempMap, screenPositionPixels );
216
+
217
+ // render pink quad
218
+
219
+ renderer.renderObject( mesh1, scene, camera, geometry, material1a, null, lightsNode );
220
+
221
+ // copy result to occlusionMap
222
+
223
+ renderer.copyFramebufferToTexture( occlusionMap, screenPositionPixels );
224
+
225
+ // restore graphics
226
+
227
+ renderer.renderObject( mesh1, scene, camera, geometry, material1b, null, lightsNode );
228
+
229
+ // render elements
230
+
231
+ const vecX = - positionScreen.x * 2;
232
+ const vecY = - positionScreen.y * 2;
233
+
234
+ for ( let i = 0, l = elements.length; i < l; i ++ ) {
235
+
236
+ const element = elements[ i ];
237
+
238
+ let mesh2 = elementMeshes[ i ];
239
+
240
+ if ( mesh2 === undefined ) {
241
+
242
+ mesh2 = elementMeshes[ i ] = new Mesh( geometry, material2 );
243
+
244
+ mesh2.color = element.color.convertSRGBToLinear();
245
+ mesh2.map = element.texture;
246
+
247
+ }
248
+
249
+ material2.screenPosition.x = positionScreen.x + vecX * element.distance;
250
+ material2.screenPosition.y = positionScreen.y - vecY * element.distance;
251
+ material2.screenPosition.z = positionScreen.z;
252
+
253
+ const size = element.size / viewport.w;
254
+
255
+ material2.scale.set( size * invAspect, size );
256
+
257
+ renderer.renderObject( mesh2, scene, camera, geometry, material2, null, lightsNode );
258
+
259
+ }
260
+
261
+ }
262
+
263
+ };
264
+
265
+ this.dispose = function () {
266
+
267
+ material1a.dispose();
268
+ material1b.dispose();
269
+ material2.dispose();
270
+
271
+ tempMap.dispose();
272
+ occlusionMap.dispose();
273
+
274
+ for ( let i = 0, l = elements.length; i < l; i ++ ) {
275
+
276
+ elements[ i ].texture.dispose();
277
+
278
+ }
279
+
280
+ };
281
+
282
+ }
283
+
284
+ }
285
+
286
+ //
287
+
288
+ class LensflareElement {
289
+
290
+ constructor( texture, size = 1, distance = 0, color = new Color( 0xffffff ) ) {
291
+
292
+ this.texture = texture;
293
+ this.size = size;
294
+ this.distance = distance;
295
+ this.color = color;
296
+
297
+ }
298
+
299
+ }
300
+
301
+ LensflareMesh.Geometry = ( function () {
302
+
303
+ const geometry = new BufferGeometry();
304
+
305
+ const float32Array = new Float32Array( [
306
+ - 1, - 1, 0, 0, 0,
307
+ 1, - 1, 0, 1, 0,
308
+ 1, 1, 0, 1, 1,
309
+ - 1, 1, 0, 0, 1
310
+ ] );
311
+
312
+ const interleavedBuffer = new InterleavedBuffer( float32Array, 5 );
313
+
314
+ geometry.setIndex( [ 0, 1, 2, 0, 2, 3 ] );
315
+ geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );
316
+ geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );
317
+
318
+ return geometry;
319
+
320
+ } )();
321
+
322
+ export { LensflareMesh, LensflareElement };
@@ -2,10 +2,9 @@ import {
2
2
  BackSide,
3
3
  BoxGeometry,
4
4
  Mesh,
5
- NodeMaterial,
6
5
  Vector3
7
6
  } from 'three';
8
- import { float, Fn, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varying, varyingProperty, vec4, uniform, cameraPosition } from 'three/tsl';
7
+ import { Fn, NodeMaterial, float, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varying, varyingProperty, vec4, uniform, cameraPosition } from 'three/tsl';
9
8
 
10
9
  /**
11
10
  * Based on "A Practical Analytic Model for Daylight"
@@ -1,11 +1,10 @@
1
1
  import {
2
2
  Color,
3
3
  Mesh,
4
- NodeMaterial,
5
4
  Vector2,
6
5
  Vector3
7
6
  } from 'three';
8
- import { vec2, viewportSafeUV, viewportSharedTexture, reflector, pow, float, abs, texture, uniform, TempNode, NodeUpdateType, vec4, Fn, cameraPosition, positionWorld, uv, mix, vec3, normalize, max, dot, viewportUV } from 'three/tsl';
7
+ import { Fn, NodeMaterial, NodeUpdateType, TempNode, vec2, viewportSafeUV, viewportSharedTexture, reflector, pow, float, abs, texture, uniform, vec4, cameraPosition, positionWorld, uv, mix, vec3, normalize, max, dot, screenUV } from 'three/tsl';
9
8
 
10
9
  /**
11
10
  * References:
@@ -141,7 +140,7 @@ class WaterNode extends TempNode {
141
140
  this.waterBody.add( reflectionSampler.target );
142
141
  reflectionSampler.uvNode = reflectionSampler.uvNode.add( offset );
143
142
 
144
- const refractorUV = viewportUV.add( offset );
143
+ const refractorUV = screenUV.add( offset );
145
144
  const refractionSampler = viewportSharedTexture( viewportSafeUV( refractorUV ) );
146
145
 
147
146
  // calculate final uv coords
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  Color,
3
3
  Mesh,
4
- NodeMaterial,
5
4
  Vector3
6
5
  } from 'three';
7
- import { add, cameraPosition, div, normalize, positionWorld, sub, timerLocal, Fn, texture, vec2, vec3, vec4, max, dot, reflect, pow, length, float, uniform, reflector, mul, mix } from 'three/tsl';
6
+ import { Fn, NodeMaterial, add, cameraPosition, div, normalize, positionWorld, sub, timerLocal, texture, vec2, vec3, vec4, max, dot, reflect, pow, length, float, uniform, reflector, mul, mix } from 'three/tsl';
8
7
 
9
8
  /**
10
9
  * Work based on :
@@ -61,7 +61,7 @@ async function JoltPhysics() {
61
61
 
62
62
  if ( Jolt === null ) {
63
63
 
64
- const { default: initJolt } = await import( JOLT_PATH );
64
+ const { default: initJolt } = await import( `${JOLT_PATH}` );
65
65
  Jolt = await initJolt();
66
66
 
67
67
  }
@@ -58,7 +58,7 @@ async function RapierPhysics() {
58
58
 
59
59
  if ( RAPIER === null ) {
60
60
 
61
- RAPIER = await import( RAPIER_PATH );
61
+ RAPIER = await import( `${RAPIER_PATH}` );
62
62
  await RAPIER.init();
63
63
 
64
64
  }
@@ -226,7 +226,7 @@ class GLSLDecoder {
226
226
 
227
227
  this._currentFunction = null;
228
228
 
229
- this.addPolyfill( 'gl_FragCoord', 'vec3 gl_FragCoord = vec3( viewportCoordinate.x, viewportCoordinate.y.oneMinus(), viewportCoordinate.z );' );
229
+ this.addPolyfill( 'gl_FragCoord', 'vec3 gl_FragCoord = vec3( screenCoordinate.x, screenCoordinate.y.oneMinus(), screenCoordinate.z );' );
230
230
 
231
231
  }
232
232
 
@@ -8,8 +8,8 @@ class ShaderToyDecoder extends GLSLDecoder {
8
8
  super();
9
9
 
10
10
  this.addPolyfill( 'iTime', 'float iTime = timerGlobal();' );
11
- this.addPolyfill( 'iResolution', 'vec2 iResolution = viewportResolution;' );
12
- this.addPolyfill( 'fragCoord', 'vec3 fragCoord = vec3( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y, viewportCoordinate.z );' );
11
+ this.addPolyfill( 'iResolution', 'vec2 iResolution = screenSize;' );
12
+ this.addPolyfill( 'fragCoord', 'vec3 fragCoord = vec3( screenCoordinate.x, screenSize.y - screenCoordinate.y, screenCoordinate.z );' );
13
13
 
14
14
  }
15
15