Module reticle_catalog

Module reticle_catalog 

Source
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§

CatalogEntry
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_ID builds 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.

Functions§

by_id
Build the reticle named by id, or None when this build has no such entry.
catalog
Every named reticle in this build.
mil_dot
The classic mil-dot, at its standard subtensions.