Bring the anvil's horn back to its reference proportion, rebuild the book's metal furniture so no two overlapping faces share a plane, and release 0.2.0.

This commit is contained in:
CRTkafa 2026-09-01 03:00:37 +07:00
parent 3f57165d06
commit 9b4ce16c59
82 changed files with 9725 additions and 5064 deletions

View file

@ -51,13 +51,26 @@ export interface WoodenBarrelConfig {
export const woodenBarrelDefaults: WoodenBarrelConfig = {
height: 1.04,
radius: 0.41,
taper: 0.17,
// 0.22, not 0.17. A cask is noticeably bellied and this one was close to a
// drum; at 0.22 the belly is 1.28 times the ends, which is what the reference
// measures.
taper: 0.22,
// Stave and hoop counts come from a reference photograph of a real cask,
// not from taste. Thirteen staves left a visibly polygonal silhouette and
// four hoops read as too few for the height.
// not from taste. Thirteen staves left a visibly polygonal silhouette, so
// seventeen it is.
//
// Six hoops was wrong, and the note that used to sit here saying four read as
// too few was written against a different photograph. Our reference carries
// four wide bands, and six put them in doubled pairs at each end. Worse, the
// chime hoops stand proud of the staves they wrap, so a pair of them at each
// end fills in the very taper the belly is supposed to show: measured off the
// silhouette the cask read as 1.14 wide at the belly against its ends where
// the staves alone are 1.20, and a critic looking at the render called it a
// straight drum. Cutting to four both matches the reference and lets the
// profile be seen.
staveCount: 17,
hoopCount: 6,
rivets: 6,
hoopCount: 4,
rivets: 4,
seed: 7,
}
@ -201,8 +214,13 @@ export function createModel(overrides: Partial<WoodenBarrelConfig> = {}) {
// and by every hand that has ever moved the cask, so they catch
// light the flat band does not. Without this they were the right
// shape in the right place and still invisible against the hoop.
// DARKER than the band, not lighter. A rivet head is a small dome
// and the light that reaches its underside is what you see of it;
// lifting it turned four pale diamonds loose on every hoop, and at
// the silhouette they read as detached geometry rather than as part
// of the iron.
const studTint = tint.clone()
studTint.offsetHSL(0, 0, 0.09)
studTint.offsetHSL(0, 0, -0.05)
for (let i = 0; i < config.rivets; i += 1) {
const angle = phase + (i / config.rivets) * Math.PI * 2
// The head FLARES outward, it does not taper. That is what a