ld58-collector/paintings/procedual/noise.gd

67 lines
2 KiB
GDScript

@tool
extends ColorRect
@export_tool_button('Randomize', 'RandomNumberGenerator') var randomize_action = randomize
@export var steps := 12:
set(x): material.set_shader_parameter('steps', x)
get(): return material.get_shader_parameter('steps')
@export var gradient_start := Color(.18, 0, .45):
set(x): material.set_shader_parameter('gradient_start', x)
get(): return material.get_shader_parameter('gradient_start')
@export var gradient_end := Color.YELLOW:
set(x): material.set_shader_parameter('gradient_end', x)
get(): return material.get_shader_parameter('gradient_end')
@export var rng_seed := 0:
set(x):
if rng_seed == x: return
rng_seed = x
_regenerate()
func _resized() -> void:
var tex: NoiseTexture2D = material.get_shader_parameter('noise')
tex.width = ceili(size.x)
tex.height = ceili(size.y)
material.set_shader_parameter('noise', tex)
func _ready() -> void:
_resized()
resized.connect(_resized)
func _regenerate() -> void:
var rng := RandomNumberGenerator.new()
rng.seed = rng_seed
var noise := FastNoiseLite.new()
noise.fractal_type = rng.randi_range(0, 3) as FastNoiseLite.FractalType
match noise.fractal_type:
3: noise.fractal_octaves = 2
2: noise.fractal_octaves = 3
_: noise.fractal_octaves = 5
noise.frequency = rng.randf_range(0.002, 0.004)
noise.seed = rng.seed
var tex := NoiseTexture2D.new()
tex.generate_mipmaps = false
tex.width = ceili(size.x)
tex.height = ceili(size.y)
tex.noise = noise
material.set_shader_parameter('noise', tex)
match rng.randi_range(1, 5):
1: steps = 2
2: steps = 5
3: steps = 12
4: steps = 24
5: steps = 128
var lighter := rng.randf_range(0.4, 0.8)
var darker := rng.randf_range(0.2, 0.6)
var color1 := Color.from_ok_hsl(rng.randf(), rng.randf() * 0.8 + 0.2, lighter)
var color2 := Color.from_ok_hsl(rng.randf(), rng.randf(), lighter - darker)
match rng.randi_range(1, 2):
1: gradient_start = color1; gradient_end = color2
_: gradient_start = color2; gradient_end = color1
func randomize() -> void:
rng_seed = randi()