From: cloudwalk Date: Fri, 2 Oct 2020 01:56:47 +0000 (+0000) Subject: model: Split up headers. Introduce headers for each BSP format. X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=406704a087b1b327950a11472280609bd7ed9ae0;p=xonotic%2Fdarkplaces.git model: Split up headers. Introduce headers for each BSP format. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12980 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/darkplaces-sdl2-vs2017.vcxproj b/darkplaces-sdl2-vs2017.vcxproj index 56b3af79..d4966429 100644 --- a/darkplaces-sdl2-vs2017.vcxproj +++ b/darkplaces-sdl2-vs2017.vcxproj @@ -371,6 +371,9 @@ + + + @@ -394,6 +397,7 @@ + diff --git a/darkplaces-sdl2-vs2019.vcxproj b/darkplaces-sdl2-vs2019.vcxproj index af78be82..65a2015e 100644 --- a/darkplaces-sdl2-vs2019.vcxproj +++ b/darkplaces-sdl2-vs2019.vcxproj @@ -372,6 +372,9 @@ + + + @@ -395,6 +398,7 @@ + diff --git a/model_brush.h b/model_brush.h index 33e033c1..bec06c30 100644 --- a/model_brush.h +++ b/model_brush.h @@ -21,6 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef MODEL_BRUSH_H #define MODEL_BRUSH_H +#include "qtypes.h" +#include "qdefs.h" +#include "bspfile.h" + /* ============================================================================== @@ -235,494 +239,123 @@ typedef struct svbspmesh_s } svbspmesh_t; -// Q2 bsp stuff - -#define Q2BSPMAGIC ('I' + 'B' * 256 + 'S' * 65536 + 'P' * 16777216) -#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 q2dheader_s -{ - int ident; - int version; - lump_t lumps[Q2HEADER_LUMPS]; -} q2dheader_t; - -typedef struct q2dmodel_s -{ - 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 - -#define Q2SURF_HINT 0x100 // make a primary bsp splitter -#define Q2SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes - -#define Q2SURF_ALPHATEST 0x02000000 // alpha test masking of color 255 in wal textures (supported by modded engines) - - -/* -typedef struct q2dnode_s -{ - 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 q2texinfo_s -{ - float vecs[2][4]; // [s/t][xyz offset] - int flags; // miptex flags + overrides - int value; // light emission, etc - char texture[32]; // texture name (textures/something.wal) - int nexttexinfo; // for animations, -1 = end of chain -} q2texinfo_t; - -typedef struct q2dleaf_s +typedef struct model_brush_lightstyleinfo_s { - 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 q2dbrushside_s -{ - unsigned short planenum; // facing out of the leaf - short texinfo; -} q2dbrushside_t; - -typedef struct q2dbrush_s -{ - 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 q2dvis_s -{ - 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 q2dareaportal_s -{ - int portalnum; - int otherarea; -} q2dareaportal_t; - -typedef struct q2darea_s -{ - int numareaportals; - int firstareaportal; -} q2darea_t; -*/ - - -//Q3 bsp stuff - -#define Q3BSPVERSION 46 -#define Q3BSPVERSION_LIVE 47 -#define Q3BSPVERSION_IG 48 - -#define Q3LUMP_ENTITIES 0 // entities to spawn (used by server and client) -#define Q3LUMP_TEXTURES 1 // textures used (used by faces) -#define Q3LUMP_PLANES 2 // planes used (used by bsp nodes) -#define Q3LUMP_NODES 3 // bsp nodes (used by bsp nodes, bsp leafs, rendering, collisions) -#define Q3LUMP_LEAFS 4 // bsp leafs (used by bsp nodes) -#define Q3LUMP_LEAFFACES 5 // array of ints indexing faces (used by leafs) -#define Q3LUMP_LEAFBRUSHES 6 // array of ints indexing brushes (used by leafs) -#define Q3LUMP_MODELS 7 // models (used by rendering, collisions) -#define Q3LUMP_BRUSHES 8 // brushes (used by effects, collisions) -#define Q3LUMP_BRUSHSIDES 9 // brush faces (used by brushes) -#define Q3LUMP_VERTICES 10 // mesh vertices (used by faces) -#define Q3LUMP_TRIANGLES 11 // mesh triangles (used by faces) -#define Q3LUMP_EFFECTS 12 // fog (used by faces) -#define Q3LUMP_FACES 13 // surfaces (used by leafs) -#define Q3LUMP_LIGHTMAPS 14 // lightmap textures (used by faces) -#define Q3LUMP_LIGHTGRID 15 // lighting as a voxel grid (used by rendering) -#define Q3LUMP_PVS 16 // potentially visible set; bit[clusters][clusters] (used by rendering) -#define Q3HEADER_LUMPS 17 -#define Q3LUMP_ADVERTISEMENTS 17 // quake live stuff written by zeroradiant's q3map2 (ignored by DP) -#define Q3HEADER_LUMPS_LIVE 18 -#define Q3HEADER_LUMPS_MAX 18 - -typedef struct q3dheader_s -{ - int ident; - int version; - lump_t lumps[Q3HEADER_LUMPS_MAX]; -} q3dheader_t; - -typedef struct q3dtexture_s -{ - char name[Q3PATHLENGTH]; - int surfaceflags; - int contents; + int style; + int value; + int numsurfaces; + int *surfacelist; } -q3dtexture_t; - -// note: planes are paired, the pair of planes with i and i ^ 1 are opposites. -typedef struct q3dplane_s -{ - float normal[3]; - float dist; -} -q3dplane_t; - -typedef struct q3dnode_s -{ - int planeindex; - int childrenindex[2]; - int mins[3]; - int maxs[3]; -} -q3dnode_t; - -typedef struct q3dleaf_s -{ - int clusterindex; // pvs index - int areaindex; // area index - int mins[3]; - int maxs[3]; - int firstleafface; - int numleaffaces; - int firstleafbrush; - int numleafbrushes; +model_brush_lightstyleinfo_t; + +typedef struct model_brush_s +{ + // true if this model is a HalfLife .bsp file + qbool ishlbsp; + // true if this model is a BSP2rmqe .bsp file (expanded 32bit bsp format for rmqe) + qbool isbsp2rmqe; + // true if this model is a BSP2 .bsp file (expanded 32bit bsp format for DarkPlaces, others?) + qbool isbsp2; + // true if this model is a Quake2 .bsp file (IBSP38) + qbool isq2bsp; + // true if this model is a Quake3 .bsp file (IBSP46) + qbool isq3bsp; + // true if this model is a Quake1/Quake2 .bsp file where skymasking capability exists + qbool skymasking; + // string of entity definitions (.map format) + char *entities; + + // if not NULL this is a submodel + struct model_s *parentmodel; + // (this is the number of the submodel, an index into submodels) + int submodel; + + // number of submodels in this map (just used by server to know how many + // submodels to load) + int numsubmodels; + // pointers to each of the submodels + struct model_s **submodels; + + int num_planes; + mplane_t *data_planes; + + int num_nodes; + mnode_t *data_nodes; + + // visible leafs, not counting 0 (solid) + int num_visleafs; + // number of actual leafs (including 0 which is solid) + int num_leafs; + mleaf_t *data_leafs; + + int num_leafbrushes; + int *data_leafbrushes; + + int num_leafsurfaces; + int *data_leafsurfaces; + + int num_portals; + mportal_t *data_portals; + + int num_portalpoints; + mvertex_t *data_portalpoints; + + int num_brushes; + struct q3mbrush_s *data_brushes; + + int num_brushsides; + struct q3mbrushside_s *data_brushsides; + + // pvs + int num_pvsclusters; + int num_pvsclusterbytes; + unsigned char *data_pvsclusters; + // example + //pvschain = model->brush.data_pvsclusters + mycluster * model->brush.num_pvsclusterbytes; + //if (pvschain[thatcluster >> 3] & (1 << (thatcluster & 7))) + + // collision geometry for q3 curves + int num_collisionvertices; + int num_collisiontriangles; + float *data_collisionvertex3f; + int *data_collisionelement3i; + + // a mesh containing all shadow casting geometry for the whole model (including submodels), portions of this are referenced by each surface's num_firstshadowmeshtriangle + struct shadowmesh_s *shadowmesh; + + // a mesh containing all SUPERCONTENTS_SOLID surfaces for this model or submodel, for physics engines to use + struct shadowmesh_s *collisionmesh; + + // common functions + int (*SuperContentsFromNativeContents)(int nativecontents); + int (*NativeContentsFromSuperContents)(int supercontents); + unsigned char *(*GetPVS)(struct model_s *model, const vec3_t p); + int (*FatPVS)(struct model_s *model, const vec3_t org, vec_t radius, unsigned char *pvsbuffer, int pvsbufferlength, qbool merge); + int (*BoxTouchingPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs); + int (*BoxTouchingLeafPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs); + int (*BoxTouchingVisibleLeafs)(struct model_s *model, const unsigned char *visibleleafs, const vec3_t mins, const vec3_t maxs); + int (*FindBoxClusters)(struct model_s *model, const vec3_t mins, const vec3_t maxs, int maxclusters, int *clusterlist); + void (*LightPoint)(struct model_s *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal); + void (*FindNonSolidLocation)(struct model_s *model, const vec3_t in, vec3_t out, vec_t radius); + mleaf_t *(*PointInLeaf)(struct model_s *model, const vec3_t p); + // these are actually only found on brushq1, but NULL is handled gracefully + void (*AmbientSoundLevelsForPoint)(struct model_s *model, const vec3_t p, unsigned char *out, int outsize); + void (*RoundUpToHullSize)(struct model_s *cmodel, const vec3_t inmins, const vec3_t inmaxs, vec3_t outmins, vec3_t outmaxs); + // trace a line of sight through this model (returns false if the line if sight is definitely blocked) + qbool (*TraceLineOfSight)(struct model_s *model, const vec3_t start, const vec3_t end, const vec3_t acceptmins, const vec3_t acceptmaxs); + + char skybox[MAX_QPATH]; + + struct skinframe_s *solidskyskinframe; + struct skinframe_s *alphaskyskinframe; + + qbool supportwateralpha; + + // QuakeWorld + int qw_md4sum; + int qw_md4sum2; } -q3dleaf_t; - -typedef struct q3dmodel_s -{ - float mins[3]; - float maxs[3]; - int firstface; - int numfaces; - int firstbrush; - int numbrushes; -} -q3dmodel_t; - -typedef struct q3dbrush_s -{ - int firstbrushside; - int numbrushsides; - int textureindex; -} -q3dbrush_t; - -typedef struct q3dbrushside_s -{ - int planeindex; - int textureindex; -} -q3dbrushside_t; - -typedef struct q3dbrushside_ig_s -{ - int planeindex; - int textureindex; - int surfaceflags; -} -q3dbrushside_ig_t; - -typedef struct q3dvertex_s -{ - float origin3f[3]; - float texcoord2f[2]; - float lightmap2f[2]; - float normal3f[3]; - unsigned char color4ub[4]; -} -q3dvertex_t; - -typedef struct q3dmeshvertex_s -{ - int offset; // first vertex index of mesh -} -q3dmeshvertex_t; - -typedef struct q3deffect_s -{ - char shadername[Q3PATHLENGTH]; - int brushindex; - int unknown; // I read this is always 5 except in q3dm8 which has one effect with -1 -} -q3deffect_t; - -#define Q3FACETYPE_FLAT 1 // common -#define Q3FACETYPE_PATCH 2 // common -#define Q3FACETYPE_MESH 3 // common -#define Q3FACETYPE_FLARE 4 // rare (is this ever used?) - -typedef struct q3dface_s -{ - int textureindex; - int effectindex; // -1 if none - int type; // Q3FACETYPE - int firstvertex; - int numvertices; - int firstelement; - int numelements; - int lightmapindex; // -1 if none - int lightmap_base[2]; - int lightmap_size[2]; - union - { - struct - { - // corrupt or don't care - int blah[14]; - } - unknown; - struct - { - // Q3FACETYPE_FLAT - // mesh is a collection of triangles on a plane, renderable as a mesh (NOT a polygon) - float lightmap_origin[3]; - float lightmap_vectors[2][3]; - float normal[3]; - int unused1[2]; - } - flat; - struct - { - // Q3FACETYPE_PATCH - // patch renders as a bezier mesh, with adjustable tesselation - // level (optionally based on LOD using the bbox and polygon - // count to choose a tesselation level) - // note: multiple patches may have the same bbox to cause them to - // be LOD adjusted together as a group - int unused1[3]; - float mins[3]; // LOD bbox - float maxs[3]; // LOD bbox - int unused2[3]; - int patchsize[2]; // dimensions of vertex grid - } - patch; - struct - { - // Q3FACETYPE_MESH - // mesh renders as simply a triangle mesh - int unused1[3]; - float mins[3]; - float maxs[3]; - int unused2[5]; - } - mesh; - struct - { - // Q3FACETYPE_FLARE - // flare renders as a simple sprite at origin, no geometry - // exists, nor does it have a radius, a cvar controls the radius - // and another cvar controls distance fade - // (they were not used in Q3 I'm told) - float origin[3]; - int unused1[11]; - } - flare; - } - specific; -} -q3dface_t; - -typedef struct q3dlightmap_s -{ - unsigned char rgb[128*128*3]; -} -q3dlightmap_t; - -typedef struct q3dlightgrid_s -{ - unsigned char ambientrgb[3]; - unsigned char diffusergb[3]; - unsigned char diffusepitch; - unsigned char diffuseyaw; -} -q3dlightgrid_t; - -typedef struct q3dpvs_s -{ - int numclusters; - int chainlength; - // unsigned char chains[]; - // containing bits in 0-7 order (not 7-0 order), - // pvschains[mycluster * chainlength + (thatcluster >> 3)] & (1 << (thatcluster & 7)) -} -q3dpvs_t; - -// surfaceflags from bsp -#define Q3SURFACEFLAG_NODAMAGE 1 -#define Q3SURFACEFLAG_SLICK 2 -#define Q3SURFACEFLAG_SKY 4 -#define Q3SURFACEFLAG_LADDER 8 // has no surfaceparm -#define Q3SURFACEFLAG_NOIMPACT 16 -#define Q3SURFACEFLAG_NOMARKS 32 -#define Q3SURFACEFLAG_FLESH 64 // has no surfaceparm -#define Q3SURFACEFLAG_NODRAW 128 -#define Q3SURFACEFLAG_HINT 256 -#define Q3SURFACEFLAG_SKIP 512 // has no surfaceparm -#define Q3SURFACEFLAG_NOLIGHTMAP 1024 -#define Q3SURFACEFLAG_POINTLIGHT 2048 -#define Q3SURFACEFLAG_METALSTEPS 4096 -#define Q3SURFACEFLAG_NOSTEPS 8192 // has no surfaceparm -#define Q3SURFACEFLAG_NONSOLID 16384 -#define Q3SURFACEFLAG_LIGHTFILTER 32768 -#define Q3SURFACEFLAG_ALPHASHADOW 65536 -#define Q3SURFACEFLAG_NODLIGHT 131072 -#define Q3SURFACEFLAG_DUST 262144 - -// surfaceparms from shaders -#define Q3SURFACEPARM_ALPHASHADOW 1 -#define Q3SURFACEPARM_AREAPORTAL 2 -#define Q3SURFACEPARM_CLUSTERPORTAL 4 -#define Q3SURFACEPARM_DETAIL 8 -#define Q3SURFACEPARM_DONOTENTER 16 -#define Q3SURFACEPARM_FOG 32 -#define Q3SURFACEPARM_LAVA 64 -#define Q3SURFACEPARM_LIGHTFILTER 128 -#define Q3SURFACEPARM_METALSTEPS 256 -#define Q3SURFACEPARM_NODAMAGE 512 -#define Q3SURFACEPARM_NODLIGHT 1024 -#define Q3SURFACEPARM_NODRAW 2048 -#define Q3SURFACEPARM_NODROP 4096 -#define Q3SURFACEPARM_NOIMPACT 8192 -#define Q3SURFACEPARM_NOLIGHTMAP 16384 -#define Q3SURFACEPARM_NOMARKS 32768 -#define Q3SURFACEPARM_NOMIPMAPS 65536 -#define Q3SURFACEPARM_NONSOLID 131072 -#define Q3SURFACEPARM_ORIGIN 262144 -#define Q3SURFACEPARM_PLAYERCLIP 524288 -#define Q3SURFACEPARM_SKY 1048576 -#define Q3SURFACEPARM_SLICK 2097152 -#define Q3SURFACEPARM_SLIME 4194304 -#define Q3SURFACEPARM_STRUCTURAL 8388608 -#define Q3SURFACEPARM_TRANS 16777216 -#define Q3SURFACEPARM_WATER 33554432 -#define Q3SURFACEPARM_POINTLIGHT 67108864 -#define Q3SURFACEPARM_HINT 134217728 -#define Q3SURFACEPARM_DUST 268435456 -#define Q3SURFACEPARM_BOTCLIP 536870912 -#define Q3SURFACEPARM_LIGHTGRID 1073741824 -#define Q3SURFACEPARM_ANTIPORTAL 2147483648u - -typedef struct q3mbrush_s -{ - struct colbrushf_s *colbrushf; - int numbrushsides; - struct q3mbrushside_s *firstbrushside; - struct texture_s *texture; -} -q3mbrush_t; - -typedef struct q3mbrushside_s -{ - struct mplane_s *plane; - struct texture_s *texture; -} -q3mbrushside_t; +model_brush_t; // the first cast is to shut up a stupid warning by clang, the second cast is to make both sides have the same type #define CHECKPVSBIT(pvs,b) ((b) >= 0 ? (unsigned char) ((pvs)[(b) >> 3] & (1 << ((b) & 7))) : (unsigned char) false) @@ -730,4 +363,3 @@ q3mbrushside_t; #define CLEARPVSBIT(pvs,b) (void) ((b) >= 0 ? (unsigned char) ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : (unsigned char) false) #endif - diff --git a/model_q1bsp.h b/model_q1bsp.h new file mode 100644 index 00000000..e5a0cdcb --- /dev/null +++ b/model_q1bsp.h @@ -0,0 +1,45 @@ +#ifndef MODEL_Q1BSP_H +#define MODEL_Q1BSP_H + +#include "qtypes.h" +#include "model_brush.h" + +typedef struct model_brushq1_s +{ + mmodel_t *submodels; + + int numvertexes; + mvertex_t *vertexes; + + int numedges; + medge_t *edges; + + int numtexinfo; + struct mtexinfo_s *texinfo; + + int numsurfedges; + int *surfedges; + + int numclipnodes; + mclipnode_t *clipnodes; + + hull_t hulls[MAX_MAP_HULLS]; + + int num_compressedpvs; + unsigned char *data_compressedpvs; + + int num_lightdata; + unsigned char *lightdata; + unsigned char *nmaplightdata; // deluxemap file + + // lightmap update chains for light styles + int num_lightstyles; + model_brush_lightstyleinfo_t *data_lightstyleinfo; + + // this contains bytes that are 1 if a surface needs its lightmap rebuilt + unsigned char *lightmapupdateflags; + qbool firstrender; // causes all surface lightmaps to be loaded in first frame +} +model_brushq1_t; + +#endif \ No newline at end of file diff --git a/model_q2bsp.h b/model_q2bsp.h new file mode 100644 index 00000000..7c81ab39 --- /dev/null +++ b/model_q2bsp.h @@ -0,0 +1,189 @@ +#ifndef MODEL_Q2BSP_H +#define MODEL_Q2BSP_H + +#include "bspfile.h" + +#define Q2BSPMAGIC ('I' + 'B' * 256 + 'S' * 65536 + 'P' * 16777216) +#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 q2dheader_s +{ + int ident; + int version; + lump_t lumps[Q2HEADER_LUMPS]; +} q2dheader_t; + +typedef struct q2dmodel_s +{ + 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 + +#define Q2SURF_HINT 0x100 // make a primary bsp splitter +#define Q2SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes + +#define Q2SURF_ALPHATEST 0x02000000 // alpha test masking of color 255 in wal textures (supported by modded engines) + + +/* +typedef struct q2dnode_s +{ + 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 q2texinfo_s +{ + float vecs[2][4]; // [s/t][xyz offset] + int flags; // miptex flags + overrides + int value; // light emission, etc + char texture[32]; // texture name (textures/something.wal) + int nexttexinfo; // for animations, -1 = end of chain +} q2texinfo_t; + +typedef struct q2dleaf_s +{ + 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 q2dbrushside_s +{ + unsigned short planenum; // facing out of the leaf + short texinfo; +} q2dbrushside_t; + +typedef struct q2dbrush_s +{ + 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 q2dvis_s +{ + 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 q2dareaportal_s +{ + int portalnum; + int otherarea; +} q2dareaportal_t; + +typedef struct q2darea_s +{ + int numareaportals; + int firstareaportal; +} q2darea_t; +*/ + +#endif diff --git a/model_q3bsp.h b/model_q3bsp.h new file mode 100644 index 00000000..dc368be5 --- /dev/null +++ b/model_q3bsp.h @@ -0,0 +1,373 @@ +#ifndef MODEL_Q3BSP_H +#define MODEL_Q3BSP_H + +#include "bspfile.h" +#include "r_qshader.h" +#include "r_textures.h" +#include "matrixlib.h" + +//Q3 bsp stuff + +#define Q3BSPVERSION 46 +#define Q3BSPVERSION_LIVE 47 +#define Q3BSPVERSION_IG 48 + +#define Q3LUMP_ENTITIES 0 // entities to spawn (used by server and client) +#define Q3LUMP_TEXTURES 1 // textures used (used by faces) +#define Q3LUMP_PLANES 2 // planes used (used by bsp nodes) +#define Q3LUMP_NODES 3 // bsp nodes (used by bsp nodes, bsp leafs, rendering, collisions) +#define Q3LUMP_LEAFS 4 // bsp leafs (used by bsp nodes) +#define Q3LUMP_LEAFFACES 5 // array of ints indexing faces (used by leafs) +#define Q3LUMP_LEAFBRUSHES 6 // array of ints indexing brushes (used by leafs) +#define Q3LUMP_MODELS 7 // models (used by rendering, collisions) +#define Q3LUMP_BRUSHES 8 // brushes (used by effects, collisions) +#define Q3LUMP_BRUSHSIDES 9 // brush faces (used by brushes) +#define Q3LUMP_VERTICES 10 // mesh vertices (used by faces) +#define Q3LUMP_TRIANGLES 11 // mesh triangles (used by faces) +#define Q3LUMP_EFFECTS 12 // fog (used by faces) +#define Q3LUMP_FACES 13 // surfaces (used by leafs) +#define Q3LUMP_LIGHTMAPS 14 // lightmap textures (used by faces) +#define Q3LUMP_LIGHTGRID 15 // lighting as a voxel grid (used by rendering) +#define Q3LUMP_PVS 16 // potentially visible set; bit[clusters][clusters] (used by rendering) +#define Q3HEADER_LUMPS 17 +#define Q3LUMP_ADVERTISEMENTS 17 // quake live stuff written by zeroradiant's q3map2 (ignored by DP) +#define Q3HEADER_LUMPS_LIVE 18 +#define Q3HEADER_LUMPS_MAX 18 + +typedef struct q3dheader_s +{ + int ident; + int version; + lump_t lumps[Q3HEADER_LUMPS_MAX]; +} q3dheader_t; + +typedef struct q3dtexture_s +{ + char name[Q3PATHLENGTH]; + int surfaceflags; + int contents; +} +q3dtexture_t; + +// note: planes are paired, the pair of planes with i and i ^ 1 are opposites. +typedef struct q3dplane_s +{ + float normal[3]; + float dist; +} +q3dplane_t; + +typedef struct q3dnode_s +{ + int planeindex; + int childrenindex[2]; + int mins[3]; + int maxs[3]; +} +q3dnode_t; + +typedef struct q3dleaf_s +{ + int clusterindex; // pvs index + int areaindex; // area index + int mins[3]; + int maxs[3]; + int firstleafface; + int numleaffaces; + int firstleafbrush; + int numleafbrushes; +} +q3dleaf_t; + +typedef struct q3dmodel_s +{ + float mins[3]; + float maxs[3]; + int firstface; + int numfaces; + int firstbrush; + int numbrushes; +} +q3dmodel_t; + +typedef struct q3dbrush_s +{ + int firstbrushside; + int numbrushsides; + int textureindex; +} +q3dbrush_t; + +typedef struct q3dbrushside_s +{ + int planeindex; + int textureindex; +} +q3dbrushside_t; + +typedef struct q3dbrushside_ig_s +{ + int planeindex; + int textureindex; + int surfaceflags; +} +q3dbrushside_ig_t; + +typedef struct q3dvertex_s +{ + float origin3f[3]; + float texcoord2f[2]; + float lightmap2f[2]; + float normal3f[3]; + unsigned char color4ub[4]; +} +q3dvertex_t; + +typedef struct q3dmeshvertex_s +{ + int offset; // first vertex index of mesh +} +q3dmeshvertex_t; + +typedef struct q3deffect_s +{ + char shadername[Q3PATHLENGTH]; + int brushindex; + int unknown; // I read this is always 5 except in q3dm8 which has one effect with -1 +} +q3deffect_t; + +#define Q3FACETYPE_FLAT 1 // common +#define Q3FACETYPE_PATCH 2 // common +#define Q3FACETYPE_MESH 3 // common +#define Q3FACETYPE_FLARE 4 // rare (is this ever used?) + +typedef struct q3dface_s +{ + int textureindex; + int effectindex; // -1 if none + int type; // Q3FACETYPE + int firstvertex; + int numvertices; + int firstelement; + int numelements; + int lightmapindex; // -1 if none + int lightmap_base[2]; + int lightmap_size[2]; + union + { + struct + { + // corrupt or don't care + int blah[14]; + } + unknown; + struct + { + // Q3FACETYPE_FLAT + // mesh is a collection of triangles on a plane, renderable as a mesh (NOT a polygon) + float lightmap_origin[3]; + float lightmap_vectors[2][3]; + float normal[3]; + int unused1[2]; + } + flat; + struct + { + // Q3FACETYPE_PATCH + // patch renders as a bezier mesh, with adjustable tesselation + // level (optionally based on LOD using the bbox and polygon + // count to choose a tesselation level) + // note: multiple patches may have the same bbox to cause them to + // be LOD adjusted together as a group + int unused1[3]; + float mins[3]; // LOD bbox + float maxs[3]; // LOD bbox + int unused2[3]; + int patchsize[2]; // dimensions of vertex grid + } + patch; + struct + { + // Q3FACETYPE_MESH + // mesh renders as simply a triangle mesh + int unused1[3]; + float mins[3]; + float maxs[3]; + int unused2[5]; + } + mesh; + struct + { + // Q3FACETYPE_FLARE + // flare renders as a simple sprite at origin, no geometry + // exists, nor does it have a radius, a cvar controls the radius + // and another cvar controls distance fade + // (they were not used in Q3 I'm told) + float origin[3]; + int unused1[11]; + } + flare; + } + specific; +} +q3dface_t; + +typedef struct q3dlightmap_s +{ + unsigned char rgb[128*128*3]; +} +q3dlightmap_t; + +typedef struct q3dlightgrid_s +{ + unsigned char ambientrgb[3]; + unsigned char diffusergb[3]; + unsigned char diffusepitch; + unsigned char diffuseyaw; +} +q3dlightgrid_t; + +typedef struct q3dpvs_s +{ + int numclusters; + int chainlength; + // unsigned char chains[]; + // containing bits in 0-7 order (not 7-0 order), + // pvschains[mycluster * chainlength + (thatcluster >> 3)] & (1 << (thatcluster & 7)) +} +q3dpvs_t; + +// surfaceflags from bsp +#define Q3SURFACEFLAG_NODAMAGE 1 +#define Q3SURFACEFLAG_SLICK 2 +#define Q3SURFACEFLAG_SKY 4 +#define Q3SURFACEFLAG_LADDER 8 // has no surfaceparm +#define Q3SURFACEFLAG_NOIMPACT 16 +#define Q3SURFACEFLAG_NOMARKS 32 +#define Q3SURFACEFLAG_FLESH 64 // has no surfaceparm +#define Q3SURFACEFLAG_NODRAW 128 +#define Q3SURFACEFLAG_HINT 256 +#define Q3SURFACEFLAG_SKIP 512 // has no surfaceparm +#define Q3SURFACEFLAG_NOLIGHTMAP 1024 +#define Q3SURFACEFLAG_POINTLIGHT 2048 +#define Q3SURFACEFLAG_METALSTEPS 4096 +#define Q3SURFACEFLAG_NOSTEPS 8192 // has no surfaceparm +#define Q3SURFACEFLAG_NONSOLID 16384 +#define Q3SURFACEFLAG_LIGHTFILTER 32768 +#define Q3SURFACEFLAG_ALPHASHADOW 65536 +#define Q3SURFACEFLAG_NODLIGHT 131072 +#define Q3SURFACEFLAG_DUST 262144 + +// surfaceparms from shaders +#define Q3SURFACEPARM_ALPHASHADOW 1 +#define Q3SURFACEPARM_AREAPORTAL 2 +#define Q3SURFACEPARM_CLUSTERPORTAL 4 +#define Q3SURFACEPARM_DETAIL 8 +#define Q3SURFACEPARM_DONOTENTER 16 +#define Q3SURFACEPARM_FOG 32 +#define Q3SURFACEPARM_LAVA 64 +#define Q3SURFACEPARM_LIGHTFILTER 128 +#define Q3SURFACEPARM_METALSTEPS 256 +#define Q3SURFACEPARM_NODAMAGE 512 +#define Q3SURFACEPARM_NODLIGHT 1024 +#define Q3SURFACEPARM_NODRAW 2048 +#define Q3SURFACEPARM_NODROP 4096 +#define Q3SURFACEPARM_NOIMPACT 8192 +#define Q3SURFACEPARM_NOLIGHTMAP 16384 +#define Q3SURFACEPARM_NOMARKS 32768 +#define Q3SURFACEPARM_NOMIPMAPS 65536 +#define Q3SURFACEPARM_NONSOLID 131072 +#define Q3SURFACEPARM_ORIGIN 262144 +#define Q3SURFACEPARM_PLAYERCLIP 524288 +#define Q3SURFACEPARM_SKY 1048576 +#define Q3SURFACEPARM_SLICK 2097152 +#define Q3SURFACEPARM_SLIME 4194304 +#define Q3SURFACEPARM_STRUCTURAL 8388608 +#define Q3SURFACEPARM_TRANS 16777216 +#define Q3SURFACEPARM_WATER 33554432 +#define Q3SURFACEPARM_POINTLIGHT 67108864 +#define Q3SURFACEPARM_HINT 134217728 +#define Q3SURFACEPARM_DUST 268435456 +#define Q3SURFACEPARM_BOTCLIP 536870912 +#define Q3SURFACEPARM_LIGHTGRID 1073741824 +#define Q3SURFACEPARM_ANTIPORTAL 2147483648u + +typedef struct q3mbrush_s +{ + struct colbrushf_s *colbrushf; + int numbrushsides; + struct q3mbrushside_s *firstbrushside; + struct texture_s *texture; +} +q3mbrush_t; + +typedef struct q3mbrushside_s +{ + struct mplane_s *plane; + struct texture_s *texture; +} +q3mbrushside_t; + +typedef struct model_brushq3_s +{ + int num_models; + q3dmodel_t *data_models; + + // used only during loading - freed after loading! + int num_vertices; + float *data_vertex3f; + float *data_normal3f; + float *data_texcoordtexture2f; + float *data_texcoordlightmap2f; + float *data_color4f; + + // freed after loading! + int num_triangles; + int *data_element3i; + + int num_effects; + q3deffect_t *data_effects; + + // lightmap textures + int num_originallightmaps; + int num_mergedlightmaps; + int num_lightmapmergedwidthpower; + int num_lightmapmergedheightpower; + int num_lightmapmergedwidthheightdeluxepower; + int num_lightmapmerge; + rtexture_t **data_lightmaps; + rtexture_t **data_deluxemaps; + + // voxel light data with directional shading - data for cpu sampling of it... + int num_lightgrid; + q3dlightgrid_t *data_lightgrid; + // size of each cell (may vary by map, typically 64 64 128) + float num_lightgrid_cellsize[3]; + // 1.0 / num_lightgrid_cellsize + float num_lightgrid_scale[3]; + // dimensions of the world model in lightgrid cells + int num_lightgrid_imins[3]; + int num_lightgrid_imaxs[3]; + int num_lightgrid_isize[3]; + // transform modelspace coordinates to lightgrid index + matrix4x4_t num_lightgrid_indexfromworld; + // parameters for fragment shader to sample the texture version of it: + int lightgridtexturesize[3]; // 3 layers tall (ambient, lightcolor, lightdir) + matrix4x4_t lightgridworldtotexturematrix; + rtexture_t *lightgridtexture; + + // true if this q3bsp file has been detected as using deluxemapping + // (lightmap texture pairs, every odd one is never directly refernced, + // and contains lighting normals, not colors) + qbool deluxemapping; + // true if the detected deluxemaps are the modelspace kind, rather than + // the faster tangentspace kind + qbool deluxemapping_modelspace; + // size of lightmaps (128 by default, but may be another poweroftwo if + // external lightmaps are used (q3map2 -lightmapsize) + int lightmapsize; +} +model_brushq3_t; + +#endif diff --git a/model_shared.h b/model_shared.h index ec5720ea..04529c56 100644 --- a/model_shared.h +++ b/model_shared.h @@ -22,6 +22,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MODEL_SHARED_H #include "bspfile.h" +#include "r_qshader.h" +#include "protocol.h" +#include "r_textures.h" +#include "matrixlib.h" typedef enum synctype_e {ST_SYNC=0, ST_RAND } synctype_t; @@ -219,274 +223,6 @@ typedef struct shadowmesh_s } shadowmesh_t; -// various flags from shaders, used for special effects not otherwise classified -// TODO: support these features more directly -#define Q3TEXTUREFLAG_TWOSIDED 1 -#define Q3TEXTUREFLAG_NOPICMIP 16 -#define Q3TEXTUREFLAG_POLYGONOFFSET 32 -#define Q3TEXTUREFLAG_REFRACTION 256 -#define Q3TEXTUREFLAG_REFLECTION 512 -#define Q3TEXTUREFLAG_WATERSHADER 1024 -#define Q3TEXTUREFLAG_CAMERA 2048 -#define Q3TEXTUREFLAG_TRANSPARENTSORT 4096 - -#define Q3PATHLENGTH 64 -#define TEXTURE_MAXFRAMES 64 -#define Q3WAVEPARMS 4 -#define Q3DEFORM_MAXPARMS 3 -#define Q3SHADER_MAXLAYERS 8 -#define Q3RGBGEN_MAXPARMS 3 -#define Q3ALPHAGEN_MAXPARMS 1 -#define Q3TCGEN_MAXPARMS 6 -#define Q3TCMOD_MAXPARMS 6 -#define Q3MAXTCMODS 8 -#define Q3MAXDEFORMS 4 - -typedef enum q3wavefunc_e -{ - Q3WAVEFUNC_NONE, - Q3WAVEFUNC_INVERSESAWTOOTH, - Q3WAVEFUNC_NOISE, - Q3WAVEFUNC_SAWTOOTH, - Q3WAVEFUNC_SIN, - Q3WAVEFUNC_SQUARE, - Q3WAVEFUNC_TRIANGLE, - Q3WAVEFUNC_COUNT -} -q3wavefunc_e; -typedef int q3wavefunc_t; -#define Q3WAVEFUNC_USER_COUNT 4 -#define Q3WAVEFUNC_USER_SHIFT 8 // use 8 bits for wave func type - -typedef enum q3deform_e -{ - Q3DEFORM_NONE, - Q3DEFORM_PROJECTIONSHADOW, - Q3DEFORM_AUTOSPRITE, - Q3DEFORM_AUTOSPRITE2, - Q3DEFORM_TEXT0, - Q3DEFORM_TEXT1, - Q3DEFORM_TEXT2, - Q3DEFORM_TEXT3, - Q3DEFORM_TEXT4, - Q3DEFORM_TEXT5, - Q3DEFORM_TEXT6, - Q3DEFORM_TEXT7, - Q3DEFORM_BULGE, - Q3DEFORM_WAVE, - Q3DEFORM_NORMAL, - Q3DEFORM_MOVE, - Q3DEFORM_COUNT -} -q3deform_t; - -typedef enum q3rgbgen_e -{ - Q3RGBGEN_IDENTITY, - Q3RGBGEN_CONST, - Q3RGBGEN_ENTITY, - Q3RGBGEN_EXACTVERTEX, - Q3RGBGEN_IDENTITYLIGHTING, - Q3RGBGEN_LIGHTINGDIFFUSE, - Q3RGBGEN_ONEMINUSENTITY, - Q3RGBGEN_ONEMINUSVERTEX, - Q3RGBGEN_VERTEX, - Q3RGBGEN_WAVE, - Q3RGBGEN_COUNT -} -q3rgbgen_t; - -typedef enum q3alphagen_e -{ - Q3ALPHAGEN_IDENTITY, - Q3ALPHAGEN_CONST, - Q3ALPHAGEN_ENTITY, - Q3ALPHAGEN_LIGHTINGSPECULAR, - Q3ALPHAGEN_ONEMINUSENTITY, - Q3ALPHAGEN_ONEMINUSVERTEX, - Q3ALPHAGEN_PORTAL, - Q3ALPHAGEN_VERTEX, - Q3ALPHAGEN_WAVE, - Q3ALPHAGEN_COUNT -} -q3alphagen_t; - -typedef enum q3tcgen_e -{ - Q3TCGEN_NONE, - Q3TCGEN_TEXTURE, // very common - Q3TCGEN_ENVIRONMENT, // common - Q3TCGEN_LIGHTMAP, - Q3TCGEN_VECTOR, - Q3TCGEN_COUNT -} -q3tcgen_t; - -typedef enum q3tcmod_e -{ - Q3TCMOD_NONE, - Q3TCMOD_ENTITYTRANSLATE, - Q3TCMOD_ROTATE, - Q3TCMOD_SCALE, - Q3TCMOD_SCROLL, - Q3TCMOD_STRETCH, - Q3TCMOD_TRANSFORM, - Q3TCMOD_TURBULENT, - Q3TCMOD_PAGE, - Q3TCMOD_COUNT -} -q3tcmod_t; - -typedef struct q3shaderinfo_layer_rgbgen_s -{ - q3rgbgen_t rgbgen; - float parms[Q3RGBGEN_MAXPARMS]; - q3wavefunc_t wavefunc; - float waveparms[Q3WAVEPARMS]; -} -q3shaderinfo_layer_rgbgen_t; - -typedef struct q3shaderinfo_layer_alphagen_s -{ - q3alphagen_t alphagen; - float parms[Q3ALPHAGEN_MAXPARMS]; - q3wavefunc_t wavefunc; - float waveparms[Q3WAVEPARMS]; -} -q3shaderinfo_layer_alphagen_t; - -typedef struct q3shaderinfo_layer_tcgen_s -{ - q3tcgen_t tcgen; - float parms[Q3TCGEN_MAXPARMS]; -} -q3shaderinfo_layer_tcgen_t; - -typedef struct q3shaderinfo_layer_tcmod_s -{ - q3tcmod_t tcmod; - float parms[Q3TCMOD_MAXPARMS]; - q3wavefunc_t wavefunc; - float waveparms[Q3WAVEPARMS]; -} -q3shaderinfo_layer_tcmod_t; - -typedef struct q3shaderinfo_layer_s -{ - int alphatest; - int clampmap; - float framerate; - int numframes; - int dptexflags; - char** texturename; - int blendfunc[2]; - q3shaderinfo_layer_rgbgen_t rgbgen; - q3shaderinfo_layer_alphagen_t alphagen; - q3shaderinfo_layer_tcgen_t tcgen; - q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS]; -} -q3shaderinfo_layer_t; - -typedef struct q3shaderinfo_deform_s -{ - q3deform_t deform; - float parms[Q3DEFORM_MAXPARMS]; - q3wavefunc_t wavefunc; - float waveparms[Q3WAVEPARMS]; -} -q3shaderinfo_deform_t; - -typedef enum dpoffsetmapping_technique_s -{ - OFFSETMAPPING_OFF, // none - OFFSETMAPPING_DEFAULT, // cvar-set - OFFSETMAPPING_LINEAR, // linear - OFFSETMAPPING_RELIEF // relief -}dpoffsetmapping_technique_t; - -typedef enum dptransparentsort_category_e -{ - TRANSPARENTSORT_SKY, - TRANSPARENTSORT_DISTANCE, - TRANSPARENTSORT_HUD, -}dptransparentsortcategory_t; - -typedef struct shader_s -{ - char name[Q3PATHLENGTH]; -#define Q3SHADERINFO_COMPARE_START surfaceparms - int surfaceparms; - int surfaceflags; - int textureflags; - int numlayers; - qbool lighting; - qbool vertexalpha; - qbool textureblendalpha; - q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS]; - char skyboxname[Q3PATHLENGTH]; - q3shaderinfo_deform_t deforms[Q3MAXDEFORMS]; - - // dp-specific additions: - - // shadow control - qbool dpnortlight; - qbool dpshadow; - qbool dpnoshadow; - - // add collisions to all triangles of the surface - qbool dpmeshcollisions; - - // kill shader based on cvar checks - qbool dpshaderkill; - - // fake reflection - char dpreflectcube[Q3PATHLENGTH]; - - // reflection - float reflectmin; // when refraction is used, minimum amount of reflection (when looking straight down) - float reflectmax; // when refraction is used, maximum amount of reflection (when looking parallel to water) - float refractfactor; // amount of refraction distort (1.0 = like the cvar specifies) - vec4_t refractcolor4f; // color tint of refraction (including alpha factor) - float reflectfactor; // amount of reflection distort (1.0 = like the cvar specifies) - vec4_t reflectcolor4f; // color tint of reflection (including alpha factor) - float r_water_wateralpha; // additional wateralpha to apply when r_water is active - float r_water_waterscroll[2]; // water normalmapscrollblend - scale and speed - - // offsetmapping - dpoffsetmapping_technique_t offsetmapping; - float offsetscale; - float offsetbias; // 0 is normal, 1 leads to alpha 0 being neutral and alpha 1 pushing "out" - - // polygonoffset (only used if Q3TEXTUREFLAG_POLYGONOFFSET) - float biaspolygonoffset, biaspolygonfactor; - - // transparent sort category - dptransparentsortcategory_t transparentsort; - - // gloss - float specularscalemod; - float specularpowermod; - - // rtlighting ambient addition - float rtlightambient; -#define Q3SHADERINFO_COMPARE_END rtlightambient -} -shader_t; - -typedef struct texture_shaderpass_s -{ - qbool alphatest; // FIXME: handle alphafunc properly - float framerate; - int numframes; - skinframe_t *skinframes[TEXTURE_MAXFRAMES]; - int blendfunc[2]; - q3shaderinfo_layer_rgbgen_t rgbgen; - q3shaderinfo_layer_alphagen_t alphagen; - q3shaderinfo_layer_tcgen_t tcgen; - q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS]; -} -texture_shaderpass_t; - typedef struct texture_s { // name @@ -706,239 +442,17 @@ typedef struct msurface_s } msurface_t; -#include "matrixlib.h" #include "bih.h" #include "model_brush.h" +#include "model_q1bsp.h" +#include "model_q2bsp.h" +#include "model_q3bsp.h" #include "model_sprite.h" #include "model_alias.h" -typedef struct model_sprite_s -{ - int sprnum_type; - mspriteframe_t *sprdata_frames; -} -model_sprite_t; - struct trace_s; -typedef struct model_brush_lightstyleinfo_s -{ - int style; - int value; - int numsurfaces; - int *surfacelist; -} -model_brush_lightstyleinfo_t; - -typedef struct model_brush_s -{ - // true if this model is a HalfLife .bsp file - qbool ishlbsp; - // true if this model is a BSP2rmqe .bsp file (expanded 32bit bsp format for rmqe) - qbool isbsp2rmqe; - // true if this model is a BSP2 .bsp file (expanded 32bit bsp format for DarkPlaces, others?) - qbool isbsp2; - // true if this model is a Quake2 .bsp file (IBSP38) - qbool isq2bsp; - // true if this model is a Quake3 .bsp file (IBSP46) - qbool isq3bsp; - // true if this model is a Quake1/Quake2 .bsp file where skymasking capability exists - qbool skymasking; - // string of entity definitions (.map format) - char *entities; - - // if not NULL this is a submodel - struct model_s *parentmodel; - // (this is the number of the submodel, an index into submodels) - int submodel; - - // number of submodels in this map (just used by server to know how many - // submodels to load) - int numsubmodels; - // pointers to each of the submodels - struct model_s **submodels; - - int num_planes; - mplane_t *data_planes; - - int num_nodes; - mnode_t *data_nodes; - - // visible leafs, not counting 0 (solid) - int num_visleafs; - // number of actual leafs (including 0 which is solid) - int num_leafs; - mleaf_t *data_leafs; - - int num_leafbrushes; - int *data_leafbrushes; - - int num_leafsurfaces; - int *data_leafsurfaces; - - int num_portals; - mportal_t *data_portals; - - int num_portalpoints; - mvertex_t *data_portalpoints; - - int num_brushes; - q3mbrush_t *data_brushes; - - int num_brushsides; - q3mbrushside_t *data_brushsides; - - // pvs - int num_pvsclusters; - int num_pvsclusterbytes; - unsigned char *data_pvsclusters; - // example - //pvschain = model->brush.data_pvsclusters + mycluster * model->brush.num_pvsclusterbytes; - //if (pvschain[thatcluster >> 3] & (1 << (thatcluster & 7))) - - // collision geometry for q3 curves - int num_collisionvertices; - int num_collisiontriangles; - float *data_collisionvertex3f; - int *data_collisionelement3i; - - // a mesh containing all shadow casting geometry for the whole model (including submodels), portions of this are referenced by each surface's num_firstshadowmeshtriangle - shadowmesh_t *shadowmesh; - - // a mesh containing all SUPERCONTENTS_SOLID surfaces for this model or submodel, for physics engines to use - shadowmesh_t *collisionmesh; - - // common functions - int (*SuperContentsFromNativeContents)(int nativecontents); - int (*NativeContentsFromSuperContents)(int supercontents); - unsigned char *(*GetPVS)(struct model_s *model, const vec3_t p); - int (*FatPVS)(struct model_s *model, const vec3_t org, vec_t radius, unsigned char *pvsbuffer, int pvsbufferlength, qbool merge); - int (*BoxTouchingPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs); - int (*BoxTouchingLeafPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs); - int (*BoxTouchingVisibleLeafs)(struct model_s *model, const unsigned char *visibleleafs, const vec3_t mins, const vec3_t maxs); - int (*FindBoxClusters)(struct model_s *model, const vec3_t mins, const vec3_t maxs, int maxclusters, int *clusterlist); - void (*LightPoint)(struct model_s *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal); - void (*FindNonSolidLocation)(struct model_s *model, const vec3_t in, vec3_t out, vec_t radius); - mleaf_t *(*PointInLeaf)(struct model_s *model, const vec3_t p); - // these are actually only found on brushq1, but NULL is handled gracefully - void (*AmbientSoundLevelsForPoint)(struct model_s *model, const vec3_t p, unsigned char *out, int outsize); - void (*RoundUpToHullSize)(struct model_s *cmodel, const vec3_t inmins, const vec3_t inmaxs, vec3_t outmins, vec3_t outmaxs); - // trace a line of sight through this model (returns false if the line if sight is definitely blocked) - qbool (*TraceLineOfSight)(struct model_s *model, const vec3_t start, const vec3_t end, const vec3_t acceptmins, const vec3_t acceptmaxs); - - char skybox[MAX_QPATH]; - - skinframe_t *solidskyskinframe; - skinframe_t *alphaskyskinframe; - - qbool supportwateralpha; - - // QuakeWorld - int qw_md4sum; - int qw_md4sum2; -} -model_brush_t; - -typedef struct model_brushq1_s -{ - mmodel_t *submodels; - - int numvertexes; - mvertex_t *vertexes; - - int numedges; - medge_t *edges; - - int numtexinfo; - mtexinfo_t *texinfo; - - int numsurfedges; - int *surfedges; - - int numclipnodes; - mclipnode_t *clipnodes; - - hull_t hulls[MAX_MAP_HULLS]; - - int num_compressedpvs; - unsigned char *data_compressedpvs; - - int num_lightdata; - unsigned char *lightdata; - unsigned char *nmaplightdata; // deluxemap file - - // lightmap update chains for light styles - int num_lightstyles; - model_brush_lightstyleinfo_t *data_lightstyleinfo; - - // this contains bytes that are 1 if a surface needs its lightmap rebuilt - unsigned char *lightmapupdateflags; - qbool firstrender; // causes all surface lightmaps to be loaded in first frame -} -model_brushq1_t; - -typedef struct model_brushq3_s -{ - int num_models; - q3dmodel_t *data_models; - - // used only during loading - freed after loading! - int num_vertices; - float *data_vertex3f; - float *data_normal3f; - float *data_texcoordtexture2f; - float *data_texcoordlightmap2f; - float *data_color4f; - - // freed after loading! - int num_triangles; - int *data_element3i; - - int num_effects; - q3deffect_t *data_effects; - - // lightmap textures - int num_originallightmaps; - int num_mergedlightmaps; - int num_lightmapmergedwidthpower; - int num_lightmapmergedheightpower; - int num_lightmapmergedwidthheightdeluxepower; - int num_lightmapmerge; - rtexture_t **data_lightmaps; - rtexture_t **data_deluxemaps; - - // voxel light data with directional shading - data for cpu sampling of it... - int num_lightgrid; - q3dlightgrid_t *data_lightgrid; - // size of each cell (may vary by map, typically 64 64 128) - float num_lightgrid_cellsize[3]; - // 1.0 / num_lightgrid_cellsize - float num_lightgrid_scale[3]; - // dimensions of the world model in lightgrid cells - int num_lightgrid_imins[3]; - int num_lightgrid_imaxs[3]; - int num_lightgrid_isize[3]; - // transform modelspace coordinates to lightgrid index - matrix4x4_t num_lightgrid_indexfromworld; - // parameters for fragment shader to sample the texture version of it: - int lightgridtexturesize[3]; // 3 layers tall (ambient, lightcolor, lightdir) - matrix4x4_t lightgridworldtotexturematrix; - rtexture_t *lightgridtexture; - - // true if this q3bsp file has been detected as using deluxemapping - // (lightmap texture pairs, every odd one is never directly refernced, - // and contains lighting normals, not colors) - qbool deluxemapping; - // true if the detected deluxemaps are the modelspace kind, rather than - // the faster tangentspace kind - qbool deluxemapping_modelspace; - // size of lightmaps (128 by default, but may be another poweroftwo if - // external lightmaps are used (q3map2 -lightmapsize) - int lightmapsize; -} -model_brushq3_t; - struct frameblend_s; struct skeleton_s; diff --git a/model_sprite.h b/model_sprite.h index f6408dad..d28174df 100644 --- a/model_sprite.h +++ b/model_sprite.h @@ -37,5 +37,12 @@ typedef struct mspriteframe_s float up, down, left, right; } mspriteframe_t; +typedef struct model_sprite_s +{ + int sprnum_type; + mspriteframe_t *sprdata_frames; +} +model_sprite_t; + #endif diff --git a/r_qshader.h b/r_qshader.h new file mode 100644 index 00000000..ce38ff7f --- /dev/null +++ b/r_qshader.h @@ -0,0 +1,274 @@ +#ifndef QSHADER_H +#define QSHADER_H + +#include "qtypes.h" + +// various flags from shaders, used for special effects not otherwise classified +// TODO: support these features more directly +#define Q3TEXTUREFLAG_TWOSIDED 1 +#define Q3TEXTUREFLAG_NOPICMIP 16 +#define Q3TEXTUREFLAG_POLYGONOFFSET 32 +#define Q3TEXTUREFLAG_REFRACTION 256 +#define Q3TEXTUREFLAG_REFLECTION 512 +#define Q3TEXTUREFLAG_WATERSHADER 1024 +#define Q3TEXTUREFLAG_CAMERA 2048 +#define Q3TEXTUREFLAG_TRANSPARENTSORT 4096 + +#define Q3PATHLENGTH 64 +#define TEXTURE_MAXFRAMES 64 +#define Q3WAVEPARMS 4 +#define Q3DEFORM_MAXPARMS 3 +#define Q3SHADER_MAXLAYERS 8 +#define Q3RGBGEN_MAXPARMS 3 +#define Q3ALPHAGEN_MAXPARMS 1 +#define Q3TCGEN_MAXPARMS 6 +#define Q3TCMOD_MAXPARMS 6 +#define Q3MAXTCMODS 8 +#define Q3MAXDEFORMS 4 + +typedef enum q3wavefunc_e +{ + Q3WAVEFUNC_NONE, + Q3WAVEFUNC_INVERSESAWTOOTH, + Q3WAVEFUNC_NOISE, + Q3WAVEFUNC_SAWTOOTH, + Q3WAVEFUNC_SIN, + Q3WAVEFUNC_SQUARE, + Q3WAVEFUNC_TRIANGLE, + Q3WAVEFUNC_COUNT +} +q3wavefunc_e; +typedef int q3wavefunc_t; +#define Q3WAVEFUNC_USER_COUNT 4 +#define Q3WAVEFUNC_USER_SHIFT 8 // use 8 bits for wave func type + +typedef enum q3deform_e +{ + Q3DEFORM_NONE, + Q3DEFORM_PROJECTIONSHADOW, + Q3DEFORM_AUTOSPRITE, + Q3DEFORM_AUTOSPRITE2, + Q3DEFORM_TEXT0, + Q3DEFORM_TEXT1, + Q3DEFORM_TEXT2, + Q3DEFORM_TEXT3, + Q3DEFORM_TEXT4, + Q3DEFORM_TEXT5, + Q3DEFORM_TEXT6, + Q3DEFORM_TEXT7, + Q3DEFORM_BULGE, + Q3DEFORM_WAVE, + Q3DEFORM_NORMAL, + Q3DEFORM_MOVE, + Q3DEFORM_COUNT +} +q3deform_t; + +typedef enum q3rgbgen_e +{ + Q3RGBGEN_IDENTITY, + Q3RGBGEN_CONST, + Q3RGBGEN_ENTITY, + Q3RGBGEN_EXACTVERTEX, + Q3RGBGEN_IDENTITYLIGHTING, + Q3RGBGEN_LIGHTINGDIFFUSE, + Q3RGBGEN_ONEMINUSENTITY, + Q3RGBGEN_ONEMINUSVERTEX, + Q3RGBGEN_VERTEX, + Q3RGBGEN_WAVE, + Q3RGBGEN_COUNT +} +q3rgbgen_t; + +typedef enum q3alphagen_e +{ + Q3ALPHAGEN_IDENTITY, + Q3ALPHAGEN_CONST, + Q3ALPHAGEN_ENTITY, + Q3ALPHAGEN_LIGHTINGSPECULAR, + Q3ALPHAGEN_ONEMINUSENTITY, + Q3ALPHAGEN_ONEMINUSVERTEX, + Q3ALPHAGEN_PORTAL, + Q3ALPHAGEN_VERTEX, + Q3ALPHAGEN_WAVE, + Q3ALPHAGEN_COUNT +} +q3alphagen_t; + +typedef enum q3tcgen_e +{ + Q3TCGEN_NONE, + Q3TCGEN_TEXTURE, // very common + Q3TCGEN_ENVIRONMENT, // common + Q3TCGEN_LIGHTMAP, + Q3TCGEN_VECTOR, + Q3TCGEN_COUNT +} +q3tcgen_t; + +typedef enum q3tcmod_e +{ + Q3TCMOD_NONE, + Q3TCMOD_ENTITYTRANSLATE, + Q3TCMOD_ROTATE, + Q3TCMOD_SCALE, + Q3TCMOD_SCROLL, + Q3TCMOD_STRETCH, + Q3TCMOD_TRANSFORM, + Q3TCMOD_TURBULENT, + Q3TCMOD_PAGE, + Q3TCMOD_COUNT +} +q3tcmod_t; + +typedef struct q3shaderinfo_layer_rgbgen_s +{ + q3rgbgen_t rgbgen; + float parms[Q3RGBGEN_MAXPARMS]; + q3wavefunc_t wavefunc; + float waveparms[Q3WAVEPARMS]; +} +q3shaderinfo_layer_rgbgen_t; + +typedef struct q3shaderinfo_layer_alphagen_s +{ + q3alphagen_t alphagen; + float parms[Q3ALPHAGEN_MAXPARMS]; + q3wavefunc_t wavefunc; + float waveparms[Q3WAVEPARMS]; +} +q3shaderinfo_layer_alphagen_t; + +typedef struct q3shaderinfo_layer_tcgen_s +{ + q3tcgen_t tcgen; + float parms[Q3TCGEN_MAXPARMS]; +} +q3shaderinfo_layer_tcgen_t; + +typedef struct q3shaderinfo_layer_tcmod_s +{ + q3tcmod_t tcmod; + float parms[Q3TCMOD_MAXPARMS]; + q3wavefunc_t wavefunc; + float waveparms[Q3WAVEPARMS]; +} +q3shaderinfo_layer_tcmod_t; + +typedef struct q3shaderinfo_layer_s +{ + int alphatest; + int clampmap; + float framerate; + int numframes; + int dptexflags; + char** texturename; + int blendfunc[2]; + q3shaderinfo_layer_rgbgen_t rgbgen; + q3shaderinfo_layer_alphagen_t alphagen; + q3shaderinfo_layer_tcgen_t tcgen; + q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS]; +} +q3shaderinfo_layer_t; + +typedef struct q3shaderinfo_deform_s +{ + q3deform_t deform; + float parms[Q3DEFORM_MAXPARMS]; + q3wavefunc_t wavefunc; + float waveparms[Q3WAVEPARMS]; +} +q3shaderinfo_deform_t; + +typedef enum dpoffsetmapping_technique_s +{ + OFFSETMAPPING_OFF, // none + OFFSETMAPPING_DEFAULT, // cvar-set + OFFSETMAPPING_LINEAR, // linear + OFFSETMAPPING_RELIEF // relief +}dpoffsetmapping_technique_t; + +typedef enum dptransparentsort_category_e +{ + TRANSPARENTSORT_SKY, + TRANSPARENTSORT_DISTANCE, + TRANSPARENTSORT_HUD, +}dptransparentsortcategory_t; + +typedef struct shader_s +{ + char name[Q3PATHLENGTH]; +#define Q3SHADERINFO_COMPARE_START surfaceparms + int surfaceparms; + int surfaceflags; + int textureflags; + int numlayers; + qbool lighting; + qbool vertexalpha; + qbool textureblendalpha; + q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS]; + char skyboxname[Q3PATHLENGTH]; + q3shaderinfo_deform_t deforms[Q3MAXDEFORMS]; + + // dp-specific additions: + + // shadow control + qbool dpnortlight; + qbool dpshadow; + qbool dpnoshadow; + + // add collisions to all triangles of the surface + qbool dpmeshcollisions; + + // kill shader based on cvar checks + qbool dpshaderkill; + + // fake reflection + char dpreflectcube[Q3PATHLENGTH]; + + // reflection + float reflectmin; // when refraction is used, minimum amount of reflection (when looking straight down) + float reflectmax; // when refraction is used, maximum amount of reflection (when looking parallel to water) + float refractfactor; // amount of refraction distort (1.0 = like the cvar specifies) + vec4_t refractcolor4f; // color tint of refraction (including alpha factor) + float reflectfactor; // amount of reflection distort (1.0 = like the cvar specifies) + vec4_t reflectcolor4f; // color tint of reflection (including alpha factor) + float r_water_wateralpha; // additional wateralpha to apply when r_water is active + float r_water_waterscroll[2]; // water normalmapscrollblend - scale and speed + + // offsetmapping + dpoffsetmapping_technique_t offsetmapping; + float offsetscale; + float offsetbias; // 0 is normal, 1 leads to alpha 0 being neutral and alpha 1 pushing "out" + + // polygonoffset (only used if Q3TEXTUREFLAG_POLYGONOFFSET) + float biaspolygonoffset, biaspolygonfactor; + + // transparent sort category + dptransparentsortcategory_t transparentsort; + + // gloss + float specularscalemod; + float specularpowermod; + + // rtlighting ambient addition + float rtlightambient; +#define Q3SHADERINFO_COMPARE_END rtlightambient +} +shader_t; + +typedef struct texture_shaderpass_s +{ + qbool alphatest; // FIXME: handle alphafunc properly + float framerate; + int numframes; + struct skinframe_s *skinframes[TEXTURE_MAXFRAMES]; + int blendfunc[2]; + q3shaderinfo_layer_rgbgen_t rgbgen; + q3shaderinfo_layer_alphagen_t alphagen; + q3shaderinfo_layer_tcgen_t tcgen; + q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS]; +} +texture_shaderpass_t; + +#endif