super-three 0.167.0 → 0.168.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 (311) hide show
  1. package/build/three.cjs +165 -44
  2. package/build/three.module.js +165 -45
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +23600 -21931
  5. package/build/three.webgpu.min.js +1 -1
  6. package/examples/jsm/Addons.js +3 -1
  7. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  8. package/examples/jsm/capabilities/WebGL.js +27 -21
  9. package/examples/jsm/controls/ArcballControls.js +174 -158
  10. package/examples/jsm/controls/DragControls.js +260 -132
  11. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  12. package/examples/jsm/controls/FlyControls.js +194 -188
  13. package/examples/jsm/controls/OrbitControls.js +777 -786
  14. package/examples/jsm/controls/PointerLockControls.js +24 -15
  15. package/examples/jsm/controls/TrackballControls.js +453 -452
  16. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  17. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  18. package/examples/jsm/effects/StereoEffect.js +6 -1
  19. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  20. package/examples/jsm/exporters/GLTFExporter.js +6 -1
  21. package/examples/jsm/exporters/USDZExporter.js +29 -8
  22. package/examples/jsm/helpers/LightProbeHelper.js +42 -43
  23. package/examples/jsm/loaders/KTX2Loader.js +19 -7
  24. package/examples/jsm/loaders/MaterialXLoader.js +11 -4
  25. package/examples/jsm/loaders/PCDLoader.js +9 -9
  26. package/examples/jsm/objects/SkyMesh.js +188 -0
  27. package/examples/jsm/objects/Water2Mesh.js +159 -0
  28. package/examples/jsm/objects/WaterMesh.js +102 -0
  29. package/examples/jsm/physics/RapierPhysics.js +20 -0
  30. package/examples/jsm/postprocessing/OutlinePass.js +31 -46
  31. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  32. package/examples/jsm/shaders/BleachBypassShader.js +1 -2
  33. package/examples/jsm/shaders/OutputShader.js +1 -1
  34. package/examples/jsm/transpiler/TSLEncoder.js +8 -8
  35. package/examples/jsm/utils/TextureUtils.js +1 -1
  36. package/package.json +2 -1
  37. package/src/Three.WebGPU.js +6 -0
  38. package/src/Three.js +1 -0
  39. package/src/constants.js +1 -1
  40. package/src/extras/Controls.js +32 -0
  41. package/src/loaders/ObjectLoader.js +3 -3
  42. package/src/{nodes/loaders → loaders/nodes}/NodeLoader.js +4 -4
  43. package/src/{nodes/loaders → loaders/nodes}/NodeMaterialLoader.js +1 -2
  44. package/src/materials/Material.js +4 -7
  45. package/src/{nodes/materials → materials/nodes}/InstancedPointsNodeMaterial.js +33 -24
  46. package/src/{nodes/materials → materials/nodes}/Line2NodeMaterial.js +34 -37
  47. package/src/{nodes/materials → materials/nodes}/LineBasicNodeMaterial.js +3 -4
  48. package/src/{nodes/materials → materials/nodes}/LineDashedNodeMaterial.js +7 -9
  49. package/src/{nodes/materials → materials/nodes}/MeshBasicNodeMaterial.js +11 -11
  50. package/src/{nodes/materials → materials/nodes}/MeshLambertNodeMaterial.js +5 -5
  51. package/src/{nodes/materials → materials/nodes}/MeshMatcapNodeMaterial.js +8 -8
  52. package/src/materials/nodes/MeshNormalNodeMaterial.js +40 -0
  53. package/src/{nodes/materials → materials/nodes}/MeshPhongNodeMaterial.js +9 -8
  54. package/src/{nodes/materials → materials/nodes}/MeshPhysicalNodeMaterial.js +18 -17
  55. package/src/{nodes/materials → materials/nodes}/MeshSSSNodeMaterial.js +6 -6
  56. package/src/{nodes/materials → materials/nodes}/MeshStandardNodeMaterial.js +17 -11
  57. package/src/{nodes/materials → materials/nodes}/MeshToonNodeMaterial.js +4 -4
  58. package/src/{nodes/materials → materials/nodes}/NodeMaterial.js +67 -86
  59. package/src/{nodes/materials/Materials.js → materials/nodes/NodeMaterials.js} +1 -1
  60. package/src/{nodes/materials → materials/nodes}/PointsNodeMaterial.js +3 -4
  61. package/src/{nodes/materials → materials/nodes}/ShadowNodeMaterial.js +4 -4
  62. package/src/{nodes/materials → materials/nodes}/SpriteNodeMaterial.js +11 -11
  63. package/src/{nodes/materials → materials/nodes}/VolumeNodeMaterial.js +14 -16
  64. package/src/nodes/Nodes.js +103 -159
  65. package/src/nodes/TSL.js +176 -0
  66. package/src/nodes/accessors/AccessorsUtils.js +8 -8
  67. package/src/nodes/accessors/BatchNode.js +48 -20
  68. package/src/nodes/accessors/{BitangentNode.js → Bitangent.js} +9 -9
  69. package/src/nodes/accessors/BufferAttributeNode.js +5 -5
  70. package/src/nodes/accessors/BufferNode.js +4 -4
  71. package/src/nodes/accessors/{CameraNode.js → Camera.js} +10 -10
  72. package/src/nodes/accessors/ClippingNode.js +16 -14
  73. package/src/nodes/accessors/CubeTextureNode.js +5 -7
  74. package/src/nodes/accessors/InstanceNode.js +17 -13
  75. package/src/nodes/accessors/InstancedPointsMaterialNode.js +4 -4
  76. package/src/nodes/accessors/MaterialNode.js +52 -55
  77. package/src/nodes/accessors/MaterialProperties.js +3 -0
  78. package/src/nodes/accessors/MaterialReferenceNode.js +6 -4
  79. package/src/nodes/accessors/ModelNode.js +11 -11
  80. package/src/nodes/accessors/ModelViewProjectionNode.js +6 -7
  81. package/src/nodes/accessors/MorphNode.js +12 -12
  82. package/src/nodes/accessors/Normal.js +62 -0
  83. package/src/nodes/accessors/Object3DNode.js +10 -10
  84. package/src/nodes/accessors/PointUVNode.js +4 -4
  85. package/src/nodes/accessors/Position.js +10 -0
  86. package/src/nodes/accessors/ReferenceBaseNode.js +143 -0
  87. package/src/nodes/accessors/ReferenceNode.js +13 -7
  88. package/src/nodes/accessors/ReflectVector.js +10 -0
  89. package/src/nodes/accessors/RendererReferenceNode.js +6 -6
  90. package/src/nodes/accessors/SceneNode.js +5 -6
  91. package/src/nodes/accessors/SkinningNode.js +84 -21
  92. package/src/nodes/accessors/StorageBufferNode.js +4 -5
  93. package/src/nodes/accessors/StorageTextureNode.js +5 -5
  94. package/src/nodes/accessors/Tangent.js +22 -0
  95. package/src/nodes/accessors/Texture3DNode.js +11 -11
  96. package/src/nodes/accessors/{TextureBicubicNode.js → TextureBicubic.js} +3 -32
  97. package/src/nodes/accessors/TextureNode.js +16 -21
  98. package/src/nodes/accessors/TextureSizeNode.js +4 -6
  99. package/src/nodes/accessors/{UniformsNode.js → UniformArrayNode.js} +17 -8
  100. package/src/nodes/accessors/UserDataNode.js +4 -4
  101. package/src/nodes/accessors/VelocityNode.js +83 -0
  102. package/src/nodes/accessors/VertexColorNode.js +4 -4
  103. package/src/nodes/code/CodeNode.js +5 -5
  104. package/src/nodes/code/ExpressionNode.js +4 -4
  105. package/src/nodes/code/FunctionCallNode.js +5 -5
  106. package/src/nodes/code/FunctionNode.js +5 -23
  107. package/src/nodes/code/ScriptableNode.js +4 -6
  108. package/src/nodes/code/ScriptableValueNode.js +4 -6
  109. package/src/nodes/core/AssignNode.js +5 -5
  110. package/src/nodes/core/AttributeNode.js +7 -20
  111. package/src/nodes/core/BypassNode.js +5 -5
  112. package/src/nodes/core/CacheNode.js +5 -5
  113. package/src/nodes/core/ConstNode.js +2 -2
  114. package/src/nodes/core/ContextNode.js +17 -11
  115. package/src/nodes/core/IndexNode.js +12 -7
  116. package/src/nodes/core/InputNode.js +2 -2
  117. package/src/nodes/core/MRTNode.js +12 -6
  118. package/src/nodes/core/Node.js +39 -19
  119. package/src/nodes/core/NodeBuilder.js +46 -33
  120. package/src/nodes/core/NodeUtils.js +1 -0
  121. package/src/nodes/core/OutputStructNode.js +4 -4
  122. package/src/nodes/core/ParameterNode.js +4 -4
  123. package/src/nodes/core/PropertyNode.js +32 -32
  124. package/src/nodes/core/StackNode.js +26 -10
  125. package/src/nodes/core/StructTypeNode.js +2 -2
  126. package/src/nodes/core/TempNode.js +2 -2
  127. package/src/nodes/core/UniformGroupNode.js +8 -9
  128. package/src/nodes/core/UniformNode.js +4 -4
  129. package/src/nodes/core/VarNode.js +6 -6
  130. package/src/nodes/core/VaryingNode.js +5 -5
  131. package/src/nodes/display/AfterImageNode.js +9 -9
  132. package/src/nodes/display/AnaglyphPassNode.js +61 -0
  133. package/src/nodes/display/AnamorphicNode.js +11 -11
  134. package/src/nodes/display/BleachBypass.js +26 -0
  135. package/src/nodes/display/BlendMode.js +54 -0
  136. package/src/nodes/display/BloomNode.js +21 -19
  137. package/src/nodes/display/BumpMapNode.js +7 -12
  138. package/src/nodes/display/ColorAdjustment.js +46 -0
  139. package/src/nodes/display/ColorSpaceFunctions.js +38 -0
  140. package/src/nodes/display/ColorSpaceNode.js +40 -63
  141. package/src/nodes/display/DenoiseNode.js +20 -17
  142. package/src/nodes/display/DepthOfFieldNode.js +8 -6
  143. package/src/nodes/display/DotScreenNode.js +10 -22
  144. package/src/nodes/display/FXAANode.js +17 -15
  145. package/src/nodes/display/FilmNode.js +7 -6
  146. package/src/nodes/display/FrontFacingNode.js +5 -5
  147. package/src/nodes/display/GTAONode.js +19 -15
  148. package/src/nodes/display/GaussianBlurNode.js +11 -8
  149. package/src/nodes/display/Lut3DNode.js +6 -5
  150. package/src/nodes/display/MotionBlur.js +25 -0
  151. package/src/nodes/display/NormalMapNode.js +8 -10
  152. package/src/nodes/display/ParallaxBarrierPassNode.js +55 -0
  153. package/src/nodes/display/PassNode.js +84 -8
  154. package/src/nodes/display/PixelationPassNode.js +12 -7
  155. package/src/nodes/display/PosterizeNode.js +4 -6
  156. package/src/nodes/display/RGBShiftNode.js +8 -7
  157. package/src/nodes/display/RenderOutputNode.js +9 -9
  158. package/src/nodes/display/SSAAPassNode.js +284 -0
  159. package/src/nodes/display/Sepia.js +17 -0
  160. package/src/nodes/display/SobelOperatorNode.js +9 -7
  161. package/src/nodes/display/StereoCompositePassNode.js +107 -0
  162. package/src/nodes/display/StereoPassNode.js +80 -0
  163. package/src/nodes/display/ToneMappingFunctions.js +190 -0
  164. package/src/nodes/display/ToneMappingNode.js +12 -173
  165. package/src/nodes/display/TransitionNode.js +9 -8
  166. package/src/nodes/display/ViewportDepthNode.js +30 -29
  167. package/src/nodes/display/ViewportDepthTextureNode.js +6 -8
  168. package/src/nodes/display/ViewportNode.js +26 -25
  169. package/src/nodes/display/ViewportSharedTextureNode.js +6 -8
  170. package/src/nodes/display/ViewportTextureNode.js +7 -10
  171. package/src/nodes/fog/FogExp2Node.js +4 -6
  172. package/src/nodes/fog/FogNode.js +5 -7
  173. package/src/nodes/fog/FogRangeNode.js +4 -6
  174. package/src/nodes/functions/BSDF/BRDF_GGX.js +4 -4
  175. package/src/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  176. package/src/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  177. package/src/nodes/functions/BSDF/DFGApprox.js +2 -2
  178. package/src/nodes/functions/BSDF/D_GGX.js +2 -2
  179. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
  180. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  181. package/src/nodes/functions/BSDF/F_Schlick.js +2 -2
  182. package/src/nodes/functions/BSDF/LTC.js +6 -6
  183. package/src/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  184. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  185. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  186. package/src/nodes/functions/BasicLightingModel.js +1 -1
  187. package/src/nodes/functions/PhongLightingModel.js +5 -5
  188. package/src/nodes/functions/PhysicalLightingModel.js +32 -31
  189. package/src/nodes/functions/ShadowMaskModel.js +1 -1
  190. package/src/nodes/functions/ToonLightingModel.js +3 -3
  191. package/src/nodes/functions/material/getGeometryRoughness.js +4 -4
  192. package/src/nodes/functions/material/getRoughness.js +2 -2
  193. package/src/nodes/geometry/RangeNode.js +4 -4
  194. package/src/nodes/gpgpu/ComputeNode.js +5 -5
  195. package/src/nodes/lighting/AONode.js +2 -2
  196. package/src/nodes/lighting/AmbientLightNode.js +2 -7
  197. package/src/nodes/lighting/AnalyticLightNode.js +34 -13
  198. package/src/nodes/lighting/BasicEnvironmentNode.js +4 -3
  199. package/src/nodes/lighting/BasicLightMapNode.js +3 -3
  200. package/src/nodes/lighting/DirectionalLightNode.js +2 -7
  201. package/src/nodes/lighting/EnvironmentNode.js +20 -19
  202. package/src/nodes/lighting/HemisphereLightNode.js +3 -7
  203. package/src/nodes/lighting/IESSpotLightNode.js +3 -8
  204. package/src/nodes/lighting/IrradianceNode.js +2 -2
  205. package/src/nodes/lighting/LightNode.js +5 -5
  206. package/src/nodes/lighting/LightProbeNode.js +76 -0
  207. package/src/nodes/lighting/LightUtils.js +3 -3
  208. package/src/nodes/lighting/LightingContextNode.js +15 -17
  209. package/src/nodes/lighting/LightingNode.js +2 -2
  210. package/src/nodes/lighting/LightsNode.js +94 -76
  211. package/src/nodes/lighting/PointLightNode.js +3 -8
  212. package/src/nodes/lighting/RectAreaLightNode.js +2 -6
  213. package/src/nodes/lighting/SpotLightNode.js +3 -8
  214. package/src/nodes/materialx/MaterialXNodes.js +2 -2
  215. package/src/nodes/materialx/lib/mx_hsv.js +36 -31
  216. package/src/nodes/materialx/lib/mx_noise.js +96 -96
  217. package/src/nodes/materialx/lib/mx_transform_color.js +2 -2
  218. package/src/nodes/math/{CondNode.js → ConditionalNode.js} +18 -7
  219. package/src/nodes/math/Hash.js +13 -0
  220. package/src/nodes/math/MathNode.js +124 -124
  221. package/src/nodes/math/MathUtils.js +0 -7
  222. package/src/nodes/math/OperatorNode.js +94 -52
  223. package/src/nodes/math/TriNoise3D.js +19 -29
  224. package/src/nodes/pmrem/PMREMNode.js +58 -15
  225. package/src/nodes/pmrem/PMREMUtils.js +46 -46
  226. package/src/nodes/procedural/Checker.js +14 -0
  227. package/src/nodes/tsl/TSLBase.js +30 -0
  228. package/src/nodes/{shadernode/ShaderNode.js → tsl/TSLCore.js} +105 -97
  229. package/src/nodes/utils/ArrayElementNode.js +2 -2
  230. package/src/nodes/utils/ConvertNode.js +2 -2
  231. package/src/nodes/utils/CubeMapNode.js +157 -0
  232. package/src/nodes/utils/Discard.js +8 -0
  233. package/src/nodes/utils/EquirectUVNode.js +5 -5
  234. package/src/nodes/utils/FlipNode.js +65 -0
  235. package/src/nodes/utils/FunctionOverloadingNode.js +5 -5
  236. package/src/nodes/utils/JoinNode.js +2 -2
  237. package/src/nodes/utils/LoopNode.js +12 -6
  238. package/src/nodes/utils/MatcapUVNode.js +6 -6
  239. package/src/nodes/utils/MaxMipLevelNode.js +4 -4
  240. package/src/nodes/utils/OscNode.js +7 -7
  241. package/src/nodes/utils/Packing.js +4 -0
  242. package/src/nodes/utils/RTTNode.js +8 -8
  243. package/src/nodes/utils/ReflectorNode.js +8 -3
  244. package/src/nodes/utils/RemapNode.js +7 -7
  245. package/src/nodes/utils/RotateNode.js +4 -12
  246. package/src/nodes/utils/SetNode.js +2 -2
  247. package/src/nodes/utils/SplitNode.js +2 -2
  248. package/src/nodes/utils/SpriteSheetUVNode.js +5 -5
  249. package/src/nodes/utils/SpriteUtils.js +47 -0
  250. package/src/nodes/utils/StorageArrayElementNode.js +4 -6
  251. package/src/nodes/utils/TimerNode.js +5 -5
  252. package/src/nodes/utils/TriplanarTexturesNode.js +7 -9
  253. package/src/nodes/utils/UVUtils.js +19 -0
  254. package/src/nodes/utils/ViewportUtils.js +14 -0
  255. package/src/objects/BatchedMesh.js +2 -3
  256. package/src/renderers/WebGLRenderer.js +24 -0
  257. package/src/renderers/common/Backend.js +2 -2
  258. package/src/renderers/common/Background.js +3 -1
  259. package/src/renderers/common/BindGroup.js +3 -1
  260. package/src/renderers/common/Bindings.js +13 -15
  261. package/src/renderers/common/ClippingContext.js +14 -5
  262. package/src/renderers/common/CubeRenderTarget.js +9 -3
  263. package/src/renderers/common/PostProcessing.js +4 -1
  264. package/src/renderers/common/QuadMesh.js +2 -0
  265. package/src/renderers/common/RenderContext.js +24 -0
  266. package/src/renderers/common/RenderList.js +1 -1
  267. package/src/renderers/common/RenderObject.js +2 -2
  268. package/src/renderers/common/Renderer.js +75 -49
  269. package/src/renderers/common/SampledTexture.js +12 -3
  270. package/src/renderers/common/StandardRenderer.js +18 -0
  271. package/src/renderers/common/Textures.js +8 -12
  272. package/src/renderers/common/extras/PMREMGenerator.js +12 -13
  273. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  274. package/src/renderers/common/nodes/NodeLibrary.js +118 -0
  275. package/src/renderers/common/nodes/NodeSampledTexture.js +2 -2
  276. package/src/renderers/common/nodes/Nodes.js +36 -9
  277. package/src/renderers/common/nodes/StandardNodeLibrary.js +105 -0
  278. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
  279. package/src/renderers/webgl/WebGLProgram.js +1 -1
  280. package/src/renderers/webgl/WebGLProperties.js +7 -0
  281. package/src/renderers/webgl/WebGLTextures.js +61 -4
  282. package/src/renderers/webgl-fallback/WebGLBackend.js +88 -68
  283. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +57 -9
  284. package/src/renderers/webgl-fallback/utils/WebGLState.js +21 -0
  285. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +28 -21
  286. package/src/renderers/webgpu/WebGPUBackend.js +86 -68
  287. package/src/renderers/webgpu/WebGPURenderer.js +8 -8
  288. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -63
  289. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +45 -21
  290. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -1
  291. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +6 -15
  292. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
  293. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +36 -21
  294. package/src/renderers/webgpu/utils/WebGPUUtils.js +18 -1
  295. package/src/renderers/webxr/WebXRManager.js +32 -25
  296. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  297. package/src/nodes/accessors/NormalNode.js +0 -14
  298. package/src/nodes/accessors/PositionNode.js +0 -10
  299. package/src/nodes/accessors/ReflectVectorNode.js +0 -10
  300. package/src/nodes/accessors/TangentNode.js +0 -23
  301. package/src/nodes/core/NodeKeywords.js +0 -80
  302. package/src/nodes/display/BlendModeNode.js +0 -128
  303. package/src/nodes/display/ColorAdjustmentNode.js +0 -104
  304. package/src/nodes/materials/MeshNormalNodeMaterial.js +0 -40
  305. package/src/nodes/math/HashNode.js +0 -34
  306. package/src/nodes/procedural/CheckerNode.js +0 -42
  307. package/src/nodes/utils/DiscardNode.js +0 -28
  308. package/src/nodes/utils/PackingNode.js +0 -55
  309. package/src/nodes/utils/RotateUVNode.js +0 -35
  310. /package/src/{nodes/loaders → loaders/nodes}/NodeObjectLoader.js +0 -0
  311. /package/src/nodes/accessors/{UVNode.js → UV.js} +0 -0
@@ -1,10 +1,9 @@
1
- import { addNodeClass } from '../core/Node.js';
1
+ import { registerNode } from '../core/Node.js';
2
2
  import TempNode from '../core/TempNode.js';
3
- import { cameraProjectionMatrix } from './CameraNode.js';
3
+ import { cameraProjectionMatrix } from './Camera.js';
4
4
  import { modelViewMatrix } from './ModelNode.js';
5
- import { positionLocal } from './PositionNode.js';
6
- import { nodeProxy } from '../shadernode/ShaderNode.js';
7
- import { varying } from '../core/VaryingNode.js';
5
+ import { positionLocal } from './Position.js';
6
+ import { nodeProxy, varying } from '../tsl/TSLBase.js';
8
7
 
9
8
  class ModelViewProjectionNode extends TempNode {
10
9
 
@@ -34,6 +33,6 @@ class ModelViewProjectionNode extends TempNode {
34
33
 
35
34
  export default ModelViewProjectionNode;
36
35
 
37
- export const modelViewProjection = nodeProxy( ModelViewProjectionNode );
36
+ ModelViewProjectionNode.type = /*@__PURE__*/ registerNode( 'ModelViewProjection', ModelViewProjectionNode );
38
37
 
39
- addNodeClass( 'ModelViewProjectionNode', ModelViewProjectionNode );
38
+ export const modelViewProjection = /*@__PURE__*/ nodeProxy( ModelViewProjectionNode );
@@ -1,24 +1,24 @@
1
- import Node, { addNodeClass } from '../core/Node.js';
1
+ import Node, { registerNode } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { float, nodeProxy, tslFn } from '../shadernode/ShaderNode.js';
3
+ import { float, nodeProxy, Fn } from '../tsl/TSLBase.js';
4
4
  import { uniform } from '../core/UniformNode.js';
5
5
  import { reference } from './ReferenceNode.js';
6
- import { positionLocal } from './PositionNode.js';
7
- import { normalLocal } from './NormalNode.js';
6
+ import { positionLocal } from './Position.js';
7
+ import { normalLocal } from './Normal.js';
8
8
  import { textureLoad } from './TextureNode.js';
9
9
  import { instanceIndex, vertexIndex } from '../core/IndexNode.js';
10
- import { ivec2, int } from '../shadernode/ShaderNode.js';
11
- import { loop } from '../utils/LoopNode.js';
10
+ import { ivec2, int } from '../tsl/TSLBase.js';
11
+ import { Loop } from '../utils/LoopNode.js';
12
12
 
13
13
  import { DataArrayTexture } from '../../textures/DataArrayTexture.js';
14
14
  import { Vector2 } from '../../math/Vector2.js';
15
15
  import { Vector4 } from '../../math/Vector4.js';
16
16
  import { FloatType } from '../../constants.js';
17
17
 
18
- const _morphTextures = new WeakMap();
18
+ const _morphTextures = /*@__PURE__*/ new WeakMap();
19
19
  const _morphVec4 = /*@__PURE__*/ new Vector4();
20
20
 
21
- const getMorph = tslFn( ( { bufferMap, influence, stride, width, depth, offset } ) => {
21
+ const getMorph = /*@__PURE__*/ Fn( ( { bufferMap, influence, stride, width, depth, offset } ) => {
22
22
 
23
23
  const texelIndex = int( vertexIndex ).mul( stride ).add( offset );
24
24
 
@@ -176,7 +176,7 @@ class MorphNode extends Node {
176
176
  const { geometry } = builder;
177
177
 
178
178
  const hasMorphPosition = geometry.morphAttributes.position !== undefined;
179
- const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
179
+ const hasMorphNormals = geometry.hasAttribute( 'normal' ) && geometry.morphAttributes.normal !== undefined;
180
180
 
181
181
  const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
182
182
  const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
@@ -190,7 +190,7 @@ class MorphNode extends Node {
190
190
 
191
191
  const width = int( size.width );
192
192
 
193
- loop( morphTargetsCount, ( { i } ) => {
193
+ Loop( morphTargetsCount, ( { i } ) => {
194
194
 
195
195
  const influence = float( 0 ).toVar();
196
196
 
@@ -254,6 +254,6 @@ class MorphNode extends Node {
254
254
 
255
255
  export default MorphNode;
256
256
 
257
- export const morphReference = nodeProxy( MorphNode );
257
+ MorphNode.type = /*@__PURE__*/ registerNode( 'Morph', MorphNode );
258
258
 
259
- addNodeClass( 'MorphNode', MorphNode );
259
+ export const morphReference = /*@__PURE__*/ nodeProxy( MorphNode );
@@ -0,0 +1,62 @@
1
+ import { attribute } from '../core/AttributeNode.js';
2
+ import { cameraViewMatrix } from './Camera.js';
3
+ import { modelNormalMatrix } from './ModelNode.js';
4
+ import { vec3 } from '../tsl/TSLBase.js';
5
+ import { positionView } from './Position.js';
6
+ import { Fn, varying } from '../tsl/TSLBase.js';
7
+ import { faceDirection } from '../display/FrontFacingNode.js';
8
+
9
+ export const normalGeometry = /*@__PURE__*/ attribute( 'normal', 'vec3' );
10
+
11
+ export const normalLocal = /*@__PURE__*/ ( Fn( ( builder ) => {
12
+
13
+ if ( builder.geometry.hasAttribute( 'normal' ) === false ) {
14
+
15
+ console.warn( 'TSL.NormalNode: Vertex attribute "normal" not found on geometry.' );
16
+
17
+ return vec3( 0, 1, 0 );
18
+
19
+ }
20
+
21
+ return normalGeometry;
22
+
23
+ }, 'vec3' ).once() )().toVar( 'normalLocal' );
24
+
25
+ export const normalFlat = /*@__PURE__*/ positionView.dFdx().cross( positionView.dFdy() ).normalize().toVar( 'normalFlat' );
26
+
27
+ let normalViewVarying = null;
28
+
29
+ export const normalView = /*@__PURE__*/ ( Fn( ( builder ) => {
30
+
31
+ let node;
32
+
33
+ if ( builder.material.flatShading === true ) {
34
+
35
+ node = normalFlat;
36
+
37
+ } else {
38
+
39
+ node = normalViewVarying || ( normalViewVarying = varying( modelNormalMatrix.mul( normalLocal ), 'v_normalView' ).normalize() );
40
+
41
+ }
42
+
43
+ return node;
44
+
45
+ }, 'vec3' ).once() )().toVar( 'normalView' );
46
+
47
+ export const normalWorld = /*@__PURE__*/ varying( normalView.transformDirection( cameraViewMatrix ), 'v_normalWorld' ).normalize().toVar( 'normalWorld' );
48
+
49
+ export const transformedNormalView = /*@__PURE__*/ ( Fn( ( builder ) => {
50
+
51
+ return builder.context.setupNormal();
52
+
53
+ }, 'vec3' ).once() )().mul( faceDirection ).toVar( 'transformedNormalView' );
54
+
55
+
56
+ export const transformedNormalWorld = /*@__PURE__*/ transformedNormalView.transformDirection( cameraViewMatrix ).normalize().toVar( 'transformedNormalWorld' );
57
+
58
+ export const transformedClearcoatNormalView = /*@__PURE__*/ ( Fn( ( builder ) => {
59
+
60
+ return builder.context.setupClearcoatNormal();
61
+
62
+ }, 'vec3' ).once() )().mul( faceDirection ).toVar( 'transformedClearcoatNormalView' );
@@ -1,7 +1,7 @@
1
- import Node, { addNodeClass } from '../core/Node.js';
1
+ import Node, { registerNode } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import UniformNode from '../core/UniformNode.js';
4
- import { nodeProxy } from '../shadernode/ShaderNode.js';
4
+ import { nodeProxy } from '../tsl/TSLBase.js';
5
5
 
6
6
  import { Vector3 } from '../../math/Vector3.js';
7
7
 
@@ -139,12 +139,12 @@ Object3DNode.DIRECTION = 'direction';
139
139
 
140
140
  export default Object3DNode;
141
141
 
142
- export const objectDirection = nodeProxy( Object3DNode, Object3DNode.DIRECTION );
143
- export const objectViewMatrix = nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX );
144
- export const objectNormalMatrix = nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX );
145
- export const objectWorldMatrix = nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX );
146
- export const objectPosition = nodeProxy( Object3DNode, Object3DNode.POSITION );
147
- export const objectScale = nodeProxy( Object3DNode, Object3DNode.SCALE );
148
- export const objectViewPosition = nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION );
142
+ Object3DNode.type = /*@__PURE__*/ registerNode( 'Object3D', Object3DNode );
149
143
 
150
- addNodeClass( 'Object3DNode', Object3DNode );
144
+ export const objectDirection = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.DIRECTION );
145
+ export const objectViewMatrix = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.VIEW_MATRIX );
146
+ export const objectNormalMatrix = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.NORMAL_MATRIX );
147
+ export const objectWorldMatrix = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX );
148
+ export const objectPosition = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.POSITION );
149
+ export const objectScale = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.SCALE );
150
+ export const objectViewPosition = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION );
@@ -1,5 +1,5 @@
1
- import Node, { addNodeClass } from '../core/Node.js';
2
- import { nodeImmutable } from '../shadernode/ShaderNode.js';
1
+ import Node, { registerNode } from '../core/Node.js';
2
+ import { nodeImmutable } from '../tsl/TSLBase.js';
3
3
 
4
4
  class PointUVNode extends Node {
5
5
 
@@ -21,6 +21,6 @@ class PointUVNode extends Node {
21
21
 
22
22
  export default PointUVNode;
23
23
 
24
- export const pointUV = nodeImmutable( PointUVNode );
24
+ PointUVNode.type = /*@__PURE__*/ registerNode( 'PointUV', PointUVNode );
25
25
 
26
- addNodeClass( 'PointUVNode', PointUVNode );
26
+ export const pointUV = /*@__PURE__*/ nodeImmutable( PointUVNode );
@@ -0,0 +1,10 @@
1
+ import { attribute } from '../core/AttributeNode.js';
2
+ import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js';
3
+
4
+ export const positionGeometry = /*@__PURE__*/ attribute( 'position', 'vec3' );
5
+ export const positionLocal = /*@__PURE__*/ positionGeometry.varying( 'positionLocal' );
6
+ export const positionPrevious = /*@__PURE__*/ positionGeometry.varying( 'positionPrevious' );
7
+ export const positionWorld = /*@__PURE__*/ modelWorldMatrix.mul( positionLocal ).xyz.varying( 'v_positionWorld' );
8
+ export const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirection( modelWorldMatrix ).varying( 'v_positionWorldDirection' ).normalize().toVar( 'positionWorldDirection' );
9
+ export const positionView = /*@__PURE__*/ modelViewMatrix.mul( positionLocal ).xyz.varying( 'v_positionView' );
10
+ export const positionViewDirection = /*@__PURE__*/ positionView.negate().varying( 'v_positionViewDirection' ).normalize().toVar( 'positionViewDirection' );
@@ -0,0 +1,143 @@
1
+ import Node, { registerNode } from '../core/Node.js';
2
+ import { NodeUpdateType } from '../core/constants.js';
3
+ import { uniform } from '../core/UniformNode.js';
4
+ import { nodeObject } from '../tsl/TSLCore.js';
5
+ import ArrayElementNode from '../utils/ArrayElementNode.js';
6
+
7
+ class ReferenceElementNode extends ArrayElementNode {
8
+
9
+ constructor( referenceNode, indexNode ) {
10
+
11
+ super( referenceNode, indexNode );
12
+
13
+ this.referenceNode = referenceNode;
14
+
15
+ this.isReferenceElementNode = true;
16
+
17
+ }
18
+
19
+ getNodeType() {
20
+
21
+ return this.referenceNode.uniformType;
22
+
23
+ }
24
+
25
+ generate( builder ) {
26
+
27
+ const snippet = super.generate( builder );
28
+ const arrayType = this.referenceNode.getNodeType();
29
+ const elementType = this.getNodeType();
30
+
31
+ return builder.format( snippet, arrayType, elementType );
32
+
33
+ }
34
+
35
+ }
36
+
37
+ class ReferenceBaseNode extends Node {
38
+
39
+ constructor( property, uniformType, object = null, count = null ) {
40
+
41
+ super();
42
+
43
+ this.property = property;
44
+ this.uniformType = uniformType;
45
+ this.object = object;
46
+ this.count = count;
47
+
48
+ this.properties = property.split( '.' );
49
+ this.reference = object;
50
+ this.node = null;
51
+
52
+ this.updateType = NodeUpdateType.OBJECT;
53
+
54
+ }
55
+
56
+ element( indexNode ) {
57
+
58
+ return nodeObject( new ReferenceElementNode( this, nodeObject( indexNode ) ) );
59
+
60
+ }
61
+
62
+ setNodeType( uniformType ) {
63
+
64
+ this.node = uniform( null, uniformType ).getSelf();
65
+
66
+ }
67
+
68
+ getNodeType( builder ) {
69
+
70
+ if ( this.node === null ) {
71
+
72
+ this.updateValue();
73
+
74
+ }
75
+
76
+ return this.node.getNodeType( builder );
77
+
78
+ }
79
+
80
+ getValueFromReference( object = this.reference ) {
81
+
82
+ const { properties } = this;
83
+
84
+ let value = object[ properties[ 0 ] ];
85
+
86
+ for ( let i = 1; i < properties.length; i ++ ) {
87
+
88
+ value = value[ properties[ i ] ];
89
+
90
+ }
91
+
92
+ return value;
93
+
94
+ }
95
+
96
+ updateReference( state ) {
97
+
98
+ this.reference = this.object !== null ? this.object : state.object;
99
+
100
+ return this.reference;
101
+
102
+ }
103
+
104
+ setup() {
105
+
106
+ this.updateValue();
107
+
108
+ return this.node;
109
+
110
+ }
111
+
112
+ update( /*frame*/ ) {
113
+
114
+ this.updateValue();
115
+
116
+ }
117
+
118
+ updateValue() {
119
+
120
+ if ( this.node === null ) this.setNodeType( this.uniformType );
121
+
122
+ const value = this.getValueFromReference();
123
+
124
+ if ( Array.isArray( value ) ) {
125
+
126
+ this.node.array = value;
127
+
128
+ } else {
129
+
130
+ this.node.value = value;
131
+
132
+ }
133
+
134
+ }
135
+
136
+ }
137
+
138
+ export default ReferenceBaseNode;
139
+
140
+ ReferenceBaseNode.type = /*@__PURE__*/ registerNode( 'ReferenceBase', ReferenceBaseNode );
141
+
142
+ export const reference = ( name, type, object ) => nodeObject( new ReferenceBaseNode( name, type, object ) );
143
+ export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceBaseNode( name, type, object, count ) );
@@ -1,10 +1,11 @@
1
- import Node, { addNodeClass } from '../core/Node.js';
1
+ import Node, { registerNode } 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 { cubeTexture } from './CubeTextureNode.js';
5
6
  import { buffer } from './BufferNode.js';
6
- import { nodeObject } from '../shadernode/ShaderNode.js';
7
- import { uniforms } from './UniformsNode.js';
7
+ import { nodeObject } from '../tsl/TSLBase.js';
8
+ import { uniformArray } from './UniformArrayNode.js';
8
9
  import ArrayElementNode from '../utils/ArrayElementNode.js';
9
10
 
10
11
  class ReferenceElementNode extends ArrayElementNode {
@@ -37,6 +38,7 @@ class ReferenceElementNode extends ArrayElementNode {
37
38
 
38
39
  }
39
40
 
41
+ // TODO: Extends this from ReferenceBaseNode
40
42
  class ReferenceNode extends Node {
41
43
 
42
44
  constructor( property, uniformType, object = null, count = null ) {
@@ -72,19 +74,23 @@ class ReferenceNode extends Node {
72
74
 
73
75
  } else if ( Array.isArray( this.getValueFromReference() ) ) {
74
76
 
75
- node = uniforms( null, uniformType );
77
+ node = uniformArray( null, uniformType );
76
78
 
77
79
  } else if ( uniformType === 'texture' ) {
78
80
 
79
81
  node = texture( null );
80
82
 
83
+ } else if ( uniformType === 'cubeTexture' ) {
84
+
85
+ node = cubeTexture( null );
86
+
81
87
  } else {
82
88
 
83
89
  node = uniform( null, uniformType );
84
90
 
85
91
  }
86
92
 
87
- this.node = node;
93
+ this.node = node.getSelf();
88
94
 
89
95
  }
90
96
 
@@ -160,7 +166,7 @@ class ReferenceNode extends Node {
160
166
 
161
167
  export default ReferenceNode;
162
168
 
169
+ ReferenceNode.type = /*@__PURE__*/ registerNode( 'Reference', ReferenceNode );
170
+
163
171
  export const reference = ( name, type, object ) => nodeObject( new ReferenceNode( name, type, object ) );
164
172
  export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceNode( name, type, object, count ) );
165
-
166
- addNodeClass( 'ReferenceNode', ReferenceNode );
@@ -0,0 +1,10 @@
1
+ import { cameraViewMatrix } from './Camera.js';
2
+ import { transformedNormalView } from './Normal.js';
3
+ import { positionViewDirection } from './Position.js';
4
+ import { materialRefractionRatio } from './MaterialProperties.js';
5
+
6
+ export const reflectView = /*@__PURE__*/ positionViewDirection.negate().reflect( transformedNormalView );
7
+ export const refractView = /*@__PURE__*/ positionViewDirection.negate().refract( transformedNormalView, materialRefractionRatio );
8
+
9
+ export const reflectVector = /*@__PURE__*/ reflectView.transformDirection( cameraViewMatrix ).toVar( 'reflectVector' );
10
+ export const refractVector = /*@__PURE__*/ refractView.transformDirection( cameraViewMatrix ).toVar( 'reflectVector' );
@@ -1,8 +1,8 @@
1
- import ReferenceNode from './ReferenceNode.js';
2
- import { addNodeClass } from '../core/Node.js';
3
- import { nodeObject } from '../shadernode/ShaderNode.js';
1
+ import { registerNode } from '../core/Node.js';
2
+ import ReferenceBaseNode from './ReferenceBaseNode.js';
3
+ import { nodeObject } from '../tsl/TSLCore.js';
4
4
 
5
- class RendererReferenceNode extends ReferenceNode {
5
+ class RendererReferenceNode extends ReferenceBaseNode {
6
6
 
7
7
  constructor( property, inputType, renderer = null ) {
8
8
 
@@ -24,6 +24,6 @@ class RendererReferenceNode extends ReferenceNode {
24
24
 
25
25
  export default RendererReferenceNode;
26
26
 
27
- export const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) );
27
+ RendererReferenceNode.type = /*@__PURE__*/ registerNode( 'RendererReference', RendererReferenceNode );
28
28
 
29
- addNodeClass( 'RendererReferenceNode', RendererReferenceNode );
29
+ export const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) );
@@ -1,6 +1,5 @@
1
- import Node from '../core/Node.js';
2
- import { addNodeClass } from '../core/Node.js';
3
- import { nodeImmutable } from '../shadernode/ShaderNode.js';
1
+ import Node, { registerNode } from '../core/Node.js';
2
+ import { nodeImmutable } from '../tsl/TSLBase.js';
4
3
  import { reference } from './ReferenceNode.js';
5
4
 
6
5
  class SceneNode extends Node {
@@ -46,7 +45,7 @@ SceneNode.BACKGROUND_INTENSITY = 'backgroundIntensity';
46
45
 
47
46
  export default SceneNode;
48
47
 
49
- export const backgroundBlurriness = nodeImmutable( SceneNode, SceneNode.BACKGROUND_BLURRINESS );
50
- export const backgroundIntensity = nodeImmutable( SceneNode, SceneNode.BACKGROUND_INTENSITY );
48
+ SceneNode.type = /*@__PURE__*/ registerNode( 'Scene', SceneNode );
51
49
 
52
- addNodeClass( 'SceneNode', SceneNode );
50
+ export const backgroundBlurriness = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_BLURRINESS );
51
+ export const backgroundIntensity = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_INTENSITY );
@@ -1,15 +1,17 @@
1
- import Node, { addNodeClass } from '../core/Node.js';
1
+ import Node, { registerNode } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { nodeObject } from '../shadernode/ShaderNode.js';
3
+ import { nodeObject } from '../tsl/TSLBase.js';
4
4
  import { attribute } from '../core/AttributeNode.js';
5
5
  import { reference, referenceBuffer } from './ReferenceNode.js';
6
6
  import { add } from '../math/OperatorNode.js';
7
- import { normalLocal } from './NormalNode.js';
8
- import { positionLocal } from './PositionNode.js';
9
- import { tangentLocal } from './TangentNode.js';
7
+ import { normalLocal } from './Normal.js';
8
+ import { positionLocal, positionPrevious } from './Position.js';
9
+ import { tangentLocal } from './Tangent.js';
10
10
  import { uniform } from '../core/UniformNode.js';
11
11
  import { buffer } from './BufferNode.js';
12
12
 
13
+ const _frameId = new WeakMap();
14
+
13
15
  class SkinningNode extends Node {
14
16
 
15
17
  constructor( skinnedMesh, useReference = false ) {
@@ -45,21 +47,22 @@ class SkinningNode extends Node {
45
47
  this.bindMatrixNode = bindMatrixNode;
46
48
  this.bindMatrixInverseNode = bindMatrixInverseNode;
47
49
  this.boneMatricesNode = boneMatricesNode;
50
+ this.previousBoneMatricesNode = null;
48
51
 
49
52
  }
50
53
 
51
- setup( builder ) {
54
+ getSkinnedPosition( boneMatrices = this.boneMatricesNode, position = positionLocal ) {
52
55
 
53
- const { skinIndexNode, skinWeightNode, bindMatrixNode, bindMatrixInverseNode, boneMatricesNode } = this;
56
+ const { skinIndexNode, skinWeightNode, bindMatrixNode, bindMatrixInverseNode } = this;
54
57
 
55
- const boneMatX = boneMatricesNode.element( skinIndexNode.x );
56
- const boneMatY = boneMatricesNode.element( skinIndexNode.y );
57
- const boneMatZ = boneMatricesNode.element( skinIndexNode.z );
58
- const boneMatW = boneMatricesNode.element( skinIndexNode.w );
58
+ const boneMatX = boneMatrices.element( skinIndexNode.x );
59
+ const boneMatY = boneMatrices.element( skinIndexNode.y );
60
+ const boneMatZ = boneMatrices.element( skinIndexNode.z );
61
+ const boneMatW = boneMatrices.element( skinIndexNode.w );
59
62
 
60
63
  // POSITION
61
64
 
62
- const skinVertex = bindMatrixNode.mul( positionLocal );
65
+ const skinVertex = bindMatrixNode.mul( position );
63
66
 
64
67
  const skinned = add(
65
68
  boneMatX.mul( skinWeightNode.x ).mul( skinVertex ),
@@ -68,7 +71,18 @@ class SkinningNode extends Node {
68
71
  boneMatW.mul( skinWeightNode.w ).mul( skinVertex )
69
72
  );
70
73
 
71
- const skinPosition = bindMatrixInverseNode.mul( skinned ).xyz;
74
+ return bindMatrixInverseNode.mul( skinned ).xyz;
75
+
76
+ }
77
+
78
+ getSkinnedNormal( boneMatrices = this.boneMatricesNode, normal = normalLocal ) {
79
+
80
+ const { skinIndexNode, skinWeightNode, bindMatrixNode, bindMatrixInverseNode } = this;
81
+
82
+ const boneMatX = boneMatrices.element( skinIndexNode.x );
83
+ const boneMatY = boneMatrices.element( skinIndexNode.y );
84
+ const boneMatZ = boneMatrices.element( skinIndexNode.z );
85
+ const boneMatW = boneMatrices.element( skinIndexNode.w );
72
86
 
73
87
  // NORMAL
74
88
 
@@ -81,16 +95,58 @@ class SkinningNode extends Node {
81
95
 
82
96
  skinMatrix = bindMatrixInverseNode.mul( skinMatrix ).mul( bindMatrixNode );
83
97
 
84
- const skinNormal = skinMatrix.transformDirection( normalLocal ).xyz;
98
+ return skinMatrix.transformDirection( normal ).xyz;
99
+
100
+ }
101
+
102
+ getPreviousSkinnedPosition( builder ) {
103
+
104
+ const skinnedMesh = builder.object;
105
+
106
+ if ( this.previousBoneMatricesNode === null ) {
107
+
108
+ skinnedMesh.skeleton.previousBoneMatrices = new Float32Array( skinnedMesh.skeleton.boneMatrices );
109
+
110
+ this.previousBoneMatricesNode = referenceBuffer( 'skeleton.previousBoneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );
111
+
112
+ }
113
+
114
+ return this.getSkinnedPosition( this.previousBoneMatricesNode, positionPrevious );
115
+
116
+ }
117
+
118
+ needsPreviousBoneMatrices( builder ) {
119
+
120
+ const mrt = builder.renderer.getMRT();
121
+
122
+ return mrt && mrt.has( 'velocity' );
123
+
124
+ }
125
+
126
+ setup( builder ) {
127
+
128
+ if ( this.needsPreviousBoneMatrices( builder ) ) {
129
+
130
+ positionPrevious.assign( this.getPreviousSkinnedPosition( builder ) );
131
+
132
+ }
133
+
134
+ const skinPosition = this.getSkinnedPosition();
85
135
 
86
- // ASSIGNS
87
136
 
88
137
  positionLocal.assign( skinPosition );
89
- normalLocal.assign( skinNormal );
90
138
 
91
- if ( builder.hasGeometryAttribute( 'tangent' ) ) {
139
+ if ( builder.hasGeometryAttribute( 'normal' ) ) {
140
+
141
+ const skinNormal = this.getSkinnedNormal();
142
+
143
+ normalLocal.assign( skinNormal );
144
+
145
+ if ( builder.hasGeometryAttribute( 'tangent' ) ) {
146
+
147
+ tangentLocal.assign( skinNormal );
92
148
 
93
- tangentLocal.assign( skinNormal );
149
+ }
94
150
 
95
151
  }
96
152
 
@@ -109,8 +165,15 @@ class SkinningNode extends Node {
109
165
  update( frame ) {
110
166
 
111
167
  const object = this.useReference ? frame.object : this.skinnedMesh;
168
+ const skeleton = object.skeleton;
112
169
 
113
- object.skeleton.update();
170
+ if ( _frameId.get( skeleton ) === frame.frameId ) return;
171
+
172
+ _frameId.set( skeleton, frame.frameId );
173
+
174
+ if ( this.previousBoneMatricesNode !== null ) skeleton.previousBoneMatrices.set( skeleton.boneMatrices );
175
+
176
+ skeleton.update();
114
177
 
115
178
  }
116
179
 
@@ -118,7 +181,7 @@ class SkinningNode extends Node {
118
181
 
119
182
  export default SkinningNode;
120
183
 
184
+ SkinningNode.type = /*@__PURE__*/ registerNode( 'Skinning', SkinningNode );
185
+
121
186
  export const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) );
122
187
  export const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) );
123
-
124
- addNodeClass( 'SkinningNode', SkinningNode );
@@ -1,8 +1,7 @@
1
+ import { registerNode } from '../core/Node.js';
1
2
  import BufferNode from './BufferNode.js';
2
3
  import { bufferAttribute } from './BufferAttributeNode.js';
3
- import { addNodeClass } from '../core/Node.js';
4
- import { nodeObject } from '../shadernode/ShaderNode.js';
5
- import { varying } from '../core/VaryingNode.js';
4
+ import { nodeObject, varying } from '../tsl/TSLBase.js';
6
5
  import { storageElement } from '../utils/StorageArrayElementNode.js';
7
6
  import { GPUBufferBindingType } from '../../renderers/webgpu/utils/WebGPUConstants.js';
8
7
 
@@ -123,8 +122,8 @@ class StorageBufferNode extends BufferNode {
123
122
 
124
123
  export default StorageBufferNode;
125
124
 
125
+ StorageBufferNode.type = /*@__PURE__*/ registerNode( 'StorageBuffer', StorageBufferNode );
126
+
126
127
  // Read-Write Storage
127
128
  export const storage = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ) );
128
129
  export const storageObject = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ).setBufferObject( true ) );
129
-
130
- addNodeClass( 'StorageBufferNode', StorageBufferNode );