|
|
|
@ -193,14 +193,14 @@ static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
|
|
|
|
|
v2dy = bsp->dy;
|
|
|
|
|
|
|
|
|
|
den = v2dy*v1dx - v2dx*v1dy;
|
|
|
|
|
if (den == 0)
|
|
|
|
|
if (fabs(den) < 1.0E-36f) // avoid checking exactly for 0.0
|
|
|
|
|
return NULL; // parallel
|
|
|
|
|
|
|
|
|
|
// first check the frac along the polygon segment,
|
|
|
|
|
// (do not accept hit with the extensions)
|
|
|
|
|
num = (v2x - v1x)*v2dy + (v1y - v2y)*v2dx;
|
|
|
|
|
frac = num / den;
|
|
|
|
|
if (frac < 0 || frac > 1)
|
|
|
|
|
if (frac < 0.0 || frac > 1.0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
// now get the frac along the BSP line
|
|
|
|
@ -217,29 +217,6 @@ static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
|
|
|
|
|
return &pt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
//Hurdler: it's not used anymore
|
|
|
|
|
static boolean NearVertice (polyvertex_t *p1, polyvertex_t *p2)
|
|
|
|
|
{
|
|
|
|
|
#if 1
|
|
|
|
|
float diff;
|
|
|
|
|
diff = p2->x - p1->x;
|
|
|
|
|
if (diff < -1.5f || diff > 1.5f)
|
|
|
|
|
return false;
|
|
|
|
|
diff = p2->y - p1->y;
|
|
|
|
|
if (diff < -1.5f || diff > 1.5f)
|
|
|
|
|
return false;
|
|
|
|
|
#else
|
|
|
|
|
if (p1->x != p2->x)
|
|
|
|
|
return false;
|
|
|
|
|
if (p1->y != p2->y)
|
|
|
|
|
return false;
|
|
|
|
|
#endif
|
|
|
|
|
// p1 and p2 are considered the same vertex
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// if two vertice coords have a x and/or y difference
|
|
|
|
|
// of less or equal than 1 FRACUNIT, they are considered the same
|
|
|
|
|
// point. Note: hardcoded value, 1.0f could be anything else.
|
|
|
|
@ -253,11 +230,18 @@ static boolean SameVertice (polyvertex_t *p1, polyvertex_t *p2)
|
|
|
|
|
diff = p2->y - p1->y;
|
|
|
|
|
if (diff < -1.5f || diff > 1.5f)
|
|
|
|
|
return false;
|
|
|
|
|
#else
|
|
|
|
|
#elif 0
|
|
|
|
|
if (p1->x != p2->x)
|
|
|
|
|
return false;
|
|
|
|
|
if (p1->y != p2->y)
|
|
|
|
|
return false;
|
|
|
|
|
#else
|
|
|
|
|
#define DIVLINE_VERTEX_DIFF 0.45f
|
|
|
|
|
float ep = DIVLINE_VERTEX_DIFF;
|
|
|
|
|
if (fabsf( p2->x - p1->x ) > ep )
|
|
|
|
|
return false;
|
|
|
|
|
if (fabsf( p2->y - p1->y ) > ep )
|
|
|
|
|
return false;
|
|
|
|
|
#endif
|
|
|
|
|
// p1 and p2 are considered the same vertex
|
|
|
|
|
return true;
|
|
|
|
@ -294,8 +278,9 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
|
|
|
|
// start & end points
|
|
|
|
|
pv = fracdivline(bsp, &poly->pts[i], &poly->pts[j]);
|
|
|
|
|
|
|
|
|
|
if (pv)
|
|
|
|
|
{
|
|
|
|
|
if (pv == NULL)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (ps < 0)
|
|
|
|
|
{
|
|
|
|
|
// first point
|
|
|
|
@ -345,7 +330,6 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
|
|
|
|
// remember last point intercept to detect identical points
|
|
|
|
|
lastpv = *pv;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// no split: the partition line is either parallel and
|
|
|
|
|
// aligned with one of the poly segments, or the line is totally
|
|
|
|
@ -368,7 +352,7 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ps >= 0 && pe < 0)
|
|
|
|
|
if (pe < 0)
|
|
|
|
|
{
|
|
|
|
|
//I_Error("SplitPoly: only one point for split line (%d %d)", ps, pe);
|
|
|
|
|
*frontpoly = poly;
|
|
|
|
@ -387,7 +371,7 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
|
|
|
|
*backpoly = HWR_AllocPoly(2 + nptback);
|
|
|
|
|
else
|
|
|
|
|
*backpoly = NULL;
|
|
|
|
|
if (nptfront)
|
|
|
|
|
if (nptfront > 0)
|
|
|
|
|
*frontpoly = HWR_AllocPoly(2 + nptfront);
|
|
|
|
|
else
|
|
|
|
|
*frontpoly = NULL;
|
|
|
|
@ -482,8 +466,9 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
|
|
|
|
|
|
|
|
|
|
pv = fracdivline(&cutseg, &poly->pts[i], &poly->pts[j]);
|
|
|
|
|
|
|
|
|
|
if (pv)
|
|
|
|
|
{
|
|
|
|
|
if (pv == NULL)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (ps < 0)
|
|
|
|
|
{
|
|
|
|
|
ps = i;
|
|
|
|
@ -519,7 +504,6 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// there was a split
|
|
|
|
|
if (ps >= 0)
|
|
|
|
@ -581,18 +565,42 @@ static inline void HWR_SubsecPoly(INT32 num, poly_t *poly)
|
|
|
|
|
// search for the segs source of this divline
|
|
|
|
|
static inline void SearchDivline(node_t *bsp, fdivline_t *divline)
|
|
|
|
|
{
|
|
|
|
|
#if 0 // MAR - If you don't use the same partition line that the BSP uses, the front/back polys won't match the subsectors in the BSP!
|
|
|
|
|
#endif
|
|
|
|
|
divline->x = FIXED_TO_FLOAT(bsp->x);
|
|
|
|
|
divline->y = FIXED_TO_FLOAT(bsp->y);
|
|
|
|
|
divline->dx = FIXED_TO_FLOAT(bsp->dx);
|
|
|
|
|
divline->dy = FIXED_TO_FLOAT(bsp->dy);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HWR_LOADING_SCREEN
|
|
|
|
|
//Hurdler: implement a loading status
|
|
|
|
|
static size_t ls_count = 0;
|
|
|
|
|
static UINT8 ls_percent = 0;
|
|
|
|
|
|
|
|
|
|
static void loading_status(void)
|
|
|
|
|
{
|
|
|
|
|
char s[16];
|
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
|
|
I_OsPolling();
|
|
|
|
|
CON_Drawer();
|
|
|
|
|
sprintf(s, "%d%%", (++ls_percent)<<1);
|
|
|
|
|
x = BASEVIDWIDTH/2;
|
|
|
|
|
y = BASEVIDHEIGHT/2;
|
|
|
|
|
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
|
|
|
|
|
//V_DrawPatchFill(W_CachePatchName("SRB2BACK",PU_CACHE)); // SRB2 background, ehhh too bright.
|
|
|
|
|
M_DrawTextBox(x-58, y-8, 13, 1);
|
|
|
|
|
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
|
|
|
|
|
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
|
|
|
|
|
|
|
|
|
|
// Is this really necessary at this point..?
|
|
|
|
|
V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND MAY");
|
|
|
|
|
V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "NOT DISPLAY SOME SURFACES.");
|
|
|
|
|
V_DrawCenteredString(BASEVIDWIDTH/2, 70, V_YELLOWMAP, "USE AT SONIC'S RISK.");
|
|
|
|
|
|
|
|
|
|
I_UpdateNoVsync();
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// poly : the convex polygon that encloses all child subsectors
|
|
|
|
|
static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox)
|
|
|
|
|
{
|
|
|
|
@ -630,38 +638,19 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
HWR_SubsecPoly(bspnum&(~NF_SUBSECTOR), poly);
|
|
|
|
|
//Hurdler: implement a loading status
|
|
|
|
|
HWR_SubsecPoly(bspnum & ~NF_SUBSECTOR, poly);
|
|
|
|
|
|
|
|
|
|
//Hurdler: implement a loading status
|
|
|
|
|
#ifdef HWR_LOADING_SCREEN
|
|
|
|
|
if (ls_count-- <= 0)
|
|
|
|
|
{
|
|
|
|
|
char s[16];
|
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
|
|
I_OsPolling();
|
|
|
|
|
ls_count = numsubsectors/50;
|
|
|
|
|
CON_Drawer();
|
|
|
|
|
sprintf(s, "%d%%", (++ls_percent)<<1);
|
|
|
|
|
x = BASEVIDWIDTH/2;
|
|
|
|
|
y = BASEVIDHEIGHT/2;
|
|
|
|
|
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
|
|
|
|
|
//V_DrawPatchFill(W_CachePatchName("SRB2BACK",PU_CACHE)); // SRB2 background, ehhh too bright.
|
|
|
|
|
M_DrawTextBox(x-58, y-8, 13, 1);
|
|
|
|
|
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
|
|
|
|
|
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
|
|
|
|
|
|
|
|
|
|
// Is this really necessary at this point..?
|
|
|
|
|
V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND MAY");
|
|
|
|
|
V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "NOT DISPLAY SOME SURFACES.");
|
|
|
|
|
V_DrawCenteredString(BASEVIDWIDTH/2, 70, V_YELLOWMAP, "USE AT SONIC'S RISK.");
|
|
|
|
|
|
|
|
|
|
I_UpdateNoVsync();
|
|
|
|
|
loading_status();
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
M_ClearBox(bbox);
|
|
|
|
|
poly = extrasubsectors[bspnum&~NF_SUBSECTOR].planepoly;
|
|
|
|
|
poly = extrasubsectors[bspnum & ~NF_SUBSECTOR].planepoly;
|
|
|
|
|
|
|
|
|
|
for (i = 0, pt = poly->pts; i < poly->numpts; i++,pt++)
|
|
|
|
|
M_AddToBox(bbox, FLOAT_TO_FIXED(pt->x), FLOAT_TO_FIXED(pt->y));
|
|
|
|
@ -693,10 +682,9 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
|
|
|
|
|
if (backpoly)
|
|
|
|
|
{
|
|
|
|
|
// Correct back bbox to include floor/ceiling convex polygon
|
|
|
|
|
WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1],
|
|
|
|
|
bsp->bbox[1]);
|
|
|
|
|
WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1], bsp->bbox[1]);
|
|
|
|
|
|
|
|
|
|
// enlarge bbox with seconde child
|
|
|
|
|
// enlarge bbox with second child
|
|
|
|
|
M_AddToBox(bbox, bsp->bbox[1][BOXLEFT ],
|
|
|
|
|
bsp->bbox[1][BOXTOP ]);
|
|
|
|
|
M_AddToBox(bbox, bsp->bbox[1][BOXRIGHT ],
|
|
|
|
@ -780,9 +768,9 @@ static void SearchSegInBSP(INT32 bspnum,polyvertex_t *p,poly_t *poly)
|
|
|
|
|
|
|
|
|
|
if (bspnum & NF_SUBSECTOR)
|
|
|
|
|
{
|
|
|
|
|
if (bspnum!=-1)
|
|
|
|
|
if (bspnum != -1)
|
|
|
|
|
{
|
|
|
|
|
bspnum&=~NF_SUBSECTOR;
|
|
|
|
|
bspnum &= ~NF_SUBSECTOR;
|
|
|
|
|
q = extrasubsectors[bspnum].planepoly;
|
|
|
|
|
if (poly == q || !q)
|
|
|
|
|
return;
|
|
|
|
@ -968,7 +956,9 @@ void HWR_CreatePlanePolygons(INT32 bspnum)
|
|
|
|
|
fixed_t rootbbox[4];
|
|
|
|
|
|
|
|
|
|
CONS_Debug(DBG_RENDER, "Creating polygons, please wait...\n");
|
|
|
|
|
#ifdef HWR_LOADING_SCREEN
|
|
|
|
|
ls_count = ls_percent = 0; // reset the loading status
|
|
|
|
|
#endif
|
|
|
|
|
CON_Drawer(); //let the user know what we are doing
|
|
|
|
|
I_FinishUpdate(); // page flip or blit buffer
|
|
|
|
|
|
|
|
|
|