- Added a reject fixer to correct the reject when sectors are removed instead

of just throwing it away.

SVN r174 (trunk)
This commit is contained in:
Randy Heit 2006-06-06 22:38:27 +00:00
parent 6a1a0e007a
commit 06d1bf0354
16 changed files with 93 additions and 22 deletions

View file

@ -27,18 +27,18 @@ else
endif endif
# To generate profiling information for gprof, pass gprof=1 to make. # To generate profiling information for gprof, pass gprof=1 to make.
ifneq ($(gprof),) ifeq ($(gprof),1)
CFLAGS += -g -fno-omit-frame-pointer -pg CFLAGS += -g -fno-omit-frame-pointer -pg
LDFLAGS += -g -pg LDFLAGS += -g -pg
endif endif
# To strip debugging symbols, pass strip=1 to make. # To strip debugging symbols, pass strip=1 to make.
ifneq ($(strip),) ifeq ($(strip),1)
LDFLAGS += -s LDFLAGS += -s
endif endif
# To use SSE2 math for everything, pass sse=1 to make. # To use SSE2 math for everything, pass sse=1 to make.
ifneq ($(sse),) ifeq ($(sse),1)
CFLAGS += -msse -msse2 -mfpmath=sse CFLAGS += -msse -msse2 -mfpmath=sse
endif endif
@ -53,6 +53,10 @@ OBJS = main.o getopt.o getopt1.o blockmapbuilder.o processor.o view.o wad.o \
zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o zlib/trees.o \ zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o zlib/trees.o \
zlib/zutil.o zlib/zutil.o
ifeq (Windows_NT,$(OS))
OBJS += resource.o
endif
all: $(EXE) all: $(EXE)
profile: profile:
@ -70,6 +74,9 @@ $(EXE): $(OBJS)
nodebuild_classify_sse2.o: nodebuild_classify_sse2.cpp nodebuild.h nodebuild_classify_sse2.o: nodebuild_classify_sse2.cpp nodebuild.h
$(CXX) $(CXXFLAGS) -msse2 -mfpmath=sse -c -o $@ $< $(CXX) $(CXXFLAGS) -msse2 -mfpmath=sse -c -o $@ $<
resource.o: resource.rc
windres -o $@ -i $<
.PHONY: clean .PHONY: clean
clean: clean:

View file

@ -164,6 +164,8 @@ struct FLevel
int NumOrgVerts; int NumOrgVerts;
WORD *OrgSectorMap; int NumOrgSectors;
fixed_t MinX, MinY, MaxX, MaxY; fixed_t MinX, MinY, MaxX, MaxY;
void FindMapBounds (); void FindMapBounds ();

View file

@ -1,6 +1,6 @@
/* /*
The main glue for ZDBSP. The main glue for ZDBSP.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -49,6 +49,7 @@
#endif #endif
#include <iostream>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -258,11 +259,26 @@ int main (int argc, char **argv)
END_COUNTER(t1a, t1b, t1c, "\nTotal time: %g seconds.\n") END_COUNTER(t1a, t1b, t1c, "\nTotal time: %g seconds.\n")
} }
catch (std::runtime_error msg)
{
printf ("%s\n", msg.what());
return 20;
}
catch (std::bad_alloc)
{
printf ("Out of memory\n");
return 20;
}
catch (std::exception msg) catch (std::exception msg)
{ {
printf ("%s\n", msg.what()); printf ("%s\n", msg.what());
return 20; return 20;
} }
catch (...)
{
printf ("Unhandled exception. ZDBSP cannot continue.\n");
return 20;
}
return 0; return 0;
} }

View file

@ -1,6 +1,6 @@
/* /*
Most of the logic for the node builder. Most of the logic for the node builder.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/* /*
A red-black tree implementation for building minisegs. A red-black tree implementation for building minisegs.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/* /*
Routines for extracting usable data from the new BSP tree. Routines for extracting usable data from the new BSP tree.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/* /*
Routines only necessary for building GL-friendly nodes. Routines only necessary for building GL-friendly nodes.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/* /*
Various utility functions. Various utility functions.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/* /*
Reads wad files, builds nodes, and saves new wad files. Reads wad files, builds nodes, and saves new wad files.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -57,6 +57,7 @@ FLevel::~FLevel ()
if (GLSegs) delete[] GLSegs; if (GLSegs) delete[] GLSegs;
if (GLNodes) delete[] GLNodes; if (GLNodes) delete[] GLNodes;
if (GLPVS) delete[] GLPVS; if (GLPVS) delete[] GLPVS;
if (OrgSectorMap) delete[] OrgSectorMap;
} }
FProcessor::FProcessor (FWadReader &inwad, int lump) FProcessor::FProcessor (FWadReader &inwad, int lump)
@ -330,6 +331,7 @@ void FLevel::RemoveExtraSectors ()
// Extra sectors are those that aren't referenced by any sides. // Extra sectors are those that aren't referenced by any sides.
// They just waste space, so get rid of them. // They just waste space, so get rid of them.
NumOrgSectors = NumSectors;
used = new BYTE[NumSectors]; used = new BYTE[NumSectors];
memset (used, 0, NumSectors*sizeof(*used)); memset (used, 0, NumSectors*sizeof(*used));
remap = new WORD[NumSectors]; remap = new WORD[NumSectors];
@ -368,7 +370,6 @@ void FLevel::RemoveExtraSectors ()
{ {
int diff = NumSectors - newNumSectors; int diff = NumSectors - newNumSectors;
printf (" Removed %d unused sector%s.\n", diff, diff > 1 ? "s" : ""); printf (" Removed %d unused sector%s.\n", diff, diff > 1 ? "s" : "");
NumSectors = newNumSectors;
// Renumber sector references in sides // Renumber sector references in sides
for (i = 0; i < NumSides; ++i) for (i = 0; i < NumSides; ++i)
@ -378,6 +379,14 @@ void FLevel::RemoveExtraSectors ()
Sides[i].sector = remap[Sides[i].sector]; Sides[i].sector = remap[Sides[i].sector];
} }
} }
// Make a reverse map for fixing reject lumps
OrgSectorMap = new WORD[newNumSectors];
for (i = 0; i < NumSectors; ++i)
{
OrgSectorMap[remap[i]] = i;
}
NumSectors = newNumSectors;
} }
delete[] used; delete[] used;
@ -572,7 +581,7 @@ void FProcessor::Write (FWadWriter &out)
if (lump >= 0) if (lump >= 0)
{ {
ReadLump<BYTE> (Wad, lump, Level.Reject, Level.RejectSize); ReadLump<BYTE> (Wad, lump, Level.Reject, Level.RejectSize);
if (Level.RejectSize != (Level.NumSectors*Level.NumSectors + 7) / 8) if (Level.RejectSize != (Level.NumOrgSectors*Level.NumOrgSectors + 7) / 8)
{ {
// If the reject is the wrong size, don't use it. // If the reject is the wrong size, don't use it.
delete[] Level.Reject; delete[] Level.Reject;
@ -583,6 +592,14 @@ void FProcessor::Write (FWadWriter &out)
} }
Level.RejectSize = 0; Level.RejectSize = 0;
} }
else if (Level.NumOrgSectors != Level.NumSectors)
{
// Some sectors have been removed, so fix the reject.
BYTE *newreject = FixReject (Level.Reject);
delete[] Level.Reject;
Level.Reject = newreject;
Level.RejectSize = (Level.NumSectors * Level.NumSectors + 7) / 8;
}
} }
} }
break; break;
@ -706,6 +723,33 @@ void FProcessor::Write (FWadWriter &out)
} }
} }
//
BYTE *FProcessor::FixReject (const BYTE *oldreject)
{
int x, y, ox, oy, pnum, opnum;
int rejectSize = (Level.NumSectors*Level.NumSectors + 7) / 8;
BYTE *newreject = new BYTE[rejectSize];
memset (newreject, 0, rejectSize);
for (y = 0; y < Level.NumSectors; ++y)
{
oy = Level.OrgSectorMap[y];
for (x = 0; x < Level.NumSectors; ++x)
{
ox = Level.OrgSectorMap[x];
pnum = y*Level.NumSectors + x;
opnum = oy*Level.NumSectors + ox;
if (oldreject[opnum >> 3] & (1 << (opnum & 7)))
{
newreject[pnum >> 3] |= 1 << (pnum & 7);
}
}
}
return newreject;
}
MapNodeEx *FProcessor::NodesToEx (const MapNode *nodes, int count) MapNodeEx *FProcessor::NodesToEx (const MapNode *nodes, int count)
{ {
if (count == 0) if (count == 0)

View file

@ -54,6 +54,8 @@ private:
MapSubsectorEx *SubsectorsToEx (const MapSubsector *ssec, int count); MapSubsectorEx *SubsectorsToEx (const MapSubsector *ssec, int count);
MapSegGLEx *SegGLsToEx (const MapSegGL *segs, int count); MapSegGLEx *SegGLsToEx (const MapSegGL *segs, int count);
BYTE *FixReject (const BYTE *oldreject);
void WriteLines (FWadWriter &out); void WriteLines (FWadWriter &out);
void WriteVertices (FWadWriter &out, int count); void WriteVertices (FWadWriter &out, int count);
void WriteSectors (FWadWriter &out); void WriteSectors (FWadWriter &out);

View file

@ -93,8 +93,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,7,0,0 FILEVERSION 1,8,0,0
PRODUCTVERSION 1,7,0,0 PRODUCTVERSION 1,8,0,0
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -110,12 +110,12 @@ BEGIN
BLOCK "040904b0" BLOCK "040904b0"
BEGIN BEGIN
VALUE "FileDescription", "ZDBSP Node Builder" VALUE "FileDescription", "ZDBSP Node Builder"
VALUE "FileVersion", "1.7" VALUE "FileVersion", "1.8"
VALUE "InternalName", "zdbsp" VALUE "InternalName", "zdbsp"
VALUE "LegalCopyright", "Copyright (C) 2002,2003" VALUE "LegalCopyright", "Copyright (C) 2002-2006"
VALUE "OriginalFilename", "zdbsp.exe" VALUE "OriginalFilename", "zdbsp.exe"
VALUE "ProductName", "ZDBSP" VALUE "ProductName", "ZDBSP"
VALUE "ProductVersion", "1.7" VALUE "ProductVersion", "1.8"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View file

@ -3,7 +3,7 @@
** Templated, automatically resizing array ** Templated, automatically resizing array
** **
**--------------------------------------------------------------------------- **---------------------------------------------------------------------------
** Copyright 1998-2005 Randy Heit ** Copyright 1998-2006 Randy Heit
** All rights reserved. ** All rights reserved.
** **
** Redistribution and use in source and binary forms, with or without ** Redistribution and use in source and binary forms, with or without

View file

@ -3,7 +3,7 @@
** Some useful template functions ** Some useful template functions
** **
**--------------------------------------------------------------------------- **---------------------------------------------------------------------------
** Copyright 1998-2001 Randy Heit ** Copyright 1998-2006 Randy Heit
** All rights reserved. ** All rights reserved.
** **
** Redistribution and use in source and binary forms, with or without ** Redistribution and use in source and binary forms, with or without

View file

@ -1,6 +1,6 @@
/* /*
A really crappy viewer module. A really crappy viewer module.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -1,6 +1,6 @@
/* /*
WAD-handling routines. WAD-handling routines.
Copyright (C) 2002,2003 Randy Heit Copyright (C) 2002-2006 Randy Heit
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by

View file

@ -16,7 +16,7 @@ typedef __int32 int32_t;
#include <stdint.h> #include <stdint.h>
#endif #endif
#define ZDBSP_VERSION "1.7" #define ZDBSP_VERSION "1.8"
enum EBlockmapMode enum EBlockmapMode
{ {