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
+27 -6
View File
@@ -2,10 +2,33 @@ import { defineConfig } from 'vite';
import path from 'path';
import { viteStaticCopy } from 'vite-plugin-static-copy';
import { ViteMinifyPlugin } from 'vite-plugin-minify'
import dracoModels from './vite-plugins/draco-models.js';
import fs from 'node:fs/promises';
// Cifratura dei modelli, pronta ma non attiva: vedi vite-plugins/encrypt-models.js.
// import encryptModels from './vite-plugins/encrypt-models.js';
// Nessun .glb va online dalla build (es. i file archiviati in assets/data): i modelli 3D li serve il
// backoffice, già compressi con Draco. Parte dopo il writeBundle di vite-plugin-static-copy.
function rimuoviGlb() {
let outDir;
return {
name: 'kreios-rimuovi-glb',
apply: 'build',
configResolved(config) {
outDir = config.build.outDir;
},
writeBundle: {
sequential: true,
order: 'post',
async handler() {
const files = await fs.readdir(path.join(outDir, 'assets'), { recursive: true }).catch(() => []);
await Promise.all(files
.filter((file) => file.toLowerCase().endsWith('.glb'))
.map((file) => fs.rm(path.join(outDir, 'assets', file))));
},
},
};
}
export default defineConfig({
// Il configuratore è servito da Laravel sotto /configuratore/ (stessa origine dell'API):
// la build finisce direttamente in backoffice/public/configuratore.
@@ -29,16 +52,14 @@ export default defineConfig({
viteStaticCopy({
targets: [
{
// I modelli 3D non vengono copiati così come sono: li comprime dracoModels.
// I modelli 3D sono gestiti dal backoffice (caricati e compressi con Draco):
// quelli in src/assets/models servono solo a `php artisan modelli3d:importa`.
src: ['assets/*', '!assets/models'],
dest: 'assets'
}
]
}),
dracoModels({
modelsDir: path.resolve(__dirname, 'src/assets/models'),
cacheDir: path.resolve(__dirname, 'node_modules/.cache/draco-models'),
}),
rimuoviGlb(),
ViteMinifyPlugin({
minify: {
removeComments: true,