101 lines
4.3 KiB
Text
101 lines
4.3 KiB
Text
|
|
Description of DeePBSP v4 Extended nodes for developers
|
|
-------------------------------------------------------
|
|
|
|
This information is intended for any port author that wishes to extend the size
|
|
of level the port can play. It's suggested to change the standard level structures
|
|
to also have unsigned value to support large levels. For example, change the sidedef
|
|
reference to unsigned short for the linedef struct. Then use 0xFFFF (#define this) to
|
|
check for no sidedef and store -1 in an internal format as int for the sidedef.
|
|
|
|
Other versions can easily be made if somebody has a reason for a change that
|
|
reflects the real world.
|
|
|
|
CAUTION : Be sure to turn of struct alignment in the compiler, otherwise
|
|
it may add data to the structs.
|
|
|
|
Terminology is per Intel processors.
|
|
|
|
--- V4 Standard nodes only ---
|
|
|
|
struct Segment4
|
|
{
|
|
int vstart; // from this vertex ... (allows for over 64k verts which
|
|
int vend; // ... to this vertex (can occur during node building with packed sidedefs
|
|
unsigned short angle; // angle (0 = east, 16384 = north, ...)
|
|
unsigned short linedef; // linedef that this seg goes along (allows for 64k linedefs)
|
|
short flip; // true if not the same direction as linedef
|
|
unsigned short dist; // distance from starting point
|
|
};
|
|
|
|
-- BOTH standard V4 nodes and V4 GLNodes --
|
|
|
|
struct Pnode4
|
|
{
|
|
short X, Y; // x,y coordinates
|
|
short dX, dY; // offsets
|
|
short bbox[2][4]; // bounding rectangles
|
|
int chright, chleft; // Node or SubSector (if bit 31 is set)
|
|
};
|
|
|
|
|
|
struct SubSector4
|
|
{
|
|
unsigned short segcount; // number of Segs in this SubSector. 64k is plenty, hence no int
|
|
int firstseg; // first Seg
|
|
};
|
|
|
|
--- GL nodes only---
|
|
|
|
struct GLSeg4
|
|
{
|
|
int vstart; // bit 31 set= GL vert
|
|
int vend; // ...
|
|
unsigned short linedef; // linedef that this seg goes along (allows for for 64k linedefs)
|
|
unsigned short side; // 0 if on right of linedef, 1 if on left
|
|
}
|
|
|
|
|
|
--- detection the version for V4 STANDARD nodes
|
|
|
|
The NODES lump at offset 0 contains "xNd4\0\0\0\0" if V4 nodes are stored. The 0x000000 is pretty
|
|
much an impossible value in the stock node structure, so this is very reliable.
|
|
|
|
Use the above structures to decode and map the information into the ports internal format.
|
|
|
|
Please note that the information is identical to the stock node format with the
|
|
changes only in sign and size.
|
|
|
|
To use extended V4 nodes, the internal structure of a port should have int values for
|
|
linedefs, sidedefs and vertices. Afer that change it becomes pretty easy to support both
|
|
the old and new formats as well as levels with more than 32k sidedefs or vertices.
|
|
|
|
The only major change is for sidedefs. When a level is read, check the linedef sidedef
|
|
reference for 0xFFFF and then store a -1 in the internal format (depends on compiler used).
|
|
|
|
Other internal formats need to be made either unsigned short (vs short) or made int.
|
|
|
|
--- detecting the version for V4 GLNODES
|
|
|
|
Vertexs are the same format as GL version 2, however, the "magic" is different so you can tell
|
|
the format of the other lumps. There is no need to store a "magic" number in the other lumps
|
|
and this also prevents GL2 only ports from misinterpreting.
|
|
|
|
Thus if the Nodes are V4 then at location 0 is "gNd4" vs "gNd2" in the the VERTEX lump. This
|
|
avoids the accidental confusion that can occur with V3 GL nodes that still has "gNd2" even
|
|
though the other parts are different.
|
|
|
|
The same comments apply as for STANDARD nodes. Some ports have all the right stuff, it's just
|
|
a matter of changing a few level structures from signed to unsigned and check for 0xFFFF as a
|
|
sidedef value and then storing -1 in the internal structure.
|
|
|
|
The old v2 "partner" value in segs is not stored in v4 since neither JDOOM, PRBOOM or VAVOOM used this
|
|
value. Same thing goes for linedef references. I think 64k is plenty considering that the sidedefs
|
|
really hit the limit way before.
|
|
|
|
The only way to get more than 64k sidedefs is to pack the sidedefs, but then the
|
|
level becomes basically uneditable. A level like that can't be saved as is without packing it
|
|
again.
|
|
|
|
Vertex limit of 64k is also plenty. The GLnodes only need int so they can distinquish the vertex type.
|
|
|