#include #include df_v3 df_add_v3(df_v3 a, df_v3 b) { df_v3 v = {a.x + b.x, a.y + b.y, a.z + b.z}; return v; } df_v3 df_sub_v3(df_v3 a, df_v3 b) { df_v3 v = {a.x - b.x, a.y - b.y, a.z - b.z}; return v; } float df_dot_v3(df_v3 a, df_v3 b) { return a.x * b.x + a.y * b.y + a.z * b.z; } df_v3 df_mul_v3(float t, df_v3 v) { df_v3 r = {t * v.x, t * v.y, t * v.z}; return r; } df_v3 df_normalize_v3(df_v3 v) { float len_square = df_dot_v3(v, v); float len = sqrtf(len_square); df_v3 n = {v.x / len, v.y / len, v.z / len}; return n; } df_line_plane_intersection df_calc_line_plane_intersection(df_line line, df_plane plane) { /* check case */ float dot = df_dot_v3(line.direction, plane.normal); df_v3 base_diff = df_sub_v3(plane.base, line.base); float dot2 = df_dot_v3(base_diff, plane.normal); if (dot != 0) { float t = dot2 / dot; df_v3 point = df_add_v3(line.base, df_mul_v3(t, line.direction)); df_line_plane_intersection intersection = { .type = df_line_plane_intersection_vector, .vec = point, }; return intersection; } else { if (dot2 == 0) { df_line_plane_intersection intersection = { .type = df_line_plane_intersection_contained, }; return intersection; } else { df_line_plane_intersection intersection = { .type = df_line_plane_intersection_none, }; return intersection; } } }