40{
45
46
48 return;
49
50
55
56 float epsilon =
b->epsilon;
57
58
59 if (
b->numcorners == 0)
60 {
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;
67 }
68 else
69 {
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;
82 }
83
85 {
86
87 for (
i = 0;
i <
b->numfaces;
i++)
88 {
90
91 removedface[
i] = (
f->x * corner.
x +
f->y * corner.
y +
f->z * corner.
z +
f->w * corner.
w) > epsilon;
92 }
93
94
95 for (
i = 0;
i <
b->numfaces;
i++)
97 break;
98
99
100 if (
i ==
b->numfaces)
101 return;
102
103
104 for (j =
i + 1; j <
b->numfaces; j++)
105 if (!removedface[j])
106 b->faces[
i++] =
b->faces[j];
108 }
109
110
111 for (
i = 0;
i <
b->numcorners;
i++)
112 {
114 for (j = 0; j <
b->numcorners; j++)
115 {
116
118 continue;
120
127 e.
x = corner.
x - cb.
x;
128 e.
y = corner.
y - cb.
y;
129 e.
z = corner.
z - cb.
z;
131
132
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;
137 if (len2 == 0.0f)
138 {
139
140 continue;
141 }
142
143 float inv = 1.0f /
sqrt(len2);
147 face.
w = -(corner.
x * face.
x + corner.
y * face.
y + corner.
z * face.
z);
148
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)
150 {
155 }
156
157 for (l = 0; l <
b->numcorners; l++)
158 {
160 if (
cl.x * face.
x +
cl.y * face.
y +
cl.z * face.
z + face.
w > epsilon)
161 break;
162 }
163 if (l < b->numcorners)
164 continue;
165
166 b->faces[
b->numfaces++] = face;
167 }
168 }
169
170
171 for (
i = 0;
i <
b->numcorners;
i++)
172 {
174 for (j = 0; j <
b->numfaces; j++)
175 {
177 if (ca.
x *
f->x + ca.
y *
f->y + ca.
z *
f->z + ca.
w *
f->w > -epsilon)
178 break;
179 }
180
181 removedcorner[
i] = (j ==
b->numfaces);
182 }
183
184
185 for (
i = 0;
i <
b->numcorners;
i++)
186 if (removedcorner[
i])
187 break;
188 for (j =
i + 1;j <
b->numcorners;j++)
189 if (!removedcorner[j])
190 b->corners[
i++] =
b->corners[j];
192
193
194 b->corners[
b->numcorners++] = corner;
195}
GLubyte GLubyte GLubyte z
GLint GLenum GLint GLint y