@billtaofbj/explosion-3d 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,197 @@
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?module.exports=t(require("vue"),require("@billtaofbj/core"),require("vue-router"),require("element-plus"),require("@element-plus/icons-vue"),require("axios"),require("three"),require("yjs"),require("@hocuspocus/provider")):typeof define==`function`&&define.amd?define([`vue`,`@billtaofbj/core`,`vue-router`,`element-plus`,`@element-plus/icons-vue`,`axios`,`three`,`yjs`,`@hocuspocus/provider`],t):(e=typeof globalThis<`u`?globalThis:e||self,e.YourCompanyExplosion3d=t(e.Vue,e._billtaofbj_core,e.VueRouter,e.ElementPlus,e.ElementPlusIconsVue,e.axios,e.THREE,e.yjs,e._hocuspocus_provider))})(this,function(e,t,n,r,i,a,o,s,c){var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},g=(e,t)=>{let n={};for(var r in e)u(n,r,{get:e[r],enumerable:!0});return t||u(n,Symbol.toStringTag,{value:`Module`}),n},_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e},v=(e,t,n)=>(n=e==null?{}:l(p(e)),_(t||!e||!e.__esModule?u(n,`default`,{value:e,enumerable:!0}):n,e));let y=v(a,1);a=v(a);let b=v(o,1);o=v(o),s=v(s,1);var x=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},S={class:`chat-header`},C={class:`chat-header-left`},w={class:`chat-title`},T={class:`online-users-list`},E={class:`online-user-item`},D={class:`online-user-name`},O={key:1},k={class:`online-user-name`},A={class:`chat-header-right`},j={key:0,class:`chat-empty`},ee={class:`chat-empty-hint`},te={key:1},ne={class:`message-content`},re={key:0,class:`message-meta`},ie={key:0,class:`message-mention`},ae=[`innerHTML`],oe={class:`message-time`},se={key:1,class:`chat-message chat-message-ai`},ce={class:`message-avatar ai`},le={class:`chat-input-area`},ue={key:0,class:`mention-popup`},de=[`onClick`,`onMouseenter`],fe={key:1},pe=x({__name:`AiChatPanel`,props:{visible:{type:Boolean,default:!1},messages:{type:Array,default:()=>[]},loading:{type:Boolean,default:!1},panelWidth:{type:Number,default:360},isCollab:{type:Boolean,default:!1},collabUsers:{type:Array,default:()=>[]},currentUser:{type:Object,default:()=>({id:``,name:``,color:``})},isOwner:{type:Boolean,default:!0},unreadMention:{type:Boolean,default:!1}},emits:[`send`,`close`,`clear`,`clear-unread`],setup(t,{emit:n}){let r=t,a=n,o=(0,e.ref)(``),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(!1),u=(0,e.ref)([]),d=(0,e.ref)(0),f=``,p=-1,m={id:`ai-assistant`,name:`AI助手`,color:`#409EFF`,isAi:!0},h=(0,e.computed)(()=>{let e=r.currentUser.id,t=new Set;return[m,...r.collabUsers.filter(n=>{let r=n.clientId||n.id||``;if(r&&r===e)return!1;let i=String(r||n.name||``);return t.has(i)?!1:(t.add(i),!0)})]}),g=(0,e.computed)(()=>h.value.length+1),_=e=>e.role===`ai`?`chat-message-ai`:r.isCollab&&e.user_id&&e.user_id!==r.currentUser.id?`chat-message-other`:`chat-message-user`,v=e=>e.role===`ai`?{background:`linear-gradient(135deg, #409EFF, #337ECC)`}:{background:e.user_color||`#67C23A`},y=e=>(e.user_name||`U`).charAt(0),b=e=>{if(!r.isCollab)return;let t=typeof e==`string`?e:e.target?.value||o.value,n=t.length,i=t.lastIndexOf(`@`,n);if(i!==-1&&i<n){let e=t.slice(i+1,n);if(!e.includes(` `)&&!e.includes(`
2
+ `)){f=e,p=i,u.value=h.value.filter(t=>t.name&&t.name.toLowerCase().includes(e.toLowerCase())),l.value=u.value.length>0,d.value=0;return}}l.value=!1},x=()=>{l.value&&(d.value=Math.min(d.value+1,u.value.length-1))},pe=()=>{l.value&&(d.value=Math.max(d.value-1,0))},me=e=>{let t=o.value.slice(0,p),n=o.value.slice(p+f.length+1);o.value=`${t}@${e.name} ${n}`,l.value=!1},he=e=>{if(e){if(e.shiftKey)return;if(l.value){let t=u.value[d.value];if(t){e.preventDefault(),me(t);return}}e.preventDefault()}let t=o.value.trim();if(!t||r.loading)return;let n=null;if(r.isCollab){let e=t.match(/@(\S+)/);e&&(n=e[1])}a(`send`,t,{mentionedUser:n}),o.value=``,l.value=!1},M=()=>{(0,e.nextTick)(()=>{s.value&&(s.value.scrollTop=s.value.scrollHeight)})};return(0,e.watch)(()=>r.messages.length,M),(0,e.watch)(()=>r.messages,M,{deep:!0}),(n,r)=>{let f=(0,e.resolveComponent)(`el-icon`),p=(0,e.resolveComponent)(`el-tag`),m=(0,e.resolveComponent)(`el-popover`),M=(0,e.resolveComponent)(`el-button`),ge=(0,e.resolveComponent)(`el-input`);return t.visible?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`ai-chat-panel`,style:(0,e.normalizeStyle)({width:t.panelWidth+`px`})},[(0,e.createElementVNode)(`div`,S,[(0,e.createElementVNode)(`div`,C,[(0,e.createVNode)(f,{size:18,color:`#409EFF`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1}),(0,e.createElementVNode)(`span`,w,(0,e.toDisplayString)(t.isCollab?`协作聊天`:`AI 助手`),1),t.isCollab?((0,e.openBlock)(),(0,e.createBlock)(m,{key:0,width:200,placement:`bottom-start`,trigger:`click`},{reference:(0,e.withCtx)(()=>[(0,e.createVNode)(p,{size:`small`,type:`success`,effect:`plain`,class:`online-tag`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(g.value)+`人在线 `,1)]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,T,[(0,e.createElementVNode)(`div`,E,[(0,e.createElementVNode)(`div`,{class:`online-user-avatar`,style:(0,e.normalizeStyle)({background:t.currentUser.color||`#409EFF`})},(0,e.toDisplayString)((t.currentUser.name||`U`).charAt(0)),5),(0,e.createElementVNode)(`span`,D,(0,e.toDisplayString)(t.currentUser.name||`我`),1),(0,e.createVNode)(p,{size:`small`,type:t.isOwner?`warning`:`success`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(t.isOwner?`发起人`:`协作人`),1)]),_:1},8,[`type`]),r[4]||=(0,e.createElementVNode)(`span`,{class:`self-tag`},`(我)`,-1)]),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(h.value,t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id||t.clientId,class:`online-user-item`},[(0,e.createElementVNode)(`div`,{class:`online-user-avatar`,style:(0,e.normalizeStyle)({background:t.color||`#909399`})},[t.isAi?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:14},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,O,(0,e.toDisplayString)((t.name||`U`).charAt(0)),1))],4),(0,e.createElementVNode)(`span`,k,(0,e.toDisplayString)(t.name||`未知用户`),1),t.isAi?((0,e.openBlock)(),(0,e.createBlock)(p,{key:0,size:`small`,type:`primary`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[...r[5]||=[(0,e.createTextVNode)(`AI助手`,-1)]]),_:1})):((0,e.openBlock)(),(0,e.createBlock)(p,{key:1,size:`small`,type:`success`,effect:`plain`,class:`role-tag`},{default:(0,e.withCtx)(()=>[...r[6]||=[(0,e.createTextVNode)(`协作人`,-1)]]),_:1}))]))),128))])]),_:1})):(0,e.createCommentVNode)(``,!0)]),(0,e.createElementVNode)(`div`,A,[t.isCollab&&t.unreadMention?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`mention-bell`,title:`有新消息`,onClick:r[0]||=e=>a(`clear-unread`)},[(0,e.createVNode)(f,{size:18,color:`#F56C6C`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Bell))]),_:1})])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(M,{text:``,circle:``,size:`small`,onClick:r[1]||=e=>n.$emit(`clear`),title:`清空对话`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Delete))]),_:1})]),_:1}),(0,e.createVNode)(M,{text:``,circle:``,size:`small`,onClick:r[2]||=e=>n.$emit(`close`),title:`关闭`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Close))]),_:1})]),_:1})])]),(0,e.createElementVNode)(`div`,{class:`chat-messages`,ref_key:`messagesRef`,ref:s},[t.messages.length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,j,[(0,e.createVNode)(f,{size:40,color:`#c0c4cc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1}),(0,e.createElementVNode)(`p`,null,(0,e.toDisplayString)(t.isCollab?`协作聊天室`:`你好!我是 AI 助手`),1),(0,e.createElementVNode)(`p`,ee,(0,e.toDisplayString)(t.isCollab?`与团队成员和AI助手实时聊天`:`可以问我任何关于文档编辑的问题`),1)])):(0,e.createCommentVNode)(``,!0),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.messages,n=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:n._msgId||n.time+n.content,class:(0,e.normalizeClass)([`chat-message`,_(n)])},[(0,e.createElementVNode)(`div`,{class:`message-avatar`,style:(0,e.normalizeStyle)(v(n))},[n.role===`ai`?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:16},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,te,(0,e.toDisplayString)(y(n)),1))],4),(0,e.createElementVNode)(`div`,ne,[t.isCollab&&n.role===`user`?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,re,[(0,e.createElementVNode)(`span`,{class:`message-sender`,style:(0,e.normalizeStyle)({color:n.user_color||`#67C23A`})},(0,e.toDisplayString)(n.user_name||`用户`),5),n.mentioned_user?((0,e.openBlock)(),(0,e.createElementBlock)(`span`,ie,`@`+(0,e.toDisplayString)(n.mentioned_user),1)):(0,e.createCommentVNode)(``,!0)])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,{class:`message-text`,innerHTML:n.content},null,8,ae),(0,e.createElementVNode)(`div`,oe,(0,e.toDisplayString)(n.time),1)])],2))),128)),t.loading?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,se,[(0,e.createElementVNode)(`div`,ce,[(0,e.createVNode)(f,{size:16},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})]),r[7]||=(0,e.createElementVNode)(`div`,{class:`message-content`},[(0,e.createElementVNode)(`div`,{class:`message-text typing-indicator`},[(0,e.createElementVNode)(`span`),(0,e.createElementVNode)(`span`),(0,e.createElementVNode)(`span`)])],-1)])):(0,e.createCommentVNode)(``,!0)],512),(0,e.createElementVNode)(`div`,le,[(0,e.createElementVNode)(`div`,{class:`chat-input-wrapper`,ref_key:`inputWrapperRef`,ref:c},[(0,e.createVNode)(ge,{modelValue:o.value,"onUpdate:modelValue":r[3]||=e=>o.value=e,type:`textarea`,autosize:{minRows:1,maxRows:4},placeholder:t.isCollab?`输入消息... @提及成员`:`输入消息...`,onKeydown:[(0,e.withKeys)((0,e.withModifiers)(he,[`exact`]),[`enter`]),(0,e.withKeys)((0,e.withModifiers)(x,[`prevent`]),[`down`]),(0,e.withKeys)((0,e.withModifiers)(pe,[`prevent`]),[`up`])],onInput:b,resize:`none`},null,8,[`modelValue`,`placeholder`,`onKeydown`]),l.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ue,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(u.value,(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id||t.clientId,class:(0,e.normalizeClass)([`mention-item`,{active:n===d.value}]),onClick:e=>me(t),onMouseenter:e=>d.value=n},[(0,e.createElementVNode)(`div`,{class:`mention-avatar`,style:(0,e.normalizeStyle)({background:t.color||`#909399`})},[t.isAi?((0,e.openBlock)(),(0,e.createBlock)(f,{key:0,size:12},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Monitor))]),_:1})):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,fe,(0,e.toDisplayString)((t.name||`U`).charAt(0)),1))],4),(0,e.createElementVNode)(`span`,null,(0,e.toDisplayString)(t.name),1)],42,de))),128))])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(M,{class:`send-btn`,type:`primary`,circle:``,disabled:!o.value.trim()||t.loading,onClick:he},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Promotion))]),_:1})]),_:1},8,[`disabled`])],512)])],4)):(0,e.createCommentVNode)(``,!0)}}},[[`__scopeId`,`data-v-01960100`]]);function me(){let t=(0,e.ref)([]),n=(0,e.ref)(!1),r=(0,e.ref)(!1),i=(0,e.ref)([]),a=(0,e.ref)({id:``,name:``,color:``}),o=(0,e.ref)(!1),s=null,c=null,l=null,u=new Set,d=`/api/chat`,f=null,p=({ydoc:n,provider:c,onlineUsers:d})=>{if(n){r.value=!0,l=d,f&&f(),f=(0,e.watch)(l,e=>{i.value=Array.isArray(e)?e:[]},{immediate:!0,deep:!0});try{s=n.getArray(`chat-messages`),s.observe(e=>{try{e.changes.added.forEach(e=>{e.content.getContent().forEach(e=>{e&&e._msgId&&!u.has(e._msgId)&&(u.add(e._msgId),t.value=[...t.value,e],e.mentioned_user&&e.user_id!==a.value.id&&(o.value=!0))})})}catch(e){console.warn(`[useChat] Y.Array observer error:`,e)}})}catch(e){console.warn(`[useChat] Failed to create Y.Array:`,e)}}},m=e=>{a.value={...a.value,...e}},h=e=>{i.value=e||[]},g=()=>{let e=new Date;return`${e.getHours().toString().padStart(2,`0`)}:${e.getMinutes().toString().padStart(2,`0`)}`},_=async(n,i={})=>{let o={_msgId:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,role:`user`,content:n,time:g(),user_id:a.value.id,user_name:a.value.name,user_color:a.value.color,mentioned_user:i.mentionedUser||null};if(u.add(o._msgId),t.value=[...t.value,o],s&&(0,e.unref)(r))try{s.push([o])}catch(e){console.warn(`[useChat] Failed to push to Y.Array:`,e)}if(i.roomId)try{await y.default.post(d,{room_id:i.roomId,role:`user`,content:n,user_id:a.value.id,user_name:a.value.name,mentioned_user:i.mentionedUser||null})}catch(e){console.warn(`[useChat] Failed to persist message:`,e)}},v=async(n,i)=>{let a={_msgId:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,role:`ai`,content:n,time:g(),user_id:`ai-assistant`,user_name:`AI助手`};if(u.add(a._msgId),t.value=[...t.value,a],s&&(0,e.unref)(r))try{s.push([a])}catch(e){console.warn(`[useChat] Failed to push AI message to Y.Array:`,e)}if(i)try{await y.default.post(d,{room_id:i,role:`ai`,content:n,user_id:`ai-assistant`,user_name:`AI助手`})}catch(e){console.warn(`[useChat] Failed to persist AI message:`,e)}},b=async e=>{if(e)try{let n=await y.default.get(d,{params:{room_id:e}});if(Array.isArray(n.data)){let e=n.data.map(e=>({_msgId:e._msgId||`hist-${e.id||Date.now()}`,role:e.role,content:e.content,time:e.time||g(),user_id:e.user_id||``,user_name:e.user_name||``,user_color:e.user_color||``,mentioned_user:e.mentioned_user||null}));e.forEach(e=>u.add(e._msgId)),t.value=[...e,...t.value]}}catch(e){console.warn(`[useChat] Failed to load history:`,e)}},x=async e=>{if(t.value=[],u.clear(),e)try{await y.default.delete(d,{params:{room_id:e}})}catch(e){console.warn(`[useChat] Failed to clear messages on server:`,e)}},S=()=>{o.value=!1},C=()=>{if(f&&=(f(),null),s&&c){try{s.unobserve(c)}catch{}c=null}s=null,l=null,u.clear()};return(0,e.onUnmounted)(()=>C()),{messages:t,loading:n,isCollabMode:r,collabUsers:i,currentUser:a,unreadMention:o,setCollabContext:p,setCurrentUser:m,updateCollabUsers:h,sendMessage:_,sendAiMessage:v,loadHistory:b,clearMessages:x,clearUnreadMention:S,destroy:C}}var he=`/api/document-versions`,M=5e3,ge=()=>{let t=(0,e.ref)([]),n=(0,e.ref)(!1);return{versions:t,loading:n,saveVersion:async({documentId:e,docType:t,content:n,userId:r,userName:i})=>{if(!e||!t||!n)return null;try{let{data:a}=await y.default.post(he,{document_id:e,doc_type:t,content:typeof n==`string`?n:JSON.stringify(n),user_id:r||null,user_name:i||null},{timeout:M});return a}catch(e){return console.warn(`[useVersionHistory] Failed to save version:`,e),null}},loadVersions:async e=>{if(!e)return[];n.value=!0;try{let{data:n}=await y.default.get(he,{params:{document_id:e},timeout:M});return t.value=n,n}catch(e){return console.warn(`[useVersionHistory] Failed to load versions:`,e),t.value=[],[]}finally{n.value=!1}},getVersionContent:async e=>{try{let{data:t}=await y.default.get(`${he}/${e}`,{timeout:M});return t}catch(e){return console.warn(`[useVersionHistory] Failed to get version content:`,e),null}}}},_e={class:`version-history-panel`},ve={key:0,class:`loading-state`},ye={key:1,class:`empty-state`},be={key:2,class:`version-list`},N={key:0,class:`current-version`},xe={class:`current-version-header`},Se={class:`version-number`},Ce=[`onClick`],we={class:`version-number`},Te={class:`version-user`},Ee={class:`panel-footer`},De=x({__name:`VersionHistoryPanel`,props:{modelValue:{type:Boolean,default:!1},documentId:{type:[Number,String],default:null}},emits:[`update:modelValue`,`apply`],setup(t,{expose:n,emit:a}){let o=t,s=a,{versions:c,loading:l,loadVersions:u,getVersionContent:d}=ge(),f=(0,e.ref)(!1),p=(0,e.ref)(null),m=(0,e.ref)(!1),h=(0,e.ref)(null);(0,e.watch)(()=>o.modelValue,e=>{f.value=e,e&&o.documentId&&(p.value=null,u(o.documentId).then(e=>{e&&e.length>0&&(h.value=e[0])}))}),(0,e.watch)(f,e=>{s(`update:modelValue`,e)});let g=e=>{p.value=e},_=async()=>{if(p.value){m.value=!0;try{let e=await d(p.value.id);e&&e.content?(h.value=p.value,p.value=null,s(`apply`,e.content),r.ElMessage.success(`已切换到版本 v`+h.value.version_number)):r.ElMessage.error(`获取版本内容失败`)}finally{m.value=!1}}},v=()=>{f.value=!1},y=e=>{if(!e)return``;let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`};return n({currentVersion:h}),(t,n)=>{let r=(0,e.resolveComponent)(`el-icon`),a=(0,e.resolveComponent)(`el-tag`),o=(0,e.resolveComponent)(`el-timeline-item`),s=(0,e.resolveComponent)(`el-timeline`),u=(0,e.resolveComponent)(`el-button`),d=(0,e.resolveComponent)(`el-drawer`);return(0,e.openBlock)(),(0,e.createBlock)(d,{modelValue:f.value,"onUpdate:modelValue":n[0]||=e=>f.value=e,title:`更新履历`,direction:`rtl`,size:`420px`,"before-close":v},{footer:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,Ee,[(0,e.createVNode)(u,{type:`primary`,disabled:!p.value,loading:m.value,onClick:_},{default:(0,e.withCtx)(()=>[...n[4]||=[(0,e.createTextVNode)(` 切换到此版本 `,-1)]]),_:1},8,[`disabled`,`loading`])])]),default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,_e,[(0,e.unref)(l)?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ve,[(0,e.createVNode)(r,{class:`is-loading`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Loading))]),_:1}),n[1]||=(0,e.createElementVNode)(`span`,null,`加载中...`,-1)])):(0,e.unref)(c).length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,ye,[(0,e.createVNode)(r,{size:48,color:`#c0c4cc`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Clock))]),_:1}),n[2]||=(0,e.createElementVNode)(`p`,null,`暂无历史版本`,-1)])):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,be,[h.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,N,[(0,e.createElementVNode)(`div`,xe,[(0,e.createVNode)(a,{type:`success`,size:`small`},{default:(0,e.withCtx)(()=>[...n[3]||=[(0,e.createTextVNode)(`当前版本`,-1)]]),_:1}),(0,e.createElementVNode)(`span`,Se,`v`+(0,e.toDisplayString)(h.value.version_number),1)])])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(s,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)((0,e.unref)(c),t=>((0,e.openBlock)(),(0,e.createBlock)(o,{key:t.id,timestamp:y(t.created_at),placement:`top`,type:p.value?.id===t.id?`primary`:``,hollow:p.value?.id!==t.id},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`version-item`,{active:p.value?.id===t.id}]),onClick:e=>g(t)},[(0,e.createElementVNode)(`span`,we,`版本号:v`+(0,e.toDisplayString)(t.version_number),1),(0,e.createElementVNode)(`span`,Te,`提交人:`+(0,e.toDisplayString)(t.user_name||`未知用户`),1)],10,Ce)]),_:2},1032,[`timestamp`,`type`,`hollow`]))),128))]),_:1})]))])]),_:1},8,[`modelValue`])}}},[[`__scopeId`,`data-v-87924b7c`]]),Oe={class:`toolbar`},ke={class:`toolbar-left`},Ae={class:`toolbar-center`},je={class:`toolbar-right`},Me={key:0,class:`collab-users`},Ne=[`title`],Pe=x({__name:`Toolbar`,props:{title:{type:String,default:``},isConnected:Boolean,onlineUsers:{type:Array,default:()=>[]},isJoinMode:Boolean,showHistory:{type:Boolean,default:!1}},emits:[`update:title`,`back`,`explode`,`collapse`,`explode-style`,`reset-camera`,`export`,`save`,`import-json`,`toggle-collab`,`share-collab`,`history`],setup(t){let n=t,r=(0,e.ref)(n.title);return(0,e.watch)(()=>n.title,e=>r.value=e),(n,a)=>{let o=(0,e.resolveComponent)(`el-icon`),s=(0,e.resolveComponent)(`el-button`),c=(0,e.resolveComponent)(`el-input`),l=(0,e.resolveComponent)(`el-tooltip`),u=(0,e.resolveComponent)(`el-divider`),d=(0,e.resolveComponent)(`el-dropdown-item`),f=(0,e.resolveComponent)(`el-dropdown-menu`),p=(0,e.resolveComponent)(`el-dropdown`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,Oe,[(0,e.createElementVNode)(`div`,ke,[(0,e.createVNode)(s,{onClick:a[0]||=e=>n.$emit(`back`),size:`small`,circle:``},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowLeft))]),_:1})]),_:1}),(0,e.createVNode)(c,{modelValue:r.value,"onUpdate:modelValue":a[1]||=e=>r.value=e,onBlur:a[2]||=e=>n.$emit(`update:title`,r.value),placeholder:`输入标题`,class:`title-input`,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ae,[(0,e.createVNode)(l,{content:`展开`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(s,{size:`small`,circle:``,onClick:a[3]||=e=>n.$emit(`explode`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Expand))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(l,{content:`折叠`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(s,{size:`small`,circle:``,onClick:a[4]||=e=>n.$emit(`collapse`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Fold))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(u,{direction:`vertical`}),(0,e.createVNode)(p,{trigger:`click`,onCommand:a[5]||=e=>n.$emit(`explode-style`,e)},{dropdown:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(d,{command:`radial`},{default:(0,e.withCtx)(()=>[...a[14]||=[(0,e.createTextVNode)(`径向飞散`,-1)]]),_:1}),(0,e.createVNode)(d,{command:`linear`},{default:(0,e.withCtx)(()=>[...a[15]||=[(0,e.createTextVNode)(`线性展开`,-1)]]),_:1}),(0,e.createVNode)(d,{command:`layer`},{default:(0,e.withCtx)(()=>[...a[16]||=[(0,e.createTextVNode)(`层级展开`,-1)]]),_:1})]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createVNode)(s,{size:`small`},{default:(0,e.withCtx)(()=>[a[13]||=(0,e.createTextVNode)(`展开方式`,-1),(0,e.createVNode)(o,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(u,{direction:`vertical`}),(0,e.createVNode)(l,{content:`重置视角`,placement:`bottom`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(s,{size:`small`,circle:``,onClick:a[6]||=e=>n.$emit(`reset-camera`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Aim))]),_:1})]),_:1})]),_:1})]),(0,e.createElementVNode)(`div`,je,[t.onlineUsers.length>0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,Me,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.onlineUsers.slice(0,5),t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.clientId,class:`collab-avatar`,style:(0,e.normalizeStyle)({background:t.color}),title:t.name},(0,e.toDisplayString)(t.name?.charAt(0)),13,Ne))),128))])):(0,e.createCommentVNode)(``,!0),t.isJoinMode?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createBlock)(s,{key:1,size:`small`,type:t.isConnected?`success`:`default`,onClick:a[7]||=e=>n.$emit(`toggle-collab`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Share))]),_:1}),(0,e.createElementVNode)(`span`,null,(0,e.toDisplayString)(t.isConnected?`协作中`:`协作`),1)]),_:1},8,[`type`])),!t.isJoinMode&&t.isConnected?((0,e.openBlock)(),(0,e.createBlock)(s,{key:2,size:`small`,circle:``,onClick:a[8]||=e=>n.$emit(`share-collab`),title:`分享链接`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Link))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(u,{direction:`vertical`}),(0,e.createVNode)(s,{size:`small`,onClick:a[9]||=e=>n.$emit(`import-json`),title:`导入JSON`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Upload))]),_:1}),a[17]||=(0,e.createTextVNode)(` 导入 `,-1)]),_:1}),(0,e.createVNode)(p,{trigger:`click`,onCommand:a[10]||=e=>n.$emit(`export`,e)},{dropdown:(0,e.withCtx)(()=>[(0,e.createVNode)(f,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(d,{command:`png`},{default:(0,e.withCtx)(()=>[...a[19]||=[(0,e.createTextVNode)(`PNG图片`,-1)]]),_:1}),(0,e.createVNode)(d,{command:`json`},{default:(0,e.withCtx)(()=>[...a[20]||=[(0,e.createTextVNode)(`JSON数据`,-1)]]),_:1}),(0,e.createVNode)(d,{command:`html`},{default:(0,e.withCtx)(()=>[...a[21]||=[(0,e.createTextVNode)(`独立HTML`,-1)]]),_:1})]),_:1})]),default:(0,e.withCtx)(()=>[(0,e.createVNode)(s,{size:`small`},{default:(0,e.withCtx)(()=>[a[18]||=(0,e.createTextVNode)(`导出`,-1),(0,e.createVNode)(o,{class:`el-icon--right`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ArrowDown))]),_:1})]),_:1})]),_:1}),(0,e.createVNode)(s,{size:`small`,onClick:a[11]||=e=>n.$emit(`save`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Download))]),_:1})]),_:1}),t.showHistory?((0,e.openBlock)(),(0,e.createBlock)(s,{key:3,size:`small`,circle:``,title:`更新履历`,onClick:a[12]||=e=>n.$emit(`history`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Clock))]),_:1})]),_:1})):(0,e.createCommentVNode)(``,!0)])])}}},[[`__scopeId`,`data-v-3ac7baaa`]]),Fe={type:`change`},Ie={type:`start`},Le={type:`end`},P=new b.Ray,Re=new b.Plane,ze=Math.cos(70*b.MathUtils.DEG2RAD),F=new b.Vector3,I=2*Math.PI,L={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Be=1e-6,Ve=class extends b.Controls{constructor(e,t=null){super(e,t),this.state=L.NONE,this.target=new b.Vector3,this.cursor=new b.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:`ArrowLeft`,UP:`ArrowUp`,RIGHT:`ArrowRight`,BOTTOM:`ArrowDown`},this.mouseButtons={LEFT:b.MOUSE.ROTATE,MIDDLE:b.MOUSE.DOLLY,RIGHT:b.MOUSE.PAN},this.touches={ONE:b.TOUCH.ROTATE,TWO:b.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._cursorStyle=`auto`,this._domElementKeyEvents=null,this._lastPosition=new b.Vector3,this._lastQuaternion=new b.Quaternion,this._lastTargetPosition=new b.Vector3,this._quat=new b.Quaternion().setFromUnitVectors(e.up,new b.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new b.Spherical,this._sphericalDelta=new b.Spherical,this._scale=1,this._panOffset=new b.Vector3,this._rotateStart=new b.Vector2,this._rotateEnd=new b.Vector2,this._rotateDelta=new b.Vector2,this._panStart=new b.Vector2,this._panEnd=new b.Vector2,this._panDelta=new b.Vector2,this._dollyStart=new b.Vector2,this._dollyEnd=new b.Vector2,this._dollyDelta=new b.Vector2,this._dollyDirection=new b.Vector3,this._mouse=new b.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Ue.bind(this),this._onPointerDown=He.bind(this),this._onPointerUp=We.bind(this),this._onContextMenu=R.bind(this),this._onMouseWheel=qe.bind(this),this._onKeyDown=Je.bind(this),this._onTouchStart=Ye.bind(this),this._onTouchMove=Xe.bind(this),this._onMouseDown=Ge.bind(this),this._onMouseMove=Ke.bind(this),this._interceptControlDown=Ze.bind(this),this._interceptControlUp=Qe.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}set cursorStyle(e){this._cursorStyle=e,e===`grab`?this.domElement.style.cursor=`grab`:this.domElement.style.cursor=`auto`}get cursorStyle(){return this._cursorStyle}connect(e){super.connect(e),this.domElement.addEventListener(`pointerdown`,this._onPointerDown),this.domElement.addEventListener(`pointercancel`,this._onPointerUp),this.domElement.addEventListener(`contextmenu`,this._onContextMenu),this.domElement.addEventListener(`wheel`,this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener(`keydown`,this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction=`none`}disconnect(){this.domElement.removeEventListener(`pointerdown`,this._onPointerDown),this.domElement.ownerDocument.removeEventListener(`pointermove`,this._onPointerMove),this.domElement.ownerDocument.removeEventListener(`pointerup`,this._onPointerUp),this.domElement.removeEventListener(`pointercancel`,this._onPointerUp),this.domElement.removeEventListener(`wheel`,this._onMouseWheel),this.domElement.removeEventListener(`contextmenu`,this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener(`keydown`,this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction=``}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener(`keydown`,this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener(`keydown`,this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(Fe),this.update(),this.state=L.NONE}pan(e,t){this._pan(e,t),this.update()}dollyIn(e){this._dollyIn(e),this.update()}dollyOut(e){this._dollyOut(e),this.update()}rotateLeft(e){this._rotateLeft(e),this.update()}rotateUp(e){this._rotateUp(e),this.update()}update(e=null){let t=this.object.position;F.copy(t).sub(this.target),F.applyQuaternion(this._quat),this._spherical.setFromVector3(F),this.autoRotate&&this.state===L.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,r=this.maxAzimuthAngle;isFinite(n)&&isFinite(r)&&(n<-Math.PI?n+=I:n>Math.PI&&(n-=I),r<-Math.PI?r+=I:r>Math.PI&&(r-=I),n<=r?this._spherical.theta=Math.max(n,Math.min(r,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+r)/2?Math.max(n,this._spherical.theta):Math.min(r,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let i=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{let e=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),i=e!=this._spherical.radius}if(F.setFromSpherical(this._spherical),F.applyQuaternion(this._quatInverse),t.copy(this.target).add(F),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let e=null;if(this.object.isPerspectiveCamera){let t=F.length();e=this._clampDistance(t*this._scale);let n=t-e;this.object.position.addScaledVector(this._dollyDirection,n),this.object.updateMatrixWorld(),i=!!n}else if(this.object.isOrthographicCamera){let t=new b.Vector3(this._mouse.x,this._mouse.y,0);t.unproject(this.object);let n=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),i=n!==this.object.zoom;let r=new b.Vector3(this._mouse.x,this._mouse.y,0);r.unproject(this.object),this.object.position.sub(r).add(t),this.object.updateMatrixWorld(),e=F.length()}else console.warn(`WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.`),this.zoomToCursor=!1;e!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(e).add(this.object.position):(P.origin.copy(this.object.position),P.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(P.direction))<ze?this.object.lookAt(this.target):(Re.setFromNormalAndCoplanarPoint(this.object.up,this.target),P.intersectPlane(Re,this.target))))}else if(this.object.isOrthographicCamera){let e=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),e!==this.object.zoom&&(this.object.updateProjectionMatrix(),i=!0)}return this._scale=1,this._performCursorZoom=!1,i||this._lastPosition.distanceToSquared(this.object.position)>Be||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Be||this._lastTargetPosition.distanceToSquared(this.target)>Be?(this.dispatchEvent(Fe),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e===null?I/60/60*this.autoRotateSpeed:I/60*this.autoRotateSpeed*e}_getZoomScale(e){let t=Math.abs(e*.01);return .95**(this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){F.setFromMatrixColumn(t,0),F.multiplyScalar(-e),this._panOffset.add(F)}_panUp(e,t){this.screenSpacePanning===!0?F.setFromMatrixColumn(t,1):(F.setFromMatrixColumn(t,0),F.crossVectors(this.object.up,F)),F.multiplyScalar(e),this._panOffset.add(F)}_pan(e,t){let n=this.domElement;if(this.object.isPerspectiveCamera){let r=this.object.position;F.copy(r).sub(this.target);let i=F.length();i*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*i/n.clientHeight,this.object.matrix),this._panUp(2*t*i/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn(`WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.`),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn(`WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.`),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn(`WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.`),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;let n=this.domElement.getBoundingClientRect(),r=e-n.left,i=t-n.top,a=n.width,o=n.height;this._mouse.x=r/a*2-1,this._mouse.y=-(i/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);let t=this.domElement;this._rotateLeft(I*this._rotateDelta.x/t.clientHeight),this._rotateUp(I*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(I*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-I*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(I*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-I*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{let t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),r=.5*(e.pageY+t.y);this._rotateStart.set(n,r)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{let t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),r=.5*(e.pageY+t.y);this._panStart.set(n,r)}}_handleTouchStartDolly(e){let t=this._getSecondPointerPosition(e),n=e.pageX-t.x,r=e.pageY-t.y,i=Math.sqrt(n*n+r*r);this._dollyStart.set(0,i)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{let t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),r=.5*(e.pageY+t.y);this._rotateEnd.set(n,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);let t=this.domElement;this._rotateLeft(I*this._rotateDelta.x/t.clientHeight),this._rotateUp(I*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{let t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),r=.5*(e.pageY+t.y);this._panEnd.set(n,r)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){let t=this._getSecondPointerPosition(e),n=e.pageX-t.x,r=e.pageY-t.y,i=Math.sqrt(n*n+r*r);this._dollyEnd.set(0,i),this._dollyDelta.set(0,(this._dollyEnd.y/this._dollyStart.y)**+this.zoomSpeed),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);let a=(e.pageX+t.x)*.5,o=(e.pageY+t.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId){this._pointers.splice(t,1);return}}_isTrackingPointer(e){for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId)return!0;return!1}_trackPointer(e){let t=this._pointerPositions[e.pointerId];t===void 0&&(t=new b.Vector2,this._pointerPositions[e.pointerId]=t),t.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){let t=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[t]}_customWheelEvent(e){let t=e.deltaMode,n={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(t){case 1:n.deltaY*=16;break;case 2:n.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(n.deltaY*=10),n}};function He(e){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(e.pointerId),this.domElement.ownerDocument.addEventListener(`pointermove`,this._onPointerMove),this.domElement.ownerDocument.addEventListener(`pointerup`,this._onPointerUp)),!this._isTrackingPointer(e)&&(this._addPointer(e),e.pointerType===`touch`?this._onTouchStart(e):this._onMouseDown(e),this._cursorStyle===`grab`&&(this.domElement.style.cursor=`grabbing`)))}function Ue(e){this.enabled!==!1&&(e.pointerType===`touch`?this._onTouchMove(e):this._onMouseMove(e))}function We(e){switch(this._removePointer(e),this._pointers.length){case 0:this.domElement.releasePointerCapture(e.pointerId),this.domElement.ownerDocument.removeEventListener(`pointermove`,this._onPointerMove),this.domElement.ownerDocument.removeEventListener(`pointerup`,this._onPointerUp),this.dispatchEvent(Le),this.state=L.NONE,this._cursorStyle===`grab`&&(this.domElement.style.cursor=`grab`);break;case 1:let t=this._pointers[0],n=this._pointerPositions[t];this._onTouchStart({pointerId:t,pageX:n.x,pageY:n.y});break}}function Ge(e){let t;switch(e.button){case 0:t=this.mouseButtons.LEFT;break;case 1:t=this.mouseButtons.MIDDLE;break;case 2:t=this.mouseButtons.RIGHT;break;default:t=-1}switch(t){case b.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(e),this.state=L.DOLLY;break;case b.MOUSE.ROTATE:if(e.ctrlKey||e.metaKey||e.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(e),this.state=L.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(e),this.state=L.ROTATE}break;case b.MOUSE.PAN:if(e.ctrlKey||e.metaKey||e.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(e),this.state=L.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(e),this.state=L.PAN}break;default:this.state=L.NONE}this.state!==L.NONE&&this.dispatchEvent(Ie)}function Ke(e){switch(this.state){case L.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(e);break;case L.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(e);break;case L.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(e);break}}function qe(e){this.enabled===!1||this.enableZoom===!1||this.state!==L.NONE||(e.preventDefault(),this.dispatchEvent(Ie),this._handleMouseWheel(this._customWheelEvent(e)),this.dispatchEvent(Le))}function Je(e){this.enabled!==!1&&this._handleKeyDown(e)}function Ye(e){switch(this._trackPointer(e),this._pointers.length){case 1:switch(this.touches.ONE){case b.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(e),this.state=L.TOUCH_ROTATE;break;case b.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(e),this.state=L.TOUCH_PAN;break;default:this.state=L.NONE}break;case 2:switch(this.touches.TWO){case b.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(e),this.state=L.TOUCH_DOLLY_PAN;break;case b.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(e),this.state=L.TOUCH_DOLLY_ROTATE;break;default:this.state=L.NONE}break;default:this.state=L.NONE}this.state!==L.NONE&&this.dispatchEvent(Ie)}function Xe(e){switch(this._trackPointer(e),this.state){case L.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(e),this.update();break;case L.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(e),this.update();break;case L.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(e),this.update();break;case L.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(e),this.update();break;default:this.state=L.NONE}}function R(e){this.enabled!==!1&&e.preventDefault()}function Ze(e){e.key===`Control`&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener(`keyup`,this._interceptControlUp,{passive:!0,capture:!0}))}function Qe(e){e.key===`Control`&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener(`keyup`,this._interceptControlUp,{passive:!0,capture:!0}))}var z=new b.Raycaster,B=new b.Vector3,V=new b.Vector3,H=new b.Quaternion,$e={X:new b.Vector3(1,0,0),Y:new b.Vector3(0,1,0),Z:new b.Vector3(0,0,1)},et={type:`change`},tt={type:`mouseDown`,mode:null},nt={type:`mouseUp`,mode:null},rt={type:`objectChange`},it=class extends b.Controls{constructor(e,t=null){super(void 0,t);let n=new St(this);this._root=n;let r=new Ct;this._gizmo=r,n.add(r);let i=new wt;this._plane=i,n.add(i);let a=this;function o(e,t){let n=t;Object.defineProperty(a,e,{get:function(){return n===void 0?t:n},set:function(t){n!==t&&(n=t,i[e]=t,r[e]=t,a.dispatchEvent({type:e+`-changed`,value:t}),a.dispatchEvent(et))}}),a[e]=t,i[e]=t,r[e]=t}o(`camera`,e),o(`object`,void 0),o(`enabled`,!0),o(`axis`,null),o(`mode`,`translate`),o(`translationSnap`,null),o(`rotationSnap`,null),o(`scaleSnap`,null),o(`space`,`world`),o(`size`,1),o(`dragging`,!1),o(`showX`,!0),o(`showY`,!0),o(`showZ`,!0),o(`showXY`,!0),o(`showYZ`,!0),o(`showXZ`,!0),o(`minX`,-1/0),o(`maxX`,1/0),o(`minY`,-1/0),o(`maxY`,1/0),o(`minZ`,-1/0),o(`maxZ`,1/0);let s=new b.Vector3,c=new b.Vector3,l=new b.Quaternion,u=new b.Quaternion,d=new b.Vector3,f=new b.Quaternion,p=new b.Vector3,m=new b.Vector3,h=new b.Vector3,g=new b.Vector3;o(`worldPosition`,s),o(`worldPositionStart`,c),o(`worldQuaternion`,l),o(`worldQuaternionStart`,u),o(`cameraPosition`,d),o(`cameraQuaternion`,f),o(`pointStart`,p),o(`pointEnd`,m),o(`rotationAxis`,h),o(`rotationAngle`,0),o(`eye`,g),this._offset=new b.Vector3,this._startNorm=new b.Vector3,this._endNorm=new b.Vector3,this._cameraScale=new b.Vector3,this._parentPosition=new b.Vector3,this._parentQuaternion=new b.Quaternion,this._parentQuaternionInv=new b.Quaternion,this._parentScale=new b.Vector3,this._worldScaleStart=new b.Vector3,this._worldQuaternionInv=new b.Quaternion,this._worldScale=new b.Vector3,this._positionStart=new b.Vector3,this._quaternionStart=new b.Quaternion,this._scaleStart=new b.Vector3,this._getPointer=at.bind(this),this._onPointerDown=st.bind(this),this._onPointerHover=ot.bind(this),this._onPointerMove=ct.bind(this),this._onPointerUp=lt.bind(this),t!==null&&this.connect(t)}connect(e){super.connect(e),this.domElement.addEventListener(`pointerdown`,this._onPointerDown),this.domElement.addEventListener(`pointermove`,this._onPointerHover),this.domElement.addEventListener(`pointerup`,this._onPointerUp),this.domElement.style.touchAction=`none`}disconnect(){this.domElement.removeEventListener(`pointerdown`,this._onPointerDown),this.domElement.removeEventListener(`pointermove`,this._onPointerHover),this.domElement.removeEventListener(`pointermove`,this._onPointerMove),this.domElement.removeEventListener(`pointerup`,this._onPointerUp),this.domElement.style.touchAction=``}getHelper(){return this._root}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;e!==null&&z.setFromCamera(e,this.camera);let t=ut(this._gizmo.picker[this.mode],z);t?this.axis=t.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e!=null&&e.button!==0)&&this.axis!==null){e!==null&&z.setFromCamera(e,this.camera);let t=ut(this._plane,z,!0);t&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(t.point).sub(this.worldPositionStart)),this.dragging=!0,tt.mode=this.mode,this.dispatchEvent(tt)}}pointerMove(e){let t=this.axis,n=this.mode,r=this.object,i=this.space;if(n===`scale`?i=`local`:(t===`E`||t===`XYZE`||t===`XYZ`)&&(i=`world`),r===void 0||t===null||this.dragging===!1||e!==null&&e.button!==-1)return;e!==null&&z.setFromCamera(e,this.camera);let a=ut(this._plane,z,!0);if(a){if(this.pointEnd.copy(a.point).sub(this.worldPositionStart),n===`translate`)this._offset.copy(this.pointEnd).sub(this.pointStart),i===`local`&&t!==`XYZ`&&this._offset.applyQuaternion(this._worldQuaternionInv),t.indexOf(`X`)===-1&&(this._offset.x=0),t.indexOf(`Y`)===-1&&(this._offset.y=0),t.indexOf(`Z`)===-1&&(this._offset.z=0),i===`local`&&t!==`XYZ`?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),r.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(i===`local`&&(r.position.applyQuaternion(H.copy(this._quaternionStart).invert()),t.search(`X`)!==-1&&(r.position.x=Math.round(r.position.x/this.translationSnap)*this.translationSnap),t.search(`Y`)!==-1&&(r.position.y=Math.round(r.position.y/this.translationSnap)*this.translationSnap),t.search(`Z`)!==-1&&(r.position.z=Math.round(r.position.z/this.translationSnap)*this.translationSnap),r.position.applyQuaternion(this._quaternionStart)),i===`world`&&(r.parent&&r.position.add(B.setFromMatrixPosition(r.parent.matrixWorld)),t.search(`X`)!==-1&&(r.position.x=Math.round(r.position.x/this.translationSnap)*this.translationSnap),t.search(`Y`)!==-1&&(r.position.y=Math.round(r.position.y/this.translationSnap)*this.translationSnap),t.search(`Z`)!==-1&&(r.position.z=Math.round(r.position.z/this.translationSnap)*this.translationSnap),r.parent&&r.position.sub(B.setFromMatrixPosition(r.parent.matrixWorld)))),r.position.x=Math.max(this.minX,Math.min(this.maxX,r.position.x)),r.position.y=Math.max(this.minY,Math.min(this.maxY,r.position.y)),r.position.z=Math.max(this.minZ,Math.min(this.maxZ,r.position.z));else if(n===`scale`){if(t.search(`XYZ`)!==-1){let e=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(e*=-1),V.set(e,e,e)}else B.copy(this.pointStart),V.copy(this.pointEnd),B.applyQuaternion(this._worldQuaternionInv),V.applyQuaternion(this._worldQuaternionInv),V.divide(B),t.search(`X`)===-1&&(V.x=1),t.search(`Y`)===-1&&(V.y=1),t.search(`Z`)===-1&&(V.z=1);r.scale.copy(this._scaleStart).multiply(V),this.scaleSnap&&(t.search(`X`)!==-1&&(r.scale.x=Math.round(r.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search(`Y`)!==-1&&(r.scale.y=Math.round(r.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search(`Z`)!==-1&&(r.scale.z=Math.round(r.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(n===`rotate`){this._offset.copy(this.pointEnd).sub(this.pointStart);let e=20/this.worldPosition.distanceTo(B.setFromMatrixPosition(this.camera.matrixWorld)),n=!1;t===`XYZE`?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(B.copy(this.rotationAxis).cross(this.eye))*e):(t===`X`||t===`Y`||t===`Z`)&&(this.rotationAxis.copy($e[t]),B.copy($e[t]),i===`local`&&B.applyQuaternion(this.worldQuaternion),B.cross(this.eye),B.length()===0?n=!0:this.rotationAngle=this._offset.dot(B.normalize())*e),(t===`E`||n)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),i===`local`&&t!==`E`&&t!==`XYZE`?(r.quaternion.copy(this._quaternionStart),r.quaternion.multiply(H.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),r.quaternion.copy(H.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),r.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(et),this.dispatchEvent(rt)}}pointerUp(e){e!==null&&e.button!==0||(this.dragging&&this.axis!==null&&(nt.mode=this.mode,this.dispatchEvent(nt)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this._root.dispose()}attach(e){return this.object=e,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(et),this.dispatchEvent(rt),this.pointStart.copy(this.pointEnd))}getRaycaster(){return z}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}setColors(e,t,n,r){let i=this._gizmo.materialLib;i.xAxis.color.set(e),i.yAxis.color.set(t),i.zAxis.color.set(n),i.active.color.set(r),i.xAxisTransparent.color.set(e),i.yAxisTransparent.color.set(t),i.zAxisTransparent.color.set(n),i.activeTransparent.color.set(r),i.xAxis._color&&i.xAxis._color.set(e),i.yAxis._color&&i.yAxis._color.set(t),i.zAxis._color&&i.zAxis._color.set(n),i.active._color&&i.active._color.set(r),i.xAxisTransparent._color&&i.xAxisTransparent._color.set(e),i.yAxisTransparent._color&&i.yAxisTransparent._color.set(t),i.zAxisTransparent._color&&i.zAxisTransparent._color.set(n),i.activeTransparent._color&&i.activeTransparent._color.set(r)}};function at(e){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:e.button};{let t=this.domElement.getBoundingClientRect();return{x:(e.clientX-t.left)/t.width*2-1,y:-(e.clientY-t.top)/t.height*2+1,button:e.button}}}function ot(e){if(this.enabled)switch(e.pointerType){case`mouse`:case`pen`:this.pointerHover(this._getPointer(e));break}}function st(e){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(e.pointerId),this.domElement.addEventListener(`pointermove`,this._onPointerMove),this.pointerHover(this._getPointer(e)),this.pointerDown(this._getPointer(e)))}function ct(e){this.enabled&&this.pointerMove(this._getPointer(e))}function lt(e){this.enabled&&(this.domElement.releasePointerCapture(e.pointerId),this.domElement.removeEventListener(`pointermove`,this._onPointerMove),this.pointerUp(this._getPointer(e)))}function ut(e,t,n){let r=t.intersectObject(e,!0);for(let e=0;e<r.length;e++)if(r[e].object.visible||n)return r[e];return!1}var dt=new b.Euler,U=new b.Vector3(0,1,0),ft=new b.Vector3(0,0,0),pt=new b.Matrix4,mt=new b.Quaternion,ht=new b.Quaternion,W=new b.Vector3,gt=new b.Matrix4,_t=new b.Vector3(1,0,0),G=new b.Vector3(0,1,0),vt=new b.Vector3(0,0,1),yt=new b.Vector3,bt=new b.Vector3,xt=new b.Vector3,St=class extends b.Object3D{constructor(e){super(),this.isTransformControlsRoot=!0,this.controls=e,this.visible=!1}updateMatrixWorld(e){let t=this.controls;t.object!==void 0&&(t.object.updateMatrixWorld(),t.object.parent===null?console.error(`TransformControls: The attached 3D object must be a part of the scene graph.`):t.object.parent.matrixWorld.decompose(t._parentPosition,t._parentQuaternion,t._parentScale),t.object.matrixWorld.decompose(t.worldPosition,t.worldQuaternion,t._worldScale),t._parentQuaternionInv.copy(t._parentQuaternion).invert(),t._worldQuaternionInv.copy(t.worldQuaternion).invert()),t.camera.updateMatrixWorld(),t.camera.matrixWorld.decompose(t.cameraPosition,t.cameraQuaternion,t._cameraScale),t.camera.isOrthographicCamera?t.camera.getWorldDirection(t.eye).negate():t.eye.copy(t.cameraPosition).sub(t.worldPosition).normalize(),super.updateMatrixWorld(e)}dispose(){this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}},Ct=class extends b.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type=`TransformControlsGizmo`;let e=new b.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new b.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),n=e.clone();n.opacity=.15;let r=t.clone();r.opacity=.5;let i=e.clone();i.color.setHex(16711680);let a=e.clone();a.color.setHex(65280);let o=e.clone();o.color.setHex(255);let s=e.clone();s.color.setHex(16711680),s.opacity=.5;let c=e.clone();c.color.setHex(65280),c.opacity=.5;let l=e.clone();l.color.setHex(255),l.opacity=.5;let u=e.clone();u.opacity=.25;let d=e.clone();d.color.setHex(16776960),d.opacity=.25;let f=e.clone();f.color.setHex(16776960);let p=e.clone();p.color.setHex(7895160),this.materialLib={xAxis:i,yAxis:a,zAxis:o,active:f,xAxisTransparent:s,yAxisTransparent:c,zAxisTransparent:l,activeTransparent:d};let m=new b.CylinderGeometry(0,.04,.1,12);m.translate(0,.05,0);let h=new b.BoxGeometry(.08,.08,.08);h.translate(0,.04,0);let g=new b.BufferGeometry;g.setAttribute(`position`,new b.Float32BufferAttribute([0,0,0,1,0,0],3));let _=new b.CylinderGeometry(.0075,.0075,.5,3);_.translate(0,.25,0);function v(e,t){let n=new b.TorusGeometry(e,.0075,3,64,t*Math.PI*2);return n.rotateY(Math.PI/2),n.rotateX(Math.PI/2),n}function y(){let e=new b.BufferGeometry;return e.setAttribute(`position`,new b.Float32BufferAttribute([0,0,0,1,1,1],3)),e}let x={X:[[new b.Mesh(m,i),[.5,0,0],[0,0,-Math.PI/2]],[new b.Mesh(m,i),[-.5,0,0],[0,0,Math.PI/2]],[new b.Mesh(_,i),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new b.Mesh(m,a),[0,.5,0]],[new b.Mesh(m,a),[0,-.5,0],[Math.PI,0,0]],[new b.Mesh(_,a)]],Z:[[new b.Mesh(m,o),[0,0,.5],[Math.PI/2,0,0]],[new b.Mesh(m,o),[0,0,-.5],[-Math.PI/2,0,0]],[new b.Mesh(_,o),null,[Math.PI/2,0,0]]],XYZ:[[new b.Mesh(new b.OctahedronGeometry(.1,0),u),[0,0,0]]],XY:[[new b.Mesh(new b.BoxGeometry(.15,.15,.01),l),[.15,.15,0]]],YZ:[[new b.Mesh(new b.BoxGeometry(.15,.15,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new b.Mesh(new b.BoxGeometry(.15,.15,.01),c),[.15,0,.15],[-Math.PI/2,0,0]]]},S={X:[[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[.3,0,0],[0,0,-Math.PI/2]],[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,.3,0]],[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,-.3,0],[0,0,Math.PI]]],Z:[[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,0,.3],[Math.PI/2,0,0]],[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new b.Mesh(new b.OctahedronGeometry(.2,0),n)]],XY:[[new b.Mesh(new b.BoxGeometry(.2,.2,.01),n),[.15,.15,0]]],YZ:[[new b.Mesh(new b.BoxGeometry(.2,.2,.01),n),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new b.Mesh(new b.BoxGeometry(.2,.2,.01),n),[.15,0,.15],[-Math.PI/2,0,0]]]},C={START:[[new b.Mesh(new b.OctahedronGeometry(.01,2),r),null,null,null,`helper`]],END:[[new b.Mesh(new b.OctahedronGeometry(.01,2),r),null,null,null,`helper`]],DELTA:[[new b.Line(y(),r),null,null,null,`helper`]],X:[[new b.Line(g,r),[-1e3,0,0],null,[1e6,1,1],`helper`]],Y:[[new b.Line(g,r),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],`helper`]],Z:[[new b.Line(g,r),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],`helper`]]},w={XYZE:[[new b.Mesh(v(.5,1),p),null,[0,Math.PI/2,0]]],X:[[new b.Mesh(v(.5,.5),i)]],Y:[[new b.Mesh(v(.5,.5),a),null,[0,0,-Math.PI/2]]],Z:[[new b.Mesh(v(.5,.5),o),null,[0,Math.PI/2,0]]],E:[[new b.Mesh(v(.75,1),d),null,[0,Math.PI/2,0]]]},T={AXIS:[[new b.Line(g,r),[-1e3,0,0],null,[1e6,1,1],`helper`]]},E={XYZE:[[new b.Mesh(new b.SphereGeometry(.25,10,8),n)]],X:[[new b.Mesh(new b.TorusGeometry(.5,.1,4,24),n),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new b.Mesh(new b.TorusGeometry(.5,.1,4,24),n),[0,0,0],[Math.PI/2,0,0]]],Z:[[new b.Mesh(new b.TorusGeometry(.5,.1,4,24),n),[0,0,0],[0,0,-Math.PI/2]]],E:[[new b.Mesh(new b.TorusGeometry(.75,.1,2,24),n)]]},D={X:[[new b.Mesh(h,i),[.5,0,0],[0,0,-Math.PI/2]],[new b.Mesh(_,i),[0,0,0],[0,0,-Math.PI/2]],[new b.Mesh(h,i),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new b.Mesh(h,a),[0,.5,0]],[new b.Mesh(_,a)],[new b.Mesh(h,a),[0,-.5,0],[0,0,Math.PI]]],Z:[[new b.Mesh(h,o),[0,0,.5],[Math.PI/2,0,0]],[new b.Mesh(_,o),[0,0,0],[Math.PI/2,0,0]],[new b.Mesh(h,o),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new b.Mesh(new b.BoxGeometry(.15,.15,.01),l),[.15,.15,0]]],YZ:[[new b.Mesh(new b.BoxGeometry(.15,.15,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new b.Mesh(new b.BoxGeometry(.15,.15,.01),c),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new b.Mesh(new b.BoxGeometry(.1,.1,.1),u)]]},O={X:[[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[.3,0,0],[0,0,-Math.PI/2]],[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,.3,0]],[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,-.3,0],[0,0,Math.PI]]],Z:[[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,0,.3],[Math.PI/2,0,0]],[new b.Mesh(new b.CylinderGeometry(.2,0,.6,4),n),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new b.Mesh(new b.BoxGeometry(.2,.2,.01),n),[.15,.15,0]]],YZ:[[new b.Mesh(new b.BoxGeometry(.2,.2,.01),n),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new b.Mesh(new b.BoxGeometry(.2,.2,.01),n),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new b.Mesh(new b.BoxGeometry(.2,.2,.2),n),[0,0,0]]]},k={X:[[new b.Line(g,r),[-1e3,0,0],null,[1e6,1,1],`helper`]],Y:[[new b.Line(g,r),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],`helper`]],Z:[[new b.Line(g,r),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],`helper`]]};function A(e){let t=new b.Object3D;for(let n in e)for(let r=e[n].length;r--;){let i=e[n][r][0].clone(),a=e[n][r][1],o=e[n][r][2],s=e[n][r][3],c=e[n][r][4];i.name=n,i.tag=c,a&&i.position.set(a[0],a[1],a[2]),o&&i.rotation.set(o[0],o[1],o[2]),s&&i.scale.set(s[0],s[1],s[2]),i.updateMatrix();let l=i.geometry.clone();l.applyMatrix4(i.matrix),i.geometry=l,i.renderOrder=1/0,i.position.set(0,0,0),i.rotation.set(0,0,0),i.scale.set(1,1,1),t.add(i)}return t}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=A(x)),this.add(this.gizmo.rotate=A(w)),this.add(this.gizmo.scale=A(D)),this.add(this.picker.translate=A(S)),this.add(this.picker.rotate=A(E)),this.add(this.picker.scale=A(O)),this.add(this.helper.translate=A(C)),this.add(this.helper.rotate=A(T)),this.add(this.helper.scale=A(k)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(e){let t=(this.mode===`scale`?`local`:this.space)===`local`?this.worldQuaternion:ht;this.gizmo.translate.visible=this.mode===`translate`,this.gizmo.rotate.visible=this.mode===`rotate`,this.gizmo.scale.visible=this.mode===`scale`,this.helper.translate.visible=this.mode===`translate`,this.helper.rotate.visible=this.mode===`rotate`,this.helper.scale.visible=this.mode===`scale`;let n=[];n=n.concat(this.picker[this.mode].children),n=n.concat(this.gizmo[this.mode].children),n=n.concat(this.helper[this.mode].children);for(let e=0;e<n.length;e++){let r=n[e];r.visible=!0,r.rotation.set(0,0,0),r.position.copy(this.worldPosition);let i;if(i=this.camera.isOrthographicCamera?(this.camera.top-this.camera.bottom)/this.camera.zoom:this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),r.scale.set(1,1,1).multiplyScalar(i*this.size/4),r.tag===`helper`){r.visible=!1,r.name===`AXIS`?(r.visible=!!this.axis,this.axis===`X`&&(H.setFromEuler(dt.set(0,0,0)),r.quaternion.copy(t).multiply(H),Math.abs(U.copy(_t).applyQuaternion(t).dot(this.eye))>.9&&(r.visible=!1)),this.axis===`Y`&&(H.setFromEuler(dt.set(0,0,Math.PI/2)),r.quaternion.copy(t).multiply(H),Math.abs(U.copy(G).applyQuaternion(t).dot(this.eye))>.9&&(r.visible=!1)),this.axis===`Z`&&(H.setFromEuler(dt.set(0,Math.PI/2,0)),r.quaternion.copy(t).multiply(H),Math.abs(U.copy(vt).applyQuaternion(t).dot(this.eye))>.9&&(r.visible=!1)),this.axis===`XYZE`&&(H.setFromEuler(dt.set(0,Math.PI/2,0)),U.copy(this.rotationAxis),r.quaternion.setFromRotationMatrix(pt.lookAt(ft,U,G)),r.quaternion.multiply(H),r.visible=this.dragging),this.axis===`E`&&(r.visible=!1)):r.name===`START`?(r.position.copy(this.worldPositionStart),r.visible=this.dragging):r.name===`END`?(r.position.copy(this.worldPosition),r.visible=this.dragging):r.name===`DELTA`?(r.position.copy(this.worldPositionStart),r.quaternion.copy(this.worldQuaternionStart),B.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),B.applyQuaternion(this.worldQuaternionStart.clone().invert()),r.scale.copy(B),r.visible=this.dragging):(r.quaternion.copy(t),this.dragging?r.position.copy(this.worldPositionStart):r.position.copy(this.worldPosition),this.axis&&(r.visible=this.axis.search(r.name)!==-1));continue}if(r.quaternion.copy(t),this.mode===`translate`||this.mode===`scale`){let e=.99,n=.2;r.name===`X`&&Math.abs(U.copy(_t).applyQuaternion(t).dot(this.eye))>e&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name===`Y`&&Math.abs(U.copy(G).applyQuaternion(t).dot(this.eye))>e&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name===`Z`&&Math.abs(U.copy(vt).applyQuaternion(t).dot(this.eye))>e&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name===`XY`&&Math.abs(U.copy(vt).applyQuaternion(t).dot(this.eye))<n&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name===`YZ`&&Math.abs(U.copy(_t).applyQuaternion(t).dot(this.eye))<n&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name===`XZ`&&Math.abs(U.copy(G).applyQuaternion(t).dot(this.eye))<n&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1)}else this.mode===`rotate`&&(mt.copy(t),U.copy(this.eye).applyQuaternion(H.copy(t).invert()),r.name.search(`E`)!==-1&&r.quaternion.setFromRotationMatrix(pt.lookAt(this.eye,ft,G)),r.name===`X`&&(H.setFromAxisAngle(_t,Math.atan2(-U.y,U.z)),H.multiplyQuaternions(mt,H),r.quaternion.copy(H)),r.name===`Y`&&(H.setFromAxisAngle(G,Math.atan2(U.x,U.z)),H.multiplyQuaternions(mt,H),r.quaternion.copy(H)),r.name===`Z`&&(H.setFromAxisAngle(vt,Math.atan2(U.y,U.x)),H.multiplyQuaternions(mt,H),r.quaternion.copy(H)));r.visible=r.visible&&(r.name.indexOf(`X`)===-1||this.showX),r.visible=r.visible&&(r.name.indexOf(`Y`)===-1||this.showY),r.visible=r.visible&&(r.name.indexOf(`Z`)===-1||this.showZ),r.visible=r.visible&&(r.name.indexOf(`E`)===-1||this.showX&&this.showY&&this.showZ),r.visible=r.visible&&(r.name.indexOf(`XY`)===-1||this.showXY),r.visible=r.visible&&(r.name.indexOf(`YZ`)===-1||this.showYZ),r.visible=r.visible&&(r.name.indexOf(`XZ`)===-1||this.showXZ),r.material._color=r.material._color||r.material.color.clone(),r.material._opacity=r.material._opacity||r.material.opacity,r.material.color.copy(r.material._color),r.material.opacity=r.material._opacity,this.enabled&&this.axis&&(r.name===this.axis||this.axis.split(``).some(function(e){return r.name===e}))&&(r.material.color.copy(this.materialLib.active.color),r.material.opacity=1)}super.updateMatrixWorld(e)}},wt=class extends b.Mesh{constructor(){super(new b.PlaneGeometry(1e5,1e5,2,2),new b.MeshBasicMaterial({visible:!1,wireframe:!0,side:b.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type=`TransformControlsPlane`}updateMatrixWorld(e){let t=this.space;switch(this.position.copy(this.worldPosition),this.mode===`scale`&&(t=`local`),yt.copy(_t).applyQuaternion(t===`local`?this.worldQuaternion:ht),bt.copy(G).applyQuaternion(t===`local`?this.worldQuaternion:ht),xt.copy(vt).applyQuaternion(t===`local`?this.worldQuaternion:ht),U.copy(bt),this.mode){case`translate`:case`scale`:switch(this.axis){case`X`:U.copy(this.eye).cross(yt),W.copy(yt).cross(U);break;case`Y`:U.copy(this.eye).cross(bt),W.copy(bt).cross(U);break;case`Z`:U.copy(this.eye).cross(xt),W.copy(xt).cross(U);break;case`XY`:W.copy(xt);break;case`YZ`:W.copy(yt);break;case`XZ`:U.copy(xt),W.copy(bt);break;case`XYZ`:case`E`:W.set(0,0,0);break}break;default:W.set(0,0,0)}W.length()===0?this.quaternion.copy(this.cameraQuaternion):(gt.lookAt(B.set(0,0,0),W,U),this.quaternion.setFromRotationMatrix(gt)),super.updateMatrixWorld(e)}},Tt=class extends b.Object3D{constructor(e=document.createElement(`div`)){super(),this.isCSS2DObject=!0,this.element=e,this.element.style.position=`absolute`,this.element.style.userSelect=`none`,this.element.setAttribute(`draggable`,!1),this.center=new b.Vector2(.5,.5),this.addEventListener(`removed`,function(){this.traverse(function(e){e.element&&e.element instanceof e.element.ownerDocument.defaultView.Element&&e.element.parentNode!==null&&e.element.remove()})})}copy(e,t){return super.copy(e,t),this.element=e.element.cloneNode(!0),this.center=e.center,this}},Et=new b.Vector3,Dt=new b.Matrix4,Ot=new b.Matrix4,kt=new b.Vector3,At=new b.Vector3,jt=class{constructor(e={}){let t=this,n,r,i,a,o={objects:new WeakMap},s=e.element===void 0?document.createElement(`div`):e.element;s.style.overflow=`hidden`,this.domElement=s,this.sortObjects=!0,this.getSize=function(){return{width:n,height:r}},this.render=function(e,t){e.matrixWorldAutoUpdate===!0&&e.updateMatrixWorld(),t.parent===null&&t.matrixWorldAutoUpdate===!0&&t.updateMatrixWorld(),Dt.copy(t.matrixWorldInverse),Ot.multiplyMatrices(t.projectionMatrix,Dt),l(e,e,t),this.sortObjects&&f(e)},this.setSize=function(e,t){n=e,r=t,i=n/2,a=r/2,s.style.width=e+`px`,s.style.height=t+`px`};function c(e){e.isCSS2DObject&&(e.element.style.display=`none`);for(let t=0,n=e.children.length;t<n;t++)c(e.children[t])}function l(e,n,r){if(e.visible===!1){c(e);return}if(e.isCSS2DObject){Et.setFromMatrixPosition(e.matrixWorld),Et.applyMatrix4(Ot);let c=Et.z>=-1&&Et.z<=1&&e.layers.test(r.layers)===!0,l=e.element;l.style.display=c===!0?``:`none`,c===!0&&(e.onBeforeRender(t,n,r),l.style.transform=`translate(`+-100*e.center.x+`%,`+-100*e.center.y+`%)translate(`+(Et.x*i+i)+`px,`+(-Et.y*a+a)+`px)`,l.parentNode!==s&&s.appendChild(l),e.onAfterRender(t,n,r));let d={distanceToCameraSquared:u(r,e)};o.objects.set(e,d)}for(let t=0,i=e.children.length;t<i;t++)l(e.children[t],n,r)}function u(e,t){return kt.setFromMatrixPosition(e.matrixWorld),At.setFromMatrixPosition(t.matrixWorld),kt.distanceToSquared(At)}function d(e){let t=[];return e.traverseVisible(function(e){e.isCSS2DObject&&t.push(e)}),t}function f(e){let t=d(e).sort(function(e,t){return e.renderOrder===t.renderOrder?o.objects.get(e).distanceToCameraSquared-o.objects.get(t).distanceToCameraSquared:t.renderOrder-e.renderOrder}),n=t.length;for(let e=0,r=t.length;e<r;e++)t[e].element.style.zIndex=n-e}}};function Mt(e,t){if(t===b.TrianglesDrawMode)return console.warn(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.`),e;if(t===b.TriangleFanDrawMode||t===b.TriangleStripDrawMode){let n=e.getIndex();if(n===null){let t=[],r=e.getAttribute(`position`);if(r!==void 0){for(let e=0;e<r.count;e++)t.push(e);e.setIndex(t),n=e.getIndex()}else return console.error(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.`),e}let r=n.count-2,i=[];if(t===b.TriangleFanDrawMode)for(let e=1;e<=r;e++)i.push(n.getX(0)),i.push(n.getX(e)),i.push(n.getX(e+1));else for(let e=0;e<r;e++)e%2==0?(i.push(n.getX(e)),i.push(n.getX(e+1)),i.push(n.getX(e+2))):(i.push(n.getX(e+2)),i.push(n.getX(e+1)),i.push(n.getX(e)));i.length/3!==r&&console.error(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.`);let a=e.clone();return a.setIndex(i),a.clearGroups(),a}else return console.error(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:`,t),e}var Nt=h((()=>{}));function Pt(e){let t=new Map,n=new Map,r=e.clone();return Ft(e,r,function(e,r){t.set(r,e),n.set(e,r)}),r.traverse(function(e){if(!e.isSkinnedMesh)return;let r=e,i=t.get(e),a=i.skeleton.bones;r.skeleton=i.skeleton.clone(),r.bindMatrix.copy(i.bindMatrix),r.skeleton.bones=a.map(function(e){return n.get(e)}),r.bind(r.skeleton,r.bindMatrix)}),r}function Ft(e,t,n){n(e,t);for(let r=0;r<e.children.length;r++)Ft(e.children[r],t.children[r],n)}var It=h((()=>{})),Lt=g({GLTFLoader:()=>Jt});function Rt(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}function K(e,t,n){let r=e.json.materials[t];return r.extensions&&r.extensions[n]?r.extensions[n]:null}function zt(e){return e.DefaultMaterial===void 0&&(e.DefaultMaterial=new b.MeshStandardMaterial({color:16777215,emissive:0,metalness:1,roughness:1,transparent:!1,depthTest:!0,side:b.FrontSide})),e.DefaultMaterial}function q(e,t,n){for(let r in n.extensions)e[r]===void 0&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[r]=n.extensions[r])}function J(e,t){t.extras!==void 0&&(typeof t.extras==`object`?Object.assign(e.userData,t.extras):console.warn(`THREE.GLTFLoader: Ignoring primitive type .extras, `+t.extras))}function Bt(e,t,n){let r=!1,i=!1,a=!1;for(let e=0,n=t.length;e<n;e++){let n=t[e];if(n.POSITION!==void 0&&(r=!0),n.NORMAL!==void 0&&(i=!0),n.COLOR_0!==void 0&&(a=!0),r&&i&&a)break}if(!r&&!i&&!a)return Promise.resolve(e);let o=[],s=[],c=[];for(let l=0,u=t.length;l<u;l++){let u=t[l];if(r){let t=u.POSITION===void 0?e.attributes.position:n.getDependency(`accessor`,u.POSITION);o.push(t)}if(i){let t=u.NORMAL===void 0?e.attributes.normal:n.getDependency(`accessor`,u.NORMAL);s.push(t)}if(a){let t=u.COLOR_0===void 0?e.attributes.color:n.getDependency(`accessor`,u.COLOR_0);c.push(t)}}return Promise.all([Promise.all(o),Promise.all(s),Promise.all(c)]).then(function(t){let n=t[0],o=t[1],s=t[2];return r&&(e.morphAttributes.position=n),i&&(e.morphAttributes.normal=o),a&&(e.morphAttributes.color=s),e.morphTargetsRelative=!0,e})}function Vt(e,t){if(e.updateMorphTargets(),t.weights!==void 0)for(let n=0,r=t.weights.length;n<r;n++)e.morphTargetInfluences[n]=t.weights[n];if(t.extras&&Array.isArray(t.extras.targetNames)){let n=t.extras.targetNames;if(e.morphTargetInfluences.length===n.length){e.morphTargetDictionary={};for(let t=0,r=n.length;t<r;t++)e.morphTargetDictionary[n[t]]=t}else console.warn(`THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.`)}}function Ht(e){let t,n=e.extensions&&e.extensions[Y.KHR_DRACO_MESH_COMPRESSION];if(t=n?`draco:`+n.bufferView+`:`+n.indices+`:`+Ut(n.attributes):e.indices+`:`+Ut(e.attributes)+`:`+e.mode,e.targets!==void 0)for(let n=0,r=e.targets.length;n<r;n++)t+=`:`+Ut(e.targets[n]);return t}function Ut(e){let t=``,n=Object.keys(e).sort();for(let r=0,i=n.length;r<i;r++)t+=n[r]+`:`+e[n[r]]+`;`;return t}function Wt(e){switch(e){case Int8Array:return 1/127;case Uint8Array:return 1/255;case Int16Array:return 1/32767;case Uint16Array:return 1/65535;default:throw Error(`THREE.GLTFLoader: Unsupported normalized accessor component type.`)}}function Gt(e){return e.search(/\.jpe?g($|\?)/i)>0||e.search(/^data\:image\/jpeg/)===0?`image/jpeg`:e.search(/\.webp($|\?)/i)>0||e.search(/^data\:image\/webp/)===0?`image/webp`:e.search(/\.ktx2($|\?)/i)>0||e.search(/^data\:image\/ktx2/)===0?`image/ktx2`:`image/png`}function Kt(e,t,n){let r=t.attributes,i=new b.Box3;if(r.POSITION!==void 0){let e=n.json.accessors[r.POSITION],t=e.min,a=e.max;if(t!==void 0&&a!==void 0){if(i.set(new b.Vector3(t[0],t[1],t[2]),new b.Vector3(a[0],a[1],a[2])),e.normalized){let t=Wt(Z[e.componentType]);i.min.multiplyScalar(t),i.max.multiplyScalar(t)}}else{console.warn(`THREE.GLTFLoader: Missing min/max properties for accessor POSITION.`);return}}else return;let a=t.targets;if(a!==void 0){let e=new b.Vector3,t=new b.Vector3;for(let r=0,i=a.length;r<i;r++){let i=a[r];if(i.POSITION!==void 0){let r=n.json.accessors[i.POSITION],a=r.min,o=r.max;if(a!==void 0&&o!==void 0){if(t.setX(Math.max(Math.abs(a[0]),Math.abs(o[0]))),t.setY(Math.max(Math.abs(a[1]),Math.abs(o[1]))),t.setZ(Math.max(Math.abs(a[2]),Math.abs(o[2]))),r.normalized){let e=Wt(Z[r.componentType]);t.multiplyScalar(e)}e.max(t)}else console.warn(`THREE.GLTFLoader: Missing min/max properties for accessor POSITION.`)}}i.expandByVector(e)}e.boundingBox=i;let o=new b.Sphere;i.getCenter(o.center),o.radius=i.min.distanceTo(i.max)/2,e.boundingSphere=o}function qt(e,t,n){let r=t.attributes,i=[];function a(t,r){return n.getDependency(`accessor`,t).then(function(t){e.setAttribute(r,t)})}for(let t in r){let n=Dn[t]||t.toLowerCase();n in e.attributes||i.push(a(r[t],n))}if(t.indices!==void 0&&!e.index){let r=n.getDependency(`accessor`,t.indices).then(function(t){e.setIndex(t)});i.push(r)}return b.ColorManagement.workingColorSpace!==b.LinearSRGBColorSpace&&`COLOR_0`in r&&console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${b.ColorManagement.workingColorSpace}" not supported.`),J(e,t),Kt(e,t,n),Promise.all(i).then(function(){return t.targets===void 0?e:Bt(e,t.targets,n)})}var Jt,Y,Yt,Xt,Zt,Qt,$t,en,tn,nn,rn,an,on,sn,cn,ln,un,dn,fn,pn,mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,X,Z,wn,Tn,En,Dn,Q,On,kn,An,jn,Mn=h((()=>{Nt(),It(),Jt=class extends b.Loader{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register(function(e){return new Qt(e)}),this.register(function(e){return new $t(e)}),this.register(function(e){return new ln(e)}),this.register(function(e){return new un(e)}),this.register(function(e){return new dn(e)}),this.register(function(e){return new tn(e)}),this.register(function(e){return new nn(e)}),this.register(function(e){return new rn(e)}),this.register(function(e){return new an(e)}),this.register(function(e){return new Zt(e)}),this.register(function(e){return new on(e)}),this.register(function(e){return new en(e)}),this.register(function(e){return new cn(e)}),this.register(function(e){return new sn(e)}),this.register(function(e){return new Yt(e)}),this.register(function(e){return new fn(e,Y.EXT_MESHOPT_COMPRESSION)}),this.register(function(e){return new fn(e,Y.KHR_MESHOPT_COMPRESSION)}),this.register(function(e){return new pn(e)})}load(e,t,n,r){let i=this,a;if(this.resourcePath!==``)a=this.resourcePath;else if(this.path!==``){let t=b.LoaderUtils.extractUrlBase(e);a=b.LoaderUtils.resolveURL(t,this.path)}else a=b.LoaderUtils.extractUrlBase(e);this.manager.itemStart(e);let o=function(t){r?r(t):console.error(t),i.manager.itemError(e),i.manager.itemEnd(e)},s=new b.FileLoader(this.manager);s.setPath(this.path),s.setResponseType(`arraybuffer`),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,function(n){try{i.parse(n,a,function(n){t(n),i.manager.itemEnd(e)},o)}catch(e){o(e)}},n,o)}setDRACOLoader(e){return this.dracoLoader=e,this}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return this.pluginCallbacks.indexOf(e)===-1&&this.pluginCallbacks.push(e),this}unregister(e){return this.pluginCallbacks.indexOf(e)!==-1&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,r){let i,a={},o={},s=new TextDecoder;if(typeof e==`string`)i=JSON.parse(e);else if(e instanceof ArrayBuffer)if(s.decode(new Uint8Array(e,0,4))===mn){try{a[Y.KHR_BINARY_GLTF]=new _n(e)}catch(e){r&&r(e);return}i=JSON.parse(a[Y.KHR_BINARY_GLTF].content)}else i=JSON.parse(s.decode(e));else i=e;if(i.asset===void 0||i.asset.version[0]<2){r&&r(Error(`THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.`));return}let c=new jn(i,{path:t||this.resourcePath||``,crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e<this.pluginCallbacks.length;e++){let t=this.pluginCallbacks[e](c);t.name||console.error(`THREE.GLTFLoader: Invalid plugin found: missing name`),o[t.name]=t,a[t.name]=!0}if(i.extensionsUsed)for(let e=0;e<i.extensionsUsed.length;++e){let t=i.extensionsUsed[e],n=i.extensionsRequired||[];switch(t){case Y.KHR_MATERIALS_UNLIT:a[t]=new Xt;break;case Y.KHR_DRACO_MESH_COMPRESSION:a[t]=new vn(i,this.dracoLoader);break;case Y.KHR_TEXTURE_TRANSFORM:a[t]=new yn;break;case Y.KHR_MESH_QUANTIZATION:a[t]=new bn;break;default:n.indexOf(t)>=0&&o[t]===void 0&&console.warn(`THREE.GLTFLoader: Unknown extension "`+t+`".`)}}c.setExtensions(a),c.setPlugins(o),c.parse(n,r)}parseAsync(e,t){let n=this;return new Promise(function(r,i){n.parse(e,t,r,i)})}},Y={KHR_BINARY_GLTF:`KHR_binary_glTF`,KHR_DRACO_MESH_COMPRESSION:`KHR_draco_mesh_compression`,KHR_LIGHTS_PUNCTUAL:`KHR_lights_punctual`,KHR_MATERIALS_CLEARCOAT:`KHR_materials_clearcoat`,KHR_MATERIALS_DISPERSION:`KHR_materials_dispersion`,KHR_MATERIALS_IOR:`KHR_materials_ior`,KHR_MATERIALS_SHEEN:`KHR_materials_sheen`,KHR_MATERIALS_SPECULAR:`KHR_materials_specular`,KHR_MATERIALS_TRANSMISSION:`KHR_materials_transmission`,KHR_MATERIALS_IRIDESCENCE:`KHR_materials_iridescence`,KHR_MATERIALS_ANISOTROPY:`KHR_materials_anisotropy`,KHR_MATERIALS_UNLIT:`KHR_materials_unlit`,KHR_MATERIALS_VOLUME:`KHR_materials_volume`,KHR_TEXTURE_BASISU:`KHR_texture_basisu`,KHR_TEXTURE_TRANSFORM:`KHR_texture_transform`,KHR_MESH_QUANTIZATION:`KHR_mesh_quantization`,KHR_MATERIALS_EMISSIVE_STRENGTH:`KHR_materials_emissive_strength`,EXT_MATERIALS_BUMP:`EXT_materials_bump`,EXT_TEXTURE_WEBP:`EXT_texture_webp`,EXT_TEXTURE_AVIF:`EXT_texture_avif`,EXT_MESHOPT_COMPRESSION:`EXT_meshopt_compression`,KHR_MESHOPT_COMPRESSION:`KHR_meshopt_compression`,EXT_MESH_GPU_INSTANCING:`EXT_mesh_gpu_instancing`},Yt=class{constructor(e){this.parser=e,this.name=Y.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){let e=this.parser,t=this.parser.json.nodes||[];for(let n=0,r=t.length;n<r;n++){let r=t[n];r.extensions&&r.extensions[this.name]&&r.extensions[this.name].light!==void 0&&e._addNodeRef(this.cache,r.extensions[this.name].light)}}_loadLight(e){let t=this.parser,n=`light:`+e,r=t.cache.get(n);if(r)return r;let i=t.json,a=((i.extensions&&i.extensions[this.name]||{}).lights||[])[e],o,s=new b.Color(16777215);a.color!==void 0&&s.setRGB(a.color[0],a.color[1],a.color[2],b.LinearSRGBColorSpace);let c=a.range===void 0?0:a.range;switch(a.type){case`directional`:o=new b.DirectionalLight(s),o.target.position.set(0,0,-1),o.add(o.target);break;case`point`:o=new b.PointLight(s),o.distance=c;break;case`spot`:o=new b.SpotLight(s),o.distance=c,a.spot=a.spot||{},a.spot.innerConeAngle=a.spot.innerConeAngle===void 0?0:a.spot.innerConeAngle,a.spot.outerConeAngle=a.spot.outerConeAngle===void 0?Math.PI/4:a.spot.outerConeAngle,o.angle=a.spot.outerConeAngle,o.penumbra=1-a.spot.innerConeAngle/a.spot.outerConeAngle,o.target.position.set(0,0,-1),o.add(o.target);break;default:throw Error(`THREE.GLTFLoader: Unexpected light type: `+a.type)}return o.position.set(0,0,0),J(o,a),a.intensity!==void 0&&(o.intensity=a.intensity),o.name=t.createUniqueName(a.name||`light_`+e),r=Promise.resolve(o),t.cache.add(n,r),r}getDependency(e,t){if(e===`light`)return this._loadLight(t)}createNodeAttachment(e){let t=this,n=this.parser,r=n.json.nodes[e],i=(r.extensions&&r.extensions[this.name]||{}).light;return i===void 0?null:this._loadLight(i).then(function(e){return n._getNodeRef(t.cache,i,e)})}},Xt=class{constructor(){this.name=Y.KHR_MATERIALS_UNLIT}getMaterialType(){return b.MeshBasicMaterial}extendParams(e,t,n){let r=[];e.color=new b.Color(1,1,1),e.opacity=1;let i=t.pbrMetallicRoughness;if(i){if(Array.isArray(i.baseColorFactor)){let t=i.baseColorFactor;e.color.setRGB(t[0],t[1],t[2],b.LinearSRGBColorSpace),e.opacity=t[3]}i.baseColorTexture!==void 0&&r.push(n.assignTexture(e,`map`,i.baseColorTexture,b.SRGBColorSpace))}return Promise.all(r)}},Zt=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_EMISSIVE_STRENGTH}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);return n===null||n.emissiveStrength!==void 0&&(t.emissiveIntensity=n.emissiveStrength),Promise.resolve()}},Qt=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_CLEARCOAT}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];if(n.clearcoatFactor!==void 0&&(t.clearcoat=n.clearcoatFactor),n.clearcoatTexture!==void 0&&r.push(this.parser.assignTexture(t,`clearcoatMap`,n.clearcoatTexture)),n.clearcoatRoughnessFactor!==void 0&&(t.clearcoatRoughness=n.clearcoatRoughnessFactor),n.clearcoatRoughnessTexture!==void 0&&r.push(this.parser.assignTexture(t,`clearcoatRoughnessMap`,n.clearcoatRoughnessTexture)),n.clearcoatNormalTexture!==void 0&&(r.push(this.parser.assignTexture(t,`clearcoatNormalMap`,n.clearcoatNormalTexture)),n.clearcoatNormalTexture.scale!==void 0)){let e=n.clearcoatNormalTexture.scale;t.clearcoatNormalScale=new b.Vector2(e,e)}return Promise.all(r)}},$t=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_DISPERSION}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);return n===null||(t.dispersion=n.dispersion===void 0?0:n.dispersion),Promise.resolve()}},en=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_IRIDESCENCE}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return n.iridescenceFactor!==void 0&&(t.iridescence=n.iridescenceFactor),n.iridescenceTexture!==void 0&&r.push(this.parser.assignTexture(t,`iridescenceMap`,n.iridescenceTexture)),n.iridescenceIor!==void 0&&(t.iridescenceIOR=n.iridescenceIor),t.iridescenceThicknessRange===void 0&&(t.iridescenceThicknessRange=[100,400]),n.iridescenceThicknessMinimum!==void 0&&(t.iridescenceThicknessRange[0]=n.iridescenceThicknessMinimum),n.iridescenceThicknessMaximum!==void 0&&(t.iridescenceThicknessRange[1]=n.iridescenceThicknessMaximum),n.iridescenceThicknessTexture!==void 0&&r.push(this.parser.assignTexture(t,`iridescenceThicknessMap`,n.iridescenceThicknessTexture)),Promise.all(r)}},tn=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_SHEEN}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];if(t.sheenColor=new b.Color(0,0,0),t.sheenRoughness=0,t.sheen=1,n.sheenColorFactor!==void 0){let e=n.sheenColorFactor;t.sheenColor.setRGB(e[0],e[1],e[2],b.LinearSRGBColorSpace)}return n.sheenRoughnessFactor!==void 0&&(t.sheenRoughness=n.sheenRoughnessFactor),n.sheenColorTexture!==void 0&&r.push(this.parser.assignTexture(t,`sheenColorMap`,n.sheenColorTexture,b.SRGBColorSpace)),n.sheenRoughnessTexture!==void 0&&r.push(this.parser.assignTexture(t,`sheenRoughnessMap`,n.sheenRoughnessTexture)),Promise.all(r)}},nn=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_TRANSMISSION}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return n.transmissionFactor!==void 0&&(t.transmission=n.transmissionFactor),n.transmissionTexture!==void 0&&r.push(this.parser.assignTexture(t,`transmissionMap`,n.transmissionTexture)),Promise.all(r)}},rn=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_VOLUME}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];t.thickness=n.thicknessFactor===void 0?0:n.thicknessFactor,n.thicknessTexture!==void 0&&r.push(this.parser.assignTexture(t,`thicknessMap`,n.thicknessTexture)),t.attenuationDistance=n.attenuationDistance||1/0;let i=n.attenuationColor||[1,1,1];return t.attenuationColor=new b.Color().setRGB(i[0],i[1],i[2],b.LinearSRGBColorSpace),Promise.all(r)}},an=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_IOR}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);return n===null?Promise.resolve():(t.ior=n.ior===void 0?1.5:n.ior,t.ior===0&&(t.ior=1e3),Promise.resolve())}},on=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_SPECULAR}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];t.specularIntensity=n.specularFactor===void 0?1:n.specularFactor,n.specularTexture!==void 0&&r.push(this.parser.assignTexture(t,`specularIntensityMap`,n.specularTexture));let i=n.specularColorFactor||[1,1,1];return t.specularColor=new b.Color().setRGB(i[0],i[1],i[2],b.LinearSRGBColorSpace),n.specularColorTexture!==void 0&&r.push(this.parser.assignTexture(t,`specularColorMap`,n.specularColorTexture,b.SRGBColorSpace)),Promise.all(r)}},sn=class{constructor(e){this.parser=e,this.name=Y.EXT_MATERIALS_BUMP}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return t.bumpScale=n.bumpFactor===void 0?1:n.bumpFactor,n.bumpTexture!==void 0&&r.push(this.parser.assignTexture(t,`bumpMap`,n.bumpTexture)),Promise.all(r)}},cn=class{constructor(e){this.parser=e,this.name=Y.KHR_MATERIALS_ANISOTROPY}getMaterialType(e){return K(this.parser,e,this.name)===null?null:b.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=K(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return n.anisotropyStrength!==void 0&&(t.anisotropy=n.anisotropyStrength),n.anisotropyRotation!==void 0&&(t.anisotropyRotation=n.anisotropyRotation),n.anisotropyTexture!==void 0&&r.push(this.parser.assignTexture(t,`anisotropyMap`,n.anisotropyTexture)),Promise.all(r)}},ln=class{constructor(e){this.parser=e,this.name=Y.KHR_TEXTURE_BASISU}loadTexture(e){let t=this.parser,n=t.json,r=n.textures[e];if(!r.extensions||!r.extensions[this.name])return null;let i=r.extensions[this.name],a=t.options.ktx2Loader;if(!a){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw Error(`THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures`);return null}return t.loadTextureImage(e,i.source,a)}},un=class{constructor(e){this.parser=e,this.name=Y.EXT_TEXTURE_WEBP}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let a=i.extensions[t],o=r.images[a.source],s=n.textureLoader;if(o.uri){let e=n.options.manager.getHandler(o.uri);e!==null&&(s=e)}return n.loadTextureImage(e,a.source,s)}},dn=class{constructor(e){this.parser=e,this.name=Y.EXT_TEXTURE_AVIF}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let a=i.extensions[t],o=r.images[a.source],s=n.textureLoader;if(o.uri){let e=n.options.manager.getHandler(o.uri);e!==null&&(s=e)}return n.loadTextureImage(e,a.source,s)}},fn=class{constructor(e,t){this.name=t,this.parser=e}loadBufferView(e){let t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){let e=n.extensions[this.name],r=this.parser.getDependency(`buffer`,e.buffer),i=this.parser.options.meshoptDecoder;if(!i||!i.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw Error(`THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files`);return null}return r.then(function(t){let n=e.byteOffset||0,r=e.byteLength||0,a=e.count,o=e.byteStride,s=new Uint8Array(t,n,r);return i.decodeGltfBufferAsync?i.decodeGltfBufferAsync(a,o,s,e.mode,e.filter).then(function(e){return e.buffer}):i.ready.then(function(){let t=new ArrayBuffer(a*o);return i.decodeGltfBuffer(new Uint8Array(t),a,o,s,e.mode,e.filter),t})})}else return null}},pn=class{constructor(e){this.name=Y.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){let t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||n.mesh===void 0)return null;let r=t.meshes[n.mesh];for(let e of r.primitives)if(e.mode!==X.TRIANGLES&&e.mode!==X.TRIANGLE_STRIP&&e.mode!==X.TRIANGLE_FAN&&e.mode!==void 0)return null;let i=n.extensions[this.name].attributes,a=[],o={};for(let e in i)a.push(this.parser.getDependency(`accessor`,i[e]).then(t=>(o[e]=t,o[e])));return a.length<1?null:(a.push(this.parser.createNodeMesh(e)),Promise.all(a).then(e=>{let t=e.pop(),n=t.isGroup?t.children:[t],r=e[0].count,i=[];for(let e of n){let t=new b.Matrix4,n=new b.Vector3,a=new b.Quaternion,s=new b.Vector3(1,1,1),c=new b.InstancedMesh(e.geometry,e.material,r);for(let e=0;e<r;e++)o.TRANSLATION&&n.fromBufferAttribute(o.TRANSLATION,e),o.ROTATION&&a.fromBufferAttribute(o.ROTATION,e),o.SCALE&&s.fromBufferAttribute(o.SCALE,e),c.setMatrixAt(e,t.compose(n,a,s));for(let t in o)if(t===`_COLOR_0`){let e=o[t];c.instanceColor=new b.InstancedBufferAttribute(e.array,e.itemSize,e.normalized)}else t!==`TRANSLATION`&&t!==`ROTATION`&&t!==`SCALE`&&e.geometry.setAttribute(t,o[t]);b.Object3D.prototype.copy.call(c,e),this.parser.assignFinalMaterial(c),i.push(c)}return t.isGroup?(t.clear(),t.add(...i),t):i[0]}))}},mn=`glTF`,hn=12,gn={JSON:1313821514,BIN:5130562},_n=class{constructor(e){this.name=Y.KHR_BINARY_GLTF,this.content=null,this.body=null;let t=new DataView(e,0,hn),n=new TextDecoder;if(this.header={magic:n.decode(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==mn)throw Error(`THREE.GLTFLoader: Unsupported glTF-Binary header.`);if(this.header.version<2)throw Error(`THREE.GLTFLoader: Legacy binary file detected.`);let r=this.header.length-hn,i=new DataView(e,hn),a=0;for(;a<r;){let t=i.getUint32(a,!0);a+=4;let r=i.getUint32(a,!0);if(a+=4,r===gn.JSON){let r=new Uint8Array(e,hn+a,t);this.content=n.decode(r)}else if(r===gn.BIN){let n=hn+a;this.body=e.slice(n,n+t)}a+=t}if(this.content===null)throw Error(`THREE.GLTFLoader: JSON content not found.`)}},vn=class{constructor(e,t){if(!t)throw Error(`THREE.GLTFLoader: No DRACOLoader instance provided.`);this.name=Y.KHR_DRACO_MESH_COMPRESSION,this.json=e,this.dracoLoader=t,this.dracoLoader.preload()}decodePrimitive(e,t){let n=this.json,r=this.dracoLoader,i=e.extensions[this.name].bufferView,a=e.extensions[this.name].attributes,o={},s={},c={};for(let e in a){let t=Dn[e]||e.toLowerCase();o[t]=a[e]}for(let t in e.attributes){let r=Dn[t]||t.toLowerCase();if(a[t]!==void 0){let i=n.accessors[e.attributes[t]];c[r]=Z[i.componentType].name,s[r]=i.normalized===!0}}return t.getDependency(`bufferView`,i).then(function(e){return new Promise(function(t,n){r.decodeDracoFile(e,function(e){for(let t in e.attributes){let n=e.attributes[t],r=s[t];r!==void 0&&(n.normalized=r)}t(e)},o,c,b.LinearSRGBColorSpace,n)})})}},yn=class{constructor(){this.name=Y.KHR_TEXTURE_TRANSFORM}extendTexture(e,t){return(t.texCoord===void 0||t.texCoord===e.channel)&&t.offset===void 0&&t.rotation===void 0&&t.scale===void 0?e:(e=e.clone(),t.texCoord!==void 0&&(e.channel=t.texCoord),t.offset!==void 0&&e.offset.fromArray(t.offset),t.rotation!==void 0&&(e.rotation=t.rotation),t.scale!==void 0&&e.repeat.fromArray(t.scale),e.needsUpdate=!0,e)}},bn=class{constructor(){this.name=Y.KHR_MESH_QUANTIZATION}},xn=class extends b.Interpolant{constructor(e,t,n,r){super(e,t,n,r)}copySampleValue_(e){let t=this.resultBuffer,n=this.sampleValues,r=this.valueSize,i=e*r*3+r;for(let e=0;e!==r;e++)t[e]=n[i+e];return t}interpolate_(e,t,n,r){let i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=o*2,c=o*3,l=r-t,u=(n-t)/l,d=u*u,f=d*u,p=e*c,m=p-c,h=-2*f+3*d,g=f-d,_=1-h,v=g-d+u;for(let e=0;e!==o;e++){let t=a[m+e+o],n=a[m+e+s]*l,r=a[p+e+o],c=a[p+e]*l;i[e]=_*t+v*n+h*r+g*c}return i}},Sn=new b.Quaternion,Cn=class extends xn{interpolate_(e,t,n,r){let i=super.interpolate_(e,t,n,r);return Sn.fromArray(i).normalize().toArray(i),i}},X={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123},Z={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},wn={9728:b.NearestFilter,9729:b.LinearFilter,9984:b.NearestMipmapNearestFilter,9985:b.LinearMipmapNearestFilter,9986:b.NearestMipmapLinearFilter,9987:b.LinearMipmapLinearFilter},Tn={33071:b.ClampToEdgeWrapping,33648:b.MirroredRepeatWrapping,10497:b.RepeatWrapping},En={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},Dn={POSITION:`position`,NORMAL:`normal`,TANGENT:`tangent`,TEXCOORD_0:`uv`,TEXCOORD_1:`uv1`,TEXCOORD_2:`uv2`,TEXCOORD_3:`uv3`,COLOR_0:`color`,WEIGHTS_0:`skinWeight`,JOINTS_0:`skinIndex`},Q={scale:`scale`,translation:`position`,rotation:`quaternion`,weights:`morphTargetInfluences`},On={CUBICSPLINE:void 0,LINEAR:b.InterpolateLinear,STEP:b.InterpolateDiscrete},kn={OPAQUE:`OPAQUE`,MASK:`MASK`,BLEND:`BLEND`},An=new b.Matrix4,jn=class{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new Rt,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,r=-1,i=!1,a=-1;if(typeof navigator<`u`&&navigator.userAgent!==void 0){let e=navigator.userAgent;n=/^((?!chrome|android).)*safari/i.test(e)===!0;let t=e.match(/Version\/(\d+)/);r=n&&t?parseInt(t[1],10):-1,i=e.indexOf(`Firefox`)>-1,a=i?e.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>`u`||n&&r<17||i&&a<98?this.textureLoader=new b.TextureLoader(this.options.manager):this.textureLoader=new b.ImageBitmapLoader(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new b.FileLoader(this.options.manager),this.fileLoader.setResponseType(`arraybuffer`),this.options.crossOrigin===`use-credentials`&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){let n=this,r=this.json,i=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(e){return e._markDefs&&e._markDefs()}),Promise.all(this._invokeAll(function(e){return e.beforeRoot&&e.beforeRoot()})).then(function(){return Promise.all([n.getDependencies(`scene`),n.getDependencies(`animation`),n.getDependencies(`camera`)])}).then(function(t){let a={scene:t[0][r.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:r.asset,parser:n,userData:{}};return q(i,a,r),J(a,r),Promise.all(n._invokeAll(function(e){return e.afterRoot&&e.afterRoot(a)})).then(function(){for(let e of a.scenes)e.updateMatrixWorld();e(a)})}).catch(t)}_markDefs(){let e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,r=t.length;n<r;n++){let r=t[n].joints;for(let t=0,n=r.length;t<n;t++)e[r[t]].isBone=!0}for(let t=0,r=e.length;t<r;t++){let r=e[t];r.mesh!==void 0&&(this._addNodeRef(this.meshCache,r.mesh),r.skin!==void 0&&(n[r.mesh].isSkinnedMesh=!0)),r.camera!==void 0&&this._addNodeRef(this.cameraCache,r.camera)}}_addNodeRef(e,t){t!==void 0&&(e.refs[t]===void 0&&(e.refs[t]=e.uses[t]=0),e.refs[t]++)}_getNodeRef(e,t,n){if(e.refs[t]<=1)return n;let r=n.clone(),i=(e,t)=>{let n=this.associations.get(e);n!=null&&this.associations.set(t,n);for(let[n,r]of e.children.entries())i(r,t.children[n])};return i(n,r),r.name+=`_instance_`+e.uses[t]++,r}_invokeOne(e){let t=Object.values(this.plugins);t.push(this);for(let n=0;n<t.length;n++){let r=e(t[n]);if(r)return r}return null}_invokeAll(e){let t=Object.values(this.plugins);t.unshift(this);let n=[];for(let r=0;r<t.length;r++){let i=e(t[r]);i&&n.push(i)}return n}getDependency(e,t){let n=e+`:`+t,r=this.cache.get(n);if(!r){switch(e){case`scene`:r=this.loadScene(t);break;case`node`:r=this._invokeOne(function(e){return e.loadNode&&e.loadNode(t)});break;case`mesh`:r=this._invokeOne(function(e){return e.loadMesh&&e.loadMesh(t)});break;case`accessor`:r=this.loadAccessor(t);break;case`bufferView`:r=this._invokeOne(function(e){return e.loadBufferView&&e.loadBufferView(t)});break;case`buffer`:r=this.loadBuffer(t);break;case`material`:r=this._invokeOne(function(e){return e.loadMaterial&&e.loadMaterial(t)});break;case`texture`:r=this._invokeOne(function(e){return e.loadTexture&&e.loadTexture(t)});break;case`skin`:r=this.loadSkin(t);break;case`animation`:r=this._invokeOne(function(e){return e.loadAnimation&&e.loadAnimation(t)});break;case`camera`:r=this.loadCamera(t);break;default:if(r=this._invokeOne(function(n){return n!=this&&n.getDependency&&n.getDependency(e,t)}),!r)throw Error(`Unknown type: `+e);break}this.cache.add(n,r)}return r}getDependencies(e){let t=this.cache.get(e);if(!t){let n=this,r=this.json[e+(e===`mesh`?`es`:`s`)]||[];t=Promise.all(r.map(function(t,r){return n.getDependency(e,r)})),this.cache.add(e,t)}return t}loadBuffer(e){let t=this.json.buffers[e],n=this.fileLoader;if(t.type&&t.type!==`arraybuffer`)throw Error(`THREE.GLTFLoader: `+t.type+` buffer type is not supported.`);if(t.uri===void 0&&e===0)return Promise.resolve(this.extensions[Y.KHR_BINARY_GLTF].body);let r=this.options;return new Promise(function(e,i){n.load(b.LoaderUtils.resolveURL(t.uri,r.path),e,void 0,function(){i(Error(`THREE.GLTFLoader: Failed to load buffer "`+t.uri+`".`))})})}loadBufferView(e){let t=this.json.bufferViews[e];return this.getDependency(`buffer`,t.buffer).then(function(e){let n=t.byteLength||0,r=t.byteOffset||0;return e.slice(r,r+n)})}loadAccessor(e){let t=this,n=this.json,r=this.json.accessors[e];if(r.bufferView===void 0&&r.sparse===void 0){let e=En[r.type],t=Z[r.componentType],n=r.normalized===!0,i=new t(r.count*e);return Promise.resolve(new b.BufferAttribute(i,e,n))}let i=[];return r.bufferView===void 0?i.push(null):i.push(this.getDependency(`bufferView`,r.bufferView)),r.sparse!==void 0&&(i.push(this.getDependency(`bufferView`,r.sparse.indices.bufferView)),i.push(this.getDependency(`bufferView`,r.sparse.values.bufferView))),Promise.all(i).then(function(e){let i=e[0],a=En[r.type],o=Z[r.componentType],s=o.BYTES_PER_ELEMENT,c=s*a,l=r.byteOffset||0,u=r.bufferView===void 0?void 0:n.bufferViews[r.bufferView].byteStride,d=r.normalized===!0,f,p;if(u&&u!==c){let e=Math.floor(l/u),n=`InterleavedBuffer:`+r.bufferView+`:`+r.componentType+`:`+e+`:`+r.count,c=t.cache.get(n);c||(f=new o(i,e*u,r.count*u/s),c=new b.InterleavedBuffer(f,u/s),t.cache.add(n,c)),p=new b.InterleavedBufferAttribute(c,a,l%u/s,d)}else f=i===null?new o(r.count*a):new o(i,l,r.count*a),p=new b.BufferAttribute(f,a,d);if(r.sparse!==void 0){let t=En.SCALAR,n=Z[r.sparse.indices.componentType],s=r.sparse.indices.byteOffset||0,c=r.sparse.values.byteOffset||0,l=new n(e[1],s,r.sparse.count*t),u=new o(e[2],c,r.sparse.count*a);i!==null&&(p=new b.BufferAttribute(p.array.slice(),p.itemSize,p.normalized)),p.normalized=!1;for(let e=0,t=l.length;e<t;e++){let t=l[e];if(p.setX(t,u[e*a]),a>=2&&p.setY(t,u[e*a+1]),a>=3&&p.setZ(t,u[e*a+2]),a>=4&&p.setW(t,u[e*a+3]),a>=5)throw Error(`THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.`)}p.normalized=d}return p})}loadTexture(e){let t=this.json,n=this.options,r=t.textures[e].source,i=t.images[r],a=this.textureLoader;if(i.uri){let e=n.manager.getHandler(i.uri);e!==null&&(a=e)}return this.loadTextureImage(e,r,a)}loadTextureImage(e,t,n){let r=this,i=this.json,a=i.textures[e],o=i.images[t],s=(o.uri||o.bufferView)+`:`+a.sampler;if(this.textureCache[s])return this.textureCache[s];let c=this.loadImageSource(t,n).then(function(t){t.flipY=!1,t.name=a.name||o.name||``,t.name===``&&typeof o.uri==`string`&&o.uri.startsWith(`data:image/`)===!1&&(t.name=o.uri);let n=(i.samplers||{})[a.sampler]||{};return t.magFilter=wn[n.magFilter]||b.LinearFilter,t.minFilter=wn[n.minFilter]||b.LinearMipmapLinearFilter,t.wrapS=Tn[n.wrapS]||b.RepeatWrapping,t.wrapT=Tn[n.wrapT]||b.RepeatWrapping,t.generateMipmaps=!t.isCompressedTexture&&t.minFilter!==b.NearestFilter&&t.minFilter!==b.LinearFilter,r.associations.set(t,{textures:e}),t}).catch(function(){return null});return this.textureCache[s]=c,c}loadImageSource(e,t){let n=this,r=this.json,i=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(e=>e.clone());let a=r.images[e],o=self.URL||self.webkitURL,s=a.uri||``,c=!1;if(a.bufferView!==void 0)s=n.getDependency(`bufferView`,a.bufferView).then(function(e){c=!0;let t=new Blob([e],{type:a.mimeType});return s=o.createObjectURL(t),s});else if(a.uri===void 0)throw Error(`THREE.GLTFLoader: Image `+e+` is missing URI and bufferView`);let l=Promise.resolve(s).then(function(e){return new Promise(function(n,r){let a=n;t.isImageBitmapLoader===!0&&(a=function(e){let t=new b.Texture(e);t.needsUpdate=!0,n(t)}),t.load(b.LoaderUtils.resolveURL(e,i.path),a,void 0,r)})}).then(function(e){return c===!0&&o.revokeObjectURL(s),J(e,a),e.userData.mimeType=a.mimeType||Gt(a.uri),e}).catch(function(e){throw console.error(`THREE.GLTFLoader: Couldn't load texture`,s),e});return this.sourceCache[e]=l,l}assignTexture(e,t,n,r){let i=this;return this.getDependency(`texture`,n.index).then(function(a){if(!a)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(a=a.clone(),a.channel=n.texCoord),i.extensions[Y.KHR_TEXTURE_TRANSFORM]){let e=n.extensions===void 0?void 0:n.extensions[Y.KHR_TEXTURE_TRANSFORM];if(e){let t=i.associations.get(a);a=i.extensions[Y.KHR_TEXTURE_TRANSFORM].extendTexture(a,e),i.associations.set(a,t)}}return r!==void 0&&(a.colorSpace=r),e[t]=a,a})}assignFinalMaterial(e){let t=e.geometry,n=e.material,r=t.attributes.tangent===void 0,i=t.attributes.color!==void 0,a=t.attributes.normal===void 0;if(e.isPoints){let e=`PointsMaterial:`+n.uuid,t=this.cache.get(e);t||(t=new b.PointsMaterial,b.Material.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,t.sizeAttenuation=!1,this.cache.add(e,t)),n=t}else if(e.isLine){let e=`LineBasicMaterial:`+n.uuid,t=this.cache.get(e);t||(t=new b.LineBasicMaterial,b.Material.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,this.cache.add(e,t)),n=t}if(r||i||a){let e=`ClonedMaterial:`+n.uuid+`:`;r&&(e+=`derivative-tangents:`),i&&(e+=`vertex-colors:`),a&&(e+=`flat-shading:`);let t=this.cache.get(e);t||(t=n.clone(),i&&(t.vertexColors=!0),a&&(t.flatShading=!0),r&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(n))),n=t}e.material=n}getMaterialType(){return b.MeshStandardMaterial}loadMaterial(e){let t=this,n=this.json,r=this.extensions,i=n.materials[e],a,o={},s=i.extensions||{},c=[];if(s[Y.KHR_MATERIALS_UNLIT]){let e=r[Y.KHR_MATERIALS_UNLIT];a=e.getMaterialType(),c.push(e.extendParams(o,i,t))}else{let n=i.pbrMetallicRoughness||{};if(o.color=new b.Color(1,1,1),o.opacity=1,Array.isArray(n.baseColorFactor)){let e=n.baseColorFactor;o.color.setRGB(e[0],e[1],e[2],b.LinearSRGBColorSpace),o.opacity=e[3]}n.baseColorTexture!==void 0&&c.push(t.assignTexture(o,`map`,n.baseColorTexture,b.SRGBColorSpace)),o.metalness=n.metallicFactor===void 0?1:n.metallicFactor,o.roughness=n.roughnessFactor===void 0?1:n.roughnessFactor,n.metallicRoughnessTexture!==void 0&&(c.push(t.assignTexture(o,`metalnessMap`,n.metallicRoughnessTexture)),c.push(t.assignTexture(o,`roughnessMap`,n.metallicRoughnessTexture))),a=this._invokeOne(function(t){return t.getMaterialType&&t.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,o)})))}i.doubleSided===!0&&(o.side=b.DoubleSide);let l=i.alphaMode||kn.OPAQUE;if(l===kn.BLEND?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,l===kn.MASK&&(o.alphaTest=i.alphaCutoff===void 0?.5:i.alphaCutoff)),i.normalTexture!==void 0&&a!==b.MeshBasicMaterial&&(c.push(t.assignTexture(o,`normalMap`,i.normalTexture)),o.normalScale=new b.Vector2(1,1),i.normalTexture.scale!==void 0)){let e=i.normalTexture.scale;o.normalScale.set(e,e)}if(i.occlusionTexture!==void 0&&a!==b.MeshBasicMaterial&&(c.push(t.assignTexture(o,`aoMap`,i.occlusionTexture)),i.occlusionTexture.strength!==void 0&&(o.aoMapIntensity=i.occlusionTexture.strength)),i.emissiveFactor!==void 0&&a!==b.MeshBasicMaterial){let e=i.emissiveFactor;o.emissive=new b.Color().setRGB(e[0],e[1],e[2],b.LinearSRGBColorSpace)}return i.emissiveTexture!==void 0&&a!==b.MeshBasicMaterial&&c.push(t.assignTexture(o,`emissiveMap`,i.emissiveTexture,b.SRGBColorSpace)),Promise.all(c).then(function(){let n=new a(o);return i.name&&(n.name=i.name),J(n,i),t.associations.set(n,{materials:e}),i.extensions&&q(r,n,i),n})}createUniqueName(e){let t=b.PropertyBinding.sanitizeNodeName(e||``);return t in this.nodeNamesUsed?t+`_`+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){let t=this,n=this.extensions,r=this.primitiveCache;function i(e){return n[Y.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(e,t).then(function(n){return qt(n,e,t)})}let a=[];for(let n=0,o=e.length;n<o;n++){let o=e[n],s=Ht(o),c=r[s];if(c)a.push(c.promise);else{let e;e=o.extensions&&o.extensions[Y.KHR_DRACO_MESH_COMPRESSION]?i(o):qt(new b.BufferGeometry,o,t),r[s]={primitive:o,promise:e},a.push(e)}}return Promise.all(a)}loadMesh(e){let t=this,n=this.json,r=this.extensions,i=n.meshes[e],a=i.primitives,o=[];for(let e=0,t=a.length;e<t;e++){let t=a[e].material===void 0?zt(this.cache):this.getDependency(`material`,a[e].material);o.push(t)}return o.push(t.loadGeometries(a)),Promise.all(o).then(function(n){let o=n.slice(0,n.length-1),s=n[n.length-1],c=[];for(let n=0,l=s.length;n<l;n++){let l=s[n],u=a[n],d,f=o[n];if(u.mode===X.TRIANGLES||u.mode===X.TRIANGLE_STRIP||u.mode===X.TRIANGLE_FAN||u.mode===void 0)d=i.isSkinnedMesh===!0?new b.SkinnedMesh(l,f):new b.Mesh(l,f),d.isSkinnedMesh===!0&&d.normalizeSkinWeights(),u.mode===X.TRIANGLE_STRIP?d.geometry=Mt(d.geometry,b.TriangleStripDrawMode):u.mode===X.TRIANGLE_FAN&&(d.geometry=Mt(d.geometry,b.TriangleFanDrawMode));else if(u.mode===X.LINES)d=new b.LineSegments(l,f);else if(u.mode===X.LINE_STRIP)d=new b.Line(l,f);else if(u.mode===X.LINE_LOOP)d=new b.LineLoop(l,f);else if(u.mode===X.POINTS)d=new b.Points(l,f);else throw Error(`THREE.GLTFLoader: Primitive mode unsupported: `+u.mode);Object.keys(d.geometry.morphAttributes).length>0&&Vt(d,i),d.name=t.createUniqueName(i.name||`mesh_`+e),J(d,i),u.extensions&&q(r,d,u),t.assignFinalMaterial(d),c.push(d)}for(let n=0,r=c.length;n<r;n++)t.associations.set(c[n],{meshes:e,primitives:n});if(c.length===1)return i.extensions&&q(r,c[0],i),c[0];let l=new b.Group;i.extensions&&q(r,l,i),t.associations.set(l,{meshes:e});for(let e=0,t=c.length;e<t;e++)l.add(c[e]);return l})}loadCamera(e){let t,n=this.json.cameras[e],r=n[n.type];if(!r){console.warn(`THREE.GLTFLoader: Missing camera parameters.`);return}return n.type===`perspective`?t=new b.PerspectiveCamera(b.MathUtils.radToDeg(r.yfov),r.aspectRatio||1,r.znear||1,r.zfar||2e6):n.type===`orthographic`&&(t=new b.OrthographicCamera(-r.xmag,r.xmag,r.ymag,-r.ymag,r.znear,r.zfar)),n.name&&(t.name=this.createUniqueName(n.name)),J(t,n),Promise.resolve(t)}loadSkin(e){let t=this.json.skins[e],n=[];for(let e=0,r=t.joints.length;e<r;e++)n.push(this._loadNodeShallow(t.joints[e]));return t.inverseBindMatrices===void 0?n.push(null):n.push(this.getDependency(`accessor`,t.inverseBindMatrices)),Promise.all(n).then(function(e){let n=e.pop(),r=e,i=[],a=[];for(let e=0,o=r.length;e<o;e++){let o=r[e];if(o){i.push(o);let t=new b.Matrix4;n!==null&&t.fromArray(n.array,e*16),a.push(t)}else console.warn(`THREE.GLTFLoader: Joint "%s" could not be found.`,t.joints[e])}return new b.Skeleton(i,a)})}loadAnimation(e){let t=this.json,n=this,r=t.animations[e],i=r.name?r.name:`animation_`+e,a=[],o=[],s=[],c=[],l=[];for(let e=0,t=r.channels.length;e<t;e++){let t=r.channels[e],n=r.samplers[t.sampler],i=t.target,u=i.node,d=r.parameters===void 0?n.input:r.parameters[n.input],f=r.parameters===void 0?n.output:r.parameters[n.output];i.node!==void 0&&(a.push(this.getDependency(`node`,u)),o.push(this.getDependency(`accessor`,d)),s.push(this.getDependency(`accessor`,f)),c.push(n),l.push(i))}return Promise.all([Promise.all(a),Promise.all(o),Promise.all(s),Promise.all(c),Promise.all(l)]).then(function(e){let t=e[0],a=e[1],o=e[2],s=e[3],c=e[4],l=[];for(let e=0,r=t.length;e<r;e++){let r=t[e],i=a[e],u=o[e],d=s[e],f=c[e];if(r===void 0)continue;r.updateMatrix&&r.updateMatrix();let p=n._createAnimationTracks(r,i,u,d,f);if(p)for(let e=0;e<p.length;e++)l.push(p[e])}let u=new b.AnimationClip(i,void 0,l);return J(u,r),u})}createNodeMesh(e){let t=this.json,n=this,r=t.nodes[e];return r.mesh===void 0?null:n.getDependency(`mesh`,r.mesh).then(function(e){let t=n._getNodeRef(n.meshCache,r.mesh,e);return r.weights!==void 0&&t.traverse(function(e){if(e.isMesh)for(let t=0,n=r.weights.length;t<n;t++)e.morphTargetInfluences[t]=r.weights[t]}),t})}loadNode(e){let t=this.json,n=this,r=t.nodes[e],i=n._loadNodeShallow(e),a=[],o=r.children||[];for(let e=0,t=o.length;e<t;e++)a.push(n.getDependency(`node`,o[e]));let s=r.skin===void 0?Promise.resolve(null):n.getDependency(`skin`,r.skin);return Promise.all([i,Promise.all(a),s]).then(function(e){let t=e[0],n=e[1],r=e[2];r!==null&&t.traverse(function(e){e.isSkinnedMesh&&e.bind(r,An)});for(let e=0,r=n.length;e<r;e++)t.add(n[e]);if(t.userData.pivot!==void 0&&n.length>0){let e=t.userData.pivot,r=n[0];t.pivot=new b.Vector3().fromArray(e),t.position.x-=e[0],t.position.y-=e[1],t.position.z-=e[2],r.position.set(0,0,0),delete t.userData.pivot}return t})}_loadNodeShallow(e){let t=this.json,n=this.extensions,r=this;if(this.nodeCache[e]!==void 0)return this.nodeCache[e];let i=t.nodes[e],a=i.name?r.createUniqueName(i.name):``,o=[],s=r._invokeOne(function(t){return t.createNodeMesh&&t.createNodeMesh(e)});return s&&o.push(s),i.camera!==void 0&&o.push(r.getDependency(`camera`,i.camera).then(function(e){return r._getNodeRef(r.cameraCache,i.camera,e)})),r._invokeAll(function(t){return t.createNodeAttachment&&t.createNodeAttachment(e)}).forEach(function(e){o.push(e)}),this.nodeCache[e]=Promise.all(o).then(function(t){let o;if(o=i.isBone===!0?new b.Bone:t.length>1?new b.Group:t.length===1?t[0]:new b.Object3D,o!==t[0])for(let e=0,n=t.length;e<n;e++)o.add(t[e]);if(i.name&&(o.userData.name=i.name,o.name=a),J(o,i),i.extensions&&q(n,o,i),i.matrix!==void 0){let e=new b.Matrix4;e.fromArray(i.matrix),o.applyMatrix4(e)}else i.translation!==void 0&&o.position.fromArray(i.translation),i.rotation!==void 0&&o.quaternion.fromArray(i.rotation),i.scale!==void 0&&o.scale.fromArray(i.scale);if(!r.associations.has(o))r.associations.set(o,{});else if(i.mesh!==void 0&&r.meshCache.refs[i.mesh]>1){let e=r.associations.get(o);r.associations.set(o,{...e})}return r.associations.get(o).nodes=e,o}),this.nodeCache[e]}loadScene(e){let t=this.extensions,n=this.json.scenes[e],r=this,i=new b.Group;n.name&&(i.name=r.createUniqueName(n.name)),J(i,n),n.extensions&&q(t,i,n);let a=n.nodes||[],o=[];for(let e=0,t=a.length;e<t;e++)o.push(r.getDependency(`node`,a[e]));return Promise.all(o).then(function(e){for(let t=0,n=e.length;t<n;t++){let n=e[t];n.parent===null?i.add(n):i.add(Pt(n))}return r.associations=(e=>{let t=new Map;for(let[e,n]of r.associations)(e instanceof b.Material||e instanceof b.Texture)&&t.set(e,n);return e.traverse(e=>{let n=r.associations.get(e);n!=null&&t.set(e,n)}),t})(i),i})}_createAnimationTracks(e,t,n,r,i){let a=[],o=e.name?e.name:e.uuid,s=[];function c(e){e.morphTargetInfluences&&s.push(e.name?e.name:e.uuid)}Q[i.path]===Q.weights?(c(e),e.isGroup&&e.children.forEach(c)):s.push(o);let l;switch(Q[i.path]){case Q.weights:l=b.NumberKeyframeTrack;break;case Q.rotation:l=b.QuaternionKeyframeTrack;break;case Q.translation:case Q.scale:l=b.VectorKeyframeTrack;break;default:switch(n.itemSize){case 1:l=b.NumberKeyframeTrack;break;default:l=b.VectorKeyframeTrack;break}break}let u=r.interpolation===void 0?b.InterpolateLinear:On[r.interpolation],d=this._getArrayFromAccessor(n);for(let e=0,n=s.length;e<n;e++){let n=new l(s[e]+`.`+Q[i.path],t.array,d,u);r.interpolation===`CUBICSPLINE`&&this._createCubicSplineTrackInterpolant(n),a.push(n)}return a}_getArrayFromAccessor(e){let t=e.array;if(e.normalized){let e=Wt(t.constructor),n=new Float32Array(t.length);for(let r=0,i=t.length;r<i;r++)n[r]=t[r]*e;t=n}return t}_createCubicSplineTrackInterpolant(e){e.createInterpolant=function(e){return new(this instanceof b.QuaternionKeyframeTrack?Cn:xn)(this.times,this.values,this.getValueSize()/3,e)},e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=!0}}}));Mn();var Nn=/^[og]\s*(.+)?/,Pn=/^mtllib /,Fn=/^usemtl /,In=/^usemap /,Ln=/\s+/,Rn=new b.Vector3,zn=new b.Vector3,Bn=new b.Vector3,Vn=new b.Vector3,$=new b.Vector3,Hn=new b.Color;function Un(){let e={objects:[],object:{},vertices:[],normals:[],colors:[],uvs:[],materials:{},materialLibraries:[],startObject:function(e,t){if(this.object&&this.object.fromDeclaration===!1){this.object.name=e,this.object.fromDeclaration=t!==!1;return}let n=this.object&&typeof this.object.currentMaterial==`function`?this.object.currentMaterial():void 0;if(this.object&&typeof this.object._finalize==`function`&&this.object._finalize(!0),this.object={name:e||``,fromDeclaration:t!==!1,geometry:{vertices:[],normals:[],colors:[],uvs:[],hasUVIndices:!1},materials:[],smooth:!0,startMaterial:function(e,t){let n=this._finalize(!1);n&&(n.inherited||n.groupCount<=0)&&this.materials.splice(n.index,1);let r={index:this.materials.length,name:e||``,mtllib:Array.isArray(t)&&t.length>0?t[t.length-1]:``,smooth:n===void 0?this.smooth:n.smooth,groupStart:n===void 0?0:n.groupEnd,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(e){let t={index:typeof e==`number`?e:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return t.clone=this.clone.bind(t),t}};return this.materials.push(r),r},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(e){let t=this.currentMaterial();if(t&&t.groupEnd===-1&&(t.groupEnd=this.geometry.vertices.length/3,t.groupCount=t.groupEnd-t.groupStart,t.inherited=!1),e&&this.materials.length>1)for(let e=this.materials.length-1;e>=0;e--)this.materials[e].groupCount<=0&&this.materials.splice(e,1);return e&&this.materials.length===0&&this.materials.push({name:``,smooth:this.smooth}),t}},n&&n.name&&typeof n.clone==`function`){let e=n.clone(0);e.inherited=!0,this.object.materials.push(e)}this.objects.push(this.object)},finalize:function(){this.object&&typeof this.object._finalize==`function`&&this.object._finalize(!0)},parseVertexIndex:function(e,t){let n=parseInt(e,10);return(n>=0?n-1:n+t/3)*3},parseNormalIndex:function(e,t){let n=parseInt(e,10);return(n>=0?n-1:n+t/3)*3},parseUVIndex:function(e,t){let n=parseInt(e,10);return(n>=0?n-1:n+t/2)*2},addVertex:function(e,t,n){let r=this.vertices,i=this.object.geometry.vertices;i.push(r[e+0],r[e+1],r[e+2]),i.push(r[t+0],r[t+1],r[t+2]),i.push(r[n+0],r[n+1],r[n+2])},addVertexPoint:function(e){let t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addVertexLine:function(e){let t=this.vertices;this.object.geometry.vertices.push(t[e+0],t[e+1],t[e+2])},addNormal:function(e,t,n){let r=this.normals,i=this.object.geometry.normals;i.push(r[e+0],r[e+1],r[e+2]),i.push(r[t+0],r[t+1],r[t+2]),i.push(r[n+0],r[n+1],r[n+2])},addFaceNormal:function(e,t,n){let r=this.vertices,i=this.object.geometry.normals;Rn.fromArray(r,e),zn.fromArray(r,t),Bn.fromArray(r,n),$.subVectors(Bn,zn),Vn.subVectors(Rn,zn),$.cross(Vn),$.normalize(),i.push($.x,$.y,$.z),i.push($.x,$.y,$.z),i.push($.x,$.y,$.z)},addColor:function(e,t,n){let r=this.colors,i=this.object.geometry.colors;r[e]!==void 0&&i.push(r[e+0],r[e+1],r[e+2]),r[t]!==void 0&&i.push(r[t+0],r[t+1],r[t+2]),r[n]!==void 0&&i.push(r[n+0],r[n+1],r[n+2])},addUV:function(e,t,n){let r=this.uvs,i=this.object.geometry.uvs;i.push(r[e+0],r[e+1]),i.push(r[t+0],r[t+1]),i.push(r[n+0],r[n+1])},addDefaultUV:function(){let e=this.object.geometry.uvs;e.push(0,0),e.push(0,0),e.push(0,0)},addUVLine:function(e){let t=this.uvs;this.object.geometry.uvs.push(t[e+0],t[e+1])},addFace:function(e,t,n,r,i,a,o,s,c){let l=this.vertices.length,u=this.parseVertexIndex(e,l),d=this.parseVertexIndex(t,l),f=this.parseVertexIndex(n,l);if(this.addVertex(u,d,f),this.addColor(u,d,f),o!==void 0&&o!==``){let e=this.normals.length;u=this.parseNormalIndex(o,e),d=this.parseNormalIndex(s,e),f=this.parseNormalIndex(c,e),this.addNormal(u,d,f)}else this.addFaceNormal(u,d,f);if(r!==void 0&&r!==``){let e=this.uvs.length;u=this.parseUVIndex(r,e),d=this.parseUVIndex(i,e),f=this.parseUVIndex(a,e),this.addUV(u,d,f),this.object.geometry.hasUVIndices=!0}else this.addDefaultUV()},addPointGeometry:function(e){this.object.geometry.type=`Points`;let t=this.vertices.length;for(let n=0,r=e.length;n<r;n++){let r=this.parseVertexIndex(e[n],t);this.addVertexPoint(r),this.addColor(r)}},addLineGeometry:function(e,t){this.object.geometry.type=`Line`;let n=this.vertices.length,r=this.uvs.length;for(let t=0,r=e.length;t<r;t++)this.addVertexLine(this.parseVertexIndex(e[t],n));for(let e=0,n=t.length;e<n;e++)this.addUVLine(this.parseUVIndex(t[e],r))}};return e.startObject(``,!1),e}var Wn=class extends b.Loader{constructor(e){super(e),this.materials=null}load(e,t,n,r){let i=this,a=new b.FileLoader(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(n){try{t(i.parse(n))}catch(t){r?r(t):console.error(t),i.manager.itemError(e)}},n,r)}setMaterials(e){return this.materials=e,this}parse(e){let t=new Un;e.indexOf(`\r
3
+ `)!==-1&&(e=e.replace(/\r\n/g,`
4
+ `)),e.indexOf(`\\
5
+ `)!==-1&&(e=e.replace(/\\\n/g,``));let n=e.split(`
6
+ `),r=[];for(let e=0,i=n.length;e<i;e++){let i=n[e].trimStart();if(i.length===0)continue;let a=i.charAt(0);if(a!==`#`)if(a===`v`){let e=i.split(Ln);switch(e[0]){case`v`:t.vertices.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])),e.length>=7?(Hn.setRGB(parseFloat(e[4]),parseFloat(e[5]),parseFloat(e[6]),b.SRGBColorSpace),t.colors.push(Hn.r,Hn.g,Hn.b)):t.colors.push(void 0,void 0,void 0);break;case`vn`:t.normals.push(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]));break;case`vt`:t.uvs.push(parseFloat(e[1]),parseFloat(e[2]));break}}else if(a===`f`){let e=i.slice(1).trim().split(Ln),n=[];for(let t=0,r=e.length;t<r;t++){let r=e[t];if(r.length>0){let e=r.split(`/`);n.push(e)}}let r=n[0];for(let e=1,i=n.length-1;e<i;e++){let i=n[e],a=n[e+1];t.addFace(r[0],i[0],a[0],r[1],i[1],a[1],r[2],i[2],a[2])}}else if(a===`l`){let e=i.substring(1).trim().split(` `),n=[],r=[];if(i.indexOf(`/`)===-1)n=e;else for(let t=0,i=e.length;t<i;t++){let i=e[t].split(`/`);i[0]!==``&&n.push(i[0]),i[1]!==``&&r.push(i[1])}t.addLineGeometry(n,r)}else if(a===`p`){let e=i.slice(1).trim().split(` `);t.addPointGeometry(e)}else if((r=Nn.exec(i))!==null){let e=(` `+r[0].slice(1).trim()).slice(1);t.startObject(e)}else if(Fn.test(i))t.object.startMaterial(i.substring(7).trim(),t.materialLibraries);else if(Pn.test(i))t.materialLibraries.push(i.substring(7).trim());else if(In.test(i))console.warn(`THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.`);else if(a===`s`){if(r=i.split(` `),r.length>1){let e=r[1].trim().toLowerCase();t.object.smooth=e!==`0`&&e!==`off`}else t.object.smooth=!0;let e=t.object.currentMaterial();e&&(e.smooth=t.object.smooth)}else{if(i===`\0`)continue;console.warn(`THREE.OBJLoader: Unexpected line: "`+i+`"`)}}t.finalize();let i=new b.Group;if(i.materialLibraries=[].concat(t.materialLibraries),!(t.objects.length===1&&t.objects[0].geometry.vertices.length===0))for(let e=0,n=t.objects.length;e<n;e++){let n=t.objects[e],r=n.geometry,a=n.materials,o=r.type===`Line`,s=r.type===`Points`,c=!1;if(r.vertices.length===0)continue;let l=new b.BufferGeometry;l.setAttribute(`position`,new b.Float32BufferAttribute(r.vertices,3)),r.normals.length>0&&l.setAttribute(`normal`,new b.Float32BufferAttribute(r.normals,3)),r.colors.length>0&&(c=!0,l.setAttribute(`color`,new b.Float32BufferAttribute(r.colors,3))),r.hasUVIndices===!0&&l.setAttribute(`uv`,new b.Float32BufferAttribute(r.uvs,2));let u=[];for(let e=0,n=a.length;e<n;e++){let n=a[e],r=n.name+`_`+n.smooth+`_`+c,i=t.materials[r];if(this.materials!==null){if(i=this.materials.create(n.name),o&&i&&!(i instanceof b.LineBasicMaterial)){let e=new b.LineBasicMaterial;b.Material.prototype.copy.call(e,i),e.color.copy(i.color),i=e}else if(s&&i&&!(i instanceof b.PointsMaterial)){let e=new b.PointsMaterial({size:10,sizeAttenuation:!1});b.Material.prototype.copy.call(e,i),e.color.copy(i.color),e.map=i.map,i=e}}i===void 0&&(i=o?new b.LineBasicMaterial:s?new b.PointsMaterial({size:1,sizeAttenuation:!1}):new b.MeshPhongMaterial,i.name=n.name,i.flatShading=!n.smooth,i.vertexColors=c,t.materials[r]=i),u.push(i)}let d;if(u.length>1){for(let e=0,t=a.length;e<t;e++){let t=a[e];l.addGroup(t.groupStart,t.groupCount,e)}d=o?new b.LineSegments(l,u):s?new b.Points(l,u):new b.Mesh(l,u)}else d=o?new b.LineSegments(l,u[0]):s?new b.Points(l,u[0]):new b.Mesh(l,u[0]);d.name=n.name,i.add(d)}else if(t.vertices.length>0){let e=new b.PointsMaterial({size:1,sizeAttenuation:!1}),n=new b.BufferGeometry;n.setAttribute(`position`,new b.Float32BufferAttribute(t.vertices,3)),t.colors.length>0&&t.colors[0]!==void 0&&(n.setAttribute(`color`,new b.Float32BufferAttribute(t.colors,3)),e.vertexColors=!0);let r=new b.Points(n,e);i.add(r)}return i}},Gn=x({__name:`Viewport3D`,props:{meshes:{type:Array,default:()=>[]},selectedId:[String,Number,null],explodeFactor:{type:Number,default:0},expandLevel:{type:Number,default:0}},emits:[`select`,`double-click`,`position-change`],setup(t,{expose:n,emit:r}){let i=t,a=r,s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(null),u,d,f,p,m,h,g,_,v={},y={},b=null,x=new Set,S=()=>{let e=c.value,t=s.value;u=new o.Scene,u.background=new o.Color(15790320),d=new o.PerspectiveCamera(50,t.clientWidth/t.clientHeight,.1,1e3),d.position.set(5,5,8),f=new o.WebGLRenderer({canvas:e,antialias:!0}),f.setSize(t.clientWidth,t.clientHeight),f.setPixelRatio(window.devicePixelRatio),p=new jt,p.setSize(t.clientWidth,t.clientHeight),p.domElement.style.position=`absolute`,p.domElement.style.top=`0`,p.domElement.style.left=`0`,p.domElement.style.pointerEvents=`none`,t.appendChild(p.domElement),m=new Ve(d,f.domElement),m.enableDamping=!0,h=new it(d,f.domElement),h.addEventListener(`dragging-changed`,e=>{m.enabled=!e.value}),h.addEventListener(`objectChange`,te),g=new o.Raycaster,_=new o.Vector2;let n=new o.AmbientLight(16777215,.6);u.add(n);let r=new o.DirectionalLight(16777215,.8);r.position.set(5,10,7),u.add(r);let i=new o.GridHelper(20,20,13421772,14737632);u.add(i),C()},C=()=>{b=requestAnimationFrame(C),m.update(),f.render(u,d),p.render(u,d)},w=e=>{let t,n=e.scale||1;switch(e.shape){case`cube`:t=new o.BoxGeometry(n,n,n);break;case`sphere`:t=new o.SphereGeometry(n*.5,32,32);break;case`cylinder`:t=new o.CylinderGeometry(n*.4,n*.4,n,32);break;case`cone`:t=new o.ConeGeometry(n*.4,n,32);break;case`torus`:t=new o.TorusGeometry(n*.4,n*.15,16,48);break;case`tetrahedron`:t=new o.TetrahedronGeometry(n*.5);break;case`octahedron`:t=new o.OctahedronGeometry(n*.5);break;case`dodecahedron`:t=new o.DodecahedronGeometry(n*.5);break;case`icosahedron`:t=new o.IcosahedronGeometry(n*.5);break;case`torusKnot`:t=new o.TorusKnotGeometry(n*.3,n*.08,100,16);break;case`capsule`:t=new o.CapsuleGeometry(n*.25,n*.5,16,32);break;case`ring`:t=new o.RingGeometry(n*.2,n*.5,32);break;case`plane`:t=new o.PlaneGeometry(n,n);break;case`circle`:t=new o.CircleGeometry(n*.5,32);break;case`tube`:t=new o.TubeGeometry(new o.CatmullRomCurve3([new o.Vector3(-n*.4,0,0),new o.Vector3(-n*.2,n*.2,0),new o.Vector3(0,0,n*.2),new o.Vector3(n*.2,-n*.2,0),new o.Vector3(n*.4,0,0)]),64,n*.08,16,!1);break;case`lathe`:t=new o.LatheGeometry([new o.Vector2(0,-n*.5),new o.Vector2(n*.3,-n*.3),new o.Vector2(n*.4,0),new o.Vector2(n*.3,n*.3),new o.Vector2(0,n*.5)],32);break;case`pyramid`:{let e=new o.Shape;e.moveTo(0,n*.5),e.lineTo(-n*.5,-n*.5),e.lineTo(n*.5,-n*.5),e.closePath(),t=new o.ExtrudeGeometry(e,{depth:n*.5,bevelEnabled:!1}),t.center();break}case`star`:{let e=new o.Shape,r=n*.5,i=n*.2;for(let t=0;t<10;t++){let n=t%2==0?r:i,a=t*Math.PI/5-Math.PI/2;t===0?e.moveTo(Math.cos(a)*n,Math.sin(a)*n):e.lineTo(Math.cos(a)*n,Math.sin(a)*n)}e.closePath(),t=new o.ExtrudeGeometry(e,{depth:n*.2,bevelEnabled:!1}),t.center();break}case`arrow`:{let e=new o.Shape;e.moveTo(0,n*.5),e.lineTo(n*.3,n*.1),e.lineTo(n*.15,n*.1),e.lineTo(n*.15,-n*.5),e.lineTo(-n*.15,-n*.5),e.lineTo(-n*.15,n*.1),e.lineTo(-n*.3,n*.1),e.closePath(),t=new o.ExtrudeGeometry(e,{depth:n*.15,bevelEnabled:!1}),t.center();break}case`heart`:{let e=new o.Shape;e.moveTo(0,n*.3),e.bezierCurveTo(0,n*.5,-n*.5,n*.5,-n*.5,n*.1),e.bezierCurveTo(-n*.5,-n*.3,0,-n*.3,0,-n*.5),e.bezierCurveTo(0,-n*.3,n*.5,-n*.3,n*.5,n*.1),e.bezierCurveTo(n*.5,n*.5,0,n*.5,0,n*.3),t=new o.ExtrudeGeometry(e,{depth:n*.2,bevelEnabled:!1}),t.center();break}case`gear`:{let e=new o.Shape;n*.5;let r=n*.4,i=n*.08;for(let t=0;t<12;t++){let n=t/12*Math.PI*2,a=(t+.3)/12*Math.PI*2,o=(t+.5)/12*Math.PI*2,s=(t+.8)/12*Math.PI*2;t===0&&e.moveTo(Math.cos(n)*r,Math.sin(n)*r),e.lineTo(Math.cos(a)*r,Math.sin(a)*r),e.lineTo(Math.cos(a)*(r+i),Math.sin(a)*(r+i)),e.lineTo(Math.cos(o)*(r+i),Math.sin(o)*(r+i)),e.lineTo(Math.cos(s)*r,Math.sin(s)*r)}e.closePath();let a=new o.Path;a.absarc(0,0,n*.12,0,Math.PI*2,!0),e.holes.push(a),t=new o.ExtrudeGeometry(e,{depth:n*.15,bevelEnabled:!1}),t.center();break}case`bearing`:t=new o.TorusGeometry(n*.35,n*.08,16,48);break;case`bolt`:{let e=new o.Shape;for(let t=0;t<6;t++){let r=t/6*Math.PI*2-Math.PI/2,i=n*.18;t===0?e.moveTo(Math.cos(r)*i,Math.sin(r)*i):e.lineTo(Math.cos(r)*i,Math.sin(r)*i)}e.closePath(),t=new o.ExtrudeGeometry(e,{depth:n*.15,bevelEnabled:!1}),t.center();break}case`nut`:{let e=new o.Shape;for(let t=0;t<6;t++){let r=t/6*Math.PI*2-Math.PI/2,i=n*.22;t===0?e.moveTo(Math.cos(r)*i,Math.sin(r)*i):e.lineTo(Math.cos(r)*i,Math.sin(r)*i)}e.closePath();let r=new o.Path;r.absarc(0,0,n*.1,0,Math.PI*2,!0),e.holes.push(r),t=new o.ExtrudeGeometry(e,{depth:n*.12,bevelEnabled:!1}),t.center();break}case`spring`:{let e=[],r=n*.2,i=n*.8;for(let t=0;t<=192;t++){let n=t/192,a=n*6*Math.PI*2;e.push(new o.Vector3(Math.cos(a)*r,(n-.5)*i,Math.sin(a)*r))}let a=new o.CatmullRomCurve3(e);t=new o.TubeGeometry(a,200,n*.025,8,!1);break}case`shaft`:t=new o.CylinderGeometry(n*.12,n*.12,n*.9,32);break;case`flange`:{let e=new o.Shape;e.absarc(0,0,n*.45,0,Math.PI*2,!1);let r=new o.Path;r.absarc(0,0,n*.15,0,Math.PI*2,!0),e.holes.push(r),t=new o.ExtrudeGeometry(e,{depth:n*.1,bevelEnabled:!1}),t.center();break}case`coupling`:t=new o.CylinderGeometry(n*.25,n*.25,n*.4,32);break;case`lBracket`:{let e=new o.Shape;e.moveTo(-n*.3,-n*.3),e.lineTo(-n*.3,n*.3),e.lineTo(-n*.15,n*.3),e.lineTo(-n*.15,-n*.15),e.lineTo(n*.3,-n*.15),e.lineTo(n*.3,-n*.3),e.closePath(),t=new o.ExtrudeGeometry(e,{depth:n*.1,bevelEnabled:!1}),t.center();break}case`uChannel`:{let e=new o.Shape;e.moveTo(-n*.3,-n*.3),e.lineTo(-n*.3,n*.3),e.lineTo(-n*.15,n*.3),e.lineTo(-n*.15,-n*.15),e.lineTo(n*.15,-n*.15),e.lineTo(n*.15,n*.3),e.lineTo(n*.3,n*.3),e.lineTo(n*.3,-n*.3),e.closePath(),t=new o.ExtrudeGeometry(e,{depth:n*.1,bevelEnabled:!1}),t.center();break}case`boxHousing`:t=new o.BoxGeometry(n*.6,n*.4,n*.5);break;case`endCap`:t=new o.CylinderGeometry(n*.35,n*.35,n*.08,32);break;case`handle`:t=new o.CapsuleGeometry(n*.08,n*.4,16,32);break;case`button`:t=new o.CylinderGeometry(n*.15,n*.15,n*.05,32);break;case`knob`:t=new o.SphereGeometry(n*.2,32,32);break;case`displayFrame`:{let e=new o.Shape;e.moveTo(-n*.4,-n*.3),e.lineTo(-n*.4,n*.3),e.lineTo(n*.4,n*.3),e.lineTo(n*.4,-n*.3),e.closePath();let r=new o.Path;r.moveTo(-n*.32,-n*.22),r.lineTo(-n*.32,n*.22),r.lineTo(n*.32,n*.22),r.lineTo(n*.32,-n*.22),r.closePath(),e.holes.push(r),t=new o.ExtrudeGeometry(e,{depth:n*.08,bevelEnabled:!1}),t.center();break}default:t=new o.BoxGeometry(n,n,n)}let r=new o.MeshPhongMaterial({color:e.color||4235007,transparent:!0,opacity:.85}),i=new o.Mesh(t,r);return i.position.set(e.x||0,e.y||0,e.z||0),i.userData={id:e.id},i},T=e=>{let t=document.createElement(`div`);t.className=`part-label`,t.innerHTML=`<span class="part-name">${e.label||e.shape}</span>${e.notes?`<span class="part-notes">${e.notes}</span>`:``}`,t.addEventListener(`dblclick`,t=>{t.stopPropagation(),a(`double-click`,e.id)});let n=new Tt(t);return n.position.set(0,(e.scale||1)*.5+.3,0),n},E=e=>i.meshes.filter(t=>t.parentId===e),D=e=>{if(!e.parentId)return!0;let t=i.meshes.find(t=>t.id===e.parentId);return t?x.has(t.id)?D(t):!1:!0},O=()=>{Object.values(v).forEach(e=>{e.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>e.dispose()):e.material.dispose())}),u.remove(e)}),Object.values(y).forEach(e=>u.remove(e)),v={},y={},i.meshes.forEach(e=>{if(!D(e))return;let t=w(e);if(v[e.id]=t,u.add(t),e.notes||e.label){let n=T(e);t.add(n),y[e.id]=n}}),k()},k=()=>{if(!i.meshes.length)return;let e=i.meshes.filter(e=>!e.parentId);if(!e.length)return;let t=new o.Vector3;e.forEach(e=>t.add(new o.Vector3(e.x||0,e.y||0,e.z||0))),t.divideScalar(e.length),i.meshes.forEach(e=>{let n=v[e.id];if(!n)return;let r=e.x||0,a=e.y||0,s=e.z||0;if(e.parentId){let t=i.meshes.find(t=>t.id===e.parentId);if(t){let e=v[t.id],c=t.x||0,l=t.y||0,u=t.z||0,d=r-c,f=a-l,p=s-u,m=new o.Vector3(d,f,p);m.length()<.01&&m.set(Math.random()-.5,Math.random()-.5,Math.random()-.5),m.normalize();let h=e?e.position:new o.Vector3(c,l,u);n.position.set(h.x+d+m.x*i.explodeFactor*1.5,h.y+f+m.y*i.explodeFactor*1.5,h.z+p+m.z*i.explodeFactor*1.5)}else n.position.set(r,a,s)}else{let e=new o.Vector3(r-t.x,a-t.y,s-t.z);e.length()<.01&&e.set(Math.random()-.5,Math.random()-.5,Math.random()-.5),e.normalize(),n.position.set(r+e.x*i.explodeFactor,a+e.y*i.explodeFactor,s+e.z*i.explodeFactor)}e.id===i.selectedId?n.material.emissive=new o.Color(4491519):n.material.emissive=new o.Color(0)})},A=e=>{x.has(e)?x.delete(e):x.add(e),O()},j=e=>{let t=c.value.getBoundingClientRect();_.x=(e.clientX-t.left)/t.width*2-1,_.y=-((e.clientY-t.top)/t.height)*2+1,g.setFromCamera(_,d);let n=Object.values(v),r=g.intersectObjects(n);if(r.length>0){let e=r[0].object.userData.id;a(`select`,e);let t=v[e];t&&h.attach(t)}else h.detach()},ee=e=>{let t=c.value.getBoundingClientRect();_.x=(e.clientX-t.left)/t.width*2-1,_.y=-((e.clientY-t.top)/t.height)*2+1,g.setFromCamera(_,d);let n=Object.values(v),r=g.intersectObjects(n);if(r.length>0){let e=r[0].object.userData.id;i.meshes.find(t=>t.id===e)&&E(e).length>0&&A(e)}},te=()=>{if(!h.object)return;let e=h.object,t=e.userData.id;a(`position-change`,{id:t,x:Math.round(e.position.x*100)/100,y:Math.round(e.position.y*100)/100,z:Math.round(e.position.z*100)/100})},ne=()=>{let e=s.value;!e||!f||(d.aspect=e.clientWidth/e.clientHeight,d.updateProjectionMatrix(),f.setSize(e.clientWidth,e.clientHeight),p.setSize(e.clientWidth,e.clientHeight))};return n({resetCamera:()=>{d.position.set(5,5,8),m.target.set(0,0,0),m.update()},loadGLTF:e=>{new Jt().load(e,e=>{let t=e.scene;t.traverse(e=>{e.isMesh&&(e.material.color.set(4235007),e.material.transparent=!0,e.material.opacity=.85)}),u.add(t)})},loadOBJ:e=>{new Wn().load(e,e=>{e.traverse(e=>{e.isMesh&&(e.material.color.set(4235007),e.material.transparent=!0,e.material.opacity=.85)}),u.add(e)})},toggleExpand:A}),(0,e.watch)(()=>i.meshes,O,{deep:!0}),(0,e.watch)(()=>i.explodeFactor,k),(0,e.watch)(()=>i.selectedId,e=>{k(),e&&v[e]?h.attach(v[e]):h.detach()}),(0,e.watch)(()=>i.expandLevel,O),(0,e.onMounted)(()=>{S(),O(),c.value.addEventListener(`click`,j),c.value.addEventListener(`dblclick`,ee),window.addEventListener(`resize`,ne)}),(0,e.onUnmounted)(()=>{cancelAnimationFrame(b),c.value?.removeEventListener(`click`,j),c.value?.removeEventListener(`dblclick`,ee),window.removeEventListener(`resize`,ne),u?.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>e.dispose()):e.material.dispose())}),m?.dispose(),h?.dispose(),f?.dispose(),p?.domElement?.parentElement?.removeChild(p.domElement)}),(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{class:`viewport-container`,ref_key:`containerRef`,ref:s},[(0,e.createElementVNode)(`canvas`,{ref_key:`canvasRef`,ref:c},null,512),(0,e.createElementVNode)(`div`,{ref_key:`labelLayer`,ref:l,class:`label-layer`},null,512)],512))}},[[`__scopeId`,`data-v-1fe4a338`]]),Kn={class:`library-header`},qn={key:0},Jn={key:0,class:`library-body`},Yn={class:`library-top`},Xn={class:`category-tabs`},Zn={class:`model-list`},Qn=[`onDragstart`,`onClick`],$n={class:`model-info`},er={class:`model-name`},tr={class:`model-desc`},nr={class:`library-bottom`},rr=x({__name:`ModelLibrary`,props:{models:{type:Array,default:()=>[]}},emits:[`add-model`,`add-url`,`upload-file`],setup(t,{emit:n}){let a=t,o=n,s=(0,e.ref)(!1),c=(0,e.ref)(``),l=(0,e.ref)(`all`),u=(0,e.ref)(``),d=(0,e.computed)(()=>!a.models||!Array.isArray(a.models)?[]:a.models.filter(e=>{if(!e)return!1;let t=l.value===`all`||e.category===l.value,n=!c.value||e.name&&e.name.toLowerCase().includes(c.value.toLowerCase());return t&&n})),f=(e,t)=>{e.dataTransfer.setData(`model`,JSON.stringify(t))},p=()=>{if(!u.value)return;let e=u.value.trim();if(!e.match(/\.(gltf|glb|obj)$/i)){r.ElMessage.error(`仅支持 GLTF/GLB/OBJ 格式`);return}o(`add-url`,e),u.value=``,r.ElMessage.success(`开始加载模型...`)};return(t,n)=>{let r=(0,e.resolveComponent)(`el-icon`),a=(0,e.resolveComponent)(`el-button`),o=(0,e.resolveComponent)(`el-input`),m=(0,e.resolveComponent)(`el-tooltip`),h=(0,e.resolveComponent)(`el-divider`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,{class:(0,e.normalizeClass)([`model-library`,{collapsed:s.value}])},[(0,e.createElementVNode)(`div`,Kn,[s.value?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createElementBlock)(`span`,qn,`模型库`)),(0,e.createVNode)(a,{size:`small`,circle:``,onClick:n[0]||=e=>s.value=!s.value},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(s.value?`ArrowRight`:`ArrowLeft`)))]),_:1})]),_:1})]),s.value?(0,e.createCommentVNode)(``,!0):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,Jn,[(0,e.createElementVNode)(`div`,Yn,[(0,e.createVNode)(o,{modelValue:c.value,"onUpdate:modelValue":n[1]||=e=>c.value=e,placeholder:`搜索模型...`,size:`small`,clearable:``,class:`search-input`},{prefix:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Search))]),_:1})]),_:1},8,[`modelValue`]),(0,e.createElementVNode)(`div`,Xn,[(0,e.createVNode)(m,{content:`全部`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`button`,{class:(0,e.normalizeClass)([`tab-btn`,{active:l.value===`all`}]),onClick:n[2]||=e=>l.value=`all`},[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Grid))]),_:1})],2)]),_:1}),(0,e.createVNode)(m,{content:`基础几何体`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`button`,{class:(0,e.normalizeClass)([`tab-btn`,{active:l.value===`basic`}]),onClick:n[3]||=e=>l.value=`basic`},[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Box))]),_:1})],2)]),_:1}),(0,e.createVNode)(m,{content:`机械零件`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`button`,{class:(0,e.normalizeClass)([`tab-btn`,{active:l.value===`mechanical`}]),onClick:n[4]||=e=>l.value=`mechanical`},[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.SetUp))]),_:1})],2)]),_:1}),(0,e.createVNode)(m,{content:`支架外壳`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`button`,{class:(0,e.normalizeClass)([`tab-btn`,{active:l.value===`bracket`}]),onClick:n[5]||=e=>l.value=`bracket`},[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Coin))]),_:1})],2)]),_:1}),(0,e.createVNode)(m,{content:`产品部件`,placement:`top`},{default:(0,e.withCtx)(()=>[(0,e.createElementVNode)(`button`,{class:(0,e.normalizeClass)([`tab-btn`,{active:l.value===`product`}]),onClick:n[6]||=e=>l.value=`product`},[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.ShoppingBag))]),_:1})],2)]),_:1})])]),(0,e.createElementVNode)(`div`,Zn,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(d.value,n=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:n.id,class:`model-item`,draggable:`true`,onDragstart:e=>f(e,n),onClick:e=>t.$emit(`add-model`,n)},[(0,e.createElementVNode)(`div`,{class:`model-icon`,style:(0,e.normalizeStyle)({background:n.color})},(0,e.toDisplayString)(n.icon),5),(0,e.createElementVNode)(`div`,$n,[(0,e.createElementVNode)(`span`,er,(0,e.toDisplayString)(n.name),1),(0,e.createElementVNode)(`span`,tr,(0,e.toDisplayString)(n.desc),1)])],40,Qn))),128))]),(0,e.createElementVNode)(`div`,nr,[(0,e.createVNode)(h,{style:{margin:`8px 0`}}),n[10]||=(0,e.createElementVNode)(`div`,{class:`section-title`},`URL导入`,-1),(0,e.createVNode)(o,{modelValue:u.value,"onUpdate:modelValue":n[7]||=e=>u.value=e,placeholder:`粘贴GLTF/OBJ链接`,size:`small`,class:`url-input`},{append:(0,e.withCtx)(()=>[(0,e.createVNode)(a,{onClick:p,disabled:!u.value},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Download))]),_:1})]),_:1},8,[`disabled`])]),_:1},8,[`modelValue`]),(0,e.createVNode)(a,{size:`small`,class:`upload-btn`,onClick:n[8]||=e=>t.$emit(`upload-file`)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)((0,e.unref)(i.Upload))]),_:1}),n[9]||=(0,e.createTextVNode)(` 上传本地文件 `,-1)]),_:1})])]))],2)}}},[[`__scopeId`,`data-v-d4c40fe8`]]),ir={class:`explosion-panel`},ar={class:`panel-section`},or={key:0,class:`upload-placeholder`},sr={key:1,class:`preview-area`},cr=[`src`],lr={class:`mode-tabs`},ur={class:`api-config`},dr={key:0,class:`progress-bar`},fr={key:1,class:`error-text`},pr={class:`panel-section`},mr={class:`control-row`},hr={class:`control-row`},gr={class:`btn-row`},_r={class:`panel-section`},vr={class:`section-title`},yr={class:`parts-list`},br=[`onMouseenter`],xr={key:0,class:`empty-hint`},Sr=x({__name:`ModelExplosionPanel`,props:{parts:{type:Array,default:()=>[]},isExploded:{type:Boolean,default:!1},explosionFactor:{type:Number,default:0},isGenerating:{type:Boolean,default:!1},generationProgress:{type:Number,default:0},generationStatus:{type:String,default:``},genError:{type:String,default:``},providers:{type:Object,default:()=>({})},currentProvider:{type:String,default:`triposr_cloud`},apiKey:{type:String,default:``}},emits:[`generate`,`generate-both`,`explosion-change`,`style-change`,`explode`,`assemble`,`highlight`,`clear-highlight`,`toggle-visibility`,`rename`,`color-change`,`provider-change`,`api-key-change`,`file-selected`],setup(t,{emit:n}){let r=t,i=n,a=(0,e.ref)(null),o=(0,e.ref)(null),s=(0,e.ref)(r.currentProvider),c=(0,e.ref)(r.apiKey),l=(0,e.ref)(`radial`),u=(0,e.ref)(0),d=(0,e.ref)(`fast`),f=(0,e.computed)(()=>r.providers),p=(0,e.computed)(()=>Object.fromEntries(Object.entries(r.providers).filter(([,e])=>e.speed===`fast`))),m=(0,e.computed)(()=>Object.fromEntries(Object.entries(r.providers).filter(([,e])=>e.speed===`quality`))),h=(0,e.computed)(()=>{switch(d.value){case`fast`:return`快速生成3D模型`;case`quality`:return`高质量生成3D模型`;case`both`:return`同时生成(预览+高质量)`;default:return`生成3D模型`}}),g=()=>{a.value?.click()},_=e=>{let t=e.target.files[0];t&&y(t)},v=e=>{let t=e.dataTransfer.files[0];t&&t.type.startsWith(`image/`)&&y(t)},y=e=>{o.value=URL.createObjectURL(e),i(`file-selected`,e)},b=()=>{o.value=null,i(`file-selected`,null)},x=()=>{i(`provider-change`,s.value),i(`api-key-change`,c.value),d.value===`both`?i(`generate-both`):i(`generate`)};return(n,r)=>{let i=(0,e.resolveComponent)(`Upload`),y=(0,e.resolveComponent)(`el-icon`),S=(0,e.resolveComponent)(`Close`),C=(0,e.resolveComponent)(`el-button`),w=(0,e.resolveComponent)(`el-option`),T=(0,e.resolveComponent)(`el-option-group`),E=(0,e.resolveComponent)(`el-select`),D=(0,e.resolveComponent)(`el-input`),O=(0,e.resolveComponent)(`el-divider`),k=(0,e.resolveComponent)(`el-slider`),A=(0,e.resolveComponent)(`el-checkbox`),j=(0,e.resolveComponent)(`el-color-picker`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,ir,[r[24]||=(0,e.createElementVNode)(`div`,{class:`panel-header`},[(0,e.createElementVNode)(`h4`,null,`模型爆炸图`)],-1),(0,e.createElementVNode)(`div`,ar,[r[18]||=(0,e.createElementVNode)(`div`,{class:`section-title`},`图片生成3D`,-1),(0,e.createElementVNode)(`div`,{class:`upload-area`,onClick:g,onDragover:r[0]||=(0,e.withModifiers)(()=>{},[`prevent`]),onDrop:(0,e.withModifiers)(v,[`prevent`])},[(0,e.createElementVNode)(`input`,{ref_key:`fileInput`,ref:a,type:`file`,accept:`image/*`,style:{display:`none`},onChange:_},null,544),o.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,sr,[(0,e.createElementVNode)(`img`,{src:o.value,class:`preview-img`},null,8,cr),(0,e.createVNode)(C,{size:`small`,circle:``,class:`remove-btn`,onClick:(0,e.withModifiers)(b,[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(y,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(S)]),_:1})]),_:1})])):((0,e.openBlock)(),(0,e.createElementBlock)(`div`,or,[(0,e.createVNode)(y,{size:28},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(i)]),_:1}),r[13]||=(0,e.createElementVNode)(`span`,null,`点击或拖拽图片到此处`,-1),r[14]||=(0,e.createElementVNode)(`span`,{class:`upload-hint`},`支持 JPG/PNG,建议正方形产品图`,-1)]))],32),(0,e.createElementVNode)(`div`,lr,[(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`mode-tab`,{active:d.value===`fast`}]),onClick:r[1]||=e=>d.value=`fast`},[...r[15]||=[(0,e.createElementVNode)(`span`,{class:`mode-icon`},`⚡`,-1),(0,e.createElementVNode)(`span`,{class:`mode-text`},`快速模式`,-1),(0,e.createElementVNode)(`span`,{class:`mode-desc`},`TripoSR · <1秒`,-1)]],2),(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`mode-tab`,{active:d.value===`quality`}]),onClick:r[2]||=e=>d.value=`quality`},[...r[16]||=[(0,e.createElementVNode)(`span`,{class:`mode-icon`},`🎯`,-1),(0,e.createElementVNode)(`span`,{class:`mode-text`},`高质量模式`,-1),(0,e.createElementVNode)(`span`,{class:`mode-desc`},`InstantMesh · 纹理更好`,-1)]],2),(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`mode-tab`,{active:d.value===`both`}]),onClick:r[3]||=e=>d.value=`both`},[...r[17]||=[(0,e.createElementVNode)(`span`,{class:`mode-icon`},`🔄`,-1),(0,e.createElementVNode)(`span`,{class:`mode-text`},`同时生成`,-1),(0,e.createElementVNode)(`span`,{class:`mode-desc`},`先预览后替换`,-1)]],2)]),(0,e.createElementVNode)(`div`,ur,[(0,e.createVNode)(E,{modelValue:s.value,"onUpdate:modelValue":r[4]||=e=>s.value=e,size:`small`,style:{width:`100%`,"margin-bottom":`6px`}},{default:(0,e.withCtx)(()=>[d.value===`fast`?((0,e.openBlock)(),(0,e.createBlock)(T,{key:0,label:`快速模式`},{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(p.value,(t,n)=>((0,e.openBlock)(),(0,e.createBlock)(w,{key:n,value:n,label:t.name},null,8,[`value`,`label`]))),128))]),_:1})):d.value===`quality`?((0,e.openBlock)(),(0,e.createBlock)(T,{key:1,label:`高质量模式`},{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(m.value,(t,n)=>((0,e.openBlock)(),(0,e.createBlock)(w,{key:n,value:n,label:t.name},null,8,[`value`,`label`]))),128))]),_:1})):((0,e.openBlock)(),(0,e.createBlock)(T,{key:2,label:`全部提供商`},{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(f.value,(t,n)=>((0,e.openBlock)(),(0,e.createBlock)(w,{key:n,value:n,label:t.name},null,8,[`value`,`label`]))),128))]),_:1}))]),_:1},8,[`modelValue`]),(0,e.createVNode)(D,{modelValue:c.value,"onUpdate:modelValue":r[5]||=e=>c.value=e,size:`small`,placeholder:`API Key(本地模式可不填)`,type:`password`,"show-password":``},null,8,[`modelValue`])]),(0,e.createVNode)(C,{size:`small`,type:`primary`,loading:t.isGenerating,disabled:!o.value,style:{width:`100%`,"margin-top":`6px`},onClick:x},{default:(0,e.withCtx)(()=>[(0,e.createTextVNode)((0,e.toDisplayString)(t.isGenerating?t.generationStatus:h.value),1)]),_:1},8,[`loading`,`disabled`]),t.isGenerating?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,dr,[(0,e.createElementVNode)(`div`,{class:`progress-fill`,style:(0,e.normalizeStyle)({width:t.generationProgress+`%`})},null,4)])):(0,e.createCommentVNode)(``,!0),t.genError?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,fr,(0,e.toDisplayString)(t.genError),1)):(0,e.createCommentVNode)(``,!0)]),(0,e.createVNode)(O),(0,e.createElementVNode)(`div`,pr,[r[23]||=(0,e.createElementVNode)(`div`,{class:`section-title`},`爆炸控制`,-1),(0,e.createElementVNode)(`div`,mr,[r[19]||=(0,e.createElementVNode)(`label`,null,`样式`,-1),(0,e.createVNode)(E,{modelValue:l.value,"onUpdate:modelValue":r[6]||=e=>l.value=e,size:`small`,onChange:r[7]||=e=>n.$emit(`style-change`,e)},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(w,{value:`radial`,label:`径向爆炸`}),(0,e.createVNode)(w,{value:`vertical`,label:`垂直分层`}),(0,e.createVNode)(w,{value:`horizontal`,label:`水平展开`}),(0,e.createVNode)(w,{value:`layered`,label:`等距分层`})]),_:1},8,[`modelValue`])]),(0,e.createElementVNode)(`div`,hr,[r[20]||=(0,e.createElementVNode)(`label`,null,`爆炸程度`,-1),(0,e.createVNode)(k,{modelValue:u.value,"onUpdate:modelValue":r[8]||=e=>u.value=e,min:0,max:100,step:1,size:`small`,onInput:r[9]||=e=>n.$emit(`explosion-change`,e/100)},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,gr,[(0,e.createVNode)(C,{size:`small`,onClick:r[10]||=e=>n.$emit(`explode`)},{default:(0,e.withCtx)(()=>[...r[21]||=[(0,e.createTextVNode)(`展开`,-1)]]),_:1}),(0,e.createVNode)(C,{size:`small`,onClick:r[11]||=e=>n.$emit(`assemble`)},{default:(0,e.withCtx)(()=>[...r[22]||=[(0,e.createTextVNode)(`收拢`,-1)]]),_:1})])]),(0,e.createVNode)(O),(0,e.createElementVNode)(`div`,_r,[(0,e.createElementVNode)(`div`,vr,`零件列表 (`+(0,e.toDisplayString)(t.parts.length)+`)`,1),(0,e.createElementVNode)(`div`,yr,[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(t.parts,t=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:t.id,class:(0,e.normalizeClass)([`part-item`,{hidden:!t.visible}]),onMouseenter:e=>n.$emit(`highlight`,t.id),onMouseleave:r[12]||=e=>n.$emit(`clear-highlight`)},[(0,e.createVNode)(A,{"model-value":t.visible,onChange:e=>n.$emit(`toggle-visibility`,t.id)},null,8,[`model-value`,`onChange`]),(0,e.createElementVNode)(`div`,{class:`part-color`,style:(0,e.normalizeStyle)({background:`#`+t.color.getHexString()})},null,4),(0,e.createVNode)(D,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,size:`small`,class:`part-name`,onChange:e=>n.$emit(`rename`,t.id,t.name)},null,8,[`modelValue`,`onUpdate:modelValue`,`onChange`]),(0,e.createVNode)(j,{"model-value":`#`+t.color.getHexString(),size:`small`,onChange:e=>n.$emit(`color-change`,t.id,e)},null,8,[`model-value`,`onChange`])],42,br))),128)),t.parts.length===0?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,xr,` 请先上传3D模型或图片生成模型 `)):(0,e.createCommentVNode)(``,!0)])])])}}},[[`__scopeId`,`data-v-4261bfa5`]]);function Cr(t,{roomPrefix:n,syncKey:r=`_data`}={}){let i=new s.Doc,a=(0,e.ref)(!1),o=(0,e.ref)(!1),l=(0,e.ref)(!1),u=(0,e.ref)(!1),d=(0,e.ref)([]),f=null,p=null,m=null,h=null,g=!1,_=null,v=`ws://${window.location.hostname||`localhost`}:1234`,y=`${n}-${t}`,b=()=>{x(),_=setInterval(()=>{if(f&&f.connection&&f.connection.ws&&f.connection.ws.readyState===WebSocket.CLOSED)try{f.connect()}catch(e){console.warn(`[ExplosionCollab] reconnect failed:`,e)}},3e4)},x=()=>{_&&=(clearInterval(_),null)};f=new c.HocuspocusProvider({url:v,name:y,document:i,connect:!1,reconnect:!0,onConnect:()=>{a.value=!0,b()},onClose:()=>{a.value=!1,o.value=!1},onSynced:({state:e})=>{o.value=e}}),f.awareness.on(`change`,()=>{d.value=Array.from(f.awareness.getStates().entries()).filter(([e,t])=>t.user).map(([e,t])=>({clientId:e,...t.user}))}),p=i.getMap(n);let S=i.getMap(`_meta`);S.observe(e=>{e.keysChanged.has(`_closed`)&&(u.value=S.get(`_closed`)===!0,u.value&&console.log(`[ExplosionCollab] collaboration closed by owner`))});let C=()=>{f.connect()},w=()=>{if(x(),f){try{f.disconnect(),f.destroy()}catch(e){console.warn(`[ExplosionCollab] disconnect error:`,e)}f=null}a.value=!1,o.value=!1,d.value=[]},T=(e={})=>(g=!1,f.connect(),new Promise(t=>{let n=()=>{f&&o.value?(g=!0,e.userInfo&&f.awareness.setLocalStateField(`user`,e.userInfo),t()):setTimeout(n,100)};setTimeout(n,200)})),E=e=>{!a.value||!p||(m&&clearTimeout(m),m=setTimeout(()=>{let t=JSON.stringify(e);h=t,i.transact(()=>{p.set(r,t)})},50))},D=()=>{if(!p)return null;let e=p.get(r);if(!e)return null;h=e;try{return JSON.parse(e)}catch{return null}},O=e=>{f&&f.awareness.setLocalStateField(`user`,{id:e.id||`user-${Date.now()}`,name:e.name||`用户${Math.floor(Math.random()*1e3)}`,color:e.color||`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`,...e})},k=()=>{u.value=!0,i.transact(()=>{S.set(`_closed`,!0)}),g=!1,f?.awareness?.setLocalState(null),w(),l.value=!1},A=()=>S.get(`_closed`)===!0?(u.value=!0,!0):!1,j=()=>{w(),i.destroy()};return(0,e.onUnmounted)(()=>j()),{ydoc:i,provider:f,yMap:p,isConnected:a,isSynced:o,isCollabOwner:l,collaborationClosed:u,onlineUsers:d,connect:C,disconnect:w,init:T,pushToYjs:E,pullFromYjs:D,setLocalUser:O,closeCollaboration:k,checkCollaborationClosed:A,destroy:j,_getSyncReady:()=>g,_setSyncReady:e=>{g=e},_getLastSyncedValue:()=>h,_setLastSyncedValue:e=>{h=e}}}var wr=(e,{onRemoteChange:t}={})=>{let n=Cr(e,{roomPrefix:`explosion-3d`,syncKey:`_data`});t&&n.yMap.observe(e=>{if(!n._getSyncReady())return;let r=n.yMap.get(`_data`);if(r&&r!==n._getLastSyncedValue()){n._setLastSyncedValue(r);try{t(JSON.parse(r))}catch(e){console.error(`[EV-3D] remote data parse error:`,e)}}});let r=e=>{n.pushToYjs({title:e.title,meshes:e.meshes})},i=()=>n.pullFromYjs();return{...n,pushToYjs:r,pullFromYjs:i}},Tr=class{constructor(e){this.parent=Array.from({length:e},(e,t)=>t),this.rank=Array(e).fill(0)}find(e){return this.parent[e]!==e&&(this.parent[e]=this.find(this.parent[e])),this.parent[e]}union(e,t){let n=this.find(e),r=this.find(t);n!==r&&(this.rank[n]<this.rank[r]?this.parent[n]=r:this.rank[n]>this.rank[r]?this.parent[r]=n:(this.parent[r]=n,this.rank[n]++))}};function Er(e){let t=e.getAttribute(`position`),n=e.getIndex();if(!t||!n)return[0];let r=t.count,i=new Tr(r);for(let e=0;e<n.count;e+=3){let t=n.getX(e),r=n.getX(e+1),a=n.getX(e+2);i.union(t,r),i.union(r,a)}let a=new Map;for(let e=0;e<r;e++){let t=i.find(e);a.has(t)||a.set(t,[]),a.get(t).push(e)}return Array.from(a.values())}function Dr(e,t){let n=e.getAttribute(`position`),r=e.getAttribute(`normal`),i=e.getAttribute(`uv`),a=[],o=[],s=[],c=[],l=new Map,u=0,d=e.getIndex();for(let e=0;e<t.length;e++){let c=t[e];l.set(c,u),a.push(n.getX(c),n.getY(c),n.getZ(c)),r&&o.push(r.getX(c),r.getY(c),r.getZ(c)),i&&s.push(i.getX(c),i.getY(c)),u++}if(d)for(let e=0;e<d.count;e+=3){let n=d.getX(e),r=d.getX(e+1),i=d.getX(e+2);t.includes(n)&&t.includes(r)&&t.includes(i)&&c.push(l.get(n),l.get(r),l.get(i))}let f=new b.BufferGeometry;return f.setAttribute(`position`,new b.Float32BufferAttribute(a,3)),o.length&&f.setAttribute(`normal`,new b.Float32BufferAttribute(o,3)),s.length&&f.setAttribute(`uv`,new b.Float32BufferAttribute(s,2)),c.length&&f.setIndex(c),f.computeBoundingBox(),f.computeBoundingSphere(),f}function Or(e){let t=new b.Box3().setFromBufferAttribute(e.getAttribute(`position`)),n=new b.Vector3;return t.getCenter(n),n}function kr(e){return new b.Box3().setFromBufferAttribute(e.getAttribute(`position`))}function Ar(){let t=(0,e.reactive)([]),n=(0,e.ref)([]),r=(0,e.ref)(!1),i=(0,e.ref)(0),a=(0,e.ref)(new b.Vector3(0,0,0)),o=(0,e.ref)(`radial`),s=(0,e.ref)(new b.Vector3(0,0,0)),c=(0,e.ref)(1),l=e=>{t.length=0;let r=[];if(e.traverse(e=>{e.isMesh&&r.push(e)}),r.length===0)return;let i=0;if(r.forEach(e=>{let n=e.geometry.index?e.geometry:e.geometry.toNonIndexed();Er(n).forEach(r=>{if(r.length<3)return;let a=Dr(n,r),o=Or(a),s=kr(a),c=new b.Matrix4;e.updateWorldMatrix(!0,!1),c.copy(e.matrixWorld),o.applyMatrix4(c),t.push({id:`part_${i}`,name:`零件 ${i+1}`,geometry:a,originalCentroid:o.clone(),currentCentroid:o.clone(),originalPosition:e.position.clone(),bbox:s,color:e.material.color?e.material.color.clone():new b.Color(4235007),material:e.material.clone(),visible:!0,opacity:1,explodedOffset:new b.Vector3(0,0,0)}),i++})}),t.length>0){let e=new b.Box3;t.forEach(t=>e.expandByPoint(t.originalCentroid)),e.getCenter(s.value),c.value=e.getSize(new b.Vector3).length()/2,a.value.copy(s.value),n.value=t.map(e=>e.originalCentroid.clone())}},u=(e,n)=>{let r=a.value,i=c.value*1.5;t.forEach(a=>{let o=new b.Vector3().subVectors(a.originalCentroid,r);switch(o.length()<.001&&o.set(0,1,0),o.normalize(),e){case`radial`:a.explodedOffset.copy(o).multiplyScalar(i*n);break;case`vertical`:a.explodedOffset.set(0,o.y*i*n,0);break;case`horizontal`:a.explodedOffset.set(o.x*i*n,0,o.z*i*n);break;case`layered`:{let e=t.indexOf(a),r=t.length,o=i*2*n/Math.max(r-1,1);a.explodedOffset.set(0,(e-r/2)*o,0);break}default:a.explodedOffset.copy(o).multiplyScalar(i*n)}})},d=(e=1,t)=>{let n=t||o.value;i.value=e,u(n,e),r.value=e>0},f=()=>{i.value=0,t.forEach(e=>e.explodedOffset.set(0,0,0)),r.value=!1},p=()=>{r.value?f():d(1)},m=(e,n)=>{let r=t.find(t=>t.id===e);r&&(r.color.set(n),r.material.color.set(n))},h=(e,n)=>{let r=t.find(t=>t.id===e);r&&(r.name=n)},g=e=>{let n=t.find(t=>t.id===e);n&&(n.visible=!n.visible)},_=(e,n)=>{let r=t.find(t=>t.id===e);r&&(r.opacity=n,r.material.transparent=n<1,r.material.opacity=n)};return{parts:t,isExploded:r,explosionFactor:i,explosionCenter:a,explosionStyle:o,modelCenter:s,modelRadius:c,analyzeModel:l,explode:d,assemble:f,toggleExplosion:p,setPartColor:m,setPartLabel:h,togglePartVisibility:g,setPartOpacity:_,highlightPart:e=>{t.forEach(t=>{t.id===e?t.material.emissive=new b.Color(4473924):t.material.emissive=new b.Color(0)})},clearHighlight:()=>{t.forEach(e=>{e.material.emissive=new b.Color(0)})},createExplosionMesh:()=>{let e=new b.Group;return e.name=`explosion_model`,t.forEach(t=>{let n=new b.Mesh(t.geometry,t.material);n.name=t.id,n.position.copy(t.explodedOffset),n.userData={partId:t.id,partName:t.name},e.add(n)}),e},exportPartsConfig:()=>t.map(e=>({id:e.id,name:e.name,color:`#`+e.color.getHexString(),visible:e.visible,opacity:e.opacity,position:{x:e.originalCentroid.x,y:e.originalCentroid.y,z:e.originalCentroid.z}})),importPartsConfig:e=>{Array.isArray(e)&&e.forEach(e=>{let n=t.find(t=>t.id===e.id);n&&(e.name&&(n.name=e.name),e.color&&m(e.id,e.color),e.visible!==void 0&&(n.visible=e.visible),e.opacity!==void 0&&_(e.id,e.opacity))})}}}var jr={triposr_cloud:{name:`TripoSR (云端)`,description:`快速生成,A100上<0.5秒`,speed:`fast`,url:`https://api.tripo3d.ai/v2/openapi/task`,method:`POST`,headers:e=>({Authorization:`Bearer ${e}`,"Content-Type":`application/json`}),createBody:e=>({type:`image_to_model`,file:{type:`jpg`,url:e}}),parseResponse:e=>({taskId:e?.data?.task_id,status:e?.data?.status}),pollUrl:(e,t)=>({url:`https://api.tripo3d.ai/v2/openapi/task/${e}`,headers:{Authorization:`Bearer ${t}`}}),parseResult:e=>{let t=e?.data?.output;return t?.model?{modelUrl:t.model,thumbnail:t?.thumbnail||null}:null}},instantmesh_cloud:{name:`InstantMesh (云端)`,description:`高质量,纹理更好,约10-30秒`,speed:`quality`,url:`https://api.tripo3d.ai/v2/openapi/task`,method:`POST`,headers:e=>({Authorization:`Bearer ${e}`,"Content-Type":`application/json`}),createBody:e=>({type:`image_to_model`,file:{type:`jpg`,url:e},model_version:`instantmesh`}),parseResponse:e=>({taskId:e?.data?.task_id,status:e?.data?.status}),pollUrl:(e,t)=>({url:`https://api.tripo3d.ai/v2/openapi/task/${e}`,headers:{Authorization:`Bearer ${t}`}}),parseResult:e=>{let t=e?.data?.output;return t?.model?{modelUrl:t.model,thumbnail:t?.thumbnail||null}:null}},meshy:{name:`Meshy.ai`,description:`商业API,PBR纹理,效果稳定`,speed:`quality`,url:`https://api.meshy.ai/v2/image-to-3d`,method:`POST`,headers:e=>({Authorization:`Bearer ${e}`,"Content-Type":`application/json`}),createBody:e=>({image_url:e,enable_pbr:!0}),parseResponse:e=>({taskId:e?.result,status:e?.status}),pollUrl:(e,t)=>({url:`https://api.meshy.ai/v2/image-to-3d/${e}`,headers:{Authorization:`Bearer ${t}`}}),parseResult:e=>e?.status===`SUCCEEDED`?{modelUrl:e.model_urls?.glb,thumbnail:e.image_url}:null},triposr_local:{name:`TripoSR (本地)`,description:`自部署,免费,需GPU服务器`,speed:`fast`,url:`/api/triposr/generate`,method:`POST`,headers:()=>({"Content-Type":`application/json`}),createBody:e=>({image:e}),parseResponse:e=>({taskId:e?.task_id,status:e?.status}),pollUrl:(e,t,n)=>({url:`${n?.baseUrl||``}/api/triposr/status/${e}`,headers:{}}),parseResult:e=>e?.model_url?{modelUrl:e.model_url,thumbnail:e.thumbnail}:null},instantmesh_local:{name:`InstantMesh (本地)`,description:`自部署,免费,效果最好,需GPU`,speed:`quality`,url:`/api/instantmesh/generate`,method:`POST`,headers:()=>({"Content-Type":`application/json`}),createBody:e=>({image:e,texture_resolution:1024}),parseResponse:e=>({taskId:e?.task_id,status:e?.status}),pollUrl:(e,t,n)=>({url:`${n?.baseUrl||``}/api/instantmesh/status/${e}`,headers:{}}),parseResult:e=>e?.model_url?{modelUrl:e.model_url,thumbnail:e.thumbnail}:null}};function Mr(){let t=(0,e.ref)(!1),n=(0,e.ref)(0),r=(0,e.ref)(``),i=(0,e.ref)(null),a=(0,e.ref)(null),o=(0,e.ref)(null),s=(0,e.ref)(`triposr_cloud`),c=(0,e.ref)(``),l=(0,e.ref)({baseUrl:``}),u=null,d=e=>Object.entries(jr).filter(([,t])=>t.speed===e).reduce((e,[t,n])=>({...e,[t]:n}),{}),f=()=>d(`fast`),p=()=>d(`quality`),m=e=>{s.value=e},h=e=>{c.value=e},g=e=>{l.value=e},_=(e,t=512)=>new Promise(n=>{let r=new Image;r.onload=()=>{let e=document.createElement(`canvas`),i=r.width,a=r.height;if(i>t||a>t){let e=Math.min(t/i,t/a);i=Math.round(i*e),a=Math.round(a*e)}e.width=i,e.height=a,e.getContext(`2d`).drawImage(r,0,0,i,a),e.toBlob(e=>n(e),`image/jpeg`,.9)},r.src=URL.createObjectURL(e)}),v=async(e,a)=>{let l=a||s.value,u=jr[l];if(!u)return o.value=`不支持的API提供商`,!1;if(u.speed===`quality`&&!c.value&&!l.includes(`local`))return o.value=`高质量模式需要API Key`,!1;t.value=!0,n.value=0,r.value=`正在处理图片 (${u.name})...`,o.value=null,i.value=null;try{let t=await _(e),a=new FileReader,o=await new Promise(e=>{a.onload=()=>e(a.result),a.readAsDataURL(t)});n.value=20,r.value=`正在提交生成任务...`;let s=typeof u.headers==`function`?u.headers(c.value):u.headers,d=u.createBody(o),f=await fetch(u.url,{method:u.method,headers:s,body:JSON.stringify(d)});if(!f.ok){let e=await f.json().catch(()=>({}));throw Error(e.message||`API请求失败 (${f.status})`)}let p=await f.json(),m=u.parseResponse(p);if(!m.taskId)throw Error(`未获取到任务ID`);n.value=30,r.value=`${u.name} 生成中...`;let h=await y(m.taskId,l);return h?(i.value=h,n.value=100,r.value=`生成完成`,!0):!1}catch(e){return o.value=e.message||`生成失败`,r.value=`生成失败`,!1}finally{t.value=!1}},y=async(e,t)=>{let i=jr[t||s.value],o=i.speed===`quality`?200:120,u=i.speed===`quality`?3e3:2e3;for(let t=0;t<o;t++){await new Promise(e=>setTimeout(e,u));try{let s=i.pollUrl(e,c.value,l.value),u=await(await fetch(s.url,{headers:s.headers})).json(),d=i.parseResult(u);if(d)return n.value=90,r.value=`模型处理中...`,d.thumbnail&&(a.value=d.thumbnail),d.modelUrl;let f=u?.data?.status||u?.status;if(f===`failed`||f===`FAILED`)throw Error(`模型生成失败`);i.speed;let p=i.speed===`quality`?55:50;n.value=30+Math.min(p,t/o*p),r.value=`${i.name} 生成中... (${Math.round(n.value)}%)`}catch(e){if(t===o-1)throw e}}throw Error(`生成超时`)};return{isGenerating:t,generationProgress:n,generationStatus:r,generatedModelUrl:i,generatedThumbnail:a,error:o,provider:s,apiKey:c,customConfig:l,API_PROVIDERS:jr,fastProviders:f,qualityProviders:p,setProvider:m,setApiKey:h,setCustomConfig:g,generateFromImage:v,generateFromUrl:async(e,a)=>{let l=a||s.value,u=jr[l];if(!u)return o.value=`不支持的API提供商`,!1;t.value=!0,n.value=0,r.value=`正在从URL生成3D模型 (${u.name})...`,o.value=null;try{let t=typeof u.headers==`function`?u.headers(c.value):u.headers,a=u.createBody(e),o=await fetch(u.url,{method:u.method,headers:t,body:JSON.stringify(a)});if(!o.ok)throw Error(`API请求失败 (${o.status})`);let s=await o.json(),d=u.parseResponse(s);if(!d.taskId)throw Error(`未获取到任务ID`);n.value=30,r.value=`${u.name} 生成中...`;let f=await y(d.taskId,l);return f?(i.value=f,n.value=100,r.value=`生成完成`,!0):!1}catch(e){return o.value=e.message||`生成失败`,!1}finally{t.value=!1}},generateBoth:async e=>{t.value=!0,n.value=0,r.value=`正在同时生成快速预览和高质量模型...`,o.value=null,i.value=null;let a={url:null,error:null},s={url:null,error:null},l=async()=>{try{let t=await _(e),n=new FileReader,r=await new Promise(e=>{n.onload=()=>e(n.result),n.readAsDataURL(t)}),i=jr.triposr_cloud,o=typeof i.headers==`function`?i.headers(c.value):i.headers,s=i.createBody(r),l=await fetch(i.url,{method:i.method,headers:o,body:JSON.stringify(s)});if(!l.ok)throw Error(`TripoSR请求失败`);let u=await l.json(),d=i.parseResponse(u);if(!d.taskId)throw Error(`未获取到任务ID`);a.url=await y(d.taskId,`triposr_cloud`)}catch(e){a.error=e.message}},u=async()=>{try{let t=await _(e),n=new FileReader,r=await new Promise(e=>{n.onload=()=>e(n.result),n.readAsDataURL(t)}),i=jr.instantmesh_cloud,a=typeof i.headers==`function`?i.headers(c.value):i.headers,o=i.createBody(r),l=await fetch(i.url,{method:i.method,headers:a,body:JSON.stringify(o)});if(!l.ok)throw Error(`InstantMesh请求失败`);let u=await l.json(),d=i.parseResponse(u);if(!d.taskId)throw Error(`未获取到任务ID`);s.url=await y(d.taskId,`instantmesh_cloud`)}catch(e){s.error=e.message}};try{if(await Promise.allSettled([l(),u()]),a.url&&(i.value=a.url,n.value=50,r.value=a.error?`快速预览完成(高质量生成中...)`:`快速预览完成`),s.url&&(i.value=s.url,n.value=100,r.value=`高质量模型生成完成`),!a.url&&!s.url)throw Error(a.error||s.error||`生成失败`);return{fast:a.url,quality:s.url}}catch(e){return o.value=e.message,null}finally{t.value=!1}},clearResult:()=>{i.value=null,a.value=null,o.value=null,n.value=0,r.value=``},abort:()=>{u&&=(clearTimeout(u),null),t.value=!1,r.value=`已取消`}}}var Nr={class:`explosion-3d-editor`},Pr={class:`editor-body`},Fr={class:`side-panel`},Ir={class:`panel-section`},Lr=[`onClick`],Rr={class:`mesh-name`},zr={key:0,class:`panel-section`},Br={class:`prop-row`},Vr={class:`prop-row`},Hr={class:`prop-row`},Ur={class:`prop-row`},Wr={class:`prop-row`},Gr={class:`prop-row`},Kr={class:`prop-row`},qr={class:`prop-row`},Jr={class:`panel-section`},Yr={class:`prop-row`},Xr=`explosion-3d`,Zr=x({__name:`Explosion3dEditor`,setup(t){let i=(0,n.useRoute)(),o=(0,n.useRouter)(),s=(0,e.ref)(null),c=(0,e.ref)(null),l=(0,e.ref)(null),u=(0,e.ref)(null),d=(0,e.ref)(!1),f=(0,e.ref)(!1),{saveVersion:p}=ge(),m=me(),h=(0,e.reactive)({title:`3D爆炸图`,meshes:[]}),g=(0,e.ref)(!1),_=(0,e.ref)(!1),v=(0,e.ref)(!1),y=null,b=(0,e.ref)(null),x=(0,e.ref)(0),S=(0,e.ref)(`radial`),C=(0,e.ref)(new Set),w=0,{parts:T,isExploded:E,explosionFactor:D,explosionStyle:O,analyzeModel:k,explode:A,assemble:j,setPartColor:ee,setPartLabel:te,togglePartVisibility:ne,highlightPart:re,clearHighlight:ie,createExplosionMesh:ae,exportPartsConfig:oe}=Ar(),{isGenerating:se,generationProgress:ce,generationStatus:le,generatedModelUrl:ue,error:de,provider:fe,apiKey:he,API_PROVIDERS:M,setProvider:_e,setApiKey:ve,generateFromImage:ye,clearResult:be}=Mr(),N=(0,e.computed)(()=>h.meshes.find(e=>e.id===b.value)),xe=(0,e.computed)(()=>N.value?h.meshes.filter(e=>e.id!==b.value&&!Se(e.id,N.value.id)):[]),Se=(e,t)=>{let n=h.meshes.find(t=>t.id===e);return!n||!n.parentId?!1:n.parentId===t?!0:Se(n.parentId,t)},Ce=e=>h.meshes.filter(t=>t.parentId===e),we=null,Te=(0,e.ref)(!1),Ee=e=>{we=e},Oe=async()=>{we&&await ye(we)&&ue.value&&(r.ElMessage.success(`3D模型生成成功,正在加载...`),Ae(ue.value))},ke=async()=>{if(!we)return;let e=await generateBoth(we);e&&(e.fast&&(r.ElMessage.success(`快速预览模型已生成`),Ae(e.fast)),e.quality&&e.quality!==e.fast&&setTimeout(()=>{r.ElMessage.info(`高质量模型已生成,正在替换...`),Ae(e.quality)},1e3))},Ae=async e=>{try{let{GLTFLoader:t}=await Promise.resolve().then(()=>(Mn(),Lt));new t().load(e,e=>{let t=e.scene;k(t),T.forEach(e=>{let t={id:`auto_`+Date.now()+`_`+Math.random().toString(36).substr(2,4),label:e.name,shape:`imported`,color:`#`+e.color.getHexString(),scale:1,x:e.originalCentroid.x,y:e.originalCentroid.y,z:e.originalCentroid.z,notes:``,parentId:null,animSpeed:1};h.meshes.push(t)}),Te.value=!0,R(),r.ElMessage.success(`已识别 ${T.length} 个零件`)},void 0,e=>{r.ElMessage.error(`模型加载失败: `+e.message)})}catch(e){r.ElMessage.error(`加载模型失败: `+e.message)}},je=e=>{A(e)},Me=e=>{O.value=e},Ne=()=>{A(1)},Fe=()=>{j()},Ie=e=>{re(e)},Le=()=>{ie()},P={cube:{label:`立方体`,shape:`cube`,scale:1,color:`#409eff`},sphere:{label:`球体`,shape:`sphere`,scale:1,color:`#67c23a`},cylinder:{label:`圆柱`,shape:`cylinder`,scale:1,color:`#e6a23c`},cone:{label:`圆锥`,shape:`cone`,scale:1,color:`#f56c6c`},torus:{label:`圆环`,shape:`torus`,scale:1,color:`#909399`},capsule:{label:`胶囊体`,shape:`capsule`,scale:1,color:`#409eff`},ring:{label:`环形`,shape:`ring`,scale:1,color:`#67c23a`},plane:{label:`平面`,shape:`plane`,scale:1,color:`#e6a23c`},circle:{label:`圆形`,shape:`circle`,scale:1,color:`#f56c6c`},tetrahedron:{label:`四面体`,shape:`tetrahedron`,scale:1,color:`#909399`},octahedron:{label:`八面体`,shape:`octahedron`,scale:1,color:`#409eff`},dodecahedron:{label:`十二面体`,shape:`dodecahedron`,scale:1,color:`#67c23a`},icosahedron:{label:`二十面体`,shape:`icosahedron`,scale:1,color:`#e6a23c`},torusKnot:{label:`纽结`,shape:`torusKnot`,scale:1,color:`#f56c6c`},tube:{label:`管状体`,shape:`tube`,scale:1,color:`#909399`},lathe:{label:`旋转体`,shape:`lathe`,scale:1,color:`#409eff`},pyramid:{label:`棱锥`,shape:`pyramid`,scale:1,color:`#67c23a`},star:{label:`星形`,shape:`star`,scale:1,color:`#e6a23c`},arrow:{label:`箭头`,shape:`arrow`,scale:1,color:`#f56c6c`},heart:{label:`心形`,shape:`heart`,scale:1,color:`#f56c6c`}},Re=[{id:`cube`,name:`立方体`,desc:`基础几何体`,category:`basic`,icon:`▣`,color:`#409eff`,shape:`cube`,scale:1},{id:`sphere`,name:`球体`,desc:`基础几何体`,category:`basic`,icon:`●`,color:`#67c23a`,shape:`sphere`,scale:1},{id:`cylinder`,name:`圆柱`,desc:`基础几何体`,category:`basic`,icon:`⬢`,color:`#e6a23c`,shape:`cylinder`,scale:1},{id:`cone`,name:`圆锥`,desc:`基础几何体`,category:`basic`,icon:`▲`,color:`#f56c6c`,shape:`cone`,scale:1},{id:`torus`,name:`圆环`,desc:`基础几何体`,category:`basic`,icon:`◎`,color:`#909399`,shape:`torus`,scale:1},{id:`gear`,name:`齿轮`,desc:`12齿齿轮`,category:`mechanical`,icon:`⚙`,color:`#409eff`,shape:`gear`,scale:1},{id:`bearing`,name:`轴承`,desc:`滚珠轴承`,category:`mechanical`,icon:`◎`,color:`#67c23a`,shape:`bearing`,scale:1},{id:`bolt`,name:`螺栓`,desc:`六角螺栓头`,category:`mechanical`,icon:`⚡`,color:`#e6a23c`,shape:`bolt`,scale:1},{id:`nut`,name:`螺母`,desc:`六角螺母`,category:`mechanical`,icon:`⬡`,color:`#f56c6c`,shape:`nut`,scale:1},{id:`spring`,name:`弹簧`,desc:`螺旋弹簧`,category:`mechanical`,icon:`〰`,color:`#909399`,shape:`spring`,scale:1},{id:`shaft`,name:`轴`,desc:`传动轴`,category:`mechanical`,icon:`│`,color:`#409eff`,shape:`shaft`,scale:1},{id:`flange`,name:`法兰`,desc:`连接法兰盘`,category:`mechanical`,icon:`⊙`,color:`#67c23a`,shape:`flange`,scale:1},{id:`lBracket`,name:`L型支架`,desc:`直角支架`,category:`bracket`,icon:`⌐`,color:`#f56c6c`,shape:`lBracket`,scale:1},{id:`boxHousing`,name:`箱体`,desc:`外壳箱体`,category:`bracket`,icon:`▢`,color:`#409eff`,shape:`boxHousing`,scale:1},{id:`endCap`,name:`端盖`,desc:`封头端盖`,category:`bracket`,icon:`◯`,color:`#67c23a`,shape:`endCap`,scale:1}],ze=e=>{if(e===`upload`){l.value?.click();return}let t=P[e];if(!t)return;let n=h.meshes.length*(Math.PI*2/Math.max(h.meshes.length+1,4)),r=2+h.meshes.length*.5;h.meshes.push({id:`mesh-${++w}-${Date.now()}`,...t,notes:``,parentId:null,x:Math.cos(n)*r,y:.5,z:Math.sin(n)*r}),R()},F=e=>{let t=h.meshes.length*(Math.PI*2/Math.max(h.meshes.length+1,4)),n=2+h.meshes.length*.5;h.meshes.push({id:`mesh-${++w}-${Date.now()}`,label:e.name,shape:e.shape,scale:e.scale,color:e.color,notes:``,parentId:null,x:Math.cos(t)*n,y:.5,z:Math.sin(t)*n}),R()},I=e=>{c.value&&(e.endsWith(`.obj`)?c.value.loadOBJ(e):c.value.loadGLTF(e))},L=e=>{b.value=e},Be=({id:e,x:t,y:n,z:r})=>{let i=h.meshes.find(t=>t.id===e);i&&(i.x=t,i.y=n,i.z=r,R())},Ve=e=>{h.meshes.find(t=>t.id===e)&&Ce(e).length>0&&(c.value?.toggleExpand(e),C.value.has(e)?C.value.delete(e):C.value.add(e))},He=e=>{h.meshes.forEach(t=>{t.parentId===e&&(t.parentId=null)}),h.meshes=h.meshes.filter(t=>t.id!==e),b.value===e&&(b.value=null),R()},Ue=()=>{x.value=Math.min(5,x.value+1)},We=()=>{x.value=Math.max(0,x.value-1)},Ge=()=>o.push(`/`),Ke=[`我可以帮您优化3D爆炸图、检查模型结构,或者提供装配动画建议。请问有什么需要帮助的?`,`这个3D爆炸图的模型摆放很合理。建议调整爆炸距离,让各部件层次更加分明。`,`根据当前的3D模型结构,我建议为关键部件添加材质和颜色区分,提高视觉效果。`,`我可以帮您检查3D模型中是否有重叠或位置异常的部件。需要我逐个分析吗?`,`建议使用径向爆炸方式展示球形结构,使用轴向爆炸展示圆柱形结构。`,`3D爆炸图的交互体验不错。如果需要,我可以帮您优化相机角度和光照设置。`,`我可以帮您分析模型文件的格式兼容性,建议使用glTF格式获得更好的Web性能。`,`建议为3D爆炸图添加动画过渡效果,让装配过程的展示更加流畅自然。`],qe=async(e,t={})=>{let n=s.value?`${Xr}-${s.value}`:null;await m.sendMessage(e,{...t,roomId:n});let r=t.mentionedUser,i=r&&r.toLowerCase().includes(`ai`),a=m.collabUsers.value.filter(e=>e.name!==m.currentUser.value.name);(!r||i||a.length===0)&&(m.loading.value=!0,setTimeout(()=>{m.sendAiMessage(Ke[Math.floor(Math.random()*Ke.length)],n),m.loading.value=!1},800+Math.random()*1200))},Je=()=>{let e=s.value?`${Xr}-${s.value}`:null;m.clearMessages(e)},Ye=()=>{if(!s.value){r.ElMessage.warning(`请先保存文档`);return}f.value=!0},Xe=e=>{try{let t=typeof e==`string`?JSON.parse(e):e;t.title&&(h.title=t.title),t.explodeStyle&&(S.value=t.explodeStyle),t.meshes&&(h.meshes=t.meshes.map(e=>({notes:``,parentId:null,...e}))),b.value=null}catch(e){console.error(`Version apply error:`,e)}},R=()=>{g.value&&y&&y.pushToYjs(h)};(0,e.watch)(N,()=>{R()},{deep:!0});let Ze=()=>({version:`1.0`,title:h.title,explodeStyle:S.value,meshes:h.meshes.map(e=>({...e}))}),Qe=async()=>{if(g.value&&y?.collaborationClosed.value&&!v.value){r.ElMessage.warning(`协作已关闭,无法保存`);return}try{let e={title:h.title,view_type:`model3d`,config:JSON.stringify(Ze())};s.value?await a.default.put(`/api/explosion-views/${s.value}`,e):s.value=(await a.default.post(`/api/explosion-views/`,e)).data.id,r.ElMessage.success(`保存成功`),p({documentId:s.value,docType:`model3d`,content:JSON.stringify(Ze()),userId:String(m.currentUser.value?.id||``),userName:m.currentUser.value?.name||`未知`})}catch{r.ElMessage.error(`保存失败`)}},z=async()=>{if(i.params.id)try{let e=(await a.default.get(`/api/explosion-views/${i.params.id}`)).data;if(s.value=e.id,h.title=e.title,e.config){let t=JSON.parse(e.config);h.meshes=(t.meshes||[]).map(e=>({notes:``,parentId:null,...e})),S.value=t.explodeStyle||`radial`}}catch(e){console.error(e)}else{let e=P.cube;h.meshes.push({id:`mesh-${++w}`,...e,notes:``,parentId:null,x:0,y:.5,z:0}),h.meshes.push({id:`mesh-${++w}`,...P.sphere,notes:``,parentId:null,x:2,y:.5,z:0}),h.meshes.push({id:`mesh-${++w}`,...P.cylinder,notes:``,parentId:null,x:0,y:.5,z:2})}},B=e=>{if(e===`png`){let e=document.querySelector(`.viewport-container canvas`);e&&e.toBlob(e=>{let t=document.createElement(`a`);t.href=URL.createObjectURL(e),t.download=`${h.title||`3D爆炸图`}.png`,t.click()})}else e===`json`?V():e===`html`?et():r.ElMessage.info(`导出 ${e} 开发中`)},V=()=>{let e=Ze(),t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=document.createElement(`a`);n.href=URL.createObjectURL(t),n.download=`${h.title||`3D爆炸图`}.json`,n.click(),r.ElMessage.success(`JSON导出成功`)},H=()=>{u.value?.click()},$e=e=>{let t=e.target.files?.[0];if(!t)return;let n=new FileReader;n.onload=e=>{try{let t=JSON.parse(e.target.result);h.title=t.title||`3D爆炸图`,S.value=t.explodeStyle||`radial`,h.meshes=(t.meshes||[]).map(e=>({notes:``,parentId:null,...e})),b.value=null,R(),r.ElMessage.success(`JSON导入成功`)}catch{r.ElMessage.error(`JSON文件格式错误`)}},n.readAsText(t),e.target.value=``},et=()=>{let e=Ze(),t=JSON.stringify(e.meshes),n=`<!DOCTYPE html>
7
+ <html lang="zh-CN">
8
+ <head>
9
+ <meta charset="UTF-8">
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
+ <title>${e.title}</title>
12
+ <style>
13
+ * { margin: 0; padding: 0; box-sizing: border-box; }
14
+ body { background: #f0f0f0; font-family: -apple-system, BlinkMacSystemFont, sans-serif; overflow: hidden; }
15
+ #info { position: absolute; top: 16px; left: 16px; background: rgba(255,255,255,0.92); border-radius: 8px; padding: 12px 16px; box-shadow: 0 2px 12px rgba(0,0,0,0.1); z-index: 10; }
16
+ #info h2 { font-size: 16px; color: #333; margin-bottom: 4px; }
17
+ #info p { font-size: 12px; color: #999; }
18
+ .controls { position: absolute; bottom: 16px; left: 50%; transform: translateX(-50%); background: rgba(255,255,255,0.92); border-radius: 8px; padding: 8px 16px; box-shadow: 0 2px 12px rgba(0,0,0,0.1); display: flex; gap: 8px; z-index: 10; }
19
+ .controls button { padding: 6px 14px; border: 1px solid #dcdfe6; border-radius: 4px; background: white; cursor: pointer; font-size: 13px; }
20
+ .controls button:hover { border-color: #409eff; color: #409eff; }
21
+ .controls button.active { background: #409eff; color: white; border-color: #409eff; }
22
+ #slider { width: 120px; }
23
+ .part-label { background: rgba(255,255,255,0.92); border: 1px solid #d0d3d9; border-radius: 6px; padding: 4px 10px; text-align: center; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
24
+ .part-name { display: block; font-size: 12px; font-weight: 600; color: #333; }
25
+ .part-notes { display: block; font-size: 11px; color: #666; margin-top: 2px; }
26
+ </style>
27
+ </head>
28
+ <body>
29
+ <div id="info"><h2>${e.title}</h2><p>鼠标左键旋转 | 中键平移 | 右键缩放 | 双击零件展开/收起</p></div>
30
+ <div class="controls">
31
+ <button onclick="explodeAll()">展开</button>
32
+ <button onclick="collapseAll()">收起</button>
33
+ <input type="range" id="slider" min="0" max="5" step="0.1" value="0" oninput="setExplode(this.value)">
34
+ <button onclick="resetView()">重置视角</button>
35
+ </div>
36
+ <div id="app"></div>
37
+ <script type="importmap">
38
+ { "imports": { "three": "https://cdn.jsdelivr.net/npm/three@0.184.0/build/three.module.js", "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.184.0/examples/jsm/" } }
39
+ <\/script>
40
+ <script type="module">
41
+ import * as THREE from 'three';
42
+ import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
43
+ import { CSS2DRenderer, CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';
44
+ const meshes = ${t};
45
+ const container = document.getElementById('app');
46
+ container.style.cssText = 'width:100vw;height:100vh;';
47
+ const scene = new THREE.Scene();
48
+ scene.background = new THREE.Color(0xf0f0f0);
49
+ const camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000);
50
+ camera.position.set(5, 5, 8);
51
+ const renderer = new THREE.WebGLRenderer({ antialias: true });
52
+ renderer.setSize(window.innerWidth, window.innerHeight);
53
+ renderer.setPixelRatio(window.devicePixelRatio);
54
+ container.appendChild(renderer.domElement);
55
+ const labelRenderer = new CSS2DRenderer();
56
+ labelRenderer.setSize(window.innerWidth, window.innerHeight);
57
+ labelRenderer.domElement.style.position = 'absolute';
58
+ labelRenderer.domElement.style.top = '0';
59
+ container.appendChild(labelRenderer.domElement);
60
+ const controls = new OrbitControls(camera, renderer.domElement);
61
+ controls.enableDamping = true;
62
+ scene.add(new THREE.AmbientLight(0xffffff, 0.6));
63
+ const dir = new THREE.DirectionalLight(0xffffff, 0.8);
64
+ dir.position.set(5, 10, 7);
65
+ scene.add(dir);
66
+ scene.add(new THREE.GridHelper(20, 20, 0xcccccc, 0xe0e0e0));
67
+ const meshMap3D = {};
68
+ const labelObjects = {};
69
+ const expandedIds = new Set();
70
+ let explodeFactor = 0;
71
+ function createGeom(shape, scale) {
72
+ const s = scale || 1;
73
+ const geos = {
74
+ cube: () => new THREE.BoxGeometry(s, s, s),
75
+ sphere: () => new THREE.SphereGeometry(s * 0.5, 32, 32),
76
+ cylinder: () => new THREE.CylinderGeometry(s * 0.4, s * 0.4, s, 32),
77
+ cone: () => new THREE.ConeGeometry(s * 0.4, s, 32),
78
+ torus: () => new THREE.TorusGeometry(s * 0.4, s * 0.15, 16, 48),
79
+ tetrahedron: () => new THREE.TetrahedronGeometry(s * 0.5),
80
+ octahedron: () => new THREE.OctahedronGeometry(s * 0.5),
81
+ dodecahedron: () => new THREE.DodecahedronGeometry(s * 0.5),
82
+ icosahedron: () => new THREE.IcosahedronGeometry(s * 0.5),
83
+ gear: () => {
84
+ const shape = new THREE.Shape();
85
+ const teeth = 12, iR = s * 0.4, tH = s * 0.08;
86
+ for (let i = 0; i < teeth; i++) {
87
+ const a2 = ((i + 0.3) / teeth) * Math.PI * 2;
88
+ const a3 = ((i + 0.5) / teeth) * Math.PI * 2;
89
+ const a4 = ((i + 0.8) / teeth) * Math.PI * 2;
90
+ const a1 = (i / teeth) * Math.PI * 2;
91
+ if (i === 0) shape.moveTo(Math.cos(a1) * iR, Math.sin(a1) * iR);
92
+ shape.lineTo(Math.cos(a2) * iR, Math.sin(a2) * iR);
93
+ shape.lineTo(Math.cos(a2) * (iR + tH), Math.sin(a2) * (iR + tH));
94
+ shape.lineTo(Math.cos(a3) * (iR + tH), Math.sin(a3) * (iR + tH));
95
+ shape.lineTo(Math.cos(a4) * iR, Math.sin(a4) * iR);
96
+ }
97
+ shape.closePath();
98
+ return new THREE.ExtrudeGeometry(shape, { depth: s * 0.15, bevelEnabled: false });
99
+ },
100
+ };
101
+ return (geos[shape] || geos.cube)();
102
+ }
103
+ function buildScene() {
104
+ Object.values(meshMap3D).forEach(m => scene.remove(m));
105
+ Object.values(labelObjects).forEach(l => scene.remove(l));
106
+ meshes.forEach(comp => {
107
+ if (comp.parentId && !isExpanded(comp.parentId)) return;
108
+ const geom = createGeom(comp.shape, comp.scale);
109
+ const mat = new THREE.MeshPhongMaterial({ color: comp.color || 0x409eff, transparent: true, opacity: 0.85 });
110
+ const mesh = new THREE.Mesh(geom, mat);
111
+ mesh.position.set(comp.x || 0, comp.y || 0, comp.z || 0);
112
+ mesh.userData.id = comp.id;
113
+ meshMap3D[comp.id] = mesh;
114
+ scene.add(mesh);
115
+ if (comp.notes || comp.label) {
116
+ const div = document.createElement('div');
117
+ div.className = 'part-label';
118
+ div.innerHTML = '<span class="part-name">' + (comp.label || comp.shape) + '</span>' + (comp.notes ? '<span class="part-notes">' + comp.notes + '</span>' : '');
119
+ const label = new CSS2DObject(div);
120
+ label.position.set(0, (comp.scale || 1) * 0.5 + 0.3, 0);
121
+ mesh.add(label);
122
+ labelObjects[comp.id] = label;
123
+ }
124
+ });
125
+ applyExplode();
126
+ }
127
+ function isExpanded(id) { return expandedIds.has(id); }
128
+ function isChildVisible(comp) {
129
+ if (!comp.parentId) return true;
130
+ if (!isExpanded(comp.parentId)) return false;
131
+ const parent = meshes.find(m => m.id === comp.parentId);
132
+ if (!parent) return true;
133
+ return isChildVisible(parent);
134
+ }
135
+ function applyExplode() {
136
+ const topLevel = meshes.filter(m => !m.parentId);
137
+ if (!topLevel.length) return;
138
+ const center = new THREE.Vector3();
139
+ topLevel.forEach(c => center.add(new THREE.Vector3(c.x || 0, c.y || 0, c.z || 0)));
140
+ center.divideScalar(topLevel.length);
141
+ meshes.forEach(comp => {
142
+ const mesh = meshMap3D[comp.id];
143
+ if (!mesh) return;
144
+ const bx = comp.x || 0, by = comp.y || 0, bz = comp.z || 0;
145
+ if (!comp.parentId) {
146
+ const dir = new THREE.Vector3(bx - center.x, by - center.y, bz - center.z);
147
+ if (dir.length() < 0.01) dir.set(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);
148
+ dir.normalize();
149
+ mesh.position.set(bx + dir.x * explodeFactor, by + dir.y * explodeFactor, bz + dir.z * explodeFactor);
150
+ } else {
151
+ const parent = meshes.find(m => m.id === comp.parentId);
152
+ if (parent) {
153
+ const pm = meshMap3D[parent.id];
154
+ const pPos = pm ? pm.position : new THREE.Vector3(parent.x || 0, parent.y || 0, parent.z || 0);
155
+ const dx = bx - (parent.x || 0), dy = by - (parent.y || 0), dz = bz - (parent.z || 0);
156
+ const dir = new THREE.Vector3(dx, dy, dz);
157
+ if (dir.length() < 0.01) dir.set(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);
158
+ dir.normalize();
159
+ mesh.position.set(pPos.x + dx + dir.x * explodeFactor * 1.5, pPos.y + dy + dir.y * explodeFactor * 1.5, pPos.z + dz + dir.z * explodeFactor * 1.5);
160
+ }
161
+ }
162
+ });
163
+ }
164
+ function animate() { requestAnimationFrame(animate); controls.update(); renderer.render(scene, camera); labelRenderer.render(scene, camera); }
165
+ window.explodeAll = () => { explodeFactor = 5; document.getElementById('slider').value = 5; applyExplode(); };
166
+ window.collapseAll = () => { explodeFactor = 0; document.getElementById('slider').value = 0; expandedIds.clear(); buildScene(); applyExplode(); };
167
+ window.setExplode = (v) => { explodeFactor = parseFloat(v); applyExplode(); };
168
+ window.resetView = () => { camera.position.set(5, 5, 8); controls.target.set(0, 0, 0); controls.update(); };
169
+ const raycaster = new THREE.Raycaster();
170
+ const mouse = new THREE.Vector2();
171
+ renderer.domElement.addEventListener('dblclick', (e) => {
172
+ const rect = renderer.domElement.getBoundingClientRect();
173
+ mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;
174
+ mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;
175
+ raycaster.setFromCamera(mouse, camera);
176
+ const hits = raycaster.intersectObjects(Object.values(meshMap3D));
177
+ if (hits.length > 0) {
178
+ const id = hits[0].object.userData.id;
179
+ const comp = meshes.find(m => m.id === id);
180
+ const children = meshes.filter(m => m.parentId === id);
181
+ if (comp && children.length > 0) {
182
+ if (expandedIds.has(id)) expandedIds.delete(id); else expandedIds.add(id);
183
+ buildScene();
184
+ }
185
+ }
186
+ });
187
+ window.addEventListener('resize', () => {
188
+ camera.aspect = window.innerWidth / window.innerHeight;
189
+ camera.updateProjectionMatrix();
190
+ renderer.setSize(window.innerWidth, window.innerHeight);
191
+ labelRenderer.setSize(window.innerWidth, window.innerHeight);
192
+ });
193
+ buildScene();
194
+ animate();
195
+ <\/script>
196
+ </body>
197
+ </html>`,i=new Blob([n],{type:`text/html`}),a=document.createElement(`a`);a.href=URL.createObjectURL(i),a.download=`${h.title||`3D爆炸图`}.html`,a.click(),r.ElMessage.success(`HTML导出成功`)},tt=async e=>{let t=e.target.files?.[0];if(!t)return;let n=new FormData;n.append(`file`,t);try{let e=await a.default.post(`/api/files/upload/image`,n),i=e.data.url||e.data.file_path,o=t.name.split(`.`).pop().toLowerCase();o===`gltf`||o===`glb`?c.value?.loadGLTF(i):o===`obj`&&c.value?.loadOBJ(i),r.ElMessage.success(`模型加载成功`)}catch{r.ElMessage.error(`模型上传失败`)}},nt=e=>{y&&=(y.destroy(),null),y=wr(e,{onRemoteChange:e=>{e.title&&(h.title=e.title),e.meshes&&(h.meshes=(e.meshes||[]).map(e=>({notes:``,parentId:null,...e})))}}),y._setSyncReady(!1)},rt=async()=>{if(g.value)return;if(!s.value&&(await Qe(),!s.value)){r.ElMessage.error(`请先保存文档`);return}nt(String(s.value)),y.connect();let e={name:`用户${Math.floor(Math.random()*1e3)}`,color:`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`},t=()=>{if(y.provider&&y.provider.synced){y._setSyncReady(!0),y.setLocalUser(e);let t=y.pullFromYjs();t?(t.title&&(h.title=t.title),t.meshes&&(h.meshes=(t.meshes||[]).map(e=>({notes:``,parentId:null,...e})))):h.meshes.length>0&&y.pushToYjs(h),g.value=!0,v.value=!0,_.value=!1,m.setCollabContext({ydoc:y.ydoc,provider:y.provider,onlineUsers:y.onlineUsers}),m.setCurrentUser({id:y.provider.awareness.clientID,name:e.name,color:e.color}),r.ElMessage.success(`协作已开启`)}else setTimeout(t,100)};setTimeout(t,200)},it=()=>{y&&(y.closeCollaboration(),g.value=!1,v.value=!1,r.ElMessage.info(`协作已关闭`))},at=()=>{let e=i.params.id;if(!e)return;nt(e),y.connect();let t={name:`协作人${Math.floor(Math.random()*1e3)}`,color:`#${Math.floor(Math.random()*16777215).toString(16).padStart(6,`0`)}`},n=()=>{if(y.provider&&y.provider.synced){if(y.checkCollaborationClosed()){y.disconnect(),g.value=!1,r.ElMessage.warning(`该协作已关闭,无法加入`);return}y._setSyncReady(!0),y.setLocalUser(t);let e=y.pullFromYjs();e&&(e.title&&(h.title=e.title),e.meshes&&(h.meshes=(e.meshes||[]).map(e=>({notes:``,parentId:null,...e})))),g.value=!0,v.value=!1,m.setCollabContext({ydoc:y.ydoc,provider:y.provider,onlineUsers:y.onlineUsers}),m.setCurrentUser({id:y.provider.awareness.clientID,name:t.name,color:t.color}),r.ElMessage.success(`已加入协作`)}else setTimeout(n,100)};setTimeout(n,200)},ot=()=>{g.value?it():rt()},st=async()=>{if(g.value||await rt(),!s.value&&(await Qe(),!s.value)){r.ElMessage.warning(`请先保存文档后再分享`);return}let e=`${window.location.origin}/explosion-3d/${s.value}?collab=1`;try{await navigator.clipboard.writeText(e),r.ElMessage.success(`协作链接已复制到剪贴板`)}catch{r.ElMessage.info(`协作链接: `+e)}};return(0,e.onMounted)(async()=>{let e=localStorage.getItem(`editor-user-name`)||`用户${Math.floor(Math.random()*1e3)}`;localStorage.setItem(`editor-user-name`,e),m.setCurrentUser({id:Date.now(),name:e,color:`#409eff`}),await z(),i.params.id&&i.query.collab===`1`&&at()}),(0,e.onUnmounted)(()=>{y&&=(y.destroy(),null)}),(t,n)=>{let r=(0,e.resolveComponent)(`el-icon`),a=(0,e.resolveComponent)(`el-button`),o=(0,e.resolveComponent)(`Delete`),p=(0,e.resolveComponent)(`el-input`),_=(0,e.resolveComponent)(`el-option`),w=(0,e.resolveComponent)(`el-select`),O=(0,e.resolveComponent)(`el-color-picker`),k=(0,e.resolveComponent)(`el-slider`),A=(0,e.resolveComponent)(`el-divider`),j=(0,e.resolveComponent)(`Monitor`);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,Nr,[(0,e.createVNode)(Pe,{title:h.title,"onUpdate:title":n[0]||=e=>h.title=e,"is-connected":g.value,"online-users":(0,e.unref)(y)?(0,e.unref)(y).onlineUsers.value:[],"is-join-mode":(0,e.unref)(i).query.collab===`1`,onBack:Ge,onAddPrimitive:ze,onExplode:Ue,onCollapse:We,onExplodeStyle:n[1]||=e=>S.value=e,onResetCamera:n[2]||=e=>t.$refs.viewport?.resetCamera(),onExport:B,onSave:Qe,onImportJson:H,onToggleCollab:ot,onShareCollab:st,"show-history":!!s.value,onHistory:Ye},null,8,[`title`,`is-connected`,`online-users`,`is-join-mode`,`show-history`]),(0,e.createElementVNode)(`input`,{ref_key:`fileInputRef`,ref:l,type:`file`,accept:`.obj,.gltf,.glb`,style:{display:`none`},onChange:tt},null,544),(0,e.createElementVNode)(`input`,{ref_key:`jsonInputRef`,ref:u,type:`file`,accept:`.json`,style:{display:`none`},onChange:$e},null,544),(0,e.createElementVNode)(`div`,Pr,[(0,e.createVNode)(rr,{models:Re,onAddModel:F,onAddUrl:I,onUploadFile:n[3]||=e=>l.value?.click()}),(0,e.createVNode)(Gn,{ref_key:`viewport`,ref:c,meshes:h.meshes,"selected-id":b.value,"explode-factor":x.value,onSelect:L,onDoubleClick:Ve,onPositionChange:Be},null,8,[`meshes`,`selected-id`,`explode-factor`]),(0,e.createElementVNode)(`div`,Fr,[(0,e.createElementVNode)(`div`,Ir,[n[17]||=(0,e.createElementVNode)(`h4`,null,`零件列表`,-1),((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(h.meshes,n=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:n.id,class:(0,e.normalizeClass)([`mesh-item`,{selected:b.value===n.id,"is-child":n.parentId}]),onClick:e=>L(n.id)},[(0,e.createElementVNode)(`span`,{class:`mesh-color`,style:(0,e.normalizeStyle)({background:n.color})},null,4),(0,e.createElementVNode)(`span`,Rr,(0,e.toDisplayString)(n.label),1),Ce(n.id).length?((0,e.openBlock)(),(0,e.createBlock)(a,{key:0,size:`small`,circle:``,onClick:(0,e.withModifiers)(e=>t.$refs.viewport?.toggleExpand(n.id),[`stop`]),title:C.value.has(n.id)?`收起`:`展开`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[((0,e.openBlock)(),(0,e.createBlock)((0,e.resolveDynamicComponent)(C.value.has(n.id)?`FolderOpened`:`Folder`)))]),_:2},1024)]),_:2},1032,[`onClick`,`title`])):(0,e.createCommentVNode)(``,!0),(0,e.createVNode)(a,{size:`small`,circle:``,onClick:(0,e.withModifiers)(e=>He(n.id),[`stop`])},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(o)]),_:1})]),_:1},8,[`onClick`])],10,Lr))),128))]),N.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,zr,[n[26]||=(0,e.createElementVNode)(`h4`,null,`属性`,-1),(0,e.createElementVNode)(`div`,Br,[n[18]||=(0,e.createElementVNode)(`label`,null,`名称`,-1),(0,e.createVNode)(p,{modelValue:N.value.label,"onUpdate:modelValue":n[4]||=e=>N.value.label=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Vr,[n[19]||=(0,e.createElementVNode)(`label`,null,`备注`,-1),(0,e.createVNode)(p,{modelValue:N.value.notes,"onUpdate:modelValue":n[5]||=e=>N.value.notes=e,type:`textarea`,rows:2,size:`small`,placeholder:`输入零件备注信息`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Hr,[n[20]||=(0,e.createElementVNode)(`label`,null,`父零件`,-1),(0,e.createVNode)(w,{modelValue:N.value.parentId,"onUpdate:modelValue":n[6]||=e=>N.value.parentId=e,size:`small`,clearable:``,placeholder:`无(顶级零件)`,style:{width:`100%`}},{default:(0,e.withCtx)(()=>[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(xe.value,t=>((0,e.openBlock)(),(0,e.createBlock)(_,{key:t.id,label:t.label,value:t.id},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Ur,[n[21]||=(0,e.createElementVNode)(`label`,null,`颜色`,-1),(0,e.createVNode)(O,{modelValue:N.value.color,"onUpdate:modelValue":n[7]||=e=>N.value.color=e,size:`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Wr,[n[22]||=(0,e.createElementVNode)(`label`,null,`缩放`,-1),(0,e.createVNode)(k,{modelValue:N.value.scale,"onUpdate:modelValue":n[8]||=e=>N.value.scale=e,min:.2,max:5,step:.1,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Gr,[n[23]||=(0,e.createElementVNode)(`label`,null,`X`,-1),(0,e.createVNode)(k,{modelValue:N.value.x,"onUpdate:modelValue":n[9]||=e=>N.value.x=e,min:-10,max:10,step:.1,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,Kr,[n[24]||=(0,e.createElementVNode)(`label`,null,`Y`,-1),(0,e.createVNode)(k,{modelValue:N.value.y,"onUpdate:modelValue":n[10]||=e=>N.value.y=e,min:-10,max:10,step:.1,"show-input":``,"input-size":`small`},null,8,[`modelValue`])]),(0,e.createElementVNode)(`div`,qr,[n[25]||=(0,e.createElementVNode)(`label`,null,`Z`,-1),(0,e.createVNode)(k,{modelValue:N.value.z,"onUpdate:modelValue":n[11]||=e=>N.value.z=e,min:-10,max:10,step:.1,"show-input":``,"input-size":`small`},null,8,[`modelValue`])])])):(0,e.createCommentVNode)(``,!0),(0,e.createElementVNode)(`div`,Jr,[n[28]||=(0,e.createElementVNode)(`h4`,null,`展开控制`,-1),(0,e.createElementVNode)(`div`,Yr,[n[27]||=(0,e.createElementVNode)(`label`,null,`展开程度`,-1),(0,e.createVNode)(k,{modelValue:x.value,"onUpdate:modelValue":n[12]||=e=>x.value=e,min:0,max:5,step:.1},null,8,[`modelValue`])])]),(0,e.createVNode)(A),(0,e.createVNode)(Sr,{parts:(0,e.unref)(T),"is-exploded":(0,e.unref)(E),"explosion-factor":(0,e.unref)(D),"is-generating":(0,e.unref)(se),"generation-progress":(0,e.unref)(ce),"generation-status":(0,e.unref)(le),"gen-error":(0,e.unref)(de),providers:(0,e.unref)(M),"current-provider":(0,e.unref)(fe),"api-key":(0,e.unref)(he),onGenerate:Oe,onGenerateBoth:ke,onExplosionChange:je,onStyleChange:Me,onExplode:Ne,onAssemble:Fe,onHighlight:Ie,onClearHighlight:Le,onFileSelected:Ee,onProviderChange:(0,e.unref)(_e),onApiKeyChange:(0,e.unref)(ve)},null,8,[`parts`,`is-exploded`,`explosion-factor`,`is-generating`,`generation-progress`,`generation-status`,`gen-error`,`providers`,`current-provider`,`api-key`,`onProviderChange`,`onApiKeyChange`])])]),(0,e.createVNode)(a,{class:`ai-chat-fab`,type:d.value?`primary`:`default`,circle:``,size:`large`,onClick:n[13]||=e=>d.value=!d.value,title:`AI助手`},{default:(0,e.withCtx)(()=>[(0,e.createVNode)(r,null,{default:(0,e.withCtx)(()=>[(0,e.createVNode)(j)]),_:1})]),_:1},8,[`type`]),(0,e.createVNode)(pe,{visible:d.value,messages:(0,e.unref)(m).messages.value,loading:(0,e.unref)(m).loading.value,"is-collab":(0,e.unref)(m).isCollabMode.value,"collab-users":(0,e.unref)(m).collabUsers.value,"current-user":(0,e.unref)(m).currentUser.value,"is-owner":v.value,onSend:qe,onClose:n[14]||=e=>d.value=!1,"unread-mention":(0,e.unref)(m).unreadMention.value,onClearUnread:n[15]||=t=>(0,e.unref)(m).clearUnreadMention(),onClear:Je},null,8,[`visible`,`messages`,`loading`,`is-collab`,`collab-users`,`current-user`,`is-owner`,`unread-mention`]),(0,e.createVNode)(De,{modelValue:f.value,"onUpdate:modelValue":n[16]||=e=>f.value=e,"document-id":s.value,onApply:Xe},null,8,[`modelValue`,`document-id`])])}}},[[`__scopeId`,`data-v-2672f0ac`]]);return(0,e.defineComponent)({name:`YourCompanyExplosion3d`,props:{docId:{type:[Number,String],default:null},apiBase:{type:String,default:`/api`},wsUrl:{type:String,default:``},user:{type:Object,default:()=>({id:``,name:``,color:``})},roomId:{type:String,default:``}},setup(n,{slots:r}){return()=>(0,e.h)(`div`,{class:`yourcompany-explosion-3d-wrapper`,style:`position:relative`},[(0,e.h)(Zr,{...n}),(0,e.h)(t.BrandWatermark)])}})});