super-three 0.156.0 → 0.157.1

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 (223) hide show
  1. package/build/three.cjs +753 -277
  2. package/build/three.js +753 -277
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +750 -276
  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/csm/CSMShader.js +25 -21
  9. package/examples/jsm/exporters/EXRExporter.js +102 -24
  10. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  11. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  14. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  15. package/examples/jsm/lines/LineMaterial.js +90 -156
  16. package/examples/jsm/loaders/3DMLoader.js +378 -104
  17. package/examples/jsm/loaders/GLTFLoader.js +1 -1
  18. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  19. package/examples/jsm/loaders/RGBELoader.js +1 -1
  20. package/examples/jsm/loaders/USDZLoader.js +215 -12
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  22. package/examples/jsm/nodes/Nodes.js +5 -1
  23. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  24. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +2 -2
  25. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  26. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -2
  28. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +6 -5
  29. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  30. package/examples/jsm/nodes/accessors/LineMaterialNode.js +7 -9
  31. package/examples/jsm/nodes/accessors/MaterialNode.js +34 -46
  32. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +9 -9
  33. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  35. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  36. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  38. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  39. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  40. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  41. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  42. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  45. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  47. package/examples/jsm/nodes/accessors/TextureNode.js +12 -6
  48. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  49. package/examples/jsm/nodes/accessors/TextureStoreNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  52. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  53. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  54. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  55. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  56. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  57. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  58. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  59. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  60. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  61. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  62. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  63. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  64. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  65. package/examples/jsm/nodes/core/InputNode.js +1 -1
  66. package/examples/jsm/nodes/core/Node.js +28 -13
  67. package/examples/jsm/nodes/core/NodeBuilder.js +3 -17
  68. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  69. package/examples/jsm/nodes/core/OutputStructNode.js +8 -4
  70. package/examples/jsm/nodes/core/PropertyNode.js +3 -3
  71. package/examples/jsm/nodes/core/StackNode.js +1 -1
  72. package/examples/jsm/nodes/core/StructTypeNode.js +1 -1
  73. package/examples/jsm/nodes/core/TempNode.js +1 -1
  74. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  75. package/examples/jsm/nodes/core/VarNode.js +1 -1
  76. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  77. package/examples/jsm/nodes/core/constants.js +1 -1
  78. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  79. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  82. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  83. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  84. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  85. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  86. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  87. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  88. package/examples/jsm/nodes/display/ViewportNode.js +2 -2
  89. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  90. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  91. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  92. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  93. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  94. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  95. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  97. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  98. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  99. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  100. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  101. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  102. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  103. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  105. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  106. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  107. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  108. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  109. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  111. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +2 -2
  112. package/examples/jsm/nodes/materials/Materials.js +1 -0
  113. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  114. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  115. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  116. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  117. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  118. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  119. package/examples/jsm/nodes/materials/NodeMaterial.js +27 -26
  120. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  121. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  122. package/examples/jsm/nodes/math/CondNode.js +1 -1
  123. package/examples/jsm/nodes/math/HashNode.js +8 -9
  124. package/examples/jsm/nodes/math/MathNode.js +2 -2
  125. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  126. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  127. package/examples/jsm/nodes/shadernode/ShaderNode.js +81 -28
  128. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  129. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  130. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  131. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  132. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  133. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  134. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  135. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  136. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  137. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  138. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  139. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  140. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  141. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  142. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  143. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  144. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  145. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  146. package/examples/jsm/objects/Sky.js +1 -3
  147. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  148. package/examples/jsm/renderers/common/Background.js +2 -2
  149. package/examples/jsm/renderers/common/Bindings.js +3 -5
  150. package/examples/jsm/renderers/common/Pipelines.js +7 -7
  151. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  152. package/examples/jsm/renderers/common/RenderObject.js +40 -16
  153. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  154. package/examples/jsm/renderers/common/Renderer.js +40 -13
  155. package/examples/jsm/renderers/common/SampledTexture.js +4 -2
  156. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  157. package/examples/jsm/renderers/common/Textures.js +14 -9
  158. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  159. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +20 -10
  160. package/examples/jsm/renderers/common/nodes/NodeSampler.js +0 -6
  161. package/examples/jsm/renderers/common/nodes/Nodes.js +51 -24
  162. package/examples/jsm/renderers/webgl/WebGLBackend.js +100 -5
  163. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +92 -6
  164. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +13 -0
  165. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +3 -3
  166. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +14 -2
  167. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +5 -5
  168. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +6 -3
  169. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +5 -5
  170. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  171. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +197 -167
  172. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  173. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  174. package/examples/jsm/shaders/OutputShader.js +2 -2
  175. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  176. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  177. package/package.json +1 -1
  178. package/src/Three.js +0 -2
  179. package/src/animation/AnimationUtils.js +3 -20
  180. package/src/animation/KeyframeTrack.js +8 -8
  181. package/src/cameras/Camera.js +1 -5
  182. package/src/cameras/CubeCamera.js +14 -8
  183. package/src/constants.js +7 -1
  184. package/src/core/RenderTarget.js +16 -7
  185. package/src/extras/core/CurvePath.js +4 -1
  186. package/src/loaders/MaterialLoader.js +1 -1
  187. package/src/loaders/ObjectLoader.js +6 -0
  188. package/src/materials/Material.js +8 -8
  189. package/src/math/Color.js +1 -5
  190. package/src/math/ColorManagement.js +82 -60
  191. package/src/objects/Sprite.js +2 -2
  192. package/src/renderers/WebGLMultiviewRenderTarget.js +35 -0
  193. package/src/renderers/WebGLRenderer.js +78 -22
  194. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  195. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  196. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  197. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  198. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  199. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  200. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  201. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  202. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  203. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  204. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  206. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  207. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  208. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  209. package/src/renderers/shaders/UniformsUtils.js +2 -2
  210. package/src/renderers/webgl/WebGLBackground.js +5 -4
  211. package/src/renderers/webgl/WebGLLights.js +14 -3
  212. package/src/renderers/webgl/WebGLMultiview.js +100 -0
  213. package/src/renderers/webgl/WebGLProgram.js +84 -5
  214. package/src/renderers/webgl/WebGLPrograms.js +11 -2
  215. package/src/renderers/webgl/WebGLTextures.js +214 -26
  216. package/src/renderers/webgl/WebGLUtils.js +21 -23
  217. package/src/renderers/webxr/WebXRManager.js +36 -12
  218. package/src/scenes/Fog.js +1 -0
  219. package/src/scenes/FogExp2.js +1 -0
  220. package/src/textures/Source.js +2 -2
  221. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  222. package/src/lights/AmbientLightProbe.js +0 -21
  223. package/src/lights/HemisphereLightProbe.js +0 -30
@@ -0,0 +1,62 @@
1
+ import { addNodeClass } from '../core/Node.js';
2
+ import TempNode from '../core/TempNode.js';
3
+ import { vectorComponents } from '../core/constants.js';
4
+
5
+ class SetNode extends TempNode {
6
+
7
+ constructor( sourceNode, components, targetNode ) {
8
+
9
+ super();
10
+
11
+ this.sourceNode = sourceNode;
12
+ this.components = components;
13
+ this.targetNode = targetNode;
14
+
15
+ }
16
+
17
+ getNodeType( builder ) {
18
+
19
+ return this.sourceNode.getNodeType( builder );
20
+
21
+ }
22
+
23
+ generate( builder ) {
24
+
25
+ const { sourceNode, components, targetNode } = this;
26
+
27
+ const sourceType = this.getNodeType( builder );
28
+ const targetType = builder.getTypeFromLength( components.length );
29
+
30
+ const targetSnippet = targetNode.build( builder, targetType );
31
+ const sourceSnippet = sourceNode.build( builder, sourceType );
32
+
33
+ const length = builder.getTypeLength( sourceType );
34
+ const snippetValues = [];
35
+
36
+ for ( let i = 0; i < length; i ++ ) {
37
+
38
+ const component = vectorComponents[ i ];
39
+
40
+ if ( component === components[ 0 ] ) {
41
+
42
+ snippetValues.push( targetSnippet );
43
+
44
+ i += components.length - 1;
45
+
46
+ } else {
47
+
48
+ snippetValues.push( sourceSnippet + '.' + component );
49
+
50
+ }
51
+
52
+ }
53
+
54
+ return `${ builder.getType( sourceType ) }( ${ snippetValues.join( ', ' ) } )`;
55
+
56
+ }
57
+
58
+ }
59
+
60
+ export default SetNode;
61
+
62
+ addNodeClass( 'SetNode', SetNode );
@@ -13,7 +13,7 @@ class SpecularMIPLevelNode extends Node {
13
13
 
14
14
  }
15
15
 
16
- construct() {
16
+ setup() {
17
17
 
18
18
  const { textureNode, roughnessNode } = this;
19
19
 
@@ -34,4 +34,4 @@ export default SpecularMIPLevelNode;
34
34
 
35
35
  export const specularMIPLevel = nodeProxy( SpecularMIPLevelNode );
36
36
 
37
- addNodeClass( SpecularMIPLevelNode );
37
+ addNodeClass( 'SpecularMIPLevelNode', SpecularMIPLevelNode );
@@ -101,4 +101,4 @@ class SplitNode extends Node {
101
101
 
102
102
  export default SplitNode;
103
103
 
104
- addNodeClass( SplitNode );
104
+ addNodeClass( 'SplitNode', SplitNode );
@@ -14,7 +14,7 @@ class SpriteSheetUVNode extends Node {
14
14
 
15
15
  }
16
16
 
17
- construct() {
17
+ setup() {
18
18
 
19
19
  const { frameNode, uvNode, countNode } = this;
20
20
 
@@ -38,4 +38,4 @@ export default SpriteSheetUVNode;
38
38
 
39
39
  export const spritesheetUV = nodeProxy( SpriteSheetUVNode );
40
40
 
41
- addNodeClass( SpriteSheetUVNode );
41
+ addNodeClass( 'SpriteSheetUVNode', SpriteSheetUVNode );
@@ -89,6 +89,6 @@ export default TimerNode;
89
89
  export const timerLocal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.LOCAL, timeScale, value ) );
90
90
  export const timerGlobal = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.GLOBAL, timeScale, value ) );
91
91
  export const timerDelta = ( timeScale, value = 0 ) => nodeObject( new TimerNode( TimerNode.DELTA, timeScale, value ) );
92
- export const frameId = nodeImmutable( TimerNode, TimerNode.FRAME );
92
+ export const frameId = nodeImmutable( TimerNode, TimerNode.FRAME ).uint();
93
93
 
94
- addNodeClass( TimerNode );
94
+ addNodeClass( 'TimerNode', TimerNode );
@@ -22,7 +22,7 @@ class TriplanarTexturesNode extends Node {
22
22
 
23
23
  }
24
24
 
25
- construct() {
25
+ setup() {
26
26
 
27
27
  const { textureXNode, textureYNode, textureZNode, scaleNode, positionNode, normalNode } = this;
28
28
 
@@ -59,4 +59,4 @@ export const triplanarTexture = ( ...params ) => triplanarTextures( ...params );
59
59
 
60
60
  addNodeElement( 'triplanarTexture', triplanarTexture );
61
61
 
62
- addNodeClass( TriplanarTexturesNode );
62
+ addNodeClass( 'TriplanarTexturesNode', TriplanarTexturesNode );
@@ -138,8 +138,6 @@ Sky.SkyShader = {
138
138
  uniform float mieDirectionalG;
139
139
  uniform vec3 up;
140
140
 
141
- const vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );
142
-
143
141
  // constants for atmospheric scattering
144
142
  const float pi = 3.141592653589793238462643383279502884197169;
145
143
 
@@ -169,7 +167,7 @@ Sky.SkyShader = {
169
167
 
170
168
  void main() {
171
169
 
172
- vec3 direction = normalize( vWorldPosition - cameraPos );
170
+ vec3 direction = normalize( vWorldPosition - cameraPosition );
173
171
 
174
172
  // optical length
175
173
  // cutoff angle at 90 to avoid singularity in next formula.
@@ -1,11 +1,12 @@
1
1
  import {
2
+ ColorManagement,
2
3
  RawShaderMaterial,
3
4
  UniformsUtils,
4
5
  LinearToneMapping,
5
6
  ReinhardToneMapping,
6
7
  CineonToneMapping,
7
8
  ACESFilmicToneMapping,
8
- SRGBColorSpace
9
+ SRGBTransfer
9
10
  } from 'three';
10
11
  import { Pass, FullScreenQuad } from './Pass.js';
11
12
  import { OutputShader } from '../shaders/OutputShader.js';
@@ -51,7 +52,7 @@ class OutputPass extends Pass {
51
52
 
52
53
  this.material.defines = {};
53
54
 
54
- if ( this._outputColorSpace == SRGBColorSpace ) this.material.defines.SRGB_COLOR_SPACE = '';
55
+ if ( ColorManagement.getTransfer( this._outputColorSpace ) === SRGBTransfer ) this.material.defines.SRGB_TRANSFER = '';
55
56
 
56
57
  if ( this._toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';
57
58
  else if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';
@@ -1,6 +1,6 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import { Color, Mesh, SphereGeometry, BackSide } from 'three';
3
- import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
3
+ import { context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
4
4
 
5
5
  let _clearAlpha;
6
6
  const _clearColor = new Color();
@@ -60,7 +60,7 @@ class Background extends DataMap {
60
60
  } ).mul( backgroundIntensity );
61
61
 
62
62
  let viewProj = modelViewProjection();
63
- viewProj = vec4( viewProj.x, viewProj.y, viewProj.w, viewProj.w );
63
+ viewProj = viewProj.setZ( viewProj.w );
64
64
 
65
65
  const nodeMaterial = new NodeMaterial();
66
66
  nodeMaterial.outputNode = this.backgroundMeshNode;
@@ -48,9 +48,9 @@ class Bindings extends DataMap {
48
48
 
49
49
  if ( data.bindings === undefined ) {
50
50
 
51
- const nodeBuilder = this.nodes.getForCompute( computeNode );
51
+ const nodeBuilderState = this.nodes.getForCompute( computeNode );
52
52
 
53
- const bindings = nodeBuilder.getBindings();
53
+ const bindings = nodeBuilderState.bindings;
54
54
 
55
55
  data.bindings = bindings;
56
56
 
@@ -82,9 +82,7 @@ class Bindings extends DataMap {
82
82
 
83
83
  if ( binding.isSampledTexture ) {
84
84
 
85
- const store = binding.store === true;
86
-
87
- this.textures.updateTexture( binding.texture, { store } );
85
+ this.textures.updateTexture( binding.texture );
88
86
 
89
87
  } else if ( binding.isStorageBuffer ) {
90
88
 
@@ -109,31 +109,31 @@ class Pipelines extends DataMap {
109
109
 
110
110
  // get shader
111
111
 
112
- const nodeBuilder = this.nodes.getForRender( renderObject );
112
+ const nodeBuilderState = renderObject.getNodeBuilderState();
113
113
 
114
114
  // programmable stages
115
115
 
116
- let stageVertex = this.programs.vertex.get( nodeBuilder.vertexShader );
116
+ let stageVertex = this.programs.vertex.get( nodeBuilderState.vertexShader );
117
117
 
118
118
  if ( stageVertex === undefined ) {
119
119
 
120
120
  if ( previousPipeline && previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram );
121
121
 
122
- stageVertex = new ProgrammableStage( nodeBuilder.vertexShader, 'vertex' );
123
- this.programs.vertex.set( nodeBuilder.vertexShader, stageVertex );
122
+ stageVertex = new ProgrammableStage( nodeBuilderState.vertexShader, 'vertex' );
123
+ this.programs.vertex.set( nodeBuilderState.vertexShader, stageVertex );
124
124
 
125
125
  backend.createProgram( stageVertex );
126
126
 
127
127
  }
128
128
 
129
- let stageFragment = this.programs.fragment.get( nodeBuilder.fragmentShader );
129
+ let stageFragment = this.programs.fragment.get( nodeBuilderState.fragmentShader );
130
130
 
131
131
  if ( stageFragment === undefined ) {
132
132
 
133
133
  if ( previousPipeline && previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram );
134
134
 
135
- stageFragment = new ProgrammableStage( nodeBuilder.fragmentShader, 'fragment' );
136
- this.programs.fragment.set( nodeBuilder.fragmentShader, stageFragment );
135
+ stageFragment = new ProgrammableStage( nodeBuilderState.fragmentShader, 'fragment' );
136
+ this.programs.fragment.set( nodeBuilderState.fragmentShader, stageFragment );
137
137
 
138
138
  backend.createProgram( stageFragment );
139
139
 
@@ -31,6 +31,9 @@ class RenderContext {
31
31
  this.activeCubeFace = 0;
32
32
  this.sampleCount = 1;
33
33
 
34
+ this.width = 0;
35
+ this.height = 0;
36
+
34
37
  }
35
38
 
36
39
  }
@@ -18,15 +18,16 @@ export default class RenderObject {
18
18
  this.context = renderContext;
19
19
 
20
20
  this.geometry = object.geometry;
21
+ this.version = material.version;
21
22
 
22
23
  this.attributes = null;
23
24
  this.pipeline = null;
24
25
  this.vertexBuffers = null;
25
26
 
26
- this._nodeBuilder = null;
27
+ this.initialCacheKey = this.getCacheKey();
28
+
29
+ this._nodeBuilderState = null;
27
30
  this._bindings = null;
28
- this._materialVersion = - 1;
29
- this._materialCacheKey = '';
30
31
 
31
32
  this.onDispose = null;
32
33
 
@@ -42,15 +43,15 @@ export default class RenderObject {
42
43
 
43
44
  }
44
45
 
45
- getNodeBuilder() {
46
+ getNodeBuilderState() {
46
47
 
47
- return this._nodeBuilder || ( this._nodeBuilder = this._nodes.getForRender( this ) );
48
+ return this._nodeBuilderState || ( this._nodeBuilderState = this._nodes.getForRender( this ) );
48
49
 
49
50
  }
50
51
 
51
52
  getBindings() {
52
53
 
53
- return this._bindings || ( this._bindings = this.getNodeBuilder().createBindings() );
54
+ return this._bindings || ( this._bindings = this.getNodeBuilderState().createBindings() );
54
55
 
55
56
  }
56
57
 
@@ -70,7 +71,7 @@ export default class RenderObject {
70
71
 
71
72
  if ( this.attributes !== null ) return this.attributes;
72
73
 
73
- const nodeAttributes = this.getNodeBuilder().getAttributesArray();
74
+ const nodeAttributes = this.getNodeBuilderState().nodeAttributes;
74
75
  const geometry = this.geometry;
75
76
 
76
77
  const attributes = [];
@@ -102,23 +103,46 @@ export default class RenderObject {
102
103
 
103
104
  }
104
105
 
105
- getCacheKey() {
106
+ getMaterialCacheKey() {
107
+
108
+ const material = this.material;
109
+
110
+ let cacheKey = material.customProgramCacheKey();
111
+
112
+ for ( const property in material ) {
113
+
114
+ if ( /^(is[A-Z])|^(visible|version|uuid|name|opacity|userData)$/.test( property ) ) continue;
115
+
116
+ let value = material[ property ];
117
+
118
+ if ( value !== null ) {
119
+
120
+ const type = typeof value;
106
121
 
107
- const { material, scene, lightsNode } = this;
122
+ if ( type === 'number' ) value = value !== 0 ? '1' : '0'; // Convert to on/off, important for clearcoat, transmission, etc
123
+ else if ( type === 'object' ) value = '{}';
108
124
 
109
- if ( material.version !== this._materialVersion ) {
125
+ }
110
126
 
111
- this._materialVersion = material.version;
112
- this._materialCacheKey = material.customProgramCacheKey();
127
+ cacheKey += /*property + ':' +*/ value + ',';
113
128
 
114
129
  }
115
130
 
116
- const cacheKey = [];
131
+ return cacheKey;
117
132
 
118
- cacheKey.push( 'material:' + this._materialCacheKey );
119
- cacheKey.push( 'nodes:' + this._nodes.getCacheKey( scene, lightsNode ) );
133
+ }
134
+
135
+ getNodesCacheKey() {
136
+
137
+ // Environment Nodes Cache Key
138
+
139
+ return this._nodes.getCacheKey( this.scene, this.lightsNode );
140
+
141
+ }
142
+
143
+ getCacheKey() {
120
144
 
121
- return '{' + cacheKey.join( ',' ) + '}';
145
+ return `{material:${ this.getMaterialCacheKey() },nodes:${ this.getNodesCacheKey()}`;
122
146
 
123
147
  }
124
148
 
@@ -1,4 +1,3 @@
1
- import DataMap from './DataMap.js';
2
1
  import ChainMap from './ChainMap.js';
3
2
  import RenderObject from './RenderObject.js';
4
3
 
@@ -14,7 +13,6 @@ class RenderObjects {
14
13
  this.info = info;
15
14
 
16
15
  this.chainMaps = {};
17
- this.dataMap = new DataMap();
18
16
 
19
17
  }
20
18
 
@@ -33,14 +31,17 @@ class RenderObjects {
33
31
 
34
32
  } else {
35
33
 
36
- const data = this.dataMap.get( renderObject );
37
- const cacheKey = renderObject.getCacheKey();
34
+ if ( renderObject.version !== material.version ) {
38
35
 
39
- if ( data.cacheKey !== cacheKey ) {
36
+ renderObject.version = material.version;
40
37
 
41
- renderObject.dispose();
38
+ if ( renderObject.initialCacheKey !== renderObject.getCacheKey() ) {
42
39
 
43
- renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
40
+ renderObject.dispose();
41
+
42
+ renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
43
+
44
+ }
44
45
 
45
46
  }
46
47
 
@@ -59,24 +60,17 @@ class RenderObjects {
59
60
  dispose() {
60
61
 
61
62
  this.chainMaps = {};
62
- this.dataMap = new DataMap();
63
63
 
64
64
  }
65
65
 
66
66
  createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, passId ) {
67
67
 
68
68
  const chainMap = this.getChainMap( passId );
69
- const dataMap = this.dataMap;
70
69
 
71
70
  const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext );
72
71
 
73
- const data = dataMap.get( renderObject );
74
- data.cacheKey = renderObject.getCacheKey();
75
-
76
72
  renderObject.onDispose = () => {
77
73
 
78
- dataMap.delete( renderObject );
79
-
80
74
  this.pipelines.delete( renderObject );
81
75
  this.bindings.delete( renderObject );
82
76
  this.nodes.delete( renderObject );
@@ -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;
@@ -274,21 +280,28 @@ 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
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
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;
292
305
  renderContext.occlusionQueryCount = renderList.occlusionQueryCount;
293
306
 
294
307
  //
@@ -329,6 +342,18 @@ class Renderer {
329
342
 
330
343
  }
331
344
 
345
+ getActiveCubeFace() {
346
+
347
+ return this._activeCubeFace;
348
+
349
+ }
350
+
351
+ getActiveMipmapLevel() {
352
+
353
+ return this._activeMipmapLevel;
354
+
355
+ }
356
+
332
357
  setAnimationLoop( callback ) {
333
358
 
334
359
  if ( this._initialized === false ) this.init();
@@ -587,12 +612,13 @@ class Renderer {
587
612
 
588
613
  dispose() {
589
614
 
615
+ this.info.dispose();
616
+
590
617
  this._objects.dispose();
591
618
  this._properties.dispose();
592
619
  this._pipelines.dispose();
593
620
  this._nodes.dispose();
594
621
  this._bindings.dispose();
595
- this._info.dispose();
596
622
  this._renderLists.dispose();
597
623
  this._renderContexts.dispose();
598
624
  this._textures.dispose();
@@ -602,10 +628,11 @@ class Renderer {
602
628
 
603
629
  }
604
630
 
605
- setRenderTarget( renderTarget, activeCubeFace = 0 ) {
631
+ setRenderTarget( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
606
632
 
607
633
  this._renderTarget = renderTarget;
608
634
  this._activeCubeFace = activeCubeFace;
635
+ this._activeMipmapLevel = activeMipmapLevel;
609
636
 
610
637
  }
611
638
 
@@ -895,7 +922,7 @@ class Renderer {
895
922
 
896
923
  //
897
924
 
898
- this.backend.draw( renderObject, this._info );
925
+ this.backend.draw( renderObject, this.info );
899
926
 
900
927
  }
901
928
 
@@ -28,9 +28,11 @@ class SampledTexture extends Binding {
28
28
 
29
29
  update() {
30
30
 
31
- if ( this.version !== this.texture.version ) {
31
+ const { texture, version } = this;
32
+
33
+ if ( version !== texture.version ) {
32
34
 
33
- this.version = this.texture.version;
35
+ this.version = texture.version;
34
36
 
35
37
  return true;
36
38
 
@@ -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;