🚀 Auto-deploy: melhoria no snap e medição AR em 23/05/2026 23:26:57

This commit is contained in:
2026-05-23 23:26:57 +00:00
parent c93e56640d
commit b7cd422068
6 changed files with 35 additions and 49 deletions
+2 -2
View File
@@ -112,13 +112,13 @@ export function ViewerControls() {
size="sm" size="sm"
className="gap-2 h-9" className="gap-2 h-9"
onClick={() => { onClick={() => {
const next = renderMode === 'solid' ? 'wireframe' : renderMode === 'wireframe' ? 'edges' : 'solid'; const next = renderMode === 'solid' ? 'edges' : 'solid';
setRenderMode(next); setRenderMode(next);
}} }}
> >
{renderMode === 'edges' ? <Box className="h-3.5 w-3.5" /> : <Grid3X3 className="h-3.5 w-3.5" />} {renderMode === 'edges' ? <Box className="h-3.5 w-3.5" /> : <Grid3X3 className="h-3.5 w-3.5" />}
<span className="font-mono text-xs"> <span className="font-mono text-xs">
{renderMode === 'solid' ? 'Sólido' : renderMode === 'wireframe' ? 'Wireframe' : 'Bordas'} {renderMode === 'solid' ? 'Sólido' : 'Bordas'}
</span> </span>
</Button> </Button>
+4 -4
View File
@@ -67,9 +67,9 @@ const helpItems = [
desc: 'Exibe/oculta a grade de referência para alinhar o modelo com o ambiente.', desc: 'Exibe/oculta a grade de referência para alinhar o modelo com o ambiente.',
}, },
{ {
title: 'Sólido / Wire / Bordas', title: 'Sólido / Bordas',
icon: '🔲', icon: '🔲',
desc: 'Alterna modos de renderização: Sólido (preenchido), Wireframe (malha), Bordas (apenas contornos).', desc: 'Alterna modos de renderização: Sólido (preenchido) e Bordas (destaque visual de arestas com transparência).',
}, },
{ {
title: 'Medir', title: 'Medir',
@@ -345,12 +345,12 @@ export function XRHud({ freeMove, onToggleFreeMove, placementMode = false, onTog
variant={renderMode !== 'solid' ? 'default' : 'outline'} variant={renderMode !== 'solid' ? 'default' : 'outline'}
size="sm" className="h-8 gap-1.5 text-[10px] font-mono" size="sm" className="h-8 gap-1.5 text-[10px] font-mono"
onClick={() => { onClick={() => {
const next = renderMode === 'solid' ? 'wireframe' : renderMode === 'wireframe' ? 'edges' : 'solid'; const next = renderMode === 'solid' ? 'edges' : 'solid';
setRenderMode(next); setRenderMode(next);
}} }}
> >
{renderMode === 'edges' ? <Box className="h-3.5 w-3.5" /> : <Grid3X3 className="h-3.5 w-3.5" />} {renderMode === 'edges' ? <Box className="h-3.5 w-3.5" /> : <Grid3X3 className="h-3.5 w-3.5" />}
{renderMode === 'solid' ? 'Sólido' : renderMode === 'wireframe' ? 'Wire' : 'Bordas'} {renderMode === 'solid' ? 'Sólido' : 'Bordas'}
</Button> </Button>
<Button <Button
+14 -20
View File
@@ -161,25 +161,19 @@ function GLBModel({ sceneModel, isActive }: { sceneModel: SceneModel; isActive:
originalColors.current.set(mat, mat.color.clone()); originalColors.current.set(mat, mat.color.clone());
} }
if (renderMode === 'edges' && !measureMode) { const isEdgesOrMeasure = renderMode === 'edges' || measureMode;
mat.visible = false; mat.visible = true;
const targetOpacity = isEdgesOrMeasure ? 0.25 : opacity;
mat.transparent = targetOpacity < 1;
mat.opacity = targetOpacity;
mat.wireframe = false;
if (hasRejected) {
mat.color.setHSL(0, 0.7, 0.5);
} else if (allApproved) {
mat.color.setHSL(0.38, 0.7, 0.45);
} else { } else {
mat.visible = true; // Tint with the per-model color (subtle)
const targetOpacity = measureMode ? 0.25 : opacity; mat.color.set(sceneModel.color);
mat.transparent = targetOpacity < 1;
mat.opacity = targetOpacity;
mat.wireframe = renderMode === 'wireframe';
if (renderMode === 'wireframe') {
mat.wireframeLinewidth = wireframeThickness;
mat.color.set(wireframeColor);
} else if (hasRejected) {
mat.color.setHSL(0, 0.7, 0.5);
} else if (allApproved) {
mat.color.setHSL(0.38, 0.7, 0.45);
} else {
// Tint with the per-model color (subtle)
mat.color.set(sceneModel.color);
}
} }
mat.needsUpdate = true; mat.needsUpdate = true;
} }
@@ -188,8 +182,8 @@ function GLBModel({ sceneModel, isActive }: { sceneModel: SceneModel; isActive:
if ((renderMode === 'edges' || measureMode) && child.geometry) { if ((renderMode === 'edges' || measureMode) && child.geometry) {
const edgesGeo = new THREE.EdgesGeometry(child.geometry, edgeThresholdAngle); const edgesGeo = new THREE.EdgesGeometry(child.geometry, edgeThresholdAngle);
const lineMat = new THREE.LineBasicMaterial({ const lineMat = new THREE.LineBasicMaterial({
color: measureMode ? '#00f3ff' : wireframeColor, color: (renderMode === 'edges' || measureMode) ? '#00f3ff' : wireframeColor,
linewidth: measureMode ? 2 : wireframeThickness, linewidth: (renderMode === 'edges' || measureMode) ? 2 : wireframeThickness,
}); });
const lineSegments = new THREE.LineSegments(edgesGeo, lineMat); const lineSegments = new THREE.LineSegments(edgesGeo, lineMat);
lineSegments.userData.__edgeLine = true; lineSegments.userData.__edgeLine = true;
+1 -3
View File
@@ -347,9 +347,7 @@ function ToolsTab(p: XRHudInWorldProps) {
<Text position={[-0.24, 0.11, 0]} fontSize={0.008} color="#94a3b8" anchorX="left">Render</Text> <Text position={[-0.24, 0.11, 0]} fontSize={0.008} color="#94a3b8" anchorX="left">Render</Text>
<XR3DButton position={[-0.16, 0.085, 0]} size={[0.075, 0.022]} label="Sólido" <XR3DButton position={[-0.16, 0.085, 0]} size={[0.075, 0.022]} label="Sólido"
active={renderMode === 'solid'} onClick={() => setRenderMode('solid')} /> active={renderMode === 'solid'} onClick={() => setRenderMode('solid')} />
<XR3DButton position={[-0.08, 0.085, 0]} size={[0.075, 0.022]} label="Wire" <XR3DButton position={[-0.08, 0.085, 0]} size={[0.075, 0.022]} label="Bordas"
active={renderMode === 'wireframe'} onClick={() => setRenderMode('wireframe')} />
<XR3DButton position={[0.0, 0.085, 0]} size={[0.075, 0.022]} label="Bordas"
active={renderMode === 'edges'} onClick={() => setRenderMode('edges')} /> active={renderMode === 'edges'} onClick={() => setRenderMode('edges')} />
<Text position={[-0.24, 0.05, 0]} fontSize={0.008} color="#94a3b8" anchorX="left">Toggles</Text> <Text position={[-0.24, 0.05, 0]} fontSize={0.008} color="#94a3b8" anchorX="left">Toggles</Text>
+13 -19
View File
@@ -154,24 +154,18 @@ function XRModel({ sceneModel }: { sceneModel: import('@/stores/useModelStore').
const materials = Array.isArray(child.material) ? child.material : [child.material]; const materials = Array.isArray(child.material) ? child.material : [child.material];
materials.forEach((mat: THREE.Material) => { materials.forEach((mat: THREE.Material) => {
if (mat instanceof THREE.MeshStandardMaterial) { if (mat instanceof THREE.MeshStandardMaterial) {
if (renderMode === 'edges' && !measureMode) { const isEdgesOrMeasure = renderMode === 'edges' || measureMode;
mat.visible = false; mat.visible = true;
const targetOpacity = isEdgesOrMeasure ? 0.25 : opacity;
mat.transparent = targetOpacity < 1;
mat.opacity = targetOpacity;
mat.wireframe = false;
if (hasRejected) {
mat.color.setHSL(0, 0.7, 0.5);
} else if (allApproved) {
mat.color.setHSL(0.38, 0.7, 0.45);
} else { } else {
mat.visible = true; mat.color.set(sceneModel.color);
const targetOpacity = measureMode ? 0.25 : opacity;
mat.transparent = targetOpacity < 1;
mat.opacity = targetOpacity;
mat.wireframe = renderMode === 'wireframe';
if (renderMode === 'wireframe') {
mat.wireframeLinewidth = wireframeThickness;
mat.color.set(wireframeColor);
} else if (hasRejected) {
mat.color.setHSL(0, 0.7, 0.5);
} else if (allApproved) {
mat.color.setHSL(0.38, 0.7, 0.45);
} else {
mat.color.set(sceneModel.color);
}
} }
mat.needsUpdate = true; mat.needsUpdate = true;
} }
@@ -180,8 +174,8 @@ function XRModel({ sceneModel }: { sceneModel: import('@/stores/useModelStore').
if ((renderMode === 'edges' || measureMode) && child.geometry) { if ((renderMode === 'edges' || measureMode) && child.geometry) {
const edgesGeo = new THREE.EdgesGeometry(child.geometry, edgeThresholdAngle); const edgesGeo = new THREE.EdgesGeometry(child.geometry, edgeThresholdAngle);
const lineMat = new THREE.LineBasicMaterial({ const lineMat = new THREE.LineBasicMaterial({
color: measureMode ? '#00f3ff' : wireframeColor, color: (renderMode === 'edges' || measureMode) ? '#00f3ff' : wireframeColor,
linewidth: measureMode ? 2 : wireframeThickness, linewidth: (renderMode === 'edges' || measureMode) ? 2 : wireframeThickness,
}); });
const lineSegments = new THREE.LineSegments(edgesGeo, lineMat); const lineSegments = new THREE.LineSegments(edgesGeo, lineMat);
lineSegments.userData.__edgeLine = true; lineSegments.userData.__edgeLine = true;
+1 -1
View File
@@ -127,7 +127,7 @@ const MODEL_COLORS = ['#3b82f6', '#22c55e', '#eab308', '#a855f7', '#ec4899'];
type AnchorMode = 'tracking' | 'manual' | 'fine-tuning'; type AnchorMode = 'tracking' | 'manual' | 'fine-tuning';
type InspectionResult = 'pending' | 'approved' | 'rejected'; type InspectionResult = 'pending' | 'approved' | 'rejected';
type RenderMode = 'solid' | 'wireframe' | 'edges'; type RenderMode = 'solid' | 'edges';
export interface MeasurePoint { export interface MeasurePoint {
x: number; x: number;