mirror of
https://github.com/Relintai/material-maker.git
synced 2024-12-23 21:16:54 +01:00
Improved nodes and added texture export
Improved perlin noise and transform nodes. Added an export texture menu entry that exports a texture for the selected node.
This commit is contained in:
parent
a3a8482d03
commit
4e0af78b31
11
addons/procedural_material/material_preview.gd
Normal file
11
addons/procedural_material/material_preview.gd
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
tool
|
||||||
|
extends Viewport
|
||||||
|
|
||||||
|
var material = null
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
material = ShaderMaterial.new()
|
||||||
|
material.shader = Shader.new()
|
||||||
|
$Objects/Cube.set_surface_material(0, material)
|
||||||
|
$Objects/Cylinder.set_surface_material(0, material)
|
||||||
|
$AnimationPlayer.play("rotate")
|
@ -22,6 +22,3 @@ func get_shader_code(uv):
|
|||||||
rv.code = "float "+name+"_"+str(variant_index)+"_f = "+name+"_f("+uv+");\n"
|
rv.code = "float "+name+"_"+str(variant_index)+"_f = "+name+"_f("+uv+");\n"
|
||||||
rv.f = name+"_"+str(variant_index)+"_f"
|
rv.f = name+"_"+str(variant_index)+"_f"
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
func _get_state_variables():
|
|
||||||
return [ "rows", "columns", "row_offset", "mortar", "bevel" ]
|
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
tool
|
tool
|
||||||
extends "res://addons/procedural_material/node_base.gd"
|
extends "res://addons/procedural_material/node_base.gd"
|
||||||
|
|
||||||
|
var scale_x
|
||||||
|
var scale_y
|
||||||
var iterations
|
var iterations
|
||||||
var turbulence
|
var persistance
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
set_slot(0, false, 0, Color(0.5, 0.5, 1), true, 0, Color(0.5, 0.5, 1))
|
set_slot(0, false, 0, Color(0.5, 0.5, 1), true, 0, Color(0.5, 0.5, 1))
|
||||||
initialize_properties([ $GridContainer/iterations, $GridContainer/turbulence ])
|
initialize_properties([ $GridContainer/scale_x, $GridContainer/scale_y, $GridContainer/iterations, $GridContainer/persistance ])
|
||||||
|
|
||||||
func get_shader_code(uv):
|
func get_shader_code(uv):
|
||||||
var rv = { defs="", code="" }
|
var rv = { defs="", code="" }
|
||||||
if generated_variants.empty():
|
if generated_variants.empty():
|
||||||
rv.defs = "float "+name+"_f(vec2 uv) { return perlin(uv, "+str(iterations)+", "+str(turbulence)+"); }\n"
|
rv.defs = "float "+name+"_f(vec2 uv) { return perlin(uv, vec2("+str(scale_x)+", "+str(scale_y)+"), "+str(iterations)+", "+str(persistance)+"); }\n"
|
||||||
var variant_index = generated_variants.find(uv)
|
var variant_index = generated_variants.find(uv)
|
||||||
if variant_index == -1:
|
if variant_index == -1:
|
||||||
variant_index = generated_variants.size()
|
variant_index = generated_variants.size()
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
[ext_resource path="res://addons/procedural_material/nodes/perlin.gd" type="Script" id=1]
|
[ext_resource path="res://addons/procedural_material/nodes/perlin.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
|
||||||
[sub_resource type="Theme" id=1]
|
[sub_resource type="Theme" id=1]
|
||||||
|
|
||||||
|
|
||||||
@ -14,8 +13,8 @@ anchor_right = 0.0
|
|||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_left = 1.0
|
margin_left = 1.0
|
||||||
margin_top = 2.0
|
margin_top = 2.0
|
||||||
margin_right = 166.0
|
margin_right = 189.0
|
||||||
margin_bottom = 83.0
|
margin_bottom = 139.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
mouse_filter = 1
|
mouse_filter = 1
|
||||||
@ -47,8 +46,8 @@ anchor_right = 0.0
|
|||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_left = 16.0
|
margin_left = 16.0
|
||||||
margin_top = 24.0
|
margin_top = 24.0
|
||||||
margin_right = 149.0
|
margin_right = 172.0
|
||||||
margin_bottom = 76.0
|
margin_bottom = 132.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
mouse_filter = 1
|
mouse_filter = 1
|
||||||
@ -64,7 +63,7 @@ anchor_top = 0.0
|
|||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_top = 5.0
|
margin_top = 5.0
|
||||||
margin_right = 71.0
|
margin_right = 78.0
|
||||||
margin_bottom = 19.0
|
margin_bottom = 19.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
@ -72,80 +71,180 @@ mouse_filter = 2
|
|||||||
mouse_default_cursor_shape = 0
|
mouse_default_cursor_shape = 0
|
||||||
size_flags_horizontal = 1
|
size_flags_horizontal = 1
|
||||||
size_flags_vertical = 4
|
size_flags_vertical = 4
|
||||||
|
text = "Scale X:"
|
||||||
|
percent_visible = 1.0
|
||||||
|
lines_skipped = 0
|
||||||
|
max_lines_visible = -1
|
||||||
|
|
||||||
|
[node name="scale_x" type="SpinBox" parent="GridContainer" index="1"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_left = 82.0
|
||||||
|
margin_right = 156.0
|
||||||
|
margin_bottom = 24.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 0
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 1
|
||||||
|
min_value = 0.0
|
||||||
|
max_value = 32.0
|
||||||
|
step = 1.0
|
||||||
|
page = 0.0
|
||||||
|
value = 4.0
|
||||||
|
exp_edit = false
|
||||||
|
rounded = false
|
||||||
|
editable = true
|
||||||
|
prefix = ""
|
||||||
|
suffix = ""
|
||||||
|
_sections_unfolded = [ "Caret", "Placeholder" ]
|
||||||
|
|
||||||
|
[node name="Label2" type="Label" parent="GridContainer" index="2"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_top = 33.0
|
||||||
|
margin_right = 78.0
|
||||||
|
margin_bottom = 47.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 2
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 4
|
||||||
|
text = "Scale Y:"
|
||||||
|
percent_visible = 1.0
|
||||||
|
lines_skipped = 0
|
||||||
|
max_lines_visible = -1
|
||||||
|
|
||||||
|
[node name="scale_y" type="SpinBox" parent="GridContainer" index="3"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_left = 82.0
|
||||||
|
margin_top = 28.0
|
||||||
|
margin_right = 156.0
|
||||||
|
margin_bottom = 52.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 0
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 1
|
||||||
|
min_value = 0.0
|
||||||
|
max_value = 32.0
|
||||||
|
step = 1.0
|
||||||
|
page = 0.0
|
||||||
|
value = 4.0
|
||||||
|
exp_edit = false
|
||||||
|
rounded = false
|
||||||
|
editable = true
|
||||||
|
prefix = ""
|
||||||
|
suffix = ""
|
||||||
|
_sections_unfolded = [ "Caret", "Placeholder" ]
|
||||||
|
|
||||||
|
[node name="Label3" type="Label" parent="GridContainer" index="4"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_top = 61.0
|
||||||
|
margin_right = 78.0
|
||||||
|
margin_bottom = 75.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 2
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 4
|
||||||
text = "Iterations:"
|
text = "Iterations:"
|
||||||
percent_visible = 1.0
|
percent_visible = 1.0
|
||||||
lines_skipped = 0
|
lines_skipped = 0
|
||||||
max_lines_visible = -1
|
max_lines_visible = -1
|
||||||
|
|
||||||
[node name="iterations" type="LineEdit" parent="GridContainer" index="1"]
|
[node name="iterations" type="SpinBox" parent="GridContainer" index="5"]
|
||||||
|
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_left = 75.0
|
margin_left = 82.0
|
||||||
margin_right = 133.0
|
margin_top = 56.0
|
||||||
margin_bottom = 24.0
|
margin_right = 156.0
|
||||||
|
margin_bottom = 80.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
focus_mode = 2
|
|
||||||
mouse_filter = 0
|
mouse_filter = 0
|
||||||
mouse_default_cursor_shape = 1
|
mouse_default_cursor_shape = 0
|
||||||
size_flags_horizontal = 1
|
size_flags_horizontal = 1
|
||||||
size_flags_vertical = 1
|
size_flags_vertical = 1
|
||||||
text = "3"
|
min_value = 1.0
|
||||||
focus_mode = 2
|
max_value = 10.0
|
||||||
context_menu_enabled = true
|
step = 1.0
|
||||||
placeholder_alpha = 0.6
|
page = 0.0
|
||||||
caret_blink = false
|
value = 3.0
|
||||||
caret_blink_speed = 0.65
|
exp_edit = false
|
||||||
caret_position = 0
|
rounded = false
|
||||||
|
editable = true
|
||||||
|
prefix = ""
|
||||||
|
suffix = ""
|
||||||
_sections_unfolded = [ "Caret", "Placeholder" ]
|
_sections_unfolded = [ "Caret", "Placeholder" ]
|
||||||
|
|
||||||
[node name="Label2" type="Label" parent="GridContainer" index="2"]
|
[node name="Label4" type="Label" parent="GridContainer" index="6"]
|
||||||
|
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_top = 33.0
|
margin_top = 89.0
|
||||||
margin_right = 71.0
|
margin_right = 78.0
|
||||||
margin_bottom = 47.0
|
margin_bottom = 103.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
mouse_default_cursor_shape = 0
|
mouse_default_cursor_shape = 0
|
||||||
size_flags_horizontal = 1
|
size_flags_horizontal = 1
|
||||||
size_flags_vertical = 4
|
size_flags_vertical = 4
|
||||||
text = "Turbulence"
|
text = "Persistance:"
|
||||||
percent_visible = 1.0
|
percent_visible = 1.0
|
||||||
lines_skipped = 0
|
lines_skipped = 0
|
||||||
max_lines_visible = -1
|
max_lines_visible = -1
|
||||||
|
|
||||||
[node name="turbulence" type="LineEdit" parent="GridContainer" index="3"]
|
[node name="persistance" type="SpinBox" parent="GridContainer" index="7"]
|
||||||
|
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_left = 75.0
|
margin_left = 82.0
|
||||||
margin_top = 28.0
|
margin_top = 84.0
|
||||||
margin_right = 133.0
|
margin_right = 156.0
|
||||||
margin_bottom = 52.0
|
margin_bottom = 108.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
focus_mode = 2
|
|
||||||
mouse_filter = 0
|
mouse_filter = 0
|
||||||
mouse_default_cursor_shape = 1
|
mouse_default_cursor_shape = 0
|
||||||
size_flags_horizontal = 1
|
size_flags_horizontal = 1
|
||||||
size_flags_vertical = 1
|
size_flags_vertical = 1
|
||||||
text = "0.5"
|
min_value = 0.0
|
||||||
focus_mode = 2
|
max_value = 1.0
|
||||||
context_menu_enabled = true
|
step = 0.05
|
||||||
placeholder_alpha = 0.6
|
page = 0.0
|
||||||
caret_blink = false
|
value = 0.5
|
||||||
caret_blink_speed = 0.65
|
exp_edit = false
|
||||||
caret_position = 0
|
rounded = false
|
||||||
|
editable = true
|
||||||
|
prefix = ""
|
||||||
|
suffix = ""
|
||||||
_sections_unfolded = [ "Caret", "Placeholder" ]
|
_sections_unfolded = [ "Caret", "Placeholder" ]
|
||||||
|
|
||||||
[connection signal="close_request" from="." to="." method="queue_free"]
|
[connection signal="close_request" from="." to="." method="queue_free"]
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
tool
|
tool
|
||||||
extends "res://addons/procedural_material/node_base.gd"
|
extends "res://addons/procedural_material/node_base.gd"
|
||||||
|
|
||||||
var angle = 0.0
|
var rotate = 0.0
|
||||||
|
var scale = 0.0
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
set_slot(0, true, 0, Color(0.5, 0.5, 1), true, 0, Color(0.5, 0.5, 1))
|
set_slot(0, true, 0, Color(0.5, 0.5, 1), true, 0, Color(0.5, 0.5, 1))
|
||||||
initialize_properties([ $rotate ])
|
initialize_properties([ $GridContainer/rotate, $GridContainer/scale ])
|
||||||
|
|
||||||
func get_shader_code(uv):
|
func get_shader_code(uv):
|
||||||
var rv = { defs="", code="" }
|
var rv = { defs="", code="" }
|
||||||
@ -15,7 +16,7 @@ func get_shader_code(uv):
|
|||||||
rv.uv = name+"_uv("+uv+")"
|
rv.uv = name+"_uv("+uv+")"
|
||||||
var src_code = src.get_shader_code(rv.uv)
|
var src_code = src.get_shader_code(rv.uv)
|
||||||
if !generated:
|
if !generated:
|
||||||
rv.defs = src_code.defs+"vec2 "+name+"_uv(vec2 uv) { return rotate(uv, "+str(angle)+"); }\n"
|
rv.defs = src_code.defs+"vec2 "+name+"_uv(vec2 uv) { return transform(uv, "+str(3.1415928*rotate/180.0)+", "+str(scale)+"); }\n"
|
||||||
generated = true
|
generated = true
|
||||||
rv.code = src_code.code;
|
rv.code = src_code.code;
|
||||||
if src_code.has("f"):
|
if src_code.has("f"):
|
||||||
@ -23,7 +24,3 @@ func get_shader_code(uv):
|
|||||||
if src_code.has("rgb"):
|
if src_code.has("rgb"):
|
||||||
rv.rgb = src_code.rgb
|
rv.rgb = src_code.rgb
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
func _on_Rotate_text_changed(new_text):
|
|
||||||
angle = float(new_text)*3.1415928/180.0
|
|
||||||
get_parent().get_parent().generate_shader()
|
|
||||||
|
@ -38,7 +38,7 @@ slot/0/right_color = Color( 0.5, 0.5, 1, 1 )
|
|||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
_sections_unfolded = [ "Theme" ]
|
_sections_unfolded = [ "Theme" ]
|
||||||
|
|
||||||
[node name="rotate" type="LineEdit" parent="." index="0"]
|
[node name="GridContainer" type="GridContainer" parent="." index="0"]
|
||||||
|
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
@ -46,26 +46,111 @@ anchor_right = 0.0
|
|||||||
anchor_bottom = 0.0
|
anchor_bottom = 0.0
|
||||||
margin_left = 16.0
|
margin_left = 16.0
|
||||||
margin_top = 24.0
|
margin_top = 24.0
|
||||||
margin_right = 93.0
|
margin_right = 139.0
|
||||||
margin_bottom = 48.0
|
margin_bottom = 76.0
|
||||||
rect_pivot_offset = Vector2( 0, 0 )
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
rect_clip_content = false
|
rect_clip_content = false
|
||||||
focus_mode = 2
|
mouse_filter = 1
|
||||||
mouse_filter = 0
|
mouse_default_cursor_shape = 0
|
||||||
mouse_default_cursor_shape = 1
|
|
||||||
size_flags_horizontal = 1
|
size_flags_horizontal = 1
|
||||||
size_flags_vertical = 1
|
size_flags_vertical = 1
|
||||||
text = "0"
|
columns = 2
|
||||||
focus_mode = 2
|
|
||||||
context_menu_enabled = true
|
[node name="Label1" type="Label" parent="GridContainer" index="0"]
|
||||||
placeholder_alpha = 0.6
|
|
||||||
caret_blink = false
|
anchor_left = 0.0
|
||||||
caret_blink_speed = 0.65
|
anchor_top = 0.0
|
||||||
caret_position = 0
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_top = 5.0
|
||||||
|
margin_right = 45.0
|
||||||
|
margin_bottom = 19.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 2
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 4
|
||||||
|
text = "Rotate:"
|
||||||
|
percent_visible = 1.0
|
||||||
|
lines_skipped = 0
|
||||||
|
max_lines_visible = -1
|
||||||
|
|
||||||
|
[node name="rotate" type="SpinBox" parent="GridContainer" index="1"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_left = 49.0
|
||||||
|
margin_right = 123.0
|
||||||
|
margin_bottom = 24.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 0
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 1
|
||||||
|
min_value = 0.0
|
||||||
|
max_value = 360.0
|
||||||
|
step = 5.0
|
||||||
|
page = 0.0
|
||||||
|
value = 0.0
|
||||||
|
exp_edit = false
|
||||||
|
rounded = false
|
||||||
|
editable = true
|
||||||
|
prefix = ""
|
||||||
|
suffix = ""
|
||||||
|
_sections_unfolded = [ "Caret", "Placeholder" ]
|
||||||
|
|
||||||
|
[node name="Label2" type="Label" parent="GridContainer" index="2"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_top = 33.0
|
||||||
|
margin_right = 45.0
|
||||||
|
margin_bottom = 47.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 2
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 4
|
||||||
|
text = "Scale:"
|
||||||
|
percent_visible = 1.0
|
||||||
|
lines_skipped = 0
|
||||||
|
max_lines_visible = -1
|
||||||
|
|
||||||
|
[node name="scale" type="SpinBox" parent="GridContainer" index="3"]
|
||||||
|
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_left = 49.0
|
||||||
|
margin_top = 28.0
|
||||||
|
margin_right = 123.0
|
||||||
|
margin_bottom = 52.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 0
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 1
|
||||||
|
min_value = 0.05
|
||||||
|
max_value = 50.0
|
||||||
|
step = 0.05
|
||||||
|
page = 0.0
|
||||||
|
value = 1.0
|
||||||
|
exp_edit = false
|
||||||
|
rounded = false
|
||||||
|
editable = true
|
||||||
|
prefix = ""
|
||||||
|
suffix = ""
|
||||||
_sections_unfolded = [ "Caret", "Placeholder" ]
|
_sections_unfolded = [ "Caret", "Placeholder" ]
|
||||||
|
|
||||||
[connection signal="close_request" from="." to="." method="queue_free"]
|
[connection signal="close_request" from="." to="." method="queue_free"]
|
||||||
|
|
||||||
[connection signal="text_changed" from="rotate" to="." method="_on_Rotate_text_changed"]
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ var texture_preview_shader = null
|
|||||||
const MENU = [
|
const MENU = [
|
||||||
{ command="load_texture", description="Load texture" },
|
{ command="load_texture", description="Load texture" },
|
||||||
{ command="save_texture", description="Save texture" },
|
{ command="save_texture", description="Save texture" },
|
||||||
|
{ command="export_texture", description="Export texture" },
|
||||||
{ name="sine", description="Sine" },
|
{ name="sine", description="Sine" },
|
||||||
{ name="bricks", description="Bricks" },
|
{ name="bricks", description="Bricks" },
|
||||||
{ name="iqnoise", description="IQ Noise" },
|
{ name="iqnoise", description="IQ Noise" },
|
||||||
@ -22,16 +23,14 @@ const MENU = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
# Duplicate the materials we'll modify and store the shaders
|
# Duplicate the material we'll modify and store the shaders
|
||||||
$Container/ViewportContainer/Viewport/Cube.set_surface_material(0, $Container/ViewportContainer/Viewport/Cube.get_surface_material(0).duplicate(true))
|
material_preview_shader = $Container/ViewportContainer/MaterialPreview.material.shader
|
||||||
material_preview_shader = $Container/ViewportContainer/Viewport/Cube.get_surface_material(0).shader
|
|
||||||
$Container/ViewportContainer/SelectedPreview.material = $Container/ViewportContainer/SelectedPreview.material.duplicate(true)
|
$Container/ViewportContainer/SelectedPreview.material = $Container/ViewportContainer/SelectedPreview.material.duplicate(true)
|
||||||
texture_preview_shader = $Container/ViewportContainer/SelectedPreview.material.shader
|
texture_preview_shader = $Container/ViewportContainer/SelectedPreview.material.shader
|
||||||
$GraphEdit.add_valid_connection_type(0, 0)
|
$GraphEdit.add_valid_connection_type(0, 0)
|
||||||
$GraphEdit/PopupMenu.clear()
|
$GraphEdit/PopupMenu.clear()
|
||||||
for i in MENU.size():
|
for i in MENU.size():
|
||||||
$GraphEdit/PopupMenu.add_item(MENU[i].description, i)
|
$GraphEdit/PopupMenu.add_item(MENU[i].description, i)
|
||||||
$Container/ViewportContainer/Viewport/AnimationPlayer.play("rotate")
|
|
||||||
|
|
||||||
func _on_GraphEdit_popup_request(position):
|
func _on_GraphEdit_popup_request(position):
|
||||||
popup_position = position
|
popup_position = position
|
||||||
@ -108,6 +107,21 @@ func save_file(filename):
|
|||||||
file.store_string(to_json(data))
|
file.store_string(to_json(data))
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
|
func export_texture():
|
||||||
|
var size = 1024
|
||||||
|
$SaveViewport.size = Vector2(size, size)
|
||||||
|
$SaveViewport/ColorRect.rect_position = Vector2(0, 0)
|
||||||
|
$SaveViewport/ColorRect.rect_size = Vector2(size, size)
|
||||||
|
$SaveViewport/ColorRect.material.shader.set_code($GraphEdit.generate_shader(selected_node))
|
||||||
|
$SaveViewport.render_target_update_mode = Viewport.UPDATE_ONCE
|
||||||
|
#$SaveViewport/ColorRect.update()
|
||||||
|
$SaveViewport.update_worlds()
|
||||||
|
$SaveViewport/Timer.start()
|
||||||
|
yield($SaveViewport/Timer, "timeout")
|
||||||
|
var viewport_texture = $SaveViewport.get_texture()
|
||||||
|
var viewport_image = viewport_texture.get_data()
|
||||||
|
viewport_image.save_png("res://generated_image.png")
|
||||||
|
|
||||||
func generate_shader():
|
func generate_shader():
|
||||||
material_preview_shader.set_code($GraphEdit.generate_shader($GraphEdit/Material, 1))
|
material_preview_shader.set_code($GraphEdit.generate_shader($GraphEdit/Material, 1))
|
||||||
if selected_node != null:
|
if selected_node != null:
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
[gd_scene load_steps=15 format=2]
|
[gd_scene load_steps=17 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://addons/procedural_material/pm_editor.gd" type="Script" id=1]
|
[ext_resource path="res://addons/procedural_material/pm_editor.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://addons/procedural_material/graph_edit.gd" type="Script" id=2]
|
[ext_resource path="res://addons/procedural_material/graph_edit.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://addons/procedural_material/nodes/material.tscn" type="PackedScene" id=3]
|
[ext_resource path="res://addons/procedural_material/nodes/material.tscn" type="PackedScene" id=3]
|
||||||
|
[ext_resource path="res://addons/procedural_material/material_preview.gd" type="Script" id=4]
|
||||||
|
|
||||||
[sub_resource type="ProceduralSky" id=1]
|
[sub_resource type="ProceduralSky" id=1]
|
||||||
|
|
||||||
@ -116,27 +117,22 @@ subdivide_width = 0
|
|||||||
subdivide_height = 0
|
subdivide_height = 0
|
||||||
subdivide_depth = 0
|
subdivide_depth = 0
|
||||||
|
|
||||||
[sub_resource type="Shader" id=5]
|
[sub_resource type="CylinderMesh" id=5]
|
||||||
|
|
||||||
code = "shader_type spatial;
|
custom_aabb = AABB( 0, 0, 0, 0, 0, 0 )
|
||||||
|
top_radius = 1.0
|
||||||
|
bottom_radius = 1.0
|
||||||
|
height = 2.0
|
||||||
|
radial_segments = 64
|
||||||
|
rings = 4
|
||||||
|
|
||||||
void fragment() {
|
[sub_resource type="Animation" id=6]
|
||||||
ALBEDO = vec3(1.0);
|
|
||||||
}
|
|
||||||
"
|
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id=6]
|
|
||||||
|
|
||||||
render_priority = 0
|
|
||||||
shader = SubResource( 5 )
|
|
||||||
|
|
||||||
[sub_resource type="Animation" id=7]
|
|
||||||
|
|
||||||
length = 1.0
|
length = 1.0
|
||||||
loop = true
|
loop = true
|
||||||
step = 0.1
|
step = 0.1
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/path = NodePath("Cube:rotation_degrees")
|
tracks/0/path = NodePath("Objects:rotation_degrees")
|
||||||
tracks/0/interp = 1
|
tracks/0/interp = 1
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
tracks/0/imported = false
|
tracks/0/imported = false
|
||||||
@ -148,7 +144,7 @@ tracks/0/keys = {
|
|||||||
"values": [ Vector3( 0, 0, 0 ), Vector3( 0, 360, 0 ) ]
|
"values": [ Vector3( 0, 0, 0 ), Vector3( 0, 360, 0 ) ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="ProceduralSky" id=8]
|
[sub_resource type="ProceduralSky" id=7]
|
||||||
|
|
||||||
radiance_size = 4
|
radiance_size = 4
|
||||||
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
|
sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
|
||||||
@ -169,10 +165,10 @@ sun_energy = 16.0
|
|||||||
texture_size = 2
|
texture_size = 2
|
||||||
_sections_unfolded = [ "Sky" ]
|
_sections_unfolded = [ "Sky" ]
|
||||||
|
|
||||||
[sub_resource type="Environment" id=9]
|
[sub_resource type="Environment" id=8]
|
||||||
|
|
||||||
background_mode = 2
|
background_mode = 2
|
||||||
background_sky = SubResource( 8 )
|
background_sky = SubResource( 7 )
|
||||||
background_sky_custom_fov = 0.0
|
background_sky_custom_fov = 0.0
|
||||||
background_color = Color( 0, 0, 0, 1 )
|
background_color = Color( 0, 0, 0, 1 )
|
||||||
background_energy = 1.0
|
background_energy = 1.0
|
||||||
@ -249,7 +245,7 @@ adjustment_contrast = 1.0
|
|||||||
adjustment_saturation = 1.0
|
adjustment_saturation = 1.0
|
||||||
_sections_unfolded = [ "Background" ]
|
_sections_unfolded = [ "Background" ]
|
||||||
|
|
||||||
[sub_resource type="Shader" id=10]
|
[sub_resource type="Shader" id=9]
|
||||||
|
|
||||||
code = "shader_type canvas_item;
|
code = "shader_type canvas_item;
|
||||||
|
|
||||||
@ -259,10 +255,146 @@ void fragment() {
|
|||||||
"
|
"
|
||||||
_sections_unfolded = [ "Resource" ]
|
_sections_unfolded = [ "Resource" ]
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id=11]
|
[sub_resource type="ShaderMaterial" id=10]
|
||||||
|
|
||||||
render_priority = 0
|
render_priority = 0
|
||||||
shader = SubResource( 10 )
|
shader = SubResource( 9 )
|
||||||
|
|
||||||
|
[sub_resource type="Shader" id=11]
|
||||||
|
|
||||||
|
code = "shader_type canvas_item;
|
||||||
|
|
||||||
|
float hash1(vec2 p) {
|
||||||
|
float q = dot(p,vec2(127.1,311.7));
|
||||||
|
return fract(sin(q)*43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 hash2(vec2 p) {
|
||||||
|
vec2 q = vec2( dot(p,vec2(127.1,311.7)),
|
||||||
|
dot(p,vec2(269.5,183.3)) );
|
||||||
|
return fract(sin(q)*43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 hash3(vec2 p) {
|
||||||
|
vec3 q = vec3( dot(p,vec2(127.1,311.7)),
|
||||||
|
dot(p,vec2(269.5,183.3)),
|
||||||
|
dot(p,vec2(419.2,371.9)) );
|
||||||
|
return fract(sin(q)*43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sine(vec2 uv, float count, float sharpness) {
|
||||||
|
return max(0.0, min(1.0, (0.5+sharpness*0.5*sin(count*3.1415928*2.0*uv.x))));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 transform(vec2 uv, float rotate, float scale) {
|
||||||
|
vec2 rv;
|
||||||
|
uv -= vec2(0.5);
|
||||||
|
rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;
|
||||||
|
rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;
|
||||||
|
rv /= scale;
|
||||||
|
rv += vec2(0.5);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
float bricks(vec2 uv, vec2 count, float offset, float mortar, float bevel) {
|
||||||
|
mortar /= max(count.x, count.y);
|
||||||
|
bevel /= max(count.x, count.y);
|
||||||
|
float fract_x = fract(uv.x*count.x+offset*step(0.5, fract(uv.y*count.y*0.5)));
|
||||||
|
float slope_x = 1.0/(bevel*count.x);
|
||||||
|
float off = 0.5*mortar/bevel;
|
||||||
|
float f1 = fract_x*slope_x-off;
|
||||||
|
float f2 = (1.0-fract_x)*slope_x-off;
|
||||||
|
float fract_y = fract(uv.y*count.y);
|
||||||
|
float slope_y = 1.0/(bevel*count.y);
|
||||||
|
float f3 = fract_y*slope_y-off;
|
||||||
|
float f4 = (1.0-fract_y)*slope_y-off;
|
||||||
|
return max(0.0, min(1.0, min(min(f1, f2), min(f3, f4))));
|
||||||
|
}
|
||||||
|
|
||||||
|
float colored_bricks(vec2 uv, vec2 count, float offset) {
|
||||||
|
float x = floor(uv.x*count.x+offset*step(0.5, fract(uv.y*count.y*0.5)));
|
||||||
|
float y = floor(uv.y*count.y);
|
||||||
|
return fract(x/3.0+y/7.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float iqnoise(vec2 uv, float s, float u, float v) {
|
||||||
|
uv *= s;
|
||||||
|
vec2 p = floor(uv);
|
||||||
|
vec2 f = fract(uv);
|
||||||
|
|
||||||
|
float k = 1.0+63.0*pow(1.0-v,4.0);
|
||||||
|
|
||||||
|
float va = 0.0;
|
||||||
|
float wt = 0.0;
|
||||||
|
for( int j=-2; j<=2; j++ )
|
||||||
|
for( int i=-2; i<=2; i++ )
|
||||||
|
{
|
||||||
|
vec2 g = vec2( float(i),float(j) );
|
||||||
|
vec3 o = hash3( p + g )*vec3(u,u,1.0);
|
||||||
|
vec2 r = g - f + o.xy;
|
||||||
|
float d = dot(r,r);
|
||||||
|
float ww = pow( 1.0-smoothstep(0.0,1.414,sqrt(d)), k );
|
||||||
|
va += o.z*ww;
|
||||||
|
wt += ww;
|
||||||
|
}
|
||||||
|
|
||||||
|
return va/wt;
|
||||||
|
}
|
||||||
|
|
||||||
|
float perlin_old(vec2 uv, vec2 scale, int iterations, float turbulence) {
|
||||||
|
float f = 0.0;
|
||||||
|
float c = 1.0;
|
||||||
|
float m = 0.0;
|
||||||
|
for(int i = 0; i < iterations; i++) {
|
||||||
|
vec2 uv2 = scale * mod(uv, vec2(1.0, 1.0));
|
||||||
|
vec2 uv2_floor = floor(uv2);
|
||||||
|
vec2 uv2_fract = fract(uv2);
|
||||||
|
f += c * ( (1.0 - uv2_fract.x) * ((1.0 - uv2_fract.y) * hash1(uv2_floor) + uv2_fract.y * hash1(uv2_floor+vec2(0.0, 1.0)))
|
||||||
|
+ uv2_fract.x * ((1.0 - uv2_fract.y) * hash1(uv2_floor+vec2(1.0, 0.0)) + uv2_fract.y * hash1(uv2_floor+vec2(1.0, 1.0))));
|
||||||
|
m += c;
|
||||||
|
scale *= 2.0;
|
||||||
|
c *= turbulence;
|
||||||
|
}
|
||||||
|
return f/m;
|
||||||
|
}
|
||||||
|
|
||||||
|
float noise(vec2 p, vec2 freq ){
|
||||||
|
vec2 unit = vec2(1.0)/freq;
|
||||||
|
vec2 ij = floor(p/unit);
|
||||||
|
vec2 xy = mod(p,unit)/unit;
|
||||||
|
float a = hash1((ij+vec2(0.0,0.0)));
|
||||||
|
float b = hash1((ij+vec2(1.0,0.0)));
|
||||||
|
float c = hash1((ij+vec2(0.0,1.0)));
|
||||||
|
float d = hash1((ij+vec2(1.0,1.0)));
|
||||||
|
return mix(mix(a, b, xy.x), mix(c, d, xy.x), xy.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float perlin(vec2 p, vec2 scale, int iterations, float persistance) {
|
||||||
|
float n = 0.0;
|
||||||
|
float normK = 0.0;
|
||||||
|
vec2 f = scale;
|
||||||
|
float amp = 1.0;
|
||||||
|
for (int i = 0; i<iterations; i++){
|
||||||
|
n += amp*noise(p, f);
|
||||||
|
f*=2.0;
|
||||||
|
normK += amp;
|
||||||
|
amp*=persistance;
|
||||||
|
}
|
||||||
|
return n/normK;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Perlin_f(vec2 uv) { return perlin(uv, vec2(8, 9), 7, 1); }
|
||||||
|
void fragment() {
|
||||||
|
float Perlin_0_f = Perlin_f(UV);
|
||||||
|
vec3 Colorize_0_rgb = mix(vec3(0,0,0), vec3(1,1,1), Perlin_0_f);
|
||||||
|
COLOR = vec4(Colorize_0_rgb, 1.0);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
|
||||||
|
[sub_resource type="ShaderMaterial" id=12]
|
||||||
|
|
||||||
|
render_priority = 0
|
||||||
|
shader = SubResource( 11 )
|
||||||
|
|
||||||
[node name="ProceduralMaterialEditor" type="MarginContainer" index="0"]
|
[node name="ProceduralMaterialEditor" type="MarginContainer" index="0"]
|
||||||
|
|
||||||
@ -282,6 +414,7 @@ _sections_unfolded = [ "custom_constants" ]
|
|||||||
|
|
||||||
[node name="GraphEdit" type="GraphEdit" parent="." index="0"]
|
[node name="GraphEdit" type="GraphEdit" parent="." index="0"]
|
||||||
|
|
||||||
|
editor/display_folded = true
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
@ -356,6 +489,7 @@ _sections_unfolded = [ "Material", "Mouse", "Rect" ]
|
|||||||
|
|
||||||
[node name="Container" type="Container" parent="." index="2"]
|
[node name="Container" type="Container" parent="." index="2"]
|
||||||
|
|
||||||
|
editor/display_folded = true
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
@ -389,7 +523,7 @@ stretch = false
|
|||||||
stretch_shrink = 1
|
stretch_shrink = 1
|
||||||
_sections_unfolded = [ "Anchor", "Grow Direction", "Margin", "Mouse", "Rect" ]
|
_sections_unfolded = [ "Anchor", "Grow Direction", "Margin", "Mouse", "Rect" ]
|
||||||
|
|
||||||
[node name="Viewport" type="Viewport" parent="Container/ViewportContainer" index="0"]
|
[node name="MaterialPreview" type="Viewport" parent="Container/ViewportContainer" index="0"]
|
||||||
|
|
||||||
arvr = false
|
arvr = false
|
||||||
size = Vector2( 288, 294 )
|
size = Vector2( 288, 294 )
|
||||||
@ -414,11 +548,16 @@ shadow_atlas_quad_0 = 2
|
|||||||
shadow_atlas_quad_1 = 2
|
shadow_atlas_quad_1 = 2
|
||||||
shadow_atlas_quad_2 = 3
|
shadow_atlas_quad_2 = 3
|
||||||
shadow_atlas_quad_3 = 4
|
shadow_atlas_quad_3 = 4
|
||||||
|
script = ExtResource( 4 )
|
||||||
_sections_unfolded = [ "GUI", "Render Target", "Rendering" ]
|
_sections_unfolded = [ "GUI", "Render Target", "Rendering" ]
|
||||||
|
|
||||||
[node name="Cube" type="MeshInstance" parent="Container/ViewportContainer/Viewport" index="0"]
|
[node name="Objects" type="Spatial" parent="Container/ViewportContainer/MaterialPreview" index="0"]
|
||||||
|
|
||||||
|
transform = Transform( -0.989989, 0, 0.141142, 0, 1, 0, -0.141142, 0, -0.989989, 0, 0, 0 )
|
||||||
|
_sections_unfolded = [ "Transform" ]
|
||||||
|
|
||||||
|
[node name="Cube" type="MeshInstance" parent="Container/ViewportContainer/MaterialPreview/Objects" index="0"]
|
||||||
|
|
||||||
transform = Transform( -0.196855, 0, 0.980433, 0, 1, 0, -0.980433, 0, -0.196855, 0, 0, 0 )
|
|
||||||
layers = 1
|
layers = 1
|
||||||
material_override = null
|
material_override = null
|
||||||
cast_shadow = 1
|
cast_shadow = 1
|
||||||
@ -430,21 +569,38 @@ lod_max_distance = 0.0
|
|||||||
lod_max_hysteresis = 0.0
|
lod_max_hysteresis = 0.0
|
||||||
mesh = SubResource( 4 )
|
mesh = SubResource( 4 )
|
||||||
skeleton = NodePath("..")
|
skeleton = NodePath("..")
|
||||||
material/0 = SubResource( 6 )
|
material/0 = null
|
||||||
_sections_unfolded = [ "Geometry", "Transform", "material" ]
|
_sections_unfolded = [ "Geometry", "Transform", "material" ]
|
||||||
|
|
||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="Container/ViewportContainer/Viewport" index="1"]
|
[node name="Cylinder" type="MeshInstance" parent="Container/ViewportContainer/MaterialPreview/Objects" index="1"]
|
||||||
|
|
||||||
|
visible = false
|
||||||
|
layers = 1
|
||||||
|
material_override = null
|
||||||
|
cast_shadow = 1
|
||||||
|
extra_cull_margin = 0.0
|
||||||
|
use_in_baked_light = false
|
||||||
|
lod_min_distance = 0.0
|
||||||
|
lod_min_hysteresis = 0.0
|
||||||
|
lod_max_distance = 0.0
|
||||||
|
lod_max_hysteresis = 0.0
|
||||||
|
mesh = SubResource( 5 )
|
||||||
|
skeleton = NodePath("..")
|
||||||
|
material/0 = null
|
||||||
|
_sections_unfolded = [ "Geometry", "Transform", "material" ]
|
||||||
|
|
||||||
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="Container/ViewportContainer/MaterialPreview" index="1"]
|
||||||
|
|
||||||
root_node = NodePath("..")
|
root_node = NodePath("..")
|
||||||
autoplay = "rotate"
|
autoplay = "rotate"
|
||||||
playback_process_mode = 1
|
playback_process_mode = 1
|
||||||
playback_default_blend_time = 0.0
|
playback_default_blend_time = 0.0
|
||||||
playback_speed = 0.1
|
playback_speed = 0.1
|
||||||
anims/rotate = SubResource( 7 )
|
anims/rotate = SubResource( 6 )
|
||||||
blend_times = [ ]
|
blend_times = [ ]
|
||||||
_sections_unfolded = [ "Playback Options" ]
|
_sections_unfolded = [ "Playback Options" ]
|
||||||
|
|
||||||
[node name="OmniLight" type="OmniLight" parent="Container/ViewportContainer/Viewport" index="2"]
|
[node name="OmniLight" type="OmniLight" parent="Container/ViewportContainer/MaterialPreview" index="2"]
|
||||||
|
|
||||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.04729, 1.80471, -2.51024 )
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.04729, 1.80471, -2.51024 )
|
||||||
layers = 1
|
layers = 1
|
||||||
@ -467,12 +623,12 @@ omni_shadow_mode = 1
|
|||||||
omni_shadow_detail = 1
|
omni_shadow_detail = 1
|
||||||
_sections_unfolded = [ "Shadow" ]
|
_sections_unfolded = [ "Shadow" ]
|
||||||
|
|
||||||
[node name="Camera" type="Camera" parent="Container/ViewportContainer/Viewport" index="3"]
|
[node name="Camera" type="Camera" parent="Container/ViewportContainer/MaterialPreview" index="3"]
|
||||||
|
|
||||||
transform = Transform( 1, 0, 0, 0, 0.766044, 0.642787, 0, -0.642787, 0.766044, 0, 1.83022, 2.2549 )
|
transform = Transform( 1, 0, 0, 0, 0.766044, 0.642787, 0, -0.642787, 0.766044, 0, 1.83022, 2.2549 )
|
||||||
keep_aspect = 1
|
keep_aspect = 1
|
||||||
cull_mask = 1048575
|
cull_mask = 1048575
|
||||||
environment = SubResource( 9 )
|
environment = SubResource( 8 )
|
||||||
h_offset = 0.0
|
h_offset = 0.0
|
||||||
v_offset = 0.0
|
v_offset = 0.0
|
||||||
doppler_tracking = 0
|
doppler_tracking = 0
|
||||||
@ -486,7 +642,7 @@ _sections_unfolded = [ "Transform" ]
|
|||||||
|
|
||||||
[node name="SelectedPreview" type="ColorRect" parent="Container/ViewportContainer" index="1"]
|
[node name="SelectedPreview" type="ColorRect" parent="Container/ViewportContainer" index="1"]
|
||||||
|
|
||||||
material = SubResource( 11 )
|
material = SubResource( 10 )
|
||||||
anchor_left = 0.0
|
anchor_left = 0.0
|
||||||
anchor_top = 0.0
|
anchor_top = 0.0
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
@ -505,6 +661,58 @@ size_flags_vertical = 0
|
|||||||
color = Color( 1, 1, 1, 1 )
|
color = Color( 1, 1, 1, 1 )
|
||||||
_sections_unfolded = [ "Material", "Mouse", "Rect" ]
|
_sections_unfolded = [ "Material", "Mouse", "Rect" ]
|
||||||
|
|
||||||
|
[node name="SaveViewport" type="Viewport" parent="." index="3"]
|
||||||
|
|
||||||
|
arvr = false
|
||||||
|
size = Vector2( 0, 0 )
|
||||||
|
own_world = true
|
||||||
|
world = null
|
||||||
|
transparent_bg = false
|
||||||
|
msaa = 0
|
||||||
|
hdr = true
|
||||||
|
disable_3d = false
|
||||||
|
usage = 2
|
||||||
|
debug_draw = 0
|
||||||
|
render_target_v_flip = false
|
||||||
|
render_target_clear_mode = 0
|
||||||
|
render_target_update_mode = 1
|
||||||
|
audio_listener_enable_2d = false
|
||||||
|
audio_listener_enable_3d = false
|
||||||
|
physics_object_picking = false
|
||||||
|
gui_disable_input = true
|
||||||
|
gui_snap_controls_to_pixels = true
|
||||||
|
shadow_atlas_size = 0
|
||||||
|
shadow_atlas_quad_0 = 2
|
||||||
|
shadow_atlas_quad_1 = 2
|
||||||
|
shadow_atlas_quad_2 = 3
|
||||||
|
shadow_atlas_quad_3 = 4
|
||||||
|
_sections_unfolded = [ "GUI", "Render Target" ]
|
||||||
|
|
||||||
|
[node name="ColorRect" type="ColorRect" parent="SaveViewport" index="0"]
|
||||||
|
|
||||||
|
material = SubResource( 12 )
|
||||||
|
anchor_left = 0.0
|
||||||
|
anchor_top = 0.0
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_right = 40.0
|
||||||
|
margin_bottom = 40.0
|
||||||
|
rect_pivot_offset = Vector2( 0, 0 )
|
||||||
|
rect_clip_content = false
|
||||||
|
mouse_filter = 0
|
||||||
|
mouse_default_cursor_shape = 0
|
||||||
|
size_flags_horizontal = 1
|
||||||
|
size_flags_vertical = 1
|
||||||
|
color = Color( 1, 1, 1, 1 )
|
||||||
|
_sections_unfolded = [ "Material" ]
|
||||||
|
|
||||||
|
[node name="Timer" type="Timer" parent="SaveViewport" index="1"]
|
||||||
|
|
||||||
|
process_mode = 1
|
||||||
|
wait_time = 0.0962963
|
||||||
|
one_shot = true
|
||||||
|
autostart = false
|
||||||
|
|
||||||
[connection signal="connection_request" from="GraphEdit" to="." method="_on_GraphEdit_connection_request"]
|
[connection signal="connection_request" from="GraphEdit" to="." method="_on_GraphEdit_connection_request"]
|
||||||
|
|
||||||
[connection signal="node_selected" from="GraphEdit" to="." method="_on_GraphEdit_node_selected"]
|
[connection signal="node_selected" from="GraphEdit" to="." method="_on_GraphEdit_node_selected"]
|
||||||
|
@ -20,10 +20,13 @@ float sine(vec2 uv, float count, float sharpness) {
|
|||||||
return max(0.0, min(1.0, (0.5+sharpness*0.5*sin(count*3.1415928*2.0*uv.x))));
|
return max(0.0, min(1.0, (0.5+sharpness*0.5*sin(count*3.1415928*2.0*uv.x))));
|
||||||
}
|
}
|
||||||
|
|
||||||
vec2 rotate(vec2 uv, float angle) {
|
vec2 transform(vec2 uv, float rotate, float scale) {
|
||||||
vec2 rv;
|
vec2 rv;
|
||||||
rv.x = cos(angle)*uv.x + sin(angle)*uv.y;
|
uv -= vec2(0.5);
|
||||||
rv.y = -sin(angle)*uv.x + cos(angle)*uv.y;
|
rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;
|
||||||
|
rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;
|
||||||
|
rv /= scale;
|
||||||
|
rv += vec2(0.5);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,20 +75,44 @@ float iqnoise(vec2 uv, float s, float u, float v) {
|
|||||||
return va/wt;
|
return va/wt;
|
||||||
}
|
}
|
||||||
|
|
||||||
float perlin(vec2 uv, int iterations, float turbulence) {
|
float perlin_old(vec2 uv, vec2 scale, int iterations, float turbulence) {
|
||||||
float f = 0.0;
|
float f = 0.0;
|
||||||
float c = 1.0;
|
float c = 1.0;
|
||||||
float s = 2.0;
|
|
||||||
float m = 0.0;
|
float m = 0.0;
|
||||||
for(int i = 0; i < iterations; i++) {
|
for(int i = 0; i < iterations; i++) {
|
||||||
vec2 uv2 = float(s) * uv;
|
vec2 uv2 = scale * mod(uv, vec2(1.0, 1.0));
|
||||||
vec2 uv2_floor = floor(uv2);
|
vec2 uv2_floor = floor(uv2);
|
||||||
vec2 uv2_fract = fract(uv2);
|
vec2 uv2_fract = fract(uv2);
|
||||||
f += c * ( (1.0 - uv2_fract.x) * ((1.0 - uv2_fract.y) * hash1(uv2_floor) + uv2_fract.y * hash1(uv2_floor+vec2(0.0, 1.0)))
|
f += c * ( (1.0 - uv2_fract.x) * ((1.0 - uv2_fract.y) * hash1(uv2_floor) + uv2_fract.y * hash1(uv2_floor+vec2(0.0, 1.0)))
|
||||||
+ uv2_fract.x * ((1.0 - uv2_fract.y) * hash1(uv2_floor+vec2(1.0, 0.0)) + uv2_fract.y * hash1(uv2_floor+vec2(1.0, 1.0))));
|
+ uv2_fract.x * ((1.0 - uv2_fract.y) * hash1(uv2_floor+vec2(1.0, 0.0)) + uv2_fract.y * hash1(uv2_floor+vec2(1.0, 1.0))));
|
||||||
m += c;
|
m += c;
|
||||||
s *= 2.0;
|
scale *= 2.0;
|
||||||
c *= turbulence;
|
c *= turbulence;
|
||||||
}
|
}
|
||||||
return f/m;
|
return f/m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float noise(vec2 p, vec2 freq ){
|
||||||
|
vec2 unit = vec2(1.0)/freq;
|
||||||
|
vec2 ij = floor(p/unit);
|
||||||
|
vec2 xy = mod(p,unit)/unit;
|
||||||
|
float a = hash1((ij+vec2(0.0,0.0)));
|
||||||
|
float b = hash1((ij+vec2(1.0,0.0)));
|
||||||
|
float c = hash1((ij+vec2(0.0,1.0)));
|
||||||
|
float d = hash1((ij+vec2(1.0,1.0)));
|
||||||
|
return mix(mix(a, b, xy.x), mix(c, d, xy.x), xy.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float perlin(vec2 p, vec2 scale, int iterations, float persistance) {
|
||||||
|
float n = 0.0;
|
||||||
|
float normK = 0.0;
|
||||||
|
vec2 f = scale;
|
||||||
|
float amp = 1.0;
|
||||||
|
for (int i = 0; i<iterations; i++){
|
||||||
|
n += amp*noise(p, f);
|
||||||
|
f*=2.0;
|
||||||
|
normK += amp;
|
||||||
|
amp*=persistance;
|
||||||
|
}
|
||||||
|
return n/normK;
|
||||||
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
{"connections":[{"from":"Perlin","from_port":0,"to":"Colorize2","to_port":0},{"from":"Perlin","from_port":0,"to":"Colorize","to_port":0},{"from":"Warp","from_port":0,"to":"Blend","to_port":2},{"from":"Colorize","from_port":0,"to":"Blend","to_port":0},{"from":"Colorize2","from_port":0,"to":"Blend","to_port":1},{"from":"Perlin2","from_port":0,"to":"Warp","to_port":1},{"from":"Blend","from_port":0,"to":"Material","to_port":0},{"from":"Warp","from_port":0,"to":"NormalMap","to_port":0},{"from":"Bricks","from_port":0,"to":"Warp","to_port":0},{"from":"NormalMap","from_port":0,"to":"Material","to_port":1}],"nodes":[{"iterations":9,"name":"Perlin","node_position":{"x":-142,"y":-401},"turbulence":0.8,"type":"perlin"},{"color0":{"a":1,"b":0,"g":0,"r":1,"type":"Color"},"color1":{"a":1,"b":0.061523,"g":0.461907,"r":0.875,"type":"Color"},"name":"Colorize2","node_position":{"x":120.75943,"y":-319},"type":"colorize"},{"color0":{"a":1,"b":0,"g":0,"r":0,"type":"Color"},"color1":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"name":"Colorize","node_position":{"x":116.759399,"y":-431},"type":"colorize"},{"iterations":6,"name":"Perlin2","node_position":{"x":-141.24057,"y":-86.125458},"turbulence":0.5,"type":"perlin"},{"amount":0.5,"name":"Warp","node_position":{"x":124,"y":-199},"type":"warp"},{"bevel":0.1,"columns":6,"mortar":0.1,"name":"Bricks","node_position":{"x":-147.327362,"y":-292.797089},"row_offset":0.5,"rows":12,"type":"bricks"},{"name":"Material","node_position":{"x":528,"y":-285},"type":"material"},{"amount":0.5,"name":"Blend","node_position":{"x":326.759399,"y":-306},"type":"blend"},{"amount":0.5,"name":"NormalMap","node_position":{"x":310.416809,"y":-124.375488},"type":"normal_map"}]}
|
{"connections":[{"from":"Perlin","from_port":0,"to":"Colorize2","to_port":0},{"from":"Perlin","from_port":0,"to":"Colorize","to_port":0},{"from":"Warp","from_port":0,"to":"Blend","to_port":2},{"from":"Colorize","from_port":0,"to":"Blend","to_port":0},{"from":"Colorize2","from_port":0,"to":"Blend","to_port":1},{"from":"Perlin2","from_port":0,"to":"Warp","to_port":1},{"from":"Blend","from_port":0,"to":"Material","to_port":0},{"from":"Warp","from_port":0,"to":"NormalMap","to_port":0},{"from":"Bricks","from_port":0,"to":"Warp","to_port":0},{"from":"NormalMap","from_port":0,"to":"Material","to_port":1}],"nodes":[{"color0":{"a":1,"b":0,"g":0,"r":1,"type":"Color"},"color1":{"a":1,"b":0.061523,"g":0.461907,"r":0.875,"type":"Color"},"name":"Colorize2","node_position":{"x":120.75943,"y":-319},"type":"colorize"},{"color0":{"a":1,"b":0,"g":0,"r":0,"type":"Color"},"color1":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"name":"Colorize","node_position":{"x":116.759399,"y":-431},"type":"colorize"},{"amount":0.2,"name":"Warp","node_position":{"x":124,"y":-199},"type":"warp"},{"amount":0.5,"name":"NormalMap","node_position":{"x":310.416809,"y":-124.375488},"type":"normal_map"},{"name":"Material","node_position":{"x":528,"y":-285},"type":"material"},{"iterations":7,"name":"Perlin","node_position":{"x":-149,"y":-455},"persistance":1,"scale_x":8,"scale_y":9,"type":"perlin"},{"iterations":6,"name":"Perlin2","node_position":{"x":-141.24057,"y":-86.125458},"persistance":0.4,"scale_x":4,"scale_y":4,"type":"perlin"},{"bevel":0.1,"columns":3,"mortar":0.1,"name":"Bricks","node_position":{"x":-147.327362,"y":-292.797089},"row_offset":0.5,"rows":6,"type":"bricks"},{"amount":0.5,"name":"Blend","node_position":{"x":326.759399,"y":-306},"type":"blend"}]}
|
BIN
generated_image.png
Normal file
BIN
generated_image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 862 KiB |
29
generated_image.png.import
Normal file
29
generated_image.png.import
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/generated_image.png-791fdae0ab5829f929b4d82eecbe4bc3.stex"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://generated_image.png"
|
||||||
|
dest_files=[ "res://.import/generated_image.png-791fdae0ab5829f929b4d82eecbe4bc3.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=true
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
Loading…
Reference in New Issue
Block a user