Engraving simulator - fotojockovic.com/engraving ================================================ Shows a logo, photo or text engraved on objects - or laser-CUT out of sheet material (stencil plates and cut-out shapes) - with CO2, fiber, MOPA and UV/green lasers, diamond drag, rotary cutting, dot peen and subsurface (3D crystal) laser engraving. Everything runs in the browser; no image leaves the device. This is a simulation and is not affiliated with any machine, tool or product maker. Our own work: the job simulation (dithering, hatch and V-groove fills, dot-peen craters, beam spot, smoke halo, machine order), the material response shader (burn ramps, coating removal, frost, thin-film oxide, bright-cut anisotropy), the procedural objects, the studio lighting, the effects, the UI and texts. Error-diffusion kernels (Floyd-Steinberg, Jarvis-Judice-Ninke, Stucki, Atkinson) are public algorithms, implemented by us. Everything else that ships to the browser: 1. three.js r186 (npm three 0.186.1), three.js authors - MIT. https://github.com/mrdoob/three.js Bundled and minified into app.js (core renderer, MeshPhysicalMaterial, PMREMGenerator, BufferGeometryUtils.toCreasedNormals). Licence: LICENSE-three.txt 2. mp4-muxer 5.2.2, Vanilagy - MIT. https://github.com/Vanilagy/mp4-muxer Loaded only when a video is exported. Licence: LICENSE-mp4-muxer.txt 3. Textures (tex/*_d.webp: luminance detail extracted, resized to 512 px, re-encoded). All CC0 1.0: Poly Haven (https://polyhaven.com/license): white_maple_veneer (maple), ash_veneer (beech, lime), american_walnut_veneer (walnut), cherry_veneer (cherry), oak_veneer_01 (oak), bamboo_veneer (bamboo), plywood (birch plywood) ambientCG (https://docs.ambientcg.com/license): Wood096 (pine), Cork002 (cork), Leather038 (leather, leatherette), Cardboard004 (kraft, paper, MDF), Rock041 (slate), Granite005A (black granite, cast iron), Marble012 (white marble) Brushed metal and powder-coat micro textures are generated in the browser. 3a. Studio lighting (tex/brown_photostudio_02_512.hdr, _256.hdr; downsampled from the 1k RGBE file): HDRI: Brown Photostudio 02, Poly Haven (CC0). https://polyhaven.com/a/brown_photostudio_02 Combined in the browser with our own procedural softbox panels. 4. Demo photo (demo-dog.jpg, cropped, levels adjusted, resized): "[Dog]", unknown photographer, 1880s-90s, albumen silver print, The Metropolitan Museum of Art, Gift of Mrs. Robert Ingersoll Aitken, 1951, object 269559, https://www.metmuseum.org/art/collection/search/269559 Open Access, CC0 1.0 (isPublicDomain: true in the Met Collection API, checked 2026-10-15). 5. Fonts, loaded from Google Fonts, SIL Open Font License 1.1: Playfair Display (Claus Eggers Sorensen), Montserrat (Julieta Ulanovsky et al.), Great Vibes (Robert Leuschke), Oswald (Vernon Adams et al.), and as fallbacks for Greek text Manrope (Mikhail Sharanda), Noto Serif Display (Google) and Fira Sans Extra Condensed (Carrois Apostrophe / Mozilla). Only the glyph subsets a page needs are downloaded. 5a. Language flags in the language picker (/static/tools/common/i18n.js): simplified flag drawings made for these tools, our own work, no third-party artwork. The national flags themselves are public-domain symbols. Translations of the interface are our own. 5b. Cut-mode fonts (fonts/*.woff2, loaded only when chosen; licence texts in fonts/licenses/; copyright lines in fonts/manifest.json). SIL Open Font License 1.1: Saira Stencil (Omnibus-Type), Black Ops One (James Grieshaber, Eben Sorkin), Protest Guerrilla (Octavio Pardo), Big Shoulders Stencil (Patric King), Stick No Bills (Mooniak), Plaster (Eben Sorkin, Sorkin Type; Reserved Font Name, shipped unmodified), Emblema One (Riccardo De Franceschi, Sorkin Type; Reserved Font Names, shipped unmodified), USSR STENCIL (Anastasia Mihaleva & Jovanny Lemonad; shipped unmodified), Tektur (Adam Jagosz), Fira Sans Extra Condensed (Carrois / Mozilla). CC0 1.0: Operation Napalm (GGBotNet). Fonts marked "modified" in the manifest were subset and converted to WOFF2 (permitted by the OFL, no Reserved Font Name involved). 5c. Laser cutting (our own code): contour tracing (marching squares), simplification (Ramer-Douglas-Peucker), kerf / taper extrusion of the cut parts, island detection and the bridge algorithm (src/bridgefont.js, MIT). Cap triangulation uses three.js ShapeUtils (earcut port, MIT, part of three.js). No Potrace / GPL code. 5d. Engraving realism layer (our own code, src/real/): parallax occlusion mapping with self-shadowing (after Brawley & Tatarchuk 2004, Tatarchuk 2006), horizon-based ambient occlusion of the relief (after Bavoil & Sainz 2008), geometric specular anti-aliasing (after Kaplanyan et al. 2016, Tokuyoshi & Kaplanyan 2019), chamfer / Euclidean distance transforms (Felzenszwalb & Huttenlocher 2012). Published methods, implemented by us. three.js HDRLoader and PMREMGenerator (MIT, part of three.js). 6. Shared UI helpers /static/tools/common/sheets.js and /static/tools/common/i18n.js - our own. Data sources for the material model (facts, not code): - Wood colour versus CO2 laser dose (maple, beech, lime): J. Kubovsky, I. Kubovsky, F. Kacik et al., BioResources 13(2):2515 (2018); beech low-power range: M. Gurau et al., BioResources 12(4):7395 (2017); maple roughness: Gurau and Petru, BioResources 13(4):8168 (2018). - Stainless heat-tint ladder and thin-film colours: interference model, see dokumenta/tools/ENGRAVING_RESEARCH.md (estimates, not measurements). - Process parameters from manufacturer guidance (Trotec, Epilog, Gravotech stylus guide, LightBurn, JPT, Thunder Laser, Pryor). Colours other than maple/beech/lime are estimates awaiting calibration. Not shipped: no GPL/AGPL/LGPL code (e.g. Potrace and its ports, LaserGRBL, LaserWeb), no CC-BY-SA or non-commercial code or assets. imagetracerjs (Unlicense) was evaluated but is not needed: fills are computed on the raster.