Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OutlinePass: Improve performance of VisibilityChangeCallBack(). #29220

Merged
merged 9 commits into from
Aug 26, 2024
74 changes: 33 additions & 41 deletions examples/jsm/postprocessing/OutlinePass.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ class OutlinePass extends Pass {
this.pulsePeriod = 0;

this._visibilityCache = new Map();

this._selectedMeshes = new Set();
this._selectedMeshesDirty = true;

this.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );

Expand Down Expand Up @@ -172,78 +173,67 @@ class OutlinePass extends Pass {

}

changeVisibilityOfSelectedObjects( bVisible ) {
get selectedMeshes() {

const cache = this._visibilityCache;
const meshes = this._selectedMeshes

function gatherSelectedMeshesCallBack( object ) {

if ( object.isMesh ) {
if ( object.isMesh ) meshes.add( object );

if ( bVisible === true ) {
}

object.visible = cache.get( object );
if (this._selectedMeshesDirty) {

} else {
meshes.clear()

cache.set( object, object.visible );
object.visible = bVisible;
for ( let i = 0; i < this.selectedObjects.length; i ++ ) {

}
const selectedObject = this.selectedObjects[ i ];
selectedObject.traverse( gatherSelectedMeshesCallBack );

}

this._selectedMeshesDirty = false;
}

for ( let i = 0; i < this.selectedObjects.length; i ++ ) {

const selectedObject = this.selectedObjects[ i ];
selectedObject.traverse( gatherSelectedMeshesCallBack );

}
return meshes

}

changeVisibilityOfNonSelectedObjects( bVisible ) {
changeVisibilityOfSelectedObjects( bVisible ) {

const cache = this._visibilityCache;
const selectedMeshes = [];

function gatherSelectedMeshesCallBack( object ) {

if ( object.isMesh ) selectedMeshes.push( object );

}
for(let mesh of this.selectedMeshes) {

for ( let i = 0; i < this.selectedObjects.length; i ++ ) {
if ( bVisible === true ) {

const selectedObject = this.selectedObjects[ i ];
selectedObject.traverse( gatherSelectedMeshesCallBack );
mesh.visible = cache.get( mesh);

}
} else {

function VisibilityChangeCallBack( object ) {

if ( object.isMesh || object.isSprite ) {
cache.set( mesh, mesh.visible );
mesh.visible = bVisible;

// only meshes and sprites are supported by OutlinePass
}

let bFound = false;
}

for ( let i = 0; i < selectedMeshes.length; i ++ ) {
}

const selectedObjectId = selectedMeshes[ i ].id;
changeVisibilityOfNonSelectedObjects( bVisible ) {

if ( selectedObjectId === object.id ) {
const cache = this._visibilityCache;
const selectedMeshes = this.selectedMeshes;

bFound = true;
break;
function VisibilityChangeCallBack( object ) {

}
if ( object.isMesh || object.isSprite ) {

}
// only meshes and sprites are supported by OutlinePass

if ( bFound === false ) {
if ( selectedMeshes.has( object.id ) === false ) {

const visibility = object.visible;

Expand Down Expand Up @@ -306,6 +296,8 @@ class OutlinePass extends Pass {

renderer.setClearColor( 0xffffff, 1 );

// set the selected meshes flag to recalculate selected meshes in case the selectedObjects array changed since last frame
this._selectedMeshesDirty = true;
Mugen87 marked this conversation as resolved.
Show resolved Hide resolved
// Make selected objects invisible
this.changeVisibilityOfSelectedObjects( false );

Expand Down Expand Up @@ -462,7 +454,7 @@ class OutlinePass extends Pass {
worldPosition = instanceMatrix * worldPosition;

#endif

worldPosition = modelMatrix * worldPosition;

projTexCoord = textureMatrix * worldPosition;
Expand Down