🚀 Auto-deploy: melhoria no snap e medição AR em 23/05/2026 23:26:57
This commit is contained in:
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user