glyphcss 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{elements-dJUvIMDN.d.cts → elements-ycVyIlYL.d.cts} +93 -3
- package/dist/{elements-dJUvIMDN.d.ts → elements-ycVyIlYL.d.ts} +93 -3
- package/dist/elements.cjs +5 -5
- package/dist/elements.d.cts +1 -1
- package/dist/elements.d.ts +1 -1
- package/dist/elements.js +5 -5
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +75 -3
- package/dist/index.d.ts +75 -3
- package/dist/index.js +5 -5
- package/package.json +2 -2
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { Vec3, Polygon, RenderMode } from '@glyphcss/core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Default CSS-perspective distance in virtual pixels — mirrors voxcss/polycss
|
|
5
|
+
* `DEFAULT_PERSPECTIVE`. Large enough that perspective foreshortening is gentle
|
|
6
|
+
* (a normal scene only spans a few hundred px), so the on-screen result matches
|
|
7
|
+
* polycss out of the box.
|
|
8
|
+
*/
|
|
9
|
+
declare const DEFAULT_PERSPECTIVE = 32000;
|
|
3
10
|
interface GlyphCamera {
|
|
4
11
|
readonly kind: "perspective" | "orthographic";
|
|
5
12
|
rotX: number;
|
|
6
13
|
rotY: number;
|
|
7
14
|
/** Distance from target along the view axis. For perspective cameras: world units. Default 0. */
|
|
8
15
|
distance: number;
|
|
16
|
+
/**
|
|
17
|
+
* CSS-perspective distance in virtual pixels (voxcss parity). When > 0, the
|
|
18
|
+
* camera projects with the browser's `P / (P − z)` CSS-perspective math.
|
|
19
|
+
* Default 0 (disabled).
|
|
20
|
+
*/
|
|
21
|
+
perspective: number;
|
|
9
22
|
/**
|
|
10
23
|
* Camera zoom — CSS scale multiplier (same semantic as voxcss).
|
|
11
24
|
* `zoom = 1` → one world unit = BASE_TILE (50) virtual pixels.
|
|
@@ -14,6 +27,16 @@ interface GlyphCamera {
|
|
|
14
27
|
zoom: number;
|
|
15
28
|
/** Extra horizontal stretch on top of `cellAspect`. */
|
|
16
29
|
stretch: number;
|
|
30
|
+
/**
|
|
31
|
+
* Isotropic field-of-view scale applied to the projected screen offset (around
|
|
32
|
+
* the center), independent of the perspective divide. `1` = off. Use it to
|
|
33
|
+
* decouple the FOV from the grid resolution: when the grid grows (e.g. a
|
|
34
|
+
* smaller line-height adds rows), the FOV would otherwise widen — set
|
|
35
|
+
* `fovScale` proportional to the resolution change to keep it fixed. Unlike
|
|
36
|
+
* `zoom`, it does NOT alter perspective foreshortening (zoom scales `cssZ`,
|
|
37
|
+
* shifting the `P/(P−z)` divide; this only scales the post-divide offset).
|
|
38
|
+
*/
|
|
39
|
+
fovScale: number;
|
|
17
40
|
/**
|
|
18
41
|
* Camera target offset in world space — shifts the point the camera orbits around.
|
|
19
42
|
* Subtracted from world coords before projection so the mesh appears to pan without re-baking.
|
|
@@ -26,8 +49,27 @@ interface GlyphCamera {
|
|
|
26
49
|
* `createGlyphFirstPersonControls` at attach / detach time.
|
|
27
50
|
*/
|
|
28
51
|
eyeMode: boolean;
|
|
29
|
-
/**
|
|
30
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Project a world-space vector to `[col, row, depth, zbuf?]`. `depth` is the
|
|
54
|
+
* linear eye-space `cssZ` (the public contract, used by the hit layer). The
|
|
55
|
+
* optional 4th element `zbuf` is the **screen-space-linear** depth (`1/denom`)
|
|
56
|
+
* for perspective cameras — the renderer's z-buffer must use it (not `depth`)
|
|
57
|
+
* so the depth test is perspective-correct: interpolating linear `cssZ` with
|
|
58
|
+
* screen-space barycentric weights misorders overlapping triangles, which
|
|
59
|
+
* shows the wrong (farther) surface in some cells and flickers under motion.
|
|
60
|
+
* Orthographic cameras omit it (their linear `depth` is already screen-linear).
|
|
61
|
+
*/
|
|
62
|
+
project(v: Vec3, cols: number, rows: number, cellAspect: number): [number, number, number, number?];
|
|
63
|
+
/**
|
|
64
|
+
* Signed distance of a world vertex past the near plane: `> 0` is visible
|
|
65
|
+
* (in front of the near plane), `<= 0` is culled (at/behind the eye). The
|
|
66
|
+
* near plane sits at `eyeDepth = 0`, so an edge crossing the near plane is
|
|
67
|
+
* found by linear interpolation where `eyeDepth` changes sign. The renderer
|
|
68
|
+
* uses this for near-plane clipping; `eyeDepth` is affine in `v`, so the
|
|
69
|
+
* world-space crossing point interpolates linearly. Orthographic cameras
|
|
70
|
+
* return `+Infinity` (never clipped).
|
|
71
|
+
*/
|
|
72
|
+
eyeDepth(v: Vec3): number;
|
|
31
73
|
}
|
|
32
74
|
interface GlyphPerspectiveCameraOptions {
|
|
33
75
|
/**
|
|
@@ -45,6 +87,17 @@ interface GlyphPerspectiveCameraOptions {
|
|
|
45
87
|
* smaller = more dramatic. Default 6.
|
|
46
88
|
*/
|
|
47
89
|
distance?: number;
|
|
90
|
+
/**
|
|
91
|
+
* CSS-perspective distance in **virtual pixels**, matching voxcss/polycss
|
|
92
|
+
* `createPolyPerspectiveCamera({ perspective })`. When > 0, the camera projects
|
|
93
|
+
* with the same `P / (P − z)` pinhole math the browser applies for CSS
|
|
94
|
+
* `perspective: Npx` — so identical camera params (rotX/rotY/target/zoom/
|
|
95
|
+
* distance/perspective) produce the same on-screen projection as polycss, and
|
|
96
|
+
* a first-person view falls out naturally (no `eyeMode` needed). Default
|
|
97
|
+
* {@link DEFAULT_PERSPECTIVE} (32000), matching voxcss. Set to 0 to disable
|
|
98
|
+
* (→ legacy orbit projection using `distance` in world units).
|
|
99
|
+
*/
|
|
100
|
+
perspective?: number;
|
|
48
101
|
/**
|
|
49
102
|
* Camera zoom — CSS scale multiplier. Default 0.3.
|
|
50
103
|
* `zoom = 1` → BASE_TILE (50) virtual px per world unit.
|
|
@@ -55,6 +108,8 @@ interface GlyphPerspectiveCameraOptions {
|
|
|
55
108
|
* over-stretching when monospace cells are taller than wide. Default 1.0.
|
|
56
109
|
*/
|
|
57
110
|
stretch?: number;
|
|
111
|
+
/** Isotropic FOV scale on the projected offset (resolution-independent FOV). Default 1. */
|
|
112
|
+
fovScale?: number;
|
|
58
113
|
/** Center of projection in normalized grid coords. Default `[0.5, 0.5]`. */
|
|
59
114
|
center?: [number, number];
|
|
60
115
|
}
|
|
@@ -125,6 +180,15 @@ interface GlyphMeshTransform {
|
|
|
125
180
|
castShadow?: boolean;
|
|
126
181
|
/** This mesh receives (displays) shadows from castShadow meshes. Default false. */
|
|
127
182
|
receiveShadow?: boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Relative depth bias (0 = off). Nudges this mesh toward (positive) or away
|
|
185
|
+
* from (negative) the camera in the depth test via `pixelDepth *= 1 + depthBias`
|
|
186
|
+
* — resolving z-fighting against coplanar/coincident geometry. A CSS/DOM
|
|
187
|
+
* renderer decides coincident surfaces by stacking order for free; a
|
|
188
|
+
* projection-painted depth buffer fights, so a tiny bias (e.g. 0.002) lets a
|
|
189
|
+
* dynamic surface (a door/platform flush into a wall/floor) win cleanly.
|
|
190
|
+
*/
|
|
191
|
+
depthBias?: number;
|
|
128
192
|
}
|
|
129
193
|
|
|
130
194
|
/**
|
|
@@ -184,6 +248,32 @@ interface GlyphSceneOptions {
|
|
|
184
248
|
* Default `60`.
|
|
185
249
|
*/
|
|
186
250
|
creaseAngle?: number;
|
|
251
|
+
/**
|
|
252
|
+
* Render both faces of every polygon (no backface culling). Default `false`.
|
|
253
|
+
* Set `true` for single-sided surfaces whose winding isn't guaranteed to face
|
|
254
|
+
* the camera — e.g. BSP level geometry — so "back-wound" faces don't vanish,
|
|
255
|
+
* matching how a CSS/DOM renderer shows both sides.
|
|
256
|
+
*/
|
|
257
|
+
doubleSided?: boolean;
|
|
258
|
+
/**
|
|
259
|
+
* Supersampled anti-aliasing (solid mode). `1` (default) = off; `2`/`3`
|
|
260
|
+
* rasterize at N× resolution and average down, removing the motion crawl of
|
|
261
|
+
* sub-cell-sized surfaces. Cost ~N².
|
|
262
|
+
*/
|
|
263
|
+
supersample?: number;
|
|
264
|
+
/**
|
|
265
|
+
* Global depth-test deadband (0 = exact, default). A polygon replaces a cell
|
|
266
|
+
* only when nearer by more than this relative fraction, so near-coplanar
|
|
267
|
+
* surfaces keep a stable winner instead of z-fighting per-cell as the camera
|
|
268
|
+
* moves (the tearing a CSS/DOM renderer avoids via stacking order). 0.002–0.01.
|
|
269
|
+
*/
|
|
270
|
+
depthEpsilon?: number;
|
|
271
|
+
/**
|
|
272
|
+
* Temporal anti-aliasing — exponential blend with the previous frame, weight
|
|
273
|
+
* in [0,1). `0` (default) = off. Smooths fast frame-to-frame edge crawl that
|
|
274
|
+
* supersampling can't cover, at the cost of motion ghosting.
|
|
275
|
+
*/
|
|
276
|
+
temporalBlend?: number;
|
|
187
277
|
/**
|
|
188
278
|
* Auto-size the character grid to fill the host element. When `true`, the
|
|
189
279
|
* scene measures one monospace character's pixel size from the live `<pre>`
|
|
@@ -339,4 +429,4 @@ declare class GlyphMapControlsElement extends ELEMENT_BASE {
|
|
|
339
429
|
private _attach;
|
|
340
430
|
}
|
|
341
431
|
|
|
342
|
-
export { type GlyphSceneHandle as G, type GlyphCamera as a, type GlyphDirectionalLight as b, type GlyphAmbientLight as c, type GlyphShadowOptions as d, GlyphHotspotElement as e, type GlyphHotspotHandle as f, type GlyphHotspotOptions as g, GlyphMapControlsElement as h, GlyphMeshElement as i, type GlyphMeshHandle as j, type GlyphMeshTransform as k, GlyphOrbitControlsElement as l, GlyphOrthographicCameraElement as m, type GlyphOrthographicCameraHandle as n, type GlyphOrthographicCameraOptions as o, GlyphPerspectiveCameraElement as p, type GlyphPerspectiveCameraHandle as q, type GlyphPerspectiveCameraOptions as r, GlyphSceneElement as s, type GlyphSceneOptions as t, createGlyphCamera as u, createGlyphOrthographicCamera as v, createGlyphPerspectiveCamera as w, createGlyphScene as x };
|
|
432
|
+
export { DEFAULT_PERSPECTIVE as D, type GlyphSceneHandle as G, type GlyphCamera as a, type GlyphDirectionalLight as b, type GlyphAmbientLight as c, type GlyphShadowOptions as d, GlyphHotspotElement as e, type GlyphHotspotHandle as f, type GlyphHotspotOptions as g, GlyphMapControlsElement as h, GlyphMeshElement as i, type GlyphMeshHandle as j, type GlyphMeshTransform as k, GlyphOrbitControlsElement as l, GlyphOrthographicCameraElement as m, type GlyphOrthographicCameraHandle as n, type GlyphOrthographicCameraOptions as o, GlyphPerspectiveCameraElement as p, type GlyphPerspectiveCameraHandle as q, type GlyphPerspectiveCameraOptions as r, GlyphSceneElement as s, type GlyphSceneOptions as t, createGlyphCamera as u, createGlyphOrthographicCamera as v, createGlyphPerspectiveCamera as w, createGlyphScene as x };
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { Vec3, Polygon, RenderMode } from '@glyphcss/core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Default CSS-perspective distance in virtual pixels — mirrors voxcss/polycss
|
|
5
|
+
* `DEFAULT_PERSPECTIVE`. Large enough that perspective foreshortening is gentle
|
|
6
|
+
* (a normal scene only spans a few hundred px), so the on-screen result matches
|
|
7
|
+
* polycss out of the box.
|
|
8
|
+
*/
|
|
9
|
+
declare const DEFAULT_PERSPECTIVE = 32000;
|
|
3
10
|
interface GlyphCamera {
|
|
4
11
|
readonly kind: "perspective" | "orthographic";
|
|
5
12
|
rotX: number;
|
|
6
13
|
rotY: number;
|
|
7
14
|
/** Distance from target along the view axis. For perspective cameras: world units. Default 0. */
|
|
8
15
|
distance: number;
|
|
16
|
+
/**
|
|
17
|
+
* CSS-perspective distance in virtual pixels (voxcss parity). When > 0, the
|
|
18
|
+
* camera projects with the browser's `P / (P − z)` CSS-perspective math.
|
|
19
|
+
* Default 0 (disabled).
|
|
20
|
+
*/
|
|
21
|
+
perspective: number;
|
|
9
22
|
/**
|
|
10
23
|
* Camera zoom — CSS scale multiplier (same semantic as voxcss).
|
|
11
24
|
* `zoom = 1` → one world unit = BASE_TILE (50) virtual pixels.
|
|
@@ -14,6 +27,16 @@ interface GlyphCamera {
|
|
|
14
27
|
zoom: number;
|
|
15
28
|
/** Extra horizontal stretch on top of `cellAspect`. */
|
|
16
29
|
stretch: number;
|
|
30
|
+
/**
|
|
31
|
+
* Isotropic field-of-view scale applied to the projected screen offset (around
|
|
32
|
+
* the center), independent of the perspective divide. `1` = off. Use it to
|
|
33
|
+
* decouple the FOV from the grid resolution: when the grid grows (e.g. a
|
|
34
|
+
* smaller line-height adds rows), the FOV would otherwise widen — set
|
|
35
|
+
* `fovScale` proportional to the resolution change to keep it fixed. Unlike
|
|
36
|
+
* `zoom`, it does NOT alter perspective foreshortening (zoom scales `cssZ`,
|
|
37
|
+
* shifting the `P/(P−z)` divide; this only scales the post-divide offset).
|
|
38
|
+
*/
|
|
39
|
+
fovScale: number;
|
|
17
40
|
/**
|
|
18
41
|
* Camera target offset in world space — shifts the point the camera orbits around.
|
|
19
42
|
* Subtracted from world coords before projection so the mesh appears to pan without re-baking.
|
|
@@ -26,8 +49,27 @@ interface GlyphCamera {
|
|
|
26
49
|
* `createGlyphFirstPersonControls` at attach / detach time.
|
|
27
50
|
*/
|
|
28
51
|
eyeMode: boolean;
|
|
29
|
-
/**
|
|
30
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Project a world-space vector to `[col, row, depth, zbuf?]`. `depth` is the
|
|
54
|
+
* linear eye-space `cssZ` (the public contract, used by the hit layer). The
|
|
55
|
+
* optional 4th element `zbuf` is the **screen-space-linear** depth (`1/denom`)
|
|
56
|
+
* for perspective cameras — the renderer's z-buffer must use it (not `depth`)
|
|
57
|
+
* so the depth test is perspective-correct: interpolating linear `cssZ` with
|
|
58
|
+
* screen-space barycentric weights misorders overlapping triangles, which
|
|
59
|
+
* shows the wrong (farther) surface in some cells and flickers under motion.
|
|
60
|
+
* Orthographic cameras omit it (their linear `depth` is already screen-linear).
|
|
61
|
+
*/
|
|
62
|
+
project(v: Vec3, cols: number, rows: number, cellAspect: number): [number, number, number, number?];
|
|
63
|
+
/**
|
|
64
|
+
* Signed distance of a world vertex past the near plane: `> 0` is visible
|
|
65
|
+
* (in front of the near plane), `<= 0` is culled (at/behind the eye). The
|
|
66
|
+
* near plane sits at `eyeDepth = 0`, so an edge crossing the near plane is
|
|
67
|
+
* found by linear interpolation where `eyeDepth` changes sign. The renderer
|
|
68
|
+
* uses this for near-plane clipping; `eyeDepth` is affine in `v`, so the
|
|
69
|
+
* world-space crossing point interpolates linearly. Orthographic cameras
|
|
70
|
+
* return `+Infinity` (never clipped).
|
|
71
|
+
*/
|
|
72
|
+
eyeDepth(v: Vec3): number;
|
|
31
73
|
}
|
|
32
74
|
interface GlyphPerspectiveCameraOptions {
|
|
33
75
|
/**
|
|
@@ -45,6 +87,17 @@ interface GlyphPerspectiveCameraOptions {
|
|
|
45
87
|
* smaller = more dramatic. Default 6.
|
|
46
88
|
*/
|
|
47
89
|
distance?: number;
|
|
90
|
+
/**
|
|
91
|
+
* CSS-perspective distance in **virtual pixels**, matching voxcss/polycss
|
|
92
|
+
* `createPolyPerspectiveCamera({ perspective })`. When > 0, the camera projects
|
|
93
|
+
* with the same `P / (P − z)` pinhole math the browser applies for CSS
|
|
94
|
+
* `perspective: Npx` — so identical camera params (rotX/rotY/target/zoom/
|
|
95
|
+
* distance/perspective) produce the same on-screen projection as polycss, and
|
|
96
|
+
* a first-person view falls out naturally (no `eyeMode` needed). Default
|
|
97
|
+
* {@link DEFAULT_PERSPECTIVE} (32000), matching voxcss. Set to 0 to disable
|
|
98
|
+
* (→ legacy orbit projection using `distance` in world units).
|
|
99
|
+
*/
|
|
100
|
+
perspective?: number;
|
|
48
101
|
/**
|
|
49
102
|
* Camera zoom — CSS scale multiplier. Default 0.3.
|
|
50
103
|
* `zoom = 1` → BASE_TILE (50) virtual px per world unit.
|
|
@@ -55,6 +108,8 @@ interface GlyphPerspectiveCameraOptions {
|
|
|
55
108
|
* over-stretching when monospace cells are taller than wide. Default 1.0.
|
|
56
109
|
*/
|
|
57
110
|
stretch?: number;
|
|
111
|
+
/** Isotropic FOV scale on the projected offset (resolution-independent FOV). Default 1. */
|
|
112
|
+
fovScale?: number;
|
|
58
113
|
/** Center of projection in normalized grid coords. Default `[0.5, 0.5]`. */
|
|
59
114
|
center?: [number, number];
|
|
60
115
|
}
|
|
@@ -125,6 +180,15 @@ interface GlyphMeshTransform {
|
|
|
125
180
|
castShadow?: boolean;
|
|
126
181
|
/** This mesh receives (displays) shadows from castShadow meshes. Default false. */
|
|
127
182
|
receiveShadow?: boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Relative depth bias (0 = off). Nudges this mesh toward (positive) or away
|
|
185
|
+
* from (negative) the camera in the depth test via `pixelDepth *= 1 + depthBias`
|
|
186
|
+
* — resolving z-fighting against coplanar/coincident geometry. A CSS/DOM
|
|
187
|
+
* renderer decides coincident surfaces by stacking order for free; a
|
|
188
|
+
* projection-painted depth buffer fights, so a tiny bias (e.g. 0.002) lets a
|
|
189
|
+
* dynamic surface (a door/platform flush into a wall/floor) win cleanly.
|
|
190
|
+
*/
|
|
191
|
+
depthBias?: number;
|
|
128
192
|
}
|
|
129
193
|
|
|
130
194
|
/**
|
|
@@ -184,6 +248,32 @@ interface GlyphSceneOptions {
|
|
|
184
248
|
* Default `60`.
|
|
185
249
|
*/
|
|
186
250
|
creaseAngle?: number;
|
|
251
|
+
/**
|
|
252
|
+
* Render both faces of every polygon (no backface culling). Default `false`.
|
|
253
|
+
* Set `true` for single-sided surfaces whose winding isn't guaranteed to face
|
|
254
|
+
* the camera — e.g. BSP level geometry — so "back-wound" faces don't vanish,
|
|
255
|
+
* matching how a CSS/DOM renderer shows both sides.
|
|
256
|
+
*/
|
|
257
|
+
doubleSided?: boolean;
|
|
258
|
+
/**
|
|
259
|
+
* Supersampled anti-aliasing (solid mode). `1` (default) = off; `2`/`3`
|
|
260
|
+
* rasterize at N× resolution and average down, removing the motion crawl of
|
|
261
|
+
* sub-cell-sized surfaces. Cost ~N².
|
|
262
|
+
*/
|
|
263
|
+
supersample?: number;
|
|
264
|
+
/**
|
|
265
|
+
* Global depth-test deadband (0 = exact, default). A polygon replaces a cell
|
|
266
|
+
* only when nearer by more than this relative fraction, so near-coplanar
|
|
267
|
+
* surfaces keep a stable winner instead of z-fighting per-cell as the camera
|
|
268
|
+
* moves (the tearing a CSS/DOM renderer avoids via stacking order). 0.002–0.01.
|
|
269
|
+
*/
|
|
270
|
+
depthEpsilon?: number;
|
|
271
|
+
/**
|
|
272
|
+
* Temporal anti-aliasing — exponential blend with the previous frame, weight
|
|
273
|
+
* in [0,1). `0` (default) = off. Smooths fast frame-to-frame edge crawl that
|
|
274
|
+
* supersampling can't cover, at the cost of motion ghosting.
|
|
275
|
+
*/
|
|
276
|
+
temporalBlend?: number;
|
|
187
277
|
/**
|
|
188
278
|
* Auto-size the character grid to fill the host element. When `true`, the
|
|
189
279
|
* scene measures one monospace character's pixel size from the live `<pre>`
|
|
@@ -339,4 +429,4 @@ declare class GlyphMapControlsElement extends ELEMENT_BASE {
|
|
|
339
429
|
private _attach;
|
|
340
430
|
}
|
|
341
431
|
|
|
342
|
-
export { type GlyphSceneHandle as G, type GlyphCamera as a, type GlyphDirectionalLight as b, type GlyphAmbientLight as c, type GlyphShadowOptions as d, GlyphHotspotElement as e, type GlyphHotspotHandle as f, type GlyphHotspotOptions as g, GlyphMapControlsElement as h, GlyphMeshElement as i, type GlyphMeshHandle as j, type GlyphMeshTransform as k, GlyphOrbitControlsElement as l, GlyphOrthographicCameraElement as m, type GlyphOrthographicCameraHandle as n, type GlyphOrthographicCameraOptions as o, GlyphPerspectiveCameraElement as p, type GlyphPerspectiveCameraHandle as q, type GlyphPerspectiveCameraOptions as r, GlyphSceneElement as s, type GlyphSceneOptions as t, createGlyphCamera as u, createGlyphOrthographicCamera as v, createGlyphPerspectiveCamera as w, createGlyphScene as x };
|
|
432
|
+
export { DEFAULT_PERSPECTIVE as D, type GlyphSceneHandle as G, type GlyphCamera as a, type GlyphDirectionalLight as b, type GlyphAmbientLight as c, type GlyphShadowOptions as d, GlyphHotspotElement as e, type GlyphHotspotHandle as f, type GlyphHotspotOptions as g, GlyphMapControlsElement as h, GlyphMeshElement as i, type GlyphMeshHandle as j, type GlyphMeshTransform as k, GlyphOrbitControlsElement as l, GlyphOrthographicCameraElement as m, type GlyphOrthographicCameraHandle as n, type GlyphOrthographicCameraOptions as o, GlyphPerspectiveCameraElement as p, type GlyphPerspectiveCameraHandle as q, type GlyphPerspectiveCameraOptions as r, GlyphSceneElement as s, type GlyphSceneOptions as t, createGlyphCamera as u, createGlyphOrthographicCamera as v, createGlyphPerspectiveCamera as w, createGlyphScene as x };
|
package/dist/elements.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var $e=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var _t=Object.getOwnPropertyNames;var Tt=Object.prototype.hasOwnProperty;var zt=(n,t)=>{for(var e in t)$e(n,e,{get:t[e],enumerable:!0})},Ht=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _t(t))!Tt.call(n,r)&&r!==e&&$e(n,r,{get:()=>t[r],enumerable:!(o=Lt(t,r))||o.enumerable});return n};var Pt=n=>Ht($e({},"__esModule",{value:!0}),n);var yn={};zt(yn,{GlyphHotspotElement:()=>Me,GlyphMapControlsElement:()=>Ge,GlyphMeshElement:()=>Ae,GlyphOrbitControlsElement:()=>Se,GlyphOrthographicCameraElement:()=>fe,GlyphPerspectiveCameraElement:()=>xe,GlyphSceneElement:()=>Ce});module.exports=Pt(yn);var nt=Math.PI/180;function rt(n,t,e){let o=n[1],r=n[0],s=n[2],l=e*nt,i=Math.cos(l),c=Math.sin(l),u=o*i-r*c,d=o*c+r*i,a=s,f=t*nt,v=Math.cos(f),g=Math.sin(f),w=d*v-a*g,x=d*g+a*v;return[u,w,x]}function Te(n={}){let t={rotX:n.rotX??65,rotY:n.rotY??45,distance:n.distance??6,zoom:n.zoom??.65,stretch:n.stretch??1,target:[0,0,0],eyeMode:!1,focal:1},[e,o]=n.center??[.5,.5];return{kind:"perspective",get rotX(){return t.rotX},set rotX(r){t.rotX=r},get rotY(){return t.rotY},set rotY(r){t.rotY=r},get distance(){return t.distance},set distance(r){t.distance=r},get zoom(){return t.zoom},set zoom(r){t.zoom=r},get stretch(){return t.stretch},set stretch(r){t.stretch=r},get target(){return t.target},set target(r){t.target=r},get eyeMode(){return t.eyeMode},set eyeMode(r){t.eyeMode=r},project(r,s,l,i){let u=50/i,d=[r[0]-t.target[0],r[1]-t.target[1],r[2]-t.target[2]],a=rt(d,t.rotX,t.rotY);if(t.eyeMode){if(a[2]>=-.001)return[NaN,NaN,a[2]];let y=t.focal/-a[2],E=a[0]*y*t.zoom*50,L=a[1]*y*t.zoom*50,p=s*e+E/u*t.stretch,m=l*o+L/50;return[p,m,a[2]]}let f=.001,v=t.distance-a[2];if(v<f)return[NaN,NaN,a[2]];let g=t.distance/v,w=a[0]*g*t.zoom*50,x=a[1]*g*t.zoom*50,_=s*e+w/u*t.stretch,G=l*o+x/50;return[_,G,a[2]]}}}function ot(n={}){let t={rotX:n.rotX??65,rotY:n.rotY??45,distance:0,zoom:n.zoom??.65,stretch:1,target:[0,0,0]},[e,o]=n.center??[.5,.5];return{kind:"orthographic",get rotX(){return t.rotX},set rotX(r){t.rotX=r},get rotY(){return t.rotY},set rotY(r){t.rotY=r},get distance(){return t.distance},set distance(r){t.distance=r},get zoom(){return t.zoom},set zoom(r){t.zoom=r},get stretch(){return t.stretch},set stretch(r){t.stretch=r},get target(){return t.target},set target(r){t.target=r},get eyeMode(){return!1},set eyeMode(r){},project(r,s,l,i){let u=50/i,d=[r[0]-t.target[0],r[1]-t.target[1],r[2]-t.target[2]],a=rt(d,t.rotX,t.rotY),f=a[0]*t.zoom*50,v=a[1]*t.zoom*50,g=s*e+f/u,w=l*o+v/50;return[g,w,a[2]]}}}var Ot={direction:[-.5,-.7,-.5],intensity:1},It={intensity:.4};function Rt(n){let t=new Set,e=[];for(let o of n){let r=o.vertices;if(!(r.length<2))for(let s=0;s<r.length;s++){let l=r[s],i=r[(s+1)%r.length],c=`${l[0]},${l[1]},${l[2]}`,u=`${i[0]},${i[1]},${i[2]}`,d=c<u?`${c}|${u}`:`${u}|${c}`;if(t.has(d))continue;t.add(d);let a={from:l,to:i,weight:2};o.color&&(a.color=o.color),e.push(a)}}return e}function it(n){let t=n.polygons??[],e=n.mode??(t.length?"solid":"wireframe"),o=n.wireframe??(e==="wireframe"?Rt(t):[]);return{camera:n.camera,grid:n.grid,polygons:t,wireframe:o,mode:e,directionalLight:n.directionalLight??Ot,ambientLight:n.ambientLight??It,glyphPalette:n.glyphPalette??"default",useColors:n.useColors??!0,smoothShading:n.smoothShading??!1,creaseAngle:n.creaseAngle??60,shadow:n.shadow,castShadowFlags:n.castShadowFlags??[],receiveShadowFlags:n.receiveShadowFlags??[]}}var wn=" .:-=+*#%@".split(""),Cn=" .:-=+*#%@".split(""),We={default:{thin:"\xB7\u22C5\u2219\u02D9\xB7\u22C5\u2219".split(""),normal:"\u254B\u256C\u253C\u2573\u25C6\u25C7\u25CA\u25B2\u25B3\u25BC\u25BD\u25C8\u2B21\u2B22\u2234\u2235\u22A5\u2295\u2297\u2299\u229A\u229B".split(""),core:"\u2726\u2727\u2729\u25C9\u2299\u25CE".split(""),solid:" .:-=+*#%@".split("")},ascii:{thin:".'".split(""),normal:"+*x".split(""),core:"#@".split(""),solid:" .,:;!+=*xX#@".split("")},dots:{thin:"\xB7\u22C5".split(""),normal:"\u2022\u25CF".split(""),core:"\u25C9\u25CE".split(""),solid:" \xB7\u22C5\u2218\u2022\u25CF\u25C9\u25CE\u2B24".split("")},lines:{thin:"\u2500\u2502".split(""),normal:"\u2550\u2551".split(""),core:"\u2588".split(""),solid:" \u2500\u2550\u256C\u2551\u2588\u2593\u2592\u2591".split("")},blocks:{thin:"\u2591\u2581".split(""),normal:"\u2592\u2593\u258C\u2590\u2580\u2584".split(""),core:"\u2588".split(""),solid:" \u2591\u2592\u2593\u258C\u2590\u2588\u2580\u2584\u25A0".split("")},stars:{thin:"\xB7\u22C6".split(""),normal:"\u2726\u2727\u2729\u272A".split(""),core:"\u272B\u272C\u272D\u2605".split(""),solid:" \xB7\u22C6\u2217\u2726\u2727\u2729\u272A\u272B\u2605".split("")},arrows:{thin:"\xB7\u2219".split(""),normal:"\u2190\u2191\u2192\u2193".split(""),core:"\u2196\u2197\u2198\u2199\u2921\u2922".split(""),solid:" \xB7\u2219\u2191\u2197\u2192\u2198\u2193\u2199\u2190\u2196".split("")},braille:{thin:"\u2801\u2802\u2804\u2808".split(""),normal:"\u2803\u2805\u2806\u2809\u280A\u280B\u280C\u280D\u280E\u280F".split(""),core:"\u283F\u28FF".split(""),solid:" \u2801\u2803\u2807\u2827\u2837\u283F\u287F\u28FF".split("")},runes:{thin:".\xB7".split(""),normal:"\u16A0\u16A1\u16A2\u16A3\u16A4\u16A6\u16A8\u16B1\u16B2\u16B3\u16B7\u16B9\u16C3\u16C7\u16C9".split(""),core:"\u16DE\u16DF\u16E1\u16E2\u16E3".split(""),solid:" \xB7\u16A0\u16A3\u16A4\u16A8\u16B1\u16B7\u16DE\u16E2".split("")},math:{thin:"\u2219\u2218".split(""),normal:"\u2211\u220F\u222B\u221A\u221E\u2248\u2260\u2264\u2265\u2282\u2283\u2286\u2287".split(""),core:"\u222E\u222F\u2230\u2202".split(""),solid:" \u2219\u2218\u2211\u222B\u221A\u221E\u2248\u2295\u2297".split("")},binary:{thin:"\xB7.".split(""),normal:"01".split(""),core:"\u2588".split(""),solid:" .:01\u2588\u2588".split("")},hex:{thin:"\xB7\u2219".split(""),normal:"0123456789ABCDEF".split(""),core:"FFAA".split(""),solid:" 0123456789AF".split("")}},An=We.default;function je(n){return We[n]??We.default}function lt(n){let{camera:t,grid:e,wireframe:o,mode:r}=n,{cols:s,rows:l,cellAspect:i}=e;if(r==="solid")return kt(n,s,l,i);let c=je(n.glyphPalette),u=new Uint8Array(s*l),d=n.useColors?new Array(s*l).fill(null):null;for(let a of o){let f=t.project(a.from,s,l,i),v=t.project(a.to,s,l,i);f[0]!==f[0]||v[0]!==v[0]||Vt(u,d,f[0]|0,f[1]|0,v[0]|0,v[1]|0,a.weight??2,a.color??null,s,l)}return $t(u,d,s,l,c)}function kt(n,t,e,o){let{camera:r,polygons:s,directionalLight:l,ambientLight:i,smoothShading:c,creaseAngle:u,castShadowFlags:d,receiveShadowFlags:a}=n,f=je(n.glyphPalette).solid,v=f.length-1,g=new Array(t*e).fill(" "),w=n.useColors,x=w?new Array(t*e).fill(null):null,_=new Float64Array(t*e).fill(-1/0),G=l.direction,z=Math.hypot(G[0],G[1],G[2])||1,y=G[0]/z,E=G[1]/z,L=G[2]/z,p=l.intensity??1,m=i.intensity??.4,b=we(l.color??"#ffffff"),A=we(i.color??"#ffffff"),h=c&&u>0?Xt(s,u):null,C=new Map,S=n.shadow,H=S!=null&&d.length>0?Yt(s,d,y,E,L):null,T=S?.opacity??.25,I=S?.lift??.05,R=S?.color??"#000000",q=H?we(R):[0,0,0],P=globalThis.__glyphPerfDetail,U=P?performance.now():0,B=[],O=n.shadeCache??null,k=-1;for(let re=0;re<s.length;re++){let ye=s[re],Y=ye.vertices;if(!(Y.length<3)){for(let N=0;N<Y.length;N++)B[N]=r.project(Y[N],t,e,o);for(let N=1;N<Y.length-1;N++){k++;let be=0,D=N,K=N+1,Z=Y[be],oe=Y[D],ie=Y[K],F=B[be],X=B[D],V=B[K];if(F[0]!==F[0]||X[0]!==X[0]||V[0]!==V[0]||(X[0]-F[0])*(V[1]-F[1])-(X[1]-F[1])*(V[0]-F[0])>0)continue;let $,J,Q,se=null;if(O!==null&&O.iA[k]!==void 0)$=O.iA[k],J=O.iB[k],Q=O.iC[k],se=O.lit[k];else{let M=oe[0]-Z[0],le=oe[1]-Z[1],ae=oe[2]-Z[2],ce=ie[0]-Z[0],Ke=ie[1]-Z[1],Ze=ie[2]-Z[2],Je=le*Ze-ae*Ke,Qe=ae*ce-M*Ze,et=M*Ke-le*ce,Oe=Math.hypot(Je,Qe,et)||1,gt=Je/Oe,yt=Qe/Oe,bt=et/Oe,Ie,Re,ke,Fe,Be,Ye,Ne,Xe,De;if(h){let ve=h[re],ee=ve[be],ue=ve[D],Ee=ve[K];Ie=ee[0],Re=ee[1],ke=ee[2],Fe=ue[0],Be=ue[1],Ye=ue[2],Ne=Ee[0],Xe=Ee[1],De=Ee[2]}else Ie=Fe=Ne=gt,Re=Be=Xe=yt,ke=Ye=De=bt;let vt=Math.max(0,-(Ie*y+Re*E+ke*L)),Et=Math.max(0,-(Fe*y+Be*E+Ye*L)),wt=Math.max(0,-(Ne*y+Xe*E+De*L));if($=Math.min(1,m+vt*p),J=Math.min(1,m+Et*p),Q=Math.min(1,m+wt*p),w){let ve=($+J+Q)/3,ee=Math.max(0,ve-m),ue=ye.color??"#ffffff",Ee=ee*255|0,tt=`${ue}:${Ee}`,_e=C.get(tt);if(_e===void 0){let Ve=we(ue),Ct=m*A[0]/255+ee*b[0]/255,At=m*A[1]/255+ee*b[1]/255,Mt=m*A[2]/255+ee*b[2]/255,xt=Math.min(255,Ve[0]*Ct),St=Math.min(255,Ve[1]*At),Gt=Math.min(255,Ve[2]*Mt);_e=`#${he(xt)}${he(St)}${he(Gt)}`,C.set(tt,_e)}se=_e}O!==null&&(O.iA[k]=$,O.iB[k]=J,O.iC[k]=Q,O.lit[k]=se)}let Pe=a[re]??!1,Le=null;if(H!==null&&Pe){let M=H,le=de(Z,M.right[0],M.right[1],M.right[2],M.up[0],M.up[1],M.up[2],M.dir[0],M.dir[1],M.dir[2],M.uMin,M.uMax,M.vMin,M.vMax),ae=de(oe,M.right[0],M.right[1],M.right[2],M.up[0],M.up[1],M.up[2],M.dir[0],M.dir[1],M.dir[2],M.uMin,M.uMax,M.vMin,M.vMax),ce=de(ie,M.right[0],M.right[1],M.right[2],M.up[0],M.up[1],M.up[2],M.dir[0],M.dir[1],M.dir[2],M.uMin,M.uMax,M.vMin,M.vMax);Le={map:M,luA:le[0],lvA:le[1],ldA:le[2],luB:ae[0],lvB:ae[1],ldB:ae[2],luC:ce[0],lvC:ce[1],ldC:ce[2],lift:I,opacity:T,shadowColorRgb:q,shadowColorHex:R,litCache:C}}Nt(F[0],F[1],F[2],$,X[0],X[1],X[2],J,V[0],V[1],V[2],Q,f,v,se,g,x,_,t,e,Le)}}}P&&(P.loop??(P.loop=[])).push(performance.now()-U);let ne=P?performance.now():0,ge=Dt(g,x,t,e);return P&&(P.string??(P.string=[])).push(performance.now()-ne),ge}var Ft=new Float64Array([(0+.5)/16,(8+.5)/16,(2+.5)/16,(10+.5)/16,(12+.5)/16,(4+.5)/16,(14+.5)/16,(6+.5)/16,(3+.5)/16,(11+.5)/16,(1+.5)/16,(9+.5)/16,(15+.5)/16,(7+.5)/16,(13+.5)/16,(5+.5)/16]),W=256;function de(n,t,e,o,r,s,l,i,c,u,d,a,f,v){let g=t*n[0]+e*n[1]+o*n[2],w=r*n[0]+s*n[1]+l*n[2],x=-(i*n[0]+c*n[1]+u*n[2]),_=(g-d)/(a-d)*(W-1),G=(w-f)/(v-f)*(W-1);return[_,G,x]}function Bt(n,t,e,o){let r=t[0],s=t[1],l=t[2],i=e[0],c=e[1],u=e[2],d=o[0],a=o[1],f=o[2],v=(i-r)*(a-s)-(c-s)*(d-r);if(v===0)return;let g=1/v,w=r<i?r:i;d<w&&(w=d);let x=r>i?r:i;d>x&&(x=d);let _=s<c?s:c;a<_&&(_=a);let G=s>c?s:c;a>G&&(G=a);let z=Math.max(0,Math.ceil(w)),y=Math.min(W-1,Math.floor(x)),E=Math.max(0,Math.ceil(_)),L=Math.min(W-1,Math.floor(G));if(z>y||E>L)return;let p=v>0;for(let m=E;m<=L;m++)for(let b=z;b<=y;b++){let A=b,h=m,C=(i-A)*(a-h)-(c-h)*(d-A),S=(d-A)*(s-h)-(a-h)*(r-A),H=(r-A)*(c-h)-(s-h)*(i-A);if(p?C<0||S<0||H<0:C>0||S>0||H>0)continue;let T=(C*l+S*u+H*f)*g,I=m*W+b;T>n[I]&&(n[I]=T)}}function Yt(n,t,e,o,r){let s,l,i;Math.abs(e)<.9?(s=0,l=r,i=-o):(s=-r,l=0,i=e);let c=Math.hypot(s,l,i);s/=c,l/=c,i/=c;let u=l*r-i*o,d=i*e-s*r,a=s*o-l*e,f=1/0,v=-1/0,g=1/0,w=-1/0,x=!1;for(let y=0;y<n.length;y++)if(t[y]){x=!0;for(let E of n[y].vertices){let L=s*E[0]+l*E[1]+i*E[2],p=u*E[0]+d*E[1]+a*E[2];L<f&&(f=L),L>v&&(v=L),p<g&&(g=p),p>w&&(w=p)}}if(!x)return null;let _=(v-f)*.05+.01,G=(w-g)*.05+.01;f-=_,v+=_,g-=G,w+=G;let z=new Float64Array(W*W).fill(-1/0);for(let y=0;y<n.length;y++){if(!t[y])continue;let E=n[y].vertices;if(!(E.length<3))for(let L=1;L<E.length-1;L++){let p=E[0],m=E[L],b=E[L+1],A=de(p,s,l,i,u,d,a,e,o,r,f,v,g,w),h=de(m,s,l,i,u,d,a,e,o,r,f,v,g,w),C=de(b,s,l,i,u,d,a,e,o,r,f,v,g,w);Bt(z,A,h,C)}}return{buf:z,right:[s,l,i],up:[u,d,a],dir:[e,o,r],uMin:f,uMax:v,vMin:g,vMax:w}}function Nt(n,t,e,o,r,s,l,i,c,u,d,a,f,v,g,w,x,_,G,z,y){let E=(r-n)*(u-t)-(s-t)*(c-n);if(E===0||E>0)return;let L=1/E,p=E>0,m=n<r?n:r;c<m&&(m=c);let b=n>r?n:r;c>b&&(b=c);let A=t<s?t:s;u<A&&(A=u);let h=t>s?t:s;u>h&&(h=u);let C=Math.max(0,Math.ceil(m)),S=Math.min(G-1,Math.floor(b)),H=Math.max(0,Math.ceil(A)),T=Math.min(z-1,Math.floor(h));if(!(C>S||H>T))for(let I=H;I<=T;I++){let R=I;for(let q=C;q<=S;q++){let P=q,U=(r-P)*(u-R)-(s-R)*(c-P),B=(c-P)*(t-R)-(u-R)*(n-P),O=(n-P)*(s-R)-(t-R)*(r-P);if(p?U<0||B<0||O<0:U>0||B>0||O>0)continue;let k=(U*e+B*l+O*d)*L,ne=I*G+q;if(k>_[ne]){_[ne]=k;let ge=(U*o+B*i+O*a)*L,ye=(ge<0?0:ge>1?1:ge)*v,Y=ye|0,N=ye-Y,be=Ft[(I&3)*4+(q&3)],D=N>be&&Y<v?Y+1:Y;D>v&&(D=v);let K=g;if(y!==null){let Z=(U*y.luA+B*y.luB+O*y.luC)*L,oe=(U*y.lvA+B*y.lvB+O*y.lvC)*L,ie=(U*y.ldA+B*y.ldB+O*y.ldC)*L,F=Z|0,X=oe|0;if(F>=0&&F<W&&X>=0&&X<W){let V=y.map.buf[X*W+F];if(V>-1/0&&ie+y.lift<V&&(D=Math.max(0,D-Math.round(y.opacity*v)),K!==null)){let He=`shadow:${K}:${D}`,$=y.litCache.get(He);if($===void 0){let J=we(K),Q=y.shadowColorRgb,se=Math.round(J[0]*(1-y.opacity)+Q[0]*y.opacity),Pe=Math.round(J[1]*(1-y.opacity)+Q[1]*y.opacity),Le=Math.round(J[2]*(1-y.opacity)+Q[2]*y.opacity);$=`#${he(se)}${he(Pe)}${he(Le)}`,y.litCache.set(He,$)}K=$}}}w[ne]=f[D],x&&(x[ne]=K)}}}}function Xt(n,t){let e=n.length,o=new Array(e);for(let i=0;i<e;i++){let c=n[i].vertices;if(c.length<3){o[i]=[0,0,0];continue}let u=c[0],d=c[1],a=c[2],f=d[0]-u[0],v=d[1]-u[1],g=d[2]-u[2],w=a[0]-u[0],x=a[1]-u[1],_=a[2]-u[2],G=v*_-g*x,z=g*w-f*_,y=f*x-v*w,E=Math.hypot(G,z,y)||1;o[i]=[G/E,z/E,y/E]}let r=new Map;for(let i=0;i<e;i++){let c=n[i].vertices;for(let u=0;u<c.length;u++){let d=c[u],a=`${d[0]},${d[1]},${d[2]}`,f=r.get(a);f||(f=[],r.set(a,f)),(f.length===0||f[f.length-1]!==i)&&f.push(i)}}let s=Math.cos(t*Math.PI/180),l=new Array(e);for(let i=0;i<e;i++){let c=n[i].vertices,u=o[i],d=new Array(c.length);for(let a=0;a<c.length;a++){let f=c[a],v=r.get(`${f[0]},${f[1]},${f[2]}`),g=0,w=0,x=0;for(let G=0;G<v.length;G++){let z=v[G],y=o[z];u[0]*y[0]+u[1]*y[1]+u[2]*y[2]>=s&&(g+=y[0],w+=y[1],x+=y[2])}let _=Math.hypot(g,w,x)||1;d[a]=[g/_,w/_,x/_]}l[i]=d}return l}function Dt(n,t,e,o){let r=[],s=null,l="",i=()=>{l&&(s!==null?r.push(`<span style="color:${s}">${l}</span>`):r.push(l),l="")};for(let c=0;c<o;c++){for(let u=0;u<e;u++){let d=c*e+u,a=n[d],f=t&&a!==" "?t[d]??null:null;f!==s&&(i(),s=f),l+=a}i(),s=null,c<o-1&&r.push(`
|
|
2
|
-
`)}return r.join("")}function
|
|
3
|
-
`)}return s.join("")}var
|
|
1
|
+
"use strict";var ht=Object.defineProperty;var Jt=Object.getOwnPropertyDescriptor;var Qt=Object.getOwnPropertyNames;var en=Object.prototype.hasOwnProperty;var tn=(n,e)=>{for(var t in e)ht(n,t,{get:e[t],enumerable:!0})},nn=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Qt(e))!en.call(n,r)&&r!==t&&ht(n,r,{get:()=>e[r],enumerable:!(o=Jt(e,r))||o.enumerable});return n};var rn=n=>nn(ht({},"__esModule",{value:!0}),n);var Xn={};tn(Xn,{GlyphHotspotElement:()=>We,GlyphMapControlsElement:()=>Ue,GlyphMeshElement:()=>$e,GlyphOrbitControlsElement:()=>qe,GlyphOrthographicCameraElement:()=>Ne,GlyphPerspectiveCameraElement:()=>je,GlyphSceneElement:()=>Xe});module.exports=rn(Xn);var Bt=require("@glyphcss/core");var Gt=Math.PI/180,Lt=.01,on=32e3,sn=Lt*1.01;function ft(n,e,t){let o=n[1],r=n[0],s=n[2],l=t*Gt,i=Math.cos(l),c=Math.sin(l),u=o*i-r*c,p=o*c+r*i,d=s,m=e*Gt,h=Math.cos(m),f=Math.sin(m),b=p*h-d*f,C=p*f+d*h;return[u,b,C]}function Ie(n={}){let e={rotX:n.rotX??65,rotY:n.rotY??45,distance:n.distance??6,perspective:n.perspective??on,zoom:n.zoom??.65,stretch:n.stretch??1,fovScale:n.fovScale??1,target:[0,0,0],eyeMode:!1,focal:1},[t,o]=n.center??[.5,.5];return{kind:"perspective",get rotX(){return e.rotX},set rotX(r){e.rotX=r},get rotY(){return e.rotY},set rotY(r){e.rotY=r},get distance(){return e.distance},set distance(r){e.distance=r},get perspective(){return e.perspective},set perspective(r){e.perspective=r},get zoom(){return e.zoom},set zoom(r){e.zoom=r},get stretch(){return e.stretch},set stretch(r){e.stretch=r},get fovScale(){return e.fovScale},set fovScale(r){e.fovScale=r},get target(){return e.target},set target(r){e.target=r},get eyeMode(){return e.eyeMode},set eyeMode(r){e.eyeMode=r},eyeDepth(r){let s=ft([r[0]-e.target[0],r[1]-e.target[1],r[2]-e.target[2]],e.rotX,e.rotY),l=.001*1.01;if(e.eyeMode)return-s[2]-l;if(e.perspective>0){let i=s[2]*e.zoom*50-e.distance;return e.perspective-i-e.perspective*sn}return e.distance-s[2]-l},project(r,s,l,i){let u=50/i,p=[r[0]-e.target[0],r[1]-e.target[1],r[2]-e.target[2]],d=ft(p,e.rotX,e.rotY);if(e.eyeMode){if(d[2]>=-.001)return[NaN,NaN,d[2],NaN];let y=e.focal/-d[2],w=d[0]*y*e.zoom*50,P=d[1]*y*e.zoom*50,H=s*t+w/u*e.stretch,v=l*o+P/50;return[H,v,d[2],-1/d[2]]}if(e.perspective>0){let x=e.perspective,y=d[0]*e.zoom*50,w=d[1]*e.zoom*50,P=d[2]*e.zoom*50-e.distance,H=x-P,v=x*Lt;if(H<v)return[NaN,NaN,P,NaN];let A=x/H,L=s*t+y*A/u*e.stretch*e.fovScale,a=l*o+w*A/50*e.fovScale;return[L,a,P,1/H]}let m=.001,h=e.distance-d[2];if(h<m)return[NaN,NaN,d[2],NaN];let f=e.distance/h,b=d[0]*f*e.zoom*50,C=d[1]*f*e.zoom*50,_=s*t+b/u*e.stretch*e.fovScale,M=l*o+C/50*e.fovScale;return[_,M,d[2],1/h]}}}function Tt(n={}){let e={rotX:n.rotX??65,rotY:n.rotY??45,distance:0,zoom:n.zoom??.65,stretch:1,fovScale:1,target:[0,0,0]},[t,o]=n.center??[.5,.5];return{kind:"orthographic",get rotX(){return e.rotX},set rotX(r){e.rotX=r},get rotY(){return e.rotY},set rotY(r){e.rotY=r},get distance(){return e.distance},set distance(r){e.distance=r},get perspective(){return 0},set perspective(r){},get zoom(){return e.zoom},set zoom(r){e.zoom=r},get stretch(){return e.stretch},set stretch(r){e.stretch=r},get fovScale(){return e.fovScale},set fovScale(r){e.fovScale=r},get target(){return e.target},set target(r){e.target=r},get eyeMode(){return!1},set eyeMode(r){},eyeDepth(r){return Number.POSITIVE_INFINITY},project(r,s,l,i){let u=50/i,p=[r[0]-e.target[0],r[1]-e.target[1],r[2]-e.target[2]],d=ft(p,e.rotX,e.rotY),m=d[0]*e.zoom*50,h=d[1]*e.zoom*50,f=s*t+m/u*e.fovScale,b=l*o+h/50*e.fovScale;return[f,b,d[2]]}}}var ln={direction:[-.5,-.7,-.5],intensity:1},an={intensity:.4};function cn(n){let e=new Set,t=[];for(let o of n){let r=o.vertices;if(!(r.length<2))for(let s=0;s<r.length;s++){let l=r[s],i=r[(s+1)%r.length],c=`${l[0]},${l[1]},${l[2]}`,u=`${i[0]},${i[1]},${i[2]}`,p=c<u?`${c}|${u}`:`${u}|${c}`;if(e.has(p))continue;e.add(p);let d={from:l,to:i,weight:2};o.color&&(d.color=o.color),t.push(d)}}return t}function _t(n){let e=n.polygons??[],t=n.mode??(e.length?"solid":"wireframe"),o=n.wireframe??(t==="wireframe"?cn(e):[]);return{camera:n.camera,grid:n.grid,polygons:e,wireframe:o,mode:t,directionalLight:n.directionalLight??ln,ambientLight:n.ambientLight??an,glyphPalette:n.glyphPalette??"default",useColors:n.useColors??!0,smoothShading:n.smoothShading??!1,creaseAngle:n.creaseAngle??60,doubleSided:n.doubleSided??!1,supersample:n.supersample??1,temporalBlend:n.temporalBlend??0,shadow:n.shadow,castShadowFlags:n.castShadowFlags??[],receiveShadowFlags:n.receiveShadowFlags??[],...n.depthBiases?{depthBiases:n.depthBiases}:{},...n.depthEpsilon?{depthEpsilon:n.depthEpsilon}:{}}}var nt=require("@glyphcss/core");var qn=" .:-=+*#%@".split(""),Un=" .:-=+*#%@".split(""),gt={default:{thin:"\xB7\u22C5\u2219\u02D9\xB7\u22C5\u2219".split(""),normal:"\u254B\u256C\u253C\u2573\u25C6\u25C7\u25CA\u25B2\u25B3\u25BC\u25BD\u25C8\u2B21\u2B22\u2234\u2235\u22A5\u2295\u2297\u2299\u229A\u229B".split(""),core:"\u2726\u2727\u2729\u25C9\u2299\u25CE".split(""),solid:" .:-=+*#%@".split("")},ascii:{thin:".'".split(""),normal:"+*x".split(""),core:"#@".split(""),solid:" .,:;!+=*xX#@".split("")},dots:{thin:"\xB7\u22C5".split(""),normal:"\u2022\u25CF".split(""),core:"\u25C9\u25CE".split(""),solid:" \xB7\u22C5\u2218\u2022\u25CF\u25C9\u25CE\u2B24".split("")},lines:{thin:"\u2500\u2502".split(""),normal:"\u2550\u2551".split(""),core:"\u2588".split(""),solid:" \u2500\u2550\u256C\u2551\u2588\u2593\u2592\u2591".split("")},blocks:{thin:"\u2591\u2581".split(""),normal:"\u2592\u2593\u258C\u2590\u2580\u2584".split(""),core:"\u2588".split(""),solid:" \u2591\u2592\u2593\u258C\u2590\u2588\u2580\u2584\u25A0".split("")},stars:{thin:"\xB7\u22C6".split(""),normal:"\u2726\u2727\u2729\u272A".split(""),core:"\u272B\u272C\u272D\u2605".split(""),solid:" \xB7\u22C6\u2217\u2726\u2727\u2729\u272A\u272B\u2605".split("")},arrows:{thin:"\xB7\u2219".split(""),normal:"\u2190\u2191\u2192\u2193".split(""),core:"\u2196\u2197\u2198\u2199\u2921\u2922".split(""),solid:" \xB7\u2219\u2191\u2197\u2192\u2198\u2193\u2199\u2190\u2196".split("")},braille:{thin:"\u2801\u2802\u2804\u2808".split(""),normal:"\u2803\u2805\u2806\u2809\u280A\u280B\u280C\u280D\u280E\u280F".split(""),core:"\u283F\u28FF".split(""),solid:" \u2801\u2803\u2807\u2827\u2837\u283F\u287F\u28FF".split("")},runes:{thin:".\xB7".split(""),normal:"\u16A0\u16A1\u16A2\u16A3\u16A4\u16A6\u16A8\u16B1\u16B2\u16B3\u16B7\u16B9\u16C3\u16C7\u16C9".split(""),core:"\u16DE\u16DF\u16E1\u16E2\u16E3".split(""),solid:" \xB7\u16A0\u16A3\u16A4\u16A8\u16B1\u16B7\u16DE\u16E2".split("")},math:{thin:"\u2219\u2218".split(""),normal:"\u2211\u220F\u222B\u221A\u221E\u2248\u2260\u2264\u2265\u2282\u2283\u2286\u2287".split(""),core:"\u222E\u222F\u2230\u2202".split(""),solid:" \u2219\u2218\u2211\u222B\u221A\u221E\u2248\u2295\u2297".split("")},binary:{thin:"\xB7.".split(""),normal:"01".split(""),core:"\u2588".split(""),solid:" .:01\u2588\u2588".split("")},hex:{thin:"\xB7\u2219".split(""),normal:"0123456789ABCDEF".split(""),core:"FFAA".split(""),solid:" 0123456789AF".split("")}},Kn=gt.default;function yt(n){return gt[n]??gt.default}function Ht(n){let{camera:e,grid:t,wireframe:o,mode:r}=n,{cols:s,rows:l,cellAspect:i}=t;if(r==="solid"){let d=n.supersample&&n.supersample>1?Math.floor(n.supersample):1;return un(n,s,l,i,d)}let c=yt(n.glyphPalette),u=new Uint8Array(s*l),p=n.useColors?new Array(s*l).fill(null):null;for(let d of o){let m=e.project(d.from,s,l,i),h=e.project(d.to,s,l,i);m[0]!==m[0]||h[0]!==h[0]||bn(u,p,m[0]|0,m[1]|0,h[0]|0,h[1]|0,d.weight??2,d.color??null,s,l)}return vn(u,p,s,l,c)}function un(n,e,t,o,r){let s=e*r,l=t*r,{camera:i,polygons:c,directionalLight:u,ambientLight:p,smoothShading:d,creaseAngle:m,doubleSided:h,castShadowFlags:f,receiveShadowFlags:b}=n,C=n.depthBiases,_=n.depthEpsilon??0,M=r>1?{zoom:i.zoom,eyeDepth:B=>i.eyeDepth(B),project:(B,V,X,Y)=>{let S=i.project(B,V,X,Y);return[V*.5+(S[0]-V*.5)*r,X*.5+(S[1]-X*.5)*r,S[2],S[3]]}}:i,x=yt(n.glyphPalette).solid,y=x.length-1,w=new Array(s*l).fill(" "),P=n.useColors,H=P?new Array(s*l).fill(null):null,v=new Float64Array(s*l).fill(-1/0),A=n.temporalBlend>0&&!!n.temporalHistory,L=A?new Float32Array(s*l*3).fill(NaN):null,a=u.direction,E=Math.hypot(a[0],a[1],a[2])||1,g=a[0]/E,G=a[1]/E,z=a[2]/E,F=u.intensity??1,T=p.intensity??.4,W=ze(u.color??"#ffffff"),R=ze(p.color??"#ffffff"),j=d&&m>0?gn(c,m):null,N=new Map,re=n.textureSamplers??null,k=n.shadow,q=k!=null&&f.length>0?fn(c,f,g,G,z):null,oe=k?.opacity??.25,K=k?.lift??.05,Z=k?.color??"#000000",ie=q?ze(Z):[0,0,0],O=globalThis.__glyphPerfDetail,Ke=O?performance.now():0,ge=[],J=n.shadeCache??null,Q=-1,ve=(B,V,X,Y)=>{if(q===null||!Y)return null;let S=q,I=Oe(B,S.right[0],S.right[1],S.right[2],S.up[0],S.up[1],S.up[2],S.dir[0],S.dir[1],S.dir[2],S.uMin,S.uMax,S.vMin,S.vMax),ee=Oe(V,S.right[0],S.right[1],S.right[2],S.up[0],S.up[1],S.up[2],S.dir[0],S.dir[1],S.dir[2],S.uMin,S.uMax,S.vMin,S.vMax),de=Oe(X,S.right[0],S.right[1],S.right[2],S.up[0],S.up[1],S.up[2],S.dir[0],S.dir[1],S.dir[2],S.uMin,S.uMax,S.vMin,S.vMax);return{map:S,luA:I[0],lvA:I[1],ldA:I[2],luB:ee[0],lvB:ee[1],ldB:ee[2],luC:de[0],lvC:de[1],ldC:de[2],lift:K,opacity:oe,shadowColorRgb:ie,shadowColorHex:Z,litCache:N}};for(let B=0;B<c.length;B++){let V=c[B],X=V.vertices;if(X.length<3)continue;let Y=V.uvs,S=null;if(re!==null&&Y&&Y.length>=X.length){let I=(0,nt.polygonTexture)(V);I&&(S=re.get(I)??null)}for(let I=0;I<X.length;I++)ge[I]=M.project(X[I],s,l,o);for(let I=1;I<X.length-1;I++){Q++;let ee=0,de=I,Ee=I+1,se=X[ee],pe=X[de],we=X[Ee],ae=ge[ee],ye=ge[de],xe=ge[Ee],it=(ae[0]!==ae[0]?1:0)+(ye[0]!==ye[0]?1:0)+(xe[0]!==xe[0]?1:0);if(it===3||it===0&&!h&&(ye[0]-ae[0])*(xe[1]-ae[1])-(ye[1]-ae[1])*(xe[0]-ae[0])>0)continue;let Ge,Le,Te,ke=null;if(J!==null&&J.iA[Q]!==void 0)Ge=J.iA[Q],Le=J.iB[Q],Te=J.iC[Q],ke=J.lit[Q];else{let $=pe[0]-se[0],me=pe[1]-se[1],Ae=pe[2]-se[2],he=we[0]-se[0],Je=we[1]-se[1],Qe=we[2]-se[2],et=me*Qe-Ae*Je,Ye=Ae*he-$*Qe,U=$*Je-me*he,D=Math.hypot(et,Ye,U)||1,te=et/D,fe=Ye/D,le=U/D,ce,_e,st,lt,at,ct,ut,dt,pt;if(j){let De=j[B],Me=De[ee],Fe=De[de],Ve=De[Ee];ce=Me[0],_e=Me[1],st=Me[2],lt=Fe[0],at=Fe[1],ct=Fe[2],ut=Ve[0],dt=Ve[1],pt=Ve[2]}else ce=lt=ut=te,_e=at=dt=fe,st=ct=pt=le;let St=ce*g+_e*G+st*z,xt=lt*g+at*G+ct*z,Mt=ut*g+dt*G+pt*z,Vt=h?Math.abs(St):Math.max(0,-St),Xt=h?Math.abs(xt):Math.max(0,-xt),$t=h?Math.abs(Mt):Math.max(0,-Mt);if(Ge=Math.min(1,T+Vt*F),Le=Math.min(1,T+Xt*F),Te=Math.min(1,T+$t*F),P){let De=(Ge+Le+Te)/3,Me=Math.max(0,De-T),Fe=V.color??"#ffffff",Ve=Me*255|0,Ct=`${Fe}:${Ve}`,tt=N.get(Ct);if(tt===void 0){let mt=ze(Fe),Wt=T*R[0]/255+Me*W[0]/255,jt=T*R[1]/255+Me*W[1]/255,qt=T*R[2]/255+Me*W[2]/255,Ut=Math.min(255,mt[0]*Wt),Kt=Math.min(255,mt[1]*jt),Zt=Math.min(255,mt[2]*qt);tt=`#${ne(Ut)}${ne(Kt)}${ne(Zt)}`,N.set(Ct,tt)}ke=tt}J!==null&&(J.iA[Q]=Ge,J.iB[Q]=Le,J.iC[Q]=Te,J.lit[Q]=ke)}let wt=b[B]??!1,He=1+(C?.[B]??0),At=null;if(S!==null&&Y){let $=Y[ee],me=Y[de],Ae=Y[Ee],he=Math.max(0,(Ge+Le+Te)/3-T);At={sampler:S,ua:$[0],va:$[1],ub:me[0],vb:me[1],uc:Ae[0],vc:Ae[1],tintR:T*R[0]/255+he*W[0]/255,tintG:T*R[1]/255+he*W[1]/255,tintB:T*R[2]/255+he*W[2]/255}}if(it===0)zt(ae[0],ae[1],(ae[3]??ae[2])*He,Ge,ye[0],ye[1],(ye[3]??ye[2])*He,Le,xe[0],xe[1],(xe[3]??xe[2])*He,Te,x,y,ke,w,H,v,s,l,ve(se,pe,we,wt),h,se,pe,we,L,_,At);else{let $=[],me=[],Ae=[se,pe,we],he=[Ge,Le,Te],Je=M.eyeDepth(se),Qe=M.eyeDepth(pe),et=M.eyeDepth(we),Ye=[Je,Qe,et];for(let U=0;U<3;U++){let D=(U+1)%3,te=Ye[U],fe=Ye[D];if(te>0&&($.push(Ae[U]),me.push(he[U])),te>0!=fe>0){let le=te/(te-fe),ce=Ae[U],_e=Ae[D];$.push([ce[0]+le*(_e[0]-ce[0]),ce[1]+le*(_e[1]-ce[1]),ce[2]+le*(_e[2]-ce[2])]),me.push(he[U]+le*(he[D]-he[U]))}}if($.length>=3){let U=$.map(D=>M.project(D,s,l,o));for(let D=1;D<$.length-1;D++){let te=U[0],fe=U[D],le=U[D+1],ce=(fe[0]-te[0])*(le[1]-te[1])-(fe[1]-te[1])*(le[0]-te[0]);!h&&ce>0||zt(te[0],te[1],(te[3]??te[2])*He,me[0],fe[0],fe[1],(fe[3]??fe[2])*He,me[D],le[0],le[1],(le[3]??le[2])*He,me[D+1],x,y,ke,w,H,v,s,l,ve($[0],$[D],$[D+1],wt),h,$[0],$[D],$[D+1],L,_,null)}}}}}O&&(O.loop??(O.loop=[])).push(performance.now()-Ke);let Et=O?performance.now():0,Pe=w,Se=H,Ze=L;if(r>1){let B=pn(w,H,v,L,e,t,r,x);Pe=B.glyphBuf,Se=B.colorBuf,Ze=B.worldPos}A&&dn(Pe,Se,Ze,e,t,o,x,n.temporalBlend,n.temporalHistory,i);let ot=yn(Pe,Se,e,t);return O&&(O.string??(O.string=[])).push(performance.now()-Et),ot}function dn(n,e,t,o,r,s,l,i,c,u){let p=o*r,d=l.length-1,m=new Map;for(let x=0;x<l.length;x++)m.set(l[x],x);let h=c.cam;(c.cols!==o||c.rows!==r||c.idx.length!==p)&&(c.cols=o,c.rows=r,c.idx=new Float32Array(p),c.r=new Float32Array(p),c.g=new Float32Array(p),c.b=new Float32Array(p),h=null);let f=null;if(h){let x=Ie({rotX:h.rotX,rotY:h.rotY,distance:h.distance,perspective:h.perspective,zoom:h.zoom,stretch:h.stretch});x.target=h.target,f=y=>x.project(y,o,r,s)}let b=new Float32Array(p),C=new Float32Array(p),_=new Float32Array(p),M=new Float32Array(p);for(let x=0;x<r;x++)for(let y=0;y<o;y++){let w=x*o+y,P=m.get(n[w])??0,H=0,v=0,A=0,L=e?e[w]:null;if(L){let k=ze(L);H=k[0],v=k[1],A=k[2]}let a=0,E=0,g=0,G=0,z=0,F=t[w*3];if(f&&F===F){let k=f([F,t[w*3+1],t[w*3+2]]),q=Math.round(k[0]),oe=Math.round(k[1]);if(k[0]===k[0]&&q>=0&&q<o&&oe>=0&&oe<r){let K=oe*o+q;E=c.idx[K],g=c.r[K],G=c.g[K],z=c.b[K],a=i}}let T=1-a,W=T*P+a*E,R=T*H+a*g,j=T*v+a*G,N=T*A+a*z;b[w]=W,C[w]=R,_[w]=j,M[w]=N;let re=Math.round(W);re<0?re=0:re>d&&(re=d),n[w]=l[re],e&&(e[w]=re===0?null:`#${ne(R)}${ne(j)}${ne(N)}`)}c.idx=b,c.r=C,c.g=_,c.b=M,c.cam={rotX:u.rotX,rotY:u.rotY,target:[u.target[0],u.target[1],u.target[2]],zoom:u.zoom,perspective:u.perspective,distance:u.distance,stretch:u.stretch}}function pn(n,e,t,o,r,s,l,i){let c=new Map;for(let b=0;b<i.length;b++)c.set(i[b],b);let u=i.length-1,p=r*l,d=new Array(r*s).fill(" "),m=e?new Array(r*s).fill(null):null,h=o?new Float32Array(r*s*3).fill(NaN):null,f=1/(l*l);for(let b=0;b<s;b++)for(let C=0;C<r;C++){let _=0,M=0,x=0,y=0,w=0,P=0,H=0,v=0;for(let a=0;a<l;a++){let E=(b*l+a)*p+C*l;for(let g=0;g<l;g++){let G=E+g;if(t[G]!==-1/0){if(_+=c.get(n[G])??0,M++,m){let z=e[G];if(z){let F=ze(z);x+=F[0],y+=F[1],w+=F[2]}}h&&(P+=o[G*3],H+=o[G*3+1],v+=o[G*3+2])}}}let A=b*r+C;if(M===0)continue;let L=Math.round(_*f);L<0?L=0:L>u&&(L=u),d[A]=i[L],m&&(m[A]=`#${ne(x/M)}${ne(y/M)}${ne(w/M)}`),h&&(h[A*3]=P/M,h[A*3+1]=H/M,h[A*3+2]=v/M)}return{glyphBuf:d,colorBuf:m,worldPos:h}}var mn=new Float64Array([(0+.5)/16,(8+.5)/16,(2+.5)/16,(10+.5)/16,(12+.5)/16,(4+.5)/16,(14+.5)/16,(6+.5)/16,(3+.5)/16,(11+.5)/16,(1+.5)/16,(9+.5)/16,(15+.5)/16,(7+.5)/16,(13+.5)/16,(5+.5)/16]),be=256;function Oe(n,e,t,o,r,s,l,i,c,u,p,d,m,h){let f=e*n[0]+t*n[1]+o*n[2],b=r*n[0]+s*n[1]+l*n[2],C=-(i*n[0]+c*n[1]+u*n[2]),_=(f-p)/(d-p)*(be-1),M=(b-m)/(h-m)*(be-1);return[_,M,C]}function hn(n,e,t,o){let r=e[0],s=e[1],l=e[2],i=t[0],c=t[1],u=t[2],p=o[0],d=o[1],m=o[2],h=(i-r)*(d-s)-(c-s)*(p-r);if(h===0)return;let f=1/h,b=r<i?r:i;p<b&&(b=p);let C=r>i?r:i;p>C&&(C=p);let _=s<c?s:c;d<_&&(_=d);let M=s>c?s:c;d>M&&(M=d);let x=Math.max(0,Math.ceil(b)),y=Math.min(be-1,Math.floor(C)),w=Math.max(0,Math.ceil(_)),P=Math.min(be-1,Math.floor(M));if(x>y||w>P)return;let H=h>0;for(let v=w;v<=P;v++)for(let A=x;A<=y;A++){let L=A,a=v,E=(i-L)*(d-a)-(c-a)*(p-L),g=(p-L)*(s-a)-(d-a)*(r-L),G=(r-L)*(c-a)-(s-a)*(i-L);if(H?E<0||g<0||G<0:E>0||g>0||G>0)continue;let z=(E*l+g*u+G*m)*f,F=v*be+A;z>n[F]&&(n[F]=z)}}function fn(n,e,t,o,r){let s,l,i;Math.abs(t)<.9?(s=0,l=r,i=-o):(s=-r,l=0,i=t);let c=Math.hypot(s,l,i);s/=c,l/=c,i/=c;let u=l*r-i*o,p=i*t-s*r,d=s*o-l*t,m=1/0,h=-1/0,f=1/0,b=-1/0,C=!1;for(let y=0;y<n.length;y++)if(e[y]){C=!0;for(let w of n[y].vertices){let P=s*w[0]+l*w[1]+i*w[2],H=u*w[0]+p*w[1]+d*w[2];P<m&&(m=P),P>h&&(h=P),H<f&&(f=H),H>b&&(b=H)}}if(!C)return null;let _=(h-m)*.05+.01,M=(b-f)*.05+.01;m-=_,h+=_,f-=M,b+=M;let x=new Float64Array(be*be).fill(-1/0);for(let y=0;y<n.length;y++){if(!e[y])continue;let w=n[y].vertices;if(!(w.length<3))for(let P=1;P<w.length-1;P++){let H=w[0],v=w[P],A=w[P+1],L=Oe(H,s,l,i,u,p,d,t,o,r,m,h,f,b),a=Oe(v,s,l,i,u,p,d,t,o,r,m,h,f,b),E=Oe(A,s,l,i,u,p,d,t,o,r,m,h,f,b);hn(x,L,a,E)}}return{buf:x,right:[s,l,i],up:[u,p,d],dir:[t,o,r],uMin:m,uMax:h,vMin:f,vMax:b}}function zt(n,e,t,o,r,s,l,i,c,u,p,d,m,h,f,b,C,_,M,x,y,w,P,H,v,A,L,a){let E=(r-n)*(u-e)-(s-e)*(c-n);if(E===0||!w&&E>0)return;let g=1/E,G=E>0,z=n<r?n:r;c<z&&(z=c);let F=n>r?n:r;c>F&&(F=c);let T=e<s?e:s;u<T&&(T=u);let W=e>s?e:s;u>W&&(W=u);let R=Math.max(0,Math.ceil(z)),j=Math.min(M-1,Math.floor(F)),N=Math.max(0,Math.ceil(T)),re=Math.min(x-1,Math.floor(W));if(!(R>j||N>re))for(let k=N;k<=re;k++){let q=k;for(let oe=R;oe<=j;oe++){let K=oe,Z=(r-K)*(u-q)-(s-q)*(c-K),ie=(c-K)*(e-q)-(u-q)*(n-K),O=(n-K)*(s-q)-(e-q)*(r-K);if(G?Z<0||ie<0||O<0:Z>0||ie>0||O>0)continue;let Ke=(Z*t+ie*l+O*p)*g,ge=k*M+oe,J=_[ge];if(Ke>(J>0?J*(1-L):J)){if(_[ge]=Ke,A!==null){let V=ge*3;A[V]=(Z*P[0]+ie*H[0]+O*v[0])*g,A[V+1]=(Z*P[1]+ie*H[1]+O*v[1])*g,A[V+2]=(Z*P[2]+ie*H[2]+O*v[2])*g}let Q=(Z*o+ie*i+O*d)*g,ve=f;if(a!==null){let V=(Z*a.ua+ie*a.ub+O*a.uc)*g,X=(Z*a.va+ie*a.vb+O*a.vc)*g,Y=(0,nt.sampleTexel)(a.sampler,V,X);if(Y!==null&&Y.a>8){let S=Y.r*a.tintR|0;S>255&&(S=255);let I=Y.g*a.tintG|0;I>255&&(I=255);let ee=Y.b*a.tintB|0;ee>255&&(ee=255),ve=`#${ne(S)}${ne(I)}${ne(ee)}`,Q*=(.299*Y.r+.587*Y.g+.114*Y.b)/255}}let Pe=(Q<0?0:Q>1?1:Q)*h,Se=Pe|0,Ze=Pe-Se,ot=mn[(k&3)*4+(oe&3)],B=Ze>ot&&Se<h?Se+1:Se;if(B>h&&(B=h),y!==null){let V=(Z*y.luA+ie*y.luB+O*y.luC)*g,X=(Z*y.lvA+ie*y.lvB+O*y.lvC)*g,Y=(Z*y.ldA+ie*y.ldB+O*y.ldC)*g,S=V|0,I=X|0;if(S>=0&&S<be&&I>=0&&I<be){let ee=y.map.buf[I*be+S];if(ee>-1/0&&Y+y.lift<ee&&(B=Math.max(0,B-Math.round(y.opacity*h)),ve!==null)){let de=`shadow:${ve}:${B}`,Ee=y.litCache.get(de);if(Ee===void 0){let se=ze(ve),pe=y.shadowColorRgb,we=Math.round(se[0]*(1-y.opacity)+pe[0]*y.opacity),ae=Math.round(se[1]*(1-y.opacity)+pe[1]*y.opacity),ye=Math.round(se[2]*(1-y.opacity)+pe[2]*y.opacity);Ee=`#${ne(we)}${ne(ae)}${ne(ye)}`,y.litCache.set(de,Ee)}ve=Ee}}}b[ge]=m[B],C&&(C[ge]=ve)}}}}function gn(n,e){let t=n.length,o=new Array(t);for(let i=0;i<t;i++){let c=n[i].vertices;if(c.length<3){o[i]=[0,0,0];continue}let u=c[0],p=c[1],d=c[2],m=p[0]-u[0],h=p[1]-u[1],f=p[2]-u[2],b=d[0]-u[0],C=d[1]-u[1],_=d[2]-u[2],M=h*_-f*C,x=f*b-m*_,y=m*C-h*b,w=Math.hypot(M,x,y)||1;o[i]=[M/w,x/w,y/w]}let r=new Map;for(let i=0;i<t;i++){let c=n[i].vertices;for(let u=0;u<c.length;u++){let p=c[u],d=`${p[0]},${p[1]},${p[2]}`,m=r.get(d);m||(m=[],r.set(d,m)),(m.length===0||m[m.length-1]!==i)&&m.push(i)}}let s=Math.cos(e*Math.PI/180),l=new Array(t);for(let i=0;i<t;i++){let c=n[i].vertices,u=o[i],p=new Array(c.length);for(let d=0;d<c.length;d++){let m=c[d],h=r.get(`${m[0]},${m[1]},${m[2]}`),f=0,b=0,C=0;for(let M=0;M<h.length;M++){let x=h[M],y=o[x];u[0]*y[0]+u[1]*y[1]+u[2]*y[2]>=s&&(f+=y[0],b+=y[1],C+=y[2])}let _=Math.hypot(f,b,C)||1;p[d]=[f/_,b/_,C/_]}l[i]=p}return l}function yn(n,e,t,o){let r=[],s=null,l="",i=()=>{l&&(s!==null?r.push(`<span style="color:${s}">${l}</span>`):r.push(l),l="")};for(let c=0;c<o;c++){for(let u=0;u<t;u++){let p=c*t+u,d=n[p],m=e&&d!==" "?e[p]??null:null;m!==s&&(i(),s=m),l+=d}i(),s=null,c<o-1&&r.push(`
|
|
2
|
+
`)}return r.join("")}function bn(n,e,t,o,r,s,l,i,c,u){let p=Math.abs(r-t),d=-Math.abs(s-o),m=t<r?1:-1,h=o<s?1:-1,f=p+d;for(;;){if(t>=0&&t<c&&o>=0&&o<u){let C=o*c+t;n[C]<l&&(n[C]=l,e&&(e[C]=i))}if(t===r&&o===s)break;let b=2*f;b>=d&&(f+=d,t+=m),b<=p&&(f+=p,o+=h)}}function vn(n,e,t,o,r){let s=[],l=null,i="",c=()=>{i&&(l!==null?s.push(`<span style="color:${l}">${i}</span>`):s.push(i),i="")};for(let u=0;u<o;u++){for(let p=0;p<t;p++){let d=u*t+p,m=n[d],h,f;m===0?(h=" ",f=null):(h=m===1?r.thin[Math.random()*r.thin.length|0]:m===2?r.normal[Math.random()*r.normal.length|0]:r.core[Math.random()*r.core.length|0],f=e?e[d]??null:null),f!==l&&(c(),l=f),i+=h}c(),l=null,u<o-1&&s.push(`
|
|
3
|
+
`)}return s.join("")}var Pt=new Map;function ze(n){let e=Pt.get(n);if(e!==void 0)return e;let t=En(n);return Pt.set(n,t),t}function En(n){let e=n.startsWith("#")?n.slice(1):n;if(e.length===3){let t=parseInt(e[0]+e[0],16),o=parseInt(e[1]+e[1],16),r=parseInt(e[2]+e[2],16);return[t||0,o||0,r||0]}if(e.length===6){let t=parseInt(e.slice(0,2),16),o=parseInt(e.slice(2,4),16),r=parseInt(e.slice(4,6),16);return[t||0,o||0,r||0]}return[255,255,255]}function ne(n){let e=Math.max(0,Math.min(255,n|0)).toString(16);return e.length===1?"0"+e:e}var Ft="glyph-styles";function It(n){let e=n??(typeof document<"u"?document:void 0);if(!e||e.getElementById(Ft))return;let t=e.createElement("style");t.id=Ft,t.textContent=wn,e.head.appendChild(t)}var wn=`
|
|
4
4
|
/* \u2500\u2500 React / Vue host wrapper \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 */
|
|
5
5
|
|
|
6
6
|
.glyph-host {
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
the content from the 3D vertex being labelled. */
|
|
60
60
|
transform: translate(-50%, -50%);
|
|
61
61
|
}
|
|
62
|
-
`;function
|
|
63
|
-
`),m.style.cssText="position:absolute;visibility:hidden;font-family:inherit;font-size:inherit;line-height:inherit;white-space:pre;padding:0;margin:0",r.appendChild(m);let b=m.getBoundingClientRect();return m.remove(),{w:b.width||8,h:b.height?b.height/20:16}}function y(){let p=n.clientWidth,m=n.clientHeight;if(!p||!m)return;let b=z(),A=Math.max(20,Math.floor(p/b.w)),h=Math.max(8,Math.floor(m/b.h)),C=b.h/b.w,S=!1;e.cols!==A&&(e.cols=A,S=!0),e.rows!==h&&(e.rows=h,S=!0),Math.abs(e.cellAspect-C)>.01&&(e.cellAspect=C,S=!0),S&&a()}let E=null;e.autoSize&&typeof ResizeObserver<"u"&&(E=new ResizeObserver(()=>y()),E.observe(n),y());function L(){E&&(E.disconnect(),E=null),l.clear(),n.contains(o)&&n.removeChild(o)}return a(),{get host(){return n},get output(){return r},get camera(){return e.camera},add:g,addHotspot:w,rerender:x,setOptions:_,getOptions:G,fit:y,destroy:L}}var Kt=typeof HTMLElement<"u"?HTMLElement:class{},Zt=["mode","glyph-palette","use-colors","cols","rows","cell-aspect","directional-direction","directional-intensity","ambient-intensity","auto-size","shadow","shadow-color","shadow-opacity","shadow-lift","shadow-max-extend"];function te(n){if(n==null)return;let t=parseFloat(n);return Number.isFinite(t)?t:void 0}function Jt(n){if(n==="wireframe"||n==="solid"||n==="voxel")return n}function Qt(n){if(n!==null){if(n==="false")return!1;if(n==="true"||n==="")return!0}}var Ce=class extends Kt{constructor(){super(...arguments);this._scene=null}static get observedAttributes(){return[...Zt]}getScene(){return this._scene}_readOptions(){let e={},o=Jt(this.getAttribute("mode"));o!==void 0&&(e.mode=o);let r=this.getAttribute("glyph-palette");r&&(e.glyphPalette=r);let s=Qt(this.getAttribute("use-colors"));s!==void 0&&(e.useColors=s);let l=te(this.getAttribute("cols"));l!==void 0&&(e.cols=l);let i=te(this.getAttribute("rows"));i!==void 0&&(e.rows=i);let c=te(this.getAttribute("cell-aspect"));c!==void 0&&(e.cellAspect=c);let u=te(this.getAttribute("directional-intensity"));u!==void 0&&(e.directionalLight={direction:[-.5,-.7,-.5],intensity:u});let d=te(this.getAttribute("ambient-intensity"));if(d!==void 0&&(e.ambientLight={intensity:d}),this.hasAttribute("auto-size")&&(e.autoSize=!0),this.hasAttribute("shadow")){let a={color:"#000000",opacity:.25,lift:.05,maxExtend:2e3},f=this.getAttribute("shadow-color");f&&(a.color=f);let v=te(this.getAttribute("shadow-opacity"));v!==void 0&&(a.opacity=v);let g=te(this.getAttribute("shadow-lift"));g!==void 0&&(a.lift=g);let w=te(this.getAttribute("shadow-max-extend"));w!==void 0&&(a.maxExtend=w),e.shadow=a}return e}_findCameraAncestor(){let e=this.parentElement;for(;e;){let o=e.tagName.toLowerCase();if(o==="glyph-perspective-camera"||o==="glyph-orthographic-camera"||o==="glyph-camera")return e;e=e.parentElement}return null}_initScene(e){let o=typeof e.getCamera=="function"?e.getCamera():void 0,r=this._readOptions();o&&(r.camera=o),this._scene=dt(this,r),this.dispatchEvent(new CustomEvent("glyphcss:scene-ready",{bubbles:!1}))}connectedCallback(){if(this._scene)return;let e=this._findCameraAncestor();if(!e)throw new Error("glyphcss: <glyph-scene> must be placed inside a <glyph-camera>, <glyph-perspective-camera>, or <glyph-orthographic-camera>.");if((typeof e.getCamera=="function"?e.getCamera():null)!==null)this._initScene(e);else{let r=()=>{e.removeEventListener("glyph:camera-ready",r),this._scene||this._initScene(e)};e.addEventListener("glyph:camera-ready",r)}}rerender(){this._scene?.rerender()}disconnectedCallback(){this._scene&&(this._scene.destroy(),this._scene=null)}attributeChangedCallback(e,o,r){o!==r&&this._scene&&this._scene.setOptions(this._readOptions())}};var me=require("@glyphcss/core"),en=typeof HTMLElement<"u"?HTMLElement:class{},tn=["src","geometry","size","color","position","scale","rotation","normalize","cast-shadow","receive-shadow"];function nn(n){let t=(0,me.computeSceneBbox)(n),e=(t.min[0]+t.max[0])/2,o=(t.min[1]+t.max[1])/2,r=(t.min[2]+t.max[2])/2,l=2/(Math.max(t.max[0]-t.min[0],t.max[1]-t.min[1],t.max[2]-t.min[2])||1);return n.map(i=>({...i,vertices:i.vertices.map(c=>[(c[0]-e)*l,(c[1]-o)*l,(c[2]-r)*l])}))}function qe(n){if(!n)return;let t=n.split(",").map(e=>parseFloat(e.trim()));if(!(t.length!==3||t.some(e=>!Number.isFinite(e))))return[t[0],t[1],t[2]]}function rn(n){if(n){if(!n.includes(",")){let t=parseFloat(n);return Number.isFinite(t)?t:void 0}return qe(n)}}function on(n){return n.closest("glyph-scene")??null}var Ae=class extends en{constructor(){super(...arguments);this._handle=null;this._loadToken=0}static get observedAttributes(){return[...tn]}getMeshHandle(){return this._handle}connectedCallback(){this._maybeLoad()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(e,o,r){if(o!==r){if(e==="src"||e==="geometry"||e==="size"||e==="color"){this._tearDown(),this._maybeLoad();return}this._handle&&this._handle.setTransform(this._readTransform())}}_readTransform(){return{position:qe(this.getAttribute("position")),scale:rn(this.getAttribute("scale")),rotation:qe(this.getAttribute("rotation")),castShadow:this.hasAttribute("cast-shadow"),receiveShadow:this.hasAttribute("receive-shadow")}}_tearDown(){if(this._loadToken+=1,this._handle){try{this._handle.dispose()}catch{}this._handle=null}}async _maybeLoad(){let e=this.getAttribute("src"),o=this.getAttribute("geometry"),r=on(this);if(r){if(!r.getScene()){let s=()=>{r.removeEventListener("glyphcss:scene-ready",s),this._maybeLoad()};r.addEventListener("glyphcss:scene-ready",s);return}if(e){let s=++this._loadToken,l;try{l=await(0,me.loadMesh)(e)}catch(d){this.dispatchEvent(new CustomEvent("glyphcss:error",{detail:d,bubbles:!0}));return}if(s!==this._loadToken){try{l.dispose()}catch{}return}let i=r.getScene();if(!i){try{l.dispose()}catch{}return}let u=this.hasAttribute("normalize")?nn(l.polygons):l.polygons;this._handle=i.add(u,this._readTransform()),this.dispatchEvent(new CustomEvent("glyphcss:loaded",{detail:{polygons:u},bubbles:!0}));return}if(o){let s=r.getScene();if(!s)return;let l=this.getAttribute("size"),i=l!==null?parseFloat(l):1,c=this.getAttribute("color")??void 0,u;try{u=(0,me.resolveGeometry)(o,{size:Number.isFinite(i)?i:1,color:c})}catch(d){this.dispatchEvent(new CustomEvent("glyphcss:error",{detail:d,bubbles:!0}));return}this._handle=s.add(u,this._readTransform()),this.dispatchEvent(new CustomEvent("glyphcss:loaded",{detail:{polygons:u},bubbles:!0}))}}}};var sn=typeof HTMLElement<"u"?HTMLElement:class{};function ln(n){if(!n)return;let t=n.split(",").map(e=>parseFloat(e.trim()));if(!(t.length!==3||t.some(e=>!Number.isFinite(e))))return[t[0],t[1],t[2]]}function an(n){if(!n)return;let t=n.split(",").map(e=>parseFloat(e.trim()));if(!(t.length!==2||t.some(e=>!Number.isFinite(e))))return[t[0],t[1]]}function cn(n){return n.closest("glyph-scene")??null}var Me=class extends sn{constructor(){super(...arguments);this._handle=null}static get observedAttributes(){return["at","size","hotspot-id"]}connectedCallback(){this._register()}disconnectedCallback(){this._handle&&this._unregister()}attributeChangedCallback(e,o,r){o!==r&&(this._handle&&this._unregister(),this._register())}_unregister(){if(!this._handle)return;let e=this._handle.el;for(;e.firstChild;)this.appendChild(e.firstChild);this._handle.remove(),this._handle=null}_register(){let e=ln(this.getAttribute("at"));if(!e)return;let o=cn(this);if(!o)return;if(!o.getScene()){let c=()=>{o.removeEventListener("glyphcss:scene-ready",c),this._register()};o.addEventListener("glyphcss:scene-ready",c);return}let r=o.getScene();if(!r)return;let s=this.getAttribute("hotspot-id")??this.getAttribute("id")??String(Math.random()),l=an(this.getAttribute("size"));this._handle=r.addHotspot({id:s,at:e,size:l},()=>this.dispatchEvent(new CustomEvent("glyphcss:hotspot-click",{detail:{id:s},bubbles:!0})));let i=this._handle.el;for(;this.firstChild;)i.appendChild(this.firstChild)}};var un=typeof HTMLElement<"u"?HTMLElement:class{};function j(n){if(n==null)return;let t=parseFloat(n);return Number.isFinite(t)?t:void 0}var xe=class extends un{constructor(){super(...arguments);this._camera=null}static get observedAttributes(){return["rot-x","rot-y","distance","zoom","stretch"]}getCamera(){return this._camera}connectedCallback(){this._camera=Te({rotX:j(this.getAttribute("rot-x")),rotY:j(this.getAttribute("rot-y")),distance:j(this.getAttribute("distance")),zoom:j(this.getAttribute("zoom")),stretch:j(this.getAttribute("stretch"))}),this.dispatchEvent(new CustomEvent("glyph:camera-ready",{bubbles:!1}))}disconnectedCallback(){this._camera=null}attributeChangedCallback(e,o,r){if(o===r)return;let s=this._camera;if(!s)return;let l=j(this.getAttribute("rot-x")),i=j(this.getAttribute("rot-y")),c=j(this.getAttribute("distance")),u=j(this.getAttribute("zoom")),d=j(this.getAttribute("stretch")),a=!1;l!==void 0&&s.rotX!==l&&(s.rotX=l,a=!0),i!==void 0&&s.rotY!==i&&(s.rotY=i,a=!0),c!==void 0&&s.distance!==c&&(s.distance=c,a=!0),u!==void 0&&s.zoom!==u&&(s.zoom=u,a=!0),d!==void 0&&s.stretch!==d&&(s.stretch=d,a=!0),a&&this.querySelector("glyph-scene")?.rerender?.()}};var dn=typeof HTMLElement<"u"?HTMLElement:class{};function pe(n){if(n==null)return;let t=parseFloat(n);return Number.isFinite(t)?t:void 0}var fe=class extends dn{constructor(){super(...arguments);this._camera=null}static get observedAttributes(){return["rot-x","rot-y","zoom"]}getCamera(){return this._camera}connectedCallback(){this._camera=ot({rotX:pe(this.getAttribute("rot-x")),rotY:pe(this.getAttribute("rot-y")),zoom:pe(this.getAttribute("zoom"))}),this.dispatchEvent(new CustomEvent("glyph:camera-ready",{bubbles:!1}))}disconnectedCallback(){this._camera=null}attributeChangedCallback(e,o,r){if(o===r)return;let s=this._camera;if(!s)return;let l=pe(this.getAttribute("rot-x")),i=pe(this.getAttribute("rot-y")),c=pe(this.getAttribute("zoom")),u=!1;l!==void 0&&s.rotX!==l&&(s.rotX=l,u=!0),i!==void 0&&s.rotY!==i&&(s.rotY=i,u=!0),c!==void 0&&s.zoom!==c&&(s.zoom=c,u=!0),u&&this.querySelector("glyph-scene")?.rerender?.()}};function mt(n,t={}){let e=n.host,o=t.drag??!0,r=t.wheel??!0,s=ht(t.invert),l=t.clampPitch??!0,i=t.animate??!1,c=!1,u=!1,d=null,a=null,f=null,v={x:0,y:0},g=n.camera;function w(m){if(!(!o||c)&&f===null&&m.isPrimary!==!1){m.preventDefault(),f=m.pointerId,v={x:m.clientX,y:m.clientY},e.style.cursor="grabbing";try{m.target.setPointerCapture(m.pointerId)}catch{}i&&i.pauseOnInteraction!==!1&&(u=!0)}}function x(m){if(f===null||m.pointerId!==f||!o||c)return;m.preventDefault();let b=m.clientX-v.x,A=m.clientY-v.y;v={x:m.clientX,y:m.clientY};let h=s,C=1/4;g.rotY=g.rotY-b*C*h;let S=g.rotX-A*C*h;g.rotX=l?Math.max(-90,Math.min(90,S)):S,n.rerender()}function _(m){if(f===m.pointerId){f=null,e.style.cursor=o&&!c?"grab":"";try{m.target.releasePointerCapture(m.pointerId)}catch{}i&&(u=!1)}}function G(m){if(!r||c)return;m.preventDefault();let b=m.deltaY*.001;g.zoom=Math.max(.1,Math.min(500,g.zoom*(1-b))),n.rerender()}function z(m){if(!(c||!i)){if(!u){let b=a!==null?Math.min(m-a,50):16.67,A=typeof i=="object"&&i.speed?i.speed:.3,h=typeof i=="object"&&i.axis?i.axis:"y",C=A*(b/16.67);h==="y"?g.rotY=g.rotY+C:g.rotX=g.rotX+C,n.rerender()}a=m,d=requestAnimationFrame(z)}}function y(){d===null&&typeof requestAnimationFrame<"u"&&i&&(d=requestAnimationFrame(z))}function E(){d!==null&&(typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(d),d=null),a=null}function L(){e.addEventListener("pointerdown",w),e.addEventListener("pointermove",x),e.addEventListener("pointerup",_),e.addEventListener("pointercancel",_),e.addEventListener("wheel",G,{passive:!1}),e.style.cursor=o?"grab":"",e.style.touchAction="none",e.style.userSelect="none"}function p(){e.removeEventListener("pointerdown",w),e.removeEventListener("pointermove",x),e.removeEventListener("pointerup",_),e.removeEventListener("pointercancel",_),e.removeEventListener("wheel",G),e.style.cursor="",e.style.touchAction="",e.style.userSelect=""}return L(),y(),{update(m){let b=!!i;o=m.drag??o,r=m.wheel??r,s=ht(m.invert),m.clampPitch!==void 0&&(l=m.clampPitch),i=m.animate??i,!c&&f===null&&(e.style.cursor=o?"grab":"");let A=!!i;b&&!A?E():!b&&A&&y()},pause(){c||(c=!0,p(),E(),f=null,u=!1)},resume(){c&&(c=!1,L(),y())},destroy(){c||p(),E(),c=!0}}}function ht(n){return n===void 0||n===!1?1:n===!0?-1:n}var hn=typeof HTMLElement<"u"?HTMLElement:class{};function mn(n){if(n==null)return;let t=parseFloat(n);return Number.isFinite(t)?t:void 0}function ze(n){if(n!==null){if(n==="false")return!1;if(n==="true"||n==="")return!0}}function pn(n){return n.closest("glyph-scene")??null}var Se=class extends hn{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return["drag","wheel","invert","clamp-pitch","animate-speed","animate-axis"]}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(e,o,r){o!==r&&this._controls?.update(this._readOptions())}_readOptions(){let e=ze(this.getAttribute("drag")),o=ze(this.getAttribute("wheel")),r=ze(this.getAttribute("invert")),s=ze(this.getAttribute("clamp-pitch")),l=mn(this.getAttribute("animate-speed")),i=this.getAttribute("animate-axis")==="x"?"x":"y";return{...e!==void 0?{drag:e}:{},...o!==void 0?{wheel:o}:{},...r!==void 0?{invert:r}:{},...s!==void 0?{clampPitch:s}:{},...l!==void 0?{animate:{speed:l,axis:i}}:{}}}_attach(){if(this._controls)return;let e=pn(this);if(!e)return;let o=e.getScene();if(!o){let r=()=>{e.removeEventListener("glyphcss:scene-ready",r),this._attach()};e.addEventListener("glyphcss:scene-ready",r);return}this._controls=mt(o,this._readOptions())}};function ft(n,t={}){let e=n.host,o=t.drag??!0,r=t.wheel??!0,s=pt(t.invert),l=t.animate??!1,i=!1,c=!1,u=null,d=null,a=null,f={x:0,y:0},v=!1,g=n.camera,w=1/4,x=.02;function _(h){if(!(!o||i)&&a===null&&h.isPrimary!==!1){h.preventDefault(),a=h.pointerId,f={x:h.clientX,y:h.clientY},v=h.button===2,e.style.cursor="grabbing";try{h.target.setPointerCapture(h.pointerId)}catch{}l&&l.pauseOnInteraction!==!1&&(c=!0)}}function G(h){if(a===null||h.pointerId!==a||!o||i)return;h.preventDefault();let C=h.clientX-f.x,S=h.clientY-f.y;f={x:h.clientX,y:h.clientY};let H=s;if(v||h.shiftKey)g.rotY=g.rotY-C*w*H,g.rotX=Math.max(-90,Math.min(90,g.rotX+S*w*H));else{let T=g.target;g.target=[T[0]-C*x/g.zoom,T[1]-S*x/g.zoom,T[2]]}n.rerender()}function z(h){if(a===h.pointerId){a=null,v=!1,e.style.cursor=o&&!i?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}l&&(c=!1)}}function y(h){h.preventDefault()}function E(h){if(!r||i)return;h.preventDefault();let C=h.deltaY*.001;g.zoom=Math.max(.1,Math.min(500,g.zoom*(1-C))),n.rerender()}function L(h){if(!(i||!l)){if(!c){let C=d!==null?Math.min(h-d,50):16.67,S=typeof l=="object"&&l.speed?l.speed:.3,H=typeof l=="object"&&l.axis?l.axis:"y",T=S*(C/16.67);H==="y"?g.rotY=g.rotY+T:g.rotX=g.rotX+T,n.rerender()}d=h,u=requestAnimationFrame(L)}}function p(){u===null&&typeof requestAnimationFrame<"u"&&l&&(u=requestAnimationFrame(L))}function m(){u!==null&&(typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(u),u=null),d=null}function b(){e.addEventListener("pointerdown",_),e.addEventListener("pointermove",G),e.addEventListener("pointerup",z),e.addEventListener("pointercancel",z),e.addEventListener("contextmenu",y),e.addEventListener("wheel",E,{passive:!1}),e.style.cursor=o?"grab":"",e.style.touchAction="none",e.style.userSelect="none"}function A(){e.removeEventListener("pointerdown",_),e.removeEventListener("pointermove",G),e.removeEventListener("pointerup",z),e.removeEventListener("pointercancel",z),e.removeEventListener("contextmenu",y),e.removeEventListener("wheel",E),e.style.cursor="",e.style.touchAction="",e.style.userSelect=""}return b(),p(),{update(h){let C=!!l;o=h.drag??o,r=h.wheel??r,s=pt(h.invert),l=h.animate??l,!i&&a===null&&(e.style.cursor=o?"grab":"");let S=!!l;C&&!S?m():!C&&S&&p()},pause(){i||(i=!0,A(),m(),a=null,c=!1)},resume(){i&&(i=!1,b(),p())},destroy(){i||A(),m(),i=!0}}}function pt(n){return n===void 0||n===!1?1:n===!0?-1:n}var fn=typeof HTMLElement<"u"?HTMLElement:class{};function Ue(n){if(n!==null){if(n==="false")return!1;if(n==="true"||n==="")return!0}}function gn(n){return n.closest("glyph-scene")??null}var Ge=class extends fn{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return["drag","wheel","invert"]}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(e,o,r){o!==r&&this._controls?.update(this._readOptions())}_readOptions(){let e=Ue(this.getAttribute("drag")),o=Ue(this.getAttribute("wheel")),r=Ue(this.getAttribute("invert"));return{...e!==void 0?{drag:e}:{},...o!==void 0?{wheel:o}:{},...r!==void 0?{invert:r}:{}}}_attach(){if(this._controls)return;let e=gn(this);if(!e)return;let o=e.getScene();if(!o){let r=()=>{e.removeEventListener("glyphcss:scene-ready",r),this._attach()};e.addEventListener("glyphcss:scene-ready",r);return}this._controls=ft(o,this._readOptions())}};if(typeof customElements<"u"){if(customElements.get("glyph-scene")||customElements.define("glyph-scene",Ce),customElements.get("glyph-mesh")||customElements.define("glyph-mesh",Ae),customElements.get("glyph-hotspot")||customElements.define("glyph-hotspot",Me),customElements.get("glyph-perspective-camera")||customElements.define("glyph-perspective-camera",xe),customElements.get("glyph-orthographic-camera")||customElements.define("glyph-orthographic-camera",fe),!customElements.get("glyph-camera")){class n extends fe{}customElements.define("glyph-camera",n)}customElements.get("glyph-orbit-controls")||customElements.define("glyph-orbit-controls",Se),customElements.get("glyph-map-controls")||customElements.define("glyph-map-controls",Ge)}0&&(module.exports={GlyphHotspotElement,GlyphMapControlsElement,GlyphMeshElement,GlyphOrbitControlsElement,GlyphOrthographicCameraElement,GlyphPerspectiveCameraElement,GlyphSceneElement});
|
|
62
|
+
`;function Ot(n,e,t,o,r){return n.map(s=>{let[l,i,c]=e.project(s.at,t,o,r),u=c>-3&&l>=0&&l<t&&i>=0&&i<o;return{id:s.id,col:l,row:i,depth:c,visible:u}})}var An=1;function Sn(n,e){let{position:t,scale:o,rotation:r}=e;if(!t&&!o&&!r)return n;let[s,l,i]=t??[0,0,0],c=1,u=1,p=1;o!==void 0&&(typeof o=="number"?c=u=p=o:[c,u,p]=o);let d=Math.PI/180,[m,h,f]=r??[0,0,0],b=m*d,C=h*d,_=f*d,M=Math.cos(b),x=Math.sin(b),y=Math.cos(C),w=Math.sin(C),P=Math.cos(_),H=Math.sin(_);function v(A){let L=A[0]*c,a=A[1]*u,E=A[2]*p,g=P*L-H*a,G=H*L+P*a,z=E;return L=y*g+w*z,a=G,E=-w*g+y*z,g=L,G=M*a-x*E,z=x*a+M*E,[g+s,G+l,z+i]}return n.map(A=>({...A,vertices:A.vertices.map(v)}))}function Rt(n,e={}){It(n.ownerDocument??void 0);let t={mode:e.mode??"solid",glyphPalette:e.glyphPalette??"default",useColors:e.useColors??!0,cols:e.cols??80,rows:e.rows??24,cellAspect:e.cellAspect??2,directionalLight:e.directionalLight??{direction:[-.5,-.7,-.5],intensity:1},ambientLight:e.ambientLight??{intensity:.4},camera:e.camera??Ie(),smoothShading:e.smoothShading??!1,creaseAngle:e.creaseAngle??60,doubleSided:e.doubleSided??!1,supersample:e.supersample??1,depthEpsilon:e.depthEpsilon??0,temporalBlend:e.temporalBlend??0,autoSize:e.autoSize??!1,shadow:e.shadow},o=n.ownerDocument.createElement("div");o.className="glyph-scene";let r=n.ownerDocument.createElement("pre");r.className="glyph-output";let s=n.ownerDocument.createElement("div");s.className="glyph-hotspot-layer",o.appendChild(r),o.appendChild(s),n.appendChild(o);let l=new Map,i=[],c=!1,u={iA:[],iB:[],iC:[],lit:[]},p={idx:new Float32Array(0),r:new Float32Array(0),g:new Float32Array(0),b:new Float32Array(0),cols:0,rows:0,cam:null};function d(){u.iA.length=0,u.iB.length=0,u.iC.length=0,u.lit.length=0}let m=null,h=0;function f(){let a=[];for(let g of l.values())for(let G of g.polygons)(G.texture||G.material?.texture)&&a.push(G);if(a.length===0){m&&(m=null,b());return}let E=++h;(0,Bt.buildTextureSamplers)(a).then(g=>{E===h&&(m=g.size>0?g:null,b())})}function b(){c||(c=!0,Promise.resolve().then(()=>{c=!1,C()}))}function C(){let a=[],E=[],g=[],G=[],z=!1;for(let N of l.values()){let re=Sn(N.polygons,N.transform),k=N.transform.castShadow??!1,q=N.transform.receiveShadow??!1,oe=N.transform.depthBias??0;oe!==0&&(z=!0);for(let K of re)a.push(K),E.push(k),g.push(q),G.push(oe)}let F=_t({camera:t.camera,grid:{cols:t.cols,rows:t.rows,cellAspect:t.cellAspect},polygons:a,mode:t.mode,directionalLight:t.directionalLight,ambientLight:t.ambientLight,glyphPalette:t.glyphPalette,useColors:t.useColors,smoothShading:t.smoothShading,creaseAngle:t.creaseAngle,doubleSided:t.doubleSided,supersample:t.supersample,depthEpsilon:t.depthEpsilon,temporalBlend:t.temporalBlend,shadow:t.shadow,castShadowFlags:E,receiveShadowFlags:g,depthBiases:z?G:void 0});F.shadeCache=u,F.textureSamplers=m,F.temporalHistory=p;let T=globalThis.__glyphPerf,W=T?performance.now():0,R=Ht(F),j=T?performance.now():0;if(t.useColors?r.innerHTML=R:r.textContent=R,T){let N=performance.now();(T.raster??(T.raster=[])).push(j-W),(T.dom??(T.dom=[])).push(N-j),(T.polys??(T.polys=[])).push(a.length)}_()}function _(){let{cols:a,rows:E,cellAspect:g,camera:G}=t,z=Ot(i.map(R=>R.hotspot),G,a,E,g),F=r.getBoundingClientRect(),T=a>0?F.width/a:8,W=E>0?F.height/E:16;for(let R=0;R<i.length;R++){let{el:j}=i[R],N=z[R];N.visible?(j.style.display="",j.style.left=`${(N.col+.5)*T}px`,j.style.top=`${(N.row+.5)*W}px`,j.style.zIndex=String(Math.round(N.depth*1e3))):j.style.display="none"}}function M(a,E={}){let g=An++;return l.set(g,{id:g,polygons:a,transform:E}),d(),f(),b(),{get id(){return g},get name(){return l.get(g)?.transform.id},get polygons(){return a},setTransform(G){let z=l.get(g);z&&(z.transform=G,d(),b())},dispose(){l.delete(g),d(),f(),b()}}}function x(a,E){let g=n.ownerDocument.createElement("div");g.className="glyph-hotspot",g.setAttribute("data-hotspot-id",a.id);let[G,z]=a.size??[1,1];g.style.position="absolute",g.style.width=`${G}ch`,g.style.height=`${z*t.cellAspect}ch`,E&&g.addEventListener("click",E),s.appendChild(g);let F={hotspot:{id:a.id,at:a.at,size:a.size},el:g,onClick:E};return i.push(F),b(),{get el(){return g},remove(){let T=i.indexOf(F);T>=0&&i.splice(T,1),E&&g.removeEventListener("click",E),s.removeChild(g),b()}}}function y(){C()}function w(a){a.mode!==void 0&&(t.mode=a.mode),a.glyphPalette!==void 0&&(t.glyphPalette=a.glyphPalette),a.useColors!==void 0&&(t.useColors=a.useColors),a.cols!==void 0&&(t.cols=a.cols),a.rows!==void 0&&(t.rows=a.rows),a.cellAspect!==void 0&&(t.cellAspect=a.cellAspect),a.directionalLight!==void 0&&(t.directionalLight=a.directionalLight),a.ambientLight!==void 0&&(t.ambientLight=a.ambientLight),a.camera!==void 0&&(t.camera=a.camera),a.smoothShading!==void 0&&(t.smoothShading=a.smoothShading),a.creaseAngle!==void 0&&(t.creaseAngle=a.creaseAngle),"shadow"in a&&(t.shadow=a.shadow),a.autoSize!==void 0&&(t.autoSize=a.autoSize,t.autoSize&&!A&&typeof ResizeObserver<"u"?(A=new ResizeObserver(()=>v()),A.observe(n),v()):!t.autoSize&&A&&(A.disconnect(),A=null)),(a.mode!==void 0||a.useColors!==void 0||a.directionalLight!==void 0||a.ambientLight!==void 0||a.smoothShading!==void 0||a.creaseAngle!==void 0||a.glyphPalette!==void 0)&&d(),b()}function P(){return{...t}}function H(){let E=n.ownerDocument.createElement("span");E.textContent=Array(20).fill("M").join(`
|
|
63
|
+
`),E.style.cssText="position:absolute;visibility:hidden;font-family:inherit;font-size:inherit;line-height:inherit;white-space:pre;padding:0;margin:0",r.appendChild(E);let g=E.getBoundingClientRect();return E.remove(),{w:g.width||8,h:g.height?g.height/20:16}}function v(){let a=n.clientWidth,E=n.clientHeight;if(!a||!E)return;let g=H(),G=Math.max(20,Math.floor(a/g.w)),z=Math.max(8,Math.floor(E/g.h)),F=g.h/g.w,T=!1;t.cols!==G&&(t.cols=G,T=!0),t.rows!==z&&(t.rows=z,T=!0),Math.abs(t.cellAspect-F)>.01&&(t.cellAspect=F,T=!0),T&&b()}let A=null;t.autoSize&&typeof ResizeObserver<"u"&&(A=new ResizeObserver(()=>v()),A.observe(n),v());function L(){A&&(A.disconnect(),A=null),l.clear(),n.contains(o)&&n.removeChild(o)}return b(),{get host(){return n},get output(){return r},get camera(){return t.camera},add:M,addHotspot:x,rerender:y,setOptions:w,getOptions:P,fit:v,destroy:L}}var xn=typeof HTMLElement<"u"?HTMLElement:class{},Mn=["mode","glyph-palette","use-colors","cols","rows","cell-aspect","directional-direction","directional-intensity","ambient-intensity","auto-size","shadow","shadow-color","shadow-opacity","shadow-lift","shadow-max-extend"];function Ce(n){if(n==null)return;let e=parseFloat(n);return Number.isFinite(e)?e:void 0}function Cn(n){if(n==="wireframe"||n==="solid"||n==="voxel")return n}function Gn(n){if(n!==null){if(n==="false")return!1;if(n==="true"||n==="")return!0}}var Xe=class extends xn{constructor(){super(...arguments);this._scene=null}static get observedAttributes(){return[...Mn]}getScene(){return this._scene}_readOptions(){let t={},o=Cn(this.getAttribute("mode"));o!==void 0&&(t.mode=o);let r=this.getAttribute("glyph-palette");r&&(t.glyphPalette=r);let s=Gn(this.getAttribute("use-colors"));s!==void 0&&(t.useColors=s);let l=Ce(this.getAttribute("cols"));l!==void 0&&(t.cols=l);let i=Ce(this.getAttribute("rows"));i!==void 0&&(t.rows=i);let c=Ce(this.getAttribute("cell-aspect"));c!==void 0&&(t.cellAspect=c);let u=Ce(this.getAttribute("directional-intensity"));u!==void 0&&(t.directionalLight={direction:[-.5,-.7,-.5],intensity:u});let p=Ce(this.getAttribute("ambient-intensity"));if(p!==void 0&&(t.ambientLight={intensity:p}),this.hasAttribute("auto-size")&&(t.autoSize=!0),this.hasAttribute("shadow")){let d={color:"#000000",opacity:.25,lift:.05,maxExtend:2e3},m=this.getAttribute("shadow-color");m&&(d.color=m);let h=Ce(this.getAttribute("shadow-opacity"));h!==void 0&&(d.opacity=h);let f=Ce(this.getAttribute("shadow-lift"));f!==void 0&&(d.lift=f);let b=Ce(this.getAttribute("shadow-max-extend"));b!==void 0&&(d.maxExtend=b),t.shadow=d}return t}_findCameraAncestor(){let t=this.parentElement;for(;t;){let o=t.tagName.toLowerCase();if(o==="glyph-perspective-camera"||o==="glyph-orthographic-camera"||o==="glyph-camera")return t;t=t.parentElement}return null}_initScene(t){let o=typeof t.getCamera=="function"?t.getCamera():void 0,r=this._readOptions();o&&(r.camera=o),this._scene=Rt(this,r),this.dispatchEvent(new CustomEvent("glyphcss:scene-ready",{bubbles:!1}))}connectedCallback(){if(this._scene)return;let t=this._findCameraAncestor();if(!t)throw new Error("glyphcss: <glyph-scene> must be placed inside a <glyph-camera>, <glyph-perspective-camera>, or <glyph-orthographic-camera>.");if((typeof t.getCamera=="function"?t.getCamera():null)!==null)this._initScene(t);else{let r=()=>{t.removeEventListener("glyph:camera-ready",r),this._scene||this._initScene(t)};t.addEventListener("glyph:camera-ready",r)}}rerender(){this._scene?.rerender()}disconnectedCallback(){this._scene&&(this._scene.destroy(),this._scene=null)}attributeChangedCallback(t,o,r){o!==r&&this._scene&&this._scene.setOptions(this._readOptions())}};var Be=require("@glyphcss/core"),Ln=typeof HTMLElement<"u"?HTMLElement:class{},Tn=["src","geometry","size","color","position","scale","rotation","normalize","cast-shadow","receive-shadow"];function _n(n){let e=(0,Be.computeSceneBbox)(n),t=(e.min[0]+e.max[0])/2,o=(e.min[1]+e.max[1])/2,r=(e.min[2]+e.max[2])/2,l=2/(Math.max(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2])||1);return n.map(i=>({...i,vertices:i.vertices.map(c=>[(c[0]-t)*l,(c[1]-o)*l,(c[2]-r)*l])}))}function bt(n){if(!n)return;let e=n.split(",").map(t=>parseFloat(t.trim()));if(!(e.length!==3||e.some(t=>!Number.isFinite(t))))return[e[0],e[1],e[2]]}function zn(n){if(n){if(!n.includes(",")){let e=parseFloat(n);return Number.isFinite(e)?e:void 0}return bt(n)}}function Pn(n){return n.closest("glyph-scene")??null}var $e=class extends Ln{constructor(){super(...arguments);this._handle=null;this._loadToken=0}static get observedAttributes(){return[...Tn]}getMeshHandle(){return this._handle}connectedCallback(){this._maybeLoad()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(t,o,r){if(o!==r){if(t==="src"||t==="geometry"||t==="size"||t==="color"){this._tearDown(),this._maybeLoad();return}this._handle&&this._handle.setTransform(this._readTransform())}}_readTransform(){return{position:bt(this.getAttribute("position")),scale:zn(this.getAttribute("scale")),rotation:bt(this.getAttribute("rotation")),castShadow:this.hasAttribute("cast-shadow"),receiveShadow:this.hasAttribute("receive-shadow")}}_tearDown(){if(this._loadToken+=1,this._handle){try{this._handle.dispose()}catch{}this._handle=null}}async _maybeLoad(){let t=this.getAttribute("src"),o=this.getAttribute("geometry"),r=Pn(this);if(r){if(!r.getScene()){let s=()=>{r.removeEventListener("glyphcss:scene-ready",s),this._maybeLoad()};r.addEventListener("glyphcss:scene-ready",s);return}if(t){let s=++this._loadToken,l;try{l=await(0,Be.loadMesh)(t)}catch(p){this.dispatchEvent(new CustomEvent("glyphcss:error",{detail:p,bubbles:!0}));return}if(s!==this._loadToken){try{l.dispose()}catch{}return}let i=r.getScene();if(!i){try{l.dispose()}catch{}return}let u=this.hasAttribute("normalize")?_n(l.polygons):l.polygons;this._handle=i.add(u,this._readTransform()),this.dispatchEvent(new CustomEvent("glyphcss:loaded",{detail:{polygons:u},bubbles:!0}));return}if(o){let s=r.getScene();if(!s)return;let l=this.getAttribute("size"),i=l!==null?parseFloat(l):1,c=this.getAttribute("color")??void 0,u;try{u=(0,Be.resolveGeometry)(o,{size:Number.isFinite(i)?i:1,color:c})}catch(p){this.dispatchEvent(new CustomEvent("glyphcss:error",{detail:p,bubbles:!0}));return}this._handle=s.add(u,this._readTransform()),this.dispatchEvent(new CustomEvent("glyphcss:loaded",{detail:{polygons:u},bubbles:!0}))}}}};var Hn=typeof HTMLElement<"u"?HTMLElement:class{};function Fn(n){if(!n)return;let e=n.split(",").map(t=>parseFloat(t.trim()));if(!(e.length!==3||e.some(t=>!Number.isFinite(t))))return[e[0],e[1],e[2]]}function In(n){if(!n)return;let e=n.split(",").map(t=>parseFloat(t.trim()));if(!(e.length!==2||e.some(t=>!Number.isFinite(t))))return[e[0],e[1]]}function On(n){return n.closest("glyph-scene")??null}var We=class extends Hn{constructor(){super(...arguments);this._handle=null}static get observedAttributes(){return["at","size","hotspot-id"]}connectedCallback(){this._register()}disconnectedCallback(){this._handle&&this._unregister()}attributeChangedCallback(t,o,r){o!==r&&(this._handle&&this._unregister(),this._register())}_unregister(){if(!this._handle)return;let t=this._handle.el;for(;t.firstChild;)this.appendChild(t.firstChild);this._handle.remove(),this._handle=null}_register(){let t=Fn(this.getAttribute("at"));if(!t)return;let o=On(this);if(!o)return;if(!o.getScene()){let c=()=>{o.removeEventListener("glyphcss:scene-ready",c),this._register()};o.addEventListener("glyphcss:scene-ready",c);return}let r=o.getScene();if(!r)return;let s=this.getAttribute("hotspot-id")??this.getAttribute("id")??String(Math.random()),l=In(this.getAttribute("size"));this._handle=r.addHotspot({id:s,at:t,size:l},()=>this.dispatchEvent(new CustomEvent("glyphcss:hotspot-click",{detail:{id:s},bubbles:!0})));let i=this._handle.el;for(;this.firstChild;)i.appendChild(this.firstChild)}};var Bn=typeof HTMLElement<"u"?HTMLElement:class{};function ue(n){if(n==null)return;let e=parseFloat(n);return Number.isFinite(e)?e:void 0}var je=class extends Bn{constructor(){super(...arguments);this._camera=null}static get observedAttributes(){return["rot-x","rot-y","distance","perspective","zoom","stretch"]}getCamera(){return this._camera}connectedCallback(){this._camera=Ie({rotX:ue(this.getAttribute("rot-x")),rotY:ue(this.getAttribute("rot-y")),distance:ue(this.getAttribute("distance")),perspective:ue(this.getAttribute("perspective")),zoom:ue(this.getAttribute("zoom")),stretch:ue(this.getAttribute("stretch"))}),this.dispatchEvent(new CustomEvent("glyph:camera-ready",{bubbles:!1}))}disconnectedCallback(){this._camera=null}attributeChangedCallback(t,o,r){if(o===r)return;let s=this._camera;if(!s)return;let l=ue(this.getAttribute("rot-x")),i=ue(this.getAttribute("rot-y")),c=ue(this.getAttribute("distance")),u=ue(this.getAttribute("perspective")),p=ue(this.getAttribute("zoom")),d=ue(this.getAttribute("stretch")),m=!1;l!==void 0&&s.rotX!==l&&(s.rotX=l,m=!0),i!==void 0&&s.rotY!==i&&(s.rotY=i,m=!0),c!==void 0&&s.distance!==c&&(s.distance=c,m=!0),u!==void 0&&s.perspective!==u&&(s.perspective=u,m=!0),p!==void 0&&s.zoom!==p&&(s.zoom=p,m=!0),d!==void 0&&s.stretch!==d&&(s.stretch=d,m=!0),m&&this.querySelector("glyph-scene")?.rerender?.()}};var Rn=typeof HTMLElement<"u"?HTMLElement:class{};function Re(n){if(n==null)return;let e=parseFloat(n);return Number.isFinite(e)?e:void 0}var Ne=class extends Rn{constructor(){super(...arguments);this._camera=null}static get observedAttributes(){return["rot-x","rot-y","zoom"]}getCamera(){return this._camera}connectedCallback(){this._camera=Tt({rotX:Re(this.getAttribute("rot-x")),rotY:Re(this.getAttribute("rot-y")),zoom:Re(this.getAttribute("zoom"))}),this.dispatchEvent(new CustomEvent("glyph:camera-ready",{bubbles:!1}))}disconnectedCallback(){this._camera=null}attributeChangedCallback(t,o,r){if(o===r)return;let s=this._camera;if(!s)return;let l=Re(this.getAttribute("rot-x")),i=Re(this.getAttribute("rot-y")),c=Re(this.getAttribute("zoom")),u=!1;l!==void 0&&s.rotX!==l&&(s.rotX=l,u=!0),i!==void 0&&s.rotY!==i&&(s.rotY=i,u=!0),c!==void 0&&s.zoom!==c&&(s.zoom=c,u=!0),u&&this.querySelector("glyph-scene")?.rerender?.()}};function kt(n,e={}){let t=n.host,o=e.drag??!0,r=e.wheel??!0,s=Nt(e.invert),l=e.clampPitch??!0,i=e.animate??!1,c=!1,u=!1,p=null,d=null,m=null,h={x:0,y:0},f=n.camera;function b(v){if(!(!o||c)&&m===null&&v.isPrimary!==!1){v.preventDefault(),m=v.pointerId,h={x:v.clientX,y:v.clientY},t.style.cursor="grabbing";try{v.target.setPointerCapture(v.pointerId)}catch{}i&&i.pauseOnInteraction!==!1&&(u=!0)}}function C(v){if(m===null||v.pointerId!==m||!o||c)return;v.preventDefault();let A=v.clientX-h.x,L=v.clientY-h.y;h={x:v.clientX,y:v.clientY};let a=s,E=1/4;f.rotY=f.rotY-A*E*a;let g=f.rotX-L*E*a;f.rotX=l?Math.max(-90,Math.min(90,g)):g,n.rerender()}function _(v){if(m===v.pointerId){m=null,t.style.cursor=o&&!c?"grab":"";try{v.target.releasePointerCapture(v.pointerId)}catch{}i&&(u=!1)}}function M(v){if(!r||c)return;v.preventDefault();let A=v.deltaY*.001;f.zoom=Math.max(.1,Math.min(500,f.zoom*(1-A))),n.rerender()}function x(v){if(!(c||!i)){if(!u){let A=d!==null?Math.min(v-d,50):16.67,L=typeof i=="object"&&i.speed?i.speed:.3,a=typeof i=="object"&&i.axis?i.axis:"y",E=L*(A/16.67);a==="y"?f.rotY=f.rotY+E:f.rotX=f.rotX+E,n.rerender()}d=v,p=requestAnimationFrame(x)}}function y(){p===null&&typeof requestAnimationFrame<"u"&&i&&(p=requestAnimationFrame(x))}function w(){p!==null&&(typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(p),p=null),d=null}function P(){t.addEventListener("pointerdown",b),t.addEventListener("pointermove",C),t.addEventListener("pointerup",_),t.addEventListener("pointercancel",_),t.addEventListener("wheel",M,{passive:!1}),t.style.cursor=o?"grab":"",t.style.touchAction="none",t.style.userSelect="none"}function H(){t.removeEventListener("pointerdown",b),t.removeEventListener("pointermove",C),t.removeEventListener("pointerup",_),t.removeEventListener("pointercancel",_),t.removeEventListener("wheel",M),t.style.cursor="",t.style.touchAction="",t.style.userSelect=""}return P(),y(),{update(v){let A=!!i;o=v.drag??o,r=v.wheel??r,s=Nt(v.invert),v.clampPitch!==void 0&&(l=v.clampPitch),i=v.animate??i,!c&&m===null&&(t.style.cursor=o?"grab":"");let L=!!i;A&&!L?w():!A&&L&&y()},pause(){c||(c=!0,H(),w(),m=null,u=!1)},resume(){c&&(c=!1,P(),y())},destroy(){c||H(),w(),c=!0}}}function Nt(n){return n===void 0||n===!1?1:n===!0?-1:n}var Nn=typeof HTMLElement<"u"?HTMLElement:class{};function kn(n){if(n==null)return;let e=parseFloat(n);return Number.isFinite(e)?e:void 0}function rt(n){if(n!==null){if(n==="false")return!1;if(n==="true"||n==="")return!0}}function Yn(n){return n.closest("glyph-scene")??null}var qe=class extends Nn{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return["drag","wheel","invert","clamp-pitch","animate-speed","animate-axis"]}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls?.update(this._readOptions())}_readOptions(){let t=rt(this.getAttribute("drag")),o=rt(this.getAttribute("wheel")),r=rt(this.getAttribute("invert")),s=rt(this.getAttribute("clamp-pitch")),l=kn(this.getAttribute("animate-speed")),i=this.getAttribute("animate-axis")==="x"?"x":"y";return{...t!==void 0?{drag:t}:{},...o!==void 0?{wheel:o}:{},...r!==void 0?{invert:r}:{},...s!==void 0?{clampPitch:s}:{},...l!==void 0?{animate:{speed:l,axis:i}}:{}}}_attach(){if(this._controls)return;let t=Yn(this);if(!t)return;let o=t.getScene();if(!o){let r=()=>{t.removeEventListener("glyphcss:scene-ready",r),this._attach()};t.addEventListener("glyphcss:scene-ready",r);return}this._controls=kt(o,this._readOptions())}};function Dt(n,e={}){let t=n.host,o=e.drag??!0,r=e.wheel??!0,s=Yt(e.invert),l=e.animate??!1,i=!1,c=!1,u=null,p=null,d=null,m={x:0,y:0},h=!1,f=n.camera,b=1/4,C=.02;function _(a){if(!(!o||i)&&d===null&&a.isPrimary!==!1){a.preventDefault(),d=a.pointerId,m={x:a.clientX,y:a.clientY},h=a.button===2,t.style.cursor="grabbing";try{a.target.setPointerCapture(a.pointerId)}catch{}l&&l.pauseOnInteraction!==!1&&(c=!0)}}function M(a){if(d===null||a.pointerId!==d||!o||i)return;a.preventDefault();let E=a.clientX-m.x,g=a.clientY-m.y;m={x:a.clientX,y:a.clientY};let G=s;if(h||a.shiftKey)f.rotY=f.rotY-E*b*G,f.rotX=Math.max(-90,Math.min(90,f.rotX+g*b*G));else{let z=f.target;f.target=[z[0]-E*C/f.zoom,z[1]-g*C/f.zoom,z[2]]}n.rerender()}function x(a){if(d===a.pointerId){d=null,h=!1,t.style.cursor=o&&!i?"grab":"";try{a.target.releasePointerCapture(a.pointerId)}catch{}l&&(c=!1)}}function y(a){a.preventDefault()}function w(a){if(!r||i)return;a.preventDefault();let E=a.deltaY*.001;f.zoom=Math.max(.1,Math.min(500,f.zoom*(1-E))),n.rerender()}function P(a){if(!(i||!l)){if(!c){let E=p!==null?Math.min(a-p,50):16.67,g=typeof l=="object"&&l.speed?l.speed:.3,G=typeof l=="object"&&l.axis?l.axis:"y",z=g*(E/16.67);G==="y"?f.rotY=f.rotY+z:f.rotX=f.rotX+z,n.rerender()}p=a,u=requestAnimationFrame(P)}}function H(){u===null&&typeof requestAnimationFrame<"u"&&l&&(u=requestAnimationFrame(P))}function v(){u!==null&&(typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(u),u=null),p=null}function A(){t.addEventListener("pointerdown",_),t.addEventListener("pointermove",M),t.addEventListener("pointerup",x),t.addEventListener("pointercancel",x),t.addEventListener("contextmenu",y),t.addEventListener("wheel",w,{passive:!1}),t.style.cursor=o?"grab":"",t.style.touchAction="none",t.style.userSelect="none"}function L(){t.removeEventListener("pointerdown",_),t.removeEventListener("pointermove",M),t.removeEventListener("pointerup",x),t.removeEventListener("pointercancel",x),t.removeEventListener("contextmenu",y),t.removeEventListener("wheel",w),t.style.cursor="",t.style.touchAction="",t.style.userSelect=""}return A(),H(),{update(a){let E=!!l;o=a.drag??o,r=a.wheel??r,s=Yt(a.invert),l=a.animate??l,!i&&d===null&&(t.style.cursor=o?"grab":"");let g=!!l;E&&!g?v():!E&&g&&H()},pause(){i||(i=!0,L(),v(),d=null,c=!1)},resume(){i&&(i=!1,A(),H())},destroy(){i||L(),v(),i=!0}}}function Yt(n){return n===void 0||n===!1?1:n===!0?-1:n}var Dn=typeof HTMLElement<"u"?HTMLElement:class{};function vt(n){if(n!==null){if(n==="false")return!1;if(n==="true"||n==="")return!0}}function Vn(n){return n.closest("glyph-scene")??null}var Ue=class extends Dn{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return["drag","wheel","invert"]}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls?.update(this._readOptions())}_readOptions(){let t=vt(this.getAttribute("drag")),o=vt(this.getAttribute("wheel")),r=vt(this.getAttribute("invert"));return{...t!==void 0?{drag:t}:{},...o!==void 0?{wheel:o}:{},...r!==void 0?{invert:r}:{}}}_attach(){if(this._controls)return;let t=Vn(this);if(!t)return;let o=t.getScene();if(!o){let r=()=>{t.removeEventListener("glyphcss:scene-ready",r),this._attach()};t.addEventListener("glyphcss:scene-ready",r);return}this._controls=Dt(o,this._readOptions())}};if(typeof customElements<"u"){if(customElements.get("glyph-scene")||customElements.define("glyph-scene",Xe),customElements.get("glyph-mesh")||customElements.define("glyph-mesh",$e),customElements.get("glyph-hotspot")||customElements.define("glyph-hotspot",We),customElements.get("glyph-perspective-camera")||customElements.define("glyph-perspective-camera",je),customElements.get("glyph-orthographic-camera")||customElements.define("glyph-orthographic-camera",Ne),!customElements.get("glyph-camera")){class n extends Ne{}customElements.define("glyph-camera",n)}customElements.get("glyph-orbit-controls")||customElements.define("glyph-orbit-controls",qe),customElements.get("glyph-map-controls")||customElements.define("glyph-map-controls",Ue)}0&&(module.exports={GlyphHotspotElement,GlyphMapControlsElement,GlyphMeshElement,GlyphOrbitControlsElement,GlyphOrthographicCameraElement,GlyphPerspectiveCameraElement,GlyphSceneElement});
|
package/dist/elements.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { e as GlyphHotspotElement, h as GlyphMapControlsElement, i as GlyphMeshElement, l as GlyphOrbitControlsElement, m as GlyphOrthographicCameraElement, p as GlyphPerspectiveCameraElement, s as GlyphSceneElement } from './elements-
|
|
1
|
+
export { e as GlyphHotspotElement, h as GlyphMapControlsElement, i as GlyphMeshElement, l as GlyphOrbitControlsElement, m as GlyphOrthographicCameraElement, p as GlyphPerspectiveCameraElement, s as GlyphSceneElement } from './elements-ycVyIlYL.cjs';
|
|
2
2
|
import '@glyphcss/core';
|
package/dist/elements.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { e as GlyphHotspotElement, h as GlyphMapControlsElement, i as GlyphMeshElement, l as GlyphOrbitControlsElement, m as GlyphOrthographicCameraElement, p as GlyphPerspectiveCameraElement, s as GlyphSceneElement } from './elements-
|
|
1
|
+
export { e as GlyphHotspotElement, h as GlyphMapControlsElement, i as GlyphMeshElement, l as GlyphOrbitControlsElement, m as GlyphOrthographicCameraElement, p as GlyphPerspectiveCameraElement, s as GlyphSceneElement } from './elements-ycVyIlYL.js';
|
|
2
2
|
import '@glyphcss/core';
|