63 -> 72 materials. Cobblestone uses rounded cells with sunken joints, gravel
fine Voronoi stones, plaster a soft troweled tooth; linen a coarse weave, wool
and moss a soft sheen.
A pen lifts reporting no pressure, and a tap paints on that frame, so a tap
painted at full pressure. The release now keeps the pen's contact pressure (a
touch without pressure, such as a finger, starts fresh).
Browsers report pen pressure only for pens that send touch events; desktop
browsers deliver pens as a mouse, so the docs say so.
A UV tile with a lower resolution than its atlas block fills the block's
corner, so it has fewer texels per UV unit. Neighbourhood filters (blur,
sharpen, warps, bevel, glow, ...) and height-to-normal slopes used the block's
texel density for every tile, so such a tile blurred twice as wide and showed
twice as steep slopes in UV space.
TextureSet::block_scales gives each block's share; the compositor filters each
block at its tile's radius, texture export and the CPU path tracer scale the
slope by it, and the display packs it into the Extra texture's alpha for the
viewport and GPU path tracer shaders (parallax too).
The 2D view painted at full pressure whatever the pen reported; it now reads
the same touch force as the 3D view. Docs say where pen pressure works today
(Windows Ink and the browser) and that Linux and macOS pens arrive as a mouse
until the windowing layer reports them.
layer.add.image read the projection params only when `projection` was
given, so an offset or rotation alone was dropped. The features list no
longer promises a cylindrical offset.
Flipping every fill image on a normal channel in a DirectX project
would also flip the OpenGL maps MaterialX import puts there, and change
how existing DirectX projects look. Fill images read as before; the
setting covers mesh map images (converted when set, so the tooltip
says to set them again) and the export default.
A fill's properties showed only its projection and scale, and
layer.fill.projection rebuilt the projection from its params, so
changing the scale reset a rotation set before and no offset could be
set at all. The command now changes only the fields it is given
(scale, also per axis; rotation; offset; sharpness; axis) and keeps the
rest while the kind stays the same. Properties show the UV rotation and
offset, the tri-planar blend sharpness, and the axis and world offset
of planar and cylindrical projections.
The project's normal map format (OpenGL or DirectX) could only be set
by command or a template, and fill images on a normal channel were
always read as OpenGL, so a DirectX map's detail came out inverted.
Texture Set Settings now has a Normal map format row, and a fill's
image on a normal channel is read in that format, as mesh map images
already were. A change of format recomposites the sets.
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.
Keeps both sides of the translation tables, AGENTS rules and the formats module list;
material files in the browser load before the ask-to-save step (they add a layer, not a
new project); Arabic for the eight MaterialCraft strings; menu parity regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A fill channel's source menu offered a uniform value, procedurals and
anchors, but no image, so a normal or roughness map could not be put on
its channel. The menu now lists the image resources and Import..., and
an image dropped from the Assets panel onto a channel becomes its
source. The mesh map slots share the same menu and drop target.
Fixes#127.
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.
- core: Fill::link (MaterialLink: package resource, graph, exposed inputs, presets,
image inputs, size); BakedMap::interop_id / for_input shared mesh-map identifiers
- formats: own .mcmat reader (no MaterialCraft dependency) and 16-bit mesh-map PNGs
- engine: material.load takes .mcmat and .mcraft; material.link.set / .preset / .cook /
.saveSource; LinkJob re-cooks through materialcraft-cli at the texture set's
resolution with baked mesh maps as graph inputs; fresh resource names per cook keep
undo and the decoded-image cache consistent; packages count as used resources
- ui: linked-material section in fill properties (presets, sliders, colors, toggles,
options) cooking on a worker thread, one process per layer, stale results redone;
Open in MaterialCraft; File > Import material...; .mcmat drops; library shelf lists
.mcmat and rescans on focus; 8 new strings in every language
- tests: materialcraft_link (import, params, undo, duplicates, mesh maps, save, and a
real materialcraft-cli round trip when MATERIALCRAFT_CLI is set)
- docs: README, features, control protocol, architecture, AGENTS, ROADMAP, parity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
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.
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.