}
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_REFLECTION 256
+#define Q3TEXTUREFLAG_WATERSHADER 512
+
#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 4
+#define Q3MAXDEFORMS 4
typedef enum q3wavefunc_e
{
}
q3wavefunc_t;
+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,
}
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 numframes;
char texturename[TEXTURE_MAXFRAMES][Q3PATHLENGTH];
int blendfunc[2];
- q3rgbgen_t rgbgen;
- q3alphagen_t alphagen;
- q3tcgen_t tcgen;
- q3tcmod_t tcmod[Q3MAXTCMODS];
- float rgbgen_parms[Q3RGBGEN_MAXPARMS];
- float alphagen_parms[Q3ALPHAGEN_MAXPARMS];
- float tcgen_parms[Q3TCGEN_MAXPARMS];
- float tcmod_parms[Q3MAXTCMODS][Q3TCMOD_MAXPARMS];
- q3wavefunc_t tcmod_wavefunc[Q3MAXTCMODS];
+ 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];
q3shaderinfo_layer_t *primarylayer, *backgroundlayer;
q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS];
char skyboxname[Q3PATHLENGTH];
+ q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
+
+ vec3_t reflectcolor, refractcolor;
+ float refractmin; // when refraction is used, minimum amount of reflection (when looking straight down)
+ float refractmax; // 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; note that reflection distort is not configurable because that's what the bumpmap should do)
}
q3shaderinfo_t;
// 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;
matrix4x4_t currenttexmatrix;
// various q3 shader features
- q3rgbgen_t rgbgen;
- q3alphagen_t alphagen;
- q3tcgen_t tcgen;
- q3tcmod_t tcmod[Q3MAXTCMODS];
- float rgbgen_parms[Q3RGBGEN_MAXPARMS];
- float alphagen_parms[Q3ALPHAGEN_MAXPARMS];
- float tcgen_parms[Q3TCGEN_MAXPARMS];
- float tcmod_parms[Q3MAXTCMODS][Q3TCMOD_MAXPARMS];
- q3wavefunc_t tcmod_wavefunc[Q3MAXTCMODS];
+ 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 *backgroundglosstexture;
float specularscale;
float specularpower;
+ // color tint (colormod * currentalpha) used for rtlighting this material
+ float dlightcolor[3];
// from q3 shaders
int customblendfunc[2];
int supercontents;
int surfaceparms;
int textureflags;
+
+ // reflection
+ vec3_t reflectcolor, refractcolor;
+ float refractmin; // when refraction is used, minimum amount of reflection (when looking straight down)
+ float refractmax; // 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; note that reflection distort is not configurable because that's what the bumpmap should do)
}
texture_t;
int (*SuperContentsFromNativeContents)(struct model_s *model, int nativecontents);
int (*NativeContentsFromSuperContents)(struct model_s *model, 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);
+ int (*FatPVS)(struct model_s *model, const vec3_t org, vec_t radius, unsigned char *pvsbuffer, int pvsbufferlength, qboolean 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 *surfedges;
int numclipnodes;
- dclipnode_t *clipnodes;
+ mclipnode_t *clipnodes;
hull_t hulls[MAX_MAP_HULLS];
msurface_lightmapinfo_t *data_surfaces_lightmapinfo;
// all surfaces belong to this mesh
surfmesh_t surfmesh;
+ // data type of model
+ const char *modeldatatypestring;
// draw the model's sky polygons (only used by brush models)
void(*DrawSky)(struct entity_render_s *ent);
+ // draw refraction/reflection textures for the model's water polygons (only used by brush models)
+ void(*DrawAddWaterPlanes)(struct entity_render_s *ent);
// draw the model using lightmap/dlight shading
void(*Draw)(struct entity_render_s *ent);
// draw the model to the depth buffer (no color rendering at all)
void(*DrawDepth)(struct entity_render_s *ent);
+ // draw any enabled debugging effects on this model (such as showing triangles, normals, collision brushes...)
+ void(*DrawDebug)(struct entity_render_s *ent);
// gathers info on which clusters and surfaces are lit by light, as well as calculating a bounding box
void(*GetLightInfo)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs);
// compile a shadow volume for the model based on light source
// a lot of model formats use the Q1BSP code, so here are the prototypes...
struct entity_render_s;
+void R_Q1BSP_DrawAddWaterPlanes(struct entity_render_s *ent);
void R_Q1BSP_DrawSky(struct entity_render_s *ent);
void R_Q1BSP_Draw(struct entity_render_s *ent);
void R_Q1BSP_DrawDepth(struct entity_render_s *ent);
+void R_Q1BSP_DrawDebug(struct entity_render_s *ent);
void R_Q1BSP_GetLightInfo(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs);
void R_Q1BSP_CompileShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist);
void R_Q1BSP_DrawShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs);