diff --git a/src/tools/Selection.vue b/src/tools/Selection.vue index aa0fc9b..16799d9 100644 --- a/src/tools/Selection.vue +++ b/src/tools/Selection.vue @@ -19,7 +19,7 @@ let selectionEnabled = ref(false); let selectedMaterials = defineModel>>({default: []}); let hasListener = false; let mouseDownAt: [number, number] | null = null; -let selectFilter = ref('Faces'); +let selectFilter = ref('Any'); const ray_caster = new Raycaster(); let selectionMoveListener = (event: MouseEvent) => { @@ -51,13 +51,17 @@ let selectionListener = (event: MouseEvent) => { ray_caster.ray.direction.copy( scene.getTarget().clone().add(scene.target.position).sub((scene as any).camera.position).normalize()); } - console.log('NDC', ndcCoords, 'Camera', (scene as any).camera, 'Ray', ray_caster.ray); + // console.log('NDC', ndcCoords, 'Camera', (scene as any).camera, 'Ray', ray_caster.ray); const hits = ray_caster.intersectObject(scene, true); - console.log(hits) let hit = hits.find((hit) => { - let isFace = hit.faceIndex !== null; - return hit.object.visible && !hit.object.userData.noHit && isFace == (selectFilter.value === 'Faces'); + const kind = hit.object.type + const kindOk = (selectFilter.value === 'Any') || + ((kind === 'Mesh' || kind === 'SkinnedMesh') && selectFilter.value === 'Faces') || + (kind === 'Line' && selectFilter.value === 'Edges') || + (kind === 'Points' && selectFilter.value === 'Vertices'); + return hit.object.visible && !hit.object.userData.noHit && kindOk; }) as Intersection | undefined; + console.log('Hit', hit) if (!hit) { deselectAll(); } else { @@ -137,7 +141,8 @@ function toggleSelection() { diff --git a/src/tools/Tools.vue b/src/tools/Tools.vue index 6fc38c7..43980e7 100644 --- a/src/tools/Tools.vue +++ b/src/tools/Tools.vue @@ -36,7 +36,11 @@ const LicensesDialogContent = defineAsyncComponent({ let props = defineProps<{ viewer: InstanceType | null }>(); + let selection: Ref>> = ref([]); +let selectionFaceCount = () => selection.value.filter((s) => s.object.type == "Mesh" || s.object.type == "SkinnedMesh").length +let selectionEdgeCount = () => selection.value.filter((s) => s.object.type == "Line").length +let selectionVertexCount = () => selection.value.filter((s) => s.object.type == "Points").length function syncOrthoCamera(force: boolean) { let scene = props.viewer?.scene; @@ -93,7 +97,6 @@ async function downloadSceneGlb() { async function openGithub() { window.open('https://github.com/yeicor-3d/yet-another-cad-viewer', '_blank') } -