#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;