fix(glb): remove invalid export_colors param + fix viewer stale mesh

4 root causes fixed:

1. export_colors=False was removed in Blender 4.x — caused every Blender
   export to fail (exit 1) and always fall back to trimesh. Remove it.
   Blender now runs the full pipeline: materials + sharp edges.

2. GlbModel cloned ref never reset on url change — key={glbBlobUrl} forces
   React to remount GlbModel on each new blob URL, resetting the ref so
   fresh geometry is always loaded.

3. glbBlobUrl not cleared before re-fetch — setGlbBlobUrl(null) added at
   start of downloadUrl effect so spinner shows instead of stale mesh.

4. staleTime: 30_000 delayed picking up new MediaAsset after generation.
   Changed to staleTime: 0 so invalidation always triggers immediate refetch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 15:46:42 +01:00
parent 2377cb192a
commit 3eba7b2d37
4 changed files with 77 additions and 61 deletions
@@ -96,7 +96,7 @@ export default function InlineCadViewer({
const { data: gltfAssets } = useQuery({
queryKey: ['media-assets', cadFileId, 'gltf_geometry'],
queryFn: () => getMediaAssets({ cad_file_id: cadFileId, asset_types: ['gltf_geometry'] }),
staleTime: 30_000,
staleTime: 0,
refetchInterval: generating ? 4_000 : false,
})
@@ -109,6 +109,8 @@ export default function InlineCadViewer({
useEffect(() => {
if (!downloadUrl || !token) return
// Clear stale mesh immediately so the loading spinner shows instead of old geometry
setGlbBlobUrl(null)
setLoadingGlb(true)
let blobUrl = ''
fetch(downloadUrl, { headers: { Authorization: `Bearer ${token}` } })
@@ -140,7 +142,7 @@ export default function InlineCadViewer({
<Canvas camera={{ position: [0, 0, 2], fov: 45 }}>
<Suspense fallback={null}>
<Environment preset={lightPreset} background={false} />
<GlbModel url={glbBlobUrl} wireframe={viewMode === 'wireframe'} />
<GlbModel key={glbBlobUrl} url={glbBlobUrl} wireframe={viewMode === 'wireframe'} />
</Suspense>
<OrbitControls makeDefault />
</Canvas>