Remove dependency on headers

This commit is contained in:
Ruslan Mustakov 2017-07-27 18:44:23 +07:00
commit 2fd1efcc4e
42 changed files with 1280 additions and 3614 deletions

View file

@ -1,148 +1,241 @@
# Copyright (c) 2017 Xored Software, Inc.
type
Vector3* {.importc: "godot_vector3", header: "godot/vector3.h",
byref.} = object
import godotbase, basis, strings
import math
import godotbase, strings
type
Vector3Axis {.importc: "godot_vector3_axis", header: "godot/vector3.h",
size: sizeof(cint), pure.} = enum
X,
Y,
Z
Vector3* {.byref.} = object
x*: float32
y*: float32
z*: float32
proc initVector3*(dest: var Vector3; x, y, z: float32) {.
importc: "godot_vector3_new", header: "godot/vector3.h".}
proc vec3*(): Vector3 {.inline.} =
Vector3()
proc vec3*(x, y, z: float32): Vector3 {.inline.} =
initVector3(result, x, y, z)
Vector3(x: x, y: y, z: z)
proc toGodotString*(self: Vector3): GodotString {.
importc: "godot_vector3_as_string", header: "godot/vector3.h".}
proc `$`*(self: Vector3): string {.inline.} =
$self.toGodotString()
result = newStringOfCap(40)
result.add('(')
result.add($self.x)
result.add(", ")
result.add($self.y)
result.add(", ")
result.add($self.z)
result.add(')')
proc minAxis*(self: Vector3): cint {.
importc: "godot_vector3_min_axis", header: "godot/vector3.h".}
proc maxAxis*(self: Vector3): cint {.
importc: "godot_vector3_max_axis", header: "godot/vector3.h".}
proc length*(self: Vector3): float32 {.
importc: "godot_vector3_length", header: "godot/vector3.h".}
proc lengthSquared*(self: Vector3): float32 {.
importc: "godot_vector3_length_squared", header: "godot/vector3.h".}
proc isNormalized*(self: Vector3): bool {.
importc: "godot_vector3_is_normalized", header: "godot/vector3.h".}
proc normalized*(self: Vector3): Vector3 {.
importc: "godot_vector3_normalized", header: "godot/vector3.h".}
proc inverse*(self: Vector3): Vector3 {.
importc: "godot_vector3_inverse", header: "godot/vector3.h".}
proc snapped*(self: Vector3; by: float32): Vector3 {.
importc: "godot_vector3_snapped", header: "godot/vector3.h".}
proc rotated*(self: Vector3; axis: Vector3;
phi: float32): Vector3 {.
importc: "godot_vector3_rotated", header: "godot/vector3.h".}
proc lerp*(self: Vector3; b: Vector3; t: float32): Vector3 {.
importc: "godot_vector3_linear_interpolate", header: "godot/vector3.h".}
proc cubicInterpolate*(self, b, preA, postB: Vector3;
t: float32): Vector3 {.
importc: "godot_vector3_cubic_interpolate", header: "godot/vector3.h".}
proc dot*(a, b: Vector3): float32 {.
importc: "godot_vector3_dot", header: "godot/vector3.h".}
proc cross*(a, b: Vector3): Vector3 {.
importc: "godot_vector3_cross", header: "godot/vector3.h".}
proc outer*(a, b: Vector3): Basis {.
importc: "godot_vector3_outer", header: "godot/vector3.h".}
proc toDiagonalMatrix*(self: Vector3): Basis {.
importc: "godot_vector3_to_diagonal_matrix", header: "godot/vector3.h".}
proc abs*(self: Vector3): Vector3 {.
importc: "godot_vector3_abs", header: "godot/vector3.h".}
proc floor*(self: Vector3): Vector3 {.
importc: "godot_vector3_floor", header: "godot/vector3.h".}
proc ceil*(self: Vector3): Vector3 {.
importc: "godot_vector3_ceil", header: "godot/vector3.h".}
proc distanceTo*(a, b: Vector3): float32 {.
importc: "godot_vector3_distance_to", header: "godot/vector3.h".}
proc distanceSquaredTo*(a, b: Vector3): float32 {.
importc: "godot_vector3_distance_squared_to", header: "godot/vector3.h".}
proc angleTo*(self, to: Vector3): float32 {.
importc: "godot_vector3_angle_to", header: "godot/vector3.h".}
proc slide*(self, n: Vector3): Vector3 {.
importc: "godot_vector3_slide", header: "godot/vector3.h".}
proc bounce*(self, n: Vector3): Vector3 {.
importc: "godot_vector3_bounce", header: "godot/vector3.h".}
proc reflect*(self, b: Vector3): Vector3 {.
importc: "godot_vector3_reflect", header: "godot/vector3.h".}
proc `+`*(a, b: Vector3): Vector3 {.inline.} =
result.x = a.x + b.x
result.y = a.y + b.y
result.z = a.z + b.z
proc `+`*(a, b: Vector3): Vector3 {.
importc: "godot_vector3_operator_add", header: "godot/vector3.h".}
proc `+=`*(a: var Vector3, b: Vector3) {.inline.} =
a = a + b
a.x += b.x
a.y += b.y
a.z += b.z
proc `-`*(a, b: Vector3): Vector3 {.inline.} =
result.x = a.x - b.x
result.y = a.y - b.y
result.z = a.z - b.z
proc `-`*(a, b: Vector3): Vector3 {.
importc: "godot_vector3_operator_substract", header: "godot/vector3.h".}
proc `-=`*(a: var Vector3, b: Vector3) {.inline.} =
a = a - b
a.x -= b.x
a.y -= b.y
a.z -= b.z
proc `*`*(a, b: Vector3): Vector3 {.inline.} =
result.x = a.x * b.x
result.y = a.y * b.y
result.z = a.z * b.z
proc `*`*(a, b: Vector3): Vector3 {.
importc: "godot_vector3_operator_multiply_vector",
header: "godot/vector3.h".}
proc `*=`*(a: var Vector3, b: Vector3) {.inline.}=
a = a * b
a.x *= b.x
a.y *= b.y
a.z *= b.z
proc `*`*(a: Vector3; b: float32): Vector3 {.inline.} =
result.x = a.x * b
result.y = a.y * b
result.z = a.z * b
proc `*`*(b: float32; a: Vector3): Vector3 {.inline.} =
a * b
proc `*`*(self: Vector3; b: float32): Vector3 {.
importc: "godot_vector3_operator_multiply_scalar",
header: "godot/vector3.h".}
proc `*=`*(a: var Vector3; b: float32) {.inline.} =
a = a * b
a.x *= b
a.y *= b
a.z *= b
proc `/`*(a, b: Vector3): Vector3 =
result.x = a.x / b.x
result.y = a.y / b.y
result.z = a.z / b.z
proc `/`*(a, b: Vector3): Vector3 {.
importc: "godot_vector3_operator_divide_vector",
header: "godot/vector3.h".}
proc `/=`*(a: var Vector3; b: Vector3) {.inline.} =
a = a / b
a.x /= b.x
a.y /= b.y
a.z /= b.z
proc `/`*(a: Vector3; b: float32): Vector3 =
result.x = a.x / b
result.y = a.y / b
result.z = a.z / b
proc `/`*(self: Vector3; b: float32): Vector3 {.
importc: "godot_vector3_operator_divide_scalar",
header: "godot/vector3.h".}
proc `/=`*(a: var Vector3; b: float32) {.inline.} =
a = a / b
a.x /= b
a.y /= b
a.z /= b
proc `==`*(a, b: Vector3): bool {.
importc: "godot_vector3_operator_equal", header: "godot/vector3.h".}
proc `<`*(a, b: Vector3): bool {.
importc: "godot_vector3_operator_less", header: "godot/vector3.h".}
proc `-`*(self: Vector3): Vector3 {.
importc: "godot_vector3_operator_neg", header: "godot/vector3.h".}
proc `==`*(a, b: Vector3): bool {.inline.} =
a.x == b.x and a.y == b.y and a.z == b.z
proc setAxis(self: var Vector3; axis: Vector3Axis;
val: float32) {.
importc: "godot_vector3_set_axis", header: "godot/vector3.h".}
proc getAxis(self: Vector3; axis: Vector3Axis): float32 {.
importc: "godot_vector3_get_axis", header: "godot/vector3.h".}
proc `<`*(a, b: Vector3): bool =
if a.x == b.x:
if a.y == b.y:
return a.z < b.z
return a.y < b.y
return a.x < b.x
proc `[]`(self: Vector3, idx: range[0..2]): float32 {.inline.} =
self.getAxis(Vector3Axis(idx))
proc `-`*(self: Vector3): Vector3 =
result.x = -self.x
result.y = -self.y
result.z = -self.z
proc `[]=`(self: var Vector3, idx: range[0..2],
val: float32): float32 {.inline.} =
self.setAxis(Vector3Axis(idx), val)
proc `[]`*(self: Vector3, idx: range[0..2]): float32 {.inline.} =
cast[array[3, float32]](self)[idx]
proc x*(self: Vector3): float32 {.inline.} =
self.getAxis(Vector3Axis.X)
proc `[]`*(self: var Vector3, idx: range[0..2]): var float32 {.inline.} =
cast[ptr array[3, float32]](addr self)[][idx]
proc `x=`*(self: var Vector3, val: float32) {.inline.} =
self.setAxis(Vector3Axis.X, val)
proc `[]=`*(self: var Vector3, idx: range[0..2],
val: float32) {.inline.} =
case idx:
of 0: self.x = val
of 1: self.y = val
of 2: self.z = val
proc y*(self: Vector3): float32 {.inline.} =
self.getAxis(Vector3Axis.Y)
proc minAxis*(self: Vector3): int {.inline.} =
if self.x < self.y:
if self.x < self.z: 0 else: 2
else:
if self.y < self.z: 1 else: 2
proc `y=`*(self: var Vector3, val: float32) {.inline.} =
self.setAxis(Vector3Axis.Y, val)
proc maxAxis*(self: Vector3): int {.inline.} =
if self.x < self.y:
if self.y < self.z: 2 else: 1
else:
if self.x < self.z: 2 else: 0
proc z*(self: Vector3): float32 {.inline.} =
self.getAxis(Vector3Axis.Z)
proc length*(self: Vector3): float32 {.inline.} =
let x2 = self.x * self.x
let y2 = self.y * self.y
let z2 = self.z * self.z
proc `z=`*(self: var Vector3, val: float32) {.inline.} =
self.setAxis(Vector3Axis.Z, val)
result = sqrt(x2 + y2 + z2)
proc lengthSquared*(self: Vector3): float32 {.inline.} =
let x2 = self.x * self.x
let y2 = self.y * self.y
let z2 = self.z * self.z
result = x2 + y2 + z2
proc normalize*(self: var Vector3) {.inline.} =
let len = self.length()
if len == 0:
self.x = 0
self.y = 0
self.z = 0
else:
self.x /= len
self.y /= len
self.z /= len
proc normalized*(self: Vector3): Vector3 {.inline.} =
result = self
result.normalize()
proc isNormalized*(self: Vector3): bool {.inline.} =
self.lengthSquared().isEqualApprox(1.0'f32)
proc zero*(self: var Vector3) {.inline.} =
self.x = 0
self.y = 0
self.z = 0
proc inverse*(self: Vector3): Vector3 {.inline.} =
vec3(1.0'f32 / self.x, 1.0'f32 / self.y, 1.0'f32 / self.z)
proc cross*(self, other: Vector3): Vector3 {.inline.} =
vec3(
self.y * other.z - self.z * other.y,
self.z * other.x - self.x * other.z,
self.x * other.y - self.y * other.x)
proc dot*(self, other: Vector3): float32 {.inline.} =
self.x * other.x + self.y * other.y + self.z * other.z
proc abs*(self: Vector3): Vector3 {.inline.} =
vec3(abs(self.x), abs(self.y), abs(self.z))
proc sign*(self: Vector3): Vector3 {.inline.} =
vec3(sign(self.x), sign(self.y), sign(self.z))
proc floor*(self: Vector3): Vector3 {.inline.} =
vec3(floor(self.x), floor(self.y), floor(self.z))
proc ceil*(self: Vector3): Vector3 {.inline.} =
vec3(ceil(self.x), ceil(self.y), ceil(self.z))
proc lerp*(self: Vector3, other: Vector3, t: float32): Vector3 {.inline.} =
vec3(
self.x + t * (other.x - self.x),
self.y + t * (other.y - self.y),
self.z + t * (other.z - self.z)
)
proc distanceTo*(self, other: Vector3): float32 {.inline.} =
(other - self).length()
proc distanceSquaredTo*(self, other: Vector3): float32 {.inline.} =
(other - self).lengthSquared()
proc angleTo*(self, other: Vector3): float32 {.inline.} =
arctan2(self.cross(other).length(), self.dot(other))
proc slide*(self, n: Vector3): Vector3 {.inline.} =
assert(n.isNormalized())
result = self - n * self.dot(n)
proc reflect*(self, n: Vector3): Vector3 {.inline.} =
assert(n.isNormalized())
result = 2.0'f32 * n * self.dot(n) - self
proc bounce*(self, n: Vector3): Vector3 {.inline.} =
-self.reflect(n)
proc snap*(self: var Vector3, other: Vector3) =
self.x = stepify(self.x, other.x)
self.y = stepify(self.y, other.y)
self.z = stepify(self.z, other.z)
proc snapped*(self: Vector3, other: Vector3): Vector3 =
result = self
result.snap(other)
proc cubicInterpolate*(self, b, preA, postB: Vector3;
t: float32): Vector3 =
let p0 = preA
let p1 = self
let p2 = b
let p3 = postB
let t2 = t * t
let t3 = t2 * t
result = 0.5 * ((p1 * 2.0) +
(-p0 + p2) * t +
(2.0 * p0 - 5.0 * p1 + 4 * p2 - p3) * t2 +
(-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t3)