// vertex and index buffers for rendering
r_meshbuffer_t *vertexmesh_vertexbuffer;
+
+ // dynamic mesh building support (Mod_Mesh_*)
+ int num_vertexhashsize; // always pow2 for simple masking
+ int *data_vertexhash; // hash table - wrapping buffer for storing index of similar vertex with -1 as terminator
+ int max_vertices; // preallocated size of data_vertex3f and friends (always >= num_vertices)
+ int max_triangles; // preallocated size of data_element3i
}
surfmesh_t;
int clampmap;
float framerate;
int numframes;
- int texflags;
+ int dptexflags;
char** texturename;
int blendfunc[2];
q3shaderinfo_layer_rgbgen_t rgbgen;
rtexture_t *backgroundnmaptexture; // normalmap (bumpmap for dot3)
rtexture_t *backgroundglosstexture; // glossmap (for dot3)
rtexture_t *backgroundglowtexture; // glow only (fullbrights)
- float specularscale;
float specularpower;
- // color tint (colormod * currentalpha) used for rtlighting this material
- float dlightcolor[3];
- // color tint (colormod * 2) used for lightmapped lighting on this material
- // includes alpha as 4th component
- // replaces role of gl_Color in GLSL shader
- float lightmapcolor[4];
+
+ // rendering parameters - updated by R_GetCurrentTexture using rsurface.render_* fields
+ // (almost) all map textures are lightmap (no MATERIALFLAG_MODELLIGHT set),
+ // (almost) all model textures are MATERIALFLAG_MODELLIGHT,
+ // MATERIALFLAG_FULLBRIGHT is rendered as a forced MATERIALFLAG_MODELLIGHT with rtlights disabled
+ float render_glowmod[3];
+ // MATERIALFLAG_MODELLIGHT uses these parameters
+ float render_modellight_ambient[3];
+ float render_modellight_diffuse[3];
+ float render_modellight_lightdir[3];
+ float render_modellight_specular[3];
+ // lightmap rendering (not MATERIALFLAG_MODELLIGHT)
+ float render_lightmap_ambient[3];
+ float render_lightmap_diffuse[3];
+ float render_lightmap_specular[3];
+ // rtlights use these colors for the materials on this entity
+ float render_rtlight_diffuse[3];
+ float render_rtlight_specular[3];
+ // tint applied on top of render_*_diffuse for pants layer
+ float render_colormap_pants[3];
+ // tint applied on top of render_*_diffuse for shirt layer
+ float render_colormap_shirt[3];
// from q3 shaders
int customblendfunc[2];
char name[64];
int surfaceflags;
int supercontents;
- int textureflags;
// q2bsp
// we have to load the texture multiple times when Q2SURF_ flags differ,
int deprecatedq3num_bboxstride;
// FIXME: collisionmarkframe should be kept in a separate array
int deprecatedq3collisionmarkframe; // q3bsp // don't collide twice in one trace
+
+ // used by Mod_Mesh_Finalize when building sortedmodelsurfaces
+ qboolean included;
}
msurface_t;
shadowmesh_t *collisionmesh;
// common functions
- int (*SuperContentsFromNativeContents)(struct model_s *model, int nativecontents);
- int (*NativeContentsFromSuperContents)(struct model_s *model, int supercontents);
+ 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, qboolean merge);
int (*BoxTouchingPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs);
float *data_baseboneposeinverse;
// textures of this model
int num_textures;
+ int max_textures; // preallocated for expansion (Mod_Mesh_*)
int num_texturesperskin;
texture_t *data_textures;
qboolean wantnormals;
qboolean wanttangents;
// surfaces of this model
int num_surfaces;
+ int max_surfaces; // preallocated for expansion (Mod_Mesh_*)
msurface_t *data_surfaces;
// optional lightmapinfo data for surface lightmap updates
msurface_lightmapinfo_t *data_surfaces_lightmapinfo;
// draw the lighting on a model (through stencil)
void(*DrawLight)(struct entity_render_s *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs);
// trace a box against this model
- void (*TraceBox)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask);
- void (*TraceBrush)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, struct colbrushf_s *start, struct colbrushf_s *end, int hitsupercontentsmask, int skipsupercontentsmask);
+ void (*TraceBox)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
+ void (*TraceBrush)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, struct colbrushf_s *start, struct colbrushf_s *end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
// trace a box against this model
- void (*TraceLine)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask);
+ void (*TraceLine)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
// trace a point against this model (like PointSuperContents)
- void (*TracePoint)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask);
+ void (*TracePoint)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
// find the supercontents value at a point in this model
int (*PointSuperContents)(struct model_s *model, int frame, const vec3_t point);
// trace a line against geometry in this model and report correct texture (used by r_shadow_bouncegrid)
- void (*TraceLineAgainstSurfaces)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask);
+ void (*TraceLineAgainstSurfaces)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
// fields belonging to some types of model
model_sprite_t sprite;
model_brush_t brush;
qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qboolean warnmissing, qboolean fallback, int defaulttexflags);
texture_shaderpass_t *Mod_CreateShaderPass(skinframe_t *skinframe);
texture_shaderpass_t *Mod_CreateShaderPassFromQ3ShaderLayer(q3shaderinfo_layer_t *layer, int layerindex, int texflags, const char *texturename);
+/// Sets up a material to render the provided skinframe. See also R_SkinFrame_LoadInternalBGRA.
+void Mod_LoadCustomMaterial(texture_t *texture, const char *name, int supercontents, int materialflags, skinframe_t *skinframe);
extern cvar_t r_mipskins;
extern cvar_t r_mipnormalmaps;
// bsp models
void Mod_BrushInit(void);
// used for talking to the QuakeC mainly
-int Mod_Q1BSP_NativeContentsFromSuperContents(struct model_s *model, int supercontents);
-int Mod_Q1BSP_SuperContentsFromNativeContents(struct model_s *model, int nativecontents);
+int Mod_Q1BSP_NativeContentsFromSuperContents(int supercontents);
+int Mod_Q1BSP_SuperContentsFromNativeContents(int nativecontents);
// used for loading wal files in Mod_LoadTextureFromQ3Shader
-int Mod_Q2BSP_SuperContentsFromNativeContents(dp_model_t *model, int nativecontents);
-int Mod_Q2BSP_NativeContentsFromSuperContents(dp_model_t *model, int supercontents);
+int Mod_Q2BSP_SuperContentsFromNativeContents(int nativecontents);
+int Mod_Q2BSP_NativeContentsFromSuperContents(int supercontents);
// a lot of model formats use the Q1BSP code, so here are the prototypes...
struct entity_render_s;
void R_Q1BSP_DrawShadowVolume(struct entity_render_s *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs);
void R_Q1BSP_DrawLight(struct entity_render_s *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs);
+// dynamic mesh building (every frame) for debugging and other uses
+void Mod_Mesh_Create(dp_model_t *mod, const char *name);
+void Mod_Mesh_Destroy(dp_model_t *mod);
+void Mod_Mesh_Reset(dp_model_t *mod);
+texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name);
+msurface_t *Mod_Mesh_AddSurface(dp_model_t *mod, texture_t *tex);
+int Mod_Mesh_IndexForVertex(dp_model_t *mod, msurface_t *surf, float x, float y, float z, float nx, float ny, float nz, float s, float t, float u, float v, float r, float g, float b, float a);
+void Mod_Mesh_AddTriangle(dp_model_t *mod, msurface_t *surf, int e0, int e1, int e2);
+void Mod_Mesh_Finalize(dp_model_t *mod);
+
// Collision optimization using Bounding Interval Hierarchy
-void Mod_CollisionBIH_TracePoint(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask);
-void Mod_CollisionBIH_TraceLine(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask);
-void Mod_CollisionBIH_TraceBox(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask);
-void Mod_CollisionBIH_TraceBrush(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, struct colbrushf_s *start, struct colbrushf_s *end, int hitsupercontentsmask, int skipsupercontentsmask);
-void Mod_CollisionBIH_TracePoint_Mesh(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask);
+void Mod_CollisionBIH_TracePoint(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
+void Mod_CollisionBIH_TraceLine(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
+void Mod_CollisionBIH_TraceBox(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
+void Mod_CollisionBIH_TraceBrush(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, struct colbrushf_s *start, struct colbrushf_s *end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
+void Mod_CollisionBIH_TracePoint_Mesh(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
qboolean Mod_CollisionBIH_TraceLineOfSight(struct model_s *model, const vec3_t start, const vec3_t end, const vec3_t acceptmins, const vec3_t acceptmaxs);
int Mod_CollisionBIH_PointSuperContents(struct model_s *model, int frame, const vec3_t point);
int Mod_CollisionBIH_PointSuperContents_Mesh(struct model_s *model, int frame, const vec3_t point);