super-three 0.154.1 → 0.156.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 +360 -160
- package/build/three.js +360 -160
- package/build/three.min.js +1 -1
- package/build/three.module.js +355 -161
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +155 -25
- package/examples/jsm/csm/CSMShader.js +35 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +1 -0
- package/examples/jsm/interactive/SelectionHelper.js +7 -0
- package/examples/jsm/libs/tween.module.js +790 -735
- package/examples/jsm/libs/utif.module.js +1644 -1558
- package/examples/jsm/loaders/DDSLoader.js +46 -3
- package/examples/jsm/loaders/EXRLoader.js +4 -4
- package/examples/jsm/loaders/FBXLoader.js +3 -1
- package/examples/jsm/loaders/GLTFLoader.js +25 -10
- package/examples/jsm/loaders/KTX2Loader.js +128 -79
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LogLuvLoader.js +2 -2
- package/examples/jsm/loaders/MMDLoader.js +10 -7
- package/examples/jsm/loaders/NRRDLoader.js +3 -3
- package/examples/jsm/loaders/PLYLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +48 -66
- package/examples/jsm/loaders/STLLoader.js +7 -0
- package/examples/jsm/loaders/TGALoader.js +10 -10
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
- package/examples/jsm/misc/Volume.js +4 -6
- package/examples/jsm/nodes/Nodes.js +8 -6
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
- package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
- package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
- package/examples/jsm/nodes/core/AttributeNode.js +2 -2
- package/examples/jsm/nodes/core/LightingModel.js +7 -9
- package/examples/jsm/nodes/core/Node.js +28 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
- package/examples/jsm/nodes/core/NodeUniform.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
- package/examples/jsm/nodes/core/PropertyNode.js +6 -0
- package/examples/jsm/nodes/core/StackNode.js +4 -4
- package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +19 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
- package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
- package/examples/jsm/nodes/lighting/AONode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
- package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
- package/examples/jsm/nodes/materials/Materials.js +2 -0
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
- package/examples/jsm/nodes/math/HashNode.js +35 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
- package/examples/jsm/nodes/utils/SplitNode.js +1 -1
- package/examples/jsm/objects/Reflector.js +1 -9
- package/examples/jsm/objects/Refractor.js +0 -8
- package/examples/jsm/offscreen/scene.js +0 -1
- package/examples/jsm/postprocessing/FilmPass.js +3 -5
- package/examples/jsm/postprocessing/MaskPass.js +4 -1
- package/examples/jsm/postprocessing/OutputPass.js +33 -14
- package/examples/jsm/postprocessing/RenderPass.js +30 -12
- package/examples/jsm/postprocessing/SAOPass.js +23 -98
- package/examples/jsm/postprocessing/SSAOPass.js +10 -30
- package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
- package/examples/jsm/renderers/common/Backend.js +11 -8
- package/examples/jsm/renderers/common/Background.js +22 -20
- package/examples/jsm/renderers/common/Binding.js +14 -0
- package/examples/jsm/renderers/common/Bindings.js +7 -10
- package/examples/jsm/renderers/common/Geometries.js +1 -1
- package/examples/jsm/renderers/common/Pipelines.js +96 -47
- package/examples/jsm/renderers/common/RenderContext.js +1 -0
- package/examples/jsm/renderers/common/RenderContexts.js +41 -5
- package/examples/jsm/renderers/common/RenderList.js +12 -4
- package/examples/jsm/renderers/common/RenderObject.js +26 -6
- package/examples/jsm/renderers/common/RenderObjects.js +10 -7
- package/examples/jsm/renderers/common/Renderer.js +82 -42
- package/examples/jsm/renderers/common/SampledTexture.js +2 -1
- package/examples/jsm/renderers/common/Sampler.js +1 -1
- package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
- package/examples/jsm/renderers/common/Textures.js +172 -20
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
- package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
- package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
- package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
- package/examples/jsm/shaders/FilmShader.js +11 -54
- package/examples/jsm/shaders/OutputShader.js +19 -2
- package/examples/jsm/shaders/SAOShader.js +0 -13
- package/examples/jsm/shaders/SSAOShader.js +33 -26
- package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
- package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
- package/package.json +2 -2
- package/src/Three.js +3 -0
- package/src/animation/PropertyBinding.js +1 -1
- package/src/audio/Audio.js +6 -0
- package/src/cameras/CubeCamera.js +1 -4
- package/src/constants.js +4 -1
- package/src/core/BufferAttribute.js +20 -0
- package/src/core/Object3D.js +2 -15
- package/src/core/RenderTarget.js +122 -0
- package/src/core/UniformsGroup.js +2 -2
- package/src/geometries/CapsuleGeometry.js +1 -1
- package/src/loaders/DataTextureLoader.js +19 -2
- package/src/materials/Material.js +2 -2
- package/src/math/Vector2.js +2 -2
- package/src/math/Vector3.js +3 -3
- package/src/math/Vector4.js +4 -4
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
- package/src/renderers/WebGLRenderTarget.js +3 -110
- package/src/renderers/WebGLRenderer.js +83 -57
- package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
- package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
- package/src/renderers/webgl/WebGLBackground.js +5 -14
- package/src/renderers/webgl/WebGLGeometries.js +5 -1
- package/src/renderers/webgl/WebGLMaterials.js +1 -1
- package/src/renderers/webgl/WebGLProgram.js +2 -0
- package/src/renderers/webgl/WebGLPrograms.js +19 -3
- package/src/renderers/webgl/WebGLTextures.js +101 -16
- package/src/renderers/webgl/WebGLUtils.js +27 -20
- package/src/textures/CompressedCubeTexture.js +19 -0
- package/src/textures/Texture.js +2 -2
- package/src/utils.js +9 -1
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
- package/examples/jsm/renderers/common/RenderTarget.js +0 -15
- package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
|
@@ -10,8 +10,9 @@ import RenderContexts from './RenderContexts.js';
|
|
|
10
10
|
import Textures from './Textures.js';
|
|
11
11
|
import Background from './Background.js';
|
|
12
12
|
import Nodes from './nodes/Nodes.js';
|
|
13
|
-
import { Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
|
|
13
|
+
import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
|
|
14
14
|
|
|
15
|
+
const _scene = new Scene();
|
|
15
16
|
const _drawingBufferSize = new Vector2();
|
|
16
17
|
const _screen = new Vector4();
|
|
17
18
|
const _frustum = new Frustum();
|
|
@@ -137,7 +138,7 @@ class Renderer {
|
|
|
137
138
|
this._textures = new Textures( backend, this._info );
|
|
138
139
|
this._pipelines = new Pipelines( backend, this._nodes );
|
|
139
140
|
this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this._info );
|
|
140
|
-
this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._info );
|
|
141
|
+
this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this._info );
|
|
141
142
|
this._renderLists = new RenderLists();
|
|
142
143
|
this._renderContexts = new RenderContexts();
|
|
143
144
|
|
|
@@ -181,8 +182,10 @@ class Renderer {
|
|
|
181
182
|
|
|
182
183
|
//
|
|
183
184
|
|
|
184
|
-
const
|
|
185
|
+
const sceneRef = ( scene.isScene === true ) ? scene : _scene;
|
|
186
|
+
|
|
185
187
|
const renderTarget = this._renderTarget;
|
|
188
|
+
const renderContext = this._renderContexts.get( scene, camera, renderTarget );
|
|
186
189
|
const activeCubeFace = this._activeCubeFace;
|
|
187
190
|
|
|
188
191
|
this._currentRenderContext = renderContext;
|
|
@@ -247,11 +250,15 @@ class Renderer {
|
|
|
247
250
|
|
|
248
251
|
//
|
|
249
252
|
|
|
253
|
+
sceneRef.onBeforeRender( this, scene, camera, renderTarget );
|
|
254
|
+
|
|
255
|
+
//
|
|
256
|
+
|
|
250
257
|
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
251
258
|
_frustum.setFromProjectionMatrix( _projScreenMatrix, coordinateSystem );
|
|
252
259
|
|
|
253
260
|
const renderList = this._renderLists.get( scene, camera );
|
|
254
|
-
renderList.
|
|
261
|
+
renderList.begin();
|
|
255
262
|
|
|
256
263
|
this._projectObject( scene, camera, 0, renderList );
|
|
257
264
|
|
|
@@ -271,25 +278,26 @@ class Renderer {
|
|
|
271
278
|
|
|
272
279
|
const renderTargetData = this._textures.get( renderTarget );
|
|
273
280
|
|
|
274
|
-
renderContext.
|
|
281
|
+
renderContext.textures = renderTargetData.textures;
|
|
275
282
|
renderContext.depthTexture = renderTargetData.depthTexture;
|
|
276
283
|
|
|
277
284
|
} else {
|
|
278
285
|
|
|
279
|
-
renderContext.
|
|
286
|
+
renderContext.textures = null;
|
|
280
287
|
renderContext.depthTexture = null;
|
|
281
288
|
|
|
282
289
|
}
|
|
283
290
|
|
|
284
291
|
renderContext.activeCubeFace = activeCubeFace;
|
|
292
|
+
renderContext.occlusionQueryCount = renderList.occlusionQueryCount;
|
|
285
293
|
|
|
286
294
|
//
|
|
287
295
|
|
|
288
|
-
this._nodes.updateScene(
|
|
296
|
+
this._nodes.updateScene( sceneRef );
|
|
289
297
|
|
|
290
298
|
//
|
|
291
299
|
|
|
292
|
-
this._background.update(
|
|
300
|
+
this._background.update( sceneRef, renderList, renderContext );
|
|
293
301
|
|
|
294
302
|
//
|
|
295
303
|
|
|
@@ -301,8 +309,8 @@ class Renderer {
|
|
|
301
309
|
const transparentObjects = renderList.transparent;
|
|
302
310
|
const lightsNode = renderList.lightsNode;
|
|
303
311
|
|
|
304
|
-
if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera,
|
|
305
|
-
if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera,
|
|
312
|
+
if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
|
|
313
|
+
if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode );
|
|
306
314
|
|
|
307
315
|
// finish render pass
|
|
308
316
|
|
|
@@ -315,6 +323,10 @@ class Renderer {
|
|
|
315
323
|
|
|
316
324
|
this._lastRenderContext = renderContext;
|
|
317
325
|
|
|
326
|
+
//
|
|
327
|
+
|
|
328
|
+
sceneRef.onAfterRender( this, scene, camera, renderTarget );
|
|
329
|
+
|
|
318
330
|
}
|
|
319
331
|
|
|
320
332
|
setAnimationLoop( callback ) {
|
|
@@ -329,9 +341,17 @@ class Renderer {
|
|
|
329
341
|
|
|
330
342
|
}
|
|
331
343
|
|
|
332
|
-
|
|
344
|
+
getArrayBuffer( attribute ) { // @deprecated, r155
|
|
345
|
+
|
|
346
|
+
console.warn( 'THREE.Renderer: getArrayBuffer() is deprecated. Use getArrayBufferAsync() instead.' );
|
|
347
|
+
|
|
348
|
+
return this.getArrayBufferAsync( attribute );
|
|
349
|
+
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
async getArrayBufferAsync( attribute ) {
|
|
333
353
|
|
|
334
|
-
return await this.backend.
|
|
354
|
+
return await this.backend.getArrayBufferAsync( attribute );
|
|
335
355
|
|
|
336
356
|
}
|
|
337
357
|
|
|
@@ -531,6 +551,14 @@ class Renderer {
|
|
|
531
551
|
|
|
532
552
|
}
|
|
533
553
|
|
|
554
|
+
isOccluded( object ) {
|
|
555
|
+
|
|
556
|
+
const renderContext = this._currentRenderContext || this._lastRenderContext;
|
|
557
|
+
|
|
558
|
+
return renderContext && this.backend.isOccluded( renderContext, object );
|
|
559
|
+
|
|
560
|
+
}
|
|
561
|
+
|
|
534
562
|
clear( color = true, depth = true, stencil = true ) {
|
|
535
563
|
|
|
536
564
|
const renderContext = this._currentRenderContext || this._lastRenderContext;
|
|
@@ -581,43 +609,59 @@ class Renderer {
|
|
|
581
609
|
|
|
582
610
|
}
|
|
583
611
|
|
|
612
|
+
getRenderTarget() {
|
|
613
|
+
|
|
614
|
+
return this._renderTarget;
|
|
615
|
+
|
|
616
|
+
}
|
|
617
|
+
|
|
584
618
|
async compute( computeNodes ) {
|
|
585
619
|
|
|
586
620
|
if ( this._initialized === false ) await this.init();
|
|
587
621
|
|
|
588
622
|
const backend = this.backend;
|
|
589
623
|
const pipelines = this._pipelines;
|
|
590
|
-
const
|
|
624
|
+
const bindings = this._bindings;
|
|
625
|
+
const nodes = this._nodes;
|
|
626
|
+
const computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
|
|
591
627
|
|
|
592
|
-
backend.beginCompute(
|
|
628
|
+
backend.beginCompute( computeNodes );
|
|
593
629
|
|
|
594
|
-
for ( const computeNode of
|
|
630
|
+
for ( const computeNode of computeList ) {
|
|
595
631
|
|
|
596
632
|
// onInit
|
|
597
633
|
|
|
598
634
|
if ( pipelines.has( computeNode ) === false ) {
|
|
599
635
|
|
|
600
|
-
|
|
636
|
+
const dispose = () => {
|
|
601
637
|
|
|
602
|
-
|
|
638
|
+
computeNode.removeEventListener( 'dispose', dispose );
|
|
603
639
|
|
|
604
|
-
|
|
605
|
-
|
|
640
|
+
pipelines.delete( computeNode );
|
|
641
|
+
bindings.delete( computeNode );
|
|
642
|
+
nodes.delete( computeNode );
|
|
606
643
|
|
|
607
|
-
|
|
608
|
-
const computeBindings = this._bindings.getForCompute( computeNode );
|
|
644
|
+
};
|
|
609
645
|
|
|
610
|
-
|
|
646
|
+
computeNode.addEventListener( 'dispose', dispose );
|
|
611
647
|
|
|
612
|
-
|
|
648
|
+
//
|
|
613
649
|
|
|
614
|
-
|
|
650
|
+
computeNode.onInit( { renderer: this } );
|
|
615
651
|
|
|
616
|
-
|
|
652
|
+
}
|
|
617
653
|
|
|
618
|
-
|
|
654
|
+
nodes.updateForCompute( computeNode );
|
|
655
|
+
bindings.updateForCompute( computeNode );
|
|
619
656
|
|
|
620
|
-
|
|
657
|
+
const computeBindings = bindings.getForCompute( computeNode );
|
|
658
|
+
const computePipeline = pipelines.getForCompute( computeNode, computeBindings );
|
|
659
|
+
|
|
660
|
+
backend.compute( computeNodes, computeNode, computeBindings, computePipeline );
|
|
661
|
+
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
backend.finishCompute( computeNodes );
|
|
621
665
|
|
|
622
666
|
}
|
|
623
667
|
|
|
@@ -803,13 +847,6 @@ class Renderer {
|
|
|
803
847
|
|
|
804
848
|
object.onBeforeRender( this, scene, camera, geometry, material, group );
|
|
805
849
|
|
|
806
|
-
//
|
|
807
|
-
|
|
808
|
-
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
809
|
-
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
810
|
-
|
|
811
|
-
//
|
|
812
|
-
|
|
813
850
|
material.onBeforeRender( this, scene, camera, geometry, material, group );
|
|
814
851
|
|
|
815
852
|
//
|
|
@@ -817,16 +854,16 @@ class Renderer {
|
|
|
817
854
|
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
818
855
|
|
|
819
856
|
material.side = BackSide;
|
|
820
|
-
this._renderObjectDirect( object, scene, camera,
|
|
857
|
+
this._renderObjectDirect( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
|
|
821
858
|
|
|
822
859
|
material.side = FrontSide;
|
|
823
|
-
this._renderObjectDirect( object, scene, camera,
|
|
860
|
+
this._renderObjectDirect( object, material, scene, camera, lightsNode ); // use default pass id
|
|
824
861
|
|
|
825
862
|
material.side = DoubleSide;
|
|
826
863
|
|
|
827
864
|
} else {
|
|
828
865
|
|
|
829
|
-
this._renderObjectDirect( object, scene, camera,
|
|
866
|
+
this._renderObjectDirect( object, material, scene, camera, lightsNode );
|
|
830
867
|
|
|
831
868
|
}
|
|
832
869
|
|
|
@@ -836,22 +873,25 @@ class Renderer {
|
|
|
836
873
|
|
|
837
874
|
}
|
|
838
875
|
|
|
839
|
-
_renderObjectDirect( object, scene, camera,
|
|
876
|
+
_renderObjectDirect( object, material, scene, camera, lightsNode, passId ) {
|
|
877
|
+
|
|
878
|
+
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
840
879
|
|
|
841
880
|
//
|
|
842
881
|
|
|
843
|
-
|
|
844
|
-
renderObject.context = this._currentRenderContext;
|
|
882
|
+
this._nodes.updateBefore( renderObject );
|
|
845
883
|
|
|
846
884
|
//
|
|
847
885
|
|
|
848
|
-
|
|
886
|
+
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
887
|
+
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
849
888
|
|
|
850
889
|
//
|
|
851
890
|
|
|
852
891
|
this._nodes.updateForRender( renderObject );
|
|
853
|
-
this._geometries.
|
|
892
|
+
this._geometries.updateForRender( renderObject );
|
|
854
893
|
this._bindings.updateForRender( renderObject );
|
|
894
|
+
this._pipelines.updateForRender( renderObject );
|
|
855
895
|
|
|
856
896
|
//
|
|
857
897
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import DataMap from './DataMap.js';
|
|
2
|
-
import { Vector2, DepthTexture, DepthStencilFormat, UnsignedInt248Type } from 'three';
|
|
3
2
|
|
|
4
|
-
|
|
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
|
|
|
@@ -17,11 +18,26 @@ class Textures extends DataMap {
|
|
|
17
18
|
updateRenderTarget( renderTarget ) {
|
|
18
19
|
|
|
19
20
|
const renderTargetData = this.get( renderTarget );
|
|
21
|
+
const sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
|
|
22
|
+
|
|
23
|
+
let texture, textures;
|
|
24
|
+
|
|
25
|
+
if ( renderTarget.isWebGLMultipleRenderTargets ) {
|
|
26
|
+
|
|
27
|
+
textures = renderTarget.texture;
|
|
28
|
+
texture = renderTarget.texture[ 0 ];
|
|
29
|
+
|
|
30
|
+
} else {
|
|
31
|
+
|
|
32
|
+
textures = [ renderTarget.texture ];
|
|
33
|
+
texture = renderTarget.texture;
|
|
34
|
+
|
|
35
|
+
}
|
|
20
36
|
|
|
21
|
-
const texture = renderTarget.texture;
|
|
22
37
|
const size = this.getSize( texture );
|
|
23
38
|
|
|
24
39
|
let depthTexture = renderTarget.depthTexture || renderTargetData.depthTexture;
|
|
40
|
+
let textureNeedsUpdate = false;
|
|
25
41
|
|
|
26
42
|
if ( depthTexture === undefined ) {
|
|
27
43
|
|
|
@@ -35,7 +51,7 @@ class Textures extends DataMap {
|
|
|
35
51
|
|
|
36
52
|
if ( renderTargetData.width !== size.width || size.height !== renderTargetData.height ) {
|
|
37
53
|
|
|
38
|
-
|
|
54
|
+
textureNeedsUpdate = true;
|
|
39
55
|
depthTexture.needsUpdate = true;
|
|
40
56
|
|
|
41
57
|
depthTexture.image.width = size.width;
|
|
@@ -45,11 +61,32 @@ class Textures extends DataMap {
|
|
|
45
61
|
|
|
46
62
|
renderTargetData.width = size.width;
|
|
47
63
|
renderTargetData.height = size.height;
|
|
48
|
-
renderTargetData.
|
|
64
|
+
renderTargetData.textures = textures;
|
|
49
65
|
renderTargetData.depthTexture = depthTexture;
|
|
50
66
|
|
|
51
|
-
|
|
52
|
-
|
|
67
|
+
if ( renderTargetData.sampleCount !== sampleCount ) {
|
|
68
|
+
|
|
69
|
+
textureNeedsUpdate = true;
|
|
70
|
+
depthTexture.needsUpdate = true;
|
|
71
|
+
|
|
72
|
+
renderTargetData.sampleCount = sampleCount;
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const options = { sampleCount };
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
80
|
+
|
|
81
|
+
const texture = textures[ i ];
|
|
82
|
+
|
|
83
|
+
if ( textureNeedsUpdate ) texture.needsUpdate = true;
|
|
84
|
+
|
|
85
|
+
this.updateTexture( texture, options );
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
this.updateTexture( depthTexture, options );
|
|
53
90
|
|
|
54
91
|
// dispose handler
|
|
55
92
|
|
|
@@ -63,7 +100,20 @@ class Textures extends DataMap {
|
|
|
63
100
|
|
|
64
101
|
renderTarget.removeEventListener( 'dispose', onDispose );
|
|
65
102
|
|
|
66
|
-
|
|
103
|
+
if ( textures !== undefined ) {
|
|
104
|
+
|
|
105
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
106
|
+
|
|
107
|
+
this._destroyTexture( textures[ i ] );
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
} else {
|
|
112
|
+
|
|
113
|
+
this._destroyTexture( texture );
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
67
117
|
this._destroyTexture( depthTexture );
|
|
68
118
|
|
|
69
119
|
};
|
|
@@ -74,15 +124,15 @@ class Textures extends DataMap {
|
|
|
74
124
|
|
|
75
125
|
}
|
|
76
126
|
|
|
77
|
-
updateTexture( texture ) {
|
|
127
|
+
updateTexture( texture, options = {} ) {
|
|
78
128
|
|
|
79
129
|
const textureData = this.get( texture );
|
|
80
130
|
if ( textureData.initialized === true && textureData.version === texture.version ) return;
|
|
81
131
|
|
|
82
|
-
const
|
|
132
|
+
const isRenderTarget = texture.isRenderTargetTexture || texture.isDepthTexture || texture.isFramebufferTexture;
|
|
83
133
|
const backend = this.backend;
|
|
84
134
|
|
|
85
|
-
if (
|
|
135
|
+
if ( isRenderTarget && textureData.initialized === true ) {
|
|
86
136
|
|
|
87
137
|
// it's an update
|
|
88
138
|
|
|
@@ -93,10 +143,22 @@ class Textures extends DataMap {
|
|
|
93
143
|
|
|
94
144
|
//
|
|
95
145
|
|
|
96
|
-
|
|
146
|
+
const { width, height, depth } = this.getSize( texture );
|
|
147
|
+
|
|
148
|
+
options.width = width;
|
|
149
|
+
options.height = height;
|
|
150
|
+
options.depth = depth;
|
|
151
|
+
options.needsMipmaps = this.needsMipmaps( texture );
|
|
152
|
+
options.levels = options.needsMipmaps ? this.getMipLevels( texture, width, height ) : 1;
|
|
153
|
+
|
|
154
|
+
//
|
|
155
|
+
|
|
156
|
+
if ( isRenderTarget || options.store === true ) {
|
|
157
|
+
|
|
158
|
+
//if ( options.store === true ) options.levels = 1; /* no mipmaps? */
|
|
97
159
|
|
|
98
160
|
backend.createSampler( texture );
|
|
99
|
-
backend.createTexture( texture );
|
|
161
|
+
backend.createTexture( texture, options );
|
|
100
162
|
|
|
101
163
|
} else {
|
|
102
164
|
|
|
@@ -118,15 +180,35 @@ class Textures extends DataMap {
|
|
|
118
180
|
|
|
119
181
|
} else {
|
|
120
182
|
|
|
183
|
+
if ( texture.images ) {
|
|
184
|
+
|
|
185
|
+
const images = [];
|
|
186
|
+
|
|
187
|
+
for ( const image of texture.images ) {
|
|
188
|
+
|
|
189
|
+
images.push( this._getUploadImage( image ) );
|
|
190
|
+
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
options.images = images;
|
|
194
|
+
|
|
195
|
+
} else {
|
|
196
|
+
|
|
197
|
+
options.image = this._getUploadImage( image );
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
121
201
|
if ( textureData.isDefaultTexture === undefined || textureData.isDefaultTexture === true ) {
|
|
122
202
|
|
|
123
|
-
backend.createTexture( texture );
|
|
203
|
+
backend.createTexture( texture, options );
|
|
124
204
|
|
|
125
205
|
textureData.isDefaultTexture = false;
|
|
126
206
|
|
|
127
207
|
}
|
|
128
208
|
|
|
129
|
-
backend.updateTexture( texture );
|
|
209
|
+
backend.updateTexture( texture, options );
|
|
210
|
+
|
|
211
|
+
if ( options.needsMipmaps ) backend.generateMipmaps( texture );
|
|
130
212
|
|
|
131
213
|
}
|
|
132
214
|
|
|
@@ -176,15 +258,19 @@ class Textures extends DataMap {
|
|
|
176
258
|
|
|
177
259
|
getSize( texture, target = _size ) {
|
|
178
260
|
|
|
179
|
-
|
|
261
|
+
let image = texture.images ? texture.images[ 0 ] : texture.image;
|
|
180
262
|
|
|
181
|
-
|
|
182
|
-
|
|
263
|
+
if ( image ) {
|
|
264
|
+
|
|
265
|
+
if ( image.image !== undefined ) image = image.image;
|
|
266
|
+
|
|
267
|
+
target.width = image.width;
|
|
268
|
+
target.height = image.height;
|
|
269
|
+
target.depth = texture.isCubeTexture ? 6 : ( image.depth || 1 );
|
|
183
270
|
|
|
184
271
|
} else {
|
|
185
272
|
|
|
186
|
-
target.width =
|
|
187
|
-
target.height = texture.image.height;
|
|
273
|
+
target.width = target.height = target.depth = 1;
|
|
188
274
|
|
|
189
275
|
}
|
|
190
276
|
|
|
@@ -192,6 +278,72 @@ class Textures extends DataMap {
|
|
|
192
278
|
|
|
193
279
|
}
|
|
194
280
|
|
|
281
|
+
getMipLevels( texture, width, height ) {
|
|
282
|
+
|
|
283
|
+
let mipLevelCount;
|
|
284
|
+
|
|
285
|
+
if ( texture.isCompressedTexture ) {
|
|
286
|
+
|
|
287
|
+
mipLevelCount = texture.mipmaps.length;
|
|
288
|
+
|
|
289
|
+
} else {
|
|
290
|
+
|
|
291
|
+
mipLevelCount = Math.floor( Math.log2( Math.max( width, height ) ) ) + 1;
|
|
292
|
+
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return mipLevelCount;
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
needsMipmaps( texture ) {
|
|
300
|
+
|
|
301
|
+
if ( this.isEnvironmentTexture( texture ) ) return true;
|
|
302
|
+
|
|
303
|
+
return ( texture.isCompressedTexture !== true ) /*&& ( texture.generateMipmaps === true )*/ && ( texture.minFilter !== NearestFilter ) && ( texture.minFilter !== LinearFilter );
|
|
304
|
+
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
isEnvironmentTexture( texture ) {
|
|
308
|
+
|
|
309
|
+
const mapping = texture.mapping;
|
|
310
|
+
|
|
311
|
+
return ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) || ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
|
|
312
|
+
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
_getUploadImage( image ) {
|
|
316
|
+
|
|
317
|
+
if ( this._isHTMLImage( image ) ) {
|
|
318
|
+
|
|
319
|
+
return this._imageToCanvas( image );
|
|
320
|
+
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return image;
|
|
324
|
+
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
_imageToCanvas( image ) {
|
|
328
|
+
|
|
329
|
+
const { width, height } = image;
|
|
330
|
+
|
|
331
|
+
// eslint-disable-next-line compat/compat
|
|
332
|
+
const canvas = new OffscreenCanvas( width, height );
|
|
333
|
+
|
|
334
|
+
const context = canvas.getContext( '2d' );
|
|
335
|
+
context.drawImage( image, 0, 0, width, height );
|
|
336
|
+
|
|
337
|
+
return canvas;
|
|
338
|
+
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
_isHTMLImage( image ) {
|
|
342
|
+
|
|
343
|
+
return ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) || ( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement );
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
|
|
195
347
|
_destroyTexture( texture ) {
|
|
196
348
|
|
|
197
349
|
this.backend.destroySampler( texture );
|
|
@@ -4,7 +4,7 @@ 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
|
|
|
@@ -22,7 +22,7 @@ class NodeSampledCubeTexture extends SampledCubeTexture {
|
|
|
22
22
|
|
|
23
23
|
constructor( name, textureNode ) {
|
|
24
24
|
|
|
25
|
-
super( name, textureNode.value );
|
|
25
|
+
super( name, textureNode ? textureNode.value : null );
|
|
26
26
|
|
|
27
27
|
this.textureNode = textureNode;
|
|
28
28
|
|