### ### 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