diff --git a/src/models/Model.vue b/src/models/Model.vue index e5f8f45..7dec8e8 100644 --- a/src/models/Model.vue +++ b/src/models/Model.vue @@ -25,7 +25,7 @@ import { mdiVectorRectangle } from '@mdi/js' import SvgIcon from '@jamescoyle/vue-icon'; -import {BackSide, Color, FrontSide, Mesh as TMesh, Plane, Vector3} from "three"; +import {BackSide, Box3, Color, FrontSide, Mesh as TMesh, Plane, Vector3} from "three"; import {SceneMgr} from "../misc/scene"; const props = defineProps<{ @@ -117,13 +117,14 @@ function onClipPlanesChange() { let enabledY = clipPlaneY.value < 1 && !clipPlaneSwappedY.value || clipPlaneY.value > 0 && clipPlaneSwappedY.value; let enabledZ = clipPlaneZ.value < 1 && !clipPlaneSwappedZ.value || clipPlaneZ.value > 0 && clipPlaneSwappedZ.value; // let enabled = [enabledX, enabledY, enabledZ]; + let bbox: Box3; if (props.viewer?.renderer && (enabledX || enabledY || enabledZ)) { // Global value for all models, once set it cannot be unset (unknown for other models...) props.viewer.renderer.threeRenderer.localClippingEnabled = true; + // Due to model-viewer's camera manipulation, the bounding box needs to be transformed + bbox = SceneMgr.getBoundingBox(document); + bbox.applyMatrix4(sceneModel.matrixWorld); } - let bbox = SceneMgr.getBoundingBox(document); - // Due to model-viewer's camera manipulation, the bounding box - bbox.applyMatrix4(sceneModel.matrixWorld); sceneModel.traverse((child) => { if (child.userData[extrasNameKey] === modelName) { if (child.material) { @@ -142,9 +143,11 @@ function onClipPlanesChange() { if (!enabledZ) planes.pop(); if (!enabledY) planes.splice(1, 1); if (!enabledX) planes.shift(); - if (modelName == 'fox') console.log('Clipping planes', planes, child.material) child.material.clippingPlanes = planes; if (child.userData.backChild) child.userData.backChild.material.clippingPlanes = planes; + } else { + child.material.clippingPlanes = []; + if (child.userData.backChild) child.userData.backChild.material.clippingPlanes = []; } } } @@ -242,16 +245,19 @@ props.viewer.onElemReady((elem) => elem.addEventListener('load', onModelLoad))