예제 #1
0
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]);
    }
}
예제 #2
0
파일: vector3.c 프로젝트: tatref/misc
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)) );
}