75 lines
1.7 KiB
GDScript

###
### math utility
###
extends Object
class_name GDBMath
################
# public stuff #
################
func _init():
assert(0, "This class should not be instantiated.")
static func angle(vec0 : Vector3, vec1 : Vector3, axis : Vector3) -> float:
var res = vec0.angle_to(vec1)
var crs = axis.cross(vec0)
var dir = vec1 - vec0
if dir.dot(crs) < 0:
return -res
else:
return res
static func find_perp(a : Vector3, b : Vector3, d : Vector3) -> Vector3:
var t0 = d.dot(a)
var t1 = d.dot(b)
if t0 - t1 < 0.01:
return a
var t = -t1 / (t0 - t1)
# assert(t >= 0 && t <= 1)
var n = b.lerp(a, t).normalized()
var an = n.angle_to(d)
assert(abs(n.dot(d)) < 0.01)
assert(abs(an - 0.5 * PI) < 0.01)
return n
static func rects_intersect(pos0 : Vector2, size0 : Vector2, pos1 : Vector2, size1 : Vector2) -> bool:
if pos0.x + size0.x < pos1.x || pos1.x + size1.x < pos0.x:
return false
if pos0.y + size0.y < pos1.y || pos1.y + size1.y < pos1.y:
return false
return true
static func min_element(array : Array) -> int:
var min_idx := -1
for idx in range(array.size()):
if min_idx == -1 || array[min_idx] > array[idx]:
min_idx = idx
return min_idx
static func max_element(array : Array) -> int:
var min_idx := -1
for idx in range(array.size()):
if min_idx == -1 || array[min_idx] < array[idx]:
min_idx = idx
return min_idx
static func to_int(any, default := 0) -> int:
if any is int:
return any
elif any is bool || any is float || any is String:
return int(any)
else:
return default
static func to_float(any, default := 0.0) -> float:
if any is float:
return any
elif any is bool || any is int || any is String:
return float(any)
else:
return default