@vincentt-xr/sdk 2.0.0-alpha.7 → 2.0.0-alpha.8
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/GROUNDING.md +1109 -13
- package/dist/{DebuggerUI-BjOMr8q_.js → DebuggerUI-C-ldiozL.js} +1 -1
- package/dist/{DebuggerUI-B6bP6P9r.cjs → DebuggerUI-CWX5EtQv.cjs} +1 -1
- package/dist/FaceMeshRenderer-BEEXZwS6.cjs +158 -0
- package/dist/FaceMeshRenderer-UuH5sTXG.js +1322 -0
- package/dist/FaceRetouch-C7h7x9kd.js +683 -0
- package/dist/FaceRetouch-DqftT26Y.cjs +134 -0
- package/dist/GLTFLoader-C5q63sKO.js +1633 -0
- package/dist/GLTFLoader-Cb_CRwmG.cjs +1 -0
- package/dist/SegmentationOverlay-DQuW3dsc.js +133 -0
- package/dist/SegmentationOverlay-aWVod8Kl.cjs +1 -0
- package/dist/assets/cache.d.ts +99 -0
- package/dist/assets/estimate.d.ts +11 -0
- package/dist/assets/index.d.ts +7 -0
- package/dist/assets/loaders.d.ts +28 -0
- package/dist/assets/react.d.ts +33 -0
- package/dist/calibration/calibration.d.ts +70 -0
- package/dist/calibration/index.d.ts +6 -0
- package/dist/calibration/storage.d.ts +13 -0
- package/dist/calibration/types.d.ts +53 -0
- package/dist/calibration/useXRCalibration.d.ts +46 -0
- package/dist/camera/CameraPermissionGate.d.ts +26 -0
- package/dist/camera/devices.d.ts +26 -0
- package/dist/camera/index.d.ts +8 -0
- package/dist/camera/permission.d.ts +86 -0
- package/dist/camera/useCameraPermission.d.ts +35 -0
- package/dist/capabilities/detect.d.ts +45 -0
- package/dist/capabilities/index.d.ts +5 -0
- package/dist/capabilities/types.d.ts +120 -0
- package/dist/capabilities/useXRCapabilities.d.ts +18 -0
- package/dist/compat/environment.d.ts +5 -0
- package/dist/compat/index.d.ts +4 -0
- package/dist/compat/run.d.ts +18 -0
- package/dist/compat/scenarios.d.ts +10 -0
- package/dist/compat/types.d.ts +101 -0
- package/dist/components/BodyTracker/index.d.ts +9 -0
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +33 -3
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +12 -0
- package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
- package/dist/components/FaceMesh/index.d.ts +1 -1
- package/dist/components/GestureListener/index.d.ts +11 -0
- package/dist/components/HandTracker/index.d.ts +10 -0
- package/dist/components/HolisticTracker/index.d.ts +69 -0
- package/dist/components/HolisticTracker/settings.d.ts +58 -0
- package/dist/components/HolisticTracker/signals.d.ts +49 -0
- package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
- package/dist/components/IrisEffect/index.d.ts +51 -0
- package/dist/components/IrisEffect/settings.d.ts +117 -0
- package/dist/components/LipEffect/LipEffect.d.ts +7 -1
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +43 -7
- package/dist/components/LipEffect/LipEffects.d.ts +9 -0
- package/dist/components/LipEffect/defaults.d.ts +27 -4
- package/dist/components/LipEffect/index.d.ts +11 -3
- package/dist/components/LipEffect/settings.d.ts +271 -0
- package/dist/components/LipEffect/types.d.ts +56 -9
- package/dist/components/LipEffect/useLipDesignTextures.d.ts +11 -0
- package/dist/components/LipEffect/uvGuide.d.ts +59 -0
- package/dist/components/PersonCutout/index.d.ts +50 -0
- package/dist/components/PersonCutout/personCutout.d.ts +16 -0
- package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
- package/dist/components/ScreenImage/index.d.ts +3 -1
- package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
- package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
- package/dist/components/ScreenImage/source.d.ts +6 -0
- package/dist/components/ScreenImage/types.d.ts +18 -0
- package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
- package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
- package/dist/components/SegmentationOverlay/index.d.ts +9 -0
- package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
- package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
- package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
- package/dist/components/XRProvider/index.d.ts +16 -2
- package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
- package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
- package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
- package/dist/components/index.d.ts +3 -0
- package/dist/constants/index.d.ts +4 -1
- package/dist/contexts-CO0sd4JQ.cjs +1 -0
- package/dist/{contexts-ByhzppYl.js → contexts-FzlnnMYD.js} +252 -246
- package/dist/coordinates/feed.d.ts +52 -0
- package/dist/coordinates/index.d.ts +5 -0
- package/dist/coordinates/spaces.d.ts +49 -0
- package/dist/coordinates/viewport.d.ts +22 -0
- package/dist/coordinates/world.d.ts +15 -0
- package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
- package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
- package/dist/debug-ui/index.d.ts +14 -0
- package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
- package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +1 -1
- package/dist/debug-ui/product-hotspots/index.d.ts +24 -0
- package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
- package/dist/debug-ui/xr-diagnostics/index.d.ts +25 -0
- package/dist/debug-ui.cjs +3 -3
- package/dist/debug-ui.js +2057 -1687
- package/dist/detector-K8aej4MB.js +59 -0
- package/dist/detector-ijypGtse.cjs +1 -0
- package/dist/entries/core.d.ts +18 -1
- package/dist/entries/face-effects.d.ts +11 -3
- package/dist/entries/low-level.d.ts +22 -3
- package/dist/entries/product.d.ts +11 -0
- package/dist/entries/tracking.d.ts +24 -1
- package/dist/face-effects.cjs +155 -1
- package/dist/face-effects.js +1134 -2197
- package/dist/gestures/definitions.d.ts +85 -0
- package/dist/gestures/detector.d.ts +87 -0
- package/dist/gestures/index.d.ts +8 -0
- package/dist/gestures/measures.d.ts +101 -0
- package/dist/gestures/settings.d.ts +49 -0
- package/dist/{getFaceInfo-C4QpCQIY.js → getFaceInfo-BkZfaQs-.js} +5 -5
- package/dist/{getFaceInfo-fA1bFBub.cjs → getFaceInfo-ahPxQFGu.cjs} +1 -1
- package/dist/hooks/selectors.d.ts +68 -1
- package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
- package/dist/hooks/useFaceInfo.d.ts +13 -1
- package/dist/hooks/useFaceInfos.d.ts +1 -1
- package/dist/hooks/useGesture.d.ts +32 -0
- package/dist/hooks/useIrisTracking.d.ts +45 -0
- package/dist/hooks/useXRDiagnostics.d.ts +81 -0
- package/dist/hooks/useXRModel.d.ts +7 -0
- package/dist/hooks/useXRSession/facade.d.ts +42 -2
- package/dist/hooks/useXRSession/index.d.ts +2 -2
- package/dist/hooks/useXRSession/reason.d.ts +3 -1
- package/dist/hooks/useXRSession/registry.d.ts +14 -0
- package/dist/hooks/useXRSession/store.d.ts +52 -3
- package/dist/index--RgGzZ6X.cjs +47 -0
- package/dist/{index-VJ0SJwmG.js → index-CHVbH0hz.js} +4 -4
- package/dist/index-CeVkgsag.cjs +1 -0
- package/dist/index-CnGox6Xr.js +3054 -0
- package/dist/{index-ByoNj0QP.js → index-CsUdQ-pn.js} +113 -111
- package/dist/{index-BjmTe9eM.cjs → index-DKBAh6hV.cjs} +1 -1
- package/dist/index-DsZwTfG0.cjs +1 -0
- package/dist/index-Dw6tj2Mi.js +144 -0
- package/dist/index-OCPjOaeP.cjs +1 -0
- package/dist/{index-DXT3WccE.js → index-s9pF4zkG.js} +1065 -1101
- package/dist/internal-BYza1h8_.cjs +1 -0
- package/dist/{internal-Dmk1cTXq.js → internal-vsfNQycj.js} +15 -16
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +2 -2
- package/dist/iris/compute.d.ts +25 -0
- package/dist/iris/index.d.ts +4 -0
- package/dist/iris/lead.d.ts +19 -0
- package/dist/iris/types.d.ts +87 -0
- package/dist/landmarkMask-CbTFzBYG.js +224 -0
- package/dist/landmarkMask-u7es2k4X.cjs +1 -0
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +1085 -634
- package/dist/main.cjs +1 -1
- package/dist/main.js +1519 -465
- package/dist/measures-9dQPdw96.js +154 -0
- package/dist/measures-KfJzpvod.cjs +1 -0
- package/dist/models/Base/index.d.ts +49 -0
- package/dist/models/Body/index.d.ts +1 -1
- package/dist/models/Face/index.d.ts +1 -1
- package/dist/models/Hand/GestureTracking.d.ts +1 -1
- package/dist/models/Hand/HandTracking.d.ts +1 -1
- package/dist/models/Holistic/index.d.ts +49 -0
- package/dist/models/Holistic/result.d.ts +68 -0
- package/dist/models/SemanticSegmentation/index.d.ts +31 -0
- package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/product/ProductDimensions.d.ts +16 -0
- package/dist/product/ProductHotspot.d.ts +16 -0
- package/dist/product/ProductViewer.d.ts +9 -0
- package/dist/product/details.d.ts +53 -0
- package/dist/product/index.d.ts +14 -0
- package/dist/product/loadModelViewer.d.ts +4 -0
- package/dist/product/types.d.ts +71 -0
- package/dist/product/useProductAr.d.ts +37 -0
- package/dist/product/useProductDetails.d.ts +60 -0
- package/dist/product.cjs +1 -0
- package/dist/product.js +414 -0
- package/dist/providers-C0Dlhh9Z.js +365 -0
- package/dist/providers-YNwkmNeK.cjs +62 -0
- package/dist/quality/XRQualityController.d.ts +25 -0
- package/dist/quality/controller.d.ts +33 -0
- package/dist/quality/index.d.ts +6 -0
- package/dist/quality/types.d.ts +100 -0
- package/dist/quality/useXRQuality.d.ts +28 -0
- package/dist/{renderGroups-KZk6eRiY.js → renderGroups-CN1cGFUo.js} +1 -1
- package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-O4KmaMl9.cjs} +1 -1
- package/dist/renderPasses-Cg-zqmEz.cjs +21 -0
- package/dist/renderPasses-NnKZVfBy.js +1460 -0
- package/dist/scene-object.cjs +1 -1
- package/dist/scene-object.js +2 -2
- package/dist/screenTransform-BenfCtZt.js +44 -0
- package/dist/screenTransform-BiXdpVf0.cjs +1 -0
- package/dist/segmentation-9PhSvc-R.cjs +1 -0
- package/dist/segmentation-CeOTKemr.js +5 -0
- package/dist/segmentation2d/faceMemory.d.ts +28 -0
- package/dist/segmentation2d/faceRegions.d.ts +24 -0
- package/dist/segmentation2d/index.d.ts +9 -0
- package/dist/segmentation2d/maskUv.d.ts +23 -0
- package/dist/segmentation2d/rasterize.d.ts +14 -0
- package/dist/segmentation2d/types.d.ts +46 -0
- package/dist/selectors-C5G1PMYL.js +195 -0
- package/dist/selectors-Du_PsVnW.cjs +1 -0
- package/dist/{session-CpkiK5YA.cjs → session-BBr0yN8h.cjs} +7 -7
- package/dist/{session-DLFN_VII.js → session-Cy0m7l7-.js} +76 -76
- package/dist/settings-DRR7-snV.cjs +1 -0
- package/dist/settings-aQk845NJ.js +73 -0
- package/dist/subjects/index.d.ts +2 -0
- package/dist/subjects/select.d.ts +62 -0
- package/dist/subjects/types.d.ts +55 -0
- package/dist/tracking-config/apply.d.ts +57 -0
- package/dist/tracking-config/index.d.ts +7 -0
- package/dist/tracking-config/resolve.d.ts +25 -0
- package/dist/tracking-config/storage.d.ts +8 -0
- package/dist/tracking-config/types.d.ts +106 -0
- package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
- package/dist/tracking.cjs +1 -1
- package/dist/tracking.js +1056 -383
- package/dist/types/compositor.d.ts +21 -0
- package/dist/types/holistic.d.ts +121 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/model.d.ts +22 -2
- package/dist/types/nodes.d.ts +27 -2
- package/dist/types/segmentation.d.ts +19 -0
- package/dist/types/session.d.ts +41 -3
- package/dist/useFaceInfo-Blf7FCu3.js +303 -0
- package/dist/useFaceInfo-C5mO8NQY.cjs +1 -0
- package/dist/useXRCapabilities-B1R2ghy-.cjs +1 -0
- package/dist/useXRCapabilities-C68v__wB.js +30 -0
- package/dist/utils/fns.d.ts +6 -3
- package/dist/utils/integrity.d.ts +4 -1
- package/dist/utils/updateThrottle.d.ts +2 -0
- package/dist/utils/useStableUniforms.d.ts +18 -0
- package/docs/api/adaptive-quality.mdx +104 -0
- package/docs/api/asset-lifecycle.mdx +78 -0
- package/docs/api/camera-permission.mdx +142 -0
- package/docs/api/coordinate-spaces.mdx +165 -0
- package/docs/api/cross-camera.mdx +88 -0
- package/docs/api/diagnostics-calibration.mdx +97 -0
- package/docs/api/face-effects.mdx +6 -0
- package/docs/api/face-mesh.mdx +4 -2
- package/docs/api/gestures.mdx +173 -0
- package/docs/api/holistic-tracker.mdx +159 -0
- package/docs/api/iris-tracking.mdx +242 -0
- package/docs/api/multi-subject.mdx +95 -0
- package/docs/api/person-cutout.mdx +136 -0
- package/docs/api/product-ar.mdx +111 -0
- package/docs/api/product-details.mdx +78 -0
- package/docs/api/screen-space-coordinates.mdx +4 -1
- package/docs/api/segmentation-overlay.mdx +301 -0
- package/docs/api/session-lifecycle.mdx +136 -0
- package/docs/api/trackers.mdx +5 -0
- package/docs/api/tracking-config.mdx +108 -0
- package/docs/docs.json +23 -1
- package/docs/examples/lip-shaders.mdx +224 -0
- package/docs/guides/lip-effect-textures.mdx +292 -0
- package/docs/guides/lip-uv-template.png +0 -0
- package/docs/guides/lip-uv-template.svg +1 -0
- package/package.json +13 -1
- package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
- package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
- package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
- package/dist/FaceRetouch-DwbKQJAN.js +0 -551
- package/dist/contexts-Dr62It_K.cjs +0 -1
- package/dist/index-9dlAQAhy.js +0 -1462
- package/dist/index-BpEf2BBb.cjs +0 -1
- package/dist/index-CyUUurQT.cjs +0 -1
- package/dist/index-DCiMbxC3.cjs +0 -1
- package/dist/index-DpI-qo5X.cjs +0 -17
- package/dist/index-DyVF4vEW.js +0 -111
- package/dist/internal-Cq-TEQ5Y.cjs +0 -1
- package/dist/renderLayers-lDtL0_43.cjs +0 -1
- package/dist/renderLayers-zrK2pv5O.js +0 -13
- package/dist/renderPasses-BOoBSr8z.cjs +0 -21
- package/dist/renderPasses-BcquyVtu.js +0 -1500
- package/dist/selectors-B8H97CKA.js +0 -59
- package/dist/selectors-CZLKT2Iv.cjs +0 -1
- package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
- package/dist/useFaceInfo-Dk426LTu.js +0 -62
- package/dist/useFaceResults-CtetsO9M.js +0 -19
- package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
var W = Object.defineProperty;
|
|
2
|
+
var Y = (e, r, t) => r in e ? W(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t;
|
|
3
|
+
var y = (e, r, t) => Y(e, typeof r != "symbol" ? r + "" : r, t);
|
|
4
|
+
import { n as B, a as V, b as N, f as H, X as x, e as b, S as X, F as K } from "./index-CnGox6Xr.js";
|
|
5
|
+
import { useMemo as g, useEffect as L, useState as j, useRef as T } from "react";
|
|
6
|
+
import * as d from "three";
|
|
7
|
+
import { p as q, S as J, a as Q, L as Z, R as $, b as ee, c as te, O as re, I as ae } from "./landmarkMask-CbTFzBYG.js";
|
|
8
|
+
import { useFrame as S } from "@react-three/fiber";
|
|
9
|
+
import { a as w, u as se } from "./selectors-C5G1PMYL.js";
|
|
10
|
+
import { u as U, s as z } from "./index-CsUdQ-pn.js";
|
|
11
|
+
const ne = {
|
|
12
|
+
left: {
|
|
13
|
+
/** Iris center. */
|
|
14
|
+
center: 473,
|
|
15
|
+
/** Iris ring: outer, top, inner, bottom (image order: right, up, left, down for the left eye). */
|
|
16
|
+
ring: [474, 475, 476, 477],
|
|
17
|
+
innerCorner: 362,
|
|
18
|
+
outerCorner: 263,
|
|
19
|
+
upperLid: 386,
|
|
20
|
+
lowerLid: 374
|
|
21
|
+
},
|
|
22
|
+
right: {
|
|
23
|
+
center: 468,
|
|
24
|
+
ring: [469, 470, 471, 472],
|
|
25
|
+
innerCorner: 133,
|
|
26
|
+
outerCorner: 33,
|
|
27
|
+
upperLid: 159,
|
|
28
|
+
lowerLid: 145
|
|
29
|
+
}
|
|
30
|
+
}, oe = 478, ie = 0.2, p = () => ({ x: 0, y: 0, z: 0 }), A = (e) => ({
|
|
31
|
+
side: e,
|
|
32
|
+
detected: !1,
|
|
33
|
+
center: p(),
|
|
34
|
+
trackerCenter: { x: 0, y: 0, z: 0 },
|
|
35
|
+
ring: [p(), p(), p(), p()],
|
|
36
|
+
radius: 0,
|
|
37
|
+
eyeCenter: p(),
|
|
38
|
+
eyeWidth: 0,
|
|
39
|
+
openness: 0,
|
|
40
|
+
offset: { x: 0, y: 0 },
|
|
41
|
+
confidence: 0
|
|
42
|
+
}), Ne = (e = 0) => ({
|
|
43
|
+
version: 0,
|
|
44
|
+
timestampMs: 0,
|
|
45
|
+
faceIndex: e,
|
|
46
|
+
detected: !1,
|
|
47
|
+
held: !1,
|
|
48
|
+
confidence: 1,
|
|
49
|
+
left: A("left"),
|
|
50
|
+
right: A("right")
|
|
51
|
+
}), C = (e, r) => {
|
|
52
|
+
e.x = r.x, e.y = r.y, e.z = r.z;
|
|
53
|
+
}, I = (e) => Math.max(-1, Math.min(1, e)), O = (e, r, t, s = 1, a = !1) => {
|
|
54
|
+
const n = ne[r];
|
|
55
|
+
if (!e || e.length < oe)
|
|
56
|
+
return t.detected = !1, t.confidence = 0, !1;
|
|
57
|
+
const o = e[n.center];
|
|
58
|
+
C(t.center, o), B(o, t.trackerCenter);
|
|
59
|
+
for (let f = 0; f < 4; f += 1) C(t.ring[f], e[n.ring[f]]);
|
|
60
|
+
t.radius = Math.abs(t.ring[0].x - t.ring[2].x) / 2;
|
|
61
|
+
const c = e[n.innerCorner], i = e[n.outerCorner];
|
|
62
|
+
t.eyeCenter.x = (c.x + i.x) / 2, t.eyeCenter.y = (c.y + i.y) / 2, t.eyeCenter.z = (c.z + i.z) / 2, t.eyeWidth = Math.hypot(c.x - i.x, c.y - i.y);
|
|
63
|
+
const u = Math.abs(e[n.lowerLid].y - e[n.upperLid].y);
|
|
64
|
+
t.openness = t.eyeWidth > 0 ? u / t.eyeWidth : 0;
|
|
65
|
+
const l = t.eyeWidth / 2, h = a ? -1 : 1;
|
|
66
|
+
return t.offset.x = l > 0 ? I(h * (o.x - t.eyeCenter.x) / l) : 0, t.offset.y = l > 0 ? I((t.eyeCenter.y - o.y) / l) : 0, t.detected = !0, t.confidence = Math.max(0, Math.min(1, t.openness / ie)) * s, !0;
|
|
67
|
+
}, Le = (e, r, t, s = {}) => {
|
|
68
|
+
const a = s.held ?? !1, n = s.faceConfidence ?? (a ? 0 : 1), o = s.mirrored ?? !1;
|
|
69
|
+
e.faceIndex = s.faceIndex ?? e.faceIndex;
|
|
70
|
+
const c = O(r, "left", e.left, n, o), i = O(r, "right", e.right, n, o);
|
|
71
|
+
return e.detected = c && i, e.held = e.detected && a, e.confidence = e.detected ? n : 0, e.timestampMs = t, e.version += 1, e;
|
|
72
|
+
}, ce = () => ({ x: 0, y: 0, z: 0, vx: 0, vy: 0, vz: 0, sampleMs: 0, seen: !1 });
|
|
73
|
+
class Ue {
|
|
74
|
+
constructor(r = 250) {
|
|
75
|
+
y(this, "slots", {});
|
|
76
|
+
y(this, "maxGapMs");
|
|
77
|
+
this.maxGapMs = r;
|
|
78
|
+
}
|
|
79
|
+
reset() {
|
|
80
|
+
this.slots = {};
|
|
81
|
+
}
|
|
82
|
+
/** Record a fresh inference sample for `key` (e.g. "left"). */
|
|
83
|
+
observe(r, t, s) {
|
|
84
|
+
const a = this.slots[r] ?? (this.slots[r] = ce()), n = (s - a.sampleMs) / 1e3;
|
|
85
|
+
a.seen && n > 0 && n * 1e3 <= this.maxGapMs ? (a.vx = 0.5 * a.vx + 0.5 * ((t.x - a.x) / n), a.vy = 0.5 * a.vy + 0.5 * ((t.y - a.y) / n), a.vz = 0.5 * a.vz + 0.5 * ((t.z - a.z) / n)) : (a.vx = 0, a.vy = 0, a.vz = 0), a.x = t.x, a.y = t.y, a.z = t.z, a.sampleMs = s, a.seen = !0;
|
|
86
|
+
}
|
|
87
|
+
/** Write the extrapolated position of `key` into `out`; a no-op before the first sample. */
|
|
88
|
+
apply(r, t, s, a) {
|
|
89
|
+
const n = this.slots[r];
|
|
90
|
+
if (!n || !n.seen || s <= 0) return a;
|
|
91
|
+
const o = Math.max(0, Math.min(t - n.sampleMs, s)) / 1e3;
|
|
92
|
+
return a.x = n.x + n.vx * o, a.y = n.y + n.vy * o, a.z = n.z + n.vz * o, a;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const D = (e = 1, r = 1) => {
|
|
96
|
+
const t = new d.DataTexture(
|
|
97
|
+
new Uint8Array(e * r),
|
|
98
|
+
e,
|
|
99
|
+
r,
|
|
100
|
+
d.RedFormat,
|
|
101
|
+
d.UnsignedByteType
|
|
102
|
+
);
|
|
103
|
+
return t.minFilter = d.NearestFilter, t.magFilter = d.NearestFilter, t.generateMipmaps = !1, t.flipY = !1, t.unpackAlignment = 1, t.needsUpdate = !0, t;
|
|
104
|
+
}, le = (e, r) => {
|
|
105
|
+
const t = e.image;
|
|
106
|
+
if (t.width !== r.width || t.height !== r.height) {
|
|
107
|
+
e.dispose();
|
|
108
|
+
const s = D(r.width, r.height);
|
|
109
|
+
return s.image.data.set(r.indices), s.needsUpdate = !0, s;
|
|
110
|
+
}
|
|
111
|
+
return t.data.set(r.indices), e.needsUpdate = !0, e;
|
|
112
|
+
}, ze = (e) => {
|
|
113
|
+
const r = g(
|
|
114
|
+
() => ({ texture: D(), version: -1, mask: null }),
|
|
115
|
+
[]
|
|
116
|
+
);
|
|
117
|
+
return L(() => () => r.texture.dispose(), [r]), { holder: r, sync: () => (e && (r.mask !== e || r.version !== e.version) && (r.texture = le(r.texture, e), r.mask = e, r.version = e.version), r.texture) };
|
|
118
|
+
}, ue = ({
|
|
119
|
+
space: e = "feed",
|
|
120
|
+
mirrored: r = !1,
|
|
121
|
+
maskWidth: t,
|
|
122
|
+
maskHeight: s,
|
|
123
|
+
feedWidth: a,
|
|
124
|
+
feedHeight: n,
|
|
125
|
+
zoom: o = 1
|
|
126
|
+
}, c = new d.Matrix3()) => {
|
|
127
|
+
let i = 1, u = 1;
|
|
128
|
+
if (e === "source") {
|
|
129
|
+
const m = V(
|
|
130
|
+
{ width: t, height: s },
|
|
131
|
+
{ width: a, height: n },
|
|
132
|
+
"cover",
|
|
133
|
+
o
|
|
134
|
+
);
|
|
135
|
+
m && (i = a / m.drawWidth, u = n / m.drawHeight);
|
|
136
|
+
}
|
|
137
|
+
const l = r ? -i : i, h = 0.5 - 0.5 * l, f = -u, v = 0.5 + 0.5 * u;
|
|
138
|
+
return c.set(l, 0, h, 0, f, v, 0, 0, 1);
|
|
139
|
+
}, de = 4, fe = `
|
|
140
|
+
varying vec2 vUv;
|
|
141
|
+
void main() {
|
|
142
|
+
vUv = uv;
|
|
143
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
144
|
+
}`, he = `
|
|
145
|
+
uniform sampler2D cameraTexture;
|
|
146
|
+
uniform sampler2D maskTexture;
|
|
147
|
+
uniform sampler2D designTexture;
|
|
148
|
+
uniform float useDesign;
|
|
149
|
+
uniform vec4 labels;
|
|
150
|
+
uniform float labelCount;
|
|
151
|
+
uniform float invert;
|
|
152
|
+
uniform vec3 tint;
|
|
153
|
+
uniform float opacity;
|
|
154
|
+
uniform float blendMode;
|
|
155
|
+
uniform float feather;
|
|
156
|
+
uniform vec2 maskTexel;
|
|
157
|
+
uniform mat3 maskTransform;
|
|
158
|
+
varying vec2 vUv;
|
|
159
|
+
|
|
160
|
+
float member(vec2 uv) {
|
|
161
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 0.0;
|
|
162
|
+
float index = floor(texture2D(maskTexture, uv).r * 255.0 + 0.5);
|
|
163
|
+
float m = 0.0;
|
|
164
|
+
if (labelCount > 0.5 && abs(index - labels.x) < 0.5) m = 1.0;
|
|
165
|
+
if (labelCount > 1.5 && abs(index - labels.y) < 0.5) m = 1.0;
|
|
166
|
+
if (labelCount > 2.5 && abs(index - labels.z) < 0.5) m = 1.0;
|
|
167
|
+
if (labelCount > 3.5 && abs(index - labels.w) < 0.5) m = 1.0;
|
|
168
|
+
return invert > 0.5 ? 1.0 - m : m;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
void main() {
|
|
172
|
+
vec2 maskUv = (maskTransform * vec3(vUv, 1.0)).xy;
|
|
173
|
+
float coverage;
|
|
174
|
+
if (feather > 0.0) {
|
|
175
|
+
vec2 step = maskTexel * feather;
|
|
176
|
+
coverage = 0.0;
|
|
177
|
+
for (int y = -1; y <= 1; y++) {
|
|
178
|
+
for (int x = -1; x <= 1; x++) {
|
|
179
|
+
coverage += member(maskUv + vec2(float(x), float(y)) * step);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
coverage /= 9.0;
|
|
183
|
+
} else {
|
|
184
|
+
coverage = member(maskUv);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
vec3 base = texture2D(cameraTexture, vUv).rgb;
|
|
188
|
+
vec4 design = useDesign > 0.5 ? texture2D(designTexture, vUv) : vec4(1.0);
|
|
189
|
+
vec3 paint = tint * design.rgb;
|
|
190
|
+
vec3 blended = blendMode < 0.5
|
|
191
|
+
? paint
|
|
192
|
+
: blendMode < 1.5
|
|
193
|
+
? base * paint
|
|
194
|
+
: blendMode < 2.5
|
|
195
|
+
? 1.0 - (1.0 - base) * (1.0 - paint)
|
|
196
|
+
: mix(2.0 * base * paint, 1.0 - 2.0 * (1.0 - base) * (1.0 - paint), step(0.5, base));
|
|
197
|
+
|
|
198
|
+
gl_FragColor = vec4(blended, coverage * opacity * design.a);
|
|
199
|
+
#include <colorspace_fragment>
|
|
200
|
+
}`;
|
|
201
|
+
let M = null;
|
|
202
|
+
const F = () => (M || (M = new d.DataTexture(new Uint8Array([255, 255, 255, 255]), 1, 1), M.needsUpdate = !0), M), ve = () => {
|
|
203
|
+
const e = {
|
|
204
|
+
cameraTexture: { value: null },
|
|
205
|
+
maskTexture: { value: null },
|
|
206
|
+
designTexture: { value: F() },
|
|
207
|
+
useDesign: { value: 0 },
|
|
208
|
+
labels: { value: new d.Vector4(-1, -1, -1, -1) },
|
|
209
|
+
labelCount: { value: 0 },
|
|
210
|
+
invert: { value: 0 },
|
|
211
|
+
tint: { value: new d.Color() },
|
|
212
|
+
opacity: { value: 1 },
|
|
213
|
+
blendMode: { value: 0 },
|
|
214
|
+
feather: { value: 0 },
|
|
215
|
+
maskTexel: { value: new d.Vector2(1, 1) },
|
|
216
|
+
maskTransform: { value: new d.Matrix3() }
|
|
217
|
+
};
|
|
218
|
+
return new d.ShaderMaterial({
|
|
219
|
+
uniforms: e,
|
|
220
|
+
vertexShader: fe,
|
|
221
|
+
fragmentShader: he,
|
|
222
|
+
transparent: !0,
|
|
223
|
+
depthTest: !1,
|
|
224
|
+
depthWrite: !1,
|
|
225
|
+
toneMapped: !1,
|
|
226
|
+
side: d.DoubleSide
|
|
227
|
+
});
|
|
228
|
+
}, me = (e, r) => q(r).map((t) => e ? e.labels.indexOf(t) : -1).filter((t) => t >= 0).slice(0, de), pe = (e, r) => e && e.version > 0 ? me(e, r) : [], xe = (e, {
|
|
229
|
+
cameraTexture: r,
|
|
230
|
+
maskTexture: t,
|
|
231
|
+
mask: s,
|
|
232
|
+
settings: a,
|
|
233
|
+
designTexture: n = null,
|
|
234
|
+
feedWidth: o = 0,
|
|
235
|
+
feedHeight: c = 0
|
|
236
|
+
}) => {
|
|
237
|
+
const i = e.uniforms, u = pe(s, a.label);
|
|
238
|
+
i.cameraTexture.value = r, i.maskTexture.value = t, i.designTexture.value = n ?? F(), i.useDesign.value = n ? 1 : 0, i.labels.value.set(u[0] ?? -1, u[1] ?? -1, u[2] ?? -1, u[3] ?? -1), i.labelCount.value = u.length, i.invert.value = a.invert ? 1 : 0, i.tint.value.set(a.color), i.opacity.value = a.opacity, i.blendMode.value = J.indexOf(a.blendMode), i.feather.value = a.feather;
|
|
239
|
+
const l = (s == null ? void 0 : s.width) ?? 1, h = (s == null ? void 0 : s.height) ?? 1;
|
|
240
|
+
return i.maskTexel.value.set(1 / l, 1 / h), ue(
|
|
241
|
+
{
|
|
242
|
+
space: (s == null ? void 0 : s.space) ?? "feed",
|
|
243
|
+
mirrored: a.mirrored,
|
|
244
|
+
maskWidth: l,
|
|
245
|
+
maskHeight: h,
|
|
246
|
+
feedWidth: o,
|
|
247
|
+
feedHeight: c
|
|
248
|
+
},
|
|
249
|
+
i.maskTransform.value
|
|
250
|
+
), e;
|
|
251
|
+
}, De = (e) => {
|
|
252
|
+
const r = g(ve, []);
|
|
253
|
+
return L(() => () => r.dispose(), [r]), xe(r, e), r;
|
|
254
|
+
}, ge = ["bg", "face_skin", "brows", "eyes", "lips", "mouth"], Me = [
|
|
255
|
+
{ label: "face_skin", polygons: [Q] },
|
|
256
|
+
{ label: "brows", polygons: [Z, $] },
|
|
257
|
+
{ label: "eyes", polygons: [ee, te] },
|
|
258
|
+
{ label: "lips", polygons: [re] },
|
|
259
|
+
{ label: "mouth", polygons: [ae] }
|
|
260
|
+
], Te = (e, r, { regions: t, clear: s = !0 } = {}, a = []) => {
|
|
261
|
+
s && N(e), Me.forEach(({ label: n, polygons: o }) => {
|
|
262
|
+
if (t && !t.includes(n)) return;
|
|
263
|
+
const c = e.labels.indexOf(n);
|
|
264
|
+
c < 0 || o.forEach(
|
|
265
|
+
(i) => H(e, r, i, c, a)
|
|
266
|
+
);
|
|
267
|
+
});
|
|
268
|
+
}, Ee = (e) => {
|
|
269
|
+
const r = e == null ? void 0 : e.image, t = (r == null ? void 0 : r.width) ?? 0, s = (r == null ? void 0 : r.height) ?? 0;
|
|
270
|
+
return t > 0 && s > 0 ? { width: t, height: s } : { width: 1, height: 1 };
|
|
271
|
+
}, ye = (e, r) => {
|
|
272
|
+
const t = r / Math.max(e.width, e.height, 1);
|
|
273
|
+
return {
|
|
274
|
+
width: Math.max(1, Math.round(e.width * t)),
|
|
275
|
+
height: Math.max(1, Math.round(e.height * t))
|
|
276
|
+
};
|
|
277
|
+
}, Fe = ({
|
|
278
|
+
faceIndex: e = "all",
|
|
279
|
+
regions: r,
|
|
280
|
+
resolution: t = 256,
|
|
281
|
+
maxUpdateFps: s,
|
|
282
|
+
holdMs: a = 250,
|
|
283
|
+
predictMs: n = 0
|
|
284
|
+
} = {}) => {
|
|
285
|
+
const o = w(x.FACE_TRACKER), c = se(), i = Ee(c), u = ye(i, t), l = g(
|
|
286
|
+
() => b(u.width, u.height, ge),
|
|
287
|
+
[u.width, u.height]
|
|
288
|
+
), h = T([]), f = T(-1 / 0), v = T(null);
|
|
289
|
+
v.current || (v.current = new K({ holdMs: a, predictMs: n }));
|
|
290
|
+
const m = v.current;
|
|
291
|
+
return m.setOptions({ holdMs: a, predictMs: n }), S((E) => {
|
|
292
|
+
var _;
|
|
293
|
+
if (z(E.clock.elapsedTime, f.current, s)) return;
|
|
294
|
+
f.current = E.clock.elapsedTime;
|
|
295
|
+
const R = ((_ = o == null ? void 0 : o.detectionResults) == null ? void 0 : _.faceLandmarks) ?? [], G = e === "all" ? R : [R[e] ?? []], k = m.update(G, E.clock.elapsedTime * 1e3);
|
|
296
|
+
N(l), k.forEach(
|
|
297
|
+
(P) => Te(l, P, { regions: r, clear: !1 }, h.current)
|
|
298
|
+
), l.version += 1;
|
|
299
|
+
}), l;
|
|
300
|
+
}, be = ["bg", "person"], Ge = ({
|
|
301
|
+
maxUpdateFps: e = 15,
|
|
302
|
+
active: r = !0
|
|
303
|
+
} = {}) => {
|
|
304
|
+
U(x.BACKGROUND_SEGMENTATION, { type: "portrait" }, r);
|
|
305
|
+
const t = w(x.BACKGROUND_SEGMENTATION), s = g(() => b(1, 1, be), []), a = T(-1 / 0);
|
|
306
|
+
return S((n) => {
|
|
307
|
+
var u;
|
|
308
|
+
if (z(n.clock.elapsedTime, a.current, e)) return;
|
|
309
|
+
const o = (u = t == null ? void 0 : t.getRawSegmentationData) == null ? void 0 : u.call(t);
|
|
310
|
+
if (!(o != null && o.maskData) || o.width <= 0 || o.height <= 0) return;
|
|
311
|
+
a.current = n.clock.elapsedTime, (s.width !== o.width || s.height !== o.height) && (s.width = o.width, s.height = o.height, s.indices = new Uint8Array(o.width * o.height));
|
|
312
|
+
const c = o.maskData, i = s.indices;
|
|
313
|
+
for (let l = 0; l < i.length; l += 1) i[l] = c[l] > 127 ? 0 : 1;
|
|
314
|
+
s.version += 1;
|
|
315
|
+
}), s;
|
|
316
|
+
}, Se = ({
|
|
317
|
+
active: e = !0,
|
|
318
|
+
...r
|
|
319
|
+
} = {}) => {
|
|
320
|
+
const { ready: t, error: s } = U(
|
|
321
|
+
x.SEMANTIC_SEGMENTATION,
|
|
322
|
+
r,
|
|
323
|
+
e
|
|
324
|
+
), a = w(x.SEMANTIC_SEGMENTATION), n = r.preset ?? "hair", o = g(
|
|
325
|
+
() => b(1, 1, X[n].labels),
|
|
326
|
+
[n]
|
|
327
|
+
), [c, i] = j({ status: "loading", error: null });
|
|
328
|
+
S(() => {
|
|
329
|
+
const f = (a == null ? void 0 : a.getStatus()) ?? "loading", v = (a == null ? void 0 : a.getError()) ?? null;
|
|
330
|
+
(f !== c.status || v !== c.error) && i({ status: f, error: v });
|
|
331
|
+
});
|
|
332
|
+
const u = (a == null ? void 0 : a.getMask()) ?? o, l = s ?? c.error, h = l ? "error" : t ? c.status : "loading";
|
|
333
|
+
return { mask: u, status: h, error: l, labels: u.labels };
|
|
334
|
+
}, ke = (e = {}) => Se({ ...e, preset: "hair" });
|
|
335
|
+
export {
|
|
336
|
+
ge as F,
|
|
337
|
+
Ue as I,
|
|
338
|
+
de as M,
|
|
339
|
+
be as P,
|
|
340
|
+
he as S,
|
|
341
|
+
ze as a,
|
|
342
|
+
De as b,
|
|
343
|
+
Ne as c,
|
|
344
|
+
Fe as d,
|
|
345
|
+
ke as e,
|
|
346
|
+
Ge as f,
|
|
347
|
+
Se as g,
|
|
348
|
+
ne as h,
|
|
349
|
+
oe as i,
|
|
350
|
+
ie as j,
|
|
351
|
+
O as k,
|
|
352
|
+
A as l,
|
|
353
|
+
fe as m,
|
|
354
|
+
ve as n,
|
|
355
|
+
me as o,
|
|
356
|
+
xe as p,
|
|
357
|
+
D as q,
|
|
358
|
+
pe as r,
|
|
359
|
+
le as s,
|
|
360
|
+
ye as t,
|
|
361
|
+
Le as u,
|
|
362
|
+
Me as v,
|
|
363
|
+
ue as w,
|
|
364
|
+
Te as x
|
|
365
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";var te=Object.defineProperty;var re=(e,r,t)=>r in e?te(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var R=(e,r,t)=>re(e,typeof r!="symbol"?r+"":r,t);const d=require("./index-CeVkgsag.cjs"),h=require("react"),ne=require("three"),M=require("./landmarkMask-u7es2k4X.cjs"),A=require("@react-three/fiber"),T=require("./selectors-Du_PsVnW.cjs"),S=require("./index-OCPjOaeP.cjs");function ae(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const f=ae(ne),C={left:{center:473,ring:[474,475,476,477],innerCorner:362,outerCorner:263,upperLid:386,lowerLid:374},right:{center:468,ring:[469,470,471,472],innerCorner:133,outerCorner:33,upperLid:159,lowerLid:145}},U=478,k=.2,g=()=>({x:0,y:0,z:0}),b=e=>({side:e,detected:!1,center:g(),trackerCenter:{x:0,y:0,z:0},ring:[g(),g(),g(),g()],radius:0,eyeCenter:g(),eyeWidth:0,openness:0,offset:{x:0,y:0},confidence:0}),se=(e=0)=>({version:0,timestampMs:0,faceIndex:e,detected:!1,held:!1,confidence:1,left:b("left"),right:b("right")}),L=(e,r)=>{e.x=r.x,e.y=r.y,e.z=r.z},w=e=>Math.max(-1,Math.min(1,e)),_=(e,r,t,a=1,n=!1)=>{const s=C[r];if(!e||e.length<U)return t.detected=!1,t.confidence=0,!1;const i=e[s.center];L(t.center,i),d.normalizedTrackerPointToTrackerPoint(i,t.trackerCenter);for(let v=0;v<4;v+=1)L(t.ring[v],e[s.ring[v]]);t.radius=Math.abs(t.ring[0].x-t.ring[2].x)/2;const c=e[s.innerCorner],o=e[s.outerCorner];t.eyeCenter.x=(c.x+o.x)/2,t.eyeCenter.y=(c.y+o.y)/2,t.eyeCenter.z=(c.z+o.z)/2,t.eyeWidth=Math.hypot(c.x-o.x,c.y-o.y);const u=Math.abs(e[s.lowerLid].y-e[s.upperLid].y);t.openness=t.eyeWidth>0?u/t.eyeWidth:0;const l=t.eyeWidth/2,m=n?-1:1;return t.offset.x=l>0?w(m*(i.x-t.eyeCenter.x)/l):0,t.offset.y=l>0?w((t.eyeCenter.y-i.y)/l):0,t.detected=!0,t.confidence=Math.max(0,Math.min(1,t.openness/k))*a,!0},ie=(e,r,t,a={})=>{const n=a.held??!1,s=a.faceConfidence??(n?0:1),i=a.mirrored??!1;e.faceIndex=a.faceIndex??e.faceIndex;const c=_(r,"left",e.left,s,i),o=_(r,"right",e.right,s,i);return e.detected=c&&o,e.held=e.detected&&n,e.confidence=e.detected?s:0,e.timestampMs=t,e.version+=1,e},oe=()=>({x:0,y:0,z:0,vx:0,vy:0,vz:0,sampleMs:0,seen:!1});class ce{constructor(r=250){R(this,"slots",{});R(this,"maxGapMs");this.maxGapMs=r}reset(){this.slots={}}observe(r,t,a){const n=this.slots[r]??(this.slots[r]=oe()),s=(a-n.sampleMs)/1e3;n.seen&&s>0&&s*1e3<=this.maxGapMs?(n.vx=.5*n.vx+.5*((t.x-n.x)/s),n.vy=.5*n.vy+.5*((t.y-n.y)/s),n.vz=.5*n.vz+.5*((t.z-n.z)/s)):(n.vx=0,n.vy=0,n.vz=0),n.x=t.x,n.y=t.y,n.z=t.z,n.sampleMs=a,n.seen=!0}apply(r,t,a,n){const s=this.slots[r];if(!s||!s.seen||a<=0)return n;const i=Math.max(0,Math.min(t-s.sampleMs,a))/1e3;return n.x=s.x+s.vx*i,n.y=s.y+s.vy*i,n.z=s.z+s.vz*i,n}}const O=(e=1,r=1)=>{const t=new f.DataTexture(new Uint8Array(e*r),e,r,f.RedFormat,f.UnsignedByteType);return t.minFilter=f.NearestFilter,t.magFilter=f.NearestFilter,t.generateMipmaps=!1,t.flipY=!1,t.unpackAlignment=1,t.needsUpdate=!0,t},D=(e,r)=>{const t=e.image;if(t.width!==r.width||t.height!==r.height){e.dispose();const a=O(r.width,r.height);return a.image.data.set(r.indices),a.needsUpdate=!0,a}return t.data.set(r.indices),e.needsUpdate=!0,e},le=e=>{const r=h.useMemo(()=>({texture:O(),version:-1,mask:null}),[]);return h.useEffect(()=>()=>r.texture.dispose(),[r]),{holder:r,sync:()=>(e&&(r.mask!==e||r.version!==e.version)&&(r.texture=D(r.texture,e),r.mask=e,r.version=e.version),r.texture)}},z=({space:e="feed",mirrored:r=!1,maskWidth:t,maskHeight:a,feedWidth:n,feedHeight:s,zoom:i=1},c=new f.Matrix3)=>{let o=1,u=1;if(e==="source"){const E=d.computeFitLayout({width:t,height:a},{width:n,height:s},"cover",i);E&&(o=n/E.drawWidth,u=s/E.drawHeight)}const l=r?-o:o,m=.5-.5*l,v=-u,p=.5+.5*u;return c.set(l,0,m,0,v,p,0,0,1)},F=4,G=`
|
|
2
|
+
varying vec2 vUv;
|
|
3
|
+
void main() {
|
|
4
|
+
vUv = uv;
|
|
5
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
6
|
+
}`,P=`
|
|
7
|
+
uniform sampler2D cameraTexture;
|
|
8
|
+
uniform sampler2D maskTexture;
|
|
9
|
+
uniform sampler2D designTexture;
|
|
10
|
+
uniform float useDesign;
|
|
11
|
+
uniform vec4 labels;
|
|
12
|
+
uniform float labelCount;
|
|
13
|
+
uniform float invert;
|
|
14
|
+
uniform vec3 tint;
|
|
15
|
+
uniform float opacity;
|
|
16
|
+
uniform float blendMode;
|
|
17
|
+
uniform float feather;
|
|
18
|
+
uniform vec2 maskTexel;
|
|
19
|
+
uniform mat3 maskTransform;
|
|
20
|
+
varying vec2 vUv;
|
|
21
|
+
|
|
22
|
+
float member(vec2 uv) {
|
|
23
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 0.0;
|
|
24
|
+
float index = floor(texture2D(maskTexture, uv).r * 255.0 + 0.5);
|
|
25
|
+
float m = 0.0;
|
|
26
|
+
if (labelCount > 0.5 && abs(index - labels.x) < 0.5) m = 1.0;
|
|
27
|
+
if (labelCount > 1.5 && abs(index - labels.y) < 0.5) m = 1.0;
|
|
28
|
+
if (labelCount > 2.5 && abs(index - labels.z) < 0.5) m = 1.0;
|
|
29
|
+
if (labelCount > 3.5 && abs(index - labels.w) < 0.5) m = 1.0;
|
|
30
|
+
return invert > 0.5 ? 1.0 - m : m;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
void main() {
|
|
34
|
+
vec2 maskUv = (maskTransform * vec3(vUv, 1.0)).xy;
|
|
35
|
+
float coverage;
|
|
36
|
+
if (feather > 0.0) {
|
|
37
|
+
vec2 step = maskTexel * feather;
|
|
38
|
+
coverage = 0.0;
|
|
39
|
+
for (int y = -1; y <= 1; y++) {
|
|
40
|
+
for (int x = -1; x <= 1; x++) {
|
|
41
|
+
coverage += member(maskUv + vec2(float(x), float(y)) * step);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
coverage /= 9.0;
|
|
45
|
+
} else {
|
|
46
|
+
coverage = member(maskUv);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
vec3 base = texture2D(cameraTexture, vUv).rgb;
|
|
50
|
+
vec4 design = useDesign > 0.5 ? texture2D(designTexture, vUv) : vec4(1.0);
|
|
51
|
+
vec3 paint = tint * design.rgb;
|
|
52
|
+
vec3 blended = blendMode < 0.5
|
|
53
|
+
? paint
|
|
54
|
+
: blendMode < 1.5
|
|
55
|
+
? base * paint
|
|
56
|
+
: blendMode < 2.5
|
|
57
|
+
? 1.0 - (1.0 - base) * (1.0 - paint)
|
|
58
|
+
: mix(2.0 * base * paint, 1.0 - 2.0 * (1.0 - base) * (1.0 - paint), step(0.5, base));
|
|
59
|
+
|
|
60
|
+
gl_FragColor = vec4(blended, coverage * opacity * design.a);
|
|
61
|
+
#include <colorspace_fragment>
|
|
62
|
+
}`;let x=null;const X=()=>(x||(x=new f.DataTexture(new Uint8Array([255,255,255,255]),1,1),x.needsUpdate=!0),x),Y=()=>{const e={cameraTexture:{value:null},maskTexture:{value:null},designTexture:{value:X()},useDesign:{value:0},labels:{value:new f.Vector4(-1,-1,-1,-1)},labelCount:{value:0},invert:{value:0},tint:{value:new f.Color},opacity:{value:1},blendMode:{value:0},feather:{value:0},maskTexel:{value:new f.Vector2(1,1)},maskTransform:{value:new f.Matrix3}};return new f.ShaderMaterial({uniforms:e,vertexShader:G,fragmentShader:P,transparent:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,side:f.DoubleSide})},V=(e,r)=>M.parseOverlayLabels(r).map(t=>e?e.labels.indexOf(t):-1).filter(t=>t>=0).slice(0,F),B=(e,r)=>e&&e.version>0?V(e,r):[],H=(e,{cameraTexture:r,maskTexture:t,mask:a,settings:n,designTexture:s=null,feedWidth:i=0,feedHeight:c=0})=>{const o=e.uniforms,u=B(a,n.label);o.cameraTexture.value=r,o.maskTexture.value=t,o.designTexture.value=s??X(),o.useDesign.value=s?1:0,o.labels.value.set(u[0]??-1,u[1]??-1,u[2]??-1,u[3]??-1),o.labelCount.value=u.length,o.invert.value=n.invert?1:0,o.tint.value.set(n.color),o.opacity.value=n.opacity,o.blendMode.value=M.SEGMENTATION_OVERLAY_BLEND_MODES.indexOf(n.blendMode),o.feather.value=n.feather;const l=(a==null?void 0:a.width)??1,m=(a==null?void 0:a.height)??1;return o.maskTexel.value.set(1/l,1/m),z({space:(a==null?void 0:a.space)??"feed",mirrored:n.mirrored,maskWidth:l,maskHeight:m,feedWidth:i,feedHeight:c},o.maskTransform.value),e},ue=e=>{const r=h.useMemo(Y,[]);return h.useEffect(()=>()=>r.dispose(),[r]),H(r,e),r},W=["bg","face_skin","brows","eyes","lips","mouth"],K=[{label:"face_skin",polygons:[M.FACE_OVAL]},{label:"brows",polygons:[M.LEFT_EYEBROW,M.RIGHT_EYEBROW]},{label:"eyes",polygons:[M.LEFT_EYE,M.RIGHT_EYE]},{label:"lips",polygons:[M.OUTER_LIPS]},{label:"mouth",polygons:[M.INNER_MOUTH]}],q=(e,r,{regions:t,clear:a=!0}={},n=[])=>{a&&d.clearSemanticMask(e),K.forEach(({label:s,polygons:i})=>{if(t&&!t.includes(s))return;const c=e.labels.indexOf(s);c<0||i.forEach(o=>d.fillLandmarkPolygon(e,r,o,c,n))})},de=e=>{const r=e==null?void 0:e.image,t=(r==null?void 0:r.width)??0,a=(r==null?void 0:r.height)??0;return t>0&&a>0?{width:t,height:a}:{width:1,height:1}},j=(e,r)=>{const t=r/Math.max(e.width,e.height,1);return{width:Math.max(1,Math.round(e.width*t)),height:Math.max(1,Math.round(e.height*t))}},fe=({faceIndex:e="all",regions:r,resolution:t=256,maxUpdateFps:a,holdMs:n=250,predictMs:s=0}={})=>{const i=T.useXRModelNode(d.XRModel.FACE_TRACKER),c=T.useXRCameraTexture(),o=de(c),u=j(o,t),l=h.useMemo(()=>d.createSemanticMask(u.width,u.height,W),[u.width,u.height]),m=h.useRef([]),v=h.useRef(-1/0),p=h.useRef(null);p.current||(p.current=new d.FaceTrackMemory({holdMs:n,predictMs:s}));const E=p.current;return E.setOptions({holdMs:n,predictMs:s}),A.useFrame(y=>{var I;if(S.shouldSkipUpdate(y.clock.elapsedTime,v.current,a))return;v.current=y.clock.elapsedTime;const N=((I=i==null?void 0:i.detectionResults)==null?void 0:I.faceLandmarks)??[],Q=e==="all"?N:[N[e]??[]],Z=E.update(Q,y.clock.elapsedTime*1e3);d.clearSemanticMask(l),Z.forEach(ee=>q(l,ee,{regions:r,clear:!1},m.current)),l.version+=1}),l},$=["bg","person"],ve=({maxUpdateFps:e=15,active:r=!0}={})=>{S.useXRModel(d.XRModel.BACKGROUND_SEGMENTATION,{type:"portrait"},r);const t=T.useXRModelNode(d.XRModel.BACKGROUND_SEGMENTATION),a=h.useMemo(()=>d.createSemanticMask(1,1,$),[]),n=h.useRef(-1/0);return A.useFrame(s=>{var u;if(S.shouldSkipUpdate(s.clock.elapsedTime,n.current,e))return;const i=(u=t==null?void 0:t.getRawSegmentationData)==null?void 0:u.call(t);if(!(i!=null&&i.maskData)||i.width<=0||i.height<=0)return;n.current=s.clock.elapsedTime,(a.width!==i.width||a.height!==i.height)&&(a.width=i.width,a.height=i.height,a.indices=new Uint8Array(i.width*i.height));const c=i.maskData,o=a.indices;for(let l=0;l<o.length;l+=1)o[l]=c[l]>127?0:1;a.version+=1}),a},J=({active:e=!0,...r}={})=>{const{ready:t,error:a}=S.useXRModel(d.XRModel.SEMANTIC_SEGMENTATION,r,e),n=T.useXRModelNode(d.XRModel.SEMANTIC_SEGMENTATION),s=r.preset??"hair",i=h.useMemo(()=>d.createSemanticMask(1,1,d.SEMANTIC_SEGMENTATION_PRESET_SPECS[s].labels),[s]),[c,o]=h.useState({status:"loading",error:null});A.useFrame(()=>{const v=(n==null?void 0:n.getStatus())??"loading",p=(n==null?void 0:n.getError())??null;(v!==c.status||p!==c.error)&&o({status:v,error:p})});const u=(n==null?void 0:n.getMask())??i,l=a??c.error,m=l?"error":t?c.status:"loading";return{mask:u,status:m,error:l,labels:u.labels}},he=(e={})=>J({...e,preset:"hair"});exports.FACE_REGION_LABELS=W;exports.FACE_REGION_POLYGONS=K;exports.IRIS_FULL_OPENNESS=k;exports.IRIS_LANDMARKS=C;exports.IRIS_LANDMARK_COUNT=U;exports.IrisLead=ce;exports.MAX_OVERLAY_LABELS=F;exports.PERSON_MASK_LABELS=$;exports.SEGMENTATION_OVERLAY_FRAGMENT_SHADER=P;exports.SEGMENTATION_OVERLAY_VERTEX_SHADER=G;exports.computeIrisEye=_;exports.computeMaskUvTransform=z;exports.createIrisEye=b;exports.createIrisResult=se;exports.createSegmentationOverlayMaterial=Y;exports.createSemanticMaskTexture=O;exports.rasterizeFaceRegions=q;exports.resolveActiveOverlayLabelIndices=B;exports.resolveMaskSize=j;exports.resolveOverlayLabelIndices=V;exports.updateIrisResult=ie;exports.updateSegmentationOverlayMaterial=H;exports.uploadSemanticMask=D;exports.useFaceRegionMask=fe;exports.useHairMask=he;exports.usePersonMask=ve;exports.useSegmentationOverlayMaterial=ue;exports.useSemanticMaskTexture=le;exports.useSemanticSegmentationMask=J;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { XRQualityConfigInput, XRQualitySignals, XRQualityState } from './types';
|
|
2
|
+
/** Static device signals (memory, cores) read once. */
|
|
3
|
+
export declare const readDeviceSignals: () => Pick<XRQualitySignals, "deviceMemoryGb" | "hardwareConcurrency">;
|
|
4
|
+
export type XRQualityControllerProps = {
|
|
5
|
+
/** Partial config merged over the defaults (`resolveQualityConfig`). */
|
|
6
|
+
config?: XRQualityConfigInput;
|
|
7
|
+
/** Externally supplied thermal state (a native shell can forward the OS value). */
|
|
8
|
+
thermal?: XRQualitySignals["thermal"];
|
|
9
|
+
/**
|
|
10
|
+
* Called whenever a different tier is applied (automatic or manual). The
|
|
11
|
+
* floor-level `signals.thermal === "suspected"` flag changes no tier, so it
|
|
12
|
+
* does not fire this; read `useXRQuality().signals` to react to it.
|
|
13
|
+
*/
|
|
14
|
+
onDecision?: (state: XRQualityState) => void;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Samples main-thread frame time, tracker inference and memory on
|
|
18
|
+
* `budget.sampleMs`, steps the pure controller, publishes the state to the
|
|
19
|
+
* session store and applies the tier: `targetFps` + `analysisScale` through
|
|
20
|
+
* the session perf config, `renderScale` through `<XRScene>` (which reads
|
|
21
|
+
* the state), and `camRes` only when the tier sets `rebindCamera`. Mounted by
|
|
22
|
+
* `<XRProvider>` by default; mount it yourself with `quality={false}` on the
|
|
23
|
+
* provider to place it or configure it differently.
|
|
24
|
+
*/
|
|
25
|
+
export declare const XRQualityController: ({ config, thermal, onDecision }: XRQualityControllerProps) => null;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { XRPerformanceBudget, XRQualityConfig, XRQualityConfigInput, XRQualityReason, XRQualitySignals, XRQualityState, XRQualityTier } from './types';
|
|
2
|
+
export declare const DEFAULT_QUALITY_TIERS: XRQualityTier[];
|
|
3
|
+
export declare const DEFAULT_PERFORMANCE_BUDGET: XRPerformanceBudget;
|
|
4
|
+
export declare const DEFAULT_QUALITY_CONFIG: XRQualityConfig;
|
|
5
|
+
export declare const EMPTY_QUALITY_SIGNALS: XRQualitySignals;
|
|
6
|
+
/** Validate a tier; invalid knobs are dropped, out-of-range ones clamped. */
|
|
7
|
+
export declare const resolveQualityTier: (tier: Partial<XRQualityTier>, index: number) => XRQualityTier;
|
|
8
|
+
export declare const resolvePerformanceBudget: (budget?: Partial<XRPerformanceBudget>) => XRPerformanceBudget;
|
|
9
|
+
/** Validate a partial config into a complete, serializable one. */
|
|
10
|
+
export declare const resolveQualityConfig: (config?: XRQualityConfigInput) => XRQualityConfig;
|
|
11
|
+
/** Starting tier from static device signals: low-memory / few-core devices start one step down. */
|
|
12
|
+
export declare const resolveInitialTierIndex: (config: XRQualityConfig, signals: XRQualitySignals) => number;
|
|
13
|
+
export declare const createQualityState: (config: XRQualityConfig, signals?: XRQualitySignals, now?: number) => XRQualityState;
|
|
14
|
+
/** Why a sample is over budget, most severe first; `null` when within budget. */
|
|
15
|
+
export declare const judgeSample: (signals: XRQualitySignals, budget: XRPerformanceBudget) => Exclude<XRQualityReason, "init" | "recovered" | "manual" | "locked" | "reset"> | null;
|
|
16
|
+
/**
|
|
17
|
+
* One controller step. Pure: returns the next state (same object when
|
|
18
|
+
* nothing changed). Bounded to `[maxTier, minTier]`, hysteretic (streaks),
|
|
19
|
+
* rate-limited (cooldown), reversible (steps back up after `upgradeAfter`
|
|
20
|
+
* good samples), and inert while `locked` or `adaptive: false`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const stepQualityController: (state: XRQualityState, signals: XRQualitySignals, config: XRQualityConfig, now: number) => XRQualityState;
|
|
23
|
+
/** Manual tier selection (does not lock). */
|
|
24
|
+
export declare const setQualityTier: (state: XRQualityState, config: XRQualityConfig, ref: number | string, now: number) => XRQualityState;
|
|
25
|
+
export declare const lockQuality: (state: XRQualityState, config: XRQualityConfig, locked: boolean, now: number) => XRQualityState;
|
|
26
|
+
/**
|
|
27
|
+
* The tier the controller must apply now, or `null` when `lastApplied` is
|
|
28
|
+
* already it. Compares tier identity (the decision may have been written to
|
|
29
|
+
* the store by `useXRQuality().setTier` between two samples, so comparing
|
|
30
|
+
* decisions would miss it).
|
|
31
|
+
*/
|
|
32
|
+
export declare const tierToApply: (state: XRQualityState, lastApplied: XRQualityTier | null) => XRQualityTier | null;
|
|
33
|
+
export declare const resetQuality: (config: XRQualityConfig, signals: XRQualitySignals, now: number) => XRQualityState;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { XRPerformanceBudget, XRQualityConfig, XRQualityConfigInput, XRQualityDecision, XRQualityReason, XRQualitySignals, XRQualityState, XRQualityTier, } from './types';
|
|
2
|
+
export { XRQualityController, readDeviceSignals } from './XRQualityController';
|
|
3
|
+
export type { XRQualityControllerProps } from './XRQualityController';
|
|
4
|
+
export { useXRQuality } from './useXRQuality';
|
|
5
|
+
export type { UseXRQualityResult } from './useXRQuality';
|
|
6
|
+
export { DEFAULT_PERFORMANCE_BUDGET, DEFAULT_QUALITY_CONFIG, DEFAULT_QUALITY_TIERS, EMPTY_QUALITY_SIGNALS, createQualityState, judgeSample, lockQuality, resetQuality, resolveInitialTierIndex, resolvePerformanceBudget, resolveQualityConfig, resolveQualityTier, setQualityTier, stepQualityController, tierToApply, } from './controller';
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One quality level. Every knob is optional; an omitted knob keeps the
|
|
3
|
+
* session's own value. Tiers are plain JSON so they can be persisted.
|
|
4
|
+
*/
|
|
5
|
+
export type XRQualityTier = {
|
|
6
|
+
name: string;
|
|
7
|
+
/** Inference cap applied to every tracker without its own `targetFps`. */
|
|
8
|
+
targetFps?: number;
|
|
9
|
+
/** Multiplier on the renderer's device pixel ratio cap (0.25..1). */
|
|
10
|
+
renderScale?: number;
|
|
11
|
+
/** Multiplier on every model's analysis resolution (0.25..1). */
|
|
12
|
+
analysisScale?: number;
|
|
13
|
+
/** Camera capture width; applied only when `rebindCamera` is true (a rebind re-opens the camera). */
|
|
14
|
+
camRes?: number;
|
|
15
|
+
/** Allow this tier to re-open the webcam to apply `camRes`. Default false. */
|
|
16
|
+
rebindCamera?: boolean;
|
|
17
|
+
};
|
|
18
|
+
/** Thresholds the controller judges samples against. Plain JSON. */
|
|
19
|
+
export type XRPerformanceBudget = {
|
|
20
|
+
/** Frame time above which a sample is "bad" (ms). Default 1000 / 24. */
|
|
21
|
+
maxFrameMs: number;
|
|
22
|
+
/** Total tracker inference per frame above which a sample is "bad" (ms). Default 24. */
|
|
23
|
+
maxInferenceMs: number;
|
|
24
|
+
/** JS heap usage above which a sample is "bad" (MB); `null` ignores memory. Default null. */
|
|
25
|
+
maxMemoryMb: number | null;
|
|
26
|
+
/** Sampling period (ms). Default 1000. */
|
|
27
|
+
sampleMs: number;
|
|
28
|
+
/** Consecutive bad samples before stepping down. Default 2. */
|
|
29
|
+
downgradeAfter: number;
|
|
30
|
+
/** Consecutive good samples (frame time under `maxFrameMs × upgradeHeadroom`) before stepping up. Default 6. */
|
|
31
|
+
upgradeAfter: number;
|
|
32
|
+
/** A "good" sample must leave this much headroom (0..1 of `maxFrameMs`). Default 0.75. */
|
|
33
|
+
upgradeHeadroom: number;
|
|
34
|
+
/** Minimum time between two automatic changes (ms). Default 4000. */
|
|
35
|
+
cooldownMs: number;
|
|
36
|
+
};
|
|
37
|
+
/** What the controller measured in one sample. */
|
|
38
|
+
export type XRQualitySignals = {
|
|
39
|
+
/** Mean main-thread frame time over the sample (ms); `null` before the first sample. */
|
|
40
|
+
frameMs: number | null;
|
|
41
|
+
/** Frames per second over the sample. */
|
|
42
|
+
fps: number | null;
|
|
43
|
+
/** Sum of the last inference of every running model (ms). */
|
|
44
|
+
inferenceMs: number | null;
|
|
45
|
+
/** Feed frames per second the session blitted. */
|
|
46
|
+
feedFps: number | null;
|
|
47
|
+
/** JS heap in use (MB) where `performance.memory` exists. */
|
|
48
|
+
memoryMb: number | null;
|
|
49
|
+
/** `navigator.deviceMemory` (GB) where exposed. */
|
|
50
|
+
deviceMemoryGb: number | null;
|
|
51
|
+
hardwareConcurrency: number | null;
|
|
52
|
+
/**
|
|
53
|
+
* Thermal state. Browsers expose none, so this is `"unknown"` unless the
|
|
54
|
+
* app supplies one (a native shell can); `"suspected"` is set by the
|
|
55
|
+
* controller when frame time keeps degrading at the lowest tier.
|
|
56
|
+
*/
|
|
57
|
+
thermal: "unknown" | "nominal" | "suspected" | "critical";
|
|
58
|
+
};
|
|
59
|
+
export type XRQualityReason = "init" | "frame-time" | "inference" | "memory" | "thermal" | "recovered" | "manual" | "locked" | "reset";
|
|
60
|
+
export type XRQualityDecision = {
|
|
61
|
+
/** Index into `tiers`. */
|
|
62
|
+
index: number;
|
|
63
|
+
tier: XRQualityTier;
|
|
64
|
+
reason: XRQualityReason;
|
|
65
|
+
/** `performance.now()` of the decision. */
|
|
66
|
+
at: number;
|
|
67
|
+
};
|
|
68
|
+
/** Controller state; serializable except for nothing (plain data). */
|
|
69
|
+
export type XRQualityState = {
|
|
70
|
+
index: number;
|
|
71
|
+
/** When true the controller stops adjusting; `setTier` still works. */
|
|
72
|
+
locked: boolean;
|
|
73
|
+
badStreak: number;
|
|
74
|
+
goodStreak: number;
|
|
75
|
+
lastChangeAt: number;
|
|
76
|
+
decision: XRQualityDecision;
|
|
77
|
+
/** Last decisions, newest first (bounded). */
|
|
78
|
+
history: XRQualityDecision[];
|
|
79
|
+
signals: XRQualitySignals;
|
|
80
|
+
};
|
|
81
|
+
export type XRQualityConfig = {
|
|
82
|
+
/** Ordered best → worst. Default `DEFAULT_QUALITY_TIERS`. */
|
|
83
|
+
tiers: XRQualityTier[];
|
|
84
|
+
budget: XRPerformanceBudget;
|
|
85
|
+
/** Start here (index or name); default: picked from device signals. */
|
|
86
|
+
initialTier?: number | string;
|
|
87
|
+
/** The controller may step down to this tier at most (index or name). Default the last. */
|
|
88
|
+
minTier?: number | string;
|
|
89
|
+
/** The controller may step up to this tier at most. Default the first. */
|
|
90
|
+
maxTier?: number | string;
|
|
91
|
+
/** `false` keeps the initial tier and never adjusts (still observable). Default true. */
|
|
92
|
+
adaptive: boolean;
|
|
93
|
+
/** Bound of `history`. Default 20. */
|
|
94
|
+
historySize: number;
|
|
95
|
+
};
|
|
96
|
+
/** What creators pass: everything optional, tiers and budget partial. `resolveQualityConfig` fills it in. */
|
|
97
|
+
export type XRQualityConfigInput = Partial<Omit<XRQualityConfig, "tiers" | "budget">> & {
|
|
98
|
+
tiers?: Array<Partial<XRQualityTier>>;
|
|
99
|
+
budget?: Partial<XRPerformanceBudget>;
|
|
100
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { XRQualityConfigInput, XRQualityDecision, XRQualitySignals, XRQualityState, XRQualityTier } from './types';
|
|
2
|
+
export type UseXRQualityResult = {
|
|
3
|
+
/** Current tier (`null` until the controller publishes). */
|
|
4
|
+
tier: XRQualityTier | null;
|
|
5
|
+
index: number;
|
|
6
|
+
tiers: XRQualityTier[];
|
|
7
|
+
decision: XRQualityDecision | null;
|
|
8
|
+
history: XRQualityDecision[];
|
|
9
|
+
signals: XRQualitySignals | null;
|
|
10
|
+
locked: boolean;
|
|
11
|
+
/** Pick a tier by index or name (does not lock; the controller may move again after the cooldown). */
|
|
12
|
+
setTier: (ref: number | string) => void;
|
|
13
|
+
/** Freeze the current tier (`lock()`), or let the controller adjust again (`unlock()`). */
|
|
14
|
+
lock: () => void;
|
|
15
|
+
unlock: () => void;
|
|
16
|
+
/** Back to the initial tier for this device; clears the lock. */
|
|
17
|
+
reset: () => void;
|
|
18
|
+
state: XRQualityState | null;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Observe and steer adaptive quality. The controller (mounted by
|
|
22
|
+
* `<XRProvider>` by default) publishes its state AND its resolved config to
|
|
23
|
+
* the session store; this hook reads both, so `tiers` and name-based
|
|
24
|
+
* `setTier("medium")` resolve against the provider's tiers without passing
|
|
25
|
+
* the config again. Manual decisions are written back through the store and
|
|
26
|
+
* applied by the controller on its next sample.
|
|
27
|
+
*/
|
|
28
|
+
export declare const useXRQuality: (config?: XRQualityConfigInput) => UseXRQualityResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const E=require("./renderPasses-
|
|
1
|
+
"use strict";const E=require("./renderPasses-Cg-zqmEz.cjs"),p={background:"background",scene3d:"general",tracking:"ar-tracking",screen2d:"2d-foreground",post:"post-effects"},u=(e,...r)=>{const t=new Set(e.map(c=>c.type));return r.every(c=>t.has(c))},b=e=>u(e,"ScreenTransform")&&(u(e,"ScreenText")||u(e,"ScreenImage")||u(e,"ScreenShape")||e.every(r=>["ScreenTransform","TrackingAnchor"].includes(r.type))),h=e=>(u(e,"Transform")||u(e,"FaceMeshRenderer"))&&!b(e),l={background:{domain:"background",accepts:()=>!1,defaultFor:()=>!1,renderMode:"background"},scene3d:{domain:"scene3d",accepts:h,defaultFor:h,renderMode:"depth3d"},tracking:{domain:"tracking",accepts:()=>!1,defaultFor:()=>!1,renderMode:"tracking"},screen2d:{domain:"screen2d",accepts:b,defaultFor:b,renderMode:"screenOverlay"},post:{domain:"post",accepts:()=>!1,defaultFor:()=>!1,renderMode:"post"}},y={background:"Background",scene3d:"General / 3D Scene",tracking:"AR Tracking",screen2d:"2D Foreground",post:"Post Effects"},D=e=>({id:p[e],name:y[e],domain:e,enabled:!0,objectIds:[]}),G=(e,r)=>r.componentIds.map(t=>e.components[t]).filter(t=>!!t),I=e=>{var r;return p[((r=Object.values(l).find(t=>t.defaultFor(e)))==null?void 0:r.domain)??"scene3d"]},S=(e,r,t)=>{const c=e.objects[r],n=e.renderGroups[t];return!c||!n?!1:l[n.domain].accepts(G(e,c))},k=(e,r,t)=>{if(r<0||r>=e.length)return e;const c=Math.max(0,Math.min(t,e.length-1));if(r===c)return e;const n=[...e],[s]=n.splice(r,1);return n.splice(c,0,s),n},T=(e,r,t)=>{const c=e.renderGroupOrder.indexOf(r),n=k(e.renderGroupOrder,c,t);return n===e.renderGroupOrder?e:{...e,renderGroupOrder:n}},P=(e,r,t,c)=>{const n=e.renderGroups[r];if(!n)return e;const s=n.objectIds.indexOf(t),o=k(n.objectIds,s,c);return o===n.objectIds?e:{...e,renderGroups:{...e.renderGroups,[r]:{...n,objectIds:o}}}},v=(e,r,t,c)=>{if(!S(e,r,t))return e;const n=Object.fromEntries(Object.entries(e.renderGroups).map(([o,d])=>[o,{...d,objectIds:d.objectIds.filter(a=>a!==r)}])),s=n[t].objectIds;return s.splice(Math.max(0,Math.min(c??s.length,s.length)),0,r),{...e,objects:{...e.objects,[r]:{...e.objects[r],renderGroupId:t}},renderGroups:n}},F=(e,r=Object.keys(e.objects))=>{const t={},c=[],n={...e.objects};return[...r,...Object.keys(n).filter(o=>!r.includes(o))].forEach(o=>{var g,m;const d=n[o];if(!d)return;const a=d.renderGroupId??d.layerId,M=I(G(e,d)),_=(g=Object.entries(p).find(([,f])=>f===a))==null?void 0:g[0],O=(m=Object.entries(p).find(([,f])=>f===M))==null?void 0:m[0],R=D(_??O),j=l[R.domain].accepts(G(e,d))?R:D(O),i=j.id;t[i]||(t[i]=j,c.push(i)),t[i].objectIds.push(o),n[o]={...d,renderGroupId:i}}),{...e,objects:n,renderGroups:t,renderGroupOrder:c}},U=(e,r=1e3)=>e.renderGroupOrder.flatMap((t,c)=>{if(c>=E.MAX_RENDER_GROUP_PASSES)return[];const n=e.renderGroups[t];if(!n||!n.enabled)return[];const s=l[n.domain];return n.objectIds.flatMap((o,d)=>{const a=e.objects[o];return!a||!a.enabled?[]:a.parentObjectId&&e.objects[a.parentObjectId]?[]:[{groupId:t,groupIndex:c,objectId:o,objectIndex:d,renderMode:s.renderMode,renderOrder:c*r+d,renderLayer:E.getRenderGroupLayer(c)}]})});exports.DEFAULT_RENDER_GROUP_IDS=p;exports.RENDER_GROUP_POLICIES=l;exports.createRenderPlan=U;exports.getDefaultRenderGroupId=I;exports.migrateToRenderGroups=F;exports.moveObjectToGroup=v;exports.reorderObjectWithinGroup=P;exports.reorderRenderGroup=T;exports.validateGroupCompatibility=S;
|