From 1091603955f11db7ec5fb900b5d540e90aa83ba0 Mon Sep 17 00:00:00 2001 From: kettek Date: Wed, 8 Jan 2025 22:33:36 -0800 Subject: [PATCH] Add experimental 3D clipping view --- frontend/src/App.svelte | 9 +++++++++ frontend/src/components/3d/ClipView.svelte | 17 ++++++++++++++++ frontend/src/components/3d/Scene.svelte | 23 +++++++++++++++------- frontend/src/sections/Clip3D.svelte | 16 +++++++++++++++ frontend/src/stores/editor3d.ts | 16 +++++++++++++++ 5 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/3d/ClipView.svelte create mode 100644 frontend/src/sections/Clip3D.svelte diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index edb0ef4..96abc7b 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -65,6 +65,7 @@ import PalettePopup from './components/PalettePopup.svelte' import FileUnsaved from './components/FileUnsaved.svelte' import FilesUnsaved from './components/FilesUnsaved.svelte' + import Clip3D from './sections/Clip3D.svelte' let is3D: boolean = true @@ -148,6 +149,8 @@ let savingFileIndex: number = -1 let showUnsavedFilesModal: boolean = false + let show3DClipView: boolean = false + function selectFile(file: LoadedFile, index: number, id: number) { if (index < 0 || index >= fileStates.length()) return @@ -643,6 +646,7 @@
Windows
(showPreview = true)} /> + (show3DClipView = true)} /> e.stopPropagation()} bind:checked={$editor2DSettings.minifiedLeftPanel} labelText="Minified Palettes Panel" /> @@ -881,6 +885,11 @@ {/if} + {#if show3DClipView} + + + + {/if} {#if is3D && showRotate && $toolSettings.current === toolVoxelBoxSelection} diff --git a/frontend/src/components/3d/ClipView.svelte b/frontend/src/components/3d/ClipView.svelte new file mode 100644 index 0000000..9f30b30 --- /dev/null +++ b/frontend/src/components/3d/ClipView.svelte @@ -0,0 +1,17 @@ + + + + + + diff --git a/frontend/src/components/3d/Scene.svelte b/frontend/src/components/3d/Scene.svelte index 756ba3f..074ae49 100644 --- a/frontend/src/components/3d/Scene.svelte +++ b/frontend/src/components/3d/Scene.svelte @@ -24,6 +24,7 @@ import { isKeyActive } from '../Shortcuts.svelte' import OptimizedRender from './OptimizedRender.svelte' import Point from './Point.svelte' + import ClipView from './ClipView.svelte' export let file: LoadedFile export let palette: Palette | undefined @@ -426,13 +427,17 @@ {#if $file.frame} {#each $file.frame.slices as slice, y} - {#each $file.canvas.getPixels(slice.x, slice.y, $file.frameWidth, $file.frameHeight) as pixel, index} - {#if pixel !== 0} - {@const x = index % $file.frameWidth} - {@const z = Math.floor(index / $file.frameWidth)} - - {/if} - {/each} + {#if !$editor3DSettings.useClipping || (y >= $editor3DSettings.clipY && y <= $editor3DSettings.clipY + $editor3DSettings.clipH)} + {#each $file.canvas.getPixels(slice.x, slice.y, $file.frameWidth, $file.frameHeight) as pixel, index} + {#if pixel !== 0} + {@const x = index % $file.frameWidth} + {@const z = Math.floor(index / $file.frameWidth)} + {#if !$editor3DSettings.useClipping || (x >= $editor3DSettings.clipX && x <= $editor3DSettings.clipX + $editor3DSettings.clipW && z >= $editor3DSettings.clipZ && z <= $editor3DSettings.clipZ + $editor3DSettings.clipD)} + + {/if} + {/if} + {/each} + {/if} {/each} {/if} @@ -468,6 +473,10 @@ +{#if $editor3DSettings.useClipping} + +{/if} + {#if $toolSettings.current === toolVoxelCursor || $toolSettings.current === toolVoxelBoxSelection || pasting.length > 0} {/if} diff --git a/frontend/src/sections/Clip3D.svelte b/frontend/src/sections/Clip3D.svelte new file mode 100644 index 0000000..a8d1014 --- /dev/null +++ b/frontend/src/sections/Clip3D.svelte @@ -0,0 +1,16 @@ + + +
+ + + + +
+ + + +
diff --git a/frontend/src/stores/editor3d.ts b/frontend/src/stores/editor3d.ts index 389a567..c1b3900 100644 --- a/frontend/src/stores/editor3d.ts +++ b/frontend/src/stores/editor3d.ts @@ -19,6 +19,14 @@ type Editor3DSettings = { showCursor: boolean // Voxels hoverScale: boolean + // Clipping + useClipping: boolean + clipX: number + clipY: number + clipZ: number + clipW: number + clipH: number + clipD: number } export const editor3DSettings = makeLocalStorageStore('editor3d', { @@ -40,4 +48,12 @@ export const editor3DSettings = makeLocalStorageStore('editor3 showCursor: true, // Voxels hoverScale: true, + // Clipping + useClipping: false, + clipX: 0, + clipY: 0, + clipZ: 0, + clipW: 0, + clipH: 0, + clipD: 0, })