diff --git a/addons/material_maker/engine/gen_base.gd b/addons/material_maker/engine/gen_base.gd index 9d73321..a327543 100644 --- a/addons/material_maker/engine/gen_base.gd +++ b/addons/material_maker/engine/gen_base.gd @@ -42,6 +42,8 @@ func init_parameters(): if !parameters.has(p.name): if p.has("default"): parameters[p.name] = MMType.deserialize_value(p.default) + if p.type == "size": + parameters[p.name] -= p.first else: print("No default value for parameter "+p.name) diff --git a/addons/material_maker/engine/gen_material.gd b/addons/material_maker/engine/gen_material.gd index 63c76d0..0690255 100644 --- a/addons/material_maker/engine/gen_material.gd +++ b/addons/material_maker/engine/gen_material.gd @@ -35,7 +35,8 @@ func get_parameter_defs(): { name="emission_energy", label="Emission", type="float", min=0.0, max=8.0, step=0.05, default=1.0 }, { name="normal_scale", label="Normal", type="float", min=0.0, max=8.0, step=0.05, default=1.0 }, { name="ao_light_affect", label="Ambient occlusion", type="float", min=0.0, max=1.0, step=0.05, default=1.0 }, - { name="depth_scale", label="Depth", type="float", min=0.0, max=1.0, step=0.05, default=1.0 } + { name="depth_scale", label="Depth", type="float", min=0.0, max=1.0, step=0.05, default=1.0 }, + { name="size", label="Size", type="size", first=7, last=11, default=9 } ] func get_input_defs(): @@ -49,6 +50,14 @@ func get_input_defs(): { name="depth_texture", label="", type="f" } ] +func get_image_size(): + var rv : int + if parameters.has("size"): + rv = int(pow(2, parameters.size+7)) + else: + rv = 512 + return rv + func update_preview(): var graph_edit = self while graph_edit is MMGenBase: @@ -69,7 +78,7 @@ func render_textures(renderer : MMGenRenderer): if t.has("port"): var source = get_source(t.port) if source != null: - var result = source.generator.render(source.output_index, renderer, 1024) + var result = source.generator.render(source.output_index, renderer, get_image_size()) while result is GDScriptFunctionState: result = yield(result, "completed") texture = ImageTexture.new() @@ -91,7 +100,7 @@ func render_textures(renderer : MMGenRenderer): else: code.push_back({ defs="", code="", f=t.default_values[i] }) var shader : String = renderer.generate_combined_shader(code[0], code[1], code[2]) - var result = renderer.render_shader(shader, shader_textures, 1024) + var result = renderer.render_shader(shader, shader_textures, get_image_size()) while result is GDScriptFunctionState: result = yield(result, "completed") texture = ImageTexture.new() diff --git a/addons/material_maker/engine/renderer.gd b/addons/material_maker/engine/renderer.gd index 7d2439c..1d16c2a 100644 --- a/addons/material_maker/engine/renderer.gd +++ b/addons/material_maker/engine/renderer.gd @@ -96,9 +96,10 @@ func render_shader(shader, textures, render_size): func copy_to_texture(t : ImageTexture): var image : Image = get_texture().get_data() - image.lock() - t.create_from_image(get_texture().get_data()) - image.unlock() + if image != null: + image.lock() + t.create_from_image(get_texture().get_data()) + image.unlock() func save_to_file(fn : String): var image : Image = get_texture().get_data() diff --git a/addons/material_maker/main_window.tscn b/addons/material_maker/main_window.tscn index 237882e..7969dca 100644 --- a/addons/material_maker/main_window.tscn +++ b/addons/material_maker/main_window.tscn @@ -1,11 +1,20 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=10 format=2] [ext_resource path="res://addons/material_maker/main_window.gd" type="Script" id=1] [ext_resource path="res://addons/material_maker/library.tscn" type="PackedScene" id=2] [ext_resource path="res://addons/material_maker/preview.tscn" type="PackedScene" id=3] -[ext_resource path="res://addons/material_maker/widgets/tabs.gd" type="Script" id=4] -[ext_resource path="res://addons/material_maker/engine/renderer.tscn" type="PackedScene" id=5] -[ext_resource path="res://addons/material_maker/node_factory.gd" type="Script" id=6] +[ext_resource path="res://addons/material_maker/panoramas/epping_forest_01.hdr" type="Texture" id=4] +[ext_resource path="res://addons/material_maker/widgets/tabs.gd" type="Script" id=5] +[ext_resource path="res://addons/material_maker/engine/renderer.tscn" type="PackedScene" id=6] +[ext_resource path="res://addons/material_maker/node_factory.gd" type="Script" id=7] + +[sub_resource type="PanoramaSky" id=6] +resource_local_to_scene = true +panorama = ExtResource( 4 ) + +[sub_resource type="Environment" id=7] +background_mode = 2 +background_sky = SubResource( 6 ) [node name="MainWindow" type="Panel"] anchor_right = 1.0 @@ -98,6 +107,7 @@ render_target_update_mode = 0 [node name="Camera" type="Camera" parent="VBoxContainer/HBoxContainer/ProjectsPane/BackgroundPreview/Viewport"] transform = Transform( 1, 0, 0, 0, 0.766044, 0.642788, 0, -0.642788, 0.766044, 0, 2.24976, 2.68115 ) +environment = SubResource( 7 ) current = true [node name="Projects" type="Panel" parent="VBoxContainer/HBoxContainer/ProjectsPane"] @@ -106,7 +116,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 size_flags_horizontal = 3 size_flags_vertical = 3 -script = ExtResource( 4 ) +script = ExtResource( 5 ) [node name="Tabs" type="Tabs" parent="VBoxContainer/HBoxContainer/ProjectsPane/Projects"] margin_right = 954.0 @@ -114,12 +124,12 @@ margin_bottom = 24.0 tab_align = 0 tab_close_display_policy = 1 -[node name="Renderer" parent="." instance=ExtResource( 5 )] -size = Vector2( 1024, 1024 ) +[node name="Renderer" parent="." instance=ExtResource( 6 )] +size = Vector2( 512, 512 ) debug_path = null [node name="NodeFactory" type="Node" parent="."] -script = ExtResource( 6 ) +script = ExtResource( 7 ) [connection signal="need_update" from="VBoxContainer/HBoxContainer/VBoxContainer/Preview" to="." method="update_preview_3d"] [connection signal="show_background_preview" from="VBoxContainer/HBoxContainer/VBoxContainer/Preview" to="." method="_on_Preview_show_background_preview"] [connection signal="no_more_tabs" from="VBoxContainer/HBoxContainer/ProjectsPane/Projects" to="." method="new_material"] diff --git a/addons/material_maker/nodes/image.tscn b/addons/material_maker/nodes/image.tscn index ceea37f..503c7bc 100644 --- a/addons/material_maker/nodes/image.tscn +++ b/addons/material_maker/nodes/image.tscn @@ -20,7 +20,7 @@ slot/0/left_type = 0 slot/0/left_color = Color( 0.5, 0.5, 1, 1 ) slot/0/right_enabled = true slot/0/right_type = 0 -slot/0/right_color = Color( 0, 1, 0, 0.501961 ) +slot/0/right_color = Color( 0.5, 0.5, 1, 1 ) script = ExtResource( 1 ) [node name="TextureButton" type="TextureButton" parent="."] diff --git a/addons/material_maker/preview.gd b/addons/material_maker/preview.gd index 5aa34e5..7725ad3 100644 --- a/addons/material_maker/preview.gd +++ b/addons/material_maker/preview.gd @@ -13,6 +13,9 @@ onready var current_object = objects.get_child(0) onready var environments = $MaterialPreview/Preview3d/Environments onready var current_environment = environments.get_child(0) +onready var camera_stand = $MaterialPreview/Preview3d/CameraPivot +onready var camera = $MaterialPreview/Preview3d/CameraPivot/Camera + signal need_update signal show_background_preview @@ -72,10 +75,23 @@ func _on_Button_toggled(button_pressed): func on_gui_input(event): if event is InputEventMouseButton: $MaterialPreview/Preview3d/ObjectRotate.stop() + match event.button_index: + BUTTON_WHEEL_UP: + camera.translation.z *= 1.01 if event.shift else 1.1 + BUTTON_WHEEL_DOWN: + camera.translation.z /= 1.01 if event.shift else 1.1 elif event is InputEventMouseMotion: - if event.button_mask & BUTTON_MASK_LEFT: - $MaterialPreview/Preview3d/Objects.rotation.y += 0.01*event.relative.x - $MaterialPreview/Preview3d/Objects.rotation.x += 0.01*event.relative.y - elif event.button_mask & BUTTON_MASK_RIGHT: - $MaterialPreview/Preview3d/CameraPivot.rotation.y += 0.01*event.relative.x - $MaterialPreview/Preview3d/CameraPivot.rotation.x -= 0.01*event.relative.y + var motion = 0.01*event.relative + var camera_basis = camera.global_transform.basis + if event.shift: + if event.button_mask & BUTTON_MASK_LEFT: + objects.rotate(camera_basis.x.normalized(), motion.y) + objects.rotate(camera_basis.y.normalized(), motion.x) + elif event.button_mask & BUTTON_MASK_RIGHT: + objects.rotate(camera_basis.z.normalized(), motion.x) + else: + if event.button_mask & BUTTON_MASK_LEFT: + camera_stand.rotate(camera_basis.x.normalized(), -motion.y) + camera_stand.rotate(camera_basis.y.normalized(), -motion.x) + elif event.button_mask & BUTTON_MASK_RIGHT: + camera_stand.rotate(camera_basis.z.normalized(), -motion.x) diff --git a/addons/material_maker/preview.tscn b/addons/material_maker/preview.tscn index 244312c..f15eefc 100644 --- a/addons/material_maker/preview.tscn +++ b/addons/material_maker/preview.tscn @@ -25,6 +25,7 @@ margin_top = 3.0 margin_right = -3.0 margin_bottom = 373.0 rect_min_size = Vector2( 200, 200 ) +mouse_filter = 1 size_flags_horizontal = 3 size_flags_vertical = 3 stretch = true @@ -37,6 +38,7 @@ world = SubResource( 1 ) handle_input_locally = false render_target_clear_mode = 1 render_target_update_mode = 3 +physics_object_picking = true [node name="Preview3d" parent="MaterialPreview" instance=ExtResource( 2 )] diff --git a/addons/material_maker/preview_3d.tscn b/addons/material_maker/preview_3d.tscn index 46828c3..897f405 100644 --- a/addons/material_maker/preview_3d.tscn +++ b/addons/material_maker/preview_3d.tscn @@ -1,19 +1,20 @@ -[gd_scene load_steps=14 format=2] +[gd_scene load_steps=13 format=2] [ext_resource path="res://addons/material_maker/preview_objects.tscn" type="PackedScene" id=1] [ext_resource path="res://addons/material_maker/environment.gd" type="Script" id=2] [ext_resource path="res://addons/material_maker/panoramas/epping_forest_01.hdr" type="Texture" id=3] -[ext_resource path="res://addons/material_maker/panoramas/moonless_golf.hdr" type="Texture" id=4] +[ext_resource path="res://addons/material_maker/preview_light.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/material_maker/panoramas/moonless_golf.hdr" type="Texture" id=5] -[sub_resource type="PanoramaSky" id=1] +[sub_resource type="PanoramaSky" id=3] -[sub_resource type="Environment" id=2] +[sub_resource type="Environment" id=4] background_mode = 2 -background_sky = SubResource( 1 ) +background_sky = SubResource( 3 ) ambient_light_color = Color( 0.992157, 1, 0.709804, 1 ) ambient_light_energy = 0.3 -[sub_resource type="Animation" id=3] +[sub_resource type="Animation" id=5] loop = true tracks/0/type = "value" tracks/0/path = NodePath("Objects:rotation_degrees") @@ -28,25 +29,17 @@ tracks/0/keys = { "values": [ Vector3( 0, 0, 0 ), Vector3( 0, 360, 0 ) ] } -[sub_resource type="PanoramaSky" id=4] +[sub_resource type="PanoramaSky" id=6] resource_local_to_scene = true panorama = ExtResource( 3 ) -[sub_resource type="Environment" id=5] +[sub_resource type="Environment" id=7] background_mode = 2 -background_sky = SubResource( 4 ) - -[sub_resource type="SpatialMaterial" id=6] -flags_unshaded = true - -[sub_resource type="SphereMesh" id=7] -material = SubResource( 6 ) -radius = 0.25 -height = 0.5 +background_sky = SubResource( 6 ) [sub_resource type="PanoramaSky" id=8] resource_local_to_scene = true -panorama = ExtResource( 4 ) +panorama = ExtResource( 5 ) [sub_resource type="Environment" id=9] resource_local_to_scene = true @@ -63,7 +56,7 @@ transform = Transform( 1, 0, 0, 0, 0.766044, 0.642788, 0, -0.642788, 0.766044, 0 [node name="Camera" type="Camera" parent="CameraPivot"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3.5 ) -environment = SubResource( 2 ) +environment = SubResource( 4 ) current = true [node name="RemoteTransform" type="RemoteTransform" parent="CameraPivot/Camera"] @@ -72,48 +65,24 @@ remote_path = NodePath("../../../../../../ProjectsPane/BackgroundPreview/Viewpor [node name="ObjectRotate" type="AnimationPlayer" parent="."] autoplay = "rotate" playback_speed = 0.1 -anims/rotate = SubResource( 3 ) +anims/rotate = SubResource( 5 ) [node name="Environments" type="Spatial" parent="."] [node name="Epping Forest" type="Spatial" parent="Environments"] +visible = false script = ExtResource( 2 ) -environment = SubResource( 5 ) +environment = SubResource( 7 ) -[node name="Light" type="OmniLight" parent="Environments/Epping Forest"] -transform = Transform( 0.999755, 0.0162074, -0.0150931, 0, 0.681502, 0.731816, 0.0221468, -0.731637, 0.681335, -0.0821358, 3.98251, -2.64581 ) -light_energy = 4.9 -omni_range = 12.9508 - -[node name="Mesh" type="MeshInstance" parent="Environments/Epping Forest/Light"] -transform = Transform( 1, 1.11759e-008, -1.30385e-008, -1.86265e-009, 1, -4.17233e-007, 0, 0, 1, 0, 0, 0 ) -cast_shadow = 0 -mesh = SubResource( 7 ) -material/0 = null +[node name="Light" parent="Environments/Epping Forest" instance=ExtResource( 4 )] +transform = Transform( 0.999755, 0.0162074, -0.0150931, 0, 0.681502, 0.731816, 0.0221468, -0.731637, 0.681335, 0.0511079, 4.03913, -2.64581 ) [node name="Moonless Golf" type="Spatial" parent="Environments"] visible = false script = ExtResource( 2 ) environment = SubResource( 9 ) -[node name="Light1" type="OmniLight" parent="Environments/Moonless Golf"] -transform = Transform( 0.999755, 0.0162074, -0.0150931, 0, 0.681502, 0.731816, 0.0221468, -0.731637, 0.681335, -2.22238, 3.98251, -2.64581 ) -light_energy = 4.9 -omni_range = 12.9508 +[node name="Light1" parent="Environments/Moonless Golf" instance=ExtResource( 4 )] -[node name="Mesh" type="MeshInstance" parent="Environments/Moonless Golf/Light1"] -transform = Transform( 1, 1.11759e-008, -1.39698e-008, -1.86265e-009, 1, -4.17233e-007, 0, 0, 1, 0, 0, 0 ) -cast_shadow = 0 -mesh = SubResource( 7 ) -material/0 = null - -[node name="Light2" type="OmniLight" parent="Environments/Moonless Golf"] -transform = Transform( 0.999755, 0.0162074, -0.0150931, 0, 0.681502, 0.731816, 0.0221468, -0.731637, 0.681335, 2.34329, 3.98251, -2.64581 ) -light_energy = 4.9 -omni_range = 12.9508 - -[node name="Mesh" type="MeshInstance" parent="Environments/Moonless Golf/Light2"] -transform = Transform( 1, 1.11759e-008, -1.39698e-008, -1.86265e-009, 1, -4.17233e-007, 0, 0, 1, 0, 0, 0 ) -cast_shadow = 0 -mesh = SubResource( 7 ) -material/0 = null +[node name="Light2" parent="Environments/Moonless Golf" instance=ExtResource( 4 )] +transform = Transform( 0.999755, 0.0162074, -0.0150931, 0, 0.681502, 0.731816, 0.0221468, -0.731637, 0.681335, 2.3608, 3.98251, -2.64581 ) diff --git a/addons/material_maker/preview_light.gd b/addons/material_maker/preview_light.gd new file mode 100644 index 0000000..5a8a80a --- /dev/null +++ b/addons/material_maker/preview_light.gd @@ -0,0 +1,5 @@ +tool +extends Area + +func _on_Light_input_event(camera, event, click_position, click_normal, shape_idx): + print(event) diff --git a/addons/material_maker/preview_light.tscn b/addons/material_maker/preview_light.tscn new file mode 100644 index 0000000..dc27caf --- /dev/null +++ b/addons/material_maker/preview_light.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/material_maker/preview_light.gd" type="Script" id=1] + +[sub_resource type="SphereShape" id=3] +radius = 0.332384 + +[sub_resource type="SpatialMaterial" id=1] +flags_unshaded = true + +[sub_resource type="SphereMesh" id=2] +material = SubResource( 1 ) +radius = 0.25 +height = 0.5 + +[node name="Light" type="Area"] +transform = Transform( 0.999755, 0.0162074, -0.0150931, 0, 0.681502, 0.731816, 0.0221468, -0.731637, 0.681335, -2.22238, 3.98251, -2.64581 ) +script = ExtResource( 1 ) + +[node name="CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 9.31323e-010, -1.86265e-009, 1, 2.98023e-008, 9.31323e-010, 2.98023e-008, 1, 0, 0, 0 ) +shape = SubResource( 3 ) + +[node name="Light" type="OmniLight" parent="."] +transform = Transform( 1, -1.86265e-009, 9.31323e-010, -1.86265e-009, 1, 0, 0, 2.98023e-008, 1, 0, 0, 0 ) +light_energy = 4.9 +omni_range = 12.9508 + +[node name="Mesh" type="MeshInstance" parent="."] +transform = Transform( 1, 1.11759e-008, -1.21072e-008, -5.58794e-009, 1, -4.17233e-007, 9.31323e-010, 0, 1, 0, 0, 0 ) +cast_shadow = 0 +mesh = SubResource( 2 ) +material/0 = null +[connection signal="input_event" from="." to="." method="_on_Light_input_event"] diff --git a/addons/material_maker/preview_world.tres b/addons/material_maker/preview_world.tres deleted file mode 100644 index 0488b02..0000000 --- a/addons/material_maker/preview_world.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="World" format=2] - -[resource] diff --git a/addons/material_maker/renderer.gd b/addons/material_maker/renderer.gd deleted file mode 100644 index 971e7e4..0000000 --- a/addons/material_maker/renderer.gd +++ /dev/null @@ -1,128 +0,0 @@ -tool -extends Viewport - -export(String) var debug_path = null -var debug_file_index = 0 - -var render_queue = [] - - -func _ready(): - $ColorRect.material = $ColorRect.material.duplicate(true) - -# Save shader to image, create image texture - -static func generate_shader(src_code): - var code - code = "shader_type canvas_item;\n" - code += "render_mode blend_disabled;\n" - var file = File.new() - file.open("res://addons/material_maker/common.shader", File.READ) - code += file.get_as_text() - code += "\n" - if src_code.has("globals"): - for g in src_code.globals: - code += g - var shader_code = src_code.defs - shader_code += "void fragment() {\n" - shader_code += src_code.code - shader_code += "COLOR = "+src_code.rgba+";\n" - shader_code += "}\n" - #print("GENERATED SHADER:\n"+shader_code) - code += shader_code - return code - -static func generate_combined_shader(red_code, green_code, blue_code): - var code - code = "shader_type canvas_item;\n" - code += "render_mode blend_disabled;\n" - var file = File.new() - file.open("res://addons/material_maker/common.shader", File.READ) - code += file.get_as_text() - code += "\n" - if red_code.has("globals"): - for g in red_code.globals: - code += g - if green_code.has("globals"): - for g in green_code.globals: - code += g - if blue_code.has("globals"): - for g in blue_code.globals: - code += g - var shader_code = "" - shader_code += red_code.defs - shader_code += green_code.defs - shader_code += blue_code.defs - shader_code += "void fragment() {\n" - shader_code += red_code.code - shader_code += green_code.code - shader_code += blue_code.code - shader_code += "COLOR = vec4("+red_code.f+", "+green_code.f+", "+blue_code.f+", 1.0);\n" - shader_code += "}\n" - #print("GENERATED COMBINED SHADER:\n"+shader_code) - code += shader_code - return code - -func setup_material(shader_material, textures, shader_code): - for k in textures.keys(): - shader_material.set_shader_param(k+"_tex", textures[k]) - shader_material.shader.code = shader_code - -func render_shader_to_viewport(shader, textures, render_size, method, args): - if debug_path != null and debug_path != "": - var f = File.new() - f.open(debug_path+str(debug_file_index)+".shader", File.WRITE) - f.store_string(shader) - f.close() - debug_file_index += 1 - render_queue.append( { shader=shader, textures=textures, size=render_size, method=method, args=args } ) - if render_queue.size() == 1: - while !render_queue.empty(): - var job = render_queue.front() - size = Vector2(job.size, job.size) - $ColorRect.rect_position = Vector2(0, 0) - $ColorRect.rect_size = Vector2(job.size, job.size) - var shader_material = $ColorRect.material - shader_material.shader.code = job.shader - if job.textures != null: - for k in job.textures.keys(): - shader_material.set_shader_param(k+"_tex", job.textures[k]) - render_target_update_mode = Viewport.UPDATE_ALWAYS - update_worlds() - yield(get_tree(), "idle_frame") - yield(get_tree(), "idle_frame") - render_target_update_mode = Viewport.UPDATE_DISABLED - callv(job.method, job.args) - render_queue.pop_front() - -func render_to_viewport(node, render_size, method, args): - render_shader_to_viewport(node.generate_shader(), node.get_textures(), render_size, method, args) - -func export_texture(node, filename, render_size = 256): - if node == null: - return null - render_to_viewport(node, render_size, "do_export_texture", [ filename ]) - -func do_export_texture(filename): - var viewport_texture = get_texture() - var x = ImageTexture.new() - x.create_from_image(viewport_texture.get_data()) - var viewport_image = x.get_data() - var f = File.new() - f.open(filename+".raw", File.WRITE) - f.store_buffer(viewport_image.get_data()) - f.close() - viewport_image.save_png(filename) - -func precalculate_node(node, render_size, target_texture, object, method, args): - if node == null: - return null - render_to_viewport(node, render_size, "do_precalculate_texture", [ object, method, args ]) - -func precalculate_shader(shader, textures, render_size, target_texture, object, method, args): - render_shader_to_viewport(shader, textures, render_size, "do_precalculate_texture", [ target_texture, object, method, args ]) - -func do_precalculate_texture(target_texture, object, method, args): - var viewport_texture = get_texture() - target_texture.create_from_image(viewport_texture.get_data()) - object.callv(method, args) diff --git a/addons/material_maker/renderer.tscn b/addons/material_maker/renderer.tscn deleted file mode 100644 index f5f08de..0000000 --- a/addons/material_maker/renderer.tscn +++ /dev/null @@ -1,34 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://addons/material_maker/renderer.gd" type="Script" id=1] - -[sub_resource type="Shader" id=1] -code = "shader_type canvas_item; - -void fragment() { - COLOR = vec4(1.0); -} -" - -[sub_resource type="ShaderMaterial" id=2] -shader = SubResource( 1 ) - -[node name="Renderer" type="Viewport"] -own_world = true -transparent_bg = true -msaa = 2 -hdr = false -render_target_v_flip = true -render_target_update_mode = 1 -gui_disable_input = true -script = ExtResource( 1 ) -debug_path = null - -[node name="ColorRect" type="ColorRect" parent="."] -material = SubResource( 2 ) -margin_right = 40.0 -margin_bottom = 40.0 - -[node name="Timer" type="Timer" parent="."] -wait_time = 0.1 -one_shot = true