Skip to content

Commit eaff69a

Browse files
joeedhclaude
andcommitted
Image editor: slim down to image-loading; park legacy UV editor
The image editor fused two concerns: loading/displaying images and a full UV editor (UVEditor component, UV picking, select/transform/flag ToolOps, unwrap tools sidebar). To support sculptcore and a future UV-editing abstraction, split them apart. - Park the legacy implementation, unwired, under scripts/editors/image/pending-port/ (ImageEditor.ts, uv_ops.js, uv_selectops.js, uv_transformops.js) with a TODO.md port checklist. Nothing imports them, so they fall out of the TS module graph (tsconfig uses `files`) and are neither typechecked nor bundled. ImageBus.ts stays put: it is a cross-cutting bus token still used by the mesh unwrapper. - New minimal ImageEditor: loads images into ImageBlocks (image.open(), Ctrl+O, DataBlockBrowser) and displays the active image with a checker background + textured quad and pan/zoom. Owns the ImageUser directly, so the active image now lives at `imageEditor.imageUser.image` (was `imageEditor.uvEditor.imageUser.image`). - Update cross-layer consumers to the new path / decouple them: context.activeTexture, image_ops.js dataPath default, and mesh_uvops_base.ts (stops reaching into editor.uvEditor; defaults selectedFacesOnly=true until the new UV layer restores a binding). Regenerate the datapath catalog and update documentation/editors.md. A new UV-editing abstraction layer will be designed in a follow-up plan; see scripts/editors/image/pending-port/TODO.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent b9be8b2 commit eaff69a

13 files changed

Lines changed: 2273 additions & 2615 deletions

File tree

‎addons/builtin/mesh/src/mesh_uvops_base.ts‎

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {View3DOp} from '@framework/api'
55
import {MeshOp} from './mesh_ops_base'
66
import {Loop} from './mesh_types'
77
import type {ViewContext} from '@framework/api'
8-
import type {ImageEditor} from '@framework/api'
98

109
export class MeshOpBaseUV<InputSet extends PropertySlots = {}, OutputSet extends PropertySlots = {}> //
1110
extends MeshOp<
@@ -36,12 +35,11 @@ export class MeshOpBaseUV<InputSet extends PropertySlots = {}, OutputSet extends
3635
const tool = super.invoke(ctx, args) as MeshOpBaseUV
3736

3837
if (!('selectedFacesOnly' in args)) {
39-
const editor = ctx.editors.imageEditor as ImageEditor
40-
if (editor) {
41-
const uve = editor.uvEditor
42-
43-
tool.inputs.selectedFacesOnly.setValue(uve.selectedFacesOnly)
44-
}
38+
// The legacy UVEditor's per-editor `selectedFacesOnly` preference is
39+
// gone (UV editing is being re-designed; see
40+
// scripts/editors/image/pending-port/TODO.md). Default to the historical
41+
// value until the new UV abstraction restores a real binding.
42+
tool.inputs.selectedFacesOnly.setValue(true)
4543
}
4644

4745
return tool as ReturnType<typeof ToolOp.invoke>
@@ -135,11 +133,9 @@ export class UVOpBase<InputSet extends PropertySlots = {}, OutputSet extends Pro
135133
const tool = super.invoke(ctx, args) as unknown as UVOpBase
136134

137135
if (!('selectedFacesOnly' in args)) {
138-
const imageEditor = ctx.editors.imageEditor
139-
if (imageEditor) {
140-
const uve = imageEditor.uvEditor
141-
tool.inputs.selectedFacesOnly.setValue(uve.selectedFacesOnly)
142-
}
136+
// See note in MeshOpBaseUV.invoke: the legacy UVEditor preference is gone
137+
// until the new UV abstraction is designed.
138+
tool.inputs.selectedFacesOnly.setValue(true)
143139
}
144140

145141
return tool as ReturnType<typeof ToolOp.invoke>

‎documentation/editors.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ path.ux Area (scripts/path.ux/scripts/screen/ScreenArea.js)
4747
├─ NodeEditor — shader node graph
4848
├─ MaterialEditor — material shader editor (extends NodeEditor)
4949
├─ NodeViewer — scene graph viewer
50-
├─ ImageEditor — UV/image editor
50+
├─ ImageEditor — image loader/viewer (UV editing parked; see pending-port)
5151
├─ ConsoleEditor — JS console
5252
├─ SettingsEditor — application preferences
5353
├─ DebugEditor — GPU debug viewer
@@ -232,7 +232,7 @@ main content area. UI widgets are added to this container.
232232
| NodeEditor | `node-editor-x` | `NodeEditor` | `editors/node/NodeEditor.js` | Shader node graph editor with pan/zoom and node connections |
233233
| MaterialEditor | `material-editor-x` | `MaterialEditor` | `editors/node/MaterialEditor.js` | Material-specific node editor with material slot selection |
234234
| NodeViewer | `nodegraph-viewer-x` | `nodegraph_viewer` | `editors/node/NodeEditor_debug.js` | Read-only scene graph visualization |
235-
| ImageEditor | `uv-image-editor-x` | `ImageEditor` | `editors/image/ImageEditor.ts` | UV editor with image display and UV transform tools |
235+
| ImageEditor | `uv-image-editor-x` | `ImageEditor` | `editors/image/ImageEditor.ts` | Loads images into `ImageBlock`s and displays the active image (pan/zoom). The legacy UV-editing implementation is parked, unwired, under `editors/image/pending-port/` pending a new UV abstraction — see its `TODO.md`. |
236236
| ConsoleEditor | `console-editor-x` | `console_editor` | `editors/console/console.js` | JavaScript console with history and autocomplete |
237237
| SettingsEditor | `settings-editor-x` | `settings-editor` | `editors/settings/SettingsEditor.js` | Application preferences (general, theme, addons) |
238238
| DebugEditor | `debug-editor-x` | `DebugEditor` | `editors/debug/DebugEditor.js` | GPU debug viewer for inspecting framebuffers and textures |

‎scripts/core/context.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,16 +414,16 @@ export class ViewContext extends ToolContext {
414414
return undefined
415415
}
416416

417-
const uve = editor.uvEditor
418-
if (!uve.imageUser.image || !uve.imageUser.image.ready) {
419-
if (uve.imageUser.image) {
420-
uve.imageUser.image.update()
417+
const image = editor.imageUser.image
418+
if (!image || !image.ready) {
419+
if (image) {
420+
image.update()
421421
}
422422

423423
return undefined
424424
}
425425

426-
return uve.imageUser.image
426+
return image
427427
}
428428

429429
activeTexture_save() {

‎scripts/data_api/generated/API_PATHS.md‎

Lines changed: 27 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -84,29 +84,28 @@ methods, and `<prop path="...">` xmlpage tags. `[n]` marks a list index.
8484
| `imageEditor.pos` | prop | Vec2Property | Position | |
8585
| `imageEditor.size` | prop | Vec2Property | Size | |
8686
| `imageEditor.type` | prop | StringProperty | Type | |
87-
| `imageEditor.uvEditor` | struct | | | |
88-
| `imageEditor.uvEditor.velpan` | struct | | | |
89-
| `imageEditor.uvEditor.velpan.pos` | prop | Vec2Property | Position | |
90-
| `imageEditor.uvEditor.velpan.scale` | prop | Vec2Property | Scale | |
91-
| `imageEditor.uvEditor.velpan.min` | prop | Vec2Property | Boundary Minimum | |
92-
| `imageEditor.uvEditor.velpan.max` | prop | Vec2Property | Boundary Maximum | |
93-
| `imageEditor.uvEditor.imageUser` | struct | | | |
94-
| `imageEditor.uvEditor.imageUser.image` | struct | | | |
95-
| `imageEditor.uvEditor.imageUser.image.graph_flag` | prop | FlagProperty | Graph Flags | enum {1, 2, 4, 8, 16, 32, 64, 128, 256, 384, SELECT, UPDATE, SORT_TAG, CYCLE_TAG, DISABLED, ZOMBIE, SAVE_PROXY, FORCE_SOCKET_INHERIT, FORCE_FLAG_INHERIT, FORCE_INHERIT} |
96-
| `imageEditor.uvEditor.imageUser.image.graph_id` | prop | IntProperty | Graph ID | |
97-
| `imageEditor.uvEditor.imageUser.image.inputs` | list | | | |
98-
| `imageEditor.uvEditor.imageUser.image.outputs` | list | | | |
99-
| `imageEditor.uvEditor.imageUser.image.lib_id` | prop | IntProperty | Lib ID | |
100-
| `imageEditor.uvEditor.imageUser.image.lib_flag` | prop | FlagProperty | Flag | enum {1, 2, 4, 8, SELECT, HIDE, FAKE_USER, NO_SAVE} |
101-
| `imageEditor.uvEditor.imageUser.image.name` | prop | StringProperty | name | |
102-
| `imageEditor.uvEditor.imageUser.image.type` | prop | EnumProperty | Image Type | enum {0, 1, 2, 3, GENERATED, BYTE_BUFFER, FLOAT_BUFFER, URL} |
103-
| `imageEditor.uvEditor.imageUser.image.genType` | prop | EnumProperty | Generator | enum {0, 1, COLOR, UVGRID} |
104-
| `imageEditor.uvEditor.imageUser.image.width` | prop | IntProperty | Width | range 1..16384 |
105-
| `imageEditor.uvEditor.imageUser.image.height` | prop | IntProperty | Height | range 1..16384 |
106-
| `imageEditor.uvEditor.imageUser.image.url` | prop | StringProperty | URL | |
107-
| `imageEditor.uvEditor.imageUser.image.ready` | prop | BoolProperty | Ready | |
108-
| `imageEditor.uvEditor.imageUser.image.flag` | prop | FlagProperty | Flag | enum {1, 2, 4, SELECT, HIDE, UPDATE} |
109-
| `imageEditor.uvEditor.imageUser.image.genColor` | prop | Vec4Property | Color | range 0..1 |
87+
| `imageEditor.imageUser` | struct | | | |
88+
| `imageEditor.imageUser.image` | struct | | | |
89+
| `imageEditor.imageUser.image.graph_flag` | prop | FlagProperty | Graph Flags | enum {1, 2, 4, 8, 16, 32, 64, 128, 256, 384, SELECT, UPDATE, SORT_TAG, CYCLE_TAG, DISABLED, ZOMBIE, SAVE_PROXY, FORCE_SOCKET_INHERIT, FORCE_FLAG_INHERIT, FORCE_INHERIT} |
90+
| `imageEditor.imageUser.image.graph_id` | prop | IntProperty | Graph ID | |
91+
| `imageEditor.imageUser.image.inputs` | list | | | |
92+
| `imageEditor.imageUser.image.outputs` | list | | | |
93+
| `imageEditor.imageUser.image.lib_id` | prop | IntProperty | Lib ID | |
94+
| `imageEditor.imageUser.image.lib_flag` | prop | FlagProperty | Flag | enum {1, 2, 4, 8, SELECT, HIDE, FAKE_USER, NO_SAVE} |
95+
| `imageEditor.imageUser.image.name` | prop | StringProperty | name | |
96+
| `imageEditor.imageUser.image.type` | prop | EnumProperty | Image Type | enum {0, 1, 2, 3, GENERATED, BYTE_BUFFER, FLOAT_BUFFER, URL} |
97+
| `imageEditor.imageUser.image.genType` | prop | EnumProperty | Generator | enum {0, 1, COLOR, UVGRID} |
98+
| `imageEditor.imageUser.image.width` | prop | IntProperty | Width | range 1..16384 |
99+
| `imageEditor.imageUser.image.height` | prop | IntProperty | Height | range 1..16384 |
100+
| `imageEditor.imageUser.image.url` | prop | StringProperty | URL | |
101+
| `imageEditor.imageUser.image.ready` | prop | BoolProperty | Ready | |
102+
| `imageEditor.imageUser.image.flag` | prop | FlagProperty | Flag | enum {1, 2, 4, SELECT, HIDE, UPDATE} |
103+
| `imageEditor.imageUser.image.genColor` | prop | Vec4Property | Color | range 0..1 |
104+
| `imageEditor.velpan` | struct | | | |
105+
| `imageEditor.velpan.pos` | prop | Vec2Property | Position | |
106+
| `imageEditor.velpan.scale` | prop | Vec2Property | Scale | |
107+
| `imageEditor.velpan.min` | prop | Vec2Property | Boundary Minimum | |
108+
| `imageEditor.velpan.max` | prop | Vec2Property | Boundary Maximum | |
110109

111110
## last_tool
112111

@@ -933,80 +932,17 @@ methods, and `<prop path="...">` xmlpage tags. `[n]` marks a list index.
933932
| `toolDefaults.object.select_box.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, AUTO} |
934933
| `toolDefaults.object.apply_transform` | struct | | | |
935934
| `toolDefaults.object.apply_transform.mode` | prop | FlagProperty | Mode | enum {LOC, ROT, SCALE, ALL} |
936-
| `toolDefaults.uveditor` | struct | | | |
937-
| `toolDefaults.uveditor.toggle_select_all` | struct | | | |
938-
| `toolDefaults.uveditor.toggle_select_all.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, AUTO} |
939-
| `toolDefaults.uveditor.toggle_select_all.selectMask` | prop | FlagProperty | Select Mask | enum {VERTEX, EDGE, FACE} |
940-
| `toolDefaults.uveditor.toggle_select_all.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
941-
| `toolDefaults.uveditor.pick_select_linked` | struct | | | |
942-
| `toolDefaults.uveditor.pick_select_linked.loopEid` | prop | IntProperty | Loop Eid | |
943-
| `toolDefaults.uveditor.pick_select_linked.cdUV` | prop | IntProperty | Cd Uv | |
944-
| `toolDefaults.uveditor.pick_select_linked.immediateMode` | prop | BoolProperty | Immediate Mode | |
945-
| `toolDefaults.uveditor.pick_select_linked.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, AUTO} |
946-
| `toolDefaults.uveditor.pick_select_linked.selectMask` | prop | FlagProperty | Select Mask | enum {VERTEX, EDGE, FACE} |
947-
| `toolDefaults.uveditor.pick_select_linked.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
948-
| `toolDefaults.uveditor.select_one` | struct | | | |
949-
| `toolDefaults.uveditor.select_one.loopEids` | prop | ListProperty | Loop Eids | |
950-
| `toolDefaults.uveditor.select_one.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, UNIQUE} |
951-
| `toolDefaults.uveditor.select_one.selectMask` | prop | FlagProperty | Select Mask | enum {VERTEX, EDGE, FACE} |
952-
| `toolDefaults.uveditor.select_one.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
953-
| `toolDefaults.uveditor.translate` | struct | | | |
954-
| `toolDefaults.uveditor.translate.offset` | prop | Vec2Property | Offset | |
955-
| `toolDefaults.uveditor.translate.meshPath` | prop | StringProperty | Mesh Path | |
956-
| `toolDefaults.uveditor.translate.propMode` | prop | EnumProperty | Prop Mode | enum {SMOOTH, SHARP, EXTRA_SHARP, SPHERE, LINEAR, CONSTANT} |
957-
| `toolDefaults.uveditor.translate.propRadius` | prop | FloatProperty | Prop Radius | |
958-
| `toolDefaults.uveditor.translate.propIslandOnly` | prop | BoolProperty | Prop Island Only | |
959-
| `toolDefaults.uveditor.translate.propEnabled` | prop | BoolProperty | Prop Enabled | |
960-
| `toolDefaults.uveditor.translate.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
961-
| `toolDefaults.uveditor.scale` | struct | | | |
962-
| `toolDefaults.uveditor.scale.scale` | prop | Vec2Property | Scale | |
963-
| `toolDefaults.uveditor.scale.meshPath` | prop | StringProperty | Mesh Path | |
964-
| `toolDefaults.uveditor.scale.propMode` | prop | EnumProperty | Prop Mode | enum {SMOOTH, SHARP, EXTRA_SHARP, SPHERE, LINEAR, CONSTANT} |
965-
| `toolDefaults.uveditor.scale.propRadius` | prop | FloatProperty | Prop Radius | |
966-
| `toolDefaults.uveditor.scale.propIslandOnly` | prop | BoolProperty | Prop Island Only | |
967-
| `toolDefaults.uveditor.scale.propEnabled` | prop | BoolProperty | Prop Enabled | |
968-
| `toolDefaults.uveditor.scale.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
969-
| `toolDefaults.uveditor.rotate` | struct | | | |
970-
| `toolDefaults.uveditor.rotate.rotation` | prop | FloatProperty | Rotation | |
971-
| `toolDefaults.uveditor.rotate.meshPath` | prop | StringProperty | Mesh Path | |
972-
| `toolDefaults.uveditor.rotate.propMode` | prop | EnumProperty | Prop Mode | enum {SMOOTH, SHARP, EXTRA_SHARP, SPHERE, LINEAR, CONSTANT} |
973-
| `toolDefaults.uveditor.rotate.propRadius` | prop | FloatProperty | Prop Radius | |
974-
| `toolDefaults.uveditor.rotate.propIslandOnly` | prop | BoolProperty | Prop Island Only | |
975-
| `toolDefaults.uveditor.rotate.propEnabled` | prop | BoolProperty | Prop Enabled | |
976-
| `toolDefaults.uveditor.rotate.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
977-
| `toolDefaults.uveditor.project_uvs` | struct | | | |
978-
| `toolDefaults.uveditor.project_uvs.matrix` | prop | Mat4Property | Matrix | |
979-
| `toolDefaults.uveditor.project_uvs.selectedOnly` | prop | BoolProperty | Selected Only | |
980-
| `toolDefaults.uveditor.project_uvs.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
981-
| `toolDefaults.uveditor.set_flag` | struct | | | |
982-
| `toolDefaults.uveditor.set_flag.flag` | prop | FlagProperty | Flag | enum {2, PIN} |
983-
| `toolDefaults.uveditor.set_flag.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, AUTO} |
984-
| `toolDefaults.uveditor.set_flag.selectMask` | prop | FlagProperty | Select Mask | enum {VERTEX, EDGE, FACE} |
985-
| `toolDefaults.uveditor.set_flag.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
986-
| `toolDefaults.uveditor.clear_flag` | struct | | | |
987-
| `toolDefaults.uveditor.clear_flag.flag` | prop | FlagProperty | Flag | enum {2, PIN} |
988-
| `toolDefaults.uveditor.clear_flag.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, AUTO} |
989-
| `toolDefaults.uveditor.clear_flag.selectMask` | prop | FlagProperty | Select Mask | enum {VERTEX, EDGE, FACE} |
990-
| `toolDefaults.uveditor.clear_flag.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
991-
| `toolDefaults.uveditor.toggle_flag` | struct | | | |
992-
| `toolDefaults.uveditor.toggle_flag.flag` | prop | FlagProperty | Flag | enum {2, PIN} |
993-
| `toolDefaults.uveditor.toggle_flag.mode` | prop | EnumProperty | Mode | enum {ADD, SUB, AUTO} |
994-
| `toolDefaults.uveditor.toggle_flag.selectMask` | prop | FlagProperty | Select Mask | enum {VERTEX, EDGE, FACE} |
995-
| `toolDefaults.uveditor.toggle_flag.selectedFacesOnly` | prop | BoolProperty | Selected Faces Only | |
996-
| `toolDefaults.image` | struct | | | |
997-
| `toolDefaults.image.set_type` | struct | | | |
998-
| `toolDefaults.image.set_type.image` | prop | DataRefProperty | Image | |
999-
| `toolDefaults.image.set_type.type` | prop | EnumProperty | Type | enum {0, 1, 2, 3, GENERATED, BYTE_BUFFER, FLOAT_BUFFER, URL} |
1000-
| `toolDefaults.image.open` | struct | | | |
1001-
| `toolDefaults.image.open.fileName` | prop | StringProperty | File Name | |
1002-
| `toolDefaults.image.open.dataURL` | prop | StringProperty | Data Url | |
1003-
| `toolDefaults.image.open.dataPath` | prop | StringProperty | Data Path | |
1004935
| `toolDefaults.tet` | struct | | | |
1005936
| `toolDefaults.tet.solidify_wireframe` | struct | | | |
1006937
| `toolDefaults.tet.solidify_wireframe.size` | prop | FloatProperty | Size | |
1007938
| `toolDefaults.tet.solidify_wireframe.maxDepth` | prop | IntProperty | Max Depth | |
1008939
| `toolDefaults.tet.solidify_wireframe.minDepth` | prop | IntProperty | Min Depth | |
1009940
| `toolDefaults.tet.solidify_wireframe.project` | prop | BoolProperty | Project | |
941+
| `toolDefaults.image` | struct | | | |
942+
| `toolDefaults.image.open` | struct | | | |
943+
| `toolDefaults.image.open.fileName` | prop | StringProperty | File Name | |
944+
| `toolDefaults.image.open.dataURL` | prop | StringProperty | Data Url | |
945+
| `toolDefaults.image.open.dataPath` | prop | StringProperty | Data Path | |
1010946
| `toolDefaults.strand` | struct | | | |
1011947
| `toolDefaults.strand.create` | struct | | | |
1012948
| `toolDefaults.strand.create.target` | prop | DataRefProperty | Target | |

0 commit comments

Comments
 (0)