#ifndef prbm_h #define prbm_h #include "types.h" #define v2_zero (v2){ 0.0f, 0.0f} #define v2_one (v2){ 1.0f, 1.0f} #define v2_right (v2){ 1.0f, 0.0f} #define v2_up (v2){ 0.0f, 1.0f} #define v2_left (v2){-1.0f, 0.0f} #define v2_down (v2){ 0.0f, -1.0f} #define v3_zero (v3){ 0.0f, 0.0f, 0.0f} #define v3_one (v3){ 1.0f, 1.0f, 1.0f} #define v3_right (v3){ 1.0f, 0.0f, 0.0f} #define v3_up (v3){ 0.0f, 1.0f, 0.0f} #define v3_left (v3){-1.0f, 0.0f, 0.0f} #define v3_down (v3){ 0.0f, -1.0f, 0.0f} #define v3_forward (v3){ 0.0f, 0.0f, 1.0f} #define v3_backward (v3){ 0.0f, 0.0f, -1.0f} #define v4_zero (v4){0.0f, 0.0f, 0.0f, 0.0f} #define v4_one (v4){1.0f, 1.0f, 1.0f, 1.0f} #define mat_identity (mat){ \ {1.0f, 0.0f, 0.0f, 0.0f}, \ {0.0f, 1.0f, 0.0f, 0.0f}, \ {0.0f, 0.0f, 1.0f, 0.0f}, \ {0.0f, 0.0f, 0.0f, 1.0f}} #define f32pi 3.14159265359f #define deg2rad(angle) (f32pi/180.0f*(angle)) typedef struct { f32 x; f32 y; } v2; typedef struct { f32 x; f32 y; f32 z; } v3; typedef struct { f32 x; f32 y; f32 z; f32 w; } v4; // column-major typedef struct { v4 c0; v4 c1; v4 c2; v4 c3; } mat; typedef struct { v2 start; v2 end; } rect; v2 fillv2(f32 a); v2 invv2(v2 a); v2 addv2(v2 a, v2 b); v2 subv2(v2 a, v2 b); v2 scalev2(v2 a, f32 s); v2 scalevv2(v2 a, v2 s); f32 dotv2(v2 a, v2 b); f32 len2v2(v2 a); f32 lenv2(v2 a); v2 normv2(v2 a); v3 fillv3(f32 a); v3 invv3(v3 a); v3 addv3(v3 a, v3 b); v3 subv3(v3 a, v3 b); v3 scalev3(v3 a, f32 s); v3 scalevv3(v3 a, v3 s); f32 dotv3(v3 a, v3 b); v3 crossv3(v3 l, v3 r); f32 len2v3(v3 a); f32 lenv3(v3 a); v3 normv3(v3 a); v3 maxv3(v3 a, v3 b); v4 fillv4(f32 a); v4 invv4(v4 a); v4 addv4(v4 a, v4 b); v4 subv4(v4 a, v4 b); v4 scalev4(v4 a, f32 s); v4 scalevv4(v4 a, v4 s); f32 dotv4(v4 a, v4 b); f32 len2v4(v4 a); f32 lenv4(v4 a); v4 normv4(v4 a); mat transpose_mat(mat m); mat mulmat(mat left, mat right); mat make_translate(v3 v); mat make_scale(v3 v); mat make_rotate(v3 x, v3 y, v3 z); mat translate_mat(mat m, v3 v); mat scale_mat(mat m, v3 v); mat rotate_mat(mat m, v3 angles); v4 mulmatv4(mat m, v4 v); i32 in_rect(v2 pos, rect r); #endif