mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-31 13:40:45 +00:00
Refactored a bit of code regarding visplane bound trimming for portals; reset ffloor's f_clip/c_clip so that FOFs on portals don't interfere with previously acquired bounds.
This commit is contained in:
parent
d2692ddd24
commit
8c3ddd61d5
5 changed files with 73 additions and 48 deletions
11
src/r_main.c
11
src/r_main.c
|
@ -1081,6 +1081,7 @@ void R_RenderPlayerView(player_t *player)
|
||||||
// Portal rendering. Hijacks the BSP traversal.
|
// Portal rendering. Hijacks the BSP traversal.
|
||||||
if (portal_base)
|
if (portal_base)
|
||||||
{
|
{
|
||||||
|
INT32 i, p;
|
||||||
portal_t *portal;
|
portal_t *portal;
|
||||||
|
|
||||||
for(portal = portal_base; portal; portal = portal_base)
|
for(portal = portal_base; portal; portal = portal_base)
|
||||||
|
@ -1113,6 +1114,16 @@ void R_RenderPlayerView(player_t *player)
|
||||||
masks[nummasks - 1].viewsector = viewsector;
|
masks[nummasks - 1].viewsector = viewsector;
|
||||||
curdrawsegs = ds_p;
|
curdrawsegs = ds_p;
|
||||||
|
|
||||||
|
// opening / clipping determination
|
||||||
|
for (i = 0; i < viewwidth; i++)
|
||||||
|
{
|
||||||
|
for (p = 0; p < MAXFFLOORS; p++)
|
||||||
|
{
|
||||||
|
ffloor[p].f_clip[i] = (INT16)viewheight;
|
||||||
|
ffloor[p].c_clip[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
R_RenderBSPNode((INT32)numnodes - 1);
|
R_RenderBSPNode((INT32)numnodes - 1);
|
||||||
masks[nummasks - 1].drawsegs[1] = ds_p - drawsegs;
|
masks[nummasks - 1].drawsegs[1] = ds_p - drawsegs;
|
||||||
masks[nummasks - 1].vissprites[1] = visspritecount;
|
masks[nummasks - 1].vissprites[1] = visspritecount;
|
||||||
|
|
|
@ -45,9 +45,8 @@
|
||||||
//#define QUINCUNX
|
//#define QUINCUNX
|
||||||
|
|
||||||
//SoM: 3/23/2000: Use Boom visplane hashing.
|
//SoM: 3/23/2000: Use Boom visplane hashing.
|
||||||
#define MAXVISPLANES 512
|
|
||||||
|
|
||||||
static visplane_t *visplanes[MAXVISPLANES];
|
visplane_t *visplanes[MAXVISPLANES];
|
||||||
static visplane_t *freetail;
|
static visplane_t *freetail;
|
||||||
static visplane_t **freehead = &freetail;
|
static visplane_t **freehead = &freetail;
|
||||||
|
|
||||||
|
@ -1178,31 +1177,3 @@ void R_PlaneBounds(visplane_t *plane)
|
||||||
plane->high = hi;
|
plane->high = hi;
|
||||||
plane->low = low;
|
plane->low = low;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates portals for the currently existing sky visplanes.
|
|
||||||
* The visplanes are also removed and cleared from the list.
|
|
||||||
*/
|
|
||||||
void Portal_AddSkyboxPortals (void)
|
|
||||||
{
|
|
||||||
visplane_t *pl;
|
|
||||||
INT32 i;
|
|
||||||
UINT16 count = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < MAXVISPLANES; i++, pl++)
|
|
||||||
{
|
|
||||||
for (pl = visplanes[i]; pl; pl = pl->next)
|
|
||||||
{
|
|
||||||
if (pl->picnum == skyflatnum)
|
|
||||||
{
|
|
||||||
Portal_AddSkybox(pl);
|
|
||||||
|
|
||||||
pl->minx = 0;
|
|
||||||
pl->maxx = -1;
|
|
||||||
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CONS_Debug(DBG_RENDER, "Skybox portals: %d\n", count);
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include "r_data.h"
|
#include "r_data.h"
|
||||||
#include "p_polyobj.h"
|
#include "p_polyobj.h"
|
||||||
|
|
||||||
|
#define MAXVISPLANES 512
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now what is a visplane, anyway?
|
// Now what is a visplane, anyway?
|
||||||
// Simple: kinda floor/ceiling polygon optimised for SRB2 rendering.
|
// Simple: kinda floor/ceiling polygon optimised for SRB2 rendering.
|
||||||
|
@ -53,6 +55,7 @@ typedef struct visplane_s
|
||||||
#endif
|
#endif
|
||||||
} visplane_t;
|
} visplane_t;
|
||||||
|
|
||||||
|
extern visplane_t *visplanes[MAXVISPLANES];
|
||||||
extern visplane_t *floorplane;
|
extern visplane_t *floorplane;
|
||||||
extern visplane_t *ceilingplane;
|
extern visplane_t *ceilingplane;
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "p_spec.h" // Skybox viewpoints
|
#include "p_spec.h" // Skybox viewpoints
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "r_things.h"
|
#include "r_things.h"
|
||||||
|
#include "r_sky.h"
|
||||||
|
|
||||||
UINT8 portalrender; /**< When rendering a portal, it establishes the depth of the current BSP traversal. */
|
UINT8 portalrender; /**< When rendering a portal, it establishes the depth of the current BSP traversal. */
|
||||||
sector_t *portalcullsector;
|
sector_t *portalcullsector;
|
||||||
|
@ -215,25 +216,19 @@ static void Portal_ClipVisplane (const visplane_t* plane, portal_t* portal)
|
||||||
|
|
||||||
extern INT32 viewwidth;
|
extern INT32 viewwidth;
|
||||||
|
|
||||||
/** Creates a skybox portal out of a visplane.
|
static boolean TrimVisplaneBounds (const visplane_t* plane, INT16* start, INT16* end)
|
||||||
*
|
|
||||||
* Applies the necessary offsets and rotation to give
|
|
||||||
* a depth illusion to the skybox.
|
|
||||||
*/
|
|
||||||
void Portal_AddSkybox (const visplane_t* plane)
|
|
||||||
{
|
{
|
||||||
INT16 start = plane->minx;
|
*start = plane->minx;
|
||||||
INT16 end = plane->maxx + 1;
|
*end = plane->maxx + 1;
|
||||||
mapheader_t *mh;
|
|
||||||
portal_t* portal;
|
|
||||||
|
|
||||||
// Visplanes have 1-px pads on their sides (extra columns).
|
// Visplanes have 1-px pads on their sides (extra columns).
|
||||||
// Trim them, else it may render out of bounds.
|
// Trim them, else it may render out of bounds.
|
||||||
if (end > viewwidth)
|
if (*end > viewwidth)
|
||||||
end = viewwidth;
|
*end = viewwidth;
|
||||||
|
|
||||||
|
if (!(*start < *end))
|
||||||
|
return true;
|
||||||
|
|
||||||
if (!(start < end))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/** Trims a visplane's horizontal gap to match its render area.
|
/** Trims a visplane's horizontal gap to match its render area.
|
||||||
*
|
*
|
||||||
|
@ -242,17 +237,33 @@ void Portal_AddSkybox (const visplane_t* plane)
|
||||||
* valid area.
|
* valid area.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (plane->bottom[start] == 0 && plane->top[start] == 65535 && start < end)
|
while (plane->bottom[*start] == 0 && plane->top[*start] == 65535 && *start < *end)
|
||||||
{
|
{
|
||||||
start++;
|
(*start)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
while (plane->bottom[end - 1] == 0 && plane->top[start] == 65535 && end > start)
|
while (plane->bottom[*end - 1] == 0 && plane->top[*start] == 65535 && *end > *start)
|
||||||
{
|
{
|
||||||
end--;
|
(*end)--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates a skybox portal out of a visplane.
|
||||||
|
*
|
||||||
|
* Applies the necessary offsets and rotation to give
|
||||||
|
* a depth illusion to the skybox.
|
||||||
|
*/
|
||||||
|
void Portal_AddSkybox (const visplane_t* plane)
|
||||||
|
{
|
||||||
|
INT16 start, end;
|
||||||
|
mapheader_t *mh;
|
||||||
|
portal_t* portal;
|
||||||
|
|
||||||
|
if (TrimVisplaneBounds(plane, &start, &end))
|
||||||
|
return;
|
||||||
|
|
||||||
portal = Portal_Add(start, end);
|
portal = Portal_Add(start, end);
|
||||||
|
|
||||||
|
@ -291,3 +302,31 @@ void Portal_AddSkybox (const visplane_t* plane)
|
||||||
|
|
||||||
portal->clipline = -1;
|
portal->clipline = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Creates portals for the currently existing sky visplanes.
|
||||||
|
* The visplanes are also removed and cleared from the list.
|
||||||
|
*/
|
||||||
|
void Portal_AddSkyboxPortals (void)
|
||||||
|
{
|
||||||
|
visplane_t *pl;
|
||||||
|
INT32 i;
|
||||||
|
UINT16 count = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < MAXVISPLANES; i++, pl++)
|
||||||
|
{
|
||||||
|
for (pl = visplanes[i]; pl; pl = pl->next)
|
||||||
|
{
|
||||||
|
if (pl->picnum == skyflatnum)
|
||||||
|
{
|
||||||
|
Portal_AddSkybox(pl);
|
||||||
|
|
||||||
|
pl->minx = 0;
|
||||||
|
pl->maxx = -1;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Debug(DBG_RENDER, "Skybox portals: %d\n", count);
|
||||||
|
}
|
||||||
|
|
|
@ -56,4 +56,5 @@ void Portal_AddSkybox (const visplane_t* plane);
|
||||||
void Portal_ClipRange (portal_t* portal);
|
void Portal_ClipRange (portal_t* portal);
|
||||||
void Portal_ClipApply (const portal_t* portal);
|
void Portal_ClipApply (const portal_t* portal);
|
||||||
|
|
||||||
|
void Portal_AddSkyboxPortals (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue