Keep the paths. Change the drawing.
An actual desktop photon cache, a three-lens relay traced from native scene geometry, and a diffuse pulse pavilion. Move the time window; the beam shortens instead of becoming another frame in an image sequence.
Drag scene or medium controls for a fast 400-photon preview. Release to restore the chosen photon and family budgets. Preview frames never enter the HDR average.
Move and edit the actual scene
Positions and radii are world-space edits. Glass, mirror and diffuse response change the traced paths. The lamp remains aimed at the first lens and is clamped inside the room. A lamp inside glass emits through clear glass before entering the medium. Edits clear the framebuffer average and retrace one bounded batch.
Open the dense scattering studio ↗ · real multiple scattering, retained rotational families and an editable three-lens relay.
Dense light from actual scattering.
The scattering studio samples exponential free flights and changes direction with the Henyey–Greenstein phase function. Scattering and absorption are independent coefficients; weighted absorption lowers surviving power at each real medium collision. Glass interiors contain no fog. The scatter-order limit truncates the path; the photon count controls the sample population.
Rings sweep azimuth about the incoming direction at an actual scatter vertex, at that path's sampled distance and polar angle. They are not decorative circles around photon dots. Spheres release both angles; cones release distance and azimuth. Photon planes sweep two consecutive segment distances into a parallelogram. Dielectric vertices never become diffuse sweep anchors.
Cache, resample, accumulate.
Cached paths retain identical samples while the camera or time gate moves. Resampling replaces the path population with a new seeded pass. Accumulation instead averages independent passes in a linear HDR framebuffer, before tone mapping. Only one transport batch and two mean images stay in memory: the photons-per-pass and families-per-pass controls limit each batch, not the lifetime total. It continues until you pause; Add one pass refines the same mean. Changing the view, gate, representation or shading clears that image history, then accumulation refines the new view. Scene and medium edits also retrace the transport, with Standby shown while the new batch is being prepared. To accumulate a fixed time slice, pause time playback; a moving time gate necessarily starts a new image each frame.
The Snell caustic envelope follows sign changes of the specular receiver map's Jacobian on a finite angular grid, independently of random deposits. It is a numerical reconstruction of the geometric fold, not an image contour or an exact closed-form solution. This browser study is about drawing transported light. Photon beams use all retained exterior path segments; the higher-dimensional families need a small subset, finite meshes, clipped sweeps and regularized Jacobians to remain interactive. Their full estimators are impractical in this display pipeline, and more passes do not remove those approximations. For the complete estimator investigations, normalization and convergence studies, see RadianceLab. Even the beam layer here uses finite width and display gain rather than a calibrated converged radiance solve.
Time cuts the beam.
Each retained vertex carries position, throughput and arrival time. A finite gate intersects the time interval of every segment; endpoint interpolation gives the visible subsegment. Points sample that same segment discretely; a reported path stride bounds dense point previews. Surface mode displays the recorded surface hits.
Let the drawing use the scene.
Relief hatches sample a smoothed field of the recorded receiver deposits in world coordinates. Each field follows the actual hit plane, including the relay’s right wall. Their displacement follows that field, then their segments become genuine Rive shapes. The sphere and room guides come from the same scene coordinates as the photons, with the same live camera.
This is a retained transport visualization, not a new unbiased renderer. Beam width, additive glow, deposit kernels and hatch smoothing are display choices. Paths are traced when a ported scene is selected, then reused during orbit and time playback. Optional reference shading follows up to twelve glass/mirror events; it uses simple direct lighting and environment reflection, rather than a converged path-traced reference. Photon overlays remain X-ray diagnostics over that background. The sticker is a view-dependent cosine-palette thin-film approximation. Arrival colors are a diagnostic palette, not new light sources.
Diffuse light, drawn in rings.
The pulse pavilion contains no delta interfaces. Each selected floor event emits a Lambertian hemisphere split into equal-solid-angle polar bands, swept in azimuth. At an optical time τ, the ring radius is τ − τhit (speed set to one). Arcs show only part of each ring for a lighter drawing. The loops end at the room boundary; they do not bend through glass. The clock loops over the incoming pulse and the active floor-wavefront interval, rather than waiting through the later multi-bounce cache. Before the floor event, a short segment of the actual incoming path shows the pulse arriving.
Rings show a thin pulse wavefront; the finite gate-width control belongs to the beam and point modes. This is a directional-quadrature display, not an unbiased volume estimator: finite bands, sampled floor events, constant screen stroke width and artistic exposure change the displayed energy. The full point/beam path cache remains separately inspectable and downloadable.
Finite kernels in world space.
Ball and transverse-disk modes place filled kernels on samples of the retained exterior tracks. Their centers follow the optical gate; their radius is measured in scene units, so moving the camera changes their projected footprint. Balls use a chord-integrated spherical profile. Disks lie perpendicular to the local photon direction and use a truncated Gaussian profile.
These are biased density previews: a reported path stride limits the sample budget, local affine projection approximates perspective over each kernel, and finite support can extend across a gate or geometric boundary. Kernel amplitude scales with sampled track length and inverse radius squared; track weights and grazing-angle disk compensation are capped for stability. Display exposure and additive blending are not a calibrated radiance solve. This adds two useful representations of existing paths, not new sphere/disk transport estimators. These modes are kernel displays. The native sweep family below uses different geometry; the dense studio also includes bounded plane sweeps. The full native gather and parallelepiped estimator remain separate.
The native sweep family.
At a medium vertex V, fix or release coordinates of P = V + d ω(θ, φ). A ring fixes d and θ and sweeps φ. A photon arc fixes d and φ and sweeps θ through a meridian; it is not the partial ring used in the pulse pavilion. A sphere releases both angles. A cone releases distance and azimuth. This bounded browser port follows those definitions from the old 3D lab and RadianceLab, with finite geometry and regularized view Jacobians.
The anchors are conditional exponential collision samples inside clear air legs of the traced relay, after lens 1, 2 or 3. They carry prefix extinction and the probability of a collision in that leg. Sweeps stop at glass, mirrors and room bounds; they do not sweep across a delta refraction. Phase and extinction are evaluated over the resulting primitives. Fixed samples, a small anchor subset, tessellation, finite curve width, Jacobian clamping and view gain make this an illustrative biased render—not the complete native estimator or a converged Monte Carlo image.
A ball, then a time slice.
Solid ball integrates 18 radial strata. Time-sliced ball replaces that interval with a normalized finite time band, or one shell at zero width. Source clock gives |x − V| = τ − τV. Including a detector gives |x − V| + |x − C| = τ − τV: a confocal ellipsoid, absent before the shortest possible arrival. The fixed sensor lets you inspect the ellipsoid from outside; “Viewer camera” links the second focus to the viewing camera, matching the native clock convention.
The source clock shows light in flight; the detector clock also evaluates scattering toward the detector. Their view gains are explicit display settings, not a claim of equal calibrated brightness. The native ellipsoid code itself marks absolute normalization as deferred calibration. Mixed layers share the source clock; camera-inclusive inspection is in the native-family view.
What the exports contain.
Download native photon record returns the actual native RIVXP1 record in the native-cache scene. In browser-traced scenes the button instead returns a labeled browser JSON path cache. In the scattering studio this is only the current bounded transport batch; the framebuffer mean is an image, not a growing path archive. Neither button exports the native editor or a generic scene graph.
Export standalone HTML embeds this working viewer, its settings, official Rive JavaScript runtime and WASM, ordinary ink-pool .riv, recorded paths, and custom WebGL2 renderer. Open the saved file directly; no server or CDN is needed. Progressive exports restore the settings and latest batch seed, then begin a fresh framebuffer average; an active sampler resumes. They do not serialize an arbitrarily long sample history. The official runtime draws guides and relief, while custom WebGL2 draws the photon marks, manifolds and analytic backdrop. This is a hybrid browser suite, not vanilla .riv or official GPU Canvas.
Export current Rive ink as .riv writes ordinary Rive 7 shapes with the exact current projected positions, widths and colors. It reopens in the official runtime with no custom backend. SVG saves the same projected vector geometry; it does not include GPU shading or retained 3D interaction. The browser page does not alter native export panels. Native old-lab primitive export support must be checked per route.