CS optics toolkit — 2026-10-25 Choose the model for the question Laser paths through several lenses or mirrors: drawOpticalRays(name,rays,surfaces,options), documented in OPTICS.txt. GPU traces up to128 differently positioned/directed rays through up to32 mathematical plane, spherical or ideal-lens surfaces; up to16 path segments. Snell refraction, unpolarized Fresnel power, total internal reflection. Real spherical boundaries give geometrical aberration; ideal thin lenses do not. traceOpticalRay is the CPU single-ray diagnostic; measureThinLens is paraxial. Focus or defocus a flat source picture on a screen: renderOpticalImage. One ideal thin lens, flat source picture. Not live geometry. viewOpticalImage looks through multiple analytic surfaces at that flat picture. Look through a glass sphere at moving Unity objects: setOpticalObjects, createOpticalLens, setOpticalLens. Read LIVE_OPTICS.txt. Already exists: actual geometry, live MainCamera, no screenshot stand-in. Current live renderer does not trace a sequence of coupled lenses or project arbitrary live geometry onto a separate measurement screen. Diffraction, interference, coherent waves and dielectric structures: Read WAVE_OPTICS.txt and science-recipes/wave-optics.js (packaged as /opt/cs-coding/catalog/examples/wave-optics.js). This is the reusable GPU Maxwell recipe; put its makeWaveOptics function and configuration in saved activity code. Execute using createGPUProgram/compileGPUProgram/runGPUProgram. No new engine function named createWaveOptics, no Unity editing, and no rebuild required. It handles a 2D TMz cross-section, not a full 3D optical instrument. The ray and wave systems share the existing GPU infrastructure, not their physics. Do not replace diffraction with colored laser lines or claim a ray image includes wave interference. Do not claim 2D normalized fields are calibrated 3D optics. General ray branching, live multi-lens image formation, 3D vector Maxwell fields, dispersive wave materials and automatic wave/ray coupling remain future work. For both: keep configuration in saved editor code, use MainCamera, compact controls, sparse numerical probes, stable timesteps and a named quantity on every color key. Match resolution to wavelength before increasing visual polish. Use sparse readings for validation; never copy an entire GPU field back into JavaScript every frame.