X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_shared.h;h=0226e7015ead54ea9326f6985e11822d387634b5;hb=16e9a106940bacd4f6f185d96ab6ee63c62bcfdf;hp=f48a1bbd08d15bb89a7c145f0573f37256e779ec;hpb=2bac60709c4346c472301edf43d1723a72369450;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.h b/model_shared.h index f48a1bbd..0226e701 100644 --- a/model_shared.h +++ b/model_shared.h @@ -101,30 +101,6 @@ typedef struct blendweights_s } blendweights_t; -typedef struct r_vertexgeneric_s -{ - // 36 bytes - float vertex3f[3]; - float color4f[4]; - float texcoord2f[2]; -} -r_vertexgeneric_t; - -typedef struct r_vertexmesh_s -{ - // 88 bytes - float vertex3f[3]; - float color4f[4]; - float texcoordtexture2f[2]; - float texcoordlightmap2f[2]; - float svector3f[3]; - float tvector3f[3]; - float normal3f[3]; - unsigned char skeletalindex4ub[4]; - unsigned char skeletalweight4ub[4]; -} -r_vertexmesh_t; - typedef struct r_meshbuffer_s { int bufferobject; // OpenGL @@ -145,12 +121,7 @@ typedef struct surfmesh_s // triangle data in system memory int num_triangles; // number of triangles in the mesh int *data_element3i; // int[tris*3] triangles of the mesh, 3 indices into vertex arrays for each - r_meshbuffer_t *data_element3i_indexbuffer; - int data_element3i_bufferoffset; - unsigned short *data_element3s; // unsigned short[tris*3] triangles of the mesh in unsigned short format (NULL if num_vertices > 65536) - r_meshbuffer_t *data_element3s_indexbuffer; - int data_element3s_bufferoffset; - int *data_neighbor3i; // int[tris*3] neighboring triangle on each edge (-1 if none) + // vertex data in system memory int num_vertices; // number of vertices in the mesh float *data_vertex3f; // float[verts*3] vertex locations @@ -163,19 +134,31 @@ typedef struct surfmesh_s unsigned char *data_skeletalindex4ub; unsigned char *data_skeletalweight4ub; int *data_lightmapoffsets; // index into surface's lightmap samples for vertex lighting - r_vertexmesh_t *data_vertexmesh; // interleaved arrays for D3D - // vertex buffer object (stores geometry in video memory) - r_meshbuffer_t *vbo_vertexbuffer; - int vbooffset_vertex3f; - int vbooffset_svector3f; - int vbooffset_tvector3f; - int vbooffset_normal3f; - int vbooffset_texcoordtexture2f; - int vbooffset_texcoordlightmap2f; - int vbooffset_lightmapcolor4f; - int vbooffset_skeletalindex4ub; - int vbooffset_skeletalweight4ub; - int vbooffset_vertexmesh; + // index buffer - only one of these will be non-NULL + r_meshbuffer_t *data_element3i_indexbuffer; + int data_element3i_bufferoffset; + unsigned short *data_element3s; // unsigned short[tris*3] triangles of the mesh in unsigned short format (NULL if num_vertices > 65536) + r_meshbuffer_t *data_element3s_indexbuffer; + int data_element3s_bufferoffset; + // vertex buffers + r_meshbuffer_t *data_vertex3f_vertexbuffer; + int data_vertex3f_bufferoffset; + r_meshbuffer_t *data_svector3f_vertexbuffer; + int data_svector3f_bufferoffset; + r_meshbuffer_t *data_tvector3f_vertexbuffer; + int data_tvector3f_bufferoffset; + r_meshbuffer_t *data_normal3f_vertexbuffer; + int data_normal3f_bufferoffset; + r_meshbuffer_t *data_texcoordtexture2f_vertexbuffer; + int data_texcoordtexture2f_bufferoffset; + r_meshbuffer_t *data_texcoordlightmap2f_vertexbuffer; + int data_texcoordlightmap2f_bufferoffset; + r_meshbuffer_t *data_lightmapcolor4f_vertexbuffer; + int data_lightmapcolor4f_bufferoffset; + r_meshbuffer_t *data_skeletalindex4ub_vertexbuffer; + int data_skeletalindex4ub_bufferoffset; + r_meshbuffer_t *data_skeletalweight4ub_vertexbuffer; + int data_skeletalweight4ub_bufferoffset; // morph blending, these are zero if model is skeletal or static int num_morphframes; struct md3vertex_s *data_morphmd3vertex; @@ -191,9 +174,6 @@ typedef struct surfmesh_s // set if there is some kind of animation on this model qboolean isanimated; - // 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 @@ -211,46 +191,29 @@ shadowmeshvertexhash_t; typedef struct shadowmesh_s { - // next mesh in chain - struct shadowmesh_s *next; - // used for light mesh (NULL on shadow mesh) - rtexture_t *map_diffuse; - rtexture_t *map_specular; - rtexture_t *map_normal; - // buffer sizes - int numverts, maxverts; - int numtriangles, maxtriangles; - // used always + mempool_t *mempool; + + int numverts; + int maxverts; float *vertex3f; - // used for light mesh (NULL on shadow mesh) - float *svector3f; - float *tvector3f; - float *normal3f; - float *texcoord2f; - // used always + r_meshbuffer_t *vbo_vertexbuffer; + int vbooffset_vertex3f; + + int numtriangles; + int maxtriangles; int *element3i; r_meshbuffer_t *element3i_indexbuffer; int element3i_bufferoffset; unsigned short *element3s; r_meshbuffer_t *element3s_indexbuffer; int element3s_bufferoffset; - // vertex/index buffers for rendering - // (created by Mod_ShadowMesh_Finish if possible) - r_vertexmesh_t *vertexmesh; // usually NULL + // used for shadow mapping cubemap side partitioning int sideoffsets[6], sidetotals[6]; - // used for shadow mesh (NULL on light mesh) - int *neighbor3i; + // these are NULL after Mod_ShadowMesh_Finish is performed, only used // while building meshes shadowmeshvertexhash_t **vertexhashtable, *vertexhashentries; - r_meshbuffer_t *vbo_vertexbuffer; - int vbooffset_vertex3f; - int vbooffset_svector3f; - int vbooffset_tvector3f; - int vbooffset_normal3f; - int vbooffset_texcoord2f; - int vbooffset_vertexmesh; } shadowmesh_t; @@ -522,32 +485,12 @@ typedef struct texture_shaderpass_s } texture_shaderpass_t; -typedef enum texturelayertype_e -{ - TEXTURELAYERTYPE_INVALID, - TEXTURELAYERTYPE_LITTEXTURE, - TEXTURELAYERTYPE_TEXTURE, - TEXTURELAYERTYPE_FOG -} -texturelayertype_t; - -typedef struct texturelayer_s -{ - texturelayertype_t type; - qboolean depthmask; - int blendfunc1; - int blendfunc2; - rtexture_t *texture; - matrix4x4_t texmatrix; - vec4_t color; -} -texturelayer_t; - typedef struct texture_s { - // q1bsp // name - //char name[16]; + char name[64]; + + // q1bsp // size unsigned int width, height; // SURF_ flags @@ -584,6 +527,12 @@ typedef struct texture_s void *update_lastrenderentity; // the current alpha of this texture (may be affected by r_wateralpha, also basealpha, and ent->alpha) float currentalpha; + // current value of blendfunc - one of: + // {GL_SRC_ALPHA, GL_ONE} + // {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA} + // {customblendfunc[0], customblendfunc[1]} + // {GL_ONE, GL_ZERO} + int currentblendfunc[2]; // the current texture frame in animation struct texture_s *currentframe; // current texture transform matrix (used for water scrolling) @@ -614,23 +563,34 @@ typedef struct texture_s 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]; - int currentnumlayers; - texturelayer_t currentlayers[16]; - // q3bsp - char name[64]; int surfaceflags; int supercontents; @@ -654,6 +614,7 @@ typedef struct texture_s 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]; // scale and speed + float refractive_index; // used by r_shadow_bouncegrid for bending photons for refracted light int camera_entity; // entity number for use by cameras // offsetmapping @@ -670,6 +631,11 @@ typedef struct texture_s // diffuse and ambient float rtlightambient; + + // used by Mod_Mesh_GetTexture for drawflag and materialflag overrides, to disambiguate the same texture with different hints + int mesh_drawflag; + int mesh_defaulttexflags; + int mesh_defaultmaterialflags; } texture_t; @@ -721,10 +687,6 @@ typedef struct msurface_s struct q3deffect_s *effect; // q3bsp // mesh information for collisions (only used by q3bsp curves) int num_firstcollisiontriangle; - int *deprecatedq3data_collisionelement3i; // q3bsp - float *deprecatedq3data_collisionvertex3f; // q3bsp - float *deprecatedq3data_collisionbbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles - float *deprecatedq3data_bbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles // surfaces own ranges of vertices and triangles in the model->surfmesh int num_triangles; // number of triangles @@ -732,16 +694,9 @@ typedef struct msurface_s int num_vertices; // number of vertices int num_firstvertex; // first vertex - // shadow volume building information - int num_firstshadowmeshtriangle; // index into model->brush.shadowmesh - // mesh information for collisions (only used by q3bsp curves) int num_collisiontriangles; // q3bsp int num_collisionvertices; // q3bsp - int deprecatedq3num_collisionbboxstride; - 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; @@ -852,8 +807,8 @@ typedef struct model_brush_s 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); @@ -920,12 +875,6 @@ typedef struct model_brushq1_s } model_brushq1_t; -typedef struct model_brushq2_s -{ - int dummy; // MSVC can't handle an empty struct -} -model_brushq2_t; - typedef struct model_brushq3_s { int num_models; @@ -956,7 +905,7 @@ typedef struct model_brushq3_s rtexture_t **data_lightmaps; rtexture_t **data_deluxemaps; - // voxel light data with directional shading + // 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) @@ -969,6 +918,10 @@ typedef struct model_brushq3_s 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, @@ -1083,10 +1036,6 @@ typedef struct model_s void(*DrawShadowMap)(int side, struct entity_render_s *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const unsigned char *surfacesides, const vec3_t lightmins, const vec3_t lightmaxs); // 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, unsigned char *visitingleafpvs, int numfrustumplanes, const mplane_t *frustumplanes, qboolean noocclusion); - // compile a shadow volume for the model based on light source - void(*CompileShadowVolume)(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist); - // draw a shadow volume for the model based on light source - void(*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); // 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 @@ -1104,7 +1053,6 @@ typedef struct model_s model_sprite_t sprite; model_brush_t brush; model_brushq1_t brushq1; - model_brushq2_t brushq2; model_brushq3_t brushq3; // flags this model for offseting sounds to the model center (used by brush models) int soundfromcenter; @@ -1124,7 +1072,19 @@ extern unsigned char *mod_base; //extern cvar_t gl_subdivide_size; // texture fullbrights extern cvar_t r_fullbrights; -extern cvar_t r_enableshadowvolumes; + +extern cvar_t mod_noshader_default_offsetmapping; +extern cvar_t mod_q3shader_default_offsetmapping; +extern cvar_t mod_q3shader_default_offsetmapping_scale; +extern cvar_t mod_q3shader_default_offsetmapping_bias; +extern cvar_t mod_q3shader_default_polygonoffset; +extern cvar_t mod_q3shader_default_polygonfactor; +extern cvar_t mod_q3shader_default_refractive_index; +extern cvar_t mod_q3shader_force_addalpha; +extern cvar_t mod_q3shader_force_terrain_alphaflag; +extern cvar_t mod_q3bsp_lightgrid_texture; +extern cvar_t mod_q3bsp_lightgrid_world_surfaces; +extern cvar_t mod_q3bsp_lightgrid_bsp_surfaces; void Mod_Init (void); void Mod_Reload (void); @@ -1141,25 +1101,22 @@ extern dp_model_t *loadmodel; extern char loadname[32]; // for hunk tags int Mod_BuildVertexRemapTableFromElements(int numelements, const int *elements, int numvertices, int *remapvertices); -void Mod_BuildTriangleNeighbors(int *neighbors, const int *elements, int numtriangles); -void Mod_ValidateElements(int *elements, int numtriangles, int firstvertex, int numverts, const char *filename, int fileline); void Mod_BuildNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const int *elements, float *normal3f, qboolean areaweighting); void Mod_BuildTextureVectorsFromNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const float *texcoord2f, const float *normal3f, const int *elements, float *svector3f, float *tvector3f, qboolean areaweighting); -void Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors); +qboolean Mod_ValidateElements(int *element3i, unsigned short *element3s, int numtriangles, int firstvertex, int numvertices, const char *filename, int fileline); +void Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean lightmapoffsets, qboolean vertexcolors); void Mod_MakeSortedSurfaces(dp_model_t *mod); // called specially by brush model loaders before generating submodels // automatically called after model loader returns void Mod_BuildVBOs(void); -shadowmesh_t *Mod_ShadowMesh_Alloc(mempool_t *mempool, int maxverts, int maxtriangles, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, int light, int neighbors, int expandable); -shadowmesh_t *Mod_ShadowMesh_ReAlloc(mempool_t *mempool, shadowmesh_t *oldmesh, int light, int neighbors); -int Mod_ShadowMesh_AddVertex(shadowmesh_t *mesh, float *vertex14f); -void Mod_ShadowMesh_AddTriangle(mempool_t *mempool, shadowmesh_t *mesh, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, float *vertex14f); -void Mod_ShadowMesh_AddMesh(mempool_t *mempool, shadowmesh_t *mesh, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, const float *vertex3f, const float *svector3f, const float *tvector3f, const float *normal3f, const float *texcoord2f, int numtris, const int *element3i); -shadowmesh_t *Mod_ShadowMesh_Begin(mempool_t *mempool, int maxverts, int maxtriangles, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, int light, int neighbors, int expandable); -shadowmesh_t *Mod_ShadowMesh_Finish(mempool_t *mempool, shadowmesh_t *firstmesh, qboolean light, qboolean neighbors, qboolean createvbo); +shadowmesh_t *Mod_ShadowMesh_Alloc(mempool_t *mempool, int maxverts, int maxtriangles); +int Mod_ShadowMesh_AddVertex(shadowmesh_t *mesh, const float *vertex3f); +void Mod_ShadowMesh_AddMesh(shadowmesh_t *mesh, const float *vertex3f, int numtris, const int *element3i); +shadowmesh_t *Mod_ShadowMesh_Begin(mempool_t *mempool, int maxverts, int maxtriangles); +shadowmesh_t *Mod_ShadowMesh_Finish(shadowmesh_t *firstmesh, qboolean createvbo); void Mod_ShadowMesh_CalcBBox(shadowmesh_t *firstmesh, vec3_t mins, vec3_t maxs, vec3_t center, float *radius); void Mod_ShadowMesh_Free(shadowmesh_t *mesh); @@ -1168,11 +1125,13 @@ void Mod_CreateCollisionMesh(dp_model_t *mod); void Mod_FreeQ3Shaders(void); void Mod_LoadQ3Shaders(void); q3shaderinfo_t *Mod_LookupQ3Shader(const char *name); -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); +qboolean Mod_LoadTextureFromQ3Shader(mempool_t *mempool, const char *modelname, texture_t *texture, const char *name, qboolean warnmissing, qboolean fallback, int defaulttexflags, int defaultmaterialflags); +texture_shaderpass_t *Mod_CreateShaderPass(mempool_t *mempool, skinframe_t *skinframe); +texture_shaderpass_t *Mod_CreateShaderPassFromQ3ShaderLayer(mempool_t *mempool, const char *modelname, 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); +void Mod_LoadCustomMaterial(mempool_t *mempool, texture_t *texture, const char *name, int supercontents, int materialflags, skinframe_t *skinframe); +/// Removes all shaderpasses from material, and optionally deletes the textures in the skinframes. +void Mod_UnloadCustomMaterial(texture_t *texture, qboolean purgeskins); extern cvar_t r_mipskins; extern cvar_t r_mipnormalmaps; @@ -1225,11 +1184,11 @@ qboolean Mod_AllocLightmap_Block(mod_alloclightmap_state_t *state, int blockwidt // 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; @@ -1242,18 +1201,17 @@ void R_Q1BSP_DrawPrepass(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, unsigned char *visitingleafpvs, int numfrustumplanes, const mplane_t *frustumplanes, qboolean noocclusion); void R_Q1BSP_CompileShadowMap(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist); void R_Q1BSP_DrawShadowMap(int side, struct entity_render_s *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const unsigned char *surfacesides, const vec3_t lightmins, const vec3_t lightmaxs); -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, 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); +texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name, int defaultdrawflags, int defaulttexflags, int defaultmaterialflags); +msurface_t *Mod_Mesh_AddSurface(dp_model_t *mod, texture_t *tex, qboolean batchwithprevioussurface); 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_Validate(dp_model_t *mod); void Mod_Mesh_Finalize(dp_model_t *mod); // Collision optimization using Bounding Interval Hierarchy