<ClInclude Include="model_dpmodel.h" />\r
<ClInclude Include="model_iqm.h" />\r
<ClInclude Include="model_psk.h" />\r
+ <ClInclude Include="model_q1bsp.h" />\r
+ <ClInclude Include="model_q2bsp.h" />\r
+ <ClInclude Include="model_q3bsp.h" />\r
<ClInclude Include="model_shared.h" />\r
<ClInclude Include="model_sprite.h" />\r
<ClInclude Include="model_zymotic.h" />\r
<ClInclude Include="quakedef.h" />\r
<ClInclude Include="r_lerpanim.h" />\r
<ClInclude Include="r_modules.h" />\r
+ <ClInclude Include="r_qshader.h" />\r
<ClInclude Include="r_shadow.h" />\r
<ClInclude Include="r_stats.h" />\r
<ClInclude Include="r_textures.h" />\r
<ClInclude Include="model_dpmodel.h" />\r
<ClInclude Include="model_iqm.h" />\r
<ClInclude Include="model_psk.h" />\r
+ <ClInclude Include="model_q1bsp.h" />\r
+ <ClInclude Include="model_q2bsp.h" />\r
+ <ClInclude Include="model_q3bsp.h" />\r
<ClInclude Include="model_shared.h" />\r
<ClInclude Include="model_sprite.h" />\r
<ClInclude Include="model_zymotic.h" />\r
<ClInclude Include="quakedef.h" />\r
<ClInclude Include="r_lerpanim.h" />\r
<ClInclude Include="r_modules.h" />\r
+ <ClInclude Include="r_qshader.h" />\r
<ClInclude Include="r_shadow.h" />\r
<ClInclude Include="r_stats.h" />\r
<ClInclude Include="r_textures.h" />\r
#ifndef MODEL_BRUSH_H
#define MODEL_BRUSH_H
+#include "qtypes.h"
+#include "qdefs.h"
+#include "bspfile.h"
+
/*
==============================================================================
}
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)
#define CLEARPVSBIT(pvs,b) (void) ((b) >= 0 ? (unsigned char) ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : (unsigned char) false)
#endif
-
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
#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;
}
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
}
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;
float up, down, left, right;
} mspriteframe_t;
+typedef struct model_sprite_s
+{
+ int sprnum_type;
+ mspriteframe_t *sprdata_frames;
+}
+model_sprite_t;
+
#endif
--- /dev/null
+#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