sdf3d_op_repeat and circle_repeat nodes.

This commit is contained in:
Relintai 2021-10-26 13:26:59 +02:00
parent 6429b4e725
commit 1c8af1f3f7
3 changed files with 158 additions and 40 deletions

View File

@ -74,13 +74,6 @@ const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
#Outputs:
#+X: $axis = length($uv.yz),-$uv.x
#-X: $axis = length($uv.yz),$uv.x
#+Y: $axis = length($uv.xz),$uv.y
#-Y: $axis = length($uv.xz),-$uv.y
#+Z: $axis = length($uv.xy),-$uv.z
#-Z: $axis = length($uv.xy),$uv.z
#Output (sdf3d)
#Output - (sdf3dc) - The shape generated by the repeat operation
#$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), float($seed), $r))
@ -640,7 +633,8 @@ static func sdf3d_elongation(p : Vector3, v : Vector3) -> Vector3:
return ((p) - Commons.clampv3((p), - Commons.absv3(v), Commons.absv3(v)))
static func sdf3d_repeat(p : Vector3, r : Vector2, randomness : float, pseed : int) -> Vector3:
return (repeat(p, Vector3(1.0/r.x, 1.0/r.y, 0.00001), float(pseed), randomness))
#$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), float($seed), $r))
return repeat(p, Vector3(1.0 / r.x, 1.0 / r.y, 0.00001), float(pseed), randomness)
#vec3 repeat(vec3 p, vec3 r, float seed, float randomness) {
# vec3 a = (rand3(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;
@ -673,48 +667,33 @@ static func sdf3d_repeat(p : Vector3, r : Vector2, randomness : float, pseed : i
# return rv;
#}
#Needs work
static func repeat(p : Vector3, r : Vector3, pseed : float, randomness : float) -> Vector3:
#fix division by zero
# p.x += 0.000001
# p.y += 0.000001
# p.z += 0.000001
# r.x += 0.000001
# r.y += 0.000001
# r.z += 0.000001
var a : Vector3 = (Commons.rand3(Commons.floorv2(Commons.modv2((Vector2(p.x, p.y) + Vector2(0.5, 0.5) * Vector2(r.x, r.y)) / Vector2(r.x, r.y), Vector2(1, 1) / Vector2(r.x, r.y)) + Vector2(pseed, pseed))) - Vector3(0.5, 0.5, 0.5)) * 6.28 * randomness
p = Commons.modv3(p + Vector3(0.5, 0.5, 0.5) * r, r) - Vector3(0.5, 0.5, 0.5) * r;
var pxy : Vector2 = Vector2(p.x, p.y)
var rxy : Vector2 = Vector2(r.x, r.y)
var r3 : Vector2 = Commons.floorv2(Commons.modv2((pxy + 0.5 * rxy) / rxy, Vector2(1.0 / rxy.x, 1.0 / rxy.y)) + Vector2(pseed, pseed))
var rr : Vector3 = Commons.rand3(r3)
rr.x -= 0.5
rr.y -= 0.5
rr.z -= 0.5
var a : Vector3 = (rr) * 6.28 * randomness;
p = Commons.modv3(p + 0.5 * r, r) - 0.5*r;
var rv : Vector3;
var c : float;
var s : float;
var rv : Vector3 = Vector3()
var c : float = 0
var s : float = 0
c = cos(a.x);
s = sin(a.x);
rv.x = p.x;
rv.y = p.y*c+p.z*s;
rv.z = -p.y*s+p.z*c;
rv.y = p.y* c + p.z * s;
rv.z = -p.y * s + p.z * c;
c = cos(a.y);
s = sin(a.y);
p.x = rv.x*c+rv.z*s;
p.y = rv.y;
p.z = -rv.x*s+rv.z*c;
c = cos(a.z);
s = sin(a.z);
rv.x = p.x*c+p.y*s;
rv.y = -p.x*s+p.y*c;
rv.x = p.x * c + p.y * s;
rv.y = -p.x * s + p.y * c;
rv.z = p.z;
return rv;
@ -764,7 +743,8 @@ static func rotate3d(p : Vector3, a : Vector3) -> Vector3:
return rv
#vec3 circle_repeat_transform(vec3 p, float count) {
# float r = 6.28/count;float pa = atan(p.x, p.y);
# float r = 6.28/count;
# float pa = atan(p.x, p.y);
# float a = mod(pa+0.5*r, r)-0.5*r;
# vec3 rv;
# float c = cos(a-pa);
@ -776,8 +756,16 @@ static func rotate3d(p : Vector3, a : Vector3) -> Vector3:
#}
static func circle_repeat_transform(p : Vector3, count : float) -> Vector3:
#todo
return Vector3()
var r : float = 6.28 / count
var pa : float = atan2(p.x, p.y)
var a : float = Commons.modf(pa + 0.5 * r, r) - 0.5 * r
var rv : Vector3 = Vector3()
var c : float = cos(a-pa)
var s : float = sin(a-pa)
rv.x = p.x * c + p.y * s
rv.y = -p.x * s + p.y * c
rv.z = p.z
return rv
#todo this needs to be solved
static func sdf3d_input(p : Vector3) -> Vector2:

View File

@ -0,0 +1,59 @@
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 input : Resource
export(Resource) var output : Resource
export(int) var count : int = 5
func _init_properties():
if !input:
input = MMNodeUniversalProperty.new()
input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
input.slot_name = ">>> Input "
if !input.is_connected("changed", self, "on_input_changed"):
input.connect("changed", self, "on_input_changed")
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_input_property(input)
register_output_property(output)
func _register_methods(mm_graph_node) -> void:
mm_graph_node.add_slot_label_universal(input)
mm_graph_node.add_slot_label_universal(output)
mm_graph_node.add_slot_int("get_count", "set_count", "Count")
func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
#todo make seed a class variable probably into MMNode
var new_uv : Vector3 = SDF3D.circle_repeat_transform(uv3, count)
return input.get_value_sdf3d(new_uv)
#count
func get_count() -> int:
return count
func set_count(val : int) -> void:
count = val
emit_changed()
output.emit_changed()
func on_input_changed() -> void:
emit_changed()
output.emit_changed()

View File

@ -0,0 +1,71 @@
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 input : Resource
export(Resource) var output : Resource
export(Vector2) var col_row : Vector2 = Vector2(3, 3)
export(float) var rotation : float = 0.3
func _init_properties():
if !input:
input = MMNodeUniversalProperty.new()
input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
input.slot_name = ">>> Input "
if !input.is_connected("changed", self, "on_input_changed"):
input.connect("changed", self, "on_input_changed")
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_input_property(input)
register_output_property(output)
func _register_methods(mm_graph_node) -> void:
mm_graph_node.add_slot_label_universal(input)
mm_graph_node.add_slot_label_universal(output)
mm_graph_node.add_slot_vector2("get_col_row", "set_col_row", "Col,Row", 1)
mm_graph_node.add_slot_float("get_rotation", "set_rotation", "Rotation", 0.01)
func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
#todo make seed a class variable probably into MMNode
var new_uv : Vector3 = SDF3D.sdf3d_repeat(uv3, col_row, rotation, 1)
return input.get_value_sdf3d(new_uv)
#col_row
func get_col_row() -> Vector2:
return col_row
func set_col_row(val : Vector2) -> void:
col_row = val
emit_changed()
output.emit_changed()
#rotation
func get_rotation() -> float:
return rotation
func set_rotation(val : float) -> void:
rotation = val
emit_changed()
output.emit_changed()
func on_input_changed() -> void:
emit_changed()
output.emit_changed()