super-three 0.141.0 → 0.144.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 (353) hide show
  1. package/README.md +8 -8
  2. package/build/three.cjs +1558 -1034
  3. package/build/three.js +1558 -1034
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +2012 -1243
  6. package/examples/js/animation/MMDPhysics.js +1 -16
  7. package/examples/js/controls/ArcballControls.js +16 -3
  8. package/examples/js/controls/FirstPersonControls.js +0 -7
  9. package/examples/js/controls/FlyControls.js +0 -8
  10. package/examples/js/controls/OrbitControls.js +0 -4
  11. package/examples/js/controls/PointerLockControls.js +0 -8
  12. package/examples/js/controls/TrackballControls.js +0 -2
  13. package/examples/js/controls/TransformControls.js +20 -16
  14. package/examples/js/effects/AnaglyphEffect.js +2 -2
  15. package/examples/js/effects/OutlineEffect.js +4 -24
  16. package/examples/js/effects/ParallaxBarrierEffect.js +2 -2
  17. package/examples/js/effects/PeppersGhostEffect.js +2 -2
  18. package/examples/js/effects/StereoEffect.js +2 -2
  19. package/examples/js/environments/RoomEnvironment.js +22 -0
  20. package/examples/js/exporters/ColladaExporter.js +4 -13
  21. package/examples/js/exporters/DRACOExporter.js +0 -12
  22. package/examples/js/exporters/GLTFExporter.js +28 -29
  23. package/examples/js/exporters/OBJExporter.js +2 -23
  24. package/examples/js/exporters/PLYExporter.js +12 -24
  25. package/examples/js/exporters/STLExporter.js +0 -7
  26. package/examples/js/exporters/USDZExporter.js +6 -0
  27. package/examples/js/geometries/ConvexGeometry.js +1 -1
  28. package/examples/js/geometries/ParametricGeometry.js +1 -8
  29. package/examples/js/interactive/SelectionHelper.js +2 -0
  30. package/examples/js/libs/ktx-parse.umd.js +1 -0
  31. package/examples/js/libs/meshopt_decoder.js +98 -32
  32. package/examples/js/loaders/ColladaLoader.js +1 -0
  33. package/examples/js/loaders/DRACOLoader.js +2 -25
  34. package/examples/js/loaders/EXRLoader.js +2 -13
  35. package/examples/js/loaders/FBXLoader.js +10 -3
  36. package/examples/js/loaders/FontLoader.js +3 -16
  37. package/examples/js/loaders/GLTFLoader.js +52 -36
  38. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -11
  39. package/examples/js/loaders/LDrawLoader.js +139 -74
  40. package/examples/js/loaders/OBJLoader.js +7 -13
  41. package/examples/js/loaders/PCDLoader.js +59 -14
  42. package/examples/js/loaders/PLYLoader.js +3 -3
  43. package/examples/js/loaders/SVGLoader.js +4 -3
  44. package/examples/js/loaders/TIFFLoader.js +31 -0
  45. package/examples/js/loaders/VRMLLoader.js +33 -24
  46. package/examples/js/loaders/VTKLoader.js +1 -1
  47. package/examples/js/loaders/lwo/LWO2Parser.js +8 -7
  48. package/examples/js/loaders/lwo/LWO3Parser.js +8 -7
  49. package/examples/js/materials/MeshGouraudMaterial.js +385 -0
  50. package/examples/js/math/ColorConverter.js +0 -50
  51. package/examples/js/misc/GPUComputationRenderer.js +23 -0
  52. package/examples/js/misc/Volume.js +198 -190
  53. package/examples/js/misc/VolumeSlice.js +90 -88
  54. package/examples/js/modifiers/SimplifyModifier.js +1 -1
  55. package/examples/js/objects/GroundProjectedEnv.js +193 -0
  56. package/examples/js/objects/Reflector.js +9 -2
  57. package/examples/js/objects/ReflectorForSSRPass.js +3 -4
  58. package/examples/js/objects/Refractor.js +10 -4
  59. package/examples/js/objects/ShadowMesh.js +5 -1
  60. package/examples/js/postprocessing/OutlinePass.js +5 -3
  61. package/examples/js/renderers/CSS2DRenderer.js +2 -2
  62. package/examples/js/renderers/CSS3DRenderer.js +2 -2
  63. package/examples/js/renderers/Projector.js +2 -23
  64. package/examples/js/shaders/LuminosityShader.js +1 -1
  65. package/examples/js/shaders/MMDToonShader.js +6 -2
  66. package/examples/js/shaders/ToneMapShader.js +1 -1
  67. package/examples/js/utils/BufferGeometryUtils.js +1 -1
  68. package/examples/js/utils/GeometryUtils.js +2 -18
  69. package/examples/js/utils/PackedPhongMaterial.js +1 -1
  70. package/examples/js/utils/SceneUtils.js +0 -16
  71. package/examples/jsm/animation/MMDPhysics.js +3 -22
  72. package/examples/jsm/controls/ArcballControls.js +17 -2
  73. package/examples/jsm/controls/FirstPersonControls.js +0 -7
  74. package/examples/jsm/controls/FlyControls.js +0 -7
  75. package/examples/jsm/controls/OrbitControls.js +0 -5
  76. package/examples/jsm/controls/PointerLockControls.js +0 -7
  77. package/examples/jsm/controls/TrackballControls.js +0 -3
  78. package/examples/jsm/controls/TransformControls.js +18 -16
  79. package/examples/jsm/effects/AnaglyphEffect.js +2 -2
  80. package/examples/jsm/effects/OutlineEffect.js +4 -25
  81. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -2
  82. package/examples/jsm/effects/PeppersGhostEffect.js +2 -2
  83. package/examples/jsm/effects/StereoEffect.js +2 -2
  84. package/examples/jsm/environments/RoomEnvironment.js +23 -0
  85. package/examples/jsm/exporters/ColladaExporter.js +4 -13
  86. package/examples/jsm/exporters/DRACOExporter.js +0 -13
  87. package/examples/jsm/exporters/GLTFExporter.js +29 -31
  88. package/examples/jsm/exporters/KTX2Exporter.js +29 -29
  89. package/examples/jsm/exporters/OBJExporter.js +0 -18
  90. package/examples/jsm/exporters/PLYExporter.js +14 -22
  91. package/examples/jsm/exporters/STLExporter.js +1 -9
  92. package/examples/jsm/exporters/USDZExporter.js +14 -3
  93. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  94. package/examples/jsm/geometries/ParametricGeometry.js +0 -6
  95. package/examples/jsm/interactive/HTMLMesh.js +9 -9
  96. package/examples/jsm/interactive/SelectionHelper.js +5 -3
  97. package/examples/jsm/libs/meshopt_decoder.module.js +97 -32
  98. package/examples/jsm/libs/utif.module.js +1579 -0
  99. package/examples/jsm/libs/zstddec.module.js +1 -0
  100. package/examples/jsm/loaders/ColladaLoader.js +1 -0
  101. package/examples/jsm/loaders/DRACOLoader.js +2 -28
  102. package/examples/jsm/loaders/EXRLoader.js +3 -13
  103. package/examples/jsm/loaders/FBXLoader.js +10 -3
  104. package/examples/jsm/loaders/FontLoader.js +3 -16
  105. package/examples/jsm/loaders/GLTFLoader.js +52 -36
  106. package/examples/jsm/loaders/HDRCubeTextureLoader.js +0 -13
  107. package/examples/jsm/loaders/KTX2Loader.js +192 -30
  108. package/examples/jsm/loaders/LDrawLoader.js +135 -74
  109. package/examples/jsm/loaders/OBJLoader.js +6 -14
  110. package/examples/jsm/loaders/PCDLoader.js +59 -13
  111. package/examples/jsm/loaders/PLYLoader.js +3 -3
  112. package/examples/jsm/loaders/RGBELoader.js +1 -1
  113. package/examples/jsm/loaders/SVGLoader.js +4 -3
  114. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  115. package/examples/jsm/loaders/USDZLoader.js +393 -0
  116. package/examples/jsm/loaders/VRMLLoader.js +23 -25
  117. package/examples/jsm/loaders/VTKLoader.js +1 -1
  118. package/examples/jsm/loaders/lwo/LWO2Parser.js +6 -8
  119. package/examples/jsm/loaders/lwo/LWO3Parser.js +6 -8
  120. package/examples/jsm/materials/MeshGouraudMaterial.js +423 -0
  121. package/examples/jsm/math/ColorConverter.js +1 -49
  122. package/examples/jsm/misc/GPUComputationRenderer.js +43 -0
  123. package/examples/jsm/misc/Volume.js +169 -171
  124. package/examples/jsm/misc/VolumeSlice.js +78 -80
  125. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  126. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +1 -1
  127. package/examples/jsm/node-editor/accessors/NormalEditor.js +1 -1
  128. package/examples/jsm/node-editor/accessors/PositionEditor.js +1 -1
  129. package/examples/jsm/node-editor/accessors/UVEditor.js +1 -1
  130. package/examples/jsm/node-editor/display/BlendEditor.js +1 -1
  131. package/examples/jsm/node-editor/display/NormalMapEditor.js +1 -1
  132. package/examples/jsm/node-editor/inputs/ColorEditor.js +1 -1
  133. package/examples/jsm/node-editor/inputs/FloatEditor.js +1 -1
  134. package/examples/jsm/node-editor/inputs/SliderEditor.js +1 -1
  135. package/examples/jsm/node-editor/inputs/TextureEditor.js +1 -1
  136. package/examples/jsm/node-editor/inputs/Vector2Editor.js +1 -1
  137. package/examples/jsm/node-editor/inputs/Vector3Editor.js +1 -1
  138. package/examples/jsm/node-editor/inputs/Vector4Editor.js +1 -1
  139. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +1 -1
  140. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +1 -1
  141. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +1 -1
  142. package/examples/jsm/node-editor/math/AngleEditor.js +1 -1
  143. package/examples/jsm/node-editor/math/DotEditor.js +1 -1
  144. package/examples/jsm/node-editor/math/InvertEditor.js +1 -1
  145. package/examples/jsm/node-editor/math/LimiterEditor.js +1 -1
  146. package/examples/jsm/node-editor/math/NormalizeEditor.js +1 -1
  147. package/examples/jsm/node-editor/math/OperatorEditor.js +1 -1
  148. package/examples/jsm/node-editor/math/PowerEditor.js +1 -1
  149. package/examples/jsm/node-editor/math/TrigonometryEditor.js +1 -1
  150. package/examples/jsm/node-editor/procedural/CheckerEditor.js +1 -1
  151. package/examples/jsm/node-editor/utils/JoinEditor.js +1 -1
  152. package/examples/jsm/node-editor/utils/OscillatorEditor.js +1 -1
  153. package/examples/jsm/node-editor/utils/PreviewEditor.js +3 -3
  154. package/examples/jsm/node-editor/utils/SplitEditor.js +1 -1
  155. package/examples/jsm/node-editor/utils/TimerEditor.js +1 -1
  156. package/examples/jsm/nodes/Nodes.js +43 -13
  157. package/examples/jsm/nodes/accessors/CubeTextureNode.js +9 -5
  158. package/examples/jsm/nodes/accessors/NormalNode.js +4 -4
  159. package/examples/jsm/nodes/accessors/PositionNode.js +5 -5
  160. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +31 -0
  161. package/examples/jsm/nodes/core/AttributeNode.js +3 -3
  162. package/examples/jsm/nodes/core/CodeNode.js +3 -3
  163. package/examples/jsm/nodes/core/FunctionCallNode.js +20 -5
  164. package/examples/jsm/nodes/core/FunctionNode.js +2 -2
  165. package/examples/jsm/nodes/core/Node.js +14 -12
  166. package/examples/jsm/nodes/core/NodeBuilder.js +12 -12
  167. package/examples/jsm/nodes/core/NodeUtils.js +23 -1
  168. package/examples/jsm/nodes/core/{NodeVary.js → NodeVarying.js} +3 -3
  169. package/examples/jsm/nodes/core/{VaryNode.js → VaryingNode.js} +7 -7
  170. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +94 -0
  171. package/examples/jsm/nodes/geometry/RangeNode.js +109 -0
  172. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -0
  173. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -7
  174. package/examples/jsm/nodes/lighting/LightingContextNode.js +4 -4
  175. package/examples/jsm/nodes/loaders/NodeLoader.js +2 -2
  176. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +31 -0
  177. package/examples/jsm/nodes/materials/Materials.js +13 -25
  178. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +70 -0
  179. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +4 -7
  180. package/examples/jsm/nodes/materials/NodeMaterial.js +2 -2
  181. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +28 -17
  182. package/examples/jsm/nodes/materialx/Disclaimer.md +199 -0
  183. package/examples/jsm/nodes/materialx/functions/lib/mx_hsv.js +56 -0
  184. package/examples/jsm/nodes/materialx/functions/lib/mx_noise.js +607 -0
  185. package/examples/jsm/nodes/math/MathNode.js +2 -12
  186. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +21 -6
  187. package/examples/jsm/nodes/procedural/CheckerNode.js +2 -2
  188. package/examples/jsm/nodes/shadernode/ShaderNode.js +5 -5
  189. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +8 -5
  190. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +20 -6
  191. package/examples/jsm/nodes/utils/ConvertNode.js +8 -3
  192. package/examples/jsm/nodes/utils/JoinNode.js +7 -7
  193. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +2 -1
  194. package/examples/jsm/nodes/utils/RotateUVNode.js +32 -0
  195. package/examples/jsm/nodes/utils/SplitNode.js +21 -5
  196. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  197. package/examples/jsm/objects/GroundProjectedEnv.js +186 -0
  198. package/examples/jsm/objects/Reflector.js +12 -5
  199. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -5
  200. package/examples/jsm/objects/Refractor.js +12 -6
  201. package/examples/jsm/objects/ShadowMesh.js +8 -2
  202. package/examples/jsm/postprocessing/OutlinePass.js +5 -3
  203. package/examples/jsm/renderers/CSS2DRenderer.js +2 -2
  204. package/examples/jsm/renderers/CSS3DRenderer.js +2 -2
  205. package/examples/jsm/renderers/Projector.js +2 -24
  206. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +9 -5
  207. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +329 -218
  208. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +7 -3
  209. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +39 -3
  210. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +6 -0
  211. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +6 -0
  212. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +1 -1
  213. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +17 -19
  214. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +16 -14
  215. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +2 -2
  216. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +66 -81
  217. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +5 -3
  218. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +2 -2
  219. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +81 -0
  220. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +25 -30
  221. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  222. package/examples/jsm/shaders/LuminosityShader.js +1 -1
  223. package/examples/jsm/shaders/MMDToonShader.js +2 -2
  224. package/examples/jsm/shaders/ToneMapShader.js +1 -1
  225. package/examples/jsm/utils/BufferGeometryUtils.js +2 -1
  226. package/examples/jsm/utils/GeometryUtils.js +17 -25
  227. package/examples/jsm/utils/PackedPhongMaterial.js +0 -1
  228. package/examples/jsm/utils/SceneUtils.js +1 -21
  229. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -1
  230. package/examples/jsm/webxr/VRButton.js +1 -7
  231. package/package.json +18 -14
  232. package/src/Three.Legacy.js +262 -36
  233. package/src/Three.js +3 -2
  234. package/src/animation/AnimationAction.js +6 -5
  235. package/src/animation/AnimationClip.js +1 -1
  236. package/src/animation/AnimationMixer.js +1 -1
  237. package/src/animation/AnimationUtils.js +204 -199
  238. package/src/animation/KeyframeTrack.js +1 -1
  239. package/src/animation/PropertyBinding.js +24 -5
  240. package/src/cameras/CubeCamera.js +0 -7
  241. package/src/constants.js +2 -4
  242. package/src/core/BufferAttribute.js +81 -111
  243. package/src/core/BufferGeometry.js +3 -41
  244. package/src/core/InstancedBufferAttribute.js +0 -10
  245. package/src/core/InterleavedBuffer.js +1 -1
  246. package/src/core/InterleavedBufferAttribute.js +56 -7
  247. package/src/core/Object3D.js +22 -5
  248. package/src/core/Uniform.js +0 -7
  249. package/src/core/UniformsGroup.js +92 -0
  250. package/src/extras/DataUtils.js +104 -88
  251. package/src/extras/core/Path.js +1 -0
  252. package/src/extras/core/ShapePath.js +1 -4
  253. package/src/extras/curves/CatmullRomCurve3.js +4 -2
  254. package/src/geometries/BoxGeometry.js +1 -1
  255. package/src/geometries/CapsuleGeometry.js +1 -1
  256. package/src/geometries/CircleGeometry.js +1 -1
  257. package/src/geometries/ConeGeometry.js +1 -1
  258. package/src/geometries/CylinderGeometry.js +2 -1
  259. package/src/geometries/DodecahedronGeometry.js +1 -1
  260. package/src/geometries/EdgesGeometry.js +5 -4
  261. package/src/geometries/ExtrudeGeometry.js +2 -11
  262. package/src/geometries/IcosahedronGeometry.js +1 -1
  263. package/src/geometries/LatheGeometry.js +2 -2
  264. package/src/geometries/OctahedronGeometry.js +1 -1
  265. package/src/geometries/PlaneGeometry.js +2 -1
  266. package/src/geometries/PolyhedronGeometry.js +1 -1
  267. package/src/geometries/RingGeometry.js +1 -1
  268. package/src/geometries/ShapeGeometry.js +2 -1
  269. package/src/geometries/SphereGeometry.js +2 -1
  270. package/src/geometries/TetrahedronGeometry.js +1 -1
  271. package/src/geometries/TorusGeometry.js +2 -1
  272. package/src/geometries/TorusKnotGeometry.js +2 -1
  273. package/src/geometries/TubeGeometry.js +2 -1
  274. package/src/geometries/WireframeGeometry.js +1 -0
  275. package/src/helpers/CameraHelper.js +97 -38
  276. package/src/helpers/DirectionalLightHelper.js +1 -0
  277. package/src/helpers/HemisphereLightHelper.js +1 -0
  278. package/src/helpers/PlaneHelper.js +6 -9
  279. package/src/helpers/PolarGridHelper.js +18 -14
  280. package/src/helpers/SpotLightHelper.js +1 -0
  281. package/src/lights/SpotLight.js +2 -0
  282. package/src/loaders/FileLoader.js +12 -1
  283. package/src/loaders/LoadingManager.js +1 -1
  284. package/src/loaders/MaterialLoader.js +49 -7
  285. package/src/loaders/ObjectLoader.js +4 -41
  286. package/src/materials/Material.js +1 -33
  287. package/src/materials/Materials.js +0 -27
  288. package/src/materials/MeshLambertMaterial.js +28 -1
  289. package/src/materials/ShaderMaterial.js +3 -7
  290. package/src/math/Color.js +3 -13
  291. package/src/math/MathUtils.js +1 -7
  292. package/src/math/Matrix3.js +1 -7
  293. package/src/math/Matrix4.js +3 -27
  294. package/src/math/Quaternion.js +1 -21
  295. package/src/math/Vector2.js +4 -24
  296. package/src/math/Vector3.js +7 -46
  297. package/src/math/Vector4.js +4 -24
  298. package/src/renderers/WebGLRenderer.js +84 -8
  299. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +12 -12
  300. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -5
  301. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -5
  302. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +24 -24
  303. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +1 -1
  304. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +1 -1
  305. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +2 -1
  306. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +113 -99
  307. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +34 -12
  308. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  309. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +30 -0
  310. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +3 -1
  311. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +13 -1
  312. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +2 -4
  313. package/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js +1 -1
  314. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +18 -7
  315. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +8 -3
  316. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +9 -6
  317. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  318. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +14 -10
  319. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +1 -1
  320. package/src/renderers/shaders/ShaderChunk.js +4 -2
  321. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +0 -1
  322. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +22 -50
  323. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  324. package/src/renderers/shaders/ShaderLib.js +31 -31
  325. package/src/renderers/shaders/UniformsLib.js +12 -11
  326. package/src/renderers/shaders/UniformsUtils.js +14 -0
  327. package/src/renderers/webgl/WebGLBackground.js +2 -2
  328. package/src/renderers/webgl/WebGLLights.js +37 -13
  329. package/src/renderers/webgl/WebGLMorphtargets.js +0 -20
  330. package/src/renderers/webgl/WebGLProgram.js +6 -11
  331. package/src/renderers/webgl/WebGLPrograms.js +30 -26
  332. package/src/renderers/webgl/WebGLRenderLists.js +5 -4
  333. package/src/renderers/webgl/WebGLRenderStates.js +5 -4
  334. package/src/renderers/webgl/WebGLShaderCache.js +9 -6
  335. package/src/renderers/webgl/WebGLShadowMap.js +10 -15
  336. package/src/renderers/webgl/WebGLState.js +47 -0
  337. package/src/renderers/webgl/WebGLUniforms.js +4 -4
  338. package/src/renderers/webgl/WebGLUniformsGroups.js +372 -0
  339. package/src/renderers/webgl/WebGLUtils.js +2 -0
  340. package/src/renderers/webvr/WebVRManager.js +42 -9
  341. package/src/renderers/webvr/WebVRUtils.js +1 -1
  342. package/src/renderers/webxr/WebXRController.js +45 -37
  343. package/src/renderers/webxr/WebXRManager.js +58 -33
  344. package/src/scenes/Scene.js +16 -3
  345. package/src/textures/Source.js +1 -1
  346. package/src/utils.js +1 -1
  347. package/examples/js/controls/experimental/CameraControls.js +0 -1048
  348. package/examples/js/loaders/KTX2Loader.js +0 -558
  349. package/examples/jsm/controls/experimental/CameraControls.js +0 -1248
  350. package/examples/jsm/nodes/accessors/ReflectNode.js +0 -70
  351. package/examples/jsm/package.json +0 -3
  352. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +0 -45
  353. package/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js +0 -122
@@ -0,0 +1,94 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { ShaderNode, vec3, mat3, add, sub, mul, max, div, dot, float, mix, cos, sin, atan2, sqrt } from '../shadernode/ShaderNodeBaseElements.js';
3
+
4
+ const luminanceNode = new ShaderNode( ( { color } ) => {
5
+
6
+ const LUMA = vec3( 0.2125, 0.7154, 0.0721 );
7
+
8
+ return dot( color, LUMA );
9
+
10
+ } );
11
+
12
+ const saturationNode = new ShaderNode( ( { color, adjustment } ) => {
13
+
14
+ const intensityNode = luminanceNode.call( { color } );
15
+
16
+ return mix( intensityNode, color, adjustment );
17
+
18
+ } );
19
+
20
+ const vibranceNode = new ShaderNode( ( { color, adjustment } ) => {
21
+
22
+ const average = div( add( color.r, color.g, color.b ), 3.0 );
23
+
24
+ const mx = max( color.r, max( color.g, color.b ) );
25
+ const amt = mul( sub( mx, average ), mul( - 3.0, adjustment ) );
26
+
27
+ return mix( color.rgb, vec3( mx ), amt );
28
+
29
+ } );
30
+
31
+ const hueNode = new ShaderNode( ( { color, adjustment } ) => {
32
+
33
+ const RGBtoYIQ = mat3( 0.299, 0.587, 0.114, 0.595716, - 0.274453, - 0.321263, 0.211456, - 0.522591, 0.311135 );
34
+ const YIQtoRGB = mat3( 1.0, 0.9563, 0.6210, 1.0, - 0.2721, - 0.6474, 1.0, - 1.107, 1.7046 );
35
+
36
+ const yiq = mul( RGBtoYIQ, color );
37
+
38
+ const hue = add( atan2( yiq.z, yiq.y ), adjustment );
39
+ const chroma = sqrt( add( mul( yiq.z, yiq.z ), mul( yiq.y, yiq.y ) ) );
40
+
41
+ return mul( YIQtoRGB, vec3( yiq.x, mul( chroma, cos( hue ) ), mul( chroma, sin( hue ) ) ) );
42
+
43
+ } );
44
+
45
+ class ColorAdjustmentNode extends TempNode {
46
+
47
+ static SATURATION = 'saturation';
48
+ static VIBRANCE = 'vibrance';
49
+ static HUE = 'hue';
50
+
51
+ constructor( method, colorNode, adjustmentNode = float( 1 ) ) {
52
+
53
+ super( 'vec3' );
54
+
55
+ this.method = method;
56
+
57
+ this.colorNode = colorNode;
58
+ this.adjustmentNode = adjustmentNode;
59
+
60
+ }
61
+
62
+ construct() {
63
+
64
+ const { method, colorNode, adjustmentNode } = this;
65
+
66
+ const callParams = { color: colorNode, adjustment: adjustmentNode };
67
+
68
+ let outputNode = null;
69
+
70
+ if ( method === ColorAdjustmentNode.SATURATION ) {
71
+
72
+ outputNode = saturationNode.call( callParams );
73
+
74
+ } else if ( method === ColorAdjustmentNode.VIBRANCE ) {
75
+
76
+ outputNode = vibranceNode.call( callParams );
77
+
78
+ } else if ( method === ColorAdjustmentNode.HUE ) {
79
+
80
+ outputNode = hueNode.call( callParams );
81
+
82
+ } else {
83
+
84
+ console.error( `${ this.type }: Method "${ this.method }" not supported!` );
85
+
86
+ }
87
+
88
+ return outputNode;
89
+
90
+ }
91
+
92
+ }
93
+
94
+ export default ColorAdjustmentNode;
@@ -0,0 +1,109 @@
1
+ import Node from '../core/Node.js';
2
+ import { attribute, float } from '../shadernode/ShaderNodeBaseElements.js';
3
+ import { MathUtils, InstancedBufferAttribute } from 'three';
4
+
5
+ class RangeNode extends Node {
6
+
7
+ constructor( min, max ) {
8
+
9
+ super();
10
+
11
+ this.min = min;
12
+ this.max = max;
13
+
14
+ }
15
+
16
+ getVectorLength() {
17
+
18
+ const min = this.min;
19
+
20
+ let length = 1;
21
+
22
+ if ( min.isVector2 ) length = 2;
23
+ else if ( min.isVector3 ) length = 3;
24
+ else if ( min.isVector4 ) length = 4;
25
+ else if ( min.isColor ) length = 3;
26
+
27
+ return length;
28
+
29
+ }
30
+
31
+ getNodeType( builder ) {
32
+
33
+ return ( builder.object.isInstancedMesh === true ) ? builder.getTypeFromLength( this.getVectorLength() ) : 'float';
34
+
35
+ }
36
+
37
+ construct( builder ) {
38
+
39
+ const { min, max } = this;
40
+ const { object, geometry } = builder;
41
+
42
+ let output = null;
43
+
44
+ if ( object.isInstancedMesh === true ) {
45
+
46
+ const vectorLength = this.getVectorLength();
47
+ const attributeName = 'node' + this.id;
48
+
49
+ const length = vectorLength * object.count;
50
+ const array = new Float32Array( length );
51
+
52
+ const attributeGeometry = geometry.getAttribute( attributeName );
53
+
54
+ if ( attributeGeometry === undefined || attributeGeometry.array.length < length ) {
55
+
56
+ if ( vectorLength === 1 ) {
57
+
58
+ for ( let i = 0; i < length; i ++ ) {
59
+
60
+ array[ i ] = MathUtils.lerp( min, max, Math.random() );
61
+
62
+ }
63
+
64
+ } else if ( min.isColor ) {
65
+
66
+ for ( let i = 0; i < length; i += 3 ) {
67
+
68
+ array[ i ] = MathUtils.lerp( min.r, max.r, Math.random() );
69
+ array[ i + 1 ] = MathUtils.lerp( min.g, max.g, Math.random() );
70
+ array[ i + 2 ] = MathUtils.lerp( min.b, max.b, Math.random() );
71
+
72
+ }
73
+
74
+ } else {
75
+
76
+ for ( let i = 0; i < length; i ++ ) {
77
+
78
+ const index = i % vectorLength;
79
+
80
+ const minValue = min.getComponent( index );
81
+ const maxValue = max.getComponent( index );
82
+
83
+ array[ i ] = MathUtils.lerp( minValue, maxValue, Math.random() );
84
+
85
+ }
86
+
87
+ }
88
+
89
+ geometry.setAttribute( attributeName, new InstancedBufferAttribute( array, vectorLength ) );
90
+
91
+ geometry.dispose();
92
+
93
+ }
94
+
95
+ output = attribute( attributeName, builder.getTypeFromLength( vectorLength ) );
96
+
97
+ } else {
98
+
99
+ output = float( 0 );
100
+
101
+ }
102
+
103
+ return output;
104
+
105
+ }
106
+
107
+ }
108
+
109
+ export default RangeNode;
@@ -34,6 +34,8 @@ class ComputeNode extends Node {
34
34
 
35
35
  }
36
36
 
37
+ onInit() { }
38
+
37
39
  update( { renderer } ) {
38
40
 
39
41
  renderer.compute( this );
@@ -1,7 +1,7 @@
1
1
  import LightingNode from './LightingNode.js';
2
2
  import ContextNode from '../core/ContextNode.js';
3
3
  import MaxMipLevelNode from '../utils/MaxMipLevelNode.js';
4
- import { ShaderNode, float, add, mul, div, log2, clamp, roughness, reflect, mix, vec3, positionViewDirection, negate, normalize, transformedNormalView, transformedNormalWorld, transformDirection, cameraViewMatrix } from '../shadernode/ShaderNodeElements.js';
4
+ import { ShaderNode, float, add, mul, div, log2, clamp, roughness, reflect, mix, positionViewDirection, negate, normalize, transformedNormalView, transformedNormalWorld, transformDirection, cameraViewMatrix } from '../shadernode/ShaderNodeElements.js';
5
5
 
6
6
  // taken from here: http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html
7
7
  const getSpecularMIPLevel = new ShaderNode( ( { texture, levelNode } ) => {
@@ -15,7 +15,7 @@ const getSpecularMIPLevel = new ShaderNode( ( { texture, levelNode } ) => {
15
15
 
16
16
  } );
17
17
 
18
- class EnvironmentLightNode extends LightingNode {
18
+ class EnvironmentNode extends LightingNode {
19
19
 
20
20
  constructor( envNode = null ) {
21
21
 
@@ -28,13 +28,11 @@ class EnvironmentLightNode extends LightingNode {
28
28
  construct( builder ) {
29
29
 
30
30
  const envNode = this.envNode;
31
-
32
- const flipNormalWorld = vec3( negate( transformedNormalWorld.x ), transformedNormalWorld.yz );
31
+ const properties = builder.getNodeProperties( this );
33
32
 
34
33
  let reflectVec = reflect( negate( positionViewDirection ), transformedNormalView );
35
34
  reflectVec = normalize( mix( reflectVec, transformedNormalView, mul( roughness, roughness ) ) );
36
35
  reflectVec = transformDirection( reflectVec, cameraViewMatrix );
37
- reflectVec = vec3( negate( reflectVec.x ), reflectVec.yz );
38
36
 
39
37
  const radianceContext = new ContextNode( envNode, {
40
38
  tempRead: false,
@@ -45,7 +43,7 @@ class EnvironmentLightNode extends LightingNode {
45
43
 
46
44
  const irradianceContext = new ContextNode( envNode, {
47
45
  tempRead: false,
48
- uvNode: flipNormalWorld,
46
+ uvNode: transformedNormalWorld,
49
47
  levelNode: float( 1 ),
50
48
  levelShaderNode: getSpecularMIPLevel
51
49
  } );
@@ -58,8 +56,11 @@ class EnvironmentLightNode extends LightingNode {
58
56
 
59
57
  builder.context.iblIrradiance.add( mul( Math.PI, irradianceContext ) );
60
58
 
59
+ properties.radianceContext = radianceContext;
60
+ properties.irradianceContext = irradianceContext;
61
+
61
62
  }
62
63
 
63
64
  }
64
65
 
65
- export default EnvironmentLightNode;
66
+ export default EnvironmentNode;
@@ -39,10 +39,10 @@ class LightingContextNode extends ContextNode {
39
39
  };
40
40
 
41
41
  const lighting = {
42
- radiance : temp( vec3() ),
43
- irradiance : temp( vec3() ),
44
- iblIrradiance : temp( vec3() ),
45
- ambientOcclusion : temp( float( 1 ) )
42
+ radiance: temp( vec3() ),
43
+ irradiance: temp( vec3() ),
44
+ iblIrradiance: temp( vec3() ),
45
+ ambientOcclusion: temp( float( 1 ) )
46
46
  };
47
47
 
48
48
  Object.assign( properties, reflectedLight, lighting );
@@ -1,5 +1,5 @@
1
1
  import * as Nodes from '../Nodes.js';
2
- import { Loader } from 'three';
2
+ import { FileLoader, Loader } from 'three';
3
3
 
4
4
  class NodeLoader extends Loader {
5
5
 
@@ -79,7 +79,7 @@ class NodeLoader extends Loader {
79
79
 
80
80
  parse( json ) {
81
81
 
82
- const node = Nodes.fromType( type );
82
+ const node = Nodes.fromType( json.type );
83
83
  node.uuid = json.uuid;
84
84
 
85
85
  const nodes = this.parseNodes( json.inputNodes );
@@ -1,4 +1,35 @@
1
1
  import { MaterialLoader } from 'three';
2
+ import {
3
+ NodeMaterial,
4
+ LineBasicNodeMaterial,
5
+ MeshBasicNodeMaterial,
6
+ MeshStandardNodeMaterial,
7
+ PointsNodeMaterial,
8
+ SpriteNodeMaterial
9
+ } from '../materials/Materials.js';
10
+
11
+ const superFromTypeFunction = MaterialLoader.createMaterialFromType;
12
+
13
+ MaterialLoader.createMaterialFromType = function ( type ) {
14
+
15
+ const materialLib = {
16
+ NodeMaterial,
17
+ LineBasicNodeMaterial,
18
+ MeshBasicNodeMaterial,
19
+ MeshStandardNodeMaterial,
20
+ PointsNodeMaterial,
21
+ SpriteNodeMaterial,
22
+ };
23
+
24
+ if ( materialLib[ type ] !== undefined ) {
25
+
26
+ return new materialLib[ type ]();
27
+
28
+ }
29
+
30
+ return superFromTypeFunction.call( this, type );
31
+
32
+ };
2
33
 
3
34
  class NodeMaterialLoader extends MaterialLoader {
4
35
 
@@ -2,44 +2,32 @@ import NodeMaterial from './NodeMaterial.js';
2
2
  import LineBasicNodeMaterial from './LineBasicNodeMaterial.js';
3
3
  import MeshBasicNodeMaterial from './MeshBasicNodeMaterial.js';
4
4
  import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js';
5
+ import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js';
5
6
  import PointsNodeMaterial from './PointsNodeMaterial.js';
6
7
  import SpriteNodeMaterial from './SpriteNodeMaterial.js';
7
- import { Material } from 'three';
8
8
 
9
9
  export {
10
10
  NodeMaterial,
11
11
  LineBasicNodeMaterial,
12
12
  MeshBasicNodeMaterial,
13
13
  MeshStandardNodeMaterial,
14
+ MeshPhysicalNodeMaterial,
14
15
  PointsNodeMaterial,
15
16
  SpriteNodeMaterial
16
17
  };
17
18
 
18
- const materialLib = {
19
- NodeMaterial,
20
- LineBasicNodeMaterial,
21
- MeshBasicNodeMaterial,
22
- MeshStandardNodeMaterial,
23
- PointsNodeMaterial,
24
- SpriteNodeMaterial
25
- };
26
-
27
- const fromTypeFunction = Material.fromType;
28
-
29
- Material.fromType = function ( type ) {
30
-
31
- if ( materialLib[ type ] !== undefined ) {
32
-
33
- return new materialLib[ type ]();
34
-
35
- }
36
-
37
- return fromTypeFunction.call( this, type );
38
-
39
- };
40
-
41
19
  NodeMaterial.fromMaterial = function ( material ) {
42
20
 
21
+ const materialLib = {
22
+ NodeMaterial,
23
+ LineBasicNodeMaterial,
24
+ MeshBasicNodeMaterial,
25
+ MeshStandardNodeMaterial,
26
+ MeshPhysicalNodeMaterial,
27
+ PointsNodeMaterial,
28
+ SpriteNodeMaterial
29
+ };
30
+
43
31
  const type = material.type.replace( 'Material', 'NodeMaterial' );
44
32
 
45
33
  if ( materialLib[ type ] === undefined ) {
@@ -50,7 +38,7 @@ NodeMaterial.fromMaterial = function ( material ) {
50
38
 
51
39
  const nodeMaterial = new materialLib[ type ]( material );
52
40
 
53
- for ( let key in material ) {
41
+ for ( const key in material ) {
54
42
 
55
43
  if ( nodeMaterial[ key ] === undefined ) {
56
44
 
@@ -0,0 +1,70 @@
1
+ import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js';
2
+
3
+ import { MeshPhysicalMaterial } from 'three';
4
+
5
+ const defaultValues = new MeshPhysicalMaterial();
6
+
7
+ export default class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
8
+
9
+ constructor( parameters ) {
10
+
11
+ super();
12
+
13
+ this.isMeshPhysicalNodeMaterial = true;
14
+
15
+ this.clearcoatNode = null;
16
+ this.clearcoatRoughnessNode = null;
17
+ this.clearcoatNormalNode = null;
18
+
19
+ this.sheenNode = null;
20
+ this.sheenRoughnessNode = null;
21
+
22
+ this.iridescenceNode = null;
23
+ this.iridescenceIORNode = null;
24
+ this.iridescenceThicknessNode = null;
25
+
26
+ this.specularIntensityNode = null;
27
+ this.specularColorNode = null;
28
+
29
+ this.transmissionNode = null;
30
+ this.thicknessNode = null;
31
+ this.attenuationDistanceNode = null;
32
+ this.attenuationColorNode = null;
33
+
34
+ this.sheen = 0;
35
+ this.clearcoat = 0;
36
+ this.iridescence = 0;
37
+ this.transmission = 0;
38
+
39
+ this.setDefaultValues( defaultValues );
40
+
41
+ this.setValues( parameters );
42
+
43
+ }
44
+
45
+ copy( source ) {
46
+
47
+ this.clearcoatNode = source.clearcoatNode;
48
+ this.clearcoatRoughnessNode = source.clearcoatRoughnessNode;
49
+ this.clearcoatNormalNode = source.clearcoatNormalNode;
50
+
51
+ this.sheenNode = source.sheenNode;
52
+ this.sheenRoughnessNode = source.sheenRoughnessNode;
53
+
54
+ this.iridescenceNode = source.iridescenceNode;
55
+ this.iridescenceIORNode = source.iridescenceIORNode;
56
+ this.iridescenceThicknessNode = source.iridescenceThicknessNode;
57
+
58
+ this.specularIntensityNode = source.specularIntensityNode;
59
+ this.specularColorNode = source.specularColorNode;
60
+
61
+ this.transmissionNode = source.transmissionNode;
62
+ this.thicknessNode = source.thicknessNode;
63
+ this.attenuationDistanceNode = source.attenuationDistanceNode;
64
+ this.attenuationColorNode = source.attenuationColorNode;
65
+
66
+ return super.copy( source );
67
+
68
+ }
69
+
70
+ }
@@ -35,9 +35,6 @@ export default class MeshStandardNodeMaterial extends NodeMaterial {
35
35
  this.metalnessNode = null;
36
36
  this.roughnessNode = null;
37
37
 
38
- this.clearcoatNode = null;
39
- this.clearcoatRoughnessNode = null;
40
-
41
38
  this.envNode = null;
42
39
 
43
40
  this.lightsNode = null;
@@ -54,7 +51,10 @@ export default class MeshStandardNodeMaterial extends NodeMaterial {
54
51
 
55
52
  this.generatePosition( builder );
56
53
 
57
- let { colorNode, diffuseColorNode } = this.generateDiffuseColor( builder );
54
+ const colorNodes = this.generateDiffuseColor( builder );
55
+ const { colorNode } = colorNodes;
56
+ let { diffuseColorNode } = colorNodes;
57
+
58
58
  const envNode = this.envNode || builder.scene.environmentNode;
59
59
 
60
60
  diffuseColorNode = this.generateStandardMaterial( builder, { colorNode, diffuseColorNode } );
@@ -155,9 +155,6 @@ export default class MeshStandardNodeMaterial extends NodeMaterial {
155
155
  this.metalnessNode = source.metalnessNode;
156
156
  this.roughnessNode = source.roughnessNode;
157
157
 
158
- this.clearcoatNode = source.clearcoatNode;
159
- this.clearcoatRoughnessNode = source.clearcoatRoughnessNode;
160
-
161
158
  this.envNode = source.envNode;
162
159
 
163
160
  this.lightsNode = source.lightsNode;
@@ -1,5 +1,5 @@
1
1
  import { Material, ShaderMaterial } from 'three';
2
- import { getNodesKeys } from '../core/NodeUtils.js';
2
+ import { getNodesKeys, getCacheKey } from '../core/NodeUtils.js';
3
3
  import ExpressionNode from '../core/ExpressionNode.js';
4
4
  import {
5
5
  float, vec3, vec4,
@@ -37,7 +37,7 @@ class NodeMaterial extends ShaderMaterial {
37
37
 
38
38
  customProgramCacheKey() {
39
39
 
40
- return this.uuid + '-' + this.version;
40
+ return getCacheKey( this );
41
41
 
42
42
  }
43
43
 
@@ -2,8 +2,8 @@ import NodeMaterial from './NodeMaterial.js';
2
2
  import { SpriteMaterial } from 'three';
3
3
  import {
4
4
  vec2, vec3, vec4,
5
- assign, add, mul, sub,
6
- positionLocal, bypass, length, cos, sin,
5
+ uniform, add, mul, sub,
6
+ positionLocal, length, cos, sin,
7
7
  modelViewMatrix, cameraProjectionMatrix, modelWorldMatrix, materialRotation
8
8
  } from '../shadernode/ShaderNodeElements.js';
9
9
 
@@ -22,13 +22,13 @@ class SpriteNodeMaterial extends NodeMaterial {
22
22
  this.colorNode = null;
23
23
  this.opacityNode = null;
24
24
 
25
- this.rotationNode = null;
26
-
27
25
  this.alphaTestNode = null;
28
26
 
29
27
  this.lightNode = null;
30
28
 
31
29
  this.positionNode = null;
30
+ this.rotationNode = null;
31
+ this.scaleNode = null;
32
32
 
33
33
  this.setDefaultValues( defaultValues );
34
34
 
@@ -40,25 +40,36 @@ class SpriteNodeMaterial extends NodeMaterial {
40
40
 
41
41
  // < VERTEX STAGE >
42
42
 
43
- let vertex = positionLocal;
44
-
45
- if ( this.positionNode !== null ) {
46
-
47
- vertex = bypass( vertex, assign( positionLocal, this.positionNode ) );
43
+ const { positionNode, rotationNode, scaleNode } = this;
48
44
 
49
- }
45
+ const vertex = positionLocal;
50
46
 
51
- let mvPosition = mul( modelViewMatrix, vec4( 0, 0, 0, 1 ) );
47
+ let mvPosition = mul( modelViewMatrix, positionNode ? vec4( positionNode.xyz, 1 ) : vec4( 0, 0, 0, 1 ) );
52
48
 
53
- const scale = vec2(
49
+ let scale = vec2(
54
50
  length( vec3( modelWorldMatrix[ 0 ].x, modelWorldMatrix[ 0 ].y, modelWorldMatrix[ 0 ].z ) ),
55
51
  length( vec3( modelWorldMatrix[ 1 ].x, modelWorldMatrix[ 1 ].y, modelWorldMatrix[ 1 ].z ) )
56
52
  );
57
53
 
58
- const alignedPosition = mul( positionLocal.xy, scale );
59
- const rotation = this.rotationNode || materialRotation;
54
+ if ( scaleNode !== null ) {
55
+
56
+ scale = mul( scale, scaleNode );
57
+
58
+ }
59
+
60
+ let alignedPosition = vertex.xy;
60
61
 
61
- let rotatedPosition = vec2(
62
+ if ( builder.object.center?.isVector2 === true ) {
63
+
64
+ alignedPosition = sub( alignedPosition, sub( uniform( builder.object.center ), vec2( 0.5 ) ) );
65
+
66
+ }
67
+
68
+ alignedPosition = mul( alignedPosition, scale );
69
+
70
+ const rotation = rotationNode || materialRotation;
71
+
72
+ const rotatedPosition = vec2(
62
73
  sub( mul( cos( rotation ), alignedPosition.x ), mul( sin( rotation ), alignedPosition.y ) ),
63
74
  add( mul( sin( rotation ), alignedPosition.x ), mul( cos( rotation ), alignedPosition.y ) )
64
75
  );
@@ -78,13 +89,13 @@ class SpriteNodeMaterial extends NodeMaterial {
78
89
  this.colorNode = source.colorNode;
79
90
  this.opacityNode = source.opacityNode;
80
91
 
81
- this.rotationNode = source.rotationNode;
82
-
83
92
  this.alphaTestNode = source.alphaTestNode;
84
93
 
85
94
  this.lightNode = source.lightNode;
86
95
 
87
96
  this.positionNode = source.positionNode;
97
+ this.rotationNode = source.rotationNode;
98
+ this.scaleNode = source.scaleNode;
88
99
 
89
100
  return super.copy( source );
90
101