mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-29 05:41:02 +00:00
Merge branch 'opengl-bsp-cleanup' into 'master'
Opengl BSP cleanup and fixes See merge request STJr/SRB2!382
This commit is contained in:
commit
073ca10320
1 changed files with 121 additions and 131 deletions
|
@ -193,14 +193,14 @@ static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
|
||||||
v2dy = bsp->dy;
|
v2dy = bsp->dy;
|
||||||
|
|
||||||
den = v2dy*v1dx - v2dx*v1dy;
|
den = v2dy*v1dx - v2dx*v1dy;
|
||||||
if (den == 0)
|
if (fabs(den) < 1.0E-36f) // avoid checking exactly for 0.0
|
||||||
return NULL; // parallel
|
return NULL; // parallel
|
||||||
|
|
||||||
// first check the frac along the polygon segment,
|
// first check the frac along the polygon segment,
|
||||||
// (do not accept hit with the extensions)
|
// (do not accept hit with the extensions)
|
||||||
num = (v2x - v1x)*v2dy + (v1y - v2y)*v2dx;
|
num = (v2x - v1x)*v2dy + (v1y - v2y)*v2dx;
|
||||||
frac = num / den;
|
frac = num / den;
|
||||||
if (frac < 0 || frac > 1)
|
if (frac < 0.0 || frac > 1.0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// now get the frac along the BSP line
|
// now get the frac along the BSP line
|
||||||
|
@ -217,29 +217,6 @@ static polyvertex_t *fracdivline(fdivline_t *bsp, polyvertex_t *v1,
|
||||||
return &pt;
|
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
|
// if two vertice coords have a x and/or y difference
|
||||||
// of less or equal than 1 FRACUNIT, they are considered the same
|
// of less or equal than 1 FRACUNIT, they are considered the same
|
||||||
// point. Note: hardcoded value, 1.0f could be anything else.
|
// 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;
|
diff = p2->y - p1->y;
|
||||||
if (diff < -1.5f || diff > 1.5f)
|
if (diff < -1.5f || diff > 1.5f)
|
||||||
return false;
|
return false;
|
||||||
#else
|
#elif 0
|
||||||
if (p1->x != p2->x)
|
if (p1->x != p2->x)
|
||||||
return false;
|
return false;
|
||||||
if (p1->y != p2->y)
|
if (p1->y != p2->y)
|
||||||
return false;
|
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
|
#endif
|
||||||
// p1 and p2 are considered the same vertex
|
// p1 and p2 are considered the same vertex
|
||||||
return true;
|
return true;
|
||||||
|
@ -294,8 +278,9 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
||||||
// start & end points
|
// start & end points
|
||||||
pv = fracdivline(bsp, &poly->pts[i], &poly->pts[j]);
|
pv = fracdivline(bsp, &poly->pts[i], &poly->pts[j]);
|
||||||
|
|
||||||
if (pv)
|
if (pv == NULL)
|
||||||
{
|
continue;
|
||||||
|
|
||||||
if (ps < 0)
|
if (ps < 0)
|
||||||
{
|
{
|
||||||
// first point
|
// first point
|
||||||
|
@ -345,7 +330,6 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
||||||
// remember last point intercept to detect identical points
|
// remember last point intercept to detect identical points
|
||||||
lastpv = *pv;
|
lastpv = *pv;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// no split: the partition line is either parallel and
|
// no split: the partition line is either parallel and
|
||||||
// aligned with one of the poly segments, or the line is totally
|
// 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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps >= 0 && pe < 0)
|
if (pe < 0)
|
||||||
{
|
{
|
||||||
//I_Error("SplitPoly: only one point for split line (%d %d)", ps, pe);
|
//I_Error("SplitPoly: only one point for split line (%d %d)", ps, pe);
|
||||||
*frontpoly = poly;
|
*frontpoly = poly;
|
||||||
|
@ -387,7 +371,7 @@ static void SplitPoly (fdivline_t *bsp, //splitting parametric line
|
||||||
*backpoly = HWR_AllocPoly(2 + nptback);
|
*backpoly = HWR_AllocPoly(2 + nptback);
|
||||||
else
|
else
|
||||||
*backpoly = NULL;
|
*backpoly = NULL;
|
||||||
if (nptfront)
|
if (nptfront > 0)
|
||||||
*frontpoly = HWR_AllocPoly(2 + nptfront);
|
*frontpoly = HWR_AllocPoly(2 + nptfront);
|
||||||
else
|
else
|
||||||
*frontpoly = NULL;
|
*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]);
|
pv = fracdivline(&cutseg, &poly->pts[i], &poly->pts[j]);
|
||||||
|
|
||||||
if (pv)
|
if (pv == NULL)
|
||||||
{
|
continue;
|
||||||
|
|
||||||
if (ps < 0)
|
if (ps < 0)
|
||||||
{
|
{
|
||||||
ps = i;
|
ps = i;
|
||||||
|
@ -519,7 +504,6 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// there was a split
|
// there was a split
|
||||||
if (ps >= 0)
|
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
|
// search for the segs source of this divline
|
||||||
static inline void SearchDivline(node_t *bsp, fdivline_t *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->x = FIXED_TO_FLOAT(bsp->x);
|
||||||
divline->y = FIXED_TO_FLOAT(bsp->y);
|
divline->y = FIXED_TO_FLOAT(bsp->y);
|
||||||
divline->dx = FIXED_TO_FLOAT(bsp->dx);
|
divline->dx = FIXED_TO_FLOAT(bsp->dx);
|
||||||
divline->dy = FIXED_TO_FLOAT(bsp->dy);
|
divline->dy = FIXED_TO_FLOAT(bsp->dy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HWR_LOADING_SCREEN
|
||||||
//Hurdler: implement a loading status
|
//Hurdler: implement a loading status
|
||||||
static size_t ls_count = 0;
|
static size_t ls_count = 0;
|
||||||
static UINT8 ls_percent = 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
|
// poly : the convex polygon that encloses all child subsectors
|
||||||
static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox)
|
static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox)
|
||||||
{
|
{
|
||||||
|
@ -630,33 +638,14 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HWR_SubsecPoly(bspnum&(~NF_SUBSECTOR), poly);
|
HWR_SubsecPoly(bspnum & ~NF_SUBSECTOR, poly);
|
||||||
//Hurdler: implement a loading status
|
|
||||||
|
|
||||||
|
//Hurdler: implement a loading status
|
||||||
#ifdef HWR_LOADING_SCREEN
|
#ifdef HWR_LOADING_SCREEN
|
||||||
if (ls_count-- <= 0)
|
if (ls_count-- <= 0)
|
||||||
{
|
{
|
||||||
char s[16];
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
I_OsPolling();
|
|
||||||
ls_count = numsubsectors/50;
|
ls_count = numsubsectors/50;
|
||||||
CON_Drawer();
|
loading_status();
|
||||||
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
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -693,10 +682,9 @@ static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *b
|
||||||
if (backpoly)
|
if (backpoly)
|
||||||
{
|
{
|
||||||
// Correct back bbox to include floor/ceiling convex polygon
|
// Correct back bbox to include floor/ceiling convex polygon
|
||||||
WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1],
|
WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1], bsp->bbox[1]);
|
||||||
bsp->bbox[1]);
|
|
||||||
|
|
||||||
// enlarge bbox with seconde child
|
// enlarge bbox with second child
|
||||||
M_AddToBox(bbox, bsp->bbox[1][BOXLEFT ],
|
M_AddToBox(bbox, bsp->bbox[1][BOXLEFT ],
|
||||||
bsp->bbox[1][BOXTOP ]);
|
bsp->bbox[1][BOXTOP ]);
|
||||||
M_AddToBox(bbox, bsp->bbox[1][BOXRIGHT ],
|
M_AddToBox(bbox, bsp->bbox[1][BOXRIGHT ],
|
||||||
|
@ -968,7 +956,9 @@ void HWR_CreatePlanePolygons(INT32 bspnum)
|
||||||
fixed_t rootbbox[4];
|
fixed_t rootbbox[4];
|
||||||
|
|
||||||
CONS_Debug(DBG_RENDER, "Creating polygons, please wait...\n");
|
CONS_Debug(DBG_RENDER, "Creating polygons, please wait...\n");
|
||||||
|
#ifdef HWR_LOADING_SCREEN
|
||||||
ls_count = ls_percent = 0; // reset the loading status
|
ls_count = ls_percent = 0; // reset the loading status
|
||||||
|
#endif
|
||||||
CON_Drawer(); //let the user know what we are doing
|
CON_Drawer(); //let the user know what we are doing
|
||||||
I_FinishUpdate(); // page flip or blit buffer
|
I_FinishUpdate(); // page flip or blit buffer
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue