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.
- package/build/three.cjs +407 -1014
- package/build/three.module.js +406 -1013
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/TransformControls.js +3 -3
- package/examples/jsm/exporters/GLTFExporter.js +21 -4
- package/examples/jsm/exporters/USDZExporter.js +15 -0
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/lines/LineMaterial.js +0 -2
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/EXRLoader.js +89 -19
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +6 -0
- package/examples/jsm/loaders/KTX2Loader.js +2 -6
- package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
- package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
- package/examples/jsm/loaders/LUTImageLoader.js +0 -14
- package/examples/jsm/loaders/RGBMLoader.js +16 -0
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
- package/examples/jsm/nodes/Nodes.js +6 -1
- package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
- package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
- package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
- package/examples/jsm/nodes/core/Node.js +55 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +21 -16
- package/examples/jsm/nodes/core/NodeFrame.js +10 -10
- package/examples/jsm/nodes/core/NodeUtils.js +2 -2
- package/examples/jsm/nodes/core/UniformNode.js +20 -0
- package/examples/jsm/nodes/display/PassNode.js +17 -1
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
- package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
- package/examples/jsm/nodes/fog/FogNode.js +13 -3
- package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
- package/examples/jsm/nodes/materials/NodeMaterial.js +33 -11
- package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
- package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
- package/examples/jsm/objects/QuadMesh.js +7 -23
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/GlitchPass.js +0 -3
- package/examples/jsm/postprocessing/LUTPass.js +5 -71
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SSAOPass.js +0 -3
- package/examples/jsm/renderers/common/Animation.js +3 -0
- package/examples/jsm/renderers/common/Background.js +5 -5
- package/examples/jsm/renderers/common/Info.js +11 -19
- package/examples/jsm/renderers/common/PostProcessing.js +12 -4
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +4 -4
- package/examples/jsm/renderers/common/RenderObjects.js +1 -1
- package/examples/jsm/renderers/common/Renderer.js +25 -8
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +5 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +148 -24
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +3 -3
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +43 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +54 -25
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +5 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +25 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
- package/examples/jsm/utils/GPUStatsPanel.js +10 -45
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/package.json +1 -1
- package/src/Three.js +0 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/constants.js +3 -3
- package/src/core/Object3D.js +10 -7
- package/src/extras/PMREMGenerator.js +9 -0
- package/src/loaders/ObjectLoader.js +2 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/math/Spherical.js +4 -5
- package/src/objects/BatchedMesh.js +4 -3
- package/src/objects/InstancedMesh.js +10 -0
- package/src/renderers/WebGLRenderer.js +55 -114
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +6 -33
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLCapabilities.js +2 -12
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +4 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLLights.js +6 -32
- package/src/renderers/webgl/WebGLMaterials.js +2 -3
- package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
- package/src/renderers/webgl/WebGLProgram.js +18 -47
- package/src/renderers/webgl/WebGLPrograms.js +20 -32
- package/src/renderers/webgl/WebGLRenderStates.js +8 -6
- package/src/renderers/webgl/WebGLState.js +15 -59
- package/src/renderers/webgl/WebGLTextures.js +75 -237
- package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
- package/src/renderers/webgl/WebGLUtils.js +6 -57
- package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/scenes/Scene.js +7 -1
- package/src/textures/Texture.js +11 -1
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- 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 {
|
|
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
|
|
29
|
+
if ( envNode.isTextureNode ) {
|
|
33
30
|
|
|
34
31
|
let cacheEnvNode = envNodeCache.get( envNode.value );
|
|
35
32
|
|
|
36
33
|
if ( cacheEnvNode === undefined ) {
|
|
37
34
|
|
|
38
|
-
|
|
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
|
|
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: (
|
|
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
|
-
|
|
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: (
|
|
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
|
-
|
|
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: (
|
|
113
|
+
getTextureLevel: () => {
|
|
171
114
|
|
|
172
|
-
return
|
|
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
|
-
|
|
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
|
-
//
|
|
405
|
+
// FOG
|
|
384
406
|
|
|
385
|
-
|
|
407
|
+
if ( this.fog === true ) {
|
|
386
408
|
|
|
387
|
-
|
|
409
|
+
const fogNode = builder.fogNode;
|
|
388
410
|
|
|
389
|
-
outputNode = vec4(
|
|
411
|
+
if ( fogNode ) outputNode = vec4( fogNode.mix( outputNode.rgb, fogNode.colorNode ), outputNode.a );
|
|
390
412
|
|
|
391
413
|
}
|
|
392
414
|
|
|
393
|
-
//
|
|
415
|
+
// TONE MAPPING
|
|
394
416
|
|
|
395
|
-
|
|
417
|
+
const toneMappingNode = builder.toneMappingNode;
|
|
396
418
|
|
|
397
|
-
|
|
419
|
+
if ( this.toneMapped === true && toneMappingNode ) {
|
|
398
420
|
|
|
399
|
-
|
|
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;
|