feat: integrate Draco compression for 3D models in backoffice

- Added support for uploading and compressing GLB models using Draco in the backoffice.
- Implemented commands for importing and re-compressing 3D models.
- Updated model resource to handle 3D model uploads and validations.
- Introduced a new script for compressing GLB files with Draco.
- Modified Vite configuration to remove GLB files from the build output.
- Updated package dependencies to include GLTF-transform libraries for handling 3D models.
- Added tests to ensure proper functionality of 3D model handling and compression.
This commit is contained in:
2026-11-01 10:35:50 +01:00
parent 24f9e59654
commit 1208187a17
32 changed files with 895 additions and 52 deletions
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Support\Configuratore\Media;
use App\Support\Configuratore\Modelli3d;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
@@ -12,7 +13,7 @@ class MediaController extends Controller
{
/**
* GET /api/media/{percorso}
* Immagini del configuratore dal disco public, con gli header CORS dell'API (necessari
* Immagini e modelli 3D (compressi) del configuratore dal disco public, con gli header CORS dell'API (necessari
* alle texture WebGL caricate da un'altra origine).
*/
public function __invoke(string $percorso): BinaryFileResponse
@@ -26,8 +27,11 @@ class MediaController extends Controller
404
);
// I modelli 3D hanno l'hash del contenuto nel nome: un nuovo caricamento cambia URL.
$modello3d = Str::startsWith($percorso, Modelli3d::CARTELLA_DRACO.'/');
return response()->file($disco->path($percorso), [
'Cache-Control' => 'public, max-age=86400',
]);
'Cache-Control' => $modello3d ? 'public, max-age=31536000, immutable' : 'public, max-age=86400',
] + ($modello3d ? ['Content-Type' => 'model/gltf-binary'] : []));
}
}