Attempt to stabilize ODE. Now using constant step (sys_ticrate set steptime) - on...
[divverent/darkplaces.git] / bspfile.h
index f1e2788..648b294 100644 (file)
--- a/bspfile.h
+++ b/bspfile.h
@@ -8,7 +8,7 @@ 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.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -19,44 +19,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 
 
-// upper design bounds
-
-#define        MAX_MAP_HULLS           4
-
-#define        MAX_MAP_MODELS          256
-#define        MAX_MAP_BRUSHES         4096
-#define        MAX_MAP_ENTITIES        1024
-#define        MAX_MAP_ENTSTRING       65536
-
-#define        MAX_MAP_PLANES          32767
-#define        MAX_MAP_NODES           32767           // because negative shorts are contents
-#define        MAX_MAP_CLIPNODES       32767           //
-#define        MAX_MAP_LEAFS           32767           // was 8192
-#define        MAX_MAP_VERTS           65535
-#define        MAX_MAP_FACES           65535
-#define        MAX_MAP_MARKSURFACES 65535
-#define        MAX_MAP_TEXINFO         4096
-#define        MAX_MAP_EDGES           256000
-#define        MAX_MAP_SURFEDGES       512000
-#define        MAX_MAP_TEXTURES        512
-#define        MAX_MAP_MIPTEX          0x200000
-#define        MAX_MAP_LIGHTING        0x100000
-#define        MAX_MAP_VISIBILITY      0x100000
-
-#define        MAX_MAP_PORTALS         65536
-
-// key / value pair sizes
-
-#define        MAX_KEY         32
-#define        MAX_VALUE       1024
+#define MAX_MAP_HULLS 16 // Q1BSP has 4, Hexen2 Q1BSP has 8, MCBSP has 16
 
 //=============================================================================
 
 
 #define BSPVERSION     29
-#define        TOOLVERSION     2
 
-typedef struct
+typedef struct lump_s
 {
        int             fileofs, filelen;
 } lump_t;
@@ -76,10 +46,16 @@ typedef struct
 #define        LUMP_EDGES              12
 #define        LUMP_SURFEDGES  13
 #define        LUMP_MODELS             14
-
 #define        HEADER_LUMPS    15
 
-typedef struct
+typedef struct hullinfo_s
+{
+       int                     filehulls;
+       float           hullsizes[MAX_MAP_HULLS][2][3];
+} hullinfo_t;
+
+// WARNING: this struct does NOT match q1bsp's disk format because MAX_MAP_HULLS has been changed by Sajt's MCBSP code, this struct is only being used in memory as a result
+typedef struct dmodel_s
 {
        float           mins[3], maxs[3];
        float           origin[3];
@@ -88,13 +64,13 @@ typedef struct
        int                     firstface, numfaces;
 } dmodel_t;
 
-typedef struct
+typedef struct dheader_s
 {
-       int                     version;        
+       int                     version;
        lump_t          lumps[HEADER_LUMPS];
 } dheader_t;
 
-typedef struct
+typedef struct dmiptexlump_s
 {
        int                     nummiptex;
        int                     dataofs[4];             // [nummiptex]
@@ -109,7 +85,7 @@ typedef struct miptex_s
 } miptex_t;
 
 
-typedef struct
+typedef struct dvertex_s
 {
        float   point[3];
 } dvertex_t;
@@ -125,7 +101,7 @@ typedef struct
 #define        PLANE_ANYY              4
 #define        PLANE_ANYZ              5
 
-typedef struct
+typedef struct dplane_s
 {
        float   normal[3];
        float   dist;
@@ -133,28 +109,122 @@ typedef struct
 } dplane_t;
 
 
+// contents values in Q1 maps
+#define CONTENTS_EMPTY                 -1
+#define CONTENTS_SOLID                 -2
+#define CONTENTS_WATER                 -3
+#define CONTENTS_SLIME                 -4
+#define CONTENTS_LAVA                          -5
+#define CONTENTS_SKY                           -6
+// these were #ifdef QUAKE2 in the quake source
+#define CONTENTS_ORIGIN                        -7 // removed at csg time
+#define CONTENTS_CLIP                          -8 // changed to contents_solid
+#define CONTENTS_CURRENT_0             -9
+#define CONTENTS_CURRENT_90            -10
+#define CONTENTS_CURRENT_180           -11
+#define CONTENTS_CURRENT_270           -12
+#define CONTENTS_CURRENT_UP            -13
+#define CONTENTS_CURRENT_DOWN          -14
+
+//contents flags in Q2 maps
+#define CONTENTSQ2_SOLID                       0x00000001 // an eye is never valid in a solid
+#define CONTENTSQ2_WINDOW                      0x00000002 // translucent, but not watery
+#define CONTENTSQ2_AUX                         0x00000004
+#define CONTENTSQ2_LAVA                                0x00000008
+#define CONTENTSQ2_SLIME                       0x00000010
+#define CONTENTSQ2_WATER                       0x00000020
+#define CONTENTSQ2_MIST                                0x00000040
+#define CONTENTSQ2_AREAPORTAL          0x00008000
+#define CONTENTSQ2_PLAYERCLIP          0x00010000
+#define CONTENTSQ2_MONSTERCLIP         0x00020000
+#define CONTENTSQ2_CURRENT_0           0x00040000
+#define CONTENTSQ2_CURRENT_90          0x00080000
+#define CONTENTSQ2_CURRENT_180         0x00100000
+#define CONTENTSQ2_CURRENT_270         0x00200000
+#define CONTENTSQ2_CURRENT_UP          0x00400000
+#define CONTENTSQ2_CURRENT_DOWN                0x00800000
+#define CONTENTSQ2_ORIGIN                      0x01000000 // removed before bsping an entity
+#define CONTENTSQ2_MONSTER                     0x02000000 // should never be on a brush, only in game
+#define CONTENTSQ2_DEADMONSTER         0x04000000
+#define CONTENTSQ2_DETAIL                      0x08000000 // brushes to be added after vis leafs
+#define CONTENTSQ2_TRANSLUCENT         0x10000000 // auto set if any surface has trans
+#define CONTENTSQ2_LADDER                      0x20000000
+
+//contents flags in Q3 maps
+#define CONTENTSQ3_SOLID                       0x00000001 // solid (opaque and transparent)
+#define CONTENTSQ3_LAVA                                0x00000008 // lava
+#define CONTENTSQ3_SLIME                       0x00000010 // slime
+#define CONTENTSQ3_WATER                       0x00000020 // water
+#define CONTENTSQ3_FOG                         0x00000040 // unused?
+#define CONTENTSQ3_AREAPORTAL          0x00008000 // areaportal (separates areas)
+#define CONTENTSQ3_PLAYERCLIP          0x00010000 // block players
+#define CONTENTSQ3_MONSTERCLIP         0x00020000 // block monsters
+#define CONTENTSQ3_TELEPORTER          0x00040000 // hint for Q3's bots
+#define CONTENTSQ3_JUMPPAD                     0x00080000 // hint for Q3's bots
+#define CONTENTSQ3_CLUSTERPORTAL       0x00100000 // hint for Q3's bots
+#define CONTENTSQ3_DONOTENTER          0x00200000 // hint for Q3's bots
+#define CONTENTSQ3_BOTCLIP                     0x00400000 // hint for Q3's bots
+#define CONTENTSQ3_ORIGIN                      0x01000000 // used by origin brushes to indicate origin of bmodel (removed by map compiler)
+#define CONTENTSQ3_BODY                                0x02000000 // used by bbox entities (should never be on a brush)
+#define CONTENTSQ3_CORPSE                      0x04000000 // used by dead bodies (SOLID_CORPSE in darkplaces)
+#define CONTENTSQ3_DETAIL                      0x08000000 // brushes that do not split the bsp tree (decorations)
+#define CONTENTSQ3_STRUCTURAL          0x10000000 // brushes that split the bsp tree
+#define CONTENTSQ3_TRANSLUCENT         0x20000000 // leaves surfaces that are inside for rendering
+#define CONTENTSQ3_TRIGGER                     0x40000000 // used by trigger entities
+#define CONTENTSQ3_NODROP                      0x80000000 // remove items that fall into this brush
+
+#define SUPERCONTENTS_SOLID                    0x00000001
+#define SUPERCONTENTS_WATER                    0x00000002
+#define SUPERCONTENTS_SLIME                    0x00000004
+#define SUPERCONTENTS_LAVA                     0x00000008
+#define SUPERCONTENTS_SKY                      0x00000010
+#define SUPERCONTENTS_BODY                     0x00000020
+#define SUPERCONTENTS_CORPSE           0x00000040
+#define SUPERCONTENTS_NODROP           0x00000080
+#define SUPERCONTENTS_PLAYERCLIP       0x00000100
+#define SUPERCONTENTS_MONSTERCLIP      0x00000200
+#define SUPERCONTENTS_DONOTENTER       0x00000400
+#define SUPERCONTENTS_BOTCLIP          0x00000800
+#define SUPERCONTENTS_OPAQUE           0x00001000
+// TODO: is there any reason to define:
+//   fog?
+//   areaportal?
+//   teleporter?
+//   jumppad?
+//   clusterportal?
+//   detail?         (div0) no, game code should not be allowed to differentiate between structural and detail
+//   structural?     (div0) no, game code should not be allowed to differentiate between structural and detail
+//   trigger?        (div0) no, as these are always solid anyway, and that's all that matters for trigger brushes
+#define SUPERCONTENTS_LIQUIDSMASK      (SUPERCONTENTS_LAVA | SUPERCONTENTS_SLIME | SUPERCONTENTS_WATER)
+#define SUPERCONTENTS_VISBLOCKERMASK   SUPERCONTENTS_OPAQUE
 
-#define        CONTENTS_EMPTY          -1
-#define        CONTENTS_SOLID          -2
-#define        CONTENTS_WATER          -3
-#define        CONTENTS_SLIME          -4
-#define        CONTENTS_LAVA           -5
-#define        CONTENTS_SKY            -6
-#define        CONTENTS_ORIGIN         -7              // removed at csg time
-#define        CONTENTS_CLIP           -8              // changed to contents_solid
-
-// LordHavoc: Q2 water
 /*
-#define        CONTENTS_CURRENT_0              -9
-#define        CONTENTS_CURRENT_90             -10
-#define        CONTENTS_CURRENT_180    -11
-#define        CONTENTS_CURRENT_270    -12
-#define        CONTENTS_CURRENT_UP             -13
-#define        CONTENTS_CURRENT_DOWN   -14
+#define SUPERCONTENTS_DEADMONSTER      0x00000000
+#define SUPERCONTENTS_CURRENT_0                0x00000000
+#define SUPERCONTENTS_CURRENT_90       0x00000000
+#define SUPERCONTENTS_CURRENT_180      0x00000000
+#define SUPERCONTENTS_CURRENT_270      0x00000000
+#define SUPERCONTENTS_CURRENT_DOWN     0x00000000
+#define SUPERCONTENTS_CURRENT_UP       0x00000000
+#define SUPERCONTENTS_AREAPORTAL       0x00000000
+#define SUPERCONTENTS_AUX                      0x00000000
+#define SUPERCONTENTS_CLUSTERPORTAL    0x00000000
+#define SUPERCONTENTS_DETAIL           0x00000000
+#define SUPERCONTENTS_STRUCTURAL       0x00000000
+#define SUPERCONTENTS_DONOTENTER       0x00000000
+#define SUPERCONTENTS_JUMPPAD          0x00000000
+#define SUPERCONTENTS_LADDER           0x00000000
+#define SUPERCONTENTS_MONSTER          0x00000000
+#define SUPERCONTENTS_MONSTERCLIP      0x00000000
+#define SUPERCONTENTS_PLAYERCLIP       0x00000000
+#define SUPERCONTENTS_TELEPORTER       0x00000000
+#define SUPERCONTENTS_TRANSLUCENT      0x00000000
+#define SUPERCONTENTS_TRIGGER          0x00000000
+#define SUPERCONTENTS_WINDOW           0x00000000
 */
 
 
-typedef struct
+typedef struct dnode_s
 {
        int                     planenum;
        short           children[2];    // negative numbers are -(leafs+1), not nodes
@@ -164,7 +234,7 @@ typedef struct
        unsigned short  numfaces;       // counting both sides
 } dnode_t;
 
-typedef struct
+typedef struct dclipnode_s
 {
        int                     planenum;
        short           children[2];    // negative numbers are contents
@@ -181,23 +251,24 @@ typedef struct texinfo_s
 
 // note that edge 0 is never used, because negative edge nums are used for
 // counterclockwise use of the edge in a face
-typedef struct
+typedef struct dedge_s
 {
        unsigned short  v[2];           // vertex numbers
 } dedge_t;
 
 #define        MAXLIGHTMAPS    4
-typedef struct
+typedef struct dface_s
 {
-       short           planenum;
+       // LordHavoc: changed from short to unsigned short for q2 support
+       unsigned short  planenum;
        short           side;
 
        int                     firstedge;              // we must support > 64k edges
-       short           numedges;       
+       short           numedges;
        short           texinfo;
 
 // lighting info
-       qbyte           styles[MAXLIGHTMAPS];
+       unsigned char           styles[MAXLIGHTMAPS];
        int                     lightofs;               // start of [numstyles*surfsize] samples
 } dface_t;
 
@@ -212,7 +283,7 @@ typedef struct
 
 // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
 // all other leafs need visibility info
-typedef struct
+typedef struct dleaf_s
 {
        int                     contents;
        int                     visofs;                         // -1 = no visibility info
@@ -223,104 +294,6 @@ typedef struct
        unsigned short          firstmarksurface;
        unsigned short          nummarksurfaces;
 
-       qbyte           ambient_level[NUM_AMBIENTS];
+       unsigned char           ambient_level[NUM_AMBIENTS];
 } dleaf_t;
 
-
-//============================================================================
-
-#ifndef QUAKE_GAME
-
-#define        ANGLE_UP        -1
-#define        ANGLE_DOWN      -2
-
-
-// the utilities get to be lazy and just use large static arrays
-
-extern int                     nummodels;
-extern dmodel_t        dmodels[MAX_MAP_MODELS];
-
-extern int                     visdatasize;
-extern qbyte           dvisdata[MAX_MAP_VISIBILITY];
-
-extern int                     lightdatasize;
-extern qbyte           dlightdata[MAX_MAP_LIGHTING];
-
-extern int                     texdatasize;
-extern qbyte           dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
-
-extern int                     entdatasize;
-extern char            dentdata[MAX_MAP_ENTSTRING];
-
-extern int                     numleafs;
-extern dleaf_t         dleafs[MAX_MAP_LEAFS];
-
-extern int                     numplanes;
-extern dplane_t        dplanes[MAX_MAP_PLANES];
-
-extern int                     numvertexes;
-extern dvertex_t       dvertexes[MAX_MAP_VERTS];
-
-extern int                     numnodes;
-extern dnode_t         dnodes[MAX_MAP_NODES];
-
-extern int                     numtexinfo;
-extern texinfo_t       texinfo[MAX_MAP_TEXINFO];
-
-extern int                     numfaces;
-extern dface_t         dfaces[MAX_MAP_FACES];
-
-extern int                     numclipnodes;
-extern dclipnode_t     dclipnodes[MAX_MAP_CLIPNODES];
-
-extern int                     numedges;
-extern dedge_t         dedges[MAX_MAP_EDGES];
-
-extern int                     nummarksurfaces;
-extern unsigned short  dmarksurfaces[MAX_MAP_MARKSURFACES];
-
-extern int                     numsurfedges;
-extern int                     dsurfedges[MAX_MAP_SURFEDGES];
-
-
-void DecompressVis (qbyte *in, qbyte *decompressed);
-int CompressVis (qbyte *vis, qbyte *dest);
-
-void   LoadBSPFile (char *filename);
-void   WriteBSPFile (char *filename);
-void   PrintBSPFileSizes (void);
-
-//===============
-
-
-typedef struct epair_s
-{
-       struct epair_s  *next;
-       char    *key;
-       char    *value;
-} epair_t;
-
-typedef struct
-{
-       vec3_t          origin;
-       int                     firstbrush;
-       int                     numbrushes;
-       epair_t         *epairs;
-} entity_t;
-
-extern entity_t        entities[MAX_MAP_ENTITIES];
-
-void   ParseEntities (void);
-void   UnparseEntities (void);
-
-void   SetKeyValue (entity_t *ent, char *key, char *value);
-char   *ValueForKey (entity_t *ent, char *key);
-// will return "" if not present
-
-vec_t  FloatForKey (entity_t *ent, char *key);
-void   GetVectorForKey (entity_t *ent, char *key, vec3_t vec);
-
-epair_t *ParseEpair (void);
-
-#endif
-