Skip to content

Commit 0de958e

Browse files
Object3D: add generator-based traversal methods (mrdoob#28053)
* Object3D: add traversal generator methods * feat: add opt condition to traversal generators * feat: move generator functions to SceneUtils * fix(test): move tests, oops * fix: remove unit tests * fix: remove condition callback (always yield) * Update SceneUtils.js Fix JSDoc. --------- Co-authored-by: Michael Herzog <michael.herzog@human-interactive.org>
1 parent 81b782a commit 0de958e

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

examples/jsm/utils/SceneUtils.js

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,69 @@ function sortInstancedMesh( mesh, compareFn ) {
245245

246246
}
247247

248+
/**
249+
* @param {Object3D} object Object to traverse.
250+
* @yields {Object3D} Objects that passed the filter condition.
251+
*/
252+
function* traverseGenerator( object ) {
253+
254+
yield object;
255+
256+
const children = object.children;
257+
258+
for ( let i = 0, l = children.length; i < l; i ++ ) {
259+
260+
yield* traverseGenerator( children[ i ] );
261+
262+
}
263+
264+
}
265+
266+
/**
267+
* @param {Object3D} object Object to traverse.
268+
* @yields {Object3D} Objects that passed the filter condition.
269+
*/
270+
function* traverseVisibleGenerator( object ) {
271+
272+
if ( object.visible === false ) return;
273+
274+
yield object;
275+
276+
const children = object.children;
277+
278+
for ( let i = 0, l = children.length; i < l; i ++ ) {
279+
280+
yield* traverseVisibleGenerator( children[ i ] );
281+
282+
}
283+
284+
}
285+
286+
/**
287+
* @param {Object3D} object Object to traverse.
288+
* @yields {Object3D} Objects that passed the filter condition.
289+
*/
290+
function* traverseAncestorsGenerator( object ) {
291+
292+
const parent = object.parent;
293+
294+
if ( parent !== null ) {
295+
296+
yield parent;
297+
298+
yield* traverseAncestorsGenerator( parent );
299+
300+
}
301+
302+
}
303+
248304
export {
249305
createMeshesFromInstancedMesh,
250306
createMeshesFromMultiMaterialMesh,
251307
createMultiMaterialObject,
252308
reduceVertices,
253-
sortInstancedMesh
309+
sortInstancedMesh,
310+
traverseGenerator,
311+
traverseVisibleGenerator,
312+
traverseAncestorsGenerator
254313
};

0 commit comments

Comments
 (0)