Skip to content

Commit 0534c39

Browse files
authored
OutlineNode: Support sprites. (#33112)
1 parent b7fa531 commit 0534c39

1 file changed

Lines changed: 26 additions & 14 deletions

File tree

examples/jsm/tsl/display/OutlineNode.js

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { DepthTexture, FloatType, RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
2-
import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, screenUV, nodeObject, uniform, vec4, passTexture, texture, perspectiveDepthToViewZ, positionView, reference } from 'three/tsl';
1+
import { DepthTexture, FloatType, RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, SpriteNodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
2+
import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, screenUV, nodeObject, uniform, vec4, passTexture, texture, perspectiveDepthToViewZ, positionView, reference, color } from 'three/tsl';
33

44
const _quadMesh = /*@__PURE__*/ new QuadMesh();
55
const _size = /*@__PURE__*/ new Vector2();
@@ -293,9 +293,13 @@ class OutlineNode extends TempNode {
293293
* @type {NodeMaterial}
294294
*/
295295
this._depthMaterial = new NodeMaterial();
296-
this._depthMaterial.fragmentNode = vec4( 0, 0, 0, 1 );
296+
this._depthMaterial.colorNode = color( 0, 0, 0 );
297297
this._depthMaterial.name = 'OutlineNode.depth';
298298

299+
this._depthSpriteMaterial = new SpriteNodeMaterial();
300+
this._depthSpriteMaterial.colorNode = color( 0, 0, 0 );
301+
this._depthSpriteMaterial.name = 'OutlineNode.depthSprite';
302+
299303
/**
300304
* The material for preparing the mask.
301305
*
@@ -305,6 +309,9 @@ class OutlineNode extends TempNode {
305309
this._prepareMaskMaterial = new NodeMaterial();
306310
this._prepareMaskMaterial.name = 'OutlineNode.prepareMask';
307311

312+
this._prepareMaskSpriteMaterial = new SpriteNodeMaterial();
313+
this._prepareMaskSpriteMaterial.name = 'OutlineNode.prepareMaskSprite';
314+
308315
/**
309316
* The copy material
310317
*
@@ -459,14 +466,14 @@ class OutlineNode extends TempNode {
459466

460467
// 1. Draw non-selected objects in the depth buffer
461468

462-
scene.overrideMaterial = this._depthMaterial;
463-
464469
renderer.setRenderTarget( this._renderTargetDepthBuffer );
465-
renderer.setRenderObjectFunction( ( object, ...params ) => {
470+
renderer.setRenderObjectFunction( ( object, scene, camera, geometry, material, group, lightsNode, clippingContext ) => {
466471

467472
if ( this._selectionCache.has( object ) === false ) {
468473

469-
renderer.renderObject( object, ...params );
474+
const overrideMaterial = object.isSprite ? this._depthSpriteMaterial : this._depthMaterial;
475+
476+
renderer.renderObject( object, scene, camera, geometry, overrideMaterial, group, lightsNode, clippingContext );
470477

471478
}
472479

@@ -477,14 +484,14 @@ class OutlineNode extends TempNode {
477484

478485
// 2. Draw only the selected objects by comparing the depth buffer of non-selected objects
479486

480-
scene.overrideMaterial = this._prepareMaskMaterial;
481-
482487
renderer.setRenderTarget( this._renderTargetMaskBuffer );
483-
renderer.setRenderObjectFunction( ( object, ...params ) => {
488+
renderer.setRenderObjectFunction( ( object, scene, camera, geometry, material, group, lightsNode, clippingContext ) => {
484489

485490
if ( this._selectionCache.has( object ) === true ) {
486491

487-
renderer.renderObject( object, ...params );
492+
const overrideMaterial = object.isSprite ? this._prepareMaskSpriteMaterial : this._prepareMaskMaterial;
493+
494+
renderer.renderObject( object, scene, camera, geometry, overrideMaterial, group, lightsNode, clippingContext );
488495

489496
}
490497

@@ -587,13 +594,16 @@ class OutlineNode extends TempNode {
587594
}
588595

589596
const depthTest = positionView.z.lessThanEqual( viewZNode ).select( 1, 0 );
590-
return vec4( 0.0, depthTest, 1.0, 1.0 );
597+
return vec3( 0.0, depthTest, 1.0 );
591598

592599
};
593600

594-
this._prepareMaskMaterial.fragmentNode = prepareMask();
601+
this._prepareMaskMaterial.colorNode = prepareMask();
595602
this._prepareMaskMaterial.needsUpdate = true;
596603

604+
this._prepareMaskSpriteMaterial.colorNode = prepareMask();
605+
this._prepareMaskSpriteMaterial.needsUpdate = true;
606+
597607
// copy material
598608

599609
this._materialCopy.fragmentNode = this._maskTextureUniform;
@@ -712,7 +722,9 @@ class OutlineNode extends TempNode {
712722
this._renderTargetComposite.dispose();
713723

714724
this._depthMaterial.dispose();
725+
this._depthSpriteMaterial.dispose();
715726
this._prepareMaskMaterial.dispose();
727+
this._prepareMaskSpriteMaterial.dispose();
716728
this._materialCopy.dispose();
717729
this._edgeDetectionMaterial.dispose();
718730
this._separableBlurMaterial.dispose();
@@ -733,7 +745,7 @@ class OutlineNode extends TempNode {
733745
const selectedObject = this.selectedObjects[ i ];
734746
selectedObject.traverse( ( object ) => {
735747

736-
if ( object.isMesh ) this._selectionCache.add( object );
748+
if ( object.isMesh || object.isSprite ) this._selectionCache.add( object );
737749

738750
} );
739751

0 commit comments

Comments
 (0)