TkAstral3D/packages/sdk/lib/core/objects/LineMesh.ts
2025-10-04 23:36:07 +08:00

55 lines
1.7 KiB
TypeScript

/**
* @author ErSan
* @email mlt131220@163.com
* @date 2024/5/21 22:08
* @description 带线框子模型的Mesh对象
*/
import {Mesh, Material, BufferGeometry, MeshBasicMaterial, LineSegments, LineBasicMaterial, EdgesGeometry} from 'three';
import {useDispatchSignal} from "@/hooks";
export function materialProxy(lineMesh: LineMesh) {
return new Proxy(lineMesh, {
set(target: LineMesh, p: string, newValue: any): boolean {
if(p === 'material'){
(<LineBasicMaterial>(<LineSegments>target.children[0]).material).dispose();
target.children = [];
// 更新场景树
useDispatchSignal("sceneGraphChanged");
}
target[p] = newValue;
return true;
}
})
}
export class LineMesh extends Mesh {
constructor(geometry = new BufferGeometry(), material: Material = new MeshBasicMaterial(), color = 0x00ffff) {
super(geometry, material);
// @ts-ignore
this.type = 'LineMesh';
const edges = new EdgesGeometry(geometry);
const edgesMaterial = new LineBasicMaterial({
color: color,
})
const line = new LineSegments(edges, edgesMaterial);
// let geometryArray = [geometry,edges];
// let materialArray = [material,edgesMaterial];
// const mergedGeometries = BufferGeometryUtils.mergeGeometries(geometryArray, false);
// const lineMesh = SceneUtils.createMultiMaterialObject(mergedGeometries, materialArray);
//
// this.parent?.add(lineMesh);
// this.removeFromParent();
this.add(line)
}
proxyMesh = materialProxy(this);
}