super-three 0.168.0 → 0.169.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/build/three.cjs +369 -131
  2. package/build/three.module.js +369 -131
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +24644 -22406
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +79941 -0
  7. package/build/three.webgpu.nodes.min.js +6 -0
  8. package/examples/jsm/Addons.js +0 -6
  9. package/examples/jsm/controls/TrackballControls.js +32 -12
  10. package/examples/jsm/controls/TransformControls.js +97 -62
  11. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  12. package/examples/jsm/exporters/EXRExporter.js +19 -11
  13. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  14. package/examples/jsm/exporters/OBJExporter.js +5 -1
  15. package/examples/jsm/exporters/PLYExporter.js +9 -7
  16. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  17. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  18. package/examples/jsm/helpers/LightProbeHelper.js +1 -1
  19. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  20. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  21. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  22. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  23. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  24. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  25. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  26. package/examples/jsm/loaders/FBXLoader.js +30 -20
  27. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  28. package/examples/jsm/loaders/KTX2Loader.js +10 -7
  29. package/examples/jsm/loaders/MTLLoader.js +4 -3
  30. package/examples/jsm/loaders/MaterialXLoader.js +29 -10
  31. package/examples/jsm/loaders/OBJLoader.js +5 -3
  32. package/examples/jsm/loaders/PCDLoader.js +5 -4
  33. package/examples/jsm/loaders/PDBLoader.js +3 -2
  34. package/examples/jsm/loaders/PLYLoader.js +8 -5
  35. package/examples/jsm/loaders/STLLoader.js +3 -2
  36. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  37. package/examples/jsm/loaders/VTKLoader.js +4 -3
  38. package/examples/jsm/loaders/XYZLoader.js +3 -2
  39. package/examples/jsm/misc/Timer.js +1 -1
  40. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  41. package/examples/jsm/objects/LensflareMesh.js +322 -0
  42. package/examples/jsm/objects/SkyMesh.js +1 -2
  43. package/examples/jsm/objects/Water2Mesh.js +2 -3
  44. package/examples/jsm/objects/WaterMesh.js +1 -2
  45. package/examples/jsm/physics/JoltPhysics.js +1 -1
  46. package/examples/jsm/physics/RapierPhysics.js +1 -1
  47. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  48. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  49. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  50. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  51. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  52. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  53. package/examples/jsm/utils/TextureUtils.js +1 -0
  54. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  55. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  56. package/package.json +2 -2
  57. package/src/Three.WebGPU.Nodes.js +200 -0
  58. package/src/Three.WebGPU.js +2 -1
  59. package/src/audio/Audio.js +2 -2
  60. package/src/constants.js +1 -1
  61. package/src/core/BufferAttribute.js +0 -9
  62. package/src/core/Clock.js +1 -1
  63. package/src/core/InterleavedBuffer.js +0 -9
  64. package/src/extras/Controls.js +1 -1
  65. package/src/geometries/CylinderGeometry.js +11 -4
  66. package/src/loaders/MaterialLoader.js +7 -1
  67. package/src/loaders/nodes/NodeLoader.js +24 -4
  68. package/src/loaders/nodes/NodeMaterialLoader.js +21 -17
  69. package/src/loaders/nodes/NodeObjectLoader.js +19 -0
  70. package/src/materials/nodes/InstancedPointsNodeMaterial.js +19 -34
  71. package/src/materials/nodes/Line2NodeMaterial.js +26 -26
  72. package/src/materials/nodes/LineBasicNodeMaterial.js +7 -3
  73. package/src/materials/nodes/LineDashedNodeMaterial.js +7 -3
  74. package/src/materials/nodes/MeshBasicNodeMaterial.js +7 -3
  75. package/src/materials/nodes/MeshLambertNodeMaterial.js +7 -3
  76. package/src/materials/nodes/MeshMatcapNodeMaterial.js +7 -3
  77. package/src/materials/nodes/MeshNormalNodeMaterial.js +7 -3
  78. package/src/materials/nodes/MeshPhongNodeMaterial.js +7 -3
  79. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +6 -3
  80. package/src/materials/nodes/MeshSSSNodeMaterial.js +6 -3
  81. package/src/materials/nodes/MeshStandardNodeMaterial.js +7 -3
  82. package/src/materials/nodes/MeshToonNodeMaterial.js +7 -3
  83. package/src/materials/nodes/NodeMaterial.js +20 -45
  84. package/src/materials/nodes/NodeMaterials.js +2 -0
  85. package/src/materials/nodes/PointsNodeMaterial.js +7 -3
  86. package/src/materials/nodes/ShadowNodeMaterial.js +7 -3
  87. package/src/materials/nodes/SpriteNodeMaterial.js +39 -6
  88. package/src/materials/nodes/VolumeNodeMaterial.js +13 -9
  89. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  90. package/src/math/Triangle.js +24 -0
  91. package/src/nodes/Nodes.js +3 -3
  92. package/src/nodes/TSL.js +96 -93
  93. package/src/nodes/accessors/BatchNode.js +7 -3
  94. package/src/nodes/accessors/BufferAttributeNode.js +6 -3
  95. package/src/nodes/accessors/BufferNode.js +6 -3
  96. package/src/nodes/accessors/Camera.js +10 -16
  97. package/src/nodes/accessors/ClippingNode.js +7 -3
  98. package/src/nodes/accessors/CubeTextureNode.js +6 -3
  99. package/src/nodes/accessors/InstanceNode.js +11 -11
  100. package/src/nodes/accessors/InstancedPointsMaterialNode.js +6 -3
  101. package/src/nodes/accessors/Lights.js +51 -0
  102. package/src/nodes/accessors/MaterialNode.js +8 -4
  103. package/src/nodes/accessors/MaterialReferenceNode.js +6 -3
  104. package/src/nodes/accessors/ModelNode.js +42 -7
  105. package/src/nodes/accessors/ModelViewProjectionNode.js +9 -5
  106. package/src/nodes/accessors/MorphNode.js +7 -3
  107. package/src/nodes/accessors/Normal.js +32 -6
  108. package/src/nodes/accessors/Object3DNode.js +11 -27
  109. package/src/nodes/accessors/PointUVNode.js +7 -3
  110. package/src/nodes/accessors/ReferenceBaseNode.js +32 -4
  111. package/src/nodes/accessors/ReferenceNode.js +40 -3
  112. package/src/nodes/accessors/RendererReferenceNode.js +9 -3
  113. package/src/nodes/accessors/SceneNode.js +7 -3
  114. package/src/nodes/accessors/SkinningNode.js +7 -3
  115. package/src/nodes/accessors/StorageBufferNode.js +21 -3
  116. package/src/nodes/accessors/StorageTextureNode.js +7 -4
  117. package/src/nodes/accessors/Texture3DNode.js +7 -4
  118. package/src/nodes/accessors/TextureNode.js +19 -8
  119. package/src/nodes/accessors/TextureSizeNode.js +8 -5
  120. package/src/nodes/accessors/UniformArrayNode.js +12 -9
  121. package/src/nodes/accessors/UserDataNode.js +9 -6
  122. package/src/nodes/accessors/VelocityNode.js +74 -23
  123. package/src/nodes/accessors/VertexColorNode.js +6 -3
  124. package/src/nodes/code/CodeNode.js +7 -3
  125. package/src/nodes/code/ExpressionNode.js +8 -4
  126. package/src/nodes/code/FunctionCallNode.js +6 -3
  127. package/src/nodes/code/FunctionNode.js +6 -3
  128. package/src/nodes/code/ScriptableNode.js +11 -6
  129. package/src/nodes/code/ScriptableValueNode.js +7 -3
  130. package/src/nodes/core/AssignNode.js +9 -6
  131. package/src/nodes/core/AttributeNode.js +7 -3
  132. package/src/nodes/core/BypassNode.js +8 -4
  133. package/src/nodes/core/CacheNode.js +8 -4
  134. package/src/nodes/core/ConstNode.js +6 -3
  135. package/src/nodes/core/ContextNode.js +7 -3
  136. package/src/nodes/core/IndexNode.js +25 -3
  137. package/src/nodes/core/InputNode.js +7 -3
  138. package/src/nodes/core/MRTNode.js +6 -3
  139. package/src/nodes/core/Node.js +10 -51
  140. package/src/nodes/core/NodeBuilder.js +71 -5
  141. package/src/nodes/core/NodeUtils.js +48 -6
  142. package/src/nodes/core/OutputStructNode.js +8 -4
  143. package/src/nodes/core/ParameterNode.js +6 -3
  144. package/src/nodes/core/PropertyNode.js +7 -3
  145. package/src/nodes/core/StackNode.js +7 -3
  146. package/src/nodes/core/StructTypeNode.js +7 -3
  147. package/src/nodes/core/TempNode.js +8 -4
  148. package/src/nodes/core/UniformGroupNode.js +10 -6
  149. package/src/nodes/core/UniformNode.js +6 -3
  150. package/src/nodes/core/VarNode.js +8 -4
  151. package/src/nodes/core/VaryingNode.js +7 -3
  152. package/src/nodes/display/AfterImageNode.js +6 -0
  153. package/src/nodes/display/AnaglyphPassNode.js +6 -0
  154. package/src/nodes/display/AnamorphicNode.js +6 -0
  155. package/src/nodes/display/BloomNode.js +6 -0
  156. package/src/nodes/display/BumpMapNode.js +6 -0
  157. package/src/nodes/display/ColorSpaceFunctions.js +4 -4
  158. package/src/nodes/display/ColorSpaceNode.js +43 -14
  159. package/src/nodes/display/DenoiseNode.js +6 -3
  160. package/src/nodes/display/DepthOfFieldNode.js +6 -3
  161. package/src/nodes/display/DotScreenNode.js +8 -5
  162. package/src/nodes/display/FXAANode.js +6 -3
  163. package/src/nodes/display/FilmNode.js +6 -3
  164. package/src/nodes/display/FrontFacingNode.js +7 -3
  165. package/src/nodes/display/GTAONode.js +6 -3
  166. package/src/nodes/display/GaussianBlurNode.js +6 -3
  167. package/src/nodes/display/Lut3DNode.js +6 -3
  168. package/src/nodes/display/NormalMapNode.js +8 -6
  169. package/src/nodes/display/ParallaxBarrierPassNode.js +8 -5
  170. package/src/nodes/display/PassNode.js +18 -7
  171. package/src/nodes/display/PixelationPassNode.js +12 -5
  172. package/src/nodes/display/PosterizeNode.js +6 -3
  173. package/src/nodes/display/RGBShiftNode.js +6 -3
  174. package/src/nodes/display/RenderOutputNode.js +12 -8
  175. package/src/nodes/display/SSAAPassNode.js +6 -3
  176. package/src/nodes/display/ScreenNode.js +181 -0
  177. package/src/nodes/display/SobelOperatorNode.js +6 -3
  178. package/src/nodes/display/StereoCompositePassNode.js +6 -3
  179. package/src/nodes/display/StereoPassNode.js +6 -3
  180. package/src/nodes/display/ToneMappingFunctions.js +12 -12
  181. package/src/nodes/display/ToneMappingNode.js +8 -7
  182. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  183. package/src/nodes/display/TransitionNode.js +6 -3
  184. package/src/nodes/display/ViewportDepthNode.js +7 -3
  185. package/src/nodes/display/ViewportDepthTextureNode.js +8 -5
  186. package/src/nodes/display/ViewportSharedTextureNode.js +8 -5
  187. package/src/nodes/display/ViewportTextureNode.js +8 -5
  188. package/src/nodes/fog/FogExp2Node.js +6 -3
  189. package/src/nodes/fog/FogNode.js +7 -3
  190. package/src/nodes/fog/FogRangeNode.js +6 -3
  191. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  192. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  193. package/src/nodes/geometry/RangeNode.js +7 -3
  194. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  195. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  196. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  197. package/src/nodes/gpgpu/ComputeNode.js +8 -4
  198. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  199. package/src/nodes/lighting/AONode.js +6 -3
  200. package/src/nodes/lighting/AmbientLightNode.js +6 -3
  201. package/src/nodes/lighting/AnalyticLightNode.js +198 -30
  202. package/src/nodes/lighting/BasicEnvironmentNode.js +6 -3
  203. package/src/nodes/lighting/BasicLightMapNode.js +6 -3
  204. package/src/nodes/lighting/DirectionalLightNode.js +7 -4
  205. package/src/nodes/lighting/EnvironmentNode.js +6 -3
  206. package/src/nodes/lighting/HemisphereLightNode.js +10 -6
  207. package/src/nodes/lighting/IESSpotLightNode.js +6 -3
  208. package/src/nodes/lighting/IrradianceNode.js +6 -3
  209. package/src/nodes/lighting/LightProbeNode.js +8 -31
  210. package/src/nodes/lighting/LightingContextNode.js +6 -3
  211. package/src/nodes/lighting/LightingNode.js +7 -3
  212. package/src/nodes/lighting/LightsNode.js +24 -5
  213. package/src/nodes/lighting/PointLightNode.js +11 -7
  214. package/src/nodes/lighting/RectAreaLightNode.js +11 -7
  215. package/src/nodes/lighting/SpotLightNode.js +13 -10
  216. package/src/nodes/math/ConditionalNode.js +23 -6
  217. package/src/nodes/math/MathNode.js +6 -3
  218. package/src/nodes/math/OperatorNode.js +6 -3
  219. package/src/nodes/pmrem/PMREMNode.js +6 -3
  220. package/src/nodes/utils/ArrayElementNode.js +8 -4
  221. package/src/nodes/utils/ConvertNode.js +7 -3
  222. package/src/nodes/utils/CubeMapNode.js +6 -3
  223. package/src/nodes/utils/EquirectUVNode.js +6 -3
  224. package/src/nodes/utils/FlipNode.js +7 -4
  225. package/src/nodes/utils/FunctionOverloadingNode.js +7 -3
  226. package/src/nodes/utils/JoinNode.js +6 -3
  227. package/src/nodes/utils/LoopNode.js +7 -3
  228. package/src/nodes/utils/MatcapUVNode.js +6 -3
  229. package/src/nodes/utils/MaxMipLevelNode.js +6 -3
  230. package/src/nodes/utils/OscNode.js +7 -3
  231. package/src/nodes/utils/RTTNode.js +6 -3
  232. package/src/nodes/utils/ReflectorNode.js +8 -5
  233. package/src/nodes/utils/RemapNode.js +7 -3
  234. package/src/nodes/utils/RotateNode.js +6 -3
  235. package/src/nodes/utils/SetNode.js +7 -4
  236. package/src/nodes/utils/SplitNode.js +7 -3
  237. package/src/nodes/utils/SpriteSheetUVNode.js +7 -3
  238. package/src/nodes/utils/StorageArrayElementNode.js +9 -8
  239. package/src/nodes/utils/TimerNode.js +6 -3
  240. package/src/nodes/utils/TriplanarTexturesNode.js +7 -3
  241. package/src/nodes/utils/ViewportUtils.js +2 -2
  242. package/src/objects/BatchedMesh.js +76 -10
  243. package/src/objects/LOD.js +21 -0
  244. package/src/objects/Line.js +1 -0
  245. package/src/objects/Mesh.js +7 -23
  246. package/src/objects/Points.js +2 -0
  247. package/src/renderers/WebGLRenderer.js +64 -41
  248. package/src/renderers/common/BundleGroup.js +26 -0
  249. package/src/renderers/common/ClippingContext.js +4 -3
  250. package/src/renderers/common/RenderContext.js +4 -5
  251. package/src/renderers/common/RenderObject.js +116 -5
  252. package/src/renderers/common/RenderObjects.js +8 -1
  253. package/src/renderers/common/Renderer.js +57 -49
  254. package/src/renderers/common/extras/PMREMGenerator.js +7 -9
  255. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  256. package/src/renderers/common/nodes/Nodes.js +33 -14
  257. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  258. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  259. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  260. package/src/renderers/webgl/WebGLProgram.js +2 -0
  261. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  262. package/src/renderers/webgl/WebGLState.js +21 -0
  263. package/src/renderers/webgl/WebGLTextures.js +22 -0
  264. package/src/renderers/webgl-fallback/WebGLBackend.js +50 -45
  265. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +4 -4
  266. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  267. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -4
  268. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +61 -16
  269. package/src/renderers/webgpu/WebGPUBackend.js +33 -25
  270. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  271. package/src/renderers/webgpu/WebGPURenderer.js +5 -2
  272. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  273. package/src/renderers/{common → webgpu}/nodes/StandardNodeLibrary.js +11 -11
  274. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +91 -11
  275. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  276. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +1 -1
  277. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +7 -5
  278. package/src/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  279. package/src/utils.js +33 -1
  280. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  281. package/examples/jsm/loaders/TiltLoader.js +0 -520
  282. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  283. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  284. package/src/nodes/display/ViewportNode.js +0 -138
  285. package/src/nodes/lighting/LightNode.js +0 -57
  286. package/src/renderers/common/StandardRenderer.js +0 -18
@@ -124,7 +124,6 @@ export * from './loaders/TDSLoader.js';
124
124
  export * from './loaders/TGALoader.js';
125
125
  export * from './loaders/TIFFLoader.js';
126
126
  export * from './loaders/TTFLoader.js';
127
- export * from './loaders/TiltLoader.js';
128
127
  export * from './loaders/USDZLoader.js';
129
128
  export * from './loaders/VOXLoader.js';
130
129
  export * from './loaders/VRMLLoader.js';
@@ -172,9 +171,6 @@ export * from './objects/ShadowMesh.js';
172
171
  export * from './objects/Sky.js';
173
172
  export * from './objects/Water.js';
174
173
  export { Water as Water2 } from './objects/Water2.js';
175
- export * from './objects/SkyMesh.js';
176
- export * from './objects/WaterMesh.js';
177
- export { WaterMesh as Water2Mesh } from './objects/Water2Mesh.js';
178
174
 
179
175
  export * from './physics/AmmoPhysics.js';
180
176
  export * from './physics/RapierPhysics.js';
@@ -271,11 +267,9 @@ export * from './textures/FlakesTexture.js';
271
267
 
272
268
  export * as BufferGeometryUtils from './utils/BufferGeometryUtils.js';
273
269
  export * as CameraUtils from './utils/CameraUtils.js';
274
- export * from './utils/GPUStatsPanel.js';
275
270
  export * as GeometryCompressionUtils from './utils/GeometryCompressionUtils.js';
276
271
  export * as GeometryUtils from './utils/GeometryUtils.js';
277
272
  export * from './utils/LDrawUtils.js';
278
- export * from './utils/PackedPhongMaterial.js';
279
273
  export * as SceneUtils from './utils/SceneUtils.js';
280
274
  export * from './utils/ShadowMapViewer.js';
281
275
  export * as SkeletonUtils from './utils/SkeletonUtils.js';
@@ -618,23 +618,43 @@ function onKeyDown( event ) {
618
618
 
619
619
  function onMouseDown( event ) {
620
620
 
621
- if ( this.state === _STATE.NONE ) {
621
+ let mouseAction;
622
622
 
623
- switch ( event.button ) {
623
+ switch ( event.button ) {
624
624
 
625
- case this.mouseButtons.LEFT:
626
- this.state = _STATE.ROTATE;
627
- break;
625
+ case 0:
626
+ mouseAction = this.mouseButtons.LEFT;
627
+ break;
628
+
629
+ case 1:
630
+ mouseAction = this.mouseButtons.MIDDLE;
631
+ break;
628
632
 
629
- case this.mouseButtons.MIDDLE:
630
- this.state = _STATE.ZOOM;
631
- break;
633
+ case 2:
634
+ mouseAction = this.mouseButtons.RIGHT;
635
+ break;
632
636
 
633
- case this.mouseButtons.RIGHT:
634
- this.state = _STATE.PAN;
635
- break;
637
+ default:
638
+ mouseAction = - 1;
636
639
 
637
- }
640
+ }
641
+
642
+ switch ( mouseAction ) {
643
+
644
+ case MOUSE.DOLLY:
645
+ this.state = _STATE.ZOOM;
646
+ break;
647
+
648
+ case MOUSE.ROTATE:
649
+ this.state = _STATE.ROTATE;
650
+ break;
651
+
652
+ case MOUSE.PAN:
653
+ this.state = _STATE.PAN;
654
+ break;
655
+
656
+ default:
657
+ this.state = _STATE.NONE;
638
658
 
639
659
  }
640
660
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  BoxGeometry,
3
3
  BufferGeometry,
4
+ Controls,
4
5
  CylinderGeometry,
5
6
  DoubleSide,
6
7
  Euler,
@@ -36,32 +37,22 @@ const _mouseDownEvent = { type: 'mouseDown', mode: null };
36
37
  const _mouseUpEvent = { type: 'mouseUp', mode: null };
37
38
  const _objectChangeEvent = { type: 'objectChange' };
38
39
 
39
- class TransformControls extends Object3D {
40
+ class TransformControls extends Controls {
40
41
 
41
- constructor( camera, domElement ) {
42
+ constructor( camera, domElement = null ) {
42
43
 
43
- super();
44
-
45
- if ( domElement === undefined ) {
46
-
47
- console.warn( 'THREE.TransformControls: The second parameter "domElement" is now mandatory.' );
48
- domElement = document;
44
+ super( undefined, domElement );
49
45
 
50
- }
46
+ const root = new TransformControlsRoot( this );
47
+ this._root = root;
51
48
 
52
- this.isTransformControls = true;
49
+ const gizmo = new TransformControlsGizmo();
50
+ this._gizmo = gizmo;
51
+ root.add( gizmo );
53
52
 
54
- this.visible = false;
55
- this.domElement = domElement;
56
- this.domElement.style.touchAction = 'none'; // disable touch scroll
57
-
58
- const _gizmo = new TransformControlsGizmo();
59
- this._gizmo = _gizmo;
60
- this.add( _gizmo );
61
-
62
- const _plane = new TransformControlsPlane();
63
- this._plane = _plane;
64
- this.add( _plane );
53
+ const plane = new TransformControlsPlane();
54
+ this._plane = plane;
55
+ root.add( plane );
65
56
 
66
57
  const scope = this;
67
58
 
@@ -83,8 +74,8 @@ class TransformControls extends Object3D {
83
74
  if ( propValue !== value ) {
84
75
 
85
76
  propValue = value;
86
- _plane[ propName ] = value;
87
- _gizmo[ propName ] = value;
77
+ plane[ propName ] = value;
78
+ gizmo[ propName ] = value;
88
79
 
89
80
  scope.dispatchEvent( { type: propName + '-changed', value: value } );
90
81
  scope.dispatchEvent( _changeEvent );
@@ -96,8 +87,8 @@ class TransformControls extends Object3D {
96
87
  } );
97
88
 
98
89
  scope[ propName ] = defaultValue;
99
- _plane[ propName ] = defaultValue;
100
- _gizmo[ propName ] = defaultValue;
90
+ plane[ propName ] = defaultValue;
91
+ gizmo[ propName ] = defaultValue;
101
92
 
102
93
  }
103
94
 
@@ -172,50 +163,38 @@ class TransformControls extends Object3D {
172
163
  this._onPointerMove = onPointerMove.bind( this );
173
164
  this._onPointerUp = onPointerUp.bind( this );
174
165
 
175
- this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
176
- this.domElement.addEventListener( 'pointermove', this._onPointerHover );
177
- this.domElement.addEventListener( 'pointerup', this._onPointerUp );
178
-
179
- }
180
-
181
- // updateMatrixWorld updates key transformation variables
182
- updateMatrixWorld( force ) {
183
-
184
- if ( this.object !== undefined ) {
166
+ if ( domElement !== null ) {
185
167
 
186
- this.object.updateMatrixWorld();
187
-
188
- if ( this.object.parent === null ) {
189
-
190
- console.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );
191
-
192
- } else {
168
+ this.connect();
193
169
 
194
- this.object.parent.matrixWorld.decompose( this._parentPosition, this._parentQuaternion, this._parentScale );
170
+ }
195
171
 
196
- }
172
+ }
197
173
 
198
- this.object.matrixWorld.decompose( this.worldPosition, this.worldQuaternion, this._worldScale );
174
+ connect() {
199
175
 
200
- this._parentQuaternionInv.copy( this._parentQuaternion ).invert();
201
- this._worldQuaternionInv.copy( this.worldQuaternion ).invert();
176
+ this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
177
+ this.domElement.addEventListener( 'pointermove', this._onPointerHover );
178
+ this.domElement.addEventListener( 'pointerup', this._onPointerUp );
202
179
 
203
- }
180
+ this.domElement.style.touchAction = 'none'; // disable touch scroll
204
181
 
205
- this.camera.updateMatrixWorld();
206
- this.camera.matrixWorld.decompose( this.cameraPosition, this.cameraQuaternion, this._cameraScale );
182
+ }
207
183
 
208
- if ( this.camera.isOrthographicCamera ) {
184
+ disconnect() {
209
185
 
210
- this.camera.getWorldDirection( this.eye ).negate();
186
+ this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );
187
+ this.domElement.removeEventListener( 'pointermove', this._onPointerHover );
188
+ this.domElement.removeEventListener( 'pointermove', this._onPointerMove );
189
+ this.domElement.removeEventListener( 'pointerup', this._onPointerUp );
211
190
 
212
- } else {
191
+ this.domElement.style.touchAction = 'auto';
213
192
 
214
- this.eye.copy( this.cameraPosition ).sub( this.worldPosition ).normalize();
193
+ }
215
194
 
216
- }
195
+ getHelper() {
217
196
 
218
- super.updateMatrixWorld( force );
197
+ return this._root;
219
198
 
220
199
  }
221
200
 
@@ -555,10 +534,7 @@ class TransformControls extends Object3D {
555
534
 
556
535
  dispose() {
557
536
 
558
- this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );
559
- this.domElement.removeEventListener( 'pointermove', this._onPointerHover );
560
- this.domElement.removeEventListener( 'pointermove', this._onPointerMove );
561
- this.domElement.removeEventListener( 'pointerup', this._onPointerUp );
537
+ this.disconnect();
562
538
 
563
539
  this.traverse( function ( child ) {
564
540
 
@@ -573,7 +549,7 @@ class TransformControls extends Object3D {
573
549
  attach( object ) {
574
550
 
575
551
  this.object = object;
576
- this.visible = true;
552
+ this._root.visible = true;
577
553
 
578
554
  return this;
579
555
 
@@ -583,9 +559,10 @@ class TransformControls extends Object3D {
583
559
  detach() {
584
560
 
585
561
  this.object = undefined;
586
- this.visible = false;
587
562
  this.axis = null;
588
563
 
564
+ this._root.visible = false;
565
+
589
566
  return this;
590
567
 
591
568
  }
@@ -778,6 +755,64 @@ const _v1 = new Vector3();
778
755
  const _v2 = new Vector3();
779
756
  const _v3 = new Vector3();
780
757
 
758
+ class TransformControlsRoot extends Object3D {
759
+
760
+ constructor( controls ) {
761
+
762
+ super();
763
+
764
+ this.isTransformControlsRoot = true;
765
+
766
+ this.controls = controls;
767
+ this.visible = false;
768
+
769
+ }
770
+
771
+ // updateMatrixWorld updates key transformation variables
772
+ updateMatrixWorld( force ) {
773
+
774
+ const controls = this.controls;
775
+
776
+ if ( controls.object !== undefined ) {
777
+
778
+ controls.object.updateMatrixWorld();
779
+
780
+ if ( controls.object.parent === null ) {
781
+
782
+ console.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );
783
+
784
+ } else {
785
+
786
+ controls.object.parent.matrixWorld.decompose( controls._parentPosition, controls._parentQuaternion, controls._parentScale );
787
+
788
+ }
789
+
790
+ controls.object.matrixWorld.decompose( controls.worldPosition, controls.worldQuaternion, controls._worldScale );
791
+
792
+ controls._parentQuaternionInv.copy( controls._parentQuaternion ).invert();
793
+ controls._worldQuaternionInv.copy( controls.worldQuaternion ).invert();
794
+
795
+ }
796
+
797
+ controls.camera.updateMatrixWorld();
798
+ controls.camera.matrixWorld.decompose( controls.cameraPosition, controls.cameraQuaternion, controls._cameraScale );
799
+
800
+ if ( controls.camera.isOrthographicCamera ) {
801
+
802
+ controls.camera.getWorldDirection( controls.eye ).negate();
803
+
804
+ } else {
805
+
806
+ controls.eye.copy( controls.cameraPosition ).sub( controls.worldPosition ).normalize();
807
+
808
+ }
809
+
810
+ super.updateMatrixWorld( force );
811
+
812
+ }
813
+
814
+ }
815
+
781
816
  class TransformControlsGizmo extends Object3D {
782
817
 
783
818
  constructor() {
@@ -1,4 +1,4 @@
1
- import { Color } from 'three';
1
+ import { Color, ColorManagement, SRGBColorSpace } from 'three';
2
2
 
3
3
  /**
4
4
  * Export draco compressed files from threejs geometry objects.
@@ -227,7 +227,9 @@ function createVertexColorSRGBArray( attribute ) {
227
227
 
228
228
  for ( let i = 0, il = count; i < il; i ++ ) {
229
229
 
230
- _color.fromBufferAttribute( attribute, i ).convertLinearToSRGB();
230
+ _color.fromBufferAttribute( attribute, i );
231
+
232
+ ColorManagement.fromWorkingColorSpace( _color, SRGBColorSpace );
231
233
 
232
234
  array[ i * itemSize ] = _color.r;
233
235
  array[ i * itemSize + 1 ] = _color.g;
@@ -21,20 +21,20 @@ const ZIP_COMPRESSION = 3;
21
21
 
22
22
  class EXRExporter {
23
23
 
24
- parse( arg1, arg2, arg3 ) {
24
+ async parse( arg1, arg2, arg3 ) {
25
25
 
26
- if ( ! arg1 || ! ( arg1.isWebGLRenderer || arg1.isDataTexture ) ) {
26
+ if ( ! arg1 || ! ( arg1.isWebGLRenderer || arg1.isWebGPURenderer || arg1.isDataTexture ) ) {
27
27
 
28
28
  throw Error( 'EXRExporter.parse: Unsupported first parameter, expected instance of WebGLRenderer or DataTexture.' );
29
29
 
30
- } else if ( arg1.isWebGLRenderer ) {
30
+ } else if ( arg1.isWebGLRenderer || arg1.isWebGPURenderer ) {
31
31
 
32
32
  const renderer = arg1, renderTarget = arg2, options = arg3;
33
33
 
34
34
  supportedRTT( renderTarget );
35
35
 
36
36
  const info = buildInfoRTT( renderTarget, options ),
37
- dataBuffer = getPixelData( renderer, renderTarget, info ),
37
+ dataBuffer = await getPixelData( renderer, renderTarget, info ),
38
38
  rawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),
39
39
  chunks = compressData( rawContentBuffer, info );
40
40
 
@@ -61,7 +61,7 @@ class EXRExporter {
61
61
 
62
62
  function supportedRTT( renderTarget ) {
63
63
 
64
- if ( ! renderTarget || ! renderTarget.isWebGLRenderTarget ) {
64
+ if ( ! renderTarget || ! renderTarget.isRenderTarget ) {
65
65
 
66
66
  throw Error( 'EXRExporter.parse: Unsupported second parameter, expected instance of WebGLRenderTarget.' );
67
67
 
@@ -189,22 +189,30 @@ function buildInfoDT( texture, options = {} ) {
189
189
 
190
190
  }
191
191
 
192
- function getPixelData( renderer, rtt, info ) {
192
+ async function getPixelData( renderer, rtt, info ) {
193
193
 
194
194
  let dataBuffer;
195
195
 
196
- if ( info.type === FloatType ) {
196
+ if ( renderer.isWebGLRenderer ) {
197
197
 
198
- dataBuffer = new Float32Array( info.width * info.height * info.numInputChannels );
198
+ if ( info.type === FloatType ) {
199
+
200
+ dataBuffer = new Float32Array( info.width * info.height * info.numInputChannels );
201
+
202
+ } else {
203
+
204
+ dataBuffer = new Uint16Array( info.width * info.height * info.numInputChannels );
205
+
206
+ }
207
+
208
+ await renderer.readRenderTargetPixelsAsync( rtt, 0, 0, info.width, info.height, dataBuffer );
199
209
 
200
210
  } else {
201
211
 
202
- dataBuffer = new Uint16Array( info.width * info.height * info.numInputChannels );
212
+ dataBuffer = await renderer.readRenderTargetPixelsAsync( rtt, 0, 0, info.width, info.height );
203
213
 
204
214
  }
205
215
 
206
- renderer.readRenderTargetPixels( rtt, 0, 0, info.width, info.height, dataBuffer );
207
-
208
216
  return dataBuffer;
209
217
 
210
218
  }
@@ -111,7 +111,7 @@ const ERROR_COLOR_SPACE = 'THREE.KTX2Exporter: Supported color spaces are SRGBCo
111
111
 
112
112
  export class KTX2Exporter {
113
113
 
114
- parse( arg1, arg2 ) {
114
+ async parse( arg1, arg2 ) {
115
115
 
116
116
  let texture;
117
117
 
@@ -119,9 +119,9 @@ export class KTX2Exporter {
119
119
 
120
120
  texture = arg1;
121
121
 
122
- } else if ( arg1.isWebGLRenderer && arg2.isWebGLRenderTarget ) {
122
+ } else if ( ( arg1.isWebGLRenderer || arg1.isWebGPURenderer ) && arg2.isRenderTarget ) {
123
123
 
124
- texture = toDataTexture( arg1, arg2 );
124
+ texture = await toDataTexture( arg1, arg2 );
125
125
 
126
126
  } else {
127
127
 
@@ -235,32 +235,40 @@ export class KTX2Exporter {
235
235
 
236
236
  }
237
237
 
238
- function toDataTexture( renderer, rtt ) {
238
+ async function toDataTexture( renderer, rtt ) {
239
239
 
240
240
  const channelCount = getChannelCount( rtt.texture );
241
241
 
242
242
  let view;
243
243
 
244
- if ( rtt.texture.type === FloatType ) {
244
+ if ( renderer.isWebGLRenderer ) {
245
245
 
246
- view = new Float32Array( rtt.width * rtt.height * channelCount );
246
+ if ( rtt.texture.type === FloatType ) {
247
247
 
248
- } else if ( rtt.texture.type === HalfFloatType ) {
248
+ view = new Float32Array( rtt.width * rtt.height * channelCount );
249
249
 
250
- view = new Uint16Array( rtt.width * rtt.height * channelCount );
250
+ } else if ( rtt.texture.type === HalfFloatType ) {
251
251
 
252
- } else if ( rtt.texture.type === UnsignedByteType ) {
252
+ view = new Uint16Array( rtt.width * rtt.height * channelCount );
253
253
 
254
- view = new Uint8Array( rtt.width * rtt.height * channelCount );
254
+ } else if ( rtt.texture.type === UnsignedByteType ) {
255
+
256
+ view = new Uint8Array( rtt.width * rtt.height * channelCount );
257
+
258
+ } else {
259
+
260
+ throw new Error( ERROR_TYPE );
261
+
262
+ }
263
+
264
+ await renderer.readRenderTargetPixelsAsync( rtt, 0, 0, rtt.width, rtt.height, view );
255
265
 
256
266
  } else {
257
267
 
258
- throw new Error( ERROR_TYPE );
268
+ view = await renderer.readRenderTargetPixelsAsync( rtt, 0, 0, rtt.width, rtt.height );
259
269
 
260
270
  }
261
271
 
262
- renderer.readRenderTargetPixels( rtt, 0, 0, rtt.width, rtt.height, view );
263
-
264
272
  return new DataTexture( view, rtt.width, rtt.height, rtt.texture.format, rtt.texture.type );
265
273
 
266
274
  }
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  Color,
3
+ ColorManagement,
3
4
  Matrix3,
5
+ SRGBColorSpace,
4
6
  Vector2,
5
7
  Vector3
6
8
  } from 'three';
@@ -226,7 +228,9 @@ class OBJExporter {
226
228
 
227
229
  if ( colors !== undefined ) {
228
230
 
229
- color.fromBufferAttribute( colors, i ).convertLinearToSRGB();
231
+ color.fromBufferAttribute( colors, i );
232
+
233
+ ColorManagement.fromWorkingColorSpace( color, SRGBColorSpace );
230
234
 
231
235
  output += ' ' + color.r + ' ' + color.g + ' ' + color.b;
232
236
 
@@ -1,7 +1,9 @@
1
1
  import {
2
2
  Matrix3,
3
3
  Vector3,
4
- Color
4
+ Color,
5
+ ColorManagement,
6
+ SRGBColorSpace
5
7
  } from 'three';
6
8
 
7
9
  /**
@@ -302,9 +304,9 @@ class PLYExporter {
302
304
 
303
305
  if ( colors != null ) {
304
306
 
305
- tempColor
306
- .fromBufferAttribute( colors, i )
307
- .convertLinearToSRGB();
307
+ tempColor.fromBufferAttribute( colors, i );
308
+
309
+ ColorManagement.fromWorkingColorSpace( tempColor, SRGBColorSpace );
308
310
 
309
311
  output.setUint8( vOffset, Math.floor( tempColor.r * 255 ) );
310
312
  vOffset += 1;
@@ -461,9 +463,9 @@ class PLYExporter {
461
463
 
462
464
  if ( colors != null ) {
463
465
 
464
- tempColor
465
- .fromBufferAttribute( colors, i )
466
- .convertLinearToSRGB();
466
+ tempColor.fromBufferAttribute( colors, i );
467
+
468
+ ColorManagement.fromWorkingColorSpace( tempColor, SRGBColorSpace );
467
469
 
468
470
  line += ' ' +
469
471
  Math.floor( tempColor.r * 255 ) + ' ' +
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  BufferGeometry,
3
3
  Float32BufferAttribute,
4
+ Matrix3,
4
5
  Matrix4,
5
6
  Vector3
6
7
  } from 'three';
@@ -36,6 +37,8 @@ class DecalGeometry extends BufferGeometry {
36
37
 
37
38
  const plane = new Vector3();
38
39
 
40
+ const normalMatrix = new Matrix3().getNormalMatrix( mesh.matrixWorld );
41
+
39
42
  // this matrix represents the transformation of the decal projector
40
43
 
41
44
  const projectorMatrix = new Matrix4();
@@ -146,7 +149,7 @@ class DecalGeometry extends BufferGeometry {
146
149
  vertex.applyMatrix4( mesh.matrixWorld );
147
150
  vertex.applyMatrix4( projectorMatrixInverse );
148
151
 
149
- normal.transformDirection( mesh.matrixWorld );
152
+ normal.applyNormalMatrix( normalMatrix );
150
153
 
151
154
  decalVertices.push( new DecalVertex( vertex.clone(), normal.clone() ) );
152
155
 
@@ -20,7 +20,7 @@ class InstancedPointsGeometry extends InstancedBufferGeometry {
20
20
  this.type = 'InstancedPointsGeometry';
21
21
 
22
22
  const positions = [ - 1, 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];
23
- const uvs = [ - 1, 1, 1, 1, - 1, - 1, 1, - 1 ];
23
+ const uvs = [ 0, 1, 1, 1, 0, 0, 1, 0 ];
24
24
  const index = [ 0, 2, 1, 2, 3, 1 ];
25
25
 
26
26
  this.setIndex( index );
@@ -6,7 +6,7 @@ import {
6
6
 
7
7
  class LightProbeHelper extends Mesh {
8
8
 
9
- constructor( lightProbe, size ) {
9
+ constructor( lightProbe, size = 1 ) {
10
10
 
11
11
  const material = new ShaderMaterial( {
12
12
 
@@ -0,0 +1,65 @@
1
+ import {
2
+ Mesh,
3
+ NodeMaterial,
4
+ SphereGeometry
5
+ } from 'three';
6
+ import { float, Fn, getShIrradianceAt, normalWorld, uniformArray, uniform, vec4 } from 'three/tsl';
7
+
8
+ class LightProbeHelper extends Mesh {
9
+
10
+ constructor( lightProbe, size = 1 ) {
11
+
12
+ const sh = uniformArray( lightProbe.sh.coefficients );
13
+ const intensity = uniform( lightProbe.intensity );
14
+
15
+ const RECIPROCAL_PI = float( 1 / Math.PI );
16
+
17
+ const fragmentNode = Fn( () => {
18
+
19
+ const irradiance = getShIrradianceAt( normalWorld, sh );
20
+
21
+ const outgoingLight = RECIPROCAL_PI.mul( irradiance ).mul( intensity );
22
+
23
+ return vec4( outgoingLight, 1.0 );
24
+
25
+ } )();
26
+
27
+ const material = new NodeMaterial();
28
+ material.fragmentNode = fragmentNode;
29
+
30
+ const geometry = new SphereGeometry( 1, 32, 16 );
31
+
32
+ super( geometry, material );
33
+
34
+ this.lightProbe = lightProbe;
35
+ this.size = size;
36
+ this.type = 'LightProbeHelper';
37
+
38
+ this._intensity = intensity;
39
+ this._sh = sh;
40
+
41
+ this.onBeforeRender();
42
+
43
+ }
44
+
45
+ dispose() {
46
+
47
+ this.geometry.dispose();
48
+ this.material.dispose();
49
+
50
+ }
51
+
52
+ onBeforeRender() {
53
+
54
+ this.position.copy( this.lightProbe.position );
55
+
56
+ this.scale.set( 1, 1, 1 ).multiplyScalar( this.size );
57
+
58
+ this._intensity.value = this.lightProbe.intensity;
59
+ this._sh.array = this.lightProbe.sh.coefficients;
60
+
61
+ }
62
+
63
+ }
64
+
65
+ export { LightProbeHelper };