|
|
@@ -117,6 +117,14 @@ class Geometries extends DataMap {
|
|
|
*/
|
|
|
this.attributeCall = new WeakMap();
|
|
|
|
|
|
+ /**
|
|
|
+ * Stores the event listeners attached to geometries.
|
|
|
+ *
|
|
|
+ * @private
|
|
|
+ * @type {Map<BufferGeometry,Function>}
|
|
|
+ */
|
|
|
+ this._geometryDisposeListeners = new Map();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -189,10 +197,16 @@ class Geometries extends DataMap {
|
|
|
|
|
|
geometry.removeEventListener( 'dispose', onDispose );
|
|
|
|
|
|
+ this._geometryDisposeListeners.delete( geometry );
|
|
|
+
|
|
|
};
|
|
|
|
|
|
geometry.addEventListener( 'dispose', onDispose );
|
|
|
|
|
|
+ // see #31798 why tracking separate remove listeners is required right now
|
|
|
+ // TODO: Re-evaluate how onDispose() is managed in this component
|
|
|
+ this._geometryDisposeListeners.set( geometry, onDispose );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -339,6 +353,18 @@ class Geometries extends DataMap {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ dispose() {
|
|
|
+
|
|
|
+ for ( const [ geometry, onDispose ] of this._geometryDisposeListeners.entries() ) {
|
|
|
+
|
|
|
+ geometry.removeEventListener( 'dispose', onDispose );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ this._geometryDisposeListeners.clear();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
export default Geometries;
|