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:
@@ -0,0 +1,70 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Modello;
|
||||
use App\Support\Configuratore\Modelli3d;
|
||||
use App\Support\Configuratore\Modello3dNonValido;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
/** Rigenera le copie Draco dagli originali, ad esempio dopo un cambio di scripts/comprimi-glb.mjs. */
|
||||
class RicomprimiModelli3d extends Command
|
||||
{
|
||||
protected $signature = 'modelli3d:ricomprimi {codice?* : Codici dei modelli (default: tutti)}';
|
||||
|
||||
protected $description = 'Ricomprime con Draco i modelli 3D a partire dagli originali archiviati';
|
||||
|
||||
public function handle(Modelli3d $modelli3d): int
|
||||
{
|
||||
$errori = 0;
|
||||
|
||||
$modelli = Modello::with('sistema')
|
||||
->whereNotNull('modello_3d')
|
||||
->when($this->argument('codice'), fn ($q, $codici) => $q->whereIn('codice', $codici))
|
||||
->get();
|
||||
|
||||
foreach ($modelli as $modello) {
|
||||
try {
|
||||
$modelli3d->ricomprimi($modello);
|
||||
$this->info(" {$modello->sistema->codice}/{$modello->codice}: ricompresso");
|
||||
} catch (Modello3dNonValido $e) {
|
||||
$errori++;
|
||||
$this->error(" {$modello->sistema->codice}/{$modello->codice}: {$e->getMessage()}");
|
||||
}
|
||||
}
|
||||
|
||||
return $errori ? self::FAILURE : self::SUCCESS;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user