export class SampleExtension {
/*
* 定义属性
* 如果只想在类内部使用属性变量,不需要将属性变量展示在自定义设置项中,
* 可以把它设置成 Private 属性,JavaScript 用"#"代表 Private 属性
* 定义的属性可以使用中文名称
*/
场景 = Element.empty();
#isLinstenEvent = false;
#clickObservable = null;
#scene = null;
#enableClick = false;
#stopListenEvent = false;
#currentPosition = "";
#updateLineAxisFn = null;
initEventListen() {
if (this.#isLinstenEvent) return;
if (!this.场景?.name) return;
const { getScene, worldToScreen } = this.场景.getMountedInstance() || {};
const { pickPositionOnSurface, updateLineAxis } = this.场景._getExtension("pick");
this.#updateLineAxisFn = updateLineAxis;
if (!getScene) return;
this.#isLinstenEvent = true;
this.#scene = getScene();
this.#clickObservable = this.#scene.onPointerObservable.add(async (pointerInfo) => {
if(!this.#enableClick || this.#stopListenEvent) return;
const { type, event } = pointerInfo;
const positionStr = await pickPositionOnSurface(pointerInfo.event.offsetX, pointerInfo.event.offsetY);
if(!positionStr) return;
const position = JSON.parse(positionStr);
this.#updateLineAxisFn && this.#updateLineAxisFn(true, position);
if(type !== 32 || event.button !== 0) return;
if(event.buttons > 0) return;
this.#currentPosition = `${position.x},${position.y},${position.z}`;
this.element.emit("点位点击", {
position: this.#currentPosition,
});
this.#stopListenEvent = true;
})
}
removeEventListen() {
if (!this.#scene) return;
if (this.#clickObservable) {
this.#scene.onPointerObservable.remove(this.#clickObservable);
this.#clickObservable = null;
}
this.#isLinstenEvent = false;
}
async init() {
this.element.addEventListener("开启点击交互", (ev)=>{
this.#enableClick = true;
this.#stopListenEvent = false;
});
this.element.addEventListener("关闭点击交互", (ev)=>{
this.#enableClick = false;
this.#updateLineAxisFn && this.#updateLineAxisFn(false);
});
this.initEventListen();
}
/**
* 生命周期函数 组件销毁时调用,一般在此处清空监听事件
*
*/
destroy() {
if (this.#isLinstenEvent) {
this.removeEventListen();
}
}
}