@layoutit/polycss-vue 0.0.1 → 0.2.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.
- package/README.md +3 -3
- package/dist/index.cjs +146 -18
- package/dist/index.d.cts +388 -26
- package/dist/index.d.ts +388 -26
- package/dist/index.js +146 -18
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{defineComponent as
|
|
1
|
+
import{defineComponent as Co,h as Eo,provide as Mo,computed as Ao}from"vue";import{ref as it,shallowRef as vo,watch as Po}from"vue";import{createIsometricCamera as bo,BASE_TILE as xo}from"@layoutit/polycss-core";function at(e){let t={cameraState:{...e}},n=new Set;function o(){for(let r of n)r()}return{getState(){return t},setState(r){t={...t,...r},o()},subscribe(r){return n.add(r),()=>n.delete(r)},updateCameraFromRef(r){return t={cameraState:{...r.state}},o(),!0},notifyAll(){o()}}}function ye(e){let t=bo({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),n=vo(t),o=it(null),r=it(null),i=it([0,0,0]),s=at(t.state);Po(()=>({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),(a,c)=>{let l={};a.zoom!==void 0&&a.zoom!==c?.zoom&&(l.zoom=a.zoom),a.target!==void 0&&a.target!==c?.target&&(l.target=a.target),a.rotX!==void 0&&a.rotX!==c?.rotX&&(l.rotX=a.rotX),a.rotY!==void 0&&a.rotY!==c?.rotY&&(l.rotY=a.rotY),a.distance!==void 0&&a.distance!==c?.distance&&(l.distance=a.distance),Object.keys(l).length>0&&(t.update(l),d(),s.updateCameraFromRef(t),s.notifyAll())});function d(){let a=o.value;if(!a)return;let c=t.state,l=xo,m=i.value,f=c.target[0]+m[0],y=c.target[1]+m[1],p=c.target[2]+m[2],b=y*l,P=f*l,E=p*l,C=c.distance!==0?`translateZ(${-c.distance}px) `:"";a.style.transform=`${C}scale(${c.zoom}) rotateX(${c.rotX}deg) rotate(${c.rotY}deg) translate3d(${-b}px, ${-P}px, ${-E}px)`}return{store:s,cameraRef:n,sceneElRef:o,cameraElRef:r,autoCenterOffset:i,applyTransformDirect:d}}var K=Symbol("polycss-camera");var So=8e3,Le=Co({name:"PolyPerspectiveCamera",props:{zoom:{type:Number},target:{type:Array},rotX:{type:Number},rotY:{type:Number},distance:{type:Number},perspective:{type:Number,default:void 0},class:{type:String}},setup(e,{slots:t}){let n=Ao(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}=ye(n);return Mo(K,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}),()=>{let c=`${typeof e.perspective=="number"?e.perspective:So}px`;return Eo("div",{ref:s,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:c}},t.default?.())}}});import{defineComponent as To,h as wo,provide as Lo,computed as Ro}from"vue";var Ht=To({name:"PolyOrthographicCamera",props:{zoom:{type:Number},target:{type:Array},rotX:{type:Number},rotY:{type:Number},distance:{type:Number},class:{type:String}},setup(e,{slots:t}){let n=Ro(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}=ye(n);return Lo(K,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}),()=>wo("div",{ref:s,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:"none"}},t.default?.())}});import{defineComponent as ea,h as ta,inject as na,provide as oa,computed as ee,ref as cn,watch as un,watchEffect as dn,onMounted as ra,onBeforeUnmount as aa}from"vue";import{parseHexColor as mn,BASE_TILE as ia}from"@layoutit/polycss-core";import{computed as Oo}from"vue";import{buildSceneContext as Do,mergePolygons as ko}from"@layoutit/polycss-core";function Fe(e,t){return Oo(()=>{let{directionalLight:n}=t.value,o=Do({polygons:e.value});return{polygons:ko(o.context.polygons),sceneBbox:o.context.sceneBbox}})}var It="polycss-styles";function ze(e=typeof document<"u"?document:null){if(!e||e.getElementById(It))return;let t=e.createElement("style");t.id=It,t.textContent=_o,e.head.appendChild(t)}var _o=`
|
|
2
2
|
/* \u2500\u2500 Scene container \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
3
3
|
|
|
4
4
|
.polycss-scene,
|
|
@@ -16,12 +16,6 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
16
16
|
height: 0;
|
|
17
17
|
transform-style: preserve-3d;
|
|
18
18
|
perspective: none;
|
|
19
|
-
transform: var(--scene-transform);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.polycss-offset {
|
|
23
|
-
transform-style: preserve-3d;
|
|
24
|
-
transform: var(--offset-transform);
|
|
25
19
|
}
|
|
26
20
|
|
|
27
21
|
/* \u2500\u2500 Camera wrapper (perspective + interactive drag) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
@@ -44,6 +38,22 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
44
38
|
position: absolute;
|
|
45
39
|
}
|
|
46
40
|
|
|
41
|
+
/* \u2500\u2500 First-person controls perspective context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
42
|
+
|
|
43
|
+
/* PolyFirstPersonControls toggles this class on its host element (the camera
|
|
44
|
+
wrapper). FPV needs a real perspective context so scene Z translation
|
|
45
|
+
produces visible depth motion - without it, walking forward looks like a
|
|
46
|
+
planar pan. The class wins over inline perspective styles (e.g.
|
|
47
|
+
PolyOrthographicCamera's perspective: none) via !important. The actual
|
|
48
|
+
perspective value is set inline by the controls as the
|
|
49
|
+
--polycss-fpv-perspective custom property; the default of 2000px matches
|
|
50
|
+
the controls' lookOffset fallback so the FPV math and visual perspective
|
|
51
|
+
stay in sync. */
|
|
52
|
+
.polycss-fpv-host {
|
|
53
|
+
perspective: var(--polycss-fpv-perspective, 2000px) !important;
|
|
54
|
+
transform-style: preserve-3d !important;
|
|
55
|
+
}
|
|
56
|
+
|
|
47
57
|
/* \u2500\u2500 Polygon leaf element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
48
58
|
|
|
49
59
|
/*
|
|
@@ -71,24 +81,37 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
71
81
|
background-repeat: no-repeat;
|
|
72
82
|
}
|
|
73
83
|
|
|
84
|
+
.polycss-scene b,
|
|
85
|
+
.polycss-scene i,
|
|
86
|
+
.polycss-scene u {
|
|
87
|
+
color: var(--polycss-paint, currentColor);
|
|
88
|
+
}
|
|
89
|
+
|
|
74
90
|
.polycss-scene b {
|
|
91
|
+
background: currentColor;
|
|
92
|
+
width: 64px;
|
|
93
|
+
height: 64px;
|
|
75
94
|
}
|
|
76
95
|
|
|
77
96
|
.polycss-scene i {
|
|
78
|
-
|
|
79
|
-
|
|
97
|
+
width: 16px;
|
|
98
|
+
height: 16px;
|
|
80
99
|
border-color: currentColor;
|
|
81
100
|
}
|
|
82
101
|
|
|
83
102
|
.polycss-scene s {
|
|
103
|
+
width: var(--polycss-atlas-size, 64px);
|
|
104
|
+
height: var(--polycss-atlas-size, 64px);
|
|
84
105
|
}
|
|
85
106
|
|
|
86
107
|
.polycss-scene u {
|
|
87
|
-
width:
|
|
88
|
-
height:
|
|
108
|
+
width: 0;
|
|
109
|
+
height: 0;
|
|
89
110
|
background: transparent;
|
|
90
111
|
box-sizing: content-box;
|
|
91
112
|
border: 0 solid transparent;
|
|
113
|
+
border-color: transparent transparent currentColor transparent;
|
|
114
|
+
border-width: 0 32px 64px 32px;
|
|
92
115
|
}
|
|
93
116
|
|
|
94
117
|
/* \u2500\u2500 Dynamic lighting cascade vars (scene root \u2192 polygons) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
@@ -108,6 +131,21 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
108
131
|
@property --plx { syntax: "<number>"; inherits: true; initial-value: 0; }
|
|
109
132
|
@property --ply { syntax: "<number>"; inherits: true; initial-value: 0; }
|
|
110
133
|
@property --plz { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
134
|
+
|
|
135
|
+
/* CSS-space light components (world-Y\u2192cssX, world-X\u2192cssY, world-Z\u2192cssZ).
|
|
136
|
+
Used by the shadow projection matrix. --clz is clamped away from 0 in JS
|
|
137
|
+
to avoid divide-by-zero when the light is near-horizontal. */
|
|
138
|
+
@property --clx { syntax: "<number>"; inherits: true; initial-value: 0.01; }
|
|
139
|
+
@property --cly { syntax: "<number>"; inherits: true; initial-value: 0; }
|
|
140
|
+
@property --clz { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
141
|
+
|
|
142
|
+
/* Ground-plane position in CSS pixels along the CSS-Z axis (= world-Z, the
|
|
143
|
+
up axis in polycss's world convention). Stored as a <number> so it can be
|
|
144
|
+
used directly inside matrix3d() calc() expressions (matrix3d requires
|
|
145
|
+
dimensionless entries \u2014 no px units).
|
|
146
|
+
Set from the min world-Z of casting meshes. */
|
|
147
|
+
@property --shadow-ground-cssz { syntax: "<number>"; inherits: true; initial-value: 0; }
|
|
148
|
+
|
|
111
149
|
@property --plr { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
112
150
|
@property --plg { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
113
151
|
@property --plb { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
@@ -117,14 +155,14 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
117
155
|
@property --pab { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
118
156
|
@property --pai { syntax: "<number>"; inherits: true; initial-value: 0.4; }
|
|
119
157
|
|
|
120
|
-
/* Per-polygon surface normal \u2014 set inline by the renderer.
|
|
121
|
-
|
|
158
|
+
/* Per-polygon surface normal \u2014 set inline by the renderer. Base RGB channels
|
|
159
|
+
may be hoisted to a mesh wrapper, so they inherit unless overridden inline. */
|
|
122
160
|
@property --pnx { syntax: "<number>"; inherits: false; initial-value: 0; }
|
|
123
161
|
@property --pny { syntax: "<number>"; inherits: false; initial-value: 0; }
|
|
124
162
|
@property --pnz { syntax: "<number>"; inherits: false; initial-value: 1; }
|
|
125
|
-
@property --psr { syntax: "<number>"; inherits:
|
|
126
|
-
@property --psg { syntax: "<number>"; inherits:
|
|
127
|
-
@property --psb { syntax: "<number>"; inherits:
|
|
163
|
+
@property --psr { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
164
|
+
@property --psg { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
165
|
+
@property --psb { syntax: "<number>"; inherits: true; initial-value: 1; }
|
|
128
166
|
|
|
129
167
|
/* Calc-driven Lambert + tint, scoped to dynamic-lighting scenes. Lives
|
|
130
168
|
here (not inline per polygon) so each leaf only carries its tiny normal
|
|
@@ -150,8 +188,9 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
150
188
|
background-blend-mode: multiply;
|
|
151
189
|
}
|
|
152
190
|
|
|
191
|
+
.polycss-scene[data-polycss-lighting="dynamic"] b,
|
|
153
192
|
.polycss-scene[data-polycss-lighting="dynamic"] u {
|
|
154
|
-
|
|
193
|
+
color: rgb(
|
|
155
194
|
calc(255 * var(--psr) * (var(--par) * var(--pai)
|
|
156
195
|
+ var(--plr) * var(--pli) * max(0,
|
|
157
196
|
var(--pnx) * var(--plx) +
|
|
@@ -169,4 +208,93 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
|
|
|
169
208
|
var(--pnz) * var(--plz))))
|
|
170
209
|
);
|
|
171
210
|
}
|
|
172
|
-
`;import{parsePureColor as Ha}from"@layoutit/polycss-core";import{inject as Rn}from"vue";var Te=Symbol("polycss/scene-context");function ot(){return Rn(Te,null)}import{computed as ie,h as He,onBeforeUnmount as On,ref as Hn,watch as Dn}from"vue";var kn=50,In=[.4,-.7,.59],_n="#ffffff",Vn=1,$n="#ffffff",Un=.4,q=4096,rt=1,Xn=.1,Yn=1,lt=q*q,zn=lt*3,we=2048,Re=16*1024*1024,Nn=.995,X=.001,Fn=.75,it=3,jn=2,se=1e-9,Bn=.45,G=new Map;function Wn(e){let t=G.get(e);return t||(t=new Promise((r,o)=>{let n=new Image;n.decoding="async",n.onload=()=>r(n),n.onerror=()=>o(new Error(`texture load failed: ${e}`)),n.src=e}),G.set(e,t),t.then(()=>{G.get(e)===t&&G.delete(e)},()=>{G.get(e)===t&&G.delete(e)})),t}function Pe(e){let t=typeof e=="string"?Number(e):e;return t===void 0||!Number.isFinite(t)?1:Math.min(Yn,Math.max(Xn,t))}function De(e,t){let r=e.toFixed(t).replace(/\.?0+$/,"");return Object.is(Number(r),-0)?"0":r}function Oe(e,t=it){return`matrix3d(${e.split(",").map(r=>{let o=Number(r.trim());return Number.isFinite(o)?De(o,t):r.trim()}).join(",")})`}function ge(e,t=jn){return`${De(e,t)}%`}function st(e){return e.reduce((t,r)=>t+r.width*r.height,0)}function Zn(e){let t=st(e);if(t<=0)return 1;let r=Math.max(1,...e.map(a=>Math.max(a.width,a.height))),o=we/r,n=Math.sqrt(Re/(t*4));return Pe(Math.min(o,n))}function Gn(e){let t=st(e),r=.5;return t<=lt?r=1:t<=zn&&(r=.75),Pe(Math.min(r,Zn(e)))}function Kn(e,t){return e.reduce((r,o)=>Math.max(r,Math.ceil(o.width*t),Math.ceil(o.height*t)),0)}function qn(e,t){return e.reduce((r,o)=>r+Math.ceil(o.width*t)*Math.ceil(o.height*t)*4,0)}function Jn(e,t){let r=Kn(e,t),o=qn(e,t),n=r>we?we/r:1,a=o>Re?Math.sqrt(Re/o):1;return Math.min(n,a)}function Qn(e,t){let r=Gn(t.pages),o=r===1?t:he(e,r);for(let n=0;n<4;n++){let a=Jn(o.pages,r);if(a>=1)break;let i=Pe(r*a*Nn);if(i>=r)break;r=i,o=he(e,r)}return{packed:o,atlasScale:r}}function eo(e,t){if(t!==void 0&&t!=="auto"){let o=Pe(t);return{packed:he(e,o),atlasScale:o}}let r=he(e,1);return Qn(e,r)}function to(e){return Math.max(rt,Math.ceil(rt/e))}function F(e,t,r=1,o=0,n=0,a=1,i=0,m=0){e.setTransform(r*t,o*t,n*t,a*t,i*t,m*t)}function J(e){let t=e.startsWith("#")?e.slice(1):e;return t.length!==6?{r:255,g:255,b:255}:{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}function ct(e){if(e.screenPts.length!==8)return!1;let t=[],r=[],o=(n,a)=>{for(let i of n)if(Math.abs(i-a)<=X)return;n.push(a)};for(let n=0;n<e.screenPts.length;n+=2)o(t,e.screenPts[n]),o(r,e.screenPts[n+1]);if(t.length!==2||r.length!==2||(t.sort((n,a)=>n-a),r.sort((n,a)=>n-a),Math.abs(t[0])>X||Math.abs(r[0])>X||t[1]-t[0]<=X||r[1]-r[0]<=X))return!1;for(let n=0;n<e.screenPts.length;n+=2){let a=e.screenPts[n],i=e.screenPts[n+1],m=Math.abs(a-t[0])<=X||Math.abs(a-t[1])<=X,s=Math.abs(i-r[0])<=X||Math.abs(i-r[1])<=X;if(!m||!s)return!1}return!0}function j(e){return!e.texture&&e.polygon.vertices.length===3}function no(){if(!!!globalThis.CSS?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) polygon(50% 50%, 50% 50%, 50% 50%)"))return!1;let t=globalThis.matchMedia;return typeof t!="function"?!0:t("(pointer: fine)").matches&&t("(hover: hover)").matches}function oo(e){let t=[],r=e.canvasW||1,o=e.canvasH||1;for(let n=0;n<e.screenPts.length;n+=2){let a=Math.max(0,Math.min(100,e.screenPts[n]/r*100)),i=Math.max(0,Math.min(100,e.screenPts[n+1]/o*100));t.push(`${ge(a)} ${ge(i)}`)}return`polygon(${t.join(", ")})`}function ro(e){let t=0,r=0,o=Math.max(1,e.screenPts.length/2);for(let s=0;s<e.screenPts.length;s+=2)t+=e.screenPts[s],r+=e.screenPts[s+1];let n=e.canvasW||1,a=e.canvasH||1,i=ge(Math.max(0,Math.min(100,t/o/n*100))),m=ge(Math.max(0,Math.min(100,r/o/a*100)));return`polygon(${Array.from({length:o},()=>`${i} ${m}`).join(", ")})`}function ao(e){return`${oo(e)} ${ro(e)}`}function lo(e,t=it){return e.map(r=>De(r,t)).join(",")}function io(e,t,r){return e.map(o=>[o[1]*t,o[0]*t,o[2]*r])}function so(e){if(e.length<3)return null;let t=e[0],r=e[1],o=e[2],n=[r[0]-t[0],r[1]-t[1],r[2]-t[2]],a=[o[0]-t[0],o[1]-t[1],o[2]-t[2]],i=[-(n[1]*a[2]-n[2]*a[1]),-(n[2]*a[0]-n[0]*a[2]),-(n[0]*a[1]-n[1]*a[0])],m=Math.hypot(i[0],i[1],i[2]);return m<=se?null:[i[0]/m,i[1]/m,i[2]/m]}function Le(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function co(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function uo(e,t,r){if(!j(e))return null;let o=io(e.polygon.vertices,e.tileSize,e.layerElevation),n=so(o);if(!n)return null;let a=[{a:0,b:1,c:2},{a:1,b:2,c:0},{a:2,b:0,c:1}].map(I=>{let D=o[I.a],x=o[I.b];return{...I,length:Math.hypot(x[0]-D[0],x[1]-D[1],x[2]-D[2])}}).sort((I,D)=>D.length-I.length),i=a[0].a,m=a[0].b,s=a[0].c,l=o[i],c=o[m],u=o[s],y=a[0].length;if(y<=se)return null;let f=[(c[0]-l[0])/y,(c[1]-l[1])/y,(c[2]-l[2])/y],g=[u[0]-l[0],u[1]-l[1],u[2]-l[2]],v=Le(g,f),b=[l[0]+f[0]*v,l[1]+f[1]*v,l[2]+f[2]*v],R=[b[0]-u[0],b[1]-u[1],b[2]-u[2]],H=Math.hypot(R[0],R[1],R[2]);if(H<=se)return null;let O=[R[0]/H,R[1]/H,R[2]/H];if(Le(co(f,O),n)<0){let I=m;if(m=i,i=I,l=o[i],c=o[m],y=Math.hypot(c[0]-l[0],c[1]-l[1],c[2]-l[2]),y<=se)return null;f=[(c[0]-l[0])/y,(c[1]-l[1])/y,(c[2]-l[2])/y];let D=[u[0]-l[0],u[1]-l[1],u[2]-l[2]];v=Le(D,f),b=[l[0]+f[0]*v,l[1]+f[1]*v,l[2]+f[2]*v],R=[b[0]-u[0],b[1]-u[1],b[2]-u[2]];let x=Math.hypot(R[0],R[1],R[2]);if(x<=se)return null;O=[R[0]/x,R[1]/x,R[2]/x]}let d=Math.max(0,Math.min(y,v)),C=Math.max(0,y-d),p=Bn,A=d+p,P=C+p,E=H+p*2,M=u[0]-A*f[0]-p*O[0],S=u[1]-A*f[1]-p*O[1],w=u[2]-A*f[2]-p*O[2],L=lo([f[0],f[1],f[2],0,O[0],O[1],O[2],0,n[0],n[1],n[2],0,M,S,w,1]),h=t==="dynamic",k=J(e.polygon.color??"#cccccc");return{transform:`matrix3d(${L})`,borderWidth:`0 ${P}px ${E}px ${A}px`,borderBottomColor:h?void 0:e.shadedColor,pointerEvents:r==="none"?"none":void 0,...h?{"--pnx":n[0].toFixed(4),"--pny":n[1].toFixed(4),"--pnz":n[2].toFixed(4),"--psr":(k.r/255).toFixed(4),"--psg":(k.g/255).toFixed(4),"--psb":(k.b/255).toFixed(4)}:null}}function mo({r:e,g:t,b:r}){let o=n=>Math.round(Math.max(0,Math.min(255,n))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(r)}`}function fo(e,t,r,o,n){let a=J(e),i=J(r),m=J(o),s=m.r/255*n+i.r/255*t,l=m.g/255*n+i.g/255*t,c=m.b/255*n+i.b/255*t;return mo({r:a.r*s,g:a.g*l,b:a.b*c})}function yo(e,t,r,o){let n=J(t),a=J(r);return{r:a.r/255*o+n.r/255*e,g:a.g/255*o+n.g/255*e,b:a.b/255*o+n.b/255*e}}function po({r:e,g:t,b:r}){let o=n=>Math.round(Math.max(0,Math.min(1,n))*255);return`rgb(${o(e)} ${o(t)} ${o(r)})`}function go(e,t,r,o,n,a,i){Math.abs(a.r-1)<.001&&Math.abs(a.g-1)<.001&&Math.abs(a.b-1)<.001||(e.save(),F(e,i),e.globalCompositeOperation="multiply",e.fillStyle=po(a),e.fillRect(t,r,o,n),e.restore())}function ho(e,t,r,o,n,a,i){let m=t.naturalWidth||t.width||1,s=t.naturalHeight||t.height||1,l=Math.max(n/m,a/s),c=m*l,u=s*l;F(e,i),e.drawImage(t,r+(n-c)/2,o+(a-u)/2,c,u)}function ut(e,t){if(e.length<3||t.length<3)return null;let[r,o,n]=e,[a,i,m]=t,s=r[0],l=r[1],c=o[0],u=o[1],y=n[0],f=n[1],g=a[0],v=1-a[1],b=i[0],R=1-i[1],H=m[0],O=1-m[1],d=b-g,C=R-v,p=H-g,A=O-v,P=d*A-p*C;if(Math.abs(P)<=1e-9)return null;let E=c-s,M=y-s,S=u-l,w=f-l,L={a:(E*A-M*C)/P,b:(d*M-p*E)/P,c:(S*A-w*C)/P,d:(d*w-p*S)/P,e:0,f:0};return L.e=s-L.a*g-L.b*v,L.f=l-L.c*g-L.d*v,L}function mt(e){if(e.length===0)return null;let t=1/0,r=1/0,o=-1/0,n=-1/0;for(let a of e){let i=a[0],m=1-a[1];if(!Number.isFinite(i)||!Number.isFinite(m))return null;t=Math.min(t,i),o=Math.max(o,i),r=Math.min(r,m),n=Math.max(n,m)}return{minU:t,minV:r,maxU:o,maxV:n}}function Po(e,t,r,o,n,a,i,m){let s=e.vertices.map(u=>{let y=[u[1]*t,u[0]*t,u[2]*r],f=y[0]-o[0],g=y[1]-o[1],v=y[2]-o[2];return[f*n[0]+g*n[1]+v*n[2]+i,f*a[0]+g*a[1]+v*a[2]+m]}),l=ut(s,e.uvs),c=mt(e.uvs);return!l&&!c?null:{screenPts:s.flatMap(([u,y])=>[u,y]),uvAffine:l,uvSampleRect:c}}function vo(e,t){if(e.length<6||t<=0)return e;let r=0,o=0,n=e.length/2;for(let i=0;i<e.length;i+=2)r+=e[i],o+=e[i+1];r/=n,o/=n;let a=e.slice();for(let i=0;i<a.length;i+=2){let m=a[i]-r,s=a[i+1]-o,l=Math.hypot(m,s);l<=X||(a[i]+=m/l*t,a[i+1]+=s/l*t)}return a}function K(e,t){return Math.max(0,Math.min(t,e))}function at(e,t,r,o,n,a,i,m){let s=t.naturalWidth||t.width||1,l=t.naturalHeight||t.height||1,c=K(Math.min(r.minU,r.maxU)*s,s),u=K(Math.max(r.minU,r.maxU)*s,s),y=K(Math.min(r.minV,r.maxV)*l,l),f=K(Math.max(r.minV,r.maxV)*l,l),g=Math.floor(c),v=Math.floor(y),b=Math.ceil(u)-g,R=Math.ceil(f)-v;b<1&&(g=Math.floor(K((r.minU+r.maxU)/2*s,s-1)),b=1),R<1&&(v=Math.floor(K((r.minV+r.maxV)/2*l,l-1)),R=1),g=Math.max(0,Math.min(s-1,g)),v=Math.max(0,Math.min(l-1,v)),b=Math.max(1,Math.min(s-g,b)),R=Math.max(1,Math.min(l-v,R)),F(e,m),e.drawImage(t,g,v,b,R,o,n,a,i)}function xo(e){if(typeof e.toBlob=="function")return new Promise(t=>{e.toBlob(r=>{t(r?URL.createObjectURL(r):null)},"image/png")});try{return Promise.resolve(e.toDataURL("image/png"))}catch{return Promise.resolve(null)}}function Q(e,t,r={}){let{vertices:o,texture:n,uvs:a}=e;if(!o||o.length<3)return null;let i=r.tileSize??kn,m=r.layerElevation??i,s=V=>[V[1]*i,V[0]*i,V[2]*m],l=o.map(s),c=l[0],u=l[1],y=l[2],f=[u[0]-c[0],u[1]-c[1],u[2]-c[2]],g=[y[0]-c[0],y[1]-c[1],y[2]-c[2]],v=Math.hypot(f[0],f[1],f[2]);if(v===0)return null;let b=[f[0]/v,f[1]/v,f[2]/v],R=-(f[1]*g[2]-f[2]*g[1]),H=-(f[2]*g[0]-f[0]*g[2]),O=-(f[0]*g[1]-f[1]*g[0]),d=Math.hypot(R,H,O);if(d===0)return null;R/=d,H/=d,O/=d;let C=[H*b[2]-O*b[1],O*b[0]-R*b[2],R*b[1]-H*b[0]],p=l.map(V=>{let U=V[0]-c[0],me=V[1]-c[1],de=V[2]-c[2];return[U*b[0]+me*b[1]+de*b[2],U*C[0]+me*C[1]+de*C[2]]}),A=1/0,P=1/0,E=-1/0,M=-1/0;for(let[V,U]of p)V<A&&(A=V),V>E&&(E=V),U<P&&(P=U),U>M&&(M=U);let S=-A,w=-P,L=E-A,h=M-P;if(!Number.isFinite(L)||!Number.isFinite(h))return null;let k=[];for(let V=0;V<p.length;V++){let[U,me]=p[V],de=U+S,dn=me+w;k.push(de,dn)}let I=c[0]-S*b[0]-w*C[0],D=c[1]-S*b[1]-w*C[1],x=c[2]-S*b[2]-w*C[2],T=[b[0],b[1],b[2],0,C[0],C[1],C[2],0,R,H,O,0,I,D,x,1].join(","),_=r.directionalLight,We=r.ambientLight,W=_?.direction??In,Ze=_?.color??_n,rn=Math.max(0,_?.intensity??Vn),Ge=We?.color??$n,Ke=Math.max(0,We?.intensity??Un),Ee=Math.hypot(W[0],W[1],W[2])||1,an=W[0]/Ee,ln=W[1]/Ee,sn=W[2]/Ee,qe=rn*Math.max(0,R*an+H*ln+O*sn),cn=yo(qe,Ze,Ge,Ke),un=fo(e.color??"#cccccc",qe,Ze,Ge,Ke),Je=null,Qe=null;n&&a&&a.length>=3&&a.length===o.length&&(Qe=mt(a),Je=ut(p.map(([V,U])=>[V+S,U+w]),a));let mn=n&&e.textureTriangles?.length?e.textureTriangles.map(V=>Po(V,i,m,c,b,C,S,w)).filter(V=>!!V):null;return{index:t,polygon:e,texture:n,tileSize:i,layerElevation:m,matrix:T,canvasW:Math.max(1,Math.ceil(L)),canvasH:Math.max(1,Math.ceil(h)),screenPts:k,uvAffine:Je,uvSampleRect:Qe,textureTriangles:mn,normal:[R,H,O],textureTint:cn,shadedColor:un}}function he(e,t=1){let r=Array(e.length).fill(null),o=[],n=to(t),a=e.filter(s=>!!s).sort((s,l)=>l.canvasH-s.canvasH||l.canvasW-s.canvasW||s.index-l.index),i=()=>({width:n,height:n,entries:[],shelves:[]}),m=(s,l,c)=>{if(s.sealed)return null;for(let f of s.shelves)if(l.canvasH<=f.height&&f.x+l.canvasW+n<=q){let g={...l,pageIndex:c,x:f.x,y:f.y};return f.x+=l.canvasW+n,s.entries.push(g),s.width=Math.max(s.width,g.x+l.canvasW+n),g}let u=s.shelves.length===0?n:s.height;if(u+l.canvasH+n>q)return null;let y={...l,pageIndex:c,x:n,y:u};return s.shelves.push({x:n+l.canvasW+n,y:u,height:l.canvasH}),s.entries.push(y),s.width=Math.max(s.width,y.x+l.canvasW+n),s.height=Math.max(s.height,u+l.canvasH+n),y};for(let s of a){if(s.canvasW+n*2>q||s.canvasH+n*2>q){let u=o.length,y={...s,pageIndex:u,x:n,y:n};r[s.index]=y,o.push({width:s.canvasW+n*2,height:s.canvasH+n*2,entries:[y],shelves:[],sealed:!0});continue}let c=null;for(let u=0;u<o.length&&(c=m(o[u],s,u),!c);u++);if(!c){let u=i(),y=o.length;o.push(u),c=m(u,s,y)}c&&(r[s.index]=c)}return{entries:r,pages:o.map(({width:s,height:l,entries:c})=>({width:s,height:l,entries:c}))}}async function bo(e,t,r,o){let n=r.createElement("canvas");n.width=Math.max(1,Math.ceil(e.width*o)),n.height=Math.max(1,Math.ceil(e.height*o));let a=n.getContext("2d");if(!a)return{width:e.width,height:e.height,url:null};let i=Array.from(new Set(e.entries.flatMap(l=>l.texture?[l.texture]:[]))),m=new Map;await Promise.all(i.map(async l=>{m.set(l,await Wn(l))}));for(let l of e.entries){let c=l.texture?m.get(l.texture):null;a.save(),F(a,o),a.beginPath();for(let u=0;u<l.screenPts.length;u+=2){let y=l.x+l.screenPts[u],f=l.y+l.screenPts[u+1];u===0?a.moveTo(y,f):a.lineTo(y,f)}if(a.closePath(),a.clip(),!l.texture)F(a,o),a.fillStyle=t==="dynamic"?l.polygon.color??"#cccccc":l.shadedColor,a.fillRect(l.x,l.y,l.canvasW,l.canvasH);else if(c&&l.textureTriangles?.length){let u=c.naturalWidth||c.width||1,y=c.naturalHeight||c.height||1;for(let f of l.textureTriangles){let g=vo(f.screenPts,Fn);a.save(),F(a,o),a.beginPath();for(let v=0;v<g.length;v+=2){let b=l.x+g[v],R=l.y+g[v+1];v===0?a.moveTo(b,R):a.lineTo(b,R)}a.closePath(),a.clip(),f.uvAffine?(F(a,o,f.uvAffine.a/u,f.uvAffine.c/u,f.uvAffine.b/y,f.uvAffine.d/y,l.x+f.uvAffine.e,l.y+f.uvAffine.f),a.drawImage(c,0,0)):f.uvSampleRect&&at(a,c,f.uvSampleRect,l.x,l.y,l.canvasW,l.canvasH,o),a.restore()}}else if(c&&l.uvAffine){let u=c.naturalWidth||c.width||1,y=c.naturalHeight||c.height||1;F(a,o,l.uvAffine.a/u,l.uvAffine.c/u,l.uvAffine.b/y,l.uvAffine.d/y,l.x+l.uvAffine.e,l.y+l.uvAffine.f),a.drawImage(c,0,0)}else c&&l.uvSampleRect?at(a,c,l.uvSampleRect,l.x,l.y,l.canvasW,l.canvasH,o):c&&ho(a,c,l.x,l.y,l.canvasW,l.canvasH,o);l.texture&&t==="baked"&&go(a,l.x,l.y,l.canvasW,l.canvasH,l.textureTint,o),a.restore()}let s=await xo(n);return n.width=1,n.height=1,{width:e.width,height:e.height,url:s}}async function Co(e,t,r,o,n){let a=[];for(let i of e){if(n())break;a.push(await bo(i,t,r,o))}return a}function pe(e){for(let t of e)URL.revokeObjectURL(t)}function ee(e,t,r=ie(()=>{})){let o=ie(()=>t.value!=="dynamic"&&no()),n=ie(()=>{let m=e.value.map(s=>!s||s.texture?s:j(s)||t.value!=="dynamic"&&(o.value||ct(s))?null:s);return eo(m,r.value)}),a=Hn(n.value.packed.pages.map(m=>({width:m.width,height:m.height,url:null}))),i=[];return Dn(()=>[n.value,t.value],([m,s],l,c)=>{let{packed:u,atlasScale:y}=m,f=!1;pe(i),i=[],a.value=u.pages.map(g=>({width:g.width,height:g.height,url:null})),c(()=>{f=!0,pe(i),i=[]}),!(u.pages.length===0||typeof document>"u")&&Co(u.pages,s,document,y,()=>f).then(g=>{if(f){pe(g.flatMap(v=>v.url?.startsWith("blob:")?[v.url]:[]));return}i=g.flatMap(v=>v.url?.startsWith("blob:")?[v.url]:[]),a.value=g}).catch(()=>{f||(a.value=u.pages.map(g=>({width:g.width,height:g.height,url:null})))})},{immediate:!0}),On(()=>{pe(i),i=[]}),{entries:ie(()=>n.value.packed.entries),pages:a,ready:ie(()=>a.value.length===0||a.value.every(m=>!!m.url))}}function te({entry:e,page:t,textureLighting:r,className:o,style:n,domAttrs:a,pointerEvents:i="auto"}){let m=r==="dynamic",s=m&&t?.url?`url(${t.url})`:void 0,l=!m&&t?.url?`url(${t.url}) -${e.x}px -${e.y}px / ${t.width}px ${t.height}px no-repeat`:void 0,c={width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Oe(e.matrix),background:l,backgroundImage:m&&t?.url?`url(${t.url})`:void 0,backgroundPosition:m?`-${e.x}px -${e.y}px`:void 0,backgroundSize:m&&t?`${t.width}px ${t.height}px`:void 0,...m?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...m&&s?{maskImage:s,maskMode:"alpha",maskPosition:`-${e.x}px -${e.y}px`,maskSize:t?`${t.width}px ${t.height}px`:void 0,maskRepeat:"no-repeat",WebkitMaskImage:s,WebkitMaskPosition:`-${e.x}px -${e.y}px`,WebkitMaskSize:t?`${t.width}px ${t.height}px`:void 0,WebkitMaskRepeat:"no-repeat"}:null,opacity:t?.url?void 0:0,pointerEvents:i==="none"?"none":void 0,...n},u=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([f,g])=>[`data-${f}`,String(g)])):{},y=o?.trim()||void 0;return He("s",{class:y,style:c,...u,...a})}function ne({entry:e,className:t,style:r,domAttrs:o,pointerEvents:n="auto"}){let a=ct(e),i=a?null:ao(e),m=a?{width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Oe(e.matrix),background:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...r}:{width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Oe(e.matrix),color:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...r},s=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([u,y])=>[`data-${u}`,String(y)])):{},l=t?.trim()||void 0,c=u=>{let y=u.el;y&&(i?y.style.setProperty("border-shape",i):y.style.removeProperty("border-shape"))};return He(a?"b":"i",{class:l,style:m,...s,...o,onVnodeMounted:c,onVnodeUpdated:c})}function oe({entry:e,textureLighting:t,className:r,style:o,domAttrs:n,pointerEvents:a="auto"}){let i=uo(e,t,a);if(!i)return null;let m=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([l,c])=>[`data-${l}`,String(c)])):{},s=r?.trim()||void 0;return He("u",{class:s,style:{...i,...o},...m,...n})}var pt=Mo({name:"PolyScene",inheritAttrs:!1,props:{polygons:{type:Array,default:void 0},perspective:{type:Number},rotX:{type:Number},rotY:{type:Number},zoom:{type:Number},directionalLight:{type:Object,default:void 0},ambientLight:{type:Object,default:void 0},textureLighting:{type:String,default:"baked"},atlasScale:{type:[Number,String],default:void 0},autoCenter:{type:Boolean,default:!1},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},debugShowLabels:{type:Boolean},debugShowBackfaces:{type:Boolean}},setup(e,{slots:t,attrs:r}){let o=Ao($);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{store:n,sceneElRef:a}=o,i=Y(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight}));Eo(Te,i);let m=n.getState().cameraState,s=So(null);ft(s,C=>{a.value=C});let l=!1;To(()=>{l||typeof document<"u"&&(ye(document),l=!0)}),ft(()=>e.debugShowBackfaces,C=>{let p=s.value;p&&p.classList.toggle("polycss-debug-show-backfaces",!!C)});let c=Y(()=>e.polygons??[]),u=Y(()=>({directionalLight:e.directionalLight})),y=fe(c,u),f=Y(()=>({"--scene-transform":wo(m).getStyle().transform})),g=Y(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,atlasScale:e.atlasScale})),v=Y(()=>{let C=e.textureLighting==="dynamic",p=C?void 0:e.directionalLight,A=C?void 0:e.ambientLight;return y.value.polygons.map((P,E)=>Q(P,E,{tileSize:g.value.tileSize,layerElevation:g.value.layerElevation,directionalLight:p,ambientLight:A}))}),b=Y(()=>e.textureLighting??"baked"),R=Y(()=>e.atlasScale),H=ee(v,b,R),O=Y(()=>{if(e.textureLighting!=="dynamic")return null;let C=e.directionalLight?.direction??[.4,-.7,.59],p=Math.hypot(C[0],C[1],C[2])||1,A=C[0]/p,P=C[1]/p,E=C[2]/p,M=yt(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],S=yt(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],w=e.directionalLight?.intensity??1,L=e.ambientLight?.intensity??.4,h=k=>(k/255).toFixed(4);return{"--plx":A.toFixed(4),"--ply":P.toFixed(4),"--plz":E.toFixed(4),"--plr":h(M[0]),"--plg":h(M[1]),"--plb":h(M[2]),"--pli":w.toFixed(4),"--par":h(S[0]),"--pag":h(S[1]),"--pab":h(S[2]),"--pai":L.toFixed(4)}}),d=Y(()=>{if(!e.autoCenter)return;let C=y.value.sceneBbox,p=g.value,A=(C.min[1]+C.max[1])/2*p.tileSize,P=(C.min[0]+C.max[0])/2*p.tileSize,E=(C.min[2]+C.max[2])/2*p.layerElevation;return`translate3d(${-A}px, ${-P}px, ${-E}px)`});return Lo(()=>{}),()=>{let C=`polycss-scene${e.class?` ${e.class}`:""}`,p=g.value,A=H.entries.value.map((M,S)=>{if(M)return te({entry:M,page:H.pages.value[M.pageIndex],textureLighting:p.textureLighting??"baked"});let w=v.value[S];return!w||w.texture?null:j(w)?oe({entry:w,textureLighting:p.textureLighting??"baked"}):ne({entry:w})}),P=t.default?.()??[],E=d.value?[dt("div",{class:"polycss-offset",style:{"--offset-transform":d.value}},[...A,...P])]:[...A,...P];return dt("div",{ref:s,class:C,"data-polycss-lighting":p.textureLighting??"baked","aria-hidden":"true",style:{...f.value,...O.value??null,...r.style},...Object.fromEntries(Object.entries(r).filter(([M])=>M!=="style"&&M!=="class"))},E)}}});import{defineComponent as Do,h as Ce,computed as z,inject as ko,onMounted as Io,onBeforeUnmount as _o,ref as vt}from"vue";import{computeSceneBbox as Vo,inverseRotateVec3 as xt}from"@layoutit/polycss-core";import{ref as ve,watch as Ro,onUnmounted as Oo}from"vue";import{loadMesh as Ho}from"@layoutit/polycss-core";var gt=[],ke=[];function xe(e,t){let r=ve(gt),o=ve(!!e.value),n=ve(null),a=ve(ke),i=null;function m(){if(i){try{i.dispose()}catch{}i=null}}return Ro(e,(s,l,c)=>{if(!s){m(),r.value=gt,o.value=!1,n.value=null,a.value=ke;return}let u=!1;o.value=!0,n.value=null;let y=i;Ho(s,t).then(f=>{if(u){try{f.dispose()}catch{}return}if(y)try{y.dispose()}catch{}i=f,r.value=f.polygons,o.value=!1,n.value=null,a.value=f.warnings??ke}).catch(f=>{if(u)return;let g=f instanceof Error?f:new Error(String(f));o.value=!1,n.value=g}),c(()=>{u=!0})},{immediate:!0}),Oo(()=>{m()}),{polygons:r,loading:o,error:n,warnings:a,dispose:m}}var Ie=new WeakMap;function ht(e,t){Ie.set(e,t)}function Pt(e){Ie.delete(e)}function re(e){let t=e;for(;t;){if(t instanceof HTMLElement){let r=Ie.get(t);if(r)return r}t=t.parentElement}return null}function be(e,t,r){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let n of o){let a=n.getBoundingClientRect();if(!(a.width<=0||a.height<=0)&&t>=a.left&&t<=a.right&&r>=a.top&&r<=a.bottom)return!0}return!1}function _e(e,t,r){if(typeof document>"u")return null;let o=Array.from(document.querySelectorAll(".polycss-mesh"));for(let n of o){if(r&&!r(n))continue;let a=re(n);if(a&&be(n,e,t))return a}return null}function $o(e,t,r){let o=[];return e&&o.push(`translate3d(${e[0]}px, ${e[1]}px, ${e[2]}px)`),t!==void 0&&(typeof t=="number"?t!==1&&o.push(`scale3d(${t}, ${t}, ${t})`):o.push(`scale3d(${t[0]}, ${t[1]}, ${t[2]})`)),r&&(r[0]&&o.push(`rotateX(${r[0]}deg)`),r[1]&&o.push(`rotateY(${r[1]}deg)`),r[2]&&o.push(`rotateZ(${r[2]}deg)`)),o.length>0?o.join(" "):void 0}function Uo(e){if(e.length===0)return e;let t=Vo(e),r=(t.min[0]+t.max[0])/2,o=(t.min[1]+t.max[1])/2,n=(t.min[2]+t.max[2])/2;if(r===0&&o===0&&n===0)return e;let a=i=>[i[0]-r,i[1]-o,i[2]-n];return e.map(i=>({...i,vertices:i.vertices.map(a),...i.textureTriangles?.length?{textureTriangles:i.textureTriangles.map(m=>({...m,vertices:m.vertices.map(a)}))}:null}))}var N=Do({name:"PolyMesh",inheritAttrs:!1,props:{id:{type:String,default:void 0},src:{type:String,default:void 0},mtl:{type:String,default:void 0},polygons:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},textureLighting:{type:String,default:void 0},atlasScale:{type:[Number,String],default:void 0},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},onClick:{type:Function,default:void 0},onContextMenu:{type:Function,default:void 0},onDoubleClick:{type:Function,default:void 0},onWheel:{type:Function,default:void 0},onPointerDown:{type:Function,default:void 0},onPointerUp:{type:Function,default:void 0},onPointerMove:{type:Function,default:void 0},onPointerOver:{type:Function,default:void 0},onPointerOut:{type:Function,default:void 0},onPointerEnter:{type:Function,default:void 0},onPointerLeave:{type:Function,default:void 0},onPointerCancel:{type:Function,default:void 0}},setup(e,{slots:t,attrs:r,expose:o}){let n=z(()=>e.src??""),a=z(()=>e.mtl?{mtlUrl:e.mtl}:void 0),i=xe(n,a.value),m=z(()=>e.src?i.polygons.value:e.polygons??[]),s=z(()=>e.autoCenter?Uo(m.value):m.value),l=!t.polygon,c=ot(),u=z(()=>e.textureLighting??c?.value.textureLighting??"baked"),y=z(()=>u.value==="dynamic"?void 0:c?.value.directionalLight),f=z(()=>u.value==="dynamic"?void 0:c?.value.ambientLight),g=z(()=>{if(u.value!=="dynamic")return null;let E=e.rotation;if(!E||E[0]===0&&E[1]===0&&E[2]===0)return null;let M=c?.value.directionalLight?.direction;if(!M)return null;let S=xt(M,E),w=Math.hypot(S[0],S[1],S[2])||1;return{"--plx":(S[0]/w).toFixed(4),"--ply":(S[1]/w).toFixed(4),"--plz":(S[2]/w).toFixed(4)}}),v=vt(e.rotation),b=z(()=>{if(!l)return[];let E=y.value,M=E&&v.value?{...E,direction:xt(E.direction,v.value)}:E;return s.value.map((S,w)=>Q(S,w,{directionalLight:M,ambientLight:f.value}))}),R=z(()=>e.atlasScale),H=ee(b,u,R),O=vt(null),d={get element(){return O.value},get id(){return e.id},getPosition:()=>e.position,getRotation:()=>e.rotation,getScale:()=>e.scale,getPolygons:()=>s.value,rebakeAtlas:()=>{v.value=e.rotation}};o(d),Io(()=>{O.value&&ht(O.value,d)}),_o(()=>{O.value&&Pt(O.value)});let C=ko($,null),p=null;function A(E,M,S){let w=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let D=document.elementsFromPoint(M,S),x=new Set;for(let T of D){let _=re(T);_&&!x.has(_)&&(x.add(_),w.push({object:_}))}}let L=0,h=0,k=C?.cameraElRef.value;if(k){let D=k.getBoundingClientRect();D.width>0&&D.height>0&&(L=(M-D.left)/D.width*2-1,h=-((S-D.top)/D.height*2-1))}let I=0;return p&&(I=Math.hypot(M-p.x,S-p.y)),{object:w[0]?.object??d,eventObject:d,intersections:w,pointer:{x:L,y:h},delta:I,nativeEvent:E,stopPropagation:()=>E.stopPropagation()}}function P(E,M,S,w){E&&E(A(M,S,w))}return()=>{let M={transform:$o(e.position,e.scale,e.rotation),...g.value??void 0,...r.style},S=Object.fromEntries(Object.entries(r).filter(([x])=>x!=="style"&&x!=="class")),w=`polycss-mesh${e.class?` ${e.class}`:""}`,L={};e.onClick&&(L.onClick=x=>{let T=x;P(e.onClick,T,T.clientX,T.clientY)}),e.onContextMenu&&(L.onContextmenu=x=>{let T=x;P(e.onContextMenu,T,T.clientX,T.clientY)}),e.onDoubleClick&&(L.onDblclick=x=>{let T=x;P(e.onDoubleClick,T,T.clientX,T.clientY)}),e.onWheel&&(L.onWheel=x=>{let T=x;P(e.onWheel,T,T.clientX,T.clientY)}),L.onPointerdown=x=>{let T=x;p={x:T.clientX,y:T.clientY},P(e.onPointerDown,T,T.clientX,T.clientY)},L.onPointerup=x=>{let T=x;P(e.onPointerUp,T,T.clientX,T.clientY),p=null},e.onPointerMove&&(L.onPointermove=x=>{let T=x;P(e.onPointerMove,T,T.clientX,T.clientY)}),(e.onPointerOver||e.onPointerEnter)&&(L.onPointerenter=x=>{let T=x;P(e.onPointerOver,T,T.clientX,T.clientY),P(e.onPointerEnter,T,T.clientX,T.clientY)}),(e.onPointerOut||e.onPointerLeave)&&(L.onPointerleave=x=>{let T=x;P(e.onPointerOut,T,T.clientX,T.clientY),P(e.onPointerLeave,T,T.clientX,T.clientY)}),e.onPointerCancel&&(L.onPointercancel=x=>{let T=x;P(e.onPointerCancel,T,T.clientX,T.clientY),p=null});let h=e.id?{"data-poly-mesh-id":e.id}:{};if(e.src&&i.loading.value&&i.polygons.value.length===0)return Ce("div",{ref:O,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:M,...h,...L,...S},t.fallback?.()??[]);if(e.src&&i.error.value&&i.polygons.value.length===0)return Ce("div",{ref:O,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:M,...h,...L,...S},t.error?.({error:i.error.value})??[]);let k=s.value,I=t.polygon?k.map((x,T)=>Ce("template",{key:T},t.polygon?.({polygon:x,index:T}))):H.entries.value.map((x,T)=>{if(x)return te({entry:x,page:H.pages.value[x.pageIndex],textureLighting:u.value});let _=b.value[T];return!_||_.texture?null:j(_)?oe({entry:_,textureLighting:u.value}):ne({entry:_})}),D=t.default?.()??[];return Ce("div",{ref:O,class:w,style:M,...h,...L,...S},[...I,...D])}}});import{computed as bt}from"vue";function Xo(e){return typeof e=="function"?bt(()=>{let{texture:t,key:r}=e();return{texture:t,key:r}}):bt(()=>({texture:e.texture,key:e.key}))}import{computed as ae,defineComponent as Yo,h as Ct}from"vue";function zo(e){if(e.length!==4)return null;let t=[...new Set(e.map(n=>n[0]))].sort((n,a)=>n-a),r=[...new Set(e.map(n=>n[1]))].sort((n,a)=>n-a);if(t.length!==2||r.length!==2)return null;let o=new Set([`${t[0]},${r[0]}`,`${t[0]},${r[1]}`,`${t[1]},${r[0]}`,`${t[1]},${r[1]}`]);for(let n of e)if(!o.has(`${n[0]},${n[1]}`))return null;return{u0:t[0],u1:t[1],v0:r[0],v1:r[1]}}function No({plan:e,material:t,uvRect:r,className:o,style:n,domAttrs:a,pointerEvents:i="auto"}){let{u0:m,u1:s,v0:l,v1:c}=r,u=s-m,y=c-l,f=e.canvasW/u,g=e.canvasH/y,v=Math.max(l,c),b=m*f,R=(1-v)*g,H={width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:`matrix3d(${e.matrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${f}px ${g}px`,backgroundPosition:`-${b}px -${R}px`,pointerEvents:i==="none"?"none":void 0,...n},O=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([C,p])=>[`data-${C}`,String(p)])):{},d=o?.trim()||void 0;return Ct("i",{class:d,style:H,...O,...a})}var Mt=Yo({name:"Poly",inheritAttrs:!1,props:{vertices:{type:Array,required:!0},color:{type:String},texture:{type:String},uvs:{type:Array,default:void 0},data:{type:Object,default:void 0},material:{type:Object,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},textureLighting:{type:String,default:void 0},atlasScale:{type:[Number,String],default:void 0},context:{type:Object,default:void 0},baseColor:{type:String},pointerEvents:{type:String,default:"auto"}},setup(e,{attrs:t}){let r=ae(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=ae(()=>e.atlasScale??e.context?.atlasScale),n=ae(()=>e.material?.texture??e.texture),a=ae(()=>e.material&&e.uvs?zo(e.uvs):null),i=ae(()=>{let l=e.context?.tileSize??50;return Q({vertices:e.vertices,color:e.baseColor??e.color,texture:n.value,uvs:e.uvs,data:e.data},0,{tileSize:l,layerElevation:e.context?.layerElevation??l,directionalLight:e.context?.directionalLight})}),m=ae(()=>a.value?[]:[i.value]),s=ee(m,r,o);return()=>{let l=i.value,c=s.entries.value[0],u=[];e.position&&u.push(`translate3d(${e.position[0]}px, ${e.position[1]}px, ${e.position[2]}px)`),e.scale!==void 0&&(typeof e.scale=="number"?e.scale!==1&&u.push(`scale3d(${e.scale}, ${e.scale}, ${e.scale})`):u.push(`scale3d(${e.scale[0]}, ${e.scale[1]}, ${e.scale[2]})`)),e.rotation&&(e.rotation[0]&&u.push(`rotateX(${e.rotation[0]}deg)`),e.rotation[1]&&u.push(`rotateY(${e.rotation[1]}deg)`),e.rotation[2]&&u.push(`rotateZ(${e.rotation[2]}deg)`));let y=u.length>0?u.join(" "):void 0,f={};if(e.data)for(let[R,H]of Object.entries(e.data))f[`data-${R}`]=String(H);let g={...t,...f},v=Object.fromEntries(Object.entries(g).filter(([R])=>R!=="class"&&R!=="style")),b;return a.value&&e.material&&l?b=No({plan:l,material:e.material,uvRect:a.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):c?b=te({entry:c,page:s.pages.value[c.pageIndex],textureLighting:r.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):l&&!l.texture&&(b=j(l)?oe({entry:l,textureLighting:r.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):ne({entry:l,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"})),b?y?Ct("div",{class:"polycss-poly-wrapper",style:{position:"absolute",transformStyle:"preserve-3d",transform:y}},[b]):b:null}}});import{defineComponent as Fo,inject as jo,onMounted as Bo,onBeforeUnmount as Wo,watch as Ve,ref as Zo}from"vue";import{BASE_TILE as At}from"@layoutit/polycss-core";var Go=150,Et=4,Ko=513e-6,qo=10,Jo=3,St=16.67,Qo=50,Tt=.1,Lt=10,wt=0,Rt=5e3,er=.3,tr=.05;function nr(e){return e===!0?-1:e===void 0||e===!1?1:e}function or(e,t,r,o,n){let a=nr(n),i=e/Et*a,m=t/Et*a;return{rotX:Math.max(0,Math.min(100,r-m)),rotY:((o-i)%360+360)%360}}function Ot(e,t,r,o,n){let a=Math.max(.01,r),i=Math.max(.1,Math.cos(o*Math.PI/180)),m=-e/(a*At),s=-t/(a*At*i),l=-n*Math.PI/180,c=Math.cos(l),u=Math.sin(l);return{dWorldX:s*c-m*u,dWorldY:s*u+m*c}}var Ht=Fo({name:"PolyOrbitControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:Tt},maxZoom:{type:Number,default:Lt},minDistance:{type:Number,default:wt},maxDistance:{type:Number,default:Rt},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let r=jo($,null);if(!r)return typeof console<"u"&&console.warn("[polycss] <PolyOrbitControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:n,cameraElRef:a,applyTransformDirect:i}=r,m=()=>({rotX:n.value.state.rotX,rotY:n.value.state.rotY,zoom:n.value.state.zoom,target:n.value.state.target,distance:n.value.state.distance}),s=()=>{t("change",m())},l=()=>{t("interaction-start",m())},c=()=>{t("interaction-end",m())},u=null,y={x:0,y:0},f=Zo(!1),g=null,v=null,b=null;function R(){let d=a.value;if(!d)return;let C=!1,p={x:0,y:0},A=h=>{if(e.drag&&u===null&&h.isPrimary!==!1){h.preventDefault(),u=h.pointerId,y={x:h.clientX,y:h.clientY},d.style.cursor="grabbing";try{h.target.setPointerCapture(h.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(f.value=!0),l()}},P=h=>{if(u===null||h.pointerId!==u||!e.drag)return;h.preventDefault();let k=h.clientX-y.x,I=h.clientY-y.y;y={x:h.clientX,y:h.clientY};let D=n.value,x=D.state;if(h.shiftKey){let{dWorldX:T,dWorldY:_}=Ot(k,I,x.zoom,x.rotX,x.rotY);D.update({target:[x.target[0]+T,x.target[1]+_,x.target[2]]})}else{let{rotX:T,rotY:_}=or(k,I,x.rotX,x.rotY,e.invert);D.update({rotX:T,rotY:_})}i(),o.updateCameraFromRef(D),s()},E=h=>{if(u===h.pointerId){u=null,d.style.cursor=e.drag?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}f.value=!1,c()}},M=h=>{h.preventDefault()},S=h=>{h.button===2&&(C=!0,p={x:h.clientX,y:h.clientY})},w=h=>{if(!C||!e.drag)return;let k=h.clientX-p.x,I=h.clientY-p.y;p={x:h.clientX,y:h.clientY};let D=n.value,x=D.state,{dWorldX:T,dWorldY:_}=Ot(k,I,x.zoom,x.rotX,x.rotY);D.update({target:[x.target[0]+T,x.target[1]+_,x.target[2]]}),i(),o.updateCameraFromRef(D),s()},L=h=>{h.button===2&&C&&(C=!1,c())};d.style.cursor="grab",d.style.touchAction="none",d.style.userSelect="none",d.addEventListener("pointerdown",A),d.addEventListener("pointermove",P),d.addEventListener("pointerup",E),d.addEventListener("pointercancel",E),d.addEventListener("contextmenu",M),d.addEventListener("mousedown",S),d.addEventListener("mousemove",w),d.addEventListener("mouseup",L),g=()=>{d.removeEventListener("pointerdown",A),d.removeEventListener("pointermove",P),d.removeEventListener("pointerup",E),d.removeEventListener("pointercancel",E),d.removeEventListener("contextmenu",M),d.removeEventListener("mousedown",S),d.removeEventListener("mousemove",w),d.removeEventListener("mouseup",L),d.style.cursor="",d.style.touchAction="",d.style.userSelect=""}}function H(){let d=a.value;if(!d)return;let C=!1,p=null,A=P=>{if(!e.wheel)return;P.preventDefault();let E=P.deltaMode===1?16:P.deltaMode===2?100:1,M=P.deltaY*E;P.ctrlKey?M*=qo:M*=Jo;let S=n.value;if(e.dolly){let w=e.minDistance??wt,L=e.maxDistance??Rt,h=Math.max(w,Math.min(L,S.state.distance+M*tr));S.update({distance:h})}else{let w=Math.exp(-M*Ko),L=e.minZoom??Tt,h=e.maxZoom??Lt,k=Math.max(L,Math.min(h,S.state.zoom*w));S.update({zoom:k})}i(),o.updateCameraFromRef(S),C||(C=!0,l()),s(),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,C=!1,c()},Go)};d.addEventListener("wheel",A,{passive:!1}),v=()=>{d.removeEventListener("wheel",A),p!==null&&clearTimeout(p)}}function O(){let d=null,C=!1,p=0,A=P=>{if(C)return;let E=e.animate;if(!E){d=requestAnimationFrame(A);return}if(f.value)p=P;else{let M=Math.min(Qo,p?P-p:St);p=P;let w=(E.speed??er)*(M/St),L=n.value,h=L.state;if(E.axis==="x"){let k=((h.rotX+w)%360+360)%360;L.update({rotX:k})}else{let k=((h.rotY+w)%360+360)%360;L.update({rotY:k})}i(),o.updateCameraFromRef(L),s()}d=requestAnimationFrame(A)};d=requestAnimationFrame(A),b=()=>{C=!0,d!==null&&cancelAnimationFrame(d),b=null}}return Bo(()=>{e.drag&&R(),e.wheel&&H(),e.animate&&O()}),Wo(()=>{g?.(),v?.(),b?.(),g=null,v=null}),Ve(()=>e.drag,d=>{d&&!g&&R(),!d&&g&&(g(),g=null)}),Ve(()=>e.wheel,d=>{d&&!v&&H(),!d&&v&&(v(),v=null)}),Ve(()=>!!e.animate,d=>{d&&!b&&O(),!d&&b&&b()}),()=>null}});import{defineComponent as rr,inject as ar,onMounted as lr,onBeforeUnmount as ir,watch as $e,ref as sr}from"vue";import{BASE_TILE as Dt}from"@layoutit/polycss-core";var cr=150,kt=4,ur=513e-6,mr=10,dr=3,It=16.67,fr=50,_t=.1,Vt=10,$t=0,Ut=5e3,yr=.3,pr=.05;function gr(e){return e===!0?-1:e===void 0||e===!1?1:e}function Xt(e,t,r,o,n){let a=gr(n),i=e/kt*a,m=t/kt*a;return{rotX:Math.max(0,Math.min(100,r-m)),rotY:((o-i)%360+360)%360}}function hr(e,t,r,o,n){let a=Math.max(.01,r),i=Math.max(.1,Math.cos(o*Math.PI/180)),m=-e/(a*Dt),s=-t/(a*Dt*i),l=-n*Math.PI/180,c=Math.cos(l),u=Math.sin(l);return{dWorldX:s*c-m*u,dWorldY:s*u+m*c}}var Yt=rr({name:"PolyMapControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:_t},maxZoom:{type:Number,default:Vt},minDistance:{type:Number,default:$t},maxDistance:{type:Number,default:Ut},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let r=ar($,null);if(!r)return typeof console<"u"&&console.warn("[polycss] <PolyMapControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:n,cameraElRef:a,applyTransformDirect:i}=r,m=()=>({rotX:n.value.state.rotX,rotY:n.value.state.rotY,zoom:n.value.state.zoom,target:n.value.state.target,distance:n.value.state.distance}),s=()=>{t("change",m())},l=()=>{t("interaction-start",m())},c=()=>{t("interaction-end",m())},u=null,y={x:0,y:0},f=sr(!1),g=null,v=null,b=null;function R(){let d=a.value;if(!d)return;let C=!1,p={x:0,y:0},A=h=>{if(e.drag&&u===null&&h.isPrimary!==!1){h.preventDefault(),u=h.pointerId,y={x:h.clientX,y:h.clientY},d.style.cursor="grabbing";try{h.target.setPointerCapture(h.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(f.value=!0),l()}},P=h=>{if(u===null||h.pointerId!==u||!e.drag)return;h.preventDefault();let k=h.clientX-y.x,I=h.clientY-y.y;y={x:h.clientX,y:h.clientY};let D=n.value,x=D.state;if(h.shiftKey){let{rotX:T,rotY:_}=Xt(k,I,x.rotX,x.rotY,e.invert);D.update({rotX:T,rotY:_})}else{let{dWorldX:T,dWorldY:_}=hr(k,I,x.zoom,x.rotX,x.rotY);D.update({target:[x.target[0]+T,x.target[1]+_,x.target[2]]})}i(),o.updateCameraFromRef(D),s()},E=h=>{if(u===h.pointerId){u=null,d.style.cursor=e.drag?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}f.value=!1,c()}},M=h=>{h.preventDefault()},S=h=>{h.button===2&&(C=!0,p={x:h.clientX,y:h.clientY})},w=h=>{if(!C||!e.drag)return;let k=h.clientX-p.x,I=h.clientY-p.y;p={x:h.clientX,y:h.clientY};let D=n.value,x=D.state,{rotX:T,rotY:_}=Xt(k,I,x.rotX,x.rotY,e.invert);D.update({rotX:T,rotY:_}),i(),o.updateCameraFromRef(D),s()},L=h=>{h.button===2&&C&&(C=!1,c())};d.style.cursor="grab",d.style.touchAction="none",d.style.userSelect="none",d.addEventListener("pointerdown",A),d.addEventListener("pointermove",P),d.addEventListener("pointerup",E),d.addEventListener("pointercancel",E),d.addEventListener("contextmenu",M),d.addEventListener("mousedown",S),d.addEventListener("mousemove",w),d.addEventListener("mouseup",L),g=()=>{d.removeEventListener("pointerdown",A),d.removeEventListener("pointermove",P),d.removeEventListener("pointerup",E),d.removeEventListener("pointercancel",E),d.removeEventListener("contextmenu",M),d.removeEventListener("mousedown",S),d.removeEventListener("mousemove",w),d.removeEventListener("mouseup",L),d.style.cursor="",d.style.touchAction="",d.style.userSelect=""}}function H(){let d=a.value;if(!d)return;let C=!1,p=null,A=P=>{if(!e.wheel)return;P.preventDefault();let E=P.deltaMode===1?16:P.deltaMode===2?100:1,M=P.deltaY*E;P.ctrlKey?M*=mr:M*=dr;let S=n.value;if(e.dolly){let w=e.minDistance??$t,L=e.maxDistance??Ut,h=Math.max(w,Math.min(L,S.state.distance+M*pr));S.update({distance:h})}else{let w=Math.exp(-M*ur),L=e.minZoom??_t,h=e.maxZoom??Vt,k=Math.max(L,Math.min(h,S.state.zoom*w));S.update({zoom:k})}i(),o.updateCameraFromRef(S),C||(C=!0,l()),s(),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,C=!1,c()},cr)};d.addEventListener("wheel",A,{passive:!1}),v=()=>{d.removeEventListener("wheel",A),p!==null&&clearTimeout(p)}}function O(){let d=null,C=!1,p=0,A=P=>{if(C)return;let E=e.animate;if(!E){d=requestAnimationFrame(A);return}if(f.value)p=P;else{let M=Math.min(fr,p?P-p:It);p=P;let w=(E.speed??yr)*(M/It),L=n.value,h=L.state;if(E.axis==="x"){let k=((h.rotX+w)%360+360)%360;L.update({rotX:k})}else{let k=((h.rotY+w)%360+360)%360;L.update({rotY:k})}i(),o.updateCameraFromRef(L),s()}d=requestAnimationFrame(A)};d=requestAnimationFrame(A),b=()=>{C=!0,d!==null&&cancelAnimationFrame(d),b=null}}return lr(()=>{e.drag&&R(),e.wheel&&H(),e.animate&&O()}),ir(()=>{g?.(),v?.(),b?.(),g=null,v=null}),$e(()=>e.drag,d=>{d&&!g&&R(),!d&&g&&(g(),g=null)}),$e(()=>e.wheel,d=>{d&&!v&&H(),!d&&v&&(v(),v=null)}),$e(()=>!!e.animate,d=>{d&&!b&&O(),!d&&b&&b()}),()=>null}});import{defineComponent as Pr,h as Ue,inject as vr,onBeforeUnmount as xr,onMounted as zt,ref as Me,computed as ce}from"vue";import{arrowPolygons as br,ringPolygons as Cr}from"@layoutit/polycss-core";var Xe="#ff3653",Ye="#8adb00",ze="#2c8fff",Mr=.6,Ar=.8,Er=1,Ne=50,Nt=60,Sr=.6,Tr=.0125,Lr=.15,wr=.04,Rr=1,Or=.012,Hr=64,Dr=1e-4,Ft={0:1,1:0,2:2},jt=[{cssAxis:0,sign:1,key:"x",color:Xe},{cssAxis:0,sign:-1,key:"-x",color:Xe},{cssAxis:1,sign:1,key:"y",color:Ye},{cssAxis:1,sign:-1,key:"-y",color:Ye},{cssAxis:2,sign:1,key:"z",color:ze},{cssAxis:2,sign:-1,key:"-z",color:ze}],Bt=[{cssAxis:0,key:"x",color:Xe},{cssAxis:1,key:"y",color:Ye},{cssAxis:2,key:"z",color:ze}];function Wt(e,t){let r=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);if(!r)return e;let o=parseInt(r[1],16),n=parseInt(r[2],16),a=parseInt(r[3],16);return`rgba(${o}, ${n}, ${a}, ${t})`}function Kt(e,t){return!t||t<=0?e:Math.round(e/t)*t}function kr(e){return e.replace("-","")[0]}function Ir(e){if(e.length===0)return Nt;let t=1/0,r=1/0,o=1/0,n=-1/0,a=-1/0,i=-1/0;for(let m of e)for(let s of m.vertices)s[0]<t&&(t=s[0]),s[0]>n&&(n=s[0]),s[1]<r&&(r=s[1]),s[1]>a&&(a=s[1]),s[2]<o&&(o=s[2]),s[2]>i&&(i=s[2]);return Number.isFinite(t)?Math.max(n-t,a-r,i-o)*Ne*Sr:Nt}function Zt(e){let t=e.shaftLengthCss,r=[0,0,0];r[e.cssAxis]=e.sign;let o=e.wrapper.ownerDocument.createElement("div");o.style.position="absolute",o.style.left="0",o.style.top="0",o.style.width="0",o.style.height="0",o.style.transform=`translate3d(${r[0]*t}px, ${r[1]*t}px, ${r[2]*t}px)`,e.wrapper.appendChild(o);let n=e.wrapper.getBoundingClientRect(),a=o.getBoundingClientRect();e.wrapper.removeChild(o);let i=(a.left-n.left)/t,m=(a.top-n.top)/t,s=i*i+m*m;if(s<Dr)return;let l=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let c=y=>{let f=y.clientX-e.startClientX,g=y.clientY-e.startClientY,v=(f*i+g*m)/s;v=Kt(v,e.translationSnap);let b=[l[0]+v*r[0],l[1]+v*r[1],l[2]+v*r[2]];e.onObjectChange?.({object:e.target,position:b}),e.onChange?.()},u=()=>{window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",u),window.removeEventListener("pointercancel",u);let y=f=>{f.stopPropagation(),f.stopImmediatePropagation()};window.addEventListener("click",y,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",y,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",c),window.addEventListener("pointerup",u),window.addEventListener("pointercancel",u)}function Gt(e){let t=e.wrapper.getBoundingClientRect(),r=t.left,o=t.top,n=Math.atan2(e.startClientY-o,e.startClientX-r),a=0,i=e.target.getRotation()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let m=l=>{let c=Math.atan2(l.clientY-o,l.clientX-r),u=c-n;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),a+=u,n=c;let y=a*180/Math.PI;y=Kt(y,e.rotationSnap);let f=[i[0],i[1],i[2]];f[e.cssAxis]=i[e.cssAxis]+y,e.onObjectChange?.({object:e.target,rotation:f}),e.onChange?.()},s=()=>{window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",s),window.removeEventListener("pointercancel",s);let l=c=>{c.stopPropagation(),c.stopImmediatePropagation()};window.addEventListener("click",l,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",l,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1),e.target.rebakeAtlas()};window.addEventListener("pointermove",m),window.addEventListener("pointerup",s),window.addEventListener("pointercancel",s)}function _r(e){return!!e&&typeof e=="object"&&"value"in e}function Vr(e){return e?_r(e)?e.value??null:e:null}var qt=Pr({name:"PolyTransformControls",props:{object:{type:null,default:null},mode:{type:String,default:"translate"},space:{type:String,default:"world"},size:{type:Number,default:1},showX:{type:Boolean,default:!0},showY:{type:Boolean,default:!0},showZ:{type:Boolean,default:!0},translationSnap:{type:Number,default:null},rotationSnap:{type:Number,default:null},enabled:{type:Boolean,default:!0}},emits:{change:()=>!0,objectChange:e=>!0,mouseDown:()=>!0,mouseUp:()=>!0,draggingChanged:e=>!0},setup(e,{emit:t}){let r=Me(null),o=Me(null),n=Me(new Map),a=ce(()=>Vr(e.object)),i=Me(0);zt(()=>{i.value++});let m=ce(()=>(i.value,Ir(a.value?.getPolygons()??[]))),s=ce(()=>m.value*e.size);function l(p){return o.value===p?Er:r.value===p?Ar:Mr}function c(){t("change")}function u(p){t("objectChange",p)}function y(p){t("draggingChanged",p)}function f(){t("mouseDown")}function g(){t("mouseUp")}let v=vr($,void 0),b=null;zt(()=>{let p=v?.cameraElRef.value;if(!p)return;let A=P=>{let E=a.value;if(!E||!e.enabled||P.target?.closest(".polycss-transform-gizmo"))return;let S={x:e.showX,y:e.showY,z:e.showZ},w=e.mode==="translate"?jt:Bt;for(let L of w){let h=L.key.replace("-","")[0];if(!S[h])continue;let k=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${L.key}`);if(!k||!be(k,P.clientX,P.clientY))continue;P.preventDefault(),P.stopPropagation();let I=k.closest("[data-poly-transform-controls]");if(!I)return;if(o.value=L.key,e.mode==="translate"){let D=L;Zt({cssAxis:D.cssAxis,sign:D.sign,shaftLengthCss:s.value,wrapper:I,target:E,startClientX:P.clientX,startClientY:P.clientY,translationSnap:e.translationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:x=>{x||(o.value=null),y(x)}})}else Gt({cssAxis:L.cssAxis,wrapper:I,target:E,startClientX:P.clientX,startClientY:P.clientY,rotationSnap:e.rotationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:D=>{D||(o.value=null),y(D)}});return}};p.addEventListener("pointerdown",A),b=()=>p.removeEventListener("pointerdown",A)}),xr(()=>{b?.()});let R=ce(()=>{if(e.mode!=="translate")return[];i.value;let A=s.value/Ne;return jt.filter(P=>({x:e.showX,y:e.showY,z:e.showZ})[kr(P.key)]).map(P=>{let E=l(P.key);return{spec:P,polygons:br({axis:Ft[P.cssAxis],sign:P.sign,shaftLength:A,shaftHalfThickness:A*Tr,headLength:A*Lr,headHalfThickness:A*wr,color:Wt(P.color,E)})}})}),H=ce(()=>{if(e.mode!=="rotate")return[];i.value;let A=s.value*Rr/Ne;return Bt.filter(P=>({x:e.showX,y:e.showY,z:e.showZ})[P.key]).map(P=>{let E=l(P.key);return{spec:P,polygons:Cr({axis:Ft[P.cssAxis],radius:A,halfThickness:A*Or,segments:Hr,color:Wt(P.color,E)})}})});function O(p){return A=>{if(!e.enabled)return;let P=a.value;if(!P)return;A.stopPropagation();let M=A.eventObject.element?.closest("[data-poly-transform-controls]");M&&(o.value=p.key,Zt({cssAxis:p.cssAxis,sign:p.sign,shaftLengthCss:s.value,wrapper:M,target:P,startClientX:A.nativeEvent.clientX,startClientY:A.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:S=>{S||(o.value=null),y(S)}}))}}function d(p){return A=>{if(!e.enabled)return;let P=a.value;if(!P)return;A.stopPropagation();let M=A.eventObject.element?.closest("[data-poly-transform-controls]");M&&(o.value=p.key,Gt({cssAxis:p.cssAxis,wrapper:M,target:P,startClientX:A.nativeEvent.clientX,startClientY:A.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:S=>{S||(o.value=null),y(S)}}))}}function C(p){return{onPointerOver:()=>{r.value=p},onPointerOut:()=>{r.value===p&&(r.value=null)}}}return()=>{let p=a.value;if(!p)return null;let A=p.getPosition()??[0,0,0],P={position:"absolute",transformStyle:"preserve-3d",transform:`translate3d(${A[0]}px, ${A[1]}px, ${A[2]}px)`,zIndex:1e3},E=e.mode==="translate"?R.value.map(({spec:M,polygons:S})=>Ue(N,{key:M.key,polygons:S,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${M.key}`,textureLighting:"baked",onPointerDown:O(M),...C(M.key)})):H.value.map(({spec:M,polygons:S})=>Ue(N,{key:M.key,polygons:S,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${M.key}`,textureLighting:"baked",onPointerDown:d(M),...C(M.key)}));return Ue("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:P},E)}}});import{defineComponent as $r,h as Ur,inject as Fe,onBeforeUnmount as Xr,onMounted as Yr,provide as zr,reactive as Nr,ref as Fr,computed as jr}from"vue";var ue=Symbol("polycss.selection"),Jt=$r({name:"PolySelect",props:{multiple:{type:Boolean,default:!1},clearOnMiss:{type:Boolean,default:!0},filter:{type:Function,default:void 0}},emits:{change:e=>!0,pointerMissed:e=>!0},setup(e,{emit:t,slots:r}){let o=Nr({selected:[]}),n=jr(()=>o.selected);function a(c){let u=e.filter?e.filter(c):c;o.selected=u,t("change",u)}let i={get selected(){return o.selected},set:c=>a(c),add:c=>{e.multiple?o.selected.includes(c)||a([...o.selected,c]):a([c])},remove:c=>{o.selected.includes(c)&&a(o.selected.filter(u=>u!==c))},toggle:c=>{o.selected.includes(c)?a(o.selected.filter(u=>u!==c)):e.multiple?a([...o.selected,c]):a([c])},clear:()=>a([]),has:c=>o.selected.includes(c)};zr(ue,{selected:n,api:i});let m=Fe($,void 0),s=(c,u)=>_e(c,u,y=>!y.closest("[data-poly-transform-controls]")),l=null;return Yr(()=>{let c=m?.cameraElRef.value;if(!c)return;let u=y=>{if(y.target?.closest("[data-poly-transform-controls]"))return;let g=re(y.target)??s(y.clientX,y.clientY);if(!g){t("pointerMissed",y),e.clearOnMiss&&a([]);return}e.multiple&&(y.shiftKey||y.metaKey||y.ctrlKey)?i.toggle(g):o.selected.length===1&&o.selected[0]===g?a([]):a([g])};c.addEventListener("click",u),l=()=>c.removeEventListener("click",u)}),Xr(()=>{l?.()}),()=>Ur("div",{style:{display:"contents"},"data-poly-select":""},r.default?.())}});function Qt(){let e=Fe(ue,void 0);return e?e.selected:Fr([])}function en(){let e=Fe(ue,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}import{defineComponent as Br,h as Wr,computed as Zr}from"vue";import{axesHelperPolygons as Gr}from"@layoutit/polycss-core";var tn=Br({name:"PolyAxesHelper",props:{size:{type:Number,default:void 0},thickness:{type:Number,default:void 0},negative:{type:Boolean,default:void 0},xColor:{type:String,default:void 0},yColor:{type:String,default:void 0},zColor:{type:String,default:void 0}},setup(e){let t=Zr(()=>Gr({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>Wr(N,{polygons:t.value})}});import{defineComponent as Kr,h as qr,computed as je}from"vue";import{octahedronPolygons as Jr}from"@layoutit/polycss-core";var Be=50,nn=Kr({name:"PolyDirectionalLightHelper",props:{light:{type:Object,required:!0},target:{type:Array,default:void 0},distance:{type:Number,default:5},size:{type:Number,default:.35},color:{type:String,default:void 0}},setup(e){let t=je(()=>e.color??e.light.color??"#ffd54a"),r=je(()=>Jr({center:[0,0,0],size:e.size,color:t.value})),o=je(()=>{let n=e.light.direction,a=n[0],i=n[1],m=n[2],s=Math.hypot(a,i,m)||1,l=e.target?.[0]??0,c=e.target?.[1]??0,u=e.target?.[2]??0,y=l+i/s*e.distance,f=c+a/s*e.distance,g=u+m/s*e.distance;return[f*Be,y*Be,g*Be]});return()=>qr(N,{polygons:r.value,position:o.value})}});import{ref as on,watch as Qr,onUnmounted as ea,computed as Ae}from"vue";import{createPolyAnimationMixer as ta}from"@layoutit/polycss-core";function B(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function na(e,t,r){let o=on(null),n=null,a=null,i=null,m=on(0);function s(){return r==null?o.value:B(r)??o.value}function l(){a!==null&&(cancelAnimationFrame(a),a=null),i=null}function c(){l(),n&&(n.stopAllAction(),n.uncacheRoot(),n=null,m.value++)}function u(){if(a!==null)return;function H(O){if(i===null){i=O,a=requestAnimationFrame(H);return}let d=(O-i)/1e3;i=O,n?.update(d),a=requestAnimationFrame(H)}a=requestAnimationFrame(H)}function y(){c();let H=B(e),O=B(t);if(!H||H.length===0||!O)return;let d=s();d&&(n=ta(d,O),m.value++,u())}let f=Qr(()=>{let H=B(e),O=B(t),d=r!=null?B(r):o.value;return{c:H,ctrl:O,r:d}},()=>y(),{immediate:!0,deep:!1});ea(()=>{f(),c()});let g=Ae(()=>B(e)??[]),v=Ae(()=>g.value.map(H=>H.name)),b=Ae(()=>(m.value,n)),R=Ae(()=>{m.value;let H=g.value,O={};for(let d of H)Object.defineProperty(O,d.name,{enumerable:!0,get(){if(!n)return null;try{return n.clipAction(d.name)}catch{return null}}});return O});return{ref:o,mixer:b,clips:g,names:v,actions:R}}import{normalizePolygons as Ai,mergePolygons as Ei,coverPlanarPolygons as Si,cullInteriorPolygons as Ti,parseObj as Li,parseMtl as wi,parseGltf as Ri,bakeSolidTextureSamples as Oi,bakeSolidTextureSampledPolygons as Hi,loadMesh as Di,createIsometricCamera as ki,parseVox as Ii,polygonFaces as _i,computeTexturePaintMetrics as Vi,computeShapeLighting as $i,parseColor as Ui,parsePureColor as Xi,parseHexColor as Yi,parseRgbColor as zi,formatColor as Ni,clampChannel as Fi,shadeColor as ji,rotateVec3 as Bi,inverseRotateVec3 as Wi,axesHelperPolygons as Zi,arrowPolygons as Gi,ringPolygons as Ki,octahedronPolygons as qi,buildSceneContext as Ji,computeSceneBbox as Qi,BASE_TILE as es,DEFAULT_CAMERA_STATE as ts,DEFAULT_PROJECTION as ns,normalizeInvertMultiplier as os,createPolyAnimationMixer as rs,LoopOnce as as,LoopRepeat as ls,LoopPingPong as is}from"@layoutit/polycss-core";export{es as BASE_TILE,ts as DEFAULT_CAMERA_STATE,ns as DEFAULT_PROJECTION,as as LoopOnce,is as LoopPingPong,ls as LoopRepeat,Mt as Poly,tn as PolyAxesHelper,le as PolyCamera,$ as PolyCameraContextKey,nn as PolyDirectionalLightHelper,Yt as PolyMapControls,N as PolyMesh,Ht as PolyOrbitControls,tt as PolyOrthographicCamera,le as PolyPerspectiveCamera,pt as PolyScene,Jt as PolySelect,ue as PolySelectionContextKey,qt as PolyTransformControls,Gi as arrowPolygons,Zi as axesHelperPolygons,Hi as bakeSolidTextureSampledPolygons,Oi as bakeSolidTextureSamples,Ji as buildSceneContext,Fi as clampChannel,Qi as computeSceneBbox,$i as computeShapeLighting,Vi as computeTexturePaintMetrics,Si as coverPlanarPolygons,ki as createIsometricCamera,rs as createPolyAnimationMixer,Ti as cullInteriorPolygons,_e as findMeshUnderPoint,re as findPolyMeshHandle,Ni as formatColor,ye as injectPolyBaseStyles,Wi as inverseRotateVec3,Di as loadMesh,Ei as mergePolygons,os as normalizeInvertMultiplier,Ai as normalizePolygons,qi as octahedronPolygons,Ui as parseColor,Ri as parseGltf,Yi as parseHexColor,wi as parseMtl,Li as parseObj,Xi as parsePureColor,zi as parseRgbColor,Ii as parseVox,be as pointInMeshElement,_i as polygonFaces,Ki as ringPolygons,Bi as rotateVec3,ji as shadeColor,na as usePolyAnimation,Z as usePolyCamera,Xo as usePolyMaterial,xe as usePolyMesh,fe as usePolySceneContext,Qt as usePolySelect,en as usePolySelectionApi};
|
|
211
|
+
|
|
212
|
+
/* \u2500\u2500 Cast shadows (dynamic mode only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
213
|
+
|
|
214
|
+
/* <q> \u2014 dedicated shadow leaf. Same border-shape rendering trick as <i>
|
|
215
|
+
(border-color: currentColor fills the polygon outline) but with its
|
|
216
|
+
own tag so we don't have to thread :not(.polycss-shadow) exclusions
|
|
217
|
+
through every dynamic-mode color rule. backface-visibility must be
|
|
218
|
+
visible because the projection matrix is near-rank-deficient and the
|
|
219
|
+
resulting plane's normal can read as back-facing under some camera
|
|
220
|
+
angles; the leaf is intentionally always painted. Strip the UA's
|
|
221
|
+
default ::before/::after open-/close-quote so the element is just a
|
|
222
|
+
styled box. */
|
|
223
|
+
.polycss-scene q {
|
|
224
|
+
position: absolute;
|
|
225
|
+
display: block;
|
|
226
|
+
transform-origin: 0 0;
|
|
227
|
+
transform-style: preserve-3d;
|
|
228
|
+
margin: 0;
|
|
229
|
+
padding: 0;
|
|
230
|
+
font: inherit;
|
|
231
|
+
font-weight: normal;
|
|
232
|
+
font-style: normal;
|
|
233
|
+
line-height: 0;
|
|
234
|
+
quotes: none;
|
|
235
|
+
text-decoration: none;
|
|
236
|
+
backface-visibility: visible;
|
|
237
|
+
border-color: currentColor;
|
|
238
|
+
pointer-events: none;
|
|
239
|
+
}
|
|
240
|
+
.polycss-scene q::before,
|
|
241
|
+
.polycss-scene q::after {
|
|
242
|
+
content: none;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/*
|
|
246
|
+
* Rotate rings: one square quad per ring, masked to a donut. The mask uses
|
|
247
|
+
* --ring-inner-ratio (set inline by PolyTransformControls); hit-testing
|
|
248
|
+
* matches the donut shape so the inner hole isn't clickable.
|
|
249
|
+
*/
|
|
250
|
+
.polycss-transform-ring i,
|
|
251
|
+
.polycss-transform-ring b,
|
|
252
|
+
.polycss-transform-ring s,
|
|
253
|
+
.polycss-transform-ring u {
|
|
254
|
+
--ring-inner-r: calc(var(--ring-inner-ratio, 0.92) * 50%);
|
|
255
|
+
--ring-outer-r: calc(var(--ring-outer-ratio, 1) * 50%);
|
|
256
|
+
-webkit-mask: radial-gradient(circle at 50% 50%,
|
|
257
|
+
transparent 0%,
|
|
258
|
+
transparent var(--ring-inner-r),
|
|
259
|
+
black var(--ring-inner-r),
|
|
260
|
+
black var(--ring-outer-r),
|
|
261
|
+
transparent var(--ring-outer-r));
|
|
262
|
+
mask: radial-gradient(circle at 50% 50%,
|
|
263
|
+
transparent 0%,
|
|
264
|
+
transparent var(--ring-inner-r),
|
|
265
|
+
black var(--ring-inner-r),
|
|
266
|
+
black var(--ring-outer-r),
|
|
267
|
+
transparent var(--ring-outer-r));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* Shadow projection matrix. Projects any 3D point P onto the horizontal
|
|
271
|
+
ground plane (cssZ \u2248 G) along the CSS-space light direction (--clx/y/z).
|
|
272
|
+
|
|
273
|
+
The strict projection would set m22=0 (output.z is a constant G, flat).
|
|
274
|
+
Chromium SKIPS rendering elements whose composed transform is singular.
|
|
275
|
+
m22=0 makes it singular, so the shadow paints nothing. Fix: collapse along
|
|
276
|
+
z by a near-zero scale (Z_SQUASH = 0.01) \u2014 output.z \u2248 G with ~1% drift,
|
|
277
|
+
full-rank and renderable. Sub-pixel drift for any realistic scene size. */
|
|
278
|
+
.polycss-scene[data-polycss-lighting="dynamic"] {
|
|
279
|
+
--shadow-proj: matrix3d(
|
|
280
|
+
1, 0, 0, 0,
|
|
281
|
+
0, 1, 0, 0,
|
|
282
|
+
calc(-1 * var(--clx) / var(--clz)),
|
|
283
|
+
calc(-1 * var(--cly) / var(--clz)),
|
|
284
|
+
0.01,
|
|
285
|
+
0,
|
|
286
|
+
calc(var(--shadow-ground-cssz) * var(--clx) / var(--clz)),
|
|
287
|
+
calc(var(--shadow-ground-cssz) * var(--cly) / var(--clz)),
|
|
288
|
+
calc(var(--shadow-ground-cssz) * 0.99),
|
|
289
|
+
1
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/* <q> shadow leaf \u2014 Lambert-gated opacity. Polygons facing the light cast
|
|
294
|
+
full shadow; polygons facing away cast zero shadow. The * 10 multiplier
|
|
295
|
+
sharpens the cutoff so small positive Lambert values jump quickly to 1,
|
|
296
|
+
giving a near-binary visibility decision with a smooth edge transition. */
|
|
297
|
+
.polycss-scene q {
|
|
298
|
+
opacity: clamp(0, calc((var(--pnx) * var(--clx) + var(--pny) * var(--cly) + var(--pnz) * var(--clz)) * 10), 1);
|
|
299
|
+
}
|
|
300
|
+
`;import{parsePureColor as Ss}from"@layoutit/polycss-core";import{inject as Ho}from"vue";var st=Symbol("polycss/scene-context");function Vt(){return Ho(st,null)}import{computed as te,h as Xe,onBeforeUnmount as Io,ref as Vo,watch as Fo}from"vue";import{parsePureColor as Kt}from"@layoutit/polycss-core";var zo=50,No=[.4,-.7,.59],jo="#ffffff",Yo=1,Uo="#ffffff",Xo=.4,he=4096,Ft=1,$o=.1,Bo=1,Gt=he*he,Wo=Gt*3,ut=2048,Zo=4*1024*1024,Ko=16*1024*1024,Go=.995,ne=.001,qo=.75,Qo=1,Jo=250,zt=1.5,qt=3,er=2,tr=4,dt=64,de=64,ae=64,nr=128,Nt=50,jt=1e-7,Yt=16,or=.05,rr=4,ar=.6,G=1e-9,ir=.6,pe=new Map;function sr(e){let t=pe.get(e);return t||(t=new Promise((n,o)=>{let r=new Image;r.decoding="async",r.onload=()=>n(r),r.onerror=()=>o(new Error(`texture load failed: ${e}`)),r.src=e}),pe.set(e,t),t.then(()=>{pe.get(e)===t&&pe.delete(e)},()=>{pe.get(e)===t&&pe.delete(e)})),t}function $e(e){let t=typeof e=="string"?Number(e):e;return t===void 0||!Number.isFinite(t)?1:Math.min(Bo,Math.max($o,t))}function Be(e,t){let n=e.toFixed(t).replace(/\.?0+$/,"");return Object.is(Number(n),-0)?"0":n}function Ne(e,t=tr){let n=Be(e,t);return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function mt(e,t=qt){return`matrix3d(${e.split(",").map(n=>{let o=Number(n.trim());return Number.isFinite(o)?Be(o,t):n.trim()}).join(",")})`}function Ye(e,t=er){let n=Be(e,t);return Number(n)===0?"0":`${n}%`}function lr(e,t,n,o,r,i){let s=(e-n)*(i-o)-(t-o)*(r-n);return Math.abs(s)>jt?!1:(e-n)*(e-r)+(t-o)*(t-i)<=jt}function cr(e,t=Nt,n=Nt){let o=!1;for(let r=0,i=e.length-1;r<e.length;i=r++){let[s,d]=e[r],[a,c]=e[i];if(lr(t,n,s,d,a,c))return!0;d>n!=c>n&&t<(a-s)*(n-d)/(c-d)+s&&(o=!o)}return o}function Qt(e){return e.reduce((t,n)=>t+n.width*n.height,0)}function ur(e,t){let n=Qt(e);if(n<=0)return 1;let o=Math.max(1,...e.map(s=>Math.max(s.width,s.height))),r=ut/o,i=Math.sqrt(t/(n*4));return $e(Math.min(r,i))}function Jt(e){if(!e)return!1;let n=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return n?n("(pointer: coarse)").matches||n("(hover: none)").matches:!1}function dr(e){return Jt(e)?Zo:Ko}function mr(e,t){return e!==void 0&&e!=="auto"||Jt(t)?ae:nr}function fr(e,t){let n=e.matrix.split(",").map(o=>Number(o));return n.length!==16||n.some(o=>!Number.isFinite(o))?e.canonicalMatrix:(n[0]*=e.canvasW/t,n[1]*=e.canvasW/t,n[2]*=e.canvasW/t,n[4]*=e.canvasH/t,n[5]*=e.canvasH/t,n[6]*=e.canvasH/t,n.join(","))}function Ut(e,t){for(let n of e.entries)n&&(n.atlasCanonicalSize=t,n.atlasMatrix=fr(n,t));return e}function yr(e,t){let n=Qt(e),o=.5;return n<=Gt?o=1:n<=Wo&&(o=.75),$e(Math.min(o,ur(e,t)))}function pr(e,t){return e.reduce((n,o)=>Math.max(n,Math.ceil(o.width*t),Math.ceil(o.height*t)),0)}function gr(e,t){return e.reduce((n,o)=>n+Math.ceil(o.width*t)*Math.ceil(o.height*t)*4,0)}function hr(e,t,n){let o=pr(e,t),r=gr(e,t),i=o>ut?ut/o:1,s=r>n?Math.sqrt(n/r):1;return Math.min(i,s)}function vr(e,t,n){let o=yr(t.pages,n),r=o===1?t:Ue(e,o);for(let i=0;i<4;i++){let s=hr(r.pages,o,n);if(s>=1)break;let d=$e(o*s*Go);if(d>=o)break;o=d,r=Ue(e,o)}return{packed:r,atlasScale:o}}function Pr(e,t,n){let o=mr(t,n);if(t!==void 0&&t!=="auto"){let s=$e(t);return{packed:Ut(Ue(e,s),o),atlasScale:s,atlasCanonicalSize:o}}let r=Ue(e,1),i=vr(e,r,dr(n));return{packed:Ut(i.packed,o),atlasScale:i.atlasScale,atlasCanonicalSize:o}}function br(e){return Math.max(Ft,Math.ceil(Ft/e))}function ie(e,t,n=1,o=0,r=0,i=1,s=0,d=0){e.setTransform(n*t,o*t,r*t,i*t,s*t,d*t)}function le(e){let t=Kt(e);return t?{r:t.rgb[0],g:t.rgb[1],b:t.rgb[2]}:{r:255,g:255,b:255}}function ft({r:e,g:t,b:n}){return`${e},${t},${n}`}function xr(e){return Kt(e)?.alpha??1}function Oe(e){if(e.screenPts.length!==8)return!1;let t=[],n=[],o=(r,i)=>{for(let s of r)if(Math.abs(s-i)<=ne)return;r.push(i)};for(let r=0;r<e.screenPts.length;r+=2)o(t,e.screenPts[r]),o(n,e.screenPts[r+1]);if(t.length!==2||n.length!==2||(t.sort((r,i)=>r-i),n.sort((r,i)=>r-i),Math.abs(t[0])>ne||Math.abs(n[0])>ne||t[1]-t[0]<=ne||n[1]-n[0]<=ne))return!1;for(let r=0;r<e.screenPts.length;r+=2){let i=e.screenPts[r],s=e.screenPts[r+1],d=Math.abs(i-t[0])<=ne||Math.abs(i-t[1])<=ne,a=Math.abs(s-n[0])<=ne||Math.abs(s-n[1])<=ne;if(!d||!a)return!1}return!0}function oe(e){return!e.texture&&e.polygon.vertices.length===3}function De(e){return!e.texture&&!!e.projectiveMatrix&&!Oe(e)}function yt(){if(!!!globalThis.CSS?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let t=globalThis.matchMedia;return typeof t!="function"?!0:t("(pointer: fine)").matches&&t("(hover: hover)").matches}function en(){let e=(typeof window<"u"?window.navigator:globalThis.navigator)?.userAgent??"";if(!e)return!0;let t=/\b(?:Chrome|HeadlessChrome|Chromium|Edg|OPR)\//.test(e);return!/\bVersion\/[\d.]+.*\bSafari\//.test(e)||t}function Xt(e,t){e.set(t,(e.get(t)??0)+1)}function $t(e){let t,n=1;for(let[o,r]of e)r>n&&(t=o,n=r);return t}var Cr=new Map([["transform",0],["border-shape",1],["border-width",2],["width",3],["height",4],["color",5]]);function Er(e){let t=e.getAttribute("style");if(!t)return;let o=t.split(";").map(r=>r.trim()).filter(Boolean).map((r,i)=>{let s=r.slice(0,r.indexOf(":")).trim().toLowerCase();return{declaration:r,index:i,order:Cr.get(s)??Number.POSITIVE_INFINITY}}).sort((r,i)=>r.order-i.order||r.index-i.index).map(({declaration:r})=>r).join(";");o!==t&&e.setAttribute("style",o)}function tn(e,t){let n=new Map,o=new Map,r=new Map,i=en(),s=t!=="dynamic"&&yt();for(let c of e)if(!(!c||c.texture)){if(t==="dynamic"){if(!(i&&oe(c))&&!Oe(c))continue;let l=le(c.polygon.color??"#cccccc"),m=ft(l);Xt(o,m),r.has(m)||r.set(m,l);continue}!(i&&oe(c))&&!Oe(c)&&!s||Xt(n,c.shadedColor)}let d=$t(n),a=$t(o);return{paintColor:d,dynamicColorKey:a,dynamicColor:a?r.get(a):void 0}}function Mr(e){let t=[],n=e.canvasW||1,o=e.canvasH||1;for(let r=0;r<e.screenPts.length;r+=2){let i=Math.max(0,Math.min(100,e.screenPts[r]/n*100)),s=Math.max(0,Math.min(100,e.screenPts[r+1]/o*100));t.push([i,s])}return t}function Ar([e,t]){return`${Ye(e)} ${Ye(t)}`}function Sr(e){return`polygon(${e.map(Ar).join(",")})`}function Tr(e){if(cr(e))return"circle(0)";let t=0,n=0,o=Math.max(1,e.length);for(let[s,d]of e)t+=s,n+=d;let r=Ye(Math.max(0,Math.min(100,t/o))),i=Ye(Math.max(0,Math.min(100,n/o)));return`circle(0 at ${r} ${i})`}function pt(e){let t=Mr(e);return`${Sr(t)} ${Tr(t)}`}function nn(e,t=qt){return e.map(n=>Be(n,t)).join(",")}function on(e,t,n){let o=e.matrix.split(",").map(r=>Number(r));return o.length!==16||o.some(r=>!Number.isFinite(r))?e.matrix:(o[0]*=t,o[1]*=t,o[2]*=t,o[4]*=n,o[5]*=n,o[6]*=n,nn(o))}function wr(e){return on(e,(e.canvasW||1)/Yt,(e.canvasH||1)/Yt)}function Lr(e){return on(e,(e.canvasW||1)/dt,(e.canvasH||1)/dt)}function rn(e){if(e.length<3)return!1;let t=0;for(let n=0;n<e.length;n++){let o=e[n],r=e[(n+1)%e.length],i=e[(n+2)%e.length],s=(r[0]-o[0])*(i[1]-r[1])-(r[1]-o[1])*(i[0]-r[0]);if(Math.abs(s)<=G)return!1;let d=Math.sign(s);if(t===0)t=d;else if(d!==t)return!1}return!0}function Rr(e){let t=0;for(let n=0;n<e.length;n++){let o=e[n],r=e[(n+1)%e.length];t+=o[0]*r[1]-o[1]*r[0]}return t/2}function Or(e,t,n,o){let r=t[0]-e[0],i=t[1]-e[1],s=o[0]-n[0],d=o[1]-n[1],a=r*d-i*s;if(Math.abs(a)<=G)return null;let c=n[0]-e[0],l=n[1]-e[1],m=(c*d-l*s)/a;return[e[0]+m*r,e[1]+m*i]}function an(e,t){if(e.length<6||e.length%2!==0||t<=0)return e;let n=[];for(let a=0;a<e.length;a+=2)n.push([e[a],e[a+1]]);if(!rn(n))return Re(e,t);let o=Rr(n);if(Math.abs(o)<=G)return Re(e,t);let r=o>0?1:-1,i=[];for(let a=0;a<n.length;a++){let c=n[a],l=n[(a+1)%n.length],m=l[0]-c[0],f=l[1]-c[1],y=Math.hypot(m,f);if(y<=G)return Re(e,t);let p=r*(f/y)*t,b=r*(-m/y)*t;i.push({a:[c[0]+p,c[1]+b],b:[l[0]+p,l[1]+b]})}let s=[],d=Math.max(2,t*4);for(let a=0;a<n.length;a++){let c=i[(a+n.length-1)%n.length],l=i[a],m=Or(c.a,c.b,l.a,l.b);if(!m)return Re(e,t);let f=n[a],y=m[0]-f[0],p=m[1]-f[1],b=Math.hypot(y,p);b>d?s.push(f[0]+y/b*d,f[1]+p/b*d):s.push(m[0],m[1])}return s}function Bt(e){if(e.length!==4||!rn(e))return null;let[t,n,o,r]=e,i=t[0]-n[0]+o[0]-r[0],s=t[1]-n[1]+o[1]-r[1],d=n[0]-o[0],a=r[0]-o[0],c=n[1]-o[1],l=r[1]-o[1],m=d*l-c*a;if(Math.abs(m)<=G)return null;let f=(i*l-s*a)/m,y=(d*s-c*i)/m,p=[1,1+f,1+f+y,1+y];if(p.some(E=>!Number.isFinite(E)||E<=or))return null;let b=Math.min(...p);return Math.max(...p)/b>rr?null:{g:f,h:y,w1:1+f,w3:1+y}}function Dr(e,t,n,o,r,i,s){if(e.length!==8)return null;let d=[[e[0],e[1]],[e[2],e[3]],[e[4],e[5]],[e[6],e[7]]];if(!Bt(d))return null;let a=an(e,ar),c=[[a[0],a[1]],[a[2],a[3]],[a[4],a[5]],[a[6],a[7]]],l=Bt(c);if(!l)return null;let{g:m,h:f,w1:y,w3:p}=l,[b,P,,E]=c,C=([H,M])=>[r+H*t[0]+M*n[0],i+H*t[1]+M*n[1],s+H*t[2]+M*n[2]],w=C(b),g=C(P),L=C(E),O=[g[0]*y-w[0],g[1]*y-w[1],g[2]*y-w[2]],N=[L[0]*p-w[0],L[1]*p-w[1],L[2]*p-w[2]],_=[O[0],O[1],O[2],m,N[0],N[1],N[2],f,o[0],o[1],o[2],0,w[0],w[1],w[2],1];for(let H=0;H<8;H+=1)_[H]/=dt;return _.join(",")}function kr(e,t,n){return e.map(o=>[o[1]*t,o[0]*t,o[2]*n])}function Wt(e){return`${e[0]},${e[1]},${e[2]}`}function _r(e,t){let n=Wt(e),o=Wt(t);return n<o?`${n}|${o}`:`${o}|${n}`}function We(e){let t=new Map;for(let o=0;o<e.length;o++){let r=e[o].vertices;if(!(!r||r.length<3||!e[o].texture))for(let i=0;i<r.length;i++){let s=_r(r[i],r[(i+1)%r.length]),d={polygon:o,edge:i},a=t.get(s);a?a.push(d):t.set(s,[d])}}let n=e.map(()=>new Set);for(let o of t.values())if(!(o.length<2))for(let r=0;r<o.length;r++)for(let i=r+1;i<o.length;i++)n[o[r].polygon].add(o[r].edge),n[o[i].polygon].add(o[i].edge);return n.map(o=>o.size>0?o:void 0)}function Hr(e){if(e.length<3)return null;let t=e[0],n=[0,0,0];for(let r=1;r+1<e.length;r++){let i=e[r],s=e[r+1],d=[i[0]-t[0],i[1]-t[1],i[2]-t[2]],a=[s[0]-t[0],s[1]-t[1],s[2]-t[2]];n[0]-=d[1]*a[2]-d[2]*a[1],n[1]-=d[2]*a[0]-d[0]*a[2],n[2]-=d[0]*a[1]-d[1]*a[0]}let o=Math.hypot(n[0],n[1],n[2]);return o<=G?null:[n[0]/o,n[1]/o,n[2]/o]}function lt(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function Ir(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function Vr(e,t,n,o){if(!oe(e))return null;let r=kr(e.polygon.vertices,e.tileSize,e.layerElevation),i=Hr(r);if(!i)return null;let s=[{a:0,b:1,c:2},{a:1,b:2,c:0},{a:2,b:0,c:1}].map(S=>{let U=r[S.a],B=r[S.b];return{...S,length:Math.hypot(B[0]-U[0],B[1]-U[1],B[2]-U[2])}}).sort((S,U)=>U.length-S.length),d=s[0].a,a=s[0].b,c=s[0].c,l=r[d],m=r[a],f=r[c],y=s[0].length;if(y<=G)return null;let p=[(m[0]-l[0])/y,(m[1]-l[1])/y,(m[2]-l[2])/y],b=[f[0]-l[0],f[1]-l[1],f[2]-l[2]],P=lt(b,p),E=[l[0]+p[0]*P,l[1]+p[1]*P,l[2]+p[2]*P],C=[E[0]-f[0],E[1]-f[1],E[2]-f[2]],w=Math.hypot(C[0],C[1],C[2]);if(w<=G)return null;let g=[C[0]/w,C[1]/w,C[2]/w];if(lt(Ir(p,g),i)<0){let S=a;if(a=d,d=S,l=r[d],m=r[a],y=Math.hypot(m[0]-l[0],m[1]-l[1],m[2]-l[2]),y<=G)return null;p=[(m[0]-l[0])/y,(m[1]-l[1])/y,(m[2]-l[2])/y];let U=[f[0]-l[0],f[1]-l[1],f[2]-l[2]];P=lt(U,p),E=[l[0]+p[0]*P,l[1]+p[1]*P,l[2]+p[2]*P],C=[E[0]-f[0],E[1]-f[1],E[2]-f[2]];let B=Math.hypot(C[0],C[1],C[2]);if(B<=G)return null;g=[C[0]/B,C[1]/B,C[2]/B]}let L=Math.max(0,Math.min(y,P)),O=Math.max(0,y-L),N=an([L,0,0,w,L+O,w],ir),_=[N[0],N[1]],H=[N[2],N[3]],M=[N[4],N[5]],D=(H[1]+M[1])/2,V=_[0]-H[0],I=M[0]-_[0],u=D-_[1];if(V<=G||I<=G||u<=G||!Number.isFinite(V+I+u))return null;let h=t==="dynamic",v=le(e.polygon.color??"#cccccc"),A=h&&ft(v)===o?.dynamicColorKey,x={color:h||e.shadedColor===o?.paintColor?void 0:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...h&&!A?{"--pnx":i[0].toFixed(4),"--pny":i[1].toFixed(4),"--pnz":i[2].toFixed(4),"--psr":(v.r/255).toFixed(4),"--psg":(v.g/255).toFixed(4),"--psb":(v.b/255).toFixed(4)}:h?{"--pnx":i[0].toFixed(4),"--pny":i[1].toFixed(4),"--pnz":i[2].toFixed(4)}:null},T=([S,U])=>[f[0]+(S-L)*p[0]+U*g[0],f[1]+(S-L)*p[1]+U*g[1],f[2]+(S-L)*p[2]+U*g[2]],j=T(_),R=T([H[0],D]),k=T([M[0],D]),Y=de/2,X=[(k[0]-R[0])/de,(k[1]-R[1])/de,(k[2]-R[2])/de],$=[j[0]-X[0]*Y,j[1]-X[1]*Y,j[2]-X[2]*Y],z=[(R[0]-$[0])/de,(R[1]-$[1])/de,(R[2]-$[2])/de];return{transform:`matrix3d(${nn([X[0],X[1],X[2],0,z[0],z[1],z[2],0,i[0],i[1],i[2],0,$[0],$[1],$[2],1])})`,...x}}function Fr({r:e,g:t,b:n}){let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`}function zr(e,t,n,o,r){let i=le(e),s=le(n),d=le(o),a=d.r/255*r+s.r/255*t,c=d.g/255*r+s.g/255*t,l=d.b/255*r+s.b/255*t,m=Math.max(0,Math.min(255,Math.round(i.r*a))),f=Math.max(0,Math.min(255,Math.round(i.g*c))),y=Math.max(0,Math.min(255,Math.round(i.b*l))),p=xr(e);return p<1?`rgba(${m}, ${f}, ${y}, ${p})`:Fr({r:m,g:f,b:y})}function Nr(e,t,n,o){let r=le(t),i=le(n);return{r:i.r/255*o+r.r/255*e,g:i.g/255*o+r.g/255*e,b:i.b/255*o+r.b/255*e}}function jr({r:e,g:t,b:n}){let o=r=>Math.round(Math.max(0,Math.min(1,r))*255);return`rgb(${o(e)} ${o(t)} ${o(n)})`}function Yr(e,t,n,o,r,i,s){Math.abs(i.r-1)<.001&&Math.abs(i.g-1)<.001&&Math.abs(i.b-1)<.001||(e.save(),ie(e,s),e.globalCompositeOperation="multiply",e.fillStyle=jr(i),e.fillRect(t,n,o,r),e.restore())}function Ur(e,t,n,o,r,i,s){let d=t.naturalWidth||t.width||1,a=t.naturalHeight||t.height||1,c=Math.max(r/d,i/a),l=d*c,m=a*c;ie(e,s),e.drawImage(t,n+(r-l)/2,o+(i-m)/2,l,m)}function sn(e,t){if(e.length<3||t.length<3)return null;let[n,o,r]=e,[i,s,d]=t,a=n[0],c=n[1],l=o[0],m=o[1],f=r[0],y=r[1],p=i[0],b=1-i[1],P=s[0],E=1-s[1],C=d[0],w=1-d[1],g=P-p,L=E-b,O=C-p,N=w-b,_=g*N-O*L;if(Math.abs(_)<=1e-9)return null;let H=l-a,M=f-a,D=m-c,V=y-c,I={a:(H*N-M*L)/_,b:(g*M-O*H)/_,c:(D*N-V*L)/_,d:(g*V-O*D)/_,e:0,f:0};return I.e=a-I.a*p-I.b*b,I.f=c-I.c*p-I.d*b,I}function ln(e){if(e.length===0)return null;let t=1/0,n=1/0,o=-1/0,r=-1/0;for(let i of e){let s=i[0],d=1-i[1];if(!Number.isFinite(s)||!Number.isFinite(d))return null;t=Math.min(t,s),o=Math.max(o,s),n=Math.min(n,d),r=Math.max(r,d)}return{minU:t,minV:n,maxU:o,maxV:r}}function Xr(e,t,n,o,r,i,s,d){let a=e.vertices.map(m=>{let f=[m[1]*t,m[0]*t,m[2]*n],y=f[0]-o[0],p=f[1]-o[1],b=f[2]-o[2];return[y*r[0]+p*r[1]+b*r[2]+s,y*i[0]+p*i[1]+b*i[2]+d]}),c=sn(a,e.uvs),l=ln(e.uvs);return!c&&!l?null:{screenPts:a.flatMap(([m,f])=>[m,f]),uvAffine:c,uvSampleRect:l}}function Re(e,t){if(e.length<6||t<=0)return e;let n=0,o=0,r=e.length/2;for(let s=0;s<e.length;s+=2)n+=e[s],o+=e[s+1];n/=r,o/=r;let i=e.slice();for(let s=0;s<i.length;s+=2){let d=i[s]-n,a=i[s+1]-o,c=Math.hypot(d,a);c<=ne||(i[s]+=d/c*t,i[s+1]+=a/c*t)}return i}function ct(e,t,n,o){for(let r=0;r<o.length;r+=2){let i=t+o[r],s=n+o[r+1];r===0?e.moveTo(i,s):e.lineTo(i,s)}e.closePath()}function ge(e,t){return Math.max(0,Math.min(t,e))}function Zt(e,t,n,o,r,i,s,d){let a=t.naturalWidth||t.width||1,c=t.naturalHeight||t.height||1,l=ge(Math.min(n.minU,n.maxU)*a,a),m=ge(Math.max(n.minU,n.maxU)*a,a),f=ge(Math.min(n.minV,n.maxV)*c,c),y=ge(Math.max(n.minV,n.maxV)*c,c),p=Math.floor(l),b=Math.floor(f),P=Math.ceil(m)-p,E=Math.ceil(y)-b;P<1&&(p=Math.floor(ge((n.minU+n.maxU)/2*a,a-1)),P=1),E<1&&(b=Math.floor(ge((n.minV+n.maxV)/2*c,c-1)),E=1),p=Math.max(0,Math.min(a-1,p)),b=Math.max(0,Math.min(c-1,b)),P=Math.max(1,Math.min(a-p,P)),E=Math.max(1,Math.min(c-b,E)),ie(e,d),e.drawImage(t,p,b,P,E,o,r,i,s)}function $r(e,t,n,o,r,i){for(let s=0;s<o.length;s+=2){let d=t+o[s]+r,a=n+o[s+1]+i;s===0?e.moveTo(d,a):e.lineTo(d,a)}e.closePath()}function Br(e,t,n,o,r=0,i=0){if(t.textureTriangles?.length){let s=n.naturalWidth||n.width||1,d=n.naturalHeight||n.height||1;for(let a of t.textureTriangles){let c=Re(a.screenPts,qo);e.save(),ie(e,o),e.beginPath(),$r(e,t.x,t.y,c,r,i),e.clip(),a.uvAffine?(ie(e,o,a.uvAffine.a/s,a.uvAffine.c/s,a.uvAffine.b/d,a.uvAffine.d/d,t.x+a.uvAffine.e+r,t.y+a.uvAffine.f+i),e.drawImage(n,0,0)):a.uvSampleRect&&Zt(e,n,a.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o),e.restore()}}else if(t.uvAffine){let s=n.naturalWidth||n.width||1,d=n.naturalHeight||n.height||1;ie(e,o,t.uvAffine.a/s,t.uvAffine.c/s,t.uvAffine.b/d,t.uvAffine.d/d,t.x+t.uvAffine.e+r,t.y+t.uvAffine.f+i),e.drawImage(n,0,0)}else t.uvSampleRect?Zt(e,n,t.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o):Ur(e,n,t.x+r,t.y+i,t.canvasW,t.canvasH,o)}function Wr(e,t,n,o,r,i){let s=r-n,d=i-o,a=s*s+d*d;if(a<=G)return Math.hypot(e-n,t-o);let c=Math.max(0,Math.min(1,((e-n)*s+(t-o)*d)/a));return Math.hypot(e-(n+s*c),t-(o+d*c))}function Zr(e,t,n,o){let r=1/0,i=n.length/2;for(let s of o){if(s<0||s>=i)continue;let d=s*2,a=(s+1)%i*2;r=Math.min(r,Wr(e,t,n[d],n[d+1],n[a],n[a+1]))}return r}function Kr(e,t,n,o,r,i){let s=Math.max(0,o-i),d=Math.min(t-1,o+i),a=Math.max(0,r-i),c=Math.min(n-1,r+i),l=null,m=1/0;for(let f=a;f<=c;f++)for(let y=s;y<=d;y++){if(y===o&&f===r)continue;let p=y-o,b=f-r,P=p*p+b*b;if(P>i*i||P>=m)continue;let E=(f*t+y)*4;e[E+3]<Jo||(l=E,m=P)}return l}function Gr(e,t,n){if(!t.textureEdgeRepair||!t.texture||!t.textureEdgeRepairEdges||t.textureEdgeRepairEdges.size===0)return;let o=e.canvas;if(!o)return;let r=Math.max(0,Math.floor(t.x*n)),i=Math.max(0,Math.floor(t.y*n)),s=Math.max(1,Math.min(o.width-r,Math.ceil(t.canvasW*n))),d=Math.max(1,Math.min(o.height-i,Math.ceil(t.canvasH*n)));if(s<=0||d<=0)return;let a;try{a=e.getImageData(r,i,s,d)}catch{return}let c=a.data,l=new Uint8ClampedArray(c),m=Math.max(zt,zt/n),f=Math.max(2,Math.ceil(m*n)+1),y=!1;for(let p=0;p<d;p++)for(let b=0;b<s;b++){let P=(p*s+b)*4,E=c[P+3];if(E<Qo||E===255)continue;let C=(r+b+.5)/n-t.x,w=(i+p+.5)/n-t.y;if(Zr(C,w,t.screenPts,t.textureEdgeRepairEdges)>m)continue;let g=Kr(l,s,d,b,p,f);g!==null&&(c[P]=l[g],c[P+1]=l[g+1],c[P+2]=l[g+2],c[P+3]=255,y=!0)}y&&e.putImageData(a,r,i)}function qr(e){if(typeof e.toBlob=="function")return new Promise(t=>{e.toBlob(n=>{t(n?URL.createObjectURL(n):null)},"image/png")});try{return Promise.resolve(e.toDataURL("image/png"))}catch{return Promise.resolve(null)}}function ve(e,t,n={}){let{vertices:o,texture:r,uvs:i}=e;if(!o||o.length<3)return null;let s=n.tileSize??zo,d=n.layerElevation??s,a=Z=>[Z[1]*s,Z[0]*s,Z[2]*d],c=o.map(a),l=c[0],m=c[1],f=c[2],y=[m[0]-l[0],m[1]-l[1],m[2]-l[2]],p=[f[0]-l[0],f[1]-l[1],f[2]-l[2]],b=Math.hypot(y[0],y[1],y[2]);if(b===0)return null;let P=[y[0]/b,y[1]/b,y[2]/b],E=-(y[1]*p[2]-y[2]*p[1]),C=-(y[2]*p[0]-y[0]*p[2]),w=-(y[0]*p[1]-y[1]*p[0]),g=Math.hypot(E,C,w);if(g===0)return null;E/=g,C/=g,w/=g;let L=[C*P[2]-w*P[1],w*P[0]-E*P[2],E*P[1]-C*P[0]],O=c.map(Z=>{let J=Z[0]-l[0],Ve=Z[1]-l[1],_t=Z[2]-l[2];return[J*P[0]+Ve*P[1]+_t*P[2],J*L[0]+Ve*L[1]+_t*L[2]]}),N=1/0,_=1/0,H=-1/0,M=-1/0;for(let[Z,J]of O)Z<N&&(N=Z),Z>H&&(H=Z),J<_&&(_=J),J>M&&(M=J);let D=H-N,V=M-_;if(!Number.isFinite(D)||!Number.isFinite(V))return null;let I=r&&n.textureEdgeRepairEdges?.size?n.textureEdgeRepairEdges:null,u=!!(r&&I),h=-N,v=-_,A=[];for(let Z=0;Z<O.length;Z++){let[J,Ve]=O[Z];A.push(J+h,Ve+v)}let x=Math.max(1,Math.ceil(D)),T=Math.max(1,Math.ceil(V)),j=l[0]-h*P[0]-v*L[0],R=l[1]-h*P[1]-v*L[1],k=l[2]-h*P[2]-v*L[2],Y=[P[0],P[1],P[2],0,L[0],L[1],L[2],0,E,C,w,0,j,R,k,1].join(","),X=[P[0]*x,P[1]*x,P[2]*x,0,L[0]*T,L[1]*T,L[2]*T,0,E,C,w,0,j,R,k,1].join(","),$=[P[0]*x/ae,P[1]*x/ae,P[2]*x/ae,0,L[0]*T/ae,L[1]*T/ae,L[2]*T/ae,0,E,C,w,0,j,R,k,1].join(","),z=[E,C,w],F=!r&&o.length===4?Dr(A,P,L,z,j,R,k):null,S=n.directionalLight,U=n.ambientLight,B=S?.direction??No,re=S?.color??jo,ce=Math.max(0,S?.intensity??Yo),se=U?.color??Uo,W=Math.max(0,U?.intensity??Xo),ue=Math.hypot(B[0],B[1],B[2])||1,we=B[0]/ue,rt=B[1]/ue,yo=B[2]/ue,Ot=ce*Math.max(0,E*we+C*rt+w*yo),po=Nr(Ot,re,se,W),go=zr(e.color??"#cccccc",Ot,re,se,W),Dt=null,kt=null;r&&i&&i.length>=3&&i.length===o.length&&(kt=ln(i),Dt=sn(O.map(([Z,J])=>[Z+h,J+v]),i));let ho=r&&e.textureTriangles?.length?e.textureTriangles.map(Z=>Xr(Z,s,d,l,P,L,h,v)).filter(Z=>!!Z):null;return{index:t,polygon:e,texture:r,tileSize:s,layerElevation:d,matrix:Y,canonicalMatrix:X,atlasMatrix:$,projectiveMatrix:F,canvasW:x,canvasH:T,screenPts:A,uvAffine:Dt,uvSampleRect:kt,textureTriangles:ho,textureEdgeRepairEdges:I,textureEdgeRepair:u,normal:z,textureTint:po,shadedColor:go}}function Ue(e,t=1){let n=Array(e.length).fill(null),o=[],r=br(t),i=e.filter(a=>!!a).sort((a,c)=>c.canvasH-a.canvasH||c.canvasW-a.canvasW||a.index-c.index),s=()=>({width:r,height:r,entries:[],shelves:[]}),d=(a,c,l)=>{if(a.sealed)return null;for(let y of a.shelves)if(c.canvasH<=y.height&&y.x+c.canvasW+r<=he){let p={...c,pageIndex:l,x:y.x,y:y.y};return y.x+=c.canvasW+r,a.entries.push(p),a.width=Math.max(a.width,p.x+c.canvasW+r),p}let m=a.shelves.length===0?r:a.height;if(m+c.canvasH+r>he)return null;let f={...c,pageIndex:l,x:r,y:m};return a.shelves.push({x:r+c.canvasW+r,y:m,height:c.canvasH}),a.entries.push(f),a.width=Math.max(a.width,f.x+c.canvasW+r),a.height=Math.max(a.height,m+c.canvasH+r),f};for(let a of i){if(a.canvasW+r*2>he||a.canvasH+r*2>he){let m=o.length,f={...a,pageIndex:m,x:r,y:r};n[a.index]=f,o.push({width:a.canvasW+r*2,height:a.canvasH+r*2,entries:[f],shelves:[],sealed:!0});continue}let l=null;for(let m=0;m<o.length&&(l=d(o[m],a,m),!l);m++);if(!l){let m=s(),f=o.length;o.push(m),l=d(m,a,f)}l&&(n[a.index]=l)}return{entries:n,pages:o.map(({width:a,height:c,entries:l})=>({width:a,height:c,entries:l}))}}async function Qr(e,t,n,o){let r=n.createElement("canvas");r.width=Math.max(1,Math.ceil(e.width*o)),r.height=Math.max(1,Math.ceil(e.height*o));let i=e.entries.some(l=>l.textureEdgeRepair&&l.texture&&l.textureEdgeRepairEdges&&l.textureEdgeRepairEdges.size>0),s=r.getContext("2d",i?{willReadFrequently:!0}:void 0);if(!s)return{width:e.width,height:e.height,url:null};let d=Array.from(new Set(e.entries.flatMap(l=>l.texture?[l.texture]:[]))),a=new Map;await Promise.all(d.map(async l=>{a.set(l,await sr(l))}));for(let l of e.entries){let m=l.texture?a.get(l.texture):null;if(!l.texture){s.save(),ie(s,o),s.beginPath(),ct(s,l.x,l.y,l.screenPts),s.clip(),s.fillStyle=t==="dynamic"?l.polygon.color??"#cccccc":l.shadedColor,s.fillRect(l.x,l.y,l.canvasW,l.canvasH),s.restore();continue}m&&(s.save(),ie(s,o),s.beginPath(),ct(s,l.x,l.y,l.screenPts),s.clip(),Br(s,l,m,o),s.restore()),l.texture&&t==="baked"&&(s.save(),ie(s,o),s.beginPath(),ct(s,l.x,l.y,l.screenPts),s.clip(),Yr(s,l.x,l.y,l.canvasW,l.canvasH,l.textureTint,o),s.restore()),Gr(s,l,o)}let c=await qr(r);return r.width=1,r.height=1,{width:e.width,height:e.height,url:c}}async function Jr(e,t,n,o,r){let i=[];for(let s of e){if(r())break;i.push(await Qr(s,t,n,o))}return i}function je(e){for(let t of e)URL.revokeObjectURL(t)}function Pe(e,t,n=te(()=>{}),o=te(()=>{})){let r=te(()=>new Set(o.value?.disable??[])),i=te(()=>!r.value.has("b")),s=te(()=>i.value),d=te(()=>!r.value.has("u")&&en()),a=te(()=>!r.value.has("i")&&t.value!=="dynamic"&&yt()),c=te(()=>{let f=e.value.map(y=>!y||y.texture?y:d.value&&oe(y)||i.value&&Oe(y)||s.value&&De(y)||t.value!=="dynamic"&&a.value?null:y);return Pr(f,n.value,typeof document<"u"?document:null)}),l=Vo(c.value.packed.pages.map(f=>({width:f.width,height:f.height,url:null}))),m=[];return Fo(()=>[c.value,t.value],([f,y],p,b)=>{let{packed:P,atlasScale:E}=f,C=!1;je(m),m=[],l.value=P.pages.map(w=>({width:w.width,height:w.height,url:null})),b(()=>{C=!0,je(m),m=[]}),!(P.pages.length===0||typeof document>"u")&&Jr(P.pages,y,document,E,()=>C).then(w=>{if(C){je(w.flatMap(g=>g.url?.startsWith("blob:")?[g.url]:[]));return}m=w.flatMap(g=>g.url?.startsWith("blob:")?[g.url]:[]),l.value=w}).catch(()=>{C||(l.value=P.pages.map(w=>({width:w.width,height:w.height,url:null})))})},{immediate:!0}),Io(()=>{je(m),m=[]}),{entries:te(()=>c.value.packed.entries),pages:l,ready:te(()=>l.value.length===0||l.value.every(f=>!!f.url)),useFullRectSolid:i,useProjectiveQuad:s,useStableTriangle:d,useBorderShape:a}}function be({entry:e,page:t,textureLighting:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=n==="dynamic",a=e.atlasCanonicalSize??ae,c=e.canvasW||1,l=e.canvasH||1,m=t?`${Ne(-e.x/c*a)} ${Ne(-e.y/l*a)}`:void 0,f=t?`${Ne(t.width/c*a)} ${Ne(t.height/l*a)}`:void 0,y=d&&t?.url?`url(${t.url})`:void 0,p=!d&&t?.url?`url(${t.url}) ${m} / ${f} no-repeat`:void 0,b={transform:mt(e.atlasMatrix),"--polycss-atlas-size":`${a}px`,background:p,backgroundImage:d&&t?.url?`url(${t.url})`:void 0,backgroundPosition:d?m:void 0,backgroundSize:d?f:void 0,...d?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...d&&y?{maskImage:y,maskMode:"alpha",maskPosition:m,maskSize:f,maskRepeat:"no-repeat",WebkitMaskImage:y,WebkitMaskPosition:m,WebkitMaskSize:f,WebkitMaskRepeat:"no-repeat"}:null,opacity:t?.url?void 0:0,pointerEvents:s==="none"?"none":void 0,...r},P=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([C,w])=>[`data-${C}`,String(w)])):{},E=o?.trim()||void 0;return Xe("s",{class:E,style:b,...P,...i})}function xe({entry:e,solidPaintDefaults:t,className:n,style:o,domAttrs:r,pointerEvents:i="auto",forceBorderShape:s=!1}){let d=Oe(e),a=d&&s&&yt(),c=!d||a?pt(e):null,l=e.shadedColor===t?.paintColor,m=mt(c?wr(e):Lr(e)),f=d?{transform:m,color:l?void 0:e.shadedColor,pointerEvents:i==="none"?"none":void 0,...o}:{transform:m,color:l?void 0:e.shadedColor,pointerEvents:i==="none"?"none":void 0,...o},y=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([P,E])=>[`data-${P}`,String(E)])):{},p=n?.trim()||void 0,b=P=>{let E=P.el;E&&(c?E.style.setProperty("border-shape",c):E.style.removeProperty("border-shape"),Er(E))};return Xe(d&&!a?"b":"i",{class:p,style:f,...y,...r,onVnodeMounted:b,onVnodeUpdated:b})}function Ze({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=t==="dynamic",a=le(e.polygon.color??"#cccccc"),c=d&&ft(a)===n?.dynamicColorKey,l={transform:mt(e.projectiveMatrix),color:d||e.shadedColor===n?.paintColor?void 0:e.shadedColor,pointerEvents:s==="none"?"none":void 0,...d&&!c?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4),"--psr":(a.r/255).toFixed(4),"--psg":(a.g/255).toFixed(4),"--psb":(a.b/255).toFixed(4)}:d?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...r},m=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([y,p])=>[`data-${y}`,String(p)])):{},f=o?.trim()||void 0;return Xe("b",{class:f,style:l,...m,...i})}function Ce({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=Vr(e,t,s,n);if(!d)return null;let a=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([l,m])=>[`data-${l}`,String(m)])):{},c=o?.trim()||void 0;return Xe("u",{class:c,style:{...d,...r},...a,...i})}var fn=ea({name:"PolyScene",inheritAttrs:!1,props:{polygons:{type:Array,default:void 0},perspective:{type:Number},rotX:{type:Number},rotY:{type:Number},zoom:{type:Number},directionalLight:{type:Object,default:void 0},ambientLight:{type:Object,default:void 0},textureLighting:{type:String,default:"baked"},textureQuality:{type:[Number,String],default:void 0},strategies:{type:Object,default:void 0},autoCenter:{type:Boolean,default:!1},shadow:{type:Object,default:void 0},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},debugShowLabels:{type:Boolean},debugShowBackfaces:{type:Boolean}},setup(e,{slots:t,attrs:n}){let o=na(K);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{store:r,sceneElRef:i}=o,s=cn(0),d=new Map,a={register(M,D){d.set(M,D),s.value++},unregister(M){d.delete(M),s.value++},version:s,getEntries(){return Array.from(d.values())}},c=ee(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight,shadow:e.shadow,shadowRegistry:a}));oa(st,c);let l=r.getState().cameraState,m=cn(null);un(m,M=>{i.value=M});let f=!1;ra(()=>{f||typeof document<"u"&&(ze(document),f=!0)}),un(()=>e.debugShowBackfaces,M=>{let D=m.value;D&&D.classList.toggle("polycss-debug-show-backfaces",!!M)});let y=ee(()=>e.polygons??[]),p=ee(()=>({directionalLight:e.directionalLight})),b=Fe(y,p),P=ee(()=>{let M=l,D=o.autoCenterOffset.value,V=ia,I=M.target[0]+D[0],u=M.target[1]+D[1],h=M.target[2]+D[2],v=u*V,A=I*V,x=h*V;return{transform:`${M.distance!==0?`translateZ(${-M.distance}px) `:""}scale(${M.zoom}) rotateX(${M.rotX}deg) rotate(${M.rotY}deg) translate3d(${-v}px, ${-A}px, ${-x}px)`}}),E=ee(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,textureQuality:e.textureQuality})),C=ee(()=>{let M=e.textureLighting==="dynamic",D=M?void 0:e.directionalLight,V=M?void 0:e.ambientLight,I=We(b.value.polygons);return b.value.polygons.map((u,h)=>ve(u,h,{tileSize:E.value.tileSize,layerElevation:E.value.layerElevation,directionalLight:D,ambientLight:V,textureEdgeRepairEdges:I[h]}))}),w=ee(()=>e.textureLighting??"baked"),g=ee(()=>e.textureQuality),L=ee(()=>e.strategies),O=Pe(C,w,g,L),N=ee(()=>{if(e.textureLighting!=="dynamic")return null;let M=e.directionalLight?.direction??[.4,-.7,.59],D=Math.hypot(M[0],M[1],M[2])||1,V=M[0]/D,I=M[1]/D,u=M[2]/D,h=mn(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],v=mn(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],A=e.directionalLight?.intensity??1,x=e.ambientLight?.intensity??.4,T=k=>(k/255).toFixed(4),j=u,R=Math.sign(j||1)*Math.max(Math.abs(j),.01);return{"--plx":V.toFixed(4),"--ply":I.toFixed(4),"--plz":u.toFixed(4),"--clx":V.toFixed(4),"--cly":I.toFixed(4),"--clz":R.toFixed(4),"--plr":T(h[0]),"--plg":T(h[1]),"--plb":T(h[2]),"--pli":A.toFixed(4),"--par":T(v[0]),"--pag":T(v[1]),"--pab":T(v[2]),"--pai":x.toFixed(4)}}),_=50;dn(()=>{let M=m.value;if(!M)return;if(e.textureLighting!=="dynamic"){M.style.removeProperty("--shadow-ground-cssz");return}s.value;let D=a.getEntries();if(D.length===0){M.style.removeProperty("--shadow-ground-cssz");return}let V=1/0;for(let u of D)for(let h of u())for(let v of h.vertices)v[2]<V&&(V=v[2]);if(!Number.isFinite(V)){M.style.removeProperty("--shadow-ground-cssz");return}let I=e.shadow?.lift??.05;M.style.setProperty("--shadow-ground-cssz",((V+I)*_).toFixed(3))});let H=ee(()=>{if(!e.autoCenter)return[0,0,0];let M=b.value.sceneBbox;return[(M.min[0]+M.max[0])/2,(M.min[1]+M.max[1])/2,(M.min[2]+M.max[2])/2]});return dn(()=>{o.autoCenterOffset.value=H.value}),aa(()=>{}),()=>{let M=`polycss-scene${e.class?` ${e.class}`:""}`,D=E.value,V=O.entries.value.map((u,h)=>{if(u)return be({entry:u,page:O.pages.value[u.pageIndex],textureLighting:D.textureLighting??"baked"});let v=C.value[h];return!v||v.texture?null:O.useStableTriangle.value&&oe(v)?Ce({entry:v,textureLighting:D.textureLighting??"baked"}):O.useProjectiveQuad.value&&De(v)?Ze({entry:v,textureLighting:D.textureLighting??"baked"}):O.useBorderShape.value||O.useFullRectSolid.value?xe({entry:v,forceBorderShape:!O.useFullRectSolid.value}):null}),I=t.default?.()??[];return ta("div",{ref:m,class:M,"data-polycss-lighting":D.textureLighting??"baked","aria-hidden":"true",style:{...P.value,...N.value??null,...n.style},...Object.fromEntries(Object.entries(n).filter(([u])=>u!=="style"&&u!=="class"))},[...V,...I])}}});import{defineComponent as ua,h as ke,computed as q,inject as da,onMounted as ma,onBeforeUnmount as hn,ref as Pt,watch as vn}from"vue";import{computeSceneBbox as fa,inverseRotateVec3 as Pn,findOverlappingPolygonDuplicates as ya,parseHexColor as pa}from"@layoutit/polycss-core";import{ref as Ke,watch as sa,onUnmounted as la}from"vue";import{loadMesh as ca}from"@layoutit/polycss-core";var yn=[],gt=[];function Ge(e,t){let n=Ke(yn),o=Ke(!!e.value),r=Ke(null),i=Ke(gt),s=null;function d(){if(s){try{s.dispose()}catch{}s=null}}return sa(e,(a,c,l)=>{if(!a){d(),n.value=yn,o.value=!1,r.value=null,i.value=gt;return}let m=!1;o.value=!0,r.value=null;let f=s;ca(a,t).then(y=>{if(m){try{y.dispose()}catch{}return}if(f)try{f.dispose()}catch{}s=y,n.value=y.polygons,o.value=!1,r.value=null,i.value=y.warnings??gt}).catch(y=>{if(m)return;let p=y instanceof Error?y:new Error(String(y));o.value=!1,r.value=p}),l(()=>{m=!0})},{immediate:!0}),la(()=>{d()}),{polygons:n,loading:o,error:r,warnings:i,dispose:d}}var ht=new WeakMap;function pn(e,t){ht.set(e,t)}function gn(e){ht.delete(e)}function Ee(e){let t=e;for(;t;){if(t instanceof HTMLElement){let n=ht.get(t);if(n)return n}t=t.parentElement}return null}function Me(e,t,n){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let r of o){let i=r.getBoundingClientRect();if(!(i.width<=0||i.height<=0)&&t>=i.left&&t<=i.right&&n>=i.top&&n<=i.bottom)return!0}return!1}function vt(e,t,n){if(typeof document>"u")return null;let o=Array.from(document.querySelectorAll(".polycss-mesh"));for(let r of o){if(n&&!n(r))continue;let i=Ee(r);if(i&&Me(r,e,t))return i}return null}function ga(e){let t={};return e.paintColor&&(t["--polycss-paint"]=e.paintColor),e.dynamicColor&&(t["--psr"]=(e.dynamicColor.r/255).toFixed(4),t["--psg"]=(e.dynamicColor.g/255).toFixed(4),t["--psb"]=(e.dynamicColor.b/255).toFixed(4)),Object.keys(t).length>0?t:null}function ha(e,t,n){let o=[];return e&&o.push(`translate3d(${e[0]}px, ${e[1]}px, ${e[2]}px)`),t!==void 0&&(typeof t=="number"?t!==1&&o.push(`scale3d(${t}, ${t}, ${t})`):o.push(`scale3d(${t[0]}, ${t[1]}, ${t[2]})`)),n&&(n[0]&&o.push(`rotateX(${n[0]}deg)`),n[1]&&o.push(`rotateY(${n[1]}deg)`),n[2]&&o.push(`rotateZ(${n[2]}deg)`)),o.length>0?o.join(" "):void 0}function va(e){if(e.length===0)return e;let t=fa(e),n=(t.min[0]+t.max[0])/2,o=(t.min[1]+t.max[1])/2,r=(t.min[2]+t.max[2])/2;if(n===0&&o===0&&r===0)return e;let i=s=>[s[0]-n,s[1]-o,s[2]-r];return e.map(s=>({...s,vertices:s.vertices.map(i),...s.textureTriangles?.length?{textureTriangles:s.textureTriangles.map(d=>({...d,vertices:d.vertices.map(i)}))}:null}))}var Q=ua({name:"PolyMesh",inheritAttrs:!1,props:{id:{type:String,default:void 0},src:{type:String,default:void 0},mtl:{type:String,default:void 0},polygons:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},textureLighting:{type:String,default:void 0},textureQuality:{type:[Number,String],default:void 0},castShadow:{type:Boolean,default:!1},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},onClick:{type:Function,default:void 0},onContextMenu:{type:Function,default:void 0},onDoubleClick:{type:Function,default:void 0},onWheel:{type:Function,default:void 0},onPointerDown:{type:Function,default:void 0},onPointerUp:{type:Function,default:void 0},onPointerMove:{type:Function,default:void 0},onPointerOver:{type:Function,default:void 0},onPointerOut:{type:Function,default:void 0},onPointerEnter:{type:Function,default:void 0},onPointerLeave:{type:Function,default:void 0},onPointerCancel:{type:Function,default:void 0}},setup(e,{slots:t,attrs:n,expose:o}){let r=q(()=>e.src??""),i=q(()=>e.mtl?{mtlUrl:e.mtl}:void 0),s=Ge(r,i.value),d=q(()=>e.src?s.polygons.value:e.polygons??[]),a=Pt(null);vn(d,()=>{a.value=null});let c=q(()=>a.value??d.value),l=q(()=>e.autoCenter?va(c.value):c.value),m=!t.polygon,f=Vt(),y=q(()=>e.textureLighting??f?.value.textureLighting??"baked"),p=q(()=>y.value==="dynamic"?void 0:f?.value.directionalLight),b=q(()=>y.value==="dynamic"?void 0:f?.value.ambientLight),P=q(()=>{if(y.value!=="dynamic")return null;let h=e.rotation;if(!h||h[0]===0&&h[1]===0&&h[2]===0)return null;let v=f?.value.directionalLight?.direction;if(!v)return null;let A=Pn(v,h),x=Math.hypot(A[0],A[1],A[2])||1;return{"--plx":(A[0]/x).toFixed(4),"--ply":(A[1]/x).toFixed(4),"--plz":(A[2]/x).toFixed(4)}}),E=Pt(e.rotation),C=q(()=>{if(!m)return[];let h=p.value,v=h&&E.value?{...h,direction:Pn(h.direction,E.value)}:h,A=We(l.value);return l.value.map((x,T)=>ve(x,T,{directionalLight:v,ambientLight:b.value,textureEdgeRepairEdges:A[T]}))}),w=q(()=>e.textureQuality),g=Pe(C,y,w),L=q(()=>m?tn(C.value,y.value):{}),O=q(()=>ga(L.value)),N=q(()=>{if(!e.castShadow||y.value!=="dynamic")return[];let h=f?.value.shadow,v=h?.color??"#000000",A=h?.opacity??.25,x=pa(v)?.rgb??[0,0,0],T=`rgba(${x[0]},${x[1]},${x[2]},${A})`,j=C.value;if(j.length===0)return[];let R=ya(l.value,{normalTolerance:.1,distanceTolerance:.5,overlapFraction:.4});return j.map((k,Y)=>{if(!k||R.has(Y))return null;let X=`matrix3d(${k.matrix})`,$=pt(k),z={transform:`var(--shadow-proj) ${X}`,color:T,width:`${k.canvasW}px`,height:`${k.canvasH}px`,"--pnx":k.normal[0].toFixed(4),"--pny":k.normal[1].toFixed(4),"--pnz":k.normal[2].toFixed(4)},F=S=>{let U=S.el;U&&U.style.setProperty("border-shape",$)};return ke("q",{class:"polycss-shadow",style:z,onVnodeMounted:F,onVnodeUpdated:F})})}),_=Symbol();vn(()=>[e.castShadow,y.value],([h,v],A,x)=>{let T=f?.value.shadowRegistry;T&&(h&&v==="dynamic"?T.register(_,()=>l.value):T.unregister(_),x(()=>T.unregister(_)))},{immediate:!0}),hn(()=>{f?.value.shadowRegistry?.unregister(_)});let H=Pt(null),M={get element(){return H.value},get id(){return e.id},getPosition:()=>e.position,getRotation:()=>e.rotation,getScale:()=>e.scale,getPolygons:()=>l.value,updatePolygon(h,v){let A=l.value,x=typeof h=="number"?h:A.indexOf(h);x<0||x>=A.length||(Object.assign(A[x],v),a.value=A.slice())},rebakeAtlas:()=>{E.value=e.rotation}};o(M),ma(()=>{H.value&&pn(H.value,M)}),hn(()=>{H.value&&gn(H.value)});let D=da(K,null),V=null;function I(h,v,A){let x=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let Y=document.elementsFromPoint(v,A),X=new Set;for(let $ of Y){let z=Ee($);z&&!X.has(z)&&(X.add(z),x.push({object:z}))}}let T=0,j=0,R=D?.cameraElRef.value;if(R){let Y=R.getBoundingClientRect();Y.width>0&&Y.height>0&&(T=(v-Y.left)/Y.width*2-1,j=-((A-Y.top)/Y.height*2-1))}let k=0;return V&&(k=Math.hypot(v-V.x,A-V.y)),{object:x[0]?.object??M,eventObject:M,intersections:x,pointer:{x:T,y:j},delta:k,nativeEvent:h,stopPropagation:()=>h.stopPropagation()}}function u(h,v,A,x){h&&h(I(v,A,x))}return()=>{let h=ha(e.position,e.scale,e.rotation),v=l.value,A;if(v.length>0){let F=1/0,S=1/0,U=1/0,B=-1/0,re=-1/0,ce=-1/0;for(let se of v)for(let W of se.vertices)W[0]<F&&(F=W[0]),W[0]>B&&(B=W[0]),W[1]<S&&(S=W[1]),W[1]>re&&(re=W[1]),W[2]<U&&(U=W[2]),W[2]>ce&&(ce=W[2]);Number.isFinite(F)&&(A=`${(S+re)/2*50}px ${(F+B)/2*50}px ${(U+ce)/2*50}px`)}let x={transform:h,...A?{transformOrigin:A}:null,...P.value??void 0,...n.style,...O.value??void 0},T=Object.fromEntries(Object.entries(n).filter(([F])=>F!=="style"&&F!=="class")),j=`polycss-mesh${e.class?` ${e.class}`:""}`,R={};e.onClick&&(R.onClick=F=>{let S=F;u(e.onClick,S,S.clientX,S.clientY)}),e.onContextMenu&&(R.onContextmenu=F=>{let S=F;u(e.onContextMenu,S,S.clientX,S.clientY)}),e.onDoubleClick&&(R.onDblclick=F=>{let S=F;u(e.onDoubleClick,S,S.clientX,S.clientY)}),e.onWheel&&(R.onWheel=F=>{let S=F;u(e.onWheel,S,S.clientX,S.clientY)}),R.onPointerdown=F=>{let S=F;V={x:S.clientX,y:S.clientY},u(e.onPointerDown,S,S.clientX,S.clientY)},R.onPointerup=F=>{let S=F;u(e.onPointerUp,S,S.clientX,S.clientY),V=null},e.onPointerMove&&(R.onPointermove=F=>{let S=F;u(e.onPointerMove,S,S.clientX,S.clientY)}),(e.onPointerOver||e.onPointerEnter)&&(R.onPointerenter=F=>{let S=F;u(e.onPointerOver,S,S.clientX,S.clientY),u(e.onPointerEnter,S,S.clientX,S.clientY)}),(e.onPointerOut||e.onPointerLeave)&&(R.onPointerleave=F=>{let S=F;u(e.onPointerOut,S,S.clientX,S.clientY),u(e.onPointerLeave,S,S.clientX,S.clientY)}),e.onPointerCancel&&(R.onPointercancel=F=>{let S=F;u(e.onPointerCancel,S,S.clientX,S.clientY),V=null});let k=e.id?{"data-poly-mesh-id":e.id}:{};if(e.src&&s.loading.value&&s.polygons.value.length===0)return ke("div",{ref:H,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:x,...k,...R,...T},t.fallback?.()??[]);if(e.src&&s.error.value&&s.polygons.value.length===0)return ke("div",{ref:H,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:x,...k,...R,...T},t.error?.({error:s.error.value})??[]);let Y=l.value,X=t.polygon?Y.map((F,S)=>ke("template",{key:S},t.polygon?.({polygon:F,index:S}))):g.entries.value.map((F,S)=>{if(F)return be({entry:F,page:g.pages.value[F.pageIndex],textureLighting:y.value});let U=C.value[S];return!U||U.texture?null:oe(U)?Ce({entry:U,textureLighting:y.value,solidPaintDefaults:L.value}):xe({entry:U,solidPaintDefaults:L.value})}),$=t.default?.()??[],z=N.value;return ke("div",{ref:H,class:j,style:x,...k,...R,...T},[...z,...X,...$])}}});import{defineComponent as Pa,h as ba,computed as xa}from"vue";var bn=Pa({name:"PolyGround",props:{size:{type:Number,default:6},z:{type:Number,default:0},center:{type:Array,default:()=>[0,0]},color:{type:String,default:"#7d848e"},class:{type:String,default:void 0}},setup(e){let t=xa(()=>{let n=e.size/2,[o,r]=e.center;return[{vertices:[[o-n,r-n,e.z],[o+n,r-n,e.z],[o+n,r+n,e.z],[o-n,r+n,e.z]],color:e.color}]});return()=>ba(Q,{polygons:t.value,castShadow:!1,class:e.class?`polycss-ground ${e.class}`:"polycss-ground"})}});import{computed as xn}from"vue";function Ca(e){return typeof e=="function"?xn(()=>{let{texture:t,key:n}=e();return{texture:t,key:n}}):xn(()=>({texture:e.texture,key:e.key}))}import{computed as Ae,defineComponent as Ea,h as Cn}from"vue";var Ma=4;function qe(e,t=Ma){let n=e.toFixed(t).replace(/\.?0+$/,"");return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function Aa(e){if(e.length!==4)return null;let t=[...new Set(e.map(r=>r[0]))].sort((r,i)=>r-i),n=[...new Set(e.map(r=>r[1]))].sort((r,i)=>r-i);if(t.length!==2||n.length!==2)return null;let o=new Set([`${t[0]},${n[0]}`,`${t[0]},${n[1]}`,`${t[1]},${n[0]}`,`${t[1]},${n[1]}`]);for(let r of e)if(!o.has(`${r[0]},${r[1]}`))return null;return{u0:t[0],u1:t[1],v0:n[0],v1:n[1]}}function Sa({plan:e,material:t,uvRect:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let{u0:d,u1:a,v0:c,v1:l}=n,m=a-d,f=l-c,y=1/m,p=1/f,b=Math.max(c,l),P=d/m,E=(1-b)/f,C={transform:`matrix3d(${e.canonicalMatrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${qe(y)} ${qe(p)}`,backgroundPosition:`${qe(-P)} ${qe(-E)}`,pointerEvents:s==="none"?"none":void 0,...r},w=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([L,O])=>[`data-${L}`,String(O)])):{},g=o?.trim()||void 0;return Cn("i",{class:g,style:C,...w,...i})}var En=Ea({name:"Poly",inheritAttrs:!1,props:{vertices:{type:Array,required:!0},color:{type:String},texture:{type:String},uvs:{type:Array,default:void 0},data:{type:Object,default:void 0},material:{type:Object,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},textureLighting:{type:String,default:void 0},textureQuality:{type:[Number,String],default:void 0},context:{type:Object,default:void 0},baseColor:{type:String},pointerEvents:{type:String,default:"auto"}},setup(e,{attrs:t}){let n=Ae(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=Ae(()=>e.textureQuality??e.context?.textureQuality),r=Ae(()=>e.material?.texture??e.texture),i=Ae(()=>e.material&&e.uvs?Aa(e.uvs):null),s=Ae(()=>{let c=e.context?.tileSize??50;return ve({vertices:e.vertices,color:e.baseColor??e.color,texture:r.value,uvs:e.uvs,data:e.data},0,{tileSize:c,layerElevation:e.context?.layerElevation??c,directionalLight:e.context?.directionalLight})}),d=Ae(()=>i.value?[]:[s.value]),a=Pe(d,n,o);return()=>{let c=s.value,l=a.entries.value[0],m=[];e.position&&m.push(`translate3d(${e.position[0]}px, ${e.position[1]}px, ${e.position[2]}px)`),e.scale!==void 0&&(typeof e.scale=="number"?e.scale!==1&&m.push(`scale3d(${e.scale}, ${e.scale}, ${e.scale})`):m.push(`scale3d(${e.scale[0]}, ${e.scale[1]}, ${e.scale[2]})`)),e.rotation&&(e.rotation[0]&&m.push(`rotateX(${e.rotation[0]}deg)`),e.rotation[1]&&m.push(`rotateY(${e.rotation[1]}deg)`),e.rotation[2]&&m.push(`rotateZ(${e.rotation[2]}deg)`));let f=m.length>0?m.join(" "):void 0,y={};if(e.data)for(let[E,C]of Object.entries(e.data))y[`data-${E}`]=String(C);let p={...t,...y},b=Object.fromEntries(Object.entries(p).filter(([E])=>E!=="class"&&E!=="style")),P;return i.value&&e.material&&c?P=Sa({plan:c,material:e.material,uvRect:i.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):l?P=be({entry:l,page:a.pages.value[l.pageIndex],textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):c&&!c.texture&&(P=oe(c)?Ce({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):De(c)?Ze({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):xe({entry:c,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"})),P?f?Cn("div",{class:"polycss-poly-wrapper",style:{transform:f,position:"absolute",transformStyle:"preserve-3d"}},[P]):P:null}}});import{defineComponent as Ta,inject as wa,onMounted as La,onBeforeUnmount as Ra,watch as bt,ref as Oa}from"vue";import{BASE_TILE as Mn}from"@layoutit/polycss-core";var Da=150,An=4,ka=513e-6,_a=10,Ha=3,Sn=16.67,Ia=50,Tn=.1,wn=10,Ln=0,Rn=5e3,Va=.3,Fa=.05;function za(e){return e===!0?-1:e===void 0||e===!1?1:e}function Na(e,t,n,o,r){let i=za(r),s=e/An*i,d=t/An*i;return{rotX:Math.max(0,Math.min(100,n-d)),rotY:((o-s)%360+360)%360}}function On(e,t,n,o,r){let i=Math.max(.01,n),s=Math.max(.1,Math.cos(o*Math.PI/180)),d=-e/(i*Mn),a=-t/(i*Mn*s),c=-r*Math.PI/180,l=Math.cos(c),m=Math.sin(c);return{dWorldX:a*l-d*m,dWorldY:a*m+d*l}}var Dn=Ta({name:"PolyOrbitControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:Tn},maxZoom:{type:Number,default:wn},minDistance:{type:Number,default:Ln},maxDistance:{type:Number,default:Rn},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=wa(K,null);if(!n)return typeof console<"u"&&console.warn("[polycss] <PolyOrbitControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:r,cameraElRef:i,applyTransformDirect:s}=n,d=()=>({rotX:r.value.state.rotX,rotY:r.value.state.rotY,zoom:r.value.state.zoom,target:r.value.state.target,distance:r.value.state.distance}),a=()=>{t("change",d())},c=()=>{t("interaction-start",d())},l=()=>{t("interaction-end",d())},m=null,f={x:0,y:0},y=Oa(!1),p=null,b=null,P=null;function E(){let g=i.value;if(!g)return;let L=!1,O={x:0,y:0},N=u=>{if(e.drag&&m===null&&u.isPrimary!==!1){u.preventDefault(),m=u.pointerId,f={x:u.clientX,y:u.clientY},g.style.cursor="grabbing";try{u.target.setPointerCapture(u.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(y.value=!0),c()}},_=u=>{if(m===null||u.pointerId!==m||!e.drag)return;u.preventDefault();let h=u.clientX-f.x,v=u.clientY-f.y;f={x:u.clientX,y:u.clientY};let A=r.value,x=A.state;if(u.shiftKey){let{dWorldX:T,dWorldY:j}=On(h,v,x.zoom,x.rotX,x.rotY);A.update({target:[x.target[0]+T,x.target[1]+j,x.target[2]]})}else{let{rotX:T,rotY:j}=Na(h,v,x.rotX,x.rotY,e.invert);A.update({rotX:T,rotY:j})}s(),o.updateCameraFromRef(A),a()},H=u=>{if(m===u.pointerId){m=null,g.style.cursor=e.drag?"grab":"";try{u.target.releasePointerCapture(u.pointerId)}catch{}y.value=!1,l()}},M=u=>{u.preventDefault()},D=u=>{u.button===2&&(L=!0,O={x:u.clientX,y:u.clientY})},V=u=>{if(!L||!e.drag)return;let h=u.clientX-O.x,v=u.clientY-O.y;O={x:u.clientX,y:u.clientY};let A=r.value,x=A.state,{dWorldX:T,dWorldY:j}=On(h,v,x.zoom,x.rotX,x.rotY);A.update({target:[x.target[0]+T,x.target[1]+j,x.target[2]]}),s(),o.updateCameraFromRef(A),a()},I=u=>{u.button===2&&L&&(L=!1,l())};g.style.cursor="grab",g.style.touchAction="none",g.style.userSelect="none",g.addEventListener("pointerdown",N),g.addEventListener("pointermove",_),g.addEventListener("pointerup",H),g.addEventListener("pointercancel",H),g.addEventListener("contextmenu",M),g.addEventListener("mousedown",D),g.addEventListener("mousemove",V),g.addEventListener("mouseup",I),p=()=>{g.removeEventListener("pointerdown",N),g.removeEventListener("pointermove",_),g.removeEventListener("pointerup",H),g.removeEventListener("pointercancel",H),g.removeEventListener("contextmenu",M),g.removeEventListener("mousedown",D),g.removeEventListener("mousemove",V),g.removeEventListener("mouseup",I),g.style.cursor="",g.style.touchAction="",g.style.userSelect=""}}function C(){let g=i.value;if(!g)return;let L=!1,O=null,N=_=>{if(!e.wheel)return;_.preventDefault();let H=_.deltaMode===1?16:_.deltaMode===2?100:1,M=_.deltaY*H;_.ctrlKey?M*=_a:M*=Ha;let D=r.value;if(e.dolly){let V=e.minDistance??Ln,I=e.maxDistance??Rn,u=Math.max(V,Math.min(I,D.state.distance+M*Fa));D.update({distance:u})}else{let V=Math.exp(-M*ka),I=e.minZoom??Tn,u=e.maxZoom??wn,h=Math.max(I,Math.min(u,D.state.zoom*V));D.update({zoom:h})}s(),o.updateCameraFromRef(D),L||(L=!0,c()),a(),O!==null&&clearTimeout(O),O=setTimeout(()=>{O=null,L=!1,l()},Da)};g.addEventListener("wheel",N,{passive:!1}),b=()=>{g.removeEventListener("wheel",N),O!==null&&clearTimeout(O)}}function w(){let g=null,L=!1,O=0,N=_=>{if(L)return;let H=e.animate;if(!H){g=requestAnimationFrame(N);return}if(y.value)O=_;else{let M=Math.min(Ia,O?_-O:Sn);O=_;let V=(H.speed??Va)*(M/Sn),I=r.value,u=I.state;if(H.axis==="x"){let h=((u.rotX+V)%360+360)%360;I.update({rotX:h})}else{let h=((u.rotY+V)%360+360)%360;I.update({rotY:h})}s(),o.updateCameraFromRef(I),a()}g=requestAnimationFrame(N)};g=requestAnimationFrame(N),P=()=>{L=!0,g!==null&&cancelAnimationFrame(g),P=null}}return La(()=>{e.drag&&E(),e.wheel&&C(),e.animate&&w()}),Ra(()=>{p?.(),b?.(),P?.(),p=null,b=null}),bt(()=>e.drag,g=>{g&&!p&&E(),!g&&p&&(p(),p=null)}),bt(()=>e.wheel,g=>{g&&!b&&C(),!g&&b&&(b(),b=null)}),bt(()=>!!e.animate,g=>{g&&!P&&w(),!g&&P&&P()}),()=>null}});import{defineComponent as ja,inject as Ya,onMounted as Ua,onBeforeUnmount as Xa,watch as xt,ref as $a}from"vue";import{BASE_TILE as kn}from"@layoutit/polycss-core";var Ba=150,_n=4,Wa=513e-6,Za=10,Ka=3,Hn=16.67,Ga=50,In=.1,Vn=10,Fn=0,zn=5e3,qa=.3,Qa=.05;function Ja(e){return e===!0?-1:e===void 0||e===!1?1:e}function Nn(e,t,n,o,r){let i=Ja(r),s=e/_n*i,d=t/_n*i;return{rotX:Math.max(0,Math.min(100,n-d)),rotY:((o-s)%360+360)%360}}function ei(e,t,n,o,r){let i=Math.max(.01,n),s=Math.max(.1,Math.cos(o*Math.PI/180)),d=-e/(i*kn),a=-t/(i*kn*s),c=-r*Math.PI/180,l=Math.cos(c),m=Math.sin(c);return{dWorldX:a*l-d*m,dWorldY:a*m+d*l}}var jn=ja({name:"PolyMapControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:In},maxZoom:{type:Number,default:Vn},minDistance:{type:Number,default:Fn},maxDistance:{type:Number,default:zn},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=Ya(K,null);if(!n)return typeof console<"u"&&console.warn("[polycss] <PolyMapControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:r,cameraElRef:i,applyTransformDirect:s}=n,d=()=>({rotX:r.value.state.rotX,rotY:r.value.state.rotY,zoom:r.value.state.zoom,target:r.value.state.target,distance:r.value.state.distance}),a=()=>{t("change",d())},c=()=>{t("interaction-start",d())},l=()=>{t("interaction-end",d())},m=null,f={x:0,y:0},y=$a(!1),p=null,b=null,P=null;function E(){let g=i.value;if(!g)return;let L=!1,O={x:0,y:0},N=u=>{if(e.drag&&m===null&&u.isPrimary!==!1){u.preventDefault(),m=u.pointerId,f={x:u.clientX,y:u.clientY},g.style.cursor="grabbing";try{u.target.setPointerCapture(u.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(y.value=!0),c()}},_=u=>{if(m===null||u.pointerId!==m||!e.drag)return;u.preventDefault();let h=u.clientX-f.x,v=u.clientY-f.y;f={x:u.clientX,y:u.clientY};let A=r.value,x=A.state;if(u.shiftKey){let{rotX:T,rotY:j}=Nn(h,v,x.rotX,x.rotY,e.invert);A.update({rotX:T,rotY:j})}else{let{dWorldX:T,dWorldY:j}=ei(h,v,x.zoom,x.rotX,x.rotY);A.update({target:[x.target[0]+T,x.target[1]+j,x.target[2]]})}s(),o.updateCameraFromRef(A),a()},H=u=>{if(m===u.pointerId){m=null,g.style.cursor=e.drag?"grab":"";try{u.target.releasePointerCapture(u.pointerId)}catch{}y.value=!1,l()}},M=u=>{u.preventDefault()},D=u=>{u.button===2&&(L=!0,O={x:u.clientX,y:u.clientY})},V=u=>{if(!L||!e.drag)return;let h=u.clientX-O.x,v=u.clientY-O.y;O={x:u.clientX,y:u.clientY};let A=r.value,x=A.state,{rotX:T,rotY:j}=Nn(h,v,x.rotX,x.rotY,e.invert);A.update({rotX:T,rotY:j}),s(),o.updateCameraFromRef(A),a()},I=u=>{u.button===2&&L&&(L=!1,l())};g.style.cursor="grab",g.style.touchAction="none",g.style.userSelect="none",g.addEventListener("pointerdown",N),g.addEventListener("pointermove",_),g.addEventListener("pointerup",H),g.addEventListener("pointercancel",H),g.addEventListener("contextmenu",M),g.addEventListener("mousedown",D),g.addEventListener("mousemove",V),g.addEventListener("mouseup",I),p=()=>{g.removeEventListener("pointerdown",N),g.removeEventListener("pointermove",_),g.removeEventListener("pointerup",H),g.removeEventListener("pointercancel",H),g.removeEventListener("contextmenu",M),g.removeEventListener("mousedown",D),g.removeEventListener("mousemove",V),g.removeEventListener("mouseup",I),g.style.cursor="",g.style.touchAction="",g.style.userSelect=""}}function C(){let g=i.value;if(!g)return;let L=!1,O=null,N=_=>{if(!e.wheel)return;_.preventDefault();let H=_.deltaMode===1?16:_.deltaMode===2?100:1,M=_.deltaY*H;_.ctrlKey?M*=Za:M*=Ka;let D=r.value;if(e.dolly){let V=e.minDistance??Fn,I=e.maxDistance??zn,u=Math.max(V,Math.min(I,D.state.distance+M*Qa));D.update({distance:u})}else{let V=Math.exp(-M*Wa),I=e.minZoom??In,u=e.maxZoom??Vn,h=Math.max(I,Math.min(u,D.state.zoom*V));D.update({zoom:h})}s(),o.updateCameraFromRef(D),L||(L=!0,c()),a(),O!==null&&clearTimeout(O),O=setTimeout(()=>{O=null,L=!1,l()},Ba)};g.addEventListener("wheel",N,{passive:!1}),b=()=>{g.removeEventListener("wheel",N),O!==null&&clearTimeout(O)}}function w(){let g=null,L=!1,O=0,N=_=>{if(L)return;let H=e.animate;if(!H){g=requestAnimationFrame(N);return}if(y.value)O=_;else{let M=Math.min(Ga,O?_-O:Hn);O=_;let V=(H.speed??qa)*(M/Hn),I=r.value,u=I.state;if(H.axis==="x"){let h=((u.rotX+V)%360+360)%360;I.update({rotX:h})}else{let h=((u.rotY+V)%360+360)%360;I.update({rotY:h})}s(),o.updateCameraFromRef(I),a()}g=requestAnimationFrame(N)};g=requestAnimationFrame(N),P=()=>{L=!0,g!==null&&cancelAnimationFrame(g),P=null}}return Ua(()=>{e.drag&&E(),e.wheel&&C(),e.animate&&w()}),Xa(()=>{p?.(),b?.(),P?.(),p=null,b=null}),xt(()=>e.drag,g=>{g&&!p&&E(),!g&&p&&(p(),p=null)}),xt(()=>e.wheel,g=>{g&&!b&&C(),!g&&b&&(b(),b=null)}),xt(()=>!!e.animate,g=>{g&&!P&&w(),!g&&P&&P()}),()=>null}});import{defineComponent as ti,h as Qe,inject as Yn,onBeforeUnmount as Un,onMounted as Ct,ref as _e,computed as Se}from"vue";import{arrowPolygons as ni,eulerXYZFromQuat as oi,planePolygons as ri,quatFromAxisAngle as ai,quatFromEulerXYZ as ii,quatMultiply as si,ringQuadPolygons as li}from"@layoutit/polycss-core";var Je="#ff3653",et="#8adb00",tt="#2c8fff",ci=.6,ui=.8,di=1,me=50,Xn=60,mi=.6,fi=.0125,yi=.15,pi=.04,gi=1,$n=.02,Et=1.04,hi=.1,vi=.25,Qn=1e-4,He={0:1,1:0,2:2},Bn=[{cssAxis:0,sign:1,key:"x",color:Je},{cssAxis:0,sign:-1,key:"-x",color:Je},{cssAxis:1,sign:1,key:"y",color:et},{cssAxis:1,sign:-1,key:"-y",color:et},{cssAxis:2,sign:1,key:"z",color:tt},{cssAxis:2,sign:-1,key:"-z",color:tt}],Wn=[{cssAxis:0,key:"x",color:Je},{cssAxis:1,key:"y",color:et},{cssAxis:2,key:"z",color:tt}],Zn=[{perpAxis:2,axisA:0,axisB:1,key:"xy",color:tt},{perpAxis:1,axisA:0,axisB:2,key:"xz",color:et},{perpAxis:0,axisA:1,axisB:2,key:"yz",color:Je}];function Mt(e,t){let n=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);if(!n)return e;let o=parseInt(n[1],16),r=parseInt(n[2],16),i=parseInt(n[3],16);return`rgba(${o}, ${r}, ${i}, ${t})`}function nt(e,t){return!t||t<=0?e:Math.round(e/t)*t}function Pi(e){return e.replace("-","")[0]}function At(e,t,n,o){let r=n*Math.PI/180,i=o*Math.PI/180,s=[0,0,0];s[e]=t;let d=s[0]*Math.sin(i)+s[1]*Math.cos(i),a=s[2];return d*Math.sin(r)+a*Math.cos(r)<0}function bi(e){if(e.length===0)return Xn;let t=1/0,n=1/0,o=1/0,r=-1/0,i=-1/0,s=-1/0;for(let d of e)for(let a of d.vertices)a[0]<t&&(t=a[0]),a[0]>r&&(r=a[0]),a[1]<n&&(n=a[1]),a[1]>i&&(i=a[1]),a[2]<o&&(o=a[2]),a[2]>s&&(s=a[2]);return Number.isFinite(t)?Math.max(r-t,i-n,s-o)*me*mi:Xn}function xi(e){if(e.length===0)return[0,0,0];let t=1/0,n=1/0,o=1/0,r=-1/0,i=-1/0,s=-1/0;for(let d of e)for(let a of d.vertices)a[0]<t&&(t=a[0]),a[0]>r&&(r=a[0]),a[1]<n&&(n=a[1]),a[1]>i&&(i=a[1]),a[2]<o&&(o=a[2]),a[2]>s&&(s=a[2]);return Number.isFinite(t)?[(n+i)/2*me,(t+r)/2*me,(o+s)/2*me]:[0,0,0]}function Kn(e){let t=e.shaftLengthCss,n=[0,0,0];n[e.cssAxis]=e.sign;let o=e.wrapper.ownerDocument.createElement("div");o.style.position="absolute",o.style.left="0",o.style.top="0",o.style.width="0",o.style.height="0",o.style.transform=`translate3d(${n[0]*t}px, ${n[1]*t}px, ${n[2]*t}px)`,e.wrapper.appendChild(o);let r=e.wrapper.getBoundingClientRect(),i=o.getBoundingClientRect();e.wrapper.removeChild(o);let s=(i.left-r.left)/t,d=(i.top-r.top)/t,a=s*s+d*d;if(a<Qn)return;let c=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let l=f=>{let y=f.clientX-e.startClientX,p=f.clientY-e.startClientY,b=(y*s+p*d)/a;b=nt(b,e.translationSnap);let P=[c[0]+b*n[0],c[1]+b*n[1],c[2]+b*n[2]];e.onObjectChange?.({object:e.target,position:P}),e.onChange?.()},m=()=>{window.removeEventListener("pointermove",l),window.removeEventListener("pointerup",m),window.removeEventListener("pointercancel",m);let f=y=>{y.stopPropagation(),y.stopImmediatePropagation()};window.addEventListener("click",f,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",f,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",l),window.addEventListener("pointerup",m),window.addEventListener("pointercancel",m)}function Gn(e){let t=[0,0,0];t[e.axisA]=1;let n=[0,0,0];n[e.axisB]=1;let o=e.probeDistanceCss;function r(m){let f=e.wrapper.ownerDocument.createElement("div");f.style.position="absolute",f.style.left="0",f.style.top="0",f.style.width="0",f.style.height="0",f.style.transform=`translate3d(${m[0]*o}px, ${m[1]*o}px, ${m[2]*o}px)`,e.wrapper.appendChild(f);let y=e.wrapper.getBoundingClientRect(),p=f.getBoundingClientRect();return e.wrapper.removeChild(f),{x:(p.left-y.left)/o,y:(p.top-y.top)/o}}let i=r(t),s=r(n),d=i.x*s.y-s.x*i.y;if(Math.abs(d)<Qn)return;let a=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let c=m=>{let f=m.clientX-e.startClientX,y=m.clientY-e.startClientY,p=(s.y*f-s.x*y)/d,b=(-i.y*f+i.x*y)/d;p=nt(p,e.translationSnap),b=nt(b,e.translationSnap);let P=[a[0]+p*t[0]+b*n[0],a[1]+p*t[1]+b*n[1],a[2]+p*t[2]+b*n[2]];e.onObjectChange?.({object:e.target,position:P}),e.onChange?.()},l=()=>{window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",l),window.removeEventListener("pointercancel",l),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",c),window.addEventListener("pointerup",l),window.addEventListener("pointercancel",l)}function qn(e){let t=e.wrapper.getBoundingClientRect(),n=t.left,o=t.top,r=Math.atan2(e.startClientY-o,e.startClientX-n),i=0,s=e.target.getRotation()??[0,0,0],d=ii(s);e.onMouseDown?.(),e.onDraggingChanged?.(!0);let a=l=>{let m=Math.atan2(l.clientY-o,l.clientX-n),f=m-r;f>Math.PI?f-=2*Math.PI:f<-Math.PI&&(f+=2*Math.PI),i+=f,r=m;let y=i*180/Math.PI;y=nt(y,e.rotationSnap);let p=[0,0,0];p[e.cssAxis]=1;let b=ai(p,y*Math.PI/180),P=oi(si(b,d));e.onObjectChange?.({object:e.target,rotation:P}),e.onChange?.()},c=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",c),window.removeEventListener("pointercancel",c);let l=m=>{m.stopPropagation(),m.stopImmediatePropagation()};window.addEventListener("click",l,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",l,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1),e.target.rebakeAtlas()};window.addEventListener("pointermove",a),window.addEventListener("pointerup",c),window.addEventListener("pointercancel",c)}function Ci(e){return!!e&&typeof e=="object"&&"value"in e}function Ei(e){return e?Ci(e)?e.value??null:e:null}var Jn=ti({name:"PolyTransformControls",props:{object:{type:null,default:null},mode:{type:String,default:"translate"},space:{type:String,default:"world"},size:{type:Number,default:1},showX:{type:Boolean,default:!0},showY:{type:Boolean,default:!0},showZ:{type:Boolean,default:!0},translationSnap:{type:Number,default:null},rotationSnap:{type:Number,default:null},enabled:{type:Boolean,default:!0}},emits:{change:()=>!0,objectChange:e=>!0,mouseDown:()=>!0,mouseUp:()=>!0,draggingChanged:e=>!0},setup(e,{emit:t}){let n=_e(null),o=_e(null),r=_e(new Map),i=Se(()=>Ei(e.object)),s=_e(0);Ct(()=>{s.value++});let d=_e(0),a=Yn(K,void 0),c=null;Ct(()=>{let u=a?.store;u&&(c=u.subscribe(()=>{d.value++}))}),Un(()=>{c?.()});function l(){d.value;let u=a?.store.getState().cameraState;return{rotX:u?.rotX??65,rotY:u?.rotY??45}}let m=Se(()=>(s.value,bi(i.value?.getPolygons()??[]))),f=Se(()=>m.value*e.size);function y(u){return o.value===u?di:n.value===u?ui:ci}function p(){t("change")}function b(u){t("objectChange",u)}function P(u){t("draggingChanged",u)}function E(){t("mouseDown")}function C(){t("mouseUp")}let w=Yn(K,void 0),g=null;Ct(()=>{let u=w?.cameraElRef.value;if(!u)return;let h=v=>{let A=i.value;if(!A||!e.enabled||v.target?.closest(".polycss-transform-gizmo"))return;let T={x:e.showX,y:e.showY,z:e.showZ};if(e.mode==="translate")for(let R of Zn){let k=["x","y","z"][R.axisA],Y=["x","y","z"][R.axisB];if(!T[k]||!T[Y])continue;let X=document.querySelector(`.polycss-transform-plane--${R.key}`);if(!X||!Me(X,v.clientX,v.clientY))continue;v.preventDefault(),v.stopPropagation();let $=X.closest("[data-poly-transform-controls]");if(!$)return;o.value=R.key,Gn({axisA:R.axisA,axisB:R.axisB,probeDistanceCss:f.value,wrapper:$,target:A,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:z=>{z||(o.value=null),P(z)}});return}let j=e.mode==="translate"?Bn:Wn;for(let R of j){let k=R.key.replace("-","")[0];if(!T[k])continue;let Y=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${R.key}`);if(!Y||!(e.mode==="rotate"?Me(Y,v.clientX,v.clientY):Me(Y,v.clientX,v.clientY)))continue;v.preventDefault(),v.stopPropagation();let $=Y.closest("[data-poly-transform-controls]");if(!$)return;if(o.value=R.key,e.mode==="translate"){let z=R;Kn({cssAxis:z.cssAxis,sign:z.sign,shaftLengthCss:f.value,wrapper:$,target:A,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:F=>{F||(o.value=null),P(F)}})}else qn({cssAxis:R.cssAxis,wrapper:$,target:A,startClientX:v.clientX,startClientY:v.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:z=>{z||(o.value=null),P(z)}});return}};u.addEventListener("pointerdown",h),g=()=>u.removeEventListener("pointerdown",h)}),Un(()=>{g?.()});let L=Se(()=>{if(e.mode!=="translate")return[];s.value;let h=f.value/me,{rotX:v,rotY:A}=l();return Bn.filter(x=>({x:e.showX,y:e.showY,z:e.showZ})[Pi(x.key)]).map(x=>{let T=y(x.key),j=At(x.cssAxis,x.sign,v,A);return{spec:x,polygons:ni({axis:He[x.cssAxis],sign:x.sign,shaftLength:h,shaftHalfThickness:h*fi,headLength:h*yi,headHalfThickness:h*pi,color:Mt(x.color,T),shaft:!j})}})}),O=Se(()=>{if(e.mode!=="translate")return[];s.value;let h=f.value/me,v={x:e.showX,y:e.showY,z:e.showZ},A=["x","y","z"],{rotX:x,rotY:T}=l(),j=h*vi;return Zn.filter(R=>v[A[R.axisA]]&&v[A[R.axisB]]).map(R=>{let k=y(R.key),Y=He[R.perpAxis],X=(Y+1)%3,$=(Y+2)%3,z=He[X],F=He[$],S=At(z,1,x,T)?-1:1,U=At(F,1,x,T)?-1:1;return{spec:R,polygons:ri({axis:Y,size:h*hi,offset:[S*j,U*j],color:Mt(R.color,k)})}})}),N=Se(()=>{if(e.mode!=="rotate")return[];s.value;let v=f.value*gi/me*Et;return Wn.filter(A=>({x:e.showX,y:e.showY,z:e.showZ})[A.key]).map(A=>{let x=y(A.key);return{spec:A,polygons:li({axis:He[A.cssAxis],outerRadius:v,color:Mt(A.color,x)})}})}),_=(1-$n)/Et,H=(1+$n)/Et;function M(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;h.stopPropagation();let x=h.eventObject.element?.closest("[data-poly-transform-controls]");x&&(o.value=u.key,Kn({cssAxis:u.cssAxis,sign:u.sign,shaftLengthCss:f.value,wrapper:x,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:T=>{T||(o.value=null),P(T)}}))}}function D(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;h.stopPropagation();let x=h.eventObject.element?.closest("[data-poly-transform-controls]");x&&(o.value=u.key,Gn({axisA:u.axisA,axisB:u.axisB,probeDistanceCss:f.value,wrapper:x,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:T=>{T||(o.value=null),P(T)}}))}}function V(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;let A=h.eventObject.element;h.stopPropagation();let x=A?.closest("[data-poly-transform-controls]");x&&(o.value=u.key,qn({cssAxis:u.cssAxis,wrapper:x,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:T=>{T||(o.value=null),P(T)}}))}}function I(u){return{onPointerOver:()=>{n.value=u},onPointerOut:()=>{n.value===u&&(n.value=null)}}}return()=>{let u=i.value;if(!u)return null;let h=u.getPosition()??[0,0,0],v=xi(u.getPolygons()),A=h[0]+v[0],x=h[1]+v[1],T=h[2]+v[2],j={transform:`translate3d(${A}px, ${x}px, ${T}px)`,position:"absolute",transformStyle:"preserve-3d",zIndex:1e3},R=e.mode==="translate"?[...L.value.map(({spec:k,polygons:Y})=>Qe(Q,{key:`arrow-${k.key}`,polygons:Y,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${k.key}`,textureLighting:"baked",onPointerDown:M(k),...I(k.key)})),...O.value.map(({spec:k,polygons:Y})=>Qe(Q,{key:`plane-${k.key}`,polygons:Y,class:`polycss-transform-gizmo polycss-transform-plane polycss-transform-plane--${k.key}`,textureLighting:"baked",onPointerDown:D(k),...I(k.key)}))]:N.value.map(({spec:k,polygons:Y})=>Qe(Q,{key:k.key,polygons:Y,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${k.key}`,style:{"--ring-inner-ratio":_,"--ring-outer-ratio":H},textureLighting:"baked",onPointerDown:V(k),...I(k.key)}));return Qe("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:j},R)}}});import{defineComponent as Mi,inject as Ai,onMounted as Si,onBeforeUnmount as Ti,watch as wi}from"vue";import{BASE_TILE as Li}from"@layoutit/polycss-core";var Ri={enabled:!0,lookEnabled:!0,moveEnabled:!0,jumpEnabled:!0,crouchEnabled:!0,lookSensitivity:.15,invertY:!1,moveSpeed:5,jumpVelocity:7,gravity:18,eyeHeight:1.7,crouchHeight:1,groundZ:0,minPitch:5,maxPitch:175};function St(e,t){return{enabled:t.enabled??e.enabled,lookEnabled:t.lookEnabled??e.lookEnabled,moveEnabled:t.moveEnabled??e.moveEnabled,jumpEnabled:t.jumpEnabled??e.jumpEnabled,crouchEnabled:t.crouchEnabled??e.crouchEnabled,lookSensitivity:t.lookSensitivity??e.lookSensitivity,invertY:t.invertY??e.invertY,moveSpeed:t.moveSpeed??e.moveSpeed,jumpVelocity:t.jumpVelocity??e.jumpVelocity,gravity:t.gravity??e.gravity,eyeHeight:t.eyeHeight??e.eyeHeight,crouchHeight:t.crouchHeight??e.crouchHeight,groundZ:t.groundZ??e.groundZ,minPitch:t.minPitch??e.minPitch,maxPitch:t.maxPitch??e.maxPitch}}var to=new Set(["KeyW","ArrowUp"]),no=new Set(["KeyS","ArrowDown"]),oo=new Set(["KeyA","ArrowLeft"]),ro=new Set(["KeyD","ArrowRight"]),ao=new Set(["Space"]),Tt=new Set(["ControlLeft","ControlRight"]);function eo(e){return to.has(e)||no.has(e)||oo.has(e)||ro.has(e)||ao.has(e)||Tt.has(e)}function Oi(){return{change:[],start:[],end:[]}}function Te(e,t){let n=[...e[t]];for(let o of n)try{o()}catch{}}var io=Mi({name:"PolyFirstPersonControls",props:{enabled:{type:Boolean,default:!0},lookEnabled:{type:Boolean,default:!0},moveEnabled:{type:Boolean,default:!0},jumpEnabled:{type:Boolean,default:!0},crouchEnabled:{type:Boolean,default:!0},lookSensitivity:{type:Number,default:.15},invertY:{type:Boolean,default:!1},moveSpeed:{type:Number,default:5},jumpVelocity:{type:Number,default:7},gravity:{type:Number,default:18},eyeHeight:{type:Number,default:1.7},crouchHeight:{type:Number,default:1},groundZ:{type:Number,default:0},minPitch:{type:Number,default:5},maxPitch:{type:Number,default:175}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t,expose:n}){let o=Ai(K,null);if(!o)return typeof console<"u"&&console.warn("[polycss] <PolyFirstPersonControls> must be used inside <PolyCamera>."),n({}),()=>null;let{store:r,cameraRef:i,cameraElRef:s,applyTransformDirect:d}=o,a=St(Ri,e),c=[0,0,0],l=null,m=0,f=!1,y=!1,p=!1,b=new Set,P=0,E=0,C=Oi();function w(u,h){let v=u*Math.PI/180,A=h*Math.PI/180;return[-Math.sin(v)*Math.cos(A),-Math.sin(v)*Math.sin(A),-Math.cos(v)]}function g(){let u=s.value,h=u?getComputedStyle(u).perspective:"",v=parseFloat(h);return(Number.isFinite(v)&&v>0?v:8e3)/Li}function L(){let u=i.value.state,h=w(u.rotX??90,u.rotY??0),v=g();return[c[0]+h[0]*v,c[1]+h[1]*v,c[2]+h[2]*v]}function O(){let u=L(),h=i.value;h.update({target:u}),d(),r.updateCameraFromRef(h)}let N=.05;function _(u){if(l===null||f)return;let h=Math.min(N,m?(u-m)/1e3:.0167);if(m=u,a.enabled){let v=!1,A=i.value.state;if(a.moveEnabled){let R=0,k=0;for(let Y of b)to.has(Y)?R+=1:no.has(Y)?R-=1:ro.has(Y)?k+=1:oo.has(Y)&&(k-=1);if(R!==0||k!==0){let X=(A.rotY??0)*Math.PI/180,$=-Math.cos(X),z=-Math.sin(X),F=-Math.sin(X),S=Math.cos(X),U=Math.hypot(R,k)||1,B=a.moveSpeed*h;c[0]+=($*R+F*k)/U*B,c[1]+=(z*R+S*k)/U*B,v=!0}}let T=a.crouchEnabled&&(b.has("ControlLeft")||b.has("ControlRight"))?a.crouchHeight:a.eyeHeight;a.jumpEnabled&&(P!==0||E>0)?(P-=a.gravity*h,E+=P*h,E<=0&&(E=0,P=0)):a.jumpEnabled||(E=0,P=0);let j=a.groundZ+T+E;if(Math.abs(c[2]-j)>1e-4&&(c[2]=j,v=!0),v){let R=L(),k=i.value;k.update({target:R}),d(),r.updateCameraFromRef(k),Te(C,"change");try{t("change",[c[0],c[1],c[2]])}catch{}}}l=requestAnimationFrame(_)}function H(){l!==null||f||(m=0,l=requestAnimationFrame(_))}function M(){l!==null&&(cancelAnimationFrame(l),l=null)}let D=null;function V(){let u=s.value;if(!u)return;let h=u.ownerDocument??document,v=h.defaultView??globalThis,A=()=>{if(!(!a.enabled||!a.lookEnabled||f||y))try{u.requestPointerLock()}catch{}},x=()=>{let z=h.pointerLockElement===u;if(z!==y){if(y=z,z){p=!0,Te(C,"start");try{t("interaction-start",[c[0],c[1],c[2]])}catch{}}else if(p){p=!1,Te(C,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}}},T=z=>{if(!y||f||!a.enabled||!a.lookEnabled)return;let F=z.movementX??0,S=z.movementY??0;if(F===0&&S===0)return;let U=i.value,B=U.state,re=a.lookSensitivity,ce=a.invertY?-1:1,se=(((B.rotY??0)-F*re)%360+360)%360,W=(B.rotX??90)-S*re*ce;W<a.minPitch?W=a.minPitch:W>a.maxPitch&&(W=a.maxPitch);let ue=w(W,se),we=g(),rt=[c[0]+ue[0]*we,c[1]+ue[1]*we,c[2]+ue[2]*we];U.update({rotX:W,rotY:se,target:rt}),d(),r.updateCameraFromRef(U),Te(C,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},j=z=>{if(!(!a.enabled||f)&&eo(z.code)&&!(!y&&!a.moveEnabled)){if(ao.has(z.code)){if(!a.jumpEnabled)return;z.preventDefault(),!b.has(z.code)&&P===0&&E===0&&(P=a.jumpVelocity),b.add(z.code);return}Tt.has(z.code)&&!a.crouchEnabled||!a.moveEnabled&&!Tt.has(z.code)||(z.preventDefault(),b.add(z.code))}},R=z=>{eo(z.code)&&b.delete(z.code)},k=()=>{b.clear()};u.addEventListener("click",A),h.addEventListener("pointerlockchange",x),h.addEventListener("mousemove",T),v.addEventListener("keydown",j),v.addEventListener("keyup",R),v.addEventListener("blur",k);let Y=v.getComputedStyle(u).perspective,X=parseFloat(Y),$=Number.isFinite(X)&&X>0?X:2e3;u.style.setProperty("--polycss-fpv-perspective",`${$}px`),u.classList.add("polycss-fpv-host"),D=()=>{if(u.removeEventListener("click",A),h.removeEventListener("pointerlockchange",x),h.removeEventListener("mousemove",T),v.removeEventListener("keydown",j),v.removeEventListener("keyup",R),v.removeEventListener("blur",k),u.style.cursor="",u.classList.remove("polycss-fpv-host"),u.style.removeProperty("--polycss-fpv-perspective"),b.clear(),y)try{h.exitPointerLock()}catch{}}}n({update(u){a=St(a,u);let h=s.value;h&&!f&&(h.style.cursor=a.lookEnabled?"crosshair":"")},resume(){if(!f)return;f=!1;let u=s.value;u&&(u.style.cursor=a.lookEnabled?"crosshair":""),H()},pause(){if(f)return;f=!0,M();let u=s.value;if(u&&(u.style.cursor=""),p){p=!1,Te(C,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}},destroy(){f=!0,M()},lock(){if(!a.enabled||!a.lookEnabled||f)return;let u=s.value;try{u?.requestPointerLock()}catch{}},unlock(){if(y){let u=s.value;try{u?.ownerDocument?.exitPointerLock()}catch{}}},isLocked(){return y},getOrigin(){return[c[0],c[1],c[2]]},setOrigin(u){c[0]=u[0],c[1]=u[1],c[2]=u[2],O(),Te(C,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},addEventListener(u,h){let v=C[u];v.includes(h)||v.push(h)},removeEventListener(u,h){let v=C[u],A=v.indexOf(h);A>=0&&v.splice(A,1)},hasEventListener(u,h){return C[u].includes(h)}}),Si(()=>{let u=s.value;if(!u)return;f=!1,y=!1,p=!1,b.clear(),P=0,E=0;let v=i.value.state.target??[0,0,0];c[0]=v[0],c[1]=v[1],c[2]=a.groundZ+a.eyeHeight,O(),u.style.cursor=a.lookEnabled?"crosshair":"",V(),H()}),Ti(()=>{f=!0,M(),D?.(),D=null});let I=["enabled","lookEnabled","moveEnabled","jumpEnabled","crouchEnabled","lookSensitivity","invertY","moveSpeed","jumpVelocity","gravity","eyeHeight","crouchHeight","groundZ","minPitch","maxPitch"];for(let u of I)wi(()=>e[u],()=>{a=St(a,e);let h=s.value;h&&!f&&(h.style.cursor=a.lookEnabled?"crosshair":"")});return()=>null}});import{defineComponent as Di,h as ki,inject as wt,onBeforeUnmount as _i,onMounted as Hi,provide as Ii,reactive as Vi,ref as Fi,computed as zi}from"vue";var Ie=Symbol("polycss.selection"),so=Di({name:"PolySelect",props:{multiple:{type:Boolean,default:!1},clearOnMiss:{type:Boolean,default:!0},filter:{type:Function,default:void 0}},emits:{change:e=>!0,pointerMissed:e=>!0},setup(e,{emit:t,slots:n}){let o=Vi({selected:[]}),r=zi(()=>o.selected);function i(l){let m=e.filter?e.filter(l):l;o.selected=m,t("change",m)}let s={get selected(){return o.selected},set:l=>i(l),add:l=>{e.multiple?o.selected.includes(l)||i([...o.selected,l]):i([l])},remove:l=>{o.selected.includes(l)&&i(o.selected.filter(m=>m!==l))},toggle:l=>{o.selected.includes(l)?i(o.selected.filter(m=>m!==l)):e.multiple?i([...o.selected,l]):i([l])},clear:()=>i([]),has:l=>o.selected.includes(l)};Ii(Ie,{selected:r,api:s});let d=wt(K,void 0),a=(l,m)=>vt(l,m,f=>!f.closest("[data-poly-transform-controls]")),c=null;return Hi(()=>{let l=d?.cameraElRef.value;if(!l)return;let m=f=>{if(f.target?.closest("[data-poly-transform-controls]"))return;let p=Ee(f.target)??a(f.clientX,f.clientY);if(!p){t("pointerMissed",f),e.clearOnMiss&&i([]);return}e.multiple&&(f.shiftKey||f.metaKey||f.ctrlKey)?s.toggle(p):o.selected.length===1&&o.selected[0]===p?i([]):i([p])};l.addEventListener("click",m),c=()=>l.removeEventListener("click",m)}),_i(()=>{c?.()}),()=>ki("div",{style:{display:"contents"},"data-poly-select":""},n.default?.())}});function lo(){let e=wt(Ie,void 0);return e?e.selected:Fi([])}function co(){let e=wt(Ie,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}import{defineComponent as Ni,h as ji,computed as Yi}from"vue";import{axesHelperPolygons as Ui}from"@layoutit/polycss-core";var uo=Ni({name:"PolyAxesHelper",props:{size:{type:Number,default:void 0},thickness:{type:Number,default:void 0},negative:{type:Boolean,default:void 0},xColor:{type:String,default:void 0},yColor:{type:String,default:void 0},zColor:{type:String,default:void 0}},setup(e){let t=Yi(()=>Ui({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>ji(Q,{polygons:t.value})}});import{defineComponent as Xi,h as $i,computed as Lt}from"vue";import{octahedronPolygons as Bi}from"@layoutit/polycss-core";var Rt=50,mo=Xi({name:"PolyDirectionalLightHelper",props:{light:{type:Object,required:!0},target:{type:Array,default:void 0},distance:{type:Number,default:5},size:{type:Number,default:.35},color:{type:String,default:void 0}},setup(e){let t=Lt(()=>e.color??e.light.color??"#ffd54a"),n=Lt(()=>Bi({center:[0,0,0],size:e.size,color:t.value})),o=Lt(()=>{let r=e.light.direction,i=r[0],s=r[1],d=r[2],a=Math.hypot(i,s,d)||1,c=e.target?.[0]??0,l=e.target?.[1]??0,m=e.target?.[2]??0,f=c+s/a*e.distance,y=l+i/a*e.distance,p=m+d/a*e.distance;return[y*Rt,f*Rt,p*Rt]});return()=>$i(Q,{polygons:n.value,position:o.value})}});import{ref as fo,watch as Wi,onUnmounted as Zi,computed as ot}from"vue";import{createPolyAnimationMixer as Ki}from"@layoutit/polycss-core";function fe(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function Gi(e,t,n){let o=fo(null),r=null,i=null,s=null,d=fo(0);function a(){return n==null?o.value:fe(n)??o.value}function c(){i!==null&&(cancelAnimationFrame(i),i=null),s=null}function l(){c(),r&&(r.stopAllAction(),r.uncacheRoot(),r=null,d.value++)}function m(){if(i!==null)return;function C(w){if(s===null){s=w,i=requestAnimationFrame(C);return}let g=(w-s)/1e3;s=w,r?.update(g),i=requestAnimationFrame(C)}i=requestAnimationFrame(C)}function f(){l();let C=fe(e),w=fe(t);if(!C||C.length===0||!w)return;let g=a();g&&(r=Ki(g,w),d.value++,m())}let y=Wi(()=>{let C=fe(e),w=fe(t),g=n!=null?fe(n):o.value;return{c:C,ctrl:w,r:g}},()=>f(),{immediate:!0,deep:!1});Zi(()=>{y(),l()});let p=ot(()=>fe(e)??[]),b=ot(()=>p.value.map(C=>C.name)),P=ot(()=>(d.value,r)),E=ot(()=>{d.value;let C=p.value,w={};for(let g of C)Object.defineProperty(w,g.name,{enumerable:!0,get(){if(!r)return null;try{return r.clipAction(g.name)}catch{return null}}});return w});return{ref:o,mixer:P,clips:p,names:b,actions:E}}import{CAMERA_BACKFACE_CULL_EPS as Rc,VOXEL_CAMERA_CULL_AXIS_EPS as Oc,VOXEL_CAMERA_CULL_NORMAL_LIMIT as Dc,normalizePolygons as kc,mergePolygons as _c,coverPlanarPolygons as Hc,optimizeMeshPolygons as Ic,cullInteriorPolygons as Vc,cameraCullNormalGroups as Fc,cameraCullNormalGroupsFromPolygons as zc,cameraCullNormalKey as Nc,cameraCullVisibleSignature as jc,cameraFacingDepth as Yc,isAxisAlignedSurfaceNormal as Uc,isVoxelCameraCullableNormalGroups as Xc,normalFacesCamera as $c,polygonCssSurfaceNormal as Bc,polygonFacesCamera as Wc,parseObj as Zc,parseMtl as Kc,parseGltf as Gc,bakeSolidTextureSamples as qc,bakeSolidTextureSampledPolygons as Qc,loadMesh as Jc,createIsometricCamera as eu,parseVox as tu,polygonFaces as nu,computeTexturePaintMetrics as ou,computeShapeLighting as ru,parseColor as au,parsePureColor as iu,parseHexColor as su,parseRgbColor as lu,formatColor as cu,clampChannel as uu,shadeColor as du,rotateVec3 as mu,inverseRotateVec3 as fu,axesHelperPolygons as yu,boxPolygons as pu,arrowPolygons as gu,ringPolygons as hu,octahedronPolygons as vu,buildSceneContext as Pu,computeSceneBbox as bu,BASE_TILE as xu,DEFAULT_CAMERA_STATE as Cu,DEFAULT_PROJECTION as Eu,normalizeInvertMultiplier as Mu,createPolyAnimationMixer as Au,LoopOnce as Su,LoopRepeat as Tu,LoopPingPong as wu}from"@layoutit/polycss-core";export{xu as BASE_TILE,Rc as CAMERA_BACKFACE_CULL_EPS,Cu as DEFAULT_CAMERA_STATE,Eu as DEFAULT_PROJECTION,Su as LoopOnce,wu as LoopPingPong,Tu as LoopRepeat,En as Poly,uo as PolyAxesHelper,Le as PolyCamera,K as PolyCameraContextKey,mo as PolyDirectionalLightHelper,io as PolyFirstPersonControls,bn as PolyGround,jn as PolyMapControls,Q as PolyMesh,Dn as PolyOrbitControls,Ht as PolyOrthographicCamera,Le as PolyPerspectiveCamera,fn as PolyScene,so as PolySelect,Ie as PolySelectionContextKey,Jn as PolyTransformControls,Oc as VOXEL_CAMERA_CULL_AXIS_EPS,Dc as VOXEL_CAMERA_CULL_NORMAL_LIMIT,gu as arrowPolygons,yu as axesHelperPolygons,Qc as bakeSolidTextureSampledPolygons,qc as bakeSolidTextureSamples,pu as boxPolygons,Pu as buildSceneContext,Fc as cameraCullNormalGroups,zc as cameraCullNormalGroupsFromPolygons,Nc as cameraCullNormalKey,jc as cameraCullVisibleSignature,Yc as cameraFacingDepth,uu as clampChannel,bu as computeSceneBbox,ru as computeShapeLighting,ou as computeTexturePaintMetrics,Hc as coverPlanarPolygons,eu as createIsometricCamera,Au as createPolyAnimationMixer,Vc as cullInteriorPolygons,vt as findMeshUnderPoint,Ee as findPolyMeshHandle,cu as formatColor,ze as injectPolyBaseStyles,fu as inverseRotateVec3,Uc as isAxisAlignedSurfaceNormal,Xc as isVoxelCameraCullableNormalGroups,Jc as loadMesh,_c as mergePolygons,$c as normalFacesCamera,Mu as normalizeInvertMultiplier,kc as normalizePolygons,vu as octahedronPolygons,Ic as optimizeMeshPolygons,au as parseColor,Gc as parseGltf,su as parseHexColor,Kc as parseMtl,Zc as parseObj,iu as parsePureColor,lu as parseRgbColor,tu as parseVox,Me as pointInMeshElement,Bc as polygonCssSurfaceNormal,nu as polygonFaces,Wc as polygonFacesCamera,hu as ringPolygons,mu as rotateVec3,du as shadeColor,Gi as usePolyAnimation,ye as usePolyCamera,Ca as usePolyMaterial,Ge as usePolyMesh,Fe as usePolySceneContext,lo as usePolySelect,co as usePolySelectionApi};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layoutit/polycss-vue",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Native Vue 3 components for CSS polygon mesh rendering with 60fps imperative updates.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"access": "public"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@layoutit/polycss-core": "^0.0
|
|
45
|
+
"@layoutit/polycss-core": "^0.2.0"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"vue": "^3.0.0"
|