mirror of
https://github.com/basketikun/infinite-canvas.git
synced 2026-07-24 15:24:06 +08:00
2 lines
6.9 KiB
JavaScript
2 lines
6.9 KiB
JavaScript
function _(){let e=globalThis.InfiniteCanvasRuntime;if(!e)throw new Error("[plugin-sdk] Infinite Canvas \u8FD0\u884C\u65F6\u672A\u5C31\u7EEA:\u8BF7\u5728\u753B\u5E03\u5BBF\u4E3B\u4E2D\u52A0\u8F7D\u672C\u63D2\u4EF6");return e}function f(){return _().React}var A=((...e)=>f().useState(...e)),z=((...e)=>f().useEffect(...e));var F=((...e)=>f().useCallback(...e)),k=((...e)=>f().useRef(...e));var K=Symbol.for("infinite-canvas.jsx.fragment");function Q(e,o,r){let t=f(),c=e===K?t.Fragment:e,s=r===void 0?o:{...o??{},key:r};return t.createElement(c,s)}function u(e,o,r){return Q(e,o,r)}var P=u;var X;function Z(){return X||(X=import("https://esm.sh/three@0.180.0")),X}var H="A seamless 360-degree equirectangular panorama, 2:1 aspect ratio, full spherical VR photo, horizontally wrapping seamlessly at the left and right edges, no visible seam, no distortion artifacts, even horizon, no text, no watermark. Scene: ";function ee({src:e,ctx:o}){let r=k(null),[t,c]=A("loading");return z(()=>{let s=r.current;if(!s||!e)return;let d=!1,M=0,i=null,w=null,g=null,y=null,S=null,T=()=>{};return c("loading"),Z().then(l=>{if(d||!r.current)return;let J=new l.Scene,h=new l.PerspectiveCamera(70,1,1,1100),D=new l.Vector3;i=new l.WebGLRenderer({antialias:!0,powerPreference:"high-performance"}),i.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),i.setClearColor(0,1);let a=i.domElement;a.style.width="100%",a.style.height="100%",a.style.display="block",a.style.cursor="grab",s.appendChild(a);let B=Math.min(i.capabilities.maxTextureSize||4096,4096);w=new l.SphereGeometry(500,96,64),w.scale(-1,1,1),g=new l.MeshBasicMaterial({color:16777215}),J.add(new l.Mesh(w,g));let R=0,E=0,L=70,x=!1,N=0,G=0,O=0,U=0,W=n=>{x=!0,N=n.clientX,G=n.clientY,O=R,U=E,a.style.cursor="grabbing",a.setPointerCapture?.(n.pointerId)},j=n=>{x&&(R=O-(n.clientX-N)*.12,E=Math.max(-84,Math.min(84,U+(n.clientY-G)*.12)))},C=()=>{x=!1,a.style.cursor="grab"},Y=n=>{n.preventDefault(),L=Math.max(38,Math.min(86,L+n.deltaY*.035))};a.addEventListener("pointerdown",W),a.addEventListener("pointermove",j),a.addEventListener("pointerup",C),a.addEventListener("pointercancel",C),a.addEventListener("wheel",Y,{passive:!1}),T=()=>{a.removeEventListener("pointerdown",W),a.removeEventListener("pointermove",j),a.removeEventListener("pointerup",C),a.removeEventListener("pointercancel",C),a.removeEventListener("wheel",Y)};let V=()=>{if(!i||!r.current)return;let n=Math.max(1,r.current.clientWidth),m=Math.max(1,r.current.clientHeight);i.setSize(n,m,!1),h.aspect=n/m,h.updateProjectionMatrix()};S=new ResizeObserver(V),S.observe(s),V();let q=()=>{if(d||!i)return;x||(R+=.02),h.fov=L,h.updateProjectionMatrix();let n=l.MathUtils.degToRad(90-E),m=l.MathUtils.degToRad(R);D.set(500*Math.sin(n)*Math.cos(m),500*Math.cos(n),500*Math.sin(n)*Math.sin(m)),h.lookAt(D),i.render(J,h),M=requestAnimationFrame(q)};q();let p=new Image;p.crossOrigin="anonymous",p.onload=()=>{if(!(d||!g))try{let n=p.naturalWidth||p.width,m=p.naturalHeight||p.height,I=Math.min(1,B/n,B/m),b=p;if(I<1){let v=document.createElement("canvas");v.width=Math.max(1,Math.round(n*I)),v.height=Math.max(1,Math.round(m*I)),v.getContext("2d")?.drawImage(p,0,0,v.width,v.height),b=v}y=b instanceof HTMLCanvasElement?new l.CanvasTexture(b):new l.Texture(b),y.colorSpace=l.SRGBColorSpace,y.minFilter=l.LinearFilter,y.needsUpdate=!0,g.map=y,g.needsUpdate=!0,c("ready")}catch{c("error")}},p.onerror=()=>!d&&c("error"),p.src=e}).catch(()=>!d&&c("error")),()=>{d=!0,T(),S?.disconnect(),M&&cancelAnimationFrame(M),y?.dispose?.(),g?.dispose?.(),w?.dispose?.(),i&&(i.domElement?.remove?.(),i.dispose?.(),i.forceContextLoss?.())}},[e]),P("div",{style:{position:"relative",height:"100%",width:"100%",overflow:"hidden",borderRadius:16,background:"#000"},children:[u("div",{ref:r,"data-canvas-no-zoom":!0,onMouseDown:s=>s.stopPropagation(),onWheel:s=>s.stopPropagation(),style:{position:"absolute",inset:0}}),t!=="ready"?u("div",{style:{position:"absolute",inset:0,display:"grid",placeItems:"center",pointerEvents:"none",color:o.theme.node.placeholder,fontSize:13,background:t==="error"?"rgba(0,0,0,0.6)":`linear-gradient(135deg, ${o.theme.node.fill}, #000)`},children:t==="error"?"\u5168\u666F\u56FE\u8BFB\u53D6\u5931\u8D25,\u8BF7\u6362 2:1 \u7684 JPG/PNG \u5168\u666F\u56FE":"\u6B63\u5728\u52A0\u8F7D\u5168\u666F\u2026"}):null]})}function te({ctx:e}){let o=k(null),r=F(s=>{if(!s)return;let d=new FileReader;d.onload=()=>e.updateMetadata({content:String(d.result||"")}),d.readAsDataURL(s)},[e]),t=e.theme,c={display:"inline-flex",alignItems:"center",gap:6,cursor:"pointer",borderRadius:999,padding:"9px 18px",fontSize:13,fontWeight:600,border:`1px solid ${t.node.stroke}`,background:t.node.fill,color:t.node.text};return P("div",{style:{height:"100%",width:"100%",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:14,padding:20,borderRadius:16,boxSizing:"border-box",background:t.node.fill},children:[u("span",{style:{fontSize:34},children:"\u{1F310}"}),P("div",{"data-canvas-no-zoom":!0,onMouseDown:s=>s.stopPropagation(),style:{display:"flex",gap:10},children:[u("input",{ref:o,type:"file",accept:"image/*",style:{display:"none"},onChange:s=>r(s.target.files?.[0])}),u("button",{type:"button",style:c,onClick:()=>o.current?.click(),children:"\u{1F5BC} \u4E0A\u4F20\u5168\u666F\u56FE"}),u("button",{type:"button",style:{...c,border:"none",background:t.toolbar.activeBg,color:t.toolbar.activeText},onClick:()=>e.openPanel(),children:"\u2728 AI \u751F\u6210"})]}),u("span",{style:{fontSize:12,color:t.node.placeholder,textAlign:"center"},children:"\u652F\u6301 2:1 \u7B49\u8DDD\u67F1\u72B6\u5168\u666F\u56FE"})]})}function ne({ctx:e}){let o=e.getUpstream().map(t=>t.metadata?.content).find(t=>typeof t=="string"&&!!t),r=(typeof e.node.metadata?.content=="string"?e.node.metadata.content:"")||o||"";return r?u(ee,{src:r,ctx:e}):u(te,{ctx:e})}var he={id:"panorama",name:"3D \u5168\u666F\u8282\u70B9",version:"1.1.0",description:"\u67E5\u770B 360\xB0 \u7B49\u8DDD\u67F1\u72B6\u5168\u666F\u56FE,\u652F\u6301\u4E0A\u4F20\u4E0E AI \u751F\u6210,\u53EF\u4ECE\u4E0A\u6E38\u56FE\u7247\u8282\u70B9\u53D6\u56FE",nodes:[{type:"panorama:viewer",title:"3D \u5168\u666F",icon:"\u{1F310}",description:"360\xB0 \u5168\u666F\u67E5\u770B\u5668(\u4E0A\u4F20 / AI \u751F\u6210)",defaultSize:{width:480,height:300},defaultMetadata:{},minimapColor:"#0ea5e9",interactionToggle:!0,useBuiltinPanel:{mode:"image",promptPrefix:H,writeBackToSelf:!0},resource:e=>{let o=e.metadata?.content;return typeof o=="string"&&o?{kind:"image",url:o}:null},Content:ne,toolbar:e=>{let o=typeof e.node.metadata?.content=="string"&&!!e.node.metadata?.content;return[{id:"panorama-generate",title:"\u7528 AI \u751F\u6210\u5168\u666F\u56FE(\u6253\u5F00\u4E0B\u65B9\u9762\u677F)",label:"AI \u751F\u6210",icon:"\u2728",onClick:()=>e.openPanel()},...o?[{id:"panorama-reset",title:"\u6E05\u7A7A\u5F53\u524D\u5168\u666F\u56FE,\u91CD\u65B0\u4E0A\u4F20",label:"\u6362\u56FE",icon:"\u{1F504}",onClick:()=>e.updateMetadata({content:""})}]:[]]}}]};export{he as default};
|