view3d-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/SerializationPlugin-CBr1GY5q.js +3411 -0
- package/dist/SerializationPlugin-CBr1GY5q.js.map +1 -0
- package/dist/SerializationPlugin-Cxn2UjuS.cjs +3310 -0
- package/dist/SerializationPlugin-Cxn2UjuS.cjs.map +1 -0
- package/dist/index.cjs +604 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +644 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.cjs +5 -0
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.ts +1 -0
- package/dist/plugins/index.js +44 -0
- package/dist/plugins/index.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/core/EventEmitter.ts","../src/core/Scene.ts","../src/core/Camera.ts","../src/core/Renderer.ts","../src/core/Engine.ts","../src/ThreeEditor.ts","../src/utils/dispose.ts"],"sourcesContent":["import type { Unsubscribe } from '../types/event.types'\r\n\r\n/**\r\n * 事件发射器\r\n * 提供类型安全的事件订阅和发布机制\r\n */\r\nexport class EventEmitter<TEventMap extends Record<string, any> = Record<string, any>> {\r\n private listeners = new Map<keyof TEventMap, Set<{ callback: Function; once: boolean }>>()\r\n\r\n /**\r\n * 订阅事件\r\n * @param event 事件名称\r\n * @param callback 回调函数\r\n * @returns 取消订阅函数\r\n */\r\n on<K extends keyof TEventMap>(event: K, callback: (data: TEventMap[K]) => void): Unsubscribe {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set())\r\n }\r\n const listener = { callback, once: false }\r\n this.listeners.get(event)!.add(listener)\r\n\r\n return () => {\r\n this.listeners.get(event)?.delete(listener)\r\n }\r\n }\r\n\r\n /**\r\n * 订阅一次性事件\r\n * @param event 事件名称\r\n * @param callback 回调函数\r\n * @returns 取消订阅函数\r\n */\r\n once<K extends keyof TEventMap>(event: K, callback: (data: TEventMap[K]) => void): Unsubscribe {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set())\r\n }\r\n const listener = { callback, once: true }\r\n this.listeners.get(event)!.add(listener)\r\n\r\n return () => {\r\n this.listeners.get(event)?.delete(listener)\r\n }\r\n }\r\n\r\n /**\r\n * 取消订阅事件\r\n * @param event 事件名称\r\n * @param callback 回调函数(可选,不传则移除该事件所有监听器)\r\n */\r\n off<K extends keyof TEventMap>(event: K, callback?: (data: TEventMap[K]) => void): void {\r\n if (!callback) {\r\n this.listeners.delete(event)\r\n return\r\n }\r\n\r\n const listeners = this.listeners.get(event)\r\n if (listeners) {\r\n for (const listener of listeners) {\r\n if (listener.callback === callback) {\r\n listeners.delete(listener)\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 发射事件\r\n * @param event 事件名称\r\n * @param data 事件数据\r\n */\r\n emit<K extends keyof TEventMap>(event: K, data?: TEventMap[K]): void {\r\n const listeners = this.listeners.get(event)\r\n if (!listeners) return\r\n\r\n const toRemove: { callback: Function; once: boolean }[] = []\r\n\r\n for (const listener of listeners) {\r\n try {\r\n listener.callback(data)\r\n } catch (error) {\r\n console.error(`Error in event listener for \"${String(event)}\":`, error)\r\n }\r\n\r\n if (listener.once) {\r\n toRemove.push(listener)\r\n }\r\n }\r\n\r\n // 移除一次性监听器\r\n for (const listener of toRemove) {\r\n listeners.delete(listener)\r\n }\r\n }\r\n\r\n /**\r\n * 检查是否有监听器\r\n * @param event 事件名称\r\n */\r\n hasListeners<K extends keyof TEventMap>(event: K): boolean {\r\n const listeners = this.listeners.get(event)\r\n return listeners !== undefined && listeners.size > 0\r\n }\r\n\r\n /**\r\n * 获取监听器数量\r\n * @param event 事件名称\r\n */\r\n listenerCount<K extends keyof TEventMap>(event: K): number {\r\n return this.listeners.get(event)?.size ?? 0\r\n }\r\n\r\n /**\r\n * 移除所有监听器\r\n */\r\n removeAllListeners(): void {\r\n this.listeners.clear()\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n dispose(): void {\r\n this.removeAllListeners()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport type { EventEmitter } from './EventEmitter'\r\nimport type { EventMap } from '../types/event.types'\r\n\r\n/**\r\n * 场景管理器\r\n * 封装 THREE.Scene,提供扩展功能\r\n */\r\nexport class SceneManager {\r\n /** Three.js 场景实例 */\r\n readonly scene: THREE.Scene\r\n\r\n /** 环境贴图 */\r\n private _envBackground: THREE.CubeTexture | THREE.Texture | null = null\r\n\r\n /** 是否启用环境贴图 */\r\n private _environmentEnabled = false\r\n\r\n /** 环境贴图变化回调列表 */\r\n private envMapChangeCallbacks: Array<() => void> = []\r\n\r\n /** SSR 网格列表 */\r\n readonly ssrMeshList: THREE.Mesh[] = []\r\n\r\n constructor(private events: EventEmitter<EventMap>) {\r\n this.scene = new THREE.Scene()\r\n this.scene.name = 'MainScene'\r\n }\r\n\r\n /**\r\n * 获取环境贴图\r\n */\r\n get envBackground(): THREE.CubeTexture | THREE.Texture | null {\r\n return this._envBackground\r\n }\r\n\r\n /**\r\n * 设置环境贴图\r\n */\r\n set envBackground(value: THREE.CubeTexture | THREE.Texture | null) {\r\n this._envBackground = value\r\n this.updateEnvironment()\r\n this.envMapChangeCallbacks.forEach(cb => cb())\r\n }\r\n\r\n /**\r\n * 获取是否启用环境贴图\r\n */\r\n get environmentEnabled(): boolean {\r\n return this._environmentEnabled\r\n }\r\n\r\n /**\r\n * 设置是否启用环境贴图\r\n */\r\n set environmentEnabled(value: boolean) {\r\n this._environmentEnabled = value\r\n this.updateEnvironment()\r\n }\r\n\r\n /**\r\n * 更新环境贴图\r\n */\r\n private updateEnvironment(): void {\r\n this.scene.environment = this._environmentEnabled ? this._envBackground : null\r\n }\r\n\r\n /**\r\n * 注册环境贴图变化回调\r\n */\r\n onEnvMapChange(callback: () => void): () => void {\r\n this.envMapChangeCallbacks.push(callback)\r\n return () => {\r\n const index = this.envMapChangeCallbacks.indexOf(callback)\r\n if (index > -1) {\r\n this.envMapChangeCallbacks.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景\r\n */\r\n setBackground(background: THREE.Color | THREE.Texture | THREE.CubeTexture | null): void {\r\n this.scene.background = background\r\n this.events.emit('scene:background:change', { background })\r\n }\r\n\r\n /**\r\n * 设置天空盒\r\n * @param urls 六张图片的 URL 数组 [px, nx, py, ny, pz, nz]\r\n */\r\n setSkybox(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n const loader = new THREE.CubeTextureLoader()\r\n loader.load(\r\n urls,\r\n (texture) => {\r\n this.scene.background = texture\r\n this.events.emit('scene:background:change', { background: texture })\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置环境贴图\r\n * @param urls 六张图片的 URL 数组\r\n */\r\n setEnvironmentMap(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n const loader = new THREE.CubeTextureLoader()\r\n loader.load(\r\n urls,\r\n (texture) => {\r\n this.envBackground = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 添加物体到场景\r\n */\r\n add(...objects: THREE.Object3D[]): void {\r\n for (const object of objects) {\r\n this.scene.add(object)\r\n this.events.emit('object:added', { object, parent: this.scene })\r\n }\r\n }\r\n\r\n /**\r\n * 从场景移除物体\r\n */\r\n remove(...objects: THREE.Object3D[]): void {\r\n for (const object of objects) {\r\n this.scene.remove(object)\r\n this.events.emit('object:removed', { object, parent: this.scene })\r\n }\r\n }\r\n\r\n /**\r\n * 根据名称获取物体\r\n */\r\n getObjectByName(name: string): THREE.Object3D | undefined {\r\n return this.scene.getObjectByName(name)\r\n }\r\n\r\n /**\r\n * 根据 ID 获取物体\r\n */\r\n getObjectById(id: number): THREE.Object3D | undefined {\r\n return this.scene.getObjectById(id)\r\n }\r\n\r\n /**\r\n * 遍历场景中的所有物体\r\n */\r\n traverse(callback: (object: THREE.Object3D) => void): void {\r\n this.scene.traverse(callback)\r\n }\r\n\r\n /**\r\n * 获取场景中的所有网格\r\n */\r\n getMeshes(): THREE.Mesh[] {\r\n const meshes: THREE.Mesh[] = []\r\n this.scene.traverse((object) => {\r\n if (object instanceof THREE.Mesh) {\r\n meshes.push(object)\r\n }\r\n })\r\n return meshes\r\n }\r\n\r\n /**\r\n * 获取场景中的所有灯光\r\n */\r\n getLights(): THREE.Light[] {\r\n const lights: THREE.Light[] = []\r\n this.scene.traverse((object) => {\r\n if (object instanceof THREE.Light) {\r\n lights.push(object)\r\n }\r\n })\r\n return lights\r\n }\r\n\r\n /**\r\n * 清空场景\r\n */\r\n clear(): void {\r\n while (this.scene.children.length > 0) {\r\n const child = this.scene.children[0]\r\n this.scene.remove(child)\r\n this.events.emit('object:removed', { object: child, parent: this.scene })\r\n }\r\n }\r\n\r\n /**\r\n * 销毁场景\r\n */\r\n dispose(): void {\r\n this.scene.traverse((object) => {\r\n if (object instanceof THREE.Mesh) {\r\n object.geometry?.dispose()\r\n if (Array.isArray(object.material)) {\r\n object.material.forEach(m => {\r\n m.dispose()\r\n if ('map' in m && m.map) {\r\n (m.map as THREE.Texture).dispose()\r\n }\r\n })\r\n } else if (object.material) {\r\n object.material.dispose()\r\n if ('map' in object.material && object.material.map) {\r\n (object.material.map as THREE.Texture).dispose()\r\n }\r\n }\r\n }\r\n })\r\n\r\n this.clear()\r\n this.envMapChangeCallbacks = []\r\n this.ssrMeshList.length = 0\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport type { CameraConfig } from '../types/config.types'\r\nimport type { EventEmitter } from './EventEmitter'\r\nimport type { EventMap } from '../types/event.types'\r\n\r\n/**\r\n * 默认相机配置\r\n */\r\nexport const DEFAULT_CAMERA_CONFIG: CameraConfig = {\r\n fov: 50,\r\n near: 0.1,\r\n far: 100000,\r\n position: { x: 10, y: 10, z: 10 }\r\n}\r\n\r\n/**\r\n * 相机管理器\r\n * 封装 THREE.PerspectiveCamera,提供扩展功能\r\n */\r\nexport class CameraManager {\r\n /** Three.js 相机实例 */\r\n readonly camera: THREE.PerspectiveCamera\r\n\r\n /** 配置 */\r\n private config: CameraConfig\r\n\r\n constructor(\r\n private container: HTMLElement,\r\n private events: EventEmitter<EventMap>,\r\n config?: Partial<CameraConfig>\r\n ) {\r\n this.config = { ...DEFAULT_CAMERA_CONFIG, ...config }\r\n\r\n const aspect = container.clientWidth / container.clientHeight\r\n\r\n this.camera = new THREE.PerspectiveCamera(\r\n this.config.fov,\r\n aspect,\r\n this.config.near,\r\n this.config.far\r\n )\r\n\r\n this.camera.name = 'MainCamera'\r\n this.camera.position.set(\r\n this.config.position.x,\r\n this.config.position.y,\r\n this.config.position.z\r\n )\r\n }\r\n\r\n /**\r\n * 获取相机位置\r\n */\r\n get position(): THREE.Vector3 {\r\n return this.camera.position\r\n }\r\n\r\n /**\r\n * 获取相机视野角度\r\n */\r\n get fov(): number {\r\n return this.camera.fov\r\n }\r\n\r\n /**\r\n * 设置相机视野角度\r\n */\r\n set fov(value: number) {\r\n this.camera.fov = value\r\n this.camera.updateProjectionMatrix()\r\n this.events.emit('camera:change', { camera: this.camera })\r\n }\r\n\r\n /**\r\n * 获取近裁剪面\r\n */\r\n get near(): number {\r\n return this.camera.near\r\n }\r\n\r\n /**\r\n * 设置近裁剪面\r\n */\r\n set near(value: number) {\r\n this.camera.near = value\r\n this.camera.updateProjectionMatrix()\r\n this.events.emit('camera:change', { camera: this.camera })\r\n }\r\n\r\n /**\r\n * 获取远裁剪面\r\n */\r\n get far(): number {\r\n return this.camera.far\r\n }\r\n\r\n /**\r\n * 设置远裁剪面\r\n */\r\n set far(value: number) {\r\n this.camera.far = value\r\n this.camera.updateProjectionMatrix()\r\n this.events.emit('camera:change', { camera: this.camera })\r\n }\r\n\r\n /**\r\n * 设置相机位置\r\n */\r\n setPosition(x: number, y: number, z: number): void {\r\n this.camera.position.set(x, y, z)\r\n this.events.emit('camera:change', { camera: this.camera })\r\n }\r\n\r\n /**\r\n * 让相机看向目标点\r\n */\r\n lookAt(target: THREE.Vector3 | { x: number; y: number; z: number }): void {\r\n if (target instanceof THREE.Vector3) {\r\n this.camera.lookAt(target)\r\n } else {\r\n this.camera.lookAt(target.x, target.y, target.z)\r\n }\r\n this.events.emit('camera:change', { camera: this.camera })\r\n }\r\n\r\n /**\r\n * 更新相机宽高比\r\n */\r\n updateAspect(): void {\r\n this.camera.aspect = this.container.clientWidth / this.container.clientHeight\r\n this.camera.updateProjectionMatrix()\r\n }\r\n\r\n /**\r\n * 获取相机世界方向\r\n */\r\n getWorldDirection(): THREE.Vector3 {\r\n const direction = new THREE.Vector3()\r\n this.camera.getWorldDirection(direction)\r\n return direction\r\n }\r\n\r\n /**\r\n * 获取相机前方指定距离的点\r\n */\r\n getTargetPoint(distance: number): THREE.Vector3 {\r\n const direction = this.getWorldDirection()\r\n return this.camera.position.clone().add(direction.multiplyScalar(distance))\r\n }\r\n\r\n /**\r\n * 获取相机配置\r\n */\r\n getConfig(): CameraConfig {\r\n return {\r\n fov: this.camera.fov,\r\n near: this.camera.near,\r\n far: this.camera.far,\r\n position: {\r\n x: this.camera.position.x,\r\n y: this.camera.position.y,\r\n z: this.camera.position.z\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 应用配置\r\n */\r\n applyConfig(config: Partial<CameraConfig>): void {\r\n if (config.fov !== undefined) {\r\n this.camera.fov = config.fov\r\n }\r\n if (config.near !== undefined) {\r\n this.camera.near = config.near\r\n }\r\n if (config.far !== undefined) {\r\n this.camera.far = config.far\r\n }\r\n if (config.position) {\r\n this.camera.position.set(\r\n config.position.x,\r\n config.position.y,\r\n config.position.z\r\n )\r\n }\r\n this.camera.updateProjectionMatrix()\r\n this.events.emit('camera:change', { camera: this.camera })\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n dispose(): void {\r\n // 相机本身不需要特殊清理\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport type { RendererConfig } from '../types/config.types'\r\nimport type { EventEmitter } from './EventEmitter'\r\nimport type { EventMap } from '../types/event.types'\r\n\r\n/**\r\n * 默认渲染器配置\r\n */\r\nexport const DEFAULT_RENDERER_CONFIG: RendererConfig = {\r\n pixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio : 1,\r\n antialias: true,\r\n alpha: true,\r\n logarithmicDepthBuffer: true,\r\n preserveDrawingBuffer: false,\r\n powerPreference: 'high-performance',\r\n toneMapping: THREE.NoToneMapping,\r\n toneMappingExposure: 1,\r\n outputColorSpace: THREE.SRGBColorSpace,\r\n shadowMapEnabled: false,\r\n shadowMapType: THREE.PCFSoftShadowMap\r\n}\r\n\r\n/**\r\n * 渲染器管理器\r\n * 封装 THREE.WebGLRenderer,提供扩展功能\r\n */\r\nexport class RendererManager {\r\n /** Three.js 渲染器实例 */\r\n readonly renderer: THREE.WebGLRenderer\r\n\r\n /** 配置 */\r\n private config: RendererConfig\r\n\r\n constructor(\r\n private container: HTMLElement,\r\n private events: EventEmitter<EventMap>,\r\n config?: Partial<RendererConfig>\r\n ) {\r\n this.config = { ...DEFAULT_RENDERER_CONFIG, ...config }\r\n\r\n this.renderer = new THREE.WebGLRenderer({\r\n antialias: this.config.antialias,\r\n alpha: this.config.alpha,\r\n logarithmicDepthBuffer: this.config.logarithmicDepthBuffer,\r\n preserveDrawingBuffer: this.config.preserveDrawingBuffer,\r\n powerPreference: this.config.powerPreference\r\n })\r\n\r\n this.renderer.setSize(container.clientWidth, container.clientHeight)\r\n this.renderer.setPixelRatio(this.config.pixelRatio)\r\n this.renderer.toneMapping = this.config.toneMapping\r\n this.renderer.toneMappingExposure = this.config.toneMappingExposure\r\n this.renderer.outputColorSpace = this.config.outputColorSpace\r\n\r\n // 阴影配置\r\n this.renderer.shadowMap.enabled = this.config.shadowMapEnabled\r\n this.renderer.shadowMap.type = this.config.shadowMapType\r\n\r\n // 添加到容器\r\n container.appendChild(this.renderer.domElement)\r\n }\r\n\r\n /**\r\n * 获取 DOM 元素\r\n */\r\n get domElement(): HTMLCanvasElement {\r\n return this.renderer.domElement\r\n }\r\n\r\n /**\r\n * 获取像素比\r\n */\r\n get pixelRatio(): number {\r\n return this.renderer.getPixelRatio()\r\n }\r\n\r\n /**\r\n * 设置像素比\r\n */\r\n set pixelRatio(value: number) {\r\n this.renderer.setPixelRatio(value)\r\n this.config.pixelRatio = value\r\n }\r\n\r\n /**\r\n * 获取渲染器大小\r\n */\r\n getSize(): { width: number; height: number } {\r\n const size = new THREE.Vector2()\r\n this.renderer.getSize(size)\r\n return { width: size.x, height: size.y }\r\n }\r\n\r\n /**\r\n * 设置渲染器大小\r\n */\r\n setSize(width: number, height: number): void {\r\n this.renderer.setSize(width, height)\r\n this.events.emit('resize', { width, height })\r\n }\r\n\r\n /**\r\n * 更新大小以适应容器\r\n */\r\n updateSize(): void {\r\n const width = this.container.clientWidth\r\n const height = this.container.clientHeight\r\n this.setSize(width, height)\r\n }\r\n\r\n /**\r\n * 渲染场景\r\n */\r\n render(scene: THREE.Scene, camera: THREE.Camera): void {\r\n this.renderer.render(scene, camera)\r\n }\r\n\r\n /**\r\n * 获取截图\r\n */\r\n getScreenshot(type = 'image/png', quality = 0.9): string {\r\n return this.renderer.domElement.toDataURL(type, quality)\r\n }\r\n\r\n /**\r\n * 启用/禁用阴影\r\n */\r\n setShadowMapEnabled(enabled: boolean): void {\r\n this.renderer.shadowMap.enabled = enabled\r\n this.config.shadowMapEnabled = enabled\r\n }\r\n\r\n /**\r\n * 设置阴影类型\r\n */\r\n setShadowMapType(type: THREE.ShadowMapType): void {\r\n this.renderer.shadowMap.type = type\r\n this.config.shadowMapType = type\r\n }\r\n\r\n /**\r\n * 设置色调映射\r\n */\r\n setToneMapping(toneMapping: THREE.ToneMapping, exposure?: number): void {\r\n this.renderer.toneMapping = toneMapping\r\n this.config.toneMapping = toneMapping\r\n if (exposure !== undefined) {\r\n this.renderer.toneMappingExposure = exposure\r\n this.config.toneMappingExposure = exposure\r\n }\r\n }\r\n\r\n /**\r\n * 获取渲染器配置\r\n */\r\n getConfig(): RendererConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 应用配置\r\n */\r\n applyConfig(config: Partial<RendererConfig>): void {\r\n if (config.pixelRatio !== undefined) {\r\n this.pixelRatio = config.pixelRatio\r\n }\r\n if (config.toneMapping !== undefined) {\r\n this.renderer.toneMapping = config.toneMapping\r\n this.config.toneMapping = config.toneMapping\r\n }\r\n if (config.toneMappingExposure !== undefined) {\r\n this.renderer.toneMappingExposure = config.toneMappingExposure\r\n this.config.toneMappingExposure = config.toneMappingExposure\r\n }\r\n if (config.shadowMapEnabled !== undefined) {\r\n this.setShadowMapEnabled(config.shadowMapEnabled)\r\n }\r\n if (config.shadowMapType !== undefined) {\r\n this.setShadowMapType(config.shadowMapType)\r\n }\r\n }\r\n\r\n /**\r\n * 获取渲染信息\r\n */\r\n getInfo(): THREE.WebGLInfo {\r\n return this.renderer.info\r\n }\r\n\r\n /**\r\n * 清除渲染信息\r\n */\r\n resetInfo(): void {\r\n this.renderer.info.reset()\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n dispose(): void {\r\n this.renderer.dispose()\r\n this.renderer.forceContextLoss()\r\n if (this.renderer.domElement.parentNode) {\r\n this.renderer.domElement.parentNode.removeChild(this.renderer.domElement)\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { EventEmitter } from './EventEmitter'\r\nimport { SceneManager } from './Scene'\r\nimport { CameraManager } from './Camera'\r\nimport { RendererManager } from './Renderer'\r\nimport type { EngineConfig } from '../types/config.types'\r\nimport type { EventMap } from '../types/event.types'\r\n\r\n/**\r\n * 默认引擎配置\r\n */\r\nexport const DEFAULT_ENGINE_CONFIG: Partial<EngineConfig> = {\r\n autoResize: true,\r\n fps: null,\r\n autoStart: true\r\n}\r\n\r\n/**\r\n * 帧回调函数类型\r\n */\r\ntype FrameCallback = (delta: number, elapsed: number) => void\r\n\r\n/**\r\n * 引擎核心\r\n * 管理场景、相机、渲染器和渲染循环\r\n */\r\nexport class Engine {\r\n /** 事件发射器 */\r\n readonly events: EventEmitter<EventMap>\r\n\r\n /** 场景管理器 */\r\n readonly sceneManager: SceneManager\r\n\r\n /** 相机管理器 */\r\n readonly cameraManager: CameraManager\r\n\r\n /** 渲染器管理器 */\r\n readonly rendererManager: RendererManager\r\n\r\n /** 时钟 */\r\n readonly clock: THREE.Clock\r\n\r\n /** 配置 */\r\n private config: EngineConfig\r\n\r\n /** 动画帧 ID */\r\n private animationId: number | null = null\r\n\r\n /** 是否正在运行 */\r\n private _isRunning = false\r\n\r\n /** 帧回调列表 */\r\n private frameCallbacks: Set<FrameCallback> = new Set()\r\n\r\n /** FPS 控制相关 */\r\n private fpsInterval: number = 0\r\n private lastFrameTime: number = 0\r\n\r\n /** 容器 */\r\n private container: HTMLElement\r\n\r\n /** 窗口大小变化处理函数 */\r\n private resizeHandler: (() => void) | null = null\r\n\r\n constructor(config: EngineConfig) {\r\n this.config = { ...DEFAULT_ENGINE_CONFIG, ...config } as EngineConfig\r\n this.container = config.container\r\n\r\n // 初始化事件系统\r\n this.events = new EventEmitter<EventMap>()\r\n\r\n // 初始化时钟\r\n this.clock = new THREE.Clock(false)\r\n\r\n // 初始化场景\r\n this.sceneManager = new SceneManager(this.events)\r\n\r\n // 初始化相机\r\n this.cameraManager = new CameraManager(\r\n this.container,\r\n this.events,\r\n config.camera\r\n )\r\n\r\n // 将相机添加到场景\r\n this.sceneManager.scene.add(this.cameraManager.camera)\r\n\r\n // 初始化渲染器\r\n this.rendererManager = new RendererManager(\r\n this.container,\r\n this.events,\r\n config.renderer\r\n )\r\n\r\n // FPS 控制\r\n if (this.config.fps !== undefined && this.config.fps !== null && this.config.fps > 0) {\r\n this.fpsInterval = 1000 / this.config.fps\r\n }\r\n\r\n // 自动调整大小\r\n if (this.config.autoResize) {\r\n this.setupAutoResize()\r\n }\r\n\r\n // 发射就绪事件\r\n this.events.emit('engine:ready', undefined)\r\n\r\n // 自动启动\r\n if (this.config.autoStart) {\r\n this.start()\r\n }\r\n }\r\n\r\n /**\r\n * 获取场景\r\n */\r\n get scene(): THREE.Scene {\r\n return this.sceneManager.scene\r\n }\r\n\r\n /**\r\n * 获取相机\r\n */\r\n get camera(): THREE.PerspectiveCamera {\r\n return this.cameraManager.camera\r\n }\r\n\r\n /**\r\n * 获取渲染器\r\n */\r\n get renderer(): THREE.WebGLRenderer {\r\n return this.rendererManager.renderer\r\n }\r\n\r\n /**\r\n * 获取 DOM 元素\r\n */\r\n get domElement(): HTMLCanvasElement {\r\n return this.rendererManager.domElement\r\n }\r\n\r\n /**\r\n * 是否正在运行\r\n */\r\n get isRunning(): boolean {\r\n return this._isRunning\r\n }\r\n\r\n /**\r\n * 设置自动调整大小\r\n */\r\n private setupAutoResize(): void {\r\n this.resizeHandler = () => this.resize()\r\n window.addEventListener('resize', this.resizeHandler)\r\n }\r\n\r\n /**\r\n * 启动渲染循环\r\n */\r\n start(): void {\r\n if (this._isRunning) return\r\n\r\n this._isRunning = true\r\n this.clock.start()\r\n this.lastFrameTime = performance.now()\r\n this.events.emit('engine:start', undefined)\r\n this.animate()\r\n }\r\n\r\n /**\r\n * 停止渲染循环\r\n */\r\n stop(): void {\r\n if (!this._isRunning) return\r\n\r\n this._isRunning = false\r\n this.clock.stop()\r\n\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId)\r\n this.animationId = null\r\n }\r\n\r\n this.events.emit('engine:stop', undefined)\r\n }\r\n\r\n /**\r\n * 动画循环\r\n */\r\n private animate = (): void => {\r\n if (!this._isRunning) return\r\n\r\n this.animationId = requestAnimationFrame(this.animate)\r\n\r\n const now = performance.now()\r\n\r\n // FPS 控制\r\n if (this.fpsInterval > 0) {\r\n const elapsed = now - this.lastFrameTime\r\n if (elapsed < this.fpsInterval) return\r\n this.lastFrameTime = now - (elapsed % this.fpsInterval)\r\n }\r\n\r\n const delta = this.clock.getDelta()\r\n const elapsedTime = this.clock.getElapsedTime()\r\n\r\n // 发射渲染前事件\r\n this.events.emit('render:before', { delta, elapsed: elapsedTime })\r\n\r\n // 执行帧回调\r\n for (const callback of this.frameCallbacks) {\r\n try {\r\n callback(delta, elapsedTime)\r\n } catch (error) {\r\n console.error('Error in frame callback:', error)\r\n }\r\n }\r\n\r\n // 渲染\r\n this.render()\r\n\r\n // 发射渲染后事件\r\n this.events.emit('render:after', { delta, elapsed: elapsedTime })\r\n }\r\n\r\n /**\r\n * 渲染一帧\r\n */\r\n render(): void {\r\n this.rendererManager.render(this.scene, this.camera)\r\n }\r\n\r\n /**\r\n * 调整大小\r\n */\r\n resize(): void {\r\n const width = this.container.clientWidth\r\n const height = this.container.clientHeight\r\n\r\n this.cameraManager.updateAspect()\r\n this.rendererManager.setSize(width, height)\r\n\r\n this.events.emit('resize', { width, height })\r\n }\r\n\r\n /**\r\n * 注册帧回调\r\n * @param callback 每帧执行的回调函数\r\n * @returns 取消注册函数\r\n */\r\n onUpdate(callback: FrameCallback): () => void {\r\n this.frameCallbacks.add(callback)\r\n return () => {\r\n this.frameCallbacks.delete(callback)\r\n }\r\n }\r\n\r\n /**\r\n * 获取截图\r\n */\r\n screenshot(type?: string, quality?: number): string {\r\n // 确保渲染最新帧\r\n this.render()\r\n return this.rendererManager.getScreenshot(type, quality)\r\n }\r\n\r\n /**\r\n * 设置 FPS 限制\r\n */\r\n setFPS(fps: number | null): void {\r\n this.config.fps = fps\r\n if (fps !== null && fps > 0) {\r\n this.fpsInterval = 1000 / fps\r\n } else {\r\n this.fpsInterval = 0\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前 FPS\r\n */\r\n getFPS(): number {\r\n return this.fpsInterval > 0 ? 1000 / this.fpsInterval : 0\r\n }\r\n\r\n /**\r\n * 销毁引擎\r\n */\r\n dispose(): void {\r\n this.events.emit('engine:dispose', undefined)\r\n\r\n // 停止渲染循环\r\n this.stop()\r\n\r\n // 移除窗口事件监听\r\n if (this.resizeHandler) {\r\n window.removeEventListener('resize', this.resizeHandler)\r\n this.resizeHandler = null\r\n }\r\n\r\n // 清空帧回调\r\n this.frameCallbacks.clear()\r\n\r\n // 销毁各管理器\r\n this.sceneManager.dispose()\r\n this.cameraManager.dispose()\r\n this.rendererManager.dispose()\r\n\r\n // 销毁事件系统\r\n this.events.dispose()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport gsap from 'gsap'\r\nimport { Engine } from './core/Engine'\r\nimport { EventEmitter } from './core/EventEmitter'\r\nimport { PluginManager } from './plugins/PluginManager'\r\nimport { OrbitControllerPlugin } from './plugins/controls/OrbitController'\r\nimport { TransformControllerPlugin } from './plugins/controls/TransformController'\r\nimport { LoaderPlugin } from './plugins/loaders/LoaderPlugin'\r\nimport { ComposerPlugin } from './plugins/postprocessing/ComposerPlugin'\r\nimport { CSSRendererPlugin } from './plugins/renderers/CSSRendererPlugin'\r\nimport { EditorPlugin } from './plugins/editor/EditorPlugin'\r\nimport { GUIPlugin } from './plugins/gui/GUIPlugin'\r\nimport { GizmoPlugin } from './plugins/gizmo/GizmoPlugin'\r\nimport { getDistanceScalePoint } from './utils/math'\r\nimport { getBestViewTarget, getObjectViews } from './utils/box3'\r\nimport { getRootModel } from './utils/raycast'\r\nimport type { ThreeEditorConfig, ScreenshotOptions } from './types/config.types'\r\nimport type { GsapQuery } from './types/core.types'\r\nimport type { EventMap } from './types/event.types'\r\nimport type { IPlugin } from './types/plugin.types'\r\nimport type {\r\n HandlerMode,\r\n RootInfo,\r\n LoaderService,\r\n ClickInfo,\r\n ViewAngle,\r\n CurveAnimationController,\r\n ExtendedObject3D\r\n} from './types/core.types'\r\n\r\n/**\r\n * Draco 解码器默认路径\r\n */\r\nlet dracoPath = '/draco/'\r\n\r\n/**\r\n * Three Editor 主类\r\n * 提供完整的 3D 编辑器功能\r\n */\r\nexport class ThreeEditor {\r\n /** Three.js 库引用 */\r\n static THREE = THREE\r\n\r\n /** GSAP 库引用 */\r\n static gsap = gsap\r\n\r\n /** Draco 解码器路径 */\r\n static get dracoPath(): string {\r\n return dracoPath\r\n }\r\n\r\n static set dracoPath(path: string) {\r\n dracoPath = path\r\n }\r\n\r\n /** 引擎实例 */\r\n readonly engine: Engine\r\n\r\n /** 事件发射器 */\r\n readonly events: EventEmitter<EventMap>\r\n\r\n /** 插件管理器 */\r\n readonly plugins: PluginManager\r\n\r\n /** 配置 */\r\n private config: ThreeEditorConfig\r\n\r\n /** 进度列表 */\r\n progressList: Array<{ loaderService: LoaderService; rootInfo: RootInfo; params?: any }> = []\r\n\r\n /** 公共帧动画列表 */\r\n private commonFrameList: CurveAnimationController[] = []\r\n\r\n /** 混合器列表 */\r\n private mixerList: THREE.AnimationMixer[] = []\r\n\r\n /** 着色器列表 */\r\n private shaderList: any[] = []\r\n\r\n constructor(config: ThreeEditorConfig) {\r\n this.config = config\r\n\r\n // 创建引擎\r\n this.engine = new Engine({\r\n container: config.container,\r\n ...config.engine,\r\n autoStart: false\r\n })\r\n\r\n // 使用引擎的事件发射器\r\n this.events = this.engine.events\r\n\r\n // 创建插件管理器\r\n this.plugins = new PluginManager({\r\n engine: this.engine,\r\n events: this.events\r\n })\r\n\r\n // 安装核心插件\r\n this.installCorePlugins()\r\n\r\n // 设置渲染回调\r\n this.engine.onUpdate((delta, elapsed) => {\r\n this.onUpdate(delta, elapsed)\r\n })\r\n\r\n // 恢复场景(如果有)\r\n if (config.sceneParams) {\r\n this.restoreScene(config.sceneParams)\r\n }\r\n\r\n // 加载模型(如果有)\r\n if (config.meshListParams) {\r\n config.meshListParams.forEach(item => {\r\n this.setModelFromInfo(item.rootInfo, item.group)\r\n })\r\n }\r\n\r\n // 设置天空盒(如果有)\r\n if (config.skyParams) {\r\n this.setSky(config.skyParams)\r\n this.setGlobalEnvBackground(config.skyParams)\r\n }\r\n\r\n // 启动引擎\r\n if (config.autoStart !== false) {\r\n this.engine.start()\r\n }\r\n }\r\n\r\n // ============ 便捷访问器 ============\r\n\r\n /** 获取 THREE 库 */\r\n get THREE() {\r\n return THREE\r\n }\r\n\r\n /** 获取 gsap 库 */\r\n get gsap() {\r\n return gsap\r\n }\r\n\r\n /** 获取场景 */\r\n get scene(): THREE.Scene {\r\n return this.engine.scene\r\n }\r\n\r\n /** 获取相机 */\r\n get camera(): THREE.PerspectiveCamera {\r\n return this.engine.camera\r\n }\r\n\r\n /** 获取渲染器 */\r\n get renderer(): THREE.WebGLRenderer {\r\n return this.engine.renderer\r\n }\r\n\r\n /** 获取 viewer 对象(兼容旧 API) */\r\n get viewer() {\r\n const orbitPlugin = this.plugins.get<OrbitControllerPlugin>('orbit-controller')\r\n const transformPlugin = this.plugins.get<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.plugins.get<ComposerPlugin>('composer')\r\n const cssPlugin = this.plugins.get<CSSRendererPlugin>('css-renderer')\r\n const editorPlugin = this.plugins.get<EditorPlugin>('editor')\r\n const loaderPlugin = this.plugins.get<LoaderPlugin>('loader')\r\n const guiPlugin = this.plugins.get<GUIPlugin>('gui')\r\n\r\n return {\r\n scene: this.scene,\r\n camera: this.camera,\r\n renderer: this.renderer,\r\n controls: orbitPlugin?.controls,\r\n transformControls: transformPlugin?.controls,\r\n Composer: composerPlugin,\r\n CSS2DObject: cssPlugin?.CSS2DObject,\r\n CSS3DObject: cssPlugin?.CSS3DObject,\r\n MixerList: this.mixerList,\r\n ShaderList: this.shaderList,\r\n CommonFrameList: this.commonFrameList,\r\n handler: editorPlugin,\r\n modelControls: loaderPlugin,\r\n currentInfo: editorPlugin?.currentInfo,\r\n GUI: guiPlugin?.gui,\r\n renderSceneResize: () => this.engine.resize(),\r\n destroySceneRender: () => this.dispose(),\r\n saveSceneEditor: () => this.saveSceneEditor()\r\n }\r\n }\r\n\r\n // ============ 核心方法 ============\r\n\r\n /**\r\n * 安装核心插件\r\n */\r\n private installCorePlugins(): void {\r\n // 轨道控制器\r\n this.plugins.use(new OrbitControllerPlugin())\r\n\r\n // 变换控制器\r\n this.plugins.use(new TransformControllerPlugin())\r\n\r\n // 加载器\r\n const loaderPlugin = new LoaderPlugin({ dracoPath: ThreeEditor.dracoPath })\r\n this.plugins.use(loaderPlugin)\r\n\r\n // 后期处理\r\n this.plugins.use(new ComposerPlugin())\r\n\r\n // CSS 渲染器\r\n this.plugins.use(new CSSRendererPlugin())\r\n\r\n // 编辑器\r\n this.plugins.use(new EditorPlugin())\r\n\r\n // 辅助工具 (网格、坐标轴、性能监控)\r\n this.plugins.use(new GizmoPlugin({\r\n grid: { enabled: true, size: 100, divisions: 100, colorCenterLine: 0x444444, colorGrid: 0x888888 },\r\n axes: { enabled: true, size: 5 },\r\n stats: { enabled: false, mode: 0 },\r\n viewHelper: { enabled: false, size: 128, position: 'bottom-right' },\r\n box3Helper: { enabled: false, color: 0xffff00 }\r\n }))\r\n\r\n // GUI 面板\r\n const guiConfig = this.config.gui\r\n if (guiConfig?.useProxy !== true) {\r\n this.plugins.use(new GUIPlugin({\r\n autoPlace: guiConfig?.autoPlace ?? true,\r\n width: guiConfig?.width ?? 300,\r\n useProxy: guiConfig?.useProxy ?? false\r\n }))\r\n }\r\n }\r\n\r\n /**\r\n * 每帧更新\r\n */\r\n private onUpdate(delta: number, elapsed: number): void {\r\n // 更新混合器\r\n this.mixerList.forEach(mixer => {\r\n (mixer as any).mixerRender?.()\r\n })\r\n\r\n // 更新着色器\r\n this.shaderList.forEach(shader => {\r\n shader.ShaderAnimateRender?.()\r\n })\r\n\r\n // 更新公共帧动画\r\n this.commonFrameList.forEach((anim: any) => {\r\n anim.frameAnimationRender?.()\r\n })\r\n\r\n // 后期处理渲染\r\n const composerPlugin = this.plugins.get<ComposerPlugin>('composer')\r\n if (composerPlugin) {\r\n composerPlugin.render()\r\n }\r\n }\r\n\r\n /**\r\n * 使用插件\r\n */\r\n use<T extends IPlugin>(plugin: T): this {\r\n this.plugins.use(plugin)\r\n return this\r\n }\r\n\r\n // ============ 模型加载 ============\r\n\r\n /**\r\n * 根据类型加载模型\r\n */\r\n setModelFromInfo(rootInfo: RootInfo, params: any = null): {\r\n loaderService: LoaderService\r\n rootInfo: RootInfo\r\n params: any\r\n } {\r\n const loaderPlugin = this.plugins.get<LoaderPlugin>('loader')\r\n if (!loaderPlugin) {\r\n throw new Error('Loader plugin not installed')\r\n }\r\n\r\n const loaderService = loaderPlugin.loadModel(rootInfo)\r\n\r\n // 加载完成后添加到场景\r\n const originalComplete = loaderService.complete\r\n loaderService.complete = (model) => {\r\n // 标记根信息\r\n (model as ExtendedObject3D).rootInfo = rootInfo\r\n\r\n // 添加到场景\r\n this.scene.add(model)\r\n\r\n // 调用原始回调\r\n originalComplete(model)\r\n }\r\n\r\n const item = { loaderService, rootInfo, params }\r\n this.progressList.push(item)\r\n\r\n return item\r\n }\r\n\r\n // ============ 天空/环境 ============\r\n\r\n /**\r\n * 设置天空盒\r\n */\r\n setSky(urls: string[]): void {\r\n this.engine.sceneManager.setSkybox(urls)\r\n }\r\n\r\n /**\r\n * 设置全局环境贴图\r\n */\r\n setGlobalEnvBackground(urls: string[]): void {\r\n this.engine.sceneManager.setEnvironmentMap(urls).then(() => {\r\n this.engine.sceneManager.environmentEnabled = true\r\n })\r\n }\r\n\r\n // ============ CSS DOM ============\r\n\r\n /**\r\n * 设置 CSS2D DOM 元素\r\n */\r\n setCss2dDOM(dom: HTMLElement, position: THREE.Vector3) {\r\n const cssPlugin = this.plugins.get<CSSRendererPlugin>('css-renderer')\r\n if (!cssPlugin) {\r\n throw new Error('CSS Renderer plugin not installed')\r\n }\r\n\r\n dom.style.pointerEvents = 'auto'\r\n const mesh = cssPlugin.addCSS2D(dom, position)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 设置 CSS3D DOM 元素\r\n */\r\n setCss3dDOM(dom: HTMLElement, position: THREE.Vector3) {\r\n const cssPlugin = this.plugins.get<CSSRendererPlugin>('css-renderer')\r\n if (!cssPlugin) {\r\n throw new Error('CSS Renderer plugin not installed')\r\n }\r\n\r\n const mesh = cssPlugin.addCSS3D(dom, position)\r\n return mesh\r\n }\r\n\r\n // ============ 事件处理 ============\r\n\r\n /**\r\n * 获取场景点击事件\r\n */\r\n getSceneEvent(event: MouseEvent, callback: (info: ClickInfo) => void): void {\r\n const editorPlugin = this.plugins.get<EditorPlugin>('editor')\r\n if (!editorPlugin) return\r\n\r\n const info = editorPlugin.handleClick(event)\r\n if (info) {\r\n callback(info)\r\n }\r\n }\r\n\r\n /**\r\n * 获取原始场景事件\r\n */\r\n getRawSceneEvent(): { raycaster: THREE.Raycaster; getIntersects: (event: MouseEvent, objects: THREE.Object3D[]) => THREE.Intersection[] } {\r\n const raycaster = new THREE.Raycaster()\r\n const mouse = new THREE.Vector2()\r\n\r\n const getIntersects = (event: MouseEvent, objects: THREE.Object3D[]): THREE.Intersection[] => {\r\n const rect = this.renderer.domElement.getBoundingClientRect()\r\n mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1\r\n mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n\r\n raycaster.setFromCamera(mouse, this.camera)\r\n return raycaster.intersectObjects(objects, true)\r\n }\r\n\r\n return { raycaster, getIntersects }\r\n }\r\n\r\n // ============ 动画 ============\r\n\r\n /**\r\n * 创建 GSAP 动画\r\n */\r\n setGsapAnimation(\r\n position: THREE.Vector3 | { x: number; y: number; z: number },\r\n target: { x?: number; y?: number; z?: number },\r\n query: GsapQuery = {}\r\n ) {\r\n return gsap.to(position, {\r\n ...target,\r\n duration: 2,\r\n ease: 'none',\r\n repeat: 0,\r\n yoyo: false,\r\n yoyoEase: true,\r\n ...query\r\n })\r\n }\r\n\r\n /**\r\n * 播放模型动画\r\n */\r\n setModelAnimationPlay(group: ExtendedObject3D) {\r\n if (!group.animationPlayParams || !group.animations) return null\r\n\r\n const { speed, actionIndexs, startTime, loop } = group.animationPlayParams\r\n\r\n const clock = new THREE.Clock()\r\n const mixer = new THREE.AnimationMixer(group as unknown as THREE.Object3D)\r\n\r\n const actions = group.animations\r\n .filter((_, index) => actionIndexs[index])\r\n .map(clip => {\r\n const action = mixer.clipAction(clip)\r\n action.loop = loop ? THREE.LoopRepeat : THREE.LoopOnce\r\n action.time = startTime\r\n action.timeScale = speed\r\n action.clampWhenFinished = true\r\n action.play()\r\n return action\r\n })\r\n\r\n ;(group as any).mixerRender = () => {\r\n mixer.update(clock.getDelta())\r\n }\r\n\r\n this.mixerList.push(mixer as any)\r\n\r\n return { mixer, actions }\r\n }\r\n\r\n /**\r\n * 移除模型动画\r\n */\r\n removeModelAnimation(group: ExtendedObject3D): void {\r\n const index = this.mixerList.findIndex((m: any) => m === group || (m as any).mixerRender === (group as any).mixerRender)\r\n if (index > -1) {\r\n this.mixerList.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 设置曲线动画\r\n */\r\n setCurveAnimation(curve: THREE.Curve<THREE.Vector3>, speed: number = 1): CurveAnimationController {\r\n const commonFrameList = this.commonFrameList\r\n \r\n const controller: CurveAnimationController = {\r\n id: Date.now(),\r\n curve,\r\n time: 0,\r\n pause: false,\r\n speed,\r\n frameCallback: null,\r\n frameEndCallback: null,\r\n start: function(this: CurveAnimationController) {\r\n if (!commonFrameList.includes(this as any)) {\r\n commonFrameList.push(this as any)\r\n }\r\n this.pause = false\r\n },\r\n destroy: function(this: CurveAnimationController) {\r\n const index = commonFrameList.indexOf(this as any)\r\n if (index > -1) {\r\n commonFrameList.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n // 帧动画渲染\r\n ;(controller as any).frameAnimationRender = () => {\r\n if (controller.pause) return\r\n\r\n controller.time += controller.speed / 1000\r\n\r\n if (controller.time > 1 || controller.time < 0) {\r\n controller.time = controller.time > 1 ? 1 : 0\r\n controller.pause = true\r\n controller.frameEndCallback?.()\r\n return\r\n }\r\n\r\n const point = curve.getPointAt(controller.time)\r\n controller.frameCallback?.(point)\r\n }\r\n\r\n return controller\r\n }\r\n\r\n // ============ 后期处理 ============\r\n\r\n /**\r\n * 设置轮廓光选中\r\n */\r\n setOutlinePass(meshList: THREE.Object3D[] = []): void {\r\n const composerPlugin = this.plugins.get<ComposerPlugin>('composer')\r\n if (composerPlugin) {\r\n composerPlugin.setOutlineObjects(meshList)\r\n }\r\n }\r\n\r\n // ============ 控制 ============\r\n\r\n /**\r\n * 设置场景控制模式\r\n */\r\n setSceneControlMode(mode: HandlerMode): void {\r\n const editorPlugin = this.plugins.get<EditorPlugin>('editor')\r\n if (editorPlugin) {\r\n editorPlugin.setMode(mode)\r\n }\r\n }\r\n\r\n /**\r\n * 设置变换控制器属性\r\n */\r\n setTransformControlsProperty(key: string, value: any): void {\r\n const transformPlugin = this.plugins.get<TransformControllerPlugin>('transform-controller')\r\n if (transformPlugin && transformPlugin.controls.hasOwnProperty(key)) {\r\n (transformPlugin.controls as any)[key] = value\r\n }\r\n }\r\n\r\n // ============ 工具方法 ============\r\n\r\n /**\r\n * 获取两点指定距离比例点\r\n */\r\n getDistanceScalePoint = getDistanceScalePoint\r\n\r\n /**\r\n * 获取最佳视角\r\n */\r\n getBestViewTarget = getBestViewTarget\r\n\r\n /**\r\n * 获取物体视图\r\n */\r\n getObjectViews(object: THREE.Object3D, fov?: number) {\r\n return getObjectViews(object, fov ?? this.camera.fov)\r\n }\r\n\r\n /**\r\n * 获取场景曲线列表\r\n */\r\n getSceneCurveList() {\r\n return this.scene.children\r\n .filter(i => (i as ExtendedObject3D).isCurveMesh)\r\n .map(i => ({\r\n path: (i as ExtendedObject3D).curvePath || ((i as THREE.Mesh).geometry as any)?.parameters?.path,\r\n mesh: i\r\n }))\r\n }\r\n\r\n // ============ 保存/恢复 ============\r\n\r\n /**\r\n * 保存场景\r\n */\r\n saveSceneEditor(): void {\r\n if (this.config.saveCallback) {\r\n // TODO: 实现完整的序列化\r\n const sceneParams = {}\r\n const meshListParams: any[] = []\r\n\r\n this.config.saveCallback(sceneParams, meshListParams)\r\n }\r\n }\r\n\r\n /**\r\n * 恢复场景\r\n */\r\n private restoreScene(params: any): void {\r\n // TODO: 实现完整的反序列化\r\n }\r\n\r\n /**\r\n * 获取场景截图\r\n */\r\n getSceneEditorImage(params?: { type?: string; quality?: number } | [string?, number?]): string {\r\n if (Array.isArray(params)) {\r\n return this.engine.screenshot(params[0], params[1])\r\n }\r\n return this.engine.screenshot(params?.type, params?.quality)\r\n }\r\n\r\n /**\r\n * 刷新 GUI\r\n */\r\n refreshGUI(): void {\r\n const guiPlugin = this.plugins.get<GUIPlugin>('gui')\r\n if (guiPlugin) {\r\n guiPlugin.updateDisplay()\r\n }\r\n }\r\n\r\n /**\r\n * 设置 GUI DOM 位置\r\n */\r\n setGUIDomPosition(dom: HTMLElement): { GUIDom: HTMLElement | null; remove: () => void } | null {\r\n const guiPlugin = this.plugins.get<GUIPlugin>('gui')\r\n if (!guiPlugin || !guiPlugin.domElement) return null\r\n\r\n const guiDom = guiPlugin.domElement\r\n dom.appendChild(guiDom)\r\n\r\n return {\r\n GUIDom: guiDom,\r\n remove: () => {\r\n if (guiDom.parentElement === dom) {\r\n dom.removeChild(guiDom)\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置操作选项\r\n */\r\n setOperateOption(key: string, value: boolean): void {\r\n const editorPlugin = this.plugins.get<EditorPlugin>('editor')\r\n const gizmoPlugin = this.plugins.get<any>('gizmo')\r\n\r\n switch (key) {\r\n case 'stats':\r\n if (gizmoPlugin) {\r\n gizmoPlugin.setStatsVisible(value)\r\n }\r\n break\r\n case 'axes':\r\n if (gizmoPlugin) {\r\n gizmoPlugin.setAxesVisible(value)\r\n }\r\n break\r\n case 'grid':\r\n if (gizmoPlugin) {\r\n gizmoPlugin.setGridVisible(value)\r\n }\r\n break\r\n case 'openKey':\r\n if (editorPlugin) {\r\n editorPlugin.config.enableKeyboard = value\r\n }\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * 设置场景分类\r\n */\r\n setSceneFromClassify(type: string): void {\r\n // 根据类型显示/隐藏场景物体\r\n this.scene.children.forEach(child => {\r\n const extChild = child as ExtendedObject3D\r\n if (extChild.rootInfo) {\r\n // 根据分类设置可见性\r\n // TODO: 实现完整的分类逻辑\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 点位同步变换\r\n */\r\n pointSyncTransform(point: THREE.Vector3, mesh: THREE.Object3D): THREE.Vector3 {\r\n const result = point.clone()\r\n result.applyMatrix4(mesh.matrixWorld)\r\n return result\r\n }\r\n\r\n /**\r\n * 克隆材质\r\n */\r\n meshGroupCloneMaterial(object: THREE.Object3D): void {\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n const extMesh = mesh as unknown as ExtendedObject3D\r\n \r\n if (!extMesh.isCloneMaterial) {\r\n extMesh.originMaterial = mesh.material\r\n mesh.material = Array.isArray(mesh.material)\r\n ? mesh.material.map(m => m.clone())\r\n : mesh.material.clone()\r\n extMesh.isCloneMaterial = true\r\n }\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 修改物体材质\r\n */\r\n changeMeshMaterial(object: THREE.Object3D, params: Record<string, any>): void {\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]\r\n \r\n materials.forEach(material => {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (key in material) {\r\n if (key === 'color' || key === 'emissive') {\r\n (material as any)[key].set(value)\r\n } else {\r\n (material as any)[key] = value\r\n }\r\n }\r\n })\r\n material.needsUpdate = true\r\n })\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 修改物体变换\r\n */\r\n changeMeshTransform(object: THREE.Object3D, params: { position?: any; rotation?: any; scale?: any }): void {\r\n const extObj = object as unknown as ExtendedObject3D\r\n \r\n // 保存原始变换\r\n if (!extObj.meshRevertTransform) {\r\n const origPos = object.position.clone()\r\n const origRot = object.rotation.clone()\r\n const origScale = object.scale.clone()\r\n \r\n extObj.meshRevertTransform = () => {\r\n object.position.copy(origPos)\r\n object.rotation.copy(origRot)\r\n object.scale.copy(origScale)\r\n }\r\n }\r\n\r\n if (params.position) {\r\n object.position.set(params.position.x ?? object.position.x, params.position.y ?? object.position.y, params.position.z ?? object.position.z)\r\n }\r\n if (params.rotation) {\r\n object.rotation.set(params.rotation.x ?? object.rotation.x, params.rotation.y ?? object.rotation.y, params.rotation.z ?? object.rotation.z)\r\n }\r\n if (params.scale) {\r\n object.scale.set(params.scale.x ?? object.scale.x, params.scale.y ?? object.scale.y, params.scale.z ?? object.scale.z)\r\n }\r\n }\r\n\r\n /**\r\n * 执行 GSAP 物体动作\r\n */\r\n setGsapMeshAction(\r\n mesh: THREE.Object3D,\r\n fromTransform: any,\r\n toTransform: any,\r\n gsapParams: { mode?: string; query: GsapQuery }\r\n ): void {\r\n const { query } = gsapParams\r\n\r\n // 位置动画\r\n if (fromTransform.position && toTransform.position) {\r\n mesh.position.set(fromTransform.position.x, fromTransform.position.y, fromTransform.position.z)\r\n gsap.to(mesh.position, {\r\n x: toTransform.position.x,\r\n y: toTransform.position.y,\r\n z: toTransform.position.z,\r\n ...query\r\n })\r\n }\r\n\r\n // 旋转动画\r\n if (fromTransform.rotation && toTransform.rotation) {\r\n mesh.rotation.set(fromTransform.rotation.x, fromTransform.rotation.y, fromTransform.rotation.z)\r\n gsap.to(mesh.rotation, {\r\n x: toTransform.rotation.x,\r\n y: toTransform.rotation.y,\r\n z: toTransform.rotation.z,\r\n ...query\r\n })\r\n }\r\n\r\n // 缩放动画\r\n if (fromTransform.scale && toTransform.scale) {\r\n mesh.scale.set(fromTransform.scale.x, fromTransform.scale.y, fromTransform.scale.z)\r\n gsap.to(mesh.scale, {\r\n x: toTransform.scale.x,\r\n y: toTransform.scale.y,\r\n z: toTransform.scale.z,\r\n ...query\r\n })\r\n }\r\n }\r\n\r\n // ============ 生命周期 ============\r\n\r\n /**\r\n * 启动\r\n */\r\n start(): void {\r\n this.engine.start()\r\n }\r\n\r\n /**\r\n * 停止\r\n */\r\n stop(): void {\r\n this.engine.stop()\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n dispose(): void {\r\n this.plugins.dispose()\r\n this.engine.dispose()\r\n this.progressList = []\r\n this.mixerList = []\r\n this.shaderList = []\r\n this.commonFrameList = []\r\n }\r\n}\r\n","import * as THREE from 'three'\r\n\r\n/**\r\n * 释放网格资源\r\n * @param mesh 网格\r\n */\r\nexport function disposeMesh(mesh: THREE.Mesh): void {\r\n mesh.geometry?.dispose()\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(disposeMaterial)\r\n } else if (mesh.material) {\r\n disposeMaterial(mesh.material)\r\n }\r\n}\r\n\r\n/**\r\n * 释放材质资源\r\n * @param material 材质\r\n */\r\nexport function disposeMaterial(material: THREE.Material): void {\r\n material.dispose()\r\n\r\n // 释放纹理\r\n const mat = material as any\r\n if (mat.map) mat.map.dispose()\r\n if (mat.lightMap) mat.lightMap.dispose()\r\n if (mat.bumpMap) mat.bumpMap.dispose()\r\n if (mat.normalMap) mat.normalMap.dispose()\r\n if (mat.specularMap) mat.specularMap.dispose()\r\n if (mat.envMap) mat.envMap.dispose()\r\n if (mat.alphaMap) mat.alphaMap.dispose()\r\n if (mat.aoMap) mat.aoMap.dispose()\r\n if (mat.displacementMap) mat.displacementMap.dispose()\r\n if (mat.emissiveMap) mat.emissiveMap.dispose()\r\n if (mat.gradientMap) mat.gradientMap.dispose()\r\n if (mat.metalnessMap) mat.metalnessMap.dispose()\r\n if (mat.roughnessMap) mat.roughnessMap.dispose()\r\n}\r\n\r\n/**\r\n * 释放物体及其子物体的资源\r\n * @param object 物体\r\n */\r\nexport function disposeObject(object: THREE.Object3D): void {\r\n object.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n disposeMesh(child as THREE.Mesh)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 释放场景资源\r\n * @param scene 场景\r\n */\r\nexport function disposeScene(scene: THREE.Scene): void {\r\n scene.traverse((object) => {\r\n if ((object as THREE.Mesh).isMesh) {\r\n disposeMesh(object as THREE.Mesh)\r\n }\r\n })\r\n\r\n // 清空场景\r\n while (scene.children.length > 0) {\r\n scene.remove(scene.children[0])\r\n }\r\n\r\n // 释放背景和环境\r\n if (scene.background instanceof THREE.Texture) {\r\n scene.background.dispose()\r\n }\r\n if (scene.environment) {\r\n scene.environment.dispose()\r\n }\r\n}\r\n"],"names":["EventEmitter","this","listeners","Map","event","callback","has","set","Set","listener","once","get","add","delete","data","toRemove","error","push","size","removeAllListeners","clear","dispose","SceneManager","events","_envBackground","_environmentEnabled","envMapChangeCallbacks","ssrMeshList","scene","THREE","Scene","name","envBackground","value","updateEnvironment","forEach","cb","environmentEnabled","environment","index","indexOf","splice","background","emit","urls","Promise","resolve","reject","CubeTextureLoader","load","texture","objects","object","parent","remove","getObjectByName","id","getObjectById","traverse","getMeshes","meshes","Mesh","lights","Light","children","length","child","geometry","Array","isArray","material","m","map","DEFAULT_CAMERA_CONFIG","fov","near","far","position","x","y","z","CameraManager","container","config","aspect","clientWidth","clientHeight","camera","PerspectiveCamera","updateProjectionMatrix","target","Vector3","lookAt","updateAspect","getWorldDirection","direction","distance","clone","multiplyScalar","getConfig","DEFAULT_RENDERER_CONFIG","pixelRatio","window","devicePixelRatio","antialias","alpha","logarithmicDepthBuffer","preserveDrawingBuffer","powerPreference","toneMapping","NoToneMapping","toneMappingExposure","outputColorSpace","SRGBColorSpace","shadowMapEnabled","shadowMapType","PCFSoftShadowMap","RendererManager","renderer","WebGLRenderer","setSize","setPixelRatio","shadowMap","enabled","type","appendChild","domElement","getPixelRatio","Vector2","getSize","width","height","updateSize","render","quality","toDataURL","exposure","setShadowMapEnabled","setShadowMapType","getInfo","info","resetInfo","reset","forceContextLoss","parentNode","removeChild","DEFAULT_ENGINE_CONFIG","autoResize","fps","autoStart","Engine","animationId","_isRunning","frameCallbacks","fpsInterval","lastFrameTime","resizeHandler","animate","requestAnimationFrame","now","performance","elapsed","delta","clock","getDelta","elapsedTime","getElapsedTime","Clock","sceneManager","cameraManager","rendererManager","setupAutoResize","start","isRunning","resize","addEventListener","stop","cancelAnimationFrame","getScreenshot","getFPS","removeEventListener","dracoPath","ThreeEditor","progressList","commonFrameList","mixerList","shaderList","getDistanceScalePoint","getBestViewTarget","engine","plugins","PluginManager","installCorePlugins","onUpdate","sceneParams","restoreScene","meshListParams","item","setModelFromInfo","rootInfo","group","skyParams","setSky","setGlobalEnvBackground","path","gsap","viewer","orbitPlugin","transformPlugin","composerPlugin","cssPlugin","editorPlugin","loaderPlugin","guiPlugin","controls","transformControls","Composer","CSS2DObject","CSS3DObject","MixerList","ShaderList","CommonFrameList","handler","modelControls","currentInfo","GUI","gui","renderSceneResize","destroySceneRender","saveSceneEditor","use","OrbitControllerPlugin","TransformControllerPlugin","LoaderPlugin","ComposerPlugin","CSSRendererPlugin","EditorPlugin","GizmoPlugin","grid","divisions","colorCenterLine","colorGrid","axes","stats","mode","viewHelper","box3Helper","color","guiConfig","useProxy","GUIPlugin","autoPlace","mixer","mixerRender","shader","ShaderAnimateRender","anim","frameAnimationRender","plugin","params","Error","loaderService","loadModel","originalComplete","complete","model","setSkybox","setEnvironmentMap","then","dom","style","pointerEvents","addCSS2D","addCSS3D","handleClick","getRawSceneEvent","raycaster","Raycaster","mouse","getIntersects","rect","getBoundingClientRect","clientX","left","clientY","top","setFromCamera","intersectObjects","query","to","duration","ease","repeat","yoyo","yoyoEase","animationPlayParams","animations","speed","actionIndexs","startTime","loop","AnimationMixer","actions","filter","_","clip","action","clipAction","LoopRepeat","LoopOnce","time","timeScale","clampWhenFinished","play","update","findIndex","curve","controller","Date","pause","frameCallback","frameEndCallback","includes","destroy","point","getPointAt","meshList","setOutlineObjects","setMode","key","hasOwnProperty","getObjectViews","getSceneCurveList","i","isCurveMesh","curvePath","parameters","mesh","saveCallback","screenshot","refreshGUI","updateDisplay","guiDom","GUIDom","parentElement","gizmoPlugin","setStatsVisible","setAxesVisible","setGridVisible","enableKeyboard","result","applyMatrix4","matrixWorld","isMesh","extMesh","isCloneMaterial","originMaterial","Object","entries","needsUpdate","extObj","meshRevertTransform","origPos","origRot","rotation","origScale","scale","copy","fromTransform","toTransform","gsapParams","disposeMesh","disposeMaterial","mat","lightMap","bumpMap","normalMap","specularMap","envMap","alphaMap","aoMap","displacementMap","emissiveMap","gradientMap","metalnessMap","roughnessMap","Texture"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index'
|