@@ -75,22 +75,22 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
75
75
else if ( instance . isBufferGeometry ) instance . attach = 'geometry'
76
76
}
77
77
78
- // determine whether the material was passed via prop to
79
- // prevent it's disposal when node is removed later in it's lifecycle
80
-
81
- if ( instance . isObject3D ) {
82
- if ( props ?. material ?. isMaterial ) ( instance as TresObject3D ) . userData . tres__materialViaProp = true
83
- if ( props ?. geometry ?. isBufferGeometry ) ( instance as TresObject3D ) . userData . tres__geometryViaProp = true
84
- }
85
-
86
78
instance . __tres = {
87
79
...instance . __tres ,
88
80
type : name ,
89
81
memoizedProps : props ,
90
82
eventCount : 0 ,
83
+ disposable : true ,
91
84
primitive : tag === 'primitive' ,
92
85
}
93
86
87
+ // determine whether the material was passed via prop to
88
+ // prevent it's disposal when node is removed later in it's lifecycle
89
+
90
+ if ( instance . isObject3D && ( props ?. material || props ?. geometry ) ) {
91
+ instance . __tres . disposable = false
92
+ }
93
+
94
94
return instance as TresObject
95
95
} ,
96
96
insert ( child , parent ) {
@@ -134,24 +134,21 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
134
134
} ,
135
135
remove ( node ) {
136
136
if ( ! node ) return
137
+ const ctx = node . __tres
137
138
// remove is only called on the node being removed and not on child nodes.
138
139
const {
139
140
deregisterObjectAtPointerEventHandler,
140
141
deregisterBlockingObjectAtPointerEventHandler,
141
- } = node . __tres . root
142
+ } = ctx . root
142
143
143
144
if ( node . isObject3D ) {
144
- const object3D = node as unknown as Object3D
145
145
146
- const disposeMaterialsAndGeometries = ( object3D : Object3D ) => {
146
+ const disposeMaterialsAndGeometries = ( object3D : TresObject ) => {
147
147
const tresObject3D = object3D as TresObject3D
148
-
149
- if ( ! object3D . userData . tres__materialViaProp ) {
148
+ // TODO: to be improved on https://github.com/Tresjs/tres/pull/466/files
149
+ if ( ctx . disposable ) {
150
150
tresObject3D . material ?. dispose ( )
151
151
tresObject3D . material = undefined
152
- }
153
-
154
- if ( ! object3D . userData . tres__geometryViaProp ) {
155
152
tresObject3D . geometry ?. dispose ( )
156
153
tresObject3D . geometry = undefined
157
154
}
@@ -174,15 +171,15 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
174
171
175
172
node . removeFromParent ?.( )
176
173
177
- object3D . traverse ( ( child : Object3D ) => {
178
- disposeMaterialsAndGeometries ( child )
174
+ node . traverse ( ( child : Object3D ) => {
175
+ disposeMaterialsAndGeometries ( child as TresObject )
179
176
deregisterCameraIfRequired ( child )
180
177
deregisterAtPointerEventHandlerIfRequired ?.( child as TresObject )
181
178
} )
182
179
183
- disposeMaterialsAndGeometries ( object3D )
184
- deregisterCameraIfRequired ( object3D )
185
- deregisterAtPointerEventHandlerIfRequired ?.( object3D as TresObject )
180
+ disposeMaterialsAndGeometries ( node )
181
+ deregisterCameraIfRequired ( node as Object3D )
182
+ deregisterAtPointerEventHandlerIfRequired ?.( node as TresObject )
186
183
}
187
184
188
185
invalidateInstance ( node as TresObject )
0 commit comments