view3d-core 1.0.0 → 1.0.2
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/dist/{SerializationPlugin-CBr1GY5q.js → SerializationPlugin-D418fw5V.js} +443 -436
- package/dist/SerializationPlugin-D418fw5V.js.map +1 -0
- package/dist/{SerializationPlugin-Cxn2UjuS.cjs → SerializationPlugin-DJVOx3pd.cjs} +377 -370
- package/dist/SerializationPlugin-DJVOx3pd.cjs.map +1 -0
- package/dist/index.cjs +108 -107
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +27 -1
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.js +1 -1
- package/package.json +8 -7
- package/dist/SerializationPlugin-CBr1GY5q.js.map +0 -1
- package/dist/SerializationPlugin-Cxn2UjuS.cjs.map +0 -1
- package/dist/plugins/index.d.ts +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerializationPlugin-D418fw5V.js","sources":["../src/plugins/PluginManager.ts","../src/plugins/Plugin.ts","../src/plugins/controls/OrbitController.ts","../src/plugins/controls/TransformController.ts","../src/plugins/loaders/LoaderPlugin.ts","../src/plugins/postprocessing/ComposerPlugin.ts","../src/plugins/renderers/CSSRendererPlugin.ts","../src/utils/raycast.ts","../src/plugins/editor/EditorPlugin.ts","../node_modules/dat.gui/build/dat.gui.module.js","../src/plugins/gui/GUIPlugin.ts","../src/plugins/gizmo/GizmoPlugin.ts","../src/utils/math.ts","../src/utils/box3.ts","../src/plugins/shader/ShaderPlugin.ts","../src/plugins/animation/AnimationPlugin.ts","../src/plugins/drawing/DrawingPlugin.ts","../src/plugins/geomap/GeoMapPlugin.ts","../src/plugins/geometry/GeometryPlugin.ts","../src/plugins/material/MaterialPlugin.ts","../src/plugins/particle/ParticlePlugin.ts","../src/plugins/physics/PhysicsPlugin.ts","../src/plugins/text/TextPlugin.ts","../src/plugins/environment/EnvironmentPlugin.ts","../src/plugins/serialization/SerializationPlugin.ts"],"sourcesContent":["import type { IPlugin, IPluginManager, PluginContext } from '../types/plugin.types'\r\n\r\n/**\r\n * 插件管理器\r\n * 负责插件的注册、获取和生命周期管理\r\n */\r\nexport class PluginManager implements IPluginManager {\r\n /** 已注册的插件 */\r\n private plugins = new Map<string, IPlugin>()\r\n\r\n /** 插件上下文 */\r\n private context: PluginContext\r\n\r\n constructor(context: Omit<PluginContext, 'pluginManager'>) {\r\n // 将 pluginManager 添加到上下文中\r\n this.context = {\r\n ...context,\r\n pluginManager: this\r\n }\r\n }\r\n\r\n /**\r\n * 注册插件\r\n * @param plugin 插件实例\r\n */\r\n use<T extends IPlugin>(plugin: T): this {\r\n const { name } = plugin\r\n\r\n // 检查是否已存在\r\n if (this.plugins.has(name)) {\r\n console.warn(`Plugin \"${name}\" is already registered, skipping...`)\r\n return this\r\n }\r\n\r\n // 检查依赖\r\n if (plugin.dependencies) {\r\n for (const dep of plugin.dependencies) {\r\n if (!this.plugins.has(dep)) {\r\n throw new Error(`Plugin \"${name}\" depends on \"${dep}\", but it's not installed`)\r\n }\r\n }\r\n }\r\n\r\n // 安装插件\r\n const result = plugin.install(this.context)\r\n\r\n // 处理异步安装\r\n if (result instanceof Promise) {\r\n result.then(() => {\r\n this.plugins.set(name, plugin)\r\n this.context.events.emit('plugin:installed', { name })\r\n }).catch((error) => {\r\n console.error(`Failed to install plugin \"${name}\":`, error)\r\n })\r\n } else {\r\n this.plugins.set(name, plugin)\r\n this.context.events.emit('plugin:installed', { name })\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * 批量注册插件\r\n * @param plugins 插件实例数组\r\n */\r\n useAll(plugins: IPlugin[]): this {\r\n for (const plugin of plugins) {\r\n this.use(plugin)\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * 获取插件\r\n * @param name 插件名称\r\n */\r\n get<T extends IPlugin>(name: string): T | undefined {\r\n return this.plugins.get(name) as T | undefined\r\n }\r\n\r\n /**\r\n * 移除插件\r\n * @param name 插件名称\r\n */\r\n remove(name: string): boolean {\r\n const plugin = this.plugins.get(name)\r\n if (!plugin) {\r\n return false\r\n }\r\n\r\n // 检查是否有其他插件依赖此插件\r\n for (const [otherName, otherPlugin] of this.plugins) {\r\n if (otherPlugin.dependencies?.includes(name)) {\r\n console.warn(`Cannot remove plugin \"${name}\" because \"${otherName}\" depends on it`)\r\n return false\r\n }\r\n }\r\n\r\n // 卸载插件\r\n const result = plugin.uninstall()\r\n\r\n // 处理异步卸载\r\n if (result instanceof Promise) {\r\n result.then(() => {\r\n this.plugins.delete(name)\r\n this.context.events.emit('plugin:uninstalled', { name })\r\n }).catch((error) => {\r\n console.error(`Failed to uninstall plugin \"${name}\":`, error)\r\n })\r\n } else {\r\n this.plugins.delete(name)\r\n this.context.events.emit('plugin:uninstalled', { name })\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 检查插件是否存在\r\n * @param name 插件名称\r\n */\r\n has(name: string): boolean {\r\n return this.plugins.has(name)\r\n }\r\n\r\n /**\r\n * 获取所有插件\r\n */\r\n getAll(): IPlugin[] {\r\n return Array.from(this.plugins.values())\r\n }\r\n\r\n /**\r\n * 获取所有插件名称\r\n */\r\n getNames(): string[] {\r\n return Array.from(this.plugins.keys())\r\n }\r\n\r\n /**\r\n * 销毁所有插件\r\n */\r\n dispose(): void {\r\n // 按照注册的逆序卸载插件\r\n const names = Array.from(this.plugins.keys()).reverse()\r\n for (const name of names) {\r\n this.remove(name)\r\n }\r\n }\r\n}\r\n","import type * as THREE from 'three'\r\nimport type { IPlugin, PluginContext, PluginLifecycleHooks } from '../types/plugin.types'\r\n\r\n/**\r\n * 插件基类\r\n * 所有插件都应该继承此类\r\n */\r\nexport abstract class Plugin<TConfig = any> implements IPlugin<TConfig>, PluginLifecycleHooks {\r\n /** 插件名称(唯一标识) */\r\n abstract readonly name: string\r\n\r\n /** 插件版本 */\r\n readonly version?: string\r\n\r\n /** 插件依赖 */\r\n readonly dependencies?: string[]\r\n\r\n /** 插件配置 */\r\n config: TConfig\r\n\r\n /** 插件上下文 */\r\n protected context!: PluginContext\r\n\r\n /** 是否已安装 */\r\n private _installed = false\r\n\r\n /** 取消订阅函数列表 */\r\n protected unsubscribers: Array<() => void> = []\r\n\r\n constructor(config?: Partial<TConfig>) {\r\n this.config = (config ?? {}) as TConfig\r\n }\r\n\r\n /**\r\n * 安装插件\r\n */\r\n install(context: PluginContext): void | Promise<void> {\r\n if (this._installed) {\r\n console.warn(`Plugin \"${this.name}\" is already installed`)\r\n return\r\n }\r\n\r\n this.context = context\r\n this._installed = true\r\n\r\n // 注册生命周期钩子\r\n this.registerLifecycleHooks()\r\n\r\n // 调用子类的初始化方法\r\n this.onInstall?.()\r\n }\r\n\r\n /**\r\n * 卸载插件\r\n */\r\n uninstall(): void | Promise<void> {\r\n if (!this._installed) {\r\n console.warn(`Plugin \"${this.name}\" is not installed`)\r\n return\r\n }\r\n\r\n // 调用子类的销毁方法\r\n this.onUninstall?.()\r\n\r\n // 取消所有订阅\r\n for (const unsubscribe of this.unsubscribers) {\r\n unsubscribe()\r\n }\r\n this.unsubscribers = []\r\n\r\n this._installed = false\r\n }\r\n\r\n /**\r\n * 是否已安装\r\n */\r\n isInstalled(): boolean {\r\n return this._installed\r\n }\r\n\r\n /**\r\n * 注册生命周期钩子\r\n */\r\n private registerLifecycleHooks(): void {\r\n const { events } = this.context\r\n\r\n // 场景就绪\r\n if (typeof (this as any).onSceneReady === 'function') {\r\n const unsubscribe = events.on('scene:ready', ({ scene }) => {\r\n this.onSceneReady!(scene)\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // 每帧更新 - 检查原型链上是否有 onUpdate 方法\r\n const hasOnUpdate = typeof (this as any).onUpdate === 'function' && \r\n (this as any).onUpdate !== Plugin.prototype.onUpdate\r\n if (hasOnUpdate) {\r\n const unsubscribe = events.on('render:before', ({ delta, elapsed }) => {\r\n this.onUpdate!(delta, elapsed)\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // 窗口大小改变\r\n if (typeof (this as any).onResize === 'function') {\r\n const unsubscribe = events.on('resize', ({ width, height }) => {\r\n this.onResize!(width, height)\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // 销毁前\r\n if (typeof (this as any).onBeforeDispose === 'function') {\r\n const unsubscribe = events.on('engine:dispose', () => {\r\n this.onBeforeDispose!()\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n }\r\n\r\n /**\r\n * 便捷方法:获取引擎\r\n */\r\n protected get engine() {\r\n return this.context.engine\r\n }\r\n\r\n /**\r\n * 便捷方法:获取场景\r\n */\r\n protected get scene(): THREE.Scene {\r\n return this.context.engine.scene\r\n }\r\n\r\n /**\r\n * 便捷方法:获取相机\r\n */\r\n protected get camera(): THREE.PerspectiveCamera {\r\n return this.context.engine.camera\r\n }\r\n\r\n /**\r\n * 便捷方法:获取渲染器\r\n */\r\n protected get renderer(): THREE.WebGLRenderer {\r\n return this.context.engine.renderer\r\n }\r\n\r\n /**\r\n * 便捷方法:获取事件发射器\r\n */\r\n protected get events() {\r\n return this.context.events\r\n }\r\n\r\n /**\r\n * 便捷方法:获取插件管理器\r\n */\r\n protected get pluginManager() {\r\n return this.context.pluginManager\r\n }\r\n\r\n /**\r\n * 便捷方法:订阅事件(自动管理取消订阅)\r\n */\r\n protected subscribe<K extends keyof import('../types/event.types').EventMap>(\r\n event: K,\r\n callback: (data: import('../types/event.types').EventMap[K]) => void\r\n ): void {\r\n const unsubscribe = this.events.on(event, callback)\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // ============ 可选的生命周期钩子 ============\r\n\r\n /** 安装时调用 */\r\n protected onInstall?(): void\r\n\r\n /** 卸载时调用 */\r\n protected onUninstall?(): void\r\n\r\n /** 场景准备完成 */\r\n onSceneReady?(scene: THREE.Scene): void\r\n\r\n /** 每帧更新 */\r\n onUpdate?(delta: number, elapsed: number): void\r\n\r\n /** 窗口大小改变 */\r\n onResize?(width: number, height: number): void\r\n\r\n /** 销毁前 */\r\n onBeforeDispose?(): void\r\n}\r\n","import * as THREE from 'three'\r\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { OrbitControllerConfig } from '../../types/config.types'\r\nimport type { ViewAngle } from '../../types/core.types'\r\n\r\n/**\r\n * 默认轨道控制器配置\r\n */\r\nexport const DEFAULT_ORBIT_CONFIG: OrbitControllerConfig = {\r\n enableDamping: true,\r\n dampingFactor: 0.05,\r\n minDistance: 1,\r\n maxDistance: 5000,\r\n minZoom: 1000,\r\n maxPolarAngle: Math.PI,\r\n enablePan: true,\r\n enableZoom: true,\r\n enableRotate: true\r\n}\r\n\r\n/**\r\n * 轨道控制器插件\r\n * 提供相机轨道控制功能\r\n */\r\nexport class OrbitControllerPlugin extends Plugin<OrbitControllerConfig> {\r\n readonly name = 'orbit-controller'\r\n\r\n /** OrbitControls 实例 */\r\n private _controls!: OrbitControls\r\n\r\n /** 视角列表 */\r\n private viewAngleList: ViewAngle[] = []\r\n\r\n constructor(config?: Partial<OrbitControllerConfig>) {\r\n super({ ...DEFAULT_ORBIT_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取控制器实例\r\n */\r\n get controls(): OrbitControls {\r\n return this._controls\r\n }\r\n\r\n /**\r\n * 获取目标点\r\n */\r\n get target(): THREE.Vector3 {\r\n return this._controls.target\r\n }\r\n\r\n protected onInstall(): void {\r\n const { camera, renderer } = this.engine\r\n\r\n this._controls = new OrbitControls(camera, renderer.domElement)\r\n\r\n // 应用配置\r\n this.applyConfig(this.config)\r\n\r\n // 注册每帧更新 - 确保 damping 效果正常工作\r\n this.subscribe('render:before', () => {\r\n this._controls.update()\r\n })\r\n\r\n // 监听控制器事件\r\n this._controls.addEventListener('start', () => {\r\n this.events.emit('controls:start', undefined)\r\n })\r\n\r\n this._controls.addEventListener('end', () => {\r\n this.events.emit('controls:end', undefined)\r\n })\r\n\r\n this._controls.addEventListener('change', () => {\r\n this.events.emit('controls:change', undefined)\r\n })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this._controls.dispose()\r\n }\r\n\r\n /**\r\n * 应用配置\r\n */\r\n applyConfig(config: Partial<OrbitControllerConfig>): void {\r\n if (config.enableDamping !== undefined) {\r\n this._controls.enableDamping = config.enableDamping\r\n }\r\n if (config.dampingFactor !== undefined) {\r\n this._controls.dampingFactor = config.dampingFactor\r\n }\r\n if (config.minDistance !== undefined) {\r\n this._controls.minDistance = config.minDistance\r\n }\r\n if (config.maxDistance !== undefined) {\r\n this._controls.maxDistance = config.maxDistance\r\n }\r\n if (config.maxPolarAngle !== undefined) {\r\n this._controls.maxPolarAngle = config.maxPolarAngle\r\n }\r\n if (config.enablePan !== undefined) {\r\n this._controls.enablePan = config.enablePan\r\n }\r\n if (config.enableZoom !== undefined) {\r\n this._controls.enableZoom = config.enableZoom\r\n }\r\n if (config.enableRotate !== undefined) {\r\n this._controls.enableRotate = config.enableRotate\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): OrbitControllerConfig {\r\n return {\r\n enableDamping: this._controls.enableDamping,\r\n dampingFactor: this._controls.dampingFactor,\r\n minDistance: this._controls.minDistance,\r\n maxDistance: this._controls.maxDistance,\r\n minZoom: this._controls.minZoom,\r\n maxPolarAngle: this._controls.maxPolarAngle,\r\n enablePan: this._controls.enablePan,\r\n enableZoom: this._controls.enableZoom,\r\n enableRotate: this._controls.enableRotate\r\n }\r\n }\r\n\r\n /**\r\n * 设置目标点\r\n */\r\n setTarget(x: number, y: number, z: number): void {\r\n this._controls.target.set(x, y, z)\r\n this._controls.update()\r\n }\r\n\r\n /**\r\n * 启用/禁用控制器\r\n */\r\n setEnabled(enabled: boolean): void {\r\n this._controls.enabled = enabled\r\n }\r\n\r\n /**\r\n * 保存当前视角\r\n */\r\n saveViewAngle(name?: string): ViewAngle {\r\n const viewAngle: ViewAngle = {\r\n position: this.camera.position.clone(),\r\n target: this._controls.target.clone()\r\n }\r\n this.viewAngleList.push(viewAngle)\r\n return viewAngle\r\n }\r\n\r\n /**\r\n * 获取视角列表\r\n */\r\n getViewAngleList(): ViewAngle[] {\r\n return this.viewAngleList\r\n }\r\n\r\n /**\r\n * 清空视角列表\r\n */\r\n clearViewAngleList(): void {\r\n this.viewAngleList = []\r\n }\r\n\r\n /**\r\n * 重置控制器\r\n */\r\n reset(): void {\r\n this._controls.reset()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { TransformControllerConfig } from '../../types/config.types'\r\nimport type { OrbitControllerPlugin } from './OrbitController'\r\n\r\n/**\r\n * 默认变换控制器配置\r\n */\r\nexport const DEFAULT_TRANSFORM_CONFIG: TransformControllerConfig = {\r\n mode: 'translate',\r\n space: 'world',\r\n showX: true,\r\n showY: true,\r\n showZ: true,\r\n translationSnap: null,\r\n rotationSnap: null,\r\n scaleSnap: null\r\n}\r\n\r\n/**\r\n * 变换控制器插件\r\n * 提供物体变换(移动、旋转、缩放)功能\r\n */\r\nexport class TransformControllerPlugin extends Plugin<TransformControllerConfig> {\r\n readonly name = 'transform-controller'\r\n readonly dependencies = ['orbit-controller']\r\n\r\n /** TransformControls 实例 */\r\n private _controls!: TransformControls\r\n\r\n /** 包围盒辅助器 */\r\n private box3Helper: THREE.Box3Helper | null = null\r\n\r\n /** 拖拽变化回调 */\r\n dragChangeCallback?: (isDragging: boolean) => void\r\n\r\n constructor(config?: Partial<TransformControllerConfig>) {\r\n super({ ...DEFAULT_TRANSFORM_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取控制器实例\r\n */\r\n get controls(): TransformControls {\r\n return this._controls\r\n }\r\n\r\n /**\r\n * 获取当前附加的物体\r\n */\r\n get object(): THREE.Object3D | undefined {\r\n return this._controls.object\r\n }\r\n\r\n protected onInstall(): void {\r\n const { camera, renderer, scene } = this.engine\r\n\r\n this._controls = new TransformControls(camera, renderer.domElement)\r\n this._controls.name = 'TransformControls'\r\n\r\n // 标记所有子物体,用于射线检测过滤\r\n this._controls.traverse((child) => {\r\n (child as any).isTransformControls = true\r\n })\r\n\r\n scene.add(this._controls)\r\n\r\n // 创建包围盒辅助器\r\n this.box3Helper = new THREE.Box3Helper(new THREE.Box3(), 0xffff00)\r\n this.box3Helper.name = 'Box3Helper'\r\n this.box3Helper.visible = false\r\n scene.add(this.box3Helper)\r\n\r\n // 应用配置\r\n this.applyConfig(this.config)\r\n\r\n // 监听拖拽事件\r\n this._controls.addEventListener('dragging-changed', (event: any) => {\r\n // 获取轨道控制器并禁用/启用\r\n const orbitController = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n if (orbitController) {\r\n orbitController.controls.enabled = !event.value\r\n }\r\n\r\n // 触发回调\r\n this.dragChangeCallback?.(event.value)\r\n\r\n // 发射事件\r\n if (event.value) {\r\n this.events.emit('object:transform:start', { object: this._controls.object! })\r\n } else {\r\n this.events.emit('object:transform:end', { object: this._controls.object! })\r\n }\r\n })\r\n\r\n // 监听变换事件\r\n this._controls.addEventListener('change', () => {\r\n if (this._controls.object) {\r\n this.events.emit('object:transform:change', { object: this._controls.object })\r\n\r\n // 更新包围盒\r\n if (this.box3Helper && this._controls.object) {\r\n const box = new THREE.Box3().setFromObject(this._controls.object)\r\n this.box3Helper.box = box\r\n this.box3Helper.visible = true\r\n }\r\n }\r\n })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.detach()\r\n this.scene.remove(this._controls)\r\n this._controls.dispose()\r\n\r\n if (this.box3Helper) {\r\n this.scene.remove(this.box3Helper)\r\n this.box3Helper = null\r\n }\r\n }\r\n\r\n /**\r\n * 应用配置\r\n */\r\n applyConfig(config: Partial<TransformControllerConfig>): void {\r\n if (config.mode !== undefined) {\r\n this._controls.setMode(config.mode)\r\n }\r\n if (config.space !== undefined) {\r\n this._controls.setSpace(config.space)\r\n }\r\n if (config.showX !== undefined) {\r\n this._controls.showX = config.showX\r\n }\r\n if (config.showY !== undefined) {\r\n this._controls.showY = config.showY\r\n }\r\n if (config.showZ !== undefined) {\r\n this._controls.showZ = config.showZ\r\n }\r\n if (config.translationSnap !== undefined) {\r\n this._controls.setTranslationSnap(config.translationSnap)\r\n }\r\n if (config.rotationSnap !== undefined) {\r\n this._controls.setRotationSnap(config.rotationSnap)\r\n }\r\n if (config.scaleSnap !== undefined) {\r\n this._controls.setScaleSnap(config.scaleSnap)\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): TransformControllerConfig {\r\n return {\r\n mode: this._controls.mode as 'translate' | 'rotate' | 'scale',\r\n space: this._controls.space as 'world' | 'local',\r\n showX: this._controls.showX,\r\n showY: this._controls.showY,\r\n showZ: this._controls.showZ,\r\n translationSnap: this._controls.translationSnap,\r\n rotationSnap: this._controls.rotationSnap,\r\n scaleSnap: (this._controls as any).scaleSnap ?? null\r\n }\r\n }\r\n\r\n /**\r\n * 附加到物体\r\n */\r\n attach(object: THREE.Object3D): void {\r\n this._controls.attach(object)\r\n }\r\n\r\n /**\r\n * 分离物体\r\n */\r\n detach(): void {\r\n this._controls.detach()\r\n if (this.box3Helper) {\r\n this.box3Helper.visible = false\r\n }\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: 'translate' | 'rotate' | 'scale'): void {\r\n this._controls.setMode(mode)\r\n }\r\n\r\n /**\r\n * 设置空间\r\n */\r\n setSpace(space: 'world' | 'local'): void {\r\n this._controls.setSpace(space)\r\n }\r\n\r\n /**\r\n * 设置大小\r\n */\r\n setSize(size: number): void {\r\n this._controls.setSize(size)\r\n }\r\n\r\n /**\r\n * 启用/禁用控制器\r\n */\r\n setEnabled(enabled: boolean): void {\r\n this._controls.enabled = enabled\r\n }\r\n\r\n /**\r\n * 显示/隐藏包围盒\r\n */\r\n showBox3Helper(visible: boolean): void {\r\n if (this.box3Helper) {\r\n this.box3Helper.visible = visible\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'\r\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'\r\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js'\r\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js'\r\nimport { FontLoader, Font } from 'three/examples/jsm/loaders/FontLoader.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { LoaderConfig } from '../../types/config.types'\r\nimport type { LoaderService, ModelType, RootInfo } from '../../types/core.types'\r\n\r\n/**\r\n * 默认加载器配置\r\n */\r\nexport const DEFAULT_LOADER_CONFIG: LoaderConfig = {\r\n dracoPath: '/draco/',\r\n useDraco: true\r\n}\r\n\r\n/**\r\n * 加载器插件\r\n * 提供模型、纹理、字体等资源的加载功能\r\n */\r\nexport class LoaderPlugin extends Plugin<LoaderConfig> {\r\n readonly name = 'loader'\r\n\r\n /** GLTF 加载器 */\r\n private gltfLoader!: GLTFLoader\r\n\r\n /** Draco 加载器 */\r\n private dracoLoader!: DRACOLoader\r\n\r\n /** FBX 加载器 */\r\n private fbxLoader!: FBXLoader\r\n\r\n /** OBJ 加载器 */\r\n private objLoader!: OBJLoader\r\n\r\n /** MTL 加载器 */\r\n private mtlLoader!: MTLLoader\r\n\r\n /** 纹理加载器 */\r\n private textureLoader!: THREE.TextureLoader\r\n\r\n /** 立方体纹理加载器 */\r\n private cubeTextureLoader!: THREE.CubeTextureLoader\r\n\r\n /** 字体加载器 */\r\n private fontLoader!: FontLoader\r\n\r\n /** 字体缓存 */\r\n private fontCache = new Map<string, Font>()\r\n\r\n constructor(config?: Partial<LoaderConfig>) {\r\n super({ ...DEFAULT_LOADER_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 初始化 Draco 加载器\r\n this.dracoLoader = new DRACOLoader()\r\n this.dracoLoader.setDecoderPath(this.config.dracoPath)\r\n\r\n // 初始化 GLTF 加载器\r\n this.gltfLoader = new GLTFLoader()\r\n if (this.config.useDraco) {\r\n this.gltfLoader.setDRACOLoader(this.dracoLoader)\r\n }\r\n\r\n // 初始化其他加载器\r\n this.fbxLoader = new FBXLoader()\r\n this.objLoader = new OBJLoader()\r\n this.mtlLoader = new MTLLoader()\r\n this.textureLoader = new THREE.TextureLoader()\r\n this.cubeTextureLoader = new THREE.CubeTextureLoader()\r\n this.fontLoader = new FontLoader()\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.dracoLoader.dispose()\r\n this.fontCache.clear()\r\n }\r\n\r\n /**\r\n * 设置 Draco 解码器路径\r\n */\r\n setDracoPath(path: string): void {\r\n this.config.dracoPath = path\r\n this.dracoLoader.setDecoderPath(path)\r\n }\r\n\r\n /**\r\n * 根据类型加载模型\r\n */\r\n loadModel(rootInfo: RootInfo): LoaderService<THREE.Object3D> {\r\n const { type, url } = rootInfo\r\n\r\n switch (type) {\r\n case 'GLTF':\r\n return this.loadGLTF(url)\r\n case 'FBX':\r\n return this.loadFBX(url)\r\n case 'OBJ':\r\n return this.loadOBJ(url)\r\n default:\r\n throw new Error(`Unsupported model type: ${type}`)\r\n }\r\n }\r\n\r\n /**\r\n * 加载 GLTF/GLB 模型\r\n */\r\n loadGLTF(url: string): LoaderService<THREE.Object3D> {\r\n const service: LoaderService<THREE.Object3D> = {\r\n progress: () => {},\r\n complete: () => {}\r\n }\r\n\r\n this.events.emit('load:start', { url, type: 'GLTF' })\r\n\r\n this.gltfLoader.load(\r\n url,\r\n (gltf) => {\r\n const model = gltf.scene\r\n model.animations = gltf.animations\r\n service.complete(model)\r\n this.events.emit('load:complete', { url, object: model })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n this.events.emit('load:progress', {\r\n url,\r\n loaded: xhr.loaded,\r\n total: xhr.total,\r\n percent\r\n })\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n\r\n return service\r\n }\r\n\r\n /**\r\n * 加载 FBX 模型\r\n */\r\n loadFBX(url: string): LoaderService<THREE.Object3D> {\r\n const service: LoaderService<THREE.Object3D> = {\r\n progress: () => {},\r\n complete: () => {}\r\n }\r\n\r\n this.events.emit('load:start', { url, type: 'FBX' })\r\n\r\n this.fbxLoader.load(\r\n url,\r\n (object) => {\r\n // 处理材质\r\n object.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((m) => {\r\n m.side = THREE.DoubleSide\r\n })\r\n } else if (mesh.material) {\r\n mesh.material.side = THREE.DoubleSide\r\n }\r\n }\r\n })\r\n\r\n service.complete(object)\r\n this.events.emit('load:complete', { url, object })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n this.events.emit('load:progress', {\r\n url,\r\n loaded: xhr.loaded,\r\n total: xhr.total,\r\n percent\r\n })\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n\r\n return service\r\n }\r\n\r\n /**\r\n * 加载 OBJ 模型(带 MTL)\r\n */\r\n loadOBJ(url: string): LoaderService<THREE.Object3D> {\r\n const service: LoaderService<THREE.Object3D> = {\r\n progress: () => {},\r\n complete: () => {}\r\n }\r\n\r\n this.events.emit('load:start', { url, type: 'OBJ' })\r\n\r\n const mtlUrl = url.replace('.obj', '.mtl')\r\n\r\n this.mtlLoader.load(\r\n mtlUrl,\r\n (materials) => {\r\n materials.preload()\r\n this.objLoader.setMaterials(materials)\r\n\r\n this.objLoader.load(\r\n url,\r\n (object) => {\r\n service.complete(object)\r\n this.events.emit('load:complete', { url, object })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n this.events.emit('load:progress', {\r\n url,\r\n loaded: xhr.loaded,\r\n total: xhr.total,\r\n percent\r\n })\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n },\r\n undefined,\r\n () => {\r\n // MTL 加载失败,尝试只加载 OBJ\r\n this.objLoader.load(\r\n url,\r\n (object) => {\r\n service.complete(object)\r\n this.events.emit('load:complete', { url, object })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n }\r\n )\r\n\r\n return service\r\n }\r\n\r\n /**\r\n * 加载纹理\r\n */\r\n loadTexture(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(url, resolve, undefined, reject)\r\n })\r\n }\r\n\r\n /**\r\n * 加载立方体纹理\r\n */\r\n loadCubeTexture(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(urls, resolve, undefined, reject)\r\n })\r\n }\r\n\r\n /**\r\n * 加载字体\r\n */\r\n loadFont(url: string): Promise<Font> {\r\n // 检查缓存\r\n const cached = this.fontCache.get(url)\r\n if (cached) {\r\n return Promise.resolve(cached)\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.fontLoader.load(\r\n url,\r\n (font) => {\r\n this.fontCache.set(url, font)\r\n resolve(font)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 创建视频纹理\r\n */\r\n createVideoTexture(url: string): THREE.VideoTexture {\r\n const video = document.createElement('video')\r\n video.crossOrigin = 'anonymous'\r\n video.src = url\r\n video.muted = true\r\n video.loop = true\r\n video.play()\r\n\r\n return new THREE.VideoTexture(video)\r\n }\r\n\r\n /**\r\n * 获取模型的所有材质\r\n */\r\n getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'\r\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js'\r\nimport { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js'\r\nimport { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js'\r\nimport { SAOPass } from 'three/examples/jsm/postprocessing/SAOPass.js'\r\nimport { SSRPass } from 'three/examples/jsm/postprocessing/SSRPass.js'\r\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'\r\nimport { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js'\r\nimport { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ComposerConfig, OutlinePassConfig, BloomPassConfig, SSAOPassConfig, SSRPassConfig } from '../../types/config.types'\r\nimport type { RenderWay } from '../../types/core.types'\r\n\r\n/**\r\n * 默认后期处理配置\r\n */\r\nexport const DEFAULT_COMPOSER_CONFIG: ComposerConfig = {\r\n enabled: true,\r\n outline: {\r\n enabled: true,\r\n edgeStrength: 4,\r\n edgeGlow: 0,\r\n edgeThickness: 2,\r\n pulsePeriod: 0,\r\n visibleEdgeColor: 0xfafe2f,\r\n hiddenEdgeColor: 0xfafe2f\r\n },\r\n bloom: {\r\n enabled: false,\r\n strength: 1.5,\r\n radius: 0.4,\r\n threshold: 0.85\r\n },\r\n ssao: {\r\n enabled: false,\r\n intensity: 0.01,\r\n scale: 100\r\n },\r\n ssr: {\r\n enabled: false,\r\n thickness: 0.018,\r\n infiniteThick: false,\r\n maxDistance: 0.01,\r\n opacity: 0.5\r\n },\r\n screenMask: {\r\n enabled: false\r\n }\r\n}\r\n\r\n/**\r\n * 后期处理插件\r\n * 提供各种后期处理效果\r\n */\r\nexport class ComposerPlugin extends Plugin<ComposerConfig> {\r\n readonly name = 'composer'\r\n\r\n /** EffectComposer 实例 */\r\n private _composer!: EffectComposer\r\n\r\n /** 渲染通道 */\r\n private renderPass!: RenderPass\r\n\r\n /** 轮廓光通道 */\r\n private _outlinePass!: OutlinePass\r\n\r\n /** 泛光通道 */\r\n private _bloomPass!: UnrealBloomPass\r\n\r\n /** SSAO 通道 */\r\n private _saoPass!: SAOPass\r\n\r\n /** SSR 通道 */\r\n private _ssrPass!: SSRPass\r\n\r\n /** FXAA 通道 */\r\n private _fxaaPass!: ShaderPass\r\n\r\n /** 输出通道 */\r\n private outputPass!: OutputPass\r\n\r\n /** 渲染方式 */\r\n private _renderWay: RenderWay = '效果渲染'\r\n\r\n /** SSR 网格列表 */\r\n private ssrMeshList: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<ComposerConfig>) {\r\n super({ ...DEFAULT_COMPOSER_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取 Composer 实例\r\n */\r\n get composer(): EffectComposer {\r\n return this._composer\r\n }\r\n\r\n /**\r\n * 获取轮廓光通道\r\n */\r\n get outlinePass(): OutlinePass {\r\n return this._outlinePass\r\n }\r\n\r\n /**\r\n * 获取泛光通道\r\n */\r\n get bloomPass(): UnrealBloomPass {\r\n return this._bloomPass\r\n }\r\n\r\n /**\r\n * 获取 SSAO 通道\r\n */\r\n get saoPass(): SAOPass {\r\n return this._saoPass\r\n }\r\n\r\n /**\r\n * 获取 SSR 通道\r\n */\r\n get ssrPass(): SSRPass {\r\n return this._ssrPass\r\n }\r\n\r\n /**\r\n * 获取渲染方式\r\n */\r\n get renderWay(): RenderWay {\r\n return this._renderWay\r\n }\r\n\r\n protected onInstall(): void {\r\n const { scene, camera, renderer } = this.engine\r\n const container = renderer.domElement.parentElement!\r\n const width = container.clientWidth\r\n const height = container.clientHeight\r\n const pixelRatio = renderer.getPixelRatio()\r\n\r\n // 创建 EffectComposer\r\n this._composer = new EffectComposer(renderer)\r\n this._composer.setSize(width, height)\r\n this._composer.setPixelRatio(pixelRatio)\r\n\r\n // 渲染通道\r\n this.renderPass = new RenderPass(scene, camera)\r\n this._composer.addPass(this.renderPass)\r\n\r\n // SSAO 通道\r\n this._saoPass = new SAOPass(scene, camera)\r\n this._saoPass.enabled = this.config.ssao?.enabled ?? false\r\n if (this.config.ssao) {\r\n this._saoPass.params.saoIntensity = this.config.ssao.intensity\r\n this._saoPass.params.saoScale = this.config.ssao.scale\r\n }\r\n this._composer.addPass(this._saoPass)\r\n\r\n // 泛光通道\r\n this._bloomPass = new UnrealBloomPass(\r\n new THREE.Vector2(width, height),\r\n this.config.bloom?.strength ?? 1.5,\r\n this.config.bloom?.radius ?? 0.4,\r\n this.config.bloom?.threshold ?? 0.85\r\n )\r\n this._bloomPass.enabled = this.config.bloom?.enabled ?? false\r\n this._composer.addPass(this._bloomPass)\r\n\r\n // SSR 通道\r\n this._ssrPass = new SSRPass({\r\n renderer,\r\n scene,\r\n camera,\r\n width,\r\n height,\r\n selects: this.ssrMeshList,\r\n groundReflector: null\r\n } as any)\r\n this._ssrPass.enabled = this.config.ssr?.enabled ?? false\r\n if (this.config.ssr) {\r\n this._ssrPass.thickness = this.config.ssr.thickness\r\n this._ssrPass.infiniteThick = this.config.ssr.infiniteThick\r\n this._ssrPass.maxDistance = this.config.ssr.maxDistance\r\n this._ssrPass.opacity = this.config.ssr.opacity\r\n }\r\n this._composer.addPass(this._ssrPass)\r\n\r\n // 轮廓光通道\r\n this._outlinePass = new OutlinePass(\r\n new THREE.Vector2(width, height),\r\n scene,\r\n camera\r\n )\r\n this._outlinePass.renderToScreen = true\r\n if (this.config.outline) {\r\n this._outlinePass.edgeStrength = this.config.outline.edgeStrength\r\n this._outlinePass.edgeGlow = this.config.outline.edgeGlow\r\n this._outlinePass.edgeThickness = this.config.outline.edgeThickness\r\n this._outlinePass.pulsePeriod = this.config.outline.pulsePeriod\r\n this._outlinePass.visibleEdgeColor.set(this.config.outline.visibleEdgeColor)\r\n this._outlinePass.hiddenEdgeColor.set(this.config.outline.hiddenEdgeColor)\r\n }\r\n this._outlinePass.overlayMaterial.blending = THREE.CustomBlending\r\n this._outlinePass.overlayMaterial.blendSrc = THREE.OneFactor\r\n this._composer.addPass(this._outlinePass)\r\n\r\n // 输出通道\r\n this.outputPass = new OutputPass()\r\n this._composer.addPass(this.outputPass)\r\n\r\n // FXAA 通道\r\n this._fxaaPass = new ShaderPass(FXAAShader)\r\n this._fxaaPass.material.uniforms['resolution'].value.x = 1 / (width * pixelRatio)\r\n this._fxaaPass.material.uniforms['resolution'].value.y = 1 / (height * pixelRatio)\r\n this._composer.addPass(this._fxaaPass)\r\n }\r\n\r\n protected onUninstall(): void {\r\n this._composer.dispose()\r\n }\r\n\r\n onResize(width: number, height: number): void {\r\n const pixelRatio = this.renderer.getPixelRatio()\r\n\r\n this._composer.setSize(width, height)\r\n this._bloomPass.setSize(width, height)\r\n\r\n this._fxaaPass.material.uniforms['resolution'].value.x = 1 / (width * pixelRatio)\r\n this._fxaaPass.material.uniforms['resolution'].value.y = 1 / (height * pixelRatio)\r\n }\r\n\r\n /**\r\n * 渲染\r\n */\r\n render(): void {\r\n if (this._renderWay === '效果渲染') {\r\n this._composer.render()\r\n } else {\r\n this.renderer.render(this.scene, this.camera)\r\n }\r\n }\r\n\r\n /**\r\n * 设置渲染方式\r\n */\r\n setRenderWay(way: RenderWay): void {\r\n this._renderWay = way\r\n }\r\n\r\n /**\r\n * 设置轮廓光选中物体\r\n */\r\n setOutlineObjects(objects: THREE.Object3D[]): void {\r\n this._outlinePass.selectedObjects = objects\r\n }\r\n\r\n /**\r\n * 清除轮廓光选中\r\n */\r\n clearOutlineObjects(): void {\r\n this._outlinePass.selectedObjects = []\r\n }\r\n\r\n /**\r\n * 配置轮廓光\r\n */\r\n configureOutline(config: Partial<OutlinePassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._outlinePass.enabled = config.enabled\r\n }\r\n if (config.edgeStrength !== undefined) {\r\n this._outlinePass.edgeStrength = config.edgeStrength\r\n }\r\n if (config.edgeGlow !== undefined) {\r\n this._outlinePass.edgeGlow = config.edgeGlow\r\n }\r\n if (config.edgeThickness !== undefined) {\r\n this._outlinePass.edgeThickness = config.edgeThickness\r\n }\r\n if (config.pulsePeriod !== undefined) {\r\n this._outlinePass.pulsePeriod = config.pulsePeriod\r\n }\r\n if (config.visibleEdgeColor !== undefined) {\r\n this._outlinePass.visibleEdgeColor.set(config.visibleEdgeColor)\r\n }\r\n if (config.hiddenEdgeColor !== undefined) {\r\n this._outlinePass.hiddenEdgeColor.set(config.hiddenEdgeColor)\r\n }\r\n }\r\n\r\n /**\r\n * 配置泛光\r\n */\r\n configureBloom(config: Partial<BloomPassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._bloomPass.enabled = config.enabled\r\n }\r\n if (config.strength !== undefined) {\r\n this._bloomPass.strength = config.strength\r\n }\r\n if (config.radius !== undefined) {\r\n this._bloomPass.radius = config.radius\r\n }\r\n if (config.threshold !== undefined) {\r\n this._bloomPass.threshold = config.threshold\r\n }\r\n }\r\n\r\n /**\r\n * 配置 SSAO\r\n */\r\n configureSSAO(config: Partial<SSAOPassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._saoPass.enabled = config.enabled\r\n }\r\n if (config.intensity !== undefined) {\r\n this._saoPass.params.saoIntensity = config.intensity\r\n }\r\n if (config.scale !== undefined) {\r\n this._saoPass.params.saoScale = config.scale\r\n }\r\n }\r\n\r\n /**\r\n * 配置 SSR\r\n */\r\n configureSSR(config: Partial<SSRPassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._ssrPass.enabled = config.enabled\r\n }\r\n if (config.thickness !== undefined) {\r\n this._ssrPass.thickness = config.thickness\r\n }\r\n if (config.infiniteThick !== undefined) {\r\n this._ssrPass.infiniteThick = config.infiniteThick\r\n }\r\n if (config.maxDistance !== undefined) {\r\n this._ssrPass.maxDistance = config.maxDistance\r\n }\r\n if (config.opacity !== undefined) {\r\n this._ssrPass.opacity = config.opacity\r\n }\r\n }\r\n\r\n /**\r\n * 添加 SSR 网格\r\n */\r\n addSSRMesh(mesh: THREE.Mesh): void {\r\n if (!this.ssrMeshList.includes(mesh)) {\r\n this.ssrMeshList.push(mesh)\r\n }\r\n }\r\n\r\n /**\r\n * 移除 SSR 网格\r\n */\r\n removeSSRMesh(mesh: THREE.Mesh): void {\r\n const index = this.ssrMeshList.indexOf(mesh)\r\n if (index > -1) {\r\n this.ssrMeshList.splice(index, 1)\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js'\r\nimport { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * CSS 渲染器插件\r\n * 提供 CSS2D 和 CSS3D 渲染功能\r\n */\r\nexport class CSSRendererPlugin extends Plugin {\r\n readonly name = 'css-renderer'\r\n\r\n /** CSS2D 渲染器 */\r\n private _css2dRenderer!: CSS2DRenderer\r\n\r\n /** CSS3D 渲染器 */\r\n private _css3dRenderer!: CSS3DRenderer\r\n\r\n /** CSS2DObject 类 */\r\n readonly CSS2DObject = CSS2DObject\r\n\r\n /** CSS3DObject 类 */\r\n readonly CSS3DObject = CSS3DObject\r\n\r\n /**\r\n * 获取 CSS2D 渲染器\r\n */\r\n get css2dRenderer(): CSS2DRenderer {\r\n return this._css2dRenderer\r\n }\r\n\r\n /**\r\n * 获取 CSS3D 渲染器\r\n */\r\n get css3dRenderer(): CSS3DRenderer {\r\n return this._css3dRenderer\r\n }\r\n\r\n protected onInstall(): void {\r\n const container = this.renderer.domElement.parentElement!\r\n const width = container.clientWidth\r\n const height = container.clientHeight\r\n\r\n // 初始化 CSS3D 渲染器\r\n this._css3dRenderer = new CSS3DRenderer()\r\n this.setupCSSRenderer(this._css3dRenderer, container, width, height)\r\n\r\n // 初始化 CSS2D 渲染器\r\n this._css2dRenderer = new CSS2DRenderer()\r\n this.setupCSSRenderer(this._css2dRenderer, container, width, height)\r\n }\r\n\r\n /**\r\n * 设置 CSS 渲染器\r\n */\r\n private setupCSSRenderer(\r\n renderer: CSS2DRenderer | CSS3DRenderer,\r\n container: HTMLElement,\r\n width: number,\r\n height: number\r\n ): void {\r\n renderer.setSize(width, height)\r\n renderer.domElement.style.position = 'absolute'\r\n renderer.domElement.style.top = '0'\r\n renderer.domElement.style.left = '0'\r\n renderer.domElement.style.pointerEvents = 'none'\r\n renderer.domElement.style.zIndex = '1'\r\n container.appendChild(renderer.domElement)\r\n }\r\n\r\n protected onUninstall(): void {\r\n this._css2dRenderer.domElement.parentElement?.removeChild(this._css2dRenderer.domElement)\r\n this._css3dRenderer.domElement.parentElement?.removeChild(this._css3dRenderer.domElement)\r\n }\r\n\r\n onUpdate(): void {\r\n this._css2dRenderer.render(this.scene, this.camera)\r\n this._css3dRenderer.render(this.scene, this.camera)\r\n }\r\n\r\n onResize(width: number, height: number): void {\r\n this._css2dRenderer.setSize(width, height)\r\n this._css3dRenderer.setSize(width, height)\r\n }\r\n\r\n /**\r\n * 创建 CSS2D 对象\r\n * @param element DOM 元素\r\n * @param position 位置\r\n * @param enablePointerEvents 是否启用指针事件\r\n */\r\n createCSS2DObject(\r\n element: HTMLElement,\r\n position?: THREE.Vector3,\r\n enablePointerEvents = true\r\n ): CSS2DObject {\r\n if (enablePointerEvents) {\r\n element.style.pointerEvents = 'auto'\r\n }\r\n\r\n const object = new CSS2DObject(element)\r\n\r\n if (position) {\r\n object.position.copy(position)\r\n }\r\n\r\n // 添加销毁方法\r\n (object as any).destroy = () => {\r\n this.scene.remove(object)\r\n }\r\n\r\n return object\r\n }\r\n\r\n /**\r\n * 创建 CSS3D 对象\r\n * @param element DOM 元素\r\n * @param position 位置\r\n * @param enablePointerEvents 是否启用指针事件\r\n */\r\n createCSS3DObject(\r\n element: HTMLElement,\r\n position?: THREE.Vector3,\r\n enablePointerEvents = false\r\n ): CSS3DObject {\r\n if (enablePointerEvents) {\r\n element.style.pointerEvents = 'auto'\r\n }\r\n\r\n const object = new CSS3DObject(element)\r\n\r\n if (position) {\r\n object.position.copy(position)\r\n }\r\n\r\n // 添加销毁方法\r\n (object as any).destroy = () => {\r\n this.scene.remove(object)\r\n }\r\n\r\n return object\r\n }\r\n\r\n /**\r\n * 添加 CSS2D 对象到场景\r\n */\r\n addCSS2D(element: HTMLElement, position: THREE.Vector3): CSS2DObject {\r\n const object = this.createCSS2DObject(element, position)\r\n this.scene.add(object)\r\n return object\r\n }\r\n\r\n /**\r\n * 添加 CSS3D 对象到场景\r\n */\r\n addCSS3D(element: HTMLElement, position: THREE.Vector3): CSS3DObject {\r\n const object = this.createCSS3DObject(element, position)\r\n this.scene.add(object)\r\n return object\r\n }\r\n}\r\n","import * as THREE from 'three'\r\n\r\n/**\r\n * 获取 WebGL 鼠标坐标\r\n * @param event 鼠标事件\r\n * @returns 归一化的鼠标坐标\r\n */\r\nexport function getWebGLMouse(event: MouseEvent): THREE.Vector2 {\r\n const target = event.target as HTMLElement\r\n // 使用 offsetX/offsetY,它们是相对于 event.target 的\r\n return new THREE.Vector2(\r\n (event.offsetX / target.clientWidth) * 2 - 1,\r\n -(event.offsetY / target.clientHeight) * 2 + 1\r\n )\r\n}\r\n\r\n/**\r\n * 从容器元素获取 WebGL 鼠标坐标\r\n * @param event 鼠标事件\r\n * @param container 容器元素\r\n * @returns 归一化的鼠标坐标\r\n */\r\nexport function getWebGLMouseFromContainer(event: MouseEvent, container: HTMLElement): THREE.Vector2 {\r\n const rect = container.getBoundingClientRect()\r\n return new THREE.Vector2(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n )\r\n}\r\n\r\n// 复用的射线检测器和向量(避免每次创建新实例)\r\nconst _raycaster = new THREE.Raycaster()\r\nconst _box = new THREE.Box3()\r\n\r\n/**\r\n * 射线检测物体(优化版本)\r\n * 使用包围盒预检测来提升性能\r\n * \r\n * @param mouse 鼠标坐标\r\n * @param camera 相机\r\n * @param objects 检测对象列表\r\n * @returns 交点列表\r\n */\r\nexport function raycastObjects(\r\n mouse: THREE.Vector2,\r\n camera: THREE.Camera,\r\n objects: THREE.Object3D[]\r\n): THREE.Intersection[] {\r\n _raycaster.setFromCamera(mouse, camera)\r\n\r\n // 第一步:使用包围盒预检测,筛选候选对象\r\n const candidates: THREE.Object3D[] = []\r\n \r\n for (const obj of objects) {\r\n // 跳过不可见对象\r\n if (!obj.visible) continue\r\n \r\n // 跳过辅助工具和特效\r\n const objAny = obj as any\r\n if (objAny.isTransformControls) continue\r\n if (objAny.isHelper) continue\r\n if (obj.type === 'GridHelper') continue\r\n if (obj.type === 'AxesHelper') continue\r\n if (obj.type === 'AmbientLight') continue\r\n if (obj.type === 'DirectionalLight') continue\r\n if (obj.type === 'PointLight') continue\r\n if (obj.type === 'SpotLight') continue\r\n if (obj.type === 'HemisphereLight') continue\r\n if (obj.name === 'TransformControls') continue\r\n \r\n // 计算包围盒并检测射线是否相交\r\n _box.setFromObject(obj)\r\n if (!_box.isEmpty() && _raycaster.ray.intersectsBox(_box)) {\r\n candidates.push(obj)\r\n }\r\n }\r\n\r\n // 如果没有候选对象,直接返回空数组\r\n if (candidates.length === 0) {\r\n return []\r\n }\r\n\r\n // 第二步:只对候选对象进行精确检测\r\n const intersects = _raycaster.intersectObjects(candidates, true)\r\n\r\n // 过滤掉 TransformControls 和不可见物体\r\n return intersects.filter(i => {\r\n const obj = i.object as any\r\n // 兼容两种标记方式\r\n const isTransformControl = obj.isTransformControls || obj.text === 'TransformControls'\r\n return !isTransformControl &&\r\n obj.isMesh &&\r\n obj.visible\r\n })\r\n}\r\n\r\n/**\r\n * 获取物体的根模型\r\n * @param object 物体\r\n * @returns 根模型\r\n */\r\nexport function getRootModel(object: THREE.Object3D): THREE.Object3D {\r\n let current = object\r\n while (current.parent && current.parent.type !== 'Scene') {\r\n current = current.parent\r\n }\r\n return current\r\n}\r\n\r\n/**\r\n * 创建射线检测器\r\n * @param camera 相机\r\n * @returns 射线检测工具\r\n */\r\nexport function createRaycaster(camera: THREE.Camera) {\r\n const raycaster = new THREE.Raycaster()\r\n\r\n return {\r\n raycaster,\r\n\r\n /**\r\n * 从鼠标事件获取交点\r\n */\r\n getIntersects(event: MouseEvent, objects: THREE.Object3D[]): THREE.Intersection[] {\r\n const mouse = getWebGLMouse(event)\r\n raycaster.setFromCamera(mouse, camera)\r\n return raycaster.intersectObjects(objects, true)\r\n },\r\n\r\n /**\r\n * 设置射线远近\r\n */\r\n setRange(near: number, far: number): void {\r\n raycaster.near = near\r\n raycaster.far = far\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { EditorPluginConfig } from '../../types/config.types'\r\nimport type { HandlerMode, ClickInfo, ExtendedObject3D } from '../../types/core.types'\r\nimport type { TransformControllerPlugin } from '../controls/TransformController'\r\nimport type { ComposerPlugin } from '../postprocessing/ComposerPlugin'\r\nimport { getRootModel, raycastObjects, getWebGLMouse } from '../../utils/raycast'\r\n\r\n/**\r\n * 默认编辑器配置\r\n */\r\nexport const DEFAULT_EDITOR_CONFIG: EditorPluginConfig = {\r\n modes: ['选择', '根选择', '变换', '场景绘制', '点击信息'],\r\n defaultMode: '变换',\r\n isTransformChildren: false,\r\n enableKeyboard: false\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n * 提供物体选择、变换、模式切换等编辑功能\r\n */\r\nexport class EditorPlugin extends Plugin<EditorPluginConfig> {\r\n readonly name = 'editor'\r\n readonly dependencies = ['transform-controller', 'composer']\r\n\r\n /** 当前模式 */\r\n private _mode: HandlerMode\r\n\r\n /** 当前选中信息 */\r\n private _currentInfo: ClickInfo | null = null\r\n\r\n /** 键盘事件处理函数 */\r\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null\r\n\r\n /** 绘制事件回调 */\r\n drawEventCallback?: (point: THREE.Vector3, object: THREE.Object3D) => void\r\n\r\n constructor(config?: Partial<EditorPluginConfig>) {\r\n super({ ...DEFAULT_EDITOR_CONFIG, ...config })\r\n this._mode = (this.config.defaultMode as HandlerMode) || '变换'\r\n }\r\n\r\n /**\r\n * 获取当前模式\r\n */\r\n get mode(): HandlerMode {\r\n return this._mode\r\n }\r\n\r\n /**\r\n * 获取当前选中信息\r\n */\r\n get currentInfo(): ClickInfo | null {\r\n return this._currentInfo\r\n }\r\n\r\n /**\r\n * 获取是否变换子物体\r\n */\r\n get isTransformChildren(): boolean {\r\n return this.config.isTransformChildren\r\n }\r\n\r\n /**\r\n * 设置是否变换子物体\r\n */\r\n set isTransformChildren(value: boolean) {\r\n this.config.isTransformChildren = value\r\n }\r\n\r\n protected onInstall(): void {\r\n // 设置键盘快捷键\r\n if (this.config.enableKeyboard) {\r\n this.enableKeyboard()\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.disableKeyboard()\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: HandlerMode): void {\r\n const previous = this._mode\r\n this._mode = mode\r\n this.events.emit('mode:change', { mode, previous })\r\n }\r\n\r\n /**\r\n * 处理场景点击事件\r\n */\r\n handleClick(event: MouseEvent): ClickInfo | null {\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.getPlugin<ComposerPlugin>('composer')\r\n\r\n if (!transformPlugin || !composerPlugin) return null\r\n\r\n // 分离当前变换控制器\r\n transformPlugin.detach()\r\n\r\n // 获取鼠标位置(使用渲染器的 domElement 计算)\r\n const rect = this.renderer.domElement.getBoundingClientRect()\r\n const mouse = new THREE.Vector2(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n )\r\n\r\n // 射线检测\r\n const intersects = raycastObjects(mouse, this.camera, this.scene.children)\r\n\r\n // 过滤有效交点\r\n const intersect = intersects.find(i => {\r\n const obj = i.object as ExtendedObject3D\r\n const rootObj = getRootModel(i.object)\r\n return (i.object as THREE.Object3D).visible && rootObj.visible\r\n })\r\n\r\n if (!intersect) {\r\n this._currentInfo = null\r\n this.events.emit('click', { event, info: null })\r\n return null\r\n }\r\n\r\n const { object, point } = intersect\r\n const rootModel = getRootModel(object)\r\n\r\n // 根据模式处理\r\n switch (this._mode) {\r\n case '变换':\r\n composerPlugin.clearOutlineObjects()\r\n if (this.config.isTransformChildren) {\r\n transformPlugin.attach(object)\r\n } else {\r\n transformPlugin.attach(rootModel)\r\n }\r\n break\r\n\r\n case '选择':\r\n composerPlugin.setOutlineObjects([object])\r\n break\r\n\r\n case '根选择':\r\n composerPlugin.setOutlineObjects([rootModel])\r\n break\r\n\r\n case '场景绘制':\r\n this.drawEventCallback?.(point, object)\r\n break\r\n\r\n case '点击信息':\r\n // 仅返回信息,不做其他操作\r\n break\r\n }\r\n\r\n // 保存当前信息\r\n this._currentInfo = {\r\n currentModel: object,\r\n currentRootModel: rootModel,\r\n point: point.clone(),\r\n mode: this._mode\r\n }\r\n\r\n this.events.emit('click', { event, info: this._currentInfo })\r\n this.events.emit('object:selected', {\r\n object: this._mode === '选择' ? object : rootModel,\r\n previous: null\r\n })\r\n\r\n return this._currentInfo\r\n }\r\n\r\n /**\r\n * 获取原始射线检测结果\r\n */\r\n getRawRaycast(event: MouseEvent, objects?: THREE.Object3D[]): {\r\n raycaster: THREE.Raycaster\r\n intersects: THREE.Intersection[]\r\n } {\r\n const mouse = getWebGLMouse(event)\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(mouse, this.camera)\r\n\r\n const targetObjects = objects || this.scene.children\r\n const intersects = raycaster.intersectObjects(targetObjects, true)\r\n\r\n return { raycaster, intersects }\r\n }\r\n\r\n /**\r\n * 选择物体\r\n */\r\n select(object: THREE.Object3D | null): void {\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.getPlugin<ComposerPlugin>('composer')\r\n\r\n if (!transformPlugin || !composerPlugin) return\r\n\r\n if (object) {\r\n if (this._mode === '变换') {\r\n transformPlugin.attach(object)\r\n }\r\n composerPlugin.setOutlineObjects([object])\r\n this.events.emit('object:selected', { object, previous: this._currentInfo?.currentModel || null })\r\n } else {\r\n transformPlugin.detach()\r\n composerPlugin.clearOutlineObjects()\r\n this.events.emit('object:deselected', { object: this._currentInfo?.currentModel! })\r\n }\r\n }\r\n\r\n /**\r\n * 取消选择\r\n */\r\n deselect(): void {\r\n this.select(null)\r\n this._currentInfo = null\r\n }\r\n\r\n /**\r\n * 启用键盘快捷键\r\n */\r\n enableKeyboard(): void {\r\n if (this.keydownHandler) return\r\n\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n\r\n this.keydownHandler = (e: KeyboardEvent) => {\r\n if (!transformPlugin) return\r\n\r\n switch (e.key.toLowerCase()) {\r\n case 'w':\r\n transformPlugin.setMode('translate')\r\n break\r\n case 'e':\r\n transformPlugin.setMode('rotate')\r\n break\r\n case 'r':\r\n transformPlugin.setMode('scale')\r\n break\r\n case 'escape':\r\n this.deselect()\r\n break\r\n case 'delete':\r\n case 'backspace':\r\n if (this._currentInfo?.currentRootModel) {\r\n this.scene.remove(this._currentInfo.currentRootModel)\r\n this.deselect()\r\n }\r\n break\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', this.keydownHandler)\r\n this.config.enableKeyboard = true\r\n }\r\n\r\n /**\r\n * 禁用键盘快捷键\r\n */\r\n disableKeyboard(): void {\r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler)\r\n this.keydownHandler = null\r\n }\r\n this.config.enableKeyboard = false\r\n }\r\n\r\n /**\r\n * 获取插件\r\n */\r\n private getPlugin<T>(name: string): T | undefined {\r\n return this.pluginManager?.get(name) as T | undefined\r\n }\r\n}\r\n","/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"<div id=\\\"dg-save\\\" class=\\\"dg dialogue\\\">\\n\\n Here's the new load parameter for your <code>GUI</code>'s constructor:\\n\\n <textarea id=\\\"dg-new-constructor\\\"></textarea>\\n\\n <div id=\\\"dg-save-locally\\\">\\n\\n <input id=\\\"dg-local-storage\\\" type=\\\"checkbox\\\"/> Automatically save\\n values to <code>localStorage</code> on exit.\\n\\n <div id=\\\"dg-local-explain\\\">The values saved to <code>localStorage</code> will\\n override those passed to <code>dat.GUI</code>'s constructor. This makes it\\n easier to work incrementally, but <code>localStorage</code> is fragile,\\n and your friends may not see the same values you do.\\n\\n </div>\\n\\n </div>\\n\\n</div>\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","import * as THREE from 'three'\r\nimport { GUI } from 'dat.gui'\r\nimport { Plugin } from '../Plugin'\r\nimport type { OrbitControllerPlugin } from '../controls/OrbitController'\r\nimport type { TransformControllerPlugin } from '../controls/TransformController'\r\nimport type { ComposerPlugin } from '../postprocessing/ComposerPlugin'\r\n\r\n/**\r\n * GUI 插件配置\r\n */\r\nexport interface GUIPluginConfig {\r\n /** 是否自动挂载 */\r\n autoPlace: boolean\r\n /** 宽度 */\r\n width: number\r\n /** 是否使用代理(空对象) */\r\n useProxy: boolean\r\n /** 是否默认关闭所有文件夹 */\r\n closed: boolean\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_GUI_CONFIG: GUIPluginConfig = {\r\n autoPlace: true,\r\n width: 300,\r\n useProxy: false,\r\n closed: false\r\n}\r\n\r\n/**\r\n * 几何体类型列表\r\n */\r\nexport const geometryList = ['立方体', '球体', '圆柱体', '圆锥体', '圆环', '平面', '圆环结', '十二面体', '二十面体', '八面体', '四面体']\r\n\r\n/**\r\n * 材质类型列表\r\n */\r\nexport const materialList = ['基础材质', '标准材质', 'Lambert材质', 'Phong材质', '物理材质', 'Toon材质']\r\n\r\n/**\r\n * 光源类型列表\r\n */\r\nexport const lightTypeList = ['AmbientLight', 'DirectionalLight', 'PointLight', 'SpotLight', 'HemisphereLight', 'RectAreaLight']\r\n\r\n/**\r\n * 绘制模式列表\r\n */\r\nexport const drawModeList = ['围栏物体', '平面绘制', '曲线路径', '直线路径']\r\n\r\n/**\r\n * 点模式列表\r\n */\r\nexport const pointModeList = ['场景交点', '地图区域中心', '地图行政中心']\r\n\r\n/**\r\n * GUI 插件\r\n * 提供 dat.gui 配置面板功能,完整迁移原有所有功能\r\n */\r\nexport class GUIPlugin extends Plugin<GUIPluginConfig> {\r\n readonly name = 'gui'\r\n\r\n /** dat.gui 实例 */\r\n private _gui: GUI | null = null\r\n\r\n /** 场景配置文件夹 */\r\n private sceneFolder: GUI | null = null\r\n\r\n /** 控制配置文件夹 */\r\n private controlFolder: GUI | null = null\r\n\r\n /** 3D物体文件夹 */\r\n private meshFolder: GUI | null = null\r\n\r\n /** 动画配置文件夹 */\r\n private animationFolder: GUI | null = null\r\n\r\n /** 选择面板 */\r\n selectPanel: GUI | null = null\r\n\r\n /** 模型列表文件夹 */\r\n private modelListFolder: GUI | null = null\r\n\r\n /** 内置物体列表文件夹 */\r\n private innerMeshListFolder: GUI | null = null\r\n\r\n /** 绘制物体列表文件夹 */\r\n private drawMeshListFolder: GUI | null = null\r\n\r\n /** 地图列表文件夹 */\r\n private geoMapListFolder: GUI | null = null\r\n\r\n /** 粒子列表文件夹 */\r\n private particleListFolder: GUI | null = null\r\n\r\n /** 边界物体列表文件夹 */\r\n private borderGroupListFolder: GUI | null = null\r\n\r\n /** 文本物体列表文件夹 */\r\n private textMeshListFolder: GUI | null = null\r\n\r\n /** 设计物体列表文件夹 */\r\n private designMeshListFolder: GUI | null = null\r\n\r\n /** 灯光列表文件夹 */\r\n private lightListFolder: GUI | null = null\r\n\r\n /** 控制参数 */\r\n private handlerParams = {\r\n mode: '变换',\r\n isTransformChildren: false,\r\n openKey: false\r\n }\r\n\r\n /** 内置物体控制参数 */\r\n private innerMeshParams = {\r\n geometryType: '立方体',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 绘制控制参数 */\r\n private drawParams = {\r\n mode: '围栏物体',\r\n pointMode: '场景交点',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 地图控制参数 */\r\n private geoMapParams = {\r\n url: '',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 粒子控制参数 */\r\n private particleParams = {\r\n particlesSum: 100000,\r\n inner: 0,\r\n outer: 2000,\r\n maxVelocity: 50,\r\n mapUrl: 'https://z2586300277.github.io/three-editor/dist/files/channels/snow.png',\r\n sportType: '全随机',\r\n shaderCodeName: '水波纹'\r\n }\r\n\r\n /** 边界物体控制参数 */\r\n private borderGroupParams = {\r\n url: 'https://geo.datav.aliyun.com/areas_v3/bound/100000.json',\r\n materialType: '基础材质',\r\n dlength: 0\r\n }\r\n\r\n /** 文本物体控制参数 */\r\n private textMeshParams = {\r\n fontLink: 'https://z2586300277.github.io/three-editor/dist/files/font/cn1.json',\r\n text: '',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 设计物体控制参数 */\r\n private designMeshParams = {\r\n type: '镜面'\r\n }\r\n\r\n /** 灯光控制参数 */\r\n private lightParams = {\r\n lightType: 'AmbientLight'\r\n }\r\n\r\n constructor(config?: Partial<GUIPluginConfig>) {\r\n super({ ...DEFAULT_GUI_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n this.createGUI()\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.destroy()\r\n }\r\n\r\n /**\r\n * 获取 GUI 实例\r\n */\r\n get gui(): GUI | null {\r\n return this._gui\r\n }\r\n\r\n /**\r\n * 获取 GUI DOM 元素\r\n */\r\n get domElement(): HTMLElement | null {\r\n return this._gui?.domElement ?? null\r\n }\r\n\r\n /**\r\n * 创建 GUI\r\n */\r\n private createGUI(): void {\r\n if (this.config.useProxy) {\r\n return\r\n }\r\n\r\n this._gui = new GUI({\r\n autoPlace: this.config.autoPlace,\r\n width: this.config.width\r\n })\r\n\r\n // 创建场景配置\r\n this.createSceneFolder()\r\n\r\n // 创建控制配置\r\n this.createControlFolder()\r\n\r\n // 创建 3D 物体配置\r\n this.createMeshFolder()\r\n\r\n // 创建动画配置\r\n this.createAnimationFolder()\r\n }\r\n\r\n /**\r\n * 创建场景配置文件夹\r\n */\r\n private createSceneFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.sceneFolder = this._gui.addFolder('场景配置')\r\n\r\n // 渲染器配置\r\n this.createRendererFolder()\r\n\r\n // 相机配置\r\n this.createCameraFolder()\r\n\r\n // 轨道控制配置\r\n this.createOrbitControlsFolder()\r\n\r\n // 环境配置\r\n this.createEnvironmentFolder()\r\n\r\n // 灯光配置\r\n this.createLightGroupFolder()\r\n\r\n // 后期处理配置\r\n this.createComposerFolder()\r\n\r\n if (!this.config.closed) {\r\n this.sceneFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建渲染器配置\r\n */\r\n private createRendererFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('渲染器配置')\r\n const renderer = this.renderer\r\n\r\n const params = {\r\n toneMapping: renderer.toneMapping,\r\n toneMappingExposure: renderer.toneMappingExposure,\r\n shadowMapEnabled: renderer.shadowMap.enabled,\r\n shadowMapType: renderer.shadowMap.type,\r\n pixelRatio: renderer.getPixelRatio(),\r\n outputColorSpace: renderer.outputColorSpace\r\n }\r\n\r\n folder.add(params, 'toneMapping', {\r\n '无': THREE.NoToneMapping,\r\n '线性': THREE.LinearToneMapping,\r\n 'Reinhard': THREE.ReinhardToneMapping,\r\n 'Cineon': THREE.CineonToneMapping,\r\n 'ACESFilmic': THREE.ACESFilmicToneMapping\r\n }).name('色调映射').onChange((v: number) => {\r\n renderer.toneMapping = v as THREE.ToneMapping\r\n })\r\n\r\n folder.add(params, 'toneMappingExposure', 0, 3, 0.1).name('曝光度').onChange((v: number) => {\r\n renderer.toneMappingExposure = v\r\n })\r\n\r\n folder.add(params, 'shadowMapEnabled').name('阴影').onChange((v: boolean) => {\r\n renderer.shadowMap.enabled = v\r\n })\r\n\r\n folder.add(params, 'pixelRatio', 0.5, 3, 0.1).name('像素比').onChange((v: number) => {\r\n renderer.setPixelRatio(v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建相机配置\r\n */\r\n private createCameraFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('相机配置')\r\n const camera = this.camera\r\n\r\n folder.add(camera, 'fov', 10, 120, 1).name('视角').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n folder.add(camera, 'near', 0.01, 100, 0.01).name('近裁剪面').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n folder.add(camera, 'far', 100, 100000, 100).name('远裁剪面').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n // 位置\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(camera.position, 'x', -1000, 1000, 1).listen()\r\n posFolder.add(camera.position, 'y', -1000, 1000, 1).listen()\r\n posFolder.add(camera.position, 'z', -1000, 1000, 1).listen()\r\n }\r\n\r\n /**\r\n * 创建轨道控制配置\r\n */\r\n private createOrbitControlsFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const orbitController = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n\r\n if (!orbitController?.controls) return\r\n\r\n const folder = this.sceneFolder.addFolder('轨道控制')\r\n const controls = orbitController.controls\r\n\r\n folder.add(controls, 'enableDamping').name('阻尼')\r\n folder.add(controls, 'dampingFactor', 0, 1, 0.01).name('阻尼系数')\r\n folder.add(controls, 'enableZoom').name('缩放')\r\n folder.add(controls, 'enableRotate').name('旋转')\r\n folder.add(controls, 'enablePan').name('平移')\r\n folder.add(controls, 'autoRotate').name('自动旋转')\r\n folder.add(controls, 'autoRotateSpeed', 0, 10, 0.1).name('旋转速度')\r\n folder.add(controls, 'minDistance', 0, 1000, 1).name('最小距离')\r\n folder.add(controls, 'maxDistance', 0, 10000, 10).name('最大距离')\r\n folder.add(controls, 'maxPolarAngle', 0, Math.PI, 0.01).name('最大极角')\r\n }\r\n\r\n /**\r\n * 创建环境配置\r\n */\r\n private createEnvironmentFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('环境配置')\r\n const scene = this.scene\r\n\r\n // 雾配置\r\n const fogFolder = folder.addFolder('雾配置')\r\n const fogParams = {\r\n enabled: !!scene.fog,\r\n color: scene.fog ? '#' + (scene.fog as THREE.Fog).color.getHexString() : '#cccccc',\r\n near: (scene.fog as THREE.Fog)?.near ?? 1,\r\n far: (scene.fog as THREE.Fog)?.far ?? 1000\r\n }\r\n\r\n fogFolder.add(fogParams, 'enabled').name('启用').onChange((v: boolean) => {\r\n if (v) {\r\n scene.fog = new THREE.Fog(fogParams.color, fogParams.near, fogParams.far)\r\n } else {\r\n scene.fog = null\r\n }\r\n })\r\n\r\n fogFolder.addColor(fogParams, 'color').name('颜色').onChange((v: string) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).color.set(v)\r\n }\r\n })\r\n\r\n fogFolder.add(fogParams, 'near', 0, 1000, 1).name('近距离').onChange((v: number) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).near = v\r\n }\r\n })\r\n\r\n fogFolder.add(fogParams, 'far', 0, 10000, 10).name('远距离').onChange((v: number) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).far = v\r\n }\r\n })\r\n\r\n // 背景配置\r\n const bgParams = {\r\n color: '#000000'\r\n }\r\n\r\n folder.addColor(bgParams, 'color').name('背景颜色').onChange((v: string) => {\r\n scene.background = new THREE.Color(v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建灯光配置文件夹\r\n */\r\n private createLightGroupFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('灯光配置')\r\n this.lightListFolder = folder.addFolder('灯光列表')\r\n\r\n folder.add(this.lightParams, 'lightType', lightTypeList).name('光源类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n const light = this.createLight(this.lightParams.lightType)\r\n this.scene.add(light)\r\n this.addLightPanel(light)\r\n this.events.emit('light:add' as any, { light })\r\n }\r\n }, 'fn').name('添加光源')\r\n\r\n // 添加已有灯光\r\n this.scene.children.forEach(child => {\r\n if (child instanceof THREE.Light) {\r\n this.addLightPanel(child)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 创建灯光\r\n */\r\n private createLight(type: string): THREE.Light {\r\n switch (type) {\r\n case 'AmbientLight':\r\n return new THREE.AmbientLight(0xffffff, 0.5)\r\n case 'DirectionalLight':\r\n const dirLight = new THREE.DirectionalLight(0xffffff, 1)\r\n dirLight.position.set(5, 10, 5)\r\n dirLight.castShadow = true\r\n return dirLight\r\n case 'PointLight':\r\n const pointLight = new THREE.PointLight(0xffffff, 1, 100)\r\n pointLight.position.set(0, 5, 0)\r\n return pointLight\r\n case 'SpotLight':\r\n const spotLight = new THREE.SpotLight(0xffffff, 1)\r\n spotLight.position.set(0, 10, 0)\r\n spotLight.castShadow = true\r\n return spotLight\r\n case 'HemisphereLight':\r\n return new THREE.HemisphereLight(0xffffff, 0x444444, 1)\r\n case 'RectAreaLight':\r\n const rectLight = new THREE.RectAreaLight(0xffffff, 1, 10, 10)\r\n rectLight.position.set(0, 5, 0)\r\n return rectLight\r\n default:\r\n return new THREE.AmbientLight(0xffffff, 0.5)\r\n }\r\n }\r\n\r\n /**\r\n * 添加灯光面板\r\n */\r\n private addLightPanel(light: THREE.Light): void {\r\n if (!this.lightListFolder) return\r\n\r\n const folder = this.lightListFolder.addFolder(light.type + light.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n // 颜色\r\n const colorParams = { color: '#' + light.color.getHexString() }\r\n folder.addColor(colorParams, 'color').name('颜色').onChange((v: string) => {\r\n light.color.set(v)\r\n })\r\n\r\n // 强度\r\n folder.add(light, 'intensity', 0, 10, 0.1).name('强度')\r\n\r\n // 位置(非环境光)\r\n if (!(light instanceof THREE.AmbientLight) && !(light instanceof THREE.HemisphereLight)) {\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(light.position, 'x', -100, 100, 0.1).listen()\r\n posFolder.add(light.position, 'y', -100, 100, 0.1).listen()\r\n posFolder.add(light.position, 'z', -100, 100, 0.1).listen()\r\n }\r\n\r\n // 阴影\r\n if ((light as any).castShadow !== undefined) {\r\n folder.add(light, 'castShadow').name('投射阴影')\r\n }\r\n\r\n // 选中\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(light)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n // 删除\r\n folder.add({\r\n fn: () => {\r\n light.parent?.remove(light)\r\n this.lightListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建后期处理配置\r\n */\r\n private createComposerFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const composerPlugin = this.pluginManager?.get('composer') as ComposerPlugin | undefined\r\n\r\n if (!composerPlugin) return\r\n\r\n const folder = this.sceneFolder.addFolder('后期处理')\r\n\r\n // 轮廓光\r\n const outlineFolder = folder.addFolder('轮廓光')\r\n const outlinePass = composerPlugin.outlinePass\r\n if (outlinePass) {\r\n outlineFolder.add(outlinePass, 'enabled').name('启用')\r\n outlineFolder.add(outlinePass, 'edgeStrength', 0, 10, 0.1).name('边缘强度')\r\n outlineFolder.add(outlinePass, 'edgeGlow', 0, 5, 0.1).name('边缘发光')\r\n outlineFolder.add(outlinePass, 'edgeThickness', 0, 5, 0.1).name('边缘厚度')\r\n outlineFolder.add(outlinePass, 'pulsePeriod', 0, 5, 0.1).name('脉冲周期')\r\n \r\n const colorParams = {\r\n visibleEdgeColor: '#' + outlinePass.visibleEdgeColor.getHexString(),\r\n hiddenEdgeColor: '#' + outlinePass.hiddenEdgeColor.getHexString()\r\n }\r\n outlineFolder.addColor(colorParams, 'visibleEdgeColor').name('可见边缘颜色').onChange((v: string) => {\r\n outlinePass.visibleEdgeColor.set(v)\r\n })\r\n outlineFolder.addColor(colorParams, 'hiddenEdgeColor').name('隐藏边缘颜色').onChange((v: string) => {\r\n outlinePass.hiddenEdgeColor.set(v)\r\n })\r\n }\r\n\r\n // 泛光\r\n const bloomFolder = folder.addFolder('泛光')\r\n const bloomPass = composerPlugin.bloomPass\r\n if (bloomPass) {\r\n bloomFolder.add(bloomPass, 'enabled').name('启用')\r\n bloomFolder.add(bloomPass, 'strength', 0, 3, 0.1).name('强度')\r\n bloomFolder.add(bloomPass, 'radius', 0, 1, 0.01).name('半径')\r\n bloomFolder.add(bloomPass, 'threshold', 0, 1, 0.01).name('阈值')\r\n }\r\n }\r\n\r\n /**\r\n * 创建控制配置文件夹\r\n */\r\n private createControlFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.controlFolder = this._gui.addFolder('控制配置')\r\n\r\n this.controlFolder.add(this.handlerParams, 'mode', ['选择', '根选择', '变换', '场景绘制', '点击信息'])\r\n .name('模式')\r\n .listen()\r\n .onChange((v: string) => {\r\n this.events.emit('mode:change' as any, { mode: v })\r\n })\r\n\r\n this.controlFolder.add(this.handlerParams, 'isTransformChildren').name('子变换').listen()\r\n this.controlFolder.add(this.handlerParams, 'openKey').name('开启按键').listen().onChange((v: boolean) => {\r\n this.events.emit('keyboard:toggle' as any, { enabled: v })\r\n })\r\n\r\n // 同步控制\r\n this.createSyncTransformFolder()\r\n\r\n // 性能监控\r\n this.createStatsFolder()\r\n\r\n // 辅助工具配置\r\n this.createHelpersFolder()\r\n\r\n // 变换控制器配置\r\n this.createTransformControlsFolder()\r\n\r\n if (!this.config.closed) {\r\n this.controlFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建同步控制文件夹\r\n */\r\n private createSyncTransformFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('同步控制')\r\n const params = {\r\n syncPosition: false,\r\n syncRotation: false,\r\n syncScale: false\r\n }\r\n\r\n folder.add(params, 'syncPosition').name('同步位置')\r\n folder.add(params, 'syncRotation').name('同步旋转')\r\n folder.add(params, 'syncScale').name('同步缩放')\r\n }\r\n\r\n /**\r\n * 创建性能监控文件夹\r\n */\r\n private createStatsFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('性能监控')\r\n const params = {\r\n showStats: false,\r\n statsMode: 0\r\n }\r\n\r\n folder.add(params, 'showStats').name('显示性能').onChange((v: boolean) => {\r\n this.events.emit('stats:toggle' as any, { enabled: v })\r\n })\r\n\r\n folder.add(params, 'statsMode', { 'FPS': 0, 'MS': 1, 'MB': 2 }).name('模式').onChange((v: number) => {\r\n this.events.emit('stats:mode' as any, { mode: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建辅助工具配置\r\n */\r\n private createHelpersFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('辅助工具')\r\n\r\n const params = {\r\n showGrid: true,\r\n showAxes: true,\r\n gridSize: 100,\r\n gridDivisions: 100,\r\n axesSize: 5\r\n }\r\n\r\n folder.add(params, 'showGrid').name('显示网格').onChange((v: boolean) => {\r\n this.events.emit('helper:grid' as any, { enabled: v, size: params.gridSize, divisions: params.gridDivisions })\r\n })\r\n\r\n folder.add(params, 'gridSize', 10, 500, 10).name('网格大小').onChange((v: number) => {\r\n this.events.emit('helper:grid' as any, { enabled: params.showGrid, size: v, divisions: params.gridDivisions })\r\n })\r\n\r\n folder.add(params, 'gridDivisions', 10, 200, 10).name('网格分割').onChange((v: number) => {\r\n this.events.emit('helper:grid' as any, { enabled: params.showGrid, size: params.gridSize, divisions: v })\r\n })\r\n\r\n folder.add(params, 'showAxes').name('显示坐标轴').onChange((v: boolean) => {\r\n this.events.emit('helper:axes' as any, { enabled: v, size: params.axesSize })\r\n })\r\n\r\n folder.add(params, 'axesSize', 1, 50, 1).name('坐标轴大小').onChange((v: number) => {\r\n this.events.emit('helper:axes' as any, { enabled: params.showAxes, size: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建变换控制器配置\r\n */\r\n private createTransformControlsFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n if (!transformPlugin?.controls) return\r\n\r\n const folder = this.controlFolder.addFolder('变换控制器配置')\r\n const controls = transformPlugin.controls\r\n\r\n folder.add(controls, 'mode', ['translate', 'rotate', 'scale']).name('模式')\r\n folder.add(controls, 'space', ['world', 'local']).name('空间')\r\n folder.add(controls, 'size', 0.1, 5, 0.1).name('大小')\r\n folder.add(controls, 'showX').name('显示X轴')\r\n folder.add(controls, 'showY').name('显示Y轴')\r\n folder.add(controls, 'showZ').name('显示Z轴')\r\n \r\n // 使用代理对象来处理可能为 null 的 snap 值\r\n const snapParams = {\r\n translationSnap: controls.translationSnap ?? 0,\r\n rotationSnap: controls.rotationSnap ?? 0\r\n }\r\n \r\n folder.add(snapParams, 'translationSnap', 0, 10, 0.1).name('平移吸附').onChange((v: number) => {\r\n controls.setTranslationSnap(v === 0 ? null : v)\r\n })\r\n folder.add(snapParams, 'rotationSnap', 0, Math.PI / 4, 0.01).name('旋转吸附').onChange((v: number) => {\r\n controls.setRotationSnap(v === 0 ? null : v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建 3D 物体配置文件夹\r\n */\r\n private createMeshFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.meshFolder = this._gui.addFolder('3D物体')\r\n\r\n // 模型配置\r\n this.createModelFolder()\r\n\r\n // 绘制配置\r\n this.createDrawFolder()\r\n\r\n // 内置物体\r\n this.createInnerMeshFolder()\r\n\r\n // 三维地图\r\n this.createGeoMapFolder()\r\n\r\n // 粒子物体\r\n this.createParticleFolder()\r\n\r\n // 边界物体\r\n this.createBorderGroupFolder()\r\n\r\n // 文本物体\r\n this.createTextMeshFolder()\r\n\r\n // 设计物体\r\n this.createDesignMeshFolder()\r\n\r\n if (!this.config.closed) {\r\n this.meshFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建模型配置\r\n */\r\n private createModelFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('模型配置')\r\n this.modelListFolder = folder.addFolder('已有列表')\r\n\r\n const params = {\r\n dracoPath: '/draco/',\r\n loadGLTF: () => {\r\n this.openFileDialog('.glb,.gltf', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'GLTF' })\r\n })\r\n },\r\n loadFBX: () => {\r\n this.openFileDialog('.fbx', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'FBX' })\r\n })\r\n },\r\n loadOBJ: () => {\r\n this.openFileDialog('.obj', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'OBJ' })\r\n })\r\n }\r\n }\r\n\r\n folder.add(params, 'dracoPath').name('Draco路径')\r\n folder.add(params, 'loadGLTF').name('加载GLTF')\r\n folder.add(params, 'loadFBX').name('加载FBX')\r\n folder.add(params, 'loadOBJ').name('加载OBJ')\r\n }\r\n\r\n /**\r\n * 添加模型到列表面板\r\n */\r\n addModelPanel(model: THREE.Object3D): void {\r\n if (!this.modelListFolder) return\r\n\r\n const folder = this.modelListFolder.addFolder(model.name + model.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n const orbitPlugin = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n const composerPlugin = this.pluginManager?.get('composer') as ComposerPlugin | undefined\r\n\r\n // 物体控制\r\n this.addMeshControlPanel(model, folder.addFolder('物体控制'))\r\n\r\n // 全局和子项控制\r\n this.addGroupGlobalPanel(model, folder.addFolder('全局和子项控制'))\r\n\r\n // 动画配置(如果有动画)\r\n if ((model as any).animations?.length > 0) {\r\n this.addGroupAnimationPanel(model, folder.addFolder('动画配置'))\r\n }\r\n\r\n // 选中\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(model)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n // 定位物体\r\n folder.add({\r\n fn: () => {\r\n if (orbitPlugin?.controls) {\r\n const box = new THREE.Box3().setFromObject(model)\r\n const center = box.getCenter(new THREE.Vector3())\r\n const size = box.getSize(new THREE.Vector3())\r\n const maxDim = Math.max(size.x, size.y, size.z)\r\n const distance = maxDim * 2\r\n\r\n orbitPlugin.controls.target.copy(center)\r\n this.camera.position.copy(center).add(new THREE.Vector3(distance, distance, distance))\r\n }\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(model)\r\n }\r\n if (composerPlugin) {\r\n composerPlugin.setOutlineObjects([model])\r\n }\r\n }\r\n }, 'fn').name('定位物体')\r\n\r\n // 删除\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n model.parent?.remove(model)\r\n this.modelListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 添加物体控制面板\r\n */\r\n private addMeshControlPanel(mesh: THREE.Object3D, folder: GUI): void {\r\n // 可见性\r\n folder.add(mesh, 'visible').name('可见')\r\n\r\n // 位置\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(mesh.position, 'x', -1000, 1000, 0.1).listen()\r\n posFolder.add(mesh.position, 'y', -1000, 1000, 0.1).listen()\r\n posFolder.add(mesh.position, 'z', -1000, 1000, 0.1).listen()\r\n\r\n // 旋转\r\n const rotFolder = folder.addFolder('旋转')\r\n rotFolder.add(mesh.rotation, 'x', -Math.PI, Math.PI, 0.01).listen()\r\n rotFolder.add(mesh.rotation, 'y', -Math.PI, Math.PI, 0.01).listen()\r\n rotFolder.add(mesh.rotation, 'z', -Math.PI, Math.PI, 0.01).listen()\r\n\r\n // 缩放\r\n const scaleFolder = folder.addFolder('缩放')\r\n scaleFolder.add(mesh.scale, 'x', 0.01, 10, 0.01).listen()\r\n scaleFolder.add(mesh.scale, 'y', 0.01, 10, 0.01).listen()\r\n scaleFolder.add(mesh.scale, 'z', 0.01, 10, 0.01).listen()\r\n\r\n // 统一缩放\r\n const uniformScale = { scale: 1 }\r\n scaleFolder.add(uniformScale, 'scale', 0.01, 10, 0.01).name('统一缩放').onChange((v: number) => {\r\n mesh.scale.set(v, v, v)\r\n })\r\n\r\n // 阴影(如果是 Mesh)\r\n if ((mesh as THREE.Mesh).isMesh) {\r\n folder.add(mesh, 'castShadow').name('投射阴影')\r\n folder.add(mesh, 'receiveShadow').name('接收阴影')\r\n }\r\n }\r\n\r\n /**\r\n * 添加全局和子项控制面板\r\n */\r\n private addGroupGlobalPanel(group: THREE.Object3D, folder: GUI): void {\r\n const globalConfig = (group as any).globalConfig || {\r\n useGlobalConfig: false,\r\n isSaveChildren: true,\r\n isSaveMaterials: true,\r\n mesh: { castShadow: false, receiveShadow: false },\r\n material: { envMap: false, envMapIntensity: 1, reflectivity: 0.98 }\r\n }\r\n ;(group as any).globalConfig = globalConfig\r\n\r\n folder.add(globalConfig, 'useGlobalConfig').name('使用全局配置')\r\n folder.add(globalConfig, 'isSaveChildren').name('保存子项')\r\n folder.add(globalConfig, 'isSaveMaterials').name('保存材质')\r\n\r\n // 网格配置\r\n const meshFolder = folder.addFolder('网格配置')\r\n meshFolder.add(globalConfig.mesh, 'castShadow').name('投射阴影').onChange((v: boolean) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.castShadow = v\r\n }\r\n })\r\n }\r\n })\r\n meshFolder.add(globalConfig.mesh, 'receiveShadow').name('接收阴影').onChange((v: boolean) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.receiveShadow = v\r\n }\r\n })\r\n }\r\n })\r\n\r\n // 材质配置\r\n const matFolder = folder.addFolder('材质配置')\r\n matFolder.add(globalConfig.material, 'envMapIntensity', 0, 5, 0.1).name('环境贴图强度').onChange((v: number) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const materials = Array.isArray((child as THREE.Mesh).material) \r\n ? (child as THREE.Mesh).material as THREE.Material[]\r\n : [(child as THREE.Mesh).material as THREE.Material]\r\n materials.forEach(mat => {\r\n if ((mat as any).envMapIntensity !== undefined) {\r\n (mat as any).envMapIntensity = v\r\n }\r\n })\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 添加组动画面板\r\n */\r\n private addGroupAnimationPanel(group: THREE.Object3D, folder: GUI): void {\r\n const animations = (group as any).animations as THREE.AnimationClip[]\r\n if (!animations || animations.length === 0) return\r\n\r\n const animParams = (group as any).animationPlayParams || {\r\n initPlay: false,\r\n speed: 0.5,\r\n actionIndexs: new Array(animations.length).fill(false),\r\n startTime: 0,\r\n loop: false\r\n }\r\n ;(group as any).animationPlayParams = animParams\r\n\r\n folder.add(animParams, 'initPlay').name('初始播放')\r\n folder.add(animParams, 'speed', 0, 2, 0.1).name('速度')\r\n folder.add(animParams, 'startTime', 0, 10, 0.1).name('开始时间')\r\n folder.add(animParams, 'loop').name('循环')\r\n\r\n // 动画列表\r\n const listFolder = folder.addFolder('动画列表')\r\n animations.forEach((clip, index) => {\r\n listFolder.add(animParams.actionIndexs, index.toString()).name(clip.name || `动画${index}`)\r\n })\r\n\r\n // 播放控制\r\n folder.add({\r\n play: () => {\r\n this.events.emit('animation:play' as any, { group, params: animParams })\r\n }\r\n }, 'play').name('播放')\r\n\r\n folder.add({\r\n stop: () => {\r\n this.events.emit('animation:stop' as any, { group })\r\n }\r\n }, 'stop').name('停止')\r\n }\r\n\r\n /**\r\n * 创建绘制配置\r\n */\r\n private createDrawFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('绘制配置')\r\n this.drawMeshListFolder = folder.addFolder('已有列表')\r\n\r\n folder.add(this.drawParams, 'mode', drawModeList).name('绘制模式')\r\n folder.add(this.drawParams, 'pointMode', pointModeList).name('点模式')\r\n folder.add(this.drawParams, 'materialType', materialList).name('材质')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('draw:start' as any, {\r\n mode: this.drawParams.mode,\r\n pointMode: this.drawParams.pointMode,\r\n materialType: this.drawParams.materialType\r\n })\r\n }\r\n }, 'fn').name('添加绘制组')\r\n }\r\n\r\n /**\r\n * 添加绘制物体到列表面板\r\n */\r\n addDrawMeshPanel(mesh: THREE.Object3D): void {\r\n if (!this.drawMeshListFolder) return\r\n\r\n const folder = this.drawMeshListFolder.addFolder(mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.drawMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建内置物体配置\r\n */\r\n private createInnerMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('内置物体')\r\n this.innerMeshListFolder = folder.addFolder('已有列表')\r\n\r\n folder.add(this.innerMeshParams, 'geometryType', geometryList).name('几何体')\r\n folder.add(this.innerMeshParams, 'materialType', materialList).name('材质')\r\n\r\n folder.add({\r\n fn: () => {\r\n const geometry = this.createGeometry(this.innerMeshParams.geometryType)\r\n const material = this.createMaterial(this.innerMeshParams.materialType)\r\n const mesh = new THREE.Mesh(geometry, material)\r\n ;(mesh as any).isInnerMesh = true\r\n ;(mesh as any).geometryType = this.innerMeshParams.geometryType\r\n ;(mesh as any).materialType = this.innerMeshParams.materialType\r\n \r\n this.scene.add(mesh)\r\n this.addInnerMeshPanel(mesh)\r\n \r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n \r\n this.events.emit('innermesh:add' as any, { mesh })\r\n }\r\n }, 'fn').name('添加')\r\n }\r\n\r\n /**\r\n * 添加内置物体到列表面板\r\n */\r\n addInnerMeshPanel(mesh: THREE.Mesh): void {\r\n if (!this.innerMeshListFolder) return\r\n\r\n const geoType = (mesh as any).geometryType || '立方体'\r\n const folder = this.innerMeshListFolder.addFolder(geoType + ':' + mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n this.addMaterialPanel(mesh.material as THREE.Material, folder.addFolder('材质配置'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.innerMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 添加材质面板\r\n */\r\n private addMaterialPanel(material: THREE.Material, folder: GUI): void {\r\n if (!material) return\r\n\r\n // 颜色\r\n if ((material as any).color) {\r\n const colorParams = { color: '#' + (material as any).color.getHexString() }\r\n folder.addColor(colorParams, 'color').name('颜色').onChange((v: string) => {\r\n (material as any).color.set(v)\r\n })\r\n }\r\n\r\n // 发光颜色\r\n if ((material as any).emissive) {\r\n const emissiveParams = { emissive: '#' + (material as any).emissive.getHexString() }\r\n folder.addColor(emissiveParams, 'emissive').name('发光颜色').onChange((v: string) => {\r\n (material as any).emissive.set(v)\r\n })\r\n folder.add(material as any, 'emissiveIntensity', 0, 5, 0.1).name('发光强度')\r\n }\r\n\r\n // 透明度\r\n folder.add(material, 'transparent').name('透明')\r\n folder.add(material, 'opacity', 0, 1, 0.01).name('透明度')\r\n\r\n // 双面渲染\r\n folder.add(material, 'side', { '正面': THREE.FrontSide, '背面': THREE.BackSide, '双面': THREE.DoubleSide }).name('渲染面')\r\n\r\n // 线框\r\n if ((material as any).wireframe !== undefined) {\r\n folder.add(material as any, 'wireframe').name('线框')\r\n }\r\n\r\n // 金属度和粗糙度(标准材质)\r\n if ((material as any).metalness !== undefined) {\r\n folder.add(material as any, 'metalness', 0, 1, 0.01).name('金属度')\r\n }\r\n if ((material as any).roughness !== undefined) {\r\n folder.add(material as any, 'roughness', 0, 1, 0.01).name('粗糙度')\r\n }\r\n\r\n // 环境贴图强度\r\n if ((material as any).envMapIntensity !== undefined) {\r\n folder.add(material as any, 'envMapIntensity', 0, 5, 0.1).name('环境贴图强度')\r\n }\r\n }\r\n\r\n /**\r\n * 创建三维地图配置\r\n */\r\n private createGeoMapFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('三维地图')\r\n this.geoMapListFolder = folder.addFolder('地图列表')\r\n\r\n folder.add(this.geoMapParams, 'url').name('地图数据地址')\r\n folder.add(this.geoMapParams, 'materialType', materialList).name('地图材质类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n const url = this.geoMapParams.url || 'https://z2586300277.github.io/3d-file-server/files/json/guangdong.json'\r\n this.events.emit('geomap:load' as any, {\r\n url,\r\n materialType: this.geoMapParams.materialType\r\n })\r\n }\r\n }, 'fn').name('添加地图')\r\n }\r\n\r\n /**\r\n * 添加地图到列表面板\r\n */\r\n addGeoMapPanel(group: THREE.Object3D): void {\r\n if (!this.geoMapListFolder) return\r\n\r\n const folder = this.geoMapListFolder.addFolder(group.name + group.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(group, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(group)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n group.parent?.remove(group)\r\n this.geoMapListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建粒子物体配置\r\n */\r\n private createParticleFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('粒子物体')\r\n this.particleListFolder = folder.addFolder('粒子列表')\r\n\r\n const initFolder = folder.addFolder('初始化参数')\r\n initFolder.add(this.particleParams, 'particlesSum').name('数量')\r\n initFolder.add(this.particleParams, 'inner').name('内半径')\r\n initFolder.add(this.particleParams, 'outer').name('外半径')\r\n initFolder.add(this.particleParams, 'maxVelocity').name('最大速度')\r\n initFolder.add(this.particleParams, 'mapUrl').name('贴图路径')\r\n initFolder.add(this.particleParams, 'shaderCodeName', ['水波纹', '火焰', '烟雾', '雪花', '星空']).name('着色器')\r\n initFolder.add(this.particleParams, 'sportType', ['全随机', '随机向下', '随机向上', '直线匀速向上', '直线匀速向下']).name('运动方式')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('particle:create' as any, { ...this.particleParams })\r\n }\r\n }, 'fn').name('增加一个粒子物体')\r\n }\r\n\r\n /**\r\n * 添加粒子到列表面板\r\n */\r\n addParticlePanel(mesh: THREE.Object3D): void {\r\n if (!this.particleListFolder) return\r\n\r\n const folder = this.particleListFolder.addFolder(mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.particleListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建边界物体配置\r\n */\r\n private createBorderGroupFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('边界物体')\r\n this.borderGroupListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.borderGroupParams, 'url').name('边界物体数据源')\r\n folder.add(this.borderGroupParams, 'materialType', materialList).name('材质类型')\r\n folder.add(this.borderGroupParams, 'dlength', 0).name('低于点数舍弃')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('bordergroup:create' as any, { ...this.borderGroupParams })\r\n }\r\n }, 'fn').name('添加边界物体')\r\n }\r\n\r\n /**\r\n * 添加边界物体到列表面板\r\n */\r\n addBorderGroupPanel(group: THREE.Object3D): void {\r\n if (!this.borderGroupListFolder) return\r\n\r\n const folder = this.borderGroupListFolder.addFolder(group.name + group.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(group, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(group)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n group.parent?.remove(group)\r\n this.borderGroupListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建文本物体配置\r\n */\r\n private createTextMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('文本物体')\r\n this.textMeshListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.textMeshParams, 'fontLink').name('字体链接')\r\n folder.add(this.textMeshParams, 'materialType', materialList).name('材质类型')\r\n folder.add(this.textMeshParams, 'text').name('文本内容')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (!this.textMeshParams.text) return\r\n this.events.emit('textmesh:create' as any, { ...this.textMeshParams })\r\n }\r\n }, 'fn').name('添加文本物体')\r\n }\r\n\r\n /**\r\n * 添加文本物体到列表面板\r\n */\r\n addTextMeshPanel(mesh: THREE.Mesh): void {\r\n if (!this.textMeshListFolder) return\r\n\r\n const text = (mesh as any).text || mesh.name\r\n const folder = this.textMeshListFolder.addFolder(text + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n this.addMaterialPanel(mesh.material as THREE.Material, folder.addFolder('材质配置'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.textMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建设计物体配置\r\n */\r\n private createDesignMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('设计物体')\r\n this.designMeshListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.designMeshParams, 'type', ['镜面', '水面', '玻璃', '发光体']).name('类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('designmesh:create' as any, { type: this.designMeshParams.type })\r\n }\r\n }, 'fn').name('添加')\r\n }\r\n\r\n /**\r\n * 添加设计物体到列表面板\r\n */\r\n addDesignMeshPanel(mesh: THREE.Object3D): void {\r\n if (!this.designMeshListFolder) return\r\n\r\n const folder = this.designMeshListFolder.addFolder(mesh.id + (mesh.name || ''))\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.designMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建动画配置文件夹\r\n */\r\n private createAnimationFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.animationFolder = this._gui.addFolder('动画配置')\r\n\r\n // 视角控制\r\n this.createOrbitAnimationFolder()\r\n\r\n // 物体动画\r\n this.createMeshAnimationFolder()\r\n\r\n // 运动动画\r\n this.createMoveAnimationFolder()\r\n }\r\n\r\n /**\r\n * 创建视角控制动画\r\n */\r\n private createOrbitAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('视角控制')\r\n const orbitPlugin = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n\r\n if (!orbitPlugin?.controls) return\r\n\r\n const controls = orbitPlugin.controls\r\n const params = {\r\n autoRotate: controls.autoRotate,\r\n autoRotateSpeed: controls.autoRotateSpeed,\r\n enableDamping: controls.enableDamping,\r\n dampingFactor: controls.dampingFactor\r\n }\r\n\r\n folder.add(params, 'autoRotate').name('自动旋转').onChange((v: boolean) => {\r\n controls.autoRotate = v\r\n })\r\n\r\n folder.add(params, 'autoRotateSpeed', 0, 10, 0.1).name('旋转速度').onChange((v: number) => {\r\n controls.autoRotateSpeed = v\r\n })\r\n\r\n // 视角预设\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'front' })\r\n }\r\n }, 'fn').name('正视图')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'top' })\r\n }\r\n }, 'fn').name('俯视图')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'side' })\r\n }\r\n }, 'fn').name('侧视图')\r\n }\r\n\r\n /**\r\n * 创建物体动画配置\r\n */\r\n private createMeshAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('物体动画')\r\n\r\n const params = {\r\n duration: 2,\r\n ease: 'power2.inOut',\r\n repeat: 0,\r\n yoyo: false\r\n }\r\n\r\n folder.add(params, 'duration', 0.1, 10, 0.1).name('持续时间')\r\n folder.add(params, 'ease', ['none', 'power1.in', 'power1.out', 'power1.inOut', 'power2.in', 'power2.out', 'power2.inOut', 'elastic.out', 'bounce.out']).name('缓动函数')\r\n folder.add(params, 'repeat', -1, 10, 1).name('重复次数')\r\n folder.add(params, 'yoyo').name('往返')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:record' as any, { type: 'start', params })\r\n }\r\n }, 'fn').name('记录起始')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:record' as any, { type: 'end', params })\r\n }\r\n }, 'fn').name('记录结束')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:play' as any, { params })\r\n }\r\n }, 'fn').name('播放动画')\r\n }\r\n\r\n /**\r\n * 创建运动动画配置\r\n */\r\n private createMoveAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('运动动画')\r\n\r\n const params = {\r\n speed: 1,\r\n loop: false\r\n }\r\n\r\n folder.add(params, 'speed', 0.1, 10, 0.1).name('速度')\r\n folder.add(params, 'loop').name('循环')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'start', params })\r\n }\r\n }, 'fn').name('开始运动')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'pause', params })\r\n }\r\n }, 'fn').name('暂停运动')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'stop', params })\r\n }\r\n }, 'fn').name('停止运动')\r\n }\r\n\r\n /**\r\n * 创建选择面板 - 选择子物体\r\n */\r\n createSelectMeshPanel(model: THREE.Object3D): void {\r\n this.destroySelectPanel()\r\n\r\n if (!this._gui) return\r\n\r\n this.selectPanel = this._gui.addFolder('#:' + model.name + '配置')\r\n\r\n // 基础配置\r\n this.addMeshControlPanel(model, this.selectPanel.addFolder('基础配置'))\r\n\r\n // 材质配置\r\n if ((model as THREE.Mesh).isMesh) {\r\n const mesh = model as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((mat, index) => {\r\n this.addMaterialPanel(mat, this.selectPanel!.addFolder('材质配置' + index))\r\n })\r\n } else {\r\n this.addMaterialPanel(mesh.material, this.selectPanel.addFolder('材质配置'))\r\n }\r\n }\r\n\r\n // 着色器配置\r\n this.addShaderPanel(model, this.selectPanel.addFolder('着色器配置'))\r\n\r\n // 设计配置\r\n this.addDesignPanel(model, this.selectPanel.addFolder('设计配置'))\r\n\r\n this.selectPanel.open()\r\n }\r\n\r\n /**\r\n * 创建选择面板 - 选择根物体\r\n */\r\n createSelectRootGroupPanel(model: THREE.Object3D): void {\r\n if (!(model as any).RootMaterials) {\r\n this.createSelectMeshPanel(model)\r\n return\r\n }\r\n\r\n this.destroySelectPanel()\r\n\r\n if (!this._gui) return\r\n\r\n this.selectPanel = this._gui.addFolder('$:' + model.name + '配置')\r\n\r\n // 基础配置\r\n this.addMeshControlPanel(model, this.selectPanel.addFolder('基础配置'))\r\n\r\n // 遍历材质配置\r\n const rootMaterials = (model as any).RootMaterials as THREE.Material[]\r\n if (rootMaterials && rootMaterials.length > 0) {\r\n const matFolder = this.selectPanel.addFolder('遍历材质配置')\r\n rootMaterials.forEach((mat, index) => {\r\n this.addMaterialPanel(mat, matFolder.addFolder('材质' + index))\r\n })\r\n }\r\n\r\n // 着色器配置\r\n this.addShaderPanel(model, this.selectPanel.addFolder('着色器配置'))\r\n\r\n this.selectPanel.open()\r\n }\r\n\r\n /**\r\n * 销毁选择面板\r\n */\r\n destroySelectPanel(): void {\r\n if (this.selectPanel && this._gui) {\r\n this._gui.removeFolder(this.selectPanel)\r\n this.selectPanel = null\r\n }\r\n }\r\n\r\n /**\r\n * 添加着色器面板\r\n */\r\n private addShaderPanel(model: THREE.Object3D, folder: GUI): void {\r\n const params = {\r\n shaderType: '无',\r\n intensity: 1\r\n }\r\n\r\n folder.add(params, 'shaderType', ['无', '发光', '扫描', '流动', '渐变']).name('着色器类型').onChange((v: string) => {\r\n this.events.emit('shader:apply' as any, { model, type: v, intensity: params.intensity })\r\n })\r\n\r\n folder.add(params, 'intensity', 0, 5, 0.1).name('强度').onChange((v: number) => {\r\n this.events.emit('shader:update' as any, { model, intensity: v })\r\n })\r\n }\r\n\r\n /**\r\n * 添加设计面板\r\n */\r\n private addDesignPanel(model: THREE.Object3D, folder: GUI): void {\r\n const params = {\r\n reflector: false,\r\n refractor: false\r\n }\r\n\r\n folder.add(params, 'reflector').name('镜面反射').onChange((v: boolean) => {\r\n this.events.emit('design:reflector' as any, { model, enabled: v })\r\n })\r\n\r\n folder.add(params, 'refractor').name('折射').onChange((v: boolean) => {\r\n this.events.emit('design:refractor' as any, { model, enabled: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建几何体\r\n */\r\n private createGeometry(type: string): THREE.BufferGeometry {\r\n switch (type) {\r\n case '立方体':\r\n return new THREE.BoxGeometry(1, 1, 1)\r\n case '球体':\r\n return new THREE.SphereGeometry(0.5, 32, 32)\r\n case '圆柱体':\r\n return new THREE.CylinderGeometry(0.5, 0.5, 1, 32)\r\n case '圆锥体':\r\n return new THREE.ConeGeometry(0.5, 1, 32)\r\n case '圆环':\r\n return new THREE.TorusGeometry(0.5, 0.2, 16, 100)\r\n case '平面':\r\n return new THREE.PlaneGeometry(1, 1)\r\n case '圆环结':\r\n return new THREE.TorusKnotGeometry(0.5, 0.15, 100, 16)\r\n case '十二面体':\r\n return new THREE.DodecahedronGeometry(0.5)\r\n case '二十面体':\r\n return new THREE.IcosahedronGeometry(0.5)\r\n case '八面体':\r\n return new THREE.OctahedronGeometry(0.5)\r\n case '四面体':\r\n return new THREE.TetrahedronGeometry(0.5)\r\n default:\r\n return new THREE.BoxGeometry(1, 1, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 创建材质\r\n */\r\n private createMaterial(type: string): THREE.Material {\r\n switch (type) {\r\n case '基础材质':\r\n return new THREE.MeshBasicMaterial({ color: 0xffffff })\r\n case '标准材质':\r\n return new THREE.MeshStandardMaterial({ color: 0xffffff, metalness: 0.5, roughness: 0.5 })\r\n case 'Lambert材质':\r\n return new THREE.MeshLambertMaterial({ color: 0xffffff })\r\n case 'Phong材质':\r\n return new THREE.MeshPhongMaterial({ color: 0xffffff })\r\n case '物理材质':\r\n return new THREE.MeshPhysicalMaterial({ color: 0xffffff, metalness: 0.5, roughness: 0.5 })\r\n case 'Toon材质':\r\n return new THREE.MeshToonMaterial({ color: 0xffffff })\r\n default:\r\n return new THREE.MeshStandardMaterial({ color: 0xffffff })\r\n }\r\n }\r\n\r\n /**\r\n * 打开文件对话框\r\n */\r\n private openFileDialog(accept: string, callback: (file: File) => void): void {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = accept\r\n input.onchange = (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n callback(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n /**\r\n * 添加自定义文件夹\r\n */\r\n addFolder(name: string): GUI | null {\r\n return this._gui?.addFolder(name) ?? null\r\n }\r\n\r\n /**\r\n * 设置 GUI DOM 位置\r\n */\r\n setPosition(container: HTMLElement): void {\r\n if (this._gui && this._gui.domElement) {\r\n container.appendChild(this._gui.domElement)\r\n }\r\n }\r\n\r\n /**\r\n * 更新显示\r\n */\r\n updateDisplay(): void {\r\n // dat.gui 没有全局 updateDisplay,需要遍历所有控制器\r\n }\r\n\r\n /**\r\n * 显示 GUI\r\n */\r\n show(): void {\r\n if (this._gui) {\r\n this._gui.show()\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏 GUI\r\n */\r\n hide(): void {\r\n if (this._gui) {\r\n this._gui.hide()\r\n }\r\n }\r\n\r\n /**\r\n * 销毁 GUI\r\n */\r\n destroy(): void {\r\n if (this._gui) {\r\n this._gui.destroy()\r\n this._gui = null\r\n }\r\n this.sceneFolder = null\r\n this.controlFolder = null\r\n this.meshFolder = null\r\n this.animationFolder = null\r\n this.selectPanel = null\r\n this.modelListFolder = null\r\n this.innerMeshListFolder = null\r\n this.drawMeshListFolder = null\r\n this.geoMapListFolder = null\r\n this.particleListFolder = null\r\n this.borderGroupListFolder = null\r\n this.textMeshListFolder = null\r\n this.designMeshListFolder = null\r\n this.lightListFolder = null\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): GUIPluginConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: string): void {\r\n this.handlerParams.mode = mode\r\n }\r\n\r\n /**\r\n * 获取当前模式\r\n */\r\n getMode(): string {\r\n return this.handlerParams.mode\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport Stats from 'three/examples/jsm/libs/stats.module.js'\r\nimport { ViewHelper } from 'three/examples/jsm/helpers/ViewHelper.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 辅助工具配置\r\n */\r\nexport interface GizmoPluginConfig {\r\n // 网格配置\r\n grid: {\r\n enabled: boolean\r\n size: number\r\n divisions: number\r\n colorCenterLine: number\r\n colorGrid: number\r\n }\r\n // 坐标轴配置\r\n axes: {\r\n enabled: boolean\r\n size: number\r\n }\r\n // 性能监控配置\r\n stats: {\r\n enabled: boolean\r\n mode: 0 | 1 | 2\r\n }\r\n // 视图助手配置\r\n viewHelper: {\r\n enabled: boolean\r\n size: number\r\n position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\r\n }\r\n // Box3 辅助配置\r\n box3Helper: {\r\n enabled: boolean\r\n color: number\r\n }\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_GIZMO_CONFIG: GizmoPluginConfig = {\r\n grid: {\r\n enabled: true,\r\n size: 100,\r\n divisions: 100,\r\n colorCenterLine: 0x444444,\r\n colorGrid: 0x888888\r\n },\r\n axes: {\r\n enabled: true,\r\n size: 5\r\n },\r\n stats: {\r\n enabled: false,\r\n mode: 0\r\n },\r\n viewHelper: {\r\n enabled: false,\r\n size: 128,\r\n position: 'bottom-right'\r\n },\r\n box3Helper: {\r\n enabled: false,\r\n color: 0xffff00\r\n }\r\n}\r\n\r\n/**\r\n * 辅助工具插件\r\n * 提供网格、坐标轴、性能监控、视图助手等辅助功能\r\n */\r\nexport class GizmoPlugin extends Plugin<GizmoPluginConfig> {\r\n readonly name = 'gizmo'\r\n\r\n /** 网格辅助 */\r\n private gridHelper: THREE.GridHelper | null = null\r\n\r\n /** 坐标轴辅助 */\r\n private axesHelper: THREE.AxesHelper | null = null\r\n\r\n /** 性能监控 */\r\n private stats: Stats | null = null\r\n\r\n /** 视图助手 */\r\n private viewHelper: ViewHelper | null = null\r\n\r\n /** Box3 辅助 */\r\n private box3Helper: THREE.Box3Helper | null = null\r\n\r\n /** 当前选中物体的 Box3 */\r\n private currentBox3: THREE.Box3 | null = null\r\n\r\n constructor(config?: Partial<GizmoPluginConfig>) {\r\n super({ ...DEFAULT_GIZMO_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 初始化各辅助工具\r\n if (this.config.grid.enabled) {\r\n this.createGridHelper()\r\n }\r\n if (this.config.axes.enabled) {\r\n this.createAxesHelper()\r\n }\r\n if (this.config.stats.enabled) {\r\n this.createStats()\r\n }\r\n if (this.config.viewHelper.enabled) {\r\n this.createViewHelper()\r\n }\r\n\r\n // 监听选择事件,更新 Box3\r\n this.subscribe('object:selected', (data) => {\r\n if (data.object) {\r\n this.onObjectSelected(data.object)\r\n }\r\n })\r\n this.subscribe('object:deselected', () => this.onObjectDeselected())\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.removeGridHelper()\r\n this.removeAxesHelper()\r\n this.removeStats()\r\n this.removeViewHelper()\r\n this.removeBox3Helper()\r\n }\r\n\r\n /**\r\n * 创建网格辅助\r\n */\r\n createGridHelper(): THREE.GridHelper {\r\n this.removeGridHelper()\r\n\r\n const { size, divisions, colorCenterLine, colorGrid } = this.config.grid\r\n this.gridHelper = new THREE.GridHelper(size, divisions, colorCenterLine, colorGrid)\r\n this.gridHelper.name = '__gridHelper__'\r\n this.scene.add(this.gridHelper)\r\n\r\n return this.gridHelper\r\n }\r\n\r\n /**\r\n * 移除网格辅助\r\n */\r\n removeGridHelper(): void {\r\n if (this.gridHelper) {\r\n this.scene.remove(this.gridHelper)\r\n this.gridHelper.dispose()\r\n this.gridHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置网格可见性\r\n */\r\n setGridVisible(visible: boolean): void {\r\n if (visible && !this.gridHelper) {\r\n this.createGridHelper()\r\n } else if (!visible && this.gridHelper) {\r\n this.removeGridHelper()\r\n }\r\n this.config.grid.enabled = visible\r\n }\r\n\r\n /**\r\n * 更新网格配置\r\n */\r\n updateGrid(config: Partial<GizmoPluginConfig['grid']>): void {\r\n Object.assign(this.config.grid, config)\r\n if (this.config.grid.enabled) {\r\n this.createGridHelper()\r\n }\r\n }\r\n\r\n /**\r\n * 创建坐标轴辅助\r\n */\r\n createAxesHelper(): THREE.AxesHelper {\r\n this.removeAxesHelper()\r\n\r\n this.axesHelper = new THREE.AxesHelper(this.config.axes.size)\r\n this.axesHelper.name = '__axesHelper__'\r\n this.scene.add(this.axesHelper)\r\n\r\n return this.axesHelper\r\n }\r\n\r\n /**\r\n * 移除坐标轴辅助\r\n */\r\n removeAxesHelper(): void {\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper)\r\n this.axesHelper.dispose()\r\n this.axesHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置坐标轴可见性\r\n */\r\n setAxesVisible(visible: boolean): void {\r\n if (visible && !this.axesHelper) {\r\n this.createAxesHelper()\r\n } else if (!visible && this.axesHelper) {\r\n this.removeAxesHelper()\r\n }\r\n this.config.axes.enabled = visible\r\n }\r\n\r\n /**\r\n * 更新坐标轴配置\r\n */\r\n updateAxes(config: Partial<GizmoPluginConfig['axes']>): void {\r\n Object.assign(this.config.axes, config)\r\n if (this.config.axes.enabled) {\r\n this.createAxesHelper()\r\n }\r\n }\r\n\r\n /**\r\n * 创建性能监控\r\n */\r\n createStats(): Stats {\r\n this.removeStats()\r\n\r\n this.stats = new Stats()\r\n this.stats.showPanel(this.config.stats.mode)\r\n this.stats.dom.style.position = 'absolute'\r\n this.stats.dom.style.top = '0'\r\n this.stats.dom.style.left = '0'\r\n\r\n this.renderer.domElement.parentElement?.appendChild(this.stats.dom)\r\n\r\n return this.stats\r\n }\r\n\r\n /**\r\n * 移除性能监控\r\n */\r\n removeStats(): void {\r\n if (this.stats) {\r\n this.stats.dom.parentElement?.removeChild(this.stats.dom)\r\n this.stats = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置性能监控可见性\r\n */\r\n setStatsVisible(visible: boolean): void {\r\n if (visible && !this.stats) {\r\n this.createStats()\r\n } else if (!visible && this.stats) {\r\n this.removeStats()\r\n }\r\n this.config.stats.enabled = visible\r\n }\r\n\r\n /**\r\n * 设置性能监控模式\r\n */\r\n setStatsMode(mode: 0 | 1 | 2): void {\r\n this.config.stats.mode = mode\r\n if (this.stats) {\r\n this.stats.showPanel(mode)\r\n }\r\n }\r\n\r\n /**\r\n * 更新性能监控\r\n */\r\n updateStats(): void {\r\n if (this.stats) {\r\n this.stats.update()\r\n }\r\n }\r\n\r\n /**\r\n * 创建视图助手\r\n * Note: ViewHelper API varies between Three.js versions\r\n */\r\n createViewHelper(): ViewHelper | null {\r\n this.removeViewHelper()\r\n\r\n try {\r\n // ViewHelper requires a DOM element in newer versions\r\n const container = this.renderer.domElement.parentElement\r\n if (!container) return null\r\n\r\n this.viewHelper = new ViewHelper(this.camera, container as HTMLElement)\r\n return this.viewHelper\r\n } catch (e) {\r\n console.warn('ViewHelper creation failed:', e)\r\n return null\r\n }\r\n }\r\n\r\n /**\r\n * 移除视图助手\r\n */\r\n removeViewHelper(): void {\r\n if (this.viewHelper) {\r\n this.viewHelper.dispose()\r\n this.viewHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置视图助手可见性\r\n */\r\n setViewHelperVisible(visible: boolean): void {\r\n if (visible && !this.viewHelper) {\r\n this.createViewHelper()\r\n } else if (!visible && this.viewHelper) {\r\n this.removeViewHelper()\r\n }\r\n this.config.viewHelper.enabled = visible\r\n }\r\n\r\n /**\r\n * 渲染视图助手\r\n */\r\n renderViewHelper(delta: number): void {\r\n if (this.viewHelper) {\r\n this.viewHelper.render(this.renderer)\r\n if (this.viewHelper.animating) {\r\n this.viewHelper.update(delta)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 创建 Box3 辅助\r\n */\r\n createBox3Helper(object: THREE.Object3D): THREE.Box3Helper {\r\n this.removeBox3Helper()\r\n\r\n this.currentBox3 = new THREE.Box3().setFromObject(object)\r\n this.box3Helper = new THREE.Box3Helper(this.currentBox3, new THREE.Color(this.config.box3Helper.color))\r\n this.box3Helper.name = '__box3Helper__'\r\n this.scene.add(this.box3Helper)\r\n\r\n return this.box3Helper\r\n }\r\n\r\n /**\r\n * 更新 Box3 辅助\r\n */\r\n updateBox3Helper(object: THREE.Object3D): void {\r\n if (this.currentBox3 && this.box3Helper) {\r\n this.currentBox3.setFromObject(object)\r\n }\r\n }\r\n\r\n /**\r\n * 移除 Box3 辅助\r\n */\r\n removeBox3Helper(): void {\r\n if (this.box3Helper) {\r\n this.scene.remove(this.box3Helper)\r\n this.box3Helper.dispose()\r\n this.box3Helper = null\r\n this.currentBox3 = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置 Box3 辅助可见性\r\n */\r\n setBox3HelperVisible(visible: boolean): void {\r\n this.config.box3Helper.enabled = visible\r\n if (!visible) {\r\n this.removeBox3Helper()\r\n }\r\n }\r\n\r\n /**\r\n * 物体选中事件处理\r\n */\r\n private onObjectSelected(object: THREE.Object3D): void {\r\n if (this.config.box3Helper.enabled) {\r\n this.createBox3Helper(object)\r\n }\r\n }\r\n\r\n /**\r\n * 物体取消选中事件处理\r\n */\r\n private onObjectDeselected(): void {\r\n this.removeBox3Helper()\r\n }\r\n\r\n /**\r\n * 获取网格辅助\r\n */\r\n getGridHelper(): THREE.GridHelper | null {\r\n return this.gridHelper\r\n }\r\n\r\n /**\r\n * 获取坐标轴辅助\r\n */\r\n getAxesHelper(): THREE.AxesHelper | null {\r\n return this.axesHelper\r\n }\r\n\r\n /**\r\n * 获取性能监控\r\n */\r\n getStats(): Stats | null {\r\n return this.stats\r\n }\r\n\r\n /**\r\n * 获取视图助手\r\n */\r\n getViewHelper(): ViewHelper | null {\r\n return this.viewHelper\r\n }\r\n\r\n /**\r\n * 获取 Box3 辅助\r\n */\r\n getBox3Helper(): THREE.Box3Helper | null {\r\n return this.box3Helper\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): GizmoPluginConfig {\r\n return { ...this.config }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\n\r\n/**\r\n * 获取两点之间指定比例的点\r\n * @param point1 起点\r\n * @param point2 终点\r\n * @param scale 比例 (0-1)\r\n * @returns 比例点\r\n */\r\nexport function getDistanceScalePoint(\r\n point1: THREE.Vector3,\r\n point2: THREE.Vector3,\r\n scale: number = 0.9\r\n): THREE.Vector3 {\r\n const distance = point1.distanceTo(point2)\r\n const direction = new THREE.Vector3().subVectors(point2, point1).normalize()\r\n return direction.multiplyScalar(distance * scale).add(point1)\r\n}\r\n\r\n/**\r\n * 获取两点之间指定距离的点\r\n * @param point1 起点\r\n * @param point2 终点\r\n * @param distance 距离\r\n * @returns 距离点\r\n */\r\nexport function getPointAtDistance(\r\n point1: THREE.Vector3,\r\n point2: THREE.Vector3,\r\n distance: number\r\n): THREE.Vector3 {\r\n const direction = new THREE.Vector3().subVectors(point2, point1).normalize()\r\n return direction.multiplyScalar(distance).add(point1)\r\n}\r\n\r\n/**\r\n * 角度转弧度\r\n */\r\nexport function degToRad(degrees: number): number {\r\n return degrees * (Math.PI / 180)\r\n}\r\n\r\n/**\r\n * 弧度转角度\r\n */\r\nexport function radToDeg(radians: number): number {\r\n return radians * (180 / Math.PI)\r\n}\r\n\r\n/**\r\n * 限制值在范围内\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value))\r\n}\r\n\r\n/**\r\n * 线性插值\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t\r\n}\r\n\r\n/**\r\n * 平滑插值\r\n */\r\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\r\n const t = clamp((x - edge0) / (edge1 - edge0), 0, 1)\r\n return t * t * (3 - 2 * t)\r\n}\r\n","import * as THREE from 'three'\r\nimport type { Box3Info, ViewAngle } from '../types/core.types'\r\nimport { getPointAtDistance } from './math'\r\n\r\n/**\r\n * 获取物体的包围盒信息\r\n * @param object 物体\r\n * @returns 包围盒信息\r\n */\r\nexport function getObjectBox3(object: THREE.Object3D): Box3Info {\r\n const box = new THREE.Box3().setFromObject(object)\r\n const { max, min } = box\r\n\r\n const center = new THREE.Vector3()\r\n box.getCenter(center)\r\n\r\n const radius = new THREE.Vector3().subVectors(max, min).length() / 2\r\n\r\n return { max, min, center, radius }\r\n}\r\n\r\n/**\r\n * 获取物体的最佳观察视角\r\n * @param object 物体\r\n * @param scale 视角缩放比例\r\n * @returns 视角信息\r\n */\r\nexport function getBestViewTarget(object: THREE.Object3D, scale: number = 2.5): ViewAngle {\r\n const { center, max } = getObjectBox3(object)\r\n const distance = new THREE.Vector3().subVectors(max, center).length() * scale\r\n const position = getPointAtDistance(center, max, distance)\r\n\r\n return { position, target: center }\r\n}\r\n\r\n/**\r\n * 获取物体的六个视图位置\r\n * @param object 物体\r\n * @param fov 相机视野角度\r\n * @returns 六个视图位置\r\n */\r\nexport function getObjectViews(object: THREE.Object3D, fov: number = 50) {\r\n const { center, max, min, radius } = getObjectBox3(object)\r\n\r\n // 计算相机距离\r\n const distance = radius / Math.tan((fov * Math.PI) / 360)\r\n\r\n return {\r\n frontView: new THREE.Vector3(center.x, center.y, max.z + distance),\r\n backView: new THREE.Vector3(center.x, center.y, min.z - distance),\r\n leftView: new THREE.Vector3(min.x - distance, center.y, center.z),\r\n rightView: new THREE.Vector3(max.x + distance, center.y, center.z),\r\n topView: new THREE.Vector3(center.x, max.y + distance, center.z),\r\n bottomView: new THREE.Vector3(center.x, min.y - distance, center.z),\r\n target: center\r\n }\r\n}\r\n\r\n/**\r\n * 创建包围盒辅助器\r\n * @param color 颜色\r\n * @returns Box3Helper\r\n */\r\nexport function createBox3Helper(color: number = 0xffff00): THREE.Box3Helper {\r\n const box = new THREE.Box3()\r\n const helper = new THREE.Box3Helper(box, color)\r\n helper.name = 'Box3Helper'\r\n helper.visible = false\r\n return helper\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ShaderPluginConfig } from '../../types/config.types'\r\n\r\n/**\r\n * 着色器 Uniform 定义\r\n */\r\nexport interface ShaderUniform {\r\n type: string\r\n value: any\r\n unit: string\r\n}\r\n\r\n/**\r\n * 着色器预设\r\n */\r\nexport interface ShaderPreset {\r\n name: string\r\n uniforms: Record<string, ShaderUniform>\r\n vertexHeader?: string\r\n fragHeader: string\r\n fragFunc?: string\r\n fragBody: string\r\n animate?: (uniforms: Record<string, ShaderUniform>, delta: number) => void\r\n}\r\n\r\n/**\r\n * 着色器控制器\r\n */\r\nexport interface ShaderController {\r\n uniforms: Record<string, ShaderUniform>\r\n update: () => void\r\n destroy: () => void\r\n}\r\n\r\n/**\r\n * 默认着色器配置\r\n */\r\nexport const DEFAULT_SHADER_CONFIG: ShaderPluginConfig = {\r\n speed: 0.01,\r\n mixRatio: 0.5\r\n}\r\n\r\n/**\r\n * 着色器插件\r\n * 提供着色器混合和预设管理功能\r\n */\r\nexport class ShaderPlugin extends Plugin<ShaderPluginConfig> {\r\n readonly name = 'shader'\r\n\r\n /** 预设着色器库 */\r\n private presets = new Map<string, ShaderPreset>()\r\n\r\n /** 已应用着色器的物体 */\r\n private appliedObjects = new Map<THREE.Object3D, ShaderController>()\r\n\r\n /** 着色器动画列表 */\r\n private shaderAnimations: Array<{ object: THREE.Object3D; controller: ShaderController }> = []\r\n\r\n constructor(config?: Partial<ShaderPluginConfig>) {\r\n super({ ...DEFAULT_SHADER_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 注册内置预设\r\n this.registerBuiltinPresets()\r\n }\r\n\r\n protected onUninstall(): void {\r\n // 移除所有着色器\r\n for (const [object] of this.appliedObjects) {\r\n this.remove(object)\r\n }\r\n this.presets.clear()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新着色器动画\r\n for (const { controller } of this.shaderAnimations) {\r\n controller.update()\r\n }\r\n }\r\n\r\n /**\r\n * 注册内置预设着色器\r\n */\r\n private registerBuiltinPresets(): void {\r\n // 彩虹光\r\n this.registerPreset('彩虹光', {\r\n name: '彩虹光',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n vec3 rainbow = vec3(\r\n sin(vUv.x * 10.0 + iTime) * 0.5 + 0.5,\r\n sin(vUv.y * 10.0 + iTime + 2.094) * 0.5 + 0.5,\r\n sin((vUv.x + vUv.y) * 5.0 + iTime + 4.188) * 0.5 + 0.5\r\n );\r\n vec4 diffuseColor = vec4(mix(diffuse, rainbow, mixRatio), opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.5\r\n }\r\n })\r\n\r\n // 水波纹\r\n this.registerPreset('水波纹', {\r\n name: '水波纹',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float wave = sin(length(vUv - 0.5) * 20.0 - iTime * 3.0) * 0.5 + 0.5;\r\n vec3 waterColor = mix(diffuse, vec3(0.0, 0.5, 1.0), wave * mixRatio);\r\n vec4 diffuseColor = vec4(waterColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 光圈扫射\r\n this.registerPreset('光圈扫射', {\r\n name: '光圈扫射',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n circleWidth: { type: 'number', value: 0.1, unit: 'float' },\r\n isDisCard: { type: 'bool', value: false, unit: 'bool' }\r\n },\r\n fragHeader: this.getUniformDeclarations({\r\n ...this.getCommonUniforms(),\r\n circleWidth: { type: 'number', value: 0.1, unit: 'float' },\r\n isDisCard: { type: 'bool', value: false, unit: 'bool' }\r\n }),\r\n fragBody: `\r\n float dist = length(vUv - 0.5);\r\n float circle = smoothstep(iTime - circleWidth, iTime, dist) - smoothstep(iTime, iTime + circleWidth, dist);\r\n vec3 scanColor = mix(diffuse, mixColor, circle * intensity);\r\n vec4 diffuseColor = vec4(scanColor, opacity);\r\n if (isDisCard && circle < 0.01) discard;\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.3\r\n if (uniforms.iTime.value > 1.0) uniforms.iTime.value = 0.0\r\n }\r\n })\r\n\r\n // 流光围栏\r\n this.registerPreset('流光围栏', {\r\n name: '流光围栏',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float flow = fract(vUv.y - iTime * speed * 10.0);\r\n vec3 fenceColor = mix(diffuse, mixColor, flow * intensity);\r\n vec4 diffuseColor = vec4(fenceColor, opacity * (1.0 - flow * 0.5));\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光围栏2\r\n this.registerPreset('流光围栏2', {\r\n name: '流光围栏2',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float gradient = 1.0 - vUv.y;\r\n float flow = fract(vUv.y * 2.0 - iTime * speed * 5.0);\r\n vec3 fenceColor = mix(diffuse, mixColor, flow * gradient * intensity);\r\n vec4 diffuseColor = vec4(fenceColor, opacity * gradient);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 雪片着色\r\n this.registerPreset('雪片着色', {\r\n name: '雪片着色',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float snow = fract(sin(dot(vUv, vec2(12.9898, 78.233)) + iTime) * 43758.5453);\r\n vec3 snowColor = mix(diffuse, vec3(1.0), snow * mixRatio * 0.3);\r\n vec4 diffuseColor = vec4(snowColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.1\r\n }\r\n })\r\n\r\n // 光线叠加\r\n this.registerPreset('光线叠加', {\r\n name: '光线叠加',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float glow = pow(1.0 - length(vUv - 0.5) * 2.0, 2.0);\r\n vec3 glowColor = diffuse + mixColor * glow * intensity;\r\n vec4 diffuseColor = vec4(glowColor, opacity);\r\n `\r\n })\r\n\r\n // 绚烂线条\r\n this.registerPreset('绚烂线条', {\r\n name: '绚烂线条',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float line = abs(sin(vUv.x * 50.0 + iTime * 2.0)) * abs(sin(vUv.y * 50.0 + iTime * 2.0));\r\n vec3 lineColor = mix(diffuse, mixColor, line * intensity);\r\n vec4 diffuseColor = vec4(lineColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光闪电\r\n this.registerPreset('流光闪电', {\r\n name: '流光闪电',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float lightning = pow(fract(sin(vUv.x * 100.0 + iTime * 10.0) * 43758.5453), 10.0);\r\n vec3 lightningColor = mix(diffuse, vec3(0.8, 0.9, 1.0), lightning * intensity);\r\n vec4 diffuseColor = vec4(lightningColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 火焰燃烧\r\n this.registerPreset('火焰燃烧', {\r\n name: '火焰燃烧',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float noise = fract(sin(dot(vUv + iTime * 0.1, vec2(12.9898, 78.233))) * 43758.5453);\r\n float fire = pow(1.0 - vUv.y, 2.0) * noise;\r\n vec3 fireColor = mix(vec3(1.0, 0.3, 0.0), vec3(1.0, 0.8, 0.0), fire);\r\n vec3 finalColor = mix(diffuse, fireColor, fire * intensity);\r\n vec4 diffuseColor = vec4(finalColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光栅格\r\n this.registerPreset('流光栅格', {\r\n name: '流光栅格',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float gridX = step(0.9, fract(vUv.x * 10.0));\r\n float gridY = step(0.9, fract(vUv.y * 10.0));\r\n float grid = max(gridX, gridY);\r\n float flow = fract(vUv.x + vUv.y - iTime * speed * 2.0);\r\n vec3 gridColor = mix(diffuse, mixColor, grid * flow * intensity);\r\n vec4 diffuseColor = vec4(gridColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 着色天空\r\n this.registerPreset('着色天空', {\r\n name: '着色天空',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n topColor: { type: 'color', value: new THREE.Color(0x0077ff), unit: 'vec3' },\r\n bottomColor: { type: 'color', value: new THREE.Color(0xffffff), unit: 'vec3' },\r\n offset: { type: 'number', value: 0.0, unit: 'float' },\r\n exponent: { type: 'number', value: 0.6, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 topColor;\r\n uniform vec3 bottomColor;\r\n uniform float offset;\r\n uniform float exponent;\r\n varying vec3 vWorldPosition;\r\n `,\r\n vertexHeader: `\r\n varying vec3 vWorldPosition;\r\n void main() {\r\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\r\n vWorldPosition = worldPosition.xyz;\r\n `,\r\n fragBody: `\r\n float h = normalize(vWorldPosition + offset).y;\r\n vec3 skyColor = mix(bottomColor, topColor, max(pow(max(h, 0.0), exponent), 0.0));\r\n vec4 diffuseColor = vec4(skyColor, opacity);\r\n `\r\n })\r\n\r\n // 水面着色\r\n this.registerPreset('水面着色', {\r\n name: '水面着色',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n waterColor: { type: 'color', value: new THREE.Color(0x001e0f), unit: 'vec3' },\r\n waveHeight: { type: 'number', value: 0.1, unit: 'float' },\r\n waveSpeed: { type: 'number', value: 1.0, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 waterColor;\r\n uniform float waveHeight;\r\n uniform float waveSpeed;\r\n ${this.getUniformDeclarations(this.getCommonUniforms())}\r\n `,\r\n fragBody: `\r\n float wave1 = sin(vUv.x * 10.0 + iTime * waveSpeed) * waveHeight;\r\n float wave2 = sin(vUv.y * 8.0 + iTime * waveSpeed * 0.8) * waveHeight;\r\n float wave = (wave1 + wave2) * 0.5 + 0.5;\r\n vec3 finalColor = mix(waterColor, mixColor, wave * intensity);\r\n vec4 diffuseColor = vec4(finalColor, opacity * 0.8);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 热力图\r\n this.registerPreset('热力图', {\r\n name: '热力图',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n Points: { type: 'array', value: [], unit: 'vec3' },\r\n PointsCount: { type: 'number', value: 0, unit: 'int' },\r\n radius: { type: 'number', value: 0.3, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 Points[100];\r\n uniform int PointsCount;\r\n uniform float radius;\r\n ${this.getUniformDeclarations(this.getCommonUniforms())}\r\n `,\r\n fragBody: `\r\n float heat = 0.0;\r\n for (int i = 0; i < 100; i++) {\r\n if (i >= PointsCount) break;\r\n float dist = distance(vec2(vUv.x, vUv.y), Points[i].xy);\r\n heat += Points[i].z * smoothstep(radius, 0.0, dist);\r\n }\r\n heat = clamp(heat, 0.0, 1.0);\r\n vec3 heatColor = mix(vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), heat);\r\n heatColor = mix(heatColor, vec3(1.0, 1.0, 0.0), smoothstep(0.5, 1.0, heat));\r\n vec4 diffuseColor = vec4(mix(diffuse, heatColor, heat * intensity), opacity);\r\n `\r\n })\r\n\r\n // 晶片着色\r\n this.registerPreset('晶片着色', {\r\n name: '晶片着色',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n vec2 cell = floor(vUv * 20.0);\r\n float noise = fract(sin(dot(cell, vec2(12.9898, 78.233))) * 43758.5453);\r\n vec3 crystalColor = mix(diffuse, mixColor, noise * intensity);\r\n vec4 diffuseColor = vec4(crystalColor, opacity);\r\n `\r\n })\r\n }\r\n\r\n /**\r\n * 获取公共 Uniforms\r\n */\r\n private getCommonUniforms(): Record<string, ShaderUniform> {\r\n return {\r\n iTime: { type: 'number', value: 0.0, unit: 'float' },\r\n speed: { type: 'number', value: this.config.speed, unit: 'float' },\r\n intensity: { type: 'number', value: 1.0, unit: 'float' },\r\n mixRatio: { type: 'number', value: this.config.mixRatio, unit: 'float' },\r\n mixColor: { type: 'color', value: new THREE.Color(0xffffff), unit: 'vec3' },\r\n hasUv: { type: 'bool', value: true, unit: 'bool' }\r\n }\r\n }\r\n\r\n /**\r\n * 获取 Uniform 声明\r\n */\r\n private getUniformDeclarations(uniforms: Record<string, ShaderUniform>): string {\r\n return Object.entries(uniforms)\r\n .map(([name, uniform]) => `uniform ${uniform.unit} ${name};`)\r\n .join('\\n')\r\n }\r\n\r\n /**\r\n * 注册预设着色器\r\n */\r\n registerPreset(name: string, preset: ShaderPreset): void {\r\n this.presets.set(name, preset)\r\n }\r\n\r\n /**\r\n * 获取预设着色器\r\n */\r\n getPreset(name: string): ShaderPreset | undefined {\r\n return this.presets.get(name)\r\n }\r\n\r\n /**\r\n * 获取所有预设名称\r\n */\r\n getPresetNames(): string[] {\r\n return Array.from(this.presets.keys())\r\n }\r\n\r\n /**\r\n * 应用着色器到物体\r\n */\r\n apply(object: THREE.Object3D, presetName: string): ShaderController | null {\r\n const preset = this.presets.get(presetName)\r\n if (!preset) {\r\n console.warn(`Shader preset \"${presetName}\" not found`)\r\n return null\r\n }\r\n\r\n // 克隆 uniforms\r\n const uniforms: Record<string, ShaderUniform> = {}\r\n for (const [key, value] of Object.entries(preset.uniforms)) {\r\n uniforms[key] = {\r\n ...value,\r\n value: value.value instanceof THREE.Color\r\n ? value.value.clone()\r\n : value.value\r\n }\r\n }\r\n\r\n // 获取材质列表\r\n const materials = this.getMaterials(object)\r\n if (materials.length === 0) return null\r\n\r\n // 应用着色器到材质\r\n materials.forEach(material => {\r\n this.applyShaderToMaterial(material, uniforms, preset)\r\n })\r\n\r\n // 创建控制器\r\n const controller: ShaderController = {\r\n uniforms,\r\n update: () => {\r\n if (preset.animate) {\r\n preset.animate(uniforms, 0.016) // 约 60fps\r\n }\r\n },\r\n destroy: () => {\r\n this.remove(object)\r\n }\r\n }\r\n\r\n // 保存引用\r\n this.appliedObjects.set(object, controller)\r\n\r\n // 如果有动画,添加到动画列表\r\n if (preset.animate) {\r\n this.shaderAnimations.push({ object, controller })\r\n }\r\n\r\n // 发射事件\r\n this.events.emit('shader:applied', { object, shaderName: presetName })\r\n\r\n return controller\r\n }\r\n\r\n /**\r\n * 应用着色器到材质\r\n */\r\n private applyShaderToMaterial(\r\n material: THREE.Material,\r\n uniforms: Record<string, ShaderUniform>,\r\n preset: ShaderPreset\r\n ): void {\r\n material.dispose()\r\n\r\n material.onBeforeCompile = (shader) => {\r\n // 写入 uniforms\r\n for (const [key, uniform] of Object.entries(uniforms)) {\r\n shader.uniforms[key] = { value: uniform.value }\r\n }\r\n\r\n // 顶点着色器注入\r\n if (preset.vertexHeader) {\r\n shader.vertexShader = shader.vertexShader.replace(\r\n 'void main() {',\r\n preset.vertexHeader\r\n )\r\n }\r\n\r\n // 添加 varying vUv\r\n if (!shader.vertexShader.includes('varying vec2 vUv')) {\r\n shader.vertexShader = 'varying vec2 vUv;\\n' + shader.vertexShader\r\n shader.vertexShader = shader.vertexShader.replace(\r\n 'void main() {',\r\n 'void main() {\\nvUv = uv;'\r\n )\r\n }\r\n\r\n // 片段着色器头部注入\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n '#include <common>',\r\n `varying vec2 vUv;\\n${preset.fragHeader}\\n#include <common>\\n${preset.fragFunc || ''}`\r\n )\r\n\r\n // 片段着色器主体注入\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n 'vec4 diffuseColor = vec4( diffuse, opacity );',\r\n preset.fragBody\r\n )\r\n }\r\n\r\n material.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 移除物体的着色器\r\n */\r\n remove(object: THREE.Object3D): void {\r\n const controller = this.appliedObjects.get(object)\r\n if (!controller) return\r\n\r\n // 重置材质\r\n const materials = this.getMaterials(object)\r\n materials.forEach(material => {\r\n material.onBeforeCompile = () => {}\r\n material.dispose()\r\n material.needsUpdate = true\r\n })\r\n\r\n // 从动画列表移除\r\n const animIndex = this.shaderAnimations.findIndex(a => a.object === object)\r\n if (animIndex > -1) {\r\n this.shaderAnimations.splice(animIndex, 1)\r\n }\r\n\r\n // 移除引用\r\n this.appliedObjects.delete(object)\r\n\r\n // 发射事件\r\n this.events.emit('shader:removed', { object })\r\n }\r\n\r\n /**\r\n * 获取物体的所有材质\r\n */\r\n private getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport gsap from 'gsap'\r\nimport { Plugin } from '../Plugin'\r\nimport type { GsapQuery } from '../../types/core.types'\r\nimport type { AnimationPlayParams, CurveAnimationController, ExtendedObject3D, ViewAngle } from '../../types/core.types'\r\n\r\n/**\r\n * 动画插件配置\r\n */\r\nexport interface AnimationPluginConfig {\r\n defaultDuration: number\r\n defaultEase: string\r\n}\r\n\r\n/**\r\n * 混合器信息\r\n */\r\nexport interface MixerInfo {\r\n mixer: THREE.AnimationMixer\r\n object: THREE.Object3D\r\n actions: THREE.AnimationAction[]\r\n clock: THREE.Clock\r\n}\r\n\r\n/**\r\n * 补间动画控制器\r\n */\r\nexport interface TweenController {\r\n play: () => void\r\n pause: () => void\r\n resume: () => void\r\n kill: () => void\r\n progress: (value?: number) => number\r\n}\r\n\r\n/**\r\n * 默认动画配置\r\n */\r\nexport const DEFAULT_ANIMATION_CONFIG: AnimationPluginConfig = {\r\n defaultDuration: 2,\r\n defaultEase: 'power2.inOut'\r\n}\r\n\r\n/**\r\n * 动画插件\r\n * 提供模型动画、补间动画、路径动画等功能\r\n */\r\nexport class AnimationPlugin extends Plugin<AnimationPluginConfig> {\r\n readonly name = 'animation'\r\n\r\n /** 混合器列表 */\r\n private mixers: MixerInfo[] = []\r\n\r\n /** 曲线动画列表 */\r\n private curveAnimations: CurveAnimationController[] = []\r\n\r\n /** 补间动画列表 */\r\n private tweens: gsap.core.Tween[] = []\r\n\r\n constructor(config?: Partial<AnimationPluginConfig>) {\r\n super({ ...DEFAULT_ANIMATION_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n // 停止所有动画\r\n this.stopAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新混合器\r\n for (const info of this.mixers) {\r\n info.mixer.update(info.clock.getDelta())\r\n }\r\n\r\n // 更新曲线动画\r\n for (const anim of this.curveAnimations) {\r\n if (anim.pause) continue\r\n\r\n anim.time += anim.speed / 1000\r\n\r\n if (anim.time > 1 || anim.time < 0) {\r\n anim.time = anim.time > 1 ? 1 : 0\r\n anim.pause = true\r\n anim.frameEndCallback?.()\r\n continue\r\n }\r\n\r\n const point = anim.curve.getPointAt(anim.time)\r\n anim.frameCallback?.(point)\r\n }\r\n }\r\n\r\n // ============ 模型动画 ============\r\n\r\n /**\r\n * 播放模型动画\r\n */\r\n playModelAnimation(\r\n object: ExtendedObject3D,\r\n params?: Partial<AnimationPlayParams>\r\n ): MixerInfo | null {\r\n const obj = object as THREE.Object3D\r\n const animations = (object as any).animations as THREE.AnimationClip[] | undefined\r\n \r\n if (!animations || animations.length === 0) {\r\n console.warn('Object has no animations')\r\n return null\r\n }\r\n\r\n const defaultParams: AnimationPlayParams = {\r\n initPlay: true,\r\n speed: 1,\r\n actionIndexs: animations.map(() => true),\r\n startTime: 0,\r\n loop: true\r\n }\r\n\r\n const playParams = { ...defaultParams, ...params, ...(object as any).animationPlayParams }\r\n\r\n const clock = new THREE.Clock()\r\n const mixer = new THREE.AnimationMixer(obj)\r\n\r\n const actions = animations\r\n .filter((_, index) => playParams.actionIndexs[index])\r\n .map(clip => {\r\n const action = mixer.clipAction(clip)\r\n action.loop = playParams.loop ? THREE.LoopRepeat : THREE.LoopOnce\r\n action.time = playParams.startTime\r\n action.timeScale = playParams.speed\r\n action.clampWhenFinished = true\r\n if (playParams.initPlay) {\r\n action.play()\r\n }\r\n return action\r\n })\r\n\r\n const info: MixerInfo = { mixer, object: obj, actions, clock }\r\n this.mixers.push(info)\r\n\r\n // 保存到物体\r\n ;(object as any).animationPlayParams = playParams\r\n\r\n this.events.emit('animation:start', { object: obj })\r\n\r\n return info\r\n }\r\n\r\n /**\r\n * 停止模型动画\r\n */\r\n stopModelAnimation(object: THREE.Object3D): void {\r\n const index = this.mixers.findIndex(m => m.object === object)\r\n if (index > -1) {\r\n const info = this.mixers[index]\r\n info.actions.forEach(action => action.stop())\r\n this.mixers.splice(index, 1)\r\n this.events.emit('animation:stop', { object })\r\n }\r\n }\r\n\r\n /**\r\n * 暂停/恢复模型动画\r\n */\r\n toggleModelAnimation(object: THREE.Object3D, paused: boolean): void {\r\n const info = this.mixers.find(m => m.object === object)\r\n if (info) {\r\n info.actions.forEach(action => {\r\n action.paused = paused\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 获取模型的混合器信息\r\n */\r\n getMixerInfo(object: THREE.Object3D): MixerInfo | undefined {\r\n return this.mixers.find(m => m.object === object)\r\n }\r\n\r\n // ============ 补间动画 ============\r\n\r\n /**\r\n * 创建补间动画\r\n */\r\n tween(\r\n target: object,\r\n to: object,\r\n query?: GsapQuery\r\n ): TweenController {\r\n const tween = gsap.to(target, {\r\n ...to,\r\n duration: query?.duration ?? this.config.defaultDuration,\r\n ease: query?.ease ?? this.config.defaultEase,\r\n repeat: query?.repeat ?? 0,\r\n yoyo: query?.yoyo ?? false,\r\n yoyoEase: query?.yoyoEase ?? true,\r\n onUpdate: query?.onUpdate,\r\n onComplete: () => {\r\n query?.onComplete?.()\r\n // 从列表移除\r\n const index = this.tweens.indexOf(tween)\r\n if (index > -1) this.tweens.splice(index, 1)\r\n }\r\n })\r\n\r\n this.tweens.push(tween)\r\n\r\n return {\r\n play: () => tween.play(),\r\n pause: () => tween.pause(),\r\n resume: () => tween.resume(),\r\n kill: () => {\r\n tween.kill()\r\n const index = this.tweens.indexOf(tween)\r\n if (index > -1) this.tweens.splice(index, 1)\r\n },\r\n progress: (value?: number) => {\r\n if (value !== undefined) {\r\n tween.progress(value)\r\n }\r\n return tween.progress()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 相机视角动画\r\n */\r\n animateCamera(\r\n camera: THREE.Camera,\r\n controls: { target: THREE.Vector3 },\r\n viewAngle: ViewAngle,\r\n query?: GsapQuery\r\n ): Promise<void> {\r\n return Promise.all([\r\n new Promise<void>(resolve => {\r\n this.tween(camera.position, viewAngle.position, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }),\r\n new Promise<void>(resolve => {\r\n this.tween(controls.target, viewAngle.target, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n })\r\n ]).then(() => {})\r\n }\r\n\r\n /**\r\n * 物体变换动画\r\n */\r\n animateTransform(\r\n object: THREE.Object3D,\r\n transform: {\r\n position?: { x?: number; y?: number; z?: number }\r\n rotation?: { x?: number; y?: number; z?: number }\r\n scale?: { x?: number; y?: number; z?: number }\r\n },\r\n query?: GsapQuery\r\n ): Promise<void> {\r\n const promises: Promise<void>[] = []\r\n\r\n if (transform.position) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.position, transform.position!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n if (transform.rotation) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.rotation, transform.rotation!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n if (transform.scale) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.scale, transform.scale!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n return Promise.all(promises).then(() => {})\r\n }\r\n\r\n // ============ 曲线动画 ============\r\n\r\n /**\r\n * 创建曲线动画\r\n */\r\n createCurveAnimation(\r\n curve: THREE.Curve<THREE.Vector3>,\r\n speed: number = 1\r\n ): CurveAnimationController {\r\n const controller: CurveAnimationController = {\r\n id: Date.now(),\r\n curve,\r\n time: 0,\r\n pause: true,\r\n speed,\r\n frameCallback: null,\r\n frameEndCallback: null,\r\n start: () => {\r\n if (!this.curveAnimations.includes(controller)) {\r\n this.curveAnimations.push(controller)\r\n }\r\n controller.pause = false\r\n },\r\n destroy: () => {\r\n const index = this.curveAnimations.indexOf(controller)\r\n if (index > -1) {\r\n this.curveAnimations.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n return controller\r\n }\r\n\r\n /**\r\n * 物体沿曲线运动\r\n */\r\n animateAlongCurve(\r\n object: THREE.Object3D,\r\n curve: THREE.Curve<THREE.Vector3>,\r\n options?: {\r\n speed?: number\r\n lookAhead?: boolean\r\n onComplete?: () => void\r\n }\r\n ): CurveAnimationController {\r\n const controller = this.createCurveAnimation(curve, options?.speed ?? 1)\r\n\r\n controller.frameCallback = (point) => {\r\n object.position.copy(point)\r\n\r\n // 朝向前方\r\n if (options?.lookAhead) {\r\n const nextT = Math.min(controller.time + 0.01, 1)\r\n const nextPoint = curve.getPointAt(nextT)\r\n object.lookAt(nextPoint)\r\n }\r\n }\r\n\r\n controller.frameEndCallback = options?.onComplete ?? null\r\n\r\n return controller\r\n }\r\n\r\n // ============ 工具方法 ============\r\n\r\n /**\r\n * 停止所有动画\r\n */\r\n stopAll(): void {\r\n // 停止模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => action.stop())\r\n }\r\n this.mixers = []\r\n\r\n // 停止曲线动画\r\n this.curveAnimations = []\r\n\r\n // 停止补间动画\r\n for (const tween of this.tweens) {\r\n tween.kill()\r\n }\r\n this.tweens = []\r\n }\r\n\r\n /**\r\n * 暂停所有动画\r\n */\r\n pauseAll(): void {\r\n // 暂停模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => {\r\n action.paused = true\r\n })\r\n }\r\n\r\n // 暂停曲线动画\r\n for (const anim of this.curveAnimations) {\r\n anim.pause = true\r\n }\r\n\r\n // 暂停补间动画\r\n for (const tween of this.tweens) {\r\n tween.pause()\r\n }\r\n }\r\n\r\n /**\r\n * 恢复所有动画\r\n */\r\n resumeAll(): void {\r\n // 恢复模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => {\r\n action.paused = false\r\n })\r\n }\r\n\r\n // 恢复曲线动画\r\n for (const anim of this.curveAnimations) {\r\n anim.pause = false\r\n }\r\n\r\n // 恢复补间动画\r\n for (const tween of this.tweens) {\r\n tween.resume()\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { DrawMode, PointMode, ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 绘制插件配置\r\n */\r\nexport interface DrawingPluginConfig {\r\n defaultMode: DrawMode\r\n defaultPointMode: PointMode\r\n defaultMaterialType: string\r\n fenceHeight: number\r\n lineWidth: number\r\n}\r\n\r\n/**\r\n * 绘制结果\r\n */\r\nexport interface DrawResult {\r\n mesh: THREE.Object3D\r\n points: THREE.Vector3[]\r\n mode: DrawMode\r\n}\r\n\r\n/**\r\n * 默认绘制配置\r\n */\r\nexport const DEFAULT_DRAWING_CONFIG: DrawingPluginConfig = {\r\n defaultMode: '围栏物体',\r\n defaultPointMode: '场景交点',\r\n defaultMaterialType: '标准材质',\r\n fenceHeight: 5,\r\n lineWidth: 0.01\r\n}\r\n\r\n/**\r\n * 绘制插件\r\n * 提供场景绘制功能(围栏、平面、曲线、直线)\r\n */\r\nexport class DrawingPlugin extends Plugin<DrawingPluginConfig> {\r\n readonly name = 'drawing'\r\n\r\n /** 当前绘制模式 */\r\n private _mode: DrawMode\r\n\r\n /** 当前点位模式 */\r\n private _pointMode: PointMode\r\n\r\n /** 当前绘制的点列表 */\r\n private currentPoints: THREE.Vector3[] = []\r\n\r\n /** 预览网格 */\r\n private previewMesh: THREE.Object3D | null = null\r\n\r\n /** 是否正在绘制 */\r\n private _isDrawing = false\r\n\r\n /** 已绘制的物体列表 */\r\n private drawnObjects: DrawResult[] = []\r\n\r\n constructor(config?: Partial<DrawingPluginConfig>) {\r\n super({ ...DEFAULT_DRAWING_CONFIG, ...config })\r\n this._mode = this.config.defaultMode\r\n this._pointMode = this.config.defaultPointMode\r\n }\r\n\r\n /**\r\n * 获取当前绘制模式\r\n */\r\n get mode(): DrawMode {\r\n return this._mode\r\n }\r\n\r\n /**\r\n * 获取当前点位模式\r\n */\r\n get pointMode(): PointMode {\r\n return this._pointMode\r\n }\r\n\r\n /**\r\n * 是否正在绘制\r\n */\r\n get isDrawing(): boolean {\r\n return this._isDrawing\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.cancel()\r\n // 清理预览网格\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置绘制模式\r\n */\r\n setMode(mode: DrawMode): void {\r\n this._mode = mode\r\n }\r\n\r\n /**\r\n * 设置点位模式\r\n */\r\n setPointMode(mode: PointMode): void {\r\n this._pointMode = mode\r\n }\r\n\r\n /**\r\n * 开始绘制\r\n */\r\n start(): void {\r\n this._isDrawing = true\r\n this.currentPoints = []\r\n this.events.emit('draw:start', { mode: this._mode })\r\n }\r\n\r\n /**\r\n * 添加点\r\n */\r\n addPoint(point: THREE.Vector3): void {\r\n if (!this._isDrawing) {\r\n this.start()\r\n }\r\n\r\n this.currentPoints.push(point.clone())\r\n this.events.emit('draw:point', { point })\r\n\r\n // 更新预览\r\n this.updatePreview()\r\n }\r\n\r\n /**\r\n * 处理场景点击\r\n */\r\n handleSceneClick(point: THREE.Vector3, object?: ExtendedObject3D): void {\r\n let targetPoint = point\r\n\r\n // 根据点位模式处理\r\n if (this._pointMode === '地图区域中心' && object?.geoInfo?.properties?.centroidCoord3) {\r\n const parent = object.parent as ExtendedObject3D\r\n if (parent?.getTransformedVector) {\r\n const centroid = object.geoInfo.properties.centroidCoord3.clone()\r\n centroid.add(object.position)\r\n if (object.initTranslate) {\r\n centroid.sub(object.initTranslate)\r\n }\r\n targetPoint = parent.getTransformedVector(centroid)\r\n }\r\n } else if (this._pointMode === '地图行政中心' && object?.geoInfo?.properties?.centerCoord3) {\r\n const parent = object.parent as ExtendedObject3D\r\n if (parent?.getTransformedVector) {\r\n const center = object.geoInfo.properties.centerCoord3.clone()\r\n center.add(object.position)\r\n if (object.initTranslate) {\r\n center.sub(object.initTranslate)\r\n }\r\n targetPoint = parent.getTransformedVector(center)\r\n }\r\n }\r\n\r\n this.addPoint(targetPoint)\r\n }\r\n\r\n /**\r\n * 完成绘制\r\n */\r\n complete(): DrawResult | null {\r\n if (this.currentPoints.length < 2) {\r\n console.warn('Need at least 2 points to complete drawing')\r\n return null\r\n }\r\n\r\n let mesh: THREE.Object3D\r\n\r\n switch (this._mode) {\r\n case '围栏物体':\r\n mesh = this.createFence(this.currentPoints)\r\n break\r\n case '平面绘制':\r\n mesh = this.createPlane(this.currentPoints)\r\n break\r\n case '曲线路径':\r\n mesh = this.createCurve(this.currentPoints)\r\n break\r\n case '直线路径':\r\n mesh = this.createLine(this.currentPoints)\r\n break\r\n default:\r\n return null\r\n }\r\n\r\n // 标记为绘制物体\r\n (mesh as ExtendedObject3D).isDrawMesh = true\r\n\r\n // 添加到场景\r\n this.scene.add(mesh)\r\n\r\n // 清理预览\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n\r\n const result: DrawResult = {\r\n mesh,\r\n points: [...this.currentPoints],\r\n mode: this._mode\r\n }\r\n\r\n this.drawnObjects.push(result)\r\n this._isDrawing = false\r\n this.currentPoints = []\r\n\r\n this.events.emit('draw:complete', { mesh })\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 取消绘制\r\n */\r\n cancel(): void {\r\n this._isDrawing = false\r\n this.currentPoints = []\r\n\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n\r\n this.events.emit('draw:cancel', undefined)\r\n }\r\n\r\n /**\r\n * 撤销最后一个点\r\n */\r\n undoPoint(): void {\r\n if (this.currentPoints.length > 0) {\r\n this.currentPoints.pop()\r\n this.updatePreview()\r\n }\r\n }\r\n\r\n /**\r\n * 更新预览\r\n */\r\n private updatePreview(): void {\r\n if (this.currentPoints.length < 2) return\r\n\r\n // 移除旧预览\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n }\r\n\r\n // 创建新预览\r\n switch (this._mode) {\r\n case '围栏物体':\r\n this.previewMesh = this.createFence(this.currentPoints, true)\r\n break\r\n case '平面绘制':\r\n this.previewMesh = this.createPlane(this.currentPoints, true)\r\n break\r\n case '曲线路径':\r\n this.previewMesh = this.createCurve(this.currentPoints, true)\r\n break\r\n case '直线路径':\r\n this.previewMesh = this.createLine(this.currentPoints, true)\r\n break\r\n }\r\n\r\n if (this.previewMesh) {\r\n this.scene.add(this.previewMesh)\r\n }\r\n }\r\n\r\n /**\r\n * 创建围栏\r\n */\r\n private createFence(points: THREE.Vector3[], isPreview = false): THREE.Mesh {\r\n const height = this.config.fenceHeight\r\n const vertices: number[] = []\r\n const indices: number[] = []\r\n const uvs: number[] = []\r\n\r\n // 生成顶点\r\n for (let i = 0; i < points.length; i++) {\r\n const p = points[i]\r\n // 底部点\r\n vertices.push(p.x, p.y, p.z)\r\n // 顶部点\r\n vertices.push(p.x, p.y + height, p.z)\r\n\r\n // UV\r\n const u = i / (points.length - 1)\r\n uvs.push(u, 0)\r\n uvs.push(u, 1)\r\n }\r\n\r\n // 生成索引\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const base = i * 2\r\n // 两个三角形组成一个面\r\n indices.push(base, base + 1, base + 2)\r\n indices.push(base + 1, base + 3, base + 2)\r\n }\r\n\r\n const geometry = new THREE.BufferGeometry()\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\r\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2))\r\n geometry.setIndex(indices)\r\n geometry.computeVertexNormals()\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: isPreview ? 0x00ff00 : 0x4488ff,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: isPreview ? 0.5 : 0.8\r\n })\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = 'Fence'\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建平面\r\n */\r\n private createPlane(points: THREE.Vector3[], isPreview = false): THREE.Mesh {\r\n if (points.length < 3) {\r\n // 不足3点,创建简单线条\r\n return this.createLine(points, isPreview) as THREE.Mesh\r\n }\r\n\r\n // 使用 Shape 创建平面\r\n const shape = new THREE.Shape()\r\n shape.moveTo(points[0].x, points[0].z)\r\n for (let i = 1; i < points.length; i++) {\r\n shape.lineTo(points[i].x, points[i].z)\r\n }\r\n shape.closePath()\r\n\r\n const geometry = new THREE.ShapeGeometry(shape)\r\n\r\n // 旋转到 XZ 平面\r\n geometry.rotateX(-Math.PI / 2)\r\n\r\n // 设置 Y 位置\r\n const avgY = points.reduce((sum, p) => sum + p.y, 0) / points.length\r\n geometry.translate(0, avgY, 0)\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: isPreview ? 0x00ff00 : 0x4488ff,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: isPreview ? 0.5 : 0.8\r\n })\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = 'Plane'\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建曲线\r\n */\r\n private createCurve(points: THREE.Vector3[], isPreview = false): THREE.Object3D {\r\n const curve = new THREE.CatmullRomCurve3(points)\r\n const curvePoints = curve.getPoints(50)\r\n\r\n const geometry = new THREE.BufferGeometry().setFromPoints(curvePoints)\r\n\r\n const material = new THREE.LineBasicMaterial({\r\n color: isPreview ? 0x00ff00 : 0xff4488,\r\n linewidth: 2\r\n })\r\n\r\n const line = new THREE.Line(geometry, material)\r\n line.name = 'Curve'\r\n\r\n // 保存曲线路径\r\n ;(line as ExtendedObject3D).isCurveMesh = true\r\n ;(line as ExtendedObject3D).curvePath = curve\r\n\r\n return line\r\n }\r\n\r\n /**\r\n * 创建直线\r\n */\r\n private createLine(points: THREE.Vector3[], isPreview = false): THREE.Object3D {\r\n const geometry = new THREE.BufferGeometry().setFromPoints(points)\r\n\r\n const material = new THREE.LineBasicMaterial({\r\n color: isPreview ? 0x00ff00 : 0xffff00,\r\n linewidth: 2\r\n })\r\n\r\n const line = new THREE.Line(geometry, material)\r\n line.name = 'Line'\r\n\r\n return line\r\n }\r\n\r\n /**\r\n * 获取所有绘制的物体\r\n */\r\n getDrawnObjects(): DrawResult[] {\r\n return this.drawnObjects\r\n }\r\n\r\n /**\r\n * 删除绘制的物体\r\n */\r\n removeDrawnObject(mesh: THREE.Object3D): void {\r\n const index = this.drawnObjects.findIndex(d => d.mesh === mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n this.drawnObjects.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有绘制的物体\r\n */\r\n clearAll(): void {\r\n for (const result of this.drawnObjects) {\r\n this.scene.remove(result.mesh)\r\n }\r\n this.drawnObjects = []\r\n }\r\n\r\n /**\r\n * 获取场景中的所有曲线\r\n */\r\n getCurveList(): Array<{ path: THREE.Curve<THREE.Vector3>; mesh: THREE.Object3D }> {\r\n return this.scene.children\r\n .filter(obj => (obj as ExtendedObject3D).isCurveMesh)\r\n .map(obj => ({\r\n path: (obj as ExtendedObject3D).curvePath!,\r\n mesh: obj\r\n }))\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport proj4 from 'proj4'\r\nimport { Plugin } from '../Plugin'\r\nimport type { GeoMapPluginConfig } from '../../types/config.types'\r\nimport type { ExtendedObject3D, GeoInfo } from '../../types/core.types'\r\n\r\n/**\r\n * GeoJSON Feature\r\n */\r\nexport interface GeoJSONFeature {\r\n type: 'Feature'\r\n properties: Record<string, any>\r\n geometry: {\r\n type: 'Polygon' | 'MultiPolygon'\r\n coordinates: number[][][] | number[][][][]\r\n }\r\n}\r\n\r\n/**\r\n * GeoJSON 数据\r\n */\r\nexport interface GeoJSONData {\r\n type: 'FeatureCollection'\r\n features: GeoJSONFeature[]\r\n}\r\n\r\n/**\r\n * 地图组信息\r\n */\r\nexport interface GeoGroupInfo {\r\n group: THREE.Group\r\n url: string\r\n materialType: string\r\n features: GeoJSONFeature[]\r\n}\r\n\r\n/**\r\n * 默认地图配置\r\n */\r\nexport const DEFAULT_GEOMAP_CONFIG: GeoMapPluginConfig = {\r\n materialType: '标准材质',\r\n coordinateScale: 10000\r\n}\r\n\r\n/**\r\n * 地图插件\r\n * 提供 GeoJSON 地图加载和渲染功能\r\n */\r\nexport class GeoMapPlugin extends Plugin<GeoMapPluginConfig> {\r\n readonly name = 'geomap'\r\n\r\n /** 已加载的地图组 */\r\n private geoGroups: GeoGroupInfo[] = []\r\n\r\n /** 加载完成回调 */\r\n onGroupLoaded?: (group: THREE.Group) => void\r\n\r\n /** 所有地图加载完成回调 */\r\n onAllLoaded?: () => void\r\n\r\n constructor(config?: Partial<GeoMapPluginConfig>) {\r\n super({ ...DEFAULT_GEOMAP_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n /**\r\n * 加载 GeoJSON 地图\r\n */\r\n async load(url: string, options?: {\r\n materialType?: string\r\n depth?: number\r\n color?: number\r\n opacity?: number\r\n }): Promise<THREE.Group> {\r\n const response = await fetch(url)\r\n const data: GeoJSONData = await response.json()\r\n\r\n const group = this.createGeoGroup(data, {\r\n materialType: options?.materialType ?? this.config.materialType,\r\n depth: options?.depth ?? 1,\r\n color: options?.color ?? 0x4488ff,\r\n opacity: options?.opacity ?? 0.8\r\n })\r\n\r\n // 标记为地图组\r\n ;(group as ExtendedObject3D).isGeoGroup = true\r\n\r\n // 设置中心点\r\n this.centerGroup(group)\r\n\r\n // 添加到场景\r\n this.scene.add(group)\r\n\r\n // 保存信息\r\n this.geoGroups.push({\r\n group,\r\n url,\r\n materialType: options?.materialType ?? this.config.materialType,\r\n features: data.features\r\n })\r\n\r\n // 触发回调\r\n this.onGroupLoaded?.(group)\r\n this.events.emit('geomap:load:complete', { group })\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 创建地图组\r\n */\r\n private createGeoGroup(data: GeoJSONData, options: {\r\n materialType: string\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Group {\r\n const group = new THREE.Group()\r\n group.name = 'GeoGroup'\r\n\r\n for (const feature of data.features) {\r\n const meshes = this.createFeatureMeshes(feature, options)\r\n for (const mesh of meshes) {\r\n group.add(mesh)\r\n }\r\n }\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 创建 Feature 网格\r\n */\r\n private createFeatureMeshes(feature: GeoJSONFeature, options: {\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Mesh[] {\r\n const meshes: THREE.Mesh[] = []\r\n const { geometry, properties } = feature\r\n\r\n let polygons: number[][][][] = []\r\n\r\n if (geometry.type === 'Polygon') {\r\n polygons = [geometry.coordinates as number[][][]]\r\n } else if (geometry.type === 'MultiPolygon') {\r\n polygons = geometry.coordinates as number[][][][]\r\n }\r\n\r\n for (const polygon of polygons) {\r\n const mesh = this.createPolygonMesh(polygon, options)\r\n mesh.name = properties.name || 'Region'\r\n\r\n // 保存地理信息\r\n const geoInfo: GeoInfo = {\r\n properties: { ...properties }\r\n }\r\n\r\n // 计算中心点\r\n if (properties.center) {\r\n geoInfo.properties!.centerCoord3 = this.coordToVector3(properties.center)\r\n }\r\n if (properties.centroid) {\r\n geoInfo.properties!.centroidCoord3 = this.coordToVector3(properties.centroid)\r\n }\r\n\r\n ;(mesh as ExtendedObject3D).geoInfo = geoInfo\r\n\r\n meshes.push(mesh)\r\n }\r\n\r\n return meshes\r\n }\r\n\r\n /**\r\n * 创建多边形网格\r\n */\r\n private createPolygonMesh(polygon: number[][][], options: {\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Mesh {\r\n // 外环\r\n const outerRing = polygon[0]\r\n const shape = new THREE.Shape()\r\n\r\n const firstPoint = this.coordToVector2(outerRing[0])\r\n shape.moveTo(firstPoint.x, firstPoint.y)\r\n\r\n for (let i = 1; i < outerRing.length; i++) {\r\n const point = this.coordToVector2(outerRing[i])\r\n shape.lineTo(point.x, point.y)\r\n }\r\n\r\n shape.closePath()\r\n\r\n // 内环(孔洞)\r\n for (let i = 1; i < polygon.length; i++) {\r\n const hole = new THREE.Path()\r\n const holeRing = polygon[i]\r\n const holeFirst = this.coordToVector2(holeRing[0])\r\n hole.moveTo(holeFirst.x, holeFirst.y)\r\n\r\n for (let j = 1; j < holeRing.length; j++) {\r\n const point = this.coordToVector2(holeRing[j])\r\n hole.lineTo(point.x, point.y)\r\n }\r\n\r\n shape.holes.push(hole)\r\n }\r\n\r\n // 创建挤压几何体\r\n const geometry = new THREE.ExtrudeGeometry(shape, {\r\n depth: options.depth,\r\n bevelEnabled: false\r\n })\r\n\r\n // 旋转到 XZ 平面\r\n geometry.rotateX(-Math.PI / 2)\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: options.color,\r\n transparent: true,\r\n opacity: options.opacity,\r\n side: THREE.DoubleSide\r\n })\r\n\r\n return new THREE.Mesh(geometry, material)\r\n }\r\n\r\n /**\r\n * 经纬度转二维坐标\r\n */\r\n coordToVector2(coord: number[]): THREE.Vector2 {\r\n const [lng, lat] = coord\r\n const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [lng, lat])\r\n return new THREE.Vector2(x / this.config.coordinateScale, y / this.config.coordinateScale)\r\n }\r\n\r\n /**\r\n * 经纬度转三维坐标\r\n */\r\n coordToVector3(coord: number[]): THREE.Vector3 {\r\n const [lng, lat] = coord\r\n const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [lng, lat])\r\n return new THREE.Vector3(x / this.config.coordinateScale, 0, y / this.config.coordinateScale)\r\n }\r\n\r\n /**\r\n * 将组中心移到原点\r\n */\r\n private centerGroup(group: THREE.Group): void {\r\n const box = new THREE.Box3().setFromObject(group)\r\n const center = new THREE.Vector3()\r\n box.getCenter(center)\r\n\r\n // 保存偏移量\r\n ;(group as ExtendedObject3D).translationOriginDiff = center.clone()\r\n\r\n // 添加坐标转换方法\r\n ;(group as ExtendedObject3D).getTransformedVector = (vec3: THREE.Vector3) => {\r\n const transformed = vec3.clone()\r\n transformed.sub(center)\r\n transformed.multiply(group.scale)\r\n transformed.applyEuler(group.rotation)\r\n transformed.add(group.position)\r\n return transformed\r\n }\r\n\r\n // 移动子物体\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.position.sub(center)\r\n ;(child as ExtendedObject3D).initTranslate = child.position.clone()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取所有地图组\r\n */\r\n getGeoGroups(): GeoGroupInfo[] {\r\n return this.geoGroups\r\n }\r\n\r\n /**\r\n * 移除地图组\r\n */\r\n removeGeoGroup(group: THREE.Group): void {\r\n const index = this.geoGroups.findIndex(g => g.group === group)\r\n if (index > -1) {\r\n this.scene.remove(group)\r\n this.geoGroups.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有地图\r\n */\r\n clearAll(): void {\r\n for (const info of this.geoGroups) {\r\n this.scene.remove(info.group)\r\n }\r\n this.geoGroups = []\r\n }\r\n\r\n /**\r\n * 根据名称查找区域\r\n */\r\n findRegionByName(name: string): THREE.Mesh | null {\r\n for (const info of this.geoGroups) {\r\n const found = info.group.children.find(\r\n child => child.name === name\r\n ) as THREE.Mesh | undefined\r\n\r\n if (found) return found\r\n }\r\n return null\r\n }\r\n\r\n /**\r\n * 高亮区域\r\n */\r\n highlightRegion(mesh: THREE.Mesh, color: number = 0xff0000): void {\r\n if (mesh.material instanceof THREE.MeshStandardMaterial) {\r\n mesh.material.emissive.setHex(color)\r\n mesh.material.emissiveIntensity = 0.3\r\n }\r\n }\r\n\r\n /**\r\n * 取消高亮\r\n */\r\n unhighlightRegion(mesh: THREE.Mesh): void {\r\n if (mesh.material instanceof THREE.MeshStandardMaterial) {\r\n mesh.material.emissiveIntensity = 0\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 几何体类型\r\n */\r\nexport type GeometryType =\r\n | '立方体'\r\n | '球体'\r\n | '圆柱体'\r\n | '圆锥体'\r\n | '平面'\r\n | '圆环'\r\n | '圆环结'\r\n | '十二面体'\r\n | '二十面体'\r\n | '八面体'\r\n | '四面体'\r\n | '胶囊体'\r\n\r\n/**\r\n * 几何体参数\r\n */\r\nexport interface GeometryParams {\r\n // 立方体\r\n width?: number\r\n height?: number\r\n depth?: number\r\n widthSegments?: number\r\n heightSegments?: number\r\n depthSegments?: number\r\n\r\n // 球体\r\n radius?: number\r\n phiStart?: number\r\n phiLength?: number\r\n thetaStart?: number\r\n thetaLength?: number\r\n\r\n // 圆柱体/圆锥体\r\n radiusTop?: number\r\n radiusBottom?: number\r\n radialSegments?: number\r\n openEnded?: boolean\r\n\r\n // 圆环\r\n tube?: number\r\n tubularSegments?: number\r\n arc?: number\r\n\r\n // 圆环结\r\n p?: number\r\n q?: number\r\n\r\n // 胶囊体\r\n capSegments?: number\r\n}\r\n\r\n/**\r\n * 几何体插件配置\r\n */\r\nexport interface GeometryPluginConfig {\r\n defaultSize: number\r\n}\r\n\r\n/**\r\n * 默认几何体配置\r\n */\r\nexport const DEFAULT_GEOMETRY_CONFIG: GeometryPluginConfig = {\r\n defaultSize: 1\r\n}\r\n\r\n/**\r\n * 几何体插件\r\n * 提供内置几何体创建功能\r\n */\r\nexport class GeometryPlugin extends Plugin<GeometryPluginConfig> {\r\n readonly name = 'geometry'\r\n\r\n /** 几何体类型列表 */\r\n readonly geometryTypes: GeometryType[] = [\r\n '立方体', '球体', '圆柱体', '圆锥体', '平面',\r\n '圆环', '圆环结', '十二面体', '二十面体', '八面体', '四面体', '胶囊体'\r\n ]\r\n\r\n /** 已创建的内置物体 */\r\n private innerMeshes: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<GeometryPluginConfig>) {\r\n super({ ...DEFAULT_GEOMETRY_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n /**\r\n * 创建几何体\r\n */\r\n createGeometry(type: GeometryType, params?: GeometryParams): THREE.BufferGeometry {\r\n const size = this.config.defaultSize\r\n const p = params || {}\r\n\r\n switch (type) {\r\n case '立方体':\r\n return new THREE.BoxGeometry(\r\n p.width ?? size,\r\n p.height ?? size,\r\n p.depth ?? size,\r\n p.widthSegments ?? 1,\r\n p.heightSegments ?? 1,\r\n p.depthSegments ?? 1\r\n )\r\n\r\n case '球体':\r\n return new THREE.SphereGeometry(\r\n p.radius ?? size / 2,\r\n p.widthSegments ?? 32,\r\n p.heightSegments ?? 16,\r\n p.phiStart ?? 0,\r\n p.phiLength ?? Math.PI * 2,\r\n p.thetaStart ?? 0,\r\n p.thetaLength ?? Math.PI\r\n )\r\n\r\n case '圆柱体':\r\n return new THREE.CylinderGeometry(\r\n p.radiusTop ?? size / 2,\r\n p.radiusBottom ?? size / 2,\r\n p.height ?? size,\r\n p.radialSegments ?? 32,\r\n p.heightSegments ?? 1,\r\n p.openEnded ?? false\r\n )\r\n\r\n case '圆锥体':\r\n return new THREE.ConeGeometry(\r\n p.radius ?? size / 2,\r\n p.height ?? size,\r\n p.radialSegments ?? 32,\r\n p.heightSegments ?? 1,\r\n p.openEnded ?? false\r\n )\r\n\r\n case '平面':\r\n return new THREE.PlaneGeometry(\r\n p.width ?? size,\r\n p.height ?? size,\r\n p.widthSegments ?? 1,\r\n p.heightSegments ?? 1\r\n )\r\n\r\n case '圆环':\r\n return new THREE.TorusGeometry(\r\n p.radius ?? size / 2,\r\n p.tube ?? size / 6,\r\n p.radialSegments ?? 16,\r\n p.tubularSegments ?? 100,\r\n p.arc ?? Math.PI * 2\r\n )\r\n\r\n case '圆环结':\r\n return new THREE.TorusKnotGeometry(\r\n p.radius ?? size / 2,\r\n p.tube ?? size / 6,\r\n p.tubularSegments ?? 64,\r\n p.radialSegments ?? 8,\r\n p.p ?? 2,\r\n p.q ?? 3\r\n )\r\n\r\n case '十二面体':\r\n return new THREE.DodecahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '二十面体':\r\n return new THREE.IcosahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '八面体':\r\n return new THREE.OctahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '四面体':\r\n return new THREE.TetrahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '胶囊体':\r\n return new THREE.CapsuleGeometry(\r\n p.radius ?? size / 4,\r\n p.height ?? size / 2,\r\n p.capSegments ?? 4,\r\n p.radialSegments ?? 8\r\n )\r\n\r\n default:\r\n return new THREE.BoxGeometry(size, size, size)\r\n }\r\n }\r\n\r\n /**\r\n * 创建内置网格物体\r\n */\r\n createMesh(\r\n geometryType: GeometryType,\r\n material?: THREE.Material,\r\n params?: GeometryParams\r\n ): THREE.Mesh {\r\n const geometry = this.createGeometry(geometryType, params)\r\n\r\n // 保存几何体类型\r\n ;(geometry as any).geometryType = geometryType\r\n\r\n const mesh = new THREE.Mesh(\r\n geometry,\r\n material ?? new THREE.MeshStandardMaterial({ color: 0x808080 })\r\n )\r\n\r\n mesh.name = geometryType\r\n\r\n // 标记为内置物体\r\n ;(mesh as ExtendedObject3D).isInnerMesh = true\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 添加内置物体到场景\r\n */\r\n addToScene(\r\n geometryType: GeometryType,\r\n material?: THREE.Material,\r\n params?: GeometryParams\r\n ): THREE.Mesh {\r\n const mesh = this.createMesh(geometryType, material, params)\r\n this.scene.add(mesh)\r\n this.innerMeshes.push(mesh)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建简单立方体\r\n */\r\n createBox(size: number = 1, color: number = 0xffffff): THREE.Mesh {\r\n const geometry = new THREE.BoxGeometry(size, size, size)\r\n const material = new THREE.MeshBasicMaterial({ color })\r\n const mesh = new THREE.Mesh(geometry, material)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 获取所有内置物体\r\n */\r\n getInnerMeshes(): THREE.Mesh[] {\r\n return this.innerMeshes\r\n }\r\n\r\n /**\r\n * 移除内置物体\r\n */\r\n removeMesh(mesh: THREE.Mesh): void {\r\n const index = this.innerMeshes.indexOf(mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n this.innerMeshes.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有内置物体\r\n */\r\n clearAll(): void {\r\n for (const mesh of this.innerMeshes) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n }\r\n this.innerMeshes = []\r\n }\r\n\r\n /**\r\n * 更新几何体参数\r\n */\r\n updateGeometry(mesh: THREE.Mesh, type: GeometryType, params?: GeometryParams): void {\r\n const oldGeometry = mesh.geometry\r\n mesh.geometry = this.createGeometry(type, params)\r\n ;(mesh.geometry as any).geometryType = type\r\n oldGeometry.dispose()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 材质类型\r\n */\r\nexport type MaterialType =\r\n | '基础材质'\r\n | '标准材质'\r\n | '物理材质'\r\n | 'Lambert材质'\r\n | 'Phong材质'\r\n | 'Toon材质'\r\n | '法线材质'\r\n | '深度材质'\r\n\r\n/**\r\n * 材质参数\r\n */\r\nexport interface MaterialParams {\r\n color?: number | string\r\n opacity?: number\r\n transparent?: boolean\r\n side?: THREE.Side\r\n wireframe?: boolean\r\n flatShading?: boolean\r\n map?: THREE.Texture\r\n emissive?: number | string\r\n emissiveIntensity?: number\r\n roughness?: number\r\n metalness?: number\r\n envMapIntensity?: number\r\n}\r\n\r\n/**\r\n * 材质插件配置\r\n */\r\nexport interface MaterialPluginConfig {\r\n defaultType: MaterialType\r\n defaultColor: number\r\n}\r\n\r\n/**\r\n * 默认材质配置\r\n */\r\nexport const DEFAULT_MATERIAL_CONFIG: MaterialPluginConfig = {\r\n defaultType: '标准材质',\r\n defaultColor: 0x808080\r\n}\r\n\r\n/**\r\n * 材质插件\r\n * 提供材质创建和管理功能\r\n */\r\nexport class MaterialPlugin extends Plugin<MaterialPluginConfig> {\r\n readonly name = 'material'\r\n\r\n /** 材质类型列表 */\r\n readonly materialTypes: MaterialType[] = [\r\n '基础材质', '标准材质', '物理材质', 'Lambert材质',\r\n 'Phong材质', 'Toon材质', '法线材质', '深度材质'\r\n ]\r\n\r\n constructor(config?: Partial<MaterialPluginConfig>) {\r\n super({ ...DEFAULT_MATERIAL_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 创建材质\r\n */\r\n createMaterial(type: MaterialType, params?: MaterialParams): THREE.Material {\r\n const p = params || {}\r\n const color = p.color ?? this.config.defaultColor\r\n\r\n const commonParams = {\r\n color,\r\n opacity: p.opacity ?? 1,\r\n transparent: p.transparent ?? false,\r\n side: p.side ?? THREE.FrontSide,\r\n wireframe: p.wireframe ?? false\r\n }\r\n\r\n switch (type) {\r\n case '基础材质':\r\n return new THREE.MeshBasicMaterial({\r\n ...commonParams,\r\n map: p.map\r\n })\r\n\r\n case '标准材质':\r\n return new THREE.MeshStandardMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1,\r\n roughness: p.roughness ?? 0.5,\r\n metalness: p.metalness ?? 0.5,\r\n envMapIntensity: p.envMapIntensity ?? 1\r\n })\r\n\r\n case '物理材质':\r\n return new THREE.MeshPhysicalMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1,\r\n roughness: p.roughness ?? 0.5,\r\n metalness: p.metalness ?? 0.5,\r\n envMapIntensity: p.envMapIntensity ?? 1\r\n })\r\n\r\n case 'Lambert材质':\r\n return new THREE.MeshLambertMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1\r\n })\r\n\r\n case 'Phong材质':\r\n return new THREE.MeshPhongMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1\r\n })\r\n\r\n case 'Toon材质':\r\n return new THREE.MeshToonMaterial({\r\n ...commonParams,\r\n map: p.map\r\n })\r\n\r\n case '法线材质':\r\n return new THREE.MeshNormalMaterial({\r\n opacity: p.opacity ?? 1,\r\n transparent: p.transparent ?? false,\r\n side: p.side ?? THREE.FrontSide,\r\n wireframe: p.wireframe ?? false,\r\n flatShading: p.flatShading ?? false\r\n })\r\n\r\n case '深度材质':\r\n return new THREE.MeshDepthMaterial({\r\n opacity: p.opacity ?? 1,\r\n wireframe: p.wireframe ?? false\r\n })\r\n\r\n default:\r\n return new THREE.MeshStandardMaterial(commonParams)\r\n }\r\n }\r\n\r\n /**\r\n * 修改网格材质\r\n */\r\n changeMaterial(mesh: THREE.Mesh, params: MaterialParams): void {\r\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]\r\n\r\n // 保存原始材质用于恢复\r\n if (!(mesh as any)._originalMaterials) {\r\n (mesh as any)._originalMaterials = materials.map(m => m.clone())\r\n }\r\n\r\n for (const material of materials) {\r\n this.applyParams(material, params)\r\n }\r\n }\r\n\r\n /**\r\n * 修改组材质\r\n */\r\n changeGroupMaterial(group: THREE.Group, params: MaterialParams): void {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n this.changeMaterial(child as THREE.Mesh, params)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 应用参数到材质\r\n */\r\n private applyParams(material: THREE.Material, params: MaterialParams): void {\r\n const mat = material as any\r\n\r\n if (params.color !== undefined) {\r\n if (mat.color) mat.color.set(params.color)\r\n }\r\n if (params.opacity !== undefined) {\r\n mat.opacity = params.opacity\r\n }\r\n if (params.transparent !== undefined) {\r\n mat.transparent = params.transparent\r\n }\r\n if (params.side !== undefined) {\r\n mat.side = params.side\r\n }\r\n if (params.wireframe !== undefined) {\r\n mat.wireframe = params.wireframe\r\n }\r\n if (params.emissive !== undefined && mat.emissive) {\r\n mat.emissive.set(params.emissive)\r\n }\r\n if (params.emissiveIntensity !== undefined) {\r\n mat.emissiveIntensity = params.emissiveIntensity\r\n }\r\n if (params.roughness !== undefined) {\r\n mat.roughness = params.roughness\r\n }\r\n if (params.metalness !== undefined) {\r\n mat.metalness = params.metalness\r\n }\r\n\r\n material.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 恢复原始材质\r\n */\r\n revertMaterial(mesh: THREE.Mesh): void {\r\n const originalMaterials = (mesh as any)._originalMaterials\r\n if (!originalMaterials) return\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((m, i) => {\r\n if (originalMaterials[i]) {\r\n this.copyMaterialProperties(originalMaterials[i], m)\r\n }\r\n })\r\n } else if (originalMaterials[0]) {\r\n this.copyMaterialProperties(originalMaterials[0], mesh.material)\r\n }\r\n }\r\n\r\n /**\r\n * 恢复组的原始材质\r\n */\r\n revertGroupMaterial(group: THREE.Group): void {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n this.revertMaterial(child as THREE.Mesh)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 复制材质属性\r\n */\r\n private copyMaterialProperties(source: THREE.Material, target: THREE.Material): void {\r\n const src = source as any\r\n const tgt = target as any\r\n\r\n if (src.color && tgt.color) tgt.color.copy(src.color)\r\n if (src.emissive && tgt.emissive) tgt.emissive.copy(src.emissive)\r\n tgt.opacity = src.opacity\r\n tgt.transparent = src.transparent\r\n tgt.side = src.side\r\n if (src.wireframe !== undefined) tgt.wireframe = src.wireframe\r\n if (src.emissiveIntensity !== undefined) tgt.emissiveIntensity = src.emissiveIntensity\r\n if (src.roughness !== undefined) tgt.roughness = src.roughness\r\n if (src.metalness !== undefined) tgt.metalness = src.metalness\r\n\r\n target.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 克隆物体材质\r\n */\r\n cloneMaterial(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 ;(mesh as any).isCloneMaterial = true\r\n ;(mesh as any).originMaterial = mesh.material\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material = mesh.material.map(m => m.clone())\r\n } else {\r\n mesh.material = mesh.material.clone()\r\n }\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取物体的所有材质\r\n */\r\n getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ParticlePluginConfig } from '../../types/config.types'\r\nimport type { ParticleSportType, ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 粒子系统信息\r\n */\r\nexport interface ParticleSystemInfo {\r\n mesh: THREE.Points\r\n velocities: Float32Array\r\n config: ParticleConfig\r\n}\r\n\r\n/**\r\n * 粒子配置\r\n */\r\nexport interface ParticleConfig {\r\n particlesSum: number\r\n inner: number\r\n outer: number\r\n maxVelocity: number\r\n mapUrl: string\r\n sportType: ParticleSportType\r\n size: number\r\n color: number\r\n opacity: number\r\n}\r\n\r\n/**\r\n * 默认粒子配置\r\n */\r\nexport const DEFAULT_PARTICLE_CONFIG: ParticlePluginConfig = {\r\n particlesSum: 10000,\r\n inner: 0,\r\n outer: 100,\r\n maxVelocity: 10,\r\n mapUrl: '',\r\n shaderCodeName: '雪片着色',\r\n sportType: '全随机'\r\n}\r\n\r\n/**\r\n * 粒子插件\r\n * 提供粒子系统创建和管理功能\r\n */\r\nexport class ParticlePlugin extends Plugin<ParticlePluginConfig> {\r\n readonly name = 'particle'\r\n\r\n /** 运动方式列表 */\r\n readonly sportTypes: ParticleSportType[] = [\r\n '全随机', '随机向下', '随机向上', '直线匀速向上', '直线匀速向下'\r\n ]\r\n\r\n /** 粒子系统列表 */\r\n private particleSystems: ParticleSystemInfo[] = []\r\n\r\n /** 纹理加载器 */\r\n private textureLoader = new THREE.TextureLoader()\r\n\r\n constructor(config?: Partial<ParticlePluginConfig>) {\r\n super({ ...DEFAULT_PARTICLE_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新所有粒子系统\r\n for (const system of this.particleSystems) {\r\n this.updateParticleSystem(system, delta)\r\n }\r\n }\r\n\r\n /**\r\n * 创建粒子系统\r\n */\r\n createParticleSystem(config?: Partial<ParticleConfig>): THREE.Points {\r\n const cfg: ParticleConfig = {\r\n particlesSum: config?.particlesSum ?? this.config.particlesSum,\r\n inner: config?.inner ?? this.config.inner,\r\n outer: config?.outer ?? this.config.outer,\r\n maxVelocity: config?.maxVelocity ?? this.config.maxVelocity,\r\n mapUrl: config?.mapUrl ?? this.config.mapUrl,\r\n sportType: config?.sportType ?? (this.config.sportType as ParticleSportType),\r\n size: config?.size ?? 1,\r\n color: config?.color ?? 0xffffff,\r\n opacity: config?.opacity ?? 1\r\n }\r\n\r\n const { particlesSum, inner, outer, maxVelocity, sportType } = cfg\r\n\r\n // 创建几何体\r\n const geometry = new THREE.BufferGeometry()\r\n const positions = new Float32Array(particlesSum * 3)\r\n const velocities = new Float32Array(particlesSum * 3)\r\n\r\n // 初始化粒子位置和速度\r\n for (let i = 0; i < particlesSum; i++) {\r\n const i3 = i * 3\r\n\r\n // 随机位置(球形分布)\r\n const radius = inner + Math.random() * (outer - inner)\r\n const theta = Math.random() * Math.PI * 2\r\n const phi = Math.acos(2 * Math.random() - 1)\r\n\r\n positions[i3] = radius * Math.sin(phi) * Math.cos(theta)\r\n positions[i3 + 1] = radius * Math.sin(phi) * Math.sin(theta)\r\n positions[i3 + 2] = radius * Math.cos(phi)\r\n\r\n // 根据运动方式设置速度\r\n switch (sportType) {\r\n case '全随机':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity\r\n velocities[i3 + 1] = (Math.random() - 0.5) * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity\r\n break\r\n case '随机向下':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n velocities[i3 + 1] = -Math.random() * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n break\r\n case '随机向上':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n velocities[i3 + 1] = Math.random() * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n break\r\n case '直线匀速向上':\r\n velocities[i3] = 0\r\n velocities[i3 + 1] = maxVelocity\r\n velocities[i3 + 2] = 0\r\n break\r\n case '直线匀速向下':\r\n velocities[i3] = 0\r\n velocities[i3 + 1] = -maxVelocity\r\n velocities[i3 + 2] = 0\r\n break\r\n }\r\n }\r\n\r\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3))\r\n\r\n // 创建材质\r\n const material = new THREE.PointsMaterial({\r\n size: cfg.size,\r\n color: cfg.color,\r\n transparent: true,\r\n opacity: cfg.opacity,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending\r\n })\r\n\r\n // 加载纹理\r\n if (cfg.mapUrl) {\r\n this.textureLoader.load(cfg.mapUrl, (texture) => {\r\n material.map = texture\r\n material.needsUpdate = true\r\n })\r\n }\r\n\r\n // 创建粒子系统\r\n const points = new THREE.Points(geometry, material)\r\n points.name = 'ParticleSystem'\r\n\r\n // 标记为粒子物体\r\n ;(points as ExtendedObject3D).isParticleMesh = true\r\n\r\n // 保存系统信息\r\n const systemInfo: ParticleSystemInfo = {\r\n mesh: points,\r\n velocities,\r\n config: cfg\r\n }\r\n this.particleSystems.push(systemInfo)\r\n\r\n return points\r\n }\r\n\r\n /**\r\n * 添加粒子系统到场景\r\n */\r\n addToScene(config?: Partial<ParticleConfig>): THREE.Points {\r\n const points = this.createParticleSystem(config)\r\n this.scene.add(points)\r\n return points\r\n }\r\n\r\n /**\r\n * 更新粒子系统\r\n */\r\n private updateParticleSystem(system: ParticleSystemInfo, delta: number): void {\r\n const { mesh, velocities, config } = system\r\n const positions = mesh.geometry.attributes.position.array as Float32Array\r\n const { inner, outer, sportType } = config\r\n\r\n for (let i = 0; i < positions.length; i += 3) {\r\n // 更新位置\r\n positions[i] += velocities[i] * delta\r\n positions[i + 1] += velocities[i + 1] * delta\r\n positions[i + 2] += velocities[i + 2] * delta\r\n\r\n // 计算到中心的距离\r\n const distance = Math.sqrt(\r\n positions[i] ** 2 +\r\n positions[i + 1] ** 2 +\r\n positions[i + 2] ** 2\r\n )\r\n\r\n // 边界检测和重置\r\n if (distance > outer || distance < inner) {\r\n // 重新生成位置\r\n const radius = inner + Math.random() * (outer - inner)\r\n const theta = Math.random() * Math.PI * 2\r\n const phi = Math.acos(2 * Math.random() - 1)\r\n\r\n positions[i] = radius * Math.sin(phi) * Math.cos(theta)\r\n positions[i + 1] = radius * Math.sin(phi) * Math.sin(theta)\r\n positions[i + 2] = radius * Math.cos(phi)\r\n }\r\n }\r\n\r\n mesh.geometry.attributes.position.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 获取所有粒子系统\r\n */\r\n getParticleSystems(): ParticleSystemInfo[] {\r\n return this.particleSystems\r\n }\r\n\r\n /**\r\n * 移除粒子系统\r\n */\r\n removeParticleSystem(mesh: THREE.Points): void {\r\n const index = this.particleSystems.findIndex(s => s.mesh === mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n ;(mesh.material as THREE.Material).dispose()\r\n this.particleSystems.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有粒子系统\r\n */\r\n clearAll(): void {\r\n for (const system of this.particleSystems) {\r\n this.scene.remove(system.mesh)\r\n system.mesh.geometry.dispose()\r\n ;(system.mesh.material as THREE.Material).dispose()\r\n }\r\n this.particleSystems = []\r\n }\r\n\r\n /**\r\n * 暂停/恢复粒子系统\r\n */\r\n setEnabled(mesh: THREE.Points, enabled: boolean): void {\r\n mesh.visible = enabled\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport * as CANNON from 'cannon-es'\r\nimport { Plugin } from '../Plugin'\r\nimport type { PhysicsPluginConfig } from '../../types/config.types'\r\nimport { getObjectBox3 } from '../../utils/box3'\r\n\r\n/**\r\n * 物理刚体信息\r\n */\r\nexport interface PhysicsBodyInfo {\r\n body: CANNON.Body\r\n mesh: THREE.Object3D\r\n isUpdate: boolean\r\n}\r\n\r\n/**\r\n * 默认物理配置\r\n */\r\nexport const DEFAULT_PHYSICS_CONFIG: PhysicsPluginConfig = {\r\n gravity: { x: 0, y: -9.82, z: 0 },\r\n defaultMass: 1\r\n}\r\n\r\n/**\r\n * 物理插件\r\n * 提供基于 cannon-es 的物理模拟功能\r\n */\r\nexport class PhysicsPlugin extends Plugin<PhysicsPluginConfig> {\r\n readonly name = 'physics'\r\n\r\n /** 物理世界 */\r\n private world!: CANNON.World\r\n\r\n /** 刚体列表 */\r\n private bodies: PhysicsBodyInfo[] = []\r\n\r\n /** 是否启用物理模拟 */\r\n private _enabled = true\r\n\r\n constructor(config?: Partial<PhysicsPluginConfig>) {\r\n super({ ...DEFAULT_PHYSICS_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取物理世界\r\n */\r\n get physicsWorld(): CANNON.World {\r\n return this.world\r\n }\r\n\r\n /**\r\n * 是否启用\r\n */\r\n get enabled(): boolean {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n }\r\n\r\n protected onInstall(): void {\r\n // 创建物理世界\r\n this.world = new CANNON.World()\r\n this.world.gravity.set(\r\n this.config.gravity.x,\r\n this.config.gravity.y,\r\n this.config.gravity.z\r\n )\r\n\r\n // 设置碰撞检测\r\n this.world.broadphase = new CANNON.NaiveBroadphase()\r\n // solver.iterations may not exist in all versions\r\n if ((this.world.solver as any).iterations !== undefined) {\r\n (this.world.solver as any).iterations = 10\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n if (!this._enabled) return\r\n\r\n // 更新物理世界\r\n this.world.step(1 / 60, delta, 3)\r\n\r\n // 同步物体位置\r\n for (const info of this.bodies) {\r\n if (info.isUpdate) {\r\n info.mesh.position.copy(info.body.position as any)\r\n info.mesh.quaternion.copy(info.body.quaternion as any)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置重力\r\n */\r\n setGravity(x: number, y: number, z: number): void {\r\n this.world.gravity.set(x, y, z)\r\n this.config.gravity = { x, y, z }\r\n }\r\n\r\n /**\r\n * 为物体添加物理刚体\r\n */\r\n addBody(\r\n mesh: THREE.Object3D,\r\n options?: {\r\n mass?: number\r\n shape?: 'box' | 'sphere' | 'cylinder'\r\n isStatic?: boolean\r\n friction?: number\r\n restitution?: number\r\n }\r\n ): CANNON.Body {\r\n const { center, max, min, radius } = getObjectBox3(mesh)\r\n const mass = options?.isStatic ? 0 : (options?.mass ?? this.config.defaultMass)\r\n\r\n // 创建形状\r\n let shape: CANNON.Shape\r\n\r\n switch (options?.shape) {\r\n case 'sphere':\r\n shape = new CANNON.Sphere(radius)\r\n break\r\n case 'cylinder':\r\n const cylinderRadius = Math.max(max.x - min.x, max.z - min.z) / 2\r\n const cylinderHeight = max.y - min.y\r\n shape = new CANNON.Cylinder(cylinderRadius, cylinderRadius, cylinderHeight, 16)\r\n break\r\n case 'box':\r\n default:\r\n shape = new CANNON.Box(new CANNON.Vec3(\r\n (max.x - min.x) / 2,\r\n (max.y - min.y) / 2,\r\n (max.z - min.z) / 2\r\n ))\r\n break\r\n }\r\n\r\n // 创建刚体\r\n const body = new CANNON.Body({\r\n mass,\r\n shape,\r\n position: new CANNON.Vec3(center.x, center.y, center.z)\r\n })\r\n\r\n // 设置材质属性\r\n if (options?.friction !== undefined || options?.restitution !== undefined) {\r\n body.material = new CANNON.Material()\r\n if (options.friction !== undefined) {\r\n body.material.friction = options.friction\r\n }\r\n if (options.restitution !== undefined) {\r\n body.material.restitution = options.restitution\r\n }\r\n }\r\n\r\n // 添加到物理世界\r\n this.world.addBody(body)\r\n\r\n // 保存信息\r\n const info: PhysicsBodyInfo = {\r\n body,\r\n mesh,\r\n isUpdate: !options?.isStatic\r\n }\r\n this.bodies.push(info)\r\n\r\n // 保存到物体\r\n ;(mesh as any).physicsBody = body\r\n\r\n return body\r\n }\r\n\r\n /**\r\n * 添加地面\r\n */\r\n addGround(y: number = 0): CANNON.Body {\r\n const groundBody = new CANNON.Body({\r\n mass: 0,\r\n shape: new CANNON.Plane(),\r\n position: new CANNON.Vec3(0, y, 0)\r\n })\r\n groundBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0)\r\n\r\n this.world.addBody(groundBody)\r\n\r\n return groundBody\r\n }\r\n\r\n /**\r\n * 移除刚体\r\n */\r\n removeBody(mesh: THREE.Object3D): void {\r\n const index = this.bodies.findIndex(b => b.mesh === mesh)\r\n if (index > -1) {\r\n const info = this.bodies[index]\r\n this.world.removeBody(info.body)\r\n this.bodies.splice(index, 1)\r\n delete (mesh as any).physicsBody\r\n }\r\n }\r\n\r\n /**\r\n * 获取物体的刚体\r\n */\r\n getBody(mesh: THREE.Object3D): CANNON.Body | undefined {\r\n const info = this.bodies.find(b => b.mesh === mesh)\r\n return info?.body\r\n }\r\n\r\n /**\r\n * 设置刚体是否更新\r\n */\r\n setBodyUpdate(mesh: THREE.Object3D, isUpdate: boolean): void {\r\n const info = this.bodies.find(b => b.mesh === mesh)\r\n if (info) {\r\n info.isUpdate = isUpdate\r\n if (isUpdate) {\r\n // 同步当前位置到物理世界\r\n info.body.position.copy(mesh.position as any)\r\n info.body.quaternion.copy(mesh.quaternion as any)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 施加力\r\n */\r\n applyForce(mesh: THREE.Object3D, force: THREE.Vector3, point?: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n const forceVec = new CANNON.Vec3(force.x, force.y, force.z)\r\n if (point) {\r\n const pointVec = new CANNON.Vec3(point.x, point.y, point.z)\r\n body.applyForce(forceVec, pointVec)\r\n } else {\r\n body.applyForce(forceVec)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 施加冲量\r\n */\r\n applyImpulse(mesh: THREE.Object3D, impulse: THREE.Vector3, point?: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n const impulseVec = new CANNON.Vec3(impulse.x, impulse.y, impulse.z)\r\n if (point) {\r\n const pointVec = new CANNON.Vec3(point.x, point.y, point.z)\r\n body.applyImpulse(impulseVec, pointVec)\r\n } else {\r\n body.applyImpulse(impulseVec)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置速度\r\n */\r\n setVelocity(mesh: THREE.Object3D, velocity: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n body.velocity.set(velocity.x, velocity.y, velocity.z)\r\n }\r\n }\r\n\r\n /**\r\n * 重置刚体\r\n */\r\n resetBody(mesh: THREE.Object3D): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n body.velocity.setZero()\r\n body.angularVelocity.setZero()\r\n body.position.copy(mesh.position as any)\r\n body.quaternion.copy(mesh.quaternion as any)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有刚体\r\n */\r\n clearAll(): void {\r\n for (const info of this.bodies) {\r\n this.world.removeBody(info.body)\r\n delete (info.mesh as any).physicsBody\r\n }\r\n this.bodies = []\r\n }\r\n\r\n /**\r\n * 获取所有刚体信息\r\n */\r\n getBodies(): PhysicsBodyInfo[] {\r\n return this.bodies\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { FontLoader, Font } from 'three/examples/jsm/loaders/FontLoader.js'\r\nimport { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 文本配置\r\n */\r\nexport interface TextConfig {\r\n text: string\r\n fontUrl: string\r\n size?: number\r\n height?: number\r\n curveSegments?: number\r\n bevelEnabled?: boolean\r\n bevelThickness?: number\r\n bevelSize?: number\r\n bevelOffset?: number\r\n bevelSegments?: number\r\n color?: number\r\n materialType?: 'basic' | 'standard' | 'phong'\r\n}\r\n\r\n/**\r\n * 文本插件配置\r\n */\r\nexport interface TextPluginConfig {\r\n defaultFontUrl: string\r\n defaultSize: number\r\n defaultHeight: number\r\n}\r\n\r\n/**\r\n * 默认文本配置\r\n */\r\nexport const DEFAULT_TEXT_CONFIG: TextPluginConfig = {\r\n defaultFontUrl: 'https://z2586300277.github.io/three-editor/dist/files/font/cn1.json',\r\n defaultSize: 1,\r\n defaultHeight: 0.2\r\n}\r\n\r\n/**\r\n * 文本插件\r\n * 提供 3D 文本创建功能\r\n */\r\nexport class TextPlugin extends Plugin<TextPluginConfig> {\r\n readonly name = 'text'\r\n\r\n /** 字体加载器 */\r\n private fontLoader = new FontLoader()\r\n\r\n /** 字体缓存 */\r\n private fontCache = new Map<string, Font>()\r\n\r\n /** 已创建的文本物体 */\r\n private textMeshes: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<TextPluginConfig>) {\r\n super({ ...DEFAULT_TEXT_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n this.fontCache.clear()\r\n }\r\n\r\n /**\r\n * 加载字体\r\n */\r\n async loadFont(url: string): Promise<Font> {\r\n // 检查缓存\r\n const cached = this.fontCache.get(url)\r\n if (cached) return cached\r\n\r\n return new Promise((resolve, reject) => {\r\n this.fontLoader.load(\r\n url,\r\n (font) => {\r\n this.fontCache.set(url, font)\r\n resolve(font)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 创建文本几何体\r\n */\r\n async createTextGeometry(config: TextConfig): Promise<TextGeometry> {\r\n const font = await this.loadFont(config.fontUrl || this.config.defaultFontUrl)\r\n\r\n const geometry = new TextGeometry(config.text, {\r\n font,\r\n size: config.size ?? this.config.defaultSize,\r\n height: config.height ?? this.config.defaultHeight,\r\n curveSegments: config.curveSegments ?? 12,\r\n bevelEnabled: config.bevelEnabled ?? false,\r\n bevelThickness: config.bevelThickness ?? 0.1,\r\n bevelSize: config.bevelSize ?? 0.05,\r\n bevelOffset: config.bevelOffset ?? 0,\r\n bevelSegments: config.bevelSegments ?? 3\r\n })\r\n\r\n // 居中\r\n geometry.computeBoundingBox()\r\n geometry.center()\r\n\r\n return geometry\r\n }\r\n\r\n /**\r\n * 创建文本网格\r\n */\r\n async createTextMesh(config: TextConfig): Promise<THREE.Mesh> {\r\n const geometry = await this.createTextGeometry(config)\r\n\r\n // 创建材质\r\n let material: THREE.Material\r\n\r\n switch (config.materialType) {\r\n case 'basic':\r\n material = new THREE.MeshBasicMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n case 'phong':\r\n material = new THREE.MeshPhongMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n case 'standard':\r\n default:\r\n material = new THREE.MeshStandardMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n }\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = config.text\r\n\r\n // 标记为文本物体\r\n ;(mesh as ExtendedObject3D).isTextMesh = true\r\n ;(mesh as any).fontLink = config.fontUrl || this.config.defaultFontUrl\r\n ;(mesh as any).text = config.text\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 添加文本到场景\r\n */\r\n async addToScene(config: TextConfig): Promise<THREE.Mesh> {\r\n const mesh = await this.createTextMesh(config)\r\n this.scene.add(mesh)\r\n this.textMeshes.push(mesh)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 更新文本内容\r\n */\r\n async updateText(mesh: THREE.Mesh, newText: string): Promise<void> {\r\n const fontUrl = (mesh as any).fontLink || this.config.defaultFontUrl\r\n const oldGeometry = mesh.geometry\r\n\r\n const newGeometry = await this.createTextGeometry({\r\n text: newText,\r\n fontUrl\r\n })\r\n\r\n mesh.geometry = newGeometry\r\n mesh.name = newText\r\n ;(mesh as any).text = newText\r\n\r\n oldGeometry.dispose()\r\n }\r\n\r\n /**\r\n * 获取所有文本物体\r\n */\r\n getTextMeshes(): THREE.Mesh[] {\r\n return this.textMeshes\r\n }\r\n\r\n /**\r\n * 移除文本物体\r\n */\r\n removeTextMesh(mesh: THREE.Mesh): void {\r\n const index = this.textMeshes.indexOf(mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n this.textMeshes.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有文本物体\r\n */\r\n clearAll(): void {\r\n for (const mesh of this.textMeshes) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n }\r\n this.textMeshes = []\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 雾配置\r\n */\r\nexport interface FogConfig {\r\n enabled: boolean\r\n type: 'linear' | 'exponential'\r\n color: number\r\n near?: number\r\n far?: number\r\n density?: number\r\n}\r\n\r\n/**\r\n * 天空盒配置\r\n */\r\nexport interface SkyboxConfig {\r\n type: 'color' | 'texture' | 'cubeTexture' | 'hdr' | 'equirectangular'\r\n color?: number\r\n url?: string\r\n urls?: string[]\r\n}\r\n\r\n/**\r\n * 环境插件配置\r\n */\r\nexport interface EnvironmentPluginConfig {\r\n fog: FogConfig\r\n skybox: SkyboxConfig | null\r\n environmentMap: string | null\r\n environmentIntensity: number\r\n backgroundBlurriness: number\r\n backgroundIntensity: number\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_ENVIRONMENT_CONFIG: EnvironmentPluginConfig = {\r\n fog: {\r\n enabled: false,\r\n type: 'linear',\r\n color: 0xcccccc,\r\n near: 1,\r\n far: 1000,\r\n density: 0.00025\r\n },\r\n skybox: null,\r\n environmentMap: null,\r\n environmentIntensity: 1,\r\n backgroundBlurriness: 0,\r\n backgroundIntensity: 1\r\n}\r\n\r\n/**\r\n * 环境插件\r\n * 提供雾、天空盒、环境贴图等环境功能\r\n */\r\nexport class EnvironmentPlugin extends Plugin<EnvironmentPluginConfig> {\r\n readonly name = 'environment'\r\n\r\n /** RGBE 加载器 */\r\n private rgbeLoader = new RGBELoader()\r\n\r\n /** 立方体纹理加载器 */\r\n private cubeTextureLoader = new THREE.CubeTextureLoader()\r\n\r\n /** 纹理加载器 */\r\n private textureLoader = new THREE.TextureLoader()\r\n\r\n /** 当前环境贴图 */\r\n private currentEnvMap: THREE.Texture | null = null\r\n\r\n /** 当前背景 */\r\n private currentBackground: THREE.Color | THREE.Texture | null = null\r\n\r\n constructor(config?: Partial<EnvironmentPluginConfig>) {\r\n super({ ...DEFAULT_ENVIRONMENT_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 应用初始配置\r\n if (this.config.fog.enabled) {\r\n this.setFog(this.config.fog)\r\n }\r\n if (this.config.skybox) {\r\n this.setSkybox(this.config.skybox)\r\n }\r\n if (this.config.environmentMap) {\r\n this.setEnvironmentMap(this.config.environmentMap)\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearFog()\r\n this.clearBackground()\r\n this.clearEnvironmentMap()\r\n }\r\n\r\n /**\r\n * 设置雾\r\n */\r\n setFog(config: Partial<FogConfig>): void {\r\n Object.assign(this.config.fog, config)\r\n\r\n if (!this.config.fog.enabled) {\r\n this.clearFog()\r\n return\r\n }\r\n\r\n const color = new THREE.Color(this.config.fog.color)\r\n\r\n if (this.config.fog.type === 'linear') {\r\n this.scene.fog = new THREE.Fog(\r\n color,\r\n this.config.fog.near ?? 1,\r\n this.config.fog.far ?? 1000\r\n )\r\n } else {\r\n this.scene.fog = new THREE.FogExp2(\r\n color,\r\n this.config.fog.density ?? 0.00025\r\n )\r\n }\r\n }\r\n\r\n /**\r\n * 清除雾\r\n */\r\n clearFog(): void {\r\n this.scene.fog = null\r\n this.config.fog.enabled = false\r\n }\r\n\r\n /**\r\n * 更新雾颜色\r\n */\r\n setFogColor(color: number): void {\r\n this.config.fog.color = color\r\n if (this.scene.fog) {\r\n this.scene.fog.color.setHex(color)\r\n }\r\n }\r\n\r\n /**\r\n * 设置天空盒/背景\r\n */\r\n async setSkybox(config: SkyboxConfig): Promise<void> {\r\n this.config.skybox = config\r\n\r\n switch (config.type) {\r\n case 'color':\r\n this.setBackgroundColor(config.color ?? 0x000000)\r\n break\r\n case 'texture':\r\n if (config.url) {\r\n await this.setBackgroundTexture(config.url)\r\n }\r\n break\r\n case 'cubeTexture':\r\n if (config.urls && config.urls.length === 6) {\r\n await this.setBackgroundCubeTexture(config.urls)\r\n }\r\n break\r\n case 'hdr':\r\n if (config.url) {\r\n await this.setBackgroundHDR(config.url)\r\n }\r\n break\r\n case 'equirectangular':\r\n if (config.url) {\r\n await this.setBackgroundEquirectangular(config.url)\r\n }\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n */\r\n setBackgroundColor(color: number): void {\r\n this.currentBackground = new THREE.Color(color)\r\n this.scene.background = this.currentBackground\r\n }\r\n\r\n /**\r\n * 设置背景纹理\r\n */\r\n async setBackgroundTexture(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(\r\n url,\r\n (texture) => {\r\n this.currentBackground = texture\r\n this.scene.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 */\r\n async setBackgroundCubeTexture(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(\r\n urls,\r\n (texture) => {\r\n this.currentBackground = texture\r\n this.scene.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 * 设置 HDR 背景\r\n */\r\n async setBackgroundHDR(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.rgbeLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentBackground = texture\r\n this.scene.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 */\r\n async setBackgroundEquirectangular(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentBackground = texture\r\n this.scene.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 */\r\n clearBackground(): void {\r\n if (this.currentBackground instanceof THREE.Texture) {\r\n this.currentBackground.dispose()\r\n }\r\n this.scene.background = null\r\n this.currentBackground = null\r\n this.config.skybox = null\r\n }\r\n\r\n /**\r\n * 设置环境贴图\r\n */\r\n async setEnvironmentMap(url: string): Promise<THREE.Texture> {\r\n this.config.environmentMap = url\r\n\r\n return new Promise((resolve, reject) => {\r\n this.rgbeLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentEnvMap = texture\r\n this.scene.environment = texture\r\n // environmentIntensity is available in Three.js r155+\r\n if ('environmentIntensity' in this.scene) {\r\n (this.scene as any).environmentIntensity = this.config.environmentIntensity\r\n }\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 async setCubeEnvironmentMap(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(\r\n urls,\r\n (texture) => {\r\n this.currentEnvMap = texture\r\n this.scene.environment = 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 clearEnvironmentMap(): void {\r\n if (this.currentEnvMap) {\r\n this.currentEnvMap.dispose()\r\n }\r\n this.scene.environment = null\r\n this.currentEnvMap = null\r\n this.config.environmentMap = null\r\n }\r\n\r\n /**\r\n * 设置环境强度\r\n */\r\n setEnvironmentIntensity(intensity: number): void {\r\n this.config.environmentIntensity = intensity\r\n if ('environmentIntensity' in this.scene) {\r\n (this.scene as any).environmentIntensity = intensity\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景模糊度\r\n */\r\n setBackgroundBlurriness(blurriness: number): void {\r\n this.config.backgroundBlurriness = blurriness\r\n if ('backgroundBlurriness' in this.scene) {\r\n (this.scene as any).backgroundBlurriness = blurriness\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景强度\r\n */\r\n setBackgroundIntensity(intensity: number): void {\r\n this.config.backgroundIntensity = intensity\r\n if ('backgroundIntensity' in this.scene) {\r\n (this.scene as any).backgroundIntensity = intensity\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前环境贴图\r\n */\r\n getEnvironmentMap(): THREE.Texture | null {\r\n return this.currentEnvMap\r\n }\r\n\r\n /**\r\n * 获取当前背景\r\n */\r\n getBackground(): THREE.Color | THREE.Texture | null {\r\n return this.currentBackground\r\n }\r\n\r\n /**\r\n * 获取雾配置\r\n */\r\n getFogConfig(): FogConfig {\r\n return { ...this.config.fog }\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): EnvironmentPluginConfig {\r\n return { ...this.config }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 序列化数据结构\r\n */\r\nexport interface SerializedScene {\r\n version: string\r\n metadata: {\r\n generator: string\r\n timestamp: number\r\n }\r\n scene: {\r\n background: any\r\n fog: any\r\n environment: any\r\n }\r\n camera: {\r\n type: string\r\n position: { x: number; y: number; z: number }\r\n rotation: { x: number; y: number; z: number }\r\n fov?: number\r\n near: number\r\n far: number\r\n zoom: number\r\n }\r\n objects: SerializedObject[]\r\n plugins: Record<string, any>\r\n}\r\n\r\n/**\r\n * 序列化物体结构\r\n */\r\nexport interface SerializedObject {\r\n uuid: string\r\n name: string\r\n type: string\r\n position: { x: number; y: number; z: number }\r\n rotation: { x: number; y: number; z: number }\r\n scale: { x: number; y: number; z: number }\r\n visible: boolean\r\n userData: any\r\n children?: SerializedObject[]\r\n geometry?: any\r\n material?: any\r\n}\r\n\r\n/**\r\n * 序列化插件配置\r\n */\r\nexport interface SerializationPluginConfig {\r\n version: string\r\n includeGeometry: boolean\r\n includeMaterial: boolean\r\n includeUserData: boolean\r\n excludeHelpers: boolean\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_SERIALIZATION_CONFIG: SerializationPluginConfig = {\r\n version: '1.0.0',\r\n includeGeometry: false,\r\n includeMaterial: true,\r\n includeUserData: true,\r\n excludeHelpers: true\r\n}\r\n\r\n/**\r\n * 序列化插件\r\n * 提供场景保存和恢复功能\r\n */\r\nexport class SerializationPlugin extends Plugin<SerializationPluginConfig> {\r\n readonly name = 'serialization'\r\n\r\n constructor(config?: Partial<SerializationPluginConfig>) {\r\n super({ ...DEFAULT_SERIALIZATION_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 序列化场景\r\n */\r\n serialize(): SerializedScene {\r\n const scene = this.scene\r\n const camera = this.camera\r\n\r\n return {\r\n version: this.config.version,\r\n metadata: {\r\n generator: 'ThreeEditor',\r\n timestamp: Date.now()\r\n },\r\n scene: this.serializeSceneProperties(),\r\n camera: this.serializeCamera(camera),\r\n objects: this.serializeObjects(scene.children),\r\n plugins: this.serializePlugins()\r\n }\r\n }\r\n\r\n /**\r\n * 序列化场景属性\r\n */\r\n private serializeSceneProperties(): SerializedScene['scene'] {\r\n const scene = this.scene\r\n\r\n return {\r\n background: this.serializeBackground(scene.background),\r\n fog: this.serializeFog(scene.fog as THREE.Fog | THREE.FogExp2 | null),\r\n environment: scene.environment ? 'has_environment' : null\r\n }\r\n }\r\n\r\n /**\r\n * 序列化背景\r\n */\r\n private serializeBackground(background: THREE.Color | THREE.Texture | THREE.CubeTexture | null): any {\r\n if (!background) return null\r\n\r\n if (background instanceof THREE.Color) {\r\n return {\r\n type: 'color',\r\n value: background.getHex()\r\n }\r\n }\r\n\r\n if (background instanceof THREE.Texture) {\r\n return {\r\n type: 'texture',\r\n // 纹理 URL 需要从 userData 或其他地方获取\r\n url: (background as any).sourceFile || null\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 序列化雾\r\n */\r\n private serializeFog(fog: THREE.Fog | THREE.FogExp2 | null): any {\r\n if (!fog) return null\r\n\r\n if (fog instanceof THREE.Fog) {\r\n return {\r\n type: 'linear',\r\n color: fog.color.getHex(),\r\n near: fog.near,\r\n far: fog.far\r\n }\r\n }\r\n\r\n if (fog instanceof THREE.FogExp2) {\r\n return {\r\n type: 'exponential',\r\n color: fog.color.getHex(),\r\n density: fog.density\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 序列化相机\r\n */\r\n private serializeCamera(camera: THREE.Camera): SerializedScene['camera'] {\r\n const result: SerializedScene['camera'] = {\r\n type: camera.type,\r\n position: {\r\n x: camera.position.x,\r\n y: camera.position.y,\r\n z: camera.position.z\r\n },\r\n rotation: {\r\n x: camera.rotation.x,\r\n y: camera.rotation.y,\r\n z: camera.rotation.z\r\n },\r\n near: (camera as THREE.PerspectiveCamera).near,\r\n far: (camera as THREE.PerspectiveCamera).far,\r\n zoom: (camera as THREE.PerspectiveCamera).zoom\r\n }\r\n\r\n if (camera instanceof THREE.PerspectiveCamera) {\r\n result.fov = camera.fov\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化物体列表\r\n */\r\n private serializeObjects(objects: THREE.Object3D[]): SerializedObject[] {\r\n const result: SerializedObject[] = []\r\n\r\n for (const obj of objects) {\r\n // 排除辅助物体\r\n if (this.config.excludeHelpers && this.isHelper(obj)) {\r\n continue\r\n }\r\n\r\n const serialized = this.serializeObject(obj)\r\n if (serialized) {\r\n result.push(serialized)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化单个物体\r\n */\r\n private serializeObject(obj: THREE.Object3D): SerializedObject | null {\r\n const result: SerializedObject = {\r\n uuid: obj.uuid,\r\n name: obj.name,\r\n type: obj.type,\r\n position: {\r\n x: obj.position.x,\r\n y: obj.position.y,\r\n z: obj.position.z\r\n },\r\n rotation: {\r\n x: obj.rotation.x,\r\n y: obj.rotation.y,\r\n z: obj.rotation.z\r\n },\r\n scale: {\r\n x: obj.scale.x,\r\n y: obj.scale.y,\r\n z: obj.scale.z\r\n },\r\n visible: obj.visible,\r\n userData: this.config.includeUserData ? obj.userData : {}\r\n }\r\n\r\n // 序列化几何体\r\n if (this.config.includeGeometry && (obj as THREE.Mesh).geometry) {\r\n result.geometry = this.serializeGeometry((obj as THREE.Mesh).geometry)\r\n }\r\n\r\n // 序列化材质\r\n if (this.config.includeMaterial && (obj as THREE.Mesh).material) {\r\n result.material = this.serializeMaterial((obj as THREE.Mesh).material)\r\n }\r\n\r\n // 递归序列化子物体\r\n if (obj.children.length > 0) {\r\n result.children = this.serializeObjects(obj.children)\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化几何体\r\n */\r\n private serializeGeometry(geometry: THREE.BufferGeometry): any {\r\n return {\r\n type: geometry.type,\r\n uuid: geometry.uuid,\r\n parameters: (geometry as any).parameters || {}\r\n }\r\n }\r\n\r\n /**\r\n * 序列化材质\r\n */\r\n private serializeMaterial(material: THREE.Material | THREE.Material[]): any {\r\n if (Array.isArray(material)) {\r\n return material.map(m => this.serializeSingleMaterial(m))\r\n }\r\n return this.serializeSingleMaterial(material)\r\n }\r\n\r\n /**\r\n * 序列化单个材质\r\n */\r\n private serializeSingleMaterial(material: THREE.Material): any {\r\n const result: any = {\r\n type: material.type,\r\n uuid: material.uuid,\r\n name: material.name,\r\n opacity: material.opacity,\r\n transparent: material.transparent,\r\n visible: material.visible,\r\n side: material.side\r\n }\r\n\r\n // 添加颜色属性\r\n if ((material as THREE.MeshBasicMaterial).color) {\r\n result.color = (material as THREE.MeshBasicMaterial).color.getHex()\r\n }\r\n\r\n // 添加其他常用属性\r\n if ((material as THREE.MeshStandardMaterial).metalness !== undefined) {\r\n result.metalness = (material as THREE.MeshStandardMaterial).metalness\r\n }\r\n if ((material as THREE.MeshStandardMaterial).roughness !== undefined) {\r\n result.roughness = (material as THREE.MeshStandardMaterial).roughness\r\n }\r\n if ((material as THREE.MeshStandardMaterial).emissive) {\r\n result.emissive = (material as THREE.MeshStandardMaterial).emissive.getHex()\r\n }\r\n if ((material as THREE.MeshStandardMaterial).emissiveIntensity !== undefined) {\r\n result.emissiveIntensity = (material as THREE.MeshStandardMaterial).emissiveIntensity\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化插件状态\r\n */\r\n private serializePlugins(): Record<string, any> {\r\n const result: Record<string, any> = {}\r\n\r\n // 获取所有已安装的插件并序列化它们的配置\r\n // Note: This requires access to plugin manager through context\r\n const pluginManager = (this.context as any).pluginManager\r\n if (pluginManager && typeof pluginManager.getAll === 'function') {\r\n const plugins = pluginManager.getAll()\r\n for (const plugin of plugins) {\r\n if (plugin.name !== this.name && typeof (plugin as any).getConfig === 'function') {\r\n result[plugin.name] = (plugin as any).getConfig()\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 判断是否为辅助物体\r\n */\r\n private isHelper(obj: THREE.Object3D): boolean {\r\n return (\r\n obj.name.startsWith('__') ||\r\n obj.type.includes('Helper') ||\r\n obj.type === 'TransformControls' ||\r\n obj.type === 'TransformControlsPlane'\r\n )\r\n }\r\n\r\n /**\r\n * 反序列化场景\r\n */\r\n async deserialize(data: SerializedScene): Promise<void> {\r\n // 恢复相机\r\n this.deserializeCamera(data.camera)\r\n\r\n // 恢复场景属性\r\n this.deserializeSceneProperties(data.scene)\r\n\r\n // 恢复插件配置\r\n this.deserializePlugins(data.plugins)\r\n\r\n // 发出事件\r\n this.events.emit('scene:deserialized' as any, data)\r\n }\r\n\r\n /**\r\n * 反序列化相机\r\n */\r\n private deserializeCamera(cameraData: SerializedScene['camera']): void {\r\n const camera = this.camera\r\n\r\n camera.position.set(\r\n cameraData.position.x,\r\n cameraData.position.y,\r\n cameraData.position.z\r\n )\r\n\r\n camera.rotation.set(\r\n cameraData.rotation.x,\r\n cameraData.rotation.y,\r\n cameraData.rotation.z\r\n )\r\n\r\n if (camera instanceof THREE.PerspectiveCamera && cameraData.fov) {\r\n camera.fov = cameraData.fov\r\n camera.near = cameraData.near\r\n camera.far = cameraData.far\r\n camera.zoom = cameraData.zoom\r\n camera.updateProjectionMatrix()\r\n }\r\n }\r\n\r\n /**\r\n * 反序列化场景属性\r\n */\r\n private deserializeSceneProperties(sceneData: SerializedScene['scene']): void {\r\n // 恢复背景\r\n if (sceneData.background) {\r\n if (sceneData.background.type === 'color') {\r\n this.scene.background = new THREE.Color(sceneData.background.value)\r\n }\r\n }\r\n\r\n // 恢复雾\r\n if (sceneData.fog) {\r\n if (sceneData.fog.type === 'linear') {\r\n this.scene.fog = new THREE.Fog(\r\n sceneData.fog.color,\r\n sceneData.fog.near,\r\n sceneData.fog.far\r\n )\r\n } else if (sceneData.fog.type === 'exponential') {\r\n this.scene.fog = new THREE.FogExp2(\r\n sceneData.fog.color,\r\n sceneData.fog.density\r\n )\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 反序列化插件配置\r\n */\r\n private deserializePlugins(pluginsData: Record<string, any>): void {\r\n const pluginManager = (this.context as any).pluginManager\r\n if (!pluginManager || typeof pluginManager.get !== 'function') return\r\n\r\n for (const [pluginName, config] of Object.entries(pluginsData)) {\r\n const plugin = pluginManager.get(pluginName)\r\n if (plugin && typeof (plugin as any).setConfig === 'function') {\r\n (plugin as any).setConfig(config)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出为 JSON 字符串\r\n */\r\n toJSON(): string {\r\n return JSON.stringify(this.serialize(), null, 2)\r\n }\r\n\r\n /**\r\n * 从 JSON 字符串导入\r\n */\r\n async fromJSON(json: string): Promise<void> {\r\n const data = JSON.parse(json) as SerializedScene\r\n await this.deserialize(data)\r\n }\r\n\r\n /**\r\n * 下载场景文件\r\n */\r\n download(filename: string = 'scene.json'): void {\r\n const json = this.toJSON()\r\n const blob = new Blob([json], { type: 'application/json' })\r\n const url = URL.createObjectURL(blob)\r\n\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n link.click()\r\n\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n /**\r\n * 从文件加载场景\r\n */\r\n async loadFromFile(file: File): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = async (e) => {\r\n try {\r\n const json = e.target?.result as string\r\n await this.fromJSON(json)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n }\r\n }\r\n reader.onerror = reject\r\n reader.readAsText(file)\r\n })\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): SerializationPluginConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SerializationPluginConfig>): void {\r\n Object.assign(this.config, config)\r\n }\r\n}\r\n"],"names":["PluginManager","context","this","plugins","Map","pluginManager","plugin","name","has","dependencies","dep","Error","result","install","Promise","then","set","events","emit","catch","error","use","get","otherName","otherPlugin","includes","uninstall","delete","getAll","Array","from","values","getNames","keys","dispose","names","reverse","remove","Plugin","config","_installed","unsubscribers","registerLifecycleHooks","onInstall","onUninstall","unsubscribe","isInstalled","onSceneReady","on","scene","push","onUpdate","prototype","delta","elapsed","onResize","width","height","onBeforeDispose","engine","camera","renderer","event","callback","DEFAULT_ORBIT_CONFIG","enableDamping","dampingFactor","minDistance","maxDistance","minZoom","maxPolarAngle","Math","PI","enablePan","enableZoom","enableRotate","OrbitControllerPlugin","super","viewAngleList","controls","_controls","target","OrbitControls","domElement","applyConfig","subscribe","update","addEventListener","x","y","z","enabled","viewAngle","position","clone","getViewAngleList","clearViewAngleList","reset","DEFAULT_TRANSFORM_CONFIG","mode","space","showX","showY","showZ","translationSnap","rotationSnap","scaleSnap","TransformControllerPlugin","box3Helper","object","TransformControls","traverse","child","isTransformControls","add","THREE","Box3Helper","Box3","visible","orbitController","value","dragChangeCallback","box","setFromObject","detach","setMode","setSpace","setTranslationSnap","setRotationSnap","setScaleSnap","attach","size","setSize","DEFAULT_LOADER_CONFIG","dracoPath","useDraco","LoaderPlugin","fontCache","dracoLoader","DRACOLoader","setDecoderPath","gltfLoader","GLTFLoader","setDRACOLoader","fbxLoader","FBXLoader","objLoader","OBJLoader","mtlLoader","MTLLoader","textureLoader","TextureLoader","cubeTextureLoader","CubeTextureLoader","fontLoader","FontLoader","clear","path","rootInfo","type","url","loadGLTF","loadFBX","loadOBJ","service","progress","complete","load","gltf","model","animations","xhr","percent","loaded","total","isMesh","mesh","isArray","material","forEach","m","side","DoubleSide","mtlUrl","replace","materials","preload","setMaterials","resolve","reject","urls","cached","font","video","document","createElement","crossOrigin","src","muted","loop","play","VideoTexture","Set","DEFAULT_COMPOSER_CONFIG","outline","edgeStrength","edgeGlow","edgeThickness","pulsePeriod","visibleEdgeColor","hiddenEdgeColor","bloom","strength","radius","threshold","ssao","intensity","scale","ssr","thickness","infiniteThick","opacity","screenMask","ComposerPlugin","_renderWay","ssrMeshList","composer","_composer","outlinePass","_outlinePass","bloomPass","_bloomPass","saoPass","_saoPass","_ssrPass","renderWay","container","parentElement","clientWidth","clientHeight","pixelRatio","getPixelRatio","EffectComposer","setPixelRatio","renderPass","RenderPass","addPass","SAOPass","params","saoIntensity","saoScale","UnrealBloomPass","Vector2","SSRPass","selects","groundReflector","OutlinePass","renderToScreen","overlayMaterial","blending","CustomBlending","blendSrc","OneFactor","outputPass","OutputPass","_fxaaPass","ShaderPass","FXAAShader","uniforms","render","way","objects","selectedObjects","clearOutlineObjects","index","indexOf","splice","CSSRendererPlugin","constructor","arguments","CSS2DObject","CSS3DObject","css2dRenderer","_css2dRenderer","css3dRenderer","_css3dRenderer","CSS3DRenderer","setupCSSRenderer","CSS2DRenderer","style","top","left","pointerEvents","zIndex","appendChild","removeChild","element","enablePointerEvents","copy","destroy","createCSS2DObject","createCSS3DObject","getWebGLMouse","offsetX","offsetY","getWebGLMouseFromContainer","rect","getBoundingClientRect","clientX","clientY","_raycaster","Raycaster","_box","raycastObjects","mouse","setFromCamera","candidates","obj","objAny","isHelper","isEmpty","ray","intersectsBox","length","intersectObjects","filter","i","text","getRootModel","current","parent","createRaycaster","raycaster","near","far","DEFAULT_EDITOR_CONFIG","modes","defaultMode","isTransformChildren","enableKeyboard","EditorPlugin","_currentInfo","keydownHandler","_mode","currentInfo","disableKeyboard","previous","transformPlugin","getPlugin","composerPlugin","intersect","children","find","rootObj","info","point","rootModel","setOutlineObjects","drawEventCallback","currentModel","currentRootModel","targetObjects","intersects","select","e","key","toLowerCase","deselect","removeEventListener","colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","r","round","g","b","a","h","s","toFixed","v","str","hex","ARR_EACH","ARR_SLICE","slice","Common","BREAK","extend","each","call","isObject","Object","isUndefined","bind","defaults","compose","toCall","args","apply","itr","scope","l","_key","defer","fnc","setTimeout","debounce","func","callImmediately","timeout","callNow","clearTimeout","toArray","isNull","isNaN","_isNaN","_x","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","match","parseInt","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","floor","f","p","q","t","c","rgb_to_hsv","min","max","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","property","receiver","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","self","ReferenceError","Color","defineRGBComponent","component","componentHexIndex","recalculateRGB","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","k","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","right","bottom","fakeEvent","eventType","pars","aux","className","evt","createEvent","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","undefined","initEvent","dispatchEvent","newBool","bool","attachEvent","unbind","detachEvent","addClass","classes","split","join","removeClass","removeAttribute","hasClass","RegExp","getWidth","getComputedStyle","getHeight","getOffset","el","offset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","href","BooleanController","_this2","_this","__prev","__checkbox","setAttribute","setValue","checked","OptionController","opts","options","__select","map","opt","innerHTML","desiredValue","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","decimals","tenTo","i1","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","onTouchMove","touches","onTouchEnd","__foreground","pct","FunctionController","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","onBlur","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","borderRight","marginRight","display","cursor","background","linearGradient","cssText","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","css","cssContent","indoc","doc","injected","head","getElementsByTagName","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","WebkitTransition","transition","body","hide","webkitTransform","layout","innerWidth","innerHeight","styleSheet","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","preset","scrollable","root","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","gui","__preset_select","revert","setWidth","closed","CLASS_CLOSED","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","stringify","getSaveObject","saveToLocalStorageIfPossible","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","CLASS_CONTROLLER_ROW","__gui","_options","nextSibling","nextElementSibling","_nextSibling","_name","firstElementChild","listen","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","location","addPresetOption","setSelected","showHideExplain","explain","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","w","__save_row","getCurrentPreset","useInitialValues","savedValues","updateDisplays","controllerArray","toggleHide","CLASS_TOO_TALL","_keydownHandler","which","addColor","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","open","close","show","node","offsetHeight","remember","div","firstChild","gears","button","button2","button3","getElementById","localStorageCheckBox","newConstructorTextArea","focus","save","presetName","prompt","saveAs","GUI$1","DEFAULT_GUI_CONFIG","useProxy","geometryList","materialList","lightTypeList","drawModeList","pointModeList","GUIPlugin","_gui","sceneFolder","controlFolder","meshFolder","animationFolder","selectPanel","modelListFolder","innerMeshListFolder","drawMeshListFolder","geoMapListFolder","particleListFolder","borderGroupListFolder","textMeshListFolder","designMeshListFolder","lightListFolder","handlerParams","openKey","innerMeshParams","geometryType","materialType","drawParams","pointMode","geoMapParams","particleParams","particlesSum","inner","outer","maxVelocity","mapUrl","sportType","shaderCodeName","borderGroupParams","dlength","textMeshParams","fontLink","designMeshParams","lightParams","lightType","createGUI","createSceneFolder","createControlFolder","createMeshFolder","createAnimationFolder","createRendererFolder","createCameraFolder","createOrbitControlsFolder","createEnvironmentFolder","createLightGroupFolder","createComposerFolder","toneMapping","toneMappingExposure","shadowMapEnabled","shadowMap","shadowMapType","outputColorSpace","NoToneMapping","LinearToneMapping","Reinhard","ReinhardToneMapping","Cineon","CineonToneMapping","ACESFilmic","ACESFilmicToneMapping","updateProjectionMatrix","posFolder","fogFolder","fogParams","fog","getHexString","Fog","fn","light","createLight","addLightPanel","Light","AmbientLight","dirLight","DirectionalLight","castShadow","pointLight","PointLight","spotLight","SpotLight","HemisphereLight","rectLight","RectAreaLight","id","colorParams","outlineFolder","bloomFolder","createSyncTransformFolder","createStatsFolder","createHelpersFolder","createTransformControlsFolder","syncPosition","syncRotation","syncScale","showStats","statsMode","FPS","MS","MB","showGrid","showAxes","gridSize","gridDivisions","axesSize","divisions","snapParams","createModelFolder","createDrawFolder","createInnerMeshFolder","createGeoMapFolder","createParticleFolder","createBorderGroupFolder","createTextMeshFolder","createDesignMeshFolder","openFileDialog","file","orbitPlugin","addMeshControlPanel","addGroupGlobalPanel","addGroupAnimationPanel","center","getCenter","Vector3","getSize","distance","rotFolder","rotation","scaleFolder","group","globalConfig","useGlobalConfig","isSaveChildren","isSaveMaterials","receiveShadow","envMap","envMapIntensity","reflectivity","mat","animParams","animationPlayParams","initPlay","speed","actionIndexs","fill","startTime","listFolder","clip","stop","geometry","createGeometry","createMaterial","Mesh","isInnerMesh","addInnerMeshPanel","geoType","addMaterialPanel","emissive","emissiveParams","FrontSide","BackSide","wireframe","metalness","roughness","initFolder","createOrbitAnimationFolder","createMeshAnimationFolder","createMoveAnimationFolder","autoRotate","autoRotateSpeed","duration","ease","repeat","yoyo","action","destroySelectPanel","addShaderPanel","addDesignPanel","RootMaterials","createSelectMeshPanel","rootMaterials","matFolder","shaderType","reflector","refractor","BoxGeometry","SphereGeometry","CylinderGeometry","ConeGeometry","TorusGeometry","PlaneGeometry","TorusKnotGeometry","DodecahedronGeometry","IcosahedronGeometry","OctahedronGeometry","TetrahedronGeometry","MeshBasicMaterial","MeshStandardMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshPhysicalMaterial","MeshToonMaterial","accept","input","onchange","files","click","getConfig","getMode","DEFAULT_GIZMO_CONFIG","grid","colorCenterLine","colorGrid","axes","stats","viewHelper","GizmoPlugin","gridHelper","axesHelper","currentBox3","createGridHelper","createAxesHelper","createStats","createViewHelper","data","onObjectSelected","onObjectDeselected","removeGridHelper","removeAxesHelper","removeStats","removeViewHelper","removeBox3Helper","GridHelper","assign","AxesHelper","Stats","showPanel","updateStats","ViewHelper","animating","createBox3Helper","getGridHelper","getAxesHelper","getBox3Helper","getDistanceScalePoint","point1","point2","distanceTo","subVectors","normalize","multiplyScalar","getPointAtDistance","degToRad","degrees","radToDeg","radians","clamp","lerp","start","end","smoothstep","edge0","edge1","getObjectBox3","getBestViewTarget","getObjectViews","fov","tan","frontView","backView","leftView","rightView","topView","bottomView","helper","DEFAULT_SHADER_CONFIG","mixRatio","ShaderPlugin","presets","appliedObjects","shaderAnimations","registerBuiltinPresets","registerPreset","getCommonUniforms","fragHeader","getUniformDeclarations","fragBody","animate","iTime","circleWidth","unit","isDisCard","topColor","bottomColor","exponent","vertexHeader","waterColor","waveHeight","waveSpeed","Points","PointsCount","mixColor","hasUv","entries","uniform","getPresetNames","getMaterials","applyShaderToMaterial","shaderName","onBeforeCompile","shader","vertexShader","fragmentShader","fragFunc","needsUpdate","animIndex","findIndex","DEFAULT_ANIMATION_CONFIG","defaultDuration","defaultEase","AnimationPlugin","mixers","curveAnimations","tweens","stopAll","mixer","clock","getDelta","anim","pause","time","frameEndCallback","curve","getPointAt","frameCallback","playParams","Clock","AnimationMixer","actions","_","clipAction","LoopRepeat","LoopOnce","timeScale","clampWhenFinished","paused","to","query","tween","gsap","yoyoEase","onComplete","resume","kill","all","transform","promises","Date","now","createCurveAnimation","lookAhead","nextT","nextPoint","lookAt","pauseAll","resumeAll","DEFAULT_DRAWING_CONFIG","defaultPointMode","defaultMaterialType","fenceHeight","lineWidth","DrawingPlugin","currentPoints","previewMesh","_isDrawing","drawnObjects","_pointMode","cancel","updatePreview","targetPoint","geoInfo","properties","centroidCoord3","getTransformedVector","centroid","initTranslate","sub","centerCoord3","addPoint","createFence","createPlane","createCurve","createLine","isDrawMesh","points","undoPoint","pop","isPreview","vertices","indices","uvs","u","base","BufferGeometry","Float32BufferAttribute","setIndex","computeVertexNormals","transparent","shape","Shape","moveTo","lineTo","closePath","ShapeGeometry","rotateX","avgY","reduce","sum","translate","CatmullRomCurve3","curvePoints","getPoints","setFromPoints","LineBasicMaterial","linewidth","line","Line","isCurveMesh","curvePath","getDrawnObjects","d","getCurveList","DEFAULT_GEOMAP_CONFIG","coordinateScale","GeoMapPlugin","geoGroups","clearAll","response","fetch","json","createGeoGroup","depth","isGeoGroup","centerGroup","features","onGroupLoaded","Group","feature","meshes","createFeatureMeshes","polygons","coordinates","polygon","createPolygonMesh","coordToVector3","outerRing","firstPoint","coordToVector2","hole","Path","holeRing","holeFirst","j","holes","ExtrudeGeometry","bevelEnabled","coord","lng","lat","proj4","translationOriginDiff","vec3","transformed","multiply","applyEuler","getGeoGroups","found","setHex","emissiveIntensity","DEFAULT_GEOMETRY_CONFIG","defaultSize","GeometryPlugin","geometryTypes","innerMeshes","widthSegments","heightSegments","depthSegments","phiStart","phiLength","thetaStart","thetaLength","radiusTop","radiusBottom","radialSegments","openEnded","tube","tubularSegments","arc","CapsuleGeometry","capSegments","createMesh","getInnerMeshes","oldGeometry","DEFAULT_MATERIAL_CONFIG","defaultType","defaultColor","MaterialPlugin","materialTypes","commonParams","flatShading","MeshNormalMaterial","MeshDepthMaterial","_originalMaterials","applyParams","changeMaterial","originalMaterials","copyMaterialProperties","revertMaterial","source","tgt","isCloneMaterial","originMaterial","DEFAULT_PARTICLE_CONFIG","ParticlePlugin","sportTypes","particleSystems","system","updateParticleSystem","cfg","positions","Float32Array","velocities","i3","random","theta","phi","acos","sin","cos","BufferAttribute","PointsMaterial","depthWrite","AdditiveBlending","texture","isParticleMesh","systemInfo","createParticleSystem","attributes","array","sqrt","getParticleSystems","DEFAULT_PHYSICS_CONFIG","gravity","defaultMass","PhysicsPlugin","bodies","_enabled","physicsWorld","world","CANNON","World","broadphase","NaiveBroadphase","solver","iterations","isUpdate","quaternion","mass","isStatic","Sphere","cylinderRadius","cylinderHeight","Cylinder","Box","Vec3","Body","friction","restitution","Material","addBody","physicsBody","groundBody","Plane","setFromEuler","removeBody","force","getBody","forceVec","pointVec","applyForce","impulse","impulseVec","applyImpulse","velocity","setZero","angularVelocity","getBodies","DEFAULT_TEXT_CONFIG","defaultFontUrl","defaultHeight","TextPlugin","textMeshes","loadFont","fontUrl","TextGeometry","curveSegments","bevelThickness","bevelSize","bevelOffset","bevelSegments","computeBoundingBox","createTextGeometry","isTextMesh","createTextMesh","newText","newGeometry","DEFAULT_ENVIRONMENT_CONFIG","density","skybox","environmentMap","environmentIntensity","backgroundBlurriness","backgroundIntensity","EnvironmentPlugin","rgbeLoader","RGBELoader","currentEnvMap","currentBackground","setFog","setSkybox","setEnvironmentMap","clearFog","clearBackground","clearEnvironmentMap","FogExp2","setBackgroundColor","setBackgroundTexture","setBackgroundCubeTexture","setBackgroundHDR","setBackgroundEquirectangular","mapping","EquirectangularReflectionMapping","Texture","environment","blurriness","getFogConfig","DEFAULT_SERIALIZATION_CONFIG","version","includeGeometry","includeMaterial","includeUserData","excludeHelpers","SerializationPlugin","metadata","generator","timestamp","serializeSceneProperties","serializeCamera","serializeObjects","serializePlugins","serializeBackground","serializeFog","getHex","sourceFile","zoom","PerspectiveCamera","serialized","serializeObject","uuid","userData","serializeGeometry","serializeMaterial","parameters","serializeSingleMaterial","startsWith","deserializeCamera","deserializeSceneProperties","deserializePlugins","cameraData","sceneData","pluginsData","pluginName","setConfig","toJSON","serialize","deserialize","filename","blob","Blob","URL","createObjectURL","link","download","revokeObjectURL","reader","FileReader","onload","async","fromJSON","onerror","readAsText"],"mappings":"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","x_google_ignoreList":[9]}
|