Commit Graph

94 Commits

Author SHA1 Message Date
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 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 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
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
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
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
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
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 b906f41f2e Merge pull request #118 from storytold/filters/histogram-scan-range-shift
Filters: histogram scan, range and shift
2026-11-02 10:38:29 +07:00
BFlat 78e6d7b334 Merge pull request #119 from storytold/materials/ground-and-metals
Materials: platinum, zinc, cobalt, bark, sand, mud, ice, snow and bone
2026-11-02 10:34:38 +07:00
bflatastic 39a2dd9d27 Merge main into filters/histogram-scan-range-shift 2026-11-02 10:27:48 +07:00
bflatastic 4913131cf7 Materials: platinum, zinc, cobalt, bark, sand, mud, ice, snow and bone
Nine procedural materials for the shelf: three metals from measured
reflectance (zinc with crystalline spangles), bark with deep furrows,
fine-grained sand, mud with glossy wet patches, ice with cloudy air
pockets under transmission, and snow and bone with a little subsurface
scattering.
2026-11-02 10:09:29 +07:00
bflatastic d103cc3cfd Leave the material library out of this branch
The new materials belong to their own change.
2026-11-02 10:02:34 +07:00
bflatastic 332cfa4070 Levels histogram: bound the neighbourhood work under a filter
A neighbourhood field covers the bounding box of its tiles, and a
scattered sample spans the whole set, so on an 8K set a blur below the
levels effect evaluated everything. With such a filter below, each
sampled tile now builds its own field.
2026-11-02 10:00:24 +07:00
bflatastic a185e5f951 Filters: histogram scan, range and shift
Three adjustment filters for masks and content: Histogram Scan slides a
ramp through the values (contrast narrows it to a step), Histogram Range
squeezes them towards a position, and Histogram Shift offsets them with
wrap-around. Names and parameters are translated into all nine other UI
languages.
2026-11-02 09:52:09 +07:00
bflatastic 83b8a13131 Levels histogram: sample every column, and read masks of empty layers
An odd tile stride: a power of two divides the row length on
power-of-two sets and read the same few columns. A mask is planned on
its own, so a paint layer with nothing painted still shows its mask's
histogram.
2026-11-02 09:44:28 +07:00
bflatastic d736ffa9af Levels: a histogram of what the effect reads
The Levels effect's properties now show a histogram of its input, the
mask below it or (on layer content) a channel picked above it, with the
input range marked. effect.histogram {effect, channel?, bins?} gives
agents the same counts. Large sets are sampled (at most 256 tiles), so
the cost stays flat up to 8K.
2026-11-02 09:23:59 +07:00
bflatastic bd8299c0c7 Merge main into fix/uv-island-fill 2026-11-02 08:27:04 +07:00
bflatastic 98e282b70d Polygon fill: UV island mode follows the UVs across split vertices
UV island fill grew the island through shared vertex indices. Imported
meshes often split vertices along hard edges, or give every face its
own, while the UVs run on; the fill then stopped at single polygons.
Triangles that share an edge in UV space now form the island.

Fixes #51.
2026-11-02 08:10:21 +07:00
bflatastic 3fea0f6c62 Materials: twill for denim and carbon fiber, a pile for velvet
Carbon Fiber, Fabric Cotton, Denim and Velvet were all the same plain
weave in different colours. A new Twill weave pattern (2/2: diagonal
ribs, the weft darker than the warp) now gives Denim its diagonal and
Carbon Fiber its light and dark tows under a clear coat; Velvet is a
soft pile with no weave under its sheen; Fabric Cotton keeps the plain
weave. Twill weave is also a fill pattern, translated into all nine
other UI languages.

Fixes #97.
2026-11-02 07:53:46 +07:00
SteamSmith 7a59356a33 test: remove the MaterialX export scratch folders when the test ends
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 19:26:57 -05:00
Agapenordev ce1932949a Merge remote-tracking branch 'origin/main' into fix/paint-with-filter-selected 2026-11-02 01:25:06 +01:00
SteamSmith fac42eac33 Merge feat/materialx-export into feat/export-colour-space 2026-11-01 19:10:21 -05:00
bflatastic 69df38ffea Texture Set List: show all, hide all, invert, and focus on one set
An eye menu above the list shows, hides or inverts every texture set;
the focus button shows only the active one, and shows them all again
when pressed a second time. textureSet.visibility {mode} does the same
for agents.

Fixes #72.
2026-11-02 07:07:45 +07:00
BFlat fcd1d28e5f Merge pull request #96 from storytold/ui/alt-click-solo-channel
Material channels: Alt+click keeps one channel
2026-11-02 07:07:25 +07:00
BFlat c8368b6a06 Merge pull request #91 from storytold/fix/unnamed-parts-reopen
Projects keep the names of a mesh's unnamed parts on reopen
2026-11-02 06:51:38 +07:00
bflatastic 7e78a2cba6 Material channels: Alt+click keeps one channel
Alt+click on a channel of a fill's or the brush's Material section turns
that channel on and every other one off (one undo step for a fill).
tool.material and layer.fill.set take solo: true for the same.

Fixes #74.
2026-11-02 06:37:04 +07:00