view3d-core 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SerializationPlugin-06oXfKib.js +4964 -0
- package/dist/SerializationPlugin-06oXfKib.js.map +1 -0
- package/dist/SerializationPlugin-C54a1wAp.cjs +4859 -0
- package/dist/SerializationPlugin-C54a1wAp.cjs.map +1 -0
- package/dist/index.cjs +211 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +261 -77
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.js +1 -1
- package/package.json +6 -4
- package/dist/SerializationPlugin-D418fw5V.js +0 -3418
- package/dist/SerializationPlugin-D418fw5V.js.map +0 -1
- package/dist/SerializationPlugin-DJVOx3pd.cjs +0 -3317
- package/dist/SerializationPlugin-DJVOx3pd.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerializationPlugin-06oXfKib.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","../node_modules/three-mesh-bvh/src/core/Constants.js","../node_modules/three-mesh-bvh/src/utils/ArrayBoxUtilities.js","../node_modules/three-mesh-bvh/src/core/utils/nodeBufferUtils.js","../node_modules/three-mesh-bvh/src/core/build/computeBoundsUtils.js","../node_modules/three-mesh-bvh/src/core/build/splitUtils.js","../node_modules/three-mesh-bvh/src/core/BVHNode.js","../node_modules/three-mesh-bvh/src/core/build/buildUtils.js","../node_modules/three-mesh-bvh/src/core/build/buildTree.js","../node_modules/three-mesh-bvh/src/core/build/sortUtils.js","../node_modules/three-mesh-bvh/src/utils/PrimitivePool.js","../node_modules/three-mesh-bvh/src/core/utils/BufferStack.js","../node_modules/three-mesh-bvh/src/core/cast/shapecast.js","../node_modules/three-mesh-bvh/src/core/BVH.js","../node_modules/three-mesh-bvh/src/core/build/geometryUtils.js","../node_modules/three-mesh-bvh/src/core/GeometryBVH.js","../node_modules/three-mesh-bvh/src/utils/BufferUtils.js","../node_modules/three-mesh-bvh/src/math/SeparatingAxisBounds.js","../node_modules/three-mesh-bvh/src/math/MathUtilities.js","../node_modules/three-mesh-bvh/src/math/ExtendedTriangle.js","../node_modules/three-mesh-bvh/src/math/OrientedBox.js","../node_modules/three-mesh-bvh/src/utils/ExtendedTrianglePool.js","../node_modules/three-mesh-bvh/src/core/cast/closestPointToPoint.js","../node_modules/three-mesh-bvh/src/utils/ThreeRayIntersectUtilities.js","../node_modules/three-mesh-bvh/src/utils/TriangleUtilities.js","../node_modules/three-mesh-bvh/src/core/utils/iterationUtils.generated.js","../node_modules/three-mesh-bvh/src/core/cast/refit.generated.js","../node_modules/three-mesh-bvh/src/core/utils/intersectUtils.js","../node_modules/three-mesh-bvh/src/core/utils/iterationUtils_indirect.generated.js","../node_modules/three-mesh-bvh/src/core/cast/raycast.generated.js","../node_modules/three-mesh-bvh/src/core/cast/raycastFirst.generated.js","../node_modules/three-mesh-bvh/src/core/cast/intersectsGeometry.generated.js","../node_modules/three-mesh-bvh/src/core/cast/closestPointToGeometry.generated.js","../node_modules/three-mesh-bvh/src/core/cast/refit_indirect.generated.js","../node_modules/three-mesh-bvh/src/core/cast/raycast_indirect.generated.js","../node_modules/three-mesh-bvh/src/core/cast/raycastFirst_indirect.generated.js","../node_modules/three-mesh-bvh/src/core/cast/intersectsGeometry_indirect.generated.js","../node_modules/three-mesh-bvh/src/core/cast/closestPointToGeometry_indirect.generated.js","../node_modules/three-mesh-bvh/src/core/cast/bvhcast.js","../node_modules/three-mesh-bvh/src/utils/GeometryRayIntersectUtilities.js","../node_modules/three-mesh-bvh/src/core/MeshBVH.js","../node_modules/three-mesh-bvh/src/utils/ExtensionUtilities.js","../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","// Split strategy constants\nexport const CENTER = 0;\nexport const AVERAGE = 1;\nexport const SAH = 2;\n\n// Traversal constants\nexport const NOT_INTERSECTED = 0;\nexport const INTERSECTED = 1;\nexport const CONTAINED = 2;\n\n// SAH cost constants\n// TODO: hone these costs more. The relative difference between them should be the\n// difference in measured time to perform a primitive intersection vs traversing\n// bounds.\n// TODO: could be tuned per primitive type (triangles vs lines vs points)\nexport const PRIMITIVE_INTERSECT_COST = 1.25;\nexport const TRAVERSAL_COST = 1;\n\n\n// Build constants\nexport const BYTES_PER_NODE = 6 * 4 + 4 + 4;\nexport const UINT32_PER_NODE = BYTES_PER_NODE / 4;\nexport const IS_LEAFNODE_FLAG = 0xFFFF;\n\n// Bit masks for 32 bit node data\nexport const LEAFNODE_MASK_32 = IS_LEAFNODE_FLAG << 16;\n\n// EPSILON for computing floating point error during build\n// https://en.wikipedia.org/wiki/Machine_epsilon#Values_for_standard_hardware_floating_point_arithmetics\nexport const FLOAT32_EPSILON = Math.pow( 2, - 24 );\n\nexport const SKIP_GENERATION = Symbol( 'SKIP_GENERATION' );\n\nexport const DEFAULT_OPTIONS = {\n\tstrategy: CENTER,\n\tmaxDepth: 40,\n\tmaxLeafSize: 10,\n\tuseSharedArrayBuffer: false,\n\tsetBoundingBox: true,\n\tonProgress: null,\n\tindirect: false,\n\tverbose: true,\n\trange: null,\n\t[ SKIP_GENERATION ]: false,\n};\n\n","export function arrayToBox( nodeIndex32, array, target ) {\n\n\ttarget.min.x = array[ nodeIndex32 ];\n\ttarget.min.y = array[ nodeIndex32 + 1 ];\n\ttarget.min.z = array[ nodeIndex32 + 2 ];\n\n\ttarget.max.x = array[ nodeIndex32 + 3 ];\n\ttarget.max.y = array[ nodeIndex32 + 4 ];\n\ttarget.max.z = array[ nodeIndex32 + 5 ];\n\n\treturn target;\n\n}\n\nexport function makeEmptyBounds( target ) {\n\n\ttarget[ 0 ] = target[ 1 ] = target[ 2 ] = Infinity;\n\ttarget[ 3 ] = target[ 4 ] = target[ 5 ] = - Infinity;\n\n}\n\nexport function getLongestEdgeIndex( bounds ) {\n\n\tlet splitDimIdx = - 1;\n\tlet splitDist = - Infinity;\n\n\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\tconst dist = bounds[ i + 3 ] - bounds[ i ];\n\t\tif ( dist > splitDist ) {\n\n\t\t\tsplitDist = dist;\n\t\t\tsplitDimIdx = i;\n\n\t\t}\n\n\t}\n\n\treturn splitDimIdx;\n\n}\n\n// copies bounds a into bounds b\nexport function copyBounds( source, target ) {\n\n\ttarget.set( source );\n\n}\n\n// sets bounds target to the union of bounds a and b\nexport function unionBounds( a, b, target ) {\n\n\tlet aVal, bVal;\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst d3 = d + 3;\n\n\t\t// set the minimum values\n\t\taVal = a[ d ];\n\t\tbVal = b[ d ];\n\t\ttarget[ d ] = aVal < bVal ? aVal : bVal;\n\n\t\t// set the max values\n\t\taVal = a[ d3 ];\n\t\tbVal = b[ d3 ];\n\t\ttarget[ d3 ] = aVal > bVal ? aVal : bVal;\n\n\t}\n\n}\n\n// expands the given bounds by the provided primitive bounds\nexport function expandByPrimitiveBounds( startIndex, primitiveBounds, bounds ) {\n\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst tCenter = primitiveBounds[ startIndex + 2 * d ];\n\t\tconst tHalf = primitiveBounds[ startIndex + 2 * d + 1 ];\n\n\t\tconst tMin = tCenter - tHalf;\n\t\tconst tMax = tCenter + tHalf;\n\n\t\tif ( tMin < bounds[ d ] ) {\n\n\t\t\tbounds[ d ] = tMin;\n\n\t\t}\n\n\t\tif ( tMax > bounds[ d + 3 ] ) {\n\n\t\t\tbounds[ d + 3 ] = tMax;\n\n\t\t}\n\n\t}\n\n}\n\n// compute bounds surface area\nexport function computeSurfaceArea( bounds ) {\n\n\tconst d0 = bounds[ 3 ] - bounds[ 0 ];\n\tconst d1 = bounds[ 4 ] - bounds[ 1 ];\n\tconst d2 = bounds[ 5 ] - bounds[ 2 ];\n\n\treturn 2 * ( d0 * d1 + d1 * d2 + d2 * d0 );\n\n}\n","import { IS_LEAFNODE_FLAG, UINT32_PER_NODE } from '../Constants.js';\n\nexport function IS_LEAF( n16, uint16Array ) {\n\n\treturn uint16Array[ n16 + 15 ] === IS_LEAFNODE_FLAG;\n\n}\n\nexport function OFFSET( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 6 ];\n\n}\n\nexport function COUNT( n16, uint16Array ) {\n\n\treturn uint16Array[ n16 + 14 ];\n\n}\n\n// Returns the uint32-aligned offset of the left child node for performance\nexport function LEFT_NODE( n32 ) {\n\n\treturn n32 + UINT32_PER_NODE;\n\n}\n\n// Returns the uint32-aligned offset of the right child node for performance\nexport function RIGHT_NODE( n32, uint32Array ) {\n\n\t// stored value is relative offset from parent, convert to absolute uint32 index\n\tconst relativeOffset = uint32Array[ n32 + 6 ];\n\treturn n32 + relativeOffset * UINT32_PER_NODE;\n\n}\n\nexport function SPLIT_AXIS( n32, uint32Array ) {\n\n\treturn uint32Array[ n32 + 7 ];\n\n}\n\nexport function BOUNDING_DATA_INDEX( n32 ) {\n\n\treturn n32;\n\n}\n","// computes the union of the bounds of all of the given primitives and puts the resulting box in \"target\".\n// A bounding box is computed for the centroids of the primitives, as well, and placed in \"centroidTarget\".\n// These are computed together to avoid redundant accesses to bounds array.\nexport function getBounds( primitiveBounds, offset, count, target, centroidTarget ) {\n\n\tlet minx = Infinity;\n\tlet miny = Infinity;\n\tlet minz = Infinity;\n\tlet maxx = - Infinity;\n\tlet maxy = - Infinity;\n\tlet maxz = - Infinity;\n\n\tlet cminx = Infinity;\n\tlet cminy = Infinity;\n\tlet cminz = Infinity;\n\tlet cmaxx = - Infinity;\n\tlet cmaxy = - Infinity;\n\tlet cmaxz = - Infinity;\n\n\tconst boundsOffset = primitiveBounds.offset || 0;\n\tfor ( let i = ( offset - boundsOffset ) * 6, end = ( offset + count - boundsOffset ) * 6; i < end; i += 6 ) {\n\n\t\tconst cx = primitiveBounds[ i + 0 ];\n\t\tconst hx = primitiveBounds[ i + 1 ];\n\t\tconst lx = cx - hx;\n\t\tconst rx = cx + hx;\n\t\tif ( lx < minx ) minx = lx;\n\t\tif ( rx > maxx ) maxx = rx;\n\t\tif ( cx < cminx ) cminx = cx;\n\t\tif ( cx > cmaxx ) cmaxx = cx;\n\n\t\tconst cy = primitiveBounds[ i + 2 ];\n\t\tconst hy = primitiveBounds[ i + 3 ];\n\t\tconst ly = cy - hy;\n\t\tconst ry = cy + hy;\n\t\tif ( ly < miny ) miny = ly;\n\t\tif ( ry > maxy ) maxy = ry;\n\t\tif ( cy < cminy ) cminy = cy;\n\t\tif ( cy > cmaxy ) cmaxy = cy;\n\n\t\tconst cz = primitiveBounds[ i + 4 ];\n\t\tconst hz = primitiveBounds[ i + 5 ];\n\t\tconst lz = cz - hz;\n\t\tconst rz = cz + hz;\n\t\tif ( lz < minz ) minz = lz;\n\t\tif ( rz > maxz ) maxz = rz;\n\t\tif ( cz < cminz ) cminz = cz;\n\t\tif ( cz > cmaxz ) cmaxz = cz;\n\n\t}\n\n\ttarget[ 0 ] = minx;\n\ttarget[ 1 ] = miny;\n\ttarget[ 2 ] = minz;\n\n\ttarget[ 3 ] = maxx;\n\ttarget[ 4 ] = maxy;\n\ttarget[ 5 ] = maxz;\n\n\tcentroidTarget[ 0 ] = cminx;\n\tcentroidTarget[ 1 ] = cminy;\n\tcentroidTarget[ 2 ] = cminz;\n\n\tcentroidTarget[ 3 ] = cmaxx;\n\tcentroidTarget[ 4 ] = cmaxy;\n\tcentroidTarget[ 5 ] = cmaxz;\n\n}\n","import { getLongestEdgeIndex, computeSurfaceArea, copyBounds, unionBounds, expandByPrimitiveBounds } from '../../utils/ArrayBoxUtilities.js';\nimport { CENTER, AVERAGE, SAH, PRIMITIVE_INTERSECT_COST, TRAVERSAL_COST } from '../Constants.js';\n\nconst BIN_COUNT = 32;\nconst binsSort = ( a, b ) => a.candidate - b.candidate;\nconst sahBins = /* @__PURE__ */ new Array( BIN_COUNT ).fill().map( () => {\n\n\treturn {\n\n\t\tcount: 0,\n\t\tbounds: new Float32Array( 6 ),\n\t\trightCacheBounds: new Float32Array( 6 ),\n\t\tleftCacheBounds: new Float32Array( 6 ),\n\t\tcandidate: 0,\n\n\t};\n\n} );\nconst leftBounds = /* @__PURE__ */ new Float32Array( 6 );\n\nexport function getOptimalSplit( nodeBoundingData, centroidBoundingData, primitiveBounds, offset, count, strategy ) {\n\n\tlet axis = - 1;\n\tlet pos = 0;\n\n\t// Center\n\tif ( strategy === CENTER ) {\n\n\t\taxis = getLongestEdgeIndex( centroidBoundingData );\n\t\tif ( axis !== - 1 ) {\n\n\t\t\tpos = ( centroidBoundingData[ axis ] + centroidBoundingData[ axis + 3 ] ) / 2;\n\n\t\t}\n\n\t} else if ( strategy === AVERAGE ) {\n\n\t\taxis = getLongestEdgeIndex( nodeBoundingData );\n\t\tif ( axis !== - 1 ) {\n\n\t\t\tpos = getAverage( primitiveBounds, offset, count, axis );\n\n\t\t}\n\n\t} else if ( strategy === SAH ) {\n\n\t\tconst rootSurfaceArea = computeSurfaceArea( nodeBoundingData );\n\t\tlet bestCost = PRIMITIVE_INTERSECT_COST * count;\n\n\t\t// iterate over all axes\n\t\tconst boundsOffset = primitiveBounds.offset || 0;\n\t\tconst cStart = ( offset - boundsOffset ) * 6;\n\t\tconst cEnd = ( offset + count - boundsOffset ) * 6;\n\t\tfor ( let a = 0; a < 3; a ++ ) {\n\n\t\t\tconst axisLeft = centroidBoundingData[ a ];\n\t\t\tconst axisRight = centroidBoundingData[ a + 3 ];\n\t\t\tconst axisLength = axisRight - axisLeft;\n\t\t\tconst binWidth = axisLength / BIN_COUNT;\n\n\t\t\t// If we have fewer primitives than we're planning to split then just check all\n\t\t\t// the primitive positions because it will be faster.\n\t\t\tif ( count < BIN_COUNT / 4 ) {\n\n\t\t\t\t// initialize the bin candidates\n\t\t\t\tconst truncatedBins = [ ...sahBins ];\n\t\t\t\ttruncatedBins.length = count;\n\n\t\t\t\t// set the candidates\n\t\t\t\tlet b = 0;\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6, b ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ b ];\n\t\t\t\t\tbin.candidate = primitiveBounds[ c + 2 * a ];\n\t\t\t\t\tbin.count = 0;\n\n\t\t\t\t\tconst {\n\t\t\t\t\t\tbounds,\n\t\t\t\t\t\tleftCacheBounds,\n\t\t\t\t\t\trightCacheBounds,\n\t\t\t\t\t} = bin;\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\t\t\t\t\trightCacheBounds[ d ] = Infinity;\n\t\t\t\t\t\trightCacheBounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t\tleftCacheBounds[ d ] = Infinity;\n\t\t\t\t\t\tleftCacheBounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t\tbounds[ d ] = Infinity;\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t}\n\n\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bounds );\n\n\t\t\t\t}\n\n\t\t\t\ttruncatedBins.sort( binsSort );\n\n\t\t\t\t// remove redundant splits\n\t\t\t\tlet splitCount = count;\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\twhile ( bi + 1 < splitCount && truncatedBins[ bi + 1 ].candidate === bin.candidate ) {\n\n\t\t\t\t\t\ttruncatedBins.splice( bi + 1, 1 );\n\t\t\t\t\t\tsplitCount --;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// find the appropriate bin for each primitive and expand the bounds.\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\n\n\t\t\t\t\tconst center = primitiveBounds[ c + 2 * a ];\n\t\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\t\tif ( center >= bin.candidate ) {\n\n\t\t\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bin.rightCacheBounds );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bin.leftCacheBounds );\n\t\t\t\t\t\t\tbin.count ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// expand all the bounds\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\n\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\n\t\t\t\t\tconst leftCount = bin.count;\n\t\t\t\t\tconst rightCount = count - bin.count;\n\n\t\t\t\t\t// check the cost of this split\n\t\t\t\t\tconst leftBounds = bin.leftCacheBounds;\n\t\t\t\t\tconst rightBounds = bin.rightCacheBounds;\n\n\t\t\t\t\tlet leftProb = 0;\n\t\t\t\t\tif ( leftCount !== 0 ) {\n\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet rightProb = 0;\n\t\t\t\t\tif ( rightCount !== 0 ) {\n\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cost = TRAVERSAL_COST + PRIMITIVE_INTERSECT_COST * (\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( cost < bestCost ) {\n\n\t\t\t\t\t\taxis = a;\n\t\t\t\t\t\tbestCost = cost;\n\t\t\t\t\t\tpos = bin.candidate;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// reset the bins\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT; i ++ ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tbin.count = 0;\n\t\t\t\t\tbin.candidate = axisLeft + binWidth + i * binWidth;\n\n\t\t\t\t\tconst bounds = bin.bounds;\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\t\t\t\t\tbounds[ d ] = Infinity;\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over all center positions\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\n\n\t\t\t\t\tconst triCenter = primitiveBounds[ c + 2 * a ];\n\t\t\t\t\tconst relativeCenter = triCenter - axisLeft;\n\n\t\t\t\t\t// in the partition function if the centroid lies on the split plane then it is\n\t\t\t\t\t// considered to be on the right side of the split\n\t\t\t\t\tlet binIndex = ~ ~ ( relativeCenter / binWidth );\n\t\t\t\t\tif ( binIndex >= BIN_COUNT ) binIndex = BIN_COUNT - 1;\n\n\t\t\t\t\tconst bin = sahBins[ binIndex ];\n\t\t\t\t\tbin.count ++;\n\n\t\t\t\t\texpandByPrimitiveBounds( c, primitiveBounds, bin.bounds );\n\n\t\t\t\t}\n\n\t\t\t\t// cache the unioned bounds from right to left so we don't have to regenerate them each time\n\t\t\t\tconst lastBin = sahBins[ BIN_COUNT - 1 ];\n\t\t\t\tcopyBounds( lastBin.bounds, lastBin.rightCacheBounds );\n\t\t\t\tfor ( let i = BIN_COUNT - 2; i >= 0; i -- ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\n\t\t\t\t\tunionBounds( bin.bounds, nextBin.rightCacheBounds, bin.rightCacheBounds );\n\n\t\t\t\t}\n\n\t\t\t\tlet leftCount = 0;\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT - 1; i ++ ) {\n\n\t\t\t\t\tconst bin = sahBins[ i ];\n\t\t\t\t\tconst binCount = bin.count;\n\t\t\t\t\tconst bounds = bin.bounds;\n\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\n\t\t\t\t\tconst rightBounds = nextBin.rightCacheBounds;\n\n\t\t\t\t\t// don't do anything with the bounds if the new bounds have no primitives\n\t\t\t\t\tif ( binCount !== 0 ) {\n\n\t\t\t\t\t\tif ( leftCount === 0 ) {\n\n\t\t\t\t\t\t\tcopyBounds( bounds, leftBounds );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tunionBounds( bounds, leftBounds, leftBounds );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tleftCount += binCount;\n\n\t\t\t\t\t// check the cost of this split\n\t\t\t\t\tlet leftProb = 0;\n\t\t\t\t\tlet rightProb = 0;\n\n\t\t\t\t\tif ( leftCount !== 0 ) {\n\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rightCount = count - leftCount;\n\t\t\t\t\tif ( rightCount !== 0 ) {\n\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cost = TRAVERSAL_COST + PRIMITIVE_INTERSECT_COST * (\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( cost < bestCost ) {\n\n\t\t\t\t\t\taxis = a;\n\t\t\t\t\t\tbestCost = cost;\n\t\t\t\t\t\tpos = bin.candidate;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\tconsole.warn( `BVH: Invalid build strategy value ${ strategy } used.` );\n\n\t}\n\n\treturn { axis, pos };\n\n}\n\n// returns the average coordinate on the specified axis of all the provided primitives\nfunction getAverage( primitiveBounds, offset, count, axis ) {\n\n\tlet avg = 0;\n\tconst boundsOffset = primitiveBounds.offset;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tavg += primitiveBounds[ ( i - boundsOffset ) * 6 + axis * 2 ];\n\n\t}\n\n\treturn avg / count;\n\n}\n","export class BVHNode {\n\n\tconstructor() {\n\n\t\t// internal nodes have boundingData, left, right, and splitAxis\n\t\t// leaf nodes have offset and count (referring to primitives in the mesh geometry)\n\n\t\tthis.boundingData = new Float32Array( 6 );\n\n\t}\n\n}\n","import { BYTES_PER_NODE, IS_LEAFNODE_FLAG } from '../Constants.js';\n\nlet float32Array, uint32Array, uint16Array, uint8Array;\nconst MAX_POINTER = Math.pow( 2, 32 );\n\nexport function countNodes( node ) {\n\n\tif ( 'count' in node ) {\n\n\t\treturn 1;\n\n\t} else {\n\n\t\treturn 1 + countNodes( node.left ) + countNodes( node.right );\n\n\t}\n\n}\n\nexport function populateBuffer( byteOffset, node, buffer ) {\n\n\tfloat32Array = new Float32Array( buffer );\n\tuint32Array = new Uint32Array( buffer );\n\tuint16Array = new Uint16Array( buffer );\n\tuint8Array = new Uint8Array( buffer );\n\n\treturn _populateBuffer( byteOffset, node );\n\n}\n\n// pack structure\n// boundingData \t\t\t\t: 6 float32\n// right / offset \t\t\t\t: 1 uint32\n// splitAxis / isLeaf + count \t: 1 uint32 / 2 uint16\nfunction _populateBuffer( byteOffset, node ) {\n\n\tconst node32Index = byteOffset / 4;\n\tconst node16Index = byteOffset / 2;\n\tconst isLeaf = 'count' in node;\n\tconst boundingData = node.boundingData;\n\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\tfloat32Array[ node32Index + i ] = boundingData[ i ];\n\n\t}\n\n\tif ( isLeaf ) {\n\n\t\tif ( node.buffer ) {\n\n\t\t\tuint8Array.set( new Uint8Array( node.buffer ), byteOffset );\n\t\t\treturn byteOffset + node.buffer.byteLength;\n\n\t\t} else {\n\n\t\t\tuint32Array[ node32Index + 6 ] = node.offset;\n\t\t\tuint16Array[ node16Index + 14 ] = node.count;\n\t\t\tuint16Array[ node16Index + 15 ] = IS_LEAFNODE_FLAG;\n\t\t\treturn byteOffset + BYTES_PER_NODE;\n\n\t\t}\n\n\t} else {\n\n\t\tconst { left, right, splitAxis } = node;\n\n\t\t// fill in the left node contents\n\t\tconst leftByteOffset = byteOffset + BYTES_PER_NODE;\n\t\tlet rightByteOffset = _populateBuffer( leftByteOffset, left );\n\n\t\t// calculate relative offset from parent to right child\n\t\tconst currentNodeIndex = byteOffset / BYTES_PER_NODE;\n\t\tconst rightNodeIndex = rightByteOffset / BYTES_PER_NODE;\n\t\tconst relativeRightIndex = rightNodeIndex - currentNodeIndex;\n\n\t\t// check if the relative offset is too high\n\t\tif ( relativeRightIndex > MAX_POINTER ) {\n\n\t\t\tthrow new Error( 'MeshBVH: Cannot store relative child node offset greater than 32 bits.' );\n\n\t\t}\n\n\t\t// fill in the right node contents (store as relative offset)\n\t\tuint32Array[ node32Index + 6 ] = relativeRightIndex;\n\t\tuint32Array[ node32Index + 7 ] = splitAxis;\n\n\t\t// return the next available buffer pointer\n\t\treturn _populateBuffer( rightByteOffset, right );\n\n\t}\n\n}\n","import { getBounds } from './computeBoundsUtils.js';\nimport { getOptimalSplit } from './splitUtils.js';\nimport { BVHNode } from '../BVHNode.js';\nimport { BYTES_PER_NODE } from '../Constants.js';\n\nimport { partition } from './sortUtils.js';\nimport { countNodes, populateBuffer } from './buildUtils.js';\n\nexport function buildTree( bvh, primitiveBounds, offset, count, options ) {\n\n\t// expand variables\n\tconst {\n\t\tmaxDepth,\n\t\tverbose,\n\t\tmaxLeafSize,\n\t\tstrategy,\n\t\tonProgress,\n\t} = options;\n\n\tconst partitionBuffer = bvh.primitiveBuffer;\n\tconst partitionStride = bvh.primitiveBufferStride;\n\n\t// generate intermediate variables\n\tconst cacheCentroidBoundingData = new Float32Array( 6 );\n\tlet reachedMaxDepth = false;\n\n\tconst root = new BVHNode();\n\tgetBounds( primitiveBounds, offset, count, root.boundingData, cacheCentroidBoundingData );\n\tsplitNode( root, offset, count, cacheCentroidBoundingData );\n\treturn root;\n\n\tfunction triggerProgress( primitivesProcessed ) {\n\n\t\tif ( onProgress ) {\n\n\t\t\tonProgress( primitivesProcessed / count );\n\n\t\t}\n\n\t}\n\n\t// either recursively splits the given node, creating left and right subtrees for it, or makes it a leaf node,\n\t// recording the offset and count of its primitives and writing them into the reordered geometry index.\n\tfunction splitNode( node, offset, count, centroidBoundingData = null, depth = 0 ) {\n\n\t\tif ( ! reachedMaxDepth && depth >= maxDepth ) {\n\n\t\t\treachedMaxDepth = true;\n\t\t\tif ( verbose ) {\n\n\t\t\t\tconsole.warn( `BVH: Max depth of ${ maxDepth } reached when generating BVH. Consider increasing maxDepth.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// early out if we've met our capacity\n\t\tif ( count <= maxLeafSize || depth >= maxDepth ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\t\t\treturn node;\n\n\t\t}\n\n\t\t// Find where to split the volume\n\t\tconst split = getOptimalSplit( node.boundingData, centroidBoundingData, primitiveBounds, offset, count, strategy );\n\t\tif ( split.axis === - 1 ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\t\t\treturn node;\n\n\t\t}\n\n\t\tconst splitOffset = partition( partitionBuffer, partitionStride, primitiveBounds, offset, count, split );\n\n\t\t// create the two new child nodes\n\t\tif ( splitOffset === offset || splitOffset === offset + count ) {\n\n\t\t\ttriggerProgress( offset + count );\n\t\t\tnode.offset = offset;\n\t\t\tnode.count = count;\n\n\t\t} else {\n\n\t\t\tnode.splitAxis = split.axis;\n\n\t\t\t// create the left child and compute its bounding box\n\t\t\tconst left = new BVHNode();\n\t\t\tconst lstart = offset;\n\t\t\tconst lcount = splitOffset - offset;\n\t\t\tnode.left = left;\n\n\t\t\tgetBounds( primitiveBounds, lstart, lcount, left.boundingData, cacheCentroidBoundingData );\n\t\t\tsplitNode( left, lstart, lcount, cacheCentroidBoundingData, depth + 1 );\n\n\t\t\t// repeat for right\n\t\t\tconst right = new BVHNode();\n\t\t\tconst rstart = splitOffset;\n\t\t\tconst rcount = count - lcount;\n\t\t\tnode.right = right;\n\n\t\t\tgetBounds( primitiveBounds, rstart, rcount, right.boundingData, cacheCentroidBoundingData );\n\t\t\tsplitNode( right, rstart, rcount, cacheCentroidBoundingData, depth + 1 );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n}\n\nexport function buildPackedTree( bvh, options ) {\n\n\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\n\n\t// get the range of buffer data to construct / arrange\n\tconst rootRanges = bvh.getRootRanges( options.range );\n\tconst firstRange = rootRanges[ 0 ];\n\tconst lastRange = rootRanges[ rootRanges.length - 1 ];\n\tconst fullRange = {\n\t\toffset: firstRange.offset,\n\t\tcount: lastRange.offset + lastRange.count - firstRange.offset,\n\t};\n\n\t// construct the primitive bounds for sorting\n\tconst primitiveBounds = new Float32Array( 6 * fullRange.count );\n\tprimitiveBounds.offset = fullRange.offset;\n\tbvh.computePrimitiveBounds( fullRange.offset, fullRange.count, primitiveBounds );\n\n\t// Build BVH roots\n\tbvh._roots = rootRanges.map( range => {\n\n\t\tconst root = buildTree( bvh, primitiveBounds, range.offset, range.count, options );\n\t\tconst nodeCount = countNodes( root );\n\t\tconst buffer = new BufferConstructor( BYTES_PER_NODE * nodeCount );\n\t\tpopulateBuffer( 0, root, buffer );\n\t\treturn buffer;\n\n\t} );\n\n}\n","// reorders the partition buffer such that for `count` elements after `offset`, elements on the left side of the split\n// will be on the left and elements on the right side of the split will be on the right. returns the index\n// of the first element on the right side, or offset + count if there are no elements on the right side.\nexport function partition( buffer, stride, primitiveBounds, offset, count, split ) {\n\n\tlet left = offset;\n\tlet right = offset + count - 1;\n\tconst pos = split.pos;\n\tconst axisOffset = split.axis * 2;\n\tconst boundsOffset = primitiveBounds.offset || 0;\n\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\n\twhile ( true ) {\n\n\t\twhile ( left <= right && primitiveBounds[ ( left - boundsOffset ) * 6 + axisOffset ] < pos ) {\n\n\t\t\tleft ++;\n\n\t\t}\n\n\t\t// if a primitive center lies on the partition plane it is considered to be on the right side\n\t\twhile ( left <= right && primitiveBounds[ ( right - boundsOffset ) * 6 + axisOffset ] >= pos ) {\n\n\t\t\tright --;\n\n\t\t}\n\n\t\tif ( left < right ) {\n\n\t\t\t// we need to swap all of the information associated with the primitives at index\n\t\t\t// left and right; that's the elements in the partition buffer and the bounds\n\t\t\tfor ( let i = 0; i < stride; i ++ ) {\n\n\t\t\t\tlet t0 = buffer[ left * stride + i ];\n\t\t\t\tbuffer[ left * stride + i ] = buffer[ right * stride + i ];\n\t\t\t\tbuffer[ right * stride + i ] = t0;\n\n\t\t\t}\n\n\t\t\t// swap bounds\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tconst l = left - boundsOffset;\n\t\t\t\tconst r = right - boundsOffset;\n\t\t\t\tconst tb = primitiveBounds[ l * 6 + i ];\n\t\t\t\tprimitiveBounds[ l * 6 + i ] = primitiveBounds[ r * 6 + i ];\n\t\t\t\tprimitiveBounds[ r * 6 + i ] = tb;\n\n\t\t\t}\n\n\t\t\tleft ++;\n\t\t\tright --;\n\n\t\t} else {\n\n\t\t\treturn left;\n\n\t\t}\n\n\t}\n\n}\n","export class PrimitivePool {\n\n\tconstructor( getNewPrimitive ) {\n\n\t\tthis._getNewPrimitive = getNewPrimitive;\n\t\tthis._primitives = [];\n\n\t}\n\n\tgetPrimitive() {\n\n\t\tconst primitives = this._primitives;\n\t\tif ( primitives.length === 0 ) {\n\n\t\t\treturn this._getNewPrimitive();\n\n\t\t} else {\n\n\t\t\treturn primitives.pop();\n\n\t\t}\n\n\t}\n\n\treleasePrimitive( primitive ) {\n\n\t\tthis._primitives.push( primitive );\n\n\t}\n\n}\n","class _BufferStack {\n\n\tconstructor() {\n\n\t\tthis.float32Array = null;\n\t\tthis.uint16Array = null;\n\t\tthis.uint32Array = null;\n\n\t\tconst stack = [];\n\t\tlet prevBuffer = null;\n\t\tthis.setBuffer = buffer => {\n\n\t\t\tif ( prevBuffer ) {\n\n\t\t\t\tstack.push( prevBuffer );\n\n\t\t\t}\n\n\t\t\tprevBuffer = buffer;\n\t\t\tthis.float32Array = new Float32Array( buffer );\n\t\t\tthis.uint16Array = new Uint16Array( buffer );\n\t\t\tthis.uint32Array = new Uint32Array( buffer );\n\n\t\t};\n\n\t\tthis.clearBuffer = () => {\n\n\t\t\tprevBuffer = null;\n\t\t\tthis.float32Array = null;\n\t\t\tthis.uint16Array = null;\n\t\t\tthis.uint32Array = null;\n\n\t\t\tif ( stack.length !== 0 ) {\n\n\t\t\t\tthis.setBuffer( stack.pop() );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n}\n\nexport const BufferStack = /* @__PURE__ */ new _BufferStack();\n","import { Box3 } from 'three';\nimport { CONTAINED, UINT32_PER_NODE } from '../Constants.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { PrimitivePool } from '../../utils/PrimitivePool.js';\nimport { COUNT, OFFSET, LEFT_NODE, RIGHT_NODE, IS_LEAF, BOUNDING_DATA_INDEX } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\n\nlet _box1, _box2;\nconst boxStack = [];\nconst boxPool = /* @__PURE__ */ new PrimitivePool( () => new Box3() );\n\nexport function shapecast( bvh, root, intersectsBounds, intersectsRange, boundsTraverseOrder, nodeOffset ) {\n\n\t// setup\n\t_box1 = boxPool.getPrimitive();\n\t_box2 = boxPool.getPrimitive();\n\tboxStack.push( _box1, _box2 );\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\n\tconst result = shapecastTraverse( 0, bvh.geometry, intersectsBounds, intersectsRange, boundsTraverseOrder, nodeOffset );\n\n\t// cleanup\n\tBufferStack.clearBuffer();\n\tboxPool.releasePrimitive( _box1 );\n\tboxPool.releasePrimitive( _box2 );\n\tboxStack.pop();\n\tboxStack.pop();\n\n\tconst length = boxStack.length;\n\tif ( length > 0 ) {\n\n\t\t_box2 = boxStack[ length - 1 ];\n\t\t_box1 = boxStack[ length - 2 ];\n\n\t}\n\n\treturn result;\n\n}\n\nfunction shapecastTraverse(\n\tnodeIndex32,\n\tgeometry,\n\tintersectsBoundsFunc,\n\tintersectsRangeFunc,\n\tnodeScoreFunc = null,\n\tnodeIndexOffset = 0, // offset for unique node identifier\n\tdepth = 0\n) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, _box1 );\n\t\treturn intersectsRangeFunc( offset, count, false, depth, nodeIndexOffset + nodeIndex32 / UINT32_PER_NODE, _box1 );\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tlet c1 = left;\n\t\tlet c2 = right;\n\n\t\tlet score1, score2;\n\t\tlet box1, box2;\n\t\tif ( nodeScoreFunc ) {\n\n\t\t\tbox1 = _box1;\n\t\t\tbox2 = _box2;\n\n\t\t\t// bounding data is not offset\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\n\n\t\t\tscore1 = nodeScoreFunc( box1 );\n\t\t\tscore2 = nodeScoreFunc( box2 );\n\n\t\t\tif ( score2 < score1 ) {\n\n\t\t\t\tc1 = right;\n\t\t\t\tc2 = left;\n\n\t\t\t\tconst temp = score1;\n\t\t\t\tscore1 = score2;\n\t\t\t\tscore2 = temp;\n\n\t\t\t\tbox1 = box2;\n\t\t\t\t// box2 is always set before use below\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Check box 1 intersection\n\t\tif ( ! box1 ) {\n\n\t\t\tbox1 = _box1;\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\n\n\t\t}\n\n\t\tconst isC1Leaf = IS_LEAF( c1 * 2, uint16Array );\n\t\tconst c1Intersection = intersectsBoundsFunc( box1, isC1Leaf, score1, depth + 1, nodeIndexOffset + c1 / UINT32_PER_NODE );\n\n\t\tlet c1StopTraversal;\n\t\tif ( c1Intersection === CONTAINED ) {\n\n\t\t\tconst offset = getLeftOffset( c1 );\n\t\t\tconst end = getRightEndOffset( c1 );\n\t\t\tconst count = end - offset;\n\n\t\t\tc1StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexOffset + c1 / UINT32_PER_NODE, box1 );\n\n\t\t} else {\n\n\t\t\tc1StopTraversal =\n\t\t\t\tc1Intersection &&\n\t\t\t\tshapecastTraverse(\n\t\t\t\t\tc1,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tintersectsBoundsFunc,\n\t\t\t\t\tintersectsRangeFunc,\n\t\t\t\t\tnodeScoreFunc,\n\t\t\t\t\tnodeIndexOffset,\n\t\t\t\t\tdepth + 1\n\t\t\t\t);\n\n\t\t}\n\n\t\tif ( c1StopTraversal ) return true;\n\n\t\t// Check box 2 intersection\n\t\t// cached box2 will have been overwritten by previous traversal\n\t\tbox2 = _box2;\n\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\n\n\t\tconst isC2Leaf = IS_LEAF( c2 * 2, uint16Array );\n\t\tconst c2Intersection = intersectsBoundsFunc( box2, isC2Leaf, score2, depth + 1, nodeIndexOffset + c2 / UINT32_PER_NODE );\n\n\t\tlet c2StopTraversal;\n\t\tif ( c2Intersection === CONTAINED ) {\n\n\t\t\tconst offset = getLeftOffset( c2 );\n\t\t\tconst end = getRightEndOffset( c2 );\n\t\t\tconst count = end - offset;\n\n\t\t\tc2StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexOffset + c2 / UINT32_PER_NODE, box2 );\n\n\t\t} else {\n\n\t\t\tc2StopTraversal =\n\t\t\t\tc2Intersection &&\n\t\t\t\tshapecastTraverse(\n\t\t\t\t\tc2,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tintersectsBoundsFunc,\n\t\t\t\t\tintersectsRangeFunc,\n\t\t\t\t\tnodeScoreFunc,\n\t\t\t\t\tnodeIndexOffset,\n\t\t\t\t\tdepth + 1\n\t\t\t\t);\n\n\t\t}\n\n\t\tif ( c2StopTraversal ) return true;\n\n\t\treturn false;\n\n\t\t// Define these inside the function so it has access to the local variables needed\n\t\t// when converting to the buffer equivalents\n\t\tfunction getLeftOffset( nodeIndex32 ) {\n\n\t\t\tconst { uint16Array, uint32Array } = BufferStack;\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t// traverse until we find a leaf\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\t\tnodeIndex32 = LEFT_NODE( nodeIndex32 );\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t}\n\n\t\t\treturn OFFSET( nodeIndex32, uint32Array );\n\n\t\t}\n\n\t\tfunction getRightEndOffset( nodeIndex32 ) {\n\n\t\t\tconst { uint16Array, uint32Array } = BufferStack;\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t// traverse until we find a leaf\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\t\t// adjust offset to point to the right node\n\t\t\t\tnodeIndex32 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\n\n\t\t\t}\n\n\t\t\t// return the end offset of the triangle range\n\t\t\treturn OFFSET( nodeIndex32, uint32Array ) + COUNT( nodeIndex16, uint16Array );\n\n\t\t}\n\n\t}\n\n}\n","import { Box3 } from 'three';\nimport { BYTES_PER_NODE, UINT32_PER_NODE, DEFAULT_OPTIONS, FLOAT32_EPSILON } from './Constants.js';\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, LEFT_NODE, RIGHT_NODE, SPLIT_AXIS, COUNT, OFFSET } from './utils/nodeBufferUtils.js';\nimport { buildPackedTree } from './build/buildTree.js';\nimport { shapecast as shapecastFunc } from './cast/shapecast.js';\n\nconst _tempBox = /* @__PURE__ */ new Box3();\nconst _tempBuffer = /* @__PURE__ */ new Float32Array( 6 );\n\nexport class BVH {\n\n\tconstructor() {\n\n\t\tthis._roots = null;\n\t\tthis.primitiveBuffer = null;\n\t\tthis.primitiveBufferStride = null;\n\n\t}\n\n\tinit( options ) {\n\n\t\toptions = {\n\t\t\t...DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t};\n\n\t\tbuildPackedTree( this, options );\n\n\t}\n\n\tgetRootRanges( /* range */ ) {\n\n\t\t// TODO: can we avoid passing range in here?\n\t\tthrow new Error( 'BVH: getRootRanges() not implemented' );\n\n\t}\n\n\t// write the i-th primitive bounds in a 6-value min / max format to the buffer\n\t// starting at the given \"writeOffset\"\n\twritePrimitiveBounds( /* i, buffer, writeOffset */ ) {\n\n\t\tthrow new Error( 'BVH: writePrimitiveBounds() not implemented' );\n\n\t}\n\n\t// writes the union bounds of all primitives in the given range in a min / max format\n\t// to the buffer\n\twritePrimitiveRangeBounds( offset, count, targetBuffer, baseIndex ) {\n\n\t\t// Initialize bounds\n\t\tlet minX = Infinity;\n\t\tlet minY = Infinity;\n\t\tlet minZ = Infinity;\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\t// compute union of all bounds\n\t\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\t\tthis.writePrimitiveBounds( i, _tempBuffer, 0 );\n\n\t\t\t// compute union\n\t\t\tconst [ lx, ly, lz, rx, ry, rz ] = _tempBuffer;\n\t\t\tif ( lx < minX ) minX = lx;\n\t\t\tif ( rx > maxX ) maxX = rx;\n\t\t\tif ( ly < minY ) minY = ly;\n\t\t\tif ( ry > maxY ) maxY = ry;\n\t\t\tif ( lz < minZ ) minZ = lz;\n\t\t\tif ( rz > maxZ ) maxZ = rz;\n\n\t\t}\n\n\t\t// write bounds\n\t\ttargetBuffer[ baseIndex + 0 ] = minX;\n\t\ttargetBuffer[ baseIndex + 1 ] = minY;\n\t\ttargetBuffer[ baseIndex + 2 ] = minZ;\n\t\ttargetBuffer[ baseIndex + 3 ] = maxX;\n\t\ttargetBuffer[ baseIndex + 4 ] = maxY;\n\t\ttargetBuffer[ baseIndex + 5 ] = maxZ;\n\n\t\treturn targetBuffer;\n\n\t}\n\n\tcomputePrimitiveBounds( offset, count, targetBuffer ) {\n\n\t\tconst boundsOffset = targetBuffer.offset || 0;\n\t\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\t\tthis.writePrimitiveBounds( i, _tempBuffer, 0 );\n\n\t\t\t// construction primitive bounds requires a center + half extents format\n\t\t\tconst [ lx, ly, lz, rx, ry, rz ] = _tempBuffer;\n\n\t\t\tconst cx = ( lx + rx ) / 2;\n\t\t\tconst cy = ( ly + ry ) / 2;\n\t\t\tconst cz = ( lz + rz ) / 2;\n\n\t\t\tconst hx = ( rx - lx ) / 2;\n\t\t\tconst hy = ( ry - ly ) / 2;\n\t\t\tconst hz = ( rz - lz ) / 2;\n\n\t\t\tconst baseIndex = ( i - boundsOffset ) * 6;\n\t\t\ttargetBuffer[ baseIndex + 0 ] = cx;\n\t\t\ttargetBuffer[ baseIndex + 1 ] = hx + ( Math.abs( cx ) + hx ) * FLOAT32_EPSILON;\n\t\t\ttargetBuffer[ baseIndex + 2 ] = cy;\n\t\t\ttargetBuffer[ baseIndex + 3 ] = hy + ( Math.abs( cy ) + hy ) * FLOAT32_EPSILON;\n\t\t\ttargetBuffer[ baseIndex + 4 ] = cz;\n\t\t\ttargetBuffer[ baseIndex + 5 ] = hz + ( Math.abs( cz ) + hz ) * FLOAT32_EPSILON;\n\n\t\t}\n\n\t\treturn targetBuffer;\n\n\t}\n\n\tshiftPrimitiveOffsets( offset ) {\n\n\t\tconst indirectBuffer = this._indirectBuffer;\n\t\tif ( indirectBuffer ) {\n\n\t\t\t// the offsets are embedded in the indirect buffer\n\t\t\tfor ( let i = 0, l = indirectBuffer.length; i < l; i ++ ) {\n\n\t\t\t\tindirectBuffer[ i ] += offset;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// offsets are embedded in the leaf nodes\n\t\t\tconst roots = this._roots;\n\t\t\tfor ( let rootIndex = 0; rootIndex < roots.length; rootIndex ++ ) {\n\n\t\t\t\tconst root = roots[ rootIndex ];\n\t\t\t\tconst uint32Array = new Uint32Array( root );\n\t\t\t\tconst uint16Array = new Uint16Array( root );\n\t\t\t\tconst totalNodes = root.byteLength / BYTES_PER_NODE;\n\t\t\t\tfor ( let node = 0; node < totalNodes; node ++ ) {\n\n\t\t\t\t\tconst node32Index = UINT32_PER_NODE * node;\n\t\t\t\t\tconst node16Index = 2 * node32Index;\n\t\t\t\t\tif ( IS_LEAF( node16Index, uint16Array ) ) {\n\n\t\t\t\t\t\t// offset value\n\t\t\t\t\t\tuint32Array[ node32Index + 6 ] += offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttraverse( callback, rootIndex = 0 ) {\n\n\t\tconst buffer = this._roots[ rootIndex ];\n\t\tconst uint32Array = new Uint32Array( buffer );\n\t\tconst uint16Array = new Uint16Array( buffer );\n\t\t_traverse( 0 );\n\n\t\tfunction _traverse( node32Index, depth = 0 ) {\n\n\t\t\tconst node16Index = node32Index * 2;\n\t\t\tconst isLeaf = IS_LEAF( node16Index, uint16Array );\n\t\t\tif ( isLeaf ) {\n\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\n\t\t\t\tcallback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), offset, count );\n\n\t\t\t} else {\n\n\t\t\t\tconst left = LEFT_NODE( node32Index );\n\t\t\t\tconst right = RIGHT_NODE( node32Index, uint32Array );\n\t\t\t\tconst splitAxis = SPLIT_AXIS( node32Index, uint32Array );\n\t\t\t\tconst stopTraversal = callback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), splitAxis );\n\n\t\t\t\tif ( ! stopTraversal ) {\n\n\t\t\t\t\t_traverse( left, depth + 1 );\n\t\t\t\t\t_traverse( right, depth + 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\trefit( /* nodeIndices = null */ ) {\n\n\t\t// TODO: add support for \"nodeIndices\"\n\t\t// if ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\t// \tnodeIndices = new Set( nodeIndices );\n\n\t\t// }\n\n\t\tconst roots = this._roots;\n\t\tfor ( let rootIndex = 0, rootCount = roots.length; rootIndex < rootCount; rootIndex ++ ) {\n\n\t\t\tconst buffer = roots[ rootIndex ];\n\t\t\tconst uint32Array = new Uint32Array( buffer );\n\t\t\tconst uint16Array = new Uint16Array( buffer );\n\t\t\tconst float32Array = new Float32Array( buffer );\n\t\t\tconst totalNodes = buffer.byteLength / BYTES_PER_NODE;\n\n\t\t\t// Traverse nodes from right to left so children are updated before parents\n\t\t\tfor ( let nodeIndex = totalNodes - 1; nodeIndex >= 0; nodeIndex -- ) {\n\n\t\t\t\tconst nodeIndex32 = nodeIndex * UINT32_PER_NODE;\n\t\t\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\t\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\n\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t// get the bounds\n\t\t\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\t\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\t\t\t\t\tthis.writePrimitiveRangeBounds( offset, count, _tempBuffer, 0 );\n\n\t\t\t\t\t// write directly to node bounds (already in min/max format)\n\t\t\t\t\tfloat32Array.set( _tempBuffer, nodeIndex32 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\t\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t\t\t\t// Union the bounds of left and right children\n\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\tconst leftMin = float32Array[ left + i ];\n\t\t\t\t\t\tconst leftMax = float32Array[ left + i + 3 ];\n\t\t\t\t\t\tconst rightMin = float32Array[ right + i ];\n\t\t\t\t\t\tconst rightMax = float32Array[ right + i + 3 ];\n\n\t\t\t\t\t\tfloat32Array[ nodeIndex32 + i ] = leftMin < rightMin ? leftMin : rightMin;\n\t\t\t\t\t\tfloat32Array[ nodeIndex32 + i + 3 ] = leftMax > rightMax ? leftMax : rightMax;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\ttarget.makeEmpty();\n\n\t\tconst roots = this._roots;\n\t\troots.forEach( buffer => {\n\n\t\t\tarrayToBox( 0, new Float32Array( buffer ), _tempBox );\n\t\t\ttarget.union( _tempBox );\n\n\t\t} );\n\n\t\treturn target;\n\n\t}\n\n\t// Base shapecast implementation that can be used by subclasses\n\t// TODO: see if we can get rid of \"iterateFunc\" here as well as the primitive so the function\n\t// API aligns with the \"shapecast\" implementation\n\tshapecast( callbacks ) {\n\n\t\tlet {\n\t\t\tboundsTraverseOrder,\n\t\t\tintersectsBounds,\n\t\t\tintersectsRange,\n\t\t\tintersectsPrimitive,\n\t\t\tscratchPrimitive,\n\t\t\titerate,\n\t\t} = callbacks;\n\n\t\t// wrap the intersectsRange function\n\t\tif ( intersectsRange && intersectsPrimitive ) {\n\n\t\t\tconst originalIntersectsRange = intersectsRange;\n\t\t\tintersectsRange = ( offset, count, contained, depth, nodeIndex ) => {\n\n\t\t\t\tif ( ! originalIntersectsRange( offset, count, contained, depth, nodeIndex ) ) {\n\n\t\t\t\t\treturn iterate( offset, count, this, intersectsPrimitive, contained, depth, scratchPrimitive );\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t} else if ( ! intersectsRange ) {\n\n\t\t\tif ( intersectsPrimitive ) {\n\n\t\t\t\tintersectsRange = ( offset, count, contained, depth ) => {\n\n\t\t\t\t\treturn iterate( offset, count, this, intersectsPrimitive, contained, depth, scratchPrimitive );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tintersectsRange = ( offset, count, contained ) => {\n\n\t\t\t\t\treturn contained;\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// run shapecast\n\t\tlet result = false;\n\t\tlet nodeOffset = 0;\n\t\tconst roots = this._roots;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst root = roots[ i ];\n\t\t\tresult = shapecastFunc( this, i, intersectsBounds, intersectsRange, boundsTraverseOrder, nodeOffset );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tnodeOffset += root.byteLength / BYTES_PER_NODE;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n","import { BufferAttribute } from 'three';\n\nexport function getVertexCount( geo ) {\n\n\treturn geo.index ? geo.index.count : geo.attributes.position.count;\n\n}\n\nexport function getTriCount( geo ) {\n\n\treturn getVertexCount( geo ) / 3;\n\n}\n\nexport function getIndexArray( vertexCount, BufferConstructor = ArrayBuffer ) {\n\n\tif ( vertexCount > 65535 ) {\n\n\t\treturn new Uint32Array( new BufferConstructor( 4 * vertexCount ) );\n\n\t} else {\n\n\t\treturn new Uint16Array( new BufferConstructor( 2 * vertexCount ) );\n\n\t}\n\n}\n\n// ensures that an index is present on the geometry\nexport function ensureIndex( geo, options ) {\n\n\tif ( ! geo.index ) {\n\n\t\tconst vertexCount = geo.attributes.position.count;\n\t\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\n\t\tconst index = getIndexArray( vertexCount, BufferConstructor );\n\t\tgeo.setIndex( new BufferAttribute( index, 1 ) );\n\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tindex[ i ] = i;\n\n\t\t}\n\n\t}\n\n}\n\n// Computes the set of { offset, count } ranges which need independent BVH roots. Each\n// region in the geometry index that belongs to a different set of material groups requires\n// a separate BVH root, so that triangles indices belonging to one group never get swapped\n// with triangle indices belongs to another group. For example, if the groups were like this:\n//\n// [-------------------------------------------------------------]\n// |__________________|\n// g0 = [0, 20] |______________________||_____________________|\n// g1 = [16, 40] g2 = [41, 60]\n//\n// we would need four BVH roots: [0, 15], [16, 20], [21, 40], [41, 60].\nfunction getFullPrimitiveRange( geo, range, stride ) {\n\n\tconst primitiveCount = getVertexCount( geo ) / stride;\n\tconst drawRange = range ? range : geo.drawRange;\n\tconst start = drawRange.start / stride;\n\tconst end = ( drawRange.start + drawRange.count ) / stride;\n\n\tconst offset = Math.max( 0, start );\n\tconst count = Math.min( primitiveCount, end ) - offset;\n\treturn {\n\t\toffset: Math.floor( offset ),\n\t\tcount: Math.floor( count ),\n\t};\n\n}\n\nfunction getPrimitiveGroupRanges( geo, stride ) {\n\n\treturn geo.groups.map( group => ( {\n\t\toffset: group.start / stride,\n\t\tcount: group.count / stride,\n\t} ));\n\n}\n\n// Function that extracts a set of mutually exclusive ranges representing the primitives being\n// drawn as determined by the geometry groups, draw range, and user specified range\nexport function getRootPrimitiveRanges( geo, range, stride ) {\n\n\tconst drawRange = getFullPrimitiveRange( geo, range, stride );\n\tconst primitiveRanges = getPrimitiveGroupRanges( geo, stride );\n\tif ( ! primitiveRanges.length ) {\n\n\t\treturn [ drawRange ];\n\n\t}\n\n\tconst ranges = [];\n\tconst drawRangeStart = drawRange.offset;\n\tconst drawRangeEnd = drawRange.offset + drawRange.count;\n\n\t// Create events for group boundaries\n\tconst primitiveCount = getVertexCount( geo ) / stride;\n\tconst events = [];\n\tfor ( const group of primitiveRanges ) {\n\n\t\t// Account for cases where group size is set to Infinity\n\t\tconst { offset, count } = group;\n\t\tconst groupStart = offset;\n\t\tconst groupCount = isFinite( count ) ? count : ( primitiveCount - offset );\n\t\tconst groupEnd = ( offset + groupCount );\n\n\t\t// Only add events if the group intersects with the draw range\n\t\tif ( groupStart < drawRangeEnd && groupEnd > drawRangeStart ) {\n\n\t\t\tevents.push( { pos: Math.max( drawRangeStart, groupStart ), isStart: true } );\n\t\t\tevents.push( { pos: Math.min( drawRangeEnd, groupEnd ), isStart: false } );\n\n\t\t}\n\n\t}\n\n\t// Sort events by position, with 'end' events before 'start' events at the same position\n\tevents.sort( ( a, b ) => {\n\n\t\tif ( a.pos !== b.pos ) {\n\n\t\t\treturn a.pos - b.pos;\n\n\t\t} else {\n\n\t\t\treturn a.type === 'end' ? - 1 : 1;\n\n\t\t}\n\n\t} );\n\n\t// sweep through events and create ranges where activeGroups > 0\n\tlet activeGroups = 0;\n\tlet lastPos = null;\n\tfor ( const event of events ) {\n\n\t\tconst newPos = event.pos;\n\t\tif ( activeGroups !== 0 && newPos !== lastPos ) {\n\n\t\t\tranges.push( {\n\t\t\t\toffset: lastPos,\n\t\t\t\tcount: newPos - lastPos,\n\t\t\t} );\n\n\t\t}\n\n\t\tactiveGroups += event.isStart ? 1 : - 1;\n\t\tlastPos = newPos;\n\n\t}\n\n\treturn ranges;\n\n}\n","import { Box3 } from 'three';\nimport { SKIP_GENERATION, DEFAULT_OPTIONS } from './Constants.js';\nimport { isSharedArrayBufferSupported } from '../utils/BufferUtils.js';\nimport { ensureIndex, getRootPrimitiveRanges } from './build/geometryUtils.js';\nimport { BVH } from './BVH.js';\n\n// construct a new buffer that points to the set of triangles represented by the given ranges\nexport function generateIndirectBuffer( ranges, useSharedArrayBuffer ) {\n\n\tconst lastRange = ranges[ ranges.length - 1 ];\n\tconst useUint32 = lastRange.offset + lastRange.count > 2 ** 16;\n\n\t// use getRootIndexRanges which excludes gaps\n\tconst length = ranges.reduce( ( acc, val ) => acc + val.count, 0 );\n\tconst byteCount = useUint32 ? 4 : 2;\n\tconst buffer = useSharedArrayBuffer ? new SharedArrayBuffer( length * byteCount ) : new ArrayBuffer( length * byteCount );\n\tconst indirectBuffer = useUint32 ? new Uint32Array( buffer ) : new Uint16Array( buffer );\n\n\t// construct a compact form of the triangles in these ranges\n\tlet index = 0;\n\tfor ( let r = 0; r < ranges.length; r ++ ) {\n\n\t\tconst { offset, count } = ranges[ r ];\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tindirectBuffer[ index + i ] = offset + i;\n\n\t\t}\n\n\t\tindex += count;\n\n\t}\n\n\treturn indirectBuffer;\n\n}\n\nexport class GeometryBVH extends BVH {\n\n\tget indirect() {\n\n\t\treturn ! ! this._indirectBuffer;\n\n\t}\n\n\tget primitiveStride() {\n\n\t\treturn null;\n\n\t}\n\n\tget primitiveBufferStride() {\n\n\t\treturn this.indirect ? 1 : this.primitiveStride;\n\n\t}\n\tset primitiveBufferStride( v ) {}\n\n\tget primitiveBuffer() {\n\n\t\treturn this.indirect ? this._indirectBuffer : this.geometry.index.array;\n\n\t}\n\tset primitiveBuffer( v ) {}\n\n\tconstructor( geometry, options = {} ) {\n\n\t\tif ( ! geometry.isBufferGeometry ) {\n\n\t\t\tthrow new Error( 'BVH: Only BufferGeometries are supported.' );\n\n\t\t} else if ( geometry.index && geometry.index.isInterleavedBufferAttribute ) {\n\n\t\t\tthrow new Error( 'BVH: InterleavedBufferAttribute is not supported for the index attribute.' );\n\n\t\t}\n\n\t\tif ( options.useSharedArrayBuffer && ! isSharedArrayBufferSupported() ) {\n\n\t\t\tthrow new Error( 'BVH: SharedArrayBuffer is not available.' );\n\n\t\t}\n\n\t\tsuper();\n\n\t\t// retain references to the geometry so we can use them it without having to\n\t\t// take a geometry reference in every function.\n\t\tthis.geometry = geometry;\n\t\tthis.resolvePrimitiveIndex = options.indirect ? i => this._indirectBuffer[ i ] : i => i;\n\t\tthis.primitiveBuffer = null;\n\t\tthis.primitiveBufferStride = null;\n\t\tthis._indirectBuffer = null;\n\n\t\toptions = {\n\t\t\t...DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t};\n\n\t\t// build the BVH unless we're deserializing\n\t\tif ( ! options[ SKIP_GENERATION ] ) {\n\n\t\t\tthis.init( options );\n\n\t\t}\n\n\t}\n\n\tinit( options ) {\n\n\t\tconst { geometry, primitiveStride } = this;\n\n\t\tif ( options.indirect ) {\n\n\t\t\t// construct an buffer that is indirectly sorts the triangles used for the BVH\n\t\t\tconst ranges = getRootPrimitiveRanges( geometry, options.range, primitiveStride );\n\t\t\tconst indirectBuffer = generateIndirectBuffer( ranges, options.useSharedArrayBuffer );\n\t\t\tthis._indirectBuffer = indirectBuffer;\n\n\t\t} else {\n\n\t\t\tensureIndex( geometry, options );\n\n\t\t}\n\n\t\tsuper.init( options );\n\n\t\tif ( ! geometry.boundingBox && options.setBoundingBox ) {\n\n\t\t\tgeometry.boundingBox = this.getBoundingBox( new Box3() );\n\n\t\t}\n\n\t}\n\n\t// Abstract methods to be implemented by subclasses\n\tgetRootRanges( range ) {\n\n\t\t// TODO: can we avoid passing options in here\n\t\tif ( this.indirect ) {\n\n\t\t\treturn [ { offset: 0, count: this._indirectBuffer.length } ];\n\n\n\t\t} else {\n\n\t\t\treturn getRootPrimitiveRanges( this.geometry, range, this.primitiveStride );\n\n\t\t}\n\n\t}\n\n\traycastObject3D( /* object, raycaster, intersects = [] */ ) {\n\n\t\tthrow new Error( 'BVH: raycastObject3D() not implemented' );\n\n\t}\n\n\tshapecast( callbacks ) {\n\n\t\tlet {\n\t\t\titerateDirect,\n\t\t\titerateIndirect,\n\t\t\t...rest\n\t\t} = callbacks;\n\n\t\tconst selectedIterateFunc = this.indirect ? iterateIndirect : iterateDirect;\n\t\treturn super.shapecast( {\n\t\t\t...rest,\n\t\t\titerate: selectedIterateFunc,\n\t\t} );\n\n\t}\n\n}\n","export function isSharedArrayBufferSupported() {\n\n\treturn typeof SharedArrayBuffer !== 'undefined';\n\n}\n\nexport function convertToBufferType( array, BufferConstructor ) {\n\n\tif ( array === null ) {\n\n\t\treturn array;\n\n\t} else if ( array.buffer ) {\n\n\t\tconst buffer = array.buffer;\n\t\tif ( buffer.constructor === BufferConstructor ) {\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tconst ArrayConstructor = array.constructor;\n\t\tconst result = new ArrayConstructor( new BufferConstructor( buffer.byteLength ) );\n\t\tresult.set( array );\n\t\treturn result;\n\n\t} else {\n\n\t\tif ( array.constructor === BufferConstructor ) {\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tconst result = new BufferConstructor( array.byteLength );\n\t\tnew Uint8Array( result ).set( new Uint8Array( array ) );\n\t\treturn result;\n\n\t}\n\n}\n","import { Vector3 } from 'three';\n\nexport class SeparatingAxisBounds {\n\n\tconstructor() {\n\n\t\tthis.min = Infinity;\n\t\tthis.max = - Infinity;\n\n\t}\n\n\tsetFromPointsField( points, field ) {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tconst val = p[ field ];\n\t\t\tmin = val < min ? val : min;\n\t\t\tmax = val > max ? val : max;\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tsetFromPoints( axis, points ) {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tconst val = axis.dot( p );\n\t\t\tmin = val < min ? val : min;\n\t\t\tmax = val > max ? val : max;\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tisSeparated( other ) {\n\n\t\treturn this.min > other.max || other.min > this.max;\n\n\t}\n\n}\n\nSeparatingAxisBounds.prototype.setFromBox = ( function () {\n\n\tconst p = /* @__PURE__ */ new Vector3();\n\treturn function setFromBox( axis, box ) {\n\n\t\tconst boxMin = box.min;\n\t\tconst boxMax = box.max;\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tp.x = boxMin.x * x + boxMax.x * ( 1 - x );\n\t\t\t\t\tp.y = boxMin.y * y + boxMax.y * ( 1 - y );\n\t\t\t\t\tp.z = boxMin.z * z + boxMax.z * ( 1 - z );\n\n\t\t\t\t\tconst val = axis.dot( p );\n\t\t\t\t\tmin = Math.min( val, min );\n\t\t\t\t\tmax = Math.max( val, max );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t};\n\n} )();\n\nexport const areIntersecting = ( function () {\n\n\tconst cacheSatBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\treturn function areIntersecting( shape1, shape2 ) {\n\n\t\tconst points1 = shape1.points;\n\t\tconst satAxes1 = shape1.satAxes;\n\t\tconst satBounds1 = shape1.satBounds;\n\n\t\tconst points2 = shape2.points;\n\t\tconst satAxes2 = shape2.satAxes;\n\t\tconst satBounds2 = shape2.satBounds;\n\n\t\t// check axes of the first shape\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds1[ i ];\n\t\t\tconst sa = satAxes1[ i ];\n\t\t\tcacheSatBounds.setFromPoints( sa, points2 );\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\n\n\t\t}\n\n\t\t// check axes of the second shape\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds2[ i ];\n\t\t\tconst sa = satAxes2[ i ];\n\t\t\tcacheSatBounds.setFromPoints( sa, points1 );\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\n\n\t\t}\n\n\t};\n\n} )();\n","import { Vector3, Vector2, Plane, Line3 } from 'three';\n\nexport const closestPointLineToLine = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Line.cpp#L56\n\tconst dir1 = /* @__PURE__ */ new Vector3();\n\tconst dir2 = /* @__PURE__ */ new Vector3();\n\tconst v02 = /* @__PURE__ */ new Vector3();\n\treturn function closestPointLineToLine( l1, l2, result ) {\n\n\t\tconst v0 = l1.start;\n\t\tconst v10 = dir1;\n\t\tconst v2 = l2.start;\n\t\tconst v32 = dir2;\n\n\t\tv02.subVectors( v0, v2 );\n\t\tdir1.subVectors( l1.end, l1.start );\n\t\tdir2.subVectors( l2.end, l2.start );\n\n\t\t// float d0232 = v02.Dot(v32);\n\t\tconst d0232 = v02.dot( v32 );\n\n\t\t// float d3210 = v32.Dot(v10);\n\t\tconst d3210 = v32.dot( v10 );\n\n\t\t// float d3232 = v32.Dot(v32);\n\t\tconst d3232 = v32.dot( v32 );\n\n\t\t// float d0210 = v02.Dot(v10);\n\t\tconst d0210 = v02.dot( v10 );\n\n\t\t// float d1010 = v10.Dot(v10);\n\t\tconst d1010 = v10.dot( v10 );\n\n\t\t// float denom = d1010*d3232 - d3210*d3210;\n\t\tconst denom = d1010 * d3232 - d3210 * d3210;\n\n\t\tlet d, d2;\n\t\tif ( denom !== 0 ) {\n\n\t\t\td = ( d0232 * d3210 - d0210 * d3232 ) / denom;\n\n\t\t} else {\n\n\t\t\td = 0;\n\n\t\t}\n\n\t\td2 = ( d0232 + d * d3210 ) / d3232;\n\n\t\tresult.x = d;\n\t\tresult.y = d2;\n\n\t};\n\n} )();\n\nexport const closestPointsSegmentToSegment = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/LineSegment.cpp#L187\n\tconst paramResult = /* @__PURE__ */ new Vector2();\n\tconst temp1 = /* @__PURE__ */ new Vector3();\n\tconst temp2 = /* @__PURE__ */ new Vector3();\n\treturn function closestPointsSegmentToSegment( l1, l2, target1, target2 ) {\n\n\t\tclosestPointLineToLine( l1, l2, paramResult );\n\n\t\tlet d = paramResult.x;\n\t\tlet d2 = paramResult.y;\n\t\tif ( d >= 0 && d <= 1 && d2 >= 0 && d2 <= 1 ) {\n\n\t\t\tl1.at( d, target1 );\n\t\t\tl2.at( d2, target2 );\n\n\t\t\treturn;\n\n\t\t} else if ( d >= 0 && d <= 1 ) {\n\n\t\t\t// Only d2 is out of bounds.\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tl2.at( 0, target2 );\n\n\t\t\t} else {\n\n\t\t\t\tl2.at( 1, target2 );\n\n\t\t\t}\n\n\t\t\tl1.closestPointToPoint( target2, true, target1 );\n\t\t\treturn;\n\n\t\t} else if ( d2 >= 0 && d2 <= 1 ) {\n\n\t\t\t// Only d is out of bounds.\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tl1.at( 0, target1 );\n\n\t\t\t} else {\n\n\t\t\t\tl1.at( 1, target1 );\n\n\t\t\t}\n\n\t\t\tl2.closestPointToPoint( target1, true, target2 );\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// Both u and u2 are out of bounds.\n\t\t\tlet p;\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tp = l1.start;\n\n\t\t\t} else {\n\n\t\t\t\tp = l1.end;\n\n\t\t\t}\n\n\t\t\tlet p2;\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tp2 = l2.start;\n\n\t\t\t} else {\n\n\t\t\t\tp2 = l2.end;\n\n\t\t\t}\n\n\t\t\tconst closestPoint = temp1;\n\t\t\tconst closestPoint2 = temp2;\n\t\t\tl1.closestPointToPoint( p2, true, temp1 );\n\t\t\tl2.closestPointToPoint( p, true, temp2 );\n\n\t\t\tif ( closestPoint.distanceToSquared( p2 ) <= closestPoint2.distanceToSquared( p ) ) {\n\n\t\t\t\ttarget1.copy( closestPoint );\n\t\t\t\ttarget2.copy( p2 );\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\ttarget1.copy( p );\n\t\t\t\ttarget2.copy( closestPoint2 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n} )();\n\n\nexport const sphereIntersectTriangle = ( function () {\n\n\t// https://stackoverflow.com/questions/34043955/detect-collision-between-sphere-and-triangle-in-three-js\n\tconst closestPointTemp = /* @__PURE__ */ new Vector3();\n\tconst projectedPointTemp = /* @__PURE__ */ new Vector3();\n\tconst planeTemp = /* @__PURE__ */ new Plane();\n\tconst lineTemp = /* @__PURE__ */ new Line3();\n\treturn function sphereIntersectTriangle( sphere, triangle ) {\n\n\t\tconst { radius, center } = sphere;\n\t\tconst { a, b, c } = triangle;\n\n\t\t// phase 1\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = b;\n\t\tconst closestPoint1 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint1.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint2 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint2.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = b;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint3 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint3.distanceTo( center ) <= radius ) return true;\n\n\t\t// phase 2\n\t\tconst plane = triangle.getPlane( planeTemp );\n\t\tconst dp = Math.abs( plane.distanceToPoint( center ) );\n\t\tif ( dp <= radius ) {\n\n\t\t\tconst pp = plane.projectPoint( center, projectedPointTemp );\n\t\t\tconst cp = triangle.containsPoint( pp );\n\t\t\tif ( cp ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t};\n\n} )();\n","import { Triangle, Vector3, Vector2, Line3, Plane } from 'three';\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\nimport { closestPointsSegmentToSegment, sphereIntersectTriangle } from './MathUtilities.js';\n\nconst componentKeys = [ 'x', 'y', 'z' ];\nconst ZERO_EPSILON = 1e-15;\nconst ZERO_EPSILON_SQR = ZERO_EPSILON * ZERO_EPSILON;\nfunction isNearZero( value ) {\n\n\treturn Math.abs( value ) < ZERO_EPSILON;\n\n}\n\nexport class ExtendedTriangle extends Triangle {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isExtendedTriangle = true;\n\t\tthis.satAxes = new Array( 4 ).fill().map( () => new Vector3() );\n\t\tthis.satBounds = new Array( 4 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.points = [ this.a, this.b, this.c ];\n\t\tthis.plane = new Plane();\n\t\tthis.isDegenerateIntoSegment = false;\n\t\tthis.isDegenerateIntoPoint = false;\n\t\tthis.degenerateSegment = new Line3();\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphereIntersectTriangle( sphere, this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst a = this.a;\n\t\tconst b = this.b;\n\t\tconst c = this.c;\n\t\tconst points = this.points;\n\n\t\tconst satAxes = this.satAxes;\n\t\tconst satBounds = this.satBounds;\n\n\t\tconst axis0 = satAxes[ 0 ];\n\t\tconst sab0 = satBounds[ 0 ];\n\t\tthis.getNormal( axis0 );\n\t\tsab0.setFromPoints( axis0, points );\n\n\t\tconst axis1 = satAxes[ 1 ];\n\t\tconst sab1 = satBounds[ 1 ];\n\t\taxis1.subVectors( a, b );\n\t\tsab1.setFromPoints( axis1, points );\n\n\t\tconst axis2 = satAxes[ 2 ];\n\t\tconst sab2 = satBounds[ 2 ];\n\t\taxis2.subVectors( b, c );\n\t\tsab2.setFromPoints( axis2, points );\n\n\t\tconst axis3 = satAxes[ 3 ];\n\t\tconst sab3 = satBounds[ 3 ];\n\t\taxis3.subVectors( c, a );\n\t\tsab3.setFromPoints( axis3, points );\n\n\t\tconst lengthAB = axis1.length();\n\t\tconst lengthBC = axis2.length();\n\t\tconst lengthCA = axis3.length();\n\n\t\tthis.isDegenerateIntoPoint = false;\n\t\tthis.isDegenerateIntoSegment = false;\n\n\t\tif ( lengthAB < ZERO_EPSILON ) {\n\n\t\t\tif ( lengthBC < ZERO_EPSILON || lengthCA < ZERO_EPSILON ) {\n\n\t\t\t\tthis.isDegenerateIntoPoint = true;\n\n\t\t\t} else {\n\n\t\t\t\tthis.isDegenerateIntoSegment = true;\n\t\t\t\tthis.degenerateSegment.start.copy( a );\n\t\t\t\tthis.degenerateSegment.end.copy( c );\n\n\t\t\t}\n\n\t\t} else if ( lengthBC < ZERO_EPSILON ) {\n\n\t\t\tif ( lengthCA < ZERO_EPSILON ) {\n\n\t\t\t\tthis.isDegenerateIntoPoint = true;\n\n\t\t\t} else {\n\n\t\t\t\tthis.isDegenerateIntoSegment = true;\n\t\t\t\tthis.degenerateSegment.start.copy( b );\n\t\t\t\tthis.degenerateSegment.end.copy( a );\n\n\t\t\t}\n\n\t\t} else if ( lengthCA < ZERO_EPSILON ) {\n\n\t\t\tthis.isDegenerateIntoSegment = true;\n\t\t\tthis.degenerateSegment.start.copy( c );\n\t\t\tthis.degenerateSegment.end.copy( b );\n\n\t\t}\n\n\t\tthis.plane.setFromNormalAndCoplanarPoint( axis0, a );\n\n\t\tthis.needsUpdate = false;\n\n\t}\n\n}\n\nExtendedTriangle.prototype.closestPointToSegment = ( function () {\n\n\tconst point1 = /* @__PURE__ */ new Vector3();\n\tconst point2 = /* @__PURE__ */ new Vector3();\n\tconst edge = /* @__PURE__ */ new Line3();\n\n\treturn function distanceToSegment( segment, target1 = null, target2 = null ) {\n\n\t\tconst { start, end } = segment;\n\t\tconst points = this.points;\n\t\tlet distSq;\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check the triangle edges\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst nexti = ( i + 1 ) % 3;\n\t\t\tedge.start.copy( points[ i ] );\n\t\t\tedge.end.copy( points[ nexti ] );\n\n\t\t\tclosestPointsSegmentToSegment( edge, segment, point1, point2 );\n\n\t\t\tdistSq = point1.distanceToSquared( point2 );\n\t\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = distSq;\n\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check end points\n\t\tthis.closestPointToPoint( start, point1 );\n\t\tdistSq = start.distanceToSquared( point1 );\n\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\tclosestDistanceSq = distSq;\n\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\tif ( target2 ) target2.copy( start );\n\n\t\t}\n\n\t\tthis.closestPointToPoint( end, point1 );\n\t\tdistSq = end.distanceToSquared( point1 );\n\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\tclosestDistanceSq = distSq;\n\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\tif ( target2 ) target2.copy( end );\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n\nExtendedTriangle.prototype.intersectsTriangle = ( function () {\n\n\tconst saTri2 = /* @__PURE__ */ new ExtendedTriangle();\n\tconst cachedSatBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst cachedSatBounds2 = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst tmpVec = /* @__PURE__ */ new Vector3();\n\tconst dir1 = /* @__PURE__ */ new Vector3();\n\tconst dir2 = /* @__PURE__ */ new Vector3();\n\tconst tempDir = /* @__PURE__ */ new Vector3();\n\tconst edge1 = /* @__PURE__ */ new Line3();\n\tconst edge2 = /* @__PURE__ */ new Line3();\n\tconst tempPoint = /* @__PURE__ */ new Vector3();\n\tconst bounds1 = /* @__PURE__ */ new Vector2();\n\tconst bounds2 = /* @__PURE__ */ new Vector2();\n\n\tfunction coplanarIntersectsTriangle( self, other, target, suppressLog ) {\n\n\t\t// Perform separating axis intersection test only for coplanar triangles\n\t\t// There should be at least one non-degenerate triangle when calling this\n\t\t// Otherwise we won't know the plane normal\n\t\tconst planeNormal = tmpVec;\n\t\tif ( ! self.isDegenerateIntoPoint && ! self.isDegenerateIntoSegment ) {\n\n\t\t\tplaneNormal.copy( self.plane.normal );\n\n\t\t} else {\n\n\t\t\tplaneNormal.copy( other.plane.normal );\n\n\t\t}\n\n\t\tconst satBounds1 = self.satBounds;\n\t\tconst satAxes1 = self.satAxes;\n\t\tfor ( let i = 1; i < 4; i ++ ) {\n\n\t\t\tconst sb = satBounds1[ i ];\n\t\t\tconst sa = satAxes1[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, other.points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t\ttempDir.copy( planeNormal ).cross( sa );\n\t\t\tcachedSatBounds.setFromPoints( tempDir, self.points );\n\t\t\tcachedSatBounds2.setFromPoints( tempDir, other.points );\n\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t}\n\n\t\tconst satBounds2 = other.satBounds;\n\t\tconst satAxes2 = other.satAxes;\n\t\tfor ( let i = 1; i < 4; i ++ ) {\n\n\t\t\tconst sb = satBounds2[ i ];\n\t\t\tconst sa = satAxes2[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, self.points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t\ttempDir.crossVectors( planeNormal, sa );\n\t\t\tcachedSatBounds.setFromPoints( tempDir, self.points );\n\t\t\tcachedSatBounds2.setFromPoints( tempDir, other.points );\n\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t}\n\n\t\tif ( target ) {\n\n\t\t\t// TODO find two points that intersect on the edges and make that the result\n\t\t\tif ( ! suppressLog ) {\n\n\t\t\t\tconsole.warn( 'ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.' );\n\n\t\t\t}\n\n\t\t\ttarget.start.set( 0, 0, 0 );\n\t\t\ttarget.end.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction findSingleBounds( a, b, c, aProj, bProj, cProj, aDist, bDist, cDist, bounds, edge ) {\n\n\t\tlet t = aDist / ( aDist - bDist );\n\t\tbounds.x = aProj + ( bProj - aProj ) * t;\n\t\tedge.start.subVectors( b, a ).multiplyScalar( t ).add( a );\n\n\t\tt = aDist / ( aDist - cDist );\n\t\tbounds.y = aProj + ( cProj - aProj ) * t;\n\t\tedge.end.subVectors( c, a ).multiplyScalar( t ).add( a );\n\n\t}\n\n\t/**\n\t * Calculates intersection segment of a triangle with intersection line.\n\t * Intersection line is snapped to its biggest component.\n\t * And triangle points are passed as a projection on that component.\n\t * @returns whether this is a coplanar case or not\n\t */\n\tfunction findIntersectionLineBounds( self, aProj, bProj, cProj, abDist, acDist, aDist, bDist, cDist, bounds, edge ) {\n\n\t\tif ( abDist > 0 ) {\n\n\t\t\t// then bcDist < 0\n\t\t\tfindSingleBounds( self.c, self.a, self.b, cProj, aProj, bProj, cDist, aDist, bDist, bounds, edge );\n\n\t\t} else if ( acDist > 0 ) {\n\n\t\t\tfindSingleBounds( self.b, self.a, self.c, bProj, aProj, cProj, bDist, aDist, cDist, bounds, edge );\n\n\t\t} else if ( bDist * cDist > 0 || aDist != 0 ) {\n\n\t\t\tfindSingleBounds( self.a, self.b, self.c, aProj, bProj, cProj, aDist, bDist, cDist, bounds, edge );\n\n\t\t} else if ( bDist != 0 ) {\n\n\t\t\tfindSingleBounds( self.b, self.a, self.c, bProj, aProj, cProj, bDist, aDist, cDist, bounds, edge );\n\n\t\t} else if ( cDist != 0 ) {\n\n\t\t\tfindSingleBounds( self.c, self.a, self.b, cProj, aProj, bProj, cDist, aDist, bDist, bounds, edge );\n\n\t\t} else {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction intersectTriangleSegment( triangle, degenerateTriangle, target, suppressLog ) {\n\n\t\tconst segment = degenerateTriangle.degenerateSegment;\n\t\tconst startDist = triangle.plane.distanceToPoint( segment.start );\n\t\tconst endDist = triangle.plane.distanceToPoint( segment.end );\n\t\tif ( isNearZero( startDist ) ) {\n\n\t\t\tif ( isNearZero( endDist ) ) {\n\n\t\t\t\treturn coplanarIntersectsTriangle( triangle, degenerateTriangle, target, suppressLog );\n\n\t\t\t} else {\n\n\t\t\t\t// Is this fine to modify target even if there might be no intersection?\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\ttarget.start.copy( segment.start );\n\t\t\t\t\ttarget.end.copy( segment.start );\n\n\t\t\t\t}\n\n\t\t\t\treturn triangle.containsPoint( segment.start );\n\n\t\t\t}\n\n\t\t} else if ( isNearZero( endDist ) ) {\n\n\t\t\tif ( target ) {\n\n\t\t\t\ttarget.start.copy( segment.end );\n\t\t\t\ttarget.end.copy( segment.end );\n\n\t\t\t}\n\n\t\t\treturn triangle.containsPoint( segment.end );\n\n\t\t} else {\n\n\t\t\tif ( triangle.plane.intersectLine( segment, tmpVec ) != null ) {\n\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\ttarget.start.copy( tmpVec );\n\t\t\t\t\ttarget.end.copy( tmpVec );\n\n\t\t\t\t}\n\n\t\t\t\treturn triangle.containsPoint( tmpVec );\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction intersectTrianglePoint( triangle, degenerateTriangle, target ) {\n\n\t\tconst point = degenerateTriangle.a;\n\n\t\tif ( isNearZero( triangle.plane.distanceToPoint( point ) ) && triangle.containsPoint( point ) ) {\n\n\t\t\tif ( target ) {\n\n\t\t\t\ttarget.start.copy( point );\n\t\t\t\ttarget.end.copy( point );\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tfunction intersectSegmentPoint( segmentTri, pointTri, target ) {\n\n\t\tconst segment = segmentTri.degenerateSegment;\n\t\tconst point = pointTri.a;\n\n\t\tsegment.closestPointToPoint( point, true, tmpVec );\n\n\t\tif ( point.distanceToSquared( tmpVec ) < ZERO_EPSILON_SQR ) {\n\n\t\t\tif ( target ) {\n\n\t\t\t\ttarget.start.copy( point );\n\t\t\t\ttarget.end.copy( point );\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tfunction handleDegenerateCases( self, other, target, suppressLog ) {\n\n\t\tif ( self.isDegenerateIntoSegment ) {\n\n\t\t\tif ( other.isDegenerateIntoSegment ) {\n\n\t\t\t\t// TODO: replace with Line.distanceSqToLine3 after r179\n\t\t\t\tconst segment1 = self.degenerateSegment;\n\t\t\t\tconst segment2 = other.degenerateSegment;\n\t\t\t\tconst delta1 = dir1;\n\t\t\t\tconst delta2 = dir2;\n\t\t\t\tsegment1.delta( delta1 );\n\t\t\t\tsegment2.delta( delta2 );\n\t\t\t\tconst startDelta = tmpVec.subVectors( segment2.start, segment1.start );\n\n\t\t\t\tconst denom = delta1.x * delta2.y - delta1.y * delta2.x;\n\t\t\t\tif ( isNearZero( denom ) ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst t = ( startDelta.x * delta2.y - startDelta.y * delta2.x ) / denom;\n\t\t\t\tconst u = - ( delta1.x * startDelta.y - delta1.y * startDelta.x ) / denom;\n\n\t\t\t\tif ( t < 0 || t > 1 || u < 0 || u > 1 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst z1 = segment1.start.z + delta1.z * t;\n\t\t\t\tconst z2 = segment2.start.z + delta2.z * u;\n\n\t\t\t\tif ( isNearZero( z1 - z2 ) ) {\n\n\t\t\t\t\tif ( target ) {\n\n\t\t\t\t\t\ttarget.start.copy( segment1.start ).addScaledVector( delta1, t );\n\t\t\t\t\t\ttarget.end.copy( segment1.start ).addScaledVector( delta1, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} else if ( other.isDegenerateIntoPoint ) {\n\n\t\t\t\treturn intersectSegmentPoint( self, other, target );\n\n\t\t\t} else {\n\n\t\t\t\treturn intersectTriangleSegment( other, self, target, suppressLog );\n\n\t\t\t}\n\n\t\t} else if ( self.isDegenerateIntoPoint ) {\n\n\t\t\tif ( other.isDegenerateIntoPoint ) {\n\n\t\t\t\tif ( other.a.distanceToSquared( self.a ) < ZERO_EPSILON_SQR ) {\n\n\t\t\t\t\tif ( target ) {\n\n\t\t\t\t\t\ttarget.start.copy( self.a );\n\t\t\t\t\t\ttarget.end.copy( self.a );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} else if ( other.isDegenerateIntoSegment ) {\n\n\t\t\t\treturn intersectSegmentPoint( other, self, target );\n\n\t\t\t} else {\n\n\t\t\t\treturn intersectTrianglePoint( other, self, target );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( other.isDegenerateIntoPoint ) {\n\n\t\t\t\treturn intersectTrianglePoint( self, other, target );\n\n\t\t\t} else if ( other.isDegenerateIntoSegment ) {\n\n\t\t\t\treturn intersectTriangleSegment( self, other, target, suppressLog );\n\n\t\t\t} /* else this is a general triangle-traingle case, so return undefined */\n\n\t\t}\n\n\t}\n\n\t/* TODO: If the triangles are coplanar and intersecting the target is nonsensical. It should at least\n\t * be a line contained by both triangles if not a different special case somehow represented in the return result.\n\t *\n\t * General triangle intersection code is based on Moller's algorithm from here: https://web.stanford.edu/class/cs277/resources/papers/Moller1997b.pdf\n\t * Reference implementation from here: https://github.com/erich666/jgt-code/blob/master/Volume_08/Number_1/Shen2003/tri_tri_test/include/Moller97.c#L570\n\t * All degeneracies are handled before the general algorithm.\n\t * Coplanar check is different from Moller's and based on SAT tests.\n\t */\n\treturn function intersectsTriangle( other, target = null, suppressLog = false ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( ! other.isExtendedTriangle ) {\n\n\t\t\tsaTri2.copy( other );\n\t\t\tsaTri2.update();\n\t\t\tother = saTri2;\n\n\t\t} else if ( other.needsUpdate ) {\n\n\t\t\tother.update();\n\n\t\t}\n\n\t\tconst res = handleDegenerateCases( this, other, target, suppressLog );\n\t\tif ( res !== undefined ) {\n\n\t\t\treturn res;\n\n\t\t}\n\n\t\tconst plane1 = this.plane;\n\t\tconst plane2 = other.plane;\n\n\t\tlet a1Dist = plane2.distanceToPoint( this.a );\n\t\tlet b1Dist = plane2.distanceToPoint( this.b );\n\t\tlet c1Dist = plane2.distanceToPoint( this.c );\n\n\t\tif ( isNearZero( a1Dist ) )\n\t\t\ta1Dist = 0;\n\n\t\tif ( isNearZero( b1Dist ) )\n\t\t\tb1Dist = 0;\n\n\t\tif ( isNearZero( c1Dist ) )\n\t\t\tc1Dist = 0;\n\n\t\tconst a1b1Dist = a1Dist * b1Dist;\n\t\tconst a1c1Dist = a1Dist * c1Dist;\n\t\tif ( a1b1Dist > 0 && a1c1Dist > 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tlet a2Dist = plane1.distanceToPoint( other.a );\n\t\tlet b2Dist = plane1.distanceToPoint( other.b );\n\t\tlet c2Dist = plane1.distanceToPoint( other.c );\n\n\t\tif ( isNearZero( a2Dist ) )\n\t\t\ta2Dist = 0;\n\n\t\tif ( isNearZero( b2Dist ) )\n\t\t\tb2Dist = 0;\n\n\t\tif ( isNearZero( c2Dist ) )\n\t\t\tc2Dist = 0;\n\n\t\tconst a2b2Dist = a2Dist * b2Dist;\n\t\tconst a2c2Dist = a2Dist * c2Dist;\n\t\tif ( a2b2Dist > 0 && a2c2Dist > 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tdir1.copy( plane1.normal );\n\t\tdir2.copy( plane2.normal );\n\t\tconst intersectionLine = dir1.cross( dir2 );\n\n\t\tlet componentIndex = 0;\n\t\tlet maxComponent = Math.abs( intersectionLine.x );\n\t\tconst comp1 = Math.abs( intersectionLine.y );\n\t\tif ( comp1 > maxComponent ) {\n\n\t\t\tmaxComponent = comp1;\n\t\t\tcomponentIndex = 1;\n\n\t\t}\n\n\t\tconst comp2 = Math.abs( intersectionLine.z );\n\t\tif ( comp2 > maxComponent ) {\n\n\t\t\tcomponentIndex = 2;\n\n\t\t}\n\n\t\tconst key = componentKeys[ componentIndex ];\n\t\tconst a1Proj = this.a[ key ];\n\t\tconst b1Proj = this.b[ key ];\n\t\tconst c1Proj = this.c[ key ];\n\n\t\tconst a2Proj = other.a[ key ];\n\t\tconst b2Proj = other.b[ key ];\n\t\tconst c2Proj = other.c[ key ];\n\n\t\tif ( findIntersectionLineBounds( this, a1Proj, b1Proj, c1Proj, a1b1Dist, a1c1Dist, a1Dist, b1Dist, c1Dist, bounds1, edge1 ) ) {\n\n\t\t\treturn coplanarIntersectsTriangle( this, other, target, suppressLog );\n\n\t\t}\n\n\t\tif ( findIntersectionLineBounds( other, a2Proj, b2Proj, c2Proj, a2b2Dist, a2c2Dist, a2Dist, b2Dist, c2Dist, bounds2, edge2 ) ) {\n\n\t\t\treturn coplanarIntersectsTriangle( this, other, target, suppressLog );\n\n\t\t}\n\n\t\tif ( bounds1.y < bounds1.x ) {\n\n\t\t\tconst tmp = bounds1.y;\n\t\t\tbounds1.y = bounds1.x;\n\t\t\tbounds1.x = tmp;\n\n\t\t\ttempPoint.copy( edge1.start );\n\t\t\tedge1.start.copy( edge1.end );\n\t\t\tedge1.end.copy( tempPoint );\n\n\t\t}\n\n\t\tif ( bounds2.y < bounds2.x ) {\n\n\t\t\tconst tmp = bounds2.y;\n\t\t\tbounds2.y = bounds2.x;\n\t\t\tbounds2.x = tmp;\n\n\t\t\ttempPoint.copy( edge2.start );\n\t\t\tedge2.start.copy( edge2.end );\n\t\t\tedge2.end.copy( tempPoint );\n\n\t\t}\n\n\t\tif ( bounds1.y < bounds2.x || bounds2.y < bounds1.x ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( target ) {\n\n\t\t\tif ( bounds2.x > bounds1.x ) {\n\n\t\t\t\ttarget.start.copy( edge2.start );\n\n\t\t\t} else {\n\n\t\t\t\ttarget.start.copy( edge1.start );\n\n\t\t\t}\n\n\t\t\tif ( bounds2.y < bounds1.y ) {\n\n\t\t\t\ttarget.end.copy( edge2.end );\n\n\t\t\t} else {\n\n\t\t\t\ttarget.end.copy( edge1.end );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\n\nExtendedTriangle.prototype.distanceToPoint = ( function () {\n\n\tconst target = /* @__PURE__ */ new Vector3();\n\treturn function distanceToPoint( point ) {\n\n\t\tthis.closestPointToPoint( point, target );\n\t\treturn point.distanceTo( target );\n\n\t};\n\n} )();\n\n\nExtendedTriangle.prototype.distanceToTriangle = ( function () {\n\n\tconst point = /* @__PURE__ */ new Vector3();\n\tconst point2 = /* @__PURE__ */ new Vector3();\n\tconst cornerFields = [ 'a', 'b', 'c' ];\n\tconst line1 = /* @__PURE__ */ new Line3();\n\tconst line2 = /* @__PURE__ */ new Line3();\n\n\treturn function distanceToTriangle( other, target1 = null, target2 = null ) {\n\n\t\tconst lineTarget = target1 || target2 ? line1 : null;\n\t\tif ( this.intersectsTriangle( other, lineTarget ) ) {\n\n\t\t\tif ( target1 || target2 ) {\n\n\t\t\t\tif ( target1 ) lineTarget.getCenter( target1 );\n\t\t\t\tif ( target2 ) lineTarget.getCenter( target2 );\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check all point distances\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tlet dist;\n\t\t\tconst field = cornerFields[ i ];\n\t\t\tconst otherVec = other[ field ];\n\t\t\tthis.closestPointToPoint( otherVec, point );\n\n\t\t\tdist = otherVec.distanceToSquared( point );\n\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( point );\n\t\t\t\tif ( target2 ) target2.copy( otherVec );\n\n\t\t\t}\n\n\n\t\t\tconst thisVec = this[ field ];\n\t\t\tother.closestPointToPoint( thisVec, point );\n\n\t\t\tdist = thisVec.distanceToSquared( point );\n\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( thisVec );\n\t\t\t\tif ( target2 ) target2.copy( point );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst f11 = cornerFields[ i ];\n\t\t\tconst f12 = cornerFields[ ( i + 1 ) % 3 ];\n\t\t\tline1.set( this[ f11 ], this[ f12 ] );\n\t\t\tfor ( let i2 = 0; i2 < 3; i2 ++ ) {\n\n\t\t\t\tconst f21 = cornerFields[ i2 ];\n\t\t\t\tconst f22 = cornerFields[ ( i2 + 1 ) % 3 ];\n\t\t\t\tline2.set( other[ f21 ], other[ f22 ] );\n\n\t\t\t\tclosestPointsSegmentToSegment( line1, line2, point, point2 );\n\n\t\t\t\tconst dist = point.distanceToSquared( point2 );\n\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\tif ( target1 ) target1.copy( point );\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n","import { Vector3, Matrix4, Line3 } from 'three';\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\nimport { ExtendedTriangle } from './ExtendedTriangle.js';\nimport { closestPointsSegmentToSegment } from './MathUtilities.js';\n\nexport class OrientedBox {\n\n\tconstructor( min, max, matrix ) {\n\n\t\tthis.isOrientedBox = true;\n\t\tthis.min = new Vector3();\n\t\tthis.max = new Vector3();\n\t\tthis.matrix = new Matrix4();\n\t\tthis.invMatrix = new Matrix4();\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\n\t\tthis.satAxes = new Array( 3 ).fill().map( () => new Vector3() );\n\t\tthis.satBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.alignedSatBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\n\t\tthis.needsUpdate = false;\n\n\t\tif ( min ) this.min.copy( min );\n\t\tif ( max ) this.max.copy( max );\n\t\tif ( matrix ) this.matrix.copy( matrix );\n\n\t}\n\n\tset( min, max, matrix ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\t\tthis.matrix.copy( matrix );\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.min.copy( other.min );\n\t\tthis.max.copy( other.max );\n\t\tthis.matrix.copy( other.matrix );\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nOrientedBox.prototype.update = ( function () {\n\n\treturn function update() {\n\n\t\tconst matrix = this.matrix;\n\t\tconst min = this.min;\n\t\tconst max = this.max;\n\n\t\tconst points = this.points;\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tconst i = ( ( 1 << 0 ) * x ) | ( ( 1 << 1 ) * y ) | ( ( 1 << 2 ) * z );\n\t\t\t\t\tconst v = points[ i ];\n\t\t\t\t\tv.x = x ? max.x : min.x;\n\t\t\t\t\tv.y = y ? max.y : min.y;\n\t\t\t\t\tv.z = z ? max.z : min.z;\n\n\t\t\t\t\tv.applyMatrix4( matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\t\tconst minVec = points[ 0 ];\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis = satAxes[ i ];\n\t\t\tconst sb = satBounds[ i ];\n\t\t\tconst index = 1 << i;\n\t\t\tconst pi = points[ index ];\n\n\t\t\taxis.subVectors( minVec, pi );\n\t\t\tsb.setFromPoints( axis, points );\n\n\t\t}\n\n\t\tconst alignedSatBounds = this.alignedSatBounds;\n\t\talignedSatBounds[ 0 ].setFromPointsField( points, 'x' );\n\t\talignedSatBounds[ 1 ].setFromPointsField( points, 'y' );\n\t\talignedSatBounds[ 2 ].setFromPointsField( points, 'z' );\n\n\t\tthis.invMatrix.copy( this.matrix ).invert();\n\t\tthis.needsUpdate = false;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.intersectsBox = ( function () {\n\n\tconst aabbBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\treturn function intersectsBox( box ) {\n\n\t\t// TODO: should this be doing SAT against the AABB?\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tconst min = box.min;\n\t\tconst max = box.max;\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\t\tconst alignedSatBounds = this.alignedSatBounds;\n\n\t\taabbBounds.min = min.x;\n\t\taabbBounds.max = max.x;\n\t\tif ( alignedSatBounds[ 0 ].isSeparated( aabbBounds ) ) return false;\n\n\t\taabbBounds.min = min.y;\n\t\taabbBounds.max = max.y;\n\t\tif ( alignedSatBounds[ 1 ].isSeparated( aabbBounds ) ) return false;\n\n\t\taabbBounds.min = min.z;\n\t\taabbBounds.max = max.z;\n\t\tif ( alignedSatBounds[ 2 ].isSeparated( aabbBounds ) ) return false;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis = satAxes[ i ];\n\t\t\tconst sb = satBounds[ i ];\n\t\t\taabbBounds.setFromBox( axis, box );\n\t\t\tif ( sb.isSeparated( aabbBounds ) ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.intersectsTriangle = ( function () {\n\n\tconst saTri = /* @__PURE__ */ new ExtendedTriangle();\n\tconst pointsArr = /* @__PURE__ */ new Array( 3 );\n\tconst cachedSatBounds = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst cachedSatBounds2 = /* @__PURE__ */ new SeparatingAxisBounds();\n\tconst cachedAxis = /* @__PURE__ */ new Vector3();\n\treturn function intersectsTriangle( triangle ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( ! triangle.isExtendedTriangle ) {\n\n\t\t\tsaTri.copy( triangle );\n\t\t\tsaTri.update();\n\t\t\ttriangle = saTri;\n\n\t\t} else if ( triangle.needsUpdate ) {\n\n\t\t\ttriangle.update();\n\n\t\t}\n\n\t\tconst satBounds = this.satBounds;\n\t\tconst satAxes = this.satAxes;\n\n\t\tpointsArr[ 0 ] = triangle.a;\n\t\tpointsArr[ 1 ] = triangle.b;\n\t\tpointsArr[ 2 ] = triangle.c;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = satBounds[ i ];\n\t\t\tconst sa = satAxes[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, pointsArr );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t}\n\n\t\tconst triSatBounds = triangle.satBounds;\n\t\tconst triSatAxes = triangle.satAxes;\n\t\tconst points = this.points;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sb = triSatBounds[ i ];\n\t\t\tconst sa = triSatAxes[ i ];\n\t\t\tcachedSatBounds.setFromPoints( sa, points );\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\n\n\t\t}\n\n\t\t// check crossed axes\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst sa1 = satAxes[ i ];\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\n\n\t\t\t\tconst sa2 = triSatAxes[ i2 ];\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, pointsArr );\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, points );\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.closestPointToPoint = ( function () {\n\n\treturn function closestPointToPoint( point, target1 ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\ttarget1\n\t\t\t.copy( point )\n\t\t\t.applyMatrix4( this.invMatrix )\n\t\t\t.clamp( this.min, this.max )\n\t\t\t.applyMatrix4( this.matrix );\n\n\t\treturn target1;\n\n\t};\n\n} )();\n\nOrientedBox.prototype.distanceToPoint = ( function () {\n\n\tconst target = new Vector3();\n\treturn function distanceToPoint( point ) {\n\n\t\tthis.closestPointToPoint( point, target );\n\t\treturn point.distanceTo( target );\n\n\t};\n\n} )();\n\nOrientedBox.prototype.distanceToBox = ( function () {\n\n\tconst xyzFields = [ 'x', 'y', 'z' ];\n\tconst segments1 = /* @__PURE__ */ new Array( 12 ).fill().map( () => new Line3() );\n\tconst segments2 = /* @__PURE__ */ new Array( 12 ).fill().map( () => new Line3() );\n\n\tconst point1 = /* @__PURE__ */ new Vector3();\n\tconst point2 = /* @__PURE__ */ new Vector3();\n\n\t// early out if we find a value below threshold\n\treturn function distanceToBox( box, threshold = 0, target1 = null, target2 = null ) {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t\tif ( this.intersectsBox( box ) ) {\n\n\t\t\tif ( target1 || target2 ) {\n\n\t\t\t\tbox.getCenter( point2 );\n\t\t\t\tthis.closestPointToPoint( point2, point1 );\n\t\t\t\tbox.closestPointToPoint( point1, point2 );\n\n\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tconst threshold2 = threshold * threshold;\n\t\tconst min = box.min;\n\t\tconst max = box.max;\n\t\tconst points = this.points;\n\n\n\t\t// iterate over every edge and compare distances\n\t\tlet closestDistanceSq = Infinity;\n\n\t\t// check over all these points\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tconst p = points[ i ];\n\t\t\tpoint2.copy( p ).clamp( min, max );\n\n\t\t\tconst dist = p.distanceToSquared( point2 );\n\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\tif ( target1 ) target1.copy( p );\n\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate and check all line segment distances\n\t\tlet count = 0;\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tfor ( let i1 = 0; i1 <= 1; i1 ++ ) {\n\n\t\t\t\tfor ( let i2 = 0; i2 <= 1; i2 ++ ) {\n\n\t\t\t\t\tconst nextIndex = ( i + 1 ) % 3;\n\t\t\t\t\tconst nextIndex2 = ( i + 2 ) % 3;\n\n\t\t\t\t\t// get obb line segments\n\t\t\t\t\tconst index = i1 << nextIndex | i2 << nextIndex2;\n\t\t\t\t\tconst index2 = 1 << i | i1 << nextIndex | i2 << nextIndex2;\n\t\t\t\t\tconst p1 = points[ index ];\n\t\t\t\t\tconst p2 = points[ index2 ];\n\t\t\t\t\tconst line1 = segments1[ count ];\n\t\t\t\t\tline1.set( p1, p2 );\n\n\n\t\t\t\t\t// get aabb line segments\n\t\t\t\t\tconst f1 = xyzFields[ i ];\n\t\t\t\t\tconst f2 = xyzFields[ nextIndex ];\n\t\t\t\t\tconst f3 = xyzFields[ nextIndex2 ];\n\t\t\t\t\tconst line2 = segments2[ count ];\n\t\t\t\t\tconst start = line2.start;\n\t\t\t\t\tconst end = line2.end;\n\n\t\t\t\t\tstart[ f1 ] = min[ f1 ];\n\t\t\t\t\tstart[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\n\t\t\t\t\tstart[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\n\n\t\t\t\t\tend[ f1 ] = max[ f1 ];\n\t\t\t\t\tend[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\n\t\t\t\t\tend[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\n\n\t\t\t\t\tcount ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check all the other boxes point\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\n\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\t\t\tpoint2.x = x ? max.x : min.x;\n\t\t\t\t\tpoint2.y = y ? max.y : min.y;\n\t\t\t\t\tpoint2.z = z ? max.z : min.z;\n\n\t\t\t\t\tthis.closestPointToPoint( point2, point1 );\n\t\t\t\t\tconst dist = point2.distanceToSquared( point1 );\n\t\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 12; i ++ ) {\n\n\t\t\tconst l1 = segments1[ i ];\n\t\t\tfor ( let i2 = 0; i2 < 12; i2 ++ ) {\n\n\t\t\t\tconst l2 = segments2[ i2 ];\n\t\t\t\tclosestPointsSegmentToSegment( l1, l2, point1, point2 );\n\t\t\t\tconst dist = point1.distanceToSquared( point2 );\n\t\t\t\tif ( dist < closestDistanceSq ) {\n\n\t\t\t\t\tclosestDistanceSq = dist;\n\t\t\t\t\tif ( target1 ) target1.copy( point1 );\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\n\n\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.sqrt( closestDistanceSq );\n\n\t};\n\n} )();\n","import { ExtendedTriangle } from '../math/ExtendedTriangle.js';\nimport { PrimitivePool } from './PrimitivePool.js';\n\nclass ExtendedTrianglePoolBase extends PrimitivePool {\n\n\tconstructor() {\n\n\t\tsuper( () => new ExtendedTriangle() );\n\n\t}\n\n}\n\nexport const ExtendedTrianglePool = /* @__PURE__ */ new ExtendedTrianglePoolBase();\n","import { Vector3 } from 'three';\n\nconst temp = /* @__PURE__ */ new Vector3();\nconst temp1 = /* @__PURE__ */ new Vector3();\n\nexport function closestPointToPoint(\n\tbvh,\n\tpoint,\n\ttarget = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\t// early out if under minThreshold\n\t// skip checking if over maxThreshold\n\t// set minThreshold = maxThreshold to quickly check if a point is within a threshold\n\t// returns Infinity if no value found\n\tconst minThresholdSq = minThreshold * minThreshold;\n\tconst maxThresholdSq = maxThreshold * maxThreshold;\n\tlet closestDistanceSq = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tbvh.shapecast(\n\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\ttemp.copy( point ).clamp( box.min, box.max );\n\t\t\t\treturn temp.distanceToSquared( point );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\treturn score < closestDistanceSq && score < maxThresholdSq;\n\n\t\t\t},\n\n\t\t\tintersectsTriangle: ( tri, triIndex ) => {\n\n\t\t\t\ttri.closestPointToPoint( point, temp );\n\t\t\t\tconst distSq = point.distanceToSquared( temp );\n\t\t\t\tif ( distSq < closestDistanceSq ) {\n\n\t\t\t\t\ttemp1.copy( temp );\n\t\t\t\t\tclosestDistanceSq = distSq;\n\t\t\t\t\tclosestDistanceTriIndex = triIndex;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distSq < minThresholdSq ) {\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tif ( closestDistanceSq === Infinity ) return null;\n\n\tconst closestDistance = Math.sqrt( closestDistanceSq );\n\n\tif ( ! target.point ) target.point = temp1.clone();\n\telse target.point.copy( temp1 );\n\ttarget.distance = closestDistance,\n\ttarget.faceIndex = closestDistanceTriIndex;\n\n\treturn target;\n\n}\n","import { Vector3, Vector2, Triangle, DoubleSide, BackSide, REVISION } from 'three';\n\nconst IS_GT_REVISION_169 = parseInt( REVISION ) >= 169;\nconst IS_LT_REVISION_161 = parseInt( REVISION ) <= 161;\n\n// Ripped and modified From THREE.js Mesh raycast\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L115\nconst _vA = /* @__PURE__ */ new Vector3();\nconst _vB = /* @__PURE__ */ new Vector3();\nconst _vC = /* @__PURE__ */ new Vector3();\n\nconst _uvA = /* @__PURE__ */ new Vector2();\nconst _uvB = /* @__PURE__ */ new Vector2();\nconst _uvC = /* @__PURE__ */ new Vector2();\n\nconst _normalA = /* @__PURE__ */ new Vector3();\nconst _normalB = /* @__PURE__ */ new Vector3();\nconst _normalC = /* @__PURE__ */ new Vector3();\n\nconst _intersectionPoint = /* @__PURE__ */ new Vector3();\nfunction checkIntersection( ray, pA, pB, pC, point, side, near, far ) {\n\n\tlet intersect;\n\tif ( side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\tconst distance = ray.origin.distanceTo( point );\n\n\tif ( distance < near || distance > far ) return null;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\tpoint: point.clone(),\n\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst intersection = checkIntersection( ray, _vA, _vB, _vC, _intersectionPoint, side, near, far );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = new Vector2();\n\t\t\tconst res = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, intersection.uv );\n\t\t\tif ( ! IS_GT_REVISION_169 ) {\n\n\t\t\t\tintersection.uv = res;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv1, a );\n\t\t\t_uvB.fromBufferAttribute( uv1, b );\n\t\t\t_uvC.fromBufferAttribute( uv1, c );\n\n\t\t\tintersection.uv1 = new Vector2();\n\t\t\tconst res = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, intersection.uv1 );\n\t\t\tif ( ! IS_GT_REVISION_169 ) {\n\n\t\t\t\tintersection.uv1 = res;\n\n\t\t\t}\n\n\t\t\tif ( IS_LT_REVISION_161 ) {\n\n\t\t\t\tintersection.uv2 = intersection.uv1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\t_normalA.fromBufferAttribute( normal, a );\n\t\t\t_normalB.fromBufferAttribute( normal, b );\n\t\t\t_normalC.fromBufferAttribute( normal, c );\n\n\t\t\tintersection.normal = new Vector3();\n\t\t\tconst res = Triangle.getInterpolation( _intersectionPoint, _vA, _vB, _vC, _normalA, _normalB, _normalC, intersection.normal );\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t\tif ( ! IS_GT_REVISION_169 ) {\n\n\t\t\t\tintersection.normal = res;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.faceIndex = a;\n\n\t\tif ( IS_GT_REVISION_169 ) {\n\n\t\t\tconst barycoord = new Vector3();\n\t\t\tTriangle.getBarycoord( _intersectionPoint, _vA, _vB, _vC, barycoord );\n\n\t\t\tintersection.barycoord = barycoord;\n\n\t\t}\n\n\t}\n\n\treturn intersection;\n\n}\n\nfunction getSide( materialOrSide ) {\n\n\treturn materialOrSide && materialOrSide.isMaterial ? materialOrSide.side : materialOrSide;\n\n}\n\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L258\nexport function intersectTri( geometry, materialOrSide, ray, tri, intersections, near, far ) {\n\n\tconst triOffset = tri * 3;\n\tlet a = triOffset + 0;\n\tlet b = triOffset + 1;\n\tlet c = triOffset + 2;\n\n\tconst { index, groups } = geometry;\n\tif ( geometry.index ) {\n\n\t\ta = index.getX( a );\n\t\tb = index.getX( b );\n\t\tc = index.getX( c );\n\n\t}\n\n\tconst { position, normal, uv, uv1 } = geometry.attributes;\n\tif ( Array.isArray( materialOrSide ) ) {\n\n\t\t// check which groups a triangle is present in and run the intersections\n\t\t// TODO: we shouldn't need to run and intersection test multiple times\n\t\tconst firstIndex = tri * 3;\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst { start, count, materialIndex } = groups[ i ];\n\t\t\tif ( firstIndex >= start && firstIndex < start + count ) {\n\n\t\t\t\tconst side = getSide( materialOrSide[ materialIndex ] );\n\t\t\t\tconst intersection = checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far );\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tintersection.faceIndex = tri;\n\t\t\t\t\tintersection.face.materialIndex = materialIndex;\n\n\t\t\t\t\tif ( intersections ) {\n\n\t\t\t\t\t\tintersections.push( intersection );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn intersection;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// run the intersection for the single material\n\t\tconst side = getSide( materialOrSide );\n\t\tconst intersection = checkBufferGeometryIntersection( ray, position, normal, uv, uv1, a, b, c, side, near, far );\n\t\tif ( intersection ) {\n\n\t\t\tintersection.faceIndex = tri;\n\t\t\tintersection.face.materialIndex = 0;\n\n\t\t\tif ( intersections ) {\n\n\t\t\t\tintersections.push( intersection );\n\n\t\t\t} else {\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn null;\n\n}\n","\nimport { Vector2, Vector3, Triangle } from 'three';\n\n// sets the vertices of triangle `tri` with the 3 vertices after i\nexport function setTriangle( tri, i, index, pos ) {\n\n\tconst ta = tri.a;\n\tconst tb = tri.b;\n\tconst tc = tri.c;\n\n\tlet i0 = i;\n\tlet i1 = i + 1;\n\tlet i2 = i + 2;\n\tif ( index ) {\n\n\t\ti0 = index.getX( i0 );\n\t\ti1 = index.getX( i1 );\n\t\ti2 = index.getX( i2 );\n\n\t}\n\n\tta.x = pos.getX( i0 );\n\tta.y = pos.getY( i0 );\n\tta.z = pos.getZ( i0 );\n\n\ttb.x = pos.getX( i1 );\n\ttb.y = pos.getY( i1 );\n\ttb.z = pos.getZ( i1 );\n\n\ttc.x = pos.getX( i2 );\n\ttc.y = pos.getY( i2 );\n\ttc.z = pos.getZ( i2 );\n\n}\n\nconst tempV1 = /* @__PURE__ */ new Vector3();\nconst tempV2 = /* @__PURE__ */ new Vector3();\nconst tempV3 = /* @__PURE__ */ new Vector3();\nconst tempUV1 = /* @__PURE__ */ new Vector2();\nconst tempUV2 = /* @__PURE__ */ new Vector2();\nconst tempUV3 = /* @__PURE__ */ new Vector2();\n\nexport function getTriangleHitPointInfo( point, geometry, triangleIndex, target ) {\n\n\tconst indices = geometry.getIndex().array;\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst uvs = geometry.getAttribute( 'uv' );\n\n\tconst a = indices[ triangleIndex * 3 ];\n\tconst b = indices[ triangleIndex * 3 + 1 ];\n\tconst c = indices[ triangleIndex * 3 + 2 ];\n\n\ttempV1.fromBufferAttribute( positions, a );\n\ttempV2.fromBufferAttribute( positions, b );\n\ttempV3.fromBufferAttribute( positions, c );\n\n\t// find the associated material index\n\tlet materialIndex = 0;\n\tconst groups = geometry.groups;\n\tconst firstVertexIndex = triangleIndex * 3;\n\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\t\tconst { start, count } = group;\n\t\tif ( firstVertexIndex >= start && firstVertexIndex < start + count ) {\n\n\t\t\tmaterialIndex = group.materialIndex;\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t// extract barycoord\n\tconst barycoord = target && target.barycoord ? target.barycoord : new Vector3();\n\tTriangle.getBarycoord( point, tempV1, tempV2, tempV3, barycoord );\n\n\t// extract uvs\n\tlet uv = null;\n\tif ( uvs ) {\n\n\t\ttempUV1.fromBufferAttribute( uvs, a );\n\t\ttempUV2.fromBufferAttribute( uvs, b );\n\t\ttempUV3.fromBufferAttribute( uvs, c );\n\n\t\tif ( target && target.uv ) uv = target.uv;\n\t\telse uv = new Vector2();\n\n\t\tTriangle.getInterpolation( point, tempV1, tempV2, tempV3, tempUV1, tempUV2, tempUV3, uv );\n\n\t}\n\n\t// adjust the provided target or create a new one\n\tif ( target ) {\n\n\t\tif ( ! target.face ) target.face = { };\n\t\ttarget.face.a = a;\n\t\ttarget.face.b = b;\n\t\ttarget.face.c = c;\n\t\ttarget.face.materialIndex = materialIndex;\n\t\tif ( ! target.face.normal ) target.face.normal = new Vector3();\n\t\tTriangle.getNormal( tempV1, tempV2, tempV3, target.face.normal );\n\n\t\tif ( uv ) target.uv = uv;\n\t\ttarget.barycoord = barycoord;\n\n\t\treturn target;\n\n\t} else {\n\n\t\treturn {\n\t\t\tface: {\n\t\t\t\ta: a,\n\t\t\t\tb: b,\n\t\t\t\tc: c,\n\t\t\t\tmaterialIndex: materialIndex,\n\t\t\t\tnormal: Triangle.getNormal( tempV1, tempV2, tempV3, new Vector3() )\n\t\t\t},\n\t\t\tuv: uv,\n\t\t\tbarycoord: barycoord,\n\t\t};\n\n\t}\n\n}\n","import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\n\n/*************************************************************/\n/* This file is generated from \"iterationUtils.template.js\". */\n/*************************************************************/\n\nfunction intersectTris( bvh, materialOrSide, ray, offset, count, intersections, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\n\t\tintersectTri( geometry, materialOrSide, ray, i, intersections, near, far );\n\n\n\t}\n\n}\n\nfunction intersectClosestTri( bvh, materialOrSide, ray, offset, count, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tlet dist = Infinity;\n\tlet res = null;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet intersection;\n\n\t\tintersection = intersectTri( geometry, materialOrSide, ray, i, null, near, far );\n\n\n\t\tif ( intersection && intersection.distance < dist ) {\n\n\t\t\tres = intersection;\n\t\t\tdist = intersection.distance;\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\nfunction iterateOverTriangles(\n\toffset,\n\tcount,\n\tbvh,\n\tintersectsTriangleFunc,\n\tcontained,\n\tdepth,\n\ttriangle\n) {\n\n\tconst { geometry } = bvh;\n\tconst { index } = geometry;\n\tconst pos = geometry.attributes.position;\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\tlet tri;\n\n\t\ttri = i;\n\n\t\tsetTriangle( triangle, tri * 3, index, pos );\n\t\ttriangle.needsUpdate = true;\n\n\t\tif ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport { intersectClosestTri, intersectTris, iterateOverTriangles };\n","import { UINT32_PER_NODE, BYTES_PER_NODE } from '../Constants.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\n\n/****************************************************/\n/* This file is generated from \"refit.template.js\". */\n/****************************************************/\n\nfunction refit( bvh, nodeIndices = null ) {\n\n\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\tnodeIndices = new Set( nodeIndices );\n\n\t}\n\n\tconst geometry = bvh.geometry;\n\tconst indexArr = geometry.index ? geometry.index.array : null;\n\tconst posAttr = geometry.attributes.position;\n\n\tlet buffer, uint32Array, uint16Array, float32Array;\n\tlet byteOffset = 0;\n\tconst roots = bvh._roots;\n\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\tbuffer = roots[ i ];\n\t\tuint32Array = new Uint32Array( buffer );\n\t\tuint16Array = new Uint16Array( buffer );\n\t\tfloat32Array = new Float32Array( buffer );\n\n\t\t_traverse( 0, byteOffset );\n\t\tbyteOffset += buffer.byteLength;\n\n\t}\n\n\tfunction _traverse( nodeIndex32, byteOffset, force = false ) {\n\n\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\tif ( IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t\tlet minx = Infinity;\n\t\t\tlet miny = Infinity;\n\t\t\tlet minz = Infinity;\n\t\t\tlet maxx = - Infinity;\n\t\t\tlet maxy = - Infinity;\n\t\t\tlet maxz = - Infinity;\n\n\n\t\t\tfor ( let i = 3 * offset, l = 3 * ( offset + count ); i < l; i ++ ) {\n\n\t\t\t\tlet index = indexArr[ i ];\n\t\t\t\tconst x = posAttr.getX( index );\n\t\t\t\tconst y = posAttr.getY( index );\n\t\t\t\tconst z = posAttr.getZ( index );\n\n\t\t\t\tif ( x < minx ) minx = x;\n\t\t\t\tif ( x > maxx ) maxx = x;\n\n\t\t\t\tif ( y < miny ) miny = y;\n\t\t\t\tif ( y > maxy ) maxy = y;\n\n\t\t\t\tif ( z < minz ) minz = z;\n\t\t\t\tif ( z > maxz ) maxz = z;\n\n\t\t\t}\n\n\n\t\t\tif (\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] !== minx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] !== miny ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] !== minz ||\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] !== maxx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] !== maxy ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] !== maxz\n\t\t\t) {\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] = minx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] = miny;\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] = minz;\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] = maxx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] = maxy;\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] = maxz;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\n\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\n\t\t\tlet forceChildren = force;\n\t\t\tlet includesLeft = false;\n\t\t\tlet includesRight = false;\n\n\t\t\tif ( nodeIndices ) {\n\n\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\n\t\t\t\t// then we assume that all children need to be updated.\n\t\t\t\tif ( ! forceChildren ) {\n\n\t\t\t\t\tconst leftNodeId = left / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tconst rightNodeId = right / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tincludesLeft = nodeIndices.has( leftNodeId );\n\t\t\t\t\tincludesRight = nodeIndices.has( rightNodeId );\n\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tincludesLeft = true;\n\t\t\t\tincludesRight = true;\n\n\t\t\t}\n\n\t\t\tconst traverseLeft = forceChildren || includesLeft;\n\t\t\tconst traverseRight = forceChildren || includesRight;\n\n\t\t\tlet leftChange = false;\n\t\t\tif ( traverseLeft ) {\n\n\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tlet rightChange = false;\n\t\t\tif ( traverseRight ) {\n\n\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tconst didChange = leftChange || rightChange;\n\t\t\tif ( didChange ) {\n\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\tconst left_i = left + i;\n\t\t\t\t\tconst right_i = right + i;\n\t\t\t\t\tconst minLeftValue = float32Array[ left_i ];\n\t\t\t\t\tconst maxLeftValue = float32Array[ left_i + 3 ];\n\t\t\t\t\tconst minRightValue = float32Array[ right_i ];\n\t\t\t\t\tconst maxRightValue = float32Array[ right_i + 3 ];\n\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn didChange;\n\n\t\t}\n\n\t}\n\n}\n\nexport { refit };\n","/**\n * This function performs intersection tests similar to Ray.intersectBox in three.js,\n * with the difference that the box values are read from an array to improve performance.\n */\nexport function intersectRay( nodeIndex32, array, ray, near, far ) {\n\n\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\tconst invdirx = 1 / ray.direction.x,\n\t\tinvdiry = 1 / ray.direction.y,\n\t\tinvdirz = 1 / ray.direction.z;\n\n\tconst ox = ray.origin.x;\n\tconst oy = ray.origin.y;\n\tconst oz = ray.origin.z;\n\n\tlet minx = array[ nodeIndex32 ];\n\tlet maxx = array[ nodeIndex32 + 3 ];\n\n\tlet miny = array[ nodeIndex32 + 1 ];\n\tlet maxy = array[ nodeIndex32 + 3 + 1 ];\n\n\tlet minz = array[ nodeIndex32 + 2 ];\n\tlet maxz = array[ nodeIndex32 + 3 + 2 ];\n\n\tif ( invdirx >= 0 ) {\n\n\t\ttmin = ( minx - ox ) * invdirx;\n\t\ttmax = ( maxx - ox ) * invdirx;\n\n\t} else {\n\n\t\ttmin = ( maxx - ox ) * invdirx;\n\t\ttmax = ( minx - ox ) * invdirx;\n\n\t}\n\n\tif ( invdiry >= 0 ) {\n\n\t\ttymin = ( miny - oy ) * invdiry;\n\t\ttymax = ( maxy - oy ) * invdiry;\n\n\t} else {\n\n\t\ttymin = ( maxy - oy ) * invdiry;\n\t\ttymax = ( miny - oy ) * invdiry;\n\n\t}\n\n\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return false;\n\n\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\tif ( invdirz >= 0 ) {\n\n\t\ttzmin = ( minz - oz ) * invdirz;\n\t\ttzmax = ( maxz - oz ) * invdirz;\n\n\t} else {\n\n\t\ttzmin = ( maxz - oz ) * invdirz;\n\t\ttzmax = ( minz - oz ) * invdirz;\n\n\t}\n\n\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return false;\n\n\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t//return point closest to the ray (positive side)\n\n\treturn tmin <= far && tmax >= near;\n\n}\n","import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\n\n/*************************************************************/\n/* This file is generated from \"iterationUtils.template.js\". */\n/*************************************************************/\n\nfunction intersectTris_indirect( bvh, materialOrSide, ray, offset, count, intersections, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet vi = _indirectBuffer ? _indirectBuffer[ i ] : i;\n\t\tintersectTri( geometry, materialOrSide, ray, vi, intersections, near, far );\n\n\n\t}\n\n}\n\nfunction intersectClosestTri_indirect( bvh, materialOrSide, ray, offset, count, near, far ) {\n\n\tconst { geometry, _indirectBuffer } = bvh;\n\tlet dist = Infinity;\n\tlet res = null;\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\n\n\t\tlet intersection;\n\t\tintersection = intersectTri( geometry, materialOrSide, ray, _indirectBuffer ? _indirectBuffer[ i ] : i, null, near, far );\n\n\n\t\tif ( intersection && intersection.distance < dist ) {\n\n\t\t\tres = intersection;\n\t\t\tdist = intersection.distance;\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\nfunction iterateOverTriangles_indirect(\n\toffset,\n\tcount,\n\tbvh,\n\tintersectsTriangleFunc,\n\tcontained,\n\tdepth,\n\ttriangle\n) {\n\n\tconst { geometry } = bvh;\n\tconst { index } = geometry;\n\tconst pos = geometry.attributes.position;\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\tlet tri;\n\t\ttri = bvh.resolveTriangleIndex( i );\n\n\t\tsetTriangle( triangle, tri * 3, index, pos );\n\t\ttriangle.needsUpdate = true;\n\n\t\tif ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport { intersectClosestTri_indirect, intersectTris_indirect, iterateOverTriangles_indirect };\n","import { intersectRay } from '../utils/intersectUtils.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectTris } from '../utils/iterationUtils.generated.js';\nimport '../utils/iterationUtils_indirect.generated.js';\n\n/******************************************************/\n/* This file is generated from \"raycast.template.js\". */\n/******************************************************/\n\nfunction raycast( bvh, root, materialOrSide, ray, intersects, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\t_raycast( 0, bvh, materialOrSide, ray, intersects, near, far );\n\tBufferStack.clearBuffer();\n\n}\n\nfunction _raycast( nodeIndex32, bvh, materialOrSide, ray, intersects, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tconst nodeIndex16 = nodeIndex32 * 2;\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\n\t\tintersectTris( bvh, materialOrSide, ray, offset, count, intersects, near, far );\n\n\n\t} else {\n\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\n\t\tif ( intersectRay( leftIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( leftIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tif ( intersectRay( rightIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( rightIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycast };\n","import { IS_LEAF, OFFSET, COUNT, SPLIT_AXIS, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectRay } from '../utils/intersectUtils.js';\nimport { intersectClosestTri } from '../utils/iterationUtils.generated.js';\nimport '../utils/iterationUtils_indirect.generated.js';\n\n/***********************************************************/\n/* This file is generated from \"raycastFirst.template.js\". */\n/***********************************************************/\n\nconst _xyzFields = [ 'x', 'y', 'z' ];\n\nfunction raycastFirst( bvh, root, materialOrSide, ray, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _raycastFirst( 0, bvh, materialOrSide, ray, near, far );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _raycastFirst( nodeIndex32, bvh, materialOrSide, ray, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\n\t\t// eslint-disable-next-line no-unreachable\n\t\treturn intersectClosestTri( bvh, materialOrSide, ray, offset, count, near, far );\n\n\n\t} else {\n\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\t\tconst xyzAxis = _xyzFields[ splitAxis ];\n\t\tconst rayDir = ray.direction[ xyzAxis ];\n\t\tconst leftToRight = rayDir >= 0;\n\n\t\t// c1 is the child to check first\n\t\tlet c1, c2;\n\t\tif ( leftToRight ) {\n\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t} else {\n\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\n\n\t\t}\n\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, near, far );\n\t\tconst c1Result = c1Intersection ? _raycastFirst( c1, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\n\t\tif ( c1Result ) {\n\n\t\t\t// check if the point is within the second bounds\n\t\t\t// \"point\" is in the local frame of the bvh\n\t\t\tconst point = c1Result.point[ xyzAxis ];\n\t\t\tconst isOutside = leftToRight ?\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\n\n\t\t\tif ( isOutside ) {\n\n\t\t\t\treturn c1Result;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// either there was no intersection in the first node, or there could still be a closer\n\t\t// intersection in the second, so check the second node and then take the better of the two\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, near, far );\n\t\tconst c2Result = c2Intersection ? _raycastFirst( c2, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\tif ( c1Result && c2Result ) {\n\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\n\n\t\t} else {\n\n\t\t\treturn c1Result || c2Result || null;\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycastFirst };\n","import { Box3, Matrix4 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { ExtendedTriangle } from '../../math/ExtendedTriangle.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, OFFSET, COUNT, BOUNDING_DATA_INDEX, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { getTriCount } from '../build/geometryUtils.js';\n\n/*****************************************************************/\n/* This file is generated from \"intersectsGeometry.template.js\". */\n/*****************************************************************/\n/* eslint-disable indent */\n\nconst boundingBox = /* @__PURE__ */ new Box3();\nconst triangle = /* @__PURE__ */ new ExtendedTriangle();\nconst triangle2 = /* @__PURE__ */ new ExtendedTriangle();\nconst invertedMat = /* @__PURE__ */ new Matrix4();\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\n\nfunction intersectsGeometry( bvh, root, otherGeometry, geometryToBvh ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _intersectsGeometry( 0, bvh, otherGeometry, geometryToBvh );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _intersectsGeometry( nodeIndex32, bvh, otherGeometry, geometryToBvh, cachedObb = null ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tif ( cachedObb === null ) {\n\n\t\tif ( ! otherGeometry.boundingBox ) {\n\n\t\t\totherGeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\t\tcachedObb = obb;\n\n\t}\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst thisGeometry = bvh.geometry;\n\t\tconst thisIndex = thisGeometry.index;\n\t\tconst thisPos = thisGeometry.attributes.position;\n\n\t\tconst otherIndex = otherGeometry.index;\n\t\tconst otherPos = otherGeometry.attributes.position;\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\n\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\n\t\t// here.\n\t\tinvertedMat.copy( geometryToBvh ).invert();\n\n\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t// if there's a bounds tree\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\n\t\t\tobb2.matrix.copy( invertedMat );\n\t\t\tobb2.needsUpdate = true;\n\n\t\t\t// TODO: use a triangle iteration function here\n\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\n\n\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\n\n\t\t\t\tintersectsTriangle: tri => {\n\n\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.needsUpdate = true;\n\n\n\t\t\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\n\n\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\t\t\tsetTriangle( triangle2, i, thisIndex, thisPos );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\t// if we're just dealing with raw geometry\n\t\t\tconst otherTriangleCount = getTriCount( otherGeometry );\n\n\n\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\n\n\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\tsetTriangle( triangle, i, thisIndex, thisPos );\n\n\n\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\tfor ( let i2 = 0, l2 = otherTriangleCount * 3; i2 < l2; i2 += 3 ) {\n\n\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\n\t\tconst leftIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( left, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( leftIntersection ) return true;\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\n\t\tconst rightIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( right, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( rightIntersection ) return true;\n\n\t\treturn false;\n\n\t}\n\n}\n\nexport { intersectsGeometry };\n","import { Matrix4, Vector3 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { getTriCount } from '../build/geometryUtils.js';\nimport { ExtendedTrianglePool } from '../../utils/ExtendedTrianglePool.js';\n\n/*********************************************************************/\n/* This file is generated from \"closestPointToGeometry.template.js\". */\n/*********************************************************************/\n\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\nconst temp1 = /* @__PURE__ */ new Vector3();\nconst temp2 = /* @__PURE__ */ new Vector3();\nconst temp3 = /* @__PURE__ */ new Vector3();\nconst temp4 = /* @__PURE__ */ new Vector3();\n\nfunction closestPointToGeometry(\n\tbvh,\n\totherGeometry,\n\tgeometryToBvh,\n\ttarget1 = { },\n\ttarget2 = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\tif ( ! otherGeometry.boundingBox ) {\n\n\t\totherGeometry.computeBoundingBox();\n\n\t}\n\n\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\tobb.needsUpdate = true;\n\n\tconst geometry = bvh.geometry;\n\tconst pos = geometry.attributes.position;\n\tconst index = geometry.index;\n\tconst otherPos = otherGeometry.attributes.position;\n\tconst otherIndex = otherGeometry.index;\n\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\n\tlet tempTarget1 = temp1;\n\tlet tempTargetDest1 = temp2;\n\tlet tempTarget2 = null;\n\tlet tempTargetDest2 = null;\n\n\tif ( target2 ) {\n\n\t\ttempTarget2 = temp3;\n\t\ttempTargetDest2 = temp4;\n\n\t}\n\n\tlet closestDistance = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tlet closestDistanceOtherTriIndex = null;\n\ttempMatrix.copy( geometryToBvh ).invert();\n\tobb2.matrix.copy( tempMatrix );\n\tbvh.shapecast(\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\treturn obb.distanceToBox( box );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\n\n\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\n\t\t\t\t\t// save the bounds to use during triangle checks.\n\t\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t\tobb2.min.copy( box.min );\n\t\t\t\t\t\tobb2.max.copy( box.max );\n\t\t\t\t\t\tobb2.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\tintersectsRange: ( offset, count ) => {\n\n\t\t\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\n\t\t\t\t\t// the closest bounds in the other geometry to check.\n\t\t\t\t\tconst otherBvh = otherGeometry.boundsTree;\n\t\t\t\t\treturn otherBvh.shapecast( {\n\t\t\t\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\n\n\t\t\t\t\t\t\tfor ( let i2 = otherOffset, l2 = otherOffset + otherCount; i2 < l2; i2 ++ ) {\n\n\n\t\t\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\n\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle, 3 * i, index, pos );\n\n\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\n\t\t\t\t\tconst triCount = getTriCount( otherGeometry );\n\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\n\t\t\t\t\t\t\tsetTriangle( triangle, 3 * i, index, pos );\n\n\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tExtendedTrianglePool.releasePrimitive( triangle );\n\tExtendedTrianglePool.releasePrimitive( triangle2 );\n\n\tif ( closestDistance === Infinity ) {\n\n\t\treturn null;\n\n\t}\n\n\tif ( ! target1.point ) {\n\n\t\ttarget1.point = tempTargetDest1.clone();\n\n\t} else {\n\n\t\ttarget1.point.copy( tempTargetDest1 );\n\n\t}\n\n\ttarget1.distance = closestDistance,\n\ttarget1.faceIndex = closestDistanceTriIndex;\n\n\tif ( target2 ) {\n\n\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\n\t\telse target2.point.copy( tempTargetDest2 );\n\t\ttarget2.point.applyMatrix4( tempMatrix );\n\t\ttempTargetDest1.applyMatrix4( tempMatrix );\n\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\n\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\n\n\t}\n\n\treturn target1;\n\n}\n\nexport { closestPointToGeometry };\n","import { UINT32_PER_NODE, BYTES_PER_NODE } from '../Constants.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\n\n/****************************************************/\n/* This file is generated from \"refit.template.js\". */\n/****************************************************/\n\nfunction refit_indirect( bvh, nodeIndices = null ) {\n\n\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\n\n\t\tnodeIndices = new Set( nodeIndices );\n\n\t}\n\n\tconst geometry = bvh.geometry;\n\tconst indexArr = geometry.index ? geometry.index.array : null;\n\tconst posAttr = geometry.attributes.position;\n\n\tlet buffer, uint32Array, uint16Array, float32Array;\n\tlet byteOffset = 0;\n\tconst roots = bvh._roots;\n\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\tbuffer = roots[ i ];\n\t\tuint32Array = new Uint32Array( buffer );\n\t\tuint16Array = new Uint16Array( buffer );\n\t\tfloat32Array = new Float32Array( buffer );\n\n\t\t_traverse( 0, byteOffset );\n\t\tbyteOffset += buffer.byteLength;\n\n\t}\n\n\tfunction _traverse( nodeIndex32, byteOffset, force = false ) {\n\n\t\tconst nodeIndex16 = nodeIndex32 * 2;\n\t\tif ( IS_LEAF( nodeIndex16, uint16Array ) ) {\n\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t\tlet minx = Infinity;\n\t\t\tlet miny = Infinity;\n\t\t\tlet minz = Infinity;\n\t\t\tlet maxx = - Infinity;\n\t\t\tlet maxy = - Infinity;\n\t\t\tlet maxz = - Infinity;\n\n\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\tconst t = 3 * bvh.resolveTriangleIndex( i );\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tlet index = t + j;\n\t\t\t\t\tindex = indexArr ? indexArr[ index ] : index;\n\n\t\t\t\t\tconst x = posAttr.getX( index );\n\t\t\t\t\tconst y = posAttr.getY( index );\n\t\t\t\t\tconst z = posAttr.getZ( index );\n\n\t\t\t\t\tif ( x < minx ) minx = x;\n\t\t\t\t\tif ( x > maxx ) maxx = x;\n\n\t\t\t\t\tif ( y < miny ) miny = y;\n\t\t\t\t\tif ( y > maxy ) maxy = y;\n\n\t\t\t\t\tif ( z < minz ) minz = z;\n\t\t\t\t\tif ( z > maxz ) maxz = z;\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tif (\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] !== minx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] !== miny ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] !== minz ||\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] !== maxx ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] !== maxy ||\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] !== maxz\n\t\t\t) {\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 0 ] = minx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 1 ] = miny;\n\t\t\t\tfloat32Array[ nodeIndex32 + 2 ] = minz;\n\n\t\t\t\tfloat32Array[ nodeIndex32 + 3 ] = maxx;\n\t\t\t\tfloat32Array[ nodeIndex32 + 4 ] = maxy;\n\t\t\t\tfloat32Array[ nodeIndex32 + 5 ] = maxz;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\n\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\n\t\t\tlet forceChildren = force;\n\t\t\tlet includesLeft = false;\n\t\t\tlet includesRight = false;\n\n\t\t\tif ( nodeIndices ) {\n\n\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\n\t\t\t\t// then we assume that all children need to be updated.\n\t\t\t\tif ( ! forceChildren ) {\n\n\t\t\t\t\tconst leftNodeId = left / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tconst rightNodeId = right / UINT32_PER_NODE + byteOffset / BYTES_PER_NODE;\n\t\t\t\t\tincludesLeft = nodeIndices.has( leftNodeId );\n\t\t\t\t\tincludesRight = nodeIndices.has( rightNodeId );\n\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tincludesLeft = true;\n\t\t\t\tincludesRight = true;\n\n\t\t\t}\n\n\t\t\tconst traverseLeft = forceChildren || includesLeft;\n\t\t\tconst traverseRight = forceChildren || includesRight;\n\n\t\t\tlet leftChange = false;\n\t\t\tif ( traverseLeft ) {\n\n\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tlet rightChange = false;\n\t\t\tif ( traverseRight ) {\n\n\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\n\n\t\t\t}\n\n\t\t\tconst didChange = leftChange || rightChange;\n\t\t\tif ( didChange ) {\n\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\tconst left_i = left + i;\n\t\t\t\t\tconst right_i = right + i;\n\t\t\t\t\tconst minLeftValue = float32Array[ left_i ];\n\t\t\t\t\tconst maxLeftValue = float32Array[ left_i + 3 ];\n\t\t\t\t\tconst minRightValue = float32Array[ right_i ];\n\t\t\t\t\tconst maxRightValue = float32Array[ right_i + 3 ];\n\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\n\t\t\t\t\tfloat32Array[ nodeIndex32 + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn didChange;\n\n\t\t}\n\n\t}\n\n}\n\nexport { refit_indirect };\n","import { intersectRay } from '../utils/intersectUtils.js';\nimport { IS_LEAF, OFFSET, COUNT, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport '../utils/iterationUtils.generated.js';\nimport { intersectTris_indirect } from '../utils/iterationUtils_indirect.generated.js';\n\n/******************************************************/\n/* This file is generated from \"raycast.template.js\". */\n/******************************************************/\n\nfunction raycast_indirect( bvh, root, materialOrSide, ray, intersects, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\t_raycast( 0, bvh, materialOrSide, ray, intersects, near, far );\n\tBufferStack.clearBuffer();\n\n}\n\nfunction _raycast( nodeIndex32, bvh, materialOrSide, ray, intersects, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tconst nodeIndex16 = nodeIndex32 * 2;\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\tintersectTris_indirect( bvh, materialOrSide, ray, offset, count, intersects, near, far );\n\n\n\t} else {\n\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\n\t\tif ( intersectRay( leftIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( leftIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\tif ( intersectRay( rightIndex, float32Array, ray, near, far ) ) {\n\n\t\t\t_raycast( rightIndex, bvh, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycast_indirect };\n","import { IS_LEAF, OFFSET, COUNT, SPLIT_AXIS, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { intersectRay } from '../utils/intersectUtils.js';\nimport '../utils/iterationUtils.generated.js';\nimport { intersectClosestTri_indirect } from '../utils/iterationUtils_indirect.generated.js';\n\n/***********************************************************/\n/* This file is generated from \"raycastFirst.template.js\". */\n/***********************************************************/\n\nconst _xyzFields = [ 'x', 'y', 'z' ];\n\nfunction raycastFirst_indirect( bvh, root, materialOrSide, ray, near, far ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _raycastFirst( 0, bvh, materialOrSide, ray, near, far );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _raycastFirst( nodeIndex32, bvh, materialOrSide, ray, near, far ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\treturn intersectClosestTri_indirect( bvh, materialOrSide, ray, offset, count, near, far );\n\n\n\t} else {\n\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\n\t\tconst xyzAxis = _xyzFields[ splitAxis ];\n\t\tconst rayDir = ray.direction[ xyzAxis ];\n\t\tconst leftToRight = rayDir >= 0;\n\n\t\t// c1 is the child to check first\n\t\tlet c1, c2;\n\t\tif ( leftToRight ) {\n\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\t} else {\n\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\n\n\t\t}\n\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, near, far );\n\t\tconst c1Result = c1Intersection ? _raycastFirst( c1, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\n\t\tif ( c1Result ) {\n\n\t\t\t// check if the point is within the second bounds\n\t\t\t// \"point\" is in the local frame of the bvh\n\t\t\tconst point = c1Result.point[ xyzAxis ];\n\t\t\tconst isOutside = leftToRight ?\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\n\n\t\t\tif ( isOutside ) {\n\n\t\t\t\treturn c1Result;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// either there was no intersection in the first node, or there could still be a closer\n\t\t// intersection in the second, so check the second node and then take the better of the two\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, near, far );\n\t\tconst c2Result = c2Intersection ? _raycastFirst( c2, bvh, materialOrSide, ray, near, far ) : null;\n\n\t\tif ( c1Result && c2Result ) {\n\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\n\n\t\t} else {\n\n\t\t\treturn c1Result || c2Result || null;\n\n\t\t}\n\n\t}\n\n}\n\nexport { raycastFirst_indirect };\n","import { Box3, Matrix4 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { ExtendedTriangle } from '../../math/ExtendedTriangle.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { IS_LEAF, OFFSET, COUNT, BOUNDING_DATA_INDEX, LEFT_NODE, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { getTriCount } from '../build/geometryUtils.js';\n\n/*****************************************************************/\n/* This file is generated from \"intersectsGeometry.template.js\". */\n/*****************************************************************/\n/* eslint-disable indent */\n\nconst boundingBox = /* @__PURE__ */ new Box3();\nconst triangle = /* @__PURE__ */ new ExtendedTriangle();\nconst triangle2 = /* @__PURE__ */ new ExtendedTriangle();\nconst invertedMat = /* @__PURE__ */ new Matrix4();\n\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\n\nfunction intersectsGeometry_indirect( bvh, root, otherGeometry, geometryToBvh ) {\n\n\tBufferStack.setBuffer( bvh._roots[ root ] );\n\tconst result = _intersectsGeometry( 0, bvh, otherGeometry, geometryToBvh );\n\tBufferStack.clearBuffer();\n\n\treturn result;\n\n}\n\nfunction _intersectsGeometry( nodeIndex32, bvh, otherGeometry, geometryToBvh, cachedObb = null ) {\n\n\tconst { float32Array, uint16Array, uint32Array } = BufferStack;\n\tlet nodeIndex16 = nodeIndex32 * 2;\n\n\tif ( cachedObb === null ) {\n\n\t\tif ( ! otherGeometry.boundingBox ) {\n\n\t\t\totherGeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\t\tcachedObb = obb;\n\n\t}\n\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\n\tif ( isLeaf ) {\n\n\t\tconst thisGeometry = bvh.geometry;\n\t\tconst thisIndex = thisGeometry.index;\n\t\tconst thisPos = thisGeometry.attributes.position;\n\n\t\tconst otherIndex = otherGeometry.index;\n\t\tconst otherPos = otherGeometry.attributes.position;\n\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\n\n\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\n\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\n\t\t// here.\n\t\tinvertedMat.copy( geometryToBvh ).invert();\n\n\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t// if there's a bounds tree\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\n\t\t\tobb2.matrix.copy( invertedMat );\n\t\t\tobb2.needsUpdate = true;\n\n\t\t\t// TODO: use a triangle iteration function here\n\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\n\n\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\n\n\t\t\t\tintersectsTriangle: tri => {\n\n\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\ttri.needsUpdate = true;\n\n\t\t\t\t\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * bvh.resolveTriangleIndex( i ), thisIndex, thisPos );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\t// if we're just dealing with raw geometry\n\t\t\tconst otherTriangleCount = getTriCount( otherGeometry );\n\n\t\t\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\n\n\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\n\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\tsetTriangle( triangle, 3 * ti, thisIndex, thisPos );\n\n\n\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\n\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\tfor ( let i2 = 0, l2 = otherTriangleCount * 3; i2 < l2; i2 += 3 ) {\n\n\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\n\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t} else {\n\n\t\tconst left = LEFT_NODE( nodeIndex32 );\n\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\n\t\tconst leftIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( left, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( leftIntersection ) return true;\n\n\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\n\t\tconst rightIntersection =\n\t\t\tcachedObb.intersectsBox( boundingBox ) &&\n\t\t\t_intersectsGeometry( right, bvh, otherGeometry, geometryToBvh, cachedObb );\n\n\t\tif ( rightIntersection ) return true;\n\n\t\treturn false;\n\n\t}\n\n}\n\nexport { intersectsGeometry_indirect };\n","import { Matrix4, Vector3 } from 'three';\nimport { OrientedBox } from '../../math/OrientedBox.js';\nimport { setTriangle } from '../../utils/TriangleUtilities.js';\nimport { getTriCount } from '../build/geometryUtils.js';\nimport { ExtendedTrianglePool } from '../../utils/ExtendedTrianglePool.js';\n\n/*********************************************************************/\n/* This file is generated from \"closestPointToGeometry.template.js\". */\n/*********************************************************************/\n\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\nconst obb = /* @__PURE__ */ new OrientedBox();\nconst obb2 = /* @__PURE__ */ new OrientedBox();\nconst temp1 = /* @__PURE__ */ new Vector3();\nconst temp2 = /* @__PURE__ */ new Vector3();\nconst temp3 = /* @__PURE__ */ new Vector3();\nconst temp4 = /* @__PURE__ */ new Vector3();\n\nfunction closestPointToGeometry_indirect(\n\tbvh,\n\totherGeometry,\n\tgeometryToBvh,\n\ttarget1 = { },\n\ttarget2 = { },\n\tminThreshold = 0,\n\tmaxThreshold = Infinity,\n) {\n\n\tif ( ! otherGeometry.boundingBox ) {\n\n\t\totherGeometry.computeBoundingBox();\n\n\t}\n\n\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\n\tobb.needsUpdate = true;\n\n\tconst geometry = bvh.geometry;\n\tconst pos = geometry.attributes.position;\n\tconst index = geometry.index;\n\tconst otherPos = otherGeometry.attributes.position;\n\tconst otherIndex = otherGeometry.index;\n\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\n\tlet tempTarget1 = temp1;\n\tlet tempTargetDest1 = temp2;\n\tlet tempTarget2 = null;\n\tlet tempTargetDest2 = null;\n\n\tif ( target2 ) {\n\n\t\ttempTarget2 = temp3;\n\t\ttempTargetDest2 = temp4;\n\n\t}\n\n\tlet closestDistance = Infinity;\n\tlet closestDistanceTriIndex = null;\n\tlet closestDistanceOtherTriIndex = null;\n\ttempMatrix.copy( geometryToBvh ).invert();\n\tobb2.matrix.copy( tempMatrix );\n\tbvh.shapecast(\n\t\t{\n\n\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\treturn obb.distanceToBox( box );\n\n\t\t\t},\n\n\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\n\n\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\n\t\t\t\t\t// save the bounds to use during triangle checks.\n\t\t\t\t\tif ( isLeaf ) {\n\n\t\t\t\t\t\tobb2.min.copy( box.min );\n\t\t\t\t\t\tobb2.max.copy( box.max );\n\t\t\t\t\t\tobb2.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\tintersectsRange: ( offset, count ) => {\n\n\t\t\t\tif ( otherGeometry.boundsTree ) {\n\n\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\n\t\t\t\t\t// the closest bounds in the other geometry to check.\n\t\t\t\t\tconst otherBvh = otherGeometry.boundsTree;\n\t\t\t\t\treturn otherBvh.shapecast( {\n\t\t\t\t\t\tboundsTraverseOrder: box => {\n\n\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\n\n\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\n\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\n\n\t\t\t\t\t\t\tfor ( let i2 = otherOffset, l2 = otherOffset + otherCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\t\t\tconst ti2 = otherBvh.resolveTriangleIndex( i2 );\n\t\t\t\t\t\t\t\tsetTriangle( triangle2, 3 * ti2, otherIndex, otherPos );\n\n\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle, 3 * ti, index, pos );\n\n\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\n\t\t\t\t\tconst triCount = getTriCount( otherGeometry );\n\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\t\tsetTriangle( triangle2, 3 * i2, otherIndex, otherPos );\n\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst ti = bvh.resolveTriangleIndex( i );\n\t\t\t\t\t\t\tsetTriangle( triangle, 3 * ti, index, pos );\n\n\t\t\t\t\t\t\ttriangle.needsUpdate = true;\n\n\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\n\t\t\t\t\t\t\tif ( dist < closestDistance ) {\n\n\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\n\n\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\n\n\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tclosestDistance = dist;\n\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i;\n\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\n\t\t\t\t\t\t\tif ( dist < minThreshold ) {\n\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}\n\n\t);\n\n\tExtendedTrianglePool.releasePrimitive( triangle );\n\tExtendedTrianglePool.releasePrimitive( triangle2 );\n\n\tif ( closestDistance === Infinity ) {\n\n\t\treturn null;\n\n\t}\n\n\tif ( ! target1.point ) {\n\n\t\ttarget1.point = tempTargetDest1.clone();\n\n\t} else {\n\n\t\ttarget1.point.copy( tempTargetDest1 );\n\n\t}\n\n\ttarget1.distance = closestDistance,\n\ttarget1.faceIndex = closestDistanceTriIndex;\n\n\tif ( target2 ) {\n\n\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\n\t\telse target2.point.copy( tempTargetDest2 );\n\t\ttarget2.point.applyMatrix4( tempMatrix );\n\t\ttempTargetDest1.applyMatrix4( tempMatrix );\n\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\n\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\n\n\t}\n\n\treturn target1;\n\n}\n\nexport { closestPointToGeometry_indirect };\n","import { Box3, Matrix4 } from 'three';\nimport { BufferStack } from '../utils/BufferStack.js';\nimport { BOUNDING_DATA_INDEX, COUNT, IS_LEAF, LEFT_NODE, OFFSET, RIGHT_NODE } from '../utils/nodeBufferUtils.js';\nimport { arrayToBox } from '../../utils/ArrayBoxUtilities.js';\nimport { PrimitivePool } from '../../utils/PrimitivePool.js';\nimport { BYTES_PER_NODE, UINT32_PER_NODE } from '../Constants.js';\n\nconst _bufferStack1 = /* @__PURE__ */ new BufferStack.constructor();\nconst _bufferStack2 = /* @__PURE__ */ new BufferStack.constructor();\nconst _boxPool = /* @__PURE__ */ new PrimitivePool( () => new Box3() );\nconst _leftBox1 = /* @__PURE__ */ new Box3();\nconst _rightBox1 = /* @__PURE__ */ new Box3();\n\nconst _leftBox2 = /* @__PURE__ */ new Box3();\nconst _rightBox2 = /* @__PURE__ */ new Box3();\n\nlet _active = false;\n\nexport function bvhcast( bvh, otherBvh, matrixToLocal, intersectsRanges ) {\n\n\tif ( _active ) {\n\n\t\tthrow new Error( 'MeshBVH: Recursive calls to bvhcast not supported.' );\n\n\t}\n\n\t_active = true;\n\n\tconst roots = bvh._roots;\n\tconst otherRoots = otherBvh._roots;\n\tlet result;\n\tlet nodeOffset1 = 0;\n\tlet nodeOffset2 = 0;\n\tconst invMat = new Matrix4().copy( matrixToLocal ).invert();\n\n\t// iterate over the first set of roots\n\tfor ( let i = 0, il = roots.length; i < il; i ++ ) {\n\n\t\t_bufferStack1.setBuffer( roots[ i ] );\n\t\tnodeOffset2 = 0;\n\n\t\t// prep the initial root box\n\t\tconst localBox = _boxPool.getPrimitive();\n\t\tarrayToBox( BOUNDING_DATA_INDEX( 0 ), _bufferStack1.float32Array, localBox );\n\t\tlocalBox.applyMatrix4( invMat );\n\n\t\t// iterate over the second set of roots\n\t\tfor ( let j = 0, jl = otherRoots.length; j < jl; j ++ ) {\n\n\t\t\t_bufferStack2.setBuffer( otherRoots[ j ] );\n\n\t\t\tresult = _traverse(\n\t\t\t\t0, 0, matrixToLocal, invMat, intersectsRanges,\n\t\t\t\tnodeOffset1, nodeOffset2, 0, 0,\n\t\t\t\tlocalBox,\n\t\t\t);\n\n\t\t\t_bufferStack2.clearBuffer();\n\t\t\tnodeOffset2 += otherRoots[ j ].byteLength / BYTES_PER_NODE;\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// release stack info\n\t\t_boxPool.releasePrimitive( localBox );\n\t\t_bufferStack1.clearBuffer();\n\t\tnodeOffset1 += roots[ i ].byteLength / BYTES_PER_NODE;\n\n\t\tif ( result ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\t_active = false;\n\treturn result;\n\n}\n\nfunction _traverse(\n\tnode1Index32,\n\tnode2Index32,\n\tmatrix2to1,\n\tmatrix1to2,\n\tintersectsRangesFunc,\n\n\t// offsets for ids\n\tnode1IndexOffset = 0,\n\tnode2IndexOffset = 0,\n\n\t// tree depth\n\tdepth1 = 0,\n\tdepth2 = 0,\n\n\tcurrBox = null,\n\treversed = false,\n\n) {\n\n\t// get the buffer stacks associated with the current indices\n\tlet bufferStack1, bufferStack2;\n\tif ( reversed ) {\n\n\t\tbufferStack1 = _bufferStack2;\n\t\tbufferStack2 = _bufferStack1;\n\n\t} else {\n\n\t\tbufferStack1 = _bufferStack1;\n\t\tbufferStack2 = _bufferStack2;\n\n\t}\n\n\t// get the local instances of the typed buffers\n\tconst\n\t\tfloat32Array1 = bufferStack1.float32Array,\n\t\tuint32Array1 = bufferStack1.uint32Array,\n\t\tuint16Array1 = bufferStack1.uint16Array,\n\t\tfloat32Array2 = bufferStack2.float32Array,\n\t\tuint32Array2 = bufferStack2.uint32Array,\n\t\tuint16Array2 = bufferStack2.uint16Array;\n\n\tconst node1Index16 = node1Index32 * 2;\n\tconst node2Index16 = node2Index32 * 2;\n\tconst isLeaf1 = IS_LEAF( node1Index16, uint16Array1 );\n\tconst isLeaf2 = IS_LEAF( node2Index16, uint16Array2 );\n\tlet result = false;\n\tif ( isLeaf2 && isLeaf1 ) {\n\n\t\t// if both bounds are leaf nodes then fire the callback if the boxes intersect\n\t\t// Note the \"nodeIndex\" values are just intended to be used as unique identifiers in the tree and\n\t\t// not used for accessing data\n\t\tif ( reversed ) {\n\n\t\t\tresult = intersectsRangesFunc(\n\t\t\t\tOFFSET( node2Index32, uint32Array2 ), COUNT( node2Index32 * 2, uint16Array2 ),\n\t\t\t\tOFFSET( node1Index32, uint32Array1 ), COUNT( node1Index32 * 2, uint16Array1 ),\n\t\t\t\tdepth2, node2IndexOffset + node2Index32 / UINT32_PER_NODE,\n\t\t\t\tdepth1, node1IndexOffset + node1Index32 / UINT32_PER_NODE,\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tresult = intersectsRangesFunc(\n\t\t\t\tOFFSET( node1Index32, uint32Array1 ), COUNT( node1Index32 * 2, uint16Array1 ),\n\t\t\t\tOFFSET( node2Index32, uint32Array2 ), COUNT( node2Index32 * 2, uint16Array2 ),\n\t\t\t\tdepth1, node1IndexOffset + node1Index32 / UINT32_PER_NODE,\n\t\t\t\tdepth2, node2IndexOffset + node2Index32 / UINT32_PER_NODE,\n\t\t\t);\n\n\t\t}\n\n\t} else if ( isLeaf2 ) {\n\n\t\t// SWAP\n\t\t// If we've traversed to the leaf node on the other bvh then we need to swap over\n\t\t// to traverse down the first one\n\n\t\t// get the new box to use\n\t\tconst newBox = _boxPool.getPrimitive();\n\t\tarrayToBox( BOUNDING_DATA_INDEX( node2Index32 ), float32Array2, newBox );\n\t\tnewBox.applyMatrix4( matrix2to1 );\n\n\t\t// get the child bounds to check before traversal\n\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\tresult = (\n\t\t\tintersectCl1 && _traverse(\n\t\t\t\tnode2Index32, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\tnewBox, ! reversed,\n\t\t\t)\n\t\t) || (\n\t\t\tintersectCr1 && _traverse(\n\t\t\t\tnode2Index32, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\tnewBox, ! reversed,\n\t\t\t)\n\t\t);\n\n\t\t_boxPool.releasePrimitive( newBox );\n\n\t} else {\n\n\t\t// if neither are leaves then we should swap if one of the children does not\n\t\t// intersect with the current bounds\n\n\t\t// get the child bounds to check\n\t\tconst cl2 = LEFT_NODE( node2Index32 );\n\t\tconst cr2 = RIGHT_NODE( node2Index32, uint32Array2 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cl2 ), float32Array2, _leftBox2 );\n\t\tarrayToBox( BOUNDING_DATA_INDEX( cr2 ), float32Array2, _rightBox2 );\n\n\t\tconst leftIntersects = currBox.intersectsBox( _leftBox2 );\n\t\tconst rightIntersects = currBox.intersectsBox( _rightBox2 );\n\t\tif ( leftIntersects && rightIntersects ) {\n\n\t\t\t// continue to traverse both children if they both intersect\n\t\t\tresult = _traverse(\n\t\t\t\tnode1Index32, cl2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\tcurrBox, reversed,\n\t\t\t) || _traverse(\n\t\t\t\tnode1Index32, cr2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\tcurrBox, reversed,\n\t\t\t);\n\n\t\t} else if ( leftIntersects ) {\n\n\t\t\tif ( isLeaf1 ) {\n\n\t\t\t\t// if the current box is a leaf then just continue\n\t\t\t\tresult = _traverse(\n\t\t\t\t\tnode1Index32, cl2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\t\tcurrBox, reversed,\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\t// SWAP\n\t\t\t\t// if only one box intersects then we have to swap to the other bvh to continue\n\t\t\t\tconst newBox = _boxPool.getPrimitive();\n\t\t\t\tnewBox.copy( _leftBox2 ).applyMatrix4( matrix2to1 );\n\n\t\t\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\t\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\t\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\t\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\t\t\tresult = (\n\t\t\t\t\tintersectCl1 && _traverse(\n\t\t\t\t\t\tcl2, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t) || (\n\t\t\t\t\tintersectCr1 && _traverse(\n\t\t\t\t\t\tcl2, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t_boxPool.releasePrimitive( newBox );\n\n\t\t\t}\n\n\t\t} else if ( rightIntersects ) {\n\n\t\t\tif ( isLeaf1 ) {\n\n\t\t\t\t// if the current box is a leaf then just continue\n\t\t\t\tresult = _traverse(\n\t\t\t\t\tnode1Index32, cr2, matrix2to1, matrix1to2, intersectsRangesFunc,\n\t\t\t\t\tnode1IndexOffset, node2IndexOffset, depth1, depth2 + 1,\n\t\t\t\t\tcurrBox, reversed,\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\t// SWAP\n\t\t\t\t// if only one box intersects then we have to swap to the other bvh to continue\n\t\t\t\tconst newBox = _boxPool.getPrimitive();\n\t\t\t\tnewBox.copy( _rightBox2 ).applyMatrix4( matrix2to1 );\n\n\t\t\t\tconst cl1 = LEFT_NODE( node1Index32 );\n\t\t\t\tconst cr1 = RIGHT_NODE( node1Index32, uint32Array1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cl1 ), float32Array1, _leftBox1 );\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( cr1 ), float32Array1, _rightBox1 );\n\n\t\t\t\t// precompute the intersections otherwise the global boxes will be modified during traversal\n\t\t\t\tconst intersectCl1 = newBox.intersectsBox( _leftBox1 );\n\t\t\t\tconst intersectCr1 = newBox.intersectsBox( _rightBox1 );\n\t\t\t\tresult = (\n\t\t\t\t\tintersectCl1 && _traverse(\n\t\t\t\t\t\tcr2, cl1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t) || (\n\t\t\t\t\tintersectCr1 && _traverse(\n\t\t\t\t\t\tcr2, cr1, matrix1to2, matrix2to1, intersectsRangesFunc,\n\t\t\t\t\t\tnode2IndexOffset, node1IndexOffset, depth2, depth1 + 1,\n\t\t\t\t\t\tnewBox, ! reversed,\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t_boxPool.releasePrimitive( newBox );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n","// converts the given BVH raycast intersection to align with the three.js raycast\n// structure (include object, world space distance and point).\nexport function convertRaycastIntersect( hit, object, raycaster ) {\n\n\tif ( hit === null ) {\n\n\t\treturn null;\n\n\t}\n\n\thit.point.applyMatrix4( object.matrixWorld );\n\thit.distance = hit.point.distanceTo( raycaster.ray.origin );\n\thit.object = object;\n\n\treturn hit;\n\n}\n","import { BufferAttribute, FrontSide, Ray, Vector3, Matrix4 } from 'three';\nimport { SKIP_GENERATION, BYTES_PER_NODE, UINT32_PER_NODE, FLOAT32_EPSILON } from './Constants.js';\nimport { OrientedBox } from '../math/OrientedBox.js';\nimport { ExtendedTrianglePool } from '../utils/ExtendedTrianglePool.js';\nimport { closestPointToPoint } from './cast/closestPointToPoint.js';\nimport { IS_LEAF } from './utils/nodeBufferUtils.js';\n\nimport { iterateOverTriangles } from './utils/iterationUtils.generated.js';\nimport { refit } from './cast/refit.generated.js';\nimport { raycast } from './cast/raycast.generated.js';\nimport { raycastFirst } from './cast/raycastFirst.generated.js';\nimport { intersectsGeometry } from './cast/intersectsGeometry.generated.js';\nimport { closestPointToGeometry } from './cast/closestPointToGeometry.generated.js';\n\nimport { iterateOverTriangles_indirect } from './utils/iterationUtils_indirect.generated.js';\nimport { refit_indirect } from './cast/refit_indirect.generated.js';\nimport { raycast_indirect } from './cast/raycast_indirect.generated.js';\nimport { raycastFirst_indirect } from './cast/raycastFirst_indirect.generated.js';\nimport { intersectsGeometry_indirect } from './cast/intersectsGeometry_indirect.generated.js';\nimport { closestPointToGeometry_indirect } from './cast/closestPointToGeometry_indirect.generated.js';\nimport { setTriangle } from '../utils/TriangleUtilities.js';\nimport { bvhcast } from './cast/bvhcast.js';\nimport { convertRaycastIntersect } from '../utils/GeometryRayIntersectUtilities.js';\nimport { GeometryBVH } from './GeometryBVH.js';\n\nconst _obb = /* @__PURE__ */ new OrientedBox();\nconst _ray = /* @__PURE__ */ new Ray();\nconst _direction = /* @__PURE__ */ new Vector3();\nconst _inverseMatrix = /* @__PURE__ */ new Matrix4();\nconst _worldScale = /* @__PURE__ */ new Vector3();\nconst _getters = [ 'getX', 'getY', 'getZ' ];\n\nexport class MeshBVH extends GeometryBVH {\n\n\tstatic serialize( bvh, options = {} ) {\n\n\t\toptions = {\n\t\t\tcloneBuffers: true,\n\t\t\t...options,\n\t\t};\n\n\t\tconst geometry = bvh.geometry;\n\t\tconst rootData = bvh._roots;\n\t\tconst indirectBuffer = bvh._indirectBuffer;\n\t\tconst indexAttribute = geometry.getIndex();\n\t\tconst result = {\n\t\t\tversion: 1,\n\t\t\troots: null,\n\t\t\tindex: null,\n\t\t\tindirectBuffer: null,\n\t\t};\n\t\tif ( options.cloneBuffers ) {\n\n\t\t\tresult.roots = rootData.map( root => root.slice() );\n\t\t\tresult.index = indexAttribute ? indexAttribute.array.slice() : null;\n\t\t\tresult.indirectBuffer = indirectBuffer ? indirectBuffer.slice() : null;\n\n\t\t} else {\n\n\t\t\tresult.roots = rootData;\n\t\t\tresult.index = indexAttribute ? indexAttribute.array : null;\n\t\t\tresult.indirectBuffer = indirectBuffer;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tstatic deserialize( data, geometry, options = {} ) {\n\n\t\toptions = {\n\t\t\tsetIndex: true,\n\t\t\tindirect: Boolean( data.indirectBuffer ),\n\t\t\t...options,\n\t\t};\n\n\t\tconst { index, roots, indirectBuffer } = data;\n\n\t\t// handle backwards compatibility by fixing up the buffer roots\n\t\t// see issue gkjohnson/three-mesh-bvh#759\n\t\tif ( ! data.version ) {\n\n\t\t\tconsole.warn(\n\t\t\t\t'MeshBVH.deserialize: Serialization format has been changed and will be fixed up. ' +\n\t\t\t\t'It is recommended to regenerate any stored serialized data.'\n\t\t\t);\n\t\t\tfixupVersion0( roots );\n\n\t\t}\n\n\t\tconst bvh = new MeshBVH( geometry, { ...options, [ SKIP_GENERATION ]: true } );\n\t\tbvh._roots = roots;\n\t\tbvh._indirectBuffer = indirectBuffer || null;\n\n\t\tif ( options.setIndex ) {\n\n\t\t\tconst indexAttribute = geometry.getIndex();\n\t\t\tif ( indexAttribute === null ) {\n\n\t\t\t\tconst newIndex = new BufferAttribute( data.index, 1, false );\n\t\t\t\tgeometry.setIndex( newIndex );\n\n\t\t\t} else if ( indexAttribute.array !== index ) {\n\n\t\t\t\tindexAttribute.array.set( index );\n\t\t\t\tindexAttribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bvh;\n\n\t\t// convert version 0 serialized data (uint32 indices) to version 1 (node indices)\n\t\tfunction fixupVersion0( roots ) {\n\n\t\t\tfor ( let rootIndex = 0; rootIndex < roots.length; rootIndex ++ ) {\n\n\t\t\t\tconst root = roots[ rootIndex ];\n\t\t\t\tconst uint32Array = new Uint32Array( root );\n\t\t\t\tconst uint16Array = new Uint16Array( root );\n\n\t\t\t\t// iterate over nodes and convert right child offsets\n\t\t\t\tfor ( let node = 0, l = root.byteLength / BYTES_PER_NODE; node < l; node ++ ) {\n\n\t\t\t\t\tconst node32Index = UINT32_PER_NODE * node;\n\t\t\t\t\tconst node16Index = 2 * node32Index;\n\t\t\t\t\tif ( ! IS_LEAF( node16Index, uint16Array ) ) {\n\n\t\t\t\t\t\t// convert absolute right child offset to relative offset\n\t\t\t\t\t\tuint32Array[ node32Index + 6 ] = uint32Array[ node32Index + 6 ] / UINT32_PER_NODE - node;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tget primitiveStride() {\n\n\t\treturn 3;\n\n\t}\n\n\tget resolveTriangleIndex() {\n\n\t\treturn this.resolvePrimitiveIndex;\n\n\t}\n\n\tconstructor( geometry, options = {} ) {\n\n\t\tif ( options.maxLeafTris ) {\n\n\t\t\toptions = {\n\t\t\t\t...options,\n\t\t\t\tmaxLeafSize: options.maxLeafTris,\n\t\t\t};\n\n\t\t}\n\n\t\tsuper( geometry, options );\n\n\t}\n\n\t// implement abstract methods from BVH base class\n\tshiftTriangleOffsets( offset ) {\n\n\t\treturn super.shiftPrimitiveOffsets( offset );\n\n\t}\n\n\t// write primitive bounds to the buffer - used only for validateBounds at the moment\n\twritePrimitiveBounds( i, targetBuffer, baseIndex ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst indirectBuffer = this._indirectBuffer;\n\t\tconst posAttr = geometry.attributes.position;\n\t\tconst index = geometry.index ? geometry.index.array : null;\n\n\t\tconst tri = indirectBuffer ? indirectBuffer[ i ] : i;\n\t\tconst tri3 = tri * 3;\n\n\t\tlet ai = tri3 + 0;\n\t\tlet bi = tri3 + 1;\n\t\tlet ci = tri3 + 2;\n\n\t\tif ( index ) {\n\n\t\t\tai = index[ ai ];\n\t\t\tbi = index[ bi ];\n\t\t\tci = index[ ci ];\n\n\t\t}\n\n\t\tfor ( let el = 0; el < 3; el ++ ) {\n\n\t\t\tconst a = posAttr[ _getters[ el ] ]( ai );\n\t\t\tconst b = posAttr[ _getters[ el ] ]( bi );\n\t\t\tconst c = posAttr[ _getters[ el ] ]( ci );\n\n\t\t\tlet min = a;\n\t\t\tif ( b < min ) min = b;\n\t\t\tif ( c < min ) min = c;\n\n\t\t\tlet max = a;\n\t\t\tif ( b > max ) max = b;\n\t\t\tif ( c > max ) max = c;\n\n\t\t\t// Write in min/max format [minx, miny, minz, maxx, maxy, maxz]\n\t\t\ttargetBuffer[ baseIndex + el ] = min;\n\t\t\ttargetBuffer[ baseIndex + el + 3 ] = max;\n\n\t\t}\n\n\t\treturn targetBuffer;\n\n\t}\n\n\t// precomputes the bounding box for each triangle; required for quickly calculating tree splits.\n\t// result is an array of size count * 6 where triangle i maps to a\n\t// [x_center, x_delta, y_center, y_delta, z_center, z_delta] tuple starting at index (i - offset) * 6,\n\t// representing the center and half-extent in each dimension of triangle i\n\tcomputePrimitiveBounds( offset, count, targetBuffer ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst indirectBuffer = this._indirectBuffer;\n\t\tconst posAttr = geometry.attributes.position;\n\t\tconst index = geometry.index ? geometry.index.array : null;\n\t\tconst normalized = posAttr.normalized;\n\n\t\tif ( offset < 0 || count + offset - targetBuffer.offset > targetBuffer.length / 6 ) {\n\n\t\t\tthrow new Error( 'MeshBVH: compute triangle bounds range is invalid.' );\n\n\t\t}\n\n\t\t// used for non-normalized positions\n\t\tconst posArr = posAttr.array;\n\n\t\t// support for an interleaved position buffer\n\t\tconst bufferOffset = posAttr.offset || 0;\n\t\tlet stride = 3;\n\t\tif ( posAttr.isInterleavedBufferAttribute ) {\n\n\t\t\tstride = posAttr.data.stride;\n\n\t\t}\n\n\t\t// used for normalized positions\n\t\tconst getters = [ 'getX', 'getY', 'getZ' ];\n\t\tconst writeOffset = targetBuffer.offset;\n\n\t\t// iterate over the triangle range\n\t\tfor ( let i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\t\tconst tri = indirectBuffer ? indirectBuffer[ i ] : i;\n\t\t\tconst tri3 = tri * 3;\n\t\t\tconst boundsIndexOffset = ( i - writeOffset ) * 6;\n\n\t\t\tlet ai = tri3 + 0;\n\t\t\tlet bi = tri3 + 1;\n\t\t\tlet ci = tri3 + 2;\n\n\t\t\tif ( index ) {\n\n\t\t\t\tai = index[ ai ];\n\t\t\t\tbi = index[ bi ];\n\t\t\t\tci = index[ ci ];\n\n\t\t\t}\n\n\t\t\t// we add the stride and offset here since we access the array directly\n\t\t\t// below for the sake of performance\n\t\t\tif ( ! normalized ) {\n\n\t\t\t\tai = ai * stride + bufferOffset;\n\t\t\t\tbi = bi * stride + bufferOffset;\n\t\t\t\tci = ci * stride + bufferOffset;\n\n\t\t\t}\n\n\t\t\tfor ( let el = 0; el < 3; el ++ ) {\n\n\t\t\t\tlet a, b, c;\n\n\t\t\t\tif ( normalized ) {\n\n\t\t\t\t\ta = posAttr[ getters[ el ] ]( ai );\n\t\t\t\t\tb = posAttr[ getters[ el ] ]( bi );\n\t\t\t\t\tc = posAttr[ getters[ el ] ]( ci );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ta = posArr[ ai + el ];\n\t\t\t\t\tb = posArr[ bi + el ];\n\t\t\t\t\tc = posArr[ ci + el ];\n\n\t\t\t\t}\n\n\t\t\t\tlet min = a;\n\t\t\t\tif ( b < min ) min = b;\n\t\t\t\tif ( c < min ) min = c;\n\n\t\t\t\tlet max = a;\n\t\t\t\tif ( b > max ) max = b;\n\t\t\t\tif ( c > max ) max = c;\n\n\t\t\t\t// Increase the bounds size by float32 epsilon to avoid precision errors when\n\t\t\t\t// converting to 32 bit float. Scale the epsilon by the size of the numbers being\n\t\t\t\t// worked with.\n\t\t\t\tconst halfExtents = ( max - min ) / 2;\n\t\t\t\tconst el2 = el * 2;\n\t\t\t\ttargetBuffer[ boundsIndexOffset + el2 + 0 ] = min + halfExtents;\n\t\t\t\ttargetBuffer[ boundsIndexOffset + el2 + 1 ] = halfExtents + ( Math.abs( min ) + halfExtents ) * FLOAT32_EPSILON;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn targetBuffer;\n\n\t}\n\n\traycastObject3D( object, raycaster, intersects = [] ) {\n\n\t\tconst { material } = object;\n\t\tif ( material === undefined ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t_inverseMatrix.copy( object.matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t_worldScale.setFromMatrixScale( object.matrixWorld );\n\t\t_direction.copy( _ray.direction ).multiply( _worldScale );\n\n\t\tconst scaleFactor = _direction.length();\n\t\tconst near = raycaster.near / scaleFactor;\n\t\tconst far = raycaster.far / scaleFactor;\n\n\t\tif ( raycaster.firstHitOnly === true ) {\n\n\t\t\tlet hit = this.raycastFirst( _ray, material, near, far );\n\t\t\thit = convertRaycastIntersect( hit, object, raycaster );\n\t\t\tif ( hit ) {\n\n\t\t\t\tintersects.push( hit );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst hits = this.raycast( _ray, material, near, far );\n\t\t\tfor ( let i = 0, l = hits.length; i < l; i ++ ) {\n\n\t\t\t\tconst hit = convertRaycastIntersect( hits[ i ], object, raycaster );\n\t\t\t\tif ( hit ) {\n\n\t\t\t\t\tintersects.push( hit );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn intersects;\n\n\t}\n\n\trefit( nodeIndices = null ) {\n\n\t\tconst refitFunc = this.indirect ? refit_indirect : refit;\n\t\treturn refitFunc( this, nodeIndices );\n\n\t}\n\n\t/* Core Cast Functions */\n\traycast( ray, materialOrSide = FrontSide, near = 0, far = Infinity ) {\n\n\t\tconst roots = this._roots;\n\t\tconst intersects = [];\n\t\tconst raycastFunc = this.indirect ? raycast_indirect : raycast;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\traycastFunc( this, i, materialOrSide, ray, intersects, near, far );\n\n\t\t}\n\n\t\treturn intersects;\n\n\t}\n\n\traycastFirst( ray, materialOrSide = FrontSide, near = 0, far = Infinity ) {\n\n\t\tconst roots = this._roots;\n\t\tlet closestResult = null;\n\n\t\tconst raycastFirstFunc = this.indirect ? raycastFirst_indirect : raycastFirst;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tconst result = raycastFirstFunc( this, i, materialOrSide, ray, near, far );\n\t\t\tif ( result != null && ( closestResult == null || result.distance < closestResult.distance ) ) {\n\n\t\t\t\tclosestResult = result;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn closestResult;\n\n\t}\n\n\tintersectsGeometry( otherGeometry, geomToMesh ) {\n\n\t\tlet result = false;\n\t\tconst roots = this._roots;\n\t\tconst intersectsGeometryFunc = this.indirect ? intersectsGeometry_indirect : intersectsGeometry;\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\n\n\t\t\tresult = intersectsGeometryFunc( this, i, otherGeometry, geomToMesh );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tshapecast( callbacks ) {\n\n\t\tconst triangle = ExtendedTrianglePool.getPrimitive();\n\t\tconst result = super.shapecast(\n\t\t\t{\n\t\t\t\t...callbacks,\n\t\t\t\tintersectsPrimitive: callbacks.intersectsTriangle,\n\t\t\t\tscratchPrimitive: triangle,\n\n\t\t\t\t// TODO: is the performance significant enough for the added complexity here?\n\t\t\t\t// can we just use one function?\n\t\t\t\titerateDirect: iterateOverTriangles,\n\t\t\t\titerateIndirect: iterateOverTriangles_indirect,\n\t\t\t}\n\t\t);\n\t\tExtendedTrianglePool.releasePrimitive( triangle );\n\n\t\treturn result;\n\n\t}\n\n\tbvhcast( otherBvh, matrixToLocal, callbacks ) {\n\n\t\tlet {\n\t\t\tintersectsRanges,\n\t\t\tintersectsTriangles,\n\t\t} = callbacks;\n\n\t\tconst triangle1 = ExtendedTrianglePool.getPrimitive();\n\t\tconst indexAttr1 = this.geometry.index;\n\t\tconst positionAttr1 = this.geometry.attributes.position;\n\t\tconst assignTriangle1 = this.indirect ?\n\t\t\ti1 => {\n\n\n\t\t\t\tconst ti = this.resolveTriangleIndex( i1 );\n\t\t\t\tsetTriangle( triangle1, ti * 3, indexAttr1, positionAttr1 );\n\n\t\t\t} :\n\t\t\ti1 => {\n\n\t\t\t\tsetTriangle( triangle1, i1 * 3, indexAttr1, positionAttr1 );\n\n\t\t\t};\n\n\t\tconst triangle2 = ExtendedTrianglePool.getPrimitive();\n\t\tconst indexAttr2 = otherBvh.geometry.index;\n\t\tconst positionAttr2 = otherBvh.geometry.attributes.position;\n\t\tconst assignTriangle2 = otherBvh.indirect ?\n\t\t\ti2 => {\n\n\t\t\t\tconst ti2 = otherBvh.resolveTriangleIndex( i2 );\n\t\t\t\tsetTriangle( triangle2, ti2 * 3, indexAttr2, positionAttr2 );\n\n\t\t\t} :\n\t\t\ti2 => {\n\n\t\t\t\tsetTriangle( triangle2, i2 * 3, indexAttr2, positionAttr2 );\n\n\t\t\t};\n\n\t\t// generate triangle callback if needed\n\t\tif ( intersectsTriangles ) {\n\n\t\t\tconst iterateOverDoubleTriangles = ( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 ) => {\n\n\t\t\t\tfor ( let i2 = offset2, l2 = offset2 + count2; i2 < l2; i2 ++ ) {\n\n\t\t\t\t\tassignTriangle2( i2 );\n\n\t\t\t\t\ttriangle2.a.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.b.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.c.applyMatrix4( matrixToLocal );\n\t\t\t\t\ttriangle2.needsUpdate = true;\n\n\t\t\t\t\tfor ( let i1 = offset1, l1 = offset1 + count1; i1 < l1; i1 ++ ) {\n\n\t\t\t\t\t\tassignTriangle1( i1 );\n\n\t\t\t\t\t\ttriangle1.needsUpdate = true;\n\n\t\t\t\t\t\tif ( intersectsTriangles( triangle1, triangle2, i1, i2, depth1, nodeIndex1, depth2, nodeIndex2 ) ) {\n\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t\tif ( intersectsRanges ) {\n\n\t\t\t\tconst originalIntersectsRanges = intersectsRanges;\n\t\t\t\tintersectsRanges = function ( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 ) {\n\n\t\t\t\t\tif ( ! originalIntersectsRanges( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 ) ) {\n\n\t\t\t\t\t\treturn iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tintersectsRanges = iterateOverDoubleTriangles;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bvhcast( this, otherBvh, matrixToLocal, intersectsRanges );\n\n\t}\n\n\n\t/* Derived Cast Functions */\n\tintersectsBox( box, boxToMesh ) {\n\n\t\t_obb.set( box.min, box.max, boxToMesh );\n\t\t_obb.needsUpdate = true;\n\n\t\treturn this.shapecast(\n\t\t\t{\n\t\t\t\tintersectsBounds: box => _obb.intersectsBox( box ),\n\t\t\t\tintersectsTriangle: tri => _obb.intersectsTriangle( tri )\n\t\t\t}\n\t\t);\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.shapecast(\n\t\t\t{\n\t\t\t\tintersectsBounds: box => sphere.intersectsBox( box ),\n\t\t\t\tintersectsTriangle: tri => tri.intersectsSphere( sphere )\n\t\t\t}\n\t\t);\n\n\t}\n\n\tclosestPointToGeometry( otherGeometry, geometryToBvh, target1 = { }, target2 = { }, minThreshold = 0, maxThreshold = Infinity ) {\n\n\t\tconst closestPointToGeometryFunc = this.indirect ? closestPointToGeometry_indirect : closestPointToGeometry;\n\t\treturn closestPointToGeometryFunc(\n\t\t\tthis,\n\t\t\totherGeometry,\n\t\t\tgeometryToBvh,\n\t\t\ttarget1,\n\t\t\ttarget2,\n\t\t\tminThreshold,\n\t\t\tmaxThreshold,\n\t\t);\n\n\t}\n\n\tclosestPointToPoint( point, target = { }, minThreshold = 0, maxThreshold = Infinity ) {\n\n\t\treturn closestPointToPoint(\n\t\t\tthis,\n\t\t\tpoint,\n\t\t\ttarget,\n\t\t\tminThreshold,\n\t\t\tmaxThreshold,\n\t\t);\n\n\t}\n\n}\n","import { Mesh, Points, Line, LineLoop, LineSegments, Sphere, BatchedMesh, REVISION } from 'three';\nimport { MeshBVH } from '../core/MeshBVH.js';\n\nconst IS_REVISION_166 = parseInt( REVISION ) >= 166;\n\n// TODO: how can we expand these raycast functions?\nconst _raycastFunctions = {\n\t'Mesh': Mesh.prototype.raycast,\n\t'Line': Line.prototype.raycast,\n\t'LineSegments': LineSegments.prototype.raycast,\n\t'LineLoop': LineLoop.prototype.raycast,\n\t'Points': Points.prototype.raycast,\n\t'BatchedMesh': BatchedMesh.prototype.raycast,\n};\n\nconst _mesh = /* @__PURE__ */ new Mesh();\nconst _batchIntersects = [];\n\nexport function acceleratedRaycast( raycaster, intersects ) {\n\n\tif ( this.isBatchedMesh ) {\n\n\t\tacceleratedBatchedMeshRaycast.call( this, raycaster, intersects );\n\n\t} else {\n\n\t\tconst { geometry } = this;\n\t\tif ( geometry.boundsTree ) {\n\n\t\t\tgeometry.boundsTree.raycastObject3D( this, raycaster, intersects );\n\n\t\t} else {\n\n\t\t\tlet raycastFunction;\n\t\t\tif ( this instanceof Mesh ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.Mesh;\n\n\t\t\t} else if ( this instanceof LineSegments ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.LineSegments;\n\n\t\t\t} else if ( this instanceof LineLoop ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.LineLoop;\n\n\t\t\t} else if ( this instanceof Line ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.Line;\n\n\t\t\t} else if ( this instanceof Points ) {\n\n\t\t\t\traycastFunction = _raycastFunctions.Points;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'BVH: Fallback raycast function not found.' );\n\n\t\t\t}\n\n\t\t\traycastFunction.call( this, raycaster, intersects );\n\n\t\t}\n\n\t}\n\n}\n\nfunction acceleratedBatchedMeshRaycast( raycaster, intersects ) {\n\n\tif ( this.boundsTrees ) {\n\n\t\t// TODO: remove use of geometry info, instance info when r170 is minimum version\n\t\tconst boundsTrees = this.boundsTrees;\n\t\tconst drawInfo = this._drawInfo || this._instanceInfo;\n\t\tconst drawRanges = this._drawRanges || this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry = this.geometry;\n\n\t\tconst oldBoundsTree = _mesh.geometry.boundsTree;\n\t\tconst oldDrawRange = _mesh.geometry.drawRange;\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\t// TODO: provide new method to get instances count instead of 'drawInfo.length'\n\t\tfor ( let i = 0, l = drawInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! this.getVisibleAt( i ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// TODO: use getGeometryIndex\n\t\t\tconst geometryId = drawInfo[ i ].geometryIndex;\n\n\t\t\t_mesh.geometry.boundsTree = boundsTrees[ geometryId ];\n\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\n\t\t\tif ( ! _mesh.geometry.boundsTree ) {\n\n\t\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\n\t\t\t\tconst drawRange = drawRanges[ geometryId ];\n\t\t\t\t_mesh.geometry.setDrawRange( drawRange.start, drawRange.count );\n\n\t\t\t}\n\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.geometry.boundsTree = oldBoundsTree;\n\t\t_mesh.geometry.drawRange = oldDrawRange;\n\t\t_mesh.material = null;\n\t\t_mesh.geometry = null;\n\n\t} else {\n\n\t\t_raycastFunctions.BatchedMesh.call( this, raycaster, intersects );\n\n\t}\n\n}\n\nexport function computeBoundsTree( options = {} ) {\n\n\tconst { type = MeshBVH } = options;\n\tthis.boundsTree = new type( this, options );\n\treturn this.boundsTree;\n\n}\n\nexport function disposeBoundsTree() {\n\n\tthis.boundsTree = null;\n\n}\n\nexport function computeBatchedBoundsTree( index = - 1, options = {} ) {\n\n\tif ( ! IS_REVISION_166 ) {\n\n\t\tthrow new Error( 'BatchedMesh: Three r166+ is required to compute bounds trees.' );\n\n\t}\n\n\toptions = {\n\t\t...options,\n\t\trange: null\n\t};\n\n\tconst drawRanges = this._drawRanges || this._geometryInfo;\n\tconst geometryCount = this._geometryCount;\n\tif ( ! this.boundsTrees ) {\n\n\t\tthis.boundsTrees = new Array( geometryCount ).fill( null );\n\n\t}\n\n\tconst boundsTrees = this.boundsTrees;\n\twhile ( boundsTrees.length < geometryCount ) {\n\n\t\tboundsTrees.push( null );\n\n\t}\n\n\tif ( index < 0 ) {\n\n\t\tfor ( let i = 0; i < geometryCount; i ++ ) {\n\n\t\t\toptions.range = drawRanges[ i ];\n\t\t\tboundsTrees[ i ] = new MeshBVH( this.geometry, options );\n\n\t\t}\n\n\t\treturn boundsTrees;\n\n\t} else {\n\n\t\tif ( index < drawRanges.length ) {\n\n\t\t\toptions.range = drawRanges[ index ];\n\t\t\tboundsTrees[ index ] = new MeshBVH( this.geometry, options );\n\n\t\t}\n\n\t\treturn boundsTrees[ index ] || null;\n\n\t}\n\n}\n\nexport function disposeBatchedBoundsTree( index = - 1 ) {\n\n\tif ( index < 0 ) {\n\n\t\tthis.boundsTrees.fill( null );\n\n\t} else {\n\n\t\tif ( index < this.boundsTrees.length ) {\n\n\t\t\tthis.boundsTrees[ index ] = null;\n\n\t\t}\n\n\t}\n\n}\n","import * as THREE from 'three'\r\nimport { \r\n computeBoundsTree, \r\n disposeBoundsTree, \r\n acceleratedRaycast,\r\n MeshBVH,\r\n StaticGeometryGenerator\r\n} from 'three-mesh-bvh'\r\n\r\n// 扩展 Three.js 的 BufferGeometry 和 Mesh 以支持 BVH\r\nTHREE.BufferGeometry.prototype.computeBoundsTree = computeBoundsTree\r\nTHREE.BufferGeometry.prototype.disposeBoundsTree = disposeBoundsTree\r\nTHREE.Mesh.prototype.raycast = acceleratedRaycast\r\n\r\n/**\r\n * 获取 WebGL 鼠标坐标\r\n * @param event 鼠标事件\r\n * @returns 归一化的鼠标坐标\r\n */\r\nexport function getWebGLMouse(event: MouseEvent): THREE.Vector2 {\r\n const target = event.target as HTMLElement\r\n // 使用 offsetX/offsetY,它们是相对于 event.target 的\r\n return new THREE.Vector2(\r\n (event.offsetX / target.clientWidth) * 2 - 1,\r\n -(event.offsetY / target.clientHeight) * 2 + 1\r\n )\r\n}\r\n\r\n/**\r\n * 从容器元素获取 WebGL 鼠标坐标\r\n * @param event 鼠标事件\r\n * @param container 容器元素\r\n * @returns 归一化的鼠标坐标\r\n */\r\nexport function getWebGLMouseFromContainer(event: MouseEvent, container: HTMLElement): THREE.Vector2 {\r\n const rect = container.getBoundingClientRect()\r\n return new THREE.Vector2(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n )\r\n}\r\n\r\n// 复用的射线检测器(避免每次创建新实例)\r\nconst _raycaster = new THREE.Raycaster()\r\n\r\n// 已处理过 BVH 的几何体缓存\r\nconst _bvhProcessedGeometries = new WeakSet<THREE.BufferGeometry>()\r\n\r\n/**\r\n * 为场景中的所有 Mesh 构建 BVH\r\n * 这会显著加速射线检测\r\n * \r\n * @param scene 场景\r\n */\r\nexport function buildSceneBVH(scene: THREE.Scene): void {\r\n scene.traverse((object) => {\r\n if ((object as THREE.Mesh).isMesh) {\r\n const mesh = object as THREE.Mesh\r\n const geometry = mesh.geometry as THREE.BufferGeometry\r\n \r\n // 跳过已处理的几何体\r\n if (_bvhProcessedGeometries.has(geometry)) return\r\n \r\n // 跳过没有位置属性的几何体\r\n if (!geometry.attributes.position) return\r\n \r\n try {\r\n // 构建 BVH\r\n geometry.computeBoundsTree()\r\n _bvhProcessedGeometries.add(geometry)\r\n } catch (error) {\r\n // 某些几何体可能不支持 BVH,忽略错误\r\n console.warn('[BVH] Failed to build BVH for geometry:', error)\r\n }\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * 射线检测物体(优化版本)\r\n * 使用 BVH 加速和包围盒预检测\r\n * \r\n * @param mouse 鼠标坐标\r\n * @param camera 相机\r\n * @param objects 检测对象列表\r\n * @returns 交点列表\r\n */\r\nexport function raycastObjects(\r\n mouse: THREE.Vector2,\r\n camera: THREE.Camera,\r\n objects: THREE.Object3D[]\r\n): THREE.Intersection[] {\r\n _raycaster.setFromCamera(mouse, camera)\r\n\r\n // 过滤可交互对象\r\n const interactableObjects: THREE.Object3D[] = []\r\n \r\n for (const obj of objects) {\r\n // 跳过不可见对象\r\n if (!obj.visible) continue\r\n \r\n // 跳过辅助工具和特效\r\n const objAny = obj as any\r\n if (objAny.isTransformControls) continue\r\n if (objAny.isHelper) continue\r\n if (obj.type === 'GridHelper') continue\r\n if (obj.type === 'AxesHelper') continue\r\n if (obj.type === 'AmbientLight') continue\r\n if (obj.type === 'DirectionalLight') continue\r\n if (obj.type === 'PointLight') continue\r\n if (obj.type === 'SpotLight') continue\r\n if (obj.type === 'HemisphereLight') continue\r\n if (obj.name === 'TransformControls') continue\r\n \r\n interactableObjects.push(obj)\r\n }\r\n\r\n // 如果没有可交互对象,直接返回空数组\r\n if (interactableObjects.length === 0) {\r\n return []\r\n }\r\n\r\n // 进行射线检测(BVH 会自动加速)\r\n const intersects = _raycaster.intersectObjects(interactableObjects, 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\r\n// 导出 BVH 相关工具\r\nexport { MeshBVH, StaticGeometryGenerator }\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { EditorPluginConfig } from '../../types/config.types'\r\nimport type { HandlerMode, ClickInfo, ExtendedObject3D } from '../../types/core.types'\r\nimport type { TransformControllerPlugin } from '../controls/TransformController'\r\nimport type { ComposerPlugin } from '../postprocessing/ComposerPlugin'\r\nimport { getRootModel, raycastObjects, getWebGLMouse } from '../../utils/raycast'\r\n\r\n/**\r\n * 默认编辑器配置\r\n */\r\nexport const DEFAULT_EDITOR_CONFIG: EditorPluginConfig = {\r\n modes: ['选择', '根选择', '变换', '场景绘制', '点击信息'],\r\n defaultMode: '变换',\r\n isTransformChildren: false,\r\n enableKeyboard: false\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n * 提供物体选择、变换、模式切换等编辑功能\r\n */\r\nexport class EditorPlugin extends Plugin<EditorPluginConfig> {\r\n readonly name = 'editor'\r\n readonly dependencies = ['transform-controller', 'composer']\r\n\r\n /** 当前模式 */\r\n private _mode: HandlerMode\r\n\r\n /** 当前选中信息 */\r\n private _currentInfo: ClickInfo | null = null\r\n\r\n /** 键盘事件处理函数 */\r\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null\r\n\r\n /** 绘制事件回调 */\r\n drawEventCallback?: (point: THREE.Vector3, object: THREE.Object3D) => void\r\n\r\n constructor(config?: Partial<EditorPluginConfig>) {\r\n super({ ...DEFAULT_EDITOR_CONFIG, ...config })\r\n this._mode = (this.config.defaultMode as HandlerMode) || '变换'\r\n }\r\n\r\n /**\r\n * 获取当前模式\r\n */\r\n get mode(): HandlerMode {\r\n return this._mode\r\n }\r\n\r\n /**\r\n * 获取当前选中信息\r\n */\r\n get currentInfo(): ClickInfo | null {\r\n return this._currentInfo\r\n }\r\n\r\n /**\r\n * 获取是否变换子物体\r\n */\r\n get isTransformChildren(): boolean {\r\n return this.config.isTransformChildren\r\n }\r\n\r\n /**\r\n * 设置是否变换子物体\r\n */\r\n set isTransformChildren(value: boolean) {\r\n this.config.isTransformChildren = value\r\n }\r\n\r\n protected onInstall(): void {\r\n // 设置键盘快捷键\r\n if (this.config.enableKeyboard) {\r\n this.enableKeyboard()\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.disableKeyboard()\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: HandlerMode): void {\r\n const previous = this._mode\r\n this._mode = mode\r\n this.events.emit('mode:change', { mode, previous })\r\n }\r\n\r\n /**\r\n * 处理场景点击事件\r\n */\r\n handleClick(event: MouseEvent): ClickInfo | null {\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.getPlugin<ComposerPlugin>('composer')\r\n\r\n if (!transformPlugin || !composerPlugin) return null\r\n\r\n // 分离当前变换控制器\r\n transformPlugin.detach()\r\n\r\n // 获取鼠标位置(使用渲染器的 domElement 计算)\r\n const rect = this.renderer.domElement.getBoundingClientRect()\r\n const mouse = new THREE.Vector2(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n )\r\n\r\n // 射线检测\r\n const intersects = raycastObjects(mouse, this.camera, this.scene.children)\r\n\r\n // 过滤有效交点\r\n const intersect = intersects.find(i => {\r\n const obj = i.object as ExtendedObject3D\r\n const rootObj = getRootModel(i.object)\r\n return (i.object as THREE.Object3D).visible && rootObj.visible\r\n })\r\n\r\n if (!intersect) {\r\n this._currentInfo = null\r\n this.events.emit('click', { event, info: null })\r\n return null\r\n }\r\n\r\n const { object, point } = intersect\r\n const rootModel = getRootModel(object)\r\n\r\n // 根据模式处理\r\n switch (this._mode) {\r\n case '变换':\r\n composerPlugin.clearOutlineObjects()\r\n if (this.config.isTransformChildren) {\r\n transformPlugin.attach(object)\r\n } else {\r\n transformPlugin.attach(rootModel)\r\n }\r\n break\r\n\r\n case '选择':\r\n composerPlugin.setOutlineObjects([object])\r\n break\r\n\r\n case '根选择':\r\n composerPlugin.setOutlineObjects([rootModel])\r\n break\r\n\r\n case '场景绘制':\r\n this.drawEventCallback?.(point, object)\r\n break\r\n\r\n case '点击信息':\r\n // 仅返回信息,不做其他操作\r\n break\r\n }\r\n\r\n // 保存当前信息\r\n this._currentInfo = {\r\n currentModel: object,\r\n currentRootModel: rootModel,\r\n point: point.clone(),\r\n mode: this._mode\r\n }\r\n\r\n this.events.emit('click', { event, info: this._currentInfo })\r\n this.events.emit('object:selected', {\r\n object: this._mode === '选择' ? object : rootModel,\r\n previous: null\r\n })\r\n\r\n return this._currentInfo\r\n }\r\n\r\n /**\r\n * 获取原始射线检测结果\r\n */\r\n getRawRaycast(event: MouseEvent, objects?: THREE.Object3D[]): {\r\n raycaster: THREE.Raycaster\r\n intersects: THREE.Intersection[]\r\n } {\r\n const mouse = getWebGLMouse(event)\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(mouse, this.camera)\r\n\r\n const targetObjects = objects || this.scene.children\r\n const intersects = raycaster.intersectObjects(targetObjects, true)\r\n\r\n return { raycaster, intersects }\r\n }\r\n\r\n /**\r\n * 选择物体\r\n */\r\n select(object: THREE.Object3D | null): void {\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.getPlugin<ComposerPlugin>('composer')\r\n\r\n if (!transformPlugin || !composerPlugin) return\r\n\r\n if (object) {\r\n if (this._mode === '变换') {\r\n transformPlugin.attach(object)\r\n }\r\n composerPlugin.setOutlineObjects([object])\r\n this.events.emit('object:selected', { object, previous: this._currentInfo?.currentModel || null })\r\n } else {\r\n transformPlugin.detach()\r\n composerPlugin.clearOutlineObjects()\r\n this.events.emit('object:deselected', { object: this._currentInfo?.currentModel! })\r\n }\r\n }\r\n\r\n /**\r\n * 取消选择\r\n */\r\n deselect(): void {\r\n this.select(null)\r\n this._currentInfo = null\r\n }\r\n\r\n /**\r\n * 启用键盘快捷键\r\n */\r\n enableKeyboard(): void {\r\n if (this.keydownHandler) return\r\n\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n\r\n this.keydownHandler = (e: KeyboardEvent) => {\r\n if (!transformPlugin) return\r\n\r\n switch (e.key.toLowerCase()) {\r\n case 'w':\r\n transformPlugin.setMode('translate')\r\n break\r\n case 'e':\r\n transformPlugin.setMode('rotate')\r\n break\r\n case 'r':\r\n transformPlugin.setMode('scale')\r\n break\r\n case 'escape':\r\n this.deselect()\r\n break\r\n case 'delete':\r\n case 'backspace':\r\n if (this._currentInfo?.currentRootModel) {\r\n this.scene.remove(this._currentInfo.currentRootModel)\r\n this.deselect()\r\n }\r\n break\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', this.keydownHandler)\r\n this.config.enableKeyboard = true\r\n }\r\n\r\n /**\r\n * 禁用键盘快捷键\r\n */\r\n disableKeyboard(): void {\r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler)\r\n this.keydownHandler = null\r\n }\r\n this.config.enableKeyboard = false\r\n }\r\n\r\n /**\r\n * 获取插件\r\n */\r\n private getPlugin<T>(name: string): T | undefined {\r\n return this.pluginManager?.get(name) as T | undefined\r\n }\r\n}\r\n","/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"<div id=\\\"dg-save\\\" class=\\\"dg dialogue\\\">\\n\\n Here's the new load parameter for your <code>GUI</code>'s constructor:\\n\\n <textarea id=\\\"dg-new-constructor\\\"></textarea>\\n\\n <div id=\\\"dg-save-locally\\\">\\n\\n <input id=\\\"dg-local-storage\\\" type=\\\"checkbox\\\"/> Automatically save\\n values to <code>localStorage</code> on exit.\\n\\n <div id=\\\"dg-local-explain\\\">The values saved to <code>localStorage</code> will\\n override those passed to <code>dat.GUI</code>'s constructor. This makes it\\n easier to work incrementally, but <code>localStorage</code> is fragile,\\n and your friends may not see the same values you do.\\n\\n </div>\\n\\n </div>\\n\\n</div>\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","import * as THREE from 'three'\r\nimport { GUI } from 'dat.gui'\r\nimport { Plugin } from '../Plugin'\r\nimport type { OrbitControllerPlugin } from '../controls/OrbitController'\r\nimport type { TransformControllerPlugin } from '../controls/TransformController'\r\nimport type { ComposerPlugin } from '../postprocessing/ComposerPlugin'\r\n\r\n/**\r\n * GUI 插件配置\r\n */\r\nexport interface GUIPluginConfig {\r\n /** 是否自动挂载 */\r\n autoPlace: boolean\r\n /** 宽度 */\r\n width: number\r\n /** 是否使用代理(空对象) */\r\n useProxy: boolean\r\n /** 是否默认关闭所有文件夹 */\r\n closed: boolean\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_GUI_CONFIG: GUIPluginConfig = {\r\n autoPlace: true,\r\n width: 300,\r\n useProxy: false,\r\n closed: false\r\n}\r\n\r\n/**\r\n * 几何体类型列表\r\n */\r\nexport const geometryList = ['立方体', '球体', '圆柱体', '圆锥体', '圆环', '平面', '圆环结', '十二面体', '二十面体', '八面体', '四面体']\r\n\r\n/**\r\n * 材质类型列表\r\n */\r\nexport const materialList = ['基础材质', '标准材质', 'Lambert材质', 'Phong材质', '物理材质', 'Toon材质']\r\n\r\n/**\r\n * 光源类型列表\r\n */\r\nexport const lightTypeList = ['AmbientLight', 'DirectionalLight', 'PointLight', 'SpotLight', 'HemisphereLight', 'RectAreaLight']\r\n\r\n/**\r\n * 绘制模式列表\r\n */\r\nexport const drawModeList = ['围栏物体', '平面绘制', '曲线路径', '直线路径']\r\n\r\n/**\r\n * 点模式列表\r\n */\r\nexport const pointModeList = ['场景交点', '地图区域中心', '地图行政中心']\r\n\r\n/**\r\n * GUI 插件\r\n * 提供 dat.gui 配置面板功能,完整迁移原有所有功能\r\n */\r\nexport class GUIPlugin extends Plugin<GUIPluginConfig> {\r\n readonly name = 'gui'\r\n\r\n /** dat.gui 实例 */\r\n private _gui: GUI | null = null\r\n\r\n /** 场景配置文件夹 */\r\n private sceneFolder: GUI | null = null\r\n\r\n /** 控制配置文件夹 */\r\n private controlFolder: GUI | null = null\r\n\r\n /** 3D物体文件夹 */\r\n private meshFolder: GUI | null = null\r\n\r\n /** 动画配置文件夹 */\r\n private animationFolder: GUI | null = null\r\n\r\n /** 选择面板 */\r\n selectPanel: GUI | null = null\r\n\r\n /** 模型列表文件夹 */\r\n private modelListFolder: GUI | null = null\r\n\r\n /** 内置物体列表文件夹 */\r\n private innerMeshListFolder: GUI | null = null\r\n\r\n /** 绘制物体列表文件夹 */\r\n private drawMeshListFolder: GUI | null = null\r\n\r\n /** 地图列表文件夹 */\r\n private geoMapListFolder: GUI | null = null\r\n\r\n /** 粒子列表文件夹 */\r\n private particleListFolder: GUI | null = null\r\n\r\n /** 边界物体列表文件夹 */\r\n private borderGroupListFolder: GUI | null = null\r\n\r\n /** 文本物体列表文件夹 */\r\n private textMeshListFolder: GUI | null = null\r\n\r\n /** 设计物体列表文件夹 */\r\n private designMeshListFolder: GUI | null = null\r\n\r\n /** 灯光列表文件夹 */\r\n private lightListFolder: GUI | null = null\r\n\r\n /** 控制参数 */\r\n private handlerParams = {\r\n mode: '变换',\r\n isTransformChildren: false,\r\n openKey: false\r\n }\r\n\r\n /** 内置物体控制参数 */\r\n private innerMeshParams = {\r\n geometryType: '立方体',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 绘制控制参数 */\r\n private drawParams = {\r\n mode: '围栏物体',\r\n pointMode: '场景交点',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 地图控制参数 */\r\n private geoMapParams = {\r\n url: '',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 粒子控制参数 */\r\n private particleParams = {\r\n particlesSum: 100000,\r\n inner: 0,\r\n outer: 2000,\r\n maxVelocity: 50,\r\n mapUrl: 'https://z2586300277.github.io/three-editor/dist/files/channels/snow.png',\r\n sportType: '全随机',\r\n shaderCodeName: '水波纹'\r\n }\r\n\r\n /** 边界物体控制参数 */\r\n private borderGroupParams = {\r\n url: 'https://geo.datav.aliyun.com/areas_v3/bound/100000.json',\r\n materialType: '基础材质',\r\n dlength: 0\r\n }\r\n\r\n /** 文本物体控制参数 */\r\n private textMeshParams = {\r\n fontLink: 'https://z2586300277.github.io/three-editor/dist/files/font/cn1.json',\r\n text: '',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 设计物体控制参数 */\r\n private designMeshParams = {\r\n type: '镜面'\r\n }\r\n\r\n /** 灯光控制参数 */\r\n private lightParams = {\r\n lightType: 'AmbientLight'\r\n }\r\n\r\n constructor(config?: Partial<GUIPluginConfig>) {\r\n super({ ...DEFAULT_GUI_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n this.createGUI()\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.destroy()\r\n }\r\n\r\n /**\r\n * 获取 GUI 实例\r\n */\r\n get gui(): GUI | null {\r\n return this._gui\r\n }\r\n\r\n /**\r\n * 获取 GUI DOM 元素\r\n */\r\n get domElement(): HTMLElement | null {\r\n return this._gui?.domElement ?? null\r\n }\r\n\r\n /**\r\n * 创建 GUI\r\n */\r\n private createGUI(): void {\r\n if (this.config.useProxy) {\r\n return\r\n }\r\n\r\n this._gui = new GUI({\r\n autoPlace: this.config.autoPlace,\r\n width: this.config.width\r\n })\r\n\r\n // 创建场景配置\r\n this.createSceneFolder()\r\n\r\n // 创建控制配置\r\n this.createControlFolder()\r\n\r\n // 创建 3D 物体配置\r\n this.createMeshFolder()\r\n\r\n // 创建动画配置\r\n this.createAnimationFolder()\r\n }\r\n\r\n /**\r\n * 创建场景配置文件夹\r\n */\r\n private createSceneFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.sceneFolder = this._gui.addFolder('场景配置')\r\n\r\n // 渲染器配置\r\n this.createRendererFolder()\r\n\r\n // 相机配置\r\n this.createCameraFolder()\r\n\r\n // 轨道控制配置\r\n this.createOrbitControlsFolder()\r\n\r\n // 环境配置\r\n this.createEnvironmentFolder()\r\n\r\n // 灯光配置\r\n this.createLightGroupFolder()\r\n\r\n // 后期处理配置\r\n this.createComposerFolder()\r\n\r\n if (!this.config.closed) {\r\n this.sceneFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建渲染器配置\r\n */\r\n private createRendererFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('渲染器配置')\r\n const renderer = this.renderer\r\n\r\n const params = {\r\n toneMapping: renderer.toneMapping,\r\n toneMappingExposure: renderer.toneMappingExposure,\r\n shadowMapEnabled: renderer.shadowMap.enabled,\r\n shadowMapType: renderer.shadowMap.type,\r\n pixelRatio: renderer.getPixelRatio(),\r\n outputColorSpace: renderer.outputColorSpace\r\n }\r\n\r\n folder.add(params, 'toneMapping', {\r\n '无': THREE.NoToneMapping,\r\n '线性': THREE.LinearToneMapping,\r\n 'Reinhard': THREE.ReinhardToneMapping,\r\n 'Cineon': THREE.CineonToneMapping,\r\n 'ACESFilmic': THREE.ACESFilmicToneMapping\r\n }).name('色调映射').onChange((v: number) => {\r\n renderer.toneMapping = v as THREE.ToneMapping\r\n })\r\n\r\n folder.add(params, 'toneMappingExposure', 0, 3, 0.1).name('曝光度').onChange((v: number) => {\r\n renderer.toneMappingExposure = v\r\n })\r\n\r\n folder.add(params, 'shadowMapEnabled').name('阴影').onChange((v: boolean) => {\r\n renderer.shadowMap.enabled = v\r\n })\r\n\r\n folder.add(params, 'pixelRatio', 0.5, 3, 0.1).name('像素比').onChange((v: number) => {\r\n renderer.setPixelRatio(v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建相机配置\r\n */\r\n private createCameraFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('相机配置')\r\n const camera = this.camera\r\n\r\n folder.add(camera, 'fov', 10, 120, 1).name('视角').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n folder.add(camera, 'near', 0.01, 100, 0.01).name('近裁剪面').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n folder.add(camera, 'far', 100, 100000, 100).name('远裁剪面').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n // 位置\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(camera.position, 'x', -1000, 1000, 1).listen()\r\n posFolder.add(camera.position, 'y', -1000, 1000, 1).listen()\r\n posFolder.add(camera.position, 'z', -1000, 1000, 1).listen()\r\n }\r\n\r\n /**\r\n * 创建轨道控制配置\r\n */\r\n private createOrbitControlsFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const orbitController = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n\r\n if (!orbitController?.controls) return\r\n\r\n const folder = this.sceneFolder.addFolder('轨道控制')\r\n const controls = orbitController.controls\r\n\r\n folder.add(controls, 'enableDamping').name('阻尼')\r\n folder.add(controls, 'dampingFactor', 0, 1, 0.01).name('阻尼系数')\r\n folder.add(controls, 'enableZoom').name('缩放')\r\n folder.add(controls, 'enableRotate').name('旋转')\r\n folder.add(controls, 'enablePan').name('平移')\r\n folder.add(controls, 'autoRotate').name('自动旋转')\r\n folder.add(controls, 'autoRotateSpeed', 0, 10, 0.1).name('旋转速度')\r\n folder.add(controls, 'minDistance', 0, 1000, 1).name('最小距离')\r\n folder.add(controls, 'maxDistance', 0, 10000, 10).name('最大距离')\r\n folder.add(controls, 'maxPolarAngle', 0, Math.PI, 0.01).name('最大极角')\r\n }\r\n\r\n /**\r\n * 创建环境配置\r\n */\r\n private createEnvironmentFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('环境配置')\r\n const scene = this.scene\r\n\r\n // 雾配置\r\n const fogFolder = folder.addFolder('雾配置')\r\n const fogParams = {\r\n enabled: !!scene.fog,\r\n color: scene.fog ? '#' + (scene.fog as THREE.Fog).color.getHexString() : '#cccccc',\r\n near: (scene.fog as THREE.Fog)?.near ?? 1,\r\n far: (scene.fog as THREE.Fog)?.far ?? 1000\r\n }\r\n\r\n fogFolder.add(fogParams, 'enabled').name('启用').onChange((v: boolean) => {\r\n if (v) {\r\n scene.fog = new THREE.Fog(fogParams.color, fogParams.near, fogParams.far)\r\n } else {\r\n scene.fog = null\r\n }\r\n })\r\n\r\n fogFolder.addColor(fogParams, 'color').name('颜色').onChange((v: string) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).color.set(v)\r\n }\r\n })\r\n\r\n fogFolder.add(fogParams, 'near', 0, 1000, 1).name('近距离').onChange((v: number) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).near = v\r\n }\r\n })\r\n\r\n fogFolder.add(fogParams, 'far', 0, 10000, 10).name('远距离').onChange((v: number) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).far = v\r\n }\r\n })\r\n\r\n // 背景配置\r\n const bgParams = {\r\n color: '#000000'\r\n }\r\n\r\n folder.addColor(bgParams, 'color').name('背景颜色').onChange((v: string) => {\r\n scene.background = new THREE.Color(v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建灯光配置文件夹\r\n */\r\n private createLightGroupFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('灯光配置')\r\n this.lightListFolder = folder.addFolder('灯光列表')\r\n\r\n folder.add(this.lightParams, 'lightType', lightTypeList).name('光源类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n const light = this.createLight(this.lightParams.lightType)\r\n this.scene.add(light)\r\n this.addLightPanel(light)\r\n this.events.emit('light:add' as any, { light })\r\n }\r\n }, 'fn').name('添加光源')\r\n\r\n // 添加已有灯光\r\n this.scene.children.forEach(child => {\r\n if (child instanceof THREE.Light) {\r\n this.addLightPanel(child)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 创建灯光\r\n */\r\n private createLight(type: string): THREE.Light {\r\n switch (type) {\r\n case 'AmbientLight':\r\n return new THREE.AmbientLight(0xffffff, 0.5)\r\n case 'DirectionalLight':\r\n const dirLight = new THREE.DirectionalLight(0xffffff, 1)\r\n dirLight.position.set(5, 10, 5)\r\n dirLight.castShadow = true\r\n return dirLight\r\n case 'PointLight':\r\n const pointLight = new THREE.PointLight(0xffffff, 1, 100)\r\n pointLight.position.set(0, 5, 0)\r\n return pointLight\r\n case 'SpotLight':\r\n const spotLight = new THREE.SpotLight(0xffffff, 1)\r\n spotLight.position.set(0, 10, 0)\r\n spotLight.castShadow = true\r\n return spotLight\r\n case 'HemisphereLight':\r\n return new THREE.HemisphereLight(0xffffff, 0x444444, 1)\r\n case 'RectAreaLight':\r\n const rectLight = new THREE.RectAreaLight(0xffffff, 1, 10, 10)\r\n rectLight.position.set(0, 5, 0)\r\n return rectLight\r\n default:\r\n return new THREE.AmbientLight(0xffffff, 0.5)\r\n }\r\n }\r\n\r\n /**\r\n * 添加灯光面板\r\n */\r\n private addLightPanel(light: THREE.Light): void {\r\n if (!this.lightListFolder) return\r\n\r\n const folder = this.lightListFolder.addFolder(light.type + light.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n // 颜色\r\n const colorParams = { color: '#' + light.color.getHexString() }\r\n folder.addColor(colorParams, 'color').name('颜色').onChange((v: string) => {\r\n light.color.set(v)\r\n })\r\n\r\n // 强度\r\n folder.add(light, 'intensity', 0, 10, 0.1).name('强度')\r\n\r\n // 位置(非环境光)\r\n if (!(light instanceof THREE.AmbientLight) && !(light instanceof THREE.HemisphereLight)) {\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(light.position, 'x', -100, 100, 0.1).listen()\r\n posFolder.add(light.position, 'y', -100, 100, 0.1).listen()\r\n posFolder.add(light.position, 'z', -100, 100, 0.1).listen()\r\n }\r\n\r\n // 阴影\r\n if ((light as any).castShadow !== undefined) {\r\n folder.add(light, 'castShadow').name('投射阴影')\r\n }\r\n\r\n // 选中\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(light)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n // 删除\r\n folder.add({\r\n fn: () => {\r\n light.parent?.remove(light)\r\n this.lightListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建后期处理配置\r\n */\r\n private createComposerFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const composerPlugin = this.pluginManager?.get('composer') as ComposerPlugin | undefined\r\n\r\n if (!composerPlugin) return\r\n\r\n const folder = this.sceneFolder.addFolder('后期处理')\r\n\r\n // 轮廓光\r\n const outlineFolder = folder.addFolder('轮廓光')\r\n const outlinePass = composerPlugin.outlinePass\r\n if (outlinePass) {\r\n outlineFolder.add(outlinePass, 'enabled').name('启用')\r\n outlineFolder.add(outlinePass, 'edgeStrength', 0, 10, 0.1).name('边缘强度')\r\n outlineFolder.add(outlinePass, 'edgeGlow', 0, 5, 0.1).name('边缘发光')\r\n outlineFolder.add(outlinePass, 'edgeThickness', 0, 5, 0.1).name('边缘厚度')\r\n outlineFolder.add(outlinePass, 'pulsePeriod', 0, 5, 0.1).name('脉冲周期')\r\n \r\n const colorParams = {\r\n visibleEdgeColor: '#' + outlinePass.visibleEdgeColor.getHexString(),\r\n hiddenEdgeColor: '#' + outlinePass.hiddenEdgeColor.getHexString()\r\n }\r\n outlineFolder.addColor(colorParams, 'visibleEdgeColor').name('可见边缘颜色').onChange((v: string) => {\r\n outlinePass.visibleEdgeColor.set(v)\r\n })\r\n outlineFolder.addColor(colorParams, 'hiddenEdgeColor').name('隐藏边缘颜色').onChange((v: string) => {\r\n outlinePass.hiddenEdgeColor.set(v)\r\n })\r\n }\r\n\r\n // 泛光\r\n const bloomFolder = folder.addFolder('泛光')\r\n const bloomPass = composerPlugin.bloomPass\r\n if (bloomPass) {\r\n bloomFolder.add(bloomPass, 'enabled').name('启用')\r\n bloomFolder.add(bloomPass, 'strength', 0, 3, 0.1).name('强度')\r\n bloomFolder.add(bloomPass, 'radius', 0, 1, 0.01).name('半径')\r\n bloomFolder.add(bloomPass, 'threshold', 0, 1, 0.01).name('阈值')\r\n }\r\n }\r\n\r\n /**\r\n * 创建控制配置文件夹\r\n */\r\n private createControlFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.controlFolder = this._gui.addFolder('控制配置')\r\n\r\n this.controlFolder.add(this.handlerParams, 'mode', ['选择', '根选择', '变换', '场景绘制', '点击信息'])\r\n .name('模式')\r\n .listen()\r\n .onChange((v: string) => {\r\n this.events.emit('mode:change' as any, { mode: v })\r\n })\r\n\r\n this.controlFolder.add(this.handlerParams, 'isTransformChildren').name('子变换').listen()\r\n this.controlFolder.add(this.handlerParams, 'openKey').name('开启按键').listen().onChange((v: boolean) => {\r\n this.events.emit('keyboard:toggle' as any, { enabled: v })\r\n })\r\n\r\n // 同步控制\r\n this.createSyncTransformFolder()\r\n\r\n // 性能监控\r\n this.createStatsFolder()\r\n\r\n // 辅助工具配置\r\n this.createHelpersFolder()\r\n\r\n // 变换控制器配置\r\n this.createTransformControlsFolder()\r\n\r\n if (!this.config.closed) {\r\n this.controlFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建同步控制文件夹\r\n */\r\n private createSyncTransformFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('同步控制')\r\n const params = {\r\n syncPosition: false,\r\n syncRotation: false,\r\n syncScale: false\r\n }\r\n\r\n folder.add(params, 'syncPosition').name('同步位置')\r\n folder.add(params, 'syncRotation').name('同步旋转')\r\n folder.add(params, 'syncScale').name('同步缩放')\r\n }\r\n\r\n /**\r\n * 创建性能监控文件夹\r\n */\r\n private createStatsFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('性能监控')\r\n const params = {\r\n showStats: false,\r\n statsMode: 0\r\n }\r\n\r\n folder.add(params, 'showStats').name('显示性能').onChange((v: boolean) => {\r\n this.events.emit('stats:toggle' as any, { enabled: v })\r\n })\r\n\r\n folder.add(params, 'statsMode', { 'FPS': 0, 'MS': 1, 'MB': 2 }).name('模式').onChange((v: number) => {\r\n this.events.emit('stats:mode' as any, { mode: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建辅助工具配置\r\n */\r\n private createHelpersFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('辅助工具')\r\n\r\n const params = {\r\n showGrid: true,\r\n showAxes: true,\r\n gridSize: 100,\r\n gridDivisions: 100,\r\n axesSize: 5\r\n }\r\n\r\n folder.add(params, 'showGrid').name('显示网格').onChange((v: boolean) => {\r\n this.events.emit('helper:grid' as any, { enabled: v, size: params.gridSize, divisions: params.gridDivisions })\r\n })\r\n\r\n folder.add(params, 'gridSize', 10, 500, 10).name('网格大小').onChange((v: number) => {\r\n this.events.emit('helper:grid' as any, { enabled: params.showGrid, size: v, divisions: params.gridDivisions })\r\n })\r\n\r\n folder.add(params, 'gridDivisions', 10, 200, 10).name('网格分割').onChange((v: number) => {\r\n this.events.emit('helper:grid' as any, { enabled: params.showGrid, size: params.gridSize, divisions: v })\r\n })\r\n\r\n folder.add(params, 'showAxes').name('显示坐标轴').onChange((v: boolean) => {\r\n this.events.emit('helper:axes' as any, { enabled: v, size: params.axesSize })\r\n })\r\n\r\n folder.add(params, 'axesSize', 1, 50, 1).name('坐标轴大小').onChange((v: number) => {\r\n this.events.emit('helper:axes' as any, { enabled: params.showAxes, size: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建变换控制器配置\r\n */\r\n private createTransformControlsFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n if (!transformPlugin?.controls) return\r\n\r\n const folder = this.controlFolder.addFolder('变换控制器配置')\r\n const controls = transformPlugin.controls\r\n\r\n folder.add(controls, 'mode', ['translate', 'rotate', 'scale']).name('模式')\r\n folder.add(controls, 'space', ['world', 'local']).name('空间')\r\n folder.add(controls, 'size', 0.1, 5, 0.1).name('大小')\r\n folder.add(controls, 'showX').name('显示X轴')\r\n folder.add(controls, 'showY').name('显示Y轴')\r\n folder.add(controls, 'showZ').name('显示Z轴')\r\n \r\n // 使用代理对象来处理可能为 null 的 snap 值\r\n const snapParams = {\r\n translationSnap: controls.translationSnap ?? 0,\r\n rotationSnap: controls.rotationSnap ?? 0\r\n }\r\n \r\n folder.add(snapParams, 'translationSnap', 0, 10, 0.1).name('平移吸附').onChange((v: number) => {\r\n controls.setTranslationSnap(v === 0 ? null : v)\r\n })\r\n folder.add(snapParams, 'rotationSnap', 0, Math.PI / 4, 0.01).name('旋转吸附').onChange((v: number) => {\r\n controls.setRotationSnap(v === 0 ? null : v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建 3D 物体配置文件夹\r\n */\r\n private createMeshFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.meshFolder = this._gui.addFolder('3D物体')\r\n\r\n // 模型配置\r\n this.createModelFolder()\r\n\r\n // 绘制配置\r\n this.createDrawFolder()\r\n\r\n // 内置物体\r\n this.createInnerMeshFolder()\r\n\r\n // 三维地图\r\n this.createGeoMapFolder()\r\n\r\n // 粒子物体\r\n this.createParticleFolder()\r\n\r\n // 边界物体\r\n this.createBorderGroupFolder()\r\n\r\n // 文本物体\r\n this.createTextMeshFolder()\r\n\r\n // 设计物体\r\n this.createDesignMeshFolder()\r\n\r\n if (!this.config.closed) {\r\n this.meshFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建模型配置\r\n */\r\n private createModelFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('模型配置')\r\n this.modelListFolder = folder.addFolder('已有列表')\r\n\r\n const params = {\r\n dracoPath: '/draco/',\r\n loadGLTF: () => {\r\n this.openFileDialog('.glb,.gltf', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'GLTF' })\r\n })\r\n },\r\n loadFBX: () => {\r\n this.openFileDialog('.fbx', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'FBX' })\r\n })\r\n },\r\n loadOBJ: () => {\r\n this.openFileDialog('.obj', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'OBJ' })\r\n })\r\n }\r\n }\r\n\r\n folder.add(params, 'dracoPath').name('Draco路径')\r\n folder.add(params, 'loadGLTF').name('加载GLTF')\r\n folder.add(params, 'loadFBX').name('加载FBX')\r\n folder.add(params, 'loadOBJ').name('加载OBJ')\r\n }\r\n\r\n /**\r\n * 添加模型到列表面板\r\n */\r\n addModelPanel(model: THREE.Object3D): void {\r\n if (!this.modelListFolder) return\r\n\r\n const folder = this.modelListFolder.addFolder(model.name + model.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n const orbitPlugin = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n const composerPlugin = this.pluginManager?.get('composer') as ComposerPlugin | undefined\r\n\r\n // 物体控制\r\n this.addMeshControlPanel(model, folder.addFolder('物体控制'))\r\n\r\n // 全局和子项控制\r\n this.addGroupGlobalPanel(model, folder.addFolder('全局和子项控制'))\r\n\r\n // 动画配置(如果有动画)\r\n if ((model as any).animations?.length > 0) {\r\n this.addGroupAnimationPanel(model, folder.addFolder('动画配置'))\r\n }\r\n\r\n // 选中\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(model)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n // 定位物体\r\n folder.add({\r\n fn: () => {\r\n if (orbitPlugin?.controls) {\r\n const box = new THREE.Box3().setFromObject(model)\r\n const center = box.getCenter(new THREE.Vector3())\r\n const size = box.getSize(new THREE.Vector3())\r\n const maxDim = Math.max(size.x, size.y, size.z)\r\n const distance = maxDim * 2\r\n\r\n orbitPlugin.controls.target.copy(center)\r\n this.camera.position.copy(center).add(new THREE.Vector3(distance, distance, distance))\r\n }\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(model)\r\n }\r\n if (composerPlugin) {\r\n composerPlugin.setOutlineObjects([model])\r\n }\r\n }\r\n }, 'fn').name('定位物体')\r\n\r\n // 删除\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n model.parent?.remove(model)\r\n this.modelListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 添加物体控制面板\r\n */\r\n private addMeshControlPanel(mesh: THREE.Object3D, folder: GUI): void {\r\n // 可见性\r\n folder.add(mesh, 'visible').name('可见')\r\n\r\n // 位置\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(mesh.position, 'x', -1000, 1000, 0.1).listen()\r\n posFolder.add(mesh.position, 'y', -1000, 1000, 0.1).listen()\r\n posFolder.add(mesh.position, 'z', -1000, 1000, 0.1).listen()\r\n\r\n // 旋转\r\n const rotFolder = folder.addFolder('旋转')\r\n rotFolder.add(mesh.rotation, 'x', -Math.PI, Math.PI, 0.01).listen()\r\n rotFolder.add(mesh.rotation, 'y', -Math.PI, Math.PI, 0.01).listen()\r\n rotFolder.add(mesh.rotation, 'z', -Math.PI, Math.PI, 0.01).listen()\r\n\r\n // 缩放\r\n const scaleFolder = folder.addFolder('缩放')\r\n scaleFolder.add(mesh.scale, 'x', 0.01, 10, 0.01).listen()\r\n scaleFolder.add(mesh.scale, 'y', 0.01, 10, 0.01).listen()\r\n scaleFolder.add(mesh.scale, 'z', 0.01, 10, 0.01).listen()\r\n\r\n // 统一缩放\r\n const uniformScale = { scale: 1 }\r\n scaleFolder.add(uniformScale, 'scale', 0.01, 10, 0.01).name('统一缩放').onChange((v: number) => {\r\n mesh.scale.set(v, v, v)\r\n })\r\n\r\n // 阴影(如果是 Mesh)\r\n if ((mesh as THREE.Mesh).isMesh) {\r\n folder.add(mesh, 'castShadow').name('投射阴影')\r\n folder.add(mesh, 'receiveShadow').name('接收阴影')\r\n }\r\n }\r\n\r\n /**\r\n * 添加全局和子项控制面板\r\n */\r\n private addGroupGlobalPanel(group: THREE.Object3D, folder: GUI): void {\r\n const globalConfig = (group as any).globalConfig || {\r\n useGlobalConfig: false,\r\n isSaveChildren: true,\r\n isSaveMaterials: true,\r\n mesh: { castShadow: false, receiveShadow: false },\r\n material: { envMap: false, envMapIntensity: 1, reflectivity: 0.98 }\r\n }\r\n ;(group as any).globalConfig = globalConfig\r\n\r\n folder.add(globalConfig, 'useGlobalConfig').name('使用全局配置')\r\n folder.add(globalConfig, 'isSaveChildren').name('保存子项')\r\n folder.add(globalConfig, 'isSaveMaterials').name('保存材质')\r\n\r\n // 网格配置\r\n const meshFolder = folder.addFolder('网格配置')\r\n meshFolder.add(globalConfig.mesh, 'castShadow').name('投射阴影').onChange((v: boolean) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.castShadow = v\r\n }\r\n })\r\n }\r\n })\r\n meshFolder.add(globalConfig.mesh, 'receiveShadow').name('接收阴影').onChange((v: boolean) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.receiveShadow = v\r\n }\r\n })\r\n }\r\n })\r\n\r\n // 材质配置\r\n const matFolder = folder.addFolder('材质配置')\r\n matFolder.add(globalConfig.material, 'envMapIntensity', 0, 5, 0.1).name('环境贴图强度').onChange((v: number) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const materials = Array.isArray((child as THREE.Mesh).material) \r\n ? (child as THREE.Mesh).material as THREE.Material[]\r\n : [(child as THREE.Mesh).material as THREE.Material]\r\n materials.forEach(mat => {\r\n if ((mat as any).envMapIntensity !== undefined) {\r\n (mat as any).envMapIntensity = v\r\n }\r\n })\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 添加组动画面板\r\n */\r\n private addGroupAnimationPanel(group: THREE.Object3D, folder: GUI): void {\r\n const animations = (group as any).animations as THREE.AnimationClip[]\r\n if (!animations || animations.length === 0) return\r\n\r\n const animParams = (group as any).animationPlayParams || {\r\n initPlay: false,\r\n speed: 0.5,\r\n actionIndexs: new Array(animations.length).fill(false),\r\n startTime: 0,\r\n loop: false\r\n }\r\n ;(group as any).animationPlayParams = animParams\r\n\r\n folder.add(animParams, 'initPlay').name('初始播放')\r\n folder.add(animParams, 'speed', 0, 2, 0.1).name('速度')\r\n folder.add(animParams, 'startTime', 0, 10, 0.1).name('开始时间')\r\n folder.add(animParams, 'loop').name('循环')\r\n\r\n // 动画列表\r\n const listFolder = folder.addFolder('动画列表')\r\n animations.forEach((clip, index) => {\r\n listFolder.add(animParams.actionIndexs, index.toString()).name(clip.name || `动画${index}`)\r\n })\r\n\r\n // 播放控制\r\n folder.add({\r\n play: () => {\r\n this.events.emit('animation:play' as any, { group, params: animParams })\r\n }\r\n }, 'play').name('播放')\r\n\r\n folder.add({\r\n stop: () => {\r\n this.events.emit('animation:stop' as any, { group })\r\n }\r\n }, 'stop').name('停止')\r\n }\r\n\r\n /**\r\n * 创建绘制配置\r\n */\r\n private createDrawFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('绘制配置')\r\n this.drawMeshListFolder = folder.addFolder('已有列表')\r\n\r\n folder.add(this.drawParams, 'mode', drawModeList).name('绘制模式')\r\n folder.add(this.drawParams, 'pointMode', pointModeList).name('点模式')\r\n folder.add(this.drawParams, 'materialType', materialList).name('材质')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('draw:start' as any, {\r\n mode: this.drawParams.mode,\r\n pointMode: this.drawParams.pointMode,\r\n materialType: this.drawParams.materialType\r\n })\r\n }\r\n }, 'fn').name('添加绘制组')\r\n }\r\n\r\n /**\r\n * 添加绘制物体到列表面板\r\n */\r\n addDrawMeshPanel(mesh: THREE.Object3D): void {\r\n if (!this.drawMeshListFolder) return\r\n\r\n const folder = this.drawMeshListFolder.addFolder(mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.drawMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建内置物体配置\r\n */\r\n private createInnerMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('内置物体')\r\n this.innerMeshListFolder = folder.addFolder('已有列表')\r\n\r\n folder.add(this.innerMeshParams, 'geometryType', geometryList).name('几何体')\r\n folder.add(this.innerMeshParams, 'materialType', materialList).name('材质')\r\n\r\n folder.add({\r\n fn: () => {\r\n const geometry = this.createGeometry(this.innerMeshParams.geometryType)\r\n const material = this.createMaterial(this.innerMeshParams.materialType)\r\n const mesh = new THREE.Mesh(geometry, material)\r\n ;(mesh as any).isInnerMesh = true\r\n ;(mesh as any).geometryType = this.innerMeshParams.geometryType\r\n ;(mesh as any).materialType = this.innerMeshParams.materialType\r\n \r\n this.scene.add(mesh)\r\n this.addInnerMeshPanel(mesh)\r\n \r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n \r\n this.events.emit('innermesh:add' as any, { mesh })\r\n }\r\n }, 'fn').name('添加')\r\n }\r\n\r\n /**\r\n * 添加内置物体到列表面板\r\n */\r\n addInnerMeshPanel(mesh: THREE.Mesh): void {\r\n if (!this.innerMeshListFolder) return\r\n\r\n const geoType = (mesh as any).geometryType || '立方体'\r\n const folder = this.innerMeshListFolder.addFolder(geoType + ':' + mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n this.addMaterialPanel(mesh.material as THREE.Material, folder.addFolder('材质配置'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.innerMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 添加材质面板\r\n */\r\n private addMaterialPanel(material: THREE.Material, folder: GUI): void {\r\n if (!material) return\r\n\r\n // 颜色\r\n if ((material as any).color) {\r\n const colorParams = { color: '#' + (material as any).color.getHexString() }\r\n folder.addColor(colorParams, 'color').name('颜色').onChange((v: string) => {\r\n (material as any).color.set(v)\r\n })\r\n }\r\n\r\n // 发光颜色\r\n if ((material as any).emissive) {\r\n const emissiveParams = { emissive: '#' + (material as any).emissive.getHexString() }\r\n folder.addColor(emissiveParams, 'emissive').name('发光颜色').onChange((v: string) => {\r\n (material as any).emissive.set(v)\r\n })\r\n folder.add(material as any, 'emissiveIntensity', 0, 5, 0.1).name('发光强度')\r\n }\r\n\r\n // 透明度\r\n folder.add(material, 'transparent').name('透明')\r\n folder.add(material, 'opacity', 0, 1, 0.01).name('透明度')\r\n\r\n // 双面渲染\r\n folder.add(material, 'side', { '正面': THREE.FrontSide, '背面': THREE.BackSide, '双面': THREE.DoubleSide }).name('渲染面')\r\n\r\n // 线框\r\n if ((material as any).wireframe !== undefined) {\r\n folder.add(material as any, 'wireframe').name('线框')\r\n }\r\n\r\n // 金属度和粗糙度(标准材质)\r\n if ((material as any).metalness !== undefined) {\r\n folder.add(material as any, 'metalness', 0, 1, 0.01).name('金属度')\r\n }\r\n if ((material as any).roughness !== undefined) {\r\n folder.add(material as any, 'roughness', 0, 1, 0.01).name('粗糙度')\r\n }\r\n\r\n // 环境贴图强度\r\n if ((material as any).envMapIntensity !== undefined) {\r\n folder.add(material as any, 'envMapIntensity', 0, 5, 0.1).name('环境贴图强度')\r\n }\r\n }\r\n\r\n /**\r\n * 创建三维地图配置\r\n */\r\n private createGeoMapFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('三维地图')\r\n this.geoMapListFolder = folder.addFolder('地图列表')\r\n\r\n folder.add(this.geoMapParams, 'url').name('地图数据地址')\r\n folder.add(this.geoMapParams, 'materialType', materialList).name('地图材质类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n const url = this.geoMapParams.url || 'https://z2586300277.github.io/3d-file-server/files/json/guangdong.json'\r\n this.events.emit('geomap:load' as any, {\r\n url,\r\n materialType: this.geoMapParams.materialType\r\n })\r\n }\r\n }, 'fn').name('添加地图')\r\n }\r\n\r\n /**\r\n * 添加地图到列表面板\r\n */\r\n addGeoMapPanel(group: THREE.Object3D): void {\r\n if (!this.geoMapListFolder) return\r\n\r\n const folder = this.geoMapListFolder.addFolder(group.name + group.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(group, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(group)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n group.parent?.remove(group)\r\n this.geoMapListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建粒子物体配置\r\n */\r\n private createParticleFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('粒子物体')\r\n this.particleListFolder = folder.addFolder('粒子列表')\r\n\r\n const initFolder = folder.addFolder('初始化参数')\r\n initFolder.add(this.particleParams, 'particlesSum').name('数量')\r\n initFolder.add(this.particleParams, 'inner').name('内半径')\r\n initFolder.add(this.particleParams, 'outer').name('外半径')\r\n initFolder.add(this.particleParams, 'maxVelocity').name('最大速度')\r\n initFolder.add(this.particleParams, 'mapUrl').name('贴图路径')\r\n initFolder.add(this.particleParams, 'shaderCodeName', ['水波纹', '火焰', '烟雾', '雪花', '星空']).name('着色器')\r\n initFolder.add(this.particleParams, 'sportType', ['全随机', '随机向下', '随机向上', '直线匀速向上', '直线匀速向下']).name('运动方式')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('particle:create' as any, { ...this.particleParams })\r\n }\r\n }, 'fn').name('增加一个粒子物体')\r\n }\r\n\r\n /**\r\n * 添加粒子到列表面板\r\n */\r\n addParticlePanel(mesh: THREE.Object3D): void {\r\n if (!this.particleListFolder) return\r\n\r\n const folder = this.particleListFolder.addFolder(mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.particleListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建边界物体配置\r\n */\r\n private createBorderGroupFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('边界物体')\r\n this.borderGroupListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.borderGroupParams, 'url').name('边界物体数据源')\r\n folder.add(this.borderGroupParams, 'materialType', materialList).name('材质类型')\r\n folder.add(this.borderGroupParams, 'dlength', 0).name('低于点数舍弃')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('bordergroup:create' as any, { ...this.borderGroupParams })\r\n }\r\n }, 'fn').name('添加边界物体')\r\n }\r\n\r\n /**\r\n * 添加边界物体到列表面板\r\n */\r\n addBorderGroupPanel(group: THREE.Object3D): void {\r\n if (!this.borderGroupListFolder) return\r\n\r\n const folder = this.borderGroupListFolder.addFolder(group.name + group.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(group, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(group)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n group.parent?.remove(group)\r\n this.borderGroupListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建文本物体配置\r\n */\r\n private createTextMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('文本物体')\r\n this.textMeshListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.textMeshParams, 'fontLink').name('字体链接')\r\n folder.add(this.textMeshParams, 'materialType', materialList).name('材质类型')\r\n folder.add(this.textMeshParams, 'text').name('文本内容')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (!this.textMeshParams.text) return\r\n this.events.emit('textmesh:create' as any, { ...this.textMeshParams })\r\n }\r\n }, 'fn').name('添加文本物体')\r\n }\r\n\r\n /**\r\n * 添加文本物体到列表面板\r\n */\r\n addTextMeshPanel(mesh: THREE.Mesh): void {\r\n if (!this.textMeshListFolder) return\r\n\r\n const text = (mesh as any).text || mesh.name\r\n const folder = this.textMeshListFolder.addFolder(text + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n this.addMaterialPanel(mesh.material as THREE.Material, folder.addFolder('材质配置'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.textMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建设计物体配置\r\n */\r\n private createDesignMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('设计物体')\r\n this.designMeshListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.designMeshParams, 'type', ['镜面', '水面', '玻璃', '发光体']).name('类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('designmesh:create' as any, { type: this.designMeshParams.type })\r\n }\r\n }, 'fn').name('添加')\r\n }\r\n\r\n /**\r\n * 添加设计物体到列表面板\r\n */\r\n addDesignMeshPanel(mesh: THREE.Object3D): void {\r\n if (!this.designMeshListFolder) return\r\n\r\n const folder = this.designMeshListFolder.addFolder(mesh.id + (mesh.name || ''))\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.designMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建动画配置文件夹\r\n */\r\n private createAnimationFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.animationFolder = this._gui.addFolder('动画配置')\r\n\r\n // 视角控制\r\n this.createOrbitAnimationFolder()\r\n\r\n // 物体动画\r\n this.createMeshAnimationFolder()\r\n\r\n // 运动动画\r\n this.createMoveAnimationFolder()\r\n }\r\n\r\n /**\r\n * 创建视角控制动画\r\n */\r\n private createOrbitAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('视角控制')\r\n const orbitPlugin = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n\r\n if (!orbitPlugin?.controls) return\r\n\r\n const controls = orbitPlugin.controls\r\n const params = {\r\n autoRotate: controls.autoRotate,\r\n autoRotateSpeed: controls.autoRotateSpeed,\r\n enableDamping: controls.enableDamping,\r\n dampingFactor: controls.dampingFactor\r\n }\r\n\r\n folder.add(params, 'autoRotate').name('自动旋转').onChange((v: boolean) => {\r\n controls.autoRotate = v\r\n })\r\n\r\n folder.add(params, 'autoRotateSpeed', 0, 10, 0.1).name('旋转速度').onChange((v: number) => {\r\n controls.autoRotateSpeed = v\r\n })\r\n\r\n // 视角预设\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'front' })\r\n }\r\n }, 'fn').name('正视图')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'top' })\r\n }\r\n }, 'fn').name('俯视图')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'side' })\r\n }\r\n }, 'fn').name('侧视图')\r\n }\r\n\r\n /**\r\n * 创建物体动画配置\r\n */\r\n private createMeshAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('物体动画')\r\n\r\n const params = {\r\n duration: 2,\r\n ease: 'power2.inOut',\r\n repeat: 0,\r\n yoyo: false\r\n }\r\n\r\n folder.add(params, 'duration', 0.1, 10, 0.1).name('持续时间')\r\n folder.add(params, 'ease', ['none', 'power1.in', 'power1.out', 'power1.inOut', 'power2.in', 'power2.out', 'power2.inOut', 'elastic.out', 'bounce.out']).name('缓动函数')\r\n folder.add(params, 'repeat', -1, 10, 1).name('重复次数')\r\n folder.add(params, 'yoyo').name('往返')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:record' as any, { type: 'start', params })\r\n }\r\n }, 'fn').name('记录起始')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:record' as any, { type: 'end', params })\r\n }\r\n }, 'fn').name('记录结束')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:play' as any, { params })\r\n }\r\n }, 'fn').name('播放动画')\r\n }\r\n\r\n /**\r\n * 创建运动动画配置\r\n */\r\n private createMoveAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('运动动画')\r\n\r\n const params = {\r\n speed: 1,\r\n loop: false\r\n }\r\n\r\n folder.add(params, 'speed', 0.1, 10, 0.1).name('速度')\r\n folder.add(params, 'loop').name('循环')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'start', params })\r\n }\r\n }, 'fn').name('开始运动')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'pause', params })\r\n }\r\n }, 'fn').name('暂停运动')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'stop', params })\r\n }\r\n }, 'fn').name('停止运动')\r\n }\r\n\r\n /**\r\n * 创建选择面板 - 选择子物体\r\n */\r\n createSelectMeshPanel(model: THREE.Object3D): void {\r\n this.destroySelectPanel()\r\n\r\n if (!this._gui) return\r\n\r\n this.selectPanel = this._gui.addFolder('#:' + model.name + '配置')\r\n\r\n // 基础配置\r\n this.addMeshControlPanel(model, this.selectPanel.addFolder('基础配置'))\r\n\r\n // 材质配置\r\n if ((model as THREE.Mesh).isMesh) {\r\n const mesh = model as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((mat, index) => {\r\n this.addMaterialPanel(mat, this.selectPanel!.addFolder('材质配置' + index))\r\n })\r\n } else {\r\n this.addMaterialPanel(mesh.material, this.selectPanel.addFolder('材质配置'))\r\n }\r\n }\r\n\r\n // 着色器配置\r\n this.addShaderPanel(model, this.selectPanel.addFolder('着色器配置'))\r\n\r\n // 设计配置\r\n this.addDesignPanel(model, this.selectPanel.addFolder('设计配置'))\r\n\r\n this.selectPanel.open()\r\n }\r\n\r\n /**\r\n * 创建选择面板 - 选择根物体\r\n */\r\n createSelectRootGroupPanel(model: THREE.Object3D): void {\r\n if (!(model as any).RootMaterials) {\r\n this.createSelectMeshPanel(model)\r\n return\r\n }\r\n\r\n this.destroySelectPanel()\r\n\r\n if (!this._gui) return\r\n\r\n this.selectPanel = this._gui.addFolder('$:' + model.name + '配置')\r\n\r\n // 基础配置\r\n this.addMeshControlPanel(model, this.selectPanel.addFolder('基础配置'))\r\n\r\n // 遍历材质配置\r\n const rootMaterials = (model as any).RootMaterials as THREE.Material[]\r\n if (rootMaterials && rootMaterials.length > 0) {\r\n const matFolder = this.selectPanel.addFolder('遍历材质配置')\r\n rootMaterials.forEach((mat, index) => {\r\n this.addMaterialPanel(mat, matFolder.addFolder('材质' + index))\r\n })\r\n }\r\n\r\n // 着色器配置\r\n this.addShaderPanel(model, this.selectPanel.addFolder('着色器配置'))\r\n\r\n this.selectPanel.open()\r\n }\r\n\r\n /**\r\n * 销毁选择面板\r\n */\r\n destroySelectPanel(): void {\r\n if (this.selectPanel && this._gui) {\r\n this._gui.removeFolder(this.selectPanel)\r\n this.selectPanel = null\r\n }\r\n }\r\n\r\n /**\r\n * 添加着色器面板\r\n */\r\n private addShaderPanel(model: THREE.Object3D, folder: GUI): void {\r\n const params = {\r\n shaderType: '无',\r\n intensity: 1\r\n }\r\n\r\n folder.add(params, 'shaderType', ['无', '发光', '扫描', '流动', '渐变']).name('着色器类型').onChange((v: string) => {\r\n this.events.emit('shader:apply' as any, { model, type: v, intensity: params.intensity })\r\n })\r\n\r\n folder.add(params, 'intensity', 0, 5, 0.1).name('强度').onChange((v: number) => {\r\n this.events.emit('shader:update' as any, { model, intensity: v })\r\n })\r\n }\r\n\r\n /**\r\n * 添加设计面板\r\n */\r\n private addDesignPanel(model: THREE.Object3D, folder: GUI): void {\r\n const params = {\r\n reflector: false,\r\n refractor: false\r\n }\r\n\r\n folder.add(params, 'reflector').name('镜面反射').onChange((v: boolean) => {\r\n this.events.emit('design:reflector' as any, { model, enabled: v })\r\n })\r\n\r\n folder.add(params, 'refractor').name('折射').onChange((v: boolean) => {\r\n this.events.emit('design:refractor' as any, { model, enabled: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建几何体\r\n */\r\n private createGeometry(type: string): THREE.BufferGeometry {\r\n switch (type) {\r\n case '立方体':\r\n return new THREE.BoxGeometry(1, 1, 1)\r\n case '球体':\r\n return new THREE.SphereGeometry(0.5, 32, 32)\r\n case '圆柱体':\r\n return new THREE.CylinderGeometry(0.5, 0.5, 1, 32)\r\n case '圆锥体':\r\n return new THREE.ConeGeometry(0.5, 1, 32)\r\n case '圆环':\r\n return new THREE.TorusGeometry(0.5, 0.2, 16, 100)\r\n case '平面':\r\n return new THREE.PlaneGeometry(1, 1)\r\n case '圆环结':\r\n return new THREE.TorusKnotGeometry(0.5, 0.15, 100, 16)\r\n case '十二面体':\r\n return new THREE.DodecahedronGeometry(0.5)\r\n case '二十面体':\r\n return new THREE.IcosahedronGeometry(0.5)\r\n case '八面体':\r\n return new THREE.OctahedronGeometry(0.5)\r\n case '四面体':\r\n return new THREE.TetrahedronGeometry(0.5)\r\n default:\r\n return new THREE.BoxGeometry(1, 1, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 创建材质\r\n */\r\n private createMaterial(type: string): THREE.Material {\r\n switch (type) {\r\n case '基础材质':\r\n return new THREE.MeshBasicMaterial({ color: 0xffffff })\r\n case '标准材质':\r\n return new THREE.MeshStandardMaterial({ color: 0xffffff, metalness: 0.5, roughness: 0.5 })\r\n case 'Lambert材质':\r\n return new THREE.MeshLambertMaterial({ color: 0xffffff })\r\n case 'Phong材质':\r\n return new THREE.MeshPhongMaterial({ color: 0xffffff })\r\n case '物理材质':\r\n return new THREE.MeshPhysicalMaterial({ color: 0xffffff, metalness: 0.5, roughness: 0.5 })\r\n case 'Toon材质':\r\n return new THREE.MeshToonMaterial({ color: 0xffffff })\r\n default:\r\n return new THREE.MeshStandardMaterial({ color: 0xffffff })\r\n }\r\n }\r\n\r\n /**\r\n * 打开文件对话框\r\n */\r\n private openFileDialog(accept: string, callback: (file: File) => void): void {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = accept\r\n input.onchange = (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n callback(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n /**\r\n * 添加自定义文件夹\r\n */\r\n addFolder(name: string): GUI | null {\r\n return this._gui?.addFolder(name) ?? null\r\n }\r\n\r\n /**\r\n * 设置 GUI DOM 位置\r\n */\r\n setPosition(container: HTMLElement): void {\r\n if (this._gui && this._gui.domElement) {\r\n container.appendChild(this._gui.domElement)\r\n }\r\n }\r\n\r\n /**\r\n * 更新显示\r\n */\r\n updateDisplay(): void {\r\n // dat.gui 没有全局 updateDisplay,需要遍历所有控制器\r\n }\r\n\r\n /**\r\n * 显示 GUI\r\n */\r\n show(): void {\r\n if (this._gui) {\r\n this._gui.show()\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏 GUI\r\n */\r\n hide(): void {\r\n if (this._gui) {\r\n this._gui.hide()\r\n }\r\n }\r\n\r\n /**\r\n * 销毁 GUI\r\n */\r\n destroy(): void {\r\n if (this._gui) {\r\n this._gui.destroy()\r\n this._gui = null\r\n }\r\n this.sceneFolder = null\r\n this.controlFolder = null\r\n this.meshFolder = null\r\n this.animationFolder = null\r\n this.selectPanel = null\r\n this.modelListFolder = null\r\n this.innerMeshListFolder = null\r\n this.drawMeshListFolder = null\r\n this.geoMapListFolder = null\r\n this.particleListFolder = null\r\n this.borderGroupListFolder = null\r\n this.textMeshListFolder = null\r\n this.designMeshListFolder = null\r\n this.lightListFolder = null\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): GUIPluginConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: string): void {\r\n this.handlerParams.mode = mode\r\n }\r\n\r\n /**\r\n * 获取当前模式\r\n */\r\n getMode(): string {\r\n return this.handlerParams.mode\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport Stats from 'three/examples/jsm/libs/stats.module.js'\r\nimport { ViewHelper } from 'three/examples/jsm/helpers/ViewHelper.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 辅助工具配置\r\n */\r\nexport interface GizmoPluginConfig {\r\n // 网格配置\r\n grid: {\r\n enabled: boolean\r\n size: number\r\n divisions: number\r\n colorCenterLine: number\r\n colorGrid: number\r\n }\r\n // 坐标轴配置\r\n axes: {\r\n enabled: boolean\r\n size: number\r\n }\r\n // 性能监控配置\r\n stats: {\r\n enabled: boolean\r\n mode: 0 | 1 | 2\r\n }\r\n // 视图助手配置\r\n viewHelper: {\r\n enabled: boolean\r\n size: number\r\n position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\r\n }\r\n // Box3 辅助配置\r\n box3Helper: {\r\n enabled: boolean\r\n color: number\r\n }\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_GIZMO_CONFIG: GizmoPluginConfig = {\r\n grid: {\r\n enabled: true,\r\n size: 100,\r\n divisions: 100,\r\n colorCenterLine: 0x444444,\r\n colorGrid: 0x888888\r\n },\r\n axes: {\r\n enabled: true,\r\n size: 5\r\n },\r\n stats: {\r\n enabled: false,\r\n mode: 0\r\n },\r\n viewHelper: {\r\n enabled: false,\r\n size: 128,\r\n position: 'bottom-right'\r\n },\r\n box3Helper: {\r\n enabled: false,\r\n color: 0xffff00\r\n }\r\n}\r\n\r\n/**\r\n * 辅助工具插件\r\n * 提供网格、坐标轴、性能监控、视图助手等辅助功能\r\n */\r\nexport class GizmoPlugin extends Plugin<GizmoPluginConfig> {\r\n readonly name = 'gizmo'\r\n\r\n /** 网格辅助 */\r\n private gridHelper: THREE.GridHelper | null = null\r\n\r\n /** 坐标轴辅助 */\r\n private axesHelper: THREE.AxesHelper | null = null\r\n\r\n /** 性能监控 */\r\n private stats: Stats | null = null\r\n\r\n /** 视图助手 */\r\n private viewHelper: ViewHelper | null = null\r\n\r\n /** Box3 辅助 */\r\n private box3Helper: THREE.Box3Helper | null = null\r\n\r\n /** 当前选中物体的 Box3 */\r\n private currentBox3: THREE.Box3 | null = null\r\n\r\n constructor(config?: Partial<GizmoPluginConfig>) {\r\n super({ ...DEFAULT_GIZMO_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 初始化各辅助工具\r\n if (this.config.grid.enabled) {\r\n this.createGridHelper()\r\n }\r\n if (this.config.axes.enabled) {\r\n this.createAxesHelper()\r\n }\r\n if (this.config.stats.enabled) {\r\n this.createStats()\r\n }\r\n if (this.config.viewHelper.enabled) {\r\n this.createViewHelper()\r\n }\r\n\r\n // 监听选择事件,更新 Box3\r\n this.subscribe('object:selected', (data) => {\r\n if (data.object) {\r\n this.onObjectSelected(data.object)\r\n }\r\n })\r\n this.subscribe('object:deselected', () => this.onObjectDeselected())\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.removeGridHelper()\r\n this.removeAxesHelper()\r\n this.removeStats()\r\n this.removeViewHelper()\r\n this.removeBox3Helper()\r\n }\r\n\r\n /**\r\n * 创建网格辅助\r\n */\r\n createGridHelper(): THREE.GridHelper {\r\n this.removeGridHelper()\r\n\r\n const { size, divisions, colorCenterLine, colorGrid } = this.config.grid\r\n this.gridHelper = new THREE.GridHelper(size, divisions, colorCenterLine, colorGrid)\r\n this.gridHelper.name = '__gridHelper__'\r\n this.scene.add(this.gridHelper)\r\n\r\n return this.gridHelper\r\n }\r\n\r\n /**\r\n * 移除网格辅助\r\n */\r\n removeGridHelper(): void {\r\n if (this.gridHelper) {\r\n this.scene.remove(this.gridHelper)\r\n this.gridHelper.dispose()\r\n this.gridHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置网格可见性\r\n */\r\n setGridVisible(visible: boolean): void {\r\n if (visible && !this.gridHelper) {\r\n this.createGridHelper()\r\n } else if (!visible && this.gridHelper) {\r\n this.removeGridHelper()\r\n }\r\n this.config.grid.enabled = visible\r\n }\r\n\r\n /**\r\n * 更新网格配置\r\n */\r\n updateGrid(config: Partial<GizmoPluginConfig['grid']>): void {\r\n Object.assign(this.config.grid, config)\r\n if (this.config.grid.enabled) {\r\n this.createGridHelper()\r\n }\r\n }\r\n\r\n /**\r\n * 创建坐标轴辅助\r\n */\r\n createAxesHelper(): THREE.AxesHelper {\r\n this.removeAxesHelper()\r\n\r\n this.axesHelper = new THREE.AxesHelper(this.config.axes.size)\r\n this.axesHelper.name = '__axesHelper__'\r\n this.scene.add(this.axesHelper)\r\n\r\n return this.axesHelper\r\n }\r\n\r\n /**\r\n * 移除坐标轴辅助\r\n */\r\n removeAxesHelper(): void {\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper)\r\n this.axesHelper.dispose()\r\n this.axesHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置坐标轴可见性\r\n */\r\n setAxesVisible(visible: boolean): void {\r\n if (visible && !this.axesHelper) {\r\n this.createAxesHelper()\r\n } else if (!visible && this.axesHelper) {\r\n this.removeAxesHelper()\r\n }\r\n this.config.axes.enabled = visible\r\n }\r\n\r\n /**\r\n * 更新坐标轴配置\r\n */\r\n updateAxes(config: Partial<GizmoPluginConfig['axes']>): void {\r\n Object.assign(this.config.axes, config)\r\n if (this.config.axes.enabled) {\r\n this.createAxesHelper()\r\n }\r\n }\r\n\r\n /**\r\n * 创建性能监控\r\n */\r\n createStats(): Stats {\r\n this.removeStats()\r\n\r\n this.stats = new Stats()\r\n this.stats.showPanel(this.config.stats.mode)\r\n this.stats.dom.style.position = 'absolute'\r\n this.stats.dom.style.top = '0'\r\n this.stats.dom.style.left = '0'\r\n\r\n this.renderer.domElement.parentElement?.appendChild(this.stats.dom)\r\n\r\n return this.stats\r\n }\r\n\r\n /**\r\n * 移除性能监控\r\n */\r\n removeStats(): void {\r\n if (this.stats) {\r\n this.stats.dom.parentElement?.removeChild(this.stats.dom)\r\n this.stats = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置性能监控可见性\r\n */\r\n setStatsVisible(visible: boolean): void {\r\n if (visible && !this.stats) {\r\n this.createStats()\r\n } else if (!visible && this.stats) {\r\n this.removeStats()\r\n }\r\n this.config.stats.enabled = visible\r\n }\r\n\r\n /**\r\n * 设置性能监控模式\r\n */\r\n setStatsMode(mode: 0 | 1 | 2): void {\r\n this.config.stats.mode = mode\r\n if (this.stats) {\r\n this.stats.showPanel(mode)\r\n }\r\n }\r\n\r\n /**\r\n * 更新性能监控\r\n */\r\n updateStats(): void {\r\n if (this.stats) {\r\n this.stats.update()\r\n }\r\n }\r\n\r\n /**\r\n * 创建视图助手\r\n * Note: ViewHelper API varies between Three.js versions\r\n */\r\n createViewHelper(): ViewHelper | null {\r\n this.removeViewHelper()\r\n\r\n try {\r\n // ViewHelper requires a DOM element in newer versions\r\n const container = this.renderer.domElement.parentElement\r\n if (!container) return null\r\n\r\n this.viewHelper = new ViewHelper(this.camera, container as HTMLElement)\r\n return this.viewHelper\r\n } catch (e) {\r\n console.warn('ViewHelper creation failed:', e)\r\n return null\r\n }\r\n }\r\n\r\n /**\r\n * 移除视图助手\r\n */\r\n removeViewHelper(): void {\r\n if (this.viewHelper) {\r\n this.viewHelper.dispose()\r\n this.viewHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置视图助手可见性\r\n */\r\n setViewHelperVisible(visible: boolean): void {\r\n if (visible && !this.viewHelper) {\r\n this.createViewHelper()\r\n } else if (!visible && this.viewHelper) {\r\n this.removeViewHelper()\r\n }\r\n this.config.viewHelper.enabled = visible\r\n }\r\n\r\n /**\r\n * 渲染视图助手\r\n */\r\n renderViewHelper(delta: number): void {\r\n if (this.viewHelper) {\r\n this.viewHelper.render(this.renderer)\r\n if (this.viewHelper.animating) {\r\n this.viewHelper.update(delta)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 创建 Box3 辅助\r\n */\r\n createBox3Helper(object: THREE.Object3D): THREE.Box3Helper {\r\n this.removeBox3Helper()\r\n\r\n this.currentBox3 = new THREE.Box3().setFromObject(object)\r\n this.box3Helper = new THREE.Box3Helper(this.currentBox3, new THREE.Color(this.config.box3Helper.color))\r\n this.box3Helper.name = '__box3Helper__'\r\n this.scene.add(this.box3Helper)\r\n\r\n return this.box3Helper\r\n }\r\n\r\n /**\r\n * 更新 Box3 辅助\r\n */\r\n updateBox3Helper(object: THREE.Object3D): void {\r\n if (this.currentBox3 && this.box3Helper) {\r\n this.currentBox3.setFromObject(object)\r\n }\r\n }\r\n\r\n /**\r\n * 移除 Box3 辅助\r\n */\r\n removeBox3Helper(): void {\r\n if (this.box3Helper) {\r\n this.scene.remove(this.box3Helper)\r\n this.box3Helper.dispose()\r\n this.box3Helper = null\r\n this.currentBox3 = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置 Box3 辅助可见性\r\n */\r\n setBox3HelperVisible(visible: boolean): void {\r\n this.config.box3Helper.enabled = visible\r\n if (!visible) {\r\n this.removeBox3Helper()\r\n }\r\n }\r\n\r\n /**\r\n * 物体选中事件处理\r\n */\r\n private onObjectSelected(object: THREE.Object3D): void {\r\n if (this.config.box3Helper.enabled) {\r\n this.createBox3Helper(object)\r\n }\r\n }\r\n\r\n /**\r\n * 物体取消选中事件处理\r\n */\r\n private onObjectDeselected(): void {\r\n this.removeBox3Helper()\r\n }\r\n\r\n /**\r\n * 获取网格辅助\r\n */\r\n getGridHelper(): THREE.GridHelper | null {\r\n return this.gridHelper\r\n }\r\n\r\n /**\r\n * 获取坐标轴辅助\r\n */\r\n getAxesHelper(): THREE.AxesHelper | null {\r\n return this.axesHelper\r\n }\r\n\r\n /**\r\n * 获取性能监控\r\n */\r\n getStats(): Stats | null {\r\n return this.stats\r\n }\r\n\r\n /**\r\n * 获取视图助手\r\n */\r\n getViewHelper(): ViewHelper | null {\r\n return this.viewHelper\r\n }\r\n\r\n /**\r\n * 获取 Box3 辅助\r\n */\r\n getBox3Helper(): THREE.Box3Helper | null {\r\n return this.box3Helper\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): GizmoPluginConfig {\r\n return { ...this.config }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\n\r\n/**\r\n * 获取两点之间指定比例的点\r\n * @param point1 起点\r\n * @param point2 终点\r\n * @param scale 比例 (0-1)\r\n * @returns 比例点\r\n */\r\nexport function getDistanceScalePoint(\r\n point1: THREE.Vector3,\r\n point2: THREE.Vector3,\r\n scale: number = 0.9\r\n): THREE.Vector3 {\r\n const distance = point1.distanceTo(point2)\r\n const direction = new THREE.Vector3().subVectors(point2, point1).normalize()\r\n return direction.multiplyScalar(distance * scale).add(point1)\r\n}\r\n\r\n/**\r\n * 获取两点之间指定距离的点\r\n * @param point1 起点\r\n * @param point2 终点\r\n * @param distance 距离\r\n * @returns 距离点\r\n */\r\nexport function getPointAtDistance(\r\n point1: THREE.Vector3,\r\n point2: THREE.Vector3,\r\n distance: number\r\n): THREE.Vector3 {\r\n const direction = new THREE.Vector3().subVectors(point2, point1).normalize()\r\n return direction.multiplyScalar(distance).add(point1)\r\n}\r\n\r\n/**\r\n * 角度转弧度\r\n */\r\nexport function degToRad(degrees: number): number {\r\n return degrees * (Math.PI / 180)\r\n}\r\n\r\n/**\r\n * 弧度转角度\r\n */\r\nexport function radToDeg(radians: number): number {\r\n return radians * (180 / Math.PI)\r\n}\r\n\r\n/**\r\n * 限制值在范围内\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value))\r\n}\r\n\r\n/**\r\n * 线性插值\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t\r\n}\r\n\r\n/**\r\n * 平滑插值\r\n */\r\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\r\n const t = clamp((x - edge0) / (edge1 - edge0), 0, 1)\r\n return t * t * (3 - 2 * t)\r\n}\r\n","import * as THREE from 'three'\r\nimport type { Box3Info, ViewAngle } from '../types/core.types'\r\nimport { getPointAtDistance } from './math'\r\n\r\n/**\r\n * 获取物体的包围盒信息\r\n * @param object 物体\r\n * @returns 包围盒信息\r\n */\r\nexport function getObjectBox3(object: THREE.Object3D): Box3Info {\r\n const box = new THREE.Box3().setFromObject(object)\r\n const { max, min } = box\r\n\r\n const center = new THREE.Vector3()\r\n box.getCenter(center)\r\n\r\n const radius = new THREE.Vector3().subVectors(max, min).length() / 2\r\n\r\n return { max, min, center, radius }\r\n}\r\n\r\n/**\r\n * 获取物体的最佳观察视角\r\n * @param object 物体\r\n * @param scale 视角缩放比例\r\n * @returns 视角信息\r\n */\r\nexport function getBestViewTarget(object: THREE.Object3D, scale: number = 2.5): ViewAngle {\r\n const { center, max } = getObjectBox3(object)\r\n const distance = new THREE.Vector3().subVectors(max, center).length() * scale\r\n const position = getPointAtDistance(center, max, distance)\r\n\r\n return { position, target: center }\r\n}\r\n\r\n/**\r\n * 获取物体的六个视图位置\r\n * @param object 物体\r\n * @param fov 相机视野角度\r\n * @returns 六个视图位置\r\n */\r\nexport function getObjectViews(object: THREE.Object3D, fov: number = 50) {\r\n const { center, max, min, radius } = getObjectBox3(object)\r\n\r\n // 计算相机距离\r\n const distance = radius / Math.tan((fov * Math.PI) / 360)\r\n\r\n return {\r\n frontView: new THREE.Vector3(center.x, center.y, max.z + distance),\r\n backView: new THREE.Vector3(center.x, center.y, min.z - distance),\r\n leftView: new THREE.Vector3(min.x - distance, center.y, center.z),\r\n rightView: new THREE.Vector3(max.x + distance, center.y, center.z),\r\n topView: new THREE.Vector3(center.x, max.y + distance, center.z),\r\n bottomView: new THREE.Vector3(center.x, min.y - distance, center.z),\r\n target: center\r\n }\r\n}\r\n\r\n/**\r\n * 创建包围盒辅助器\r\n * @param color 颜色\r\n * @returns Box3Helper\r\n */\r\nexport function createBox3Helper(color: number = 0xffff00): THREE.Box3Helper {\r\n const box = new THREE.Box3()\r\n const helper = new THREE.Box3Helper(box, color)\r\n helper.name = 'Box3Helper'\r\n helper.visible = false\r\n return helper\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ShaderPluginConfig } from '../../types/config.types'\r\n\r\n/**\r\n * 着色器 Uniform 定义\r\n */\r\nexport interface ShaderUniform {\r\n type: string\r\n value: any\r\n unit: string\r\n}\r\n\r\n/**\r\n * 着色器预设\r\n */\r\nexport interface ShaderPreset {\r\n name: string\r\n uniforms: Record<string, ShaderUniform>\r\n vertexHeader?: string\r\n fragHeader: string\r\n fragFunc?: string\r\n fragBody: string\r\n animate?: (uniforms: Record<string, ShaderUniform>, delta: number) => void\r\n}\r\n\r\n/**\r\n * 着色器控制器\r\n */\r\nexport interface ShaderController {\r\n uniforms: Record<string, ShaderUniform>\r\n update: () => void\r\n destroy: () => void\r\n}\r\n\r\n/**\r\n * 默认着色器配置\r\n */\r\nexport const DEFAULT_SHADER_CONFIG: ShaderPluginConfig = {\r\n speed: 0.01,\r\n mixRatio: 0.5\r\n}\r\n\r\n/**\r\n * 着色器插件\r\n * 提供着色器混合和预设管理功能\r\n */\r\nexport class ShaderPlugin extends Plugin<ShaderPluginConfig> {\r\n readonly name = 'shader'\r\n\r\n /** 预设着色器库 */\r\n private presets = new Map<string, ShaderPreset>()\r\n\r\n /** 已应用着色器的物体 */\r\n private appliedObjects = new Map<THREE.Object3D, ShaderController>()\r\n\r\n /** 着色器动画列表 */\r\n private shaderAnimations: Array<{ object: THREE.Object3D; controller: ShaderController }> = []\r\n\r\n constructor(config?: Partial<ShaderPluginConfig>) {\r\n super({ ...DEFAULT_SHADER_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 注册内置预设\r\n this.registerBuiltinPresets()\r\n }\r\n\r\n protected onUninstall(): void {\r\n // 移除所有着色器\r\n for (const [object] of this.appliedObjects) {\r\n this.remove(object)\r\n }\r\n this.presets.clear()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新着色器动画\r\n for (const { controller } of this.shaderAnimations) {\r\n controller.update()\r\n }\r\n }\r\n\r\n /**\r\n * 注册内置预设着色器\r\n */\r\n private registerBuiltinPresets(): void {\r\n // 彩虹光\r\n this.registerPreset('彩虹光', {\r\n name: '彩虹光',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n vec3 rainbow = vec3(\r\n sin(vUv.x * 10.0 + iTime) * 0.5 + 0.5,\r\n sin(vUv.y * 10.0 + iTime + 2.094) * 0.5 + 0.5,\r\n sin((vUv.x + vUv.y) * 5.0 + iTime + 4.188) * 0.5 + 0.5\r\n );\r\n vec4 diffuseColor = vec4(mix(diffuse, rainbow, mixRatio), opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.5\r\n }\r\n })\r\n\r\n // 水波纹\r\n this.registerPreset('水波纹', {\r\n name: '水波纹',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float wave = sin(length(vUv - 0.5) * 20.0 - iTime * 3.0) * 0.5 + 0.5;\r\n vec3 waterColor = mix(diffuse, vec3(0.0, 0.5, 1.0), wave * mixRatio);\r\n vec4 diffuseColor = vec4(waterColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 光圈扫射\r\n this.registerPreset('光圈扫射', {\r\n name: '光圈扫射',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n circleWidth: { type: 'number', value: 0.1, unit: 'float' },\r\n isDisCard: { type: 'bool', value: false, unit: 'bool' }\r\n },\r\n fragHeader: this.getUniformDeclarations({\r\n ...this.getCommonUniforms(),\r\n circleWidth: { type: 'number', value: 0.1, unit: 'float' },\r\n isDisCard: { type: 'bool', value: false, unit: 'bool' }\r\n }),\r\n fragBody: `\r\n float dist = length(vUv - 0.5);\r\n float circle = smoothstep(iTime - circleWidth, iTime, dist) - smoothstep(iTime, iTime + circleWidth, dist);\r\n vec3 scanColor = mix(diffuse, mixColor, circle * intensity);\r\n vec4 diffuseColor = vec4(scanColor, opacity);\r\n if (isDisCard && circle < 0.01) discard;\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.3\r\n if (uniforms.iTime.value > 1.0) uniforms.iTime.value = 0.0\r\n }\r\n })\r\n\r\n // 流光围栏\r\n this.registerPreset('流光围栏', {\r\n name: '流光围栏',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float flow = fract(vUv.y - iTime * speed * 10.0);\r\n vec3 fenceColor = mix(diffuse, mixColor, flow * intensity);\r\n vec4 diffuseColor = vec4(fenceColor, opacity * (1.0 - flow * 0.5));\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光围栏2\r\n this.registerPreset('流光围栏2', {\r\n name: '流光围栏2',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float gradient = 1.0 - vUv.y;\r\n float flow = fract(vUv.y * 2.0 - iTime * speed * 5.0);\r\n vec3 fenceColor = mix(diffuse, mixColor, flow * gradient * intensity);\r\n vec4 diffuseColor = vec4(fenceColor, opacity * gradient);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 雪片着色\r\n this.registerPreset('雪片着色', {\r\n name: '雪片着色',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float snow = fract(sin(dot(vUv, vec2(12.9898, 78.233)) + iTime) * 43758.5453);\r\n vec3 snowColor = mix(diffuse, vec3(1.0), snow * mixRatio * 0.3);\r\n vec4 diffuseColor = vec4(snowColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.1\r\n }\r\n })\r\n\r\n // 光线叠加\r\n this.registerPreset('光线叠加', {\r\n name: '光线叠加',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float glow = pow(1.0 - length(vUv - 0.5) * 2.0, 2.0);\r\n vec3 glowColor = diffuse + mixColor * glow * intensity;\r\n vec4 diffuseColor = vec4(glowColor, opacity);\r\n `\r\n })\r\n\r\n // 绚烂线条\r\n this.registerPreset('绚烂线条', {\r\n name: '绚烂线条',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float line = abs(sin(vUv.x * 50.0 + iTime * 2.0)) * abs(sin(vUv.y * 50.0 + iTime * 2.0));\r\n vec3 lineColor = mix(diffuse, mixColor, line * intensity);\r\n vec4 diffuseColor = vec4(lineColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光闪电\r\n this.registerPreset('流光闪电', {\r\n name: '流光闪电',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float lightning = pow(fract(sin(vUv.x * 100.0 + iTime * 10.0) * 43758.5453), 10.0);\r\n vec3 lightningColor = mix(diffuse, vec3(0.8, 0.9, 1.0), lightning * intensity);\r\n vec4 diffuseColor = vec4(lightningColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 火焰燃烧\r\n this.registerPreset('火焰燃烧', {\r\n name: '火焰燃烧',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float noise = fract(sin(dot(vUv + iTime * 0.1, vec2(12.9898, 78.233))) * 43758.5453);\r\n float fire = pow(1.0 - vUv.y, 2.0) * noise;\r\n vec3 fireColor = mix(vec3(1.0, 0.3, 0.0), vec3(1.0, 0.8, 0.0), fire);\r\n vec3 finalColor = mix(diffuse, fireColor, fire * intensity);\r\n vec4 diffuseColor = vec4(finalColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光栅格\r\n this.registerPreset('流光栅格', {\r\n name: '流光栅格',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float gridX = step(0.9, fract(vUv.x * 10.0));\r\n float gridY = step(0.9, fract(vUv.y * 10.0));\r\n float grid = max(gridX, gridY);\r\n float flow = fract(vUv.x + vUv.y - iTime * speed * 2.0);\r\n vec3 gridColor = mix(diffuse, mixColor, grid * flow * intensity);\r\n vec4 diffuseColor = vec4(gridColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 着色天空\r\n this.registerPreset('着色天空', {\r\n name: '着色天空',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n topColor: { type: 'color', value: new THREE.Color(0x0077ff), unit: 'vec3' },\r\n bottomColor: { type: 'color', value: new THREE.Color(0xffffff), unit: 'vec3' },\r\n offset: { type: 'number', value: 0.0, unit: 'float' },\r\n exponent: { type: 'number', value: 0.6, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 topColor;\r\n uniform vec3 bottomColor;\r\n uniform float offset;\r\n uniform float exponent;\r\n varying vec3 vWorldPosition;\r\n `,\r\n vertexHeader: `\r\n varying vec3 vWorldPosition;\r\n void main() {\r\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\r\n vWorldPosition = worldPosition.xyz;\r\n `,\r\n fragBody: `\r\n float h = normalize(vWorldPosition + offset).y;\r\n vec3 skyColor = mix(bottomColor, topColor, max(pow(max(h, 0.0), exponent), 0.0));\r\n vec4 diffuseColor = vec4(skyColor, opacity);\r\n `\r\n })\r\n\r\n // 水面着色\r\n this.registerPreset('水面着色', {\r\n name: '水面着色',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n waterColor: { type: 'color', value: new THREE.Color(0x001e0f), unit: 'vec3' },\r\n waveHeight: { type: 'number', value: 0.1, unit: 'float' },\r\n waveSpeed: { type: 'number', value: 1.0, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 waterColor;\r\n uniform float waveHeight;\r\n uniform float waveSpeed;\r\n ${this.getUniformDeclarations(this.getCommonUniforms())}\r\n `,\r\n fragBody: `\r\n float wave1 = sin(vUv.x * 10.0 + iTime * waveSpeed) * waveHeight;\r\n float wave2 = sin(vUv.y * 8.0 + iTime * waveSpeed * 0.8) * waveHeight;\r\n float wave = (wave1 + wave2) * 0.5 + 0.5;\r\n vec3 finalColor = mix(waterColor, mixColor, wave * intensity);\r\n vec4 diffuseColor = vec4(finalColor, opacity * 0.8);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 热力图\r\n this.registerPreset('热力图', {\r\n name: '热力图',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n Points: { type: 'array', value: [], unit: 'vec3' },\r\n PointsCount: { type: 'number', value: 0, unit: 'int' },\r\n radius: { type: 'number', value: 0.3, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 Points[100];\r\n uniform int PointsCount;\r\n uniform float radius;\r\n ${this.getUniformDeclarations(this.getCommonUniforms())}\r\n `,\r\n fragBody: `\r\n float heat = 0.0;\r\n for (int i = 0; i < 100; i++) {\r\n if (i >= PointsCount) break;\r\n float dist = distance(vec2(vUv.x, vUv.y), Points[i].xy);\r\n heat += Points[i].z * smoothstep(radius, 0.0, dist);\r\n }\r\n heat = clamp(heat, 0.0, 1.0);\r\n vec3 heatColor = mix(vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), heat);\r\n heatColor = mix(heatColor, vec3(1.0, 1.0, 0.0), smoothstep(0.5, 1.0, heat));\r\n vec4 diffuseColor = vec4(mix(diffuse, heatColor, heat * intensity), opacity);\r\n `\r\n })\r\n\r\n // 晶片着色\r\n this.registerPreset('晶片着色', {\r\n name: '晶片着色',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n vec2 cell = floor(vUv * 20.0);\r\n float noise = fract(sin(dot(cell, vec2(12.9898, 78.233))) * 43758.5453);\r\n vec3 crystalColor = mix(diffuse, mixColor, noise * intensity);\r\n vec4 diffuseColor = vec4(crystalColor, opacity);\r\n `\r\n })\r\n }\r\n\r\n /**\r\n * 获取公共 Uniforms\r\n */\r\n private getCommonUniforms(): Record<string, ShaderUniform> {\r\n return {\r\n iTime: { type: 'number', value: 0.0, unit: 'float' },\r\n speed: { type: 'number', value: this.config.speed, unit: 'float' },\r\n intensity: { type: 'number', value: 1.0, unit: 'float' },\r\n mixRatio: { type: 'number', value: this.config.mixRatio, unit: 'float' },\r\n mixColor: { type: 'color', value: new THREE.Color(0xffffff), unit: 'vec3' },\r\n hasUv: { type: 'bool', value: true, unit: 'bool' }\r\n }\r\n }\r\n\r\n /**\r\n * 获取 Uniform 声明\r\n */\r\n private getUniformDeclarations(uniforms: Record<string, ShaderUniform>): string {\r\n return Object.entries(uniforms)\r\n .map(([name, uniform]) => `uniform ${uniform.unit} ${name};`)\r\n .join('\\n')\r\n }\r\n\r\n /**\r\n * 注册预设着色器\r\n */\r\n registerPreset(name: string, preset: ShaderPreset): void {\r\n this.presets.set(name, preset)\r\n }\r\n\r\n /**\r\n * 获取预设着色器\r\n */\r\n getPreset(name: string): ShaderPreset | undefined {\r\n return this.presets.get(name)\r\n }\r\n\r\n /**\r\n * 获取所有预设名称\r\n */\r\n getPresetNames(): string[] {\r\n return Array.from(this.presets.keys())\r\n }\r\n\r\n /**\r\n * 应用着色器到物体\r\n */\r\n apply(object: THREE.Object3D, presetName: string): ShaderController | null {\r\n const preset = this.presets.get(presetName)\r\n if (!preset) {\r\n console.warn(`Shader preset \"${presetName}\" not found`)\r\n return null\r\n }\r\n\r\n // 克隆 uniforms\r\n const uniforms: Record<string, ShaderUniform> = {}\r\n for (const [key, value] of Object.entries(preset.uniforms)) {\r\n uniforms[key] = {\r\n ...value,\r\n value: value.value instanceof THREE.Color\r\n ? value.value.clone()\r\n : value.value\r\n }\r\n }\r\n\r\n // 获取材质列表\r\n const materials = this.getMaterials(object)\r\n if (materials.length === 0) return null\r\n\r\n // 应用着色器到材质\r\n materials.forEach(material => {\r\n this.applyShaderToMaterial(material, uniforms, preset)\r\n })\r\n\r\n // 创建控制器\r\n const controller: ShaderController = {\r\n uniforms,\r\n update: () => {\r\n if (preset.animate) {\r\n preset.animate(uniforms, 0.016) // 约 60fps\r\n }\r\n },\r\n destroy: () => {\r\n this.remove(object)\r\n }\r\n }\r\n\r\n // 保存引用\r\n this.appliedObjects.set(object, controller)\r\n\r\n // 如果有动画,添加到动画列表\r\n if (preset.animate) {\r\n this.shaderAnimations.push({ object, controller })\r\n }\r\n\r\n // 发射事件\r\n this.events.emit('shader:applied', { object, shaderName: presetName })\r\n\r\n return controller\r\n }\r\n\r\n /**\r\n * 应用着色器到材质\r\n */\r\n private applyShaderToMaterial(\r\n material: THREE.Material,\r\n uniforms: Record<string, ShaderUniform>,\r\n preset: ShaderPreset\r\n ): void {\r\n material.dispose()\r\n\r\n material.onBeforeCompile = (shader) => {\r\n // 写入 uniforms\r\n for (const [key, uniform] of Object.entries(uniforms)) {\r\n shader.uniforms[key] = { value: uniform.value }\r\n }\r\n\r\n // 顶点着色器注入\r\n if (preset.vertexHeader) {\r\n shader.vertexShader = shader.vertexShader.replace(\r\n 'void main() {',\r\n preset.vertexHeader\r\n )\r\n }\r\n\r\n // 添加 varying vUv\r\n if (!shader.vertexShader.includes('varying vec2 vUv')) {\r\n shader.vertexShader = 'varying vec2 vUv;\\n' + shader.vertexShader\r\n shader.vertexShader = shader.vertexShader.replace(\r\n 'void main() {',\r\n 'void main() {\\nvUv = uv;'\r\n )\r\n }\r\n\r\n // 片段着色器头部注入\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n '#include <common>',\r\n `varying vec2 vUv;\\n${preset.fragHeader}\\n#include <common>\\n${preset.fragFunc || ''}`\r\n )\r\n\r\n // 片段着色器主体注入\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n 'vec4 diffuseColor = vec4( diffuse, opacity );',\r\n preset.fragBody\r\n )\r\n }\r\n\r\n material.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 移除物体的着色器\r\n */\r\n remove(object: THREE.Object3D): void {\r\n const controller = this.appliedObjects.get(object)\r\n if (!controller) return\r\n\r\n // 重置材质\r\n const materials = this.getMaterials(object)\r\n materials.forEach(material => {\r\n material.onBeforeCompile = () => {}\r\n material.dispose()\r\n material.needsUpdate = true\r\n })\r\n\r\n // 从动画列表移除\r\n const animIndex = this.shaderAnimations.findIndex(a => a.object === object)\r\n if (animIndex > -1) {\r\n this.shaderAnimations.splice(animIndex, 1)\r\n }\r\n\r\n // 移除引用\r\n this.appliedObjects.delete(object)\r\n\r\n // 发射事件\r\n this.events.emit('shader:removed', { object })\r\n }\r\n\r\n /**\r\n * 获取物体的所有材质\r\n */\r\n private getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport gsap from 'gsap'\r\nimport { Plugin } from '../Plugin'\r\nimport type { GsapQuery } from '../../types/core.types'\r\nimport type { AnimationPlayParams, CurveAnimationController, ExtendedObject3D, ViewAngle } from '../../types/core.types'\r\n\r\n/**\r\n * 动画插件配置\r\n */\r\nexport interface AnimationPluginConfig {\r\n defaultDuration: number\r\n defaultEase: string\r\n}\r\n\r\n/**\r\n * 混合器信息\r\n */\r\nexport interface MixerInfo {\r\n mixer: THREE.AnimationMixer\r\n object: THREE.Object3D\r\n actions: THREE.AnimationAction[]\r\n clock: THREE.Clock\r\n}\r\n\r\n/**\r\n * 补间动画控制器\r\n */\r\nexport interface TweenController {\r\n play: () => void\r\n pause: () => void\r\n resume: () => void\r\n kill: () => void\r\n progress: (value?: number) => number\r\n}\r\n\r\n/**\r\n * 默认动画配置\r\n */\r\nexport const DEFAULT_ANIMATION_CONFIG: AnimationPluginConfig = {\r\n defaultDuration: 2,\r\n defaultEase: 'power2.inOut'\r\n}\r\n\r\n/**\r\n * 动画插件\r\n * 提供模型动画、补间动画、路径动画等功能\r\n */\r\nexport class AnimationPlugin extends Plugin<AnimationPluginConfig> {\r\n readonly name = 'animation'\r\n\r\n /** 混合器列表 */\r\n private mixers: MixerInfo[] = []\r\n\r\n /** 曲线动画列表 */\r\n private curveAnimations: CurveAnimationController[] = []\r\n\r\n /** 补间动画列表 */\r\n private tweens: gsap.core.Tween[] = []\r\n\r\n constructor(config?: Partial<AnimationPluginConfig>) {\r\n super({ ...DEFAULT_ANIMATION_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n // 停止所有动画\r\n this.stopAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新混合器\r\n for (const info of this.mixers) {\r\n info.mixer.update(info.clock.getDelta())\r\n }\r\n\r\n // 更新曲线动画\r\n for (const anim of this.curveAnimations) {\r\n if (anim.pause) continue\r\n\r\n anim.time += anim.speed / 1000\r\n\r\n if (anim.time > 1 || anim.time < 0) {\r\n anim.time = anim.time > 1 ? 1 : 0\r\n anim.pause = true\r\n anim.frameEndCallback?.()\r\n continue\r\n }\r\n\r\n const point = anim.curve.getPointAt(anim.time)\r\n anim.frameCallback?.(point)\r\n }\r\n }\r\n\r\n // ============ 模型动画 ============\r\n\r\n /**\r\n * 播放模型动画\r\n */\r\n playModelAnimation(\r\n object: ExtendedObject3D,\r\n params?: Partial<AnimationPlayParams>\r\n ): MixerInfo | null {\r\n const obj = object as THREE.Object3D\r\n const animations = (object as any).animations as THREE.AnimationClip[] | undefined\r\n \r\n if (!animations || animations.length === 0) {\r\n console.warn('Object has no animations')\r\n return null\r\n }\r\n\r\n const defaultParams: AnimationPlayParams = {\r\n initPlay: true,\r\n speed: 1,\r\n actionIndexs: animations.map(() => true),\r\n startTime: 0,\r\n loop: true\r\n }\r\n\r\n const playParams = { ...defaultParams, ...params, ...(object as any).animationPlayParams }\r\n\r\n const clock = new THREE.Clock()\r\n const mixer = new THREE.AnimationMixer(obj)\r\n\r\n const actions = animations\r\n .filter((_, index) => playParams.actionIndexs[index])\r\n .map(clip => {\r\n const action = mixer.clipAction(clip)\r\n action.loop = playParams.loop ? THREE.LoopRepeat : THREE.LoopOnce\r\n action.time = playParams.startTime\r\n action.timeScale = playParams.speed\r\n action.clampWhenFinished = true\r\n if (playParams.initPlay) {\r\n action.play()\r\n }\r\n return action\r\n })\r\n\r\n const info: MixerInfo = { mixer, object: obj, actions, clock }\r\n this.mixers.push(info)\r\n\r\n // 保存到物体\r\n ;(object as any).animationPlayParams = playParams\r\n\r\n this.events.emit('animation:start', { object: obj })\r\n\r\n return info\r\n }\r\n\r\n /**\r\n * 停止模型动画\r\n */\r\n stopModelAnimation(object: THREE.Object3D): void {\r\n const index = this.mixers.findIndex(m => m.object === object)\r\n if (index > -1) {\r\n const info = this.mixers[index]\r\n info.actions.forEach(action => action.stop())\r\n this.mixers.splice(index, 1)\r\n this.events.emit('animation:stop', { object })\r\n }\r\n }\r\n\r\n /**\r\n * 暂停/恢复模型动画\r\n */\r\n toggleModelAnimation(object: THREE.Object3D, paused: boolean): void {\r\n const info = this.mixers.find(m => m.object === object)\r\n if (info) {\r\n info.actions.forEach(action => {\r\n action.paused = paused\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 获取模型的混合器信息\r\n */\r\n getMixerInfo(object: THREE.Object3D): MixerInfo | undefined {\r\n return this.mixers.find(m => m.object === object)\r\n }\r\n\r\n // ============ 补间动画 ============\r\n\r\n /**\r\n * 创建补间动画\r\n */\r\n tween(\r\n target: object,\r\n to: object,\r\n query?: GsapQuery\r\n ): TweenController {\r\n const tween = gsap.to(target, {\r\n ...to,\r\n duration: query?.duration ?? this.config.defaultDuration,\r\n ease: query?.ease ?? this.config.defaultEase,\r\n repeat: query?.repeat ?? 0,\r\n yoyo: query?.yoyo ?? false,\r\n yoyoEase: query?.yoyoEase ?? true,\r\n onUpdate: query?.onUpdate,\r\n onComplete: () => {\r\n query?.onComplete?.()\r\n // 从列表移除\r\n const index = this.tweens.indexOf(tween)\r\n if (index > -1) this.tweens.splice(index, 1)\r\n }\r\n })\r\n\r\n this.tweens.push(tween)\r\n\r\n return {\r\n play: () => tween.play(),\r\n pause: () => tween.pause(),\r\n resume: () => tween.resume(),\r\n kill: () => {\r\n tween.kill()\r\n const index = this.tweens.indexOf(tween)\r\n if (index > -1) this.tweens.splice(index, 1)\r\n },\r\n progress: (value?: number) => {\r\n if (value !== undefined) {\r\n tween.progress(value)\r\n }\r\n return tween.progress()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 相机视角动画\r\n */\r\n animateCamera(\r\n camera: THREE.Camera,\r\n controls: { target: THREE.Vector3 },\r\n viewAngle: ViewAngle,\r\n query?: GsapQuery\r\n ): Promise<void> {\r\n return Promise.all([\r\n new Promise<void>(resolve => {\r\n this.tween(camera.position, viewAngle.position, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }),\r\n new Promise<void>(resolve => {\r\n this.tween(controls.target, viewAngle.target, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n })\r\n ]).then(() => {})\r\n }\r\n\r\n /**\r\n * 物体变换动画\r\n */\r\n animateTransform(\r\n object: THREE.Object3D,\r\n transform: {\r\n position?: { x?: number; y?: number; z?: number }\r\n rotation?: { x?: number; y?: number; z?: number }\r\n scale?: { x?: number; y?: number; z?: number }\r\n },\r\n query?: GsapQuery\r\n ): Promise<void> {\r\n const promises: Promise<void>[] = []\r\n\r\n if (transform.position) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.position, transform.position!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n if (transform.rotation) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.rotation, transform.rotation!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n if (transform.scale) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.scale, transform.scale!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n return Promise.all(promises).then(() => {})\r\n }\r\n\r\n // ============ 曲线动画 ============\r\n\r\n /**\r\n * 创建曲线动画\r\n */\r\n createCurveAnimation(\r\n curve: THREE.Curve<THREE.Vector3>,\r\n speed: number = 1\r\n ): CurveAnimationController {\r\n const controller: CurveAnimationController = {\r\n id: Date.now(),\r\n curve,\r\n time: 0,\r\n pause: true,\r\n speed,\r\n frameCallback: null,\r\n frameEndCallback: null,\r\n start: () => {\r\n if (!this.curveAnimations.includes(controller)) {\r\n this.curveAnimations.push(controller)\r\n }\r\n controller.pause = false\r\n },\r\n destroy: () => {\r\n const index = this.curveAnimations.indexOf(controller)\r\n if (index > -1) {\r\n this.curveAnimations.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n return controller\r\n }\r\n\r\n /**\r\n * 物体沿曲线运动\r\n */\r\n animateAlongCurve(\r\n object: THREE.Object3D,\r\n curve: THREE.Curve<THREE.Vector3>,\r\n options?: {\r\n speed?: number\r\n lookAhead?: boolean\r\n onComplete?: () => void\r\n }\r\n ): CurveAnimationController {\r\n const controller = this.createCurveAnimation(curve, options?.speed ?? 1)\r\n\r\n controller.frameCallback = (point) => {\r\n object.position.copy(point)\r\n\r\n // 朝向前方\r\n if (options?.lookAhead) {\r\n const nextT = Math.min(controller.time + 0.01, 1)\r\n const nextPoint = curve.getPointAt(nextT)\r\n object.lookAt(nextPoint)\r\n }\r\n }\r\n\r\n controller.frameEndCallback = options?.onComplete ?? null\r\n\r\n return controller\r\n }\r\n\r\n // ============ 工具方法 ============\r\n\r\n /**\r\n * 停止所有动画\r\n */\r\n stopAll(): void {\r\n // 停止模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => action.stop())\r\n }\r\n this.mixers = []\r\n\r\n // 停止曲线动画\r\n this.curveAnimations = []\r\n\r\n // 停止补间动画\r\n for (const tween of this.tweens) {\r\n tween.kill()\r\n }\r\n this.tweens = []\r\n }\r\n\r\n /**\r\n * 暂停所有动画\r\n */\r\n pauseAll(): void {\r\n // 暂停模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => {\r\n action.paused = true\r\n })\r\n }\r\n\r\n // 暂停曲线动画\r\n for (const anim of this.curveAnimations) {\r\n anim.pause = true\r\n }\r\n\r\n // 暂停补间动画\r\n for (const tween of this.tweens) {\r\n tween.pause()\r\n }\r\n }\r\n\r\n /**\r\n * 恢复所有动画\r\n */\r\n resumeAll(): void {\r\n // 恢复模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => {\r\n action.paused = false\r\n })\r\n }\r\n\r\n // 恢复曲线动画\r\n for (const anim of this.curveAnimations) {\r\n anim.pause = false\r\n }\r\n\r\n // 恢复补间动画\r\n for (const tween of this.tweens) {\r\n tween.resume()\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { DrawMode, PointMode, ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 绘制插件配置\r\n */\r\nexport interface DrawingPluginConfig {\r\n defaultMode: DrawMode\r\n defaultPointMode: PointMode\r\n defaultMaterialType: string\r\n fenceHeight: number\r\n lineWidth: number\r\n}\r\n\r\n/**\r\n * 绘制结果\r\n */\r\nexport interface DrawResult {\r\n mesh: THREE.Object3D\r\n points: THREE.Vector3[]\r\n mode: DrawMode\r\n}\r\n\r\n/**\r\n * 默认绘制配置\r\n */\r\nexport const DEFAULT_DRAWING_CONFIG: DrawingPluginConfig = {\r\n defaultMode: '围栏物体',\r\n defaultPointMode: '场景交点',\r\n defaultMaterialType: '标准材质',\r\n fenceHeight: 5,\r\n lineWidth: 0.01\r\n}\r\n\r\n/**\r\n * 绘制插件\r\n * 提供场景绘制功能(围栏、平面、曲线、直线)\r\n */\r\nexport class DrawingPlugin extends Plugin<DrawingPluginConfig> {\r\n readonly name = 'drawing'\r\n\r\n /** 当前绘制模式 */\r\n private _mode: DrawMode\r\n\r\n /** 当前点位模式 */\r\n private _pointMode: PointMode\r\n\r\n /** 当前绘制的点列表 */\r\n private currentPoints: THREE.Vector3[] = []\r\n\r\n /** 预览网格 */\r\n private previewMesh: THREE.Object3D | null = null\r\n\r\n /** 是否正在绘制 */\r\n private _isDrawing = false\r\n\r\n /** 已绘制的物体列表 */\r\n private drawnObjects: DrawResult[] = []\r\n\r\n constructor(config?: Partial<DrawingPluginConfig>) {\r\n super({ ...DEFAULT_DRAWING_CONFIG, ...config })\r\n this._mode = this.config.defaultMode\r\n this._pointMode = this.config.defaultPointMode\r\n }\r\n\r\n /**\r\n * 获取当前绘制模式\r\n */\r\n get mode(): DrawMode {\r\n return this._mode\r\n }\r\n\r\n /**\r\n * 获取当前点位模式\r\n */\r\n get pointMode(): PointMode {\r\n return this._pointMode\r\n }\r\n\r\n /**\r\n * 是否正在绘制\r\n */\r\n get isDrawing(): boolean {\r\n return this._isDrawing\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.cancel()\r\n // 清理预览网格\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置绘制模式\r\n */\r\n setMode(mode: DrawMode): void {\r\n this._mode = mode\r\n }\r\n\r\n /**\r\n * 设置点位模式\r\n */\r\n setPointMode(mode: PointMode): void {\r\n this._pointMode = mode\r\n }\r\n\r\n /**\r\n * 开始绘制\r\n */\r\n start(): void {\r\n this._isDrawing = true\r\n this.currentPoints = []\r\n this.events.emit('draw:start', { mode: this._mode })\r\n }\r\n\r\n /**\r\n * 添加点\r\n */\r\n addPoint(point: THREE.Vector3): void {\r\n if (!this._isDrawing) {\r\n this.start()\r\n }\r\n\r\n this.currentPoints.push(point.clone())\r\n this.events.emit('draw:point', { point })\r\n\r\n // 更新预览\r\n this.updatePreview()\r\n }\r\n\r\n /**\r\n * 处理场景点击\r\n */\r\n handleSceneClick(point: THREE.Vector3, object?: ExtendedObject3D): void {\r\n let targetPoint = point\r\n\r\n // 根据点位模式处理\r\n if (this._pointMode === '地图区域中心' && object?.geoInfo?.properties?.centroidCoord3) {\r\n const parent = object.parent as ExtendedObject3D\r\n if (parent?.getTransformedVector) {\r\n const centroid = object.geoInfo.properties.centroidCoord3.clone()\r\n centroid.add(object.position)\r\n if (object.initTranslate) {\r\n centroid.sub(object.initTranslate)\r\n }\r\n targetPoint = parent.getTransformedVector(centroid)\r\n }\r\n } else if (this._pointMode === '地图行政中心' && object?.geoInfo?.properties?.centerCoord3) {\r\n const parent = object.parent as ExtendedObject3D\r\n if (parent?.getTransformedVector) {\r\n const center = object.geoInfo.properties.centerCoord3.clone()\r\n center.add(object.position)\r\n if (object.initTranslate) {\r\n center.sub(object.initTranslate)\r\n }\r\n targetPoint = parent.getTransformedVector(center)\r\n }\r\n }\r\n\r\n this.addPoint(targetPoint)\r\n }\r\n\r\n /**\r\n * 完成绘制\r\n */\r\n complete(): DrawResult | null {\r\n if (this.currentPoints.length < 2) {\r\n console.warn('Need at least 2 points to complete drawing')\r\n return null\r\n }\r\n\r\n let mesh: THREE.Object3D\r\n\r\n switch (this._mode) {\r\n case '围栏物体':\r\n mesh = this.createFence(this.currentPoints)\r\n break\r\n case '平面绘制':\r\n mesh = this.createPlane(this.currentPoints)\r\n break\r\n case '曲线路径':\r\n mesh = this.createCurve(this.currentPoints)\r\n break\r\n case '直线路径':\r\n mesh = this.createLine(this.currentPoints)\r\n break\r\n default:\r\n return null\r\n }\r\n\r\n // 标记为绘制物体\r\n (mesh as ExtendedObject3D).isDrawMesh = true\r\n\r\n // 添加到场景\r\n this.scene.add(mesh)\r\n\r\n // 清理预览\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n\r\n const result: DrawResult = {\r\n mesh,\r\n points: [...this.currentPoints],\r\n mode: this._mode\r\n }\r\n\r\n this.drawnObjects.push(result)\r\n this._isDrawing = false\r\n this.currentPoints = []\r\n\r\n this.events.emit('draw:complete', { mesh })\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 取消绘制\r\n */\r\n cancel(): void {\r\n this._isDrawing = false\r\n this.currentPoints = []\r\n\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n\r\n this.events.emit('draw:cancel', undefined)\r\n }\r\n\r\n /**\r\n * 撤销最后一个点\r\n */\r\n undoPoint(): void {\r\n if (this.currentPoints.length > 0) {\r\n this.currentPoints.pop()\r\n this.updatePreview()\r\n }\r\n }\r\n\r\n /**\r\n * 更新预览\r\n */\r\n private updatePreview(): void {\r\n if (this.currentPoints.length < 2) return\r\n\r\n // 移除旧预览\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n }\r\n\r\n // 创建新预览\r\n switch (this._mode) {\r\n case '围栏物体':\r\n this.previewMesh = this.createFence(this.currentPoints, true)\r\n break\r\n case '平面绘制':\r\n this.previewMesh = this.createPlane(this.currentPoints, true)\r\n break\r\n case '曲线路径':\r\n this.previewMesh = this.createCurve(this.currentPoints, true)\r\n break\r\n case '直线路径':\r\n this.previewMesh = this.createLine(this.currentPoints, true)\r\n break\r\n }\r\n\r\n if (this.previewMesh) {\r\n this.scene.add(this.previewMesh)\r\n }\r\n }\r\n\r\n /**\r\n * 创建围栏\r\n */\r\n private createFence(points: THREE.Vector3[], isPreview = false): THREE.Mesh {\r\n const height = this.config.fenceHeight\r\n const vertices: number[] = []\r\n const indices: number[] = []\r\n const uvs: number[] = []\r\n\r\n // 生成顶点\r\n for (let i = 0; i < points.length; i++) {\r\n const p = points[i]\r\n // 底部点\r\n vertices.push(p.x, p.y, p.z)\r\n // 顶部点\r\n vertices.push(p.x, p.y + height, p.z)\r\n\r\n // UV\r\n const u = i / (points.length - 1)\r\n uvs.push(u, 0)\r\n uvs.push(u, 1)\r\n }\r\n\r\n // 生成索引\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const base = i * 2\r\n // 两个三角形组成一个面\r\n indices.push(base, base + 1, base + 2)\r\n indices.push(base + 1, base + 3, base + 2)\r\n }\r\n\r\n const geometry = new THREE.BufferGeometry()\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\r\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2))\r\n geometry.setIndex(indices)\r\n geometry.computeVertexNormals()\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: isPreview ? 0x00ff00 : 0x4488ff,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: isPreview ? 0.5 : 0.8\r\n })\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = 'Fence'\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建平面\r\n */\r\n private createPlane(points: THREE.Vector3[], isPreview = false): THREE.Mesh {\r\n if (points.length < 3) {\r\n // 不足3点,创建简单线条\r\n return this.createLine(points, isPreview) as THREE.Mesh\r\n }\r\n\r\n // 使用 Shape 创建平面\r\n const shape = new THREE.Shape()\r\n shape.moveTo(points[0].x, points[0].z)\r\n for (let i = 1; i < points.length; i++) {\r\n shape.lineTo(points[i].x, points[i].z)\r\n }\r\n shape.closePath()\r\n\r\n const geometry = new THREE.ShapeGeometry(shape)\r\n\r\n // 旋转到 XZ 平面\r\n geometry.rotateX(-Math.PI / 2)\r\n\r\n // 设置 Y 位置\r\n const avgY = points.reduce((sum, p) => sum + p.y, 0) / points.length\r\n geometry.translate(0, avgY, 0)\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: isPreview ? 0x00ff00 : 0x4488ff,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: isPreview ? 0.5 : 0.8\r\n })\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = 'Plane'\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建曲线\r\n */\r\n private createCurve(points: THREE.Vector3[], isPreview = false): THREE.Object3D {\r\n const curve = new THREE.CatmullRomCurve3(points)\r\n const curvePoints = curve.getPoints(50)\r\n\r\n const geometry = new THREE.BufferGeometry().setFromPoints(curvePoints)\r\n\r\n const material = new THREE.LineBasicMaterial({\r\n color: isPreview ? 0x00ff00 : 0xff4488,\r\n linewidth: 2\r\n })\r\n\r\n const line = new THREE.Line(geometry, material)\r\n line.name = 'Curve'\r\n\r\n // 保存曲线路径\r\n ;(line as ExtendedObject3D).isCurveMesh = true\r\n ;(line as ExtendedObject3D).curvePath = curve\r\n\r\n return line\r\n }\r\n\r\n /**\r\n * 创建直线\r\n */\r\n private createLine(points: THREE.Vector3[], isPreview = false): THREE.Object3D {\r\n const geometry = new THREE.BufferGeometry().setFromPoints(points)\r\n\r\n const material = new THREE.LineBasicMaterial({\r\n color: isPreview ? 0x00ff00 : 0xffff00,\r\n linewidth: 2\r\n })\r\n\r\n const line = new THREE.Line(geometry, material)\r\n line.name = 'Line'\r\n\r\n return line\r\n }\r\n\r\n /**\r\n * 获取所有绘制的物体\r\n */\r\n getDrawnObjects(): DrawResult[] {\r\n return this.drawnObjects\r\n }\r\n\r\n /**\r\n * 删除绘制的物体\r\n */\r\n removeDrawnObject(mesh: THREE.Object3D): void {\r\n const index = this.drawnObjects.findIndex(d => d.mesh === mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n this.drawnObjects.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有绘制的物体\r\n */\r\n clearAll(): void {\r\n for (const result of this.drawnObjects) {\r\n this.scene.remove(result.mesh)\r\n }\r\n this.drawnObjects = []\r\n }\r\n\r\n /**\r\n * 获取场景中的所有曲线\r\n */\r\n getCurveList(): Array<{ path: THREE.Curve<THREE.Vector3>; mesh: THREE.Object3D }> {\r\n return this.scene.children\r\n .filter(obj => (obj as ExtendedObject3D).isCurveMesh)\r\n .map(obj => ({\r\n path: (obj as ExtendedObject3D).curvePath!,\r\n mesh: obj\r\n }))\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport proj4 from 'proj4'\r\nimport { Plugin } from '../Plugin'\r\nimport type { GeoMapPluginConfig } from '../../types/config.types'\r\nimport type { ExtendedObject3D, GeoInfo } from '../../types/core.types'\r\n\r\n/**\r\n * GeoJSON Feature\r\n */\r\nexport interface GeoJSONFeature {\r\n type: 'Feature'\r\n properties: Record<string, any>\r\n geometry: {\r\n type: 'Polygon' | 'MultiPolygon'\r\n coordinates: number[][][] | number[][][][]\r\n }\r\n}\r\n\r\n/**\r\n * GeoJSON 数据\r\n */\r\nexport interface GeoJSONData {\r\n type: 'FeatureCollection'\r\n features: GeoJSONFeature[]\r\n}\r\n\r\n/**\r\n * 地图组信息\r\n */\r\nexport interface GeoGroupInfo {\r\n group: THREE.Group\r\n url: string\r\n materialType: string\r\n features: GeoJSONFeature[]\r\n}\r\n\r\n/**\r\n * 默认地图配置\r\n */\r\nexport const DEFAULT_GEOMAP_CONFIG: GeoMapPluginConfig = {\r\n materialType: '标准材质',\r\n coordinateScale: 10000\r\n}\r\n\r\n/**\r\n * 地图插件\r\n * 提供 GeoJSON 地图加载和渲染功能\r\n */\r\nexport class GeoMapPlugin extends Plugin<GeoMapPluginConfig> {\r\n readonly name = 'geomap'\r\n\r\n /** 已加载的地图组 */\r\n private geoGroups: GeoGroupInfo[] = []\r\n\r\n /** 加载完成回调 */\r\n onGroupLoaded?: (group: THREE.Group) => void\r\n\r\n /** 所有地图加载完成回调 */\r\n onAllLoaded?: () => void\r\n\r\n constructor(config?: Partial<GeoMapPluginConfig>) {\r\n super({ ...DEFAULT_GEOMAP_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n /**\r\n * 加载 GeoJSON 地图\r\n */\r\n async load(url: string, options?: {\r\n materialType?: string\r\n depth?: number\r\n color?: number\r\n opacity?: number\r\n }): Promise<THREE.Group> {\r\n const response = await fetch(url)\r\n const data: GeoJSONData = await response.json()\r\n\r\n const group = this.createGeoGroup(data, {\r\n materialType: options?.materialType ?? this.config.materialType,\r\n depth: options?.depth ?? 1,\r\n color: options?.color ?? 0x4488ff,\r\n opacity: options?.opacity ?? 0.8\r\n })\r\n\r\n // 标记为地图组\r\n ;(group as ExtendedObject3D).isGeoGroup = true\r\n\r\n // 设置中心点\r\n this.centerGroup(group)\r\n\r\n // 添加到场景\r\n this.scene.add(group)\r\n\r\n // 保存信息\r\n this.geoGroups.push({\r\n group,\r\n url,\r\n materialType: options?.materialType ?? this.config.materialType,\r\n features: data.features\r\n })\r\n\r\n // 触发回调\r\n this.onGroupLoaded?.(group)\r\n this.events.emit('geomap:load:complete', { group })\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 创建地图组\r\n */\r\n private createGeoGroup(data: GeoJSONData, options: {\r\n materialType: string\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Group {\r\n const group = new THREE.Group()\r\n group.name = 'GeoGroup'\r\n\r\n for (const feature of data.features) {\r\n const meshes = this.createFeatureMeshes(feature, options)\r\n for (const mesh of meshes) {\r\n group.add(mesh)\r\n }\r\n }\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 创建 Feature 网格\r\n */\r\n private createFeatureMeshes(feature: GeoJSONFeature, options: {\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Mesh[] {\r\n const meshes: THREE.Mesh[] = []\r\n const { geometry, properties } = feature\r\n\r\n let polygons: number[][][][] = []\r\n\r\n if (geometry.type === 'Polygon') {\r\n polygons = [geometry.coordinates as number[][][]]\r\n } else if (geometry.type === 'MultiPolygon') {\r\n polygons = geometry.coordinates as number[][][][]\r\n }\r\n\r\n for (const polygon of polygons) {\r\n const mesh = this.createPolygonMesh(polygon, options)\r\n mesh.name = properties.name || 'Region'\r\n\r\n // 保存地理信息\r\n const geoInfo: GeoInfo = {\r\n properties: { ...properties }\r\n }\r\n\r\n // 计算中心点\r\n if (properties.center) {\r\n geoInfo.properties!.centerCoord3 = this.coordToVector3(properties.center)\r\n }\r\n if (properties.centroid) {\r\n geoInfo.properties!.centroidCoord3 = this.coordToVector3(properties.centroid)\r\n }\r\n\r\n ;(mesh as ExtendedObject3D).geoInfo = geoInfo\r\n\r\n meshes.push(mesh)\r\n }\r\n\r\n return meshes\r\n }\r\n\r\n /**\r\n * 创建多边形网格\r\n */\r\n private createPolygonMesh(polygon: number[][][], options: {\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Mesh {\r\n // 外环\r\n const outerRing = polygon[0]\r\n const shape = new THREE.Shape()\r\n\r\n const firstPoint = this.coordToVector2(outerRing[0])\r\n shape.moveTo(firstPoint.x, firstPoint.y)\r\n\r\n for (let i = 1; i < outerRing.length; i++) {\r\n const point = this.coordToVector2(outerRing[i])\r\n shape.lineTo(point.x, point.y)\r\n }\r\n\r\n shape.closePath()\r\n\r\n // 内环(孔洞)\r\n for (let i = 1; i < polygon.length; i++) {\r\n const hole = new THREE.Path()\r\n const holeRing = polygon[i]\r\n const holeFirst = this.coordToVector2(holeRing[0])\r\n hole.moveTo(holeFirst.x, holeFirst.y)\r\n\r\n for (let j = 1; j < holeRing.length; j++) {\r\n const point = this.coordToVector2(holeRing[j])\r\n hole.lineTo(point.x, point.y)\r\n }\r\n\r\n shape.holes.push(hole)\r\n }\r\n\r\n // 创建挤压几何体\r\n const geometry = new THREE.ExtrudeGeometry(shape, {\r\n depth: options.depth,\r\n bevelEnabled: false\r\n })\r\n\r\n // 旋转到 XZ 平面\r\n geometry.rotateX(-Math.PI / 2)\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: options.color,\r\n transparent: true,\r\n opacity: options.opacity,\r\n side: THREE.DoubleSide\r\n })\r\n\r\n return new THREE.Mesh(geometry, material)\r\n }\r\n\r\n /**\r\n * 经纬度转二维坐标\r\n */\r\n coordToVector2(coord: number[]): THREE.Vector2 {\r\n const [lng, lat] = coord\r\n const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [lng, lat])\r\n return new THREE.Vector2(x / this.config.coordinateScale, y / this.config.coordinateScale)\r\n }\r\n\r\n /**\r\n * 经纬度转三维坐标\r\n */\r\n coordToVector3(coord: number[]): THREE.Vector3 {\r\n const [lng, lat] = coord\r\n const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [lng, lat])\r\n return new THREE.Vector3(x / this.config.coordinateScale, 0, y / this.config.coordinateScale)\r\n }\r\n\r\n /**\r\n * 将组中心移到原点\r\n */\r\n private centerGroup(group: THREE.Group): void {\r\n const box = new THREE.Box3().setFromObject(group)\r\n const center = new THREE.Vector3()\r\n box.getCenter(center)\r\n\r\n // 保存偏移量\r\n ;(group as ExtendedObject3D).translationOriginDiff = center.clone()\r\n\r\n // 添加坐标转换方法\r\n ;(group as ExtendedObject3D).getTransformedVector = (vec3: THREE.Vector3) => {\r\n const transformed = vec3.clone()\r\n transformed.sub(center)\r\n transformed.multiply(group.scale)\r\n transformed.applyEuler(group.rotation)\r\n transformed.add(group.position)\r\n return transformed\r\n }\r\n\r\n // 移动子物体\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.position.sub(center)\r\n ;(child as ExtendedObject3D).initTranslate = child.position.clone()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取所有地图组\r\n */\r\n getGeoGroups(): GeoGroupInfo[] {\r\n return this.geoGroups\r\n }\r\n\r\n /**\r\n * 移除地图组\r\n */\r\n removeGeoGroup(group: THREE.Group): void {\r\n const index = this.geoGroups.findIndex(g => g.group === group)\r\n if (index > -1) {\r\n this.scene.remove(group)\r\n this.geoGroups.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有地图\r\n */\r\n clearAll(): void {\r\n for (const info of this.geoGroups) {\r\n this.scene.remove(info.group)\r\n }\r\n this.geoGroups = []\r\n }\r\n\r\n /**\r\n * 根据名称查找区域\r\n */\r\n findRegionByName(name: string): THREE.Mesh | null {\r\n for (const info of this.geoGroups) {\r\n const found = info.group.children.find(\r\n child => child.name === name\r\n ) as THREE.Mesh | undefined\r\n\r\n if (found) return found\r\n }\r\n return null\r\n }\r\n\r\n /**\r\n * 高亮区域\r\n */\r\n highlightRegion(mesh: THREE.Mesh, color: number = 0xff0000): void {\r\n if (mesh.material instanceof THREE.MeshStandardMaterial) {\r\n mesh.material.emissive.setHex(color)\r\n mesh.material.emissiveIntensity = 0.3\r\n }\r\n }\r\n\r\n /**\r\n * 取消高亮\r\n */\r\n unhighlightRegion(mesh: THREE.Mesh): void {\r\n if (mesh.material instanceof THREE.MeshStandardMaterial) {\r\n mesh.material.emissiveIntensity = 0\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 几何体类型\r\n */\r\nexport type GeometryType =\r\n | '立方体'\r\n | '球体'\r\n | '圆柱体'\r\n | '圆锥体'\r\n | '平面'\r\n | '圆环'\r\n | '圆环结'\r\n | '十二面体'\r\n | '二十面体'\r\n | '八面体'\r\n | '四面体'\r\n | '胶囊体'\r\n\r\n/**\r\n * 几何体参数\r\n */\r\nexport interface GeometryParams {\r\n // 立方体\r\n width?: number\r\n height?: number\r\n depth?: number\r\n widthSegments?: number\r\n heightSegments?: number\r\n depthSegments?: number\r\n\r\n // 球体\r\n radius?: number\r\n phiStart?: number\r\n phiLength?: number\r\n thetaStart?: number\r\n thetaLength?: number\r\n\r\n // 圆柱体/圆锥体\r\n radiusTop?: number\r\n radiusBottom?: number\r\n radialSegments?: number\r\n openEnded?: boolean\r\n\r\n // 圆环\r\n tube?: number\r\n tubularSegments?: number\r\n arc?: number\r\n\r\n // 圆环结\r\n p?: number\r\n q?: number\r\n\r\n // 胶囊体\r\n capSegments?: number\r\n}\r\n\r\n/**\r\n * 几何体插件配置\r\n */\r\nexport interface GeometryPluginConfig {\r\n defaultSize: number\r\n}\r\n\r\n/**\r\n * 默认几何体配置\r\n */\r\nexport const DEFAULT_GEOMETRY_CONFIG: GeometryPluginConfig = {\r\n defaultSize: 1\r\n}\r\n\r\n/**\r\n * 几何体插件\r\n * 提供内置几何体创建功能\r\n */\r\nexport class GeometryPlugin extends Plugin<GeometryPluginConfig> {\r\n readonly name = 'geometry'\r\n\r\n /** 几何体类型列表 */\r\n readonly geometryTypes: GeometryType[] = [\r\n '立方体', '球体', '圆柱体', '圆锥体', '平面',\r\n '圆环', '圆环结', '十二面体', '二十面体', '八面体', '四面体', '胶囊体'\r\n ]\r\n\r\n /** 已创建的内置物体 */\r\n private innerMeshes: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<GeometryPluginConfig>) {\r\n super({ ...DEFAULT_GEOMETRY_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n /**\r\n * 创建几何体\r\n */\r\n createGeometry(type: GeometryType, params?: GeometryParams): THREE.BufferGeometry {\r\n const size = this.config.defaultSize\r\n const p = params || {}\r\n\r\n switch (type) {\r\n case '立方体':\r\n return new THREE.BoxGeometry(\r\n p.width ?? size,\r\n p.height ?? size,\r\n p.depth ?? size,\r\n p.widthSegments ?? 1,\r\n p.heightSegments ?? 1,\r\n p.depthSegments ?? 1\r\n )\r\n\r\n case '球体':\r\n return new THREE.SphereGeometry(\r\n p.radius ?? size / 2,\r\n p.widthSegments ?? 32,\r\n p.heightSegments ?? 16,\r\n p.phiStart ?? 0,\r\n p.phiLength ?? Math.PI * 2,\r\n p.thetaStart ?? 0,\r\n p.thetaLength ?? Math.PI\r\n )\r\n\r\n case '圆柱体':\r\n return new THREE.CylinderGeometry(\r\n p.radiusTop ?? size / 2,\r\n p.radiusBottom ?? size / 2,\r\n p.height ?? size,\r\n p.radialSegments ?? 32,\r\n p.heightSegments ?? 1,\r\n p.openEnded ?? false\r\n )\r\n\r\n case '圆锥体':\r\n return new THREE.ConeGeometry(\r\n p.radius ?? size / 2,\r\n p.height ?? size,\r\n p.radialSegments ?? 32,\r\n p.heightSegments ?? 1,\r\n p.openEnded ?? false\r\n )\r\n\r\n case '平面':\r\n return new THREE.PlaneGeometry(\r\n p.width ?? size,\r\n p.height ?? size,\r\n p.widthSegments ?? 1,\r\n p.heightSegments ?? 1\r\n )\r\n\r\n case '圆环':\r\n return new THREE.TorusGeometry(\r\n p.radius ?? size / 2,\r\n p.tube ?? size / 6,\r\n p.radialSegments ?? 16,\r\n p.tubularSegments ?? 100,\r\n p.arc ?? Math.PI * 2\r\n )\r\n\r\n case '圆环结':\r\n return new THREE.TorusKnotGeometry(\r\n p.radius ?? size / 2,\r\n p.tube ?? size / 6,\r\n p.tubularSegments ?? 64,\r\n p.radialSegments ?? 8,\r\n p.p ?? 2,\r\n p.q ?? 3\r\n )\r\n\r\n case '十二面体':\r\n return new THREE.DodecahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '二十面体':\r\n return new THREE.IcosahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '八面体':\r\n return new THREE.OctahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '四面体':\r\n return new THREE.TetrahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '胶囊体':\r\n return new THREE.CapsuleGeometry(\r\n p.radius ?? size / 4,\r\n p.height ?? size / 2,\r\n p.capSegments ?? 4,\r\n p.radialSegments ?? 8\r\n )\r\n\r\n default:\r\n return new THREE.BoxGeometry(size, size, size)\r\n }\r\n }\r\n\r\n /**\r\n * 创建内置网格物体\r\n */\r\n createMesh(\r\n geometryType: GeometryType,\r\n material?: THREE.Material,\r\n params?: GeometryParams\r\n ): THREE.Mesh {\r\n const geometry = this.createGeometry(geometryType, params)\r\n\r\n // 保存几何体类型\r\n ;(geometry as any).geometryType = geometryType\r\n\r\n const mesh = new THREE.Mesh(\r\n geometry,\r\n material ?? new THREE.MeshStandardMaterial({ color: 0x808080 })\r\n )\r\n\r\n mesh.name = geometryType\r\n\r\n // 标记为内置物体\r\n ;(mesh as ExtendedObject3D).isInnerMesh = true\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 添加内置物体到场景\r\n */\r\n addToScene(\r\n geometryType: GeometryType,\r\n material?: THREE.Material,\r\n params?: GeometryParams\r\n ): THREE.Mesh {\r\n const mesh = this.createMesh(geometryType, material, params)\r\n this.scene.add(mesh)\r\n this.innerMeshes.push(mesh)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建简单立方体\r\n */\r\n createBox(size: number = 1, color: number = 0xffffff): THREE.Mesh {\r\n const geometry = new THREE.BoxGeometry(size, size, size)\r\n const material = new THREE.MeshBasicMaterial({ color })\r\n const mesh = new THREE.Mesh(geometry, material)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 获取所有内置物体\r\n */\r\n getInnerMeshes(): THREE.Mesh[] {\r\n return this.innerMeshes\r\n }\r\n\r\n /**\r\n * 移除内置物体\r\n */\r\n removeMesh(mesh: THREE.Mesh): void {\r\n const index = this.innerMeshes.indexOf(mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n this.innerMeshes.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有内置物体\r\n */\r\n clearAll(): void {\r\n for (const mesh of this.innerMeshes) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n }\r\n this.innerMeshes = []\r\n }\r\n\r\n /**\r\n * 更新几何体参数\r\n */\r\n updateGeometry(mesh: THREE.Mesh, type: GeometryType, params?: GeometryParams): void {\r\n const oldGeometry = mesh.geometry\r\n mesh.geometry = this.createGeometry(type, params)\r\n ;(mesh.geometry as any).geometryType = type\r\n oldGeometry.dispose()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 材质类型\r\n */\r\nexport type MaterialType =\r\n | '基础材质'\r\n | '标准材质'\r\n | '物理材质'\r\n | 'Lambert材质'\r\n | 'Phong材质'\r\n | 'Toon材质'\r\n | '法线材质'\r\n | '深度材质'\r\n\r\n/**\r\n * 材质参数\r\n */\r\nexport interface MaterialParams {\r\n color?: number | string\r\n opacity?: number\r\n transparent?: boolean\r\n side?: THREE.Side\r\n wireframe?: boolean\r\n flatShading?: boolean\r\n map?: THREE.Texture\r\n emissive?: number | string\r\n emissiveIntensity?: number\r\n roughness?: number\r\n metalness?: number\r\n envMapIntensity?: number\r\n}\r\n\r\n/**\r\n * 材质插件配置\r\n */\r\nexport interface MaterialPluginConfig {\r\n defaultType: MaterialType\r\n defaultColor: number\r\n}\r\n\r\n/**\r\n * 默认材质配置\r\n */\r\nexport const DEFAULT_MATERIAL_CONFIG: MaterialPluginConfig = {\r\n defaultType: '标准材质',\r\n defaultColor: 0x808080\r\n}\r\n\r\n/**\r\n * 材质插件\r\n * 提供材质创建和管理功能\r\n */\r\nexport class MaterialPlugin extends Plugin<MaterialPluginConfig> {\r\n readonly name = 'material'\r\n\r\n /** 材质类型列表 */\r\n readonly materialTypes: MaterialType[] = [\r\n '基础材质', '标准材质', '物理材质', 'Lambert材质',\r\n 'Phong材质', 'Toon材质', '法线材质', '深度材质'\r\n ]\r\n\r\n constructor(config?: Partial<MaterialPluginConfig>) {\r\n super({ ...DEFAULT_MATERIAL_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 创建材质\r\n */\r\n createMaterial(type: MaterialType, params?: MaterialParams): THREE.Material {\r\n const p = params || {}\r\n const color = p.color ?? this.config.defaultColor\r\n\r\n const commonParams = {\r\n color,\r\n opacity: p.opacity ?? 1,\r\n transparent: p.transparent ?? false,\r\n side: p.side ?? THREE.FrontSide,\r\n wireframe: p.wireframe ?? false\r\n }\r\n\r\n switch (type) {\r\n case '基础材质':\r\n return new THREE.MeshBasicMaterial({\r\n ...commonParams,\r\n map: p.map\r\n })\r\n\r\n case '标准材质':\r\n return new THREE.MeshStandardMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1,\r\n roughness: p.roughness ?? 0.5,\r\n metalness: p.metalness ?? 0.5,\r\n envMapIntensity: p.envMapIntensity ?? 1\r\n })\r\n\r\n case '物理材质':\r\n return new THREE.MeshPhysicalMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1,\r\n roughness: p.roughness ?? 0.5,\r\n metalness: p.metalness ?? 0.5,\r\n envMapIntensity: p.envMapIntensity ?? 1\r\n })\r\n\r\n case 'Lambert材质':\r\n return new THREE.MeshLambertMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1\r\n })\r\n\r\n case 'Phong材质':\r\n return new THREE.MeshPhongMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1\r\n })\r\n\r\n case 'Toon材质':\r\n return new THREE.MeshToonMaterial({\r\n ...commonParams,\r\n map: p.map\r\n })\r\n\r\n case '法线材质':\r\n return new THREE.MeshNormalMaterial({\r\n opacity: p.opacity ?? 1,\r\n transparent: p.transparent ?? false,\r\n side: p.side ?? THREE.FrontSide,\r\n wireframe: p.wireframe ?? false,\r\n flatShading: p.flatShading ?? false\r\n })\r\n\r\n case '深度材质':\r\n return new THREE.MeshDepthMaterial({\r\n opacity: p.opacity ?? 1,\r\n wireframe: p.wireframe ?? false\r\n })\r\n\r\n default:\r\n return new THREE.MeshStandardMaterial(commonParams)\r\n }\r\n }\r\n\r\n /**\r\n * 修改网格材质\r\n */\r\n changeMaterial(mesh: THREE.Mesh, params: MaterialParams): void {\r\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]\r\n\r\n // 保存原始材质用于恢复\r\n if (!(mesh as any)._originalMaterials) {\r\n (mesh as any)._originalMaterials = materials.map(m => m.clone())\r\n }\r\n\r\n for (const material of materials) {\r\n this.applyParams(material, params)\r\n }\r\n }\r\n\r\n /**\r\n * 修改组材质\r\n */\r\n changeGroupMaterial(group: THREE.Group, params: MaterialParams): void {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n this.changeMaterial(child as THREE.Mesh, params)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 应用参数到材质\r\n */\r\n private applyParams(material: THREE.Material, params: MaterialParams): void {\r\n const mat = material as any\r\n\r\n if (params.color !== undefined) {\r\n if (mat.color) mat.color.set(params.color)\r\n }\r\n if (params.opacity !== undefined) {\r\n mat.opacity = params.opacity\r\n }\r\n if (params.transparent !== undefined) {\r\n mat.transparent = params.transparent\r\n }\r\n if (params.side !== undefined) {\r\n mat.side = params.side\r\n }\r\n if (params.wireframe !== undefined) {\r\n mat.wireframe = params.wireframe\r\n }\r\n if (params.emissive !== undefined && mat.emissive) {\r\n mat.emissive.set(params.emissive)\r\n }\r\n if (params.emissiveIntensity !== undefined) {\r\n mat.emissiveIntensity = params.emissiveIntensity\r\n }\r\n if (params.roughness !== undefined) {\r\n mat.roughness = params.roughness\r\n }\r\n if (params.metalness !== undefined) {\r\n mat.metalness = params.metalness\r\n }\r\n\r\n material.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 恢复原始材质\r\n */\r\n revertMaterial(mesh: THREE.Mesh): void {\r\n const originalMaterials = (mesh as any)._originalMaterials\r\n if (!originalMaterials) return\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((m, i) => {\r\n if (originalMaterials[i]) {\r\n this.copyMaterialProperties(originalMaterials[i], m)\r\n }\r\n })\r\n } else if (originalMaterials[0]) {\r\n this.copyMaterialProperties(originalMaterials[0], mesh.material)\r\n }\r\n }\r\n\r\n /**\r\n * 恢复组的原始材质\r\n */\r\n revertGroupMaterial(group: THREE.Group): void {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n this.revertMaterial(child as THREE.Mesh)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 复制材质属性\r\n */\r\n private copyMaterialProperties(source: THREE.Material, target: THREE.Material): void {\r\n const src = source as any\r\n const tgt = target as any\r\n\r\n if (src.color && tgt.color) tgt.color.copy(src.color)\r\n if (src.emissive && tgt.emissive) tgt.emissive.copy(src.emissive)\r\n tgt.opacity = src.opacity\r\n tgt.transparent = src.transparent\r\n tgt.side = src.side\r\n if (src.wireframe !== undefined) tgt.wireframe = src.wireframe\r\n if (src.emissiveIntensity !== undefined) tgt.emissiveIntensity = src.emissiveIntensity\r\n if (src.roughness !== undefined) tgt.roughness = src.roughness\r\n if (src.metalness !== undefined) tgt.metalness = src.metalness\r\n\r\n target.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 克隆物体材质\r\n */\r\n cloneMaterial(object: THREE.Object3D): void {\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n ;(mesh as any).isCloneMaterial = true\r\n ;(mesh as any).originMaterial = mesh.material\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material = mesh.material.map(m => m.clone())\r\n } else {\r\n mesh.material = mesh.material.clone()\r\n }\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取物体的所有材质\r\n */\r\n getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ParticlePluginConfig } from '../../types/config.types'\r\nimport type { ParticleSportType, ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 粒子系统信息\r\n */\r\nexport interface ParticleSystemInfo {\r\n mesh: THREE.Points\r\n velocities: Float32Array\r\n config: ParticleConfig\r\n}\r\n\r\n/**\r\n * 粒子配置\r\n */\r\nexport interface ParticleConfig {\r\n particlesSum: number\r\n inner: number\r\n outer: number\r\n maxVelocity: number\r\n mapUrl: string\r\n sportType: ParticleSportType\r\n size: number\r\n color: number\r\n opacity: number\r\n}\r\n\r\n/**\r\n * 默认粒子配置\r\n */\r\nexport const DEFAULT_PARTICLE_CONFIG: ParticlePluginConfig = {\r\n particlesSum: 10000,\r\n inner: 0,\r\n outer: 100,\r\n maxVelocity: 10,\r\n mapUrl: '',\r\n shaderCodeName: '雪片着色',\r\n sportType: '全随机'\r\n}\r\n\r\n/**\r\n * 粒子插件\r\n * 提供粒子系统创建和管理功能\r\n */\r\nexport class ParticlePlugin extends Plugin<ParticlePluginConfig> {\r\n readonly name = 'particle'\r\n\r\n /** 运动方式列表 */\r\n readonly sportTypes: ParticleSportType[] = [\r\n '全随机', '随机向下', '随机向上', '直线匀速向上', '直线匀速向下'\r\n ]\r\n\r\n /** 粒子系统列表 */\r\n private particleSystems: ParticleSystemInfo[] = []\r\n\r\n /** 纹理加载器 */\r\n private textureLoader = new THREE.TextureLoader()\r\n\r\n constructor(config?: Partial<ParticlePluginConfig>) {\r\n super({ ...DEFAULT_PARTICLE_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新所有粒子系统\r\n for (const system of this.particleSystems) {\r\n this.updateParticleSystem(system, delta)\r\n }\r\n }\r\n\r\n /**\r\n * 创建粒子系统\r\n */\r\n createParticleSystem(config?: Partial<ParticleConfig>): THREE.Points {\r\n const cfg: ParticleConfig = {\r\n particlesSum: config?.particlesSum ?? this.config.particlesSum,\r\n inner: config?.inner ?? this.config.inner,\r\n outer: config?.outer ?? this.config.outer,\r\n maxVelocity: config?.maxVelocity ?? this.config.maxVelocity,\r\n mapUrl: config?.mapUrl ?? this.config.mapUrl,\r\n sportType: config?.sportType ?? (this.config.sportType as ParticleSportType),\r\n size: config?.size ?? 1,\r\n color: config?.color ?? 0xffffff,\r\n opacity: config?.opacity ?? 1\r\n }\r\n\r\n const { particlesSum, inner, outer, maxVelocity, sportType } = cfg\r\n\r\n // 创建几何体\r\n const geometry = new THREE.BufferGeometry()\r\n const positions = new Float32Array(particlesSum * 3)\r\n const velocities = new Float32Array(particlesSum * 3)\r\n\r\n // 初始化粒子位置和速度\r\n for (let i = 0; i < particlesSum; i++) {\r\n const i3 = i * 3\r\n\r\n // 随机位置(球形分布)\r\n const radius = inner + Math.random() * (outer - inner)\r\n const theta = Math.random() * Math.PI * 2\r\n const phi = Math.acos(2 * Math.random() - 1)\r\n\r\n positions[i3] = radius * Math.sin(phi) * Math.cos(theta)\r\n positions[i3 + 1] = radius * Math.sin(phi) * Math.sin(theta)\r\n positions[i3 + 2] = radius * Math.cos(phi)\r\n\r\n // 根据运动方式设置速度\r\n switch (sportType) {\r\n case '全随机':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity\r\n velocities[i3 + 1] = (Math.random() - 0.5) * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity\r\n break\r\n case '随机向下':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n velocities[i3 + 1] = -Math.random() * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n break\r\n case '随机向上':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n velocities[i3 + 1] = Math.random() * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n break\r\n case '直线匀速向上':\r\n velocities[i3] = 0\r\n velocities[i3 + 1] = maxVelocity\r\n velocities[i3 + 2] = 0\r\n break\r\n case '直线匀速向下':\r\n velocities[i3] = 0\r\n velocities[i3 + 1] = -maxVelocity\r\n velocities[i3 + 2] = 0\r\n break\r\n }\r\n }\r\n\r\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3))\r\n\r\n // 创建材质\r\n const material = new THREE.PointsMaterial({\r\n size: cfg.size,\r\n color: cfg.color,\r\n transparent: true,\r\n opacity: cfg.opacity,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending\r\n })\r\n\r\n // 加载纹理\r\n if (cfg.mapUrl) {\r\n this.textureLoader.load(cfg.mapUrl, (texture) => {\r\n material.map = texture\r\n material.needsUpdate = true\r\n })\r\n }\r\n\r\n // 创建粒子系统\r\n const points = new THREE.Points(geometry, material)\r\n points.name = 'ParticleSystem'\r\n\r\n // 标记为粒子物体\r\n ;(points as ExtendedObject3D).isParticleMesh = true\r\n\r\n // 保存系统信息\r\n const systemInfo: ParticleSystemInfo = {\r\n mesh: points,\r\n velocities,\r\n config: cfg\r\n }\r\n this.particleSystems.push(systemInfo)\r\n\r\n return points\r\n }\r\n\r\n /**\r\n * 添加粒子系统到场景\r\n */\r\n addToScene(config?: Partial<ParticleConfig>): THREE.Points {\r\n const points = this.createParticleSystem(config)\r\n this.scene.add(points)\r\n return points\r\n }\r\n\r\n /**\r\n * 更新粒子系统\r\n */\r\n private updateParticleSystem(system: ParticleSystemInfo, delta: number): void {\r\n const { mesh, velocities, config } = system\r\n const positions = mesh.geometry.attributes.position.array as Float32Array\r\n const { inner, outer, sportType } = config\r\n\r\n for (let i = 0; i < positions.length; i += 3) {\r\n // 更新位置\r\n positions[i] += velocities[i] * delta\r\n positions[i + 1] += velocities[i + 1] * delta\r\n positions[i + 2] += velocities[i + 2] * delta\r\n\r\n // 计算到中心的距离\r\n const distance = Math.sqrt(\r\n positions[i] ** 2 +\r\n positions[i + 1] ** 2 +\r\n positions[i + 2] ** 2\r\n )\r\n\r\n // 边界检测和重置\r\n if (distance > outer || distance < inner) {\r\n // 重新生成位置\r\n const radius = inner + Math.random() * (outer - inner)\r\n const theta = Math.random() * Math.PI * 2\r\n const phi = Math.acos(2 * Math.random() - 1)\r\n\r\n positions[i] = radius * Math.sin(phi) * Math.cos(theta)\r\n positions[i + 1] = radius * Math.sin(phi) * Math.sin(theta)\r\n positions[i + 2] = radius * Math.cos(phi)\r\n }\r\n }\r\n\r\n mesh.geometry.attributes.position.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 获取所有粒子系统\r\n */\r\n getParticleSystems(): ParticleSystemInfo[] {\r\n return this.particleSystems\r\n }\r\n\r\n /**\r\n * 移除粒子系统\r\n */\r\n removeParticleSystem(mesh: THREE.Points): void {\r\n const index = this.particleSystems.findIndex(s => s.mesh === mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n ;(mesh.material as THREE.Material).dispose()\r\n this.particleSystems.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有粒子系统\r\n */\r\n clearAll(): void {\r\n for (const system of this.particleSystems) {\r\n this.scene.remove(system.mesh)\r\n system.mesh.geometry.dispose()\r\n ;(system.mesh.material as THREE.Material).dispose()\r\n }\r\n this.particleSystems = []\r\n }\r\n\r\n /**\r\n * 暂停/恢复粒子系统\r\n */\r\n setEnabled(mesh: THREE.Points, enabled: boolean): void {\r\n mesh.visible = enabled\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport * as CANNON from 'cannon-es'\r\nimport { Plugin } from '../Plugin'\r\nimport type { PhysicsPluginConfig } from '../../types/config.types'\r\nimport { getObjectBox3 } from '../../utils/box3'\r\n\r\n/**\r\n * 物理刚体信息\r\n */\r\nexport interface PhysicsBodyInfo {\r\n body: CANNON.Body\r\n mesh: THREE.Object3D\r\n isUpdate: boolean\r\n}\r\n\r\n/**\r\n * 默认物理配置\r\n */\r\nexport const DEFAULT_PHYSICS_CONFIG: PhysicsPluginConfig = {\r\n gravity: { x: 0, y: -9.82, z: 0 },\r\n defaultMass: 1\r\n}\r\n\r\n/**\r\n * 物理插件\r\n * 提供基于 cannon-es 的物理模拟功能\r\n */\r\nexport class PhysicsPlugin extends Plugin<PhysicsPluginConfig> {\r\n readonly name = 'physics'\r\n\r\n /** 物理世界 */\r\n private world!: CANNON.World\r\n\r\n /** 刚体列表 */\r\n private bodies: PhysicsBodyInfo[] = []\r\n\r\n /** 是否启用物理模拟 */\r\n private _enabled = true\r\n\r\n constructor(config?: Partial<PhysicsPluginConfig>) {\r\n super({ ...DEFAULT_PHYSICS_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取物理世界\r\n */\r\n get physicsWorld(): CANNON.World {\r\n return this.world\r\n }\r\n\r\n /**\r\n * 是否启用\r\n */\r\n get enabled(): boolean {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n }\r\n\r\n protected onInstall(): void {\r\n // 创建物理世界\r\n this.world = new CANNON.World()\r\n this.world.gravity.set(\r\n this.config.gravity.x,\r\n this.config.gravity.y,\r\n this.config.gravity.z\r\n )\r\n\r\n // 设置碰撞检测\r\n this.world.broadphase = new CANNON.NaiveBroadphase()\r\n // solver.iterations may not exist in all versions\r\n if ((this.world.solver as any).iterations !== undefined) {\r\n (this.world.solver as any).iterations = 10\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n if (!this._enabled) return\r\n\r\n // 更新物理世界\r\n this.world.step(1 / 60, delta, 3)\r\n\r\n // 同步物体位置\r\n for (const info of this.bodies) {\r\n if (info.isUpdate) {\r\n info.mesh.position.copy(info.body.position as any)\r\n info.mesh.quaternion.copy(info.body.quaternion as any)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置重力\r\n */\r\n setGravity(x: number, y: number, z: number): void {\r\n this.world.gravity.set(x, y, z)\r\n this.config.gravity = { x, y, z }\r\n }\r\n\r\n /**\r\n * 为物体添加物理刚体\r\n */\r\n addBody(\r\n mesh: THREE.Object3D,\r\n options?: {\r\n mass?: number\r\n shape?: 'box' | 'sphere' | 'cylinder'\r\n isStatic?: boolean\r\n friction?: number\r\n restitution?: number\r\n }\r\n ): CANNON.Body {\r\n const { center, max, min, radius } = getObjectBox3(mesh)\r\n const mass = options?.isStatic ? 0 : (options?.mass ?? this.config.defaultMass)\r\n\r\n // 创建形状\r\n let shape: CANNON.Shape\r\n\r\n switch (options?.shape) {\r\n case 'sphere':\r\n shape = new CANNON.Sphere(radius)\r\n break\r\n case 'cylinder':\r\n const cylinderRadius = Math.max(max.x - min.x, max.z - min.z) / 2\r\n const cylinderHeight = max.y - min.y\r\n shape = new CANNON.Cylinder(cylinderRadius, cylinderRadius, cylinderHeight, 16)\r\n break\r\n case 'box':\r\n default:\r\n shape = new CANNON.Box(new CANNON.Vec3(\r\n (max.x - min.x) / 2,\r\n (max.y - min.y) / 2,\r\n (max.z - min.z) / 2\r\n ))\r\n break\r\n }\r\n\r\n // 创建刚体\r\n const body = new CANNON.Body({\r\n mass,\r\n shape,\r\n position: new CANNON.Vec3(center.x, center.y, center.z)\r\n })\r\n\r\n // 设置材质属性\r\n if (options?.friction !== undefined || options?.restitution !== undefined) {\r\n body.material = new CANNON.Material()\r\n if (options.friction !== undefined) {\r\n body.material.friction = options.friction\r\n }\r\n if (options.restitution !== undefined) {\r\n body.material.restitution = options.restitution\r\n }\r\n }\r\n\r\n // 添加到物理世界\r\n this.world.addBody(body)\r\n\r\n // 保存信息\r\n const info: PhysicsBodyInfo = {\r\n body,\r\n mesh,\r\n isUpdate: !options?.isStatic\r\n }\r\n this.bodies.push(info)\r\n\r\n // 保存到物体\r\n ;(mesh as any).physicsBody = body\r\n\r\n return body\r\n }\r\n\r\n /**\r\n * 添加地面\r\n */\r\n addGround(y: number = 0): CANNON.Body {\r\n const groundBody = new CANNON.Body({\r\n mass: 0,\r\n shape: new CANNON.Plane(),\r\n position: new CANNON.Vec3(0, y, 0)\r\n })\r\n groundBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0)\r\n\r\n this.world.addBody(groundBody)\r\n\r\n return groundBody\r\n }\r\n\r\n /**\r\n * 移除刚体\r\n */\r\n removeBody(mesh: THREE.Object3D): void {\r\n const index = this.bodies.findIndex(b => b.mesh === mesh)\r\n if (index > -1) {\r\n const info = this.bodies[index]\r\n this.world.removeBody(info.body)\r\n this.bodies.splice(index, 1)\r\n delete (mesh as any).physicsBody\r\n }\r\n }\r\n\r\n /**\r\n * 获取物体的刚体\r\n */\r\n getBody(mesh: THREE.Object3D): CANNON.Body | undefined {\r\n const info = this.bodies.find(b => b.mesh === mesh)\r\n return info?.body\r\n }\r\n\r\n /**\r\n * 设置刚体是否更新\r\n */\r\n setBodyUpdate(mesh: THREE.Object3D, isUpdate: boolean): void {\r\n const info = this.bodies.find(b => b.mesh === mesh)\r\n if (info) {\r\n info.isUpdate = isUpdate\r\n if (isUpdate) {\r\n // 同步当前位置到物理世界\r\n info.body.position.copy(mesh.position as any)\r\n info.body.quaternion.copy(mesh.quaternion as any)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 施加力\r\n */\r\n applyForce(mesh: THREE.Object3D, force: THREE.Vector3, point?: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n const forceVec = new CANNON.Vec3(force.x, force.y, force.z)\r\n if (point) {\r\n const pointVec = new CANNON.Vec3(point.x, point.y, point.z)\r\n body.applyForce(forceVec, pointVec)\r\n } else {\r\n body.applyForce(forceVec)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 施加冲量\r\n */\r\n applyImpulse(mesh: THREE.Object3D, impulse: THREE.Vector3, point?: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n const impulseVec = new CANNON.Vec3(impulse.x, impulse.y, impulse.z)\r\n if (point) {\r\n const pointVec = new CANNON.Vec3(point.x, point.y, point.z)\r\n body.applyImpulse(impulseVec, pointVec)\r\n } else {\r\n body.applyImpulse(impulseVec)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置速度\r\n */\r\n setVelocity(mesh: THREE.Object3D, velocity: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n body.velocity.set(velocity.x, velocity.y, velocity.z)\r\n }\r\n }\r\n\r\n /**\r\n * 重置刚体\r\n */\r\n resetBody(mesh: THREE.Object3D): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n body.velocity.setZero()\r\n body.angularVelocity.setZero()\r\n body.position.copy(mesh.position as any)\r\n body.quaternion.copy(mesh.quaternion as any)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有刚体\r\n */\r\n clearAll(): void {\r\n for (const info of this.bodies) {\r\n this.world.removeBody(info.body)\r\n delete (info.mesh as any).physicsBody\r\n }\r\n this.bodies = []\r\n }\r\n\r\n /**\r\n * 获取所有刚体信息\r\n */\r\n getBodies(): PhysicsBodyInfo[] {\r\n return this.bodies\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { FontLoader, Font } from 'three/examples/jsm/loaders/FontLoader.js'\r\nimport { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 文本配置\r\n */\r\nexport interface TextConfig {\r\n text: string\r\n fontUrl: string\r\n size?: number\r\n height?: number\r\n curveSegments?: number\r\n bevelEnabled?: boolean\r\n bevelThickness?: number\r\n bevelSize?: number\r\n bevelOffset?: number\r\n bevelSegments?: number\r\n color?: number\r\n materialType?: 'basic' | 'standard' | 'phong'\r\n}\r\n\r\n/**\r\n * 文本插件配置\r\n */\r\nexport interface TextPluginConfig {\r\n defaultFontUrl: string\r\n defaultSize: number\r\n defaultHeight: number\r\n}\r\n\r\n/**\r\n * 默认文本配置\r\n */\r\nexport const DEFAULT_TEXT_CONFIG: TextPluginConfig = {\r\n defaultFontUrl: 'https://z2586300277.github.io/three-editor/dist/files/font/cn1.json',\r\n defaultSize: 1,\r\n defaultHeight: 0.2\r\n}\r\n\r\n/**\r\n * 文本插件\r\n * 提供 3D 文本创建功能\r\n */\r\nexport class TextPlugin extends Plugin<TextPluginConfig> {\r\n readonly name = 'text'\r\n\r\n /** 字体加载器 */\r\n private fontLoader = new FontLoader()\r\n\r\n /** 字体缓存 */\r\n private fontCache = new Map<string, Font>()\r\n\r\n /** 已创建的文本物体 */\r\n private textMeshes: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<TextPluginConfig>) {\r\n super({ ...DEFAULT_TEXT_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n this.fontCache.clear()\r\n }\r\n\r\n /**\r\n * 加载字体\r\n */\r\n async loadFont(url: string): Promise<Font> {\r\n // 检查缓存\r\n const cached = this.fontCache.get(url)\r\n if (cached) return cached\r\n\r\n return new Promise((resolve, reject) => {\r\n this.fontLoader.load(\r\n url,\r\n (font) => {\r\n this.fontCache.set(url, font)\r\n resolve(font)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 创建文本几何体\r\n */\r\n async createTextGeometry(config: TextConfig): Promise<TextGeometry> {\r\n const font = await this.loadFont(config.fontUrl || this.config.defaultFontUrl)\r\n\r\n const geometry = new TextGeometry(config.text, {\r\n font,\r\n size: config.size ?? this.config.defaultSize,\r\n height: config.height ?? this.config.defaultHeight,\r\n curveSegments: config.curveSegments ?? 12,\r\n bevelEnabled: config.bevelEnabled ?? false,\r\n bevelThickness: config.bevelThickness ?? 0.1,\r\n bevelSize: config.bevelSize ?? 0.05,\r\n bevelOffset: config.bevelOffset ?? 0,\r\n bevelSegments: config.bevelSegments ?? 3\r\n })\r\n\r\n // 居中\r\n geometry.computeBoundingBox()\r\n geometry.center()\r\n\r\n return geometry\r\n }\r\n\r\n /**\r\n * 创建文本网格\r\n */\r\n async createTextMesh(config: TextConfig): Promise<THREE.Mesh> {\r\n const geometry = await this.createTextGeometry(config)\r\n\r\n // 创建材质\r\n let material: THREE.Material\r\n\r\n switch (config.materialType) {\r\n case 'basic':\r\n material = new THREE.MeshBasicMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n case 'phong':\r\n material = new THREE.MeshPhongMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n case 'standard':\r\n default:\r\n material = new THREE.MeshStandardMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n }\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = config.text\r\n\r\n // 标记为文本物体\r\n ;(mesh as ExtendedObject3D).isTextMesh = true\r\n ;(mesh as any).fontLink = config.fontUrl || this.config.defaultFontUrl\r\n ;(mesh as any).text = config.text\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 添加文本到场景\r\n */\r\n async addToScene(config: TextConfig): Promise<THREE.Mesh> {\r\n const mesh = await this.createTextMesh(config)\r\n this.scene.add(mesh)\r\n this.textMeshes.push(mesh)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 更新文本内容\r\n */\r\n async updateText(mesh: THREE.Mesh, newText: string): Promise<void> {\r\n const fontUrl = (mesh as any).fontLink || this.config.defaultFontUrl\r\n const oldGeometry = mesh.geometry\r\n\r\n const newGeometry = await this.createTextGeometry({\r\n text: newText,\r\n fontUrl\r\n })\r\n\r\n mesh.geometry = newGeometry\r\n mesh.name = newText\r\n ;(mesh as any).text = newText\r\n\r\n oldGeometry.dispose()\r\n }\r\n\r\n /**\r\n * 获取所有文本物体\r\n */\r\n getTextMeshes(): THREE.Mesh[] {\r\n return this.textMeshes\r\n }\r\n\r\n /**\r\n * 移除文本物体\r\n */\r\n removeTextMesh(mesh: THREE.Mesh): void {\r\n const index = this.textMeshes.indexOf(mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n this.textMeshes.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有文本物体\r\n */\r\n clearAll(): void {\r\n for (const mesh of this.textMeshes) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n }\r\n this.textMeshes = []\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 雾配置\r\n */\r\nexport interface FogConfig {\r\n enabled: boolean\r\n type: 'linear' | 'exponential'\r\n color: number\r\n near?: number\r\n far?: number\r\n density?: number\r\n}\r\n\r\n/**\r\n * 天空盒配置\r\n */\r\nexport interface SkyboxConfig {\r\n type: 'color' | 'texture' | 'cubeTexture' | 'hdr' | 'equirectangular'\r\n color?: number\r\n url?: string\r\n urls?: string[]\r\n}\r\n\r\n/**\r\n * 环境插件配置\r\n */\r\nexport interface EnvironmentPluginConfig {\r\n fog: FogConfig\r\n skybox: SkyboxConfig | null\r\n environmentMap: string | null\r\n environmentIntensity: number\r\n backgroundBlurriness: number\r\n backgroundIntensity: number\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_ENVIRONMENT_CONFIG: EnvironmentPluginConfig = {\r\n fog: {\r\n enabled: false,\r\n type: 'linear',\r\n color: 0xcccccc,\r\n near: 1,\r\n far: 1000,\r\n density: 0.00025\r\n },\r\n skybox: null,\r\n environmentMap: null,\r\n environmentIntensity: 1,\r\n backgroundBlurriness: 0,\r\n backgroundIntensity: 1\r\n}\r\n\r\n/**\r\n * 环境插件\r\n * 提供雾、天空盒、环境贴图等环境功能\r\n */\r\nexport class EnvironmentPlugin extends Plugin<EnvironmentPluginConfig> {\r\n readonly name = 'environment'\r\n\r\n /** RGBE 加载器 */\r\n private rgbeLoader = new RGBELoader()\r\n\r\n /** 立方体纹理加载器 */\r\n private cubeTextureLoader = new THREE.CubeTextureLoader()\r\n\r\n /** 纹理加载器 */\r\n private textureLoader = new THREE.TextureLoader()\r\n\r\n /** 当前环境贴图 */\r\n private currentEnvMap: THREE.Texture | null = null\r\n\r\n /** 当前背景 */\r\n private currentBackground: THREE.Color | THREE.Texture | null = null\r\n\r\n constructor(config?: Partial<EnvironmentPluginConfig>) {\r\n super({ ...DEFAULT_ENVIRONMENT_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 应用初始配置\r\n if (this.config.fog.enabled) {\r\n this.setFog(this.config.fog)\r\n }\r\n if (this.config.skybox) {\r\n this.setSkybox(this.config.skybox)\r\n }\r\n if (this.config.environmentMap) {\r\n this.setEnvironmentMap(this.config.environmentMap)\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearFog()\r\n this.clearBackground()\r\n this.clearEnvironmentMap()\r\n }\r\n\r\n /**\r\n * 设置雾\r\n */\r\n setFog(config: Partial<FogConfig>): void {\r\n Object.assign(this.config.fog, config)\r\n\r\n if (!this.config.fog.enabled) {\r\n this.clearFog()\r\n return\r\n }\r\n\r\n const color = new THREE.Color(this.config.fog.color)\r\n\r\n if (this.config.fog.type === 'linear') {\r\n this.scene.fog = new THREE.Fog(\r\n color,\r\n this.config.fog.near ?? 1,\r\n this.config.fog.far ?? 1000\r\n )\r\n } else {\r\n this.scene.fog = new THREE.FogExp2(\r\n color,\r\n this.config.fog.density ?? 0.00025\r\n )\r\n }\r\n }\r\n\r\n /**\r\n * 清除雾\r\n */\r\n clearFog(): void {\r\n this.scene.fog = null\r\n this.config.fog.enabled = false\r\n }\r\n\r\n /**\r\n * 更新雾颜色\r\n */\r\n setFogColor(color: number): void {\r\n this.config.fog.color = color\r\n if (this.scene.fog) {\r\n this.scene.fog.color.setHex(color)\r\n }\r\n }\r\n\r\n /**\r\n * 设置天空盒/背景\r\n */\r\n async setSkybox(config: SkyboxConfig): Promise<void> {\r\n this.config.skybox = config\r\n\r\n switch (config.type) {\r\n case 'color':\r\n this.setBackgroundColor(config.color ?? 0x000000)\r\n break\r\n case 'texture':\r\n if (config.url) {\r\n await this.setBackgroundTexture(config.url)\r\n }\r\n break\r\n case 'cubeTexture':\r\n if (config.urls && config.urls.length === 6) {\r\n await this.setBackgroundCubeTexture(config.urls)\r\n }\r\n break\r\n case 'hdr':\r\n if (config.url) {\r\n await this.setBackgroundHDR(config.url)\r\n }\r\n break\r\n case 'equirectangular':\r\n if (config.url) {\r\n await this.setBackgroundEquirectangular(config.url)\r\n }\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n */\r\n setBackgroundColor(color: number): void {\r\n this.currentBackground = new THREE.Color(color)\r\n this.scene.background = this.currentBackground\r\n }\r\n\r\n /**\r\n * 设置背景纹理\r\n */\r\n async setBackgroundTexture(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(\r\n url,\r\n (texture) => {\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置立方体纹理背景\r\n */\r\n async setBackgroundCubeTexture(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(\r\n urls,\r\n (texture) => {\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置 HDR 背景\r\n */\r\n async setBackgroundHDR(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.rgbeLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置等距柱状投影背景\r\n */\r\n async setBackgroundEquirectangular(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 清除背景\r\n */\r\n clearBackground(): void {\r\n if (this.currentBackground instanceof THREE.Texture) {\r\n this.currentBackground.dispose()\r\n }\r\n this.scene.background = null\r\n this.currentBackground = null\r\n this.config.skybox = null\r\n }\r\n\r\n /**\r\n * 设置环境贴图\r\n */\r\n async setEnvironmentMap(url: string): Promise<THREE.Texture> {\r\n this.config.environmentMap = url\r\n\r\n return new Promise((resolve, reject) => {\r\n this.rgbeLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentEnvMap = texture\r\n this.scene.environment = texture\r\n // environmentIntensity is available in Three.js r155+\r\n if ('environmentIntensity' in this.scene) {\r\n (this.scene as any).environmentIntensity = this.config.environmentIntensity\r\n }\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置立方体环境贴图\r\n */\r\n async setCubeEnvironmentMap(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(\r\n urls,\r\n (texture) => {\r\n this.currentEnvMap = texture\r\n this.scene.environment = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 清除环境贴图\r\n */\r\n clearEnvironmentMap(): void {\r\n if (this.currentEnvMap) {\r\n this.currentEnvMap.dispose()\r\n }\r\n this.scene.environment = null\r\n this.currentEnvMap = null\r\n this.config.environmentMap = null\r\n }\r\n\r\n /**\r\n * 设置环境强度\r\n */\r\n setEnvironmentIntensity(intensity: number): void {\r\n this.config.environmentIntensity = intensity\r\n if ('environmentIntensity' in this.scene) {\r\n (this.scene as any).environmentIntensity = intensity\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景模糊度\r\n */\r\n setBackgroundBlurriness(blurriness: number): void {\r\n this.config.backgroundBlurriness = blurriness\r\n if ('backgroundBlurriness' in this.scene) {\r\n (this.scene as any).backgroundBlurriness = blurriness\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景强度\r\n */\r\n setBackgroundIntensity(intensity: number): void {\r\n this.config.backgroundIntensity = intensity\r\n if ('backgroundIntensity' in this.scene) {\r\n (this.scene as any).backgroundIntensity = intensity\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前环境贴图\r\n */\r\n getEnvironmentMap(): THREE.Texture | null {\r\n return this.currentEnvMap\r\n }\r\n\r\n /**\r\n * 获取当前背景\r\n */\r\n getBackground(): THREE.Color | THREE.Texture | null {\r\n return this.currentBackground\r\n }\r\n\r\n /**\r\n * 获取雾配置\r\n */\r\n getFogConfig(): FogConfig {\r\n return { ...this.config.fog }\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): EnvironmentPluginConfig {\r\n return { ...this.config }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 序列化数据结构\r\n */\r\nexport interface SerializedScene {\r\n version: string\r\n metadata: {\r\n generator: string\r\n timestamp: number\r\n }\r\n scene: {\r\n background: any\r\n fog: any\r\n environment: any\r\n }\r\n camera: {\r\n type: string\r\n position: { x: number; y: number; z: number }\r\n rotation: { x: number; y: number; z: number }\r\n fov?: number\r\n near: number\r\n far: number\r\n zoom: number\r\n }\r\n objects: SerializedObject[]\r\n plugins: Record<string, any>\r\n}\r\n\r\n/**\r\n * 序列化物体结构\r\n */\r\nexport interface SerializedObject {\r\n uuid: string\r\n name: string\r\n type: string\r\n position: { x: number; y: number; z: number }\r\n rotation: { x: number; y: number; z: number }\r\n scale: { x: number; y: number; z: number }\r\n visible: boolean\r\n userData: any\r\n children?: SerializedObject[]\r\n geometry?: any\r\n material?: any\r\n}\r\n\r\n/**\r\n * 序列化插件配置\r\n */\r\nexport interface SerializationPluginConfig {\r\n version: string\r\n includeGeometry: boolean\r\n includeMaterial: boolean\r\n includeUserData: boolean\r\n excludeHelpers: boolean\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_SERIALIZATION_CONFIG: SerializationPluginConfig = {\r\n version: '1.0.0',\r\n includeGeometry: false,\r\n includeMaterial: true,\r\n includeUserData: true,\r\n excludeHelpers: true\r\n}\r\n\r\n/**\r\n * 序列化插件\r\n * 提供场景保存和恢复功能\r\n */\r\nexport class SerializationPlugin extends Plugin<SerializationPluginConfig> {\r\n readonly name = 'serialization'\r\n\r\n constructor(config?: Partial<SerializationPluginConfig>) {\r\n super({ ...DEFAULT_SERIALIZATION_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 序列化场景\r\n */\r\n serialize(): SerializedScene {\r\n const scene = this.scene\r\n const camera = this.camera\r\n\r\n return {\r\n version: this.config.version,\r\n metadata: {\r\n generator: 'ThreeEditor',\r\n timestamp: Date.now()\r\n },\r\n scene: this.serializeSceneProperties(),\r\n camera: this.serializeCamera(camera),\r\n objects: this.serializeObjects(scene.children),\r\n plugins: this.serializePlugins()\r\n }\r\n }\r\n\r\n /**\r\n * 序列化场景属性\r\n */\r\n private serializeSceneProperties(): SerializedScene['scene'] {\r\n const scene = this.scene\r\n\r\n return {\r\n background: this.serializeBackground(scene.background),\r\n fog: this.serializeFog(scene.fog as THREE.Fog | THREE.FogExp2 | null),\r\n environment: scene.environment ? 'has_environment' : null\r\n }\r\n }\r\n\r\n /**\r\n * 序列化背景\r\n */\r\n private serializeBackground(background: THREE.Color | THREE.Texture | THREE.CubeTexture | null): any {\r\n if (!background) return null\r\n\r\n if (background instanceof THREE.Color) {\r\n return {\r\n type: 'color',\r\n value: background.getHex()\r\n }\r\n }\r\n\r\n if (background instanceof THREE.Texture) {\r\n return {\r\n type: 'texture',\r\n // 纹理 URL 需要从 userData 或其他地方获取\r\n url: (background as any).sourceFile || null\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 序列化雾\r\n */\r\n private serializeFog(fog: THREE.Fog | THREE.FogExp2 | null): any {\r\n if (!fog) return null\r\n\r\n if (fog instanceof THREE.Fog) {\r\n return {\r\n type: 'linear',\r\n color: fog.color.getHex(),\r\n near: fog.near,\r\n far: fog.far\r\n }\r\n }\r\n\r\n if (fog instanceof THREE.FogExp2) {\r\n return {\r\n type: 'exponential',\r\n color: fog.color.getHex(),\r\n density: fog.density\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 序列化相机\r\n */\r\n private serializeCamera(camera: THREE.Camera): SerializedScene['camera'] {\r\n const result: SerializedScene['camera'] = {\r\n type: camera.type,\r\n position: {\r\n x: camera.position.x,\r\n y: camera.position.y,\r\n z: camera.position.z\r\n },\r\n rotation: {\r\n x: camera.rotation.x,\r\n y: camera.rotation.y,\r\n z: camera.rotation.z\r\n },\r\n near: (camera as THREE.PerspectiveCamera).near,\r\n far: (camera as THREE.PerspectiveCamera).far,\r\n zoom: (camera as THREE.PerspectiveCamera).zoom\r\n }\r\n\r\n if (camera instanceof THREE.PerspectiveCamera) {\r\n result.fov = camera.fov\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化物体列表\r\n */\r\n private serializeObjects(objects: THREE.Object3D[]): SerializedObject[] {\r\n const result: SerializedObject[] = []\r\n\r\n for (const obj of objects) {\r\n // 排除辅助物体\r\n if (this.config.excludeHelpers && this.isHelper(obj)) {\r\n continue\r\n }\r\n\r\n const serialized = this.serializeObject(obj)\r\n if (serialized) {\r\n result.push(serialized)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化单个物体\r\n */\r\n private serializeObject(obj: THREE.Object3D): SerializedObject | null {\r\n const result: SerializedObject = {\r\n uuid: obj.uuid,\r\n name: obj.name,\r\n type: obj.type,\r\n position: {\r\n x: obj.position.x,\r\n y: obj.position.y,\r\n z: obj.position.z\r\n },\r\n rotation: {\r\n x: obj.rotation.x,\r\n y: obj.rotation.y,\r\n z: obj.rotation.z\r\n },\r\n scale: {\r\n x: obj.scale.x,\r\n y: obj.scale.y,\r\n z: obj.scale.z\r\n },\r\n visible: obj.visible,\r\n userData: this.config.includeUserData ? obj.userData : {}\r\n }\r\n\r\n // 序列化几何体\r\n if (this.config.includeGeometry && (obj as THREE.Mesh).geometry) {\r\n result.geometry = this.serializeGeometry((obj as THREE.Mesh).geometry)\r\n }\r\n\r\n // 序列化材质\r\n if (this.config.includeMaterial && (obj as THREE.Mesh).material) {\r\n result.material = this.serializeMaterial((obj as THREE.Mesh).material)\r\n }\r\n\r\n // 递归序列化子物体\r\n if (obj.children.length > 0) {\r\n result.children = this.serializeObjects(obj.children)\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化几何体\r\n */\r\n private serializeGeometry(geometry: THREE.BufferGeometry): any {\r\n return {\r\n type: geometry.type,\r\n uuid: geometry.uuid,\r\n parameters: (geometry as any).parameters || {}\r\n }\r\n }\r\n\r\n /**\r\n * 序列化材质\r\n */\r\n private serializeMaterial(material: THREE.Material | THREE.Material[]): any {\r\n if (Array.isArray(material)) {\r\n return material.map(m => this.serializeSingleMaterial(m))\r\n }\r\n return this.serializeSingleMaterial(material)\r\n }\r\n\r\n /**\r\n * 序列化单个材质\r\n */\r\n private serializeSingleMaterial(material: THREE.Material): any {\r\n const result: any = {\r\n type: material.type,\r\n uuid: material.uuid,\r\n name: material.name,\r\n opacity: material.opacity,\r\n transparent: material.transparent,\r\n visible: material.visible,\r\n side: material.side\r\n }\r\n\r\n // 添加颜色属性\r\n if ((material as THREE.MeshBasicMaterial).color) {\r\n result.color = (material as THREE.MeshBasicMaterial).color.getHex()\r\n }\r\n\r\n // 添加其他常用属性\r\n if ((material as THREE.MeshStandardMaterial).metalness !== undefined) {\r\n result.metalness = (material as THREE.MeshStandardMaterial).metalness\r\n }\r\n if ((material as THREE.MeshStandardMaterial).roughness !== undefined) {\r\n result.roughness = (material as THREE.MeshStandardMaterial).roughness\r\n }\r\n if ((material as THREE.MeshStandardMaterial).emissive) {\r\n result.emissive = (material as THREE.MeshStandardMaterial).emissive.getHex()\r\n }\r\n if ((material as THREE.MeshStandardMaterial).emissiveIntensity !== undefined) {\r\n result.emissiveIntensity = (material as THREE.MeshStandardMaterial).emissiveIntensity\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化插件状态\r\n */\r\n private serializePlugins(): Record<string, any> {\r\n const result: Record<string, any> = {}\r\n\r\n // 获取所有已安装的插件并序列化它们的配置\r\n // Note: This requires access to plugin manager through context\r\n const pluginManager = (this.context as any).pluginManager\r\n if (pluginManager && typeof pluginManager.getAll === 'function') {\r\n const plugins = pluginManager.getAll()\r\n for (const plugin of plugins) {\r\n if (plugin.name !== this.name && typeof (plugin as any).getConfig === 'function') {\r\n result[plugin.name] = (plugin as any).getConfig()\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 判断是否为辅助物体\r\n */\r\n private isHelper(obj: THREE.Object3D): boolean {\r\n return (\r\n obj.name.startsWith('__') ||\r\n obj.type.includes('Helper') ||\r\n obj.type === 'TransformControls' ||\r\n obj.type === 'TransformControlsPlane'\r\n )\r\n }\r\n\r\n /**\r\n * 反序列化场景\r\n */\r\n async deserialize(data: SerializedScene): Promise<void> {\r\n // 恢复相机\r\n this.deserializeCamera(data.camera)\r\n\r\n // 恢复场景属性\r\n this.deserializeSceneProperties(data.scene)\r\n\r\n // 恢复插件配置\r\n this.deserializePlugins(data.plugins)\r\n\r\n // 发出事件\r\n this.events.emit('scene:deserialized' as any, data)\r\n }\r\n\r\n /**\r\n * 反序列化相机\r\n */\r\n private deserializeCamera(cameraData: SerializedScene['camera']): void {\r\n const camera = this.camera\r\n\r\n camera.position.set(\r\n cameraData.position.x,\r\n cameraData.position.y,\r\n cameraData.position.z\r\n )\r\n\r\n camera.rotation.set(\r\n cameraData.rotation.x,\r\n cameraData.rotation.y,\r\n cameraData.rotation.z\r\n )\r\n\r\n if (camera instanceof THREE.PerspectiveCamera && cameraData.fov) {\r\n camera.fov = cameraData.fov\r\n camera.near = cameraData.near\r\n camera.far = cameraData.far\r\n camera.zoom = cameraData.zoom\r\n camera.updateProjectionMatrix()\r\n }\r\n }\r\n\r\n /**\r\n * 反序列化场景属性\r\n */\r\n private deserializeSceneProperties(sceneData: SerializedScene['scene']): void {\r\n // 恢复背景\r\n if (sceneData.background) {\r\n if (sceneData.background.type === 'color') {\r\n this.scene.background = new THREE.Color(sceneData.background.value)\r\n }\r\n }\r\n\r\n // 恢复雾\r\n if (sceneData.fog) {\r\n if (sceneData.fog.type === 'linear') {\r\n this.scene.fog = new THREE.Fog(\r\n sceneData.fog.color,\r\n sceneData.fog.near,\r\n sceneData.fog.far\r\n )\r\n } else if (sceneData.fog.type === 'exponential') {\r\n this.scene.fog = new THREE.FogExp2(\r\n sceneData.fog.color,\r\n sceneData.fog.density\r\n )\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 反序列化插件配置\r\n */\r\n private deserializePlugins(pluginsData: Record<string, any>): void {\r\n const pluginManager = (this.context as any).pluginManager\r\n if (!pluginManager || typeof pluginManager.get !== 'function') return\r\n\r\n for (const [pluginName, config] of Object.entries(pluginsData)) {\r\n const plugin = pluginManager.get(pluginName)\r\n if (plugin && typeof (plugin as any).setConfig === 'function') {\r\n (plugin as any).setConfig(config)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出为 JSON 字符串\r\n */\r\n toJSON(): string {\r\n return JSON.stringify(this.serialize(), null, 2)\r\n }\r\n\r\n /**\r\n * 从 JSON 字符串导入\r\n */\r\n async fromJSON(json: string): Promise<void> {\r\n const data = JSON.parse(json) as SerializedScene\r\n await this.deserialize(data)\r\n }\r\n\r\n /**\r\n * 下载场景文件\r\n */\r\n download(filename: string = 'scene.json'): void {\r\n const json = this.toJSON()\r\n const blob = new Blob([json], { type: 'application/json' })\r\n const url = URL.createObjectURL(blob)\r\n\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n link.click()\r\n\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n /**\r\n * 从文件加载场景\r\n */\r\n async loadFromFile(file: File): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = async (e) => {\r\n try {\r\n const json = e.target?.result as string\r\n await this.fromJSON(json)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n }\r\n }\r\n reader.onerror = reject\r\n reader.readAsText(file)\r\n })\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): SerializationPluginConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SerializationPluginConfig>): void {\r\n Object.assign(this.config, config)\r\n }\r\n}\r\n"],"names":["PluginManager","context","this","plugins","Map","pluginManager","plugin","name","has","dependencies","dep","Error","result","install","Promise","then","set","events","emit","catch","error","use","get","otherName","otherPlugin","includes","uninstall","delete","getAll","Array","from","values","getNames","keys","dispose","names","reverse","remove","Plugin","config","_installed","unsubscribers","registerLifecycleHooks","onInstall","onUninstall","unsubscribe","isInstalled","onSceneReady","on","scene","push","onUpdate","prototype","delta","elapsed","onResize","width","height","onBeforeDispose","engine","camera","renderer","event","callback","DEFAULT_ORBIT_CONFIG","enableDamping","dampingFactor","minDistance","maxDistance","minZoom","maxPolarAngle","Math","PI","enablePan","enableZoom","enableRotate","OrbitControllerPlugin","super","viewAngleList","controls","_controls","target","OrbitControls","domElement","applyConfig","subscribe","update","addEventListener","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","_composer","outlinePass","_outlinePass","_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","constructor","arguments","CSS2DObject","CSS3DObject","css2dRenderer","_css2dRenderer","css3dRenderer","_css3dRenderer","CSS3DRenderer","setupCSSRenderer","CSS2DRenderer","style","top","left","pointerEvents","zIndex","appendChild","removeChild","element","enablePointerEvents","copy","destroy","createCSS2DObject","createCSS3DObject","PRIMITIVE_INTERSECT_COST","BYTES_PER_NODE","FLOAT32_EPSILON","pow","SKIP_GENERATION","Symbol","DEFAULT_OPTIONS","strategy","maxDepth","maxLeafSize","useSharedArrayBuffer","setBoundingBox","onProgress","indirect","verbose","range","arrayToBox","nodeIndex32","array","min","max","getLongestEdgeIndex","bounds","splitDimIdx","splitDist","Infinity","i","dist","copyBounds","source","unionBounds","a","b","aVal","bVal","d","d3","expandByPrimitiveBounds","startIndex","primitiveBounds","tCenter","tHalf","tMin","tMax","computeSurfaceArea","d0","d1","d2","IS_LEAF","n16","uint16Array","OFFSET","n32","uint32Array","COUNT","LEFT_NODE","RIGHT_NODE","SPLIT_AXIS","BOUNDING_DATA_INDEX","getBounds","offset","count","centroidTarget","minx","miny","minz","maxx","maxy","maxz","cminx","cminy","cminz","cmaxx","cmaxy","cmaxz","boundsOffset","end","cx","hx","lx","rx","cy","hy","ly","ry","cz","hz","lz","rz","BIN_COUNT","binsSort","candidate","sahBins","fill","map","Float32Array","rightCacheBounds","leftCacheBounds","leftBounds","BVHNode","boundingData","float32Array","uint8Array","MAX_POINTER","countNodes","node","right","populateBuffer","byteOffset","buffer","Uint32Array","Uint16Array","Uint8Array","_populateBuffer","node32Index","node16Index","isLeaf","byteLength","splitAxis","rightByteOffset","relativeRightIndex","buildTree","bvh","options","partitionBuffer","primitiveBuffer","partitionStride","primitiveBufferStride","cacheCentroidBoundingData","reachedMaxDepth","root","splitNode","centroidBoundingData","depth","triggerProgress","split","nodeBoundingData","axis","pos","avg","rootSurfaceArea","bestCost","cStart","cEnd","axisLeft","binWidth","truncatedBins","length","c","bin","sort","splitCount","bi","center","leftCount","rightCount","rightBounds","leftProb","rightProb","cost","binIndex","lastBin","nextBin","binCount","splitOffset","stride","axisOffset","t0","l","r","tb","lstart","lcount","rstart","rcount","primitivesProcessed","buildPackedTree","BufferConstructor","SharedArrayBuffer","ArrayBuffer","rootRanges","getRootRanges","firstRange","lastRange","fullRange","computePrimitiveBounds","_roots","nodeCount","PrimitivePool","getNewPrimitive","_getNewPrimitive","_primitives","getPrimitive","primitives","pop","primitive","_BufferStack","stack","prevBuffer","setBuffer","clearBuffer","BufferStack","_box1","_box2","boxStack","boxPool","shapecast","intersectsBounds","intersectsRange","boundsTraverseOrder","nodeOffset","shapecastTraverse","geometry","releasePrimitive","intersectsBoundsFunc","intersectsRangeFunc","nodeScoreFunc","nodeIndexOffset","nodeIndex16","getLeftOffset","getRightEndOffset","score1","score2","box1","box2","c1","c2","temp","c1Intersection","c1StopTraversal","c2Intersection","c2StopTraversal","_tempBox","_tempBuffer","BVH","writePrimitiveBounds","targetBuffer","baseIndex","minX","minY","minZ","maxX","maxY","maxZ","abs","indirectBuffer","_indirectBuffer","roots","rootIndex","totalNodes","_traverse","refit","rootCount","nodeIndex","writePrimitiveRangeBounds","leftMin","leftMax","rightMin","rightMax","makeEmpty","union","callbacks","intersectsPrimitive","scratchPrimitive","iterate","originalIntersectsRange","contained","shapecastFunc","getVertexCount","geo","attributes","getTriCount","ensureIndex","vertexCount","setIndex","BufferAttribute","getRootPrimitiveRanges","drawRange","primitiveCount","start","floor","primitiveRanges","groups","group","ranges","drawRangeStart","drawRangeEnd","groupStart","groupEnd","isFinite","isStart","activeGroups","lastPos","newPos","GeometryBVH","primitiveStride","v","isBufferGeometry","isInterleavedBufferAttribute","resolvePrimitiveIndex","init","useUint32","reduce","acc","val","byteCount","boundingBox","getBoundingBox","raycastObject3D","iterateDirect","iterateIndirect","rest","selectedIterateFunc","SeparatingAxisBounds","points","field","p","dot","other","setFromBox","Vector3","boxMin","boxMax","closestPointLineToLine","dir1","dir2","v02","l1","l2","v0","v10","v2","v32","subVectors","d0232","d3210","d3232","d0210","denom","closestPointsSegmentToSegment","paramResult","temp1","temp2","target1","target2","at","closestPointToPoint","p2","closestPoint","closestPoint2","distanceToSquared","sphereIntersectTriangle","closestPointTemp","projectedPointTemp","planeTemp","Plane","lineTemp","Line3","sphere","triangle","distanceTo","plane","getPlane","distanceToPoint","pp","projectPoint","containsPoint","componentKeys","ZERO_EPSILON","isNearZero","ExtendedTriangle","Triangle","args","isExtendedTriangle","satAxes","satBounds","isDegenerateIntoSegment","isDegenerateIntoPoint","degenerateSegment","needsUpdate","axis0","sab0","getNormal","setFromPoints","axis1","sab1","axis2","sab2","axis3","sab3","lengthAB","lengthBC","lengthCA","setFromNormalAndCoplanarPoint","closestPointToSegment","point1","point2","edge","segment","distSq","closestDistanceSq","nexti","sqrt","intersectsTriangle","saTri2","cachedSatBounds","cachedSatBounds2","tmpVec","tempDir","edge1","edge2","tempPoint","bounds1","bounds2","coplanarIntersectsTriangle","self","suppressLog","planeNormal","normal","satBounds1","satAxes1","sb","sa","isSeparated","cross","satBounds2","satAxes2","crossVectors","findSingleBounds","aProj","bProj","cProj","aDist","bDist","cDist","t","multiplyScalar","findIntersectionLineBounds","abDist","acDist","intersectTriangleSegment","degenerateTriangle","startDist","endDist","intersectLine","intersectTrianglePoint","point","intersectSegmentPoint","segmentTri","pointTri","res","segment1","segment2","delta1","delta2","startDelta","u","addScaledVector","plane1","plane2","a1Dist","b1Dist","c1Dist","a1b1Dist","a1c1Dist","a2Dist","b2Dist","c2Dist","a2b2Dist","a2c2Dist","intersectionLine","componentIndex","maxComponent","comp1","key","a1Proj","b1Proj","c1Proj","a2Proj","b2Proj","c2Proj","tmp","distanceToTriangle","cornerFields","line1","line2","lineTarget","getCenter","otherVec","thisVec","f11","f12","i2","f21","f22","OrientedBox","matrix","isOrientedBox","Matrix4","invMatrix","alignedSatBounds","applyMatrix4","minVec","pi","setFromPointsField","invert","intersectsBox","aabbBounds","saTri","pointsArr","cachedAxis","triSatBounds","triSatAxes","sa1","sa2","clamp","distanceToBox","xyzFields","segments1","segments2","threshold2","i1","nextIndex","nextIndex2","index2","p1","f1","f2","f3","ExtendedTrianglePoolBase","ExtendedTrianglePool","IS_GT_REVISION_169","parseInt","REVISION","IS_LT_REVISION_161","_vA","_vB","_vC","_uvA","_uvB","_uvC","_normalA","_normalB","_normalC","_intersectionPoint","checkBufferGeometryIntersection","ray","uv","uv1","near","far","fromBufferAttribute","intersection","pA","pB","pC","intersect","BackSide","intersectTriangle","distance","origin","getInterpolation","uv2","direction","face","materialIndex","faceIndex","barycoord","getBarycoord","getSide","materialOrSide","isMaterial","intersectTri","tri","intersections","triOffset","getX","firstIndex","setTriangle","ta","tc","i0","getY","getZ","iterateOverTriangles","intersectsTriangleFunc","nodeIndices","indexArr","posAttr","force","forceChildren","includesLeft","includesRight","leftNodeId","rightNodeId","traverseRight","leftChange","rightChange","didChange","left_i","right_i","minLeftValue","maxLeftValue","minRightValue","maxRightValue","intersectRay","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","ox","oy","oz","isNaN","iterateOverTriangles_indirect","resolveTriangleIndex","raycast","intersects","_raycast","leftIndex","rightIndex","_xyzFields","raycastFirst","_raycastFirst","xyzAxis","leftToRight","c1Result","c2Result","triangle2","invertedMat","obb","obb2","intersectsGeometry","otherGeometry","geometryToBvh","_intersectsGeometry","cachedObb","computeBoundingBox","thisGeometry","thisIndex","thisPos","otherIndex","otherPos","boundsTree","otherTriangleCount","tempMatrix","temp3","temp4","closestPointToGeometry","minThreshold","maxThreshold","tempTarget1","tempTargetDest1","tempTarget2","tempTargetDest2","closestDistance","closestDistanceTriIndex","closestDistanceOtherTriIndex","score","otherOffset","otherCount","sub","refit_indirect","j","raycast_indirect","raycastFirst_indirect","intersectsGeometry_indirect","ti","closestPointToGeometry_indirect","otherBvh","ti2","_bufferStack1","_bufferStack2","_boxPool","_leftBox1","_rightBox1","_leftBox2","_rightBox2","_active","node1Index32","node2Index32","matrix2to1","matrix1to2","intersectsRangesFunc","node1IndexOffset","node2IndexOffset","depth1","depth2","currBox","reversed","bufferStack1","bufferStack2","float32Array1","uint32Array1","uint16Array1","float32Array2","uint32Array2","uint16Array2","node2Index16","isLeaf1","isLeaf2","newBox","cl1","cr1","intersectCl1","intersectCr1","cl2","cr2","leftIntersects","rightIntersects","convertRaycastIntersect","hit","raycaster","matrixWorld","_obb","_ray","Ray","_direction","_inverseMatrix","_worldScale","_getters","MeshBVH","cloneBuffers","rootData","indexAttribute","getIndex","version","slice","data","Boolean","newIndex","maxLeafTris","shiftPrimitiveOffsets","tri3","ai","ci","el","normalized","posArr","bufferOffset","getters","writeOffset","boundsIndexOffset","halfExtents","el2","setFromMatrixScale","multiply","scaleFactor","firstHitOnly","hits","FrontSide","raycastFunc","closestResult","raycastFirstFunc","geomToMesh","intersectsGeometryFunc","matrixToLocal","intersectsRanges","intersectsTriangles","triangle1","indexAttr1","positionAttr1","assignTriangle1","indexAttr2","positionAttr2","assignTriangle2","iterateOverDoubleTriangles","offset1","count1","offset2","count2","nodeIndex1","nodeIndex2","originalIntersectsRanges","otherRoots","nodeOffset1","nodeOffset2","invMat","il","localBox","jl","boxToMesh","intersectsSphere","minThresholdSq","maxThresholdSq","triIndex","_raycastFunctions","Mesh","Line","LineSegments","LineLoop","Points","BatchedMesh","_mesh","_batchIntersects","acceleratedBatchedMeshRaycast","boundsTrees","drawInfo","_drawInfo","_instanceInfo","drawRanges","_drawRanges","_geometryInfo","oldBoundsTree","oldDrawRange","boundingSphere","Sphere","getVisibleAt","geometryId","geometryIndex","getMatrixAt","premultiply","getBoundingBoxAt","getBoundingSphereAt","setDrawRange","batchId","call","getWebGLMouse","offsetX","offsetY","getWebGLMouseFromContainer","rect","getBoundingClientRect","clientX","clientY","BufferGeometry","computeBoundsTree","disposeBoundsTree","isBatchedMesh","raycastFunction","_raycaster","Raycaster","_bvhProcessedGeometries","WeakSet","buildSceneBVH","raycastObjects","mouse","setFromCamera","interactableObjects","obj","objAny","isHelper","intersectObjects","filter","text","getRootModel","current","parent","createRaycaster","DEFAULT_EDITOR_CONFIG","modes","defaultMode","isTransformChildren","enableKeyboard","EditorPlugin","_currentInfo","keydownHandler","_mode","currentInfo","disableKeyboard","previous","transformPlugin","getPlugin","composerPlugin","children","find","rootObj","info","rootModel","setOutlineObjects","drawEventCallback","currentModel","currentRootModel","targetObjects","deselect","select","e","toLowerCase","removeEventListener","colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","round","g","h","s","toFixed","str","hex","ARR_EACH","ARR_SLICE","Common","BREAK","extend","each","isObject","Object","isUndefined","bind","defaults","compose","toCall","apply","itr","scope","_key","defer","fnc","setTimeout","debounce","func","callImmediately","timeout","callNow","clearTimeout","toArray","isNull","_isNaN","_x","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","match","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","f","q","rgb_to_hsv","NaN","rgb_to_hex","hex_with_component","component_from_hex","_typeof","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","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","dom","makeSelectable","elem","selectable","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","bottom","fakeEvent","eventType","pars","aux","className","evt","createEvent","initMouseEvent","bubbles","cancelable","window","clickCount","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","undefined","initEvent","dispatchEvent","newBool","bool","attachEvent","unbind","detachEvent","addClass","classes","join","removeClass","removeAttribute","hasClass","RegExp","getWidth","getComputedStyle","getHeight","getOffset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","href","BooleanController","_this2","_this","__prev","__checkbox","setAttribute","setValue","checked","OptionController","opts","__select","opt","innerHTML","desiredValue","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","log","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","decimals","tenTo","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","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","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","bloomPass","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","getSize","rotFolder","rotation","scaleFolder","globalConfig","useGlobalConfig","isSaveChildren","isSaveMaterials","receiveShadow","envMap","envMapIntensity","reflectivity","mat","animParams","animationPlayParams","initPlay","speed","actionIndexs","startTime","listFolder","clip","stop","createGeometry","createMaterial","isInnerMesh","addInnerMeshPanel","geoType","addMaterialPanel","emissive","emissiveParams","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","onObjectSelected","onObjectDeselected","removeGridHelper","removeAxesHelper","removeStats","removeViewHelper","removeBox3Helper","GridHelper","assign","AxesHelper","Stats","showPanel","updateStats","ViewHelper","animating","createBox3Helper","getAxesHelper","getStats","getViewHelper","getBox3Helper","getDistanceScalePoint","normalize","getPointAtDistance","degToRad","degrees","radToDeg","radians","lerp","smoothstep","edge0","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","PointsCount","mixColor","hasUv","entries","uniform","getPresetNames","getMaterials","applyShaderToMaterial","shaderName","onBeforeCompile","shader","vertexShader","fragmentShader","fragFunc","animIndex","findIndex","DEFAULT_ANIMATION_CONFIG","defaultDuration","defaultEase","AnimationPlugin","mixers","curveAnimations","tweens","stopAll","mixer","clock","getDelta","anim","pause","time","frameEndCallback","curve","getPointAt","frameCallback","playParams","Clock","AnimationMixer","actions","_","clipAction","LoopRepeat","LoopOnce","timeScale","clampWhenFinished","paused","to","query","tween","gsap","yoyoEase","onComplete","resume","kill","all","transform","promises","Date","now","createCurveAnimation","lookAhead","nextT","nextPoint","lookAt","pauseAll","resumeAll","DEFAULT_DRAWING_CONFIG","defaultPointMode","defaultMaterialType","fenceHeight","lineWidth","DrawingPlugin","currentPoints","previewMesh","_isDrawing","drawnObjects","_pointMode","isDrawing","cancel","updatePreview","targetPoint","geoInfo","properties","centroidCoord3","getTransformedVector","centroid","initTranslate","centerCoord3","addPoint","createFence","createPlane","createCurve","createLine","isDrawMesh","undoPoint","isPreview","vertices","indices","uvs","base","Float32BufferAttribute","computeVertexNormals","transparent","shape","Shape","moveTo","lineTo","closePath","ShapeGeometry","rotateX","avgY","sum","translate","CatmullRomCurve3","curvePoints","getPoints","LineBasicMaterial","linewidth","line","isCurveMesh","curvePath","getDrawnObjects","clearAll","getCurveList","DEFAULT_GEOMAP_CONFIG","coordinateScale","GeoMapPlugin","geoGroups","response","fetch","json","createGeoGroup","isGeoGroup","centerGroup","features","onGroupLoaded","Group","feature","meshes","createFeatureMeshes","polygons","coordinates","polygon","createPolygonMesh","coordToVector3","outerRing","firstPoint","coordToVector2","hole","Path","holeRing","holeFirst","holes","ExtrudeGeometry","bevelEnabled","coord","lng","lat","proj4","translationOriginDiff","vec3","transformed","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","tgt","isCloneMaterial","originMaterial","DEFAULT_PARTICLE_CONFIG","ParticlePlugin","sportTypes","particleSystems","system","updateParticleSystem","cfg","positions","velocities","i3","random","theta","phi","acos","sin","cos","PointsMaterial","depthWrite","AdditiveBlending","texture","isParticleMesh","systemInfo","createParticleSystem","getParticleSystems","DEFAULT_PHYSICS_CONFIG","gravity","defaultMass","PhysicsPlugin","bodies","_enabled","physicsWorld","world","CANNON","World","broadphase","NaiveBroadphase","solver","iterations","isUpdate","quaternion","mass","isStatic","cylinderRadius","cylinderHeight","Cylinder","Box","Vec3","Body","friction","restitution","Material","addBody","physicsBody","groundBody","setFromEuler","removeBody","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","createTextGeometry","isTextMesh","createTextMesh","newText","newGeometry","DEFAULT_ENVIRONMENT_CONFIG","density","skybox","environmentMap","environmentIntensity","backgroundBlurriness","backgroundIntensity","EnvironmentPlugin","rgbeLoader","RGBELoader","currentEnvMap","currentBackground","setFog","setSkybox","setEnvironmentMap","clearFog","clearBackground","clearEnvironmentMap","FogExp2","setBackgroundColor","setBackgroundTexture","setBackgroundCubeTexture","setBackgroundHDR","setBackgroundEquirectangular","mapping","EquirectangularReflectionMapping","Texture","environment","blurriness","getEnvironmentMap","getBackground","getFogConfig","DEFAULT_SERIALIZATION_CONFIG","includeGeometry","includeMaterial","includeUserData","excludeHelpers","SerializationPlugin","serialize","metadata","generator","timestamp","serializeSceneProperties","serializeCamera","serializeObjects","serializePlugins","serializeBackground","serializeFog","getHex","sourceFile","zoom","PerspectiveCamera","serialized","serializeObject","uuid","userData","serializeGeometry","serializeMaterial","parameters","serializeSingleMaterial","startsWith","deserializeCamera","deserializeSceneProperties","deserializePlugins","cameraData","sceneData","pluginsData","pluginName","setConfig","toJSON","deserialize","filename","blob","Blob","URL","createObjectURL","link","download","revokeObjectURL","reader","FileReader","onload","async","fromJSON","onerror","readAsText"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,50]}
|