super-three 0.155.0 → 0.157.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 (268) hide show
  1. package/build/three.cjs +361 -324
  2. package/build/three.js +361 -324
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +354 -323
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/capabilities/WebGL.js +17 -0
  7. package/examples/jsm/controls/DragControls.js +3 -2
  8. package/examples/jsm/controls/OrbitControls.js +13 -5
  9. package/examples/jsm/csm/CSMShader.js +59 -21
  10. package/examples/jsm/exporters/EXRExporter.js +102 -24
  11. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  15. package/examples/jsm/libs/tween.module.js +790 -735
  16. package/examples/jsm/libs/utif.module.js +1644 -1558
  17. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  18. package/examples/jsm/lines/LineMaterial.js +90 -156
  19. package/examples/jsm/loaders/3DMLoader.js +378 -104
  20. package/examples/jsm/loaders/DDSLoader.js +46 -3
  21. package/examples/jsm/loaders/EXRLoader.js +4 -4
  22. package/examples/jsm/loaders/FBXLoader.js +2 -0
  23. package/examples/jsm/loaders/GLTFLoader.js +18 -8
  24. package/examples/jsm/loaders/KTX2Loader.js +126 -77
  25. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  26. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  27. package/examples/jsm/loaders/MMDLoader.js +10 -7
  28. package/examples/jsm/loaders/RGBELoader.js +48 -66
  29. package/examples/jsm/loaders/STLLoader.js +7 -0
  30. package/examples/jsm/loaders/USDZLoader.js +215 -12
  31. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  32. package/examples/jsm/nodes/Nodes.js +8 -1
  33. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +30 -4
  35. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  36. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/CubeTextureNode.js +19 -4
  38. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +4 -5
  39. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/LineMaterialNode.js +29 -0
  41. package/examples/jsm/nodes/accessors/MaterialNode.js +23 -13
  42. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +12 -9
  43. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  44. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  45. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  46. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/Object3DNode.js +3 -3
  48. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  49. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  51. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  52. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  54. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  55. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  56. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  57. package/examples/jsm/nodes/accessors/TextureNode.js +18 -8
  58. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  60. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  61. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  62. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  63. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  64. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  65. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  66. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  67. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  68. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  69. package/examples/jsm/nodes/core/AttributeNode.js +3 -3
  70. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  71. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  72. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  73. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  74. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  75. package/examples/jsm/nodes/core/InputNode.js +1 -1
  76. package/examples/jsm/nodes/core/Node.js +45 -14
  77. package/examples/jsm/nodes/core/NodeBuilder.js +83 -15
  78. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  79. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  80. package/examples/jsm/nodes/core/OutputStructNode.js +62 -0
  81. package/examples/jsm/nodes/core/PropertyNode.js +3 -1
  82. package/examples/jsm/nodes/core/StackNode.js +5 -5
  83. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  84. package/examples/jsm/nodes/core/TempNode.js +1 -1
  85. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  86. package/examples/jsm/nodes/core/VarNode.js +1 -1
  87. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  88. package/examples/jsm/nodes/core/constants.js +1 -1
  89. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  90. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  91. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  92. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  93. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  94. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  95. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  96. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  97. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  98. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  99. package/examples/jsm/nodes/display/ViewportNode.js +21 -7
  100. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  101. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  102. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  103. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  104. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  105. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  106. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  107. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  108. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  110. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  111. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  112. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  113. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  114. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  115. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  116. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  117. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  118. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  119. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  120. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  121. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  122. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  123. package/examples/jsm/nodes/materials/Materials.js +2 -0
  124. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  125. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  126. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  127. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  128. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  129. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  130. package/examples/jsm/nodes/materials/NodeMaterial.js +39 -29
  131. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  132. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  133. package/examples/jsm/nodes/math/CondNode.js +1 -1
  134. package/examples/jsm/nodes/math/HashNode.js +34 -0
  135. package/examples/jsm/nodes/math/MathNode.js +2 -2
  136. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  137. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  138. package/examples/jsm/nodes/shadernode/ShaderNode.js +85 -28
  139. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  140. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  141. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  142. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  143. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  144. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  145. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  146. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  147. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  148. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  149. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  150. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  151. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  152. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  153. package/examples/jsm/nodes/utils/SplitNode.js +2 -2
  154. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  155. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  156. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  157. package/examples/jsm/objects/Sky.js +1 -3
  158. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  159. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  160. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  161. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  162. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  163. package/examples/jsm/renderers/common/Backend.js +11 -8
  164. package/examples/jsm/renderers/common/Background.js +2 -2
  165. package/examples/jsm/renderers/common/Binding.js +6 -0
  166. package/examples/jsm/renderers/common/Bindings.js +4 -5
  167. package/examples/jsm/renderers/common/Pipelines.js +9 -9
  168. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  169. package/examples/jsm/renderers/common/RenderContexts.js +26 -1
  170. package/examples/jsm/renderers/common/RenderList.js +12 -4
  171. package/examples/jsm/renderers/common/RenderObject.js +43 -15
  172. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  173. package/examples/jsm/renderers/common/Renderer.js +52 -16
  174. package/examples/jsm/renderers/common/SampledTexture.js +6 -3
  175. package/examples/jsm/renderers/common/Sampler.js +1 -1
  176. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  177. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  178. package/examples/jsm/renderers/common/Textures.js +166 -21
  179. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  180. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +21 -11
  181. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -7
  182. package/examples/jsm/renderers/common/nodes/Nodes.js +79 -18
  183. package/examples/jsm/renderers/webgl/WebGLBackend.js +702 -0
  184. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +207 -20
  185. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  186. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  187. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  188. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +212 -0
  189. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  190. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  191. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +4 -4
  192. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +14 -2
  193. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +282 -43
  194. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  195. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +93 -60
  196. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  197. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +15 -2
  198. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -14
  199. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  200. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +205 -284
  201. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +6 -5
  202. package/examples/jsm/shaders/FilmShader.js +11 -54
  203. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  204. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  205. package/examples/jsm/shaders/OutputShader.js +2 -2
  206. package/examples/jsm/shaders/SAOShader.js +0 -13
  207. package/examples/jsm/shaders/SSAOShader.js +33 -26
  208. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  209. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  210. package/package.json +1 -1
  211. package/src/Three.js +1 -2
  212. package/src/animation/AnimationUtils.js +3 -20
  213. package/src/animation/KeyframeTrack.js +8 -8
  214. package/src/audio/Audio.js +6 -0
  215. package/src/cameras/Camera.js +1 -5
  216. package/src/cameras/CubeCamera.js +14 -8
  217. package/src/constants.js +10 -1
  218. package/src/core/Object3D.js +1 -14
  219. package/src/core/RenderTarget.js +16 -7
  220. package/src/core/UniformsGroup.js +2 -2
  221. package/src/extras/core/CurvePath.js +4 -1
  222. package/src/loaders/DataTextureLoader.js +0 -2
  223. package/src/loaders/MaterialLoader.js +1 -1
  224. package/src/loaders/ObjectLoader.js +6 -0
  225. package/src/materials/Material.js +10 -10
  226. package/src/math/Color.js +1 -5
  227. package/src/math/ColorManagement.js +82 -60
  228. package/src/math/Vector2.js +2 -2
  229. package/src/math/Vector3.js +3 -3
  230. package/src/math/Vector4.js +4 -4
  231. package/src/objects/Line.js +1 -1
  232. package/src/objects/Mesh.js +1 -1
  233. package/src/objects/Points.js +1 -1
  234. package/src/objects/Sprite.js +2 -2
  235. package/src/renderers/WebGLRenderer.js +42 -51
  236. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  237. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  238. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  239. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  240. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  241. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  242. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  243. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  244. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  245. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  246. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  247. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  248. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  249. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  250. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  251. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  252. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  253. package/src/renderers/shaders/UniformsUtils.js +2 -2
  254. package/src/renderers/webgl/WebGLBackground.js +9 -17
  255. package/src/renderers/webgl/WebGLLights.js +14 -3
  256. package/src/renderers/webgl/WebGLProgram.js +36 -5
  257. package/src/renderers/webgl/WebGLPrograms.js +9 -1
  258. package/src/renderers/webgl/WebGLTextures.js +19 -8
  259. package/src/renderers/webgl/WebGLUtils.js +25 -20
  260. package/src/scenes/Fog.js +1 -0
  261. package/src/scenes/FogExp2.js +1 -0
  262. package/src/textures/Source.js +2 -2
  263. package/src/textures/Texture.js +2 -2
  264. package/src/utils.js +9 -1
  265. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  266. package/src/lights/AmbientLightProbe.js +0 -21
  267. package/src/lights/HemisphereLightProbe.js +0 -30
  268. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
@@ -46,6 +46,8 @@ class Renderer {
46
46
  this.depth = true;
47
47
  this.stencil = true;
48
48
 
49
+ this.info = new Info();
50
+
49
51
  // internals
50
52
 
51
53
  this._pixelRatio = 1;
@@ -56,7 +58,6 @@ class Renderer {
56
58
  this._scissor = new Vector4( 0, 0, this._width, this._height );
57
59
  this._scissorTest = false;
58
60
 
59
- this._info = null;
60
61
  this._properties = null;
61
62
  this._attributes = null;
62
63
  this._geometries = null;
@@ -83,7 +84,8 @@ class Renderer {
83
84
  this._clearStencil = 0;
84
85
 
85
86
  this._renderTarget = null;
86
- this._currentActiveCubeFace = 0;
87
+ this._activeCubeFace = 0;
88
+ this._activeMipmapLevel = 0;
87
89
 
88
90
  this._initialized = false;
89
91
  this._initPromise = null;
@@ -130,15 +132,14 @@ class Renderer {
130
132
 
131
133
  }
132
134
 
133
- this._info = new Info();
134
135
  this._nodes = new Nodes( this, backend );
135
136
  this._attributes = new Attributes( backend );
136
137
  this._background = new Background( this, this._nodes );
137
- this._geometries = new Geometries( this._attributes, this._info );
138
- this._textures = new Textures( backend, this._info );
138
+ this._geometries = new Geometries( this._attributes, this.info );
139
+ this._textures = new Textures( backend, this.info );
139
140
  this._pipelines = new Pipelines( backend, this._nodes );
140
- this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this._info );
141
- this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this._info );
141
+ this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
142
+ this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
142
143
  this._renderLists = new RenderLists();
143
144
  this._renderContexts = new RenderContexts();
144
145
 
@@ -187,6 +188,7 @@ class Renderer {
187
188
  const renderTarget = this._renderTarget;
188
189
  const renderContext = this._renderContexts.get( scene, camera, renderTarget );
189
190
  const activeCubeFace = this._activeCubeFace;
191
+ const activeMipmapLevel = this._activeMipmapLevel;
190
192
 
191
193
  this._currentRenderContext = renderContext;
192
194
 
@@ -212,9 +214,9 @@ class Renderer {
212
214
 
213
215
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
214
216
 
215
- if ( this._info.autoReset === true ) this._info.reset();
217
+ if ( this.info.autoReset === true ) this.info.reset();
216
218
 
217
- this._info.render.frame ++;
219
+ this.info.render.frame ++;
218
220
 
219
221
  //
220
222
 
@@ -238,12 +240,16 @@ class Renderer {
238
240
  const maxDepth = ( viewport.maxDepth === undefined ) ? 1 : viewport.maxDepth;
239
241
 
240
242
  renderContext.viewportValue.copy( viewport ).multiplyScalar( pixelRatio ).floor();
243
+ renderContext.viewportValue.width >>= activeMipmapLevel;
244
+ renderContext.viewportValue.height >>= activeMipmapLevel;
241
245
  renderContext.viewportValue.minDepth = minDepth;
242
246
  renderContext.viewportValue.maxDepth = maxDepth;
243
247
  renderContext.viewport = renderContext.viewportValue.equals( _screen ) === false;
244
248
 
245
249
  renderContext.scissorValue.copy( scissor ).multiplyScalar( pixelRatio ).floor();
246
250
  renderContext.scissor = this._scissorTest && renderContext.scissorValue.equals( _screen ) === false;
251
+ renderContext.scissorValue.width >>= activeMipmapLevel;
252
+ renderContext.scissorValue.height >>= activeMipmapLevel;
247
253
 
248
254
  renderContext.depth = this.depth;
249
255
  renderContext.stencil = this.stencil;
@@ -258,7 +264,7 @@ class Renderer {
258
264
  _frustum.setFromProjectionMatrix( _projScreenMatrix, coordinateSystem );
259
265
 
260
266
  const renderList = this._renderLists.get( scene, camera );
261
- renderList.init();
267
+ renderList.begin();
262
268
 
263
269
  this._projectObject( scene, camera, 0, renderList );
264
270
 
@@ -274,21 +280,29 @@ class Renderer {
274
280
 
275
281
  if ( renderTarget !== null ) {
276
282
 
277
- this._textures.updateRenderTarget( renderTarget );
283
+ this._textures.updateRenderTarget( renderTarget, activeMipmapLevel );
278
284
 
279
285
  const renderTargetData = this._textures.get( renderTarget );
280
286
 
281
- renderContext.texture = renderTargetData.texture;
287
+ renderContext.textures = renderTargetData.textures;
282
288
  renderContext.depthTexture = renderTargetData.depthTexture;
289
+ renderContext.width = renderTargetData.width;
290
+ renderContext.height = renderTargetData.height;
283
291
 
284
292
  } else {
285
293
 
286
- renderContext.texture = null;
294
+ renderContext.textures = null;
287
295
  renderContext.depthTexture = null;
296
+ renderContext.width = this.domElement.width;
297
+ renderContext.height = this.domElement.height;
288
298
 
289
299
  }
290
300
 
301
+ renderContext.width >>= activeMipmapLevel;
302
+ renderContext.height >>= activeMipmapLevel;
291
303
  renderContext.activeCubeFace = activeCubeFace;
304
+ renderContext.activeMipmapLevel = activeMipmapLevel;
305
+ renderContext.occlusionQueryCount = renderList.occlusionQueryCount;
292
306
 
293
307
  //
294
308
 
@@ -328,6 +342,18 @@ class Renderer {
328
342
 
329
343
  }
330
344
 
345
+ getActiveCubeFace() {
346
+
347
+ return this._activeCubeFace;
348
+
349
+ }
350
+
351
+ getActiveMipmapLevel() {
352
+
353
+ return this._activeMipmapLevel;
354
+
355
+ }
356
+
331
357
  setAnimationLoop( callback ) {
332
358
 
333
359
  if ( this._initialized === false ) this.init();
@@ -550,6 +576,14 @@ class Renderer {
550
576
 
551
577
  }
552
578
 
579
+ isOccluded( object ) {
580
+
581
+ const renderContext = this._currentRenderContext || this._lastRenderContext;
582
+
583
+ return renderContext && this.backend.isOccluded( renderContext, object );
584
+
585
+ }
586
+
553
587
  clear( color = true, depth = true, stencil = true ) {
554
588
 
555
589
  const renderContext = this._currentRenderContext || this._lastRenderContext;
@@ -578,12 +612,13 @@ class Renderer {
578
612
 
579
613
  dispose() {
580
614
 
615
+ this.info.dispose();
616
+
581
617
  this._objects.dispose();
582
618
  this._properties.dispose();
583
619
  this._pipelines.dispose();
584
620
  this._nodes.dispose();
585
621
  this._bindings.dispose();
586
- this._info.dispose();
587
622
  this._renderLists.dispose();
588
623
  this._renderContexts.dispose();
589
624
  this._textures.dispose();
@@ -593,10 +628,11 @@ class Renderer {
593
628
 
594
629
  }
595
630
 
596
- setRenderTarget( renderTarget, activeCubeFace = 0 ) {
631
+ setRenderTarget( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
597
632
 
598
633
  this._renderTarget = renderTarget;
599
634
  this._activeCubeFace = activeCubeFace;
635
+ this._activeMipmapLevel = activeMipmapLevel;
600
636
 
601
637
  }
602
638
 
@@ -886,7 +922,7 @@ class Renderer {
886
922
 
887
923
  //
888
924
 
889
- this.backend.draw( renderObject, this._info );
925
+ this.backend.draw( renderObject, this.info );
890
926
 
891
927
  }
892
928
 
@@ -11,7 +11,8 @@ class SampledTexture extends Binding {
11
11
  this.id = id ++;
12
12
 
13
13
  this.texture = texture;
14
- this.version = texture.version;
14
+ this.version = texture ? texture.version : 0;
15
+ this.store = false;
15
16
 
16
17
  this.isSampledTexture = true;
17
18
 
@@ -27,9 +28,11 @@ class SampledTexture extends Binding {
27
28
 
28
29
  update() {
29
30
 
30
- if ( this.version !== this.texture.version ) {
31
+ const { texture, version } = this;
32
+
33
+ if ( version !== texture.version ) {
31
34
 
32
- this.version = this.texture.version;
35
+ this.version = texture.version;
33
36
 
34
37
  return true;
35
38
 
@@ -7,7 +7,7 @@ class Sampler extends Binding {
7
7
  super( name );
8
8
 
9
9
  this.texture = texture;
10
- this.version = texture.version;
10
+ this.version = texture ? texture.version : 0;
11
11
 
12
12
  this.isSampler = true;
13
13
 
@@ -4,7 +4,7 @@ class StorageBuffer extends Buffer {
4
4
 
5
5
  constructor( name, attribute ) {
6
6
 
7
- super( name, attribute.array );
7
+ super( name, attribute ? attribute.array : null );
8
8
 
9
9
  this.attribute = attribute;
10
10
 
@@ -0,0 +1,19 @@
1
+ import { Texture, LinearFilter } from 'three';
2
+
3
+ class StorageTexture extends Texture {
4
+
5
+ constructor( width = 1, height = 1 ) {
6
+
7
+ super();
8
+
9
+ this.image = { width, height };
10
+
11
+ this.magFilter = LinearFilter;
12
+ this.minFilter = LinearFilter;
13
+
14
+ this.isStorageTexture = true;
15
+
16
+ }
17
+ }
18
+
19
+ export default StorageTexture;
@@ -1,7 +1,8 @@
1
1
  import DataMap from './DataMap.js';
2
- import { Vector2, DepthTexture, DepthStencilFormat, UnsignedInt248Type } from 'three';
3
2
 
4
- const _size = new Vector2();
3
+ import { Vector3, DepthTexture, DepthStencilFormat, UnsignedInt248Type, LinearFilter, NearestFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeReflectionMapping, CubeRefractionMapping } from 'three';
4
+
5
+ const _size = new Vector3();
5
6
 
6
7
  class Textures extends DataMap {
7
8
 
@@ -14,44 +15,65 @@ class Textures extends DataMap {
14
15
 
15
16
  }
16
17
 
17
- updateRenderTarget( renderTarget ) {
18
+ updateRenderTarget( renderTarget, activeMipmapLevel = 0 ) {
18
19
 
19
20
  const renderTargetData = this.get( renderTarget );
21
+
20
22
  const sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
23
+ const depthTextureMips = renderTargetData.depthTextureMips || ( renderTargetData.depthTextureMips = {} );
24
+
25
+ let texture, textures;
26
+
27
+ if ( renderTarget.isWebGLMultipleRenderTargets ) {
28
+
29
+ textures = renderTarget.texture;
30
+ texture = renderTarget.texture[ 0 ];
31
+
32
+ } else {
33
+
34
+ textures = [ renderTarget.texture ];
35
+ texture = renderTarget.texture;
36
+
37
+ }
21
38
 
22
- const texture = renderTarget.texture;
23
39
  const size = this.getSize( texture );
24
40
 
25
- let depthTexture = renderTarget.depthTexture || renderTargetData.depthTexture;
41
+ const mipWidth = size.width >> activeMipmapLevel;
42
+ const mipHeight = size.height >> activeMipmapLevel;
43
+
44
+ let depthTexture = renderTarget.depthTexture || depthTextureMips[ activeMipmapLevel ];
45
+ let textureNeedsUpdate = false;
26
46
 
27
47
  if ( depthTexture === undefined ) {
28
48
 
29
49
  depthTexture = new DepthTexture();
30
50
  depthTexture.format = DepthStencilFormat;
31
51
  depthTexture.type = UnsignedInt248Type;
32
- depthTexture.image.width = size.width;
33
- depthTexture.image.height = size.height;
52
+ depthTexture.image.width = mipWidth;
53
+ depthTexture.image.height = mipHeight;
54
+
55
+ depthTextureMips[ activeMipmapLevel ] = depthTexture;
34
56
 
35
57
  }
36
58
 
37
59
  if ( renderTargetData.width !== size.width || size.height !== renderTargetData.height ) {
38
60
 
39
- texture.needsUpdate = true;
61
+ textureNeedsUpdate = true;
40
62
  depthTexture.needsUpdate = true;
41
63
 
42
- depthTexture.image.width = size.width;
43
- depthTexture.image.height = size.height;
64
+ depthTexture.image.width = mipWidth;
65
+ depthTexture.image.height = mipHeight;
44
66
 
45
67
  }
46
68
 
47
69
  renderTargetData.width = size.width;
48
70
  renderTargetData.height = size.height;
49
- renderTargetData.texture = texture;
71
+ renderTargetData.textures = textures;
50
72
  renderTargetData.depthTexture = depthTexture;
51
73
 
52
74
  if ( renderTargetData.sampleCount !== sampleCount ) {
53
75
 
54
- texture.needsUpdate = true;
76
+ textureNeedsUpdate = true;
55
77
  depthTexture.needsUpdate = true;
56
78
 
57
79
  renderTargetData.sampleCount = sampleCount;
@@ -60,7 +82,17 @@ class Textures extends DataMap {
60
82
 
61
83
  const options = { sampleCount };
62
84
 
63
- this.updateTexture( texture, options );
85
+
86
+ for ( let i = 0; i < textures.length; i ++ ) {
87
+
88
+ const texture = textures[ i ];
89
+
90
+ if ( textureNeedsUpdate ) texture.needsUpdate = true;
91
+
92
+ this.updateTexture( texture, options );
93
+
94
+ }
95
+
64
96
  this.updateTexture( depthTexture, options );
65
97
 
66
98
  // dispose handler
@@ -75,7 +107,20 @@ class Textures extends DataMap {
75
107
 
76
108
  renderTarget.removeEventListener( 'dispose', onDispose );
77
109
 
78
- this._destroyTexture( texture );
110
+ if ( textures !== undefined ) {
111
+
112
+ for ( let i = 0; i < textures.length; i ++ ) {
113
+
114
+ this._destroyTexture( textures[ i ] );
115
+
116
+ }
117
+
118
+ } else {
119
+
120
+ this._destroyTexture( texture );
121
+
122
+ }
123
+
79
124
  this._destroyTexture( depthTexture );
80
125
 
81
126
  };
@@ -105,7 +150,17 @@ class Textures extends DataMap {
105
150
 
106
151
  //
107
152
 
108
- if ( isRenderTarget ) {
153
+ const { width, height, depth } = this.getSize( texture );
154
+
155
+ options.width = width;
156
+ options.height = height;
157
+ options.depth = depth;
158
+ options.needsMipmaps = this.needsMipmaps( texture );
159
+ options.levels = options.needsMipmaps ? this.getMipLevels( texture, width, height ) : 1;
160
+
161
+ //
162
+
163
+ if ( isRenderTarget || texture.isStorageTexture === true ) {
109
164
 
110
165
  backend.createSampler( texture );
111
166
  backend.createTexture( texture, options );
@@ -130,6 +185,24 @@ class Textures extends DataMap {
130
185
 
131
186
  } else {
132
187
 
188
+ if ( texture.images ) {
189
+
190
+ const images = [];
191
+
192
+ for ( const image of texture.images ) {
193
+
194
+ images.push( this._getUploadImage( image ) );
195
+
196
+ }
197
+
198
+ options.images = images;
199
+
200
+ } else {
201
+
202
+ options.image = this._getUploadImage( image );
203
+
204
+ }
205
+
133
206
  if ( textureData.isDefaultTexture === undefined || textureData.isDefaultTexture === true ) {
134
207
 
135
208
  backend.createTexture( texture, options );
@@ -138,7 +211,9 @@ class Textures extends DataMap {
138
211
 
139
212
  }
140
213
 
141
- backend.updateTexture( texture );
214
+ backend.updateTexture( texture, options );
215
+
216
+ if ( options.needsMipmaps ) backend.generateMipmaps( texture );
142
217
 
143
218
  }
144
219
 
@@ -188,15 +263,19 @@ class Textures extends DataMap {
188
263
 
189
264
  getSize( texture, target = _size ) {
190
265
 
191
- if ( texture.isCubeTexture ) {
266
+ let image = texture.images ? texture.images[ 0 ] : texture.image;
267
+
268
+ if ( image ) {
269
+
270
+ if ( image.image !== undefined ) image = image.image;
192
271
 
193
- target.width = texture.image[ 0 ].width;
194
- target.height = texture.image[ 0 ].height;
272
+ target.width = image.width;
273
+ target.height = image.height;
274
+ target.depth = texture.isCubeTexture ? 6 : ( image.depth || 1 );
195
275
 
196
276
  } else {
197
277
 
198
- target.width = texture.image.width;
199
- target.height = texture.image.height;
278
+ target.width = target.height = target.depth = 1;
200
279
 
201
280
  }
202
281
 
@@ -204,6 +283,72 @@ class Textures extends DataMap {
204
283
 
205
284
  }
206
285
 
286
+ getMipLevels( texture, width, height ) {
287
+
288
+ let mipLevelCount;
289
+
290
+ if ( texture.isCompressedTexture ) {
291
+
292
+ mipLevelCount = texture.mipmaps.length;
293
+
294
+ } else {
295
+
296
+ mipLevelCount = Math.floor( Math.log2( Math.max( width, height ) ) ) + 1;
297
+
298
+ }
299
+
300
+ return mipLevelCount;
301
+
302
+ }
303
+
304
+ needsMipmaps( texture ) {
305
+
306
+ if ( this.isEnvironmentTexture( texture ) ) return true;
307
+
308
+ return ( texture.isCompressedTexture !== true ) /*&& ( texture.generateMipmaps === true )*/ && ( texture.minFilter !== NearestFilter ) && ( texture.minFilter !== LinearFilter );
309
+
310
+ }
311
+
312
+ isEnvironmentTexture( texture ) {
313
+
314
+ const mapping = texture.mapping;
315
+
316
+ return ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) || ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
317
+
318
+ }
319
+
320
+ _getUploadImage( image ) {
321
+
322
+ if ( this._isHTMLImage( image ) ) {
323
+
324
+ return this._imageToCanvas( image );
325
+
326
+ }
327
+
328
+ return image;
329
+
330
+ }
331
+
332
+ _imageToCanvas( image ) {
333
+
334
+ const { width, height } = image;
335
+
336
+ // eslint-disable-next-line compat/compat
337
+ const canvas = new OffscreenCanvas( width, height );
338
+
339
+ const context = canvas.getContext( '2d' );
340
+ context.drawImage( image, 0, 0, width, height );
341
+
342
+ return canvas;
343
+
344
+ }
345
+
346
+ _isHTMLImage( image ) {
347
+
348
+ return ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement );
349
+
350
+ }
351
+
207
352
  _destroyTexture( texture ) {
208
353
 
209
354
  this.backend.destroySampler( texture );
@@ -0,0 +1,35 @@
1
+ class NodeBuilderState {
2
+
3
+ constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes ) {
4
+
5
+ this.vertexShader = vertexShader;
6
+ this.fragmentShader = fragmentShader;
7
+ this.computeShader = computeShader;
8
+
9
+ this.nodeAttributes = nodeAttributes;
10
+ this.bindings = bindings;
11
+
12
+ this.updateNodes = updateNodes;
13
+ this.updateBeforeNodes = updateBeforeNodes;
14
+
15
+ this.usedTimes = 0;
16
+
17
+ }
18
+
19
+ createBindings() {
20
+
21
+ const bindingsArray = [];
22
+
23
+ for ( const binding of this.bindings ) {
24
+
25
+ bindingsArray.push( binding.clone() );
26
+
27
+ }
28
+
29
+ return bindingsArray;
30
+
31
+ }
32
+
33
+ }
34
+
35
+ export default NodeBuilderState;
@@ -1,36 +1,46 @@
1
- import { SampledTexture, SampledCubeTexture } from '../SampledTexture.js';
1
+ import { SampledTexture } from '../SampledTexture.js';
2
2
 
3
3
  class NodeSampledTexture extends SampledTexture {
4
4
 
5
5
  constructor( name, textureNode ) {
6
6
 
7
- super( name, textureNode.value );
7
+ super( name, textureNode ? textureNode.value : null );
8
8
 
9
9
  this.textureNode = textureNode;
10
10
 
11
11
  }
12
12
 
13
- getTexture() {
13
+ get needsBindingsUpdate() {
14
14
 
15
- return this.textureNode.value;
15
+ return this.textureNode.value !== this.texture || super.needsBindingsUpdate;
16
16
 
17
17
  }
18
18
 
19
- }
19
+ update() {
20
20
 
21
- class NodeSampledCubeTexture extends SampledCubeTexture {
21
+ const { textureNode } = this;
22
22
 
23
- constructor( name, textureNode ) {
23
+ if ( this.texture !== textureNode.value ) {
24
24
 
25
- super( name, textureNode.value );
25
+ this.texture = textureNode.value;
26
26
 
27
- this.textureNode = textureNode;
27
+ return true;
28
+
29
+ }
30
+
31
+ return super.update();
28
32
 
29
33
  }
30
34
 
31
- getTexture() {
35
+ }
36
+
37
+ class NodeSampledCubeTexture extends NodeSampledTexture {
38
+
39
+ constructor( name, textureNode ) {
40
+
41
+ super( name, textureNode );
32
42
 
33
- return this.textureNode.value;
43
+ this.isSampledCubeTexture = true;
34
44
 
35
45
  }
36
46
 
@@ -4,18 +4,12 @@ class NodeSampler extends Sampler {
4
4
 
5
5
  constructor( name, textureNode ) {
6
6
 
7
- super( name, textureNode.value );
7
+ super( name, textureNode ? textureNode.value : null );
8
8
 
9
9
  this.textureNode = textureNode;
10
10
 
11
11
  }
12
12
 
13
- getTexture() {
14
-
15
- return this.textureNode.value;
16
-
17
- }
18
-
19
13
  }
20
14
 
21
15
  export default NodeSampler;