From 4f6420274fc9007deb3a57db1b1c9d0c0e94c2bd Mon Sep 17 00:00:00 2001 From: Jaime Passos Date: Mon, 6 Jul 2020 01:26:56 -0300 Subject: [PATCH] Remove Software tricks --- src/CMakeLists.txt | 1 - src/Makefile | 2 +- src/hardware/hw_main.c | 48 +- src/hardware/hw_main.h | 2 - src/hardware/hw_trick.c | 914 ------------------ src/p_setup.c | 13 - src/r_defs.h | 25 - src/sdl/Srb2SDL-vc10.vcxproj | 1 - src/sdl/Srb2SDL-vc10.vcxproj.filters | 3 - src/sdl/Srb2SDL-vc9.vcproj | 40 - src/sdl/Srb2SDL.dsp | 26 +- src/sdl/macosx/Srb2mac.pbproj/project.pbxproj | 7 - .../macosx/Srb2mac.xcodeproj/project.pbxproj | 4 - src/win32/Srb2win-vc10.vcxproj | 1 - src/win32/Srb2win-vc10.vcxproj.filters | 3 - src/win32/Srb2win-vc9.vcproj | 40 - src/win32/Srb2win.dsp | 26 +- 17 files changed, 34 insertions(+), 1122 deletions(-) delete mode 100644 src/hardware/hw_trick.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7a3f0564d..cdcce0faa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -429,7 +429,6 @@ if(${SRB2_CONFIG_HWRENDER}) ${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2load.c ${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md3load.c ${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_model.c - ${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_trick.c ${CMAKE_CURRENT_SOURCE_DIR}/hardware/u_list.c ) diff --git a/src/Makefile b/src/Makefile index e00c84bc9..606e65930 100644 --- a/src/Makefile +++ b/src/Makefile @@ -224,7 +224,7 @@ ifdef NOHW else OPTS+=-DHWRENDER OBJS+=$(OBJDIR)/hw_bsp.o $(OBJDIR)/hw_draw.o $(OBJDIR)/hw_light.o \ - $(OBJDIR)/hw_main.o $(OBJDIR)/hw_clip.o $(OBJDIR)/hw_md2.o $(OBJDIR)/hw_cache.o $(OBJDIR)/hw_trick.o \ + $(OBJDIR)/hw_main.o $(OBJDIR)/hw_clip.o $(OBJDIR)/hw_md2.o $(OBJDIR)/hw_cache.o \ $(OBJDIR)/hw_md2load.o $(OBJDIR)/hw_md3load.o $(OBJDIR)/hw_model.o $(OBJDIR)/u_list.o $(OBJDIR)/hw_batching.o endif diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index f07cb24d8..f4beed61e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2990,34 +2990,10 @@ static void HWR_Subsector(size_t num) //gr_cursectorlight.blue = light; //gr_cursectorlight.alpha = light; -// ----- for special tricks with HW renderer ----- - if (gr_frontsector->pseudoSector) - { - cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight; - cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; - } - else if (gr_frontsector->virtualFloor) - { - ///@TODO Is this whole virtualFloor mess even useful? I don't think it even triggers ever. - cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight; - if (gr_frontsector->virtualCeiling) - cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; - else - cullCeilingHeight = locCeilingHeight = gr_frontsector->ceilingheight; - } - else if (gr_frontsector->virtualCeiling) - { - cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; - cullFloorHeight = locFloorHeight = gr_frontsector->floorheight; - } - else - { - cullFloorHeight = P_GetSectorFloorZAt (gr_frontsector, viewx, viewy); - cullCeilingHeight = P_GetSectorCeilingZAt(gr_frontsector, viewx, viewy); - locFloorHeight = P_GetSectorFloorZAt (gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); - locCeilingHeight = P_GetSectorCeilingZAt(gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); - } -// ----- end special tricks ----- + cullFloorHeight = P_GetSectorFloorZAt (gr_frontsector, viewx, viewy); + cullCeilingHeight = P_GetSectorCeilingZAt(gr_frontsector, viewx, viewy); + locFloorHeight = P_GetSectorFloorZAt (gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + locCeilingHeight = P_GetSectorCeilingZAt(gr_frontsector, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); if (gr_frontsector->ffloors) { @@ -3327,7 +3303,7 @@ static void HWR_RenderBSPNode(INT32 bspnum) // Decide which side the view point is on INT32 side; - + rs_numbspcalls++; // Found a subsector? @@ -4189,7 +4165,7 @@ static int CompareVisSprites(const void *p1, const void *p2) gr_vissprite_t* spr2 = *(gr_vissprite_t*const*)p2; int idiff; float fdiff; - + // Make transparent sprites last. Comment from the previous sort implementation: // Sryder: Oh boy, while it's nice having ALL the sprites sorted properly, it fails when we bring MD2's into the // mix and they want to be translucent. So let's place all the translucent sprites and MD2's AFTER @@ -4411,7 +4387,7 @@ static void HWR_CreateDrawNodes(void) // However, in reality we shouldn't be re-copying and shifting all this information // that is already lying around. This should all be in some sort of linked list or lists. sortindex = Z_Calloc(sizeof(size_t) * (numplanes + numpolyplanes + numwalls), PU_STATIC, NULL); - + rs_hw_nodesorttime = I_GetTimeMicros(); for (i = 0; i < numplanes; i++, p++) @@ -4431,7 +4407,7 @@ static void HWR_CreateDrawNodes(void) sortnode[p].wall = &wallinfo[i]; sortindex[p] = p; } - + rs_numdrawnodes = p; // p is the number of stuff to sort @@ -4468,7 +4444,7 @@ static void HWR_CreateDrawNodes(void) } rs_hw_nodesorttime = I_GetTimeMicros() - rs_hw_nodesorttime; - + rs_hw_nodedrawtime = I_GetTimeMicros(); // Okay! Let's draw it all! Woo! @@ -4505,7 +4481,7 @@ static void HWR_CreateDrawNodes(void) sortnode[sortindex[i]].wall->lightlevel, sortnode[sortindex[i]].wall->wallcolormap); } } - + rs_hw_nodedrawtime = I_GetTimeMicros() - rs_hw_nodedrawtime; numwalls = 0; @@ -5721,7 +5697,6 @@ consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_SAVE|CV_CALL, grfilt consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t, CV_granisotropic_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grbatching = {"gr_batching", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -5761,9 +5736,8 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_grshaders); CV_RegisterVar(&cv_grfiltermode); - CV_RegisterVar(&cv_grcorrecttricks); CV_RegisterVar(&cv_grsolvetjoin); - + CV_RegisterVar(&cv_renderstats); CV_RegisterVar(&cv_grbatching); diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 21bd7ddb3..7336bba0f 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -52,7 +52,6 @@ boolean HWR_Screenshot(const char *pathname); void HWR_AddCommands(void); void HWR_AddSessionCommands(void); -void HWR_CorrectSWTricks(void); void transform(float *cx, float *cy, float *cz); FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf); INT32 HWR_GetTextureUsed(void); @@ -87,7 +86,6 @@ extern consvar_t cv_grmodelinterpolation; extern consvar_t cv_grmodellighting; extern consvar_t cv_grfiltermode; extern consvar_t cv_granisotropicmode; -extern consvar_t cv_grcorrecttricks; extern consvar_t cv_fovchange; extern consvar_t cv_grsolvetjoin; extern consvar_t cv_grshearing; diff --git a/src/hardware/hw_trick.c b/src/hardware/hw_trick.c deleted file mode 100644 index 82d81b5b2..000000000 --- a/src/hardware/hw_trick.c +++ /dev/null @@ -1,914 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// Copyright (C) 1998-2001 by DooM Legacy Team. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -//----------------------------------------------------------------------------- -/// \file -/// \brief special trick routines to make some SW tricks look OK with -/// HW rendering. This includes: -/// - deepwatereffect (e.g. tnt/map02) -/// - invisible staircase (e.g. eternal/map02) -/// - floating ceilings (e.g. eternal/map03) -/// -/// It is not guaranteed that it looks identical to the SW mode, -/// but it looks in most of the cases far better than having -/// holes in the architecture, HOM, etc. -/// -/// It fixes as well missing textures, which are replaced by either -/// a default texture or the midtexture. -/// -/// words of notice: -/// pseudosectors, as mentioned in this file, are sectors where both -/// sidedefs point to the same sector. This expression is also used -/// for sectors which are enclosed by another sector but have no -/// correct sidedefs at all -/// -/// if a vertex is inside a poly is determined by the angles between -/// this vertex and all angles on the linedefs (imagine walking along -/// a circle always facing a certain point inside/outside the circle; -/// if inside, angle have taken all values [0..pi), otherwise the -/// range was < pi/2 - -#include -#include "../doomdef.h" -#include "../doomstat.h" - -#ifdef HWRENDER -#include "hw_glob.h" -#include "hw_dll.h" -#include "../r_local.h" -#include "../i_system.h" - -// -// add a line to a sectors list of lines -// -static void addLineToChain(sector_t *sector, line_t *line) -{ - linechain_t *thisElem = NULL, *nextElem; - - if (!sector) - return; - - nextElem = sector->sectorLines; - - while (nextElem) // walk through chain - { - thisElem = nextElem; - nextElem = thisElem->next; - } - - // add a new element into the chain - if (thisElem) - { - thisElem->next = malloc(sizeof (linechain_t)); - if (thisElem->next) - { - thisElem->next->line = line; - thisElem->next->next = NULL; - } - else - { - I_Error("Out of memory in addLineToChain(.)\n"); - } - } - else // first element in chain - { - sector->sectorLines = malloc(sizeof (linechain_t)); - if (sector->sectorLines) - { - sector->sectorLines->line = line; - sector->sectorLines->next = NULL; - } - else - { - I_Error("Out of memory in addLineToChain(.)\n"); - } - } -} - -// -// We dont want a memory hole, do we?;-) -// -static void releaseLineChains(void) -{ - linechain_t *thisElem, *nextElem; - sector_t *sector; - size_t i; - - for (i = 0; i < numsectors; i++) - { - sector = §ors[i]; - nextElem = sector->sectorLines; - - while (nextElem) - { - thisElem = nextElem; - nextElem = thisElem->next; - free(thisElem); - } - - sector->sectorLines = NULL; - } -} - -// -// check if a pseudo sector is valid by checking all its linedefs -// -static boolean isPSectorValid(sector_t *sector) -{ - linechain_t *thisElem, *nextElem; - - if (!sector->pseudoSector) // check only pseudosectors, others dont care - { -#ifdef PARANOIA - CONS_Debug(DBG_RENDER, "Alert! non-pseudosector fed to isPSectorClosed()\n"); -#endif - return false; - } - - nextElem = sector->sectorLines; - - while (nextElem) - { - thisElem = nextElem; - nextElem = thisElem->next; - if (thisElem->line->frontsector != thisElem->line->backsector) - return false; - } - return true; -} - -// -// angles are always phiMax-phiMin [0...2\pi) -// -FUNCMATH static double phiDiff(double phiMin, double phiMax) -{ - double result; - - result = phiMax-phiMin; - - if (result < 0.0l) - result += 2.0l*M_PIl; - - return result; -} - -// -// sort phi's so that enclosed angle < \pi -// -static void sortPhi(double phi1, double phi2, double *phiMin, double *phiMax) -{ - if (phiDiff(phi1, phi2) < M_PIl) - { - *phiMin = phi1; - *phiMax = phi2; - } - else - { - *phiMin = phi2; - *phiMax = phi1; - } -} - -// -// return if angle(phi1, phi2) is bigger than \pi -// if so, the vertex lies inside the poly -// -FUNCMATH static boolean biggerThanPi(double phi1, double phi2) -{ - if (phiDiff(phi1, phi2) > M_PIl) - return true; - - return false; -} - -#define DELTAPHI (M_PIl/100.0l) // some small phi << \pi - -// -// calculate bounds for minimum angle -// -static void phiBounds(double phi1, double phi2, double *phiMin, double *phiMax) -{ - double phi1Tmp, phi2Tmp; - double psi1, psi2, psi3, psi4, psi5, psi6, psi7; // for optimization - - sortPhi(phi1, phi2, &phi1Tmp, &phi2Tmp); - phi1 = phi1Tmp; - phi2 = phi2Tmp; - - // check start condition - if (*phiMin > M_PIl || *phiMax > M_PIl) - { - *phiMin = phi1; - *phiMax = phi2; - return; - } - - // 6 cases: - // new angles inbetween phiMin, phiMax -> forget it - // new angles enclose phiMin -> set phiMin - // new angles enclose phiMax -> set phiMax - // new angles completely outside phiMin, phiMax -> leave largest area free - // new angles close the range completely! - // new angles enlarges range on both sides - - psi1 = phiDiff(*phiMin, phi1); - psi2 = phiDiff(*phiMin, phi2); - psi3 = phiDiff(*phiMax, phi1); - psi4 = phiDiff(*phiMax, phi2); - psi5 = phiDiff(*phiMin, *phiMax); - psi6 = (double)(2.0l*M_PIl - psi5); // phiDiff(*phiMax, *phiMin); - psi7 = (double)(2.0l*M_PIl - psi2); // phiDiff(phi2, *phiMin); - - // case 1 & 5! - if ((psi1 <= psi5) && (psi2 <= psi5)) - { - if (psi1 <= psi2) // case 1 - { - return; - } - else // case 5 - { - // create some artificial interval here not to get into numerical trouble - // in fact we know now the sector is completely enclosed -> base for computational optimization - *phiMax = 0.0l; - *phiMin = DELTAPHI; - return; - } - } - - // case 2 - if ((psi1 >= psi5) && (psi2 <= psi5)) - { - *phiMin = phi1; - return; - } - - // case 3 - if ((psi3 >= psi6) && (psi4 <= psi6)) - { - *phiMax = phi2; - return; - } - - // case 4 & 6 -#ifdef PARANOIA - if ((psi3 <= psi6) && (psi4 <= psi6)) // FIXME: isn't this case implicitly true anyway?? -#endif - { - if (psi3 <= psi4) //case 4 - { - if (psi3 >= psi7) - { - *phiMin = phi1; - return; - } - else - { - *phiMax = phi2; - return; - } - } - else // case 6 - { - *phiMin = phi1; - *phiMax = phi2; - return; - } - } - -#ifdef PARANOIA - CONS_Debug(DBG_RENDER, "phiMin = %f, phiMax = %f, phi1 = %f, phi2 = %f\n", *phiMin, *phiMax, phi1, phi2); - I_Error("phiBounds() out of range!\n"); -#endif -} - -// -// Check if a vertex lies inside a sector -// This works for "well-behaved" convex polygons -// If we need it mathematically correct, we need to sort the -// linedefs first so we have them in a row, then walk along the linedefs, -// but this is a bit overdone -// -static inline boolean isVertexInside(vertex_t *vertex, sector_t *sector) -{ - double xa, ya, xe, ye; - linechain_t *chain; - double phiMin, phiMax; - double phi1, phi2; - - chain = sector->sectorLines; - phiMin = phiMax = 10.0l*M_PIl; // some value > \pi - - while (chain) - { - // start and end vertex - xa = (double)chain->line->v1->x - (double)vertex->x; - ya = (double)chain->line->v1->y - (double)vertex->y; - xe = (double)chain->line->v2->x - (double)vertex->x; - ye = (double)chain->line->v2->y - (double)vertex->y; - - // angle phi of connection between the vertices and the x-axis - phi1 = atan2(ya, xa); - phi2 = atan2(ye, xe); - - // if we have just started, we can have to create start bounds for phi - - phiBounds(phi1, phi2, &phiMin, &phiMax); - chain = chain->next; - } - - return biggerThanPi(phiMin, phiMax); -} - - -#define MAXSTACK 256 // Not more than 256 polys in each other? -// -// generate a list of sectors which enclose the given sector -// -static void generateStacklist(sector_t *thisSector) -{ - size_t i, stackCnt = 0; - sector_t *locStacklist[MAXSTACK]; - sector_t *checkSector; - - for (i = 0; i < numsectors; i++) - { - checkSector = §ors[i]; - - if (checkSector == thisSector) // dont check self - continue; - - // buggy sector? - if (!thisSector->sectorLines) - continue; - - // check if an arbitrary vertex of thisSector lies inside the checkSector - if (isVertexInside(thisSector->sectorLines->line->v1, checkSector)) - { - // if so, the thisSector lies inside the checkSector - locStacklist[stackCnt] = checkSector; - stackCnt++; - - if (MAXSTACK-1 == stackCnt) // beware of the SIGSEGV! and consider terminating NULL! - break; - } - } - - thisSector->stackList = malloc(sizeof (sector_t *) * (stackCnt+1)); - if (NULL == thisSector->stackList) - { - I_Error("Out of memory error in generateStacklist()"); - } - - locStacklist[stackCnt] = NULL; // terminating NULL - - memcpy(thisSector->stackList, locStacklist, sizeof (sector_t *) * (stackCnt+1)); -} - -// -// Bubble sort the stacklist with rising lineoutlengths -// -static void sortStacklist(sector_t *sector) -{ - sector_t **list; - sector_t *sec1, *sec2; - boolean finished; - size_t i; - - list = sector->stackList; - finished = false; - - if (!*list) - return; // nothing to sort - - while (!finished) - { - i = 0; - finished = true; - - while (*(list+i+1)) - { - sec1 = *(list+i); - sec2 = *(list+i+1); - - if (sec1->lineoutLength > sec2->lineoutLength) - { - *(list+i) = sec2; - *(list+i+1) = sec1; - finished = false; - } - i++; - } - } -} - -// -// length of a line in euclidian sense -// -static double lineLength(line_t *line) -{ - double dx, dy, length; - - dx = (double) line->v1->x - (double) line->v2->x; - dy = (double) line->v1->y - (double) line->v2->y; - - length = hypot(dx, dy); - - return length; -} - - -// -// length of the sector lineout -// -static double calcLineoutLength(sector_t *sector) -{ - linechain_t *chain; - double length = 0.0L; - chain = sector->sectorLines; - - while (chain) // sum up lengths of all lines - { - length += lineLength(chain->line); - chain = chain->next; - } - return length; -} - -// -// Calculate length of the sectors lineout -// -static void calcLineouts(sector_t *sector) -{ - size_t secCount = 0; - sector_t *encSector = *(sector->stackList); - - while (encSector) - { - if (encSector->lineoutLength < 0.0L) // if length has not yet been calculated - { - encSector->lineoutLength = calcLineoutLength(encSector); - } - - secCount++; - encSector = *((sector->stackList) + secCount); - } -} - -// -// Free Stacklists of all sectors -// -static void freeStacklists(void) -{ - size_t i; - - for (i = 0; i < numsectors; i++) - { - if (sectors[i].stackList) - { - free(sectors[i].stackList); - sectors[i].stackList = NULL; - } - } -} - -// -// if more than half of the toptextures are missing -// -static boolean areToptexturesMissing(sector_t *thisSector) -{ - linechain_t *thisElem, *nextElem = thisSector->sectorLines; - sector_t *frontSector, *backSector; - size_t nomiss = 0; - side_t *sidel, *sider; - - while (nextElem) // walk through chain - { - thisElem = nextElem; - nextElem = thisElem->next; - - frontSector = thisElem->line->frontsector; - backSector = thisElem->line->backsector; - - if (frontSector == backSector) // skip damn renderer tricks here - continue; - - if (!frontSector || !backSector) - continue; - - sider = &sides[thisElem->line->sidenum[0]]; - sidel = &sides[thisElem->line->sidenum[1]]; - - if (backSector->ceilingheight < frontSector->ceilingheight) - { - if (sider->toptexture != 0) - { - nomiss++; - break; // we can stop here if decision criterium is ==0 - } - } - else if (backSector->ceilingheight > frontSector->ceilingheight) - { - if (sidel->toptexture != 0) - { - nomiss++; - break; // we can stop here if decision criterium is ==0 - } - } - } - - return nomiss == 0; -} - -// -// are more textures missing than present? -// -static boolean areBottomtexturesMissing(sector_t *thisSector) -{ - linechain_t *thisElem, *nextElem = thisSector->sectorLines; - sector_t *frontSector, *backSector; - size_t nomiss = 0; - side_t *sidel, *sider; - - while (nextElem) // walk through chain - { - thisElem = nextElem; - nextElem = thisElem->next; - - frontSector = thisElem->line->frontsector; - backSector = thisElem->line->backsector; - - if (frontSector == backSector) // skip damn renderer tricks here - continue; - - if (!frontSector || !backSector) - continue; - - sider = &sides[thisElem->line->sidenum[0]]; - sidel = &sides[thisElem->line->sidenum[1]]; - - if (backSector->floorheight > frontSector->floorheight) - { - if (sider->bottomtexture != 0) - { - nomiss++; - break; // we can stop here if decision criterium is ==0 - } - } - - else if (backSector->floorheight < frontSector->floorheight) - { - if (sidel->bottomtexture != 0) - { - nomiss++; - break; // we can stop here if decision criterium is ==0 - } - } - } - - // return missing >= nomiss; - return nomiss == 0; -} - -// -// check if no adjacent sector has same ceiling height -// -static boolean isCeilingFloating(sector_t *thisSector) -{ - sector_t *adjSector, *refSector = NULL, *frontSector, *backSector; - linechain_t *thisElem, *nextElem; - - if (!thisSector) - return false; - - nextElem = thisSector->sectorLines; - - while (nextElem) // walk through chain - { - thisElem = nextElem; - nextElem = thisElem->next; - - frontSector = thisElem->line->frontsector; - backSector = thisElem->line->backsector; - - if (frontSector == thisSector) - adjSector = backSector; - else - adjSector = frontSector; - - if (!adjSector) // assume floating sectors have surrounding sectors - return false; - - if (adjSector->c_slope) // Don't bother with slopes - return false; - - if (!refSector) - { - refSector = adjSector; - continue; - } - - // if adjacent sector has same height or more than one adjacent sector exists -> stop - if (thisSector->ceilingheight == adjSector->ceilingheight || refSector != adjSector) - return false; - } - - // now check for walltextures - if (!areToptexturesMissing(thisSector)) - return false; - - return true; -} - -// -// check if no adjacent sector has same ceiling height -// FIXME: throw that together with isCeilingFloating?? -// -static boolean isFloorFloating(sector_t *thisSector) -{ - sector_t *adjSector, *refSector = NULL, *frontSector, *backSector; - linechain_t *thisElem, *nextElem; - - if (!thisSector) - return false; - - nextElem = thisSector->sectorLines; - - while (nextElem) // walk through chain - { - thisElem = nextElem; - nextElem = thisElem->next; - - frontSector = thisElem->line->frontsector; - backSector = thisElem->line->backsector; - - if (frontSector == thisSector) - adjSector = backSector; - else - adjSector = frontSector; - - if (!adjSector) // assume floating sectors have surrounding sectors - return false; - - if (adjSector->f_slope) // Don't bother with slopes - return false; - - if (!refSector) - { - refSector = adjSector; - continue; - } - - // if adjacent sector has same height or more than one adjacent sector exists -> stop - if (thisSector->floorheight == adjSector->floorheight || refSector != adjSector) - return false; - } - - // now check for walltextures - if (!areBottomtexturesMissing(thisSector)) - return false; - - return true; -} - -// -// estimate ceilingheight according to height of adjacent sector -// -static fixed_t estimateCeilHeight(sector_t *thisSector) -{ - sector_t *adjSector; - - if (!thisSector || !thisSector->sectorLines || !thisSector->sectorLines->line) - return 0; - - adjSector = thisSector->sectorLines->line->frontsector; - if (adjSector == thisSector) - adjSector = thisSector->sectorLines->line->backsector; - - if (!adjSector) - return 0; - - return adjSector->ceilingheight; -} - -// -// estimate ceilingheight according to height of adjacent sector -// -static fixed_t estimateFloorHeight(sector_t *thisSector) -{ - sector_t *adjSector; - - if (!thisSector || !thisSector->sectorLines || !thisSector->sectorLines->line) - return 0; - - adjSector = thisSector->sectorLines->line->frontsector; - if (adjSector == thisSector) - adjSector = thisSector->sectorLines->line->backsector; - - if (!adjSector) - return 0; - - return adjSector->floorheight; -} - -#define CORRECT_FLOAT_EXPERIMENTAL - -// -------------------------------------------------------------------------- -// Some levels have missing sidedefs, which produces HOM, so lets try to compensate for that -// and some levels have deep water trick, invisible staircases etc. -// -------------------------------------------------------------------------- -// FIXME: put some nice default texture in legacy.dat and use it -void HWR_CorrectSWTricks(void) -{ - size_t i; - size_t k; - line_t *ld; - side_t *sidel = NULL, *sider; - sector_t *secl, *secr; - sector_t **sectorList; - sector_t *outSector; - - if ((0 == cv_grcorrecttricks.value)) - return; - - // determine lines for sectors - for (i = 0; i < numlines; i++) - { - ld = &lines[i]; - secr = ld->frontsector; - secl = ld->backsector; - - if (secr == secl) - { - secr->pseudoSector = true; // special renderer trick? - addLineToChain(secr, ld); - } - else - { - addLineToChain(secr, ld); - addLineToChain(secl, ld); - } - } - - // preprocessing - for (i = 0; i < numsectors; i++) - { - sector_t *checkSector; - - checkSector = §ors[i]; - - // identify real pseudosectors first - if (checkSector->pseudoSector) - { - if (!isPSectorValid(checkSector)) // drop invalid pseudo sectors - { - checkSector->pseudoSector = false; - } - } - - // determine enclosing sectors for pseudosectors ... used later - if (checkSector->pseudoSector) - { - generateStacklist(checkSector); - calcLineouts(checkSector); - sortStacklist(checkSector); - } - } - - // set virtual floor heights for pseudo sectors - // required for deep water effect e.g. - for (i = 0; i < numsectors; i++) - { - if (sectors[i].pseudoSector) - { - sectorList = sectors[i].stackList; - k = 0; - while (*(sectorList+k)) - { - outSector = *(sectorList+k); - if (!outSector->pseudoSector) - { - sectors[i].virtualFloorheight = outSector->floorheight; - sectors[i].virtualCeilingheight = outSector->ceilingheight; - break; - } - k++; - } - if (*(sectorList+k) == NULL) // sorry, did not work :( - { - sectors[i].virtualFloorheight = sectors[i].floorheight; - sectors[i].virtualCeilingheight = sectors[i].ceilingheight; - } - } - } -#ifdef CORRECT_FLOAT_EXPERIMENTAL - // correct ceiling/floor heights of totally floating sectors - for (i = 0; i < numsectors; i++) - { - sector_t *floatSector; - - floatSector = §ors[i]; - - // correct height of floating sectors - if (isCeilingFloating(floatSector)) - { - floatSector->virtualCeilingheight = estimateCeilHeight(floatSector); - floatSector->virtualCeiling = true; - } - if (isFloorFloating(floatSector)) - { - floatSector->virtualFloorheight = estimateFloorHeight(floatSector); - floatSector->virtualFloor = true; - } - } -#endif - - // now for the missing textures - for (i = 0; i < numlines; i++) - { - ld = &lines[i]; - sider = &sides[ld->sidenum[0]]; - if (ld->sidenum[1] != 0xffff) - sidel = &sides[ld->sidenum[1]]; - - secr = ld->frontsector; - secl = ld->backsector; - - if (secr == secl) // special renderer trick - continue; // we cant correct missing textures here - - if (secl) // only if there is a backsector - { - if (secr->pseudoSector || secl->pseudoSector) - continue; - if (!secr->virtualFloor && !secl->virtualFloor) - { - if (secl->floorheight > secr->floorheight) - { - // now check if r-sidedef is correct - if (sider->bottomtexture == 0) - { - if (sider->midtexture == 0) - sider->bottomtexture = 0; // Tails // More redwall sky shenanigans - else - sider->bottomtexture = sider->midtexture; - } - } - else if (secl->floorheight < secr->floorheight) - { - // now check if l-sidedef is correct - if (sidel->bottomtexture == 0) - { - if (sidel->midtexture == 0) - sidel->bottomtexture = 0; // Tails // More redwall sky shenanigans - else - sidel->bottomtexture = sidel->midtexture; - } - } - } - - if (!secr->virtualCeiling && !secl->virtualCeiling) - { - if (secl->ceilingheight < secr->ceilingheight) - { - // now check if r-sidedef is correct - if (sider->toptexture == 0) - { - if (sider->midtexture == 0) - sider->toptexture = 0; // Tails // When this was REDWALL it was causing issues in the sky sometimes - else - sider->toptexture = sider->midtexture; - } - } - else if (secl->ceilingheight > secr->ceilingheight) - { - // now check if l-sidedef is correct - if (sidel->toptexture == 0) - { - if (sidel->midtexture == 0) - sidel->toptexture = 0; // Tails // When this was REDWALL it was causing issues in the sky sometimes - else - sidel->toptexture = sidel->midtexture; - } - } - } - } // if (NULL != secl) - } // for (i = 0; i < numlines; i++) - - // release all linechains - releaseLineChains(); - freeStacklists(); -} - -#endif // HWRENDER diff --git a/src/p_setup.c b/src/p_setup.c index 942deecf8..b16e13faa 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -995,17 +995,6 @@ static void P_InitializeSector(sector_t *ss) ss->extra_colormap = NULL; -#ifdef HWRENDER // ----- for special tricks with HW renderer ----- - ss->pseudoSector = false; - ss->virtualFloor = false; - ss->virtualFloorheight = 0; - ss->virtualCeiling = false; - ss->virtualCeilingheight = 0; - ss->sectorLines = NULL; - ss->stackList = NULL; - ss->lineoutLength = -1.0l; -#endif // ----- end special tricks ----- - ss->gravity = NULL; ss->verticalflip = false; ss->flags = SF_FLIPSPECIAL_FLOOR; @@ -3825,8 +3814,6 @@ void HWR_SetupLevel(void) HWR_ResetLights(); #endif - // Correct missing sidedefs & deep water trick - HWR_CorrectSWTricks(); HWR_CreatePlanePolygons((INT32)numnodes - 1); } #endif diff --git a/src/r_defs.h b/src/r_defs.h index a36568192..fd868ee97 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -221,20 +221,6 @@ typedef struct r_lightlist_s INT32 lightnum; } r_lightlist_t; -// ----- for special tricks with HW renderer ----- - -// -// For creating a chain with the lines around a sector -// -typedef struct linechain_s -{ - struct line_s *line; - struct linechain_s *next; -} linechain_t; -// ----- end special tricks ----- - - - // Slopes typedef enum { SL_NOPHYSICS = 1, /// This plane will have no physics applied besides the positioning. @@ -348,17 +334,6 @@ typedef struct sector_s // per-sector colormaps! extracolormap_t *extra_colormap; -#ifdef HWRENDER // ----- for special tricks with HW renderer ----- - boolean pseudoSector; - boolean virtualFloor; - fixed_t virtualFloorheight; - boolean virtualCeiling; - fixed_t virtualCeilingheight; - linechain_t *sectorLines; - struct sector_s **stackList; - double lineoutLength; -#endif // ----- end special tricks ----- - // This points to the master's floorheight, so it can be changed in realtime! fixed_t *gravity; // per-sector gravity boolean verticalflip; // If gravity < 0, then allow flipped physics diff --git a/src/sdl/Srb2SDL-vc10.vcxproj b/src/sdl/Srb2SDL-vc10.vcxproj index c24104b92..38b3d1538 100644 --- a/src/sdl/Srb2SDL-vc10.vcxproj +++ b/src/sdl/Srb2SDL-vc10.vcxproj @@ -382,7 +382,6 @@ - diff --git a/src/sdl/Srb2SDL-vc10.vcxproj.filters b/src/sdl/Srb2SDL-vc10.vcxproj.filters index 2f0aec7ca..e49074d3b 100644 --- a/src/sdl/Srb2SDL-vc10.vcxproj.filters +++ b/src/sdl/Srb2SDL-vc10.vcxproj.filters @@ -672,9 +672,6 @@ Hw_Hardware - - Hw_Hardware - Hw_Hardware diff --git a/src/sdl/Srb2SDL-vc9.vcproj b/src/sdl/Srb2SDL-vc9.vcproj index 9ef4301cc..39184f409 100644 --- a/src/sdl/Srb2SDL-vc9.vcproj +++ b/src/sdl/Srb2SDL-vc9.vcproj @@ -2550,46 +2550,6 @@ RelativePath="..\hardware\hw_md2.h" > - - - - - - - - - - - - - - diff --git a/src/sdl/Srb2SDL.dsp b/src/sdl/Srb2SDL.dsp index 879113ca2..435820cb0 100644 --- a/src/sdl/Srb2SDL.dsp +++ b/src/sdl/Srb2SDL.dsp @@ -7,19 +7,19 @@ CFG=Srb2SDL - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "Srb2SDL.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "Srb2SDL.mak" CFG="Srb2SDL - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "Srb2SDL - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "Srb2SDL - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -85,7 +85,7 @@ LINK32=link.exe # ADD LINK32 SDL.lib SDL_mixer.lib user32.lib advapi32.lib ws2_32.lib /nologo /subsystem:console /pdb:"C:\srb2demo2\srb2sdldebug.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2sdldebug.exe" /pdbtype:sept # SUBTRACT LINK32 /pdb:none -!ENDIF +!ENDIF # Begin Target @@ -213,7 +213,7 @@ SOURCE=.\SDL_main\SDL_win32_main.c # PROP Exclude_From_Build 1 -!ENDIF +!ENDIF # End Source File # Begin Source File @@ -274,7 +274,7 @@ InputName=tmap # End Custom Build -!ENDIF +!ENDIF # End Source File # Begin Source File @@ -308,7 +308,7 @@ InputName=tmap_mmx # End Custom Build -!ENDIF +!ENDIF # End Source File # Begin Source File @@ -339,7 +339,7 @@ InputName=tmap_vc # End Custom Build -!ENDIF +!ENDIF # End Source File # End Group @@ -608,10 +608,6 @@ SOURCE=..\hardware\hw_md2.h # End Source File # Begin Source File -SOURCE=..\hardware\hw_trick.c -# End Source File -# Begin Source File - SOURCE=..\hardware\hws_data.h # End Source File # End Group diff --git a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj index de12201f5..5ceb05408 100644 --- a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj +++ b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj @@ -1120,13 +1120,6 @@ path = ../../hardware/hw_md2.h; refType = 2; }; - 84177743085A106C000C01D8 = { - fileEncoding = 30; - isa = PBXFileReference; - name = hw_trick.c; - path = ../../hardware/hw_trick.c; - refType = 2; - }; 84177744085A106C000C01D8 = { fileEncoding = 30; isa = PBXFileReference; diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj index 745513eeb..f7316692b 100644 --- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj +++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ 1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */; }; 1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6E0B67CC2B00BAD059 /* hw_main.c */; }; 1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE700B67CC2B00BAD059 /* hw_md2.c */; }; - 1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE720B67CC2B00BAD059 /* hw_trick.c */; }; 1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */; }; 1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE900B67CC8400BAD059 /* d_main.c */; }; 1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE910B67CC8500BAD059 /* d_net.c */; }; @@ -192,7 +191,6 @@ 1E44AE6F0B67CC2B00BAD059 /* hw_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_main.h; path = ../../hardware/hw_main.h; sourceTree = SOURCE_ROOT; }; 1E44AE700B67CC2B00BAD059 /* hw_md2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_md2.c; path = ../../hardware/hw_md2.c; sourceTree = SOURCE_ROOT; }; 1E44AE710B67CC2B00BAD059 /* hw_md2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_md2.h; path = ../../hardware/hw_md2.h; sourceTree = SOURCE_ROOT; }; - 1E44AE720B67CC2B00BAD059 /* hw_trick.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_trick.c; path = ../../hardware/hw_trick.c; sourceTree = SOURCE_ROOT; }; 1E44AE730B67CC2B00BAD059 /* hws_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hws_data.h; path = ../../hardware/hws_data.h; sourceTree = SOURCE_ROOT; }; 1E44AE8A0B67CC6000BAD059 /* asm_defs.inc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.pascal; name = asm_defs.inc; path = ../../asm_defs.inc; sourceTree = SOURCE_ROOT; }; 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_clisrv.c; path = ../../d_clisrv.c; sourceTree = SOURCE_ROOT; }; @@ -546,7 +544,6 @@ 1E44AE6F0B67CC2B00BAD059 /* hw_main.h */, 1E44AE700B67CC2B00BAD059 /* hw_md2.c */, 1E44AE710B67CC2B00BAD059 /* hw_md2.h */, - 1E44AE720B67CC2B00BAD059 /* hw_trick.c */, 1E44AE730B67CC2B00BAD059 /* hws_data.h */, ); name = Hw_Hardware; @@ -1080,7 +1077,6 @@ 1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */, 1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */, 1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */, - 1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */, 1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */, 1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */, 1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */, diff --git a/src/win32/Srb2win-vc10.vcxproj b/src/win32/Srb2win-vc10.vcxproj index 387d65da9..5fe723f37 100644 --- a/src/win32/Srb2win-vc10.vcxproj +++ b/src/win32/Srb2win-vc10.vcxproj @@ -234,7 +234,6 @@ - diff --git a/src/win32/Srb2win-vc10.vcxproj.filters b/src/win32/Srb2win-vc10.vcxproj.filters index 2f380c473..7b96bf16b 100644 --- a/src/win32/Srb2win-vc10.vcxproj.filters +++ b/src/win32/Srb2win-vc10.vcxproj.filters @@ -108,9 +108,6 @@ Hw_Hardware - - Hw_Hardware - Hw_Hardware diff --git a/src/win32/Srb2win-vc9.vcproj b/src/win32/Srb2win-vc9.vcproj index 4c17bb6f7..b3ba54c10 100644 --- a/src/win32/Srb2win-vc9.vcproj +++ b/src/win32/Srb2win-vc9.vcproj @@ -2291,46 +2291,6 @@ RelativePath="..\hardware\hw_md2.h" > - - - - - - - - - - - - - - diff --git a/src/win32/Srb2win.dsp b/src/win32/Srb2win.dsp index 501bd26b8..d87230a39 100644 --- a/src/win32/Srb2win.dsp +++ b/src/win32/Srb2win.dsp @@ -7,19 +7,19 @@ CFG=Srb2win - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "Srb2win.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "Srb2win.mak" CFG="Srb2win - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "Srb2win - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "Srb2win - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -84,7 +84,7 @@ LINK32=link.exe # ADD LINK32 dxguid.lib user32.lib gdi32.lib winmm.lib advapi32.lib ws2_32.lib dinput.lib /nologo /subsystem:windows /profile /debug /machine:I386 /out:"C:\srb2demo2\srb2debug.exe" # SUBTRACT LINK32 /nodefaultlib -!ENDIF +!ENDIF # Begin Target @@ -148,7 +148,7 @@ SOURCE=.\Srb2win.rc !ELSEIF "$(CFG)" == "Srb2win - Win32 Debug" -!ENDIF +!ENDIF # End Source File # Begin Source File @@ -233,7 +233,7 @@ InputName=tmap # End Custom Build -!ENDIF +!ENDIF # End Source File # Begin Source File @@ -266,7 +266,7 @@ InputName=tmap_mmx # End Custom Build -!ENDIF +!ENDIF # End Source File # Begin Source File @@ -298,7 +298,7 @@ InputName=tmap_vc # End Custom Build -!ENDIF +!ENDIF # End Source File # End Group @@ -567,10 +567,6 @@ SOURCE=..\hardware\hw_md2.h # End Source File # Begin Source File -SOURCE=..\hardware\hw_trick.c -# End Source File -# Begin Source File - SOURCE=..\hardware\hws_data.h # End Source File # End Group