mirror of
https://github.com/Relintai/broken_seals.git
synced 2024-12-18 01:06:47 +01:00
FBM noise node.
This commit is contained in:
parent
fb502505a3
commit
8feda525db
@ -2,7 +2,7 @@
|
||||
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/mm_material.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/noise/noise.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/noise/value.gd" type="Script" id=3]
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/noise/fbm_noise.gd" type="Script" id=3]
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/simple/shape.gd" type="Script" id=4]
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/mm_node_universal_property.gd" type="Script" id=5]
|
||||
[ext_resource path="res://addons/mat_maker_gd/nodes/other/output_image.gd" type="Script" id=6]
|
||||
|
@ -52,6 +52,11 @@ static func perlinabs(uv : Vector2, size : Vector2, folds : int, octaves : int,
|
||||
|
||||
return Color(f, f, f, 1)
|
||||
|
||||
static func simplex(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
|
||||
var f : float = fbm_simplexf(uv, size, folds, octaves, persistence, pseed)
|
||||
|
||||
return Color(f, f, f, 1)
|
||||
|
||||
static func cellular(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
|
||||
var f : float = cellularf(uv, size, folds, octaves, persistence, pseed)
|
||||
|
||||
@ -137,6 +142,24 @@ static func perlinabsf(coord : Vector2, size : Vector2, folds : int, octaves : i
|
||||
|
||||
return value / normalize_factor;
|
||||
|
||||
static func fbm_simplexf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
|
||||
var normalize_factor : float = 0.0;
|
||||
var value : float = 0.0;
|
||||
var scale : float = 1.0;
|
||||
|
||||
for i in range(octaves):# (int i = 0; i < octaves; i++) {
|
||||
var noise : float = fbm_simplex(coord*size, size, pseed)
|
||||
|
||||
for j in range(folds):# (int f = 0; f < folds; ++f) {
|
||||
noise = abs(2.0*noise-1.0);
|
||||
|
||||
value += noise * scale
|
||||
normalize_factor += scale;
|
||||
size *= 2.0;
|
||||
scale *= persistence;
|
||||
|
||||
return value / normalize_factor;
|
||||
|
||||
static func cellularf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
|
||||
var normalize_factor : float = 0.0;
|
||||
var value : float = 0.0;
|
||||
@ -328,7 +351,12 @@ static func fbm_perlinabs(coord : Vector2, size : Vector2, pseed : float) -> flo
|
||||
# u = fract(u) * 6.28318530718; // 2*pi
|
||||
# return vec2(cos(u), sin(u));
|
||||
#}
|
||||
#
|
||||
|
||||
static func rgrad2(p : Vector2, rot : float, pseed : float) -> Vector2:
|
||||
var u : float = Commons.rand(p + Vector2(pseed, 1.0-pseed));
|
||||
u = Commons.fract(u) * 6.28318530718; # 2*pi
|
||||
return Vector2(cos(u), sin(u))
|
||||
|
||||
#float fbm_simplex(vec2 coord, vec2 size, float seed) {
|
||||
# coord *= 2.0; // needed for it to tile
|
||||
# coord += rand2(vec2(seed, 1.0-seed)) + size;
|
||||
@ -371,8 +399,51 @@ static func fbm_perlinabs(coord : Vector2, size : Vector2, pseed : float) -> flo
|
||||
#}
|
||||
|
||||
static func fbm_simplex(coord : Vector2, size : Vector2, pseed : float) -> float:
|
||||
#TODO
|
||||
return 0.0
|
||||
coord *= 2.0; # needed for it to tile
|
||||
coord += Commons.rand2(Vector2(pseed, 1.0-pseed)) + size;
|
||||
size *= 2.0; # needed for it to tile
|
||||
coord.y += 0.001;
|
||||
|
||||
var uv : Vector2 = Vector2(coord.x + coord.y*0.5, coord.y);
|
||||
var i0 : Vector2 = Commons.floorv2(uv);
|
||||
var f0 : Vector2 = Commons.fractv2(uv);
|
||||
var i1 : Vector2
|
||||
|
||||
if (f0.x > f0.y):
|
||||
i1 = Vector2(1.0, 0.0)
|
||||
else:
|
||||
i1 = Vector2(0.0, 1.0);
|
||||
|
||||
var p0 : Vector2 = Vector2(i0.x - i0.y * 0.5, i0.y);
|
||||
var p1 : Vector2 = Vector2(p0.x + i1.x - i1.y * 0.5, p0.y + i1.y);
|
||||
var p2 : Vector2 = Vector2(p0.x + 0.5, p0.y + 1.0);
|
||||
|
||||
i1 = i0 + i1;
|
||||
|
||||
var i2 : Vector2 = i0 + Vector2(1.0, 1.0);
|
||||
var d0 : Vector2 = coord - p0;
|
||||
var d1 : Vector2 = coord - p1;
|
||||
var d2 : Vector2 = coord - p2;
|
||||
|
||||
var xw : Vector3 = Commons.modv3(Vector3(p0.x, p1.x, p2.x), Vector3(size.x, size.x, size.x));
|
||||
var yw : Vector3 = Commons.modv3(Vector3(p0.y, p1.y, p2.y), Vector3(size.y, size.y, size.y));
|
||||
|
||||
var iuw : Vector3 = xw + 0.5 * yw;
|
||||
var ivw : Vector3 = yw;
|
||||
|
||||
var g0 : Vector2 = rgrad2(Vector2(iuw.x, ivw.x), 0.0, pseed);
|
||||
var g1 : Vector2 = rgrad2(Vector2(iuw.y, ivw.y), 0.0, pseed);
|
||||
var g2 : Vector2 = rgrad2(Vector2(iuw.z, ivw.z), 0.0, pseed);
|
||||
|
||||
var w : Vector3 = Vector3(g0.dot(d0), g1.dot(d1), g2.dot(d2));
|
||||
var t : Vector3 = Vector3(0.8, 0.8, 0.8) - Vector3(d0.dot(d0), d1.dot(d1), d2.dot(d2));
|
||||
|
||||
t = Commons.maxv3(t, Vector3());
|
||||
var t2 : Vector3 = t * t;
|
||||
var t4 : Vector3 = t2 * t2;
|
||||
var n : float = t4.dot(w);
|
||||
|
||||
return 0.5 + 5.5 * n;
|
||||
|
||||
#float fbm_cellular(vec2 coord, vec2 size, float seed) {
|
||||
# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
|
||||
|
99
game/addons/mat_maker_gd/nodes/noise/fbm_noise.gd
Normal file
99
game/addons/mat_maker_gd/nodes/noise/fbm_noise.gd
Normal file
@ -0,0 +1,99 @@
|
||||
tool
|
||||
extends MMNode
|
||||
|
||||
var NoiseFBM = preload("res://addons/mat_maker_gd/nodes/common/noise_fbm.gd")
|
||||
|
||||
export(Resource) var image : Resource
|
||||
|
||||
export(int, "Value,Perlin,Simplex,Cellular1,Cellular2,Cellular3,Cellular4,Cellular5,Cellular6") var type : int = 0
|
||||
export(Vector2) var scale : Vector2 = Vector2(2, 2)
|
||||
export(int) var folds : int = 0
|
||||
export(int) var iterations : int = 5
|
||||
export(float) var persistence : float = 0.5
|
||||
|
||||
func _init_properties():
|
||||
if !image:
|
||||
image = MMNodeUniversalProperty.new()
|
||||
image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
|
||||
|
||||
image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
|
||||
|
||||
register_output_property(image)
|
||||
|
||||
func _register_methods(mm_graph_node) -> void:
|
||||
mm_graph_node.add_slot_texture_universal(image)
|
||||
mm_graph_node.add_slot_enum("get_type", "set_type", "Type", [ "Value", "Perlin", "Simplex", "Cellular1", "Cellular2", "Cellular3", "Cellular4", "Cellular5", "Cellular6" ])#, Vector2(0, 1))
|
||||
mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale")#, Vector2(1, 10))
|
||||
mm_graph_node.add_slot_int("get_folds", "set_folds", "folds")#, Vector2(0, 1))
|
||||
mm_graph_node.add_slot_int("get_iterations", "set_iterations", "Iterations")#, Vector2(0, 1))
|
||||
mm_graph_node.add_slot_float("get_persistence", "set_persistence", "Persistence", 0.01)#, Vector2(0, 1))
|
||||
|
||||
func get_value_for(uv : Vector2, pseed : int) -> Color:
|
||||
var ps : float = 1.0 / float(pseed)
|
||||
|
||||
#"Value,Perlin,Simplex,Cellular1,Cellular2,Cellular3,Cellular4,Cellular5,Cellular6"
|
||||
if type == 0:
|
||||
return NoiseFBM.fbmval(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 1:
|
||||
return NoiseFBM.perlin(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 2:
|
||||
return NoiseFBM.simplex(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 3:
|
||||
return NoiseFBM.cellular(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 4:
|
||||
return NoiseFBM.cellular2(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 5:
|
||||
return NoiseFBM.cellular3(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 6:
|
||||
return NoiseFBM.cellular4(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 7:
|
||||
return NoiseFBM.cellular5(uv, scale, folds, iterations, persistence, ps)
|
||||
elif type == 8:
|
||||
return NoiseFBM.cellular6(uv, scale, folds, iterations, persistence, ps)
|
||||
|
||||
return Color()
|
||||
|
||||
func _render(material) -> void:
|
||||
var img : Image = render_image(material)
|
||||
|
||||
image.set_value(img)
|
||||
|
||||
func get_type() -> int:
|
||||
return type
|
||||
|
||||
func set_type(val : int) -> void:
|
||||
type = val
|
||||
|
||||
set_dirty(true)
|
||||
|
||||
func get_scale() -> Vector2:
|
||||
return scale
|
||||
|
||||
func set_scale(val : Vector2) -> void:
|
||||
scale = val
|
||||
|
||||
set_dirty(true)
|
||||
|
||||
func get_folds() -> int:
|
||||
return folds
|
||||
|
||||
func set_folds(val : int) -> void:
|
||||
folds = val
|
||||
|
||||
set_dirty(true)
|
||||
|
||||
func get_iterations() -> int:
|
||||
return iterations
|
||||
|
||||
func set_iterations(val : int) -> void:
|
||||
iterations = val
|
||||
|
||||
set_dirty(true)
|
||||
|
||||
func get_persistence() -> float:
|
||||
return persistence
|
||||
|
||||
func set_persistence(val : float) -> void:
|
||||
persistence = val
|
||||
|
||||
set_dirty(true)
|
@ -1,62 +0,0 @@
|
||||
tool
|
||||
extends MMNode
|
||||
|
||||
var NoisePerlin = preload("res://addons/mat_maker_gd/nodes/common/noise_perlin.gd")
|
||||
|
||||
export(Resource) var image : Resource
|
||||
|
||||
export(Vector2) var scale : Vector2 = Vector2(4, 4)
|
||||
export(int) var iterations : int = 3
|
||||
export(float) var persistence : float = 0.5
|
||||
|
||||
func _init_properties():
|
||||
if !image:
|
||||
image = MMNodeUniversalProperty.new()
|
||||
image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
|
||||
|
||||
image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
|
||||
|
||||
register_output_property(image)
|
||||
|
||||
func _register_methods(mm_graph_node) -> void:
|
||||
mm_graph_node.add_slot_texture_universal(image)
|
||||
mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale")#, Vector2(1, 10))
|
||||
mm_graph_node.add_slot_int("get_iterations", "set_iterations", "Iterations")#, Vector2(0, 1))
|
||||
mm_graph_node.add_slot_float("get_persistence", "set_persistence", "Persistence", 0.01)#, Vector2(0, 1))
|
||||
|
||||
func get_value_for(uv : Vector2, pseed : int) -> Color:
|
||||
var ps : float = 1.0 / float(pseed)
|
||||
|
||||
#perlin($(uv), vec2($(scale_x), $(scale_y)), int($(iterations)), $(persistence), $(seed))
|
||||
var f : float = NoisePerlin.perlin(uv, scale, iterations, persistence, ps)
|
||||
|
||||
return Color(f, f, f, 1)
|
||||
|
||||
func _render(material) -> void:
|
||||
var img : Image = render_image(material)
|
||||
|
||||
image.set_value(img)
|
||||
|
||||
func get_scale() -> Vector2:
|
||||
return scale
|
||||
|
||||
func set_scale(val : Vector2) -> void:
|
||||
scale = val
|
||||
|
||||
set_dirty(true)
|
||||
|
||||
func get_iterations() -> int:
|
||||
return iterations
|
||||
|
||||
func set_iterations(val : int) -> void:
|
||||
iterations = val
|
||||
|
||||
set_dirty(true)
|
||||
|
||||
func get_persistence() -> float:
|
||||
return persistence
|
||||
|
||||
func set_persistence(val : float) -> void:
|
||||
persistence = val
|
||||
|
||||
set_dirty(true)
|
Loading…
Reference in New Issue
Block a user