Skip to content

0.6.0

Choose a tag to compare

@nmpowell nmpowell released this 11 Sep 07:29

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() gains height_spacing, coat_height, fibre_ior, cavity_depth
    and ray_tangent/ray_weight/ray_gain; gaussian_blur() gains
    mode="edge"; height_to_normal() gains spacing; 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.py validates 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

Full changelog