# qendolin/better-clouds architecture

> Architecture diagram of the GitHub repository qendolin/better-clouds, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/qendolin/better-clouds
- Repository: https://github.com/qendolin/better-clouds

## Overview

Better Clouds is a client-side Minecraft mod that replaces vanilla-style cloud rendering with customizable volumetric, multi-layer clouds. Its runtime flow begins at Minecraft render hooks, enters the cloud rendering coordinator, and reaches the renderer and shader implementations. Users configure appearance through the settings GUI, with configuration persisted separately; presets and procedural generation support customization. Loader-specific entrypoints and compatibility adapters connect the shared mod to Fabric, NeoForge, and visual-mod integrations. The README documents broader capabilities than the sampled source, so uncertain internal wiring is omitted.

Main entry points: [`common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderer.java`](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderer.java) (Cloud renderer), [`common/src/main/java/com/qendolin/betterclouds/BetterClouds.java`](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/BetterClouds.java) (Mod core), [`common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderCoordinator.java`](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderCoordinator.java) (Render coordinator), [`common/src/main/java/com/qendolin/betterclouds/generator/ChunkedGenerator.java`](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/generator/ChunkedGenerator.java) (Cloud generation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_lifecycle["Mod lifecycle"]
  node_fabric_entry["Fabric entrypoint<br/>[Entrypoint.java]"]
  node_neo_entry["NeoForge entrypoint<br/>[Entrypoint.java]"]
  node_mod_core["Mod core<br/>[BetterClouds.java]"]
  node_render_hooks["Render hooks"]
end

subgraph group_clouds["Cloud pipeline"]
  node_coordinator["Render coordinator"]
  node_cloud_renderer["Cloud renderer<br/>[CloudRenderer.java]"]
  node_generation["Cloud generation"]
  node_sampling["Noise sampling<br/>[Sampler.java]"]
  node_opengl["OpenGL backend"]
  node_blaze3d["Blaze3D backend"]
  node_shader["Coverage shader"]
end

subgraph group_settings["Settings and presets"]
  node_config_gui["Configuration GUI<br/>[ConfigGUI.java]"]
  node_config["Cloud settings<br/>[Config.java]"]
  node_config_manager["Config manager<br/>[ConfigManager.java]"]
  node_presets["Preset handling<br/>[PresetLoader.java]"]
  node_shader_presets["Shader presets"]
end

subgraph group_integration["Platform and compatibility"]
  node_fabric_platform["Fabric platform"]
  node_neo_platform["NeoForge platform"]
  node_compat["Mod compatibility"]
  node_iris["Iris integration<br/>[IrisCompat.java]"]
end

node_minecraft(("Minecraft client"))
node_resource_packs["Resource packs"]
node_user(("Player"))

node_fabric_entry -->|"initializes"| node_mod_core
node_neo_entry -->|"initializes"| node_mod_core
node_minecraft -->|"renders world"| node_render_hooks
node_render_hooks -->|"hooks rendering"| node_coordinator
node_coordinator -->|"coordinates"| node_cloud_renderer
node_cloud_renderer -->|"generates clouds"| node_generation
node_generation -->|"samples noise"| node_sampling
node_cloud_renderer -->|"uses backend"| node_opengl
node_cloud_renderer -->|"uses backend"| node_blaze3d
node_opengl -->|"renders coverage"| node_shader
node_user -->|"changes settings"| node_config_gui
node_config_gui -->|"updates"| node_config
node_config_manager -->|"loads and saves"| node_config
node_config_manager -->|"serializes presets"| node_presets
node_presets -->|"loads"| node_shader_presets
node_resource_packs -.->|"customize generation"| node_generation
node_fabric_platform -->|"provides platform"| node_mod_core
node_neo_platform -->|"provides platform"| node_mod_core
node_compat -->|"includes"| node_iris
node_coordinator -.->|"checks integrations"| node_compat

click node_fabric_entry "https://github.com/qendolin/better-clouds/blob/development/fabric/src/main/java/com/qendolin/betterclouds/Entrypoint.java"
click node_neo_entry "https://github.com/qendolin/better-clouds/blob/development/neoforge/src/main/java/com/qendolin/betterclouds/Entrypoint.java"
click node_mod_core "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/BetterClouds.java"
click node_render_hooks "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/mixin/required/WorldRendererMixin.java"
click node_coordinator "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderCoordinator.java"
click node_cloud_renderer "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderer.java"
click node_generation "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/generator/ChunkedGenerator.java"
click node_sampling "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/generator/Sampler.java"
click node_opengl "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/opengl/OpenGLRenderer.java"
click node_blaze3d "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/blaze3d/Blaze3DRenderer.java"
click node_shader "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/opengl/shaders/CoverageShader.java"
click node_config_gui "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/gui/ConfigGUI.java"
click node_config "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/Config.java"
click node_config_manager "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/ConfigManager.java"
click node_presets "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/preset/PresetLoader.java"
click node_shader_presets "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/compat/ShaderPresetConfig.java"
click node_fabric_platform "https://github.com/qendolin/better-clouds/blob/development/fabric/src/main/java/com/qendolin/betterclouds/platform/fabric/EventHooksImpl.java"
click node_neo_platform "https://github.com/qendolin/better-clouds/blob/development/neoforge/src/main/java/com/qendolin/betterclouds/platform/neoforge/EventHooksImpl.java"
click node_compat "https://github.com/qendolin/better-clouds/tree/development/common/src/main/java/com/qendolin/betterclouds/compat"
click node_iris "https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/compat/IrisCompat.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_fabric_entry,node_neo_entry,node_mod_core,node_render_hooks,node_minecraft toneBlue
class node_coordinator,node_cloud_renderer,node_generation,node_sampling,node_opengl,node_blaze3d,node_shader toneAmber
class node_config_gui,node_config,node_config_manager,node_presets,node_shader_presets toneMint
class node_fabric_platform,node_neo_platform,node_compat,node_iris toneRose
class node_resource_packs,node_user toneIndigo
```

## Components

### Mod lifecycle

- [Fabric entrypoint](https://github.com/qendolin/better-clouds/blob/development/fabric/src/main/java/com/qendolin/betterclouds/Entrypoint.java): `fabric/src/main/java/com/qendolin/betterclouds/Entrypoint.java`
- [NeoForge entrypoint](https://github.com/qendolin/better-clouds/blob/development/neoforge/src/main/java/com/qendolin/betterclouds/Entrypoint.java): `neoforge/src/main/java/com/qendolin/betterclouds/Entrypoint.java`
- [Mod core](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/BetterClouds.java): `common/src/main/java/com/qendolin/betterclouds/BetterClouds.java`
- [Render hooks](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/mixin/required/WorldRendererMixin.java): `common/src/main/java/com/qendolin/betterclouds/mixin/required/WorldRendererMixin.java`

### Cloud pipeline

- [Render coordinator](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderCoordinator.java): `common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderCoordinator.java`
- [Cloud renderer](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderer.java): `common/src/main/java/com/qendolin/betterclouds/rendering/CloudRenderer.java`
- [Cloud generation](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/generator/ChunkedGenerator.java): `common/src/main/java/com/qendolin/betterclouds/generator/ChunkedGenerator.java`
- [Noise sampling](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/generator/Sampler.java): `common/src/main/java/com/qendolin/betterclouds/generator/Sampler.java`
- [OpenGL backend](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/opengl/OpenGLRenderer.java): `common/src/main/java/com/qendolin/betterclouds/rendering/opengl/OpenGLRenderer.java`
- [Blaze3D backend](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/blaze3d/Blaze3DRenderer.java): `common/src/main/java/com/qendolin/betterclouds/rendering/blaze3d/Blaze3DRenderer.java`
- [Coverage shader](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/rendering/opengl/shaders/CoverageShader.java): `common/src/main/java/com/qendolin/betterclouds/rendering/opengl/shaders/CoverageShader.java`

### Settings and presets

- [Configuration GUI](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/gui/ConfigGUI.java): `common/src/main/java/com/qendolin/betterclouds/config/gui/ConfigGUI.java`
- [Cloud settings](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/Config.java): `common/src/main/java/com/qendolin/betterclouds/config/Config.java`
- [Config manager](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/ConfigManager.java): `common/src/main/java/com/qendolin/betterclouds/config/ConfigManager.java`
- [Preset handling](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/preset/PresetLoader.java): `common/src/main/java/com/qendolin/betterclouds/config/preset/PresetLoader.java`
- [Shader presets](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/config/compat/ShaderPresetConfig.java): `common/src/main/java/com/qendolin/betterclouds/config/compat/ShaderPresetConfig.java`

### Platform and compatibility

- [Fabric platform](https://github.com/qendolin/better-clouds/blob/development/fabric/src/main/java/com/qendolin/betterclouds/platform/fabric/EventHooksImpl.java): `fabric/src/main/java/com/qendolin/betterclouds/platform/fabric/EventHooksImpl.java`
- [NeoForge platform](https://github.com/qendolin/better-clouds/blob/development/neoforge/src/main/java/com/qendolin/betterclouds/platform/neoforge/EventHooksImpl.java): `neoforge/src/main/java/com/qendolin/betterclouds/platform/neoforge/EventHooksImpl.java`
- [Mod compatibility](https://github.com/qendolin/better-clouds/tree/development/common/src/main/java/com/qendolin/betterclouds/compat): `common/src/main/java/com/qendolin/betterclouds/compat`
- [Iris integration](https://github.com/qendolin/better-clouds/blob/development/common/src/main/java/com/qendolin/betterclouds/compat/IrisCompat.java): `common/src/main/java/com/qendolin/betterclouds/compat/IrisCompat.java`

### Other components

- **Minecraft client**
- **Resource packs**
- **Player**

## Connections

- Fabric entrypoint → Mod core: initializes
- NeoForge entrypoint → Mod core: initializes
- Minecraft client → Render hooks: renders world
- Render hooks → Render coordinator: hooks rendering
- Render coordinator → Cloud renderer: coordinates
- Cloud renderer → Cloud generation: generates clouds
- Cloud generation → Noise sampling: samples noise
- Cloud renderer → OpenGL backend: uses backend
- Cloud renderer → Blaze3D backend: uses backend
- OpenGL backend → Coverage shader: renders coverage
- Player → Configuration GUI: changes settings
- Configuration GUI → Cloud settings: updates
- Config manager → Cloud settings: loads and saves
- Config manager → Preset handling: serializes presets
- Preset handling → Shader presets: loads
- Resource packs → Cloud generation: customize generation
- Fabric platform → Mod core: provides platform
- NeoForge platform → Mod core: provides platform
- Mod compatibility → Iris integration: includes
- Render coordinator → Mod compatibility: checks integrations
