### Added
- **Equation mode.** A formula with a single `=` (for example `y = 64 + 8 * sin(x / 10)`) is treated as an implicit surface: the world is solid where the left side is not greater than the right side. Formulas may now use `y`, which makes caves, floating islands and arbitrary 3D shapes possible
- **Live 3D preview** inside the settings screen. A rotatable voxel preview is rebuilt in the background while you type, and a notice is shown when there is not enough screen space for it
- Terrain settings are now available for all noise-based world types
- **NeoForge support** for 1.20.4, 1.20.6, 1.21.1, 1.21.4, 1.21.11, 26.1.2 and 26.2
- Builds for 1.21.4, 1.21.11, 26.1.2 and 26.2 on Fabric and Forge. One codebase now produces 23 jars: 1.20, 1.20.4, 1.20.6, 1.21.1, 1.21.4, 1.21.11, 26.1.2 and 26.2 for Fabric and Forge, plus every version from 1.20.4 on for NeoForge
### Performance
- Compiled formulas are called through a typed interface
- Formula values are cached per column for formulas that do not use `y`, which speeds up chunk generation
- Noise lookups that do not depend on `y` (`simplex(x, z)`, `perlin(x, 0, z)`) are memoized per thread, so formulas that mix terrain noise with `y` no longer recompute it for every block
- The formula cache is thread-safe
- The preview evaluates in parallel and builds its mesh off the render thread
### Changed
- **Random formula generator** rewritten: it builds formulas from terrain archetypes, can crossbreed them, fits the scales to a sample and filters out dull results
- Dropped Architectury in favour of per-target Loom projects. Sources are split into `core`, `mc`, `loader` and `versions`
- Smoothing now applies only in Advanced mode, as in 1.3.0, and can be set to 0 to turn it off. Before, it was always on at 0.55 with no way to change it outside Advanced, which also made plain formulas five times more expensive
- Building now needs JDK 25 for the 26.x targets (Gradle downloads it automatically)
### Fixed
- The formula was applied only around spawn on some 1.20.1 worlds. It now covers every newly generated chunk and survives re-entering the world (#22)
- `floor` and `round` now return real numbers, so `1/floor(...)` gives infinity instead of failing with an integer division by zero, and `floor(5)/2` is `2.5`. Errors without a message no longer show up as `Syntax error: null` (#21)
- Points where a formula is not finite (`Infinity`, `NaN`) are treated as empty space instead of filling the world up to the build limit (#21)
- A formula that fails to compile no longer hangs a dedicated server: it is logged and the world generates empty instead of crashing on a client-only class
### Known issues
- Heavy formulas that use `y` together with several noise calls can slow chunk generation
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }