super-three 0.169.1 → 0.170.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 +974 -562
- package/build/three.module.js +975 -559
- package/build/three.module.min.js +1 -1
- package/build/three.webgpu.js +8398 -9842
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +8398 -9842
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +3 -3
- package/examples/jsm/animation/MMDAnimationHelper.js +2 -0
- package/examples/jsm/animation/MMDPhysics.js +2 -0
- package/examples/jsm/controls/TransformControls.js +22 -6
- package/examples/jsm/csm/CSM.js +2 -2
- package/examples/jsm/csm/CSMFrustum.js +7 -4
- package/examples/jsm/csm/CSMHelper.js +2 -0
- package/examples/jsm/csm/CSMShadowNode.js +435 -0
- package/examples/jsm/curves/NURBSCurve.js +34 -3
- package/examples/jsm/exporters/GLTFExporter.js +138 -71
- package/examples/jsm/exporters/KTX2Exporter.js +35 -12
- package/examples/jsm/exporters/MMDExporter.js +6 -0
- package/examples/jsm/exporters/USDZExporter.js +21 -3
- package/examples/jsm/geometries/DecalGeometry.js +65 -20
- package/examples/jsm/geometries/InstancedPointsGeometry.js +2 -0
- package/examples/jsm/helpers/TextureHelperGPU.js +175 -0
- package/examples/jsm/interactive/HTMLMesh.js +1 -0
- package/examples/jsm/lighting/TiledLighting.js +18 -0
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/LineMaterial.js +7 -2
- package/examples/jsm/lines/LineSegmentsGeometry.js +2 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +0 -15
- package/examples/jsm/lines/webgpu/Wireframe.js +56 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -0
- package/examples/jsm/loaders/3MFLoader.js +91 -0
- package/examples/jsm/loaders/FBXLoader.js +12 -2
- package/examples/jsm/loaders/GLTFLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +140 -49
- package/examples/jsm/loaders/LDrawLoader.js +22 -136
- package/examples/jsm/loaders/LottieLoader.js +1 -0
- package/examples/jsm/loaders/MMDLoader.js +9 -2
- package/examples/jsm/materials/LDrawConditionalLineMaterial.js +143 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +114 -0
- package/examples/jsm/materials/MeshGouraudMaterial.js +6 -2
- package/examples/jsm/math/ColorSpaces.js +76 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +52 -40
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +293 -0
- package/examples/jsm/misc/VolumeSlice.js +1 -0
- package/examples/jsm/objects/WaterMesh.js +8 -8
- package/examples/jsm/postprocessing/AfterimagePass.js +14 -3
- package/examples/jsm/postprocessing/SSRPass.js +6 -0
- package/examples/jsm/renderers/CSS2DRenderer.js +6 -3
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -4
- package/examples/jsm/shaders/FXAAShader.js +225 -224
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/{src/nodes → examples/jsm/tsl}/display/AfterImageNode.js +17 -20
- package/{src/nodes → examples/jsm/tsl}/display/AnaglyphPassNode.js +2 -6
- package/{src/nodes → examples/jsm/tsl}/display/AnamorphicNode.js +12 -18
- package/{src/nodes → examples/jsm/tsl}/display/BleachBypass.js +1 -3
- package/{src/nodes → examples/jsm/tsl}/display/BloomNode.js +11 -40
- package/{src/nodes → examples/jsm/tsl}/display/DenoiseNode.js +18 -41
- package/{src/nodes → examples/jsm/tsl}/display/DepthOfFieldNode.js +2 -8
- package/{src/nodes → examples/jsm/tsl}/display/DotScreenNode.js +2 -9
- package/examples/jsm/tsl/display/FXAANode.js +316 -0
- package/{src/nodes → examples/jsm/tsl}/display/FilmNode.js +2 -6
- package/{src/nodes → examples/jsm/tsl}/display/GTAONode.js +30 -70
- package/{src/nodes → examples/jsm/tsl}/display/GaussianBlurNode.js +74 -36
- package/examples/jsm/tsl/display/LensflareNode.js +161 -0
- package/{src/nodes → examples/jsm/tsl}/display/Lut3DNode.js +1 -4
- package/{src/nodes → examples/jsm/tsl}/display/MotionBlur.js +2 -3
- package/examples/jsm/tsl/display/OutlineNode.js +434 -0
- package/{src/nodes → examples/jsm/tsl}/display/ParallaxBarrierPassNode.js +1 -5
- package/{src/nodes → examples/jsm/tsl}/display/PixelationPassNode.js +3 -15
- package/{src/nodes → examples/jsm/tsl}/display/RGBShiftNode.js +1 -6
- package/examples/jsm/tsl/display/SMAANode.js +620 -0
- package/{src/nodes → examples/jsm/tsl}/display/SSAAPassNode.js +10 -25
- package/examples/jsm/tsl/display/SSRNode.js +343 -0
- package/{src/nodes → examples/jsm/tsl}/display/Sepia.js +1 -2
- package/{src/nodes → examples/jsm/tsl}/display/SobelOperatorNode.js +3 -11
- package/{src/nodes → examples/jsm/tsl}/display/StereoCompositePassNode.js +9 -11
- package/{src/nodes → examples/jsm/tsl}/display/StereoPassNode.js +10 -11
- package/examples/jsm/tsl/display/TRAAPassNode.js +355 -0
- package/{src/nodes → examples/jsm/tsl}/display/TransitionNode.js +1 -6
- package/examples/jsm/tsl/display/hashBlur.js +24 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +392 -0
- package/examples/jsm/utils/{TextureUtilsGPU.js → WebGPUTextureUtils.js} +2 -1
- package/examples/jsm/webxr/OculusHandPointerModel.js +21 -21
- package/examples/jsm/webxr/Text2D.js +6 -6
- package/package.json +2 -2
- package/src/Three.WebGPU.Nodes.js +4 -0
- package/src/Three.WebGPU.js +4 -0
- package/src/constants.js +1 -6
- package/src/core/BufferGeometry.js +44 -6
- package/src/geometries/CylinderGeometry.js +2 -2
- package/src/materials/LineBasicMaterial.js +6 -2
- package/src/materials/LineDashedMaterial.js +6 -2
- package/src/materials/Material.js +14 -1
- package/src/materials/MeshBasicMaterial.js +6 -2
- package/src/materials/MeshDepthMaterial.js +6 -2
- package/src/materials/MeshDistanceMaterial.js +6 -2
- package/src/materials/MeshLambertMaterial.js +6 -2
- package/src/materials/MeshMatcapMaterial.js +6 -2
- package/src/materials/MeshNormalMaterial.js +6 -2
- package/src/materials/MeshPhongMaterial.js +6 -2
- package/src/materials/MeshPhysicalMaterial.js +6 -2
- package/src/materials/MeshStandardMaterial.js +6 -2
- package/src/materials/MeshToonMaterial.js +6 -2
- package/src/materials/PointsMaterial.js +6 -2
- package/src/materials/RawShaderMaterial.js +6 -2
- package/src/materials/ShaderMaterial.js +6 -2
- package/src/materials/ShadowMaterial.js +6 -2
- package/src/materials/SpriteMaterial.js +6 -2
- package/src/materials/nodes/NodeMaterial.js +31 -9
- package/src/materials/nodes/SpriteNodeMaterial.js +11 -2
- package/src/materials/nodes/manager/NodeMaterialObserver.js +111 -2
- package/src/math/ColorManagement.js +118 -85
- package/src/math/Vector4.js +11 -0
- package/src/nodes/Nodes.js +1 -21
- package/src/nodes/TSL.js +6 -24
- package/src/nodes/accessors/Camera.js +0 -1
- package/src/nodes/accessors/SceneNode.js +35 -1
- package/src/nodes/accessors/StorageBufferNode.js +32 -10
- package/src/nodes/accessors/VelocityNode.js +13 -3
- package/src/nodes/code/FunctionCallNode.js +16 -5
- package/src/nodes/code/ScriptableNode.js +4 -4
- package/src/nodes/core/Node.js +1 -0
- package/src/nodes/core/NodeBuilder.js +29 -5
- package/src/nodes/core/VarNode.js +15 -3
- package/src/nodes/display/ColorAdjustment.js +53 -4
- package/src/nodes/display/ColorSpaceFunctions.js +5 -5
- package/src/nodes/display/ColorSpaceNode.js +27 -39
- package/src/nodes/display/PassNode.js +6 -4
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ViewportDepthNode.js +33 -1
- package/src/nodes/functions/PhysicalLightingModel.js +21 -15
- package/src/nodes/functions/material/getAlphaHashThreshold.js +64 -0
- package/src/nodes/functions/material/getGeometryRoughness.js +8 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +22 -0
- package/src/nodes/gpgpu/ComputeNode.js +9 -1
- package/src/nodes/lighting/AnalyticLightNode.js +12 -416
- package/src/nodes/lighting/LightsNode.js +24 -12
- package/src/nodes/lighting/PointLightNode.js +36 -26
- package/src/nodes/lighting/RectAreaLightNode.js +3 -0
- package/src/nodes/lighting/ShadowNode.js +484 -0
- package/src/nodes/utils/LoopNode.js +2 -2
- package/src/nodes/utils/Oscillators.js +6 -0
- package/src/nodes/utils/PostProcessingUtils.js +89 -0
- package/src/nodes/utils/ReflectorNode.js +101 -15
- package/src/nodes/utils/Timer.js +29 -0
- package/src/objects/BatchedMesh.js +458 -241
- package/src/renderers/WebGLRenderer.js +120 -117
- package/src/renderers/common/Attributes.js +4 -0
- package/src/renderers/common/Backend.js +2 -0
- package/src/renderers/common/Background.js +14 -4
- package/src/renderers/common/Bindings.js +3 -2
- package/src/renderers/common/Constants.js +2 -1
- package/src/renderers/common/Geometries.js +20 -0
- package/src/renderers/common/IndirectStorageBufferAttribute.js +15 -0
- package/src/renderers/common/Lighting.js +45 -0
- package/src/renderers/common/PostProcessingUtils.js +86 -0
- package/src/renderers/common/RenderList.js +39 -11
- package/src/renderers/common/RenderLists.js +4 -2
- package/src/renderers/common/RenderObject.js +18 -1
- package/src/renderers/common/Renderer.js +165 -26
- package/src/renderers/common/Textures.js +30 -14
- package/src/renderers/common/nodes/NodeLibrary.js +1 -14
- package/src/renderers/common/nodes/Nodes.js +2 -2
- package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +4 -24
- package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +2 -2
- package/src/renderers/webgl/WebGLBufferRenderer.js +2 -6
- package/src/renderers/webgl/WebGLCapabilities.js +0 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +2 -6
- package/src/renderers/webgl/WebGLProgram.js +24 -28
- package/src/renderers/webgl/WebGLPrograms.js +5 -2
- package/src/renderers/webgl/WebGLState.js +37 -1
- package/src/renderers/webgl/WebGLTextures.js +29 -12
- package/src/renderers/webgl-fallback/WebGLBackend.js +98 -31
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +2 -7
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +33 -8
- package/src/renderers/webgpu/WebGPUBackend.js +105 -25
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -1
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +0 -8
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -8
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +10 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +12 -4
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +29 -9
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +24 -6
- package/src/renderers/webgpu/utils/WebGPUUtils.js +0 -1
- package/src/renderers/webxr/WebXRManager.js +4 -4
- package/examples/jsm/cameras/CinematicCamera.js +0 -208
- package/src/nodes/display/FXAANode.js +0 -332
- package/src/nodes/utils/OscNode.js +0 -85
- package/src/nodes/utils/TimerNode.js +0 -97
- /package/examples/jsm/utils/{TextureUtils.js → WebGLTextureUtils.js} +0 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { Color, DepthTexture, FloatType, RenderTarget, Vector2, PostProcessingUtils } from 'three';
|
|
2
|
+
import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, QuadMesh, screenUV, TempNode, nodeObject, NodeUpdateType, uniform, vec4, NodeMaterial, passTexture, texture, perspectiveDepthToViewZ, positionView } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
|
+
const _size = /*@__PURE__*/ new Vector2();
|
|
6
|
+
const _BLUR_DIRECTION_X = /*@__PURE__*/ new Vector2( 1.0, 0.0 );
|
|
7
|
+
const _BLUR_DIRECTION_Y = /*@__PURE__*/ new Vector2( 0.0, 1.0 );
|
|
8
|
+
|
|
9
|
+
let _rendererState;
|
|
10
|
+
|
|
11
|
+
class OutlineNode extends TempNode {
|
|
12
|
+
|
|
13
|
+
static get type() {
|
|
14
|
+
|
|
15
|
+
return 'OutlineNode';
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
constructor( scene, camera, params = {} ) {
|
|
20
|
+
|
|
21
|
+
super( 'vec4' );
|
|
22
|
+
|
|
23
|
+
const {
|
|
24
|
+
selectedObjects = [],
|
|
25
|
+
edgeThickness = float( 1 ),
|
|
26
|
+
edgeGlow = float( 0 ),
|
|
27
|
+
downSampleRatio = 2
|
|
28
|
+
} = params;
|
|
29
|
+
|
|
30
|
+
this.scene = scene;
|
|
31
|
+
this.camera = camera;
|
|
32
|
+
this.selectedObjects = selectedObjects;
|
|
33
|
+
this.edgeThicknessNode = nodeObject( edgeThickness );
|
|
34
|
+
this.edgeGlowNode = nodeObject( edgeGlow );
|
|
35
|
+
this.downSampleRatio = downSampleRatio;
|
|
36
|
+
|
|
37
|
+
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
38
|
+
|
|
39
|
+
// render targets
|
|
40
|
+
|
|
41
|
+
this._renderTargetDepthBuffer = new RenderTarget();
|
|
42
|
+
this._renderTargetDepthBuffer.depthTexture = new DepthTexture();
|
|
43
|
+
this._renderTargetDepthBuffer.depthTexture.type = FloatType;
|
|
44
|
+
|
|
45
|
+
this._renderTargetMaskBuffer = new RenderTarget();
|
|
46
|
+
this._renderTargetMaskDownSampleBuffer = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
47
|
+
this._renderTargetEdgeBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
48
|
+
this._renderTargetEdgeBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
49
|
+
this._renderTargetBlurBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
50
|
+
this._renderTargetBlurBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
51
|
+
this._renderTargetComposite = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
52
|
+
|
|
53
|
+
// uniforms
|
|
54
|
+
|
|
55
|
+
this._cameraNear = uniform( camera.near );
|
|
56
|
+
this._cameraFar = uniform( camera.far );
|
|
57
|
+
this._blurDirection = uniform( new Vector2() );
|
|
58
|
+
|
|
59
|
+
this._depthTextureUniform = texture( this._renderTargetDepthBuffer.depthTexture );
|
|
60
|
+
this._maskTextureUniform = texture( this._renderTargetMaskBuffer.texture );
|
|
61
|
+
this._maskTextureDownsSampleUniform = texture( this._renderTargetMaskDownSampleBuffer.texture );
|
|
62
|
+
this._edge1TextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
|
|
63
|
+
this._edge2TextureUniform = texture( this._renderTargetEdgeBuffer2.texture );
|
|
64
|
+
this._blurColorTextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
|
|
65
|
+
|
|
66
|
+
// constants
|
|
67
|
+
|
|
68
|
+
this._visibleEdgeColor = vec3( 1, 0, 0 );
|
|
69
|
+
this._hiddenEdgeColor = vec3( 0, 1, 0 );
|
|
70
|
+
|
|
71
|
+
// materials
|
|
72
|
+
|
|
73
|
+
this._depthMaterial = new NodeMaterial();
|
|
74
|
+
this._depthMaterial.fragmentNode = vec4( 0, 0, 0, 1 );
|
|
75
|
+
this._depthMaterial.name = 'OutlineNode.depth';
|
|
76
|
+
|
|
77
|
+
this._prepareMaskMaterial = new NodeMaterial();
|
|
78
|
+
this._prepareMaskMaterial.name = 'OutlineNode.prepareMask';
|
|
79
|
+
|
|
80
|
+
this._materialCopy = new NodeMaterial();
|
|
81
|
+
this._materialCopy.name = 'OutlineNode.copy';
|
|
82
|
+
|
|
83
|
+
this._edgeDetectionMaterial = new NodeMaterial();
|
|
84
|
+
this._edgeDetectionMaterial.name = 'OutlineNode.edgeDetection';
|
|
85
|
+
|
|
86
|
+
this._separableBlurMaterial = new NodeMaterial();
|
|
87
|
+
this._separableBlurMaterial.name = 'OutlineNode.separableBlur';
|
|
88
|
+
|
|
89
|
+
this._separableBlurMaterial2 = new NodeMaterial();
|
|
90
|
+
this._separableBlurMaterial2.name = 'OutlineNode.separableBlur2';
|
|
91
|
+
|
|
92
|
+
this._compositeMaterial = new NodeMaterial();
|
|
93
|
+
this._compositeMaterial.name = 'OutlineNode.composite';
|
|
94
|
+
|
|
95
|
+
//
|
|
96
|
+
|
|
97
|
+
this._selectionCache = new Set();
|
|
98
|
+
this._tempPulseColor1 = new Color();
|
|
99
|
+
this._tempPulseColor2 = new Color();
|
|
100
|
+
|
|
101
|
+
//
|
|
102
|
+
|
|
103
|
+
this._textureNode = passTexture( this, this._renderTargetComposite.texture );
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
get visibleEdge() {
|
|
108
|
+
|
|
109
|
+
return this.r;
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
get hiddenEdge() {
|
|
114
|
+
|
|
115
|
+
return this.g;
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
getTextureNode() {
|
|
120
|
+
|
|
121
|
+
return this._textureNode;
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
setSize( width, height ) {
|
|
126
|
+
|
|
127
|
+
this._renderTargetDepthBuffer.setSize( width, height );
|
|
128
|
+
this._renderTargetMaskBuffer.setSize( width, height );
|
|
129
|
+
this._renderTargetComposite.setSize( width, height );
|
|
130
|
+
|
|
131
|
+
// downsample 1
|
|
132
|
+
|
|
133
|
+
let resx = Math.round( width / this.downSampleRatio );
|
|
134
|
+
let resy = Math.round( height / this.downSampleRatio );
|
|
135
|
+
|
|
136
|
+
this._renderTargetMaskDownSampleBuffer.setSize( resx, resy );
|
|
137
|
+
this._renderTargetEdgeBuffer1.setSize( resx, resy );
|
|
138
|
+
this._renderTargetBlurBuffer1.setSize( resx, resy );
|
|
139
|
+
|
|
140
|
+
// downsample 2
|
|
141
|
+
|
|
142
|
+
resx = Math.round( resx / 2 );
|
|
143
|
+
resy = Math.round( resy / 2 );
|
|
144
|
+
|
|
145
|
+
this._renderTargetEdgeBuffer2.setSize( resx, resy );
|
|
146
|
+
this._renderTargetBlurBuffer2.setSize( resx, resy );
|
|
147
|
+
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
updateBefore( frame ) {
|
|
151
|
+
|
|
152
|
+
const { renderer } = frame;
|
|
153
|
+
const { camera, scene } = this;
|
|
154
|
+
|
|
155
|
+
_rendererState = PostProcessingUtils.resetRendererAndSceneState( renderer, scene, _rendererState );
|
|
156
|
+
|
|
157
|
+
//
|
|
158
|
+
|
|
159
|
+
const size = renderer.getDrawingBufferSize( _size );
|
|
160
|
+
this.setSize( size.width, size.height );
|
|
161
|
+
|
|
162
|
+
//
|
|
163
|
+
|
|
164
|
+
renderer.setClearColor( 0xffffff, 1 );
|
|
165
|
+
|
|
166
|
+
this._updateSelectionCache();
|
|
167
|
+
|
|
168
|
+
// 1. Draw non-selected objects in the depth buffer
|
|
169
|
+
|
|
170
|
+
scene.overrideMaterial = this._depthMaterial;
|
|
171
|
+
|
|
172
|
+
renderer.setRenderTarget( this._renderTargetDepthBuffer );
|
|
173
|
+
renderer.setRenderObjectFunction( ( object, ...params ) => {
|
|
174
|
+
|
|
175
|
+
if ( this._selectionCache.has( object ) === false ) {
|
|
176
|
+
|
|
177
|
+
renderer.renderObject( object, ...params );
|
|
178
|
+
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
} );
|
|
182
|
+
|
|
183
|
+
renderer.render( scene, camera );
|
|
184
|
+
|
|
185
|
+
// 2. Draw only the selected objects by comparing the depth buffer of non-selected objects
|
|
186
|
+
|
|
187
|
+
scene.overrideMaterial = this._prepareMaskMaterial;
|
|
188
|
+
|
|
189
|
+
renderer.setRenderTarget( this._renderTargetMaskBuffer );
|
|
190
|
+
renderer.setRenderObjectFunction( ( object, ...params ) => {
|
|
191
|
+
|
|
192
|
+
if ( this._selectionCache.has( object ) === true ) {
|
|
193
|
+
|
|
194
|
+
renderer.renderObject( object, ...params );
|
|
195
|
+
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
} );
|
|
199
|
+
|
|
200
|
+
renderer.render( scene, camera );
|
|
201
|
+
|
|
202
|
+
//
|
|
203
|
+
|
|
204
|
+
renderer.setRenderObjectFunction( _rendererState.renderObjectFunction );
|
|
205
|
+
|
|
206
|
+
this._selectionCache.clear();
|
|
207
|
+
|
|
208
|
+
// 3. Downsample to (at least) half resolution
|
|
209
|
+
|
|
210
|
+
_quadMesh.material = this._materialCopy;
|
|
211
|
+
renderer.setRenderTarget( this._renderTargetMaskDownSampleBuffer );
|
|
212
|
+
_quadMesh.render( renderer );
|
|
213
|
+
|
|
214
|
+
// 4. Perform edge detection (half resolution)
|
|
215
|
+
|
|
216
|
+
_quadMesh.material = this._edgeDetectionMaterial;
|
|
217
|
+
renderer.setRenderTarget( this._renderTargetEdgeBuffer1 );
|
|
218
|
+
_quadMesh.render( renderer );
|
|
219
|
+
|
|
220
|
+
// 5. Apply blur (half resolution)
|
|
221
|
+
|
|
222
|
+
this._blurColorTextureUniform.value = this._renderTargetEdgeBuffer1.texture;
|
|
223
|
+
this._blurDirection.value.copy( _BLUR_DIRECTION_X );
|
|
224
|
+
|
|
225
|
+
_quadMesh.material = this._separableBlurMaterial;
|
|
226
|
+
renderer.setRenderTarget( this._renderTargetBlurBuffer1 );
|
|
227
|
+
_quadMesh.render( renderer );
|
|
228
|
+
|
|
229
|
+
this._blurColorTextureUniform.value = this._renderTargetBlurBuffer1.texture;
|
|
230
|
+
this._blurDirection.value.copy( _BLUR_DIRECTION_Y );
|
|
231
|
+
|
|
232
|
+
renderer.setRenderTarget( this._renderTargetEdgeBuffer1 );
|
|
233
|
+
_quadMesh.render( renderer );
|
|
234
|
+
|
|
235
|
+
// 6. Apply blur (quarter resolution)
|
|
236
|
+
|
|
237
|
+
this._blurColorTextureUniform.value = this._renderTargetEdgeBuffer1.texture;
|
|
238
|
+
this._blurDirection.value.copy( _BLUR_DIRECTION_X );
|
|
239
|
+
|
|
240
|
+
_quadMesh.material = this._separableBlurMaterial2;
|
|
241
|
+
renderer.setRenderTarget( this._renderTargetBlurBuffer2 );
|
|
242
|
+
_quadMesh.render( renderer );
|
|
243
|
+
|
|
244
|
+
this._blurColorTextureUniform.value = this._renderTargetBlurBuffer2.texture;
|
|
245
|
+
this._blurDirection.value.copy( _BLUR_DIRECTION_Y );
|
|
246
|
+
|
|
247
|
+
renderer.setRenderTarget( this._renderTargetEdgeBuffer2 );
|
|
248
|
+
_quadMesh.render( renderer );
|
|
249
|
+
|
|
250
|
+
// 7. Composite
|
|
251
|
+
|
|
252
|
+
_quadMesh.material = this._compositeMaterial;
|
|
253
|
+
renderer.setRenderTarget( this._renderTargetComposite );
|
|
254
|
+
_quadMesh.render( renderer );
|
|
255
|
+
|
|
256
|
+
// restore
|
|
257
|
+
|
|
258
|
+
PostProcessingUtils.restoreRendererAndSceneState( renderer, scene, _rendererState );
|
|
259
|
+
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
setup() {
|
|
263
|
+
|
|
264
|
+
// prepare mask material
|
|
265
|
+
|
|
266
|
+
const prepareMask = () => {
|
|
267
|
+
|
|
268
|
+
const depth = this._depthTextureUniform.uv( screenUV );
|
|
269
|
+
|
|
270
|
+
let viewZNode;
|
|
271
|
+
|
|
272
|
+
if ( this.camera.isPerspectiveCamera ) {
|
|
273
|
+
|
|
274
|
+
viewZNode = perspectiveDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
275
|
+
|
|
276
|
+
} else {
|
|
277
|
+
|
|
278
|
+
viewZNode = orthographicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
279
|
+
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const depthTest = positionView.z.lessThanEqual( viewZNode ).select( 1, 0 );
|
|
283
|
+
return vec4( 0.0, depthTest, 1.0, 1.0 );
|
|
284
|
+
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
this._prepareMaskMaterial.fragmentNode = prepareMask();
|
|
288
|
+
this._prepareMaskMaterial.needsUpdate = true;
|
|
289
|
+
|
|
290
|
+
// copy material
|
|
291
|
+
|
|
292
|
+
this._materialCopy.fragmentNode = this._maskTextureUniform;
|
|
293
|
+
this._materialCopy.needsUpdate = true;
|
|
294
|
+
|
|
295
|
+
// edge detection material
|
|
296
|
+
|
|
297
|
+
const edgeDetection = Fn( () => {
|
|
298
|
+
|
|
299
|
+
const resolution = textureSize( this._maskTextureDownsSampleUniform );
|
|
300
|
+
const invSize = vec2( 1 ).div( resolution ).toVar();
|
|
301
|
+
const uvOffset = vec4( 1.0, 0.0, 0.0, 1.0 ).mul( vec4( invSize, invSize ) );
|
|
302
|
+
|
|
303
|
+
const uvNode = uv();
|
|
304
|
+
const c1 = this._maskTextureDownsSampleUniform.uv( uvNode.add( uvOffset.xy ) ).toVar();
|
|
305
|
+
const c2 = this._maskTextureDownsSampleUniform.uv( uvNode.sub( uvOffset.xy ) ).toVar();
|
|
306
|
+
const c3 = this._maskTextureDownsSampleUniform.uv( uvNode.add( uvOffset.yw ) ).toVar();
|
|
307
|
+
const c4 = this._maskTextureDownsSampleUniform.uv( uvNode.sub( uvOffset.yw ) ).toVar();
|
|
308
|
+
|
|
309
|
+
const diff1 = mul( c1.r.sub( c2.r ), 0.5 );
|
|
310
|
+
const diff2 = mul( c3.r.sub( c4.r ), 0.5 );
|
|
311
|
+
const d = vec2( diff1, diff2 ).length();
|
|
312
|
+
const a1 = min( c1.g, c2.g );
|
|
313
|
+
const a2 = min( c3.g, c4.g );
|
|
314
|
+
const visibilityFactor = min( a1, a2 );
|
|
315
|
+
const edgeColor = visibilityFactor.oneMinus().greaterThan( 0.001 ).select( this._visibleEdgeColor, this._hiddenEdgeColor );
|
|
316
|
+
return vec4( edgeColor, 1 ).mul( d );
|
|
317
|
+
|
|
318
|
+
} );
|
|
319
|
+
|
|
320
|
+
this._edgeDetectionMaterial.fragmentNode = edgeDetection();
|
|
321
|
+
this._edgeDetectionMaterial.needsUpdate = true;
|
|
322
|
+
|
|
323
|
+
// seperable blur material
|
|
324
|
+
|
|
325
|
+
const MAX_RADIUS = 4;
|
|
326
|
+
|
|
327
|
+
const gaussianPdf = Fn( ( [ x, sigma ] ) => {
|
|
328
|
+
|
|
329
|
+
return float( 0.39894 ).mul( exp( float( - 0.5 ).mul( x ).mul( x ).div( sigma.mul( sigma ) ) ).div( sigma ) );
|
|
330
|
+
|
|
331
|
+
} );
|
|
332
|
+
|
|
333
|
+
const seperableBlur = Fn( ( [ kernelRadius ] ) => {
|
|
334
|
+
|
|
335
|
+
const resolution = textureSize( this._maskTextureDownsSampleUniform );
|
|
336
|
+
const invSize = vec2( 1 ).div( resolution ).toVar();
|
|
337
|
+
const uvNode = uv();
|
|
338
|
+
|
|
339
|
+
const sigma = kernelRadius.div( 2 ).toVar();
|
|
340
|
+
const weightSum = gaussianPdf( 0, sigma ).toVar();
|
|
341
|
+
const diffuseSum = this._blurColorTextureUniform.uv( uvNode ).mul( weightSum ).toVar();
|
|
342
|
+
const delta = this._blurDirection.mul( invSize ).mul( kernelRadius ).div( MAX_RADIUS ).toVar();
|
|
343
|
+
|
|
344
|
+
const uvOffset = delta.toVar();
|
|
345
|
+
|
|
346
|
+
Loop( { start: int( 1 ), end: int( MAX_RADIUS ), type: 'int', condition: '<=' }, ( { i } ) => {
|
|
347
|
+
|
|
348
|
+
const x = kernelRadius.mul( float( i ) ).div( MAX_RADIUS );
|
|
349
|
+
const w = gaussianPdf( x, sigma );
|
|
350
|
+
const sample1 = this._blurColorTextureUniform.uv( uvNode.add( uvOffset ) );
|
|
351
|
+
const sample2 = this._blurColorTextureUniform.uv( uvNode.sub( uvOffset ) );
|
|
352
|
+
|
|
353
|
+
diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
|
|
354
|
+
weightSum.addAssign( w.mul( 2 ) );
|
|
355
|
+
uvOffset.addAssign( delta );
|
|
356
|
+
|
|
357
|
+
} );
|
|
358
|
+
|
|
359
|
+
return diffuseSum.div( weightSum );
|
|
360
|
+
|
|
361
|
+
} );
|
|
362
|
+
|
|
363
|
+
this._separableBlurMaterial.fragmentNode = seperableBlur( this.edgeThicknessNode );
|
|
364
|
+
this._separableBlurMaterial.needsUpdate = true;
|
|
365
|
+
|
|
366
|
+
this._separableBlurMaterial2.fragmentNode = seperableBlur( MAX_RADIUS );
|
|
367
|
+
this._separableBlurMaterial2.needsUpdate = true;
|
|
368
|
+
|
|
369
|
+
// composite material
|
|
370
|
+
|
|
371
|
+
const composite = Fn( () => {
|
|
372
|
+
|
|
373
|
+
const edgeValue1 = this._edge1TextureUniform;
|
|
374
|
+
const edgeValue2 = this._edge2TextureUniform;
|
|
375
|
+
const maskColor = this._maskTextureUniform;
|
|
376
|
+
|
|
377
|
+
const edgeValue = edgeValue1.add( edgeValue2.mul( this.edgeGlowNode ) );
|
|
378
|
+
|
|
379
|
+
return maskColor.r.mul( edgeValue );
|
|
380
|
+
|
|
381
|
+
} );
|
|
382
|
+
|
|
383
|
+
this._compositeMaterial.fragmentNode = composite();
|
|
384
|
+
this._compositeMaterial.needsUpdate = true;
|
|
385
|
+
|
|
386
|
+
return this._textureNode;
|
|
387
|
+
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
dispose() {
|
|
391
|
+
|
|
392
|
+
this.selectedObjects.length = 0;
|
|
393
|
+
|
|
394
|
+
this._renderTargetDepthBuffer.dispose();
|
|
395
|
+
this._renderTargetMaskBuffer.dispose();
|
|
396
|
+
this._renderTargetMaskDownSampleBuffer.dispose();
|
|
397
|
+
this._renderTargetEdgeBuffer1.dispose();
|
|
398
|
+
this._renderTargetEdgeBuffer2.dispose();
|
|
399
|
+
this._renderTargetBlurBuffer1.dispose();
|
|
400
|
+
this._renderTargetBlurBuffer2.dispose();
|
|
401
|
+
this._renderTargetComposite.dispose();
|
|
402
|
+
|
|
403
|
+
this._depthMaterial.dispose();
|
|
404
|
+
this._prepareMaskMaterial.dispose();
|
|
405
|
+
this._materialCopy.dispose();
|
|
406
|
+
this._edgeDetectionMaterial.dispose();
|
|
407
|
+
this._separableBlurMaterial.dispose();
|
|
408
|
+
this._separableBlurMaterial2.dispose();
|
|
409
|
+
this._compositeMaterial.dispose();
|
|
410
|
+
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
//
|
|
414
|
+
|
|
415
|
+
_updateSelectionCache() {
|
|
416
|
+
|
|
417
|
+
for ( let i = 0; i < this.selectedObjects.length; i ++ ) {
|
|
418
|
+
|
|
419
|
+
const selectedObject = this.selectedObjects[ i ];
|
|
420
|
+
selectedObject.traverse( ( object ) => {
|
|
421
|
+
|
|
422
|
+
if ( object.isMesh ) this._selectionCache.add( object );
|
|
423
|
+
|
|
424
|
+
} );
|
|
425
|
+
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
export default OutlineNode;
|
|
433
|
+
|
|
434
|
+
export const outline = ( scene, camera, params ) => nodeObject( new OutlineNode( scene, camera, params ) );
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import { Fn, If,
|
|
2
|
-
import { uv } from '../accessors/UV.js';
|
|
3
|
-
import { mod } from '../math/MathNode.js';
|
|
4
|
-
import { screenCoordinate } from './ScreenNode.js';
|
|
1
|
+
import { nodeObject, Fn, vec4, uv, NodeMaterial, If, mod, screenCoordinate } from 'three/tsl';
|
|
5
2
|
import StereoCompositePassNode from './StereoCompositePassNode.js';
|
|
6
|
-
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
7
3
|
|
|
8
4
|
class ParallaxBarrierPassNode extends StereoCompositePassNode {
|
|
9
5
|
|
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { uv } from '
|
|
3
|
-
import { Fn, nodeObject, vec2, vec3, float, If } from '../tsl/TSLBase.js';
|
|
4
|
-
import { NodeUpdateType } from '../core/constants.js';
|
|
5
|
-
import { uniform } from '../core/UniformNode.js';
|
|
6
|
-
import { dot, clamp, smoothstep, sign, step, floor } from '../math/MathNode.js';
|
|
7
|
-
import { Vector4 } from '../../math/Vector4.js';
|
|
8
|
-
import { output, property } from '../core/PropertyNode.js';
|
|
9
|
-
import PassNode from './PassNode.js';
|
|
10
|
-
import { mrt } from '../core/MRTNode.js';
|
|
11
|
-
import { normalView } from '../accessors/Normal.js';
|
|
12
|
-
import { convertToTexture } from '../utils/RTTNode.js';
|
|
13
|
-
|
|
14
|
-
import { NearestFilter } from '../../constants.js';
|
|
1
|
+
import { NearestFilter, Vector4 } from 'three';
|
|
2
|
+
import { TempNode, nodeObject, Fn, float, NodeUpdateType, uv, uniform, convertToTexture, vec2, vec3, clamp, floor, dot, smoothstep, If, sign, step, mrt, output, normalView, PassNode, property } from 'three/tsl';
|
|
15
3
|
|
|
16
4
|
class PixelationNode extends TempNode {
|
|
17
5
|
|
|
@@ -41,7 +29,7 @@ class PixelationNode extends TempNode {
|
|
|
41
29
|
|
|
42
30
|
this._resolution = uniform( new Vector4() );
|
|
43
31
|
|
|
44
|
-
this.updateBeforeType = NodeUpdateType.
|
|
32
|
+
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
45
33
|
|
|
46
34
|
}
|
|
47
35
|
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import TempNode from '
|
|
2
|
-
import { nodeObject, Fn, vec2, vec4 } from '../tsl/TSLBase.js';
|
|
3
|
-
import { uniform } from '../core/UniformNode.js';
|
|
4
|
-
import { uv } from '../accessors/UV.js';
|
|
5
|
-
import { sin, cos } from '../math/MathNode.js';
|
|
6
|
-
import { convertToTexture } from '../utils/RTTNode.js';
|
|
1
|
+
import { TempNode, nodeObject, Fn, uv, uniform, vec2, sin, cos, vec4, convertToTexture } from 'three/tsl';
|
|
7
2
|
|
|
8
3
|
class RGBShiftNode extends TempNode {
|
|
9
4
|
|