@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.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var vt=Object.defineProperty;var Co=Object.getOwnPropertyDescriptor;var Eo=Object.getOwnPropertyNames;var Mo=Object.prototype.hasOwnProperty;var Ao=(e,t)=>{for(var n in t)vt(e,n,{get:t[n],enumerable:!0})},So=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Eo(t))!Mo.call(e,r)&&r!==n&&vt(e,r,{get:()=>t[r],enumerable:!(o=Co(t,r))||o.enumerable});return e};var To=e=>So(vt({},"__esModule",{value:!0}),e);var ka={};Ao(ka,{BASE_TILE:()=>x.BASE_TILE,CAMERA_BACKFACE_CULL_EPS:()=>x.CAMERA_BACKFACE_CULL_EPS,DEFAULT_CAMERA_STATE:()=>x.DEFAULT_CAMERA_STATE,DEFAULT_PROJECTION:()=>x.DEFAULT_PROJECTION,LoopOnce:()=>x.LoopOnce,LoopPingPong:()=>x.LoopPingPong,LoopRepeat:()=>x.LoopRepeat,Poly:()=>It,PolyAxesHelper:()=>qt,PolyCamera:()=>De,PolyCameraContextKey:()=>J,PolyDirectionalLightHelper:()=>Jt,PolyFirstPersonControls:()=>Wt,PolyGround:()=>_t,PolyMapControls:()=>Nt,PolyMesh:()=>ie,PolyOrbitControls:()=>Ft,PolyOrthographicCamera:()=>bt,PolyPerspectiveCamera:()=>De,PolyScene:()=>Ot,PolySelect:()=>Zt,PolySelectionContextKey:()=>Ue,PolyTransformControls:()=>Xt,VOXEL_CAMERA_CULL_AXIS_EPS:()=>x.VOXEL_CAMERA_CULL_AXIS_EPS,VOXEL_CAMERA_CULL_NORMAL_LIMIT:()=>x.VOXEL_CAMERA_CULL_NORMAL_LIMIT,arrowPolygons:()=>x.arrowPolygons,axesHelperPolygons:()=>x.axesHelperPolygons,bakeSolidTextureSampledPolygons:()=>x.bakeSolidTextureSampledPolygons,bakeSolidTextureSamples:()=>x.bakeSolidTextureSamples,boxPolygons:()=>x.boxPolygons,buildSceneContext:()=>x.buildSceneContext,cameraCullNormalGroups:()=>x.cameraCullNormalGroups,cameraCullNormalGroupsFromPolygons:()=>x.cameraCullNormalGroupsFromPolygons,cameraCullNormalKey:()=>x.cameraCullNormalKey,cameraCullVisibleSignature:()=>x.cameraCullVisibleSignature,cameraFacingDepth:()=>x.cameraFacingDepth,clampChannel:()=>x.clampChannel,computeSceneBbox:()=>x.computeSceneBbox,computeShapeLighting:()=>x.computeShapeLighting,computeTexturePaintMetrics:()=>x.computeTexturePaintMetrics,coverPlanarPolygons:()=>x.coverPlanarPolygons,createIsometricCamera:()=>x.createIsometricCamera,createPolyAnimationMixer:()=>x.createPolyAnimationMixer,cullInteriorPolygons:()=>x.cullInteriorPolygons,findMeshUnderPoint:()=>dt,findPolyMeshHandle:()=>we,formatColor:()=>x.formatColor,injectPolyBaseStyles:()=>We,inverseRotateVec3:()=>x.inverseRotateVec3,isAxisAlignedSurfaceNormal:()=>x.isAxisAlignedSurfaceNormal,isVoxelCameraCullableNormalGroups:()=>x.isVoxelCameraCullableNormalGroups,loadMesh:()=>x.loadMesh,mergePolygons:()=>x.mergePolygons,normalFacesCamera:()=>x.normalFacesCamera,normalizeInvertMultiplier:()=>x.normalizeInvertMultiplier,normalizePolygons:()=>x.normalizePolygons,octahedronPolygons:()=>x.octahedronPolygons,optimizeMeshPolygons:()=>x.optimizeMeshPolygons,parseColor:()=>x.parseColor,parseGltf:()=>x.parseGltf,parseHexColor:()=>x.parseHexColor,parseMtl:()=>x.parseMtl,parseObj:()=>x.parseObj,parsePureColor:()=>x.parsePureColor,parseRgbColor:()=>x.parseRgbColor,parseVox:()=>x.parseVox,pointInMeshElement:()=>Le,polygonCssSurfaceNormal:()=>x.polygonCssSurfaceNormal,polygonFaces:()=>x.polygonFaces,polygonFacesCamera:()=>x.polygonFacesCamera,ringPolygons:()=>x.ringPolygons,rotateVec3:()=>x.rotateVec3,shadeColor:()=>x.shadeColor,usePolyAnimation:()=>ho,usePolyCamera:()=>Se,usePolyMaterial:()=>In,usePolyMesh:()=>Qe,usePolySceneContext:()=>Be,usePolySelect:()=>Kt,usePolySelectionApi:()=>Gt});module.exports=To(ka);var be=require("vue");var Pe=require("vue"),tt=require("@layoutit/polycss-core");function Pt(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 Se(e){let t=(0,tt.createIsometricCamera)({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),n=(0,Pe.shallowRef)(t),o=(0,Pe.ref)(null),r=(0,Pe.ref)(null),i=(0,Pe.ref)([0,0,0]),s=Pt(t.state);(0,Pe.watch)(()=>({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=tt.BASE_TILE,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,M=p*l,E=c.distance!==0?`translateZ(${-c.distance}px) `:"";a.style.transform=`${E}scale(${c.zoom}) rotateX(${c.rotX}deg) rotate(${c.rotY}deg) translate3d(${-b}px, ${-P}px, ${-M}px)`}return{store:s,cameraRef:n,sceneElRef:o,cameraElRef:r,autoCenterOffset:i,applyTransformDirect:d}}var J=Symbol("polycss-camera");var wo=8e3,De=(0,be.defineComponent)({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=(0,be.computed)(()=>({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}=Se(n);return(0,be.provide)(J,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}),()=>{let c=`${typeof e.perspective=="number"?e.perspective:wo}px`;return(0,be.h)("div",{ref:s,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:c}},t.default?.())}}});var xe=require("vue");var bt=(0,xe.defineComponent)({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=(0,xe.computed)(()=>({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}=Se(n);return(0,xe.provide)(J,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}),()=>(0,xe.h)("div",{ref:s,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:"none"}},t.default?.())}});var B=require("vue"),qe=require("@layoutit/polycss-core");var rn=require("vue"),nt=require("@layoutit/polycss-core");function Be(e,t){return(0,rn.computed)(()=>{let{directionalLight:n}=t.value,o=(0,nt.buildSceneContext)({polygons:e.value});return{polygons:(0,nt.mergePolygons)(o.context.polygons),sceneBbox:o.context.sceneBbox}})}var an="polycss-styles";function We(e=typeof document<"u"?document:null){if(!e||e.getElementById(an))return;let t=e.createElement("style");t.id=an,t.textContent=Lo,e.head.appendChild(t)}var Lo=`
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
169
208
|
var(--pnz) * var(--plz))))
|
|
170
209
|
);
|
|
171
210
|
}
|
|
172
|
-
`;var Tn=require("@layoutit/polycss-core");var Mt=require("vue"),ze=Symbol("polycss/scene-context");function At(){return(0,Mt.inject)(ze,null)}var F=require("vue"),Ln=50,wn=[.4,-.7,.59],Rn="#ffffff",On=1,Hn="#ffffff",Dn=.4,de=4096,Et=1,kn=.1,In=1,Tt=de*de,_n=Tt*3,Fe=2048,je=16*1024*1024,Vn=.995,K=.001,$n=.75,Lt=3,Un=2,Me=1e-9,Xn=.45,ue=new Map;function Yn(e){let t=ue.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}),ue.set(e,t),t.then(()=>{ue.get(e)===t&&ue.delete(e)},()=>{ue.get(e)===t&&ue.delete(e)})),t}function Ie(e){let t=typeof e=="string"?Number(e):e;return t===void 0||!Number.isFinite(t)?1:Math.min(In,Math.max(kn,t))}function We(e,t){let r=e.toFixed(t).replace(/\.?0+$/,"");return Object.is(Number(r),-0)?"0":r}function Be(e,t=Lt){return`matrix3d(${e.split(",").map(r=>{let o=Number(r.trim());return Number.isFinite(o)?We(o,t):r.trim()}).join(",")})`}function De(e,t=Un){return`${We(e,t)}%`}function wt(e){return e.reduce((t,r)=>t+r.width*r.height,0)}function zn(e){let t=wt(e);if(t<=0)return 1;let r=Math.max(1,...e.map(a=>Math.max(a.width,a.height))),o=Fe/r,n=Math.sqrt(je/(t*4));return Ie(Math.min(o,n))}function Nn(e){let t=wt(e),r=.5;return t<=Tt?r=1:t<=_n&&(r=.75),Ie(Math.min(r,zn(e)))}function Fn(e,t){return e.reduce((r,o)=>Math.max(r,Math.ceil(o.width*t),Math.ceil(o.height*t)),0)}function jn(e,t){return e.reduce((r,o)=>r+Math.ceil(o.width*t)*Math.ceil(o.height*t)*4,0)}function Bn(e,t){let r=Fn(e,t),o=jn(e,t),n=r>Fe?Fe/r:1,a=o>je?Math.sqrt(je/o):1;return Math.min(n,a)}function Wn(e,t){let r=Nn(t.pages),o=r===1?t:ke(e,r);for(let n=0;n<4;n++){let a=Bn(o.pages,r);if(a>=1)break;let i=Ie(r*a*Vn);if(i>=r)break;r=i,o=ke(e,r)}return{packed:o,atlasScale:r}}function Zn(e,t){if(t!==void 0&&t!=="auto"){let o=Ie(t);return{packed:ke(e,o),atlasScale:o}}let r=ke(e,1);return Wn(e,r)}function Gn(e){return Math.max(Et,Math.ceil(Et/e))}function te(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 fe(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 Rt(e){if(e.screenPts.length!==8)return!1;let t=[],r=[],o=(n,a)=>{for(let i of n)if(Math.abs(i-a)<=K)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])>K||Math.abs(r[0])>K||t[1]-t[0]<=K||r[1]-r[0]<=K))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])<=K||Math.abs(a-t[1])<=K,s=Math.abs(i-r[0])<=K||Math.abs(i-r[1])<=K;if(!m||!s)return!1}return!0}function ne(e){return!e.texture&&e.polygon.vertices.length===3}function Kn(){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 qn(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(`${De(a)} ${De(i)}`)}return`polygon(${t.join(", ")})`}function Jn(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=De(Math.max(0,Math.min(100,t/o/n*100))),m=De(Math.max(0,Math.min(100,r/o/a*100)));return`polygon(${Array.from({length:o},()=>`${i} ${m}`).join(", ")})`}function Qn(e){return`${qn(e)} ${Jn(e)}`}function eo(e,t=Lt){return e.map(r=>We(r,t)).join(",")}function to(e,t,r){return e.map(o=>[o[1]*t,o[0]*t,o[2]*r])}function no(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<=Me?null:[i[0]/m,i[1]/m,i[2]/m]}function Ne(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function oo(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 ro(e,t,r){if(!ne(e))return null;let o=to(e.polygon.vertices,e.tileSize,e.layerElevation),n=no(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(V=>{let k=o[V.a],b=o[V.b];return{...V,length:Math.hypot(b[0]-k[0],b[1]-k[1],b[2]-k[2])}}).sort((V,k)=>k.length-V.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<=Me)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=Ne(g,f),C=[l[0]+f[0]*v,l[1]+f[1]*v,l[2]+f[2]*v],O=[C[0]-u[0],C[1]-u[1],C[2]-u[2]],D=Math.hypot(O[0],O[1],O[2]);if(D<=Me)return null;let H=[O[0]/D,O[1]/D,O[2]/D];if(Ne(oo(f,H),n)<0){let V=m;if(m=i,i=V,l=o[i],c=o[m],y=Math.hypot(c[0]-l[0],c[1]-l[1],c[2]-l[2]),y<=Me)return null;f=[(c[0]-l[0])/y,(c[1]-l[1])/y,(c[2]-l[2])/y];let k=[u[0]-l[0],u[1]-l[1],u[2]-l[2]];v=Ne(k,f),C=[l[0]+f[0]*v,l[1]+f[1]*v,l[2]+f[2]*v],O=[C[0]-u[0],C[1]-u[1],C[2]-u[2]];let b=Math.hypot(O[0],O[1],O[2]);if(b<=Me)return null;H=[O[0]/b,O[1]/b,O[2]/b]}let d=Math.max(0,Math.min(y,v)),M=Math.max(0,y-d),p=Xn,E=d+p,P=M+p,S=D+p*2,A=u[0]-E*f[0]-p*H[0],T=u[1]-E*f[1]-p*H[1],R=u[2]-E*f[2]-p*H[2],w=eo([f[0],f[1],f[2],0,H[0],H[1],H[2],0,n[0],n[1],n[2],0,A,T,R,1]),h=t==="dynamic",I=fe(e.polygon.color??"#cccccc");return{transform:`matrix3d(${w})`,borderWidth:`0 ${P}px ${S}px ${E}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":(I.r/255).toFixed(4),"--psg":(I.g/255).toFixed(4),"--psb":(I.b/255).toFixed(4)}:null}}function ao({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 lo(e,t,r,o,n){let a=fe(e),i=fe(r),m=fe(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 ao({r:a.r*s,g:a.g*l,b:a.b*c})}function io(e,t,r,o){let n=fe(t),a=fe(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 so({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 co(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(),te(e,i),e.globalCompositeOperation="multiply",e.fillStyle=so(a),e.fillRect(t,r,o,n),e.restore())}function uo(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;te(e,i),e.drawImage(t,r+(n-c)/2,o+(a-u)/2,c,u)}function Ot(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],C=i[0],O=1-i[1],D=m[0],H=1-m[1],d=C-g,M=O-v,p=D-g,E=H-v,P=d*E-p*M;if(Math.abs(P)<=1e-9)return null;let S=c-s,A=y-s,T=u-l,R=f-l,w={a:(S*E-A*M)/P,b:(d*A-p*S)/P,c:(T*E-R*M)/P,d:(d*R-p*T)/P,e:0,f:0};return w.e=s-w.a*g-w.b*v,w.f=l-w.c*g-w.d*v,w}function Ht(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 mo(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=Ot(s,e.uvs),c=Ht(e.uvs);return!l&&!c?null:{screenPts:s.flatMap(([u,y])=>[u,y]),uvAffine:l,uvSampleRect:c}}function fo(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<=K||(a[i]+=m/l*t,a[i+1]+=s/l*t)}return a}function me(e,t){return Math.max(0,Math.min(t,e))}function St(e,t,r,o,n,a,i,m){let s=t.naturalWidth||t.width||1,l=t.naturalHeight||t.height||1,c=me(Math.min(r.minU,r.maxU)*s,s),u=me(Math.max(r.minU,r.maxU)*s,s),y=me(Math.min(r.minV,r.maxV)*l,l),f=me(Math.max(r.minV,r.maxV)*l,l),g=Math.floor(c),v=Math.floor(y),C=Math.ceil(u)-g,O=Math.ceil(f)-v;C<1&&(g=Math.floor(me((r.minU+r.maxU)/2*s,s-1)),C=1),O<1&&(v=Math.floor(me((r.minV+r.maxV)/2*l,l-1)),O=1),g=Math.max(0,Math.min(s-1,g)),v=Math.max(0,Math.min(l-1,v)),C=Math.max(1,Math.min(s-g,C)),O=Math.max(1,Math.min(l-v,O)),te(e,m),e.drawImage(t,g,v,C,O,o,n,a,i)}function yo(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 ye(e,t,r={}){let{vertices:o,texture:n,uvs:a}=e;if(!o||o.length<3)return null;let i=r.tileSize??Ln,m=r.layerElevation??i,s=Y=>[Y[1]*i,Y[0]*i,Y[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 C=[f[0]/v,f[1]/v,f[2]/v],O=-(f[1]*g[2]-f[2]*g[1]),D=-(f[2]*g[0]-f[0]*g[2]),H=-(f[0]*g[1]-f[1]*g[0]),d=Math.hypot(O,D,H);if(d===0)return null;O/=d,D/=d,H/=d;let M=[D*C[2]-H*C[1],H*C[0]-O*C[2],O*C[1]-D*C[0]],p=l.map(Y=>{let G=Y[0]-c[0],Le=Y[1]-c[1],we=Y[2]-c[2];return[G*C[0]+Le*C[1]+we*C[2],G*M[0]+Le*M[1]+we*M[2]]}),E=1/0,P=1/0,S=-1/0,A=-1/0;for(let[Y,G]of p)Y<E&&(E=Y),Y>S&&(S=Y),G<P&&(P=G),G>A&&(A=G);let T=-E,R=-P,w=S-E,h=A-P;if(!Number.isFinite(w)||!Number.isFinite(h))return null;let I=[];for(let Y=0;Y<p.length;Y++){let[G,Le]=p[Y],we=G+T,Pn=Le+R;I.push(we,Pn)}let V=c[0]-T*C[0]-R*M[0],k=c[1]-T*C[1]-R*M[1],b=c[2]-T*C[2]-R*M[2],L=[C[0],C[1],C[2],0,M[0],M[1],M[2],0,O,D,H,0,V,k,b,1].join(","),U=r.directionalLight,yt=r.ambientLight,se=U?.direction??wn,pt=U?.color??Rn,mn=Math.max(0,U?.intensity??On),gt=yt?.color??Hn,ht=Math.max(0,yt?.intensity??Dn),$e=Math.hypot(se[0],se[1],se[2])||1,dn=se[0]/$e,fn=se[1]/$e,yn=se[2]/$e,Pt=mn*Math.max(0,O*dn+D*fn+H*yn),pn=io(Pt,pt,gt,ht),gn=lo(e.color??"#cccccc",Pt,pt,gt,ht),vt=null,xt=null;n&&a&&a.length>=3&&a.length===o.length&&(xt=Ht(a),vt=Ot(p.map(([Y,G])=>[Y+T,G+R]),a));let hn=n&&e.textureTriangles?.length?e.textureTriangles.map(Y=>mo(Y,i,m,c,C,M,T,R)).filter(Y=>!!Y):null;return{index:t,polygon:e,texture:n,tileSize:i,layerElevation:m,matrix:L,canvasW:Math.max(1,Math.ceil(w)),canvasH:Math.max(1,Math.ceil(h)),screenPts:I,uvAffine:vt,uvSampleRect:xt,textureTriangles:hn,normal:[O,D,H],textureTint:pn,shadedColor:gn}}function ke(e,t=1){let r=Array(e.length).fill(null),o=[],n=Gn(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<=de){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>de)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>de||s.canvasH+n*2>de){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 po(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 Yn(l))}));for(let l of e.entries){let c=l.texture?m.get(l.texture):null;a.save(),te(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)te(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=fo(f.screenPts,$n);a.save(),te(a,o),a.beginPath();for(let v=0;v<g.length;v+=2){let C=l.x+g[v],O=l.y+g[v+1];v===0?a.moveTo(C,O):a.lineTo(C,O)}a.closePath(),a.clip(),f.uvAffine?(te(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&&St(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;te(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?St(a,c,l.uvSampleRect,l.x,l.y,l.canvasW,l.canvasH,o):c&&uo(a,c,l.x,l.y,l.canvasW,l.canvasH,o);l.texture&&t==="baked"&&co(a,l.x,l.y,l.canvasW,l.canvasH,l.textureTint,o),a.restore()}let s=await yo(n);return n.width=1,n.height=1,{width:e.width,height:e.height,url:s}}async function go(e,t,r,o,n){let a=[];for(let i of e){if(n())break;a.push(await po(i,t,r,o))}return a}function He(e){for(let t of e)URL.revokeObjectURL(t)}function pe(e,t,r=(0,F.computed)(()=>{})){let o=(0,F.computed)(()=>t.value!=="dynamic"&&Kn()),n=(0,F.computed)(()=>{let m=e.value.map(s=>!s||s.texture?s:ne(s)||t.value!=="dynamic"&&(o.value||Rt(s))?null:s);return Zn(m,r.value)}),a=(0,F.ref)(n.value.packed.pages.map(m=>({width:m.width,height:m.height,url:null}))),i=[];return(0,F.watch)(()=>[n.value,t.value],([m,s],l,c)=>{let{packed:u,atlasScale:y}=m,f=!1;He(i),i=[],a.value=u.pages.map(g=>({width:g.width,height:g.height,url:null})),c(()=>{f=!0,He(i),i=[]}),!(u.pages.length===0||typeof document>"u")&&go(u.pages,s,document,y,()=>f).then(g=>{if(f){He(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}),(0,F.onBeforeUnmount)(()=>{He(i),i=[]}),{entries:(0,F.computed)(()=>n.value.packed.entries),pages:a,ready:(0,F.computed)(()=>a.value.length===0||a.value.every(m=>!!m.url))}}function ge({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:Be(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(0,F.h)("s",{class:y,style:c,...u,...a})}function he({entry:e,className:t,style:r,domAttrs:o,pointerEvents:n="auto"}){let a=Rt(e),i=a?null:Qn(e),m=a?{width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Be(e.matrix),background:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...r}:{width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Be(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(0,F.h)(a?"b":"i",{class:l,style:m,...s,...o,onVnodeMounted:c,onVnodeUpdated:c})}function Pe({entry:e,textureLighting:t,className:r,style:o,domAttrs:n,pointerEvents:a="auto"}){let i=ro(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(0,F.h)("u",{class:s,style:{...i,...o},...m,...n})}var Ze=(0,_.defineComponent)({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=(0,_.inject)(N);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{store:n,sceneElRef:a}=o,i=(0,_.computed)(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight}));(0,_.provide)(ze,i);let m=n.getState().cameraState,s=(0,_.ref)(null);(0,_.watch)(s,M=>{a.value=M});let l=!1;(0,_.onMounted)(()=>{l||typeof document<"u"&&(Ce(document),l=!0)}),(0,_.watch)(()=>e.debugShowBackfaces,M=>{let p=s.value;p&&p.classList.toggle("polycss-debug-show-backfaces",!!M)});let c=(0,_.computed)(()=>e.polygons??[]),u=(0,_.computed)(()=>({directionalLight:e.directionalLight})),y=be(c,u),f=(0,_.computed)(()=>({"--scene-transform":(0,Ae.createIsometricCamera)(m).getStyle().transform})),g=(0,_.computed)(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,atlasScale:e.atlasScale})),v=(0,_.computed)(()=>{let M=e.textureLighting==="dynamic",p=M?void 0:e.directionalLight,E=M?void 0:e.ambientLight;return y.value.polygons.map((P,S)=>ye(P,S,{tileSize:g.value.tileSize,layerElevation:g.value.layerElevation,directionalLight:p,ambientLight:E}))}),C=(0,_.computed)(()=>e.textureLighting??"baked"),O=(0,_.computed)(()=>e.atlasScale),D=pe(v,C,O),H=(0,_.computed)(()=>{if(e.textureLighting!=="dynamic")return null;let M=e.directionalLight?.direction??[.4,-.7,.59],p=Math.hypot(M[0],M[1],M[2])||1,E=M[0]/p,P=M[1]/p,S=M[2]/p,A=(0,Ae.parseHexColor)(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],T=(0,Ae.parseHexColor)(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],R=e.directionalLight?.intensity??1,w=e.ambientLight?.intensity??.4,h=I=>(I/255).toFixed(4);return{"--plx":E.toFixed(4),"--ply":P.toFixed(4),"--plz":S.toFixed(4),"--plr":h(A[0]),"--plg":h(A[1]),"--plb":h(A[2]),"--pli":R.toFixed(4),"--par":h(T[0]),"--pag":h(T[1]),"--pab":h(T[2]),"--pai":w.toFixed(4)}}),d=(0,_.computed)(()=>{if(!e.autoCenter)return;let M=y.value.sceneBbox,p=g.value,E=(M.min[1]+M.max[1])/2*p.tileSize,P=(M.min[0]+M.max[0])/2*p.tileSize,S=(M.min[2]+M.max[2])/2*p.layerElevation;return`translate3d(${-E}px, ${-P}px, ${-S}px)`});return(0,_.onBeforeUnmount)(()=>{}),()=>{let M=`polycss-scene${e.class?` ${e.class}`:""}`,p=g.value,E=D.entries.value.map((A,T)=>{if(A)return ge({entry:A,page:D.pages.value[A.pageIndex],textureLighting:p.textureLighting??"baked"});let R=v.value[T];return!R||R.texture?null:ne(R)?Pe({entry:R,textureLighting:p.textureLighting??"baked"}):he({entry:R})}),P=t.default?.()??[],S=d.value?[(0,_.h)("div",{class:"polycss-offset",style:{"--offset-transform":d.value}},[...E,...P])]:[...E,...P];return(0,_.h)("div",{ref:s,class:M,"data-polycss-lighting":p.textureLighting??"baked","aria-hidden":"true",style:{...f.value,...H.value??null,...r.style},...Object.fromEntries(Object.entries(r).filter(([A])=>A!=="style"&&A!=="class"))},S)}}});var $=require("vue"),Te=require("@layoutit/polycss-core");var J=require("vue"),kt=require("@layoutit/polycss-core"),Dt=[],Ge=[];function Ee(e,t){let r=(0,J.ref)(Dt),o=(0,J.ref)(!!e.value),n=(0,J.ref)(null),a=(0,J.ref)(Ge),i=null;function m(){if(i){try{i.dispose()}catch{}i=null}}return(0,J.watch)(e,(s,l,c)=>{if(!s){m(),r.value=Dt,o.value=!1,n.value=null,a.value=Ge;return}let u=!1;o.value=!0,n.value=null;let y=i;(0,kt.loadMesh)(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??Ge}).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}),(0,J.onUnmounted)(()=>{m()}),{polygons:r,loading:o,error:n,warnings:a,dispose:m}}var Ke=new WeakMap;function It(e,t){Ke.set(e,t)}function _t(e){Ke.delete(e)}function le(e){let t=e;for(;t;){if(t instanceof HTMLElement){let r=Ke.get(t);if(r)return r}t=t.parentElement}return null}function Se(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=le(n);if(a&&Se(n,e,t))return a}return null}function ho(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 Po(e){if(e.length===0)return e;let t=(0,Te.computeSceneBbox)(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 q=(0,$.defineComponent)({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=(0,$.computed)(()=>e.src??""),a=(0,$.computed)(()=>e.mtl?{mtlUrl:e.mtl}:void 0),i=Ee(n,a.value),m=(0,$.computed)(()=>e.src?i.polygons.value:e.polygons??[]),s=(0,$.computed)(()=>e.autoCenter?Po(m.value):m.value),l=!t.polygon,c=At(),u=(0,$.computed)(()=>e.textureLighting??c?.value.textureLighting??"baked"),y=(0,$.computed)(()=>u.value==="dynamic"?void 0:c?.value.directionalLight),f=(0,$.computed)(()=>u.value==="dynamic"?void 0:c?.value.ambientLight),g=(0,$.computed)(()=>{if(u.value!=="dynamic")return null;let S=e.rotation;if(!S||S[0]===0&&S[1]===0&&S[2]===0)return null;let A=c?.value.directionalLight?.direction;if(!A)return null;let T=(0,Te.inverseRotateVec3)(A,S),R=Math.hypot(T[0],T[1],T[2])||1;return{"--plx":(T[0]/R).toFixed(4),"--ply":(T[1]/R).toFixed(4),"--plz":(T[2]/R).toFixed(4)}}),v=(0,$.ref)(e.rotation),C=(0,$.computed)(()=>{if(!l)return[];let S=y.value,A=S&&v.value?{...S,direction:(0,Te.inverseRotateVec3)(S.direction,v.value)}:S;return s.value.map((T,R)=>ye(T,R,{directionalLight:A,ambientLight:f.value}))}),O=(0,$.computed)(()=>e.atlasScale),D=pe(C,u,O),H=(0,$.ref)(null),d={get element(){return H.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),(0,$.onMounted)(()=>{H.value&&It(H.value,d)}),(0,$.onBeforeUnmount)(()=>{H.value&&_t(H.value)});let M=(0,$.inject)(N,null),p=null;function E(S,A,T){let R=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let k=document.elementsFromPoint(A,T),b=new Set;for(let L of k){let U=le(L);U&&!b.has(U)&&(b.add(U),R.push({object:U}))}}let w=0,h=0,I=M?.cameraElRef.value;if(I){let k=I.getBoundingClientRect();k.width>0&&k.height>0&&(w=(A-k.left)/k.width*2-1,h=-((T-k.top)/k.height*2-1))}let V=0;return p&&(V=Math.hypot(A-p.x,T-p.y)),{object:R[0]?.object??d,eventObject:d,intersections:R,pointer:{x:w,y:h},delta:V,nativeEvent:S,stopPropagation:()=>S.stopPropagation()}}function P(S,A,T,R){S&&S(E(A,T,R))}return()=>{let A={transform:ho(e.position,e.scale,e.rotation),...g.value??void 0,...r.style},T=Object.fromEntries(Object.entries(r).filter(([b])=>b!=="style"&&b!=="class")),R=`polycss-mesh${e.class?` ${e.class}`:""}`,w={};e.onClick&&(w.onClick=b=>{let L=b;P(e.onClick,L,L.clientX,L.clientY)}),e.onContextMenu&&(w.onContextmenu=b=>{let L=b;P(e.onContextMenu,L,L.clientX,L.clientY)}),e.onDoubleClick&&(w.onDblclick=b=>{let L=b;P(e.onDoubleClick,L,L.clientX,L.clientY)}),e.onWheel&&(w.onWheel=b=>{let L=b;P(e.onWheel,L,L.clientX,L.clientY)}),w.onPointerdown=b=>{let L=b;p={x:L.clientX,y:L.clientY},P(e.onPointerDown,L,L.clientX,L.clientY)},w.onPointerup=b=>{let L=b;P(e.onPointerUp,L,L.clientX,L.clientY),p=null},e.onPointerMove&&(w.onPointermove=b=>{let L=b;P(e.onPointerMove,L,L.clientX,L.clientY)}),(e.onPointerOver||e.onPointerEnter)&&(w.onPointerenter=b=>{let L=b;P(e.onPointerOver,L,L.clientX,L.clientY),P(e.onPointerEnter,L,L.clientX,L.clientY)}),(e.onPointerOut||e.onPointerLeave)&&(w.onPointerleave=b=>{let L=b;P(e.onPointerOut,L,L.clientX,L.clientY),P(e.onPointerLeave,L,L.clientX,L.clientY)}),e.onPointerCancel&&(w.onPointercancel=b=>{let L=b;P(e.onPointerCancel,L,L.clientX,L.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(0,$.h)("div",{ref:H,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:A,...h,...w,...T},t.fallback?.()??[]);if(e.src&&i.error.value&&i.polygons.value.length===0)return(0,$.h)("div",{ref:H,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:A,...h,...w,...T},t.error?.({error:i.error.value})??[]);let I=s.value,V=t.polygon?I.map((b,L)=>(0,$.h)("template",{key:L},t.polygon?.({polygon:b,index:L}))):D.entries.value.map((b,L)=>{if(b)return ge({entry:b,page:D.pages.value[b.pageIndex],textureLighting:u.value});let U=C.value[L];return!U||U.texture?null:ne(U)?Pe({entry:U,textureLighting:u.value}):he({entry:U})}),k=t.default?.()??[];return(0,$.h)("div",{ref:H,class:R,style:A,...h,...w,...T},[...V,...k])}}});var qe=require("vue");function Vt(e){return typeof e=="function"?(0,qe.computed)(()=>{let{texture:t,key:r}=e();return{texture:t,key:r}}):(0,qe.computed)(()=>({texture:e.texture,key:e.key}))}var W=require("vue");function vo(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 xo({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),C=m*f,O=(1-v)*g,D={width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:`matrix3d(${e.matrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${f}px ${g}px`,backgroundPosition:`-${C}px -${O}px`,pointerEvents:i==="none"?"none":void 0,...n},H=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([M,p])=>[`data-${M}`,String(p)])):{},d=o?.trim()||void 0;return(0,W.h)("i",{class:d,style:D,...H,...a})}var Je=(0,W.defineComponent)({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=(0,W.computed)(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=(0,W.computed)(()=>e.atlasScale??e.context?.atlasScale),n=(0,W.computed)(()=>e.material?.texture??e.texture),a=(0,W.computed)(()=>e.material&&e.uvs?vo(e.uvs):null),i=(0,W.computed)(()=>{let l=e.context?.tileSize??50;return ye({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=(0,W.computed)(()=>a.value?[]:[i.value]),s=pe(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[O,D]of Object.entries(e.data))f[`data-${O}`]=String(D);let g={...t,...f},v=Object.fromEntries(Object.entries(g).filter(([O])=>O!=="class"&&O!=="style")),C;return a.value&&e.material&&l?C=xo({plan:l,material:e.material,uvRect:a.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):c?C=ge({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&&(C=ne(l)?Pe({entry:l,textureLighting:r.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):he({entry:l,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"})),C?y?(0,W.h)("div",{class:"polycss-poly-wrapper",style:{position:"absolute",transformStyle:"preserve-3d",transform:y}},[C]):C:null}}});var j=require("vue"),Qe=require("@layoutit/polycss-core");var bo=150,$t=4,Co=513e-6,Mo=10,Ao=3,Ut=16.67,Eo=50,Xt=.1,Yt=10,zt=0,Nt=5e3,So=.3,To=.05;function Lo(e){return e===!0?-1:e===void 0||e===!1?1:e}function wo(e,t,r,o,n){let a=Lo(n),i=e/$t*a,m=t/$t*a;return{rotX:Math.max(0,Math.min(100,r-m)),rotY:((o-i)%360+360)%360}}function Ft(e,t,r,o,n){let a=Math.max(.01,r),i=Math.max(.1,Math.cos(o*Math.PI/180)),m=-e/(a*Qe.BASE_TILE),s=-t/(a*Qe.BASE_TILE*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 et=(0,j.defineComponent)({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:Xt},maxZoom:{type:Number,default:Yt},minDistance:{type:Number,default:zt},maxDistance:{type:Number,default:Nt},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let r=(0,j.inject)(N,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=(0,j.ref)(!1),g=null,v=null,C=null;function O(){let d=a.value;if(!d)return;let M=!1,p={x:0,y:0},E=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 I=h.clientX-y.x,V=h.clientY-y.y;y={x:h.clientX,y:h.clientY};let k=n.value,b=k.state;if(h.shiftKey){let{dWorldX:L,dWorldY:U}=Ft(I,V,b.zoom,b.rotX,b.rotY);k.update({target:[b.target[0]+L,b.target[1]+U,b.target[2]]})}else{let{rotX:L,rotY:U}=wo(I,V,b.rotX,b.rotY,e.invert);k.update({rotX:L,rotY:U})}i(),o.updateCameraFromRef(k),s()},S=h=>{if(u===h.pointerId){u=null,d.style.cursor=e.drag?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}f.value=!1,c()}},A=h=>{h.preventDefault()},T=h=>{h.button===2&&(M=!0,p={x:h.clientX,y:h.clientY})},R=h=>{if(!M||!e.drag)return;let I=h.clientX-p.x,V=h.clientY-p.y;p={x:h.clientX,y:h.clientY};let k=n.value,b=k.state,{dWorldX:L,dWorldY:U}=Ft(I,V,b.zoom,b.rotX,b.rotY);k.update({target:[b.target[0]+L,b.target[1]+U,b.target[2]]}),i(),o.updateCameraFromRef(k),s()},w=h=>{h.button===2&&M&&(M=!1,c())};d.style.cursor="grab",d.style.touchAction="none",d.style.userSelect="none",d.addEventListener("pointerdown",E),d.addEventListener("pointermove",P),d.addEventListener("pointerup",S),d.addEventListener("pointercancel",S),d.addEventListener("contextmenu",A),d.addEventListener("mousedown",T),d.addEventListener("mousemove",R),d.addEventListener("mouseup",w),g=()=>{d.removeEventListener("pointerdown",E),d.removeEventListener("pointermove",P),d.removeEventListener("pointerup",S),d.removeEventListener("pointercancel",S),d.removeEventListener("contextmenu",A),d.removeEventListener("mousedown",T),d.removeEventListener("mousemove",R),d.removeEventListener("mouseup",w),d.style.cursor="",d.style.touchAction="",d.style.userSelect=""}}function D(){let d=a.value;if(!d)return;let M=!1,p=null,E=P=>{if(!e.wheel)return;P.preventDefault();let S=P.deltaMode===1?16:P.deltaMode===2?100:1,A=P.deltaY*S;P.ctrlKey?A*=Mo:A*=Ao;let T=n.value;if(e.dolly){let R=e.minDistance??zt,w=e.maxDistance??Nt,h=Math.max(R,Math.min(w,T.state.distance+A*To));T.update({distance:h})}else{let R=Math.exp(-A*Co),w=e.minZoom??Xt,h=e.maxZoom??Yt,I=Math.max(w,Math.min(h,T.state.zoom*R));T.update({zoom:I})}i(),o.updateCameraFromRef(T),M||(M=!0,l()),s(),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,M=!1,c()},bo)};d.addEventListener("wheel",E,{passive:!1}),v=()=>{d.removeEventListener("wheel",E),p!==null&&clearTimeout(p)}}function H(){let d=null,M=!1,p=0,E=P=>{if(M)return;let S=e.animate;if(!S){d=requestAnimationFrame(E);return}if(f.value)p=P;else{let A=Math.min(Eo,p?P-p:Ut);p=P;let R=(S.speed??So)*(A/Ut),w=n.value,h=w.state;if(S.axis==="x"){let I=((h.rotX+R)%360+360)%360;w.update({rotX:I})}else{let I=((h.rotY+R)%360+360)%360;w.update({rotY:I})}i(),o.updateCameraFromRef(w),s()}d=requestAnimationFrame(E)};d=requestAnimationFrame(E),C=()=>{M=!0,d!==null&&cancelAnimationFrame(d),C=null}}return(0,j.onMounted)(()=>{e.drag&&O(),e.wheel&&D(),e.animate&&H()}),(0,j.onBeforeUnmount)(()=>{g?.(),v?.(),C?.(),g=null,v=null}),(0,j.watch)(()=>e.drag,d=>{d&&!g&&O(),!d&&g&&(g(),g=null)}),(0,j.watch)(()=>e.wheel,d=>{d&&!v&&D(),!d&&v&&(v(),v=null)}),(0,j.watch)(()=>!!e.animate,d=>{d&&!C&&H(),!d&&C&&C()}),()=>null}});var B=require("vue"),tt=require("@layoutit/polycss-core");var Ro=150,jt=4,Oo=513e-6,Ho=10,Do=3,Bt=16.67,ko=50,Wt=.1,Zt=10,Gt=0,Kt=5e3,Io=.3,_o=.05;function Vo(e){return e===!0?-1:e===void 0||e===!1?1:e}function qt(e,t,r,o,n){let a=Vo(n),i=e/jt*a,m=t/jt*a;return{rotX:Math.max(0,Math.min(100,r-m)),rotY:((o-i)%360+360)%360}}function $o(e,t,r,o,n){let a=Math.max(.01,r),i=Math.max(.1,Math.cos(o*Math.PI/180)),m=-e/(a*tt.BASE_TILE),s=-t/(a*tt.BASE_TILE*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 nt=(0,B.defineComponent)({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:Wt},maxZoom:{type:Number,default:Zt},minDistance:{type:Number,default:Gt},maxDistance:{type:Number,default:Kt},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let r=(0,B.inject)(N,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=(0,B.ref)(!1),g=null,v=null,C=null;function O(){let d=a.value;if(!d)return;let M=!1,p={x:0,y:0},E=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 I=h.clientX-y.x,V=h.clientY-y.y;y={x:h.clientX,y:h.clientY};let k=n.value,b=k.state;if(h.shiftKey){let{rotX:L,rotY:U}=qt(I,V,b.rotX,b.rotY,e.invert);k.update({rotX:L,rotY:U})}else{let{dWorldX:L,dWorldY:U}=$o(I,V,b.zoom,b.rotX,b.rotY);k.update({target:[b.target[0]+L,b.target[1]+U,b.target[2]]})}i(),o.updateCameraFromRef(k),s()},S=h=>{if(u===h.pointerId){u=null,d.style.cursor=e.drag?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}f.value=!1,c()}},A=h=>{h.preventDefault()},T=h=>{h.button===2&&(M=!0,p={x:h.clientX,y:h.clientY})},R=h=>{if(!M||!e.drag)return;let I=h.clientX-p.x,V=h.clientY-p.y;p={x:h.clientX,y:h.clientY};let k=n.value,b=k.state,{rotX:L,rotY:U}=qt(I,V,b.rotX,b.rotY,e.invert);k.update({rotX:L,rotY:U}),i(),o.updateCameraFromRef(k),s()},w=h=>{h.button===2&&M&&(M=!1,c())};d.style.cursor="grab",d.style.touchAction="none",d.style.userSelect="none",d.addEventListener("pointerdown",E),d.addEventListener("pointermove",P),d.addEventListener("pointerup",S),d.addEventListener("pointercancel",S),d.addEventListener("contextmenu",A),d.addEventListener("mousedown",T),d.addEventListener("mousemove",R),d.addEventListener("mouseup",w),g=()=>{d.removeEventListener("pointerdown",E),d.removeEventListener("pointermove",P),d.removeEventListener("pointerup",S),d.removeEventListener("pointercancel",S),d.removeEventListener("contextmenu",A),d.removeEventListener("mousedown",T),d.removeEventListener("mousemove",R),d.removeEventListener("mouseup",w),d.style.cursor="",d.style.touchAction="",d.style.userSelect=""}}function D(){let d=a.value;if(!d)return;let M=!1,p=null,E=P=>{if(!e.wheel)return;P.preventDefault();let S=P.deltaMode===1?16:P.deltaMode===2?100:1,A=P.deltaY*S;P.ctrlKey?A*=Ho:A*=Do;let T=n.value;if(e.dolly){let R=e.minDistance??Gt,w=e.maxDistance??Kt,h=Math.max(R,Math.min(w,T.state.distance+A*_o));T.update({distance:h})}else{let R=Math.exp(-A*Oo),w=e.minZoom??Wt,h=e.maxZoom??Zt,I=Math.max(w,Math.min(h,T.state.zoom*R));T.update({zoom:I})}i(),o.updateCameraFromRef(T),M||(M=!0,l()),s(),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,M=!1,c()},Ro)};d.addEventListener("wheel",E,{passive:!1}),v=()=>{d.removeEventListener("wheel",E),p!==null&&clearTimeout(p)}}function H(){let d=null,M=!1,p=0,E=P=>{if(M)return;let S=e.animate;if(!S){d=requestAnimationFrame(E);return}if(f.value)p=P;else{let A=Math.min(ko,p?P-p:Bt);p=P;let R=(S.speed??Io)*(A/Bt),w=n.value,h=w.state;if(S.axis==="x"){let I=((h.rotX+R)%360+360)%360;w.update({rotX:I})}else{let I=((h.rotY+R)%360+360)%360;w.update({rotY:I})}i(),o.updateCameraFromRef(w),s()}d=requestAnimationFrame(E)};d=requestAnimationFrame(E),C=()=>{M=!0,d!==null&&cancelAnimationFrame(d),C=null}}return(0,B.onMounted)(()=>{e.drag&&O(),e.wheel&&D(),e.animate&&H()}),(0,B.onBeforeUnmount)(()=>{g?.(),v?.(),C?.(),g=null,v=null}),(0,B.watch)(()=>e.drag,d=>{d&&!g&&O(),!d&&g&&(g(),g=null)}),(0,B.watch)(()=>e.wheel,d=>{d&&!v&&D(),!d&&v&&(v(),v=null)}),(0,B.watch)(()=>!!e.animate,d=>{d&&!C&&H(),!d&&C&&C()}),()=>null}});var X=require("vue"),Ve=require("@layoutit/polycss-core");var ot="#ff3653",rt="#8adb00",at="#2c8fff",Uo=.6,Xo=.8,Yo=1,lt=50,Jt=60,zo=.6,No=.0125,Fo=.15,jo=.04,Bo=1,Wo=.012,Zo=64,Go=1e-4,Qt={0:1,1:0,2:2},en=[{cssAxis:0,sign:1,key:"x",color:ot},{cssAxis:0,sign:-1,key:"-x",color:ot},{cssAxis:1,sign:1,key:"y",color:rt},{cssAxis:1,sign:-1,key:"-y",color:rt},{cssAxis:2,sign:1,key:"z",color:at},{cssAxis:2,sign:-1,key:"-z",color:at}],tn=[{cssAxis:0,key:"x",color:ot},{cssAxis:1,key:"y",color:rt},{cssAxis:2,key:"z",color:at}];function nn(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 an(e,t){return!t||t<=0?e:Math.round(e/t)*t}function Ko(e){return e.replace("-","")[0]}function qo(e){if(e.length===0)return Jt;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)*lt*zo:Jt}function on(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<Go)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=an(v,e.translationSnap);let C=[l[0]+v*r[0],l[1]+v*r[1],l[2]+v*r[2]];e.onObjectChange?.({object:e.target,position:C}),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 rn(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=an(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 Jo(e){return!!e&&typeof e=="object"&&"value"in e}function Qo(e){return e?Jo(e)?e.value??null:e:null}var it=(0,X.defineComponent)({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=(0,X.ref)(null),o=(0,X.ref)(null),n=(0,X.ref)(new Map),a=(0,X.computed)(()=>Qo(e.object)),i=(0,X.ref)(0);(0,X.onMounted)(()=>{i.value++});let m=(0,X.computed)(()=>(i.value,qo(a.value?.getPolygons()??[]))),s=(0,X.computed)(()=>m.value*e.size);function l(p){return o.value===p?Yo:r.value===p?Xo:Uo}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=(0,X.inject)(N,void 0),C=null;(0,X.onMounted)(()=>{let p=v?.cameraElRef.value;if(!p)return;let E=P=>{let S=a.value;if(!S||!e.enabled||P.target?.closest(".polycss-transform-gizmo"))return;let T={x:e.showX,y:e.showY,z:e.showZ},R=e.mode==="translate"?en:tn;for(let w of R){let h=w.key.replace("-","")[0];if(!T[h])continue;let I=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${w.key}`);if(!I||!Se(I,P.clientX,P.clientY))continue;P.preventDefault(),P.stopPropagation();let V=I.closest("[data-poly-transform-controls]");if(!V)return;if(o.value=w.key,e.mode==="translate"){let k=w;on({cssAxis:k.cssAxis,sign:k.sign,shaftLengthCss:s.value,wrapper:V,target:S,startClientX:P.clientX,startClientY:P.clientY,translationSnap:e.translationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:b=>{b||(o.value=null),y(b)}})}else rn({cssAxis:w.cssAxis,wrapper:V,target:S,startClientX:P.clientX,startClientY:P.clientY,rotationSnap:e.rotationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:k=>{k||(o.value=null),y(k)}});return}};p.addEventListener("pointerdown",E),C=()=>p.removeEventListener("pointerdown",E)}),(0,X.onBeforeUnmount)(()=>{C?.()});let O=(0,X.computed)(()=>{if(e.mode!=="translate")return[];i.value;let E=s.value/lt;return en.filter(P=>({x:e.showX,y:e.showY,z:e.showZ})[Ko(P.key)]).map(P=>{let S=l(P.key);return{spec:P,polygons:(0,Ve.arrowPolygons)({axis:Qt[P.cssAxis],sign:P.sign,shaftLength:E,shaftHalfThickness:E*No,headLength:E*Fo,headHalfThickness:E*jo,color:nn(P.color,S)})}})}),D=(0,X.computed)(()=>{if(e.mode!=="rotate")return[];i.value;let E=s.value*Bo/lt;return tn.filter(P=>({x:e.showX,y:e.showY,z:e.showZ})[P.key]).map(P=>{let S=l(P.key);return{spec:P,polygons:(0,Ve.ringPolygons)({axis:Qt[P.cssAxis],radius:E,halfThickness:E*Wo,segments:Zo,color:nn(P.color,S)})}})});function H(p){return E=>{if(!e.enabled)return;let P=a.value;if(!P)return;E.stopPropagation();let A=E.eventObject.element?.closest("[data-poly-transform-controls]");A&&(o.value=p.key,on({cssAxis:p.cssAxis,sign:p.sign,shaftLengthCss:s.value,wrapper:A,target:P,startClientX:E.nativeEvent.clientX,startClientY:E.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:T=>{T||(o.value=null),y(T)}}))}}function d(p){return E=>{if(!e.enabled)return;let P=a.value;if(!P)return;E.stopPropagation();let A=E.eventObject.element?.closest("[data-poly-transform-controls]");A&&(o.value=p.key,rn({cssAxis:p.cssAxis,wrapper:A,target:P,startClientX:E.nativeEvent.clientX,startClientY:E.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:T=>{T||(o.value=null),y(T)}}))}}function M(p){return{onPointerOver:()=>{r.value=p},onPointerOut:()=>{r.value===p&&(r.value=null)}}}return()=>{let p=a.value;if(!p)return null;let E=p.getPosition()??[0,0,0],P={position:"absolute",transformStyle:"preserve-3d",transform:`translate3d(${E[0]}px, ${E[1]}px, ${E[2]}px)`,zIndex:1e3},S=e.mode==="translate"?O.value.map(({spec:A,polygons:T})=>(0,X.h)(q,{key:A.key,polygons:T,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${A.key}`,textureLighting:"baked",onPointerDown:H(A),...M(A.key)})):D.value.map(({spec:A,polygons:T})=>(0,X.h)(q,{key:A.key,polygons:T,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${A.key}`,textureLighting:"baked",onPointerDown:d(A),...M(A.key)}));return(0,X.h)("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:P},S)}}});var z=require("vue");var ve=Symbol("polycss.selection"),st=(0,z.defineComponent)({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=(0,z.reactive)({selected:[]}),n=(0,z.computed)(()=>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)};(0,z.provide)(ve,{selected:n,api:i});let m=(0,z.inject)(N,void 0),s=(c,u)=>_e(c,u,y=>!y.closest("[data-poly-transform-controls]")),l=null;return(0,z.onMounted)(()=>{let c=m?.cameraElRef.value;if(!c)return;let u=y=>{if(y.target?.closest("[data-poly-transform-controls]"))return;let g=le(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)}),(0,z.onBeforeUnmount)(()=>{l?.()}),()=>(0,z.h)("div",{style:{display:"contents"},"data-poly-select":""},r.default?.())}});function ct(){let e=(0,z.inject)(ve,void 0);return e?e.selected:(0,z.ref)([])}function ut(){let e=(0,z.inject)(ve,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}var xe=require("vue"),ln=require("@layoutit/polycss-core");var mt=(0,xe.defineComponent)({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=(0,xe.computed)(()=>(0,ln.axesHelperPolygons)({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>(0,xe.h)(q,{polygons:t.value})}});var oe=require("vue"),sn=require("@layoutit/polycss-core");var dt=50,ft=(0,oe.defineComponent)({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=(0,oe.computed)(()=>e.color??e.light.color??"#ffd54a"),r=(0,oe.computed)(()=>(0,sn.octahedronPolygons)({center:[0,0,0],size:e.size,color:t.value})),o=(0,oe.computed)(()=>{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*dt,y*dt,g*dt]});return()=>(0,oe.h)(q,{polygons:r.value,position:o.value})}});var Z=require("vue"),cn=require("@layoutit/polycss-core");function ie(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function un(e,t,r){let o=(0,Z.ref)(null),n=null,a=null,i=null,m=(0,Z.ref)(0);function s(){return r==null?o.value:ie(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 D(H){if(i===null){i=H,a=requestAnimationFrame(D);return}let d=(H-i)/1e3;i=H,n?.update(d),a=requestAnimationFrame(D)}a=requestAnimationFrame(D)}function y(){c();let D=ie(e),H=ie(t);if(!D||D.length===0||!H)return;let d=s();d&&(n=(0,cn.createPolyAnimationMixer)(d,H),m.value++,u())}let f=(0,Z.watch)(()=>{let D=ie(e),H=ie(t),d=r!=null?ie(r):o.value;return{c:D,ctrl:H,r:d}},()=>y(),{immediate:!0,deep:!1});(0,Z.onUnmounted)(()=>{f(),c()});let g=(0,Z.computed)(()=>ie(e)??[]),v=(0,Z.computed)(()=>g.value.map(D=>D.name)),C=(0,Z.computed)(()=>(m.value,n)),O=(0,Z.computed)(()=>{m.value;let D=g.value,H={};for(let d of D)Object.defineProperty(H,d.name,{enumerable:!0,get(){if(!n)return null;try{return n.clipAction(d.name)}catch{return null}}});return H});return{ref:o,mixer:C,clips:g,names:v,actions:O}}var x=require("@layoutit/polycss-core");0&&(module.exports={BASE_TILE,DEFAULT_CAMERA_STATE,DEFAULT_PROJECTION,LoopOnce,LoopPingPong,LoopRepeat,Poly,PolyAxesHelper,PolyCamera,PolyCameraContextKey,PolyDirectionalLightHelper,PolyMapControls,PolyMesh,PolyOrbitControls,PolyOrthographicCamera,PolyPerspectiveCamera,PolyScene,PolySelect,PolySelectionContextKey,PolyTransformControls,arrowPolygons,axesHelperPolygons,bakeSolidTextureSampledPolygons,bakeSolidTextureSamples,buildSceneContext,clampChannel,computeSceneBbox,computeShapeLighting,computeTexturePaintMetrics,coverPlanarPolygons,createIsometricCamera,createPolyAnimationMixer,cullInteriorPolygons,findMeshUnderPoint,findPolyMeshHandle,formatColor,injectPolyBaseStyles,inverseRotateVec3,loadMesh,mergePolygons,normalizeInvertMultiplier,normalizePolygons,octahedronPolygons,parseColor,parseGltf,parseHexColor,parseMtl,parseObj,parsePureColor,parseRgbColor,parseVox,pointInMeshElement,polygonFaces,ringPolygons,rotateVec3,shadeColor,usePolyAnimation,usePolyCamera,usePolyMaterial,usePolyMesh,usePolySceneContext,usePolySelect,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
|
+
`;var Ro=require("@layoutit/polycss-core");var sn=require("vue"),xt=Symbol("polycss/scene-context");function ln(){return(0,sn.inject)(xt,null)}var ee=require("vue"),St=require("@layoutit/polycss-core"),Oo=50,Do=[.4,-.7,.59],ko="#ffffff",_o=1,Ho="#ffffff",Io=.4,He=4096,cn=1,Vo=.1,Fo=1,bn=He*He,zo=bn*3,Mt=2048,No=4*1024*1024,jo=16*1024*1024,Yo=.995,ue=.001,Uo=.75,Xo=1,$o=250,un=1.5,xn=3,Bo=2,Wo=4,At=64,Te=64,ye=64,Zo=128,dn=50,mn=1e-7,fn=16,Ko=.05,Go=4,qo=.6,ne=1e-9,Qo=.6,ke=new Map;function Jo(e){let t=ke.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}),ke.set(e,t),t.then(()=>{ke.get(e)===t&&ke.delete(e)},()=>{ke.get(e)===t&&ke.delete(e)})),t}function st(e){let t=typeof e=="string"?Number(e):e;return t===void 0||!Number.isFinite(t)?1:Math.min(Fo,Math.max(Vo,t))}function lt(e,t){let n=e.toFixed(t).replace(/\.?0+$/,"");return Object.is(Number(n),-0)?"0":n}function ot(e,t=Wo){let n=lt(e,t);return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function Tt(e,t=xn){return`matrix3d(${e.split(",").map(n=>{let o=Number(n.trim());return Number.isFinite(o)?lt(o,t):n.trim()}).join(",")})`}function at(e,t=Bo){let n=lt(e,t);return Number(n)===0?"0":`${n}%`}function er(e,t,n,o,r,i){let s=(e-n)*(i-o)-(t-o)*(r-n);return Math.abs(s)>mn?!1:(e-n)*(e-r)+(t-o)*(t-i)<=mn}function tr(e,t=dn,n=dn){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(er(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 Cn(e){return e.reduce((t,n)=>t+n.width*n.height,0)}function nr(e,t){let n=Cn(e);if(n<=0)return 1;let o=Math.max(1,...e.map(s=>Math.max(s.width,s.height))),r=Mt/o,i=Math.sqrt(t/(n*4));return st(Math.min(r,i))}function En(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 or(e){return En(e)?No:jo}function rr(e,t){return e!==void 0&&e!=="auto"||En(t)?ye:Zo}function ar(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 yn(e,t){for(let n of e.entries)n&&(n.atlasCanonicalSize=t,n.atlasMatrix=ar(n,t));return e}function ir(e,t){let n=Cn(e),o=.5;return n<=bn?o=1:n<=zo&&(o=.75),st(Math.min(o,nr(e,t)))}function sr(e,t){return e.reduce((n,o)=>Math.max(n,Math.ceil(o.width*t),Math.ceil(o.height*t)),0)}function lr(e,t){return e.reduce((n,o)=>n+Math.ceil(o.width*t)*Math.ceil(o.height*t)*4,0)}function cr(e,t,n){let o=sr(e,t),r=lr(e,t),i=o>Mt?Mt/o:1,s=r>n?Math.sqrt(n/r):1;return Math.min(i,s)}function ur(e,t,n){let o=ir(t.pages,n),r=o===1?t:it(e,o);for(let i=0;i<4;i++){let s=cr(r.pages,o,n);if(s>=1)break;let d=st(o*s*Yo);if(d>=o)break;o=d,r=it(e,o)}return{packed:r,atlasScale:o}}function dr(e,t,n){let o=rr(t,n);if(t!==void 0&&t!=="auto"){let s=st(t);return{packed:yn(it(e,s),o),atlasScale:s,atlasCanonicalSize:o}}let r=it(e,1),i=ur(e,r,or(n));return{packed:yn(i.packed,o),atlasScale:i.atlasScale,atlasCanonicalSize:o}}function mr(e){return Math.max(cn,Math.ceil(cn/e))}function pe(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 Ce(e){let t=(0,St.parsePureColor)(e);return t?{r:t.rgb[0],g:t.rgb[1],b:t.rgb[2]}:{r:255,g:255,b:255}}function wt({r:e,g:t,b:n}){return`${e},${t},${n}`}function fr(e){return(0,St.parsePureColor)(e)?.alpha??1}function Ke(e){if(e.screenPts.length!==8)return!1;let t=[],n=[],o=(r,i)=>{for(let s of r)if(Math.abs(s-i)<=ue)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])>ue||Math.abs(n[0])>ue||t[1]-t[0]<=ue||n[1]-n[0]<=ue))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])<=ue||Math.abs(i-t[1])<=ue,a=Math.abs(s-n[0])<=ue||Math.abs(s-n[1])<=ue;if(!d||!a)return!1}return!0}function de(e){return!e.texture&&e.polygon.vertices.length===3}function Ge(e){return!e.texture&&!!e.projectiveMatrix&&!Ke(e)}function Lt(){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 Mn(){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 pn(e,t){e.set(t,(e.get(t)??0)+1)}function gn(e){let t,n=1;for(let[o,r]of e)r>n&&(t=o,n=r);return t}var yr=new Map([["transform",0],["border-shape",1],["border-width",2],["width",3],["height",4],["color",5]]);function pr(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:yr.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 An(e,t){let n=new Map,o=new Map,r=new Map,i=Mn(),s=t!=="dynamic"&&Lt();for(let c of e)if(!(!c||c.texture)){if(t==="dynamic"){if(!(i&&de(c))&&!Ke(c))continue;let l=Ce(c.polygon.color??"#cccccc"),m=wt(l);pn(o,m),r.has(m)||r.set(m,l);continue}!(i&&de(c))&&!Ke(c)&&!s||pn(n,c.shadedColor)}let d=gn(n),a=gn(o);return{paintColor:d,dynamicColorKey:a,dynamicColor:a?r.get(a):void 0}}function gr(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 hr([e,t]){return`${at(e)} ${at(t)}`}function vr(e){return`polygon(${e.map(hr).join(",")})`}function Pr(e){if(tr(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=at(Math.max(0,Math.min(100,t/o))),i=at(Math.max(0,Math.min(100,n/o)));return`circle(0 at ${r} ${i})`}function Rt(e){let t=gr(e);return`${vr(t)} ${Pr(t)}`}function Sn(e,t=xn){return e.map(n=>lt(n,t)).join(",")}function Tn(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,Sn(o))}function br(e){return Tn(e,(e.canvasW||1)/fn,(e.canvasH||1)/fn)}function xr(e){return Tn(e,(e.canvasW||1)/At,(e.canvasH||1)/At)}function wn(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)<=ne)return!1;let d=Math.sign(s);if(t===0)t=d;else if(d!==t)return!1}return!0}function Cr(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 Er(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)<=ne)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 Ln(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(!wn(n))return Ze(e,t);let o=Cr(n);if(Math.abs(o)<=ne)return Ze(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<=ne)return Ze(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=Er(c.a,c.b,l.a,l.b);if(!m)return Ze(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 hn(e){if(e.length!==4||!wn(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)<=ne)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(M=>!Number.isFinite(M)||M<=Ko))return null;let b=Math.min(...p);return Math.max(...p)/b>Go?null:{g:f,h:y,w1:1+f,w3:1+y}}function Mr(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(!hn(d))return null;let a=Ln(e,qo),c=[[a[0],a[1]],[a[2],a[3]],[a[4],a[5]],[a[6],a[7]]],l=hn(c);if(!l)return null;let{g:m,h:f,w1:y,w3:p}=l,[b,P,,M]=c,E=([I,A])=>[r+I*t[0]+A*n[0],i+I*t[1]+A*n[1],s+I*t[2]+A*n[2]],L=E(b),g=E(P),R=E(M),D=[g[0]*y-L[0],g[1]*y-L[1],g[2]*y-L[2]],j=[R[0]*p-L[0],R[1]*p-L[1],R[2]*p-L[2]],H=[D[0],D[1],D[2],m,j[0],j[1],j[2],f,o[0],o[1],o[2],0,L[0],L[1],L[2],1];for(let I=0;I<8;I+=1)H[I]/=At;return H.join(",")}function Ar(e,t,n){return e.map(o=>[o[1]*t,o[0]*t,o[2]*n])}function vn(e){return`${e[0]},${e[1]},${e[2]}`}function Sr(e,t){let n=vn(e),o=vn(t);return n<o?`${n}|${o}`:`${o}|${n}`}function ct(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=Sr(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 Tr(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<=ne?null:[n[0]/o,n[1]/o,n[2]/o]}function Ct(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function wr(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 Lr(e,t,n,o){if(!de(e))return null;let r=Ar(e.polygon.vertices,e.tileSize,e.layerElevation),i=Tr(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(T=>{let $=r[T.a],G=r[T.b];return{...T,length:Math.hypot(G[0]-$[0],G[1]-$[1],G[2]-$[2])}}).sort((T,$)=>$.length-T.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<=ne)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=Ct(b,p),M=[l[0]+p[0]*P,l[1]+p[1]*P,l[2]+p[2]*P],E=[M[0]-f[0],M[1]-f[1],M[2]-f[2]],L=Math.hypot(E[0],E[1],E[2]);if(L<=ne)return null;let g=[E[0]/L,E[1]/L,E[2]/L];if(Ct(wr(p,g),i)<0){let T=a;if(a=d,d=T,l=r[d],m=r[a],y=Math.hypot(m[0]-l[0],m[1]-l[1],m[2]-l[2]),y<=ne)return null;p=[(m[0]-l[0])/y,(m[1]-l[1])/y,(m[2]-l[2])/y];let $=[f[0]-l[0],f[1]-l[1],f[2]-l[2]];P=Ct($,p),M=[l[0]+p[0]*P,l[1]+p[1]*P,l[2]+p[2]*P],E=[M[0]-f[0],M[1]-f[1],M[2]-f[2]];let G=Math.hypot(E[0],E[1],E[2]);if(G<=ne)return null;g=[E[0]/G,E[1]/G,E[2]/G]}let R=Math.max(0,Math.min(y,P)),D=Math.max(0,y-R),j=Ln([R,0,0,L,R+D,L],Qo),H=[j[0],j[1]],I=[j[2],j[3]],A=[j[4],j[5]],k=(I[1]+A[1])/2,F=H[0]-I[0],V=A[0]-H[0],u=k-H[1];if(F<=ne||V<=ne||u<=ne||!Number.isFinite(F+V+u))return null;let h=t==="dynamic",v=Ce(e.polygon.color??"#cccccc"),S=h&&wt(v)===o?.dynamicColorKey,C={color:h||e.shadedColor===o?.paintColor?void 0:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...h&&!S?{"--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},w=([T,$])=>[f[0]+(T-R)*p[0]+$*g[0],f[1]+(T-R)*p[1]+$*g[1],f[2]+(T-R)*p[2]+$*g[2]],Y=w(H),O=w([I[0],k]),_=w([A[0],k]),U=Te/2,W=[(_[0]-O[0])/Te,(_[1]-O[1])/Te,(_[2]-O[2])/Te],K=[Y[0]-W[0]*U,Y[1]-W[1]*U,Y[2]-W[2]*U],N=[(O[0]-K[0])/Te,(O[1]-K[1])/Te,(O[2]-K[2])/Te];return{transform:`matrix3d(${Sn([W[0],W[1],W[2],0,N[0],N[1],N[2],0,i[0],i[1],i[2],0,K[0],K[1],K[2],1])})`,...C}}function Rr({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 Or(e,t,n,o,r){let i=Ce(e),s=Ce(n),d=Ce(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=fr(e);return p<1?`rgba(${m}, ${f}, ${y}, ${p})`:Rr({r:m,g:f,b:y})}function Dr(e,t,n,o){let r=Ce(t),i=Ce(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 kr({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 _r(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(),pe(e,s),e.globalCompositeOperation="multiply",e.fillStyle=kr(i),e.fillRect(t,n,o,r),e.restore())}function Hr(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;pe(e,s),e.drawImage(t,n+(r-l)/2,o+(i-m)/2,l,m)}function Rn(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],M=1-s[1],E=d[0],L=1-d[1],g=P-p,R=M-b,D=E-p,j=L-b,H=g*j-D*R;if(Math.abs(H)<=1e-9)return null;let I=l-a,A=f-a,k=m-c,F=y-c,V={a:(I*j-A*R)/H,b:(g*A-D*I)/H,c:(k*j-F*R)/H,d:(g*F-D*k)/H,e:0,f:0};return V.e=a-V.a*p-V.b*b,V.f=c-V.c*p-V.d*b,V}function On(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 Ir(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=Rn(a,e.uvs),l=On(e.uvs);return!c&&!l?null:{screenPts:a.flatMap(([m,f])=>[m,f]),uvAffine:c,uvSampleRect:l}}function Ze(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<=ue||(i[s]+=d/c*t,i[s+1]+=a/c*t)}return i}function Et(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 _e(e,t){return Math.max(0,Math.min(t,e))}function Pn(e,t,n,o,r,i,s,d){let a=t.naturalWidth||t.width||1,c=t.naturalHeight||t.height||1,l=_e(Math.min(n.minU,n.maxU)*a,a),m=_e(Math.max(n.minU,n.maxU)*a,a),f=_e(Math.min(n.minV,n.maxV)*c,c),y=_e(Math.max(n.minV,n.maxV)*c,c),p=Math.floor(l),b=Math.floor(f),P=Math.ceil(m)-p,M=Math.ceil(y)-b;P<1&&(p=Math.floor(_e((n.minU+n.maxU)/2*a,a-1)),P=1),M<1&&(b=Math.floor(_e((n.minV+n.maxV)/2*c,c-1)),M=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)),M=Math.max(1,Math.min(c-b,M)),pe(e,d),e.drawImage(t,p,b,P,M,o,r,i,s)}function Vr(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 Fr(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=Ze(a.screenPts,Uo);e.save(),pe(e,o),e.beginPath(),Vr(e,t.x,t.y,c,r,i),e.clip(),a.uvAffine?(pe(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&&Pn(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;pe(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?Pn(e,n,t.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o):Hr(e,n,t.x+r,t.y+i,t.canvasW,t.canvasH,o)}function zr(e,t,n,o,r,i){let s=r-n,d=i-o,a=s*s+d*d;if(a<=ne)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 Nr(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,zr(e,t,n[d],n[d+1],n[a],n[a+1]))}return r}function jr(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 M=(f*t+y)*4;e[M+3]<$o||(l=M,m=P)}return l}function Yr(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(un,un/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,M=c[P+3];if(M<Xo||M===255)continue;let E=(r+b+.5)/n-t.x,L=(i+p+.5)/n-t.y;if(Nr(E,L,t.screenPts,t.textureEdgeRepairEdges)>m)continue;let g=jr(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 Ur(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 Ie(e,t,n={}){let{vertices:o,texture:r,uvs:i}=e;if(!o||o.length<3)return null;let s=n.tileSize??Oo,d=n.layerElevation??s,a=Q=>[Q[1]*s,Q[0]*s,Q[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],M=-(y[1]*p[2]-y[2]*p[1]),E=-(y[2]*p[0]-y[0]*p[2]),L=-(y[0]*p[1]-y[1]*p[0]),g=Math.hypot(M,E,L);if(g===0)return null;M/=g,E/=g,L/=g;let R=[E*P[2]-L*P[1],L*P[0]-M*P[2],M*P[1]-E*P[0]],D=c.map(Q=>{let ce=Q[0]-l[0],et=Q[1]-l[1],on=Q[2]-l[2];return[ce*P[0]+et*P[1]+on*P[2],ce*R[0]+et*R[1]+on*R[2]]}),j=1/0,H=1/0,I=-1/0,A=-1/0;for(let[Q,ce]of D)Q<j&&(j=Q),Q>I&&(I=Q),ce<H&&(H=ce),ce>A&&(A=ce);let k=I-j,F=A-H;if(!Number.isFinite(k)||!Number.isFinite(F))return null;let V=r&&n.textureEdgeRepairEdges?.size?n.textureEdgeRepairEdges:null,u=!!(r&&V),h=-j,v=-H,S=[];for(let Q=0;Q<D.length;Q++){let[ce,et]=D[Q];S.push(ce+h,et+v)}let C=Math.max(1,Math.ceil(k)),w=Math.max(1,Math.ceil(F)),Y=l[0]-h*P[0]-v*R[0],O=l[1]-h*P[1]-v*R[1],_=l[2]-h*P[2]-v*R[2],U=[P[0],P[1],P[2],0,R[0],R[1],R[2],0,M,E,L,0,Y,O,_,1].join(","),W=[P[0]*C,P[1]*C,P[2]*C,0,R[0]*w,R[1]*w,R[2]*w,0,M,E,L,0,Y,O,_,1].join(","),K=[P[0]*C/ye,P[1]*C/ye,P[2]*C/ye,0,R[0]*w/ye,R[1]*w/ye,R[2]*w/ye,0,M,E,L,0,Y,O,_,1].join(","),N=[M,E,L],z=!r&&o.length===4?Mr(S,P,R,N,Y,O,_):null,T=n.directionalLight,$=n.ambientLight,G=T?.direction??Do,fe=T?.color??ko,Me=Math.max(0,T?.intensity??_o),ve=$?.color??Ho,q=Math.max(0,$?.intensity??Io),Ae=Math.hypot(G[0],G[1],G[2])||1,$e=G[0]/Ae,ht=G[1]/Ae,vo=G[2]/Ae,en=Me*Math.max(0,M*$e+E*ht+L*vo),Po=Dr(en,fe,ve,q),bo=Or(e.color??"#cccccc",en,fe,ve,q),tn=null,nn=null;r&&i&&i.length>=3&&i.length===o.length&&(nn=On(i),tn=Rn(D.map(([Q,ce])=>[Q+h,ce+v]),i));let xo=r&&e.textureTriangles?.length?e.textureTriangles.map(Q=>Ir(Q,s,d,l,P,R,h,v)).filter(Q=>!!Q):null;return{index:t,polygon:e,texture:r,tileSize:s,layerElevation:d,matrix:U,canonicalMatrix:W,atlasMatrix:K,projectiveMatrix:z,canvasW:C,canvasH:w,screenPts:S,uvAffine:tn,uvSampleRect:nn,textureTriangles:xo,textureEdgeRepairEdges:V,textureEdgeRepair:u,normal:N,textureTint:Po,shadedColor:bo}}function it(e,t=1){let n=Array(e.length).fill(null),o=[],r=mr(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 Xr(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 Jo(l))}));for(let l of e.entries){let m=l.texture?a.get(l.texture):null;if(!l.texture){s.save(),pe(s,o),s.beginPath(),Et(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(),pe(s,o),s.beginPath(),Et(s,l.x,l.y,l.screenPts),s.clip(),Fr(s,l,m,o),s.restore()),l.texture&&t==="baked"&&(s.save(),pe(s,o),s.beginPath(),Et(s,l.x,l.y,l.screenPts),s.clip(),_r(s,l.x,l.y,l.canvasW,l.canvasH,l.textureTint,o),s.restore()),Yr(s,l,o)}let c=await Ur(r);return r.width=1,r.height=1,{width:e.width,height:e.height,url:c}}async function $r(e,t,n,o,r){let i=[];for(let s of e){if(r())break;i.push(await Xr(s,t,n,o))}return i}function rt(e){for(let t of e)URL.revokeObjectURL(t)}function Ve(e,t,n=(0,ee.computed)(()=>{}),o=(0,ee.computed)(()=>{})){let r=(0,ee.computed)(()=>new Set(o.value?.disable??[])),i=(0,ee.computed)(()=>!r.value.has("b")),s=(0,ee.computed)(()=>i.value),d=(0,ee.computed)(()=>!r.value.has("u")&&Mn()),a=(0,ee.computed)(()=>!r.value.has("i")&&t.value!=="dynamic"&&Lt()),c=(0,ee.computed)(()=>{let f=e.value.map(y=>!y||y.texture?y:d.value&&de(y)||i.value&&Ke(y)||s.value&&Ge(y)||t.value!=="dynamic"&&a.value?null:y);return dr(f,n.value,typeof document<"u"?document:null)}),l=(0,ee.ref)(c.value.packed.pages.map(f=>({width:f.width,height:f.height,url:null}))),m=[];return(0,ee.watch)(()=>[c.value,t.value],([f,y],p,b)=>{let{packed:P,atlasScale:M}=f,E=!1;rt(m),m=[],l.value=P.pages.map(L=>({width:L.width,height:L.height,url:null})),b(()=>{E=!0,rt(m),m=[]}),!(P.pages.length===0||typeof document>"u")&&$r(P.pages,y,document,M,()=>E).then(L=>{if(E){rt(L.flatMap(g=>g.url?.startsWith("blob:")?[g.url]:[]));return}m=L.flatMap(g=>g.url?.startsWith("blob:")?[g.url]:[]),l.value=L}).catch(()=>{E||(l.value=P.pages.map(L=>({width:L.width,height:L.height,url:null})))})},{immediate:!0}),(0,ee.onBeforeUnmount)(()=>{rt(m),m=[]}),{entries:(0,ee.computed)(()=>c.value.packed.entries),pages:l,ready:(0,ee.computed)(()=>l.value.length===0||l.value.every(f=>!!f.url)),useFullRectSolid:i,useProjectiveQuad:s,useStableTriangle:d,useBorderShape:a}}function Fe({entry:e,page:t,textureLighting:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=n==="dynamic",a=e.atlasCanonicalSize??ye,c=e.canvasW||1,l=e.canvasH||1,m=t?`${ot(-e.x/c*a)} ${ot(-e.y/l*a)}`:void 0,f=t?`${ot(t.width/c*a)} ${ot(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:Tt(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(([E,L])=>[`data-${E}`,String(L)])):{},M=o?.trim()||void 0;return(0,ee.h)("s",{class:M,style:b,...P,...i})}function ze({entry:e,solidPaintDefaults:t,className:n,style:o,domAttrs:r,pointerEvents:i="auto",forceBorderShape:s=!1}){let d=Ke(e),a=d&&s&&Lt(),c=!d||a?Rt(e):null,l=e.shadedColor===t?.paintColor,m=Tt(c?br(e):xr(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,M])=>[`data-${P}`,String(M)])):{},p=n?.trim()||void 0,b=P=>{let M=P.el;M&&(c?M.style.setProperty("border-shape",c):M.style.removeProperty("border-shape"),pr(M))};return(0,ee.h)(d&&!a?"b":"i",{class:p,style:f,...y,...r,onVnodeMounted:b,onVnodeUpdated:b})}function ut({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=t==="dynamic",a=Ce(e.polygon.color??"#cccccc"),c=d&&wt(a)===n?.dynamicColorKey,l={transform:Tt(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(0,ee.h)("b",{class:f,style:l,...m,...i})}function Ne({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=Lr(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(0,ee.h)("u",{class:c,style:{...d,...r},...a,...i})}var Ot=(0,B.defineComponent)({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=(0,B.inject)(J);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{store:r,sceneElRef:i}=o,s=(0,B.ref)(0),d=new Map,a={register(A,k){d.set(A,k),s.value++},unregister(A){d.delete(A),s.value++},version:s,getEntries(){return Array.from(d.values())}},c=(0,B.computed)(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight,shadow:e.shadow,shadowRegistry:a}));(0,B.provide)(xt,c);let l=r.getState().cameraState,m=(0,B.ref)(null);(0,B.watch)(m,A=>{i.value=A});let f=!1;(0,B.onMounted)(()=>{f||typeof document<"u"&&(We(document),f=!0)}),(0,B.watch)(()=>e.debugShowBackfaces,A=>{let k=m.value;k&&k.classList.toggle("polycss-debug-show-backfaces",!!A)});let y=(0,B.computed)(()=>e.polygons??[]),p=(0,B.computed)(()=>({directionalLight:e.directionalLight})),b=Be(y,p),P=(0,B.computed)(()=>{let A=l,k=o.autoCenterOffset.value,F=qe.BASE_TILE,V=A.target[0]+k[0],u=A.target[1]+k[1],h=A.target[2]+k[2],v=u*F,S=V*F,C=h*F;return{transform:`${A.distance!==0?`translateZ(${-A.distance}px) `:""}scale(${A.zoom}) rotateX(${A.rotX}deg) rotate(${A.rotY}deg) translate3d(${-v}px, ${-S}px, ${-C}px)`}}),M=(0,B.computed)(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,textureQuality:e.textureQuality})),E=(0,B.computed)(()=>{let A=e.textureLighting==="dynamic",k=A?void 0:e.directionalLight,F=A?void 0:e.ambientLight,V=ct(b.value.polygons);return b.value.polygons.map((u,h)=>Ie(u,h,{tileSize:M.value.tileSize,layerElevation:M.value.layerElevation,directionalLight:k,ambientLight:F,textureEdgeRepairEdges:V[h]}))}),L=(0,B.computed)(()=>e.textureLighting??"baked"),g=(0,B.computed)(()=>e.textureQuality),R=(0,B.computed)(()=>e.strategies),D=Ve(E,L,g,R),j=(0,B.computed)(()=>{if(e.textureLighting!=="dynamic")return null;let A=e.directionalLight?.direction??[.4,-.7,.59],k=Math.hypot(A[0],A[1],A[2])||1,F=A[0]/k,V=A[1]/k,u=A[2]/k,h=(0,qe.parseHexColor)(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],v=(0,qe.parseHexColor)(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],S=e.directionalLight?.intensity??1,C=e.ambientLight?.intensity??.4,w=_=>(_/255).toFixed(4),Y=u,O=Math.sign(Y||1)*Math.max(Math.abs(Y),.01);return{"--plx":F.toFixed(4),"--ply":V.toFixed(4),"--plz":u.toFixed(4),"--clx":F.toFixed(4),"--cly":V.toFixed(4),"--clz":O.toFixed(4),"--plr":w(h[0]),"--plg":w(h[1]),"--plb":w(h[2]),"--pli":S.toFixed(4),"--par":w(v[0]),"--pag":w(v[1]),"--pab":w(v[2]),"--pai":C.toFixed(4)}}),H=50;(0,B.watchEffect)(()=>{let A=m.value;if(!A)return;if(e.textureLighting!=="dynamic"){A.style.removeProperty("--shadow-ground-cssz");return}s.value;let k=a.getEntries();if(k.length===0){A.style.removeProperty("--shadow-ground-cssz");return}let F=1/0;for(let u of k)for(let h of u())for(let v of h.vertices)v[2]<F&&(F=v[2]);if(!Number.isFinite(F)){A.style.removeProperty("--shadow-ground-cssz");return}let V=e.shadow?.lift??.05;A.style.setProperty("--shadow-ground-cssz",((F+V)*H).toFixed(3))});let I=(0,B.computed)(()=>{if(!e.autoCenter)return[0,0,0];let A=b.value.sceneBbox;return[(A.min[0]+A.max[0])/2,(A.min[1]+A.max[1])/2,(A.min[2]+A.max[2])/2]});return(0,B.watchEffect)(()=>{o.autoCenterOffset.value=I.value}),(0,B.onBeforeUnmount)(()=>{}),()=>{let A=`polycss-scene${e.class?` ${e.class}`:""}`,k=M.value,F=D.entries.value.map((u,h)=>{if(u)return Fe({entry:u,page:D.pages.value[u.pageIndex],textureLighting:k.textureLighting??"baked"});let v=E.value[h];return!v||v.texture?null:D.useStableTriangle.value&&de(v)?Ne({entry:v,textureLighting:k.textureLighting??"baked"}):D.useProjectiveQuad.value&&Ge(v)?ut({entry:v,textureLighting:k.textureLighting??"baked"}):D.useBorderShape.value||D.useFullRectSolid.value?ze({entry:v,forceBorderShape:!D.useFullRectSolid.value}):null}),V=t.default?.()??[];return(0,B.h)("div",{ref:m,class:A,"data-polycss-lighting":k.textureLighting??"baked","aria-hidden":"true",style:{...P.value,...j.value??null,...n.style},...Object.fromEntries(Object.entries(n).filter(([u])=>u!=="style"&&u!=="class"))},[...F,...V])}}});var X=require("vue"),he=require("@layoutit/polycss-core");var ge=require("vue"),kn=require("@layoutit/polycss-core"),Dn=[],Dt=[];function Qe(e,t){let n=(0,ge.ref)(Dn),o=(0,ge.ref)(!!e.value),r=(0,ge.ref)(null),i=(0,ge.ref)(Dt),s=null;function d(){if(s){try{s.dispose()}catch{}s=null}}return(0,ge.watch)(e,(a,c,l)=>{if(!a){d(),n.value=Dn,o.value=!1,r.value=null,i.value=Dt;return}let m=!1;o.value=!0,r.value=null;let f=s;(0,kn.loadMesh)(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??Dt}).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}),(0,ge.onUnmounted)(()=>{d()}),{polygons:n,loading:o,error:r,warnings:i,dispose:d}}var kt=new WeakMap;function _n(e,t){kt.set(e,t)}function Hn(e){kt.delete(e)}function we(e){let t=e;for(;t;){if(t instanceof HTMLElement){let n=kt.get(t);if(n)return n}t=t.parentElement}return null}function Le(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 dt(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=we(r);if(i&&Le(r,e,t))return i}return null}function Br(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 Wr(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 Zr(e){if(e.length===0)return e;let t=(0,he.computeSceneBbox)(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 ie=(0,X.defineComponent)({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=(0,X.computed)(()=>e.src??""),i=(0,X.computed)(()=>e.mtl?{mtlUrl:e.mtl}:void 0),s=Qe(r,i.value),d=(0,X.computed)(()=>e.src?s.polygons.value:e.polygons??[]),a=(0,X.ref)(null);(0,X.watch)(d,()=>{a.value=null});let c=(0,X.computed)(()=>a.value??d.value),l=(0,X.computed)(()=>e.autoCenter?Zr(c.value):c.value),m=!t.polygon,f=ln(),y=(0,X.computed)(()=>e.textureLighting??f?.value.textureLighting??"baked"),p=(0,X.computed)(()=>y.value==="dynamic"?void 0:f?.value.directionalLight),b=(0,X.computed)(()=>y.value==="dynamic"?void 0:f?.value.ambientLight),P=(0,X.computed)(()=>{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 S=(0,he.inverseRotateVec3)(v,h),C=Math.hypot(S[0],S[1],S[2])||1;return{"--plx":(S[0]/C).toFixed(4),"--ply":(S[1]/C).toFixed(4),"--plz":(S[2]/C).toFixed(4)}}),M=(0,X.ref)(e.rotation),E=(0,X.computed)(()=>{if(!m)return[];let h=p.value,v=h&&M.value?{...h,direction:(0,he.inverseRotateVec3)(h.direction,M.value)}:h,S=ct(l.value);return l.value.map((C,w)=>Ie(C,w,{directionalLight:v,ambientLight:b.value,textureEdgeRepairEdges:S[w]}))}),L=(0,X.computed)(()=>e.textureQuality),g=Ve(E,y,L),R=(0,X.computed)(()=>m?An(E.value,y.value):{}),D=(0,X.computed)(()=>Br(R.value)),j=(0,X.computed)(()=>{if(!e.castShadow||y.value!=="dynamic")return[];let h=f?.value.shadow,v=h?.color??"#000000",S=h?.opacity??.25,C=(0,he.parseHexColor)(v)?.rgb??[0,0,0],w=`rgba(${C[0]},${C[1]},${C[2]},${S})`,Y=E.value;if(Y.length===0)return[];let O=(0,he.findOverlappingPolygonDuplicates)(l.value,{normalTolerance:.1,distanceTolerance:.5,overlapFraction:.4});return Y.map((_,U)=>{if(!_||O.has(U))return null;let W=`matrix3d(${_.matrix})`,K=Rt(_),N={transform:`var(--shadow-proj) ${W}`,color:w,width:`${_.canvasW}px`,height:`${_.canvasH}px`,"--pnx":_.normal[0].toFixed(4),"--pny":_.normal[1].toFixed(4),"--pnz":_.normal[2].toFixed(4)},z=T=>{let $=T.el;$&&$.style.setProperty("border-shape",K)};return(0,X.h)("q",{class:"polycss-shadow",style:N,onVnodeMounted:z,onVnodeUpdated:z})})}),H=Symbol();(0,X.watch)(()=>[e.castShadow,y.value],([h,v],S,C)=>{let w=f?.value.shadowRegistry;w&&(h&&v==="dynamic"?w.register(H,()=>l.value):w.unregister(H),C(()=>w.unregister(H)))},{immediate:!0}),(0,X.onBeforeUnmount)(()=>{f?.value.shadowRegistry?.unregister(H)});let I=(0,X.ref)(null),A={get element(){return I.value},get id(){return e.id},getPosition:()=>e.position,getRotation:()=>e.rotation,getScale:()=>e.scale,getPolygons:()=>l.value,updatePolygon(h,v){let S=l.value,C=typeof h=="number"?h:S.indexOf(h);C<0||C>=S.length||(Object.assign(S[C],v),a.value=S.slice())},rebakeAtlas:()=>{M.value=e.rotation}};o(A),(0,X.onMounted)(()=>{I.value&&_n(I.value,A)}),(0,X.onBeforeUnmount)(()=>{I.value&&Hn(I.value)});let k=(0,X.inject)(J,null),F=null;function V(h,v,S){let C=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let U=document.elementsFromPoint(v,S),W=new Set;for(let K of U){let N=we(K);N&&!W.has(N)&&(W.add(N),C.push({object:N}))}}let w=0,Y=0,O=k?.cameraElRef.value;if(O){let U=O.getBoundingClientRect();U.width>0&&U.height>0&&(w=(v-U.left)/U.width*2-1,Y=-((S-U.top)/U.height*2-1))}let _=0;return F&&(_=Math.hypot(v-F.x,S-F.y)),{object:C[0]?.object??A,eventObject:A,intersections:C,pointer:{x:w,y:Y},delta:_,nativeEvent:h,stopPropagation:()=>h.stopPropagation()}}function u(h,v,S,C){h&&h(V(v,S,C))}return()=>{let h=Wr(e.position,e.scale,e.rotation),v=l.value,S;if(v.length>0){let z=1/0,T=1/0,$=1/0,G=-1/0,fe=-1/0,Me=-1/0;for(let ve of v)for(let q of ve.vertices)q[0]<z&&(z=q[0]),q[0]>G&&(G=q[0]),q[1]<T&&(T=q[1]),q[1]>fe&&(fe=q[1]),q[2]<$&&($=q[2]),q[2]>Me&&(Me=q[2]);Number.isFinite(z)&&(S=`${(T+fe)/2*50}px ${(z+G)/2*50}px ${($+Me)/2*50}px`)}let C={transform:h,...S?{transformOrigin:S}:null,...P.value??void 0,...n.style,...D.value??void 0},w=Object.fromEntries(Object.entries(n).filter(([z])=>z!=="style"&&z!=="class")),Y=`polycss-mesh${e.class?` ${e.class}`:""}`,O={};e.onClick&&(O.onClick=z=>{let T=z;u(e.onClick,T,T.clientX,T.clientY)}),e.onContextMenu&&(O.onContextmenu=z=>{let T=z;u(e.onContextMenu,T,T.clientX,T.clientY)}),e.onDoubleClick&&(O.onDblclick=z=>{let T=z;u(e.onDoubleClick,T,T.clientX,T.clientY)}),e.onWheel&&(O.onWheel=z=>{let T=z;u(e.onWheel,T,T.clientX,T.clientY)}),O.onPointerdown=z=>{let T=z;F={x:T.clientX,y:T.clientY},u(e.onPointerDown,T,T.clientX,T.clientY)},O.onPointerup=z=>{let T=z;u(e.onPointerUp,T,T.clientX,T.clientY),F=null},e.onPointerMove&&(O.onPointermove=z=>{let T=z;u(e.onPointerMove,T,T.clientX,T.clientY)}),(e.onPointerOver||e.onPointerEnter)&&(O.onPointerenter=z=>{let T=z;u(e.onPointerOver,T,T.clientX,T.clientY),u(e.onPointerEnter,T,T.clientX,T.clientY)}),(e.onPointerOut||e.onPointerLeave)&&(O.onPointerleave=z=>{let T=z;u(e.onPointerOut,T,T.clientX,T.clientY),u(e.onPointerLeave,T,T.clientX,T.clientY)}),e.onPointerCancel&&(O.onPointercancel=z=>{let T=z;u(e.onPointerCancel,T,T.clientX,T.clientY),F=null});let _=e.id?{"data-poly-mesh-id":e.id}:{};if(e.src&&s.loading.value&&s.polygons.value.length===0)return(0,X.h)("div",{ref:I,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:C,..._,...O,...w},t.fallback?.()??[]);if(e.src&&s.error.value&&s.polygons.value.length===0)return(0,X.h)("div",{ref:I,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:C,..._,...O,...w},t.error?.({error:s.error.value})??[]);let U=l.value,W=t.polygon?U.map((z,T)=>(0,X.h)("template",{key:T},t.polygon?.({polygon:z,index:T}))):g.entries.value.map((z,T)=>{if(z)return Fe({entry:z,page:g.pages.value[z.pageIndex],textureLighting:y.value});let $=E.value[T];return!$||$.texture?null:de($)?Ne({entry:$,textureLighting:y.value,solidPaintDefaults:R.value}):ze({entry:$,solidPaintDefaults:R.value})}),K=t.default?.()??[],N=j.value;return(0,X.h)("div",{ref:I,class:Y,style:C,..._,...O,...w},[...N,...W,...K])}}});var je=require("vue");var _t=(0,je.defineComponent)({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=(0,je.computed)(()=>{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()=>(0,je.h)(ie,{polygons:t.value,castShadow:!1,class:e.class?`polycss-ground ${e.class}`:"polycss-ground"})}});var Ht=require("vue");function In(e){return typeof e=="function"?(0,Ht.computed)(()=>{let{texture:t,key:n}=e();return{texture:t,key:n}}):(0,Ht.computed)(()=>({texture:e.texture,key:e.key}))}var se=require("vue");var Kr=4;function mt(e,t=Kr){let n=e.toFixed(t).replace(/\.?0+$/,"");return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function Gr(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 qr({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,M=(1-b)/f,E={transform:`matrix3d(${e.canonicalMatrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${mt(y)} ${mt(p)}`,backgroundPosition:`${mt(-P)} ${mt(-M)}`,pointerEvents:s==="none"?"none":void 0,...r},L=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([R,D])=>[`data-${R}`,String(D)])):{},g=o?.trim()||void 0;return(0,se.h)("i",{class:g,style:E,...L,...i})}var It=(0,se.defineComponent)({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=(0,se.computed)(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=(0,se.computed)(()=>e.textureQuality??e.context?.textureQuality),r=(0,se.computed)(()=>e.material?.texture??e.texture),i=(0,se.computed)(()=>e.material&&e.uvs?Gr(e.uvs):null),s=(0,se.computed)(()=>{let c=e.context?.tileSize??50;return Ie({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=(0,se.computed)(()=>i.value?[]:[s.value]),a=Ve(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[M,E]of Object.entries(e.data))y[`data-${M}`]=String(E);let p={...t,...y},b=Object.fromEntries(Object.entries(p).filter(([M])=>M!=="class"&&M!=="style")),P;return i.value&&e.material&&c?P=qr({plan:c,material:e.material,uvRect:i.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):l?P=Fe({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=de(c)?Ne({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):Ge(c)?ut({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):ze({entry:c,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"})),P?f?(0,se.h)("div",{class:"polycss-poly-wrapper",style:{transform:f,position:"absolute",transformStyle:"preserve-3d"}},[P]):P:null}}});var oe=require("vue"),Vt=require("@layoutit/polycss-core");var Qr=150,Vn=4,Jr=513e-6,ea=10,ta=3,Fn=16.67,na=50,zn=.1,Nn=10,jn=0,Yn=5e3,oa=.3,ra=.05;function aa(e){return e===!0?-1:e===void 0||e===!1?1:e}function ia(e,t,n,o,r){let i=aa(r),s=e/Vn*i,d=t/Vn*i;return{rotX:Math.max(0,Math.min(100,n-d)),rotY:((o-s)%360+360)%360}}function Un(e,t,n,o,r){let i=Math.max(.01,n),s=Math.max(.1,Math.cos(o*Math.PI/180)),d=-e/(i*Vt.BASE_TILE),a=-t/(i*Vt.BASE_TILE*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 Ft=(0,oe.defineComponent)({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:zn},maxZoom:{type:Number,default:Nn},minDistance:{type:Number,default:jn},maxDistance:{type:Number,default:Yn},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=(0,oe.inject)(J,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=(0,oe.ref)(!1),p=null,b=null,P=null;function M(){let g=i.value;if(!g)return;let R=!1,D={x:0,y:0},j=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()}},H=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 S=r.value,C=S.state;if(u.shiftKey){let{dWorldX:w,dWorldY:Y}=Un(h,v,C.zoom,C.rotX,C.rotY);S.update({target:[C.target[0]+w,C.target[1]+Y,C.target[2]]})}else{let{rotX:w,rotY:Y}=ia(h,v,C.rotX,C.rotY,e.invert);S.update({rotX:w,rotY:Y})}s(),o.updateCameraFromRef(S),a()},I=u=>{if(m===u.pointerId){m=null,g.style.cursor=e.drag?"grab":"";try{u.target.releasePointerCapture(u.pointerId)}catch{}y.value=!1,l()}},A=u=>{u.preventDefault()},k=u=>{u.button===2&&(R=!0,D={x:u.clientX,y:u.clientY})},F=u=>{if(!R||!e.drag)return;let h=u.clientX-D.x,v=u.clientY-D.y;D={x:u.clientX,y:u.clientY};let S=r.value,C=S.state,{dWorldX:w,dWorldY:Y}=Un(h,v,C.zoom,C.rotX,C.rotY);S.update({target:[C.target[0]+w,C.target[1]+Y,C.target[2]]}),s(),o.updateCameraFromRef(S),a()},V=u=>{u.button===2&&R&&(R=!1,l())};g.style.cursor="grab",g.style.touchAction="none",g.style.userSelect="none",g.addEventListener("pointerdown",j),g.addEventListener("pointermove",H),g.addEventListener("pointerup",I),g.addEventListener("pointercancel",I),g.addEventListener("contextmenu",A),g.addEventListener("mousedown",k),g.addEventListener("mousemove",F),g.addEventListener("mouseup",V),p=()=>{g.removeEventListener("pointerdown",j),g.removeEventListener("pointermove",H),g.removeEventListener("pointerup",I),g.removeEventListener("pointercancel",I),g.removeEventListener("contextmenu",A),g.removeEventListener("mousedown",k),g.removeEventListener("mousemove",F),g.removeEventListener("mouseup",V),g.style.cursor="",g.style.touchAction="",g.style.userSelect=""}}function E(){let g=i.value;if(!g)return;let R=!1,D=null,j=H=>{if(!e.wheel)return;H.preventDefault();let I=H.deltaMode===1?16:H.deltaMode===2?100:1,A=H.deltaY*I;H.ctrlKey?A*=ea:A*=ta;let k=r.value;if(e.dolly){let F=e.minDistance??jn,V=e.maxDistance??Yn,u=Math.max(F,Math.min(V,k.state.distance+A*ra));k.update({distance:u})}else{let F=Math.exp(-A*Jr),V=e.minZoom??zn,u=e.maxZoom??Nn,h=Math.max(V,Math.min(u,k.state.zoom*F));k.update({zoom:h})}s(),o.updateCameraFromRef(k),R||(R=!0,c()),a(),D!==null&&clearTimeout(D),D=setTimeout(()=>{D=null,R=!1,l()},Qr)};g.addEventListener("wheel",j,{passive:!1}),b=()=>{g.removeEventListener("wheel",j),D!==null&&clearTimeout(D)}}function L(){let g=null,R=!1,D=0,j=H=>{if(R)return;let I=e.animate;if(!I){g=requestAnimationFrame(j);return}if(y.value)D=H;else{let A=Math.min(na,D?H-D:Fn);D=H;let F=(I.speed??oa)*(A/Fn),V=r.value,u=V.state;if(I.axis==="x"){let h=((u.rotX+F)%360+360)%360;V.update({rotX:h})}else{let h=((u.rotY+F)%360+360)%360;V.update({rotY:h})}s(),o.updateCameraFromRef(V),a()}g=requestAnimationFrame(j)};g=requestAnimationFrame(j),P=()=>{R=!0,g!==null&&cancelAnimationFrame(g),P=null}}return(0,oe.onMounted)(()=>{e.drag&&M(),e.wheel&&E(),e.animate&&L()}),(0,oe.onBeforeUnmount)(()=>{p?.(),b?.(),P?.(),p=null,b=null}),(0,oe.watch)(()=>e.drag,g=>{g&&!p&&M(),!g&&p&&(p(),p=null)}),(0,oe.watch)(()=>e.wheel,g=>{g&&!b&&E(),!g&&b&&(b(),b=null)}),(0,oe.watch)(()=>!!e.animate,g=>{g&&!P&&L(),!g&&P&&P()}),()=>null}});var re=require("vue"),zt=require("@layoutit/polycss-core");var sa=150,Xn=4,la=513e-6,ca=10,ua=3,$n=16.67,da=50,Bn=.1,Wn=10,Zn=0,Kn=5e3,ma=.3,fa=.05;function ya(e){return e===!0?-1:e===void 0||e===!1?1:e}function Gn(e,t,n,o,r){let i=ya(r),s=e/Xn*i,d=t/Xn*i;return{rotX:Math.max(0,Math.min(100,n-d)),rotY:((o-s)%360+360)%360}}function pa(e,t,n,o,r){let i=Math.max(.01,n),s=Math.max(.1,Math.cos(o*Math.PI/180)),d=-e/(i*zt.BASE_TILE),a=-t/(i*zt.BASE_TILE*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 Nt=(0,re.defineComponent)({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:Bn},maxZoom:{type:Number,default:Wn},minDistance:{type:Number,default:Zn},maxDistance:{type:Number,default:Kn},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=(0,re.inject)(J,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=(0,re.ref)(!1),p=null,b=null,P=null;function M(){let g=i.value;if(!g)return;let R=!1,D={x:0,y:0},j=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()}},H=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 S=r.value,C=S.state;if(u.shiftKey){let{rotX:w,rotY:Y}=Gn(h,v,C.rotX,C.rotY,e.invert);S.update({rotX:w,rotY:Y})}else{let{dWorldX:w,dWorldY:Y}=pa(h,v,C.zoom,C.rotX,C.rotY);S.update({target:[C.target[0]+w,C.target[1]+Y,C.target[2]]})}s(),o.updateCameraFromRef(S),a()},I=u=>{if(m===u.pointerId){m=null,g.style.cursor=e.drag?"grab":"";try{u.target.releasePointerCapture(u.pointerId)}catch{}y.value=!1,l()}},A=u=>{u.preventDefault()},k=u=>{u.button===2&&(R=!0,D={x:u.clientX,y:u.clientY})},F=u=>{if(!R||!e.drag)return;let h=u.clientX-D.x,v=u.clientY-D.y;D={x:u.clientX,y:u.clientY};let S=r.value,C=S.state,{rotX:w,rotY:Y}=Gn(h,v,C.rotX,C.rotY,e.invert);S.update({rotX:w,rotY:Y}),s(),o.updateCameraFromRef(S),a()},V=u=>{u.button===2&&R&&(R=!1,l())};g.style.cursor="grab",g.style.touchAction="none",g.style.userSelect="none",g.addEventListener("pointerdown",j),g.addEventListener("pointermove",H),g.addEventListener("pointerup",I),g.addEventListener("pointercancel",I),g.addEventListener("contextmenu",A),g.addEventListener("mousedown",k),g.addEventListener("mousemove",F),g.addEventListener("mouseup",V),p=()=>{g.removeEventListener("pointerdown",j),g.removeEventListener("pointermove",H),g.removeEventListener("pointerup",I),g.removeEventListener("pointercancel",I),g.removeEventListener("contextmenu",A),g.removeEventListener("mousedown",k),g.removeEventListener("mousemove",F),g.removeEventListener("mouseup",V),g.style.cursor="",g.style.touchAction="",g.style.userSelect=""}}function E(){let g=i.value;if(!g)return;let R=!1,D=null,j=H=>{if(!e.wheel)return;H.preventDefault();let I=H.deltaMode===1?16:H.deltaMode===2?100:1,A=H.deltaY*I;H.ctrlKey?A*=ca:A*=ua;let k=r.value;if(e.dolly){let F=e.minDistance??Zn,V=e.maxDistance??Kn,u=Math.max(F,Math.min(V,k.state.distance+A*fa));k.update({distance:u})}else{let F=Math.exp(-A*la),V=e.minZoom??Bn,u=e.maxZoom??Wn,h=Math.max(V,Math.min(u,k.state.zoom*F));k.update({zoom:h})}s(),o.updateCameraFromRef(k),R||(R=!0,c()),a(),D!==null&&clearTimeout(D),D=setTimeout(()=>{D=null,R=!1,l()},sa)};g.addEventListener("wheel",j,{passive:!1}),b=()=>{g.removeEventListener("wheel",j),D!==null&&clearTimeout(D)}}function L(){let g=null,R=!1,D=0,j=H=>{if(R)return;let I=e.animate;if(!I){g=requestAnimationFrame(j);return}if(y.value)D=H;else{let A=Math.min(da,D?H-D:$n);D=H;let F=(I.speed??ma)*(A/$n),V=r.value,u=V.state;if(I.axis==="x"){let h=((u.rotX+F)%360+360)%360;V.update({rotX:h})}else{let h=((u.rotY+F)%360+360)%360;V.update({rotY:h})}s(),o.updateCameraFromRef(V),a()}g=requestAnimationFrame(j)};g=requestAnimationFrame(j),P=()=>{R=!0,g!==null&&cancelAnimationFrame(g),P=null}}return(0,re.onMounted)(()=>{e.drag&&M(),e.wheel&&E(),e.animate&&L()}),(0,re.onBeforeUnmount)(()=>{p?.(),b?.(),P?.(),p=null,b=null}),(0,re.watch)(()=>e.drag,g=>{g&&!p&&M(),!g&&p&&(p(),p=null)}),(0,re.watch)(()=>e.wheel,g=>{g&&!b&&E(),!g&&b&&(b(),b=null)}),(0,re.watch)(()=>!!e.animate,g=>{g&&!P&&L(),!g&&P&&P()}),()=>null}});var Z=require("vue"),ae=require("@layoutit/polycss-core");var ft="#ff3653",yt="#8adb00",pt="#2c8fff",ga=.6,ha=.8,va=1,Re=50,qn=60,Pa=.6,ba=.0125,xa=.15,Ca=.04,Ea=1,Qn=.02,jt=1.04,Ma=.1,Aa=.25,ao=1e-4,Je={0:1,1:0,2:2},Jn=[{cssAxis:0,sign:1,key:"x",color:ft},{cssAxis:0,sign:-1,key:"-x",color:ft},{cssAxis:1,sign:1,key:"y",color:yt},{cssAxis:1,sign:-1,key:"-y",color:yt},{cssAxis:2,sign:1,key:"z",color:pt},{cssAxis:2,sign:-1,key:"-z",color:pt}],eo=[{cssAxis:0,key:"x",color:ft},{cssAxis:1,key:"y",color:yt},{cssAxis:2,key:"z",color:pt}],to=[{perpAxis:2,axisA:0,axisB:1,key:"xy",color:pt},{perpAxis:1,axisA:0,axisB:2,key:"xz",color:yt},{perpAxis:0,axisA:1,axisB:2,key:"yz",color:ft}];function Yt(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 gt(e,t){return!t||t<=0?e:Math.round(e/t)*t}function Sa(e){return e.replace("-","")[0]}function Ut(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 Ta(e){if(e.length===0)return qn;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)*Re*Pa:qn}function wa(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*Re,(t+r)/2*Re,(o+s)/2*Re]:[0,0,0]}function no(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<ao)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=gt(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 oo(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)<ao)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=gt(p,e.translationSnap),b=gt(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 ro(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=(0,ae.quatFromEulerXYZ)(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=gt(y,e.rotationSnap);let p=[0,0,0];p[e.cssAxis]=1;let b=(0,ae.quatFromAxisAngle)(p,y*Math.PI/180),P=(0,ae.eulerXYZFromQuat)((0,ae.quatMultiply)(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 La(e){return!!e&&typeof e=="object"&&"value"in e}function Ra(e){return e?La(e)?e.value??null:e:null}var Xt=(0,Z.defineComponent)({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=(0,Z.ref)(null),o=(0,Z.ref)(null),r=(0,Z.ref)(new Map),i=(0,Z.computed)(()=>Ra(e.object)),s=(0,Z.ref)(0);(0,Z.onMounted)(()=>{s.value++});let d=(0,Z.ref)(0),a=(0,Z.inject)(J,void 0),c=null;(0,Z.onMounted)(()=>{let u=a?.store;u&&(c=u.subscribe(()=>{d.value++}))}),(0,Z.onBeforeUnmount)(()=>{c?.()});function l(){d.value;let u=a?.store.getState().cameraState;return{rotX:u?.rotX??65,rotY:u?.rotY??45}}let m=(0,Z.computed)(()=>(s.value,Ta(i.value?.getPolygons()??[]))),f=(0,Z.computed)(()=>m.value*e.size);function y(u){return o.value===u?va:n.value===u?ha:ga}function p(){t("change")}function b(u){t("objectChange",u)}function P(u){t("draggingChanged",u)}function M(){t("mouseDown")}function E(){t("mouseUp")}let L=(0,Z.inject)(J,void 0),g=null;(0,Z.onMounted)(()=>{let u=L?.cameraElRef.value;if(!u)return;let h=v=>{let S=i.value;if(!S||!e.enabled||v.target?.closest(".polycss-transform-gizmo"))return;let w={x:e.showX,y:e.showY,z:e.showZ};if(e.mode==="translate")for(let O of to){let _=["x","y","z"][O.axisA],U=["x","y","z"][O.axisB];if(!w[_]||!w[U])continue;let W=document.querySelector(`.polycss-transform-plane--${O.key}`);if(!W||!Le(W,v.clientX,v.clientY))continue;v.preventDefault(),v.stopPropagation();let K=W.closest("[data-poly-transform-controls]");if(!K)return;o.value=O.key,oo({axisA:O.axisA,axisB:O.axisB,probeDistanceCss:f.value,wrapper:K,target:S,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:M,onMouseUp:E,onDraggingChanged:N=>{N||(o.value=null),P(N)}});return}let Y=e.mode==="translate"?Jn:eo;for(let O of Y){let _=O.key.replace("-","")[0];if(!w[_])continue;let U=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${O.key}`);if(!U||!(e.mode==="rotate"?Le(U,v.clientX,v.clientY):Le(U,v.clientX,v.clientY)))continue;v.preventDefault(),v.stopPropagation();let K=U.closest("[data-poly-transform-controls]");if(!K)return;if(o.value=O.key,e.mode==="translate"){let N=O;no({cssAxis:N.cssAxis,sign:N.sign,shaftLengthCss:f.value,wrapper:K,target:S,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:M,onMouseUp:E,onDraggingChanged:z=>{z||(o.value=null),P(z)}})}else ro({cssAxis:O.cssAxis,wrapper:K,target:S,startClientX:v.clientX,startClientY:v.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:b,onMouseDown:M,onMouseUp:E,onDraggingChanged:N=>{N||(o.value=null),P(N)}});return}};u.addEventListener("pointerdown",h),g=()=>u.removeEventListener("pointerdown",h)}),(0,Z.onBeforeUnmount)(()=>{g?.()});let R=(0,Z.computed)(()=>{if(e.mode!=="translate")return[];s.value;let h=f.value/Re,{rotX:v,rotY:S}=l();return Jn.filter(C=>({x:e.showX,y:e.showY,z:e.showZ})[Sa(C.key)]).map(C=>{let w=y(C.key),Y=Ut(C.cssAxis,C.sign,v,S);return{spec:C,polygons:(0,ae.arrowPolygons)({axis:Je[C.cssAxis],sign:C.sign,shaftLength:h,shaftHalfThickness:h*ba,headLength:h*xa,headHalfThickness:h*Ca,color:Yt(C.color,w),shaft:!Y})}})}),D=(0,Z.computed)(()=>{if(e.mode!=="translate")return[];s.value;let h=f.value/Re,v={x:e.showX,y:e.showY,z:e.showZ},S=["x","y","z"],{rotX:C,rotY:w}=l(),Y=h*Aa;return to.filter(O=>v[S[O.axisA]]&&v[S[O.axisB]]).map(O=>{let _=y(O.key),U=Je[O.perpAxis],W=(U+1)%3,K=(U+2)%3,N=Je[W],z=Je[K],T=Ut(N,1,C,w)?-1:1,$=Ut(z,1,C,w)?-1:1;return{spec:O,polygons:(0,ae.planePolygons)({axis:U,size:h*Ma,offset:[T*Y,$*Y],color:Yt(O.color,_)})}})}),j=(0,Z.computed)(()=>{if(e.mode!=="rotate")return[];s.value;let v=f.value*Ea/Re*jt;return eo.filter(S=>({x:e.showX,y:e.showY,z:e.showZ})[S.key]).map(S=>{let C=y(S.key);return{spec:S,polygons:(0,ae.ringQuadPolygons)({axis:Je[S.cssAxis],outerRadius:v,color:Yt(S.color,C)})}})}),H=(1-Qn)/jt,I=(1+Qn)/jt;function A(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;h.stopPropagation();let C=h.eventObject.element?.closest("[data-poly-transform-controls]");C&&(o.value=u.key,no({cssAxis:u.cssAxis,sign:u.sign,shaftLengthCss:f.value,wrapper:C,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:M,onMouseUp:E,onDraggingChanged:w=>{w||(o.value=null),P(w)}}))}}function k(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;h.stopPropagation();let C=h.eventObject.element?.closest("[data-poly-transform-controls]");C&&(o.value=u.key,oo({axisA:u.axisA,axisB:u.axisB,probeDistanceCss:f.value,wrapper:C,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:M,onMouseUp:E,onDraggingChanged:w=>{w||(o.value=null),P(w)}}))}}function F(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;let S=h.eventObject.element;h.stopPropagation();let C=S?.closest("[data-poly-transform-controls]");C&&(o.value=u.key,ro({cssAxis:u.cssAxis,wrapper:C,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:b,onMouseDown:M,onMouseUp:E,onDraggingChanged:w=>{w||(o.value=null),P(w)}}))}}function V(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=wa(u.getPolygons()),S=h[0]+v[0],C=h[1]+v[1],w=h[2]+v[2],Y={transform:`translate3d(${S}px, ${C}px, ${w}px)`,position:"absolute",transformStyle:"preserve-3d",zIndex:1e3},O=e.mode==="translate"?[...R.value.map(({spec:_,polygons:U})=>(0,Z.h)(ie,{key:`arrow-${_.key}`,polygons:U,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${_.key}`,textureLighting:"baked",onPointerDown:A(_),...V(_.key)})),...D.value.map(({spec:_,polygons:U})=>(0,Z.h)(ie,{key:`plane-${_.key}`,polygons:U,class:`polycss-transform-gizmo polycss-transform-plane polycss-transform-plane--${_.key}`,textureLighting:"baked",onPointerDown:k(_),...V(_.key)}))]:j.value.map(({spec:_,polygons:U})=>(0,Z.h)(ie,{key:_.key,polygons:U,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${_.key}`,style:{"--ring-inner-ratio":H,"--ring-outer-ratio":I},textureLighting:"baked",onPointerDown:F(_),...V(_.key)}));return(0,Z.h)("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:Y},O)}}});var me=require("vue"),so=require("@layoutit/polycss-core");var Oa={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 $t(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 lo=new Set(["KeyW","ArrowUp"]),co=new Set(["KeyS","ArrowDown"]),uo=new Set(["KeyA","ArrowLeft"]),mo=new Set(["KeyD","ArrowRight"]),fo=new Set(["Space"]),Bt=new Set(["ControlLeft","ControlRight"]);function io(e){return lo.has(e)||co.has(e)||uo.has(e)||mo.has(e)||fo.has(e)||Bt.has(e)}function Da(){return{change:[],start:[],end:[]}}function Ye(e,t){let n=[...e[t]];for(let o of n)try{o()}catch{}}var Wt=(0,me.defineComponent)({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=(0,me.inject)(J,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=$t(Oa,e),c=[0,0,0],l=null,m=0,f=!1,y=!1,p=!1,b=new Set,P=0,M=0,E=Da();function L(u,h){let v=u*Math.PI/180,S=h*Math.PI/180;return[-Math.sin(v)*Math.cos(S),-Math.sin(v)*Math.sin(S),-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)/so.BASE_TILE}function R(){let u=i.value.state,h=L(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 D(){let u=R(),h=i.value;h.update({target:u}),d(),r.updateCameraFromRef(h)}let j=.05;function H(u){if(l===null||f)return;let h=Math.min(j,m?(u-m)/1e3:.0167);if(m=u,a.enabled){let v=!1,S=i.value.state;if(a.moveEnabled){let O=0,_=0;for(let U of b)lo.has(U)?O+=1:co.has(U)?O-=1:mo.has(U)?_+=1:uo.has(U)&&(_-=1);if(O!==0||_!==0){let W=(S.rotY??0)*Math.PI/180,K=-Math.cos(W),N=-Math.sin(W),z=-Math.sin(W),T=Math.cos(W),$=Math.hypot(O,_)||1,G=a.moveSpeed*h;c[0]+=(K*O+z*_)/$*G,c[1]+=(N*O+T*_)/$*G,v=!0}}let w=a.crouchEnabled&&(b.has("ControlLeft")||b.has("ControlRight"))?a.crouchHeight:a.eyeHeight;a.jumpEnabled&&(P!==0||M>0)?(P-=a.gravity*h,M+=P*h,M<=0&&(M=0,P=0)):a.jumpEnabled||(M=0,P=0);let Y=a.groundZ+w+M;if(Math.abs(c[2]-Y)>1e-4&&(c[2]=Y,v=!0),v){let O=R(),_=i.value;_.update({target:O}),d(),r.updateCameraFromRef(_),Ye(E,"change");try{t("change",[c[0],c[1],c[2]])}catch{}}}l=requestAnimationFrame(H)}function I(){l!==null||f||(m=0,l=requestAnimationFrame(H))}function A(){l!==null&&(cancelAnimationFrame(l),l=null)}let k=null;function F(){let u=s.value;if(!u)return;let h=u.ownerDocument??document,v=h.defaultView??globalThis,S=()=>{if(!(!a.enabled||!a.lookEnabled||f||y))try{u.requestPointerLock()}catch{}},C=()=>{let N=h.pointerLockElement===u;if(N!==y){if(y=N,N){p=!0,Ye(E,"start");try{t("interaction-start",[c[0],c[1],c[2]])}catch{}}else if(p){p=!1,Ye(E,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}}},w=N=>{if(!y||f||!a.enabled||!a.lookEnabled)return;let z=N.movementX??0,T=N.movementY??0;if(z===0&&T===0)return;let $=i.value,G=$.state,fe=a.lookSensitivity,Me=a.invertY?-1:1,ve=(((G.rotY??0)-z*fe)%360+360)%360,q=(G.rotX??90)-T*fe*Me;q<a.minPitch?q=a.minPitch:q>a.maxPitch&&(q=a.maxPitch);let Ae=L(q,ve),$e=g(),ht=[c[0]+Ae[0]*$e,c[1]+Ae[1]*$e,c[2]+Ae[2]*$e];$.update({rotX:q,rotY:ve,target:ht}),d(),r.updateCameraFromRef($),Ye(E,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},Y=N=>{if(!(!a.enabled||f)&&io(N.code)&&!(!y&&!a.moveEnabled)){if(fo.has(N.code)){if(!a.jumpEnabled)return;N.preventDefault(),!b.has(N.code)&&P===0&&M===0&&(P=a.jumpVelocity),b.add(N.code);return}Bt.has(N.code)&&!a.crouchEnabled||!a.moveEnabled&&!Bt.has(N.code)||(N.preventDefault(),b.add(N.code))}},O=N=>{io(N.code)&&b.delete(N.code)},_=()=>{b.clear()};u.addEventListener("click",S),h.addEventListener("pointerlockchange",C),h.addEventListener("mousemove",w),v.addEventListener("keydown",Y),v.addEventListener("keyup",O),v.addEventListener("blur",_);let U=v.getComputedStyle(u).perspective,W=parseFloat(U),K=Number.isFinite(W)&&W>0?W:2e3;u.style.setProperty("--polycss-fpv-perspective",`${K}px`),u.classList.add("polycss-fpv-host"),k=()=>{if(u.removeEventListener("click",S),h.removeEventListener("pointerlockchange",C),h.removeEventListener("mousemove",w),v.removeEventListener("keydown",Y),v.removeEventListener("keyup",O),v.removeEventListener("blur",_),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=$t(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":""),I()},pause(){if(f)return;f=!0,A();let u=s.value;if(u&&(u.style.cursor=""),p){p=!1,Ye(E,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}},destroy(){f=!0,A()},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],D(),Ye(E,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},addEventListener(u,h){let v=E[u];v.includes(h)||v.push(h)},removeEventListener(u,h){let v=E[u],S=v.indexOf(h);S>=0&&v.splice(S,1)},hasEventListener(u,h){return E[u].includes(h)}}),(0,me.onMounted)(()=>{let u=s.value;if(!u)return;f=!1,y=!1,p=!1,b.clear(),P=0,M=0;let v=i.value.state.target??[0,0,0];c[0]=v[0],c[1]=v[1],c[2]=a.groundZ+a.eyeHeight,D(),u.style.cursor=a.lookEnabled?"crosshair":"",F(),I()}),(0,me.onBeforeUnmount)(()=>{f=!0,A(),k?.(),k=null});let V=["enabled","lookEnabled","moveEnabled","jumpEnabled","crouchEnabled","lookSensitivity","invertY","moveSpeed","jumpVelocity","gravity","eyeHeight","crouchHeight","groundZ","minPitch","maxPitch"];for(let u of V)(0,me.watch)(()=>e[u],()=>{a=$t(a,e);let h=s.value;h&&!f&&(h.style.cursor=a.lookEnabled?"crosshair":"")});return()=>null}});var te=require("vue");var Ue=Symbol("polycss.selection"),Zt=(0,te.defineComponent)({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=(0,te.reactive)({selected:[]}),r=(0,te.computed)(()=>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)};(0,te.provide)(Ue,{selected:r,api:s});let d=(0,te.inject)(J,void 0),a=(l,m)=>dt(l,m,f=>!f.closest("[data-poly-transform-controls]")),c=null;return(0,te.onMounted)(()=>{let l=d?.cameraElRef.value;if(!l)return;let m=f=>{if(f.target?.closest("[data-poly-transform-controls]"))return;let p=we(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)}),(0,te.onBeforeUnmount)(()=>{c?.()}),()=>(0,te.h)("div",{style:{display:"contents"},"data-poly-select":""},n.default?.())}});function Kt(){let e=(0,te.inject)(Ue,void 0);return e?e.selected:(0,te.ref)([])}function Gt(){let e=(0,te.inject)(Ue,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}var Xe=require("vue"),yo=require("@layoutit/polycss-core");var qt=(0,Xe.defineComponent)({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=(0,Xe.computed)(()=>(0,yo.axesHelperPolygons)({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>(0,Xe.h)(ie,{polygons:t.value})}});var Ee=require("vue"),po=require("@layoutit/polycss-core");var Qt=50,Jt=(0,Ee.defineComponent)({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=(0,Ee.computed)(()=>e.color??e.light.color??"#ffd54a"),n=(0,Ee.computed)(()=>(0,po.octahedronPolygons)({center:[0,0,0],size:e.size,color:t.value})),o=(0,Ee.computed)(()=>{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*Qt,f*Qt,p*Qt]});return()=>(0,Ee.h)(ie,{polygons:n.value,position:o.value})}});var le=require("vue"),go=require("@layoutit/polycss-core");function Oe(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function ho(e,t,n){let o=(0,le.ref)(null),r=null,i=null,s=null,d=(0,le.ref)(0);function a(){return n==null?o.value:Oe(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 E(L){if(s===null){s=L,i=requestAnimationFrame(E);return}let g=(L-s)/1e3;s=L,r?.update(g),i=requestAnimationFrame(E)}i=requestAnimationFrame(E)}function f(){l();let E=Oe(e),L=Oe(t);if(!E||E.length===0||!L)return;let g=a();g&&(r=(0,go.createPolyAnimationMixer)(g,L),d.value++,m())}let y=(0,le.watch)(()=>{let E=Oe(e),L=Oe(t),g=n!=null?Oe(n):o.value;return{c:E,ctrl:L,r:g}},()=>f(),{immediate:!0,deep:!1});(0,le.onUnmounted)(()=>{y(),l()});let p=(0,le.computed)(()=>Oe(e)??[]),b=(0,le.computed)(()=>p.value.map(E=>E.name)),P=(0,le.computed)(()=>(d.value,r)),M=(0,le.computed)(()=>{d.value;let E=p.value,L={};for(let g of E)Object.defineProperty(L,g.name,{enumerable:!0,get(){if(!r)return null;try{return r.clipAction(g.name)}catch{return null}}});return L});return{ref:o,mixer:P,clips:p,names:b,actions:M}}var x=require("@layoutit/polycss-core");0&&(module.exports={BASE_TILE,CAMERA_BACKFACE_CULL_EPS,DEFAULT_CAMERA_STATE,DEFAULT_PROJECTION,LoopOnce,LoopPingPong,LoopRepeat,Poly,PolyAxesHelper,PolyCamera,PolyCameraContextKey,PolyDirectionalLightHelper,PolyFirstPersonControls,PolyGround,PolyMapControls,PolyMesh,PolyOrbitControls,PolyOrthographicCamera,PolyPerspectiveCamera,PolyScene,PolySelect,PolySelectionContextKey,PolyTransformControls,VOXEL_CAMERA_CULL_AXIS_EPS,VOXEL_CAMERA_CULL_NORMAL_LIMIT,arrowPolygons,axesHelperPolygons,bakeSolidTextureSampledPolygons,bakeSolidTextureSamples,boxPolygons,buildSceneContext,cameraCullNormalGroups,cameraCullNormalGroupsFromPolygons,cameraCullNormalKey,cameraCullVisibleSignature,cameraFacingDepth,clampChannel,computeSceneBbox,computeShapeLighting,computeTexturePaintMetrics,coverPlanarPolygons,createIsometricCamera,createPolyAnimationMixer,cullInteriorPolygons,findMeshUnderPoint,findPolyMeshHandle,formatColor,injectPolyBaseStyles,inverseRotateVec3,isAxisAlignedSurfaceNormal,isVoxelCameraCullableNormalGroups,loadMesh,mergePolygons,normalFacesCamera,normalizeInvertMultiplier,normalizePolygons,octahedronPolygons,optimizeMeshPolygons,parseColor,parseGltf,parseHexColor,parseMtl,parseObj,parsePureColor,parseRgbColor,parseVox,pointInMeshElement,polygonCssSurfaceNormal,polygonFaces,polygonFacesCamera,ringPolygons,rotateVec3,shadeColor,usePolyAnimation,usePolyCamera,usePolyMaterial,usePolyMesh,usePolySceneContext,usePolySelect,usePolySelectionApi});
|