diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index 01c1dc8db..62cf48b1b 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -31,31 +31,6 @@ extern "C" { // SRB2Kart -// ----------- -// structures -// ----------- - -// a vertex of a Doom 'plane' polygon -typedef struct -{ - float x; - float y; - float z; -} polyvertex_t; - -// a convex 'plane' polygon, clockwise order -typedef struct -{ - INT32 numpts; - polyvertex_t pts[]; -} poly_t; - -// holds extra info for 3D render, for each subsector in subsectors[] -typedef struct -{ - poly_t *planepoly; // the generated convex polygon -} extrasubsector_t; - // needed for sprite rendering // equivalent of the software renderer's vissprites typedef struct gl_vissprite_s @@ -175,6 +150,10 @@ void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isc void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, FBITFIELD blendmode, UINT8 lightlevel, levelflat_t *levelflat, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap); + +void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap); +void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, + INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap); // -------- // hw_segs.c // -------- diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index ad86ae9b7..4111a5ca0 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -57,14 +57,6 @@ // the hardware driver object // ========================================================================== -// ========================================================================== -// PROTOS -// ========================================================================== - -void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap); -void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, - INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap); - #define ABS(x) ((x) < 0 ? -(x) : (x)) // ========================================================================== @@ -1225,40 +1217,11 @@ static void HWR_RenderBSPNode(INT32 bspnum) wallinfo_t *wallinfo = NULL; size_t numwalls = 0; // a list of transparent walls to be drawn -typedef struct -{ - extrasubsector_t *xsub; - boolean isceiling; - fixed_t fixedheight; - INT32 lightlevel; - levelflat_t *levelflat; - INT32 alpha; - sector_t *FOFSector; - FBITFIELD blend; - boolean fogplane; - extracolormap_t *planecolormap; - INT32 drawcount; -} planeinfo_t; +size_t numplanes = 0; // a list of transparent floors to be drawn +planeinfo_t *planeinfo = NULL; -static size_t numplanes = 0; // a list of transparent floors to be drawn -static planeinfo_t *planeinfo = NULL; - -typedef struct -{ - polyobj_t *polysector; - boolean isceiling; - fixed_t fixedheight; - INT32 lightlevel; - levelflat_t *levelflat; - INT32 alpha; - sector_t *FOFSector; - FBITFIELD blend; - extracolormap_t *planecolormap; - INT32 drawcount; -} polyplaneinfo_t; - -static size_t numpolyplanes = 0; // a list of transparent poyobject floors to be drawn -static polyplaneinfo_t *polyplaneinfo = NULL; +size_t numpolyplanes = 0; // a list of transparent poyobject floors to be drawn +polyplaneinfo_t *polyplaneinfo = NULL; //Hurdler: 3D water sutffs typedef struct gl_drawnode_s @@ -1274,67 +1237,6 @@ typedef struct gl_drawnode_s INT32 drawcount = 0; -#define MAX_TRANSPARENTFLOOR 512 - -// This will likely turn into a copy of HWR_Add3DWater and replace it. -void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap) -{ - static size_t allocedplanes = 0; - - // Force realloc if buffer has been freed - if (!planeinfo) - allocedplanes = 0; - - if (allocedplanes < numplanes + 1) - { - allocedplanes += MAX_TRANSPARENTFLOOR; - Z_Realloc(planeinfo, allocedplanes * sizeof (*planeinfo), PU_LEVEL, &planeinfo); - } - - planeinfo[numplanes].isceiling = isceiling; - planeinfo[numplanes].fixedheight = fixedheight; - planeinfo[numplanes].lightlevel = ((planecolormap && (planecolormap->flags & CMF_FOG)) || mapnamespace == MNS_SRB2KART) ? lightlevel : 255; - planeinfo[numplanes].levelflat = levelflat; - planeinfo[numplanes].xsub = xsub; - planeinfo[numplanes].alpha = alpha; - planeinfo[numplanes].FOFSector = FOFSector; - planeinfo[numplanes].blend = blend; - planeinfo[numplanes].fogplane = fogplane; - planeinfo[numplanes].planecolormap = planecolormap; - planeinfo[numplanes].drawcount = drawcount++; - - numplanes++; -} - -// Adding this for now until I can create extrasubsector info for polyobjects -// When that happens it'll just be done through HWR_AddTransparentFloor and HWR_RenderPlane -void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap) -{ - static size_t allocedpolyplanes = 0; - - // Force realloc if buffer has been freed - if (!polyplaneinfo) - allocedpolyplanes = 0; - - if (allocedpolyplanes < numpolyplanes + 1) - { - allocedpolyplanes += MAX_TRANSPARENTFLOOR; - Z_Realloc(polyplaneinfo, allocedpolyplanes * sizeof (*polyplaneinfo), PU_LEVEL, &polyplaneinfo); - } - - polyplaneinfo[numpolyplanes].isceiling = isceiling; - polyplaneinfo[numpolyplanes].fixedheight = fixedheight; - polyplaneinfo[numpolyplanes].lightlevel = ((planecolormap && (planecolormap->flags & CMF_FOG)) || mapnamespace == MNS_SRB2KART) ? lightlevel : 255; - polyplaneinfo[numpolyplanes].levelflat = levelflat; - polyplaneinfo[numpolyplanes].polysector = polysector; - polyplaneinfo[numpolyplanes].alpha = alpha; - polyplaneinfo[numpolyplanes].FOFSector = FOFSector; - polyplaneinfo[numpolyplanes].blend = blend; - polyplaneinfo[numpolyplanes].planecolormap = planecolormap; - polyplaneinfo[numpolyplanes].drawcount = drawcount++; - numpolyplanes++; -} - // putting sortindex and sortnode here so the comparator function can see them gl_drawnode_t *sortnode; size_t *sortindex; diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 87178ede7..f75e435f6 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -165,6 +165,64 @@ extern size_t numwalls; // a list of transparent walls to be drawn #define MAX_TRANSPARENTWALL 256 +// a vertex of a Doom 'plane' polygon +typedef struct +{ + float x; + float y; + float z; +} polyvertex_t; + +// a convex 'plane' polygon, clockwise order +typedef struct +{ + INT32 numpts; + polyvertex_t pts[]; +} poly_t; + +// holds extra info for 3D render, for each subsector in subsectors[] +typedef struct +{ + poly_t *planepoly; // the generated convex polygon +} extrasubsector_t; + +typedef struct +{ + extrasubsector_t *xsub; + boolean isceiling; + fixed_t fixedheight; + INT32 lightlevel; + levelflat_t *levelflat; + INT32 alpha; + sector_t *FOFSector; + FBITFIELD blend; + boolean fogplane; + extracolormap_t *planecolormap; + INT32 drawcount; +} planeinfo_t; + +extern size_t numplanes; // a list of transparent floors to be drawn +extern planeinfo_t *planeinfo; + +#define MAX_TRANSPARENTFLOOR 512 + +typedef struct +{ + polyobj_t *polysector; + boolean isceiling; + fixed_t fixedheight; + INT32 lightlevel; + levelflat_t *levelflat; + INT32 alpha; + sector_t *FOFSector; + FBITFIELD blend; + extracolormap_t *planecolormap; + INT32 drawcount; +} polyplaneinfo_t; + +extern size_t numpolyplanes; // a list of transparent poyobject floors to be drawn +extern polyplaneinfo_t *polyplaneinfo; + // Render stats extern precise_t ps_hw_skyboxtime; extern precise_t ps_hw_nodesorttime; diff --git a/src/hardware/hw_plane.c b/src/hardware/hw_plane.c index a65f4d5a1..4236b28c4 100644 --- a/src/hardware/hw_plane.c +++ b/src/hardware/hw_plane.c @@ -423,4 +423,64 @@ void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t HWR_ProcessPolygon(&Surf, planeVerts, nrPlaneVerts, blendmode, shader, false); } + +// This will likely turn into a copy of HWR_Add3DWater and replace it. +void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap) +{ + static size_t allocedplanes = 0; + + // Force realloc if buffer has been freed + if (!planeinfo) + allocedplanes = 0; + + if (allocedplanes < numplanes + 1) + { + allocedplanes += MAX_TRANSPARENTFLOOR; + Z_Realloc(planeinfo, allocedplanes * sizeof (*planeinfo), PU_LEVEL, &planeinfo); + } + + planeinfo[numplanes].isceiling = isceiling; + planeinfo[numplanes].fixedheight = fixedheight; + planeinfo[numplanes].lightlevel = ((planecolormap && (planecolormap->flags & CMF_FOG)) || mapnamespace == MNS_SRB2KART) ? lightlevel : 255; + planeinfo[numplanes].levelflat = levelflat; + planeinfo[numplanes].xsub = xsub; + planeinfo[numplanes].alpha = alpha; + planeinfo[numplanes].FOFSector = FOFSector; + planeinfo[numplanes].blend = blend; + planeinfo[numplanes].fogplane = fogplane; + planeinfo[numplanes].planecolormap = planecolormap; + planeinfo[numplanes].drawcount = drawcount++; + + numplanes++; +} + +// Adding this for now until I can create extrasubsector info for polyobjects +// When that happens it'll just be done through HWR_AddTransparentFloor and HWR_RenderPlane +void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap) +{ + static size_t allocedpolyplanes = 0; + + // Force realloc if buffer has been freed + if (!polyplaneinfo) + allocedpolyplanes = 0; + + if (allocedpolyplanes < numpolyplanes + 1) + { + allocedpolyplanes += MAX_TRANSPARENTFLOOR; + Z_Realloc(polyplaneinfo, allocedpolyplanes * sizeof (*polyplaneinfo), PU_LEVEL, &polyplaneinfo); + } + + polyplaneinfo[numpolyplanes].isceiling = isceiling; + polyplaneinfo[numpolyplanes].fixedheight = fixedheight; + polyplaneinfo[numpolyplanes].lightlevel = ((planecolormap && (planecolormap->flags & CMF_FOG)) || mapnamespace == MNS_SRB2KART) ? lightlevel : 255; + polyplaneinfo[numpolyplanes].levelflat = levelflat; + polyplaneinfo[numpolyplanes].polysector = polysector; + polyplaneinfo[numpolyplanes].alpha = alpha; + polyplaneinfo[numpolyplanes].FOFSector = FOFSector; + polyplaneinfo[numpolyplanes].blend = blend; + polyplaneinfo[numpolyplanes].planecolormap = planecolormap; + polyplaneinfo[numpolyplanes].drawcount = drawcount++; + numpolyplanes++; +} + #endif