@needle-tools/three 0.153.1 → 0.154.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.
- package/build/three.cjs +1260 -1517
- package/build/three.js +1267 -1524
- package/build/three.min.js +7 -8
- package/build/three.module.js +859 -1097
- package/build/three.module.min.js +6 -7
- package/examples/jsm/controls/ArcballControls.js +2 -1
- package/examples/jsm/controls/FlyControls.js +25 -9
- package/examples/jsm/controls/OrbitControls.js +7 -1
- package/examples/jsm/csm/CSM.js +1 -1
- package/examples/jsm/effects/AnaglyphEffect.js +1 -1
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/effects/ParallaxBarrierEffect.js +1 -1
- package/examples/jsm/environments/RoomEnvironment.js +6 -2
- package/examples/jsm/lines/LineMaterial.js +1 -1
- package/examples/jsm/loaders/3DMLoader.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +5 -1
- package/examples/jsm/loaders/ColladaLoader.js +4 -1
- package/examples/jsm/loaders/FBXLoader.js +9 -2
- package/examples/jsm/loaders/LDrawLoader.js +4 -7
- package/examples/jsm/loaders/PLYLoader.js +16 -6
- package/examples/jsm/loaders/VRMLLoader.js +16 -4
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
- package/examples/jsm/math/MeshSurfaceSampler.js +76 -35
- package/examples/jsm/nodes/Nodes.js +20 -15
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +21 -8
- package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
- package/examples/jsm/nodes/accessors/InstanceNode.js +2 -4
- package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
- package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
- package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
- package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
- package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
- package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
- package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
- package/examples/jsm/nodes/accessors/UVNode.js +1 -1
- package/examples/jsm/nodes/code/CodeNode.js +3 -0
- package/examples/jsm/nodes/code/FunctionNode.js +25 -4
- package/examples/jsm/nodes/core/BypassNode.js +2 -2
- package/examples/jsm/nodes/core/ContextNode.js +2 -0
- package/examples/jsm/nodes/core/IndexNode.js +66 -0
- package/examples/jsm/nodes/core/LightingModel.js +2 -1
- package/examples/jsm/nodes/core/Node.js +12 -15
- package/examples/jsm/nodes/core/NodeBuilder.js +24 -5
- package/examples/jsm/nodes/core/PropertyNode.js +4 -0
- package/examples/jsm/nodes/core/StackNode.js +1 -1
- package/examples/jsm/nodes/core/UniformNode.js +1 -1
- package/examples/jsm/nodes/core/VarNode.js +1 -3
- package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
- package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -8
- package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -5
- package/examples/jsm/nodes/display/ViewportTextureNode.js +23 -15
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
- package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
- package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
- package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
- package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
- package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +129 -18
- package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
- package/examples/jsm/nodes/geometry/RangeNode.js +1 -1
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +91 -62
- package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
- package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
- package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
- package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
- package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
- package/examples/jsm/nodes/materials/NodeMaterial.js +79 -28
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
- package/examples/jsm/nodes/math/MathNode.js +6 -0
- package/examples/jsm/nodes/math/OperatorNode.js +1 -1
- package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
- package/examples/jsm/nodes/shadernode/ShaderNode.js +24 -4
- package/examples/jsm/nodes/utils/LoopNode.js +1 -1
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
- package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
- package/examples/jsm/objects/Reflector.js +1 -1
- package/examples/jsm/objects/Refractor.js +1 -1
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/Water.js +1 -1
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/offscreen/scene.js +1 -0
- package/examples/jsm/postprocessing/EffectComposer.js +2 -0
- package/examples/jsm/postprocessing/OutlinePass.js +1 -3
- package/examples/jsm/postprocessing/SSAARenderPass.js +3 -12
- package/examples/jsm/postprocessing/SavePass.js +3 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +14 -2
- package/examples/jsm/postprocessing/TexturePass.js +2 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +9 -10
- package/examples/jsm/renderers/common/Backend.js +2 -0
- package/examples/jsm/renderers/common/Background.js +7 -6
- package/examples/jsm/renderers/common/Pipelines.js +26 -14
- package/examples/jsm/renderers/common/RenderObject.js +18 -0
- package/examples/jsm/renderers/common/RenderObjects.js +29 -29
- package/examples/jsm/renderers/common/Renderer.js +48 -6
- package/examples/jsm/renderers/common/nodes/Nodes.js +1 -1
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +123 -41
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +29 -9
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +8 -13
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +85 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +5 -1
- package/examples/jsm/shaders/BlendShader.js +1 -2
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/CopyShader.js +2 -2
- package/examples/jsm/shaders/ToonShader.js +4 -4
- package/examples/jsm/shaders/WaterRefractionShader.js +1 -1
- package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
- package/package.json +2 -1
- package/src/Three.Legacy.js +0 -228
- package/src/animation/PropertyBinding.js +1 -1
- package/src/constants.js +1 -1
- package/src/core/BufferAttribute.js +0 -24
- package/src/core/BufferGeometry.js +0 -7
- package/src/loaders/Loader.js +2 -0
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/materials/Material.js +3 -0
- package/src/objects/Skeleton.js +0 -2
- package/src/renderers/WebGLRenderer.js +9 -21
- package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
- package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +9 -1
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +10 -6
- package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
- package/src/renderers/webgl/WebGLObjects.js +23 -3
- package/src/renderers/webgl/WebGLProgram.js +24 -5
- package/src/renderers/webgl/WebGLPrograms.js +3 -0
- package/src/renderers/webxr/WebXRManager.js +11 -33
- package/src/scenes/Scene.js +0 -14
- package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -45
- /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
- /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
- /package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +0 -0
|
@@ -24,6 +24,7 @@ class TAARenderPass extends SSAARenderPass {
|
|
|
24
24
|
|
|
25
25
|
this.sampleLevel = 0;
|
|
26
26
|
this.accumulate = false;
|
|
27
|
+
this.accumulateIndex = - 1;
|
|
27
28
|
|
|
28
29
|
}
|
|
29
30
|
|
|
@@ -65,6 +66,9 @@ class TAARenderPass extends SSAARenderPass {
|
|
|
65
66
|
const autoClear = renderer.autoClear;
|
|
66
67
|
renderer.autoClear = false;
|
|
67
68
|
|
|
69
|
+
renderer.getClearColor( this._oldClearColor );
|
|
70
|
+
const oldClearAlpha = renderer.getClearAlpha();
|
|
71
|
+
|
|
68
72
|
const sampleWeight = 1.0 / ( jitterOffsets.length );
|
|
69
73
|
|
|
70
74
|
if ( this.accumulateIndex >= 0 && this.accumulateIndex < jitterOffsets.length ) {
|
|
@@ -88,11 +92,18 @@ class TAARenderPass extends SSAARenderPass {
|
|
|
88
92
|
}
|
|
89
93
|
|
|
90
94
|
renderer.setRenderTarget( writeBuffer );
|
|
95
|
+
renderer.setClearColor( this.clearColor, this.clearAlpha );
|
|
91
96
|
renderer.clear();
|
|
92
97
|
renderer.render( this.scene, this.camera );
|
|
93
98
|
|
|
94
99
|
renderer.setRenderTarget( this.sampleRenderTarget );
|
|
95
|
-
if ( this.accumulateIndex === 0 )
|
|
100
|
+
if ( this.accumulateIndex === 0 ) {
|
|
101
|
+
|
|
102
|
+
renderer.setClearColor( 0x000000, 0.0 );
|
|
103
|
+
renderer.clear();
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
96
107
|
this.fsQuad.render( renderer );
|
|
97
108
|
|
|
98
109
|
this.accumulateIndex ++;
|
|
@@ -105,6 +116,7 @@ class TAARenderPass extends SSAARenderPass {
|
|
|
105
116
|
|
|
106
117
|
}
|
|
107
118
|
|
|
119
|
+
renderer.setClearColor( this.clearColor, this.clearAlpha );
|
|
108
120
|
const accumulationWeight = this.accumulateIndex * sampleWeight;
|
|
109
121
|
|
|
110
122
|
if ( accumulationWeight > 0 ) {
|
|
@@ -122,12 +134,12 @@ class TAARenderPass extends SSAARenderPass {
|
|
|
122
134
|
this.copyUniforms[ 'opacity' ].value = 1.0 - accumulationWeight;
|
|
123
135
|
this.copyUniforms[ 'tDiffuse' ].value = this.holdRenderTarget.texture;
|
|
124
136
|
renderer.setRenderTarget( writeBuffer );
|
|
125
|
-
if ( accumulationWeight === 0 ) renderer.clear();
|
|
126
137
|
this.fsQuad.render( renderer );
|
|
127
138
|
|
|
128
139
|
}
|
|
129
140
|
|
|
130
141
|
renderer.autoClear = autoClear;
|
|
142
|
+
renderer.setClearColor( this._oldClearColor, oldClearAlpha );
|
|
131
143
|
|
|
132
144
|
}
|
|
133
145
|
|
|
@@ -80,11 +80,11 @@ class UnrealBloomPass extends Pass {
|
|
|
80
80
|
this.materialHighPassFilter = new ShaderMaterial( {
|
|
81
81
|
uniforms: this.highPassUniforms,
|
|
82
82
|
vertexShader: highPassShader.vertexShader,
|
|
83
|
-
fragmentShader: highPassShader.fragmentShader
|
|
84
|
-
defines: {}
|
|
83
|
+
fragmentShader: highPassShader.fragmentShader
|
|
85
84
|
} );
|
|
86
85
|
|
|
87
|
-
//
|
|
86
|
+
// gaussian blur materials
|
|
87
|
+
|
|
88
88
|
this.separableBlurMaterials = [];
|
|
89
89
|
const kernelSizeArray = [ 3, 5, 7, 9, 11 ];
|
|
90
90
|
resx = Math.round( this.resolution.x / 2 );
|
|
@@ -102,7 +102,8 @@ class UnrealBloomPass extends Pass {
|
|
|
102
102
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
//
|
|
105
|
+
// composite material
|
|
106
|
+
|
|
106
107
|
this.compositeMaterial = this.getCompositeMaterial( this.nMips );
|
|
107
108
|
this.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;
|
|
108
109
|
this.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;
|
|
@@ -111,21 +112,19 @@ class UnrealBloomPass extends Pass {
|
|
|
111
112
|
this.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;
|
|
112
113
|
this.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;
|
|
113
114
|
this.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;
|
|
114
|
-
this.compositeMaterial.needsUpdate = true;
|
|
115
115
|
|
|
116
116
|
const bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];
|
|
117
117
|
this.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;
|
|
118
118
|
this.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];
|
|
119
119
|
this.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;
|
|
120
120
|
|
|
121
|
-
//
|
|
121
|
+
// blend material
|
|
122
122
|
|
|
123
123
|
const copyShader = CopyShader;
|
|
124
124
|
|
|
125
125
|
this.copyUniforms = UniformsUtils.clone( copyShader.uniforms );
|
|
126
|
-
this.copyUniforms[ 'opacity' ].value = 1.0;
|
|
127
126
|
|
|
128
|
-
this.
|
|
127
|
+
this.blendMaterial = new ShaderMaterial( {
|
|
129
128
|
uniforms: this.copyUniforms,
|
|
130
129
|
vertexShader: copyShader.vertexShader,
|
|
131
130
|
fragmentShader: copyShader.fragmentShader,
|
|
@@ -172,7 +171,7 @@ class UnrealBloomPass extends Pass {
|
|
|
172
171
|
}
|
|
173
172
|
|
|
174
173
|
this.compositeMaterial.dispose();
|
|
175
|
-
this.
|
|
174
|
+
this.blendMaterial.dispose();
|
|
176
175
|
this.basic.dispose();
|
|
177
176
|
|
|
178
177
|
//
|
|
@@ -273,7 +272,7 @@ class UnrealBloomPass extends Pass {
|
|
|
273
272
|
|
|
274
273
|
// Blend it additively over the input texture
|
|
275
274
|
|
|
276
|
-
this.fsQuad.material = this.
|
|
275
|
+
this.fsQuad.material = this.blendMaterial;
|
|
277
276
|
this.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;
|
|
278
277
|
|
|
279
278
|
if ( maskActive ) renderer.state.buffers.stencil.setTest( true );
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import DataMap from './DataMap.js';
|
|
2
|
-
import { Color, Mesh,
|
|
3
|
-
import { context, positionWorldDirection, MeshBasicNodeMaterial } from '../../nodes/Nodes.js';
|
|
2
|
+
import { Color, Mesh, SphereGeometry, BackSide } from 'three';
|
|
3
|
+
import { context, positionWorldDirection, backgroundBlurriness, MeshBasicNodeMaterial } from '../../nodes/Nodes.js';
|
|
4
4
|
|
|
5
5
|
let _clearAlpha;
|
|
6
6
|
const _clearColor = new Color();
|
|
@@ -30,14 +30,14 @@ class Background extends DataMap {
|
|
|
30
30
|
|
|
31
31
|
// no background settings, use clear color configuration from the renderer
|
|
32
32
|
|
|
33
|
-
_clearColor.
|
|
33
|
+
_clearColor.copyLinearToSRGB( renderer._clearColor );
|
|
34
34
|
_clearAlpha = renderer._clearAlpha;
|
|
35
35
|
|
|
36
36
|
} else if ( background.isColor === true ) {
|
|
37
37
|
|
|
38
38
|
// background is an opaque color
|
|
39
39
|
|
|
40
|
-
_clearColor.
|
|
40
|
+
_clearColor.copyLinearToSRGB( background );
|
|
41
41
|
_clearAlpha = 1;
|
|
42
42
|
forceClear = true;
|
|
43
43
|
|
|
@@ -55,7 +55,8 @@ class Background extends DataMap {
|
|
|
55
55
|
|
|
56
56
|
this.boxMeshNode = context( backgroundNode, {
|
|
57
57
|
// @TODO: Add Texture2D support using node context
|
|
58
|
-
getUVNode: () => positionWorldDirection
|
|
58
|
+
getUVNode: () => positionWorldDirection,
|
|
59
|
+
getSamplerLevelNode: () => backgroundBlurriness
|
|
59
60
|
} );
|
|
60
61
|
|
|
61
62
|
const nodeMaterial = new MeshBasicNodeMaterial();
|
|
@@ -65,7 +66,7 @@ class Background extends DataMap {
|
|
|
65
66
|
nodeMaterial.depthWrite = false;
|
|
66
67
|
nodeMaterial.fog = false;
|
|
67
68
|
|
|
68
|
-
this.boxMesh = boxMesh = new Mesh( new
|
|
69
|
+
this.boxMesh = boxMesh = new Mesh( new SphereGeometry( 1, 32, 32 ), nodeMaterial );
|
|
69
70
|
boxMesh.frustumCulled = false;
|
|
70
71
|
|
|
71
72
|
boxMesh.onBeforeRender = function ( renderer, scene, camera ) {
|
|
@@ -33,7 +33,7 @@ class Pipelines extends DataMap {
|
|
|
33
33
|
|
|
34
34
|
// release previous cache
|
|
35
35
|
|
|
36
|
-
this._releasePipeline( computeNode );
|
|
36
|
+
const previousPipeline = this._releasePipeline( computeNode );
|
|
37
37
|
|
|
38
38
|
// get shader
|
|
39
39
|
|
|
@@ -45,6 +45,8 @@ class Pipelines extends DataMap {
|
|
|
45
45
|
|
|
46
46
|
if ( stageCompute === undefined ) {
|
|
47
47
|
|
|
48
|
+
if ( previousPipeline ) this._releaseProgram( previousPipeline.computeShader );
|
|
49
|
+
|
|
48
50
|
stageCompute = new ProgrammableStage( nodeBuilder.computeShader, 'compute' );
|
|
49
51
|
this.programs.compute.set( nodeBuilder.computeShader, stageCompute );
|
|
50
52
|
|
|
@@ -81,7 +83,7 @@ class Pipelines extends DataMap {
|
|
|
81
83
|
|
|
82
84
|
// release previous cache
|
|
83
85
|
|
|
84
|
-
this._releasePipeline( renderObject );
|
|
86
|
+
const previousPipeline = this._releasePipeline( renderObject );
|
|
85
87
|
|
|
86
88
|
// get shader
|
|
87
89
|
|
|
@@ -93,6 +95,8 @@ class Pipelines extends DataMap {
|
|
|
93
95
|
|
|
94
96
|
if ( stageVertex === undefined ) {
|
|
95
97
|
|
|
98
|
+
if ( previousPipeline ) this._releaseProgram( previousPipeline.vertexProgram );
|
|
99
|
+
|
|
96
100
|
stageVertex = new ProgrammableStage( nodeBuilder.vertexShader, 'vertex' );
|
|
97
101
|
this.programs.vertex.set( nodeBuilder.vertexShader, stageVertex );
|
|
98
102
|
|
|
@@ -104,6 +108,8 @@ class Pipelines extends DataMap {
|
|
|
104
108
|
|
|
105
109
|
if ( stageFragment === undefined ) {
|
|
106
110
|
|
|
111
|
+
if ( previousPipeline ) this._releaseProgram( previousPipeline.fragmentShader );
|
|
112
|
+
|
|
107
113
|
stageFragment = new ProgrammableStage( nodeBuilder.fragmentShader, 'fragment' );
|
|
108
114
|
this.programs.fragment.set( nodeBuilder.fragmentShader, stageFragment );
|
|
109
115
|
|
|
@@ -133,7 +139,22 @@ class Pipelines extends DataMap {
|
|
|
133
139
|
|
|
134
140
|
delete( object ) {
|
|
135
141
|
|
|
136
|
-
this._releasePipeline( object );
|
|
142
|
+
const pipeline = this._releasePipeline( object );
|
|
143
|
+
|
|
144
|
+
if ( pipeline && pipeline.usedTimes === 0 ) {
|
|
145
|
+
|
|
146
|
+
if ( pipeline.isComputePipeline ) {
|
|
147
|
+
|
|
148
|
+
this._releaseProgram( pipeline.computeProgram );
|
|
149
|
+
|
|
150
|
+
} else {
|
|
151
|
+
|
|
152
|
+
this._releaseProgram( pipeline.vertexProgram );
|
|
153
|
+
this._releaseProgram( pipeline.fragmentProgram );
|
|
154
|
+
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
}
|
|
137
158
|
|
|
138
159
|
super.delete( object );
|
|
139
160
|
|
|
@@ -236,19 +257,10 @@ class Pipelines extends DataMap {
|
|
|
236
257
|
|
|
237
258
|
this.caches.delete( pipeline.cacheKey );
|
|
238
259
|
|
|
239
|
-
if ( pipeline.isComputePipeline ) {
|
|
240
|
-
|
|
241
|
-
this._releaseProgram( pipeline.computeProgram );
|
|
242
|
-
|
|
243
|
-
} else {
|
|
244
|
-
|
|
245
|
-
this._releaseProgram( pipeline.vertexProgram );
|
|
246
|
-
this._releaseProgram( pipeline.fragmentProgram );
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
|
|
250
260
|
}
|
|
251
261
|
|
|
262
|
+
return pipeline;
|
|
263
|
+
|
|
252
264
|
}
|
|
253
265
|
|
|
254
266
|
_releaseProgram( program ) {
|
|
@@ -25,6 +25,16 @@ export default class RenderObject {
|
|
|
25
25
|
this._materialVersion = - 1;
|
|
26
26
|
this._materialCacheKey = '';
|
|
27
27
|
|
|
28
|
+
this.onDispose = null;
|
|
29
|
+
|
|
30
|
+
this.onMaterialDispose = () => {
|
|
31
|
+
|
|
32
|
+
this.dispose();
|
|
33
|
+
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
this.material.addEventListener( 'dispose', this.onMaterialDispose );
|
|
37
|
+
|
|
28
38
|
}
|
|
29
39
|
|
|
30
40
|
getNodeBuilder() {
|
|
@@ -92,4 +102,12 @@ export default class RenderObject {
|
|
|
92
102
|
|
|
93
103
|
}
|
|
94
104
|
|
|
105
|
+
dispose() {
|
|
106
|
+
|
|
107
|
+
this.material.removeEventListener( 'dispose', this.onMaterialDispose );
|
|
108
|
+
|
|
109
|
+
this.onDispose();
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
95
113
|
}
|
|
@@ -2,35 +2,33 @@ import DataMap from './DataMap.js';
|
|
|
2
2
|
import ChainMap from './ChainMap.js';
|
|
3
3
|
import RenderObject from './RenderObject.js';
|
|
4
4
|
|
|
5
|
-
class RenderObjects
|
|
5
|
+
class RenderObjects {
|
|
6
6
|
|
|
7
7
|
constructor( renderer, nodes, geometries, pipelines, info ) {
|
|
8
8
|
|
|
9
|
-
super();
|
|
10
|
-
|
|
11
9
|
this.renderer = renderer;
|
|
12
10
|
this.nodes = nodes;
|
|
13
11
|
this.geometries = geometries;
|
|
14
12
|
this.pipelines = pipelines;
|
|
15
13
|
this.info = info;
|
|
16
14
|
|
|
15
|
+
this.chainMaps = {};
|
|
17
16
|
this.dataMap = new DataMap();
|
|
18
17
|
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
get( object, material, scene, camera, lightsNode ) {
|
|
20
|
+
get( object, material, scene, camera, lightsNode, passId ) {
|
|
22
21
|
|
|
22
|
+
const chainMap = this.getChainMap( passId );
|
|
23
23
|
const chainArray = [ object, material, scene, camera, lightsNode ];
|
|
24
24
|
|
|
25
|
-
let renderObject =
|
|
25
|
+
let renderObject = chainMap.get( chainArray );
|
|
26
26
|
|
|
27
27
|
if ( renderObject === undefined ) {
|
|
28
28
|
|
|
29
|
-
renderObject =
|
|
30
|
-
|
|
31
|
-
this._initRenderObject( renderObject );
|
|
29
|
+
renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, passId );
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
chainMap.set( chainArray, renderObject );
|
|
34
32
|
|
|
35
33
|
} else {
|
|
36
34
|
|
|
@@ -39,10 +37,9 @@ class RenderObjects extends ChainMap {
|
|
|
39
37
|
|
|
40
38
|
if ( data.cacheKey !== cacheKey ) {
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
renderObject.dispose();
|
|
43
41
|
|
|
44
|
-
this.
|
|
45
|
-
this.nodes.delete( renderObject );
|
|
42
|
+
renderObject = this.get( object, material, scene, camera, lightsNode );
|
|
46
43
|
|
|
47
44
|
}
|
|
48
45
|
|
|
@@ -52,37 +49,40 @@ class RenderObjects extends ChainMap {
|
|
|
52
49
|
|
|
53
50
|
}
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
getChainMap( passId = 'default' ) {
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this.dataMap.clear();
|
|
54
|
+
return this.chainMaps[ passId ] || ( this.chainMaps[ passId ] = new ChainMap() );
|
|
60
55
|
|
|
61
56
|
}
|
|
62
57
|
|
|
63
|
-
|
|
58
|
+
dispose() {
|
|
59
|
+
|
|
60
|
+
this.chainMaps = {};
|
|
61
|
+
this.dataMap = new DataMap();
|
|
64
62
|
|
|
65
|
-
|
|
63
|
+
}
|
|
66
64
|
|
|
67
|
-
|
|
65
|
+
createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, passId ) {
|
|
68
66
|
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
const chainMap = this.getChainMap( passId );
|
|
68
|
+
const dataMap = this.dataMap;
|
|
69
|
+
const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode );
|
|
71
70
|
|
|
72
|
-
|
|
71
|
+
const data = dataMap.get( renderObject );
|
|
72
|
+
data.cacheKey = renderObject.getCacheKey();
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
renderObject.onDispose = () => {
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
this.nodes.delete( renderObject );
|
|
76
|
+
dataMap.delete( renderObject );
|
|
78
77
|
|
|
79
|
-
|
|
78
|
+
this.pipelines.delete( renderObject );
|
|
79
|
+
this.nodes.delete( renderObject );
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
chainMap.delete( renderObject.getChainArray() );
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
};
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
return renderObject;
|
|
86
86
|
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -10,7 +10,7 @@ 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, SRGBColorSpace, NoToneMapping } from 'three';
|
|
13
|
+
import { Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
|
|
14
14
|
|
|
15
15
|
const _drawingBufferSize = new Vector2();
|
|
16
16
|
const _screen = new Vector4();
|
|
@@ -42,6 +42,9 @@ class Renderer {
|
|
|
42
42
|
|
|
43
43
|
this.sortObjects = true;
|
|
44
44
|
|
|
45
|
+
this.depth = true;
|
|
46
|
+
this.stencil = true;
|
|
47
|
+
|
|
45
48
|
// internals
|
|
46
49
|
|
|
47
50
|
this._pixelRatio = 1;
|
|
@@ -239,6 +242,9 @@ class Renderer {
|
|
|
239
242
|
renderContext.scissorValue.copy( scissor ).multiplyScalar( pixelRatio ).floor();
|
|
240
243
|
renderContext.scissor = this._scissorTest && renderContext.scissorValue.equals( _screen ) === false;
|
|
241
244
|
|
|
245
|
+
renderContext.depth = this.depth;
|
|
246
|
+
renderContext.stencil = this.stencil;
|
|
247
|
+
|
|
242
248
|
//
|
|
243
249
|
|
|
244
250
|
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
@@ -631,6 +637,12 @@ class Renderer {
|
|
|
631
637
|
|
|
632
638
|
}
|
|
633
639
|
|
|
640
|
+
readRenderTargetPixelsAsync( renderTarget, x, y, width, height ) {
|
|
641
|
+
|
|
642
|
+
return this.backend.copyTextureToBuffer( renderTarget.texture, x, y, width, height );
|
|
643
|
+
|
|
644
|
+
}
|
|
645
|
+
|
|
634
646
|
_projectObject( object, camera, groupOrder, renderList ) {
|
|
635
647
|
|
|
636
648
|
if ( object.visible === false ) return;
|
|
@@ -793,17 +805,47 @@ class Renderer {
|
|
|
793
805
|
|
|
794
806
|
//
|
|
795
807
|
|
|
796
|
-
|
|
797
|
-
|
|
808
|
+
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
809
|
+
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
798
810
|
|
|
799
811
|
//
|
|
800
812
|
|
|
801
|
-
|
|
813
|
+
material.onBeforeRender( this, scene, camera, geometry, material, group );
|
|
802
814
|
|
|
803
815
|
//
|
|
804
816
|
|
|
805
|
-
|
|
806
|
-
|
|
817
|
+
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
818
|
+
|
|
819
|
+
material.side = BackSide;
|
|
820
|
+
this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode, 'backSide' ); // create backSide pass id
|
|
821
|
+
|
|
822
|
+
material.side = FrontSide;
|
|
823
|
+
this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode ); // use default pass id
|
|
824
|
+
|
|
825
|
+
material.side = DoubleSide;
|
|
826
|
+
|
|
827
|
+
} else {
|
|
828
|
+
|
|
829
|
+
this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode );
|
|
830
|
+
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
//
|
|
834
|
+
|
|
835
|
+
object.onAfterRender( this, scene, camera, geometry, material, group );
|
|
836
|
+
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
_renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode, passId ) {
|
|
840
|
+
|
|
841
|
+
//
|
|
842
|
+
|
|
843
|
+
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, passId );
|
|
844
|
+
renderObject.context = this._currentRenderContext;
|
|
845
|
+
|
|
846
|
+
//
|
|
847
|
+
|
|
848
|
+
this._nodes.updateBefore( renderObject );
|
|
807
849
|
|
|
808
850
|
//
|
|
809
851
|
|
|
@@ -22,7 +22,7 @@ class Nodes extends DataMap {
|
|
|
22
22
|
|
|
23
23
|
if ( nodeBuilder === undefined ) {
|
|
24
24
|
|
|
25
|
-
nodeBuilder = this.backend.createNodeBuilder( renderObject.object, this.renderer );
|
|
25
|
+
nodeBuilder = this.backend.createNodeBuilder( renderObject.object, this.renderer, renderObject.scene );
|
|
26
26
|
nodeBuilder.material = renderObject.material;
|
|
27
27
|
nodeBuilder.lightsNode = renderObject.lightsNode;
|
|
28
28
|
nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
|