|
@@ -16,6 +16,13 @@ let scene: TresScene | null = null
|
|
|
|
|
|
const { logError } = useLogger()
|
|
const { logError } = useLogger()
|
|
|
|
|
|
|
|
+const supportedPointerEvents = [
|
|
|
|
+ 'onClick',
|
|
|
|
+ 'onPointerMove',
|
|
|
|
+ 'onPointerEnter',
|
|
|
|
+ 'onPointerLeave',
|
|
|
|
+]
|
|
|
|
+
|
|
export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
createElement(tag, _isSVG, _anchor, props) {
|
|
createElement(tag, _isSVG, _anchor, props) {
|
|
if (!props) props = {}
|
|
if (!props) props = {}
|
|
@@ -75,7 +82,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
},
|
|
},
|
|
insert(child, parent) {
|
|
insert(child, parent) {
|
|
if (parent && parent.isScene) scene = parent as unknown as TresScene
|
|
if (parent && parent.isScene) scene = parent as unknown as TresScene
|
|
-
|
|
|
|
|
|
+
|
|
const parentObject = parent || scene
|
|
const parentObject = parent || scene
|
|
|
|
|
|
if (child?.isObject3D) {
|
|
if (child?.isObject3D) {
|
|
@@ -87,10 +94,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
}
|
|
}
|
|
|
|
|
|
if (
|
|
if (
|
|
- child?.onClick
|
|
|
|
- || child?.onPointerMove
|
|
|
|
- || child?.onPointerEnter
|
|
|
|
- || child?.onPointerLeave
|
|
|
|
|
|
+ child && supportedPointerEvents.some(eventName => child[eventName])
|
|
) {
|
|
) {
|
|
if (!scene?.userData.tres__registerAtPointerEventHandler)
|
|
if (!scene?.userData.tres__registerAtPointerEventHandler)
|
|
throw 'could not find tres__registerAtPointerEventHandler on scene\'s userData'
|
|
throw 'could not find tres__registerAtPointerEventHandler on scene\'s userData'
|
|
@@ -123,9 +127,15 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
const disposeMaterialsAndGeometries = (object3D: Object3D) => {
|
|
const disposeMaterialsAndGeometries = (object3D: Object3D) => {
|
|
const tresObject3D = object3D as TresObject3D
|
|
const tresObject3D = object3D as TresObject3D
|
|
|
|
|
|
- if (!object3D.userData.tres__materialViaProp) tresObject3D.material?.dispose()
|
|
|
|
- if (!object3D.userData.tres__geometryViaProp)
|
|
|
|
|
|
+ if (!object3D.userData.tres__materialViaProp) {
|
|
|
|
+ tresObject3D.material?.dispose()
|
|
|
|
+ tresObject3D.material = undefined
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!object3D.userData.tres__geometryViaProp) {
|
|
tresObject3D.geometry?.dispose()
|
|
tresObject3D.geometry?.dispose()
|
|
|
|
+ tresObject3D.geometry = undefined
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
const deregisterAtPointerEventHandler = scene?.userData.tres__deregisterAtPointerEventHandler
|
|
const deregisterAtPointerEventHandler = scene?.userData.tres__deregisterAtPointerEventHandler
|
|
@@ -143,10 +153,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
throw 'could not find tres__deregisterAtPointerEventHandler on scene\'s userData'
|
|
throw 'could not find tres__deregisterAtPointerEventHandler on scene\'s userData'
|
|
|
|
|
|
if (
|
|
if (
|
|
- object?.onClick
|
|
|
|
- || object?.onPointerMove
|
|
|
|
- || object?.onPointerEnter
|
|
|
|
- || object?.onPointerLeave
|
|
|
|
|
|
+ object && supportedPointerEvents.some(eventName => object[eventName])
|
|
)
|
|
)
|
|
deregisterAtPointerEventHandler?.(object as Object3D)
|
|
deregisterAtPointerEventHandler?.(object as Object3D)
|
|
}
|
|
}
|
|
@@ -161,6 +168,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
deregisterCamera?.(object as Camera)
|
|
deregisterCamera?.(object as Camera)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ node.removeFromParent?.()
|
|
object3D.traverse((child: Object3D) => {
|
|
object3D.traverse((child: Object3D) => {
|
|
disposeMaterialsAndGeometries(child)
|
|
disposeMaterialsAndGeometries(child)
|
|
deregisterCameraIfRequired(child)
|
|
deregisterCameraIfRequired(child)
|
|
@@ -172,8 +180,6 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
deregisterAtPointerEventHandlerIfRequired?.(object3D as TresObject)
|
|
deregisterAtPointerEventHandlerIfRequired?.(object3D as TresObject)
|
|
}
|
|
}
|
|
|
|
|
|
- node.removeFromParent?.()
|
|
|
|
-
|
|
|
|
node.dispose?.()
|
|
node.dispose?.()
|
|
},
|
|
},
|
|
patchProp(node, prop, _prevValue, nextValue) {
|
|
patchProp(node, prop, _prevValue, nextValue) {
|
|
@@ -225,8 +231,11 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
|
|
if (value === '') value = true
|
|
if (value === '') value = true
|
|
// Set prop, prefer atomic methods if applicable
|
|
// Set prop, prefer atomic methods if applicable
|
|
if (isFunction(target)) {
|
|
if (isFunction(target)) {
|
|
- if (Array.isArray(value)) node[finalKey](...value)
|
|
|
|
- else node[finalKey](value)
|
|
|
|
|
|
+ //don't call pointer event callback functions
|
|
|
|
+ if (!supportedPointerEvents.includes(prop)) {
|
|
|
|
+ if (Array.isArray(value)) node[finalKey](...value)
|
|
|
|
+ else node[finalKey](value)
|
|
|
|
+ }
|
|
return
|
|
return
|
|
}
|
|
}
|
|
if (!target?.set && !isFunction(target)) root[finalKey] = value
|
|
if (!target?.set && !isFunction(target)) root[finalKey] = value
|