Feat/gallery #9
@@ -72,6 +72,12 @@ interface TextureDiagnostic {
|
||||
summary: string;
|
||||
}
|
||||
|
||||
interface GalleryModelScene extends THREE.Object3D {
|
||||
userData: THREE.Object3D["userData"] & {
|
||||
hiddenExportPlaneCount?: number;
|
||||
};
|
||||
}
|
||||
|
||||
interface GalleryViewerErrorBoundaryProps {
|
||||
children: ReactNode;
|
||||
resetKey: string;
|
||||
@@ -180,19 +186,49 @@ function GalleryModelPreview({
|
||||
}
|
||||
|
||||
function createGalleryModelScene(scene: THREE.Object3D): THREE.Object3D {
|
||||
const modelScene = scene.clone(true);
|
||||
const modelScene = scene.clone(true) as GalleryModelScene;
|
||||
const exportPlaneMeshes: THREE.Mesh[] = [];
|
||||
|
||||
modelScene.traverse((object) => {
|
||||
if (!(object instanceof THREE.Mesh)) return;
|
||||
|
||||
if (isExportPlaneMesh(object)) {
|
||||
exportPlaneMeshes.push(object);
|
||||
return;
|
||||
}
|
||||
|
||||
object.material = Array.isArray(object.material)
|
||||
? object.material.map(createGalleryMaterial)
|
||||
: createGalleryMaterial(object.material);
|
||||
});
|
||||
|
||||
for (const mesh of exportPlaneMeshes) {
|
||||
mesh.parent?.remove(mesh);
|
||||
}
|
||||
|
||||
modelScene.userData.hiddenExportPlaneCount = exportPlaneMeshes.length;
|
||||
|
||||
return modelScene;
|
||||
}
|
||||
|
||||
function isExportPlaneMesh(mesh: THREE.Mesh): boolean {
|
||||
const name = mesh.name.toLowerCase();
|
||||
if (name !== "plan" && name !== "plane") return false;
|
||||
|
||||
mesh.geometry.computeBoundingBox();
|
||||
const boundingBox = mesh.geometry.boundingBox;
|
||||
if (!boundingBox) return false;
|
||||
|
||||
const size = new THREE.Vector3();
|
||||
boundingBox.getSize(size);
|
||||
|
||||
const dimensions = [size.x, size.y, size.z];
|
||||
const flatDimensions = dimensions.filter((dimension) => dimension <= 0.001);
|
||||
const largestDimension = Math.max(...dimensions);
|
||||
|
||||
return flatDimensions.length > 0 && largestDimension > 1;
|
||||
}
|
||||
|
||||
function createGalleryMaterial(material: THREE.Material): THREE.Material {
|
||||
const galleryMaterial = material.clone();
|
||||
const materialWithNormalMap = galleryMaterial as THREE.Material & {
|
||||
@@ -360,6 +396,8 @@ function getTextureDiagnostic(
|
||||
): TextureDiagnostic {
|
||||
let textureCount = 0;
|
||||
let missingTextureImageCount = 0;
|
||||
const hiddenExportPlaneCount =
|
||||
(modelScene as GalleryModelScene).userData.hiddenExportPlaneCount ?? 0;
|
||||
|
||||
modelScene.traverse((object) => {
|
||||
if (!(object instanceof THREE.Mesh)) return;
|
||||
@@ -392,6 +430,14 @@ function getTextureDiagnostic(
|
||||
};
|
||||
}
|
||||
|
||||
if (hiddenExportPlaneCount > 0) {
|
||||
return {
|
||||
modelId,
|
||||
status: "warning",
|
||||
summary: `${hiddenExportPlaneCount} plan(s) d'export masqué(s)`,
|
||||
};
|
||||
}
|
||||
|
||||
if (textureCount === 0) {
|
||||
return {
|
||||
modelId,
|
||||
|
||||
Reference in New Issue
Block a user