Commit graph

113 commits

Author SHA1 Message Date
CRT
dcbe967a70 Add the fire hydrant: one stepped revolve carrying every casting feature it has, with three caps that each hinge about their own tangent because one anchor only has one axis. 2026-09-05 05:25:03 +07:00
CRT
ce52875d2c Add the boom barrier: one rotation that turns a shut road into an open one, with the banding derived to an even count so the boom ends on a whole stripe. 2026-09-05 05:16:33 +07:00
CRT
2e25e91d80 Add the parcel locker bank, and with it the unequal split the park bench's rule could not do: weights rather than counts, a different pattern per bay, and one merged pair carrying doors two bays wide. 2026-09-05 05:01:47 +07:00
CRT
3c86896f73 Add the pavement utility cabinet with a louvre helper two domains want, and fix the tint lift that had been clamping this cabinet and the park bench to pure black without either of them saying so. 2026-09-05 04:53:06 +07:00
CRT
5975d7e641 Add the wheeled bin, and with it the shared wheel: a tyre and a hub in their own materials, plus the contact radius a polygon needs to actually reach the ground. 2026-09-05 04:42:42 +07:00
CRT
87f99a9fee Add the temporary fence panel: a bent tube frame with the mesh cut to its corner radius rather than to a rectangle, and the wire count derived from the pitch a panel is actually specified by. 2026-09-05 04:33:34 +07:00
CRT
9a9be5f313 Add the litter bin, and with it a perforation helper that punches a surface the caller describes rather than a cylinder it assumes; then catch with a new ground check the two models that were quietly hovering because a declared origin had placed them twice. 2026-09-05 04:26:24 +07:00
CRT
3f8831e41c Add the cable drum: three arrays sharing one axis, with the helix carried by the path sweep a row after it was written, and the flange rings closed as one profile rather than four pieces two of which filled in the hole. 2026-09-05 04:11:38 +07:00
CRT
d6c0268159 Finish the street domain first, and start it with the cycle stand: a fourth way of making a solid, a round section carried along a path that bends, with frames transported rather than fixed so the crown does not pinch. 2026-09-05 03:57:24 +07:00
CRT
d8d12915da Give the contemporary kit the gate it never had, and fix the five models it immediately caught: ninety coplanar faces across the kit, a waste and a tap hole built as open tubes that culled to black, and a barrier end that two readers in a row took for a fault. 2026-09-02 07:57:41 +07:00
CRT
314d24cc64 Make the fold and squeeze sliders do something: both poses live in anchor rotations that no rebuild re-applies, so the controls were inert while the methods worked. 2026-09-02 07:27:59 +07:00
CRT
275a76d1f2 Add the lectern: a panelled shaft cut to the slope of the desk it carries, so the two meet along a plane rather than along one edge with a hand's width of air behind it. 2026-09-02 07:12:29 +07:00
CRT
f6ed95ad1c Add the A-frame pavement sign on a hinge whose origin is the pin, with a stay that collapses because both its links are driven rather than carried, and fix the support gate that reported it floating. 2026-09-02 06:55:55 +07:00
CRT
b305546964 Add the park bench, and with it the slat-with-gap rule: the pitch is derived from the run and the count so no array leaves a sliver at one end, on a cast frame whose arch is closed by its web rather than by fat legs. 2026-09-02 06:28:59 +07:00
CRT
3947246546 Add the picnic table: a plank array on one A-frame written once and built twice, with legs extruded from a parallelogram so they are sawn flat at both ends rather than standing on four edges. 2026-09-01 08:30:00 +07:00
CRT
107055ebb3 Add the concrete traffic barrier on the published section, and with it an extrusion for the constant-section family: a half-lap end at both ends, drainage cut by a second section rather than painted on, and a stepped run so the concrete has somewhere to vary. 2026-09-01 08:10:18 +07:00
CRT
0f5ddac950 Wire the last three contemporary models into the catalogue: they were built and committed without it, so nothing round-tripped them through the GLB gate and none appeared in the viewer. 2026-09-01 07:50:52 +07:00
CRT
3d0fdc0a9d Add the pedestal basin, and with it a plan sweep for the bodies a lathe cannot turn: a D plan with a flat back, per-ring depth and displacement, and the wall pinned down the whole height. 2026-09-01 07:50:51 +07:00
CRT
36e2cbc02d Add the fire extinguisher: the kit's first small-part cluster, under a lever whose travel is measured against the jaw it closes onto. 2026-09-01 07:17:26 +07:00
CRT
4c435861bb Add the gas cylinder: one revolve carrying a radial guard, which is the first array in the kit to stand on a lathe. 2026-09-01 06:46:27 +07:00
CRT
f8e7aed5df Give the vase a wall and a bore: a one-sided shell has no inside, so anything looking into it lost the far wall to back-face culling. 2026-09-01 06:37:35 +07:00
CRT
4f98247cf4 Add the blind critic, and take the pepper mill from 68 to 78 with it. 2026-09-01 06:33:24 +07:00
CRT
bb4896eca6 Show the contemporary kit in the inspector, by letting a catalogue entry belong to whichever registry wrote it. 2026-09-01 06:19:32 +07:00
CRT
d63d4911c6 Add the street bollard, and let a reference be shot for a model that does not exist yet. 2026-09-01 06:15:02 +07:00
CRT
e0a315a43f Round the mug's foot and its handle, and let an arc bar carry a section with more than four sides. 2026-09-01 06:09:33 +07:00
CRT
9ab88aa633 Rebuild the pepper mill as the tube it actually is: a steel collar, a recessed band of vertical flutes, a flat top and a knurled knob. 2026-09-01 06:01:43 +07:00
CRT
59a4559ab2 Take back the pepper mill rebuilt against a reference that asked for the wrong object, and record in the generator why a hint must not invent a material. 2026-09-01 05:54:11 +07:00
CRT
6a65991ec3 Serve either kit from the reference generator, and rebuild the pepper mill against the photograph it never had. 2026-09-01 05:49:23 +07:00
CRT
8f7ceb1abb Let the catalogue hand its overscroll back to the rail, so the blocks below it are reachable with the pointer over the list. 2026-09-01 05:37:47 +07:00
CRT
5bc455ee0c Give the catalogue its own scroll and move the tour and the recorder to the top, so the controls are not behind four screens of model names. 2026-09-01 05:24:02 +07:00
CRT
4a037ba816 Let the recorder capture what you are doing rather than only what the tour does, and letterbox the preview so the framing you compose is the framing you get. 2026-09-01 05:18:11 +07:00
CRT
fe2520d620 Put the kit's npm page, its source and its install line at the top of the inspector's rail. 2026-09-01 04:56:05 +07:00
CRT
5b051ca782 Keep the vegetable heap a heap past the slots it was authored for, give every repeated model its own seed, and stop the stalls' stock standing in each other. 2026-09-01 04:30:15 +07:00
CRT
fd9c26f3ba Add a page you can walk the square in, sharing the sun, sky and layout with the flythrough so the two cannot drift. 2026-09-01 04:17:10 +07:00
CRT
bcaadc144d Lay the market out like a market: four stalls with goods on their counters, stock stacked at their feet, and the camera walking the row instead of past it. 2026-09-01 04:05:16 +07:00
CRT
198d394e87 Put the square on real ground under a real sky, light the fires, and record upstream seeding the kit in its init template. 2026-09-01 03:52:58 +07:00
CRT
3722720d43 Fence the square with the kit's own rail and leave the houses out of the released cut, so everything in frame is either the kit or the ground it stands on. 2026-09-01 03:40:38 +07:00
CRT
801183ae25 Give the square a floor and a frontage, run the fences as boundaries, and route the camera down a lane instead of into the well. 2026-09-01 03:34:25 +07:00
CRT
d5c816320d Build the market square and a camera that walks through it, and cut the flythrough offline through the rasteriser rather than off a screen capture. 2026-09-01 03:15:29 +07:00
CRT
9b4ce16c59 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. 2026-09-01 03:00:37 +07:00
CRT
3f57165d06 Install the vibe-model authoring skill and record the state of both kits in PROGRESS.md. 2026-08-28 20:16:39 +07:00
CRT
af53b5ee92 Add the first five contemporary props, and give the contact shadow a per-pixel height falloff. 2026-08-28 20:06:59 +07:00
CRT
91847838ed Shade with vertex normals in the renderer, and add crease-angle normal smoothing so turned objects stop banding. 2026-08-28 19:37:07 +07:00
CRT
02c0711442 Fork the kit into contemporary-props with a nineteen slot palette, a per-model check that needs no registry round trip, and the first model. 2026-08-28 19:03:50 +07:00
CRT
77b926312b Aim the render camera at the picture's centre, include the contact shadow in the fit, and shoot the kit scene from the front. 2026-08-27 21:22:14 +07:00
CRT
b4aeccd2a2 Fit the render camera to the geometry and repack the kit scene, then regenerate the images. 2026-08-27 20:52:32 +07:00
CRT
5d793c83d0 Remove em dashes from README.md, REFERENCE.md and the registry README. 2026-08-27 20:18:43 +07:00
CRT
be8c7a485d Bring the repo's own front page up to what actually exists now
The root README was written when none of this was published, and it showed.

The install block was BROKEN in the same way the registry README's was, and I
fixed that one without looking here:

    bunx vibe3d init
    bunx vibe3d add @medieval-kit/wooden-barrel

`init` seeds `models.json` with `@scifi-kit` only, so the second line stops with
`Registry @medieval-kit is not configured in models.json`. The registry entry
and the two dependencies are now in the block, in the order they have to be run.

The npm link pointed at a file in this repository rather than at the package,
because when it was written there was no package to point at. There is now.

Neither document linked the live viewer at all — the one thing a stranger
landing here can use without installing anything. It is the second thing on the
page now.

REFERENCE's "publish your own registry, you need nobody's permission" section
gets the receipt: this registry is live and vibe3d was not involved. It also
gets the warning I would have wanted before doing it — npm stamps the
publishing account's email into the packument per version and later account
changes do not rewrite it, so the address on the account at that moment is
public permanently.

Checked every outbound link in both documents as a logged-out stranger: bun.sh,
vibe-stack/vibe3d and medieval.crt.fyi all 200. npmjs.com answers 403 to a
scripted request, which is its bot protection and not a broken link — the
registry API serves 0.1.1 as latest.

Still 404 for a stranger, and deliberately: github.com/CRTkafa/medieval-kit and
its /issues, which npm renders as the Repository and Issues links on the
package page. They come back the moment the repository goes public.
2026-08-27 17:28:17 +07:00
CRT
f2a8e304ce 0.1.1: drop baseUrl from the setup the README tells people to copy
Found by installing 0.1.0 from npm into an empty directory and doing exactly
what the README says, which is the first time anyone has done that — until an
hour ago there was nothing on npm to install.

Everything held except one line. `bunx vibe3d init`, the `models.json` registry
entry, `vibe3d add @medieval-kit` (46 files), `three` and `@types/three`: all
correct. `@types/three` is genuinely not optional, confirmed by removing it and
watching three TS7016s land on the runtime files init had just written.

The Project setup block was wrong. I wrote it by copying this repository's own
`tsconfig.json`, which carries `"baseUrl": "."` — and this repository pins
typescript at ^5.9.2, so it never sees that a fresh `bun add -d typescript`
installs 7.0.2, where the option has been REMOVED:

    error TS5102: Option 'baseUrl' has been removed.

So the one instruction on the page that a reader cannot check against anything
else was the one that stopped them. `paths` resolves relative to the tsconfig
on its own and has since 4.1, so the block just loses the line; the same config
now typechecks the installed source clean on 7.0.2.

The lesson is the one this repo keeps relearning in a new costume: a setting
copied from a working project is evidence about THAT project. This one was
right here and wrong in the only place it was published to.

Verified after the change in the same clean project: tsc silent, and
`createModel()` from the npm-installed hand-cart builds 2044 triangles with its
floor at y = -0.0000 — so the wheels that started this whole thread are on the
ground in the published package too.
2026-08-27 17:22:54 +07:00
CRT
909bfa0f9f Land the mill's ladder, and stop the table calling six models static
Two things, both found by pulling on the handcart's thread.

THE LADDER. I said three models had parts floating a few millimetres. One did.
The other two readings were my own measurement error and worth writing down,
because it is the same error as the vertex-sampling ones: I measured each part
against the model's BOUNDING BOX minimum, and a part deliberately bedded into
the ground drags that datum below the floor, so every correctly placed part
beside it appears to float by exactly the bedding depth. The forge's base
stones settle 6.8 mm and the well's drystone kerb 9.3 mm, both on purpose, and
the bellows and the well frame sit exactly on the floor their own source
declares. Nothing wrong with either.

The post mill's tail ladder was real: 14.5 mm clear. It already carried two
analytic corrections for the same corner, both correct about what they
describe, and neither accounting for the chamfer — the corner they compute the
drop of has been cut off, so the residual was very nearly the chamfer itself.
Rather than add a third derivation to a spot that has now been got wrong three
times, the assembled ladder is measured and put on the floor. A bounding box
cannot be wrong about this the way arithmetic can, and it stays right when the
chamfer or the rail section changes.

`restsOn` now covers the mill's trestle and ladder too, and its doc comment
carries the bedding caveat, so the next person to reach for it knows the datum
is the bounding box and knows what that costs.

THE ANIMATED COLUMN. `catalog-table.ts` decided it with `built.action`, which
is the VIEWER's hand-registered button and exists for five models. So the
generated table published the grindstone, the stone well, the post mill, the
cauldron, the forge and the handcart as static — six of the eleven models that
carry actions, including three of the most animated things in the kit.

The obvious replacement is worse. `core/kit.ts` wraps update as
`update: (dt) => options.update?.(dt, runtime)`, so it is a function on every
model whether or not that model does anything with it, and switching to it
marked all thirty-seven animated. One flag too narrow, its replacement too
broad.

So the generator now runs each model — a second of frames, then its action if
it has one — and asks whether anything moved. That catches what moves by
itself. What moves ON DEMAND it cannot catch, because the motion is behind an
interface the catalogue never exposed, so `Entry` now carries `actionNames`
from the model's own actions. Eleven models, and both documents list them.

Worth keeping: this table is generated precisely so it cannot go stale, it says
so in its own prose, and it was wrong for months. Generated is not the same as
correct — it only moves the mistake into the generator, where nobody looks.

Also in the npm README, which is the page npmjs.com renders: `vibe3d init` is
now the first line rather than unmentioned, `@types/three` is called out (three
ships no declarations, so without it the installed source does not typecheck),
the `@/` alias and `allowImportingTsExtensions` have a Project setup block, and
the one relative link is gone — npm resolves those against the repository, and
this one pointed at a directory the package deliberately does not ship.
`homepage` now points at the live site instead of a repository that is private.
2026-08-27 16:36:24 +07:00