Indicatrix GitHub
Reference

Materials

The optical constants Indicatrix ships built in, and where each one comes from.

1Dispersion chart

Each line is one material's refractive index n(λ) across the visible spectrum, from violet (380 nm, left) to red (780 nm, right), drawn from the same coefficients as the table below, and coloured by wavelength. The index always falls toward the red, and the steeper the line, the stronger the dispersion and the fire. The dot marks nD at 589 nm, the value usually quoted for a gem. All materials share one scale, so switching between them shows where each one sits.

Material
Diamond (C)
Crystal system
Cubic (Isotropic)
Optical character
Isotropic
n_D (589 nm)
2.4173
Dispersion (n_F − n_C)
0.0256
Abbe number (V_d)
55.3
Birefringence (Δn)
0.0000 (none)
Specific gravity
3.52

Exceptional brilliance and adamantine luster with intense fire. The reference isotropic gemstone.

2The 32 built-in materials

All figures below are read from crates/indicatrix/src/optics/materials.rs. n_D and dispersion (Δn, F−C) come from each material's own source comment: a primary Sellmeier/Cauchy fit where one exists in the optics literature, or a value derived from two or more corroborating gemological references where it does not — the source file documents which for every row. Birefringence is birefringence_delta as stored (n_e − n_o for uniaxial materials, the signed or unsigned total spread for biaxial ones, per the field's own doc comment).

MaterialCrystal systemOptical charactern_DDispersion (F−C)Birefringence
DiamondCubicIsotropic2.417260.02560.0000
SapphireTrigonalUniaxial −1.768080.0106−0.0081
RubyTrigonalUniaxial −1.768080.0106−0.0081
EmeraldHexagonalUniaxial −1.57910.0082−0.0060
Zircon (high)TetragonalUniaxial +1.92500.0226+0.0590
AlexandriteOrthorhombicBiaxial +1.742730.0101+0.0076
TopazOrthorhombicBiaxial +1.627180.0082+0.0080
SpinelCubicIsotropic1.716100.01180.0000
QuartzTrigonalUniaxial +1.544210.0078+0.0091
Tourmaline (elbaite)TrigonalUniaxial −1.639410.0099−0.0210
TanzaniteOrthorhombicBiaxial +1.700860.0174+0.0130
Synthetic moissaniteHexagonalUniaxial +2.647430.0635+0.0415
Cubic zirconiaCubicIsotropic2.158460.03460.0000
AquamarineHexagonalUniaxial −1.577000.0082−0.0060
MorganiteHexagonalUniaxial −1.577000.0082−0.0060
Chrysoberyl (yellow)OrthorhombicBiaxial +1.7460.0100+0.0090
AmethystTrigonalUniaxial +1.544210.0078+0.0091
CitrineTrigonalUniaxial +1.544210.0078+0.0091
Pyrope garnetCubicIsotropic1.7140.01270.0000
Almandine garnetCubicIsotropic1.7900.01390.0000
Spessartine garnetCubicIsotropic1.8000.01560.0000
Grossular garnet (tsavorite)CubicIsotropic1.7340.01620.0000
Andradite garnet (demantoid)CubicIsotropic1.8870.03300.0000
PeridotOrthorhombicBiaxial +1.6540.0116+0.0360
YAGCubicIsotropic1.832650.01580.0000
GGGCubicIsotropic1.9700.04500.0000
BenitoiteHexagonalUniaxial +1.7570.0261+0.0470
AndalusiteOrthorhombicBiaxial −1.6340.00930.0100
Opal (body colour)Amorphous*Isotropic1.450.00100.0000
Glass (Schott N-BK7)—†Isotropic1.516720.00810.0000
Glass (Schott F2)—†Isotropic1.619890.01710.0000
RutileTetragonalUniaxial +2.616 (o) / 2.903 (e)≈0.300+0.2870

*Opal is a mineraloid with no true crystal structure; the source code stores Cubic as a placeholder for "isotropic," not a mineralogical claim — its own comment says so explicitly. †The two reference optical glasses are amorphous, included as isotropic calibration materials rather than gemstones. Precious opal's play-of-colour (structural diffraction, not absorption) is not modelled.

3Alexandrite's colour change

Alexandrite's chromium chromophore creates two transmission windows — one blue-green near 500 nm, one deep red near 680 nm — separated by a strong absorption valley around 580 nm. Daylight, rich in blue-green photons, favours the 500 nm window; incandescent light, rich in red photons, favours the 680 nm window. Because this is a genuine two-window spectral effect rather than a colour swap, it falls directly out of Indicatrix's per-wavelength transport rather than needing a special case. Alexandrite is also biaxial, so the effect is evaluated per direction: three independent absorption spectra along its α, β, γ axes.

4Sapphire and ruby dichroism

Corundum (sapphire, ruby) is trigonal, uniaxial negative. Its ordinary and extraordinary rays carry distinct absorption bands — a real, measured shift (roughly 580 nm vs. 700 nm for the Fe²⁺–Ti⁴⁺ charge-transfer band behind blue sapphire's colour; see the source comment on the Sapphire entry in materials.rs for the citation). Cutters orient the table facet perpendicular to the c-axis specifically to show the more saturated ordinary-ray colour face-up.

5High dispersion and extreme birefringence

Rutile and synthetic moissanite sit at the edges of what the renderer's Fresnel and dispersion code has been verified against. Rutile's birefringence (+0.287) is the largest of any built-in material, high enough that adding it required a dedicated exact closed-form uniaxial Fresnel solve (optics/raytracer/uniaxial_fresnel.rs) rather than the constant-offset approximation used for lower-birefringence materials; it is also the Tier 3 image-comparison material used to catch CPU/GPU divergence in that solve. Moissanite's dispersion (Δn ≈ 0.064) is more than double diamond's.

6Custom materials

The desktop studio's Material Editor dialog (the pencil button next to the live viewport's Render Material dropdown) builds a custom material at runtime via GemMaterial::new_custom (crates/indicatrix/src/optics/materials.rs), which takes a name, mean refractive index, an F−C dispersion delta, a birefringence delta, and an RGB absorption tint, and fits a 2-parameter Cauchy curve to the requested dispersion at the sodium D and Fraunhofer F/C lines. Saved custom materials are persisted to a custom_gem_materials table in the same facet_diagrams.sqlite database the app already uses for designs, via indicatrix-vault's CustomMaterialRow and Database::save_gem_material — not embedded in the design/schedule file itself. This is a separate feature from Retarget, which proposes new facet angles for an existing design in a different material rather than authoring a new material (see the studio page).

Every material picker in the app — the studio's Design Settings Material combo, the New Design dialog's Starting Material combo, and the Live Render viewport's Render Material dropdown — reads from one shared MaterialCatalogue (crates/indicatrix-cut-core/src/material.rs): all 32 built-in materials above, in GemMaterial::all_materials()'s own order, followed by every custom material you have saved, sorted alphabetically. A species available to the renderer is therefore never missing from the CAD editor's own pickers, or vice versa.

An imported .asc file carries only a bare refractive index, never a species name. When a design's material is otherwise unset, the studio looks for the nearest built-in preset within 0.02 of the design's effective RI and shows it as a labelled guess — e.g. "Sapphire? (from RI 1.76)" — never as a recorded fact, with a Set material button next to it that writes the name in as an ordinary, undoable edit. If nothing built in is within tolerance, no guess is shown at all.