Expand description
Named reticles, by id — the tracked follow-up crate::reticle’s header defers to.
reticle deliberately has no catalog: it ships three generic constructors and says so,
because “manufacturer subtension sheets are published facts and are a legally viable
catalog source, but curating one is a separate, per-vendor IP-reviewed data project”.
This module is that project, kept separate so that statement stays true of the module
it was made about.
§Why a catalog is the whole feature (MBA-1545)
A holdover display is only worth anything if it shows the shooter THEIR reticle. A hold against a generic mil grid reads “hold 4.2 mil down”, which is what a range card already prints — the same number, worse. The value is “hold on the third dot down, two right”, and that needs the marks actually etched in their glass.
Nothing public supplies those. Surveyed 2026-09-17: the .reticle XML format
(gehtsoft-usa/BallisticCalculator1, LGPL-2.1) ships a designer and worked examples, not
commercial designs; o-murphy/bcrg (LGPL-3.0) generates reticles procedurally and emits
1-bit BMPs, which carry no coordinates and cannot drive hold math; and no
machine-readable dataset of real reticles appears to exist. The real source is
manufacturer subtension sheets, transcribed by hand.
§The two constraints, which are different constraints
Licensing. Both open projects in this space are LGPL and this crate is MIT OR
Apache-2.0. Every entry here must be OUR transcription of published subtension facts —
measurements, which are not copyrightable — and never a file lifted from an LGPL
project. This is the same reason reticle_import and profile_import are cleanroom
implementations written from format specifications.
Patents. Horus grid reticles and Time-of-Flight Wind Dots are actively patented.
That bars reproducing those LAYOUTS however the numbers were obtained, and it is not a
data-licensing question — a patented layout stays barred even where its subtensions are
published. No TREMOR-family or Horus geometry enters this module, on the same terms
crate::reticle states for itself.
§Provenance is mandatory, because a wrong subtension is a silently wrong hold
Every CatalogEntry carries a CatalogEntry::source naming where its geometry came
from. That is not decoration. A mistyped subtension produces a hold that is wrong by a
mark and looks entirely normal — there is no downstream check that can catch it, the
same property that makes a grams-for-grains bullet weight invisible (MBA-1521). Naming
the source per entry is what makes a bad number traceable to a document someone can
re-read, rather than anonymous.
So this module starts with what can be stated EXACTLY from a public standard, and each vendor reticle added later is its own change citing its own sheet.
Structs§
- Catalog
Entry - One named reticle this build can produce, and where its geometry came from.
Constants§
- MIL_
DOT_ DEFAULT_ DOTS_ PER_ SIDE - How many dots per arm
MIL_DOT_IDbuilds when no count is asked for. - MIL_
DOT_ ID - Wire id of the mil-dot entry.
- MIL_
HASH_ FINE_ ID - Wire id of the fine two-tenth mil hash ladder.
- MIL_
HASH_ HALF_ ID - Wire id of the half-mil hash ladder.
- MOA_
HASH_ 1_ ID - Wire id of the one-MOA hash ladder.
- MOA_
HASH_ 2_ ID - Wire id of the two-MOA hash ladder.