#include #include #include #define x(T) \ struct kf_vec2(T) kf_normalize_vec2##T(struct kf_vec2(T) v) \ { \ Vector2 v2 = Vector2Normalize((Vector2){v.x, v.y}); \ return (struct kf_vec2(T)){v2.x, v2.y}; \ } _kf_mathdef(x) #undef x #define x(T) \ struct kf_vec2(T) kf_add_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x+b.x, a.y+b.y}; } \ struct kf_vec2(T) kf_sub_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x-b.x, a.y-b.y}; } \ struct kf_vec2(T) kf_mul_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x*b.x, a.y*b.y}; } \ struct kf_vec2(T) kf_div_vec2##T(struct kf_vec2(T) a, struct kf_vec2(T) b) { return (struct kf_vec2(T)){a.x/b.x, a.y/b.y}; } \ struct kf_vec2(T) kf_addval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x+val, a.y+val}; } \ struct kf_vec2(T) kf_subval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x-val, a.y-val}; } \ struct kf_vec2(T) kf_mulval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x*val, a.y*val}; } \ struct kf_vec2(T) kf_divval_vec2##T(struct kf_vec2(T) a, T val) { return (struct kf_vec2(T)){a.x/val, a.y/val}; } \ struct kf_vec2(T) kf_vec2##T##_x(struct kf_vec2(T) a) { return (struct kf_vec2(T)){a.x, 0}; } \ struct kf_vec2(T) kf_vec2##T##_y(struct kf_vec2(T) a) { return (struct kf_vec2(T)){0, a.y}; } _kf_mathdef(x) #undef x static int _kf_isdir(enum kf_direction dir) { return dir >= kf_north && dir <= kf_west; } enum kf_direction kf_rotatecw(enum kf_direction dir) { return _kf_isdir(dir+1) ? kf_north : dir+1; } enum kf_direction kf_rotateccw(enum kf_direction dir) { return _kf_isdir(dir-1) ? kf_west : dir-1; } struct kf_vec2(f32) kf_dtov2f(enum kf_direction dir) { switch (dir) { case kf_north: return (struct kf_vec2(f32)){ -1, 0 }; case kf_east: return (struct kf_vec2(f32)){ 0, 1 }; case kf_south: return (struct kf_vec2(f32)){ 1, 0 }; case kf_west: return (struct kf_vec2(f32)){ 0, -1 }; } return (struct kf_vec2(f32)){ 0, 0 }; }