56 float epsilon =
b->epsilon;
59 if (
b->numcorners == 0)
61 b->extents[0][0] = corner.
x;
62 b->extents[0][1] = corner.
y;
63 b->extents[0][2] = corner.
z;
64 b->extents[1][0] = corner.
x;
65 b->extents[1][1] = corner.
y;
66 b->extents[1][2] = corner.
z;
70 if (
b->extents[0][0] > corner.
x)
71 b->extents[0][0] = corner.
x;
72 if (
b->extents[0][1] > corner.
y)
73 b->extents[0][1] = corner.
y;
74 if (
b->extents[0][2] > corner.
z)
75 b->extents[0][2] = corner.
z;
76 if (
b->extents[1][0] < corner.
x)
77 b->extents[1][0] = corner.
x;
78 if (
b->extents[1][1] < corner.
y)
79 b->extents[1][1] = corner.
y;
80 if (
b->extents[1][2] < corner.
z)
81 b->extents[1][2] = corner.
z;
87 for (
i = 0;
i <
b->numfaces;
i++)
91 removedface[
i] = (
f->x * corner.
x +
f->y * corner.
y +
f->z * corner.
z +
f->w * corner.
w) > epsilon;
95 for (
i = 0;
i <
b->numfaces;
i++)
100 if (
i ==
b->numfaces)
104 for (j =
i + 1; j <
b->numfaces; j++)
106 b->faces[
i++] =
b->faces[j];
111 for (
i = 0;
i <
b->numcorners;
i++)
114 for (j = 0; j <
b->numcorners; j++)
127 e.
x = corner.
x - cb.
x;
128 e.
y = corner.
y - cb.
y;
129 e.
z = corner.
z - cb.
z;
133 face.
x = d.
y * e.
z - d.
z * e.
y;
134 face.
y = d.
z * e.
x - d.
x * e.
z;
135 face.
z = d.
x * e.
y - d.
y * e.
x;
136 float len2 = face.
x * face.
x + face.
y * face.
y + face.
z * face.
z;
143 float inv = 1.0f /
sqrt(len2);
147 face.
w = -(corner.
x * face.
x + corner.
y * face.
y + corner.
z * face.
z);
149 if ((
b->extents[0][0] +
b->extents[1][0]) * 0.5f * face.
x + (
b->extents[0][1] +
b->extents[1][1]) * 0.5f * face.
y + (
b->extents[0][2] +
b->extents[1][2]) * 0.5f * face.
z + face.
w > 0.0f)
157 for (l = 0; l <
b->numcorners; l++)
160 if (
cl.x * face.
x +
cl.y * face.
y +
cl.z * face.
z + face.
w > epsilon)
163 if (l < b->numcorners)
166 b->faces[
b->numfaces++] = face;
171 for (
i = 0;
i <
b->numcorners;
i++)
174 for (j = 0; j <
b->numfaces; j++)
177 if (ca.
x *
f->x + ca.
y *
f->y + ca.
z *
f->z + ca.
w *
f->w > -epsilon)
181 removedcorner[
i] = (j ==
b->numfaces);
185 for (
i = 0;
i <
b->numcorners;
i++)
186 if (removedcorner[
i])
188 for (j =
i + 1;j <
b->numcorners;j++)
189 if (!removedcorner[j])
190 b->corners[
i++] =
b->corners[j];
194 b->corners[
b->numcorners++] = corner;