---
title: Fonctions de Densité
type: docs
weight: 8
---

Les fonctions de densité définissent la forme du terrain en calculant des valeurs de densité à chaque point dans l'espace 3D.

**Package:** `com.hypixel.hytale.builtin.hytalegenerator.density`

## Concept de Fonction de Densité

Les fonctions de densité retournent des valeurs qui déterminent solide vs air :
- Valeurs positives = terrain solide
- Valeurs négatives = air
- Zéro = limite de surface

```java
public interface DensityFunction {
    // Calculer la densité à une position
    float calculate(int x, int y, int z, GenerationContext context);
}
```

## Fonctions de Densité de Base

### ConstantDensity

Retourne une valeur constante :

```yaml
Type: ConstantDensity
Value: 1.0
```

### NoiseDensity

Utilise le bruit pour la variation du terrain :

```yaml
Type: NoiseDensity
NoiseType: Simplex
Scale: 0.01
Amplitude: 1.0
Octaves: 4
Persistence: 0.5
```

### HeightGradient

Crée un terrain plat à une hauteur spécifique :

```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;
    }
}
```

## Fonctions Composites

### AddDensity

Combine plusieurs fonctions par addition :

```yaml
Type: AddDensity
Functions:
  - terrain_base
  - terrain_hills
  - terrain_mountains
```

### MultiplyDensity

Multiplie les valeurs des fonctions :

```yaml
Type: MultiplyDensity
Functions:
  - terrain_base
  - mask_function
```

### BlendDensity

Mélange entre fonctions :

```yaml
Type: BlendDensity
FunctionA: plains_terrain
FunctionB: mountain_terrain
Blender: biome_blend
```

## Fonctions de Bruit

### SimplexNoise

Bruit lisse et naturel :

```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

Bruit Perlin classique :

```yaml
Type: PerlinNoiseDensity
Scale: 0.02
Octaves: 6
Persistence: 0.5
Lacunarity: 2.0
```

### VoronoiNoise

Bruit basé sur les cellules :

```yaml
Type: VoronoiDensity
Scale: 0.005
Type: Distance  # ou Edge, Cell
```

## Façonnage du Terrain

### CliffFunction

Crée des formations de falaises :

```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

Crée un terrain en terrasses :

```yaml
Type: TerraceDensity
TerraceHeight: 8
Smoothing: 0.5
```

### OverhangFunction

Crée des surplombs et des arches :

```yaml
Type: OverhangDensity
BaseFunction: terrain_base
OverhangNoise: overhang_noise
Threshold: 0.3
```

## Fonctions Spécifiques aux Biomes

```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
```

## Fonctions de Masque

Contrôle où la densité s'applique :

```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]
```

## Fonction de Densité Personnalisée

```java
public class MyDensityFunction implements DensityFunction {
    @Override
    public float calculate(int x, int y, int z, GenerationContext ctx) {
        // Logique de terrain personnalisée
        float baseHeight = 64 + ctx.noise2D(x, z, 0.01f) * 20;
        return baseHeight - y;
    }
}

// Enregistrer dans le setup du plugin
densityRegistry.register("my_terrain", new MyDensityFunction());
```

## Bonnes Pratiques

{{< callout type="info" >}}
**Directives des Fonctions de Densité :**
- Utilisez des fonctions composites pour un terrain complexe
- Équilibrez les échelles de bruit pour une apparence naturelle
- Testez avec des outils de visualisation
- Considérez les performances avec les fonctions complexes
- Utilisez le cache pour les calculs coûteux
{{< /callout >}}
