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
+17 -2
View File
@@ -2,6 +2,8 @@
namespace App\Models;
use App\Support\Configuratore\Media;
use App\Support\Configuratore\Modelli3d;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -46,6 +48,9 @@ class Modello extends Model
'attivo' => 'boolean',
'moduli' => 'array',
'listino_aggiornato_at' => 'datetime',
'modello_3d_dimensione' => 'integer',
'modello_3d_draco_dimensione' => 'integer',
'modello_3d_aggiornato_at' => 'datetime',
];
public function sistema(): BelongsTo
@@ -97,10 +102,19 @@ class Modello extends Model
return $query->where('attivo', true)->orderBy('ordine')->orderBy('id');
}
/** Modelli mostrati nel configuratore: attivi e con un listino (senza prezzi non si possono vendere). */
/**
* Modelli mostrati nel configuratore: attivi, con un listino (senza prezzi non si possono
* vendere) e con il modello 3D caricato.
*/
public function scopeNelConfiguratore(Builder $query): Builder
{
return $query->attivi()->whereHas('listino');
return $query->attivi()->whereNotNull('modello_3d_draco')->whereHas('listino');
}
/** URL del modello 3D compresso (Draco) letto dal configuratore. */
public function getModello3dUrlAttribute(): ?string
{
return Media::url($this->modello_3d_draco);
}
public function getIconaUrlAttribute(): ?string
@@ -150,6 +164,7 @@ class Modello extends Model
if ($modello->icona) {
Storage::disk('public')->delete($modello->icona);
}
app(Modelli3d::class)->elimina($modello);
});
}
}