mirror of
https://github.com/Relintai/material-maker.git
synced 2024-12-23 21:16:54 +01:00
Size parameter fix and better preview UI
This commit is contained in:
parent
477eec692b
commit
74959637bd
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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"]
|
||||
|
@ -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="."]
|
||||
|
@ -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)
|
||||
|
@ -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 )]
|
||||
|
||||
|
@ -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 )
|
||||
|
5
addons/material_maker/preview_light.gd
Normal file
5
addons/material_maker/preview_light.gd
Normal file
@ -0,0 +1,5 @@
|
||||
tool
|
||||
extends Area
|
||||
|
||||
func _on_Light_input_event(camera, event, click_position, click_normal, shape_idx):
|
||||
print(event)
|
34
addons/material_maker/preview_light.tscn
Normal file
34
addons/material_maker/preview_light.tscn
Normal file
@ -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"]
|
@ -1,3 +0,0 @@
|
||||
[gd_resource type="World" format=2]
|
||||
|
||||
[resource]
|
@ -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)
|
@ -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
|
Loading…
Reference in New Issue
Block a user