Repository navigation
0.6.0
This release reworks how wood is shaded. Default wood output changes,
deliberately; metal, plastic and paper render byte-identically, and
generate()'s signature and the CLI are unchanged.
- Wood is now composited in linear light rather than display sRGB. Rendered
means are unchanged; relief and highlight contrast on pale species are
slightly lower. #6 - Relief is carried in real millimetres with resolution-independent normals,
so a small render now matches a downsampled large one: on a 200 mm oak board
the two agreed to within 5% (previously 33% apart). Plank gaps and bevels are
millimetres too, so a seam is the same groove at every render size. #6 - Each finish carries explicit coat state: a film build that fills pores and
levels the coat normal, a refractive index applied before the fibre lobe, and
a fibre-lobe tint.finish="none"recovers the bare board exactly. #6 - The ray-fleck lobe is a second fibre population mixed in by weight, rather
than a rotated copy of the grain texture, and sub-pixel pores are drawn at
area-honest coverage instead of full contrast at whatever pitch the board is
rendered at. #6 shade()gainsheight_spacing,coat_height,fibre_ior,cavity_depth
andray_tangent/ray_weight/ray_gain;gaussian_blur()gains
mode="edge";height_to_normal()gainsspacing;fbm_at()gains
max_freq. Every new parameter defaults to the pre-existing code path, and
a test checks the defaults are bit-identical. #6- New
tests/test_wood_optics.pyvalidates the change against closed-form
oracles rather than the implementation's own output. #6 - The README gallery and workflow notebook now show all eight wood species with
the other parameters pinned. #4 - Two wood claims in the technical reference are corrected: cherry is
diffuse-porous, and the per-species CIELAB figures are typical published
values rather than measurements. #5
One known limitation: fine-vesselled species (cherry, maple, mahogany) now
render their pores as the uniform tone the grid can carry, without per-pixel
Poisson variance. Rendering at 1000 px or more and resampling, the documented
workflow, sidesteps this.
Requires Python 3.12 or later:
pip install texture-generator==0.6.0