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).
| Material | Crystal system | Optical character | n_D | Dispersion (F−C) | Birefringence |
|---|---|---|---|---|---|
| Diamond | Cubic | Isotropic | 2.41726 | 0.0256 | 0.0000 |
| Sapphire | Trigonal | Uniaxial − | 1.76808 | 0.0106 | −0.0081 |
| Ruby | Trigonal | Uniaxial − | 1.76808 | 0.0106 | −0.0081 |
| Emerald | Hexagonal | Uniaxial − | 1.5791 | 0.0082 | −0.0060 |
| Zircon (high) | Tetragonal | Uniaxial + | 1.9250 | 0.0226 | +0.0590 |
| Alexandrite | Orthorhombic | Biaxial + | 1.74273 | 0.0101 | +0.0076 |
| Topaz | Orthorhombic | Biaxial + | 1.62718 | 0.0082 | +0.0080 |
| Spinel | Cubic | Isotropic | 1.71610 | 0.0118 | 0.0000 |
| Quartz | Trigonal | Uniaxial + | 1.54421 | 0.0078 | +0.0091 |
| Tourmaline (elbaite) | Trigonal | Uniaxial − | 1.63941 | 0.0099 | −0.0210 |
| Tanzanite | Orthorhombic | Biaxial + | 1.70086 | 0.0174 | +0.0130 |
| Synthetic moissanite | Hexagonal | Uniaxial + | 2.64743 | 0.0635 | +0.0415 |
| Cubic zirconia | Cubic | Isotropic | 2.15846 | 0.0346 | 0.0000 |
| Aquamarine | Hexagonal | Uniaxial − | 1.57700 | 0.0082 | −0.0060 |
| Morganite | Hexagonal | Uniaxial − | 1.57700 | 0.0082 | −0.0060 |
| Chrysoberyl (yellow) | Orthorhombic | Biaxial + | 1.746 | 0.0100 | +0.0090 |
| Amethyst | Trigonal | Uniaxial + | 1.54421 | 0.0078 | +0.0091 |
| Citrine | Trigonal | Uniaxial + | 1.54421 | 0.0078 | +0.0091 |
| Pyrope garnet | Cubic | Isotropic | 1.714 | 0.0127 | 0.0000 |
| Almandine garnet | Cubic | Isotropic | 1.790 | 0.0139 | 0.0000 |
| Spessartine garnet | Cubic | Isotropic | 1.800 | 0.0156 | 0.0000 |
| Grossular garnet (tsavorite) | Cubic | Isotropic | 1.734 | 0.0162 | 0.0000 |
| Andradite garnet (demantoid) | Cubic | Isotropic | 1.887 | 0.0330 | 0.0000 |
| Peridot | Orthorhombic | Biaxial + | 1.654 | 0.0116 | +0.0360 |
| YAG | Cubic | Isotropic | 1.83265 | 0.0158 | 0.0000 |
| GGG | Cubic | Isotropic | 1.970 | 0.0450 | 0.0000 |
| Benitoite | Hexagonal | Uniaxial + | 1.757 | 0.0261 | +0.0470 |
| Andalusite | Orthorhombic | Biaxial − | 1.634 | 0.0093 | 0.0100 |
| Opal (body colour) | Amorphous* | Isotropic | 1.45 | 0.0010 | 0.0000 |
| Glass (Schott N-BK7) | —† | Isotropic | 1.51672 | 0.0081 | 0.0000 |
| Glass (Schott F2) | —† | Isotropic | 1.61989 | 0.0171 | 0.0000 |
| Rutile | Tetragonal | Uniaxial + | 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.