@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.
Files changed (180) hide show
  1. package/build/three.cjs +1260 -1517
  2. package/build/three.js +1267 -1524
  3. package/build/three.min.js +7 -8
  4. package/build/three.module.js +859 -1097
  5. package/build/three.module.min.js +6 -7
  6. package/examples/jsm/controls/ArcballControls.js +2 -1
  7. package/examples/jsm/controls/FlyControls.js +25 -9
  8. package/examples/jsm/controls/OrbitControls.js +7 -1
  9. package/examples/jsm/csm/CSM.js +1 -1
  10. package/examples/jsm/effects/AnaglyphEffect.js +1 -1
  11. package/examples/jsm/effects/OutlineEffect.js +1 -1
  12. package/examples/jsm/effects/ParallaxBarrierEffect.js +1 -1
  13. package/examples/jsm/environments/RoomEnvironment.js +6 -2
  14. package/examples/jsm/lines/LineMaterial.js +1 -1
  15. package/examples/jsm/loaders/3DMLoader.js +1 -1
  16. package/examples/jsm/loaders/3MFLoader.js +5 -1
  17. package/examples/jsm/loaders/AMFLoader.js +5 -1
  18. package/examples/jsm/loaders/ColladaLoader.js +4 -1
  19. package/examples/jsm/loaders/FBXLoader.js +9 -2
  20. package/examples/jsm/loaders/LDrawLoader.js +4 -7
  21. package/examples/jsm/loaders/PLYLoader.js +16 -6
  22. package/examples/jsm/loaders/VRMLLoader.js +16 -4
  23. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
  24. package/examples/jsm/math/MeshSurfaceSampler.js +76 -35
  25. package/examples/jsm/nodes/Nodes.js +20 -15
  26. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +21 -8
  27. package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
  28. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
  29. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -4
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
  31. package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
  32. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  33. package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
  35. package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
  36. package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
  37. package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  41. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  42. package/examples/jsm/nodes/code/CodeNode.js +3 -0
  43. package/examples/jsm/nodes/code/FunctionNode.js +25 -4
  44. package/examples/jsm/nodes/core/BypassNode.js +2 -2
  45. package/examples/jsm/nodes/core/ContextNode.js +2 -0
  46. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  47. package/examples/jsm/nodes/core/LightingModel.js +2 -1
  48. package/examples/jsm/nodes/core/Node.js +12 -15
  49. package/examples/jsm/nodes/core/NodeBuilder.js +24 -5
  50. package/examples/jsm/nodes/core/PropertyNode.js +4 -0
  51. package/examples/jsm/nodes/core/StackNode.js +1 -1
  52. package/examples/jsm/nodes/core/UniformNode.js +1 -1
  53. package/examples/jsm/nodes/core/VarNode.js +1 -3
  54. package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
  55. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
  56. package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
  57. package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
  58. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -8
  59. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  60. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  61. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -5
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +23 -15
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
  64. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
  65. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  66. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  67. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
  68. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
  69. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  70. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
  71. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  72. package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
  73. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +129 -18
  74. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
  75. package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
  76. package/examples/jsm/nodes/geometry/RangeNode.js +1 -1
  77. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
  78. package/examples/jsm/nodes/lighting/EnvironmentNode.js +91 -62
  79. package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
  80. package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
  81. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  82. package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
  83. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
  84. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
  85. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
  86. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
  87. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
  88. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
  89. package/examples/jsm/nodes/materials/NodeMaterial.js +79 -28
  90. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
  91. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  92. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
  93. package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
  94. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
  95. package/examples/jsm/nodes/math/MathNode.js +6 -0
  96. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  97. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  98. package/examples/jsm/nodes/shadernode/ShaderNode.js +24 -4
  99. package/examples/jsm/nodes/utils/LoopNode.js +1 -1
  100. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
  101. package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +1 -1
  103. package/examples/jsm/objects/Refractor.js +1 -1
  104. package/examples/jsm/objects/Sky.js +1 -1
  105. package/examples/jsm/objects/Water.js +1 -1
  106. package/examples/jsm/objects/Water2.js +1 -1
  107. package/examples/jsm/offscreen/scene.js +1 -0
  108. package/examples/jsm/postprocessing/EffectComposer.js +2 -0
  109. package/examples/jsm/postprocessing/OutlinePass.js +1 -3
  110. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -12
  111. package/examples/jsm/postprocessing/SavePass.js +3 -1
  112. package/examples/jsm/postprocessing/TAARenderPass.js +14 -2
  113. package/examples/jsm/postprocessing/TexturePass.js +2 -1
  114. package/examples/jsm/postprocessing/UnrealBloomPass.js +9 -10
  115. package/examples/jsm/renderers/common/Backend.js +2 -0
  116. package/examples/jsm/renderers/common/Background.js +7 -6
  117. package/examples/jsm/renderers/common/Pipelines.js +26 -14
  118. package/examples/jsm/renderers/common/RenderObject.js +18 -0
  119. package/examples/jsm/renderers/common/RenderObjects.js +29 -29
  120. package/examples/jsm/renderers/common/Renderer.js +48 -6
  121. package/examples/jsm/renderers/common/nodes/Nodes.js +1 -1
  122. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  123. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
  124. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +123 -41
  125. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +29 -9
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -0
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +8 -13
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +85 -3
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +5 -1
  130. package/examples/jsm/shaders/BlendShader.js +1 -2
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/CopyShader.js +2 -2
  133. package/examples/jsm/shaders/ToonShader.js +4 -4
  134. package/examples/jsm/shaders/WaterRefractionShader.js +1 -1
  135. package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
  136. package/package.json +2 -1
  137. package/src/Three.Legacy.js +0 -228
  138. package/src/animation/PropertyBinding.js +1 -1
  139. package/src/constants.js +1 -1
  140. package/src/core/BufferAttribute.js +0 -24
  141. package/src/core/BufferGeometry.js +0 -7
  142. package/src/loaders/Loader.js +2 -0
  143. package/src/loaders/MaterialLoader.js +1 -0
  144. package/src/materials/Material.js +3 -0
  145. package/src/objects/Skeleton.js +0 -2
  146. package/src/renderers/WebGLRenderer.js +9 -21
  147. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  148. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  149. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
  150. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
  151. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +9 -1
  152. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +1 -1
  154. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +1 -1
  155. package/src/renderers/shaders/ShaderChunk.js +10 -6
  156. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  157. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
  159. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  160. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  161. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
  162. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
  163. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
  164. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
  165. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
  166. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
  167. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
  168. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
  169. package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
  170. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  171. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
  172. package/src/renderers/webgl/WebGLObjects.js +23 -3
  173. package/src/renderers/webgl/WebGLProgram.js +24 -5
  174. package/src/renderers/webgl/WebGLPrograms.js +3 -0
  175. package/src/renderers/webxr/WebXRManager.js +11 -33
  176. package/src/scenes/Scene.js +0 -14
  177. package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -45
  178. /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
  179. /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
  180. /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 ) renderer.clear();
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
 
@@ -24,7 +24,8 @@ class TexturePass extends Pass {
24
24
  vertexShader: shader.vertexShader,
25
25
  fragmentShader: shader.fragmentShader,
26
26
  depthTest: false,
27
- depthWrite: false
27
+ depthWrite: false,
28
+ premultipliedAlpha: true
28
29
 
29
30
  } );
30
31
 
@@ -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
- // Gaussian Blur Materials
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
- // Composite material
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
- // copy material
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.materialCopy = new ShaderMaterial( {
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.materialCopy.dispose();
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.materialCopy;
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 );
@@ -68,6 +68,8 @@ class Backend {
68
68
 
69
69
  createTexture( texture ) { }
70
70
 
71
+ copyTextureToBuffer( texture, x, y, width, height ) {}
72
+
71
73
  // attributes
72
74
 
73
75
  createAttribute( attribute ) { }
@@ -1,6 +1,6 @@
1
1
  import DataMap from './DataMap.js';
2
- import { Color, Mesh, BoxGeometry, BackSide } from 'three';
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.copy( renderer._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.copy( background );
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 BoxGeometry( 1, 1, 1 ), nodeMaterial );
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 extends ChainMap {
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 = super.get( chainArray );
25
+ let renderObject = chainMap.get( chainArray );
26
26
 
27
27
  if ( renderObject === undefined ) {
28
28
 
29
- renderObject = new RenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode );
30
-
31
- this._initRenderObject( renderObject );
29
+ renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, passId );
32
30
 
33
- this.set( chainArray, renderObject );
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
- data.cacheKey = cacheKey;
40
+ renderObject.dispose();
43
41
 
44
- this.pipelines.delete( renderObject );
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
- dispose() {
52
+ getChainMap( passId = 'default' ) {
56
53
 
57
- super.dispose();
58
-
59
- this.dataMap.clear();
54
+ return this.chainMaps[ passId ] || ( this.chainMaps[ passId ] = new ChainMap() );
60
55
 
61
56
  }
62
57
 
63
- _initRenderObject( renderObject ) {
58
+ dispose() {
59
+
60
+ this.chainMaps = {};
61
+ this.dataMap = new DataMap();
64
62
 
65
- const data = this.dataMap.get( renderObject );
63
+ }
66
64
 
67
- if ( data.initialized !== true ) {
65
+ createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, passId ) {
68
66
 
69
- data.initialized = true;
70
- data.cacheKey = renderObject.getCacheKey();
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
- const onDispose = () => {
71
+ const data = dataMap.get( renderObject );
72
+ data.cacheKey = renderObject.getCacheKey();
73
73
 
74
- renderObject.material.removeEventListener( 'dispose', onDispose );
74
+ renderObject.onDispose = () => {
75
75
 
76
- this.pipelines.delete( renderObject );
77
- this.nodes.delete( renderObject );
76
+ dataMap.delete( renderObject );
78
77
 
79
- this.delete( renderObject.getChainArray() );
78
+ this.pipelines.delete( renderObject );
79
+ this.nodes.delete( renderObject );
80
80
 
81
- };
81
+ chainMap.delete( renderObject.getChainArray() );
82
82
 
83
- renderObject.material.addEventListener( 'dispose', onDispose );
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
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode );
797
- renderObject.context = this._currentRenderContext;
808
+ object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
809
+ object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
798
810
 
799
811
  //
800
812
 
801
- this._nodes.updateBefore( renderObject );
813
+ material.onBeforeRender( this, scene, camera, geometry, material, group );
802
814
 
803
815
  //
804
816
 
805
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
806
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
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 );