void intr_packet_box(const ray_packet* packet, const float* box_min, const float* box_max, const float* prev_tmin, int* hit) { for (int i = 0; i < 4; i++) { const float* org = packet->org + i * 4; const float* inv = packet->inv_dir + i * 4; float tmin[4], tmax[4]; vector3_subtract(box_max, org, tmax); vector3_subtract(box_min, org, tmin); vector3_scale3(tmax, inv, tmax); vector3_scale3(tmin, inv, tmin); float vmin[4], vmax[4]; vector3_max(tmax, tmin, vmax); vector3_min(tmax, tmin, vmin); vmax[0] = (vmax[0] < vmax[1]) ? vmax[0] : vmax[1]; vmax[0] = (vmax[0] < vmax[2]) ? vmax[0] : vmax[2]; vmin[0] = (vmin[0] > vmin[1]) ? vmin[0] : vmin[1]; vmin[0] = (vmin[0] > vmin[2]) ? vmin[0] : vmin[2]; hit[i] = (vmin[0] <= vmax[0]) && (vmax[0] >= 0) && (vmin[0] <= prev_tmin[i]); } }
void vector3_test() { vector3 zero = {0,0,0}; vector3 one = {1,1,1}; vector3 y = {0,1,0}; vector3 half = {0.5,0.5,0.5}; vector3 a; vector3_invert(&a, &one); vector3_subtract(&a, &one, &a); vector3_add(&a, &a, &one); vector3_print(&a); vector3_multiply(&a, &one, 0.5); vector3_divide(&a, &a, 2); vector3_print(&a); vector3_reflect(&a, &one, &y); vector3_print(&a); vector3_scalar_sub(&a, &zero, -0.5); vector3_scalar_add(&a, &a, 0.5); vector3_print(&a); vector3_cross(&a, &one, &y); vector3_print(&a); srand(3); vector3_random(&a); vector3_print(&a); printf("%.2f %.2f\n", vector3_dot(&half, &y), vector3_angle(&half, &y)); printf("%.2f %.2f\n", vector3_distance(&one, &y), vector3_distancesq(&one, &y)); vector3_copy(&a, &one); printf("%.2f %.2f\n", vector3_length(&one), vector3_length(vector3_normalize(&a)) ); }