This repository has been archived on 2026-10-29. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
CultMath/docs/planetary.md
2026-07-13 02:14:11 +01:00

4.8 KiB

Planetary Field Runtime

CultMath owns the deterministic, renderer-independent planetary field. The same definition can be queried by a CPU simulation, baked into residual pages, sampled through a map projection, or evaluated by HLSL. Render resources and gameplay interpretation remain consumer responsibilities.

Authority

  • PlanetaryFieldDefinition identifies radius, seed, erosion parameters, and a version that includes the consumer-owned base-field version.
  • IPlanetaryBaseField supplies deterministic application-authored base evidence without making CultMath depend on an application.
  • PlanetaryQueryScale makes the physical footprint and accepted unresolved error explicit. There is deliberately no scale-free authoritative HeightAt call.
  • PlanetarySurfaceSample carries displacement, tangent gradient, normal, slope, ridge/gully evidence, resolved wavelength, and unresolved bound.
  • pages, residency, patches, and map tiles are disposable lowerings of that contract.

The C# surface targets .NET and Unity-compatible netstandard2.1. The matching HLSL lives in shaders/Planetary.hlsl and is included by CultMath.hlsl.

Point and batch queries

var erosion = AdvancedErosionParameters.Default with
{
    Scale = radius * 0.075f,
    Strength = 0.12f,
    Octaves = 7,
};
var field = PlanetaryFieldDefinition.Create(
    baseFieldVersion: 17,
    radius,
    seed: 42,
    erosion);
var scale = PlanetaryQueryScale.AtFootprint(
    footprintMeters: 10,
    maximumUnresolvedHeight: 0.5f);

PlanetaryBaseFieldSample basis = source.Sample(direction);
PlanetarySurfaceSample sample = PlanetaryField.Sample(
    field, direction, basis, scale);

PlanetaryField.SampleBatch writes into a caller-owned span. SamplePosition accepts double3, reduces the astronomical position to a stable unit direction, and then evaluates the same float field contract.

Higher-level CPU queries include bounded ray intersection, segment clearance, great-circle profiles, and region summaries. Their answers remain field queries; only a consuming simulation can turn them into committed game consequences.

Cube-sphere topology and pages

PlanetaryTopology owns the tangent/QSC cube-sphere mapping, inverse face coordinates, tile selection, local page coordinates, and radial-graph surface normal. PlanetaryPageSampling owns bordered directions, nominal spacing, bilinear sampling, and summaries.

PlanetaryPageBaker evaluates a root page at its physical sample spacing. A child stores child filtered field - parent filtered field. A PlanetaryPageSetSampling query adds every containing ancestor contribution and applies transition weights only to residuals.

PlanetaryLodSelector selects six roots plus one camera-facing ancestor chain from the unresolved-height error. PlanetaryResidualResidency owns arrival and departure presentation weights, content and presentation versions, and nothing about field truth.

Patches

PlanetaryPatch.CreateFace and CreateCubeSphere produce renderer-neutral coarse meshes from the canonical topology. HLSL calls cultmath_planetary_face_direction for procedural vertices and cultmath_planetary_radial_refinement_step for bounded pixel refinement.

Renderers still own cameras, clip space, depth, materials, buffers, dispatch, and draw submission.

The optional CultMath.Unity assembly converts a canonical face patch into a Unity Mesh and converts a residency snapshot into Unity-native page input and metadata payloads. It owns no field parameters, page selection, or simulation state. Unity render code remains responsible for allocating/binding graphics buffers and dispatching application-specific base-field entry points.

Maps

PlanetaryProjection supplies forward and inverse transforms for:

  • equirectangular;
  • Web Mercator with an explicit polar cutoff;
  • Equal Earth;
  • orthographic;
  • azimuthal equidistant and equal-area;
  • cube atlas;
  • local tangent/gnomonic views.

PlanetaryMapTileBaker maps each valid tile sample through the inverse projection and canonical field query. PlanetaryMapTileKey includes field, projection, layer, layout, and query-scale identity. Palettes, contours, labels, and strategic overlays do not enter CultMath.

Numeric contract

Integer hashes and published field versions are exact. Basic arithmetic follows CultMath's matched C#/HLSL semantics. Hardware transcendental functions such as atan and tan use measured tolerances rather than fictional bit identity. Every filtered terrain query carries an unresolved-height bound so consumers can reject insufficient fidelity explicitly.

Current D3D12 parity evidence covers the advanced erosion kernel and the QSC forward/inverse topology. The remaining production page and patch shaders use the common functions and retain their seam, residual, summary, and radial-hit integration probes in Fensalir.