Add AO packing to channel packer

This commit is contained in:
Xtarsia 2025-11-14 19:46:08 +00:00 committed by Cory Petkovsek
parent 7f3735a7f4
commit adb379b418
4 changed files with 298 additions and 123 deletions

View File

@ -15,7 +15,8 @@ enum {
IMAGE_ALBEDO,
IMAGE_HEIGHT,
IMAGE_NORMAL,
IMAGE_ROUGHNESS
IMAGE_ROUGHNESS,
IMAGE_AO
}
var plugin: EditorPlugin
@ -36,11 +37,13 @@ var height_channel: Array[Button]
var height_channel_selected: int = 0
var roughness_channel: Array[Button]
var roughness_channel_selected: int = 0
var occlusion_channel: Array[Button]
var occlusion_channel_selected: int = 0
var last_opened_directory: String
var last_saved_directory: String
var packing_albedo: bool = false
var queue_pack_normal_roughness: bool = false
var images: Array[Image] = [null, null, null, null]
var images: Array[Image] = [null, null, null, null, null]
var status_label: Label
var no_op: Callable = func(): pass
var last_file_selected_fn: Callable = no_op
@ -89,6 +92,12 @@ func pack_textures_popup() -> void:
window.find_child("RoughnessChannelB") as Button,
window.find_child("RoughnessChannelA") as Button
]
occlusion_channel = [
window.find_child("RoughnessChannelR") as Button,
window.find_child("RoughnessChannelG") as Button,
window.find_child("RoughnessChannelB") as Button,
window.find_child("RoughnessChannelA") as Button
]
height_channel[0].pressed.connect(func() -> void: height_channel_selected = 0)
height_channel[1].pressed.connect(func() -> void: height_channel_selected = 1)
@ -100,6 +109,11 @@ func pack_textures_popup() -> void:
roughness_channel[2].pressed.connect(func() -> void: roughness_channel_selected = 2)
roughness_channel[3].pressed.connect(func() -> void: roughness_channel_selected = 3)
occlusion_channel[0].pressed.connect(func() -> void: occlusion_channel_selected = 0)
occlusion_channel[1].pressed.connect(func() -> void: occlusion_channel_selected = 1)
occlusion_channel[2].pressed.connect(func() -> void: occlusion_channel_selected = 2)
occlusion_channel[3].pressed.connect(func() -> void: occlusion_channel_selected = 3)
plugin.add_child(window)
_init_file_dialogs()
@ -116,13 +130,14 @@ func pack_textures_popup() -> void:
_init_texture_picker(window.find_child("HeightVBox"), IMAGE_HEIGHT)
_init_texture_picker(window.find_child("NormalVBox"), IMAGE_NORMAL)
_init_texture_picker(window.find_child("RoughnessVBox"), IMAGE_ROUGHNESS)
_init_texture_picker(window.find_child("AmbientOcclusionVBox"), IMAGE_AO)
(window.find_child("PackButton") as Button).pressed.connect(_on_pack_button_pressed)
func _on_close_requested() -> void:
last_file_selected_fn = no_op
images = [null, null, null, null]
images = [null, null, null, null, null]
window.queue_free()
window = null
@ -180,6 +195,11 @@ func _init_texture_picker(p_parent: Node, p_image_index: int) -> void:
roughness_channel[i].visible = i < channel_count
roughness_channel[0].button_pressed = true
roughness_channel[0].pressed.emit()
elif p_image_index == IMAGE_AO:
for i in 4:
occlusion_channel[i].visible = i < channel_count
occlusion_channel[0].button_pressed = true
occlusion_channel[0].pressed.emit()
var load_image_fn: Callable = func(path: String):
var image: Image = Image.new()
@ -207,7 +227,7 @@ func _init_texture_picker(p_parent: Node, p_image_index: int) -> void:
_set_wh_labels(p_image_index, image.get_width(), image.get_height())
if p_image_index == IMAGE_NORMAL:
_set_normal_vector(image)
if p_image_index == IMAGE_HEIGHT or p_image_index == IMAGE_ROUGHNESS:
if p_image_index == IMAGE_HEIGHT or p_image_index == IMAGE_ROUGHNESS or p_image_index == IMAGE_AO:
set_channel_fn.call(image.detect_used_channels())
var os_drop_fn: Callable = func(files: PackedStringArray) -> void:
@ -298,6 +318,9 @@ func _set_wh_labels(p_image_index: int, width: int, height: int) -> void:
3:
window.find_child("RoughnessW").text = w
window.find_child("RoughnessH").text = h
4:
window.find_child("AmbientOcclusionW").text = w
window.find_child("AmbientOcclusionH").text = h
func _show_message(p_level: int, p_text: String) -> void:
@ -354,12 +377,12 @@ func _on_save_file_selected(p_dst_path) -> void:
last_saved_directory = p_dst_path.get_base_dir() + "/"
var error: int
if packing_albedo:
error = _pack_textures(images[IMAGE_ALBEDO], images[IMAGE_HEIGHT], p_dst_path, false,
error = _pack_textures(images[IMAGE_ALBEDO], images[IMAGE_HEIGHT], null, p_dst_path, false,
invert_height_checkbox.button_pressed, false, normalize_height_checkbox.button_pressed, height_channel_selected)
else:
error = _pack_textures(images[IMAGE_NORMAL], images[IMAGE_ROUGHNESS], p_dst_path,
error = _pack_textures(images[IMAGE_NORMAL], images[IMAGE_ROUGHNESS], images[IMAGE_AO], p_dst_path,
invert_green_checkbox.button_pressed, invert_smooth_checkbox.button_pressed,
align_normals_checkbox.button_pressed, false, roughness_channel_selected)
align_normals_checkbox.button_pressed, false, roughness_channel_selected, occlusion_channel_selected)
if error == OK:
EditorInterface.get_resource_filesystem().scan()
@ -434,25 +457,31 @@ func _align_normals(source: Image, iteration: int = 0) -> void:
_align_normals(source, iteration)
func _pack_textures(p_rgb_image: Image, p_a_image: Image, p_dst_path: String, p_invert_green: bool,
p_invert_smooth: bool, p_align_normals: bool, p_normalize_height: bool, p_alpha_channel: int) -> Error:
func _pack_textures(p_rgb_image: Image, p_a_image: Image, p_ao_image: Image, p_dst_path: String, p_invert_green: bool,
p_invert_smooth: bool, p_align_normals: bool, p_normalize_height: bool, p_alpha_channel: int, p_occlusion_channel: int = 0) -> Error:
if p_rgb_image and p_a_image:
if p_rgb_image.get_size() != p_a_image.get_size() and !resize_toggle_checkbox.button_pressed:
_show_message(ERROR, "Textures must be the same size.\nEnable resize to override image dimensions")
return FAILED
if p_ao_image:
if p_rgb_image.get_size() != p_ao_image.get_size() and !resize_toggle_checkbox.button_pressed:
_show_message(ERROR, "Textures must be the same size.\nEnable resize to override image dimensions")
return FAILED
if resize_toggle_checkbox.button_pressed:
var size: int = max(128, resize_option_box.value)
p_rgb_image.resize(size, size, Image.INTERPOLATE_CUBIC)
p_a_image.resize(size, size, Image.INTERPOLATE_CUBIC)
if p_ao_image:
p_ao_image.resize(size, size, Image.INTERPOLATE_CUBIC)
if p_align_normals and normal_vector.dot(Vector3(0.0, 0.0, 1.0)) < 0.999:
_align_normals(p_rgb_image)
elif p_align_normals:
_show_message(INFO, "Alignment OK, skipping Normal Orthogonalization")
var output_image: Image = Terrain3DUtil.pack_image(p_rgb_image, p_a_image,
p_invert_green, p_invert_smooth, p_normalize_height, p_alpha_channel)
var output_image: Image = Terrain3DUtil.pack_image(p_rgb_image, p_a_image, p_ao_image,
p_invert_green, p_invert_smooth, p_normalize_height, p_alpha_channel, p_occlusion_channel)
if not output_image:
_show_message(ERROR, "Failed to pack textures")

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=6 format=3 uid="uid://nud6dwjcnj5v"]
[gd_scene load_steps=8 format=3 uid="uid://nud6dwjcnj5v"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mbo40"]
draw_center = false
@ -12,6 +12,9 @@ corner_radius_top_right = 5
corner_radius_bottom_right = 5
corner_radius_bottom_left = 5
[sub_resource type="LabelSettings" id="LabelSettings_mbo40"]
outline_size = 1
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cb0xf"]
bg_color = Color(0.147, 0.168, 0.203, 1)
draw_center = false
@ -29,12 +32,14 @@ corner_radius_bottom_left = 5
[sub_resource type="ButtonGroup" id="ButtonGroup_wnxik"]
[sub_resource type="ButtonGroup" id="ButtonGroup_bs6ki"]
[sub_resource type="ButtonGroup" id="ButtonGroup_47nos"]
[sub_resource type="ButtonGroup" id="ButtonGroup_mbo40"]
[node name="Window" type="Window"]
title = "Terrain3D Channel Packer"
initial_position = 1
size = Vector2i(583, 891)
size = Vector2i(828, 922)
wrap_controls = true
always_on_top = true
@ -56,54 +61,61 @@ theme_override_constants/margin_bottom = 5
layout_mode = 2
theme_override_constants/separation = 10
[node name="AlbedoHeightPanel" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
[node name="TabContainer" type="TabContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
current_tab = 0
[node name="Albedo_Height" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_mbo40")
metadata/_tab_index = 0
metadata/_tab_name = "Albedo Height"
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height"]
layout_mode = 2
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 10
theme_override_constants/margin_bottom = 10
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer"]
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer"]
layout_mode = 2
[node name="AlbedoVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer"]
[node name="AlbedoVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="AlbedoLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
[node name="AlbedoLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox"]
layout_mode = 2
text = "Albedo texture"
label_settings = SubResource("LabelSettings_mbo40")
[node name="AlbedoHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
[node name="AlbedoHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox"]
layout_mode = 2
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"]
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/AlbedoHBox"]
layout_mode = 2
size_flags_horizontal = 3
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"]
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/AlbedoHBox"]
layout_mode = 2
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoHBox"]
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/AlbedoHBox"]
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox"]
layout_mode = 2
size_flags_vertical = 4
theme_override_constants/margin_top = 10
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer"]
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/MarginContainer"]
custom_minimum_size = Vector2(110, 110)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer/Panel"]
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@ -118,7 +130,7 @@ grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/MarginContainer/Panel"]
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@ -127,61 +139,62 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
[node name="AlbedoWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
[node name="AlbedoWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox"]
layout_mode = 2
alignment = 1
[node name="AlbedoW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoWHHBox"]
[node name="AlbedoW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/AlbedoWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="AlbedoH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/AlbedoWHHBox"]
[node name="AlbedoH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/AlbedoWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox"]
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox"]
layout_mode = 2
alignment = 1
[node name="LuminanceAsHeightButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/AlbedoVBox/HBoxContainer2"]
[node name="LuminanceAsHeightButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/AlbedoVBox/HBoxContainer2"]
layout_mode = 2
text = " Generate Height from Luminance"
icon_alignment = 2
[node name="HeightVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer"]
[node name="HeightVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HeightLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
[node name="HeightLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
text = "Height texture"
label_settings = SubResource("LabelSettings_mbo40")
[node name="HeightHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
[node name="HeightHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"]
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HeightHBox"]
layout_mode = 2
size_flags_horizontal = 3
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"]
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HeightHBox"]
layout_mode = 2
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightHBox"]
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HeightHBox"]
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
size_flags_vertical = 4
theme_override_constants/margin_top = 10
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer"]
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/MarginContainer"]
custom_minimum_size = Vector2(110, 110)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer/Panel"]
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@ -196,7 +209,7 @@ grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/MarginContainer/Panel"]
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@ -205,118 +218,124 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
[node name="HeightWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
[node name="HeightWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
alignment = 1
[node name="HeightW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightWHHBox"]
[node name="HeightW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HeightWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="HeightH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HeightWHHBox"]
[node name="HeightH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HeightWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
alignment = 1
[node name="ConvertDepthToHeight" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer2"]
layout_mode = 2
text = " Convert Depth to Height"
icon_alignment = 2
[node name="HBoxContainer3" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
layout_mode = 2
alignment = 1
[node name="NormalizeHeight" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer3"]
layout_mode = 2
text = "Normalize Height"
icon_alignment = 2
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox"]
layout_mode = 2
alignment = 1
[node name="HeightChannelLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer"]
[node name="HeightChannelLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer"]
layout_mode = 2
text = " Source Channel: "
horizontal_alignment = 2
[node name="HeightChannelR" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer"]
[node name="HeightChannelR" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_wnxik")
text = "R"
[node name="HeightChannelB" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer"]
[node name="HeightChannelB" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_wnxik")
text = "G"
[node name="HeightChannelG" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer"]
[node name="HeightChannelG" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_wnxik")
text = "B"
[node name="HeightChannelA" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/AlbedoHeightPanel/MarginContainer/HBoxContainer/HeightVBox/HBoxContainer"]
[node name="HeightChannelA" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_wnxik")
text = "A"
[node name="NormalRoughnessPanel" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
alignment = 1
[node name="ConvertDepthToHeight" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer2"]
layout_mode = 2
text = " Convert Depth to Height"
icon_alignment = 2
[node name="HBoxContainer3" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox"]
layout_mode = 2
alignment = 1
[node name="NormalizeHeight" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Albedo_Height/MarginContainer/VBoxContainer/HeightVBox/HBoxContainer3"]
layout_mode = 2
text = "Normalize Height"
icon_alignment = 2
[node name="Normal_Roughness" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer"]
visible = false
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_mbo40")
metadata/_tab_index = 1
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness"]
layout_mode = 2
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 10
theme_override_constants/margin_bottom = 10
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer"]
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer"]
layout_mode = 2
[node name="NormalVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer"]
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="NormalVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 3
[node name="NormalLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
[node name="NormalLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox"]
layout_mode = 2
text = "Normal texture"
label_settings = SubResource("LabelSettings_mbo40")
[node name="NormalHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
[node name="NormalHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox"]
layout_mode = 2
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"]
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/NormalHBox"]
layout_mode = 2
size_flags_horizontal = 3
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"]
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/NormalHBox"]
layout_mode = 2
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalHBox"]
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/NormalHBox"]
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox"]
layout_mode = 2
size_flags_vertical = 4
theme_override_constants/margin_top = 10
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer"]
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/MarginContainer"]
custom_minimum_size = Vector2(110, 110)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer/Panel"]
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@ -331,7 +350,7 @@ grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/MarginContainer/Panel"]
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@ -340,68 +359,72 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
[node name="NormalWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
[node name="NormalWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox"]
layout_mode = 2
alignment = 1
[node name="NormalW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalWHHBox"]
[node name="NormalW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/NormalWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="NormalH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/NormalWHHBox"]
[node name="NormalH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/NormalWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox"]
layout_mode = 2
alignment = 1
[node name="InvertGreenChannelCheckBox" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/HBoxContainer"]
[node name="InvertGreenChannelCheckBox" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/HBoxContainer"]
layout_mode = 2
text = " Convert DirectX to OpenGL"
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox"]
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox"]
layout_mode = 2
alignment = 1
[node name="AlignNormalsCheckBox" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/NormalVBox/HBoxContainer2"]
[node name="AlignNormalsCheckBox" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer2/NormalVBox/HBoxContainer2"]
layout_mode = 2
text = " Orthoganolise Normals"
[node name="RoughnessVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer"]
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="RoughnessVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="RoughnessLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
[node name="RoughnessLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
text = "Roughness texture"
label_settings = SubResource("LabelSettings_mbo40")
[node name="RoughnessHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
[node name="RoughnessHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
layout_mode = 2
size_flags_horizontal = 3
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
layout_mode = 2
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/RoughnessHBox"]
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
size_flags_vertical = 4
theme_override_constants/margin_top = 10
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer"]
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/MarginContainer"]
custom_minimum_size = Vector2(110, 110)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"]
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@ -416,7 +439,7 @@ grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"]
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@ -425,58 +448,162 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
[node name="RoughnessWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
[node name="RoughnessWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
alignment = 1
[node name="RoughnessW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessWHHBox"]
[node name="RoughnessW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/RoughnessWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="RoughnessH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/RoughnessWHHBox"]
[node name="RoughnessH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/RoughnessWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
alignment = 1
[node name="InvertSmoothCheckBox" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/HBoxContainer2"]
layout_mode = 2
text = " Convert Smoothness to Roughness"
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
alignment = 1
[node name="RoughnessChannelLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
[node name="RoughnessChannelLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
layout_mode = 2
text = " Source Channel: "
horizontal_alignment = 2
[node name="RoughnessChannelR" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
[node name="RoughnessChannelR" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_bs6ki")
button_group = SubResource("ButtonGroup_47nos")
text = "R"
[node name="RoughnessChannelG" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
[node name="RoughnessChannelG" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_bs6ki")
button_group = SubResource("ButtonGroup_47nos")
text = "G"
[node name="RoughnessChannelB" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
[node name="RoughnessChannelB" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_bs6ki")
button_group = SubResource("ButtonGroup_47nos")
text = "B"
[node name="RoughnessChannelA" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/NormalRoughnessPanel/MarginContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
[node name="RoughnessChannelA" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_bs6ki")
button_group = SubResource("ButtonGroup_47nos")
text = "A"
[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox"]
layout_mode = 2
alignment = 1
[node name="InvertSmoothCheckBox" type="CheckBox" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/RoughnessVBox/HBoxContainer2"]
layout_mode = 2
text = " Convert Smoothness to Roughness"
[node name="AmbientOcclusionVBox" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="AOLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox"]
layout_mode = 2
text = "AO texture (Optional)"
label_settings = SubResource("LabelSettings_mbo40")
[node name="AOHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox"]
layout_mode = 2
[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/AOHBox"]
layout_mode = 2
size_flags_horizontal = 3
[node name="PickButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/AOHBox"]
layout_mode = 2
[node name="ClearButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/AOHBox"]
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox"]
layout_mode = 2
size_flags_vertical = 4
theme_override_constants/margin_top = 10
[node name="Panel" type="Panel" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/MarginContainer"]
custom_minimum_size = Vector2(110, 110)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/panel = SubResource("StyleBoxFlat_cb0xf")
[node name="TextureRect" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -50.0
offset_top = -50.0
offset_right = 50.0
offset_bottom = 50.0
grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
[node name="TextureButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/MarginContainer/Panel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/normal = SubResource("StyleBoxEmpty_7qdas")
[node name="NormalWHHBox" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox"]
layout_mode = 2
alignment = 1
[node name="AmbientOcclusionW" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/NormalWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="AmbientOcclusionH" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/NormalWHHBox"]
layout_mode = 2
horizontal_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox"]
layout_mode = 2
alignment = 1
[node name="OcclusionChannelLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/HBoxContainer"]
layout_mode = 2
text = " Source Channel: "
horizontal_alignment = 2
[node name="OcclusionChannelR" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_pressed = true
button_group = SubResource("ButtonGroup_mbo40")
text = "R"
[node name="OcclusionChannelG" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_mbo40")
text = "G"
[node name="OcclusionChannelB" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_mbo40")
text = "B"
[node name="OcclusionChannelA" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/TabContainer/Normal_Roughness/MarginContainer/VBoxContainer/HBoxContainer/AmbientOcclusionVBox/HBoxContainer"]
layout_mode = 2
toggle_mode = true
button_group = SubResource("ButtonGroup_mbo40")
text = "A"
[node name="GeneralOptionsLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer"]
@ -532,4 +659,6 @@ alignment = 1
layout_mode = 2
text = "Close"
[connection signal="ready" from="PanelContainer/MarginContainer/VBoxContainer/TabContainer" to="PanelContainer/MarginContainer/VBoxContainer/TabContainer" method="set_tab_title" flags=6 binds= [1, "Normal Roughness AO"]]
[connection signal="tree_entered" from="PanelContainer/MarginContainer/VBoxContainer/TabContainer" to="PanelContainer/MarginContainer/VBoxContainer/TabContainer" method="set_tab_title" flags=6 binds= [0, "Albedo Height"]]
[connection signal="toggled" from="PanelContainer/MarginContainer/VBoxContainer/GeneralOptionsHBox/ResizeToggle" to="PanelContainer/MarginContainer/VBoxContainer/GeneralOptionsHBox/ResizeOptionButton" method="set_visible"]

View File

@ -373,8 +373,8 @@ Ref<Image> Terrain3DUtil::load_image(const String &p_file_name, const int p_cach
* If p_invert_green is true, the destination green channel will be 1.0 - input green channel.
* If p_invert_alpha is true, the destination alpha channel will be 1.0 - input source channel.
*/
Ref<Image> Terrain3DUtil::pack_image(const Ref<Image> &p_src_rgb, const Ref<Image> &p_src_a,
const bool p_invert_green, const bool p_invert_alpha, const bool p_normalize_alpha, const int p_alpha_channel) {
Ref<Image> Terrain3DUtil::pack_image(const Ref<Image> &p_src_rgb, const Ref<Image> &p_src_a, const Ref<Image> &p_src_ao,
const bool p_invert_green, const bool p_invert_alpha, const bool p_normalize_alpha, const int p_alpha_channel, const int p_occlusion_channel) {
if (!p_src_rgb.is_valid() || !p_src_a.is_valid()) {
LOG(ERROR, "Provided images are not valid. Cannot pack");
return Ref<Image>();
@ -392,6 +392,14 @@ Ref<Image> Terrain3DUtil::pack_image(const Ref<Image> &p_src_rgb, const Ref<Imag
return Ref<Image>();
}
bool pack_ao = p_src_ao.is_valid();
if (pack_ao) {
if (p_src_rgb->get_size() != p_src_ao->get_size()) {
LOG(ERROR, "Provided AO and normal images are not the same size. Cannot pack");
return Ref<Image>();
}
}
real_t a_max = 0.0f;
real_t a_min = 0.0f;
real_t contrast = 1.0f;
@ -423,6 +431,13 @@ Ref<Image> Terrain3DUtil::pack_image(const Ref<Image> &p_src_rgb, const Ref<Imag
if (p_invert_alpha) {
col.a = 1.0f - col.a;
}
if (pack_ao) {
// Compress range to avoid low AO values completely destroying normal vector precision - recovered in shader.
real_t ao = sqrt(p_src_ao->get_pixel(x, y)[p_occlusion_channel]) * 0.5 + 0.5;
col.r = col.r * ao + (1.0f - ao) * 0.5f;
col.g = col.g * ao + (1.0f - ao) * 0.5f;
col.b = col.b * ao + (1.0f - ao) * 0.5f;
}
dst->set_pixel(x, y, col);
}
}

View File

@ -48,10 +48,12 @@ public:
const Vector2 &p_r16_height_range = Vector2(0.f, 255.f), const Vector2i &p_r16_size = V2I_ZERO);
static Ref<Image> pack_image(const Ref<Image> &p_src_rgb,
const Ref<Image> &p_src_a,
const Ref<Image> &p_src_ao,
const bool p_invert_green = false,
const bool p_invert_alpha = false,
const bool p_normalize_alpha = false,
const int p_alpha_channel = 0);
const int p_alpha_channel = 0,
const int p_occlusion_channel = 0);
static Ref<Image> luminance_to_height(const Ref<Image> &p_src_rgb);
static void benchmark(Terrain3D *p_terrain);