8 #ifndef FASTAABBTRIANGLETEST_H_ 9 #define FASTAABBTRIANGLETEST_H_ 32 #define CROSS(dest,v1,v2) \ 33 dest[0]=v1[1]*v2[2]-v1[2]*v2[1]; \ 34 dest[1]=v1[2]*v2[0]-v1[0]*v2[2]; \ 35 dest[2]=v1[0]*v2[1]-v1[1]*v2[0]; 37 #define DOT(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]) 39 #define SUB(dest,v1,v2) \ 40 dest[0]=v1[0]-v2[0]; \ 41 dest[1]=v1[1]-v2[1]; \ 44 #define FINDMINMAX(x0,x1,x2,min,max) \ 54 float vmin[3], vmax[3], v;
55 for (q =
X; q <=
Z; q++)
60 vmin[q] = -maxbox[q] - v;
61 vmax[q] = maxbox[q] - v;
65 vmin[q] = maxbox[q] - v;
66 vmax[q] = -maxbox[q] - v;
69 if (
DOT(normal,vmin) > 0.0f)
71 if (
DOT(normal,vmax) >= 0.0f)
77 #define AXISTEST_X01(a, b, fa, fb) \ 78 p0 = a*v0[Y] - b*v0[Z]; \ 79 p2 = a*v2[Y] - b*v2[Z]; \ 80 if(p0<p2) {min=p0; max=p2;} else {min=p2; max=p0;} \ 81 rad = fa * boxhalfsize[Y] + fb * boxhalfsize[Z]; \ 82 if(min>rad || max<-rad) return 0; 83 #define AXISTEST_X2(a, b, fa, fb) \ 84 p0 = a*v0[Y] - b*v0[Z]; \ 85 p1 = a*v1[Y] - b*v1[Z]; \ 86 if(p0<p1) {min=p0; max=p1;} else {min=p1; max=p0;} \ 87 rad = fa * boxhalfsize[Y] + fb * boxhalfsize[Z]; \ 88 if(min>rad || max<-rad) return 0; 91 #define AXISTEST_Y02(a, b, fa, fb) \ 92 p0 = -a*v0[X] + b*v0[Z]; \ 93 p2 = -a*v2[X] + b*v2[Z]; \ 94 if(p0<p2) {min=p0; max=p2;} else {min=p2; max=p0;} \ 95 rad = fa * boxhalfsize[X] + fb * boxhalfsize[Z]; \ 96 if(min>rad || max<-rad) return 0; 98 #define AXISTEST_Y1(a, b, fa, fb) \ 99 p0 = -a*v0[X] + b*v0[Z]; \ 100 p1 = -a*v1[X] + b*v1[Z]; \ 101 if(p0<p1) {min=p0; max=p1;} else {min=p1; max=p0;} \ 102 rad = fa * boxhalfsize[X] + fb * boxhalfsize[Z]; \ 103 if(min>rad || max<-rad) return 0; 106 #define AXISTEST_Z12(a, b, fa, fb) \ 107 p1 = a*v1[X] - b*v1[Y]; \ 108 p2 = a*v2[X] - b*v2[Y]; \ 109 if(p2<p1) {min=p2; max=p1;} else {min=p1; max=p2;} \ 110 rad = fa * boxhalfsize[X] + fb * boxhalfsize[Y]; \ 111 if(min>rad || max<-rad) return 0; 112 #define AXISTEST_Z0(a, b, fa, fb) \ 113 p0 = a*v0[X] - b*v0[Y]; \ 114 p1 = a*v1[X] - b*v1[Y]; \ 115 if(p0<p1) {min=p0; max=p1;} else {min=p1; max=p0;} \ 116 rad = fa * boxhalfsize[X] + fb * boxhalfsize[Y]; \ 117 if(min>rad || max<-rad) return 0; 120 float triverts[3][3])
129 float v0[3], v1[3], v2[3];
131 float min,
max, p0, p1, p2, rad, fex, fey, fez;
132 float normal[3], e0[3], e1[3], e2[3];
135 SUB(v0, triverts[0], boxcenter);
136 SUB(v1, triverts[1], boxcenter);
137 SUB(v2, triverts[2], boxcenter);
172 if (min > boxhalfsize[X] || max < -boxhalfsize[X])
176 if (min > boxhalfsize[Y] || max < -boxhalfsize[Y])
180 if (min > boxhalfsize[Z] || max < -boxhalfsize[Z])
185 CROSS(normal, e0, e1);
#define AXISTEST_X2(a, b, fa, fb)
#define SUB(dest, v1, v2)
float max(float a, float b, float c)
#define AXISTEST_Y1(a, b, fa, fb)
#define CROSS(dest, v1, v2)
#define AXISTEST_X01(a, b, fa, fb)
#define AXISTEST_Z0(a, b, fa, fb)
float min(float a, float b, float c)
#define AXISTEST_Z12(a, b, fa, fb)
int planeBoxOverlap(float normal[3], float vert[3], float maxbox[3])
#define AXISTEST_Y02(a, b, fa, fb)
int triBoxOverlap(float boxcenter[3], float boxhalfsize[3], float triverts[3][3])
#define FINDMINMAX(x0, x1, x2, min, max)