From 2e8082a26a93e203860619a2cd86ec378a434506 Mon Sep 17 00:00:00 2001 From: danil_tim Date: Mon, 10 Feb 2025 13:02:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=BE=D1=80=D0=B4=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PRD_MP550.tscn | 47 ++++------------ scripts/PRD.gd | 4 +- scripts/constants.gd | 9 ++- scripts/control_panel.gd | 52 +++++------------ scripts/network.gd | 24 ++++---- scripts/nine-patch-button.gd | 86 +++++++++++++++++++++++++++++ table/элемент-в.tscn | 59 +++++--------------- состояние-исправности-0.png | Bin 0 -> 4148 bytes состояние-исправности-0.png.import | 34 ++++++++++++ состояние-исправности-1.png | Bin 0 -> 2606 bytes состояние-исправности-1.png.import | 34 ++++++++++++ состояние-исправности-2.png | Bin 0 -> 2275 bytes состояние-исправности-2.png.import | 34 ++++++++++++ 13 files changed, 245 insertions(+), 138 deletions(-) create mode 100644 scripts/nine-patch-button.gd create mode 100644 состояние-исправности-0.png create mode 100644 состояние-исправности-0.png.import create mode 100644 состояние-исправности-1.png create mode 100644 состояние-исправности-1.png.import create mode 100644 состояние-исправности-2.png create mode 100644 состояние-исправности-2.png.import diff --git a/PRD_MP550.tscn b/PRD_MP550.tscn index 9ca0a5c..810dd1a 100644 --- a/PRD_MP550.tscn +++ b/PRD_MP550.tscn @@ -458,61 +458,48 @@ offset_left = 9.0 offset_top = 34.0 offset_right = 59.0 offset_bottom = 184.0 -textures = Array[Texture]([]) fname = "ИП5-25" rname = "A24" -metadata/_edit_lock_ = true [node name="ay07" parent="TabContainer/ControlPanel/soc_y5" instance=ExtResource("11_fg7ul")] offset_left = 59.0 offset_top = 34.0 offset_right = 109.0 offset_bottom = 184.0 -textures = Array[Texture]([]) fname = "ЯУ-07" rname = "A30" -metadata/_edit_lock_ = true [node name="ems_g" parent="TabContainer/ControlPanel/soc_y5" instance=ExtResource("11_fg7ul")] offset_left = 109.0 offset_top = 34.0 offset_right = 159.0 offset_bottom = 184.0 -textures = Array[Texture]([]) fname = "ЭМС-Г" rname = "A26" -metadata/_edit_lock_ = true [node name="ug" parent="TabContainer/ControlPanel/soc_y5" instance=ExtResource("11_fg7ul")] offset_left = 159.0 offset_top = 34.0 offset_right = 209.0 offset_bottom = 184.0 -textures = Array[Texture]([]) fname = "УГ" rname = "A27" -metadata/_edit_lock_ = true - -[node name="ukp_1" parent="TabContainer/ControlPanel/soc_y5" instance=ExtResource("11_fg7ul")] -offset_left = 209.0 -offset_top = 34.0 -offset_right = 259.0 -offset_bottom = 183.0 -textures = Array[Texture]([]) -self_size = Vector2i(50, 149) -fname = "УКП-1" -rname = "A28" -metadata/_edit_lock_ = true [node name="ukp_2" parent="TabContainer/ControlPanel/soc_y5" instance=ExtResource("11_fg7ul")] offset_left = 259.0 offset_top = 34.0 offset_right = 309.0 offset_bottom = 184.0 -textures = Array[Texture]([]) fname = "УКП-2" rname = "A29" -metadata/_edit_lock_ = true + +[node name="ukp_1" parent="TabContainer/ControlPanel/soc_y5" instance=ExtResource("11_fg7ul")] +offset_left = 210.0 +offset_top = 35.0 +offset_right = 260.0 +offset_bottom = 185.0 +fname = "УКП-1" +rname = "A28" [node name="Kasseta" type="Label" parent="TabContainer/ControlPanel/soc_y5"] self_modulate = Color(1, 1, 1, 0.62) @@ -543,14 +530,12 @@ offset_bottom = 33.0 text = "Кассета ФС-НД" horizontal_alignment = 1 vertical_alignment = 1 -metadata/_edit_lock_ = true [node name="ref_A3" parent="TabContainer/ControlPanel/Kasseta_FS" instance=ExtResource("11_fg7ul")] offset_left = 109.0 offset_top = 41.0 offset_right = 159.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 170) fname = "БЛОК ФС-2" rname = "A3" @@ -560,7 +545,6 @@ offset_left = 159.0 offset_top = 41.0 offset_right = 209.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 170) fname = "Модуль ФС" rname = "A1" @@ -570,7 +554,6 @@ offset_left = 209.0 offset_top = 41.0 offset_right = 259.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 170) fname = "Модуль ФС" rname = "A2" @@ -580,17 +563,15 @@ offset_left = 259.0 offset_top = 41.0 offset_right = 309.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 170) fname = "БЛОК ФС-3" rname = "A4" [node name="Block_FS_PRD_K" parent="TabContainer/ControlPanel/Kasseta_FS" instance=ExtResource("11_fg7ul")] offset_left = 12.0 -offset_top = 41.0 +offset_top = 40.0 offset_right = 62.0 -offset_bottom = 211.0 -textures = Array[Texture]([]) +offset_bottom = 210.0 self_size = Vector2i(50, 170) fname = "БЛОК ФС-1" rname = "A4" @@ -600,7 +581,6 @@ offset_left = 61.0 offset_top = 41.0 offset_right = 111.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 170) fname = "Модуль ФС" rname = "A1" @@ -633,7 +613,6 @@ offset_left = -64.0 offset_top = 37.0 offset_right = -14.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "МАА2000" rname = "А22" @@ -643,7 +622,6 @@ offset_left = 203.0 offset_top = 36.0 offset_right = 253.0 offset_bottom = 210.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "МАА2000" rname = "А23" @@ -653,7 +631,6 @@ offset_left = 129.0 offset_top = 37.0 offset_right = 179.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "ИП9-50" rname = "А19" @@ -663,7 +640,6 @@ offset_left = 73.0 offset_top = 37.0 offset_right = 123.0 offset_bottom = 211.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "ИП9-50" rname = "А20" @@ -696,7 +672,6 @@ offset_left = 16.0 offset_top = 36.0 offset_right = 66.0 offset_bottom = 210.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "ИП12-50" rname = "А21" @@ -729,7 +704,6 @@ offset_left = 81.0 offset_top = 36.0 offset_right = 131.0 offset_bottom = 210.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "ИП12-50" rname = "A25" @@ -739,7 +713,6 @@ offset_left = 24.0 offset_top = 36.0 offset_right = 74.0 offset_bottom = 210.0 -textures = Array[Texture]([]) self_size = Vector2i(50, 174) fname = "ИП9-50" rname = "A22" diff --git a/scripts/PRD.gd b/scripts/PRD.gd index a86b892..46bed50 100644 --- a/scripts/PRD.gd +++ b/scripts/PRD.gd @@ -131,7 +131,7 @@ func _ready() -> void: node_select_yau_07b.get_node2(1, 4).add_item(key) node_select_yau_07b_2.get_node2(1, 4).add_item(key) - draw_control_panel_prd(Constants.ADDRESSES[0][3]) + #draw_control_panel_prd(Constants.ADDRESSES[0][3]) Network.connect('yau_status_line', Callable(self, '_on_yau_status')) Network.connect('yau_receive', Callable(self, '_on_data_received')) @@ -490,8 +490,6 @@ func on_btn_select(intem_from_sector: int) -> void: var get_select_device = node_select_device.get_node2(1, 0) var meta = get_select_device.get_item_metadata(intem_from_sector) Network.on_command_change_device(meta) - flag_mode = meta[2] - draw_control_panel_prd(flag_mode) _on_start_fs_1() Constants.CURRENT_MODE = meta[2] draw_control_panel_prd(Constants.CURRENT_MODE) diff --git a/scripts/constants.gd b/scripts/constants.gd index 4eb493b..3db2a63 100644 --- a/scripts/constants.gd +++ b/scripts/constants.gd @@ -1,6 +1,6 @@ extends Node -const UNICAST_PORT: int = 50003 -const UNICAST_ADDRESS: String = '10.1.1.3' +const UNICAST_PORT: int = 50014 +const UNICAST_ADDRESS: String = '10.1.1.14' const BROADCAST_PORT: int = 50000 const DEFAULT_ADDRESS: String = '10.1.1.11' const DEFAULT_PORT: String = '50011' @@ -162,6 +162,11 @@ enum STATE { SEND, } +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + var EMS_G_PORT_DATA_HOLDER: Array = [] # Таблица CRC-32 для модуля ФС diff --git a/scripts/control_panel.gd b/scripts/control_panel.gd index 961f9cf..0bf2e4b 100644 --- a/scripts/control_panel.gd +++ b/scripts/control_panel.gd @@ -1,15 +1,18 @@ extends Panel var unit_yau07 = Yau07.YaU07.new('ЯУ07') -var sockets_ind: Array -var node_power_ind: Array func _ready() -> void: Network.connect('yau_receive', Callable(self, '_on_data_received')) - Network.connect('yau_status_line', Callable(self, '_on_yau_status')) + Network.connect('yau_status_line', Callable(self, '_control_pribor')) - sockets_ind = [ + var timer = Timer.new() + self.add_child(timer) + timer.connect('timeout', Callable(self, 'on_timer')) + timer.start(1) + + '''sockets_ind = [ $soc_y5/ems_g/light_ind, $soc_y5/ug/light_ind, $soc_y5/ukp_1/light_ind, @@ -23,46 +26,17 @@ func _ready() -> void: $soc_P1/IP12_50/light_ind, $soc_P2/IP9_50/light_ind, $soc_P2/IP12_50/light_ind, - $soc_y5/IP5_25/light_ind] - - -func lose_connect_yau(): - for i in 4: - sockets_ind[i].button_pressed = false - sockets_ind[i].disabled = true - for i in 8: - node_power_ind[i].button_pressed = false - node_power_ind[i].disabled = true + $soc_y5/IP5_25/light_ind]''' +func on_timer(unit): + print(unit) func _on_data_received(data_from_yau_07): var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD) var dry_contact: int = data_from_yau_07.decode_u16(Constants.DataIndices.DRY_CONTACT) # Контроль сухих контактов (УГ) - ## SOCKETS BOARDS - for i in 4: - var j = int(status_board & (1 << i) == 0) - if j == 0: - sockets_ind[i].button_pressed = true - sockets_ind[i].disabled = false - else: - sockets_ind[i].button_pressed = false - sockets_ind[i].disabled = true - - ## Блок ИП - for i in 8: - var j = int(not(dry_contact & (1 << i) == 0)) - var a = node_power_ind[i] - if j == 0: - node_power_ind[i].button_pressed = true - node_power_ind[i].disabled = false - else: - node_power_ind[i].button_pressed = false - node_power_ind[i].disabled = true - ## From Network status about yau-07 -func _on_yau_status(yau_status:bool) -> void: - $device.text = str(Constants.CURRENT_MODE) - $soc_y5/ay07/light_ind.button_pressed = yau_status - $soc_y5/ay07/light_ind.disabled = not yau_status +func _control_pribor(yau_status:bool) -> void: + #$device.text = str(Constants.CURRENT_MODE) + $soc_y5/ay07.state = Constants.STATE_VAL.GOOD diff --git a/scripts/network.gd b/scripts/network.gd index cf8ad61..0cf50e3 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -46,7 +46,7 @@ func poll_receive_yau07(sock: Socket) -> bool: ## Приёмник broadcast_packet = sock.get_packet() var addr_receive = sock.get_packet_ip() var port_receive = sock.get_packet_port() - + if (ip_address_yau == addr_receive) and (ip_port_yau == port_receive): last_update_time_yau07 = 0.0 unit.parse(broadcast_packet) @@ -69,7 +69,7 @@ func poll_receive_fs(client: StreamPeerTCP): if client.get_status() != StreamPeerTCP.STATUS_CONNECTED: emit_signal("port_closed", ip_fs_1) return - + if peer.get_available_bytes() > 0: var rx_data: PackedByteArray rx_data.append_array(peer.get_data(peer.get_available_bytes())[1]) @@ -85,11 +85,11 @@ func _ready() -> void: var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*') if rc != OK: print_debug('Ошибка: Неудачная привязка широковещательного адреса') - + soc_unicast = Socket.new() rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS) if rc != OK: - print_debug('Ошибка: неудачная привязка адреса: ', ip_address_yau) + print_debug('Ошибка: неудачная привязка адреса: ', ip_address_yau) unit.connect('line_changed', Callable(self, 'on_line_changed')) unit.connect('command_fail', Callable(self, 'on_command_fail')) @@ -101,16 +101,16 @@ func _process(delta: float) -> void: last_update_time_yau07 += delta last_update_time_fs += delta - + if client_fs_1: poll_receive_fs(client_fs_1) - + poll_receive_yau07(soc_brodcast) poll_receive_yau07(soc_unicast) - + state_machine_yau07() state_machine_fs() - + match unit.process(delta): Error.OK: soc_unicast.send_to(ip_address_yau, ip_port_yau, unit.tx_data.slice(0, unit.tx_len)) Error.FAILED: print_debug('Ошибка отправки данных') @@ -142,12 +142,12 @@ func state_machine_yau07(): state = Constants.STATE.WAIT -# Записать команду в ИСА +# Записать команду в ИСА func read_port_isa(read_ports: Array) -> void: send_array.append(['rd', read_ports]) -# Прочитать данные из порта от ИСА +# Прочитать данные из порта от ИСА func write_port_isa(port_isa: int, data_isa: int) -> void: var write_data: Dictionary = {port_isa: data_isa} send_array.append(['wr', write_data]) @@ -185,7 +185,7 @@ func state_machine_fs(): func connect_fs(): if client_fs_1: disconnect_fs(client_fs_1) - + client_fs_1 = StreamPeerTCP.new() peerstream_fs_1 = PacketPeerStream.new() var rc = client_fs_1.connect_to_host(ip_fs_1, Constants.PORT_FS) @@ -201,7 +201,7 @@ func send_data(data_to_sand: PackedByteArray): var peer = peerstream_fs_1.get_stream_peer() if peer: peer.put_data(data_to_sand) - emit_signal("data_send") + emit_signal("data_send") # Разорвать соединение с ФС diff --git a/scripts/nine-patch-button.gd b/scripts/nine-patch-button.gd new file mode 100644 index 0000000..a03ad20 --- /dev/null +++ b/scripts/nine-patch-button.gd @@ -0,0 +1,86 @@ +@tool + +extends PanelContainer + +func set_text(val: String): $button.set_text(val) +func set_pressed(val: bool): $button.set_pressed(val) +func set_disabled(val: bool): disabled = val +func get_text(): return $button.get_text() +func is_pressed(): return $button.is_pressed() +func is_toggle_mode(): return $button.is_toggle_mode() + + +@export var texture_state0: Texture2D = preload('res://table/элемент-в.tscn::GradientTexture2D_d3qtt'): + set(val): $state.set_texture(val) + + +@export var texture_state1: Texture2D = preload('res://table/элемент-в.tscn::GradientTexture2D_k8o6s'): + set(val): $state.set_texture(val) + + +@export var strips_rotation: float = 0.0: + set(val): + strips_rotation = val + $back.strips_rotation = deg_to_rad(val) + get: return strips_rotation + + +@export var text: String = '': + set(val): $button.set_text(val) + get: return $button.get_text() + + +@export var disabled: bool = false: + set(val): + disabled = val + $button.set_disabled(val) + $back.disabled = val + $state.modulate.a = 0.5 if val else 1.0 + get: return disabled + + +@export var pressed: bool = false: + set(val): + pressed = val + $button.set_pressed(val) + get: + return pressed + + +@export var toggle_mode: bool = false: + set(val): + toggle_mode = val + $button.set_toggle_mode(val) + get: + return toggle_mode + + +func button_connect(button_signal: String, proc: Callable): + var rc = $button.connect(button_signal, proc) + if rc != Error.OK: + push_error('возникла ошибка \"%s\" при подключении сигнала \"%s\" к обработчику \"%s\"' % [error_string(rc), button_signal, proc]) + + +func _on_resized() -> void: + $back.scale = size + $back.material.set('shader_parameter/scale', size / Vector2(20.0, 20.0)) + + +func _enter_tree() -> void: + $back.scale = size + $back.material.set('shader_parameter/scale', size / Vector2(20.0, 20.0)) + $button.set_toggle_mode(true) + $button.connect('toggled', _on_button_toggled) + + +func _exit_tree() -> void: + $button.disconnect('toggled', _on_button_toggled) + + +func set_toggle_mode(val: bool): + $button.set_toggle_mode(val) + + +func _on_button_toggled(val: bool): + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) diff --git a/table/элемент-в.tscn b/table/элемент-в.tscn index 7449675..b2ea5f0 100644 --- a/table/элемент-в.tscn +++ b/table/элемент-в.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=15 format=3 uid="uid://p2suppildvq0"] +[gd_scene load_steps=12 format=3 uid="uid://p2suppildvq0"] +[ext_resource type="Texture2D" uid="uid://ce3qpf070wgd2" path="res://состояние-исправности-0.png" id="1_2n7he"] [ext_resource type="Texture2D" uid="uid://cgtg4gbqnuxrc" path="res://nine-patch-round.png" id="2_4b43i"] +[ext_resource type="Texture2D" uid="uid://byweg7pgt8o4h" path="res://состояние-исправности-1.png" id="2_38t58"] [ext_resource type="Shader" path="res://opt_btn.gdshader" id="2_ecsml"] [ext_resource type="Texture2D" uid="uid://dkef6xwxwdxi8" path="res://эмс-бланк.png" id="3_4kmgr"] +[ext_resource type="Texture2D" uid="uid://bvikuv0lbvou8" path="res://состояние-исправности-2.png" id="3_i2t3v"] [ext_resource type="Texture2D" uid="uid://b15flrfytxkop" path="res://эмс-бланк-пост.png" id="4_omove"] [ext_resource type="Texture2D" uid="uid://ijdfo2mml54" path="res://эмс-бланк-перем.png" id="5_jia67"] @@ -44,8 +47,8 @@ func _resize_children() -> void: $lbl_rname.position.y = margins[0] $lbl_fname.size.y = size.x $lbl_fname.position.y = size.y / 2 + $lbl_fname.size.x / 2 - $light_ind.position.x = size.x / 2 - ($light_ind.size.x * $light_ind.scale.x) / 2 - $light_ind.position.y = size.y - $light_ind.size.y * $light_ind.scale.x - margins[2] + $txr_state.position.x = size.x / 2 - ($txr_state.size.x * $txr_state.scale.x) / 2 + $txr_state.position.y = size.y - $txr_state.size.y * $txr_state.scale.x - margins[2] func _on_nine_patch_rect_resized() -> void: @@ -75,37 +78,6 @@ shader = ExtResource("2_ecsml") shader_parameter/range = 0.4 shader_parameter/color = Color(0.764706, 0.764706, 0.764706, 1) -[sub_resource type="Gradient" id="Gradient_x8k3w"] -colors = PackedColorArray(1, 1, 1, 1, 0.393086, 0.393086, 0.393085, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_cgu2r"] -gradient = SubResource("Gradient_x8k3w") -width = 25 -height = 25 -fill = 1 -fill_from = Vector2(0.5, 0.5) -fill_to = Vector2(1.125, 0) - -[sub_resource type="Gradient" id="Gradient_1tk1g"] -colors = PackedColorArray(0.1, 1, 0.1, 1, 0.124744, 0.328804, 0.202483, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_d3qtt"] -gradient = SubResource("Gradient_1tk1g") -width = 25 -height = 25 -fill = 1 -fill_from = Vector2(0.5, 0.5) - -[sub_resource type="Gradient" id="Gradient_6e32x"] -colors = PackedColorArray(1, 0.1, 0.1, 1, 0.329, 0.125, 0.202, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_k8o6s"] -gradient = SubResource("Gradient_6e32x") -width = 25 -height = 25 -fill = 1 -fill_from = Vector2(0.5, 0.5) - [sub_resource type="SpriteFrames" id="SpriteFrames_nofpw"] animations = [{ "frames": [{ @@ -133,7 +105,7 @@ anchors_preset = 0 offset_right = 50.0 offset_bottom = 150.0 script = SubResource("GDScript_fbktk") -textures = Array[Texture]([ExtResource("2_4b43i"), ExtResource("2_4b43i"), ExtResource("2_4b43i")]) +textures = Array[Texture]([ExtResource("1_2n7he"), ExtResource("2_38t58"), ExtResource("3_i2t3v")]) metadata/ref_des = "" metadata/dec_num = "" @@ -160,19 +132,16 @@ text = "Ячейка" horizontal_alignment = 1 vertical_alignment = 1 -[node name="light_ind" type="TextureButton" parent="."] +[node name="txr_state" type="TextureRect" parent="."] material = SubResource("ShaderMaterial_45ast") layout_mode = 0 -offset_left = 13.0 -offset_top = 114.0 -offset_right = 38.0 -offset_bottom = 139.0 +offset_left = 14.0 +offset_top = 116.0 +offset_right = 238.0 +offset_bottom = 340.0 +scale = Vector2(0.1, 0.1) size_flags_vertical = 6 -toggle_mode = true -button_mask = 0 -texture_normal = SubResource("GradientTexture2D_cgu2r") -texture_pressed = SubResource("GradientTexture2D_d3qtt") -texture_disabled = SubResource("GradientTexture2D_k8o6s") +texture = ExtResource("1_2n7he") [node name="np_rect" type="NinePatchRect" parent="."] layout_mode = 0 diff --git a/состояние-исправности-0.png b/состояние-исправности-0.png new file mode 100644 index 0000000000000000000000000000000000000000..33966d1ec3af8bef1ca840fc33cf3c0883d6ab5e GIT binary patch literal 4148 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 literal 0 HcmV?d00001 diff --git a/состояние-исправности-2.png.import b/состояние-исправности-2.png.import new file mode 100644 index 0000000..aa075f9 --- /dev/null +++ b/состояние-исправности-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvikuv0lbvou8" +path="res://.godot/imported/состояние-исправности-2.png-deccaddb215e53d76d5a2f5971888569.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://состояние-исправности-2.png" +dest_files=["res://.godot/imported/состояние-исправности-2.png-deccaddb215e53d76d5a2f5971888569.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1