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.js","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","constructor","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","getLights","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","direction","getWorldDirection","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","getSize","Vector2","width","height","updateSize","render","quality","toDataURL","exposure","setShadowMapEnabled","setShadowMapType","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","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","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","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","disposeObject","disposeScene","Texture"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const e = require("../SerializationPlugin-Cxn2UjuS.cjs");
|
|
4
|
+
exports.AnimationPlugin = e.AnimationPlugin, exports.CSSRendererPlugin = e.CSSRendererPlugin, exports.ComposerPlugin = e.ComposerPlugin, exports.DEFAULT_ANIMATION_CONFIG = e.DEFAULT_ANIMATION_CONFIG, exports.DEFAULT_COMPOSER_CONFIG = e.DEFAULT_COMPOSER_CONFIG, exports.DEFAULT_DRAWING_CONFIG = e.DEFAULT_DRAWING_CONFIG, exports.DEFAULT_EDITOR_CONFIG = e.DEFAULT_EDITOR_CONFIG, exports.DEFAULT_GEOMAP_CONFIG = e.DEFAULT_GEOMAP_CONFIG, exports.DEFAULT_GEOMETRY_CONFIG = e.DEFAULT_GEOMETRY_CONFIG, exports.DEFAULT_GUI_CONFIG = e.DEFAULT_GUI_CONFIG, exports.DEFAULT_LOADER_CONFIG = e.DEFAULT_LOADER_CONFIG, exports.DEFAULT_MATERIAL_CONFIG = e.DEFAULT_MATERIAL_CONFIG, exports.DEFAULT_ORBIT_CONFIG = e.DEFAULT_ORBIT_CONFIG, exports.DEFAULT_PARTICLE_CONFIG = e.DEFAULT_PARTICLE_CONFIG, exports.DEFAULT_PHYSICS_CONFIG = e.DEFAULT_PHYSICS_CONFIG, exports.DEFAULT_SHADER_CONFIG = e.DEFAULT_SHADER_CONFIG, exports.DEFAULT_TRANSFORM_CONFIG = e.DEFAULT_TRANSFORM_CONFIG, exports.DrawingPlugin = e.DrawingPlugin, exports.EditorPlugin = e.EditorPlugin, exports.EnvironmentPlugin = e.EnvironmentPlugin, exports.GUIPlugin = e.GUIPlugin, exports.GeoMapPlugin = e.GeoMapPlugin, exports.GeometryPlugin = e.GeometryPlugin, exports.GizmoPlugin = e.GizmoPlugin, exports.LoaderPlugin = e.LoaderPlugin, exports.MaterialPlugin = e.MaterialPlugin, exports.OrbitControllerPlugin = e.OrbitControllerPlugin, exports.ParticlePlugin = e.ParticlePlugin, exports.PhysicsPlugin = e.PhysicsPlugin, exports.Plugin = e.Plugin, exports.PluginManager = e.PluginManager, exports.SerializationPlugin = e.SerializationPlugin, exports.ShaderPlugin = e.ShaderPlugin, exports.TextPlugin = e.TextPlugin, exports.TransformControllerPlugin = e.TransformControllerPlugin, exports.drawModeList = e.drawModeList, exports.geometryList = e.geometryList, exports.lightTypeList = e.lightTypeList, exports.materialList = e.materialList, exports.pointModeList = e.pointModeList;
|
|
5
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index'
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { A, f, C, j, e, l, D, n, g, x, d, h, b, p, r, i, c, k, E, u, w, m, G, t, L, M, O, o, q, P, a, v, S, s, T, F, y, B, z, H } from "../SerializationPlugin-CBr1GY5q.js";
|
|
2
|
+
export {
|
|
3
|
+
A as AnimationPlugin,
|
|
4
|
+
f as CSSRendererPlugin,
|
|
5
|
+
C as ComposerPlugin,
|
|
6
|
+
j as DEFAULT_ANIMATION_CONFIG,
|
|
7
|
+
e as DEFAULT_COMPOSER_CONFIG,
|
|
8
|
+
l as DEFAULT_DRAWING_CONFIG,
|
|
9
|
+
D as DEFAULT_EDITOR_CONFIG,
|
|
10
|
+
n as DEFAULT_GEOMAP_CONFIG,
|
|
11
|
+
g as DEFAULT_GEOMETRY_CONFIG,
|
|
12
|
+
x as DEFAULT_GUI_CONFIG,
|
|
13
|
+
d as DEFAULT_LOADER_CONFIG,
|
|
14
|
+
h as DEFAULT_MATERIAL_CONFIG,
|
|
15
|
+
b as DEFAULT_ORBIT_CONFIG,
|
|
16
|
+
p as DEFAULT_PARTICLE_CONFIG,
|
|
17
|
+
r as DEFAULT_PHYSICS_CONFIG,
|
|
18
|
+
i as DEFAULT_SHADER_CONFIG,
|
|
19
|
+
c as DEFAULT_TRANSFORM_CONFIG,
|
|
20
|
+
k as DrawingPlugin,
|
|
21
|
+
E as EditorPlugin,
|
|
22
|
+
u as EnvironmentPlugin,
|
|
23
|
+
w as GUIPlugin,
|
|
24
|
+
m as GeoMapPlugin,
|
|
25
|
+
G as GeometryPlugin,
|
|
26
|
+
t as GizmoPlugin,
|
|
27
|
+
L as LoaderPlugin,
|
|
28
|
+
M as MaterialPlugin,
|
|
29
|
+
O as OrbitControllerPlugin,
|
|
30
|
+
o as ParticlePlugin,
|
|
31
|
+
q as PhysicsPlugin,
|
|
32
|
+
P as Plugin,
|
|
33
|
+
a as PluginManager,
|
|
34
|
+
v as SerializationPlugin,
|
|
35
|
+
S as ShaderPlugin,
|
|
36
|
+
s as TextPlugin,
|
|
37
|
+
T as TransformControllerPlugin,
|
|
38
|
+
F as drawModeList,
|
|
39
|
+
y as geometryList,
|
|
40
|
+
B as lightTypeList,
|
|
41
|
+
z as materialList,
|
|
42
|
+
H as pointModeList
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "view3d-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "view3d edit",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./plugins": {
|
|
16
|
+
"types": "./dist/plugins/index.d.ts",
|
|
17
|
+
"import": "./dist/plugins/index.js",
|
|
18
|
+
"require": "./dist/plugins/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./plugins/*": {
|
|
21
|
+
"types": "./dist/plugins/*/index.d.ts",
|
|
22
|
+
"import": "./dist/plugins/*/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"sideEffects": false,
|
|
29
|
+
"scripts": {
|
|
30
|
+
"dev": "vite",
|
|
31
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
32
|
+
"build": "tsc && node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && vite build",
|
|
33
|
+
"preview": "vite preview",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"lint": "eslint src --ext .ts",
|
|
36
|
+
"prepublishOnly": "pnpm run build",
|
|
37
|
+
"check-package": "node scripts/check-package.js"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/your-username/threejs-cores.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/your-username/threejs-cores/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/your-username/threejs-cores#readme",
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"three": ">=0.150.0"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"gsap": "^3.12.2"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
55
|
+
"@types/dat.gui": "^0.7.9",
|
|
56
|
+
"@types/node": "^20.19.29",
|
|
57
|
+
"@types/proj4": "^2.5.0",
|
|
58
|
+
"@types/three": "^0.158.0",
|
|
59
|
+
"cannon-es": "^0.20.0",
|
|
60
|
+
"dat.gui": "^0.7.9",
|
|
61
|
+
"proj4": "^2.9.0",
|
|
62
|
+
"terser": "^5.44.1",
|
|
63
|
+
"three": "^0.158.0",
|
|
64
|
+
"typescript": "^5.3.0",
|
|
65
|
+
"vite": "^5.0.6",
|
|
66
|
+
"vite-plugin-dts": "^3.6.0"
|
|
67
|
+
},
|
|
68
|
+
"keywords": [
|
|
69
|
+
"three.js",
|
|
70
|
+
"3d",
|
|
71
|
+
"editor",
|
|
72
|
+
"webgl",
|
|
73
|
+
"typescript"
|
|
74
|
+
],
|
|
75
|
+
"author": "xxx",
|
|
76
|
+
"license": "Apache-2.0",
|
|
77
|
+
"engines": {
|
|
78
|
+
"node": ">=16.0.0"
|
|
79
|
+
}
|
|
80
|
+
}
|