Commit Graph

268 Commits

Author SHA1 Message Date
bflatastic fd40f08f00 Merge remote-tracking branch 'origin/main' into settings/data-folder 2026-11-02 14:12:20 +07:00
BFlat 25850f48c4 Merge pull request #138 from storytold/fix/startup-error-report
Startup: say why when the app cannot start or has to close
2026-11-02 14:07:37 +07:00
bflatastic ec30388787 Settings: a data folder on any drive
Autosaves, smart materials, brush and export presets, project templates
and UI layouts always went to Documents/TextureCraft, which fills the
system drive. Settings > Folders > Data folder points them anywhere;
the choice applies on restart, and an export folder still at its
default follows it.

Refs #105.
2026-11-02 14:06:51 +07:00
BFlat 95c56e9468 Merge pull request #130 from storytold/docs/roadmap-2026-11-02e
Docs: roadmap after effect reorder and clipboard, mesh map images, Ctrl+drag brush, the History panel and outside contributions
2026-11-02 13:52:46 +07:00
bflatastic 6c4b549669 Say why when the app cannot start or has to close
A Windows release build has no console, so when the GPU could not be
set up or the app panicked, the window never showed or vanished without
a word. Such errors now also go to errors.log beside the settings and,
on the main thread, to a message box that names the log file.

Fixes #106.
2026-11-02 13:52:12 +07:00
bflatastic 34eae81910 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	ROADMAP.md
2026-11-02 13:25:16 +07:00
BFlat 88b2b7d2de Merge pull request #129 from storytold/fix/effect-paste-target
Effect paste: keep the active target, offer it on any row
2026-11-02 13:23:09 +07:00
BFlat 98ad4a75ed Merge pull request #77 from test-bit-sys/fix/cli-info-builtin
cli: support builtin:<id> in info command
2026-11-02 13:02:06 +07:00
BFlat 8d8bbd6e04 Merge pull request #69 from SteamSmith/feat/bake-auto-rebake
feat(bake): Auto-rebake keeps one mesh map up to date
2026-11-02 12:45:03 +07:00
BFlat d0450eb1ca Merge pull request #75 from SteamSmith/feat/materialx-import
feat(import): MaterialX (.mtlx) material import as a fill layer
2026-11-02 12:44:50 +07:00
bflatastic b5baf50454 Merge remote-tracking branch 'origin/main' into docs/roadmap-2026-11-02e
# Conflicts:
#	ROADMAP.md
2026-11-02 12:37:06 +07:00
bflatastic 5a64fa20f9 Effect paste: keep the active target, offer it on any row
A paste into a layer of another texture set set the session's target
to the new effect, so a later stroke in the active set could commit to
it. The target now changes only for a paste into the active set. The
layer and effect row menus offered Paste effect only while a layer was
already selected, though a click selects the row first; they now check
the clipboard alone.
2026-11-02 12:36:18 +07:00
bflatastic 1fc73bc87d Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	apps/texturecraft-cli/tests/cli.rs
2026-11-02 12:33:55 +07:00
BFlat fc26ad4477 Merge pull request #58 from kk376/fix/49-multigpu-adapter-selection
feat(app): support multi-GPU selection and discrete adapter preference (#49)
2026-11-02 12:33:34 +07:00
BFlat 558168d09a Merge pull request #55 from Agapenordev/fix/import-gpu-oom
Never crash importing meshes with many materials
2026-11-02 12:33:22 +07:00
BFlat 2dcffdece5 Merge pull request #56 from Agapenordev/fix/paint-with-filter-selected
Paint through a selected filter instead of refusing the stroke
2026-11-02 12:33:11 +07:00
bflatastic a50791314a Docs: roadmap after effect reorder and clipboard, mesh map images, Ctrl+drag brush and the History panel 2026-11-02 12:32:12 +07:00
BFlat 048424c6ae Merge pull request #128 from storytold/effects/copy-paste
Effects: copy, cut and paste between layers
2026-11-02 12:31:44 +07:00
bflatastic e9dfbe932f Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/de.rs
#	crates/ui-egui/src/i18n/es.rs
#	crates/ui-egui/src/i18n/fr.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ja.rs
#	crates/ui-egui/src/i18n/ko.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/zh_hans.rs
2026-11-02 12:27:15 +07:00
bflatastic 88c92dbf71 Merge remote-tracking branch 'origin/main' into HEAD 2026-11-02 12:23:33 +07:00
BFlat b31ff5f6eb Merge pull request #81 from SteamSmith/feat/export-colour-space
feat(export): choose the colour space of exported colour maps
2026-11-02 12:23:13 +07:00
BFlat fddfad71a9 Merge pull request #50 from SteamSmith/feat/materialx-export
feat(export): MaterialX (.mtlx) OpenPBR material per texture set
2026-11-02 12:23:02 +07:00
bflatastic 8c94d053b4 Merge remote-tracking branch 'origin/main' into effects/copy-paste 2026-11-02 12:20:06 +07:00
BFlat e9409b696b Merge pull request #126 from storytold/history/jump-to-step
History: click a step to return to it
2026-11-02 12:19:57 +07:00
bflatastic fbceb95242 Effects: Delete and Ctrl+D act on a selected effect
With an effect selected, Delete removed its whole layer and Ctrl+D
duplicated the layer. Both now act on the effect, like the clipboard
shortcuts; effect commands default to the selected effect.
2026-11-02 12:19:21 +07:00
BFlat 73043fd4b3 Merge pull request #125 from storytold/brush/ctrl-drag
Brush: Ctrl+drag sets size, hardness, flow and angle
2026-11-02 12:14:05 +07:00
bflatastic 4ca9f424f4 Effects: copy, cut and paste between layers
An effect's context menu copies, cuts and pastes it, and Ctrl+C,
Ctrl+X and Ctrl+V act on a selected effect (pasting a copied one above
the selected effect, or on top of the selected content or mask).
Painted strokes come along, resampled to the target set; generators
and other one-stack effects go to their stack, and a fill reading an
anchor point needs one below its new layer. effect.copy, effect.cut
and effect.paste share the layer clipboard.
2026-11-02 12:13:39 +07:00
bflatastic f8f241e804 Merge remote-tracking branch 'origin/main' into history/jump-to-step 2026-11-02 12:00:46 +07:00
BFlat 18b1969712 Merge pull request #122 from storytold/effects/reorder-duplicate
Effects: drag to reorder, duplicate
2026-11-02 12:00:32 +07:00
bflatastic b133186641 History: click a step to return to it
The History panel lists every undone step too (dimmed, next first) and
a click on any step goes back or forward to it, the current one
highlighted. edit.undo and edit.redo take {steps?} for the same jump.
2026-11-02 12:00:09 +07:00
bflatastic 296f439f53 Merge main into feat/materialx-import
# Conflicts:
#	crates/engine/src/lib.rs
2026-11-02 11:58:56 +07:00
BFlat 7b5a2a3fff Merge pull request #124 from storytold/meshmaps/import-image
Mesh maps: use an image instead of a bake
2026-11-02 11:48:51 +07:00
bflatastic 410cf3a14f Brush: Ctrl+drag sets size, hardness, flow and angle
Ctrl (Cmd on macOS) + right-drag in the 3D or 2D view changes the
brush size (left/right) and hardness (up/down), Ctrl + left-drag its
flow and angle, instead of orbiting or painting. The brush cursor stays
where the drag began, with the values beside it, and the Brush
properties name the gesture.
2026-11-02 11:48:32 +07:00
bflatastic 60428ef1c0 Auto-rebake: register its commands before the bake commands
Keeps the line clear of the one MaterialX import adds after the bake commands, so the two pull requests merge without a conflict.
2026-11-02 11:39:07 +07:00
bflatastic 8e5c748c36 Merge feat/materialx-export into feat/materialx-import
# Conflicts:
#	crates/formats/src/lib.rs
2026-11-02 11:38:19 +07:00
bflatastic d71cdfa3ca Undo: never leave a removed effect selected
Undoing an effect's add or duplicate took the selected effect away and
left the selection on it, so the row lost its highlight and strokes had
no target. The selection now falls back to the stack the effect was in.
2026-11-02 11:35:32 +07:00
bflatastic 569eb70f86 Merge remote-tracking branch 'origin/main' into pr69
# Conflicts:
#	ROADMAP.md
2026-11-02 11:34:41 +07:00
bflatastic b7543a49bc Auto-rebake: a cancelled or failed bake waits for the next input change
After Cancel or a bake error the app re-queued the same Auto-rebake on the next frame, forever, because a set only counted as up to date after a successful bake. Session::bake_abandoned records the set being baked and the queued ones as seen; cancel_bake and the bake error paths call it. Also drops a useless into_iter() and an unreachable branch in bake.autoRebake.
2026-11-02 11:34:16 +07:00
bflatastic f6bd07e4d6 Mesh maps: use an image instead of a bake
Each mesh map slot of the Texture Set Settings takes an image resource:
drop one from the Assets panel on the slot, or pick it from the slot's
menu, which also clears the slot. The image is resampled to the size of
the set's other mesh maps (or its bake size), its values read as data,
a normal map in the project's normal format.
textureSet.meshMap.set {ts?, map, image} and
textureSet.meshMap.clear {ts?, map} give agents the same.
2026-11-02 11:32:20 +07:00
bflatastic 74a036540e Merge remote-tracking branch 'origin/main' into pr75
# Conflicts:
#	ROADMAP.md
2026-11-02 11:26:21 +07:00
bflatastic 9d1a989efa MaterialX import: clamp uvtiling like a fill's UV scale, reuse the resource size limit
uvtiling is clamped to 0.001..=1000, the range layer.fill.projection accepts. Image files are capped by resource_cmds::MAX_BYTES instead of a second copy of the number.
2026-11-02 11:26:02 +07:00
bflatastic 76b24c4e3d Export colour space: tag MaterialX colour maps with it, warn when a colour map is not converted
The .mtlx tags colour textures with the export's colour space: srgb_texture, lin_rec709, acescg, or lin_ap0_scene for ACES2065-1 (MaterialX 1.39 has no AP0 space; the export warns). A colour map packed into one channel (L) is not converted and now says so. The $colorSpace variable's description lists every value.
2026-11-02 11:24:24 +07:00
bflatastic baf2390691 Merge feat/materialx-export into feat/export-colour-space
# Conflicts:
#	ROADMAP.md
2026-11-02 11:19:11 +07:00
bflatastic bc57653868 Merge remote-tracking branch 'origin/main' into pr50
# Conflicts:
#	ROADMAP.md
2026-11-02 11:15:32 +07:00
bflatastic cc90af09e0 MaterialX export: tag colour maps with their file's colour space, write the .mtlx atomically, warn on clashing set names
Float files (EXR, HDR) hold linear values, so their colour maps are tagged lin_rec709 instead of srgb_texture. The .mtlx goes through formats::write_atomic, and a set whose name sanitises to an earlier set's file name is skipped with a warning instead of overwriting it.
2026-11-02 11:15:03 +07:00
bflatastic 0d2f1873cd Effects: drag to reorder, duplicate
Effect rows in the layer stack can be dragged within their stack (a
drop lands above the row, or below it from its lower half), and their
context menu duplicates an effect just above itself, painted pixels
included. effect.move {effect, index} and effect.duplicate {effect}
give agents the same.
2026-11-02 11:13:00 +07:00
BFlat c26847e21c Merge pull request #79 from Rebornim/fix/thickness-default-max-distance
Bake: thickness max occluder distance defaults to 0.1
2026-11-02 11:07:39 +07:00
BFlat 5ce23ce2c8 Merge pull request #121 from storytold/fix/histogram-scan-step
Histogram Scan: full contrast is a threshold
2026-11-02 10:56:00 +07:00
BFlat c4f523063b Merge pull request #120 from storytold/docs/roadmap-2026-11-02d
Docs: roadmap after the levels histogram, web save prompt, filters and materials
2026-11-02 10:50:27 +07:00
bflatastic d5c2f793fd Histogram Scan: full contrast is a threshold
At contrast 1 the narrowest ramp still sent a value equal to the position to mid gray. It now matches Threshold: the position and everything above it go to white.
2026-11-02 10:39:41 +07:00