修复
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
yinsx
2026-01-05 16:09:36 +08:00
parent ebbd21916e
commit b9cbb58a9d
14 changed files with 460 additions and 321 deletions

124
src/babylonjs/AppRay.ts Normal file
View File

@ -0,0 +1,124 @@
import {
type IPointerEvent,
PickingInfo,
PointerEventTypes,
Vector3,
AbstractMesh,
Color3,
PBRMaterial,
StandardMaterial,
HighlightLayer,
PointerInfo,
} from '@babylonjs/core'
import { MainApp } from './MainApp'
import { Monobehiver } from '../base/Monobehiver';
import { EventBridge } from '../event/bridge';
class AppRay extends Monobehiver {
oldPoint: Vector3 = Vector3.Zero()
newPoint: Vector3 = Vector3.Zero()
private highlightLayer: HighlightLayer | null = null
private originalMaterial: any = null
private highlightedMesh: AbstractMesh | null = null
constructor(mainApp: MainApp) {
super(mainApp)
}
Awake() {
this.setupHighlightLayer()
this.setupUnifiedEventHandling()
}
// 设置高亮层
setupHighlightLayer() {
// 高亮层创建已禁用
return
}
// 设置统一的事件处理
setupUnifiedEventHandling() {
// 使用观察者模式而不是直接覆盖事件处理器
this.mainApp.appScene.object.onPointerObservable.add((pointerInfo: PointerInfo) => {
const { type, event, pickInfo } = pointerInfo;
// 检查事件类型并转换
const pointerEvent = event as IPointerEvent;
// 只处理鼠标和触摸事件
if (pointerEvent.pointerType !== "mouse" && pointerEvent.pointerType !== "touch") {
return;
}
// 处理非主要触摸点
if (pointerEvent.pointerType === "touch" && (pointerEvent as any).isPrimary === false) {
return;
}
if (type === PointerEventTypes.POINTERDOWN) {
this.oldPoint.set(pointerEvent.clientX, 0, pointerEvent.clientY);
} else if (type === PointerEventTypes.POINTERUP) {
this.newPoint.set(pointerEvent.clientX, 0, pointerEvent.clientY);
const distance = Vector3.Distance(this.oldPoint, this.newPoint);
// 只有在没有移动的情况下才处理单击
if (distance < 5) { // 增加一些容差
this.handleSingleClick(pointerEvent, pickInfo);
}
}
});
}
// 处理单击
handleSingleClick(evt: IPointerEvent, pickInfo: PickingInfo | null) {
if (pickInfo && pickInfo.pickedMesh) {
EventBridge.modelClick({
meshName: pickInfo.pickedMesh.name,
});
}
}
// 高亮显示网格 - 已禁用
highlightMesh(mesh: AbstractMesh) {
// 高亮功能已禁用
return
}
// 使用材质方式高亮 - 已禁用
highlightWithMaterial(mesh: AbstractMesh) {
// 材质高亮功能已禁用
return
}
// 清除高亮
clearHighlight() {
try {
// 清除高亮层
if (this.highlightLayer && this.highlightedMesh) {
try {
this.highlightLayer.removeMesh(this.highlightedMesh as any)
} catch (error) {
console.warn('高亮层移除失败:', error)
}
}
// 恢复原始材质
if (this.highlightedMesh && this.originalMaterial) {
const material = this.highlightedMesh.material as PBRMaterial
if (material && this.originalMaterial.albedoColor) {
material.albedoColor = this.originalMaterial.albedoColor
material.emissiveColor = this.originalMaterial.emissiveColor
}
}
this.highlightedMesh = null
this.originalMaterial = null
} catch (error) {
console.error('清除高亮失败:', error)
}
}
}
export { AppRay }