aboutsummaryrefslogtreecommitdiff
path: root/game/addons/zylann.hterrain/tools/texture_editor/texture_editor.gd
blob: e3e337fde03be554cfb22d48c2ad14fe0d36b54e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
@tool
extends Control

const HTerrain = preload("../../hterrain.gd")
const HTerrainTextureSet = preload("../../hterrain_texture_set.gd")
const HT_TextureList = preload("./texture_list.gd")
const HT_Logger = preload("../../util/logger.gd")
# TODO Can't preload because it causes the plugin to fail loading if assets aren't imported
const EMPTY_ICON_TEXTURE_PATH = "res://addons/zylann.hterrain/tools/icons/empty.png"

signal texture_selected(index)
signal edit_pressed(index)
signal import_pressed

@onready var _textures_list: HT_TextureList = $TextureList
@onready var _buttons_container : HBoxContainer = $HBoxContainer

var _terrain : HTerrain = null
var _texture_set : HTerrainTextureSet = null

var _texture_list_need_update := false
var _empty_icon : Texture2D

var _logger = HT_Logger.get_for(self)


func _ready():
   _empty_icon = load(EMPTY_ICON_TEXTURE_PATH)
   if _empty_icon == null:
      _logger.error(str("Failed to load empty icon ", EMPTY_ICON_TEXTURE_PATH))
   
   # Default amount, will be updated when a terrain is assigned
   _textures_list.clear()
   for i in range(4):
      _textures_list.add_item(str(i), _empty_icon)


func set_terrain(terrain: HTerrain):
   _terrain = terrain


static func _get_slot_count(terrain: HTerrain) -> int:
   var texture_set = terrain.get_texture_set()
   if texture_set == null:
      return 0
   return texture_set.get_slots_count()


func _process(delta: float):
   var texture_set = null
   if _terrain != null:
      texture_set = _terrain.get_texture_set()

   if _texture_set != texture_set:
      if _texture_set != null:
         _texture_set.changed.disconnect(_on_texture_set_changed)

      _texture_set = texture_set

      if _texture_set != null:
         _texture_set.changed.connect(_on_texture_set_changed)

      _update_texture_list()

   if _texture_list_need_update:
      _update_texture_list()
      _texture_list_need_update = false


func _on_texture_set_changed():
   _texture_list_need_update = true


func _update_texture_list():
   _textures_list.clear()

   if _terrain == null:
      _set_buttons_active(false)
      return
   var texture_set := _terrain.get_texture_set()
   if texture_set == null:
      _set_buttons_active(false)
      return
   _set_buttons_active(true)

   var slots_count := texture_set.get_slots_count()

   match texture_set.get_mode():
      HTerrainTextureSet.MODE_TEXTURES:
         for slot_index in slots_count:
            var texture := texture_set.get_texture(
               slot_index, HTerrainTextureSet.TYPE_ALBEDO_BUMP)
            var hint := _get_slot_hint_name(slot_index, _terrain.get_shader_type())
            if texture == null:
               texture = _empty_icon
            _textures_list.add_item(hint, texture)

      HTerrainTextureSet.MODE_TEXTURE_ARRAYS:
         var texture_array = texture_set.get_texture_array(HTerrainTextureSet.TYPE_ALBEDO_BUMP)
         for slot_index in slots_count:
            var hint := _get_slot_hint_name(slot_index, _terrain.get_shader_type())
            _textures_list.add_item(hint, texture_array, slot_index)


func _set_buttons_active(active: bool):
   for i in _buttons_container.get_child_count():
      var child = _buttons_container.get_child(i)
      if child is Button:
         child.disabled = not active


static func _get_slot_hint_name(i: int, stype: String) -> String:
   if i == 3 and (stype == HTerrain.SHADER_CLASSIC4 or stype == HTerrain.SHADER_CLASSIC4_LITE):
      return "cliff"
   return str(i)


func _on_TextureList_item_selected(index: int):
   texture_selected.emit(index)


func _on_TextureList_item_activated(index: int):
   edit_pressed.emit(index)


func _on_EditButton_pressed():
   var selected_slot := _textures_list.get_selected_item()
   if selected_slot == -1:
      selected_slot = 0
   edit_pressed.emit(selected_slot)


func _on_ImportButton_pressed():
   import_pressed.emit()