75 lines
1.7 KiB
GDScript
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
|