super-three 0.162.0 → 0.163.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 (122) hide show
  1. package/build/three.cjs +407 -1014
  2. package/build/three.module.js +406 -1013
  3. package/build/three.module.min.js +1 -1
  4. package/examples/jsm/controls/TransformControls.js +3 -3
  5. package/examples/jsm/exporters/GLTFExporter.js +21 -4
  6. package/examples/jsm/exporters/USDZExporter.js +15 -0
  7. package/examples/jsm/geometries/TextGeometry.js +10 -2
  8. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  9. package/examples/jsm/libs/fflate.module.js +694 -496
  10. package/examples/jsm/lines/LineMaterial.js +0 -2
  11. package/examples/jsm/loaders/3MFLoader.js +2 -0
  12. package/examples/jsm/loaders/EXRLoader.js +89 -19
  13. package/examples/jsm/loaders/FBXLoader.js +1 -1
  14. package/examples/jsm/loaders/GLTFLoader.js +6 -0
  15. package/examples/jsm/loaders/KTX2Loader.js +2 -6
  16. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  17. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  18. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  19. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  20. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  21. package/examples/jsm/nodes/Nodes.js +6 -1
  22. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  23. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  24. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  25. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  26. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  27. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  28. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  29. package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
  30. package/examples/jsm/nodes/core/Node.js +55 -4
  31. package/examples/jsm/nodes/core/NodeBuilder.js +21 -16
  32. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  33. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  34. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  35. package/examples/jsm/nodes/display/PassNode.js +17 -1
  36. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  37. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  38. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  39. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  40. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  41. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  42. package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
  43. package/examples/jsm/nodes/materials/NodeMaterial.js +33 -11
  44. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  45. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  46. package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
  47. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  48. package/examples/jsm/objects/QuadMesh.js +7 -23
  49. package/examples/jsm/physics/RapierPhysics.js +4 -4
  50. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  51. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  52. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  53. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  54. package/examples/jsm/renderers/common/Animation.js +3 -0
  55. package/examples/jsm/renderers/common/Background.js +5 -5
  56. package/examples/jsm/renderers/common/Info.js +11 -19
  57. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  58. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  59. package/examples/jsm/renderers/common/RenderObject.js +4 -4
  60. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  61. package/examples/jsm/renderers/common/Renderer.js +25 -8
  62. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
  63. package/examples/jsm/renderers/common/nodes/Nodes.js +5 -18
  64. package/examples/jsm/renderers/webgl/WebGLBackend.js +148 -24
  65. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
  66. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +3 -3
  67. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  68. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  69. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +43 -0
  70. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
  71. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
  72. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
  73. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +54 -25
  74. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +5 -3
  75. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +25 -0
  76. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  77. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  78. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  79. package/examples/jsm/utils/TextureUtils.js +1 -1
  80. package/package.json +1 -1
  81. package/src/Three.js +0 -1
  82. package/src/animation/AnimationClip.js +1 -1
  83. package/src/constants.js +3 -3
  84. package/src/core/Object3D.js +10 -7
  85. package/src/extras/PMREMGenerator.js +9 -0
  86. package/src/loaders/ObjectLoader.js +2 -0
  87. package/src/materials/ShaderMaterial.js +0 -4
  88. package/src/math/Spherical.js +4 -5
  89. package/src/objects/BatchedMesh.js +4 -3
  90. package/src/objects/InstancedMesh.js +10 -0
  91. package/src/renderers/WebGLRenderer.js +55 -114
  92. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  93. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  94. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  95. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  96. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  97. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  98. package/src/renderers/shaders/ShaderLib.js +1 -1
  99. package/src/renderers/shaders/UniformsUtils.js +10 -1
  100. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  101. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  102. package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
  103. package/src/renderers/webgl/WebGLCapabilities.js +2 -12
  104. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  105. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  106. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
  107. package/src/renderers/webgl/WebGLLights.js +6 -32
  108. package/src/renderers/webgl/WebGLMaterials.js +2 -3
  109. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  110. package/src/renderers/webgl/WebGLProgram.js +18 -47
  111. package/src/renderers/webgl/WebGLPrograms.js +20 -32
  112. package/src/renderers/webgl/WebGLRenderStates.js +8 -6
  113. package/src/renderers/webgl/WebGLState.js +15 -59
  114. package/src/renderers/webgl/WebGLTextures.js +75 -237
  115. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  116. package/src/renderers/webgl/WebGLUtils.js +6 -57
  117. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  118. package/src/renderers/webxr/WebXRManager.js +2 -2
  119. package/src/scenes/Scene.js +7 -1
  120. package/src/textures/Texture.js +11 -1
  121. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  122. package/src/renderers/WebGL1Renderer.js +0 -7
@@ -1,17 +1,14 @@
1
1
  import LightingNode from './LightingNode.js';
2
2
  import { cache } from '../core/CacheNode.js';
3
3
  import { context } from '../core/ContextNode.js';
4
- import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
5
4
  import { roughness, clearcoatRoughness } from '../core/PropertyNode.js';
6
- import { equirectUV } from '../utils/EquirectUVNode.js';
7
- import { specularMIPLevel } from '../utils/SpecularMIPLevelNode.js';
8
5
  import { cameraViewMatrix } from '../accessors/CameraNode.js';
9
6
  import { transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld } from '../accessors/NormalNode.js';
10
7
  import { positionViewDirection } from '../accessors/PositionNode.js';
11
8
  import { addNodeClass } from '../core/Node.js';
12
- import { vec2 } from '../shadernode/ShaderNode.js';
13
- import { cubeTexture } from '../accessors/CubeTextureNode.js';
9
+ import { float } from '../shadernode/ShaderNode.js';
14
10
  import { reference } from '../accessors/ReferenceNode.js';
11
+ import { pmremTexture } from '../pmrem/PMREMNode.js';
15
12
 
16
13
  const envNodeCache = new WeakMap();
17
14
 
@@ -29,19 +26,13 @@ class EnvironmentNode extends LightingNode {
29
26
 
30
27
  let envNode = this.envNode;
31
28
 
32
- if ( envNode.isTextureNode && envNode.value.isCubeTexture !== true ) {
29
+ if ( envNode.isTextureNode ) {
33
30
 
34
31
  let cacheEnvNode = envNodeCache.get( envNode.value );
35
32
 
36
33
  if ( cacheEnvNode === undefined ) {
37
34
 
38
- const texture = envNode.value;
39
- const renderer = builder.renderer;
40
-
41
- // @TODO: Add dispose logic here
42
- const cubeRTT = builder.getCubeRenderTarget( 512 ).fromEquirectangularTexture( renderer, texture );
43
-
44
- cacheEnvNode = cubeTexture( cubeRTT.texture );
35
+ cacheEnvNode = pmremTexture( envNode.value );
45
36
 
46
37
  envNodeCache.set( envNode.value, cacheEnvNode );
47
38
 
@@ -53,7 +44,8 @@ class EnvironmentNode extends LightingNode {
53
44
 
54
45
  //
55
46
 
56
- const intensity = reference( 'envMapIntensity', 'float', builder.material ); // @TODO: Add materialEnvIntensity in MaterialNode
47
+ const envMap = builder.material.envMap;
48
+ const intensity = envMap ? reference( 'envMapIntensity', 'float', builder.material ) : reference( 'environmentIntensity', 'float', builder.scene ); // @TODO: Add materialEnvIntensity in MaterialNode
57
49
 
58
50
  const radiance = context( envNode, createRadianceContext( roughness, transformedNormalView ) ).mul( intensity );
59
51
  const irradiance = context( envNode, createIrradianceContext( transformedNormalWorld ) ).mul( Math.PI ).mul( intensity );
@@ -86,12 +78,9 @@ class EnvironmentNode extends LightingNode {
86
78
  const createRadianceContext = ( roughnessNode, normalViewNode ) => {
87
79
 
88
80
  let reflectVec = null;
89
- let textureUVNode = null;
90
81
 
91
82
  return {
92
- getUV: ( textureNode ) => {
93
-
94
- let node = null;
83
+ getUV: () => {
95
84
 
96
85
  if ( reflectVec === null ) {
97
86
 
@@ -101,36 +90,13 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
101
90
 
102
91
  }
103
92
 
104
- if ( textureNode.isCubeTextureNode ) {
105
-
106
- node = reflectVec;
107
-
108
- } else if ( textureNode.isTextureNode ) {
109
-
110
- if ( textureUVNode === null ) {
111
-
112
- // @TODO: Needed PMREM
113
-
114
- textureUVNode = equirectUV( reflectVec );
115
-
116
- }
117
-
118
- node = textureUVNode;
119
-
120
- }
121
-
122
- return node;
93
+ return reflectVec;
123
94
 
124
95
  },
125
96
  getTextureLevel: () => {
126
97
 
127
98
  return roughnessNode;
128
99
 
129
- },
130
- getTextureLevelAlgorithm: ( textureNode, levelNode ) => {
131
-
132
- return specularMIPLevel( textureNode, levelNode );
133
-
134
100
  }
135
101
  };
136
102
 
@@ -138,38 +104,15 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
138
104
 
139
105
  const createIrradianceContext = ( normalWorldNode ) => {
140
106
 
141
- let textureUVNode = null;
142
-
143
107
  return {
144
- getUV: ( textureNode ) => {
145
-
146
- let node = null;
147
-
148
- if ( textureNode.isCubeTextureNode ) {
149
-
150
- node = normalWorldNode;
151
-
152
- } else if ( textureNode.isTextureNode ) {
153
-
154
- if ( textureUVNode === null ) {
108
+ getUV: () => {
155
109
 
156
- // @TODO: Needed PMREM
157
-
158
- textureUVNode = equirectUV( normalWorldNode );
159
- textureUVNode = vec2( textureUVNode.x, textureUVNode.y.oneMinus() );
160
-
161
- }
162
-
163
- node = textureUVNode;
164
-
165
- }
166
-
167
- return node;
110
+ return normalWorldNode;
168
111
 
169
112
  },
170
- getTextureLevel: ( textureNode ) => {
113
+ getTextureLevel: () => {
171
114
 
172
- return maxMipLevel( textureNode );
115
+ return float( 1.0 );
173
116
 
174
117
  }
175
118
  };
@@ -1,11 +1,13 @@
1
1
  import { Material, ShaderMaterial, NoColorSpace, LinearSRGBColorSpace } from 'three';
2
2
  import { getNodeChildren, getCacheKey } from '../core/NodeUtils.js';
3
3
  import { attribute } from '../core/AttributeNode.js';
4
- import { output, diffuseColor } from '../core/PropertyNode.js';
4
+ import { output, diffuseColor, varyingProperty } from '../core/PropertyNode.js';
5
5
  import { materialAlphaTest, materialColor, materialOpacity, materialEmissive, materialNormal } from '../accessors/MaterialNode.js';
6
6
  import { modelViewProjection } from '../accessors/ModelViewProjectionNode.js';
7
7
  import { transformedNormalView } from '../accessors/NormalNode.js';
8
8
  import { instance } from '../accessors/InstanceNode.js';
9
+ import { batch } from '../accessors/BatchNode.js';
10
+
9
11
  import { positionLocal, positionView } from '../accessors/PositionNode.js';
10
12
  import { skinningReference } from '../accessors/SkinningNode.js';
11
13
  import { morphReference } from '../accessors/MorphNode.js';
@@ -107,7 +109,11 @@ class NodeMaterial extends ShaderMaterial {
107
109
 
108
110
  if ( clippingNode !== null ) builder.stack.add( clippingNode );
109
111
 
110
- resultNode = this.setupOutput( builder, vec4( outgoingLightNode, diffuseColor.a ) );
112
+ // force unsigned floats - useful for RenderTargets
113
+
114
+ const basicOutput = vec4( outgoingLightNode, diffuseColor.a ).max( 0 );
115
+
116
+ resultNode = this.setupOutput( builder, basicOutput );
111
117
 
112
118
  // OUTPUT NODE
113
119
 
@@ -199,6 +205,12 @@ class NodeMaterial extends ShaderMaterial {
199
205
 
200
206
  }
201
207
 
208
+ if ( object.isBatchedMesh ) {
209
+
210
+ batch( object ).append();
211
+
212
+ }
213
+
202
214
  if ( ( object.instanceMatrix && object.instanceMatrix.isInstancedBufferAttribute === true ) && builder.isAvailable( 'instance' ) === true ) {
203
215
 
204
216
  instance( object ).append();
@@ -220,7 +232,7 @@ class NodeMaterial extends ShaderMaterial {
220
232
 
221
233
  }
222
234
 
223
- setupDiffuseColor( { geometry } ) {
235
+ setupDiffuseColor( { object, geometry } ) {
224
236
 
225
237
  let colorNode = this.colorNode ? vec4( this.colorNode ) : materialColor;
226
238
 
@@ -232,6 +244,16 @@ class NodeMaterial extends ShaderMaterial {
232
244
 
233
245
  }
234
246
 
247
+ // Instanced colors
248
+
249
+ if ( object.instanceColor ) {
250
+
251
+ const instanceColor = varyingProperty( 'vec3', 'vInstanceColor' );
252
+
253
+ colorNode = instanceColor.mul( colorNode );
254
+
255
+ }
256
+
235
257
  // COLOR
236
258
 
237
259
  diffuseColor.assign( colorNode );
@@ -380,23 +402,23 @@ class NodeMaterial extends ShaderMaterial {
380
402
 
381
403
  const renderer = builder.renderer;
382
404
 
383
- // TONE MAPPING
405
+ // FOG
384
406
 
385
- const toneMappingNode = builder.toneMappingNode;
407
+ if ( this.fog === true ) {
386
408
 
387
- if ( this.toneMapped === true && toneMappingNode ) {
409
+ const fogNode = builder.fogNode;
388
410
 
389
- outputNode = vec4( toneMappingNode.context( { color: outputNode.rgb } ), outputNode.a );
411
+ if ( fogNode ) outputNode = vec4( fogNode.mix( outputNode.rgb, fogNode.colorNode ), outputNode.a );
390
412
 
391
413
  }
392
414
 
393
- // FOG
415
+ // TONE MAPPING
394
416
 
395
- if ( this.fog === true ) {
417
+ const toneMappingNode = builder.toneMappingNode;
396
418
 
397
- const fogNode = builder.fogNode;
419
+ if ( this.toneMapped === true && toneMappingNode ) {
398
420
 
399
- if ( fogNode ) outputNode = vec4( fogNode.mixAssign( outputNode.rgb ), outputNode.a );
421
+ outputNode = vec4( toneMappingNode.context( { color: outputNode.rgb } ), outputNode.a );
400
422
 
401
423
  }
402
424
 
@@ -0,0 +1,193 @@
1
+ import TempNode from '../core/TempNode.js';
2
+ import { addNodeClass } from '../core/Node.js';
3
+ import { texture } from '../accessors/TextureNode.js';
4
+ import { textureCubeUV } from './PMREMUtils.js';
5
+ import { uniform } from '../core/UniformNode.js';
6
+ import { NodeUpdateType } from '../core/constants.js';
7
+ import { nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
8
+ import { WebGLCoordinateSystem } from 'three';
9
+
10
+ let _generator = null;
11
+
12
+ const _cache = new WeakMap();
13
+
14
+ function _generateCubeUVSize( imageHeight ) {
15
+
16
+ const maxMip = Math.log2( imageHeight ) - 2;
17
+
18
+ const texelHeight = 1.0 / imageHeight;
19
+
20
+ const texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );
21
+
22
+ return { texelWidth, texelHeight, maxMip };
23
+
24
+ }
25
+
26
+ function _getPMREMFromTexture( texture ) {
27
+
28
+ let cacheTexture = _cache.get( texture );
29
+
30
+ const pmremVersion = cacheTexture !== undefined ? cacheTexture.pmremVersion : - 1;
31
+
32
+ if ( pmremVersion !== texture.pmremVersion ) {
33
+
34
+ if ( texture.isCubeTexture ) {
35
+
36
+ if ( texture.source.data.some( ( texture ) => texture === undefined ) ) {
37
+
38
+ throw new Error( 'PMREMNode: Undefined texture in CubeTexture. Use onLoad callback or async loader' );
39
+
40
+ }
41
+
42
+ cacheTexture = _generator.fromCubemap( texture, cacheTexture );
43
+
44
+ } else {
45
+
46
+ if ( texture.image === undefined ) {
47
+
48
+ throw new Error( 'PMREMNode: Undefined image in Texture. Use onLoad callback or async loader' );
49
+
50
+ }
51
+
52
+ cacheTexture = _generator.fromEquirectangular( texture, cacheTexture );
53
+
54
+ }
55
+
56
+ cacheTexture.pmremVersion = texture.pmremVersion;
57
+
58
+ _cache.set( texture, cacheTexture );
59
+
60
+ }
61
+
62
+ return cacheTexture.texture;
63
+
64
+ }
65
+
66
+ class PMREMNode extends TempNode {
67
+
68
+ constructor( value, uvNode = null, levelNode = null ) {
69
+
70
+ super( 'vec3' );
71
+
72
+ this._value = value;
73
+ this._pmrem = null;
74
+
75
+ this.uvNode = uvNode;
76
+ this.levelNode = levelNode;
77
+
78
+ this._generator = null;
79
+ this._texture = texture( null );
80
+ this._width = uniform( 0 );
81
+ this._height = uniform( 0 );
82
+ this._maxMip = uniform( 0 );
83
+
84
+ this.updateBeforeType = NodeUpdateType.RENDER;
85
+
86
+ }
87
+
88
+ set value( value ) {
89
+
90
+ this._value = value;
91
+ this._pmrem = null;
92
+
93
+ }
94
+
95
+ get value() {
96
+
97
+ return this._value;
98
+
99
+ }
100
+
101
+ updateFromTexture( texture ) {
102
+
103
+ const cubeUVSize = _generateCubeUVSize( texture.image.height );
104
+
105
+ this._texture.value = texture;
106
+ this._width.value = cubeUVSize.texelWidth;
107
+ this._height.value = cubeUVSize.texelHeight;
108
+ this._maxMip.value = cubeUVSize.maxMip;
109
+
110
+ }
111
+
112
+ updateBefore() {
113
+
114
+ let pmrem = this._pmrem;
115
+
116
+ const pmremVersion = pmrem ? pmrem.pmremVersion : - 1;
117
+ const texture = this._value;
118
+
119
+ if ( pmremVersion !== texture.pmremVersion ) {
120
+
121
+ if ( texture.isPMREMTexture === true ) {
122
+
123
+ pmrem = texture;
124
+
125
+ } else {
126
+
127
+ pmrem = _getPMREMFromTexture( texture );
128
+
129
+ }
130
+
131
+ this._pmrem = pmrem;
132
+
133
+ this.updateFromTexture( pmrem );
134
+
135
+ }
136
+
137
+ }
138
+
139
+ setup( builder ) {
140
+
141
+ if ( _generator === null ) {
142
+
143
+ _generator = builder.createPMREMGenerator();
144
+
145
+ }
146
+
147
+ //
148
+
149
+ this.updateBefore( builder );
150
+
151
+ //
152
+
153
+ let uvNode = this.uvNode;
154
+
155
+ if ( uvNode === null && builder.context.getUV ) {
156
+
157
+ uvNode = builder.context.getUV( this );
158
+
159
+ }
160
+
161
+ //
162
+
163
+ const texture = this.value;
164
+
165
+ if ( builder.renderer.coordinateSystem === WebGLCoordinateSystem && texture.isPMREMTexture !== true && texture.isRenderTargetTexture === true ) {
166
+
167
+ uvNode = vec3( uvNode.x.negate(), uvNode.yz );
168
+
169
+ }
170
+
171
+ //
172
+
173
+ let levelNode = this.levelNode;
174
+
175
+ if ( levelNode === null && builder.context.getTextureLevel ) {
176
+
177
+ levelNode = builder.context.getTextureLevel( this );
178
+
179
+ }
180
+
181
+ //
182
+
183
+ return textureCubeUV( this._texture, uvNode, levelNode, this._width, this._height, this._maxMip );
184
+
185
+ }
186
+
187
+ }
188
+
189
+ export const pmremTexture = nodeProxy( PMREMNode );
190
+
191
+ addNodeClass( 'PMREMNode', PMREMNode );
192
+
193
+ export default PMREMNode;