46 float frac, ifrac, c[3], pdist, ndist;
47 const float *nextpoint;
48 const float *points = poly->
points[0];
49 float *outfront = front->
points[0];
50 float *outback = back->
points[0];
51 for(
i = 0;
i <
count;
i++, points += 3)
58 outfront[frontcount*3+0] = points[0];
59 outfront[frontcount*3+1] = points[1];
60 outfront[frontcount*3+2] = points[2];
65 outback[backcount*3+0] = points[0];
66 outback[backcount*3+1] = points[1];
67 outback[backcount*3+2] = points[2];
70 if ((sides[
i] | sides[j]) == 3)
77 nextpoint = poly->
points[j];
80 frac = pdist / (pdist - ndist);
82 c[0] = points[0] * ifrac + frac * nextpoint[0];
83 c[1] = points[1] * ifrac + frac * nextpoint[1];
84 c[2] = points[2] * ifrac + frac * nextpoint[2];
85 outfront[frontcount*3+0] = c[0];
86 outfront[frontcount*3+1] = c[1];
87 outfront[frontcount*3+2] = c[2];
89 outback[backcount*3+0] = c[0];
90 outback[backcount*3+1] = c[1];
91 outback[backcount*3+2] = c[2];
101 memset(
b, 0,
sizeof(*
b));
106 b->maxnodes = maxnodes;
108 b->ranoutofnodes = 0;
109 b->stat_occluders_rejected = 0;
110 b->stat_occluders_accepted = 0;
111 b->stat_occluders_fragments_accepted = 0;
112 b->stat_occluders_fragments_rejected = 0;
113 b->stat_queries_rejected = 0;
114 b->stat_queries_accepted = 0;
115 b->stat_queries_fragments_accepted = 0;
116 b->stat_queries_fragments_rejected = 0;
129 b->nodes[0].plane[1] = 0;
130 b->nodes[0].plane[2] = 0;
131 b->nodes[0].plane[3] =
origin[0];
132 b->nodes[0].parent = -1;
133 b->nodes[0].children[0] = 1;
134 b->nodes[0].children[1] = 2;
138 b->nodes[1].plane[0] = 0;
139 b->nodes[1].plane[1] = 1;
140 b->nodes[1].plane[2] = 0;
141 b->nodes[1].plane[3] =
origin[1];
142 b->nodes[1].parent = 0;
143 b->nodes[1].children[0] = -1;
144 b->nodes[1].children[1] = -1;
148 b->nodes[2].plane[0] = 0;
149 b->nodes[2].plane[1] = 1;
150 b->nodes[2].plane[2] = 0;
151 b->nodes[2].plane[3] =
origin[1];
152 b->nodes[2].parent = 0;
153 b->nodes[2].children[0] = -1;
154 b->nodes[2].children[1] = -1;
157static void SVBSP_InsertOccluderPolygonNodes(
svbsp_t *
b,
int *parentnodenumpointer,
int parentnodenum,
const svbsp_polygon_t *poly,
void (*fragmentcallback)(
void *fragmentcallback_pointer1,
int fragmentcallback_number1,
svbsp_t *
b,
int numpoints,
const float *points),
void *fragmentcallback_pointer1,
int fragmentcallback_number1)
169 if (
b->numnodes + poly->
numpoints + 1 >=
b->maxnodes)
171 b->ranoutofnodes = 1;
194 for (j = parentnodenum;j >= 0;j =
b->nodes[j].parent)
196 float *parentnodeplane =
b->nodes[j].plane;
207 if (poly->splitflags[
i])
212 node =
b->nodes +
b->numnodes++;
230 node->
plane[0] *= -1;
231 node->
plane[1] *= -1;
232 node->
plane[2] *= -1;
233 node->
plane[3] *= -1;
237 node->
parent = parentnodenum;
241 *parentnodenumpointer = parentnodenum = (
int)(node -
b->nodes);
243 parentnodenumpointer = &node->
children[1];
253 node =
b->nodes +
b->numnodes++;
259 node->
plane[0] *= -1;
260 node->
plane[1] *= -1;
261 node->
plane[2] *= -1;
262 node->
plane[3] *= -1;
264 node->
parent = parentnodenum;
269 *parentnodenumpointer = (
int)(node -
b->nodes);
273static int SVBSP_AddPolygonNode(
svbsp_t *
b,
int *parentnodenumpointer,
int parentnodenum,
const svbsp_polygon_t *poly,
int insertoccluder,
void (*fragmentcallback)(
void *fragmentcallback_pointer1,
int fragmentcallback_number1,
svbsp_t *
b,
int numpoints,
const float *points),
void *fragmentcallback_pointer1,
int fragmentcallback_number1)
289 while (*parentnodenumpointer >= 0)
292 parentnodenum = *parentnodenumpointer;
293 node =
b->nodes + parentnodenum;
294 plane[0] = node->
plane[0];
295 plane[1] = node->
plane[1];
296 plane[2] = node->
plane[2];
297 plane[3] = node->
plane[3];
327 parentnodenumpointer = &node->
children[0];
331 parentnodenumpointer = &node->
children[0];
335 parentnodenumpointer = &node->
children[1];
342 PolygonF_Divide(poly->
numpoints, poly->
points[0], plane[0], plane[1], plane[2], plane[3],
SVBSP_CLIP_EPSILON,
MAX_SVBSP_POLYGONPOINTS, front.
points[0], &front.
numpoints,
MAX_SVBSP_POLYGONPOINTS, back.
points[0], &back.
numpoints,
NULL);
351 i =
SVBSP_AddPolygonNode(
b, &node->
children[0], *parentnodenumpointer, &front, insertoccluder, fragmentcallback, fragmentcallback_pointer1, fragmentcallback_number1);
352 i |=
SVBSP_AddPolygonNode(
b, &node->
children[1], *parentnodenumpointer, &back , insertoccluder, fragmentcallback, fragmentcallback_pointer1, fragmentcallback_number1);
357 if (*parentnodenumpointer == -1)
365 Debug_PolygonVertex(poly->
points[ 0][0], poly->
points[ 0][1], poly->
points[ 0][2], 0.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f);
366 Debug_PolygonVertex(poly->
points[
i+1][0], poly->
points[
i+1][1], poly->
points[
i+1][2], 0.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f);
367 Debug_PolygonVertex(poly->
points[
i+2][0], poly->
points[
i+2][1], poly->
points[
i+2][2], 0.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f);
373 b->stat_occluders_fragments_accepted++;
377 b->stat_queries_fragments_accepted++;
378 if (fragmentcallback)
379 fragmentcallback(fragmentcallback_pointer1, fragmentcallback_number1,
b, poly->
numpoints, poly->
points[0]);
386 b->stat_occluders_fragments_rejected++;
388 b->stat_queries_fragments_rejected++;
393 Debug_PolygonVertex(poly->
points[ 0][0], poly->
points[ 0][1], poly->
points[ 0][2], 0.0f, 0.0f, 0.0f, 0.0f, 0.25f, 1.0f);
394 Debug_PolygonVertex(poly->
points[
i+1][0], poly->
points[
i+1][1], poly->
points[
i+1][2], 0.0f, 0.0f, 0.0f, 0.0f, 0.25f, 1.0f);
395 Debug_PolygonVertex(poly->
points[
i+2][0], poly->
points[
i+2][1], poly->
points[
i+2][2], 0.0f, 0.0f, 0.0f, 0.0f, 0.25f, 1.0f);
403int SVBSP_AddPolygon(
svbsp_t *
b,
int numpoints,
const float *points,
int insertoccluder,
void (*fragmentcallback)(
void *fragmentcallback_pointer1,
int fragmentcallback_number1,
svbsp_t *
b,
int numpoints,
const float *points),
void *fragmentcallback_pointer1,
int fragmentcallback_number1)
416 for (
i = 0;
i < numpoints;
i++)
429 Debug_PolygonVertex(poly.
points[ 0][0], poly.
points[ 0][1], poly.
points[ 0][2], 0.0f, 0.0f, 0.0f, 0.25f, 0.0f, 1.0f);
430 Debug_PolygonVertex(poly.
points[
i+1][0], poly.
points[
i+1][1], poly.
points[
i+1][2], 0.0f, 0.0f, 0.0f, 0.25f, 0.0f, 1.0f);
431 Debug_PolygonVertex(poly.
points[
i+2][0], poly.
points[
i+2][1], poly.
points[
i+2][2], 0.0f, 0.0f, 0.0f, 0.25f, 0.0f, 1.0f);
436 i =
SVBSP_AddPolygonNode(
b, &nodenum, -1, &poly, insertoccluder, fragmentcallback, fragmentcallback_pointer1, fragmentcallback_number1);
440 b->stat_occluders_accepted++;
442 b->stat_occluders_rejected++;
447 b->stat_queries_accepted++;
449 b->stat_queries_rejected++;
void PolygonF_Divide(int innumpoints, const float *inpoints, float planenormalx, float planenormaly, float planenormalz, float planedist, float epsilon, int outfrontmaxpoints, float *outfrontpoints, int *neededfrontpoints, int outbackmaxpoints, float *outbackpoints, int *neededbackpoints, int *oncountpointer)
static int SVBSP_AddPolygonNode(svbsp_t *b, int *parentnodenumpointer, int parentnodenum, const svbsp_polygon_t *poly, int insertoccluder, void(*fragmentcallback)(void *fragmentcallback_pointer1, int fragmentcallback_number1, svbsp_t *b, int numpoints, const float *points), void *fragmentcallback_pointer1, int fragmentcallback_number1)
int SVBSP_AddPolygon(svbsp_t *b, int numpoints, const float *points, int insertoccluder, void(*fragmentcallback)(void *fragmentcallback_pointer1, int fragmentcallback_number1, svbsp_t *b, int numpoints, const float *points), void *fragmentcallback_pointer1, int fragmentcallback_number1)
static void SVBSP_InsertOccluderPolygonNodes(svbsp_t *b, int *parentnodenumpointer, int parentnodenum, const svbsp_polygon_t *poly, void(*fragmentcallback)(void *fragmentcallback_pointer1, int fragmentcallback_number1, svbsp_t *b, int numpoints, const float *points), void *fragmentcallback_pointer1, int fragmentcallback_number1)