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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.