diff --git a/src/nodebuild.cpp b/src/nodebuild.cpp index 5ac860be..a4b56868 100644 --- a/src/nodebuild.cpp +++ b/src/nodebuild.cpp @@ -243,12 +243,16 @@ void FNodeBuilder::CreateSubsectorsForReal () D(Printf (PRINT_LOG, "Output subsector %d:\n", Subsectors.Size())); for (unsigned int i = firstline; i < SegList.Size(); ++i) { - D(Printf (PRINT_LOG, " Seg %5d%c(%5d,%5d)-(%5d,%5d)\n", SegList[i].SegPtr - &Segs[0], + D(Printf (PRINT_LOG, " Seg %5d%c%d(%5d,%5d)-%d(%5d,%5d) [%08x,%08x]-[%08x,%08x]\n", SegList[i].SegPtr - &Segs[0], SegList[i].SegPtr->linedef == -1 ? '+' : ' ', + SegList[i].SegPtr->v1, Vertices[SegList[i].SegPtr->v1].x>>16, Vertices[SegList[i].SegPtr->v1].y>>16, + SegList[i].SegPtr->v2, Vertices[SegList[i].SegPtr->v2].x>>16, - Vertices[SegList[i].SegPtr->v2].y>>16)); + Vertices[SegList[i].SegPtr->v2].y>>16, + Vertices[SegList[i].SegPtr->v1].x, Vertices[SegList[i].SegPtr->v1].y, + Vertices[SegList[i].SegPtr->v2].x, Vertices[SegList[i].SegPtr->v2].y)); SegList[i].SegNum = DWORD(SegList[i].SegPtr - &Segs[0]); } Subsectors.Push (sub); @@ -330,7 +334,8 @@ bool FNodeBuilder::CheckSubsector (DWORD set, node_t &node, DWORD &splitseg) do { - D(Printf (PRINT_LOG, " - seg %d(%d,%d)-(%d,%d) line %d front %d back %d\n", seg, + D(Printf (PRINT_LOG, " - seg %d%c(%d,%d)-(%d,%d) line %d front %d back %d\n", seg, + Segs[seg].linedef == -1 ? '+' : ' ', Vertices[Segs[seg].v1].x>>16, Vertices[Segs[seg].v1].y>>16, Vertices[Segs[seg].v2].x>>16, Vertices[Segs[seg].v2].y>>16, Segs[seg].linedef, diff --git a/src/nodebuild.h b/src/nodebuild.h index a6f0459a..81c7b134 100644 --- a/src/nodebuild.h +++ b/src/nodebuild.h @@ -34,6 +34,8 @@ public: FEvent *FindEvent (double distance) const; void DeleteAll (); + void PrintTree () const { PrintTree (Root); } + private: FEvent Nil; FEvent *Root; @@ -42,6 +44,8 @@ private: void DeletionTraverser (FEvent *event); FEvent *Successor (FEvent *event) const; FEvent *Predecessor (FEvent *event) const; + + void PrintTree (const FEvent *event) const; }; struct FSimpleVert diff --git a/src/nodebuild_events.cpp b/src/nodebuild_events.cpp index d7660f58..2b71e01c 100644 --- a/src/nodebuild_events.cpp +++ b/src/nodebuild_events.cpp @@ -210,3 +210,17 @@ FEvent *FEventTree::GetMinimum () } return node; } + +void FEventTree::PrintTree (const FEvent *event) const +{ + // Use the CRT's sprintf so that it shares the same formatting as ZDBSP's output. + char buff[100]; + if (event != &Nil) + { + PrintTree(event->Left); + sprintf(buff, " Distance %g, vertex %d, seg %u\n", + sqrt(event->Distance/4294967296.0), event->Info.Vertex, (unsigned)event->Info.FrontSeg); + Printf(PRINT_LOG, "%s", buff); + PrintTree(event->Right); + } +} diff --git a/src/nodebuild_extract.cpp b/src/nodebuild_extract.cpp index 6260ac2f..c0f76987 100644 --- a/src/nodebuild_extract.cpp +++ b/src/nodebuild_extract.cpp @@ -78,7 +78,8 @@ void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount, memcpy (outNodes, &Nodes[0], nodeCount*sizeof(node_t)); for (i = 0; i < nodeCount; ++i) { - D(Printf(PRINT_LOG, "Node %d:\n", i)); + D(Printf(PRINT_LOG, "Node %d: Splitter[%08x,%08x] [%08x,%08x]\n", i, + outNodes[i].x, outNodes[i].y, outNodes[i].dx, outNodes[i].dy)); // Go backwards because on 64-bit systems, both of the intchildren are // inside the first in-game child. for (int j = 1; j >= 0; --j) @@ -296,12 +297,14 @@ int FNodeBuilder::CloseSubsector (TArray &segs, int subsector, vertex_t { seg = &Segs[SegList[j].SegNum]; angle_t ang = PointToAngle (Vertices[seg->v1].x - midx, Vertices[seg->v1].y - midy); - Printf(PRINT_LOG, "%d%c %5d(%5d,%5d)->%5d(%5d,%5d) - %3.3f %d,%d\n", j, + Printf(PRINT_LOG, "%d%c %5d(%5d,%5d)->%5d(%5d,%5d) - %3.5f %d,%d [%08x,%08x]-[%08x,%08x]\n", j, seg->linedef == -1 ? '+' : ':', seg->v1, Vertices[seg->v1].x>>16, Vertices[seg->v1].y>>16, seg->v2, Vertices[seg->v2].x>>16, Vertices[seg->v2].y>>16, double(ang/2)*180/(1<<30), - seg->planenum, seg->planefront); + seg->planenum, seg->planefront, + Vertices[seg->v1].x, Vertices[seg->v1].y, + Vertices[seg->v2].x, Vertices[seg->v2].y); } #endif @@ -395,12 +398,16 @@ int FNodeBuilder::CloseSubsector (TArray &segs, int subsector, vertex_t Printf(PRINT_LOG, "Output GL subsector %d:\n", subsector); for (i = segs.Size() - count; i < (int)segs.Size(); ++i) { - Printf(PRINT_LOG, " Seg %5d%c(%5d,%5d)-(%5d,%5d)\n", i, + Printf(PRINT_LOG, " Seg %5d%c(%5d,%5d)-(%5d,%5d) [%08x,%08x]-[%08x,%08x]\n", i, segs[i].linedef == NULL ? '+' : ' ', segs[i].v1->x>>16, segs[i].v1->y>>16, segs[i].v2->x>>16, - segs[i].v2->y>>16); + segs[i].v2->y>>16, + segs[i].v1->x, + segs[i].v1->y, + segs[i].v2->x, + segs[i].v2->y); } #endif diff --git a/src/nodebuild_gl.cpp b/src/nodebuild_gl.cpp index add4f712..d029e7f6 100644 --- a/src/nodebuild_gl.cpp +++ b/src/nodebuild_gl.cpp @@ -83,6 +83,8 @@ double FNodeBuilder::AddIntersection (const node_t &node, int vertex) // seg information will be messed up in the generated tree. void FNodeBuilder::FixSplitSharers (const node_t &node) { + D(Printf(PRINT_LOG, "events:\n")); + D(Events.PrintTree()); for (unsigned int i = 0; i < SplitSharers.Size(); ++i) { DWORD seg = SplitSharers[i].Seg; @@ -95,6 +97,18 @@ void FNodeBuilder::FixSplitSharers (const node_t &node) continue; } + // Use the CRT's printf so the formatting matches ZDBSP's + D(char buff[200]); + D(sprintf(buff, "Considering events on seg %d(%d[%d,%d]->%d[%d,%d]) [%g:%g]\n", seg, + Segs[seg].v1, + Vertices[Segs[seg].v1].x>>16, + Vertices[Segs[seg].v1].y>>16, + Segs[seg].v2, + Vertices[Segs[seg].v2].x>>16, + Vertices[Segs[seg].v2].y>>16, + SplitSharers[i].Distance, event->Distance)); + D(Printf(PRINT_LOG, "%s", buff)); + if (SplitSharers[i].Forward) { event = Events.GetSuccessor (event); diff --git a/src/nodebuild_utility.cpp b/src/nodebuild_utility.cpp index b3753392..e7d5865d 100644 --- a/src/nodebuild_utility.cpp +++ b/src/nodebuild_utility.cpp @@ -185,6 +185,9 @@ int FNodeBuilder::CreateSeg (int linenum, int sidenum) segnum = (int)Segs.Push (seg); Vertices[seg.v1].segs = segnum; Vertices[seg.v2].segs2 = segnum; + D(Printf(PRINT_LOG, "Seg %4d: From line %d, side %s (%5d,%5d)-(%5d,%5d) [%08x,%08x]-[%08x,%08x]\n", segnum, linenum, sidenum ? "back " : "front", + Vertices[seg.v1].x>>16, Vertices[seg.v1].y>>16, Vertices[seg.v2].x>>16, Vertices[seg.v2].y>>16, + Vertices[seg.v1].x, Vertices[seg.v1].y, Vertices[seg.v2].x, Vertices[seg.v2].y)); return segnum; } diff --git a/src/p_glnodes.cpp b/src/p_glnodes.cpp index 010374cc..e88a3f8e 100644 --- a/src/p_glnodes.cpp +++ b/src/p_glnodes.cpp @@ -853,15 +853,18 @@ bool P_LoadGLNodes(MapData * map) { if (map->MapLumps[ML_GLZNODES].Reader && map->MapLumps[ML_GLZNODES].Reader->GetLength() != 0) { - const int idcheck = MAKE_ID('Z','G','L','N'); - const int idcheck2 = MAKE_ID('Z','G','L','2'); - const int idcheck3 = MAKE_ID('X','G','L','N'); - const int idcheck4 = MAKE_ID('X','G','L','2'); + const int idcheck1a = MAKE_ID('Z','G','L','N'); + const int idcheck2a = MAKE_ID('Z','G','L','2'); + const int idcheck3a = MAKE_ID('Z','G','L','3'); + const int idcheck1b = MAKE_ID('X','G','L','N'); + const int idcheck2b = MAKE_ID('X','G','L','2'); + const int idcheck3b = MAKE_ID('X','G','L','3'); int id; map->Seek(ML_GLZNODES); map->file->Read (&id, 4); - if (id == idcheck || id == idcheck2 || id == idcheck3 || id == idcheck4) + if (id == idcheck1a || id == idcheck2a || id == idcheck3a || + id == idcheck1b || id == idcheck2b || id == idcheck3b) { try { diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 6a300f4d..1edbb181 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -892,7 +892,7 @@ void P_LoadGLZSegs (FileReaderBase &data, int type) BYTE side; data >> v1 >> partner; - if (type == 2) + if (type >= 2) { data >> line; } @@ -1045,13 +1045,20 @@ void LoadZNodes(FileReaderBase &data, int glnodes) for (i = 0; i < numNodes; ++i) { - SWORD x, y, dx, dy; + if (glnodes < 3) + { + SWORD x, y, dx, dy; - data >> x >> y >> dx >> dy; - nodes[i].x = x << FRACBITS; - nodes[i].y = y << FRACBITS; - nodes[i].dx = dx << FRACBITS; - nodes[i].dy = dy << FRACBITS; + data >> x >> y >> dx >> dy; + nodes[i].x = x << FRACBITS; + nodes[i].y = y << FRACBITS; + nodes[i].dx = dx << FRACBITS; + nodes[i].dy = dy << FRACBITS; + } + else + { + data >> nodes[i].x >> nodes[i].y >> nodes[i].dx >> nodes[i].dy; + } for (int j = 0; j < 2; ++j) { for (int k = 0; k < 4; ++k) @@ -1100,6 +1107,11 @@ void P_LoadZNodes (FileReader &dalump, DWORD id) compressed = true; break; + case MAKE_ID('Z','G','L','3'): + type = 3; + compressed = true; + break; + case MAKE_ID('X','N','O','D'): type = 0; compressed = false; @@ -1115,6 +1127,11 @@ void P_LoadZNodes (FileReader &dalump, DWORD id) compressed = false; break; + case MAKE_ID('X','G','L','3'): + type = 3; + compressed = false; + break; + default: return; } @@ -3680,7 +3697,7 @@ void P_SetupLevel (char *lumpname, int position) { // Check for compressed nodes first, then uncompressed nodes FWadLump test; - DWORD id = MAKE_ID('X','x','X','x'), idcheck = 0, idcheck2 = 0, idcheck3 = 0, idcheck4 = 0; + DWORD id = MAKE_ID('X','x','X','x'), idcheck = 0, idcheck2 = 0, idcheck3 = 0, idcheck4 = 0, idcheck5 = 0, idcheck6 = 0; if (map->Size(ML_ZNODES) != 0) { @@ -3694,12 +3711,14 @@ void P_SetupLevel (char *lumpname, int position) map->Seek(ML_GLZNODES); idcheck = MAKE_ID('Z','G','L','N'); idcheck2 = MAKE_ID('Z','G','L','2'); - idcheck3 = MAKE_ID('X','G','L','N'); - idcheck4 = MAKE_ID('X','G','L','2'); + idcheck3 = MAKE_ID('Z','G','L','3'); + idcheck4 = MAKE_ID('X','G','L','N'); + idcheck5 = MAKE_ID('X','G','L','2'); + idcheck6 = MAKE_ID('X','G','L','3'); } map->file->Read (&id, 4); - if (id != 0 && (id == idcheck || id == idcheck2 || id == idcheck3 || id == idcheck4)) + if (id != 0 && (id == idcheck || id == idcheck2 || id == idcheck3 || id == idcheck4 || id == idcheck5 || id == idcheck6)) { try { diff --git a/src/svnrevision.h b/src/svnrevision.h index 3dfbb509..52402229 100644 --- a/src/svnrevision.h +++ b/src/svnrevision.h @@ -3,5 +3,5 @@ // This file was automatically generated by the // updaterevision tool. Do not edit by hand. -#define ZD_SVN_REVISION_STRING "3978" +#define ZD_SVN_REVISION_STRING "3982" #define ZD_SVN_REVISION_NUMBER 3978