@plastic-software/three 0.183.4 → 0.184.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 (277) hide show
  1. package/build/three.cjs +773 -286
  2. package/build/three.core.js +372 -110
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +426 -180
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +7 -1
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2979 -1281
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2942 -1281
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +11 -0
  13. package/examples/jsm/animation/CCDIKSolver.js +5 -1
  14. package/examples/jsm/controls/ArcballControls.js +4 -1
  15. package/examples/jsm/controls/DragControls.js +2 -2
  16. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  17. package/examples/jsm/controls/FlyControls.js +4 -0
  18. package/examples/jsm/controls/OrbitControls.js +2 -2
  19. package/examples/jsm/controls/TrackballControls.js +2 -2
  20. package/examples/jsm/controls/TransformControls.js +34 -2
  21. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  22. package/examples/jsm/exporters/GLTFExporter.js +21 -5
  23. package/examples/jsm/geometries/TextGeometry.js +18 -0
  24. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  25. package/examples/jsm/inspector/Extension.js +13 -0
  26. package/examples/jsm/inspector/Inspector.js +169 -114
  27. package/examples/jsm/inspector/RendererInspector.js +2 -2
  28. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  29. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  30. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  31. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  32. package/examples/jsm/inspector/tabs/Parameters.js +34 -2
  33. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  34. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  35. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  36. package/examples/jsm/inspector/tabs/Viewer.js +105 -3
  37. package/examples/jsm/inspector/ui/Graph.js +2 -2
  38. package/examples/jsm/inspector/ui/List.js +1 -1
  39. package/examples/jsm/inspector/ui/Profiler.js +273 -176
  40. package/examples/jsm/inspector/ui/Style.js +64 -10
  41. package/examples/jsm/inspector/ui/Tab.js +39 -7
  42. package/examples/jsm/inspector/ui/Values.js +39 -2
  43. package/examples/jsm/inspector/ui/utils.js +13 -0
  44. package/examples/jsm/interaction/InteractionManager.js +226 -0
  45. package/examples/jsm/libs/meshopt_decoder.module.js +8 -8
  46. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  47. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  48. package/examples/jsm/lines/LineMaterial.js +1 -1
  49. package/examples/jsm/loaders/EXRLoader.js +682 -43
  50. package/examples/jsm/loaders/FBXLoader.js +233 -33
  51. package/examples/jsm/loaders/GLTFLoader.js +24 -7
  52. package/examples/jsm/loaders/HDRLoader.js +1 -1
  53. package/examples/jsm/loaders/KTX2Loader.js +8 -2
  54. package/examples/jsm/loaders/LDrawLoader.js +39 -47
  55. package/examples/jsm/loaders/SVGLoader.js +1 -1
  56. package/examples/jsm/loaders/VTKLoader.js +5 -1
  57. package/examples/jsm/loaders/collada/ColladaComposer.js +101 -7
  58. package/examples/jsm/loaders/collada/ColladaParser.js +19 -4
  59. package/examples/jsm/loaders/usd/USDAParser.js +6 -0
  60. package/examples/jsm/loaders/usd/USDCParser.js +26 -0
  61. package/examples/jsm/loaders/usd/USDComposer.js +656 -103
  62. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  63. package/examples/jsm/misc/RollerCoaster.js +42 -4
  64. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  65. package/examples/jsm/objects/Reflector.js +73 -25
  66. package/examples/jsm/objects/Sky.js +14 -2
  67. package/examples/jsm/objects/SkyMesh.js +23 -6
  68. package/examples/jsm/renderers/Projector.js +18 -38
  69. package/examples/jsm/renderers/SVGRenderer.js +6 -25
  70. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  71. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  72. package/examples/jsm/tsl/display/AfterImageNode.js +10 -0
  73. package/examples/jsm/tsl/display/AnamorphicNode.js +11 -0
  74. package/examples/jsm/tsl/display/BilateralBlurNode.js +10 -0
  75. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  76. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  77. package/examples/jsm/tsl/display/GTAONode.js +2 -1
  78. package/examples/jsm/tsl/display/GaussianBlurNode.js +10 -0
  79. package/examples/jsm/tsl/display/GodraysNode.js +2 -11
  80. package/examples/jsm/tsl/display/OutlineNode.js +66 -16
  81. package/examples/jsm/tsl/display/SSGINode.js +0 -4
  82. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  83. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  84. package/examples/jsm/tsl/display/TRAANode.js +48 -7
  85. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  86. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  87. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  88. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  89. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  90. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  91. package/examples/jsm/tsl/math/Bayer.js +13 -2
  92. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  93. package/examples/jsm/utils/ColorUtils.js +76 -0
  94. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  95. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  96. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  97. package/package.json +4 -4
  98. package/src/Three.Core.js +1 -0
  99. package/src/Three.TSL.js +6 -0
  100. package/src/Three.WebGPU.Nodes.js +3 -0
  101. package/src/Three.WebGPU.js +6 -0
  102. package/src/animation/AnimationAction.js +11 -1
  103. package/src/audio/AudioContext.js +2 -2
  104. package/src/constants.js +1 -1
  105. package/src/core/BufferAttribute.js +13 -1
  106. package/src/core/Clock.js +1 -1
  107. package/src/core/Object3D.js +1 -5
  108. package/src/core/RenderTarget.js +1 -0
  109. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  110. package/src/loaders/AudioLoader.js +11 -1
  111. package/src/loaders/DataTextureLoader.js +6 -4
  112. package/src/loaders/FileLoader.js +1 -2
  113. package/src/loaders/ImageBitmapLoader.js +4 -6
  114. package/src/loaders/MaterialLoader.js +1 -1
  115. package/src/loaders/ObjectLoader.js +25 -4
  116. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  117. package/src/materials/MeshToonMaterial.js +1 -1
  118. package/src/materials/nodes/Line2NodeMaterial.js +27 -0
  119. package/src/materials/nodes/NodeMaterial.js +0 -27
  120. package/src/materials/nodes/manager/NodeMaterialObserver.js +188 -89
  121. package/src/math/Line3.js +3 -0
  122. package/src/math/Matrix2.js +13 -9
  123. package/src/math/Matrix3.js +13 -9
  124. package/src/math/Matrix4.js +13 -9
  125. package/src/math/Plane.js +4 -3
  126. package/src/math/Triangle.js +1 -1
  127. package/src/math/Vector2.js +11 -7
  128. package/src/math/Vector3.js +12 -8
  129. package/src/math/Vector4.js +13 -9
  130. package/src/nodes/Nodes.js +0 -1
  131. package/src/nodes/TSL.js +1 -1
  132. package/src/nodes/accessors/BufferAttributeNode.js +9 -3
  133. package/src/nodes/accessors/CubeTextureNode.js +7 -1
  134. package/src/nodes/accessors/MaterialProperties.js +2 -5
  135. package/src/nodes/accessors/Object3DNode.js +1 -1
  136. package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
  137. package/src/nodes/accessors/ReferenceNode.js +4 -4
  138. package/src/nodes/accessors/SceneProperties.js +2 -8
  139. package/src/nodes/accessors/StorageBufferNode.js +10 -4
  140. package/src/nodes/accessors/StorageTextureNode.js +4 -9
  141. package/src/nodes/accessors/TextureNode.js +10 -2
  142. package/src/nodes/accessors/UniformArrayNode.js +2 -2
  143. package/src/nodes/code/FunctionCallNode.js +1 -1
  144. package/src/nodes/code/FunctionNode.js +1 -1
  145. package/src/nodes/core/ArrayNode.js +1 -1
  146. package/src/nodes/core/AssignNode.js +1 -1
  147. package/src/nodes/core/AttributeNode.js +1 -1
  148. package/src/nodes/core/BypassNode.js +1 -1
  149. package/src/nodes/core/ContextNode.js +1 -1
  150. package/src/nodes/core/IndexNode.js +2 -1
  151. package/src/nodes/core/InputNode.js +1 -1
  152. package/src/nodes/core/InspectorNode.js +1 -1
  153. package/src/nodes/core/IsolateNode.js +1 -1
  154. package/src/nodes/core/Node.js +83 -12
  155. package/src/nodes/core/NodeBuilder.js +117 -16
  156. package/src/nodes/core/NodeUtils.js +1 -1
  157. package/src/nodes/core/OutputStructNode.js +1 -1
  158. package/src/nodes/core/ParameterNode.js +1 -1
  159. package/src/nodes/core/StackNode.js +1 -1
  160. package/src/nodes/core/StructNode.js +1 -1
  161. package/src/nodes/core/StructTypeNode.js +1 -1
  162. package/src/nodes/core/SubBuildNode.js +1 -1
  163. package/src/nodes/core/UniformGroupNode.js +36 -6
  164. package/src/nodes/core/VarNode.js +1 -1
  165. package/src/nodes/core/VaryingNode.js +1 -1
  166. package/src/nodes/display/NormalMapNode.js +2 -2
  167. package/src/nodes/display/PassNode.js +27 -7
  168. package/src/nodes/display/RenderOutputNode.js +4 -4
  169. package/src/nodes/display/ScreenNode.js +1 -1
  170. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  171. package/src/nodes/display/ViewportTextureNode.js +18 -7
  172. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  173. package/src/nodes/geometry/RangeNode.js +1 -1
  174. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  175. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  176. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  177. package/src/nodes/gpgpu/ComputeNode.js +69 -44
  178. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  179. package/src/nodes/lighting/LightsNode.js +6 -27
  180. package/src/nodes/lighting/ShadowNode.js +24 -2
  181. package/src/nodes/math/BitcastNode.js +1 -1
  182. package/src/nodes/math/ConditionalNode.js +1 -1
  183. package/src/nodes/math/MathNode.js +73 -1
  184. package/src/nodes/math/OperatorNode.js +1 -1
  185. package/src/nodes/math/PackFloatNode.js +1 -1
  186. package/src/nodes/math/UnpackFloatNode.js +1 -1
  187. package/src/nodes/tsl/TSLBase.js +1 -1
  188. package/src/nodes/tsl/TSLCore.js +21 -3
  189. package/src/nodes/utils/ArrayElementNode.js +1 -1
  190. package/src/nodes/utils/ConvertNode.js +1 -1
  191. package/src/nodes/utils/DebugNode.js +1 -1
  192. package/src/nodes/utils/EventNode.js +30 -0
  193. package/src/nodes/utils/FlipNode.js +1 -1
  194. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  195. package/src/nodes/utils/JoinNode.js +1 -1
  196. package/src/nodes/utils/MemberNode.js +1 -1
  197. package/src/nodes/utils/Remap.js +48 -0
  198. package/src/nodes/utils/RotateNode.js +1 -1
  199. package/src/nodes/utils/SetNode.js +1 -1
  200. package/src/nodes/utils/SplitNode.js +1 -1
  201. package/src/objects/BatchedMesh.js +17 -2
  202. package/src/objects/InstancedMesh.js +19 -3
  203. package/src/objects/SkinnedMesh.js +26 -9
  204. package/src/renderers/WebGLRenderer.js +147 -48
  205. package/src/renderers/common/Animation.js +3 -3
  206. package/src/renderers/common/Attributes.js +15 -1
  207. package/src/renderers/common/Backend.js +0 -8
  208. package/src/renderers/common/Background.js +2 -2
  209. package/src/renderers/common/BindGroup.js +1 -8
  210. package/src/renderers/common/Bindings.js +2 -2
  211. package/src/renderers/common/ComputePipeline.js +1 -1
  212. package/src/renderers/common/CubeRenderTarget.js +1 -1
  213. package/src/renderers/common/Info.js +333 -4
  214. package/src/renderers/common/InspectorBase.js +6 -1
  215. package/src/renderers/common/Pipelines.js +36 -3
  216. package/src/renderers/common/ReadbackBuffer.js +78 -0
  217. package/src/renderers/common/RenderBundle.js +3 -1
  218. package/src/renderers/common/RenderBundles.js +5 -2
  219. package/src/renderers/common/RenderObject.js +2 -2
  220. package/src/renderers/common/RenderObjects.js +3 -3
  221. package/src/renderers/common/RenderPipeline.js +35 -6
  222. package/src/renderers/common/Renderer.js +232 -53
  223. package/src/renderers/common/Textures.js +72 -3
  224. package/src/renderers/common/UniformsGroup.js +1 -1
  225. package/src/renderers/common/XRManager.js +34 -27
  226. package/src/renderers/common/extras/PMREMGenerator.js +23 -15
  227. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  228. package/src/renderers/common/nodes/NodeManager.js +230 -99
  229. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  230. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  231. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  232. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +8 -0
  233. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  234. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -3
  235. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  236. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  237. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  238. package/src/renderers/shaders/ShaderChunk.js +2 -0
  239. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  240. package/src/renderers/shaders/ShaderLib.js +0 -1
  241. package/src/renderers/shaders/UniformsLib.js +7 -2
  242. package/src/renderers/shaders/UniformsUtils.js +27 -5
  243. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  244. package/src/renderers/webgl/WebGLBackground.js +13 -13
  245. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  246. package/src/renderers/webgl/WebGLCapabilities.js +6 -0
  247. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  248. package/src/renderers/webgl/WebGLMaterials.js +12 -13
  249. package/src/renderers/webgl/WebGLOutput.js +4 -1
  250. package/src/renderers/webgl/WebGLProgram.js +4 -0
  251. package/src/renderers/webgl/WebGLPrograms.js +19 -3
  252. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  253. package/src/renderers/webgl/WebGLState.js +43 -0
  254. package/src/renderers/webgl/WebGLTextures.js +129 -26
  255. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  256. package/src/renderers/webgl-fallback/WebGLBackend.js +106 -65
  257. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  258. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +29 -51
  259. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  260. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  261. package/src/renderers/webgl-fallback/utils/WebGLState.js +42 -1
  262. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +63 -50
  263. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +1 -1
  264. package/src/renderers/webgpu/WebGPUBackend.js +160 -146
  265. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +55 -33
  266. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +103 -17
  267. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  268. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  269. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -0
  270. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +91 -17
  271. package/src/renderers/webgpu/utils/WebGPUUtils.js +18 -2
  272. package/src/renderers/webxr/WebXRController.js +12 -0
  273. package/src/textures/HTMLTexture.js +74 -0
  274. package/src/textures/Source.js +1 -1
  275. package/src/textures/Texture.js +13 -2
  276. package/src/utils.js +23 -1
  277. package/src/nodes/utils/RemapNode.js +0 -125
@@ -35,6 +35,10 @@ class EventNode extends Node {
35
35
 
36
36
  this.updateType = NodeUpdateType.RENDER;
37
37
 
38
+ } else if ( eventType === EventNode.FRAME ) {
39
+
40
+ this.updateType = NodeUpdateType.FRAME;
41
+
38
42
  } else if ( eventType === EventNode.BEFORE_OBJECT ) {
39
43
 
40
44
  this.updateBeforeType = NodeUpdateType.OBJECT;
@@ -43,6 +47,10 @@ class EventNode extends Node {
43
47
 
44
48
  this.updateBeforeType = NodeUpdateType.RENDER;
45
49
 
50
+ } else if ( eventType === EventNode.BEFORE_FRAME ) {
51
+
52
+ this.updateBeforeType = NodeUpdateType.FRAME;
53
+
46
54
  }
47
55
 
48
56
  }
@@ -63,8 +71,10 @@ class EventNode extends Node {
63
71
 
64
72
  EventNode.OBJECT = 'object';
65
73
  EventNode.MATERIAL = 'material';
74
+ EventNode.FRAME = 'frame';
66
75
  EventNode.BEFORE_OBJECT = 'beforeObject';
67
76
  EventNode.BEFORE_MATERIAL = 'beforeMaterial';
77
+ EventNode.BEFORE_FRAME = 'beforeFrame';
68
78
 
69
79
  export default EventNode;
70
80
 
@@ -97,6 +107,16 @@ export const OnObjectUpdate = ( callback ) => createEvent( EventNode.OBJECT, cal
97
107
  */
98
108
  export const OnMaterialUpdate = ( callback ) => createEvent( EventNode.MATERIAL, callback );
99
109
 
110
+ /**
111
+ * Creates an event that triggers a function every frame.
112
+ *
113
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
114
+ *
115
+ * @param {Function} callback - The callback function.
116
+ * @returns {EventNode}
117
+ */
118
+ export const OnFrameUpdate = ( callback ) => createEvent( EventNode.FRAME, callback );
119
+
100
120
  /**
101
121
  * Creates an event that triggers a function before an object (Mesh|Sprite) is updated.
102
122
  *
@@ -116,3 +136,13 @@ export const OnBeforeObjectUpdate = ( callback ) => createEvent( EventNode.BEFOR
116
136
  * @returns {EventNode}
117
137
  */
118
138
  export const OnBeforeMaterialUpdate = ( callback ) => createEvent( EventNode.BEFORE_MATERIAL, callback );
139
+
140
+ /**
141
+ * Creates an event that triggers a function before every frame.
142
+ *
143
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
144
+ *
145
+ * @param {Function} callback - The callback function.
146
+ * @returns {EventNode}
147
+ */
148
+ export const OnBeforeFrameUpdate = ( callback ) => createEvent( EventNode.BEFORE_FRAME, callback );
@@ -56,7 +56,7 @@ class FlipNode extends TempNode {
56
56
  * @param {NodeBuilder} builder - The current node builder.
57
57
  * @return {string} The node type.
58
58
  */
59
- getNodeType( builder ) {
59
+ generateNodeType( builder ) {
60
60
 
61
61
  return this.sourceNode.getNodeType( builder );
62
62
 
@@ -65,7 +65,7 @@ class FunctionOverloadingNode extends Node {
65
65
  * @param {NodeBuilder} builder - The current node builder.
66
66
  * @return {string} The node type.
67
67
  */
68
- getNodeType( builder ) {
68
+ generateNodeType( builder ) {
69
69
 
70
70
  const candidateFn = this.getCandidateFn( builder );
71
71
 
@@ -42,7 +42,7 @@ class JoinNode extends TempNode {
42
42
  * @param {NodeBuilder} builder - The current node builder.
43
43
  * @return {string} The node type.
44
44
  */
45
- getNodeType( builder ) {
45
+ generateNodeType( builder ) {
46
46
 
47
47
  if ( this.nodeType !== null ) {
48
48
 
@@ -66,7 +66,7 @@ class MemberNode extends Node {
66
66
 
67
67
  }
68
68
 
69
- getNodeType( builder ) {
69
+ generateNodeType( builder ) {
70
70
 
71
71
  if ( this.hasMember( builder ) === false ) {
72
72
 
@@ -0,0 +1,48 @@
1
+ import { float, addMethodChaining, Fn, bool, defined } from '../tsl/TSLCore.js';
2
+
3
+ /**
4
+ * This node allows to remap a node value from one range into another. E.g a value of
5
+ * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`.
6
+ * `remap` takes care of that and converts the original value of `0.4` to `0.5`.
7
+ *
8
+ * @tsl
9
+ * @function
10
+ * @param {Node} node - The node that should be remapped.
11
+ * @param {Node} inLowNode - The source or current lower bound of the range.
12
+ * @param {Node} inHighNode - The source or current upper bound of the range.
13
+ * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.
14
+ * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.
15
+ * @returns {Node}
16
+ */
17
+ export const remap = /*@__PURE__*/ Fn( ( [ node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ), doClamp = bool( false ) ] ) => {
18
+
19
+ let t = node.sub( inLowNode ).div( inHighNode.sub( inLowNode ) );
20
+
21
+ if ( defined( doClamp ) ) t = t.clamp();
22
+
23
+ return t.mul( outHighNode.sub( outLowNode ) ).add( outLowNode );
24
+
25
+ } );
26
+
27
+ /**
28
+ * This node allows to remap a node value from one range into another but with enabled clamping. E.g a value of
29
+ * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`.
30
+ * `remapClamp` takes care of that and converts the original value of `0.4` to `0.5`.
31
+ *
32
+ * @tsl
33
+ * @function
34
+ * @param {Node} node - The node that should be remapped.
35
+ * @param {Node} inLowNode - The source or current lower bound of the range.
36
+ * @param {Node} inHighNode - The source or current upper bound of the range.
37
+ * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.
38
+ * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.
39
+ * @returns {Node}
40
+ */
41
+ export function remapClamp( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) {
42
+
43
+ return remap( node, inLowNode, inHighNode, outLowNode, outHighNode, true );
44
+
45
+ }
46
+
47
+ addMethodChaining( 'remap', remap );
48
+ addMethodChaining( 'remapClamp', remapClamp );
@@ -49,7 +49,7 @@ class RotateNode extends TempNode {
49
49
  * @param {NodeBuilder} builder - The current node builder.
50
50
  * @return {string} The node's type.
51
51
  */
52
- getNodeType( builder ) {
52
+ generateNodeType( builder ) {
53
53
 
54
54
  return this.positionNode.getNodeType( builder );
55
55
 
@@ -60,7 +60,7 @@ class SetNode extends TempNode {
60
60
  * @param {NodeBuilder} builder - The current node builder.
61
61
  * @return {string} The node type.
62
62
  */
63
- getNodeType( builder ) {
63
+ generateNodeType( builder ) {
64
64
 
65
65
  return this.sourceNode.getNodeType( builder );
66
66
 
@@ -94,7 +94,7 @@ class SplitNode extends Node {
94
94
  * @param {NodeBuilder} builder - The current node builder.
95
95
  * @return {string} The node type.
96
96
  */
97
- getNodeType( builder ) {
97
+ generateNodeType( builder ) {
98
98
 
99
99
  return builder.getTypeFromLength( this.components.length, this.getComponentType( builder ) );
100
100
 
@@ -272,7 +272,6 @@ class BatchedMesh extends Mesh {
272
272
  this._multiDrawCounts = new Int32Array( maxInstanceCount );
273
273
  this._multiDrawStarts = new Int32Array( maxInstanceCount );
274
274
  this._multiDrawCount = 0;
275
- this._multiDrawInstances = null;
276
275
 
277
276
  // Local matrix per geometry by using data texture
278
277
  this._matricesTexture = null;
@@ -1133,7 +1132,23 @@ class BatchedMesh extends Mesh {
1133
1132
  getColorAt( instanceId, color ) {
1134
1133
 
1135
1134
  this.validateInstanceId( instanceId );
1136
- return color.fromArray( this._colorsTexture.image.data, instanceId * 4 );
1135
+ if ( this._colorsTexture === null ) {
1136
+
1137
+ if ( color.isVector4 ) {
1138
+
1139
+ return color.set( 1, 1, 1, 1 );
1140
+
1141
+ } else {
1142
+
1143
+ return color.setRGB( 1, 1, 1 );
1144
+
1145
+ }
1146
+
1147
+ } else {
1148
+
1149
+ return color.fromArray( this._colorsTexture.image.data, instanceId * 4 );
1150
+
1151
+ }
1137
1152
 
1138
1153
  }
1139
1154
 
@@ -213,10 +213,19 @@ class InstancedMesh extends Mesh {
213
213
  *
214
214
  * @param {number} index - The instance index.
215
215
  * @param {Color} color - The target object that is used to store the method's result.
216
+ * @return {Color} A reference to the target color.
216
217
  */
217
218
  getColorAt( index, color ) {
218
219
 
219
- color.fromArray( this.instanceColor.array, index * 3 );
220
+ if ( this.instanceColor === null ) {
221
+
222
+ return color.setRGB( 1, 1, 1 );
223
+
224
+ } else {
225
+
226
+ return color.fromArray( this.instanceColor.array, index * 3 );
227
+
228
+ }
220
229
 
221
230
  }
222
231
 
@@ -225,10 +234,11 @@ class InstancedMesh extends Mesh {
225
234
  *
226
235
  * @param {number} index - The instance index.
227
236
  * @param {Matrix4} matrix - The target object that is used to store the method's result.
237
+ * @return {Matrix4} A reference to the target matrix.
228
238
  */
229
239
  getMatrixAt( index, matrix ) {
230
240
 
231
- matrix.fromArray( this.instanceMatrix.array, index * 16 );
241
+ return matrix.fromArray( this.instanceMatrix.array, index * 16 );
232
242
 
233
243
  }
234
244
 
@@ -314,6 +324,7 @@ class InstancedMesh extends Mesh {
314
324
  *
315
325
  * @param {number} index - The instance index.
316
326
  * @param {Color} color - The instance color.
327
+ * @return {InstancedMesh} A reference to this instanced mesh.
317
328
  */
318
329
  setColorAt( index, color ) {
319
330
 
@@ -324,19 +335,22 @@ class InstancedMesh extends Mesh {
324
335
  }
325
336
 
326
337
  color.toArray( this.instanceColor.array, index * 3 );
338
+ return this;
327
339
 
328
340
  }
329
341
 
330
342
  /**
331
343
  * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of
332
- * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.
344
+ * {@link InstancedMesh#instanceMatrix} to `true` after updating all the matrices.
333
345
  *
334
346
  * @param {number} index - The instance index.
335
347
  * @param {Matrix4} matrix - The local transformation.
348
+ * @return {InstancedMesh} A reference to this instanced mesh.
336
349
  */
337
350
  setMatrixAt( index, matrix ) {
338
351
 
339
352
  matrix.toArray( this.instanceMatrix.array, index * 16 );
353
+ return this;
340
354
 
341
355
  }
342
356
 
@@ -347,6 +361,7 @@ class InstancedMesh extends Mesh {
347
361
  * @param {number} index - The instance index.
348
362
  * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights
349
363
  * of a single instance.
364
+ * @return {InstancedMesh} A reference to this instanced mesh.
350
365
  */
351
366
  setMorphAt( index, object ) {
352
367
 
@@ -377,6 +392,7 @@ class InstancedMesh extends Mesh {
377
392
  array[ dataIndex ] = morphBaseInfluence;
378
393
 
379
394
  array.set( objectInfluences, dataIndex + 1 );
395
+ return this;
380
396
 
381
397
  }
382
398
 
@@ -8,12 +8,12 @@ import { Ray } from '../math/Ray.js';
8
8
  import { AttachedBindMode, DetachedBindMode } from '../constants.js';
9
9
  import { warn } from '../utils.js';
10
10
 
11
- const _basePosition = /*@__PURE__*/ new Vector3();
11
+ const _baseVector = /*@__PURE__*/ new Vector4();
12
12
 
13
13
  const _skinIndex = /*@__PURE__*/ new Vector4();
14
14
  const _skinWeight = /*@__PURE__*/ new Vector4();
15
15
 
16
- const _vector3 = /*@__PURE__*/ new Vector3();
16
+ const _vector4 = /*@__PURE__*/ new Vector4();
17
17
  const _matrix4 = /*@__PURE__*/ new Matrix4();
18
18
  const _vertex = /*@__PURE__*/ new Vector3();
19
19
 
@@ -309,12 +309,12 @@ class SkinnedMesh extends Mesh {
309
309
 
310
310
  /**
311
311
  * Applies the bone transform associated with the given index to the given
312
- * vertex position. Returns the updated vector.
312
+ * vector. Can be used to transform positions or direction vectors by providing
313
+ * a Vector4 with 1 or 0 in the w component respectively. Returns the updated vector.
313
314
  *
314
315
  * @param {number} index - The vertex index.
315
- * @param {Vector3} target - The target object that is used to store the method's result.
316
- * the skinned mesh's world matrix will be used instead.
317
- * @return {Vector3} The updated vertex position.
316
+ * @param {Vector3|Vector4} target - The target object that is used to store the method's result.
317
+ * @return {Vector3|Vector4} The updated vertex attribute data.
318
318
  */
319
319
  applyBoneTransform( index, target ) {
320
320
 
@@ -324,9 +324,19 @@ class SkinnedMesh extends Mesh {
324
324
  _skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );
325
325
  _skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );
326
326
 
327
- _basePosition.copy( target ).applyMatrix4( this.bindMatrix );
327
+ if ( target.isVector4 ) {
328
+
329
+ _baseVector.copy( target );
330
+ target.set( 0, 0, 0, 0 );
331
+
332
+ } else {
333
+
334
+ _baseVector.set( ...target, 1 );
335
+ target.set( 0, 0, 0 );
328
336
 
329
- target.set( 0, 0, 0 );
337
+ }
338
+
339
+ _baseVector.applyMatrix4( this.bindMatrix );
330
340
 
331
341
  for ( let i = 0; i < 4; i ++ ) {
332
342
 
@@ -338,12 +348,19 @@ class SkinnedMesh extends Mesh {
338
348
 
339
349
  _matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );
340
350
 
341
- target.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );
351
+ target.addScaledVector( _vector4.copy( _baseVector ).applyMatrix4( _matrix4 ), weight );
342
352
 
343
353
  }
344
354
 
345
355
  }
346
356
 
357
+ if ( target.isVector4 ) {
358
+
359
+ // ensure the homogenous coordinate remains unchanged after vector operations
360
+ target.w = _baseVector.w;
361
+
362
+ }
363
+
347
364
  return target.applyMatrix4( this.bindMatrixInverse );
348
365
 
349
366
  }