From 7bed0ffeb6c578a3e54412ff5e0752ef4ff6cdf6 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 11 Jan 2017 18:25:14 +0100 Subject: [PATCH] Convert r_voxel to a class --- src/swrenderer/scene/r_bsp.cpp | 2 +- src/swrenderer/things/r_visiblesprite.cpp | 4 +-- src/swrenderer/things/r_voxel.cpp | 38 +++++++++++------------ src/swrenderer/things/r_voxel.h | 37 +++++++++++++++------- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/swrenderer/scene/r_bsp.cpp b/src/swrenderer/scene/r_bsp.cpp index d701a0e6a5..9daaa78789 100644 --- a/src/swrenderer/scene/r_bsp.cpp +++ b/src/swrenderer/scene/r_bsp.cpp @@ -871,7 +871,7 @@ namespace swrenderer } else if (sprite.voxel) { - R_ProjectVoxel(thing, sprite.pos, sprite.voxel, sprite.spriteScale, sprite.renderflags, fakeside, fakefloor, fakeceiling, sec, spriteshade); + RenderVoxel::Project(thing, sprite.pos, sprite.voxel, sprite.spriteScale, sprite.renderflags, fakeside, fakefloor, fakeceiling, sec, spriteshade); } else { diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index 2ac874d48e..8e5d7da117 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -106,7 +106,7 @@ namespace swrenderer void R_DeinitSprites() { R_DeinitVisSprites(); - R_DeinitRenderVoxel(); + RenderVoxel::Deinit(); // Free vissprites sorter if (spritesorter != nullptr) @@ -633,7 +633,7 @@ namespace swrenderer } int minvoxely = spr->gzt <= hzt ? 0 : xs_RoundToInt((spr->gzt - hzt) / spr->yscale); int maxvoxely = spr->gzb > hzb ? INT_MAX : xs_RoundToInt((spr->gzt - hzb) / spr->yscale); - R_DrawVisVoxel(spr, minvoxely, maxvoxely, cliptop, clipbot); + RenderVoxel::Render(spr, minvoxely, maxvoxely, cliptop, clipbot); } spr->Style.BaseColormap = colormap; spr->Style.ColormapNum = colormapnum; diff --git a/src/swrenderer/things/r_voxel.cpp b/src/swrenderer/things/r_voxel.cpp index 2e2e1dbb47..d3ae841284 100644 --- a/src/swrenderer/things/r_voxel.cpp +++ b/src/swrenderer/things/r_voxel.cpp @@ -43,14 +43,7 @@ EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor) namespace swrenderer { - namespace - { - FCoverageBuffer *OffscreenCoverageBuffer; - int OffscreenBufferWidth, OffscreenBufferHeight; - uint8_t *OffscreenColorBuffer; - } - - void R_ProjectVoxel(AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade) + void RenderVoxel::Project(AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade) { // transform the origin point double tr_x = pos.X - ViewPos.X; @@ -226,7 +219,7 @@ namespace swrenderer } } - void R_DrawVisVoxel(vissprite_t *sprite, int minZ, int maxZ, short *cliptop, short *clipbottom) + void RenderVoxel::Render(vissprite_t *sprite, int minZ, int maxZ, short *cliptop, short *clipbottom) { R_SetColorMapLight(sprite->Style.BaseColormap, 0, sprite->Style.ColormapNum << FRACBITS); bool visible = R_SetPatchStyle(sprite->Style.RenderStyle, sprite->Style.Alpha, sprite->Translation, sprite->FillColor); @@ -305,10 +298,10 @@ namespace swrenderer { for (int y = startY[index]; y != endY; y += stepY[index]) { - kvxslab_t *slab_start = R_GetSlabStart(mip, x, y); - kvxslab_t *slab_end = R_GetSlabEnd(mip, x, y); + kvxslab_t *slab_start = GetSlabStart(mip, x, y); + kvxslab_t *slab_end = GetSlabEnd(mip, x, y); - for (kvxslab_t *slab = slab_start; slab != slab_end; slab = R_NextSlab(slab)) + for (kvxslab_t *slab = slab_start; slab != slab_end; slab = NextSlab(slab)) { // To do: check slab->backfacecull @@ -327,7 +320,7 @@ namespace swrenderer voxel_pos.Y += dirY.X * x + dirY.Y * y; voxel_pos.Z += dirZ * z; - R_FillBox(voxel_pos, sprite_xscale, sprite_yscale, color, cliptop, clipbottom, false, false); + FillBox(voxel_pos, sprite_xscale, sprite_yscale, color, cliptop, clipbottom, false, false); } } } @@ -335,22 +328,22 @@ namespace swrenderer } } - kvxslab_t *R_GetSlabStart(const FVoxelMipLevel &mip, int x, int y) + kvxslab_t *RenderVoxel::GetSlabStart(const FVoxelMipLevel &mip, int x, int y) { return (kvxslab_t *)&mip.SlabData[mip.OffsetX[x] + (int)mip.OffsetXY[x * (mip.SizeY + 1) + y]]; } - kvxslab_t *R_GetSlabEnd(const FVoxelMipLevel &mip, int x, int y) + kvxslab_t *RenderVoxel::GetSlabEnd(const FVoxelMipLevel &mip, int x, int y) { - return R_GetSlabStart(mip, x, y + 1); + return GetSlabStart(mip, x, y + 1); } - kvxslab_t *R_NextSlab(kvxslab_t *slab) + kvxslab_t *RenderVoxel::NextSlab(kvxslab_t *slab) { return (kvxslab_t*)(((uint8_t*)slab) + 3 + slab->zleng); } - void R_FillBox(DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch) + void RenderVoxel::FillBox(DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch) { double viewX, viewY, viewZ; if (viewspace) @@ -402,7 +395,7 @@ namespace swrenderer } } - void R_DeinitRenderVoxel() + void RenderVoxel::Deinit() { // Free offscreen buffer if (OffscreenColorBuffer != nullptr) @@ -418,7 +411,7 @@ namespace swrenderer OffscreenBufferHeight = OffscreenBufferWidth = 0; } - void R_CheckOffscreenBuffer(int width, int height, bool spansonly) + void RenderVoxel::CheckOffscreenBuffer(int width, int height, bool spansonly) { // Allocates the offscreen coverage buffer and optionally the offscreen // color buffer. If they already exist but are the wrong size, they will @@ -460,6 +453,11 @@ namespace swrenderer OffscreenBufferHeight = height; } + FCoverageBuffer *RenderVoxel::OffscreenCoverageBuffer; + int RenderVoxel::OffscreenBufferWidth; + int RenderVoxel::OffscreenBufferHeight; + uint8_t *RenderVoxel::OffscreenColorBuffer; + //////////////////////////////////////////////////////////////////////////// FCoverageBuffer::FCoverageBuffer(int lists) diff --git a/src/swrenderer/things/r_voxel.h b/src/swrenderer/things/r_voxel.h index a9cb8e1ed2..93ec214e25 100644 --- a/src/swrenderer/things/r_voxel.h +++ b/src/swrenderer/things/r_voxel.h @@ -30,18 +30,6 @@ namespace swrenderer { struct vissprite_t; - enum { DVF_OFFSCREEN = 1, DVF_SPANSONLY = 2, DVF_MIRRORED = 4 }; - - void R_ProjectVoxel(AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade); - void R_DrawVisVoxel(vissprite_t *sprite, int minZ, int maxZ, short *cliptop, short *clipbottom); - void R_FillBox(DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch); - kvxslab_t *R_GetSlabStart(const FVoxelMipLevel &mip, int x, int y); - kvxslab_t *R_GetSlabEnd(const FVoxelMipLevel &mip, int x, int y); - kvxslab_t *R_NextSlab(kvxslab_t *slab); - - void R_CheckOffscreenBuffer(int width, int height, bool spansonly); - void R_DeinitRenderVoxel(); - // [RH] A c-buffer. Used for keeping track of offscreen voxel spans. struct FCoverageBuffer { @@ -63,4 +51,29 @@ namespace swrenderer Span *FreeSpans; unsigned int NumLists; }; + + class RenderVoxel + { + public: + static void Project(AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade); + static void Render(vissprite_t *sprite, int minZ, int maxZ, short *cliptop, short *clipbottom); + + static void Deinit(); + + private: + enum { DVF_OFFSCREEN = 1, DVF_SPANSONLY = 2, DVF_MIRRORED = 4 }; + + static void FillBox(DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch); + + static kvxslab_t *GetSlabStart(const FVoxelMipLevel &mip, int x, int y); + static kvxslab_t *GetSlabEnd(const FVoxelMipLevel &mip, int x, int y); + static kvxslab_t *NextSlab(kvxslab_t *slab); + + static void CheckOffscreenBuffer(int width, int height, bool spansonly); + + static FCoverageBuffer *OffscreenCoverageBuffer; + static int OffscreenBufferWidth; + static int OffscreenBufferHeight; + static uint8_t *OffscreenColorBuffer; + }; }