271 lines
4.7 KiB
Markdown
271 lines
4.7 KiB
Markdown
---
|
|
title: Density Functions
|
|
type: docs
|
|
weight: 8
|
|
---
|
|
|
|
Density functions define terrain shape by calculating density values at each point in 3D space.
|
|
|
|
**Package:** `com.hypixel.hytale.builtin.hytalegenerator.density`
|
|
|
|
## Density Function Concept
|
|
|
|
Density functions return values that determine solid vs air:
|
|
- Positive values = solid terrain
|
|
- Negative values = air
|
|
- Zero = surface boundary
|
|
|
|
```java
|
|
public interface DensityFunction {
|
|
// Calculate density at position
|
|
float calculate(int x, int y, int z, GenerationContext context);
|
|
}
|
|
```
|
|
|
|
## Basic Density Functions
|
|
|
|
### ConstantDensity
|
|
|
|
Returns a constant value:
|
|
|
|
```yaml
|
|
Type: ConstantDensity
|
|
Value: 1.0
|
|
```
|
|
|
|
### NoiseDensity
|
|
|
|
Uses noise for terrain variation:
|
|
|
|
```yaml
|
|
Type: NoiseDensity
|
|
NoiseType: Simplex
|
|
Scale: 0.01
|
|
Amplitude: 1.0
|
|
Octaves: 4
|
|
Persistence: 0.5
|
|
```
|
|
|
|
### HeightGradient
|
|
|
|
Creates flat terrain at a specific height:
|
|
|
|
```yaml
|
|
Type: HeightGradient
|
|
BaseHeight: 64
|
|
Falloff: 32
|
|
```
|
|
|
|
```java
|
|
public class HeightGradient implements DensityFunction {
|
|
private int baseHeight;
|
|
private float falloff;
|
|
|
|
public float calculate(int x, int y, int z, GenerationContext ctx) {
|
|
return (baseHeight - y) / falloff;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Composite Functions
|
|
|
|
### AddDensity
|
|
|
|
Combines multiple functions by addition:
|
|
|
|
```yaml
|
|
Type: AddDensity
|
|
Functions:
|
|
- terrain_base
|
|
- terrain_hills
|
|
- terrain_mountains
|
|
```
|
|
|
|
### MultiplyDensity
|
|
|
|
Multiplies function values:
|
|
|
|
```yaml
|
|
Type: MultiplyDensity
|
|
Functions:
|
|
- terrain_base
|
|
- mask_function
|
|
```
|
|
|
|
### BlendDensity
|
|
|
|
Blends between functions:
|
|
|
|
```yaml
|
|
Type: BlendDensity
|
|
FunctionA: plains_terrain
|
|
FunctionB: mountain_terrain
|
|
Blender: biome_blend
|
|
```
|
|
|
|
## Noise Functions
|
|
|
|
### SimplexNoise
|
|
|
|
Smooth, natural noise:
|
|
|
|
```java
|
|
public class SimplexNoiseDensity implements DensityFunction {
|
|
private SimplexNoise noise;
|
|
private float scale;
|
|
private int octaves;
|
|
private float persistence;
|
|
|
|
public float calculate(int x, int y, int z, GenerationContext ctx) {
|
|
float value = 0;
|
|
float amplitude = 1;
|
|
float frequency = scale;
|
|
|
|
for (int i = 0; i < octaves; i++) {
|
|
value += noise.noise3D(x * frequency, y * frequency, z * frequency) * amplitude;
|
|
amplitude *= persistence;
|
|
frequency *= 2;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
}
|
|
```
|
|
|
|
### PerlinNoise
|
|
|
|
Classic Perlin noise:
|
|
|
|
```yaml
|
|
Type: PerlinNoiseDensity
|
|
Scale: 0.02
|
|
Octaves: 6
|
|
Persistence: 0.5
|
|
Lacunarity: 2.0
|
|
```
|
|
|
|
### VoronoiNoise
|
|
|
|
Cell-based noise:
|
|
|
|
```yaml
|
|
Type: VoronoiDensity
|
|
Scale: 0.005
|
|
Type: Distance # or Edge, Cell
|
|
```
|
|
|
|
## Terrain Shaping
|
|
|
|
### CliffFunction
|
|
|
|
Creates cliff formations:
|
|
|
|
```java
|
|
public class CliffFunction implements DensityFunction {
|
|
private float cliffHeight;
|
|
private float steepness;
|
|
|
|
public float calculate(int x, int y, int z, GenerationContext ctx) {
|
|
float baseNoise = ctx.noise2D(x, z, 0.01f);
|
|
float cliffFactor = Math.abs(baseNoise) > 0.3f ? steepness : 1.0f;
|
|
return (64 - y) * cliffFactor;
|
|
}
|
|
}
|
|
```
|
|
|
|
### TerraceFunction
|
|
|
|
Creates terraced terrain:
|
|
|
|
```yaml
|
|
Type: TerraceDensity
|
|
TerraceHeight: 8
|
|
Smoothing: 0.5
|
|
```
|
|
|
|
### OverhangFunction
|
|
|
|
Creates overhangs and arches:
|
|
|
|
```yaml
|
|
Type: OverhangDensity
|
|
BaseFunction: terrain_base
|
|
OverhangNoise: overhang_noise
|
|
Threshold: 0.3
|
|
```
|
|
|
|
## Biome-Specific Functions
|
|
|
|
```yaml
|
|
# density/forest_terrain.yaml
|
|
Type: BiomeDensity
|
|
Biome: forest
|
|
Function:
|
|
Type: AddDensity
|
|
Functions:
|
|
- Type: HeightGradient
|
|
BaseHeight: 68
|
|
Falloff: 24
|
|
- Type: NoiseDensity
|
|
Scale: 0.02
|
|
Amplitude: 0.3
|
|
```
|
|
|
|
## Mask Functions
|
|
|
|
Control where density applies:
|
|
|
|
```yaml
|
|
Type: MaskedDensity
|
|
Function: mountain_terrain
|
|
Mask:
|
|
Type: NoiseMask
|
|
Scale: 0.001
|
|
Threshold: 0.5
|
|
```
|
|
|
|
## Configuration
|
|
|
|
```yaml
|
|
# density/terrain_config.yaml
|
|
DensityFunctions:
|
|
terrain_base:
|
|
Type: HeightGradient
|
|
BaseHeight: 64
|
|
Falloff: 32
|
|
terrain_hills:
|
|
Type: NoiseDensity
|
|
Scale: 0.01
|
|
Amplitude: 16
|
|
terrain_combined:
|
|
Type: AddDensity
|
|
Functions: [terrain_base, terrain_hills]
|
|
```
|
|
|
|
## Custom Density Function
|
|
|
|
```java
|
|
public class MyDensityFunction implements DensityFunction {
|
|
@Override
|
|
public float calculate(int x, int y, int z, GenerationContext ctx) {
|
|
// Custom terrain logic
|
|
float baseHeight = 64 + ctx.noise2D(x, z, 0.01f) * 20;
|
|
return baseHeight - y;
|
|
}
|
|
}
|
|
|
|
// Register in plugin setup
|
|
densityRegistry.register("my_terrain", new MyDensityFunction());
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
{{< callout type="info" >}}
|
|
**Density Function Guidelines:**
|
|
- Use composite functions for complex terrain
|
|
- Balance noise scales for natural appearance
|
|
- Test with visualization tools
|
|
- Consider performance with complex functions
|
|
- Use caching for expensive calculations
|
|
{{< /callout >}}
|