diff --git a/src/stores/useModelStore.ts b/src/stores/useModelStore.ts index d0f3a36..22461e5 100644 --- a/src/stores/useModelStore.ts +++ b/src/stores/useModelStore.ts @@ -1,5 +1,53 @@ import { create } from 'zustand'; +// ── Persistência de placement (fineTuning + escala) e flags WebXR ───── +const PLACEMENT_KEY = 'tsxr_placements_v1'; +const XRFEAT_KEY = 'xrFeatures'; + +export interface XRFeatureFlags { + handTracking: boolean; + planeDetection: boolean; + hitTest: boolean; + domOverlay: boolean; + anchors: boolean; + meshDetection: boolean; + depthSensing: boolean; + layers: boolean; + bodyTracking: boolean; +} +const DEFAULT_XR_FEATURES: XRFeatureFlags = { + handTracking: true, planeDetection: true, hitTest: true, domOverlay: true, + anchors: true, meshDetection: true, depthSensing: true, layers: true, + bodyTracking: true, +}; +function loadXRFeatures(): XRFeatureFlags { + try { + const raw = localStorage.getItem(XRFEAT_KEY); + if (raw) return { ...DEFAULT_XR_FEATURES, ...JSON.parse(raw) }; + } catch {} + return { ...DEFAULT_XR_FEATURES }; +} +function saveXRFeatures(f: XRFeatureFlags) { + try { localStorage.setItem(XRFEAT_KEY, JSON.stringify(f)); } catch {} +} + +interface StoredPlacement { fineTuning: FineTuning; } +function loadPlacements(): Record { + try { + const raw = localStorage.getItem(PLACEMENT_KEY); + if (raw) return JSON.parse(raw); + } catch {} + return {}; +} +function savePlacement(fileName: string, fineTuning: FineTuning) { + try { + const all = loadPlacements(); + all[fileName] = { fineTuning }; + localStorage.setItem(PLACEMENT_KEY, JSON.stringify(all)); + } catch {} +} + + export interface ScaleRatio { label: string; // e.g. "1:50", "2:1", "1:1" factor: number; // render multiplier: 1:50 => 0.02, 2:1 => 2, 1:1 => 1