Bright
2026-05-15
BackBright is a parametric lamp customizer built on one contract: the preview is the export. The mesh you rotate on the screen is the same THREE.BufferGeometry the STL writer serializes when you press download. There is one geometry function in the codebase; the WebGL renderer calls it on every slider tick, the exporter calls it once at the end, and they receive byte-identical triangles. Whatever you see is what you print.
The body of the lamp is a parameterized surface of revolution with a fluted profile. At each ring of height v, the radius traces r = baseRadius · taper(v) + amplitude · cos(8θ + twist · v), where the sliders feed straight into baseRadius, taper, and the twist phase. Inside and outside walls are generated as two coupled shells offset by a 4 mm thickness, connected at the top rim, closed at the bottom by an annulus with a 6 cm bulb hole, and welded with hand-written indices so the exported solid is genuinely watertight. Sixty rings, a hundred segments around, run in single-digit milliseconds on a phone.
The same buffer that feeds T.Mesh in the Threlte scene is held by a $state reference and handed verbatim to three's STLExporter in binary mode when the user clicks download. There is no second geometry path, no parallel CAD model, no remote service that re-derives the shape from the parameters. A configurator written the easy way would have one; Bright would not be Bright if it did.
The contract has consequences. Every slider position has to produce a printable solid. You cannot let cone = -1 collapse the top of the shade to a point and self-intersect the walls; the function clamps the effective taper to about 60% of the requested value when the cone is negative. You cannot let the inner shell pierce the outer when the twist phase compounds with the flute amplitude; the wall thickness is tuned against the ridge depth so the offset is always safely interior. These look like small numbers in the source. They are the difference between a tool that exports geometry and a tool that exports geometry that prints.
Bright also exposes a base color picker (wood tones, then matte solids) and two light controls: warmth in Kelvin from 2000 to 6500, intensity from 0 to 100%. None of these touch the STL. The filament you load into the printer is whatever you load into the printer; the bulb you screw in is whatever you screw in. The customizer cannot influence either, and pretending otherwise would be a small dishonesty propagating through the rest of the tool.
So why ship them at all. Because a lamp is a piece of furniture, and a piece of furniture is evaluated in the room it will live in, under the light it will actually emit. A flute pattern that looks elegant at 6500 K daylight reads as spiky at 2700 K with the bulb on. A walnut base under warm light is a different object than the same base under a cool LED. The preview lets you check before you commit a four-hour print to PLA. The controls are honest about their scope: they help you imagine the finished object, not specify it. That is a different commitment than configure, and the difference is the entire point.
Live at custom.ma-r-s.com/customize/bright. Three siblings (Lithophane, Phantogram, Kumiko) on the same site, built on the same contract.
CC BY-NC 4.0 © ma-r-s
?