Доработка. Улучшение документации.
This commit is contained in:
122
scripts/tools.gd
122
scripts/tools.gd
@@ -1,10 +1,10 @@
|
||||
@tool
|
||||
extends Node
|
||||
class_name Tools extends Node
|
||||
|
||||
## Простые часто используемые функции
|
||||
## Простые часто используемые функции.
|
||||
|
||||
|
||||
## Возвращает округлённое значение [param v] с точностью [param a]
|
||||
## Возвращает округлённое значение [param v] с точностью [param a].
|
||||
func round_to(v: float, a: float) -> float: return snappedf(v, -a if v < 0 else a)
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ func radians(val: float): return (val * PI) / 180.0
|
||||
func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256)
|
||||
|
||||
|
||||
## Возвращает расстояние от центра координат до точки
|
||||
## Возвращает расстояние от центра координат до точки.
|
||||
func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y)
|
||||
|
||||
|
||||
@@ -30,14 +30,14 @@ func is_overlap(x1, x2, y1, y2) -> bool: return max(x1, y1) <= min(x2, y2)
|
||||
|
||||
|
||||
func _check_index(obj, index) -> bool:
|
||||
if obj is Dictionary:
|
||||
if obj.has(index):
|
||||
return true
|
||||
elif obj is Array:
|
||||
if index is int:
|
||||
if (index >= 0) and (index < obj.size()):
|
||||
return true
|
||||
return false
|
||||
if obj is Dictionary:
|
||||
if obj.has(index):
|
||||
return true
|
||||
elif obj is Array:
|
||||
if index is int:
|
||||
if (index >= 0) and (index < obj.size()):
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
## Возвращает значение поля хранящегося по указанному пути внутри объекта.[br]
|
||||
@@ -48,15 +48,15 @@ func _check_index(obj, index) -> bool:
|
||||
## [param ret_val[1]] - устанвлено в [b]true[/b], если поле найдено, и установлено в [b]false[/b],
|
||||
## если искомое поле не найдено.
|
||||
func get_value_by_path(obj, paths: Array, ret_val: Array):
|
||||
var index = paths.pop_at(0)
|
||||
ret_val[1] = false
|
||||
if paths.size():
|
||||
if _check_index(obj, index):
|
||||
get_value_by_path(obj[index], paths, ret_val)
|
||||
else:
|
||||
if _check_index(obj, index):
|
||||
ret_val[0] = obj[index]
|
||||
ret_val[1] = true
|
||||
var index = paths.pop_at(0)
|
||||
ret_val[1] = false
|
||||
if paths.size():
|
||||
if _check_index(obj, index):
|
||||
get_value_by_path(obj[index], paths, ret_val)
|
||||
else:
|
||||
if _check_index(obj, index):
|
||||
ret_val[0] = obj[index]
|
||||
ret_val[1] = true
|
||||
|
||||
|
||||
## Возвращает часть от входной строки ограниченную индексами символов.[br]
|
||||
@@ -65,75 +65,75 @@ func get_value_by_path(obj, paths: Array, ret_val: Array):
|
||||
## [param i0] - Индекс начала части строки.[br]
|
||||
## [param i1] - Индекс конца части строки. Возвращает все символы до этого индекса.
|
||||
func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int):
|
||||
for i in range(i0, i1):
|
||||
if s_in[i] != '\'':
|
||||
s_out[0] += s_in[i]
|
||||
for i in range(i0, i1):
|
||||
if s_in[i] != '\'':
|
||||
s_out[0] += s_in[i]
|
||||
|
||||
|
||||
## Производит преобразование из декартовой в полярную систему координат
|
||||
## Производит преобразование из декартовой в полярную систему координат.
|
||||
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float):
|
||||
var r = ((freq - f0) / (f1 - f0)) * r1 + r0
|
||||
var aoa_rad = radians(aoa) - PI / 2.0
|
||||
return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0
|
||||
var r = ((freq - f0) / (f1 - f0)) * r1 + r0
|
||||
var aoa_rad = radians(aoa) - PI / 2.0
|
||||
return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0
|
||||
|
||||
|
||||
## Отсекает значение до заданного диапазона
|
||||
## Отсекает значение до заданного диапазона.
|
||||
func clip_value(val, val_min, val_max):
|
||||
if val < val_min: val = val_min
|
||||
if val > val_max: val = val_max
|
||||
return val
|
||||
if val < val_min: val = val_min
|
||||
if val > val_max: val = val_max
|
||||
return val
|
||||
|
||||
|
||||
## Возвращает массив с именами членов [param obj]
|
||||
## Возвращает массив с именами членов [param obj].
|
||||
func get_members_names(obj: Object) -> Array:
|
||||
var pl = obj.get_property_list()
|
||||
var names: = Array()
|
||||
for item in pl: names.append(item.name)
|
||||
return names
|
||||
var pl = obj.get_property_list()
|
||||
var names: = Array()
|
||||
for item in pl: names.append(item.name)
|
||||
return names
|
||||
|
||||
|
||||
## Проверяет, что заданный массив [param val] похож на ip-адрес
|
||||
## Проверяет, что заданный массив [param val] похож на ip-адрес.
|
||||
func is_array_ipaddr(val: Array):
|
||||
return (val.size() == 2) \
|
||||
and (val[0] is String) \
|
||||
and (val[1] is int) \
|
||||
and (0 < val[1]) \
|
||||
and (val[1] < 65536)
|
||||
return (val.size() == 2) \
|
||||
and (val[0] is String) \
|
||||
and (val[1] is int) \
|
||||
and (0 < val[1]) \
|
||||
and (val[1] < 65536)
|
||||
|
||||
|
||||
## Преобразует декартовые координаты в полярные.[br]
|
||||
## [param pos0] - координаты центра.[br]
|
||||
## [param pos] - координаты точки.[br]
|
||||
func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2:
|
||||
var x1: float = pos.x - pos0.x
|
||||
var y1: float = pos.y - pos0.y
|
||||
var ang: float = (atan2(y1, x1) * 180.0) / PI
|
||||
return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1))
|
||||
var x1: float = pos.x - pos0.x
|
||||
var y1: float = pos.y - pos0.y
|
||||
var ang: float = (atan2(y1, x1) * 180.0) / PI
|
||||
return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1))
|
||||
|
||||
|
||||
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1
|
||||
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1.
|
||||
func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
|
||||
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
|
||||
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
|
||||
|
||||
|
||||
## Возвращает [b]true[/b], если точка внутри заданного полигона.[br]
|
||||
## [param pos] - Проверяемая точка.[br]
|
||||
## [param p] - Координаты вершин полигона.[br]
|
||||
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
|
||||
var sz: = p.size()
|
||||
assert(sz)
|
||||
var j: int = sz - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in sz:
|
||||
if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)):
|
||||
odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x))
|
||||
j = i
|
||||
return odd_nodes > 0
|
||||
var sz: = p.size()
|
||||
assert(sz)
|
||||
var j: int = sz - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in sz:
|
||||
if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)):
|
||||
odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x))
|
||||
j = i
|
||||
return odd_nodes > 0
|
||||
|
||||
|
||||
## Записывает слово [param val] в элемент байтовго массива [param buf]
|
||||
## Записывает слово [param val] в элемент байтовго массива [param buf].
|
||||
## расположенный по индексу [param index] (младшее слово).[br]
|
||||
## [i]Следует использовать встроенные в[/i] [b]PackedByteArray[/b] [i]методы вместо этой функции.[/i]
|
||||
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:
|
||||
buf[index] = val & 0xff
|
||||
buf[index + 1] = (val >> 8) & 0xff
|
||||
buf[index] = val & 0xff
|
||||
buf[index + 1] = (val >> 8) & 0xff
|
||||
|
||||
Reference in New Issue
Block a user