From 973e7219a855d0322596aea6961cf317ac8e4c44 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 19:43:09 +0000 Subject: [PATCH] Save plan in Lovable --- .lovable/plan.md | 82 ++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 55 deletions(-) diff --git a/.lovable/plan.md b/.lovable/plan.md index 305e3f2..06b3029 100644 --- a/.lovable/plan.md +++ b/.lovable/plan.md @@ -1,71 +1,43 @@ -## Plano: Ferramentas de Medicao Inteligentes (Smart Snap + Auto-Detect) +## Plano: Corrigir entrada XR no Meta Quest 3 -### 3 Funcionalidades +### Problema raiz +O codigo atual cria **duas sessoes XR em sequencia**: primeiro manualmente via `navigator.xr.requestSession('immersive-ar', ...)` (linha 242), depois via `xrStore.enterAR()` (linha 271). O Quest 3 rejeita a segunda porque ja existe uma sessao ativa. Alem disso, a primeira sessao nao esta conectada ao renderer do Three.js, entao mesmo se funcionasse, nao renderizaria nada. -**1. Vertex Snap (snap magnetico)** -- No `MeasureClickHandler`, ao mover o mouse, fazer raycast continuo (`onPointerMove`) -- Para cada hit, buscar o vertice mais proximo do ponto de intersecao na geometria do mesh -- Se a distancia ao vertice mais proximo for menor que um threshold (ex: 5px em screen space), "snapar" para esse vertice -- Renderizar um marcador visual (anel/circulo amarelo) no vertice snappado via `MeasurementOverlay` -- Ao clicar, usar o ponto snappado em vez do ponto bruto do raycast -- Novo state no store: `snapPoint: MeasurePoint | null` e `setSnapPoint` +### Correcoes -**2. Auto-detect diametro de furos (hover)** -- Ao fazer hover sobre uma face, analisar a geometria local: - - Coletar as edges do `EdgesGeometry` que formam um loop fechado (circulo/oblongo) proximo ao ponto de hover - - Alternativa mais robusta: analisar os vertices ao redor do ponto de intersecao, detectar se formam um arco/circulo usando fitting de circulo (least-squares circle fit nos vertices vizinhos) - - Abordagem pratica: usar as normais das faces -- furos em chapas tem faces com normais apontando para o centro do furo. Agrupar faces cilindricas coplanares e calcular o raio -- Apos 1 segundo de hover estavel (debounce), mostrar tooltip HTML com o diametro em mm (1 casa decimal) -- Novo state: `hoverInfo: { type: 'hole' | 'edge', position: [x,y,z], value: number } | null` +**1. Remover a chamada manual a `navigator.xr.requestSession`** +- Eliminar todo o bloco `try` das linhas 239-268 que tenta criar uma sessao manualmente +- A lib `@react-three/xr` gerencia a sessao internamente via `xrStore.enterAR()` -**3. Auto-detect comprimento de aresta (hover)** -- Ao hover proximo de uma edge line, identificar o segmento de aresta mais proximo -- Calcular o comprimento desse segmento em mm -- Apos 1 segundo de hover estavel, mostrar tooltip com o comprimento +**2. Usar `customSessionInit` no `createXRStore` para image tracking** +- A lib suporta `customSessionInit` em `XRSessionInitOptions` que permite injetar opcoes extras na sessao +- Passar `optionalFeatures: ['image-tracking']` e `trackedImages` via `customSessionInit` +- O `createXRStore` ja adiciona `local-floor`, `hand-tracking`, `anchors`, `plane-detection` automaticamente -### Arquivos a modificar +**3. Condicionar o emulador** +- `emulate: 'metaQuest3'` ativa o emulador IWER em localhost, o que pode interferir no Quest real +- Condicionar: so emular se nao estiver em dispositivo XR real (checar `navigator.xr?.isSessionSupported`) +- Ou mais simples: so emular em `location.hostname === 'localhost'` E quando `!navigator.xr` -**`src/stores/useModelStore.ts`** -- Adicionar `snapPoint`, `setSnapPoint`, `hoverInfo`, `setHoverInfo` +**4. Arquivo: `src/pages/XRSession.tsx`** -**`src/components/three/ModelViewer.tsx`** -- Novo componente `SmartSnapHandler`: useFrame com raycast no mouse, busca vertice mais proximo, atualiza `snapPoint` -- Novo componente `HoverDetector`: onPointerMove com debounce de 1s, analisa geometria para detectar furos (faces cilindricas) e arestas, atualiza `hoverInfo` -- Atualizar `MeasurementOverlay` para renderizar o snap marker (anel amarelo) e o tooltip de hover -- Atualizar `MeasureClickHandler` para usar `snapPoint` quando disponivel - -**`src/components/three/SmartMeasure.tsx`** (novo) -- Logica de deteccao de furos: analise de curvatura local dos vertices -- Logica de deteccao de arestas: segmentos de EdgesGeometry mais proximos ao cursor -- Funcoes utilitarias: `findNearestVertex`, `detectHoleRadius`, `findNearestEdge` - -### Detalhes tecnicos +Mudancas: +- Mover criacao do store para dentro do componente (ou lazy init) para poder passar o bitmap como `customSessionInit` +- `handleEnterAR`: simplificar para apenas `await xrStore.enterAR()` com listener de `end` +- Manter `ImageTrackingAnchor`, `ControllerFineTuning`, `XRModel` sem alteracoes ```text -Vertex Snap: - raycast hit → mesh.geometry.attributes.position - → iterar vertices, transformar para world space (mesh.matrixWorld) - → projetar para screen space (camera.project) - → encontrar o mais proximo em pixels (threshold ~8px) - → mostrar anel amarelo nesse ponto +ANTES (bugado): + 1. navigator.xr.requestSession('immersive-ar') ← cria sessao A + 2. xrStore.enterAR() ← tenta sessao B → REJEITADA -Deteccao de Furos: - raycast hit face → pegar faceIndex - → coletar faces vizinhas com normal similar (cilindrica) - → extrair vertices do loop de borda dessas faces - → circle fit (least squares) → raio → diametro em mm - → mostrar tooltip apos 1s de hover estavel - -Deteccao de Arestas: - EdgesGeometry ja calculada → array de segmentos [v1, v2] - → projetar todos para screen space - → encontrar segmento mais proximo ao cursor - → comprimento = distancia 3D * 1000 (mm) - → mostrar tooltip apos 1s de hover estavel +DEPOIS (correto): + 1. createXRStore({ customSessionInit: { optionalFeatures: ['image-tracking'], trackedImages: [...] } }) + 2. xrStore.enterAR() ← unica sessao, com image tracking ``` ### Sem alteracoes em -- Checklist, compare mode, screenshots, fine tuning, import OBJ/STL/IFC, render modes +- ModelViewer, ViewerControls, SmartMeasure, checklist, medicoes, screenshots, PDF, IFC import