diff --git a/game/addons/mat_maker_gd/new_resource.tres b/game/addons/mat_maker_gd/new_resource.tres index 3768c837..7af3ac62 100644 --- a/game/addons/mat_maker_gd/new_resource.tres +++ b/game/addons/mat_maker_gd/new_resource.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" load_steps=107 format=2] +[gd_resource type="Resource" load_steps=116 format=2] [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] @@ -28,6 +28,8 @@ [ext_resource path="res://addons/mat_maker_gd/nodes/sdf2d/sd_op_circle_repeat.gd" type="Script" id=26] [ext_resource path="res://addons/mat_maker_gd/nodes/sdf2d/sd_op_morph.gd" type="Script" id=27] [ext_resource path="res://addons/mat_maker_gd/nodes/simple/curve.gd" type="Script" id=28] +[ext_resource path="res://addons/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd" type="Script" id=29] +[ext_resource path="res://addons/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd" type="Script" id=30] [sub_resource type="Resource" id=3] script = ExtResource( 5 ) @@ -65,7 +67,7 @@ sides = 11 radius = SubResource( 4 ) edge = SubResource( 3 ) -[sub_resource type="Resource" id=101] +[sub_resource type="Resource" id=103] script = ExtResource( 5 ) default_type = 5 default_int = 0 @@ -77,7 +79,7 @@ default_color = Color( 0, 0, 0, 1 ) [sub_resource type="Resource" id=6] script = ExtResource( 6 ) graph_position = Vector2( 300, -400 ) -image = SubResource( 101 ) +image = SubResource( 103 ) postfix = "-test" [sub_resource type="Resource" id=9] @@ -708,7 +710,67 @@ c = Vector2( 0.35, -0.2 ) width = 0.24 repeat = 5 +[sub_resource type="Resource" id=109] +script = ExtResource( 5 ) +default_type = 2 +default_int = 0 +default_float = 0.0 +default_vector2 = Vector2( 0, 0 ) +default_vector3 = Vector3( 0, 0, 0 ) +default_color = Color( 0, 0, 0, 1 ) + +[sub_resource type="Resource" id=104] +script = ExtResource( 5 ) +default_type = 2 +default_int = 0 +default_float = 0.0 +default_vector2 = Vector2( 0, 0 ) +default_vector3 = Vector3( 0, 0, 0 ) +default_color = Color( 0, 0, 0, 1 ) +input_property = SubResource( 109 ) + +[sub_resource type="Resource" id=105] +script = ExtResource( 5 ) +default_type = 5 +default_int = 0 +default_float = 0.0 +default_vector2 = Vector2( 0, 0 ) +default_vector3 = Vector3( 0, 0, 0 ) +default_color = Color( 0, 0, 0, 1 ) + +[sub_resource type="Resource" id=106] +script = ExtResource( 5 ) +default_type = 5 +default_int = 0 +default_float = 0.0 +default_vector2 = Vector2( 0, 0 ) +default_vector3 = Vector3( 0, 0, 0 ) +default_color = Color( 0, 0, 0, 1 ) + +[sub_resource type="Resource" id=107] +script = ExtResource( 5 ) +default_type = 5 +default_int = 0 +default_float = 0.0 +default_vector2 = Vector2( 0, 0 ) +default_vector3 = Vector3( 0, 0, 0 ) +default_color = Color( 0, 0, 0, 1 ) + +[sub_resource type="Resource" id=108] +script = ExtResource( 29 ) +graph_position = Vector2( -660, 420 ) +input = SubResource( 104 ) +out_height_map = SubResource( 106 ) +out_normal_map = SubResource( 107 ) +out_color_map = SubResource( 105 ) + +[sub_resource type="Resource" id=110] +script = ExtResource( 30 ) +graph_position = Vector2( -1040, 500 ) +output = SubResource( 109 ) +radius = 0.5 + [resource] script = ExtResource( 1 ) image_size = Vector2( 128, 128 ) -nodes = [ SubResource( 5 ), SubResource( 6 ), SubResource( 12 ), SubResource( 15 ), SubResource( 18 ), SubResource( 21 ), SubResource( 24 ), SubResource( 27 ), SubResource( 39 ), SubResource( 42 ), SubResource( 45 ), SubResource( 49 ), SubResource( 54 ), SubResource( 58 ), SubResource( 60 ), SubResource( 63 ), SubResource( 66 ), SubResource( 69 ), SubResource( 71 ), SubResource( 73 ), SubResource( 78 ), SubResource( 82 ), SubResource( 85 ), SubResource( 88 ), SubResource( 90 ), SubResource( 92 ), SubResource( 96 ), SubResource( 100 ) ] +nodes = [ SubResource( 5 ), SubResource( 6 ), SubResource( 12 ), SubResource( 15 ), SubResource( 18 ), SubResource( 21 ), SubResource( 24 ), SubResource( 27 ), SubResource( 39 ), SubResource( 42 ), SubResource( 45 ), SubResource( 49 ), SubResource( 54 ), SubResource( 58 ), SubResource( 60 ), SubResource( 63 ), SubResource( 66 ), SubResource( 69 ), SubResource( 71 ), SubResource( 73 ), SubResource( 78 ), SubResource( 82 ), SubResource( 85 ), SubResource( 88 ), SubResource( 90 ), SubResource( 92 ), SubResource( 96 ), SubResource( 100 ), SubResource( 108 ), SubResource( 110 ) ] diff --git a/game/addons/mat_maker_gd/nodes/common/sdf3d.gd b/game/addons/mat_maker_gd/nodes/common/sdf3d.gd index ff438bbd..c908aa77 100644 --- a/game/addons/mat_maker_gd/nodes/common/sdf3d.gd +++ b/game/addons/mat_maker_gd/nodes/common/sdf3d.gd @@ -519,7 +519,8 @@ static func sdf3d_torus_z(p : Vector3, R : float, r : float) -> Vector2: #vec2 raymarch_$name(vec2 uv) { # vec3 ro = vec3(uv-vec2(0.5), 1.0); # vec3 rd = vec3(0.0, 0.0, -1.0); -# float dO = 0.0;float c = 0.0; +# float dO = 0.0; +# float c = 0.0; # # for (int i=0; i < 100; i++) { # vec3 p = ro + rd*dO; diff --git a/game/addons/mat_maker_gd/nodes/mm_node_universal_property.gd b/game/addons/mat_maker_gd/nodes/mm_node_universal_property.gd index 3c2f1c7a..47af7799 100644 --- a/game/addons/mat_maker_gd/nodes/mm_node_universal_property.gd +++ b/game/addons/mat_maker_gd/nodes/mm_node_universal_property.gd @@ -90,7 +90,15 @@ func get_owner_value(uv : Vector2): return to_color(owner.get_property_value(uv)) elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE: return to_color(owner.get_property_value(uv)) + +func get_value_sdf3d(uv3 : Vector3, skip_owner_val : bool = false) -> Vector2: + if get_value_from_owner && !skip_owner_val: + return owner.get_property_value_sdf3d(uv3) + if !input_property: + return default_vector2 + + return input_property.get_value_sdf3d(uv3) func to_int(val) -> int: if val is int: diff --git a/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d.gd b/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d.gd deleted file mode 100644 index 99c44ec0..00000000 --- a/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d.gd +++ /dev/null @@ -1,58 +0,0 @@ -tool -extends MMNode - -var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd") - -var image : Image -var tex : ImageTexture - -export(Vector2) var bmin : Vector2 = Vector2(0.1, 0.1) -export(Vector2) var bmax : Vector2 = Vector2(1, 1) - -export(bool) var refresh setget reff,reffg - -func _ready(): - if !Engine.editor_hint: - gen() - -func gen() -> void: - if !image: - image = Image.new() - image.create(300, 300, false, Image.FORMAT_RGBA8) - - if !tex: - tex = ImageTexture.new() - -# var bmin : Vector2 = Vector2(0.1, 0.1) -# var bmax : Vector2 = Vector2(1, 1) - - image.lock() - - var w : float = image.get_width() - var h : float = image.get_width() - - var pseed : float = randf() + randi() - - for x in range(image.get_width()): - for y in range(image.get_height()): - var v : Vector2 = Vector2(x / w, y / h) - - var col : Color = SDF3D.raymarch(v) -# var col : Color = SDF3D.raymarch2(v) -# var col : Color = SDF3D.raymarch3(v) - - image.set_pixel(x, y, col) - - - image.unlock() - - tex.create_from_image(image) -# texture = tex - -func reffg(): - return false - -func reff(bb): - if bb: - gen() - diff --git a/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd b/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd new file mode 100644 index 00000000..4bd29188 --- /dev/null +++ b/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd @@ -0,0 +1,179 @@ +tool +extends MMNode + +const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd") +var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd") + +export(Resource) var input : Resource + +export(Resource) var out_height_map : Resource +export(Resource) var out_normal_map : Resource +export(Resource) var out_color_map : Resource + +func _init_properties(): + if !input: + input = MMNodeUniversalProperty.new() + input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2 + + #for some reason this doesn't work, todo check +# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT + input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL + input.slot_name = "Input" + + if !out_height_map: + out_height_map = MMNodeUniversalProperty.new() + out_height_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE + + out_height_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE + + if !out_normal_map: + out_normal_map = MMNodeUniversalProperty.new() + out_normal_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE + + out_normal_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE + + if !out_color_map: + out_color_map = MMNodeUniversalProperty.new() + out_color_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE + + out_color_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE + + register_output_property(out_height_map) + register_output_property(out_normal_map) + register_output_property(out_color_map) + register_input_property(input) + +func _register_methods(mm_graph_node) -> void: + mm_graph_node.add_slot_label_universal(input) + mm_graph_node.add_slot_texture_universal(out_height_map) + mm_graph_node.add_slot_texture_universal(out_normal_map) + mm_graph_node.add_slot_texture_universal(out_color_map) + + +func _render(material) -> void: + var height_map : Image = Image.new() + var normal_map : Image = Image.new() + var color_map : Image = Image.new() + + height_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8) + normal_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8) + color_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8) + + height_map.lock() + normal_map.lock() + color_map.lock() + + var w : float = material.image_size.x + var h : float = material.image_size.y + + var pseed : float = randf() + randi() + + for x in range(material.image_size.x): + for y in range(material.image_size.y): + var uv : Vector2 = Vector2(x / w, y / h) + + var raymarch : Vector2 = sdf3d_raymarch(uv) + + #HeightMap - float - The generated height map + #1.0-$(name_uv)_d.x + var hmf : float = 1.0 - raymarch.x + var height_map_col : Color = Color(hmf, hmf, hmf, 1) + + #NormalMap - rgb - The generated normal map + #vec3(0.5) + 0.5* normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d.x)) + var nuv : Vector2 = uv - Vector2(0.5, 0.5) + var n : Vector3 = sdf3d_normal(Vector3(nuv.x, nuv.y, 1.0 - raymarch.x)) + var nn : Vector3 = Vector3(0.5, 0.5, 0.5) + 0.5 * n + + var normal_map_col : Color = Color(nn.x, nn.y, nn.z, 1) + + #ColorMap - float - The generated color index map + #$(name_uv)_d.y + var color_map_col : Color = Color(raymarch.y, raymarch.y, raymarch.y, 1) + + height_map.set_pixel(x, y, height_map_col) + normal_map.set_pixel(x, y, normal_map_col) + color_map.set_pixel(x, y, color_map_col) + + height_map.unlock() + normal_map.unlock() + color_map.unlock() + + out_height_map.set_value(height_map) + out_normal_map.set_value(normal_map) + out_color_map.set_value(color_map) + +func get_value_for(uv : Vector2, pseed : int) -> Color: + return Color() + +#vec2 raymarch_$name(vec2 uv) { +# vec3 ro = vec3(uv-vec2(0.5), 1.0); +# vec3 rd = vec3(0.0, 0.0, -1.0); +# float dO = 0.0; +# float c = 0.0; +# +# for (int i=0; i < 100; i++) { +# vec3 p = ro + rd*dO; +# vec2 dS = $sdf(p); +# dO += dS.x; +# +# if (dO >= 1.0) { +# break; +# } else if (dS.x < 0.0001) { +# c = dS.y; +# break; +# } +# } +# +# return vec2(dO, c); +#} + +func sdf3d_raymarch(uv : Vector2) -> Vector2: + var ro : Vector3 = Vector3(uv.x - 0.5, uv.y - 0.5, 1.0); + var rd : Vector3 = Vector3(0.0, 0.0, -1.0); + var dO : float = 0.0; + var c : float = 0.0; + + for i in range(100): + var p : Vector3 = ro + rd * dO; + var dS : Vector2 = input.get_value_sdf3d(p) + + dO += dS.x; + + if (dO >= 1.0): + break; + elif (dS.x < 0.0001): + c = dS.y; + break; + + return Vector2(dO, c); + +#vec3 normal_$name(vec3 p) { +# if (p.z <= 0.0) { +# return vec3(0.0, 0.0, 1.0); +# } +# +# float d = $sdf(p).x; +# float e = .001; +# vec3 n = d - vec3( +# $sdf(p-vec3(e, 0.0, 0.0)).x, +# $sdf(p-vec3(0.0, e, 0.0)).x, +# $sdf(p-vec3(0.0, 0.0, e)).x); +# +# return vec3(-1.0, -1.0, -1.0)*normalize(n); +#} + +func sdf3d_normal(p : Vector3) -> Vector3: + if (p.z <= 0.0): + return Vector3(0.0, 0.0, 1.0); + + var d : float = input.get_value_sdf3d(p).x + var e : float = .001; + + var n : Vector3 = Vector3( + d - input.get_value_sdf3d(p - Vector3(e, 0.0, 0.0)).x, + d - input.get_value_sdf3d(p - Vector3(0.0, e, 0.0)).x, + d - input.get_value_sdf3d(p - Vector3(0.0, 0.0, e)).x) + + return Vector3(-1.0, -1.0, -1.0) * n.normalized() + diff --git a/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd b/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd new file mode 100644 index 00000000..145206bc --- /dev/null +++ b/game/addons/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd @@ -0,0 +1,37 @@ +tool +extends MMNode + +const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd") +var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd") + +export(Resource) var output : Resource +export(float) var radius : float = 0.5 + +func _init_properties(): + if !output: + output = MMNodeUniversalProperty.new() + output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2 + + output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT + output.slot_name = ">>> Output >>>" + output.get_value_from_owner = true + + register_output_property(output) + +func _register_methods(mm_graph_node) -> void: + mm_graph_node.add_slot_label_universal(output) + + mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01) + +func get_property_value_sdf3d(uv3 : Vector3) -> Vector2: + return SDF3D.sdf3d_sphere(uv3, radius) + +#radius +func get_radius() -> float: + return radius + +func set_radius(val : float) -> void: + radius = val + + emit_changed() + output.emit_changed()