diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index 71df75dd33e8ae20a394bb97670bb3a49efb5fe1..7034c769c6dd2a0431417ba486fa2c9c4bb05346 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -804,57 +804,18 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex) static void HWR_CacheFlat(GLMipmap_t *grMipmap, lumpnum_t flatlumpnum) { - size_t size, pflatsize; + size_t size = W_LumpLength(flatlumpnum); + UINT16 pflatsize = R_GetFlatSize(size); // setup the texture info grMipmap->format = GL_TEXFMT_P_8; grMipmap->flags = TF_WRAPXY|TF_CHROMAKEYED; - size = W_LumpLength(flatlumpnum); - - switch (size) - { - case 4194304: // 2048x2048 lump - pflatsize = 2048; - break; - case 1048576: // 1024x1024 lump - pflatsize = 1024; - break; - case 262144:// 512x512 lump - pflatsize = 512; - break; - case 65536: // 256x256 lump - pflatsize = 256; - break; - case 16384: // 128x128 lump - pflatsize = 128; - break; - case 1024: // 32x32 lump - pflatsize = 32; - break; - case 256: // 16x16 lump - pflatsize = 16; - break; - case 64: // 8x8 lump - pflatsize = 8; - break; - case 16: // 4x4 lump - pflatsize = 4; - break; - case 4: // 2x2 lump - pflatsize = 2; - break; - default: // 64x64 lump - pflatsize = 64; - break; - } - - grMipmap->width = (UINT16)pflatsize; - grMipmap->height = (UINT16)pflatsize; + grMipmap->width = pflatsize; + grMipmap->height = pflatsize; // the flat raw data needn't be converted with palettized textures - W_ReadLump(flatlumpnum, Z_Malloc(W_LumpLength(flatlumpnum), - PU_HWRCACHE, &grMipmap->data)); + W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &grMipmap->data)); } static void HWR_CacheTextureAsFlat(GLMipmap_t *grMipmap, INT32 texturenum) diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index ee4448f6066d4dea7d59ba9689103e91f2fb21bc..26c3537988d0a4fe73008f642fed404507650323 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -575,58 +575,10 @@ void HWR_DrawPic(INT32 x, INT32 y, lumpnum_t lumpnum) // -------------------------------------------------------------------------- void HWR_DrawFlatFill (INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum) { - FOutVector v[4]; - double dflatsize; - INT32 flatflag; + FOutVector v[4]; const size_t len = W_LumpLength(flatlumpnum); - - switch (len) - { - case 4194304: // 2048x2048 lump - dflatsize = 2048.0f; - flatflag = 2047; - break; - case 1048576: // 1024x1024 lump - dflatsize = 1024.0f; - flatflag = 1023; - break; - case 262144:// 512x512 lump - dflatsize = 512.0f; - flatflag = 511; - break; - case 65536: // 256x256 lump - dflatsize = 256.0f; - flatflag = 255; - break; - case 16384: // 128x128 lump - dflatsize = 128.0f; - flatflag = 127; - break; - case 1024: // 32x32 lump - dflatsize = 32.0f; - flatflag = 31; - break; - case 256: // 16x16 lump - dflatsize = 16.0f; - flatflag = 15; - break; - case 64: // 8x8 lump - dflatsize = 8.0f; - flatflag = 7; - break; - case 16: // 4x4 lump - dflatsize = 4.0f; - flatflag = 3; - break; - case 4: // 2x2 lump - dflatsize = 2.0f; - flatflag = 1; - break; - default: // 64x64 lump - dflatsize = 64.0f; - flatflag = 63; - break; - } + UINT16 flatflag = R_GetFlatSize(len) - 1; + double dflatsize = (double)(flatflag + 1); // 3--2 // | /| @@ -640,7 +592,6 @@ void HWR_DrawFlatFill (INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; - // flat is 64x64 lod and texture offsets are [0.0, 1.0] v[0].s = v[3].s = (float)((x & flatflag)/dflatsize); v[2].s = v[1].s = (float)(v[0].s + w/dflatsize); v[0].t = v[1].t = (float)((y & flatflag)/dflatsize); diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 803fdd7bc19f6f3eebb0886d4cfa517f6d822c0f..410a060cd5d4358331c9ae04045d2f984683c97e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -358,30 +358,39 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, angle_t dir, fixed_t delta) // -----------------+ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, levelflat_t *levelflat, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap) { - polyvertex_t * pv; - float height; //constant y for all points on the convex flat polygon - FOutVector *v3d; - INT32 nrPlaneVerts; //verts original define of convex flat polygon - INT32 i; - float flatxref,flatyref; + FSurfaceInfo Surf; + FOutVector *v3d; + polyvertex_t *pv; + pslope_t *slope = NULL; + INT32 shader = SHADER_DEFAULT; + + size_t nrPlaneVerts; + INT32 i; + + float height; // constant y for all points on the convex flat polygon + float flatxref, flatyref, anglef = 0.0f; float fflatwidth = 64.0f, fflatheight = 64.0f; - INT32 flatflag = 63; + UINT16 flatflag = 63; + boolean texflat = false; - float scrollx = 0.0f, scrolly = 0.0f, anglef = 0.0f; - angle_t angle = 0; - FSurfaceInfo Surf; + float tempxsow, tempytow; - pslope_t *slope = NULL; + float scrollx = 0.0f, scrolly = 0.0f; + angle_t angle = 0; static FOutVector *planeVerts = NULL; static UINT16 numAllocedPlaneVerts = 0; - INT32 shader = SHADER_DEFAULT; - // no convex poly were generated for this subsector if (!xsub->planepoly) return; + pv = xsub->planepoly->pts; + nrPlaneVerts = xsub->planepoly->numpts; + + if (nrPlaneVerts < 3) // not even a triangle? + return; + // Get the slope pointer to simplify future code if (FOFsector) { @@ -404,12 +413,6 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool height = FIXED_TO_FLOAT(fixedheight); - pv = xsub->planepoly->pts; - nrPlaneVerts = xsub->planepoly->numpts; - - if (nrPlaneVerts < 3) //not even a triangle ? - return; - // Allocate plane-vertex buffer if we need to if (!planeVerts || nrPlaneVerts > numAllocedPlaneVerts) { @@ -424,43 +427,8 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool if (levelflat->type == LEVELFLAT_FLAT) { size_t len = W_LumpLength(levelflat->u.flat.lumpnum); - switch (len) - { - case 4194304: // 2048x2048 lump - fflatwidth = fflatheight = 2048.0f; - break; - case 1048576: // 1024x1024 lump - fflatwidth = fflatheight = 1024.0f; - break; - case 262144:// 512x512 lump - fflatwidth = fflatheight = 512.0f; - break; - case 65536: // 256x256 lump - fflatwidth = fflatheight = 256.0f; - break; - case 16384: // 128x128 lump - fflatwidth = fflatheight = 128.0f; - break; - case 1024: // 32x32 lump - fflatwidth = fflatheight = 32.0f; - break; - case 256: // 16x16 lump - fflatwidth = fflatheight = 16.0f; - break; - case 64: // 8x8 lump - fflatwidth = fflatheight = 8.0f; - break; - case 16: // 4x4 lump - fflatwidth = fflatheight = 4.0f; - break; - case 4: // 2x2 lump - fflatwidth = fflatheight = 2.0f; - break; - default: // 64x64 lump - fflatwidth = fflatheight = 64.0f; - break; - } - flatflag = ((INT32)fflatwidth)-1; + flatflag = R_GetFlatSize(len) - 1; + fflatwidth = fflatheight = (float)(flatflag + 1); } else { @@ -560,7 +528,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool }\ } - for (i = 0, v3d = planeVerts; i < nrPlaneVerts; i++,v3d++,pv++) + for (i = 0, v3d = planeVerts; i < (INT32)nrPlaneVerts; i++,v3d++,pv++) SETUP3DVERT(v3d, pv->x, pv->y); if (slope) @@ -2721,13 +2689,13 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, float height = FIXED_TO_FLOAT(fixedheight); // constant y for all points on the convex flat polygon float flatxref, flatyref; float fflatwidth = 64.0f, fflatheight = 64.0f; - INT32 flatflag = 63; + UINT16 flatflag = 63; boolean texflat = false; float scrollx = 0.0f, scrolly = 0.0f; + float tempxsow, tempytow, anglef = 0.0f; angle_t angle = 0; - fixed_t tempxs, tempyt; static FOutVector *planeVerts = NULL; static UINT16 numAllocedPlaneVerts = 0; @@ -2754,43 +2722,8 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, if (levelflat->type == LEVELFLAT_FLAT) { size_t len = W_LumpLength(levelflat->u.flat.lumpnum); - switch (len) - { - case 4194304: // 2048x2048 lump - fflatwidth = fflatheight = 2048.0f; - break; - case 1048576: // 1024x1024 lump - fflatwidth = fflatheight = 1024.0f; - break; - case 262144:// 512x512 lump - fflatwidth = fflatheight = 512.0f; - break; - case 65536: // 256x256 lump - fflatwidth = fflatheight = 256.0f; - break; - case 16384: // 128x128 lump - fflatwidth = fflatheight = 128.0f; - break; - case 1024: // 32x32 lump - fflatwidth = fflatheight = 32.0f; - break; - case 256: // 16x16 lump - fflatwidth = fflatheight = 16.0f; - break; - case 64: // 8x8 lump - fflatwidth = fflatheight = 8.0f; - break; - case 16: // 4x4 lump - fflatwidth = fflatheight = 4.0f; - break; - case 4: // 2x2 lump - fflatwidth = fflatheight = 2.0f; - break; - default: // 64x64 lump - fflatwidth = fflatheight = 64.0f; - break; - } - flatflag = ((INT32)fflatwidth)-1; + flatflag = R_GetFlatSize(len) - 1; + fflatwidth = fflatheight = (float)(flatflag + 1); } else { @@ -2853,20 +2786,13 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, if (angle) // Only needs to be done if there's an altered angle { - angle = (InvAngle(angle))>>ANGLETOFINESHIFT; + tempxsow = flatxref; + tempytow = flatyref; - // This needs to be done so that it scrolls in a different direction after rotation like software - /*tempxs = FLOAT_TO_FIXED(scrollx); - tempyt = FLOAT_TO_FIXED(scrolly); - scrollx = (FIXED_TO_FLOAT(FixedMul(tempxs, FINECOSINE(angle)) - FixedMul(tempyt, FINESINE(angle)))); - scrolly = (FIXED_TO_FLOAT(FixedMul(tempxs, FINESINE(angle)) + FixedMul(tempyt, FINECOSINE(angle))));*/ + anglef = ANG2RAD(InvAngle(angle)); - // This needs to be done so everything aligns after rotation - // It would be done so that rotation is done, THEN the translation, but I couldn't get it to rotate AND scroll like software does - tempxs = FLOAT_TO_FIXED(flatxref); - tempyt = FLOAT_TO_FIXED(flatyref); - flatxref = (FIXED_TO_FLOAT(FixedMul(tempxs, FINECOSINE(angle)) - FixedMul(tempyt, FINESINE(angle)))); - flatyref = (FIXED_TO_FLOAT(FixedMul(tempxs, FINESINE(angle)) + FixedMul(tempyt, FINECOSINE(angle)))); + flatxref = (tempxsow * cos(anglef)) - (tempytow * sin(anglef)); + flatyref = (tempxsow * sin(anglef)) + (tempytow * cos(anglef)); } for (i = 0; i < (INT32)nrPlaneVerts; i++,v3d++) @@ -2887,10 +2813,11 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, // Need to rotate before translate if (angle) // Only needs to be done if there's an altered angle { - tempxs = FLOAT_TO_FIXED(v3d->s); - tempyt = FLOAT_TO_FIXED(v3d->t); - v3d->s = (FIXED_TO_FLOAT(FixedMul(tempxs, FINECOSINE(angle)) - FixedMul(tempyt, FINESINE(angle)))); - v3d->t = (FIXED_TO_FLOAT(FixedMul(tempxs, FINESINE(angle)) + FixedMul(tempyt, FINECOSINE(angle)))); + tempxsow = v3d->s; + tempytow = v3d->t; + + v3d->s = (tempxsow * cos(anglef)) - (tempytow * sin(anglef)); + v3d->t = (tempxsow * sin(anglef)) + (tempytow * cos(anglef)); } v3d->x = FIXED_TO_FLOAT(polysector->vertices[i]->x); diff --git a/src/r_plane.c b/src/r_plane.c index 1d4614d405780fb8eb2b99828edb48c611066a38..3480531b601541eba18ca20e61ae743c1cc5a9b7 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -870,7 +870,6 @@ void R_DrawSinglePlane(visplane_t *pl) INT32 x; INT32 stop, angle; ffloor_t *rover; - INT32 type; INT32 spanfunctype = BASEDRAWFUNC; if (!(pl->minx <= pl->maxx)) @@ -883,8 +882,8 @@ void R_DrawSinglePlane(visplane_t *pl) return; } + levelflat = &levelflats[pl->picnum]; planeripple.active = false; - spanfunc = spanfuncs[BASEDRAWFUNC]; if (pl->polyobj) { @@ -995,29 +994,25 @@ void R_DrawSinglePlane(visplane_t *pl) light = (pl->lightlevel >> LIGHTSEGSHIFT); } - currentplane = pl; ds_powersoftwo = false; - levelflat = &levelflats[pl->picnum]; /* :james: */ - type = levelflat->type; - switch (type) + switch (levelflat->type) { case LEVELFLAT_NONE: return; case LEVELFLAT_FLAT: ds_source = (UINT8 *)R_GetFlat(levelflat->u.flat.lumpnum); - R_CheckFlatLength(W_LumpLength(levelflat->u.flat.lumpnum)); - ds_powersoftwo = true; // Raw flats always have dimensions that are powers-of-two numbers. + R_SetFlatVars(W_LumpLength(levelflat->u.flat.lumpnum)); + ds_powersoftwo = true; break; default: ds_source = (UINT8 *)R_GetLevelFlat(levelflat); if (!ds_source) return; - // Check if this texture or patch has power-of-two dimensions. - if (R_CheckPowersOfTwo()) + else if (R_CheckPowersOfTwo()) { - R_CheckFlatLength(ds_flatwidth * ds_flatheight); + R_SetFlatVars(ds_flatwidth * ds_flatheight); ds_powersoftwo = true; } } @@ -1091,7 +1086,7 @@ void R_DrawSinglePlane(visplane_t *pl) planezlight = zlight[light]; } - // Use the correct span drawer depending on the powers-of-twoness + // Set the span drawer if (!ds_powersoftwo) { if (spanfuncs_npo2[spanfunctype]) @@ -1108,6 +1103,7 @@ void R_DrawSinglePlane(visplane_t *pl) pl->bottom[pl->maxx+1] = 0x0000; pl->bottom[pl->minx-1] = 0x0000; + currentplane = pl; stop = pl->maxx + 1; if (pl->slope) diff --git a/src/r_splats.c b/src/r_splats.c index 594565a066bbd8f46783656899392a5b1acb7a58..d3783094fa7dbfdaad027823edb1c98b90c78848 100644 --- a/src/r_splats.c +++ b/src/r_splats.c @@ -416,7 +416,7 @@ static void R_RasterizeFloorSplat(floorsplat_t *pSplat, vector2_t *verts, visspr if (R_CheckPowersOfTwo()) { - R_CheckFlatLength(ds_flatwidth * ds_flatheight); + R_SetFlatVars(ds_flatwidth * ds_flatheight); ds_powersoftwo = true; } diff --git a/src/r_textures.c b/src/r_textures.c index 3b48cbb269ee1d892496fd954c9eecbb589b03a5..c6d902c0943ca57c1b964764be42d26279ca446c 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -619,9 +619,7 @@ void *R_GetLevelFlat(levelflat_t *levelflat) } // -// R_CheckPowersOfTwo -// -// Checks if the flat's dimensions are powers of two. +// Checks if the current flat's dimensions are powers of two // boolean R_CheckPowersOfTwo(void) { @@ -637,67 +635,67 @@ boolean R_CheckPowersOfTwo(void) } // -// R_CheckFlatLength -// -// Determine the flat's dimensions from its lump length. +// Returns the flat size corresponding to the length of a lump // -void R_CheckFlatLength(size_t length) +UINT16 R_GetFlatSize(size_t length) { - INT32 size, bits; - switch (length) { case 4194304: // 2048x2048 lump - size = 2048; - bits = 11; - break; + return 2048; case 1048576: // 1024x1024 lump - size = 1024; - bits = 10; - break; + return 1024; case 262144:// 512x512 lump - size = 512; - bits = 9; - break; + return 512; case 65536: // 256x256 lump - size = 256; - bits = 8; - break; + return 256; case 16384: // 128x128 lump - size = 128; - bits = 7; - break; + return 128; case 1024: // 32x32 lump - size = 32; - bits = 5; - break; + return 32; case 256: // 16x16 lump - size = 16; - bits = 4; - break; + return 16; case 64: // 8x8 lump - size = 8; - bits = 3; - break; + return 8; case 16: // 4x4 lump - size = 4; - bits = 2; - break; + return 4; case 4: // 2x2 lump - size = 2; - bits = 1; - break; + return 2; default: // 64x64 lump - size = 64; - bits = 6; - break; + return 64; + } +} + +// +// Determines a flat's width bits from its size +// +UINT8 R_GetFlatBits(INT32 size) +{ + switch (size) + { + case 2048: return 11; + case 1024: return 10; + case 512: return 9; + case 256: return 8; + case 128: return 7; + case 32: return 5; + case 16: return 4; + case 8: return 3; + case 4: return 2; + case 2: return 1; + default: return 6; // 64x64 } +} + +void R_SetFlatVars(size_t length) +{ + UINT16 size = R_GetFlatSize(length); + UINT8 bits = R_GetFlatBits(size); nflatshiftup = 16 - bits; nflatxshift = 16 + nflatshiftup; nflatyshift = nflatxshift - bits; nflatmask = (size - 1) * size; - ds_flatwidth = ds_flatheight = size; } // @@ -746,7 +744,7 @@ Rloadflats (INT32 i, INT32 w) UINT16 wadnum = (UINT16)w; lumpnum_t lumpnum = texstart + j; size_t lumplength; - size_t flatsize = 0; + size_t flatsize; if (wadfiles[w]->type == RET_PK3) { @@ -756,43 +754,7 @@ Rloadflats (INT32 i, INT32 w) flatlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); lumplength = W_LumpLengthPwad(wadnum, lumpnum); - - switch (lumplength) - { - case 4194304: // 2048x2048 lump - flatsize = 2048; - break; - case 1048576: // 1024x1024 lump - flatsize = 1024; - break; - case 262144:// 512x512 lump - flatsize = 512; - break; - case 65536: // 256x256 lump - flatsize = 256; - break; - case 16384: // 128x128 lump - flatsize = 128; - break; - case 1024: // 32x32 lump - flatsize = 32; - break; - case 256: // 16x16 lump - flatsize = 16; - break; - case 64: // 8x8 lump - flatsize = 8; - break; - case 16: // 4x4 lump - flatsize = 4; - break; - case 4: // 2x2 lump - flatsize = 2; - break; - default: // 64x64 lump - flatsize = 64; - break; - } + flatsize = R_GetFlatSize(lumplength); //CONS_Printf("\n\"%s\" is a flat, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),flatsize,flatsize); texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL); diff --git a/src/r_textures.h b/src/r_textures.h index 68811bb9355500a1db87be70fdd54dbdcb070502..14d4c8a7e46347cd984761f1afecb2f1f901d7d3 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -91,7 +91,9 @@ UINT8 *R_GetColumn(fixed_t tex, INT32 col); void *R_GetFlat(lumpnum_t flatnum); boolean R_CheckPowersOfTwo(void); -void R_CheckFlatLength(size_t length); +UINT16 R_GetFlatSize(size_t length); +UINT8 R_GetFlatBits(INT32 size); +void R_SetFlatVars(size_t length); // Returns the texture number for the texture name. INT32 R_TextureNumForName(const char *name); diff --git a/src/v_video.c b/src/v_video.c index dc81ee87f364784407664b64349878316be4db2d..43a9d8f82887734b91f536fc2274dfddfe12763a 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1705,7 +1705,7 @@ void V_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatnum) fixed_t dx, dy, xfrac, yfrac; const UINT8 *src, *deststop; UINT8 *flat, *dest; - size_t size, lflatsize, flatshift; + size_t lflatsize, flatshift; #ifdef HWRENDER if (rendermode == render_opengl) @@ -1715,55 +1715,8 @@ void V_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatnum) } #endif - size = W_LumpLength(flatnum); - - switch (size) - { - case 4194304: // 2048x2048 lump - lflatsize = 2048; - flatshift = 11; - break; - case 1048576: // 1024x1024 lump - lflatsize = 1024; - flatshift = 10; - break; - case 262144:// 512x512 lump - lflatsize = 512; - flatshift = 9; - break; - case 65536: // 256x256 lump - lflatsize = 256; - flatshift = 8; - break; - case 16384: // 128x128 lump - lflatsize = 128; - flatshift = 7; - break; - case 1024: // 32x32 lump - lflatsize = 32; - flatshift = 5; - break; - case 256: // 16x16 lump - lflatsize = 16; - flatshift = 4; - break; - case 64: // 8x8 lump - lflatsize = 8; - flatshift = 3; - break; - case 16: // 4x4 lump - lflatsize = 4; - flatshift = 2; - break; - case 4: // 2x2 lump - lflatsize = 2; - flatshift = 1; - break; - default: // 64x64 lump - lflatsize = 64; - flatshift = 6; - break; - } + lflatsize = R_GetFlatSize(W_LumpLength(flatnum)); + flatshift = R_GetFlatBits(lflatsize); flat = W_CacheLumpNum(flatnum, PU_CACHE);