@@ -5,7 +5,6 @@ import type { Object3D, Camera } from 'three'
5
5
import type { TresContext } from '../composables'
6
6
import { useLogger } from '../composables'
7
7
import { deepArrayEqual , isHTMLTag , kebabToCamel } from '../utils'
8
-
9
8
import type { TresObject , TresObject3D , TresScene } from '../types'
10
9
import { catalogue } from './catalogue'
11
10
@@ -95,28 +94,27 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
95
94
return instance as TresObject
96
95
} ,
97
96
insert ( child , parent ) {
97
+ if ( ! child ) return
98
+
98
99
if ( parent && parent . isScene ) {
99
100
scene = parent as unknown as TresScene
100
- if ( child ) {
101
- child . __tres . root = scene . __tres . root as TresContext
102
- }
103
101
}
104
102
105
- const parentObject = parent || scene
103
+ if ( scene ) {
104
+ child . __tres . root = scene . __tres . root as TresContext
105
+ }
106
106
107
+ const parentObject = parent || scene
108
+
107
109
if ( child ?. isObject3D ) {
108
-
110
+ const { registerCamera , registerObjectAtPointerEventHandler } = child . __tres . root
109
111
if ( child ?. isCamera ) {
110
- child . __tres . root . registerCamera ?. ( child as unknown as Camera )
112
+ registerCamera ( child as unknown as Camera )
111
113
}
112
-
113
114
if (
114
115
child && supportedPointerEvents . some ( eventName => child [ eventName ] )
115
116
) {
116
- if ( ! scene ?. userData . tres__registerAtPointerEventHandler )
117
- throw 'could not find tres__registerAtPointerEventHandler on scene\'s userData'
118
-
119
- scene ?. userData . tres__registerAtPointerEventHandler ?.( child as Object3D )
117
+ registerObjectAtPointerEventHandler ( child as Object3D )
120
118
}
121
119
}
122
120
@@ -137,6 +135,10 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
137
135
remove ( node ) {
138
136
if ( ! node ) return
139
137
// remove is only called on the node being removed and not on child nodes.
138
+ const {
139
+ deregisterObjectAtPointerEventHandler,
140
+ deregisterBlockingObjectAtPointerEventHandler,
141
+ } = node . __tres . root
140
142
141
143
if ( node . isObject3D ) {
142
144
const object3D = node as unknown as Object3D
@@ -155,37 +157,23 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
155
157
}
156
158
}
157
159
158
- const deregisterAtPointerEventHandler = scene ?. userData . tres__deregisterAtPointerEventHandler
159
- const deregisterBlockingObjectAtPointerEventHandler
160
- = scene ?. userData . tres__deregisterBlockingObjectAtPointerEventHandler
161
-
162
160
const deregisterAtPointerEventHandlerIfRequired = ( object : TresObject ) => {
163
-
164
- if ( ! deregisterBlockingObjectAtPointerEventHandler )
165
- throw 'could not find tres__deregisterBlockingObjectAtPointerEventHandler on scene\'s userData'
166
-
167
- scene ?. userData . tres__deregisterBlockingObjectAtPointerEventHandler ?.( object as Object3D )
168
-
169
- if ( ! deregisterAtPointerEventHandler )
170
- throw 'could not find tres__deregisterAtPointerEventHandler on scene\'s userData'
171
-
161
+ deregisterBlockingObjectAtPointerEventHandler ( object as Object3D )
172
162
if (
173
163
object && supportedPointerEvents . some ( eventName => object [ eventName ] )
174
164
)
175
- deregisterAtPointerEventHandler ?.( object as Object3D )
165
+ deregisterObjectAtPointerEventHandler ?.( object as Object3D )
176
166
}
177
167
178
168
const deregisterCameraIfRequired = ( object : Object3D ) => {
179
169
const deregisterCamera = node . __tres . root . deregisterCamera
180
170
181
- if ( ! deregisterCamera )
182
- throw 'could not find tres__deregisterCamera on scene\'s userData'
183
-
184
171
if ( ( object as Camera ) . isCamera )
185
172
deregisterCamera ?.( object as Camera )
186
173
}
187
174
188
175
node . removeFromParent ?.( )
176
+
189
177
object3D . traverse ( ( child : Object3D ) => {
190
178
disposeMaterialsAndGeometries ( child )
191
179
deregisterCameraIfRequired ( child )
@@ -204,13 +192,21 @@ export const nodeOps: RendererOptions<TresObject, TresObject | null> = {
204
192
if ( node ) {
205
193
let root = node
206
194
let key = prop
207
- if ( node . isObject3D && key === 'blocks-pointer-events' ) {
208
- if ( nextValue || nextValue === '' )
209
- scene ?. userData . tres__registerBlockingObjectAtPointerEventHandler ?.( node as Object3D )
210
- else
211
- scene ?. userData . tres__deregisterBlockingObjectAtPointerEventHandler ?.( node as Object3D )
212
195
213
- return
196
+ if ( node . __tres . root ) {
197
+ const {
198
+ registerBlockingObjectAtPointerEventHandler,
199
+ deregisterBlockingObjectAtPointerEventHandler,
200
+ } = node . __tres . root
201
+
202
+ if ( node . isObject3D && key === 'blocks-pointer-events' ) {
203
+ if ( nextValue || nextValue === '' )
204
+ registerBlockingObjectAtPointerEventHandler ( node as Object3D )
205
+ else
206
+ deregisterBlockingObjectAtPointerEventHandler ( node as Object3D )
207
+
208
+ return
209
+ }
214
210
}
215
211
216
212
let finalKey = kebabToCamel ( key )
0 commit comments