Files
carmine.savino 1208187a17 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.
2026-11-01 10:35:50 +01:00

71 lines
2.5 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Modello;
use App\Support\Configuratore\Modelli3d;
use App\Support\Configuratore\Modello3dNonValido;
use Illuminate\Console\Command;
use Illuminate\Support\Number;
/**
* Migrazione una tantum: associa ai modelli i .glb che prima stavano nel frontend
* (src/assets/models/<sistema>/<file_modello>), comprimendoli come un caricamento dal backoffice.
* I modelli che hanno già un modello 3D sono saltati (salvo --forza).
*/
class ImportaModelli3d extends Command
{
protected $signature = 'modelli3d:importa
{cartella? : Cartella con le sottocartelle per sistema (default: ../src/assets/models)}
{--forza : Sostituisce anche i modelli 3D già caricati}';
protected $description = 'Importa i modelli 3D (.glb) dalla cartella del configuratore e li comprime con Draco';
public function handle(Modelli3d $modelli3d): int
{
$cartella = rtrim($this->argument('cartella') ?? base_path('../src/assets/models'), '/');
if (! is_dir($cartella)) {
$this->error("Cartella non trovata: {$cartella}");
return self::FAILURE;
}
$importati = 0;
$errori = 0;
$modelli = Modello::with('sistema')->whereNotNull('file_modello')->orderBy('sistema_id')->orderBy('ordine')->get();
foreach ($modelli as $modello) {
$etichetta = "{$modello->sistema->codice}/{$modello->codice}";
if ($modello->modello_3d_draco && ! $this->option('forza')) {
$this->line(" {$etichetta}: già presente, saltato");
continue;
}
$file = "{$cartella}/{$modello->sistema->codice}/{$modello->file_modello}";
if (! is_file($file)) {
$this->warn(" {$etichetta}: {$modello->file_modello} non trovato");
continue;
}
try {
$modelli3d->carica($modello, $file, $modello->file_modello);
$importati++;
$this->info(sprintf(' %s: %s → %s', $etichetta,
Number::fileSize($modello->modello_3d_dimensione, precision: 1),
Number::fileSize($modello->modello_3d_draco_dimensione, precision: 1)));
} catch (Modello3dNonValido $e) {
$errori++;
$this->error(" {$etichetta}: {$e->getMessage()}");
}
}
$this->newLine();
$this->info("Importati {$importati} modelli 3D".($errori ? ", {$errori} errori" : '').'.');
return $errori ? self::FAILURE : self::SUCCESS;
}
}