view3d-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerializationPlugin-CBr1GY5q.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\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 const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(mouse, camera)\r\n\r\n const intersects = raycaster.intersectObjects(objects, 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 = '&nbsp;';\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","keys","names","reverse","remove","Plugin","config","_installed","unsubscribers","registerLifecycleHooks","onInstall","onUninstall","unsubscribe","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","dispose","getConfig","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","outlinePass","_outlinePass","bloomPass","_bloomPass","saoPass","_saoPass","ssrPass","_ssrPass","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","arguments","CSS2DObject","CSS3DObject","_css2dRenderer","_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","raycastObjects","mouse","raycaster","Raycaster","setFromCamera","intersectObjects","filter","i","obj","text","getRootModel","current","parent","createRaycaster","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","deselect","select","e","key","toLowerCase","removeEventListener","colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","r","round","g","b","a","h","s","toFixed","v","str","hex","length","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","constructor","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","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","getStats","getViewHelper","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","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","resumeAll","DEFAULT_DRAWING_CONFIG","defaultPointMode","defaultMaterialType","fenceHeight","lineWidth","DrawingPlugin","currentPoints","previewMesh","_isDrawing","drawnObjects","_pointMode","isDrawing","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","clearAll","DEFAULT_GEOMAP_CONFIG","coordinateScale","GeoMapPlugin","geoGroups","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","getTextMeshes","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","getBackground","getFogConfig","DEFAULT_SERIALIZATION_CONFIG","version","includeGeometry","includeMaterial","includeUserData","excludeHelpers","SerializationPlugin","serialize","metadata","generator","timestamp","serializeSceneProperties","serializeCamera","serializeObjects","serializePlugins","serializeBackground","serializeFog","getHex","sourceFile","zoom","PerspectiveCamera","isHelper","serialized","serializeObject","uuid","userData","serializeGeometry","serializeMaterial","parameters","serializeSingleMaterial","startsWith","deserializeCamera","deserializeSceneProperties","deserializePlugins","cameraData","sceneData","pluginsData","pluginName","setConfig","toJSON","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]}