From cb85736fa1c6503efe7e411b7ea4cfa3a041c50c Mon Sep 17 00:00:00 2001 From: havoc Date: Wed, 21 May 2003 09:08:15 +0000 Subject: [PATCH] beginning to add Q2 bsp support (Q3 bsp support coming later) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3007 d7cf8633-e32d-0410-b094-e92efae38249 --- model_brush.c | 23 ++++++- model_brush.h | 183 ++++++++++++++++++++++++++++++++++++++++++++++++- model_shared.c | 3 +- 3 files changed, 206 insertions(+), 3 deletions(-) diff --git a/model_brush.c b/model_brush.c index 444089da..ecf2e180 100644 --- a/model_brush.c +++ b/model_brush.c @@ -2769,7 +2769,7 @@ extern void R_Model_Brush_DrawSky(entity_render_t *ent); extern void R_Model_Brush_Draw(entity_render_t *ent); extern void R_Model_Brush_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin, float lightradius); extern void R_Model_Brush_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltofilter, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz); -void Mod_LoadBrushModel (model_t *mod, void *buffer) +void Mod_LoadBrushModelQ1orHL (model_t *mod, void *buffer) { int i, j, k; dheader_t *header; @@ -2937,3 +2937,24 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer) //Mod_ProcessLightList (); } +void Mod_LoadBrushModelQ2 (model_t *mod, void *buffer) +{ + Host_Error("Mod_LoadBrushModelQ2: not yet implemented\n"); +} + +void Mod_LoadBrushModelQ3 (model_t *mod, void *buffer) +{ + Host_Error("Mod_LoadBrushModelQ3: not yet implemented\n"); +} + +void Mod_LoadBrushModelIBSP (model_t *mod, void *buffer) +{ + int i = LittleLong(*((int *)buffer)); + if (i == 46) + Mod_LoadBrushModelQ3 (mod,buffer); + else if (i == 38) + Mod_LoadBrushModelQ2 (mod,buffer); + else + Host_Error("Mod_LoadBrushModelIBSP: unknown/unsupported version %i\n", i); +} + diff --git a/model_brush.h b/model_brush.h index c4d0c184..be17f950 100644 --- a/model_brush.h +++ b/model_brush.h @@ -359,7 +359,8 @@ extern rtexture_t *r_notexture; extern texture_t r_notexture_mip; struct model_s; -void Mod_LoadBrushModel (struct model_s *mod, void *buffer); +void Mod_LoadBrushModelQ1orHL (struct model_s *mod, void *buffer); +void Mod_LoadBrushModelIBSP (struct model_s *mod, void *buffer); void Mod_BrushInit(void); void Mod_FindNonSolidLocation(vec3_t in, vec3_t out, struct model_s *mod, vec_t radius); @@ -368,5 +369,185 @@ int Mod_PointContents (const float *p, struct model_s *model); qbyte *Mod_LeafPVS (mleaf_t *leaf, struct model_s *model); void Mod_BuildPVSTextureChains(struct model_s *model); +// Q2 bsp stuff + +#define Q2BSPVERSION 38 + +// leaffaces, leafbrushes, planes, and verts are still bounded by +// 16 bit short limits + +//============================================================================= + +#define Q2LUMP_ENTITIES 0 +#define Q2LUMP_PLANES 1 +#define Q2LUMP_VERTEXES 2 +#define Q2LUMP_VISIBILITY 3 +#define Q2LUMP_NODES 4 +#define Q2LUMP_TEXINFO 5 +#define Q2LUMP_FACES 6 +#define Q2LUMP_LIGHTING 7 +#define Q2LUMP_LEAFS 8 +#define Q2LUMP_LEAFFACES 9 +#define Q2LUMP_LEAFBRUSHES 10 +#define Q2LUMP_EDGES 11 +#define Q2LUMP_SURFEDGES 12 +#define Q2LUMP_MODELS 13 +#define Q2LUMP_BRUSHES 14 +#define Q2LUMP_BRUSHSIDES 15 +#define Q2LUMP_POP 16 +#define Q2LUMP_AREAS 17 +#define Q2LUMP_AREAPORTALS 18 +#define Q2HEADER_LUMPS 19 + +typedef struct +{ + int ident; + int version; + lump_t lumps[HEADER_LUMPS]; +} q2dheader_t; + +typedef struct +{ + float mins[3], maxs[3]; + float origin[3]; // for sounds or lights + int headnode; + int firstface, numfaces; // submodels just draw faces + // without walking the bsp tree +} q2dmodel_t; + +// planes (x&~1) and (x&~1)+1 are always opposites + +// contents flags are seperate bits +// a given brush can contribute multiple content bits +// multiple brushes can be in a single leaf + +// these definitions also need to be in q_shared.h! + +// lower bits are stronger, and will eat weaker brushes completely +#define Q2CONTENTS_SOLID 1 // an eye is never valid in a solid +#define Q2CONTENTS_WINDOW 2 // translucent, but not watery +#define Q2CONTENTS_AUX 4 +#define Q2CONTENTS_LAVA 8 +#define Q2CONTENTS_SLIME 16 +#define Q2CONTENTS_WATER 32 +#define Q2CONTENTS_MIST 64 +#define Q2LAST_VISIBLE_CONTENTS 64 + +// remaining contents are non-visible, and don't eat brushes + +#define Q2CONTENTS_AREAPORTAL 0x8000 + +#define Q2CONTENTS_PLAYERCLIP 0x10000 +#define Q2CONTENTS_MONSTERCLIP 0x20000 + +// currents can be added to any other contents, and may be mixed +#define Q2CONTENTS_CURRENT_0 0x40000 +#define Q2CONTENTS_CURRENT_90 0x80000 +#define Q2CONTENTS_CURRENT_180 0x100000 +#define Q2CONTENTS_CURRENT_270 0x200000 +#define Q2CONTENTS_CURRENT_UP 0x400000 +#define Q2CONTENTS_CURRENT_DOWN 0x800000 + +#define Q2CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity + +#define Q2CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game +#define Q2CONTENTS_DEADMONSTER 0x4000000 +#define Q2CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs +#define Q2CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans +#define Q2CONTENTS_LADDER 0x20000000 + + + +#define Q2SURF_LIGHT 0x1 // value will hold the light strength + +#define Q2SURF_SLICK 0x2 // effects game physics + +#define Q2SURF_SKY 0x4 // don't draw, but add to skybox +#define Q2SURF_WARP 0x8 // turbulent water warp +#define Q2SURF_TRANS33 0x10 +#define Q2SURF_TRANS66 0x20 +#define Q2SURF_FLOWING 0x40 // scroll towards angle +#define Q2SURF_NODRAW 0x80 // don't bother referencing the texture + + + + +typedef struct +{ + int planenum; + int children[2]; // negative numbers are -(leafs+1), not nodes + short mins[3]; // for frustom culling + short maxs[3]; + unsigned short firstface; + unsigned short numfaces; // counting both sides +} q2dnode_t; + + +typedef struct +{ + float vecs[2][4]; // [s/t][xyz offset] + int flags; // miptex flags + overrides + int value; // light emission, etc + char texture[32]; // texture name (textures/*.wal) + int nexttexinfo; // for animations, -1 = end of chain +} q2texinfo_t; + +typedef struct +{ + int contents; // OR of all brushes (not needed?) + + short cluster; + short area; + + short mins[3]; // for frustum culling + short maxs[3]; + + unsigned short firstleafface; + unsigned short numleaffaces; + + unsigned short firstleafbrush; + unsigned short numleafbrushes; +} q2dleaf_t; + +typedef struct +{ + unsigned short planenum; // facing out of the leaf + short texinfo; +} q2dbrushside_t; + +typedef struct +{ + int firstside; + int numsides; + int contents; +} q2dbrush_t; + + +// the visibility lump consists of a header with a count, then +// byte offsets for the PVS and PHS of each cluster, then the raw +// compressed bit vectors +#define Q2DVIS_PVS 0 +#define Q2DVIS_PHS 1 +typedef struct +{ + int numclusters; + int bitofs[8][2]; // bitofs[numclusters][2] +} q2dvis_t; + +// each area has a list of portals that lead into other areas +// when portals are closed, other areas may not be visible or +// hearable even if the vis info says that it should be +typedef struct +{ + int portalnum; + int otherarea; +} q2dareaportal_t; + +typedef struct +{ + int numareaportals; + int firstareaportal; +} q2darea_t; + #endif diff --git a/model_shared.c b/model_shared.c index 9c3ecaf6..0ef5f31e 100644 --- a/model_shared.c +++ b/model_shared.c @@ -258,7 +258,8 @@ static model_t *Mod_LoadModel (model_t *mod, qboolean crash, qboolean checkdisk, else if (!memcmp(buf, "IDP3" , 4)) Mod_LoadQ3AliasModel(mod, buf); else if (!memcmp(buf, "ZYMOTIC" , 7)) Mod_LoadZymoticModel(mod, buf); else if (!memcmp(buf, "IDSP" , 4)) Mod_LoadSpriteModel (mod, buf); - else Mod_LoadBrushModel (mod, buf); + else if (!memcmp(buf, "IBSP" , 4)) Mod_LoadBrushModelIBSP (mod, buf); + else Mod_LoadBrushModelQ1orHL (mod, buf); Mem_Free(buf); -- 2.39.2