+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;
+ char texturename[TEXTURE_MAXFRAMES][Q3PATHLENGTH];
+ 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 struct q3shaderinfo_s
+{
+ char name[Q3PATHLENGTH];
+ int surfaceparms;
+ int textureflags;
+ int numlayers;
+ qboolean lighting;
+ qboolean vertexalpha;
+ qboolean textureblendalpha;
+ q3shaderinfo_layer_t *primarylayer, *backgroundlayer;
+ q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS];
+ char skyboxname[Q3PATHLENGTH];
+ q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
+
+ 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)
+}
+q3shaderinfo_t;
+
+typedef enum texturelayertype_e
+{
+ TEXTURELAYERTYPE_INVALID,
+ TEXTURELAYERTYPE_LITTEXTURE,
+ TEXTURELAYERTYPE_TEXTURE,
+ TEXTURELAYERTYPE_FOG,
+}
+texturelayertype_t;
+
+typedef enum texturelayerflag_e
+{
+ // indicates that the pass should apply fog darkening; used on
+ // transparent surfaces where simply blending an alpha fog as a final
+ // pass would not behave properly, so all the surfaces must be darkened,
+ // and the fog color added as a separate pass
+ TEXTURELAYERFLAG_FOGDARKEN = 1,
+}
+texturelayerflag_t;
+
+typedef struct texturelayer_s
+{
+ texturelayertype_t type;
+ qboolean depthmask;
+ int blendfunc1;
+ int blendfunc2;
+ rtexture_t *texture;
+ matrix4x4_t texmatrix;
+ vec4_t color;
+ int flags;
+}
+texturelayer_t;
+
+typedef struct texture_s
+{
+ // q1bsp
+ // name
+ //char name[16];
+ // size
+ unsigned int width, height;
+ // SURF_ flags
+ //unsigned int flags;
+
+ // base material flags
+ int basematerialflags;
+ // current material flags (updated each bmodel render)
+ int currentmaterialflags;
+
+ // current PolygonOffset values for rendering this material
+ float currentpolygonfactor;
+ float currentpolygonoffset;
+ float basepolygonfactor;
+ float basepolygonoffset;
+
+ // textures to use when rendering this material
+ skinframe_t *currentskinframe;
+ int numskinframes;
+ float skinframerate;
+ skinframe_t *skinframes[TEXTURE_MAXFRAMES];
+ // background layer (for terrain texture blending)
+ skinframe_t *backgroundcurrentskinframe;
+ int backgroundnumskinframes;
+ float backgroundskinframerate;
+ skinframe_t *backgroundskinframes[TEXTURE_MAXFRAMES];
+
+ // total frames in sequence and alternate sequence
+ int anim_total[2];
+ // direct pointers to each of the frames in the sequences
+ // (indexed as [alternate][frame])
+ struct texture_s *anim_frames[2][10];
+ // set if animated or there is an alternate frame set
+ // (this is an optimization in the renderer)
+ int animated;
+
+ // the current alpha of this texture (may be affected by r_wateralpha)
+ float currentalpha;
+ // the current texture frame in animation
+ struct texture_s *currentframe;
+ // current texture transform matrix (used for water scrolling)
+ matrix4x4_t currenttexmatrix;
+
+ // various q3 shader features
+ q3shaderinfo_layer_rgbgen_t rgbgen;
+ q3shaderinfo_layer_alphagen_t alphagen;
+ q3shaderinfo_layer_tcgen_t tcgen;
+ q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS];
+ q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
+
+ qboolean colormapping;
+ rtexture_t *basetexture;
+ rtexture_t *glosstexture;
+ rtexture_t *backgroundbasetexture;
+ rtexture_t *backgroundglosstexture;
+ float specularscale;
+ float specularpower;
+ // color tint (colormod * currentalpha) used for rtlighting this material
+ float dlightcolor[3];
+
+ // from q3 shaders
+ int customblendfunc[2];
+
+ int currentnumlayers;
+ texturelayer_t currentlayers[16];
+
+ // q3bsp
+ char name[64];
+ int surfaceflags;
+ int supercontents;
+ int surfaceparms;
+ int textureflags;
+
+ // 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)
+}
+texture_t;
+
+typedef struct mtexinfo_s
+{
+ float vecs[2][4];
+ texture_t *texture;
+ int flags;
+}
+mtexinfo_t;
+
+typedef struct msurface_lightmapinfo_s
+{
+ // texture mapping properties used by this surface
+ mtexinfo_t *texinfo; // q1bsp
+ // index into r_refdef.lightstylevalue array, 255 means not used (black)
+ unsigned char styles[MAXLIGHTMAPS]; // q1bsp
+ // RGB lighting data [numstyles][height][width][3]
+ unsigned char *samples; // q1bsp
+ // RGB normalmap data [numstyles][height][width][3]
+ unsigned char *nmapsamples; // q1bsp
+ // stain to apply on lightmap (soot/dirt/blood/whatever)
+ unsigned char *stainsamples; // q1bsp
+ int texturemins[2]; // q1bsp
+ int extents[2]; // q1bsp
+ int lightmaporigin[2]; // q1bsp
+}
+msurface_lightmapinfo_t;
+
+struct q3deffect_s;
+typedef struct msurface_s
+{
+ // bounding box for onscreen checks
+ vec3_t mins;
+ vec3_t maxs;
+ // the texture to use on the surface
+ texture_t *texture;
+ // the lightmap texture fragment to use on the rendering mesh
+ rtexture_t *lightmaptexture;
+ // the lighting direction texture fragment to use on the rendering mesh
+ rtexture_t *deluxemaptexture;
+
+ // surfaces own ranges of vertices and triangles in the model->surfmesh
+ int num_triangles; // number of triangles
+ int num_firsttriangle; // first triangle
+ int num_vertices; // number of vertices
+ int num_firstvertex; // first vertex
+
+ // shadow volume building information
+ int num_firstshadowmeshtriangle; // index into model->brush.shadowmesh
+
+ // lightmaptexture rebuild information not used in q3bsp
+ int cached_dlight; // q1bsp // forces rebuild of lightmaptexture
+ msurface_lightmapinfo_t *lightmapinfo; // q1bsp
+
+ // mesh information for collisions (only used by q3bsp curves)
+ int num_collisiontriangles; // q3bsp
+ int *data_collisionelement3i; // q3bsp
+ int num_collisionvertices; // q3bsp
+ float *data_collisionvertex3f; // q3bsp
+ struct q3deffect_s *effect; // q3bsp
+ // FIXME: collisionmarkframe should be kept in a separate array
+ int collisionmarkframe; // q3bsp // don't collide twice in one trace
+}
+msurface_t;
+
+#include "matrixlib.h"
+
+#include "model_brush.h"
+#include "model_sprite.h"
+#include "model_alias.h"