import { Vector3 } from '@babylonjs/core' import { Monobehiver } from '../base/Monobehiver' import { HotSpot, HotspotPrams, Point } from '../hotspot' // import { userSellingPointStore } from '@/stores/zguiy' import type { MainApp } from './MainApp' import { Dictionary } from '../utils/Dictionary' import { EventBridge } from '../event/bridge' export class AppHotspot extends Monobehiver { hotSpot!: HotSpot sllingPointStore: any //偏移量 offset: number = 0.7 yundong: boolean = false hotspotDic: Dictionary = new Dictionary() constructor(mainApp: MainApp) { super(mainApp) // this.sllingPointStore = userSellingPointStore() } Awake() { const hotspot = new HotSpot(this.mainApp) hotspot.Awake() this.hotSpot = hotspot; // 注意:需要从外部传入热点列表,或者从配置中读取 // this.initHotSpot(hotSpotList) } render(hotSpotList: Array) { // 确保 hotSpot 已初始化 if (!this.hotSpot) { this.Awake(); } this.initHotSpot(hotSpotList); } initHotSpot(hotSpotList: Array) { hotSpotList.forEach((hotspot: any) => { this.createHotspot(hotspot) }); } createHotspot(hotspot: any) { // 检查必要的数据 if (!hotspot) { console.warn('热点数据为空'); return; } console.log('热点原始数据:', hotspot); let position: Vector3; // 使用 offset 作为 position if (hotspot.offset) { if (Array.isArray(hotspot.offset)) { console.log('offset 数组:', hotspot.offset); position = new Vector3( hotspot.offset[0] ?? 0, hotspot.offset[1] ?? 0, hotspot.offset[2] ?? 0 ); } else { position = new Vector3( hotspot.offset.x ?? 0, hotspot.offset.y ?? 0, hotspot.offset.z ?? 0 ); } } else if (hotspot.position) { // 兼容 position 字段 if (Array.isArray(hotspot.position)) { position = new Vector3( hotspot.position[0] ?? 0, hotspot.position[1] ?? 0, hotspot.position[2] ?? 0 ); } else { position = new Vector3( hotspot.position.x ?? 0, hotspot.position.y ?? 0, hotspot.position.z ?? 0 ); } } else { console.warn('热点数据缺少 position 或 offset 字段:', hotspot); return; } console.log('创建热点:', hotspot.name, 'position:', position, 'x:', position.x, 'y:', position.y, 'z:', position.z); const disposition = Vector3.Zero(); this.hotSpot.Point_Event( new HotspotPrams( position, disposition, () => { }, async (p: Point) => { console.log('热点被点击:', hotspot.name, hotspot.payload) // 触发热点点击事件 EventBridge.hotspotClick({ id: hotspot.id, name: hotspot.name, meshName: hotspot.meshName, payload: hotspot.payload }) }, hotspot.icon, hotspot.radius ) ) } clean() { // 首先隐藏所有热点 this.visible(false); // 如果存在热点池 if (this.hotSpot && this.hotSpot._point_Pool && this.hotSpot._point_Pool.points) { // 遍历所有热点 for (let i = 0; i < this.hotSpot._point_Pool.points.length; i++) { const point = this.hotSpot._point_Pool.points[i]; // 清除事件监听器 if (point.img && point.onCallBack) { point.img.removeEventListener('mousedown', point.onCallBack); } // 从DOM中移除注释元素 if (point.annotation && point.annotation.parentNode) { point.annotation.parentNode.removeChild(point.annotation); } // 释放sprite资源 if (point.sprite) { point.sprite.dispose(); } } // 清空热点池 this.hotSpot._point_Pool.points = []; } console.log('热点资源已释放'); } visible(visible: boolean) { console.log(visible); if (this.hotSpot) { this.hotSpot.Enable_All(visible) } } }