Files
Trinittu/dynamic-sky/scripts/procedural_cloud_texture.gd
2026-02-03 11:26:48 +01:00

94 lines
2.4 KiB
GDScript

@tool
class_name ProceduralCloudTexture
extends Resource
@export var size: int = 512
@export var octaves: int = 6
@export var persistence: float = 0.5
@export var lacunarity: float = 2.0
@export var scale: float = 4.0
@export var seed_value: int = 0
@export var cloud_threshold: float = 0.4
@export var cloud_softness: float = 0.3
var _noise: FastNoiseLite
var _texture: ImageTexture
func _init() -> void:
_setup_noise()
func _setup_noise() -> void:
_noise = FastNoiseLite.new()
_noise.noise_type = FastNoiseLite.TYPE_SIMPLEX
_noise.seed = seed_value
_noise.frequency = 1.0 / (scale * 64.0)
_noise.fractal_type = FastNoiseLite.FRACTAL_FBM
_noise.fractal_octaves = octaves
_noise.fractal_lacunarity = lacunarity
_noise.fractal_gain = persistence
func generate() -> ImageTexture:
_setup_noise()
var image := Image.create(size, size, false, Image.FORMAT_RGBA8)
for y in size:
for x in size:
var noise_value := (_noise.get_noise_2d(float(x), float(y)) + 1.0) * 0.5
var cloud_value := smoothstep(cloud_threshold - cloud_softness, cloud_threshold + cloud_softness, noise_value)
var color := Color(cloud_value, cloud_value, cloud_value, cloud_value)
image.set_pixel(x, y, color)
_texture = ImageTexture.create_from_image(image)
return _texture
func get_texture() -> ImageTexture:
if _texture == null:
return generate()
return _texture
static func create_default_cloud_texture(layer_type: int = 0) -> ImageTexture:
var generator := ProceduralCloudTexture.new()
generator.size = 512
match layer_type:
0: # Low clouds - larger, denser
generator.scale = 3.0
generator.octaves = 4
generator.cloud_threshold = 0.35
generator.cloud_softness = 0.25
1: # Mid clouds - medium
generator.scale = 4.0
generator.octaves = 5
generator.cloud_threshold = 0.4
generator.cloud_softness = 0.3
2: # High clouds - wispy
generator.scale = 6.0
generator.octaves = 6
generator.cloud_threshold = 0.5
generator.cloud_softness = 0.35
3: # Wisps - very thin
generator.scale = 8.0
generator.octaves = 7
generator.cloud_threshold = 0.55
generator.cloud_softness = 0.4
return generator.generate()
static func create_shadow_texture() -> ImageTexture:
var generator := ProceduralCloudTexture.new()
generator.size = 256
generator.scale = 4.0
generator.octaves = 4
generator.cloud_threshold = 0.3
generator.cloud_softness = 0.4
return generator.generate()