*/
-typedef enum modtype_e {mod_invalid, mod_brushq1, mod_sprite, mod_alias, mod_brushq2, mod_brushq3} modtype_t;
+typedef enum modtype_e {mod_invalid, mod_brushq1, mod_sprite, mod_alias, mod_brushq2, mod_brushq3, mod_null} modtype_t;
typedef struct animscene_s
{
int loadsequence;
// on 32bit systems this makes the struct 128 bytes long
int padding;
+ // average texture color, if applicable
+ float avgcolor[4];
}
skinframe_t;
#define MAX_SKINS 256
-typedef struct overridetagname_s
-{
- char name[MAX_QPATH];
-}
-overridetagname_t;
-
-// a replacement set of tag names, per skin
-typedef struct overridetagnameset_s
+struct md3vertex_s;
+struct trivertx_s;
+typedef struct texvecvertex_s
{
- int num_overridetagnames;
- overridetagname_t *data_overridetagnames;
+ signed char svec[3];
+ signed char tvec[3];
}
-overridetagnameset_t;
-
-struct md3vertex_s;
-struct trivertex_s;
+texvecvertex_t;
// used for mesh lists in q1bsp/q3bsp map models
// (the surfaces reference portions of these meshes)
// 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
+ unsigned short *data_element3s; // unsigned short[tris*3] triangles of the mesh in unsigned short format (NULL if num_vertices > 65536)
int *data_neighbor3i; // int[tris*3] neighboring triangle on each edge (-1 if none)
// element buffer object (stores triangles in video memory)
- int ebo;
+ int ebo3i; // unsigned int format (only allocated if num_vertices > 65536)
+ int ebo3s; // unsigned short format (only allocated if num_vertices <= 65536)
// vertex data in system memory
int num_vertices; // number of vertices in the mesh
float *data_vertex3f; // float[verts*3] vertex locations
int num_morphframes;
struct md3vertex_s *data_morphmd3vertex;
struct trivertx_s *data_morphmdlvertex;
+ struct texvecvertex_s *data_morphtexvecvertex;
float *data_morphmd2framesize6f;
float num_morphmdlframescale[3];
float num_morphmdlframetranslate[3];
float *texcoord2f;
// used always
int *element3i;
+ unsigned short *element3s;
// used for shadow mesh (NULL on light mesh)
int *neighbor3i;
// these are NULL after Mod_ShadowMesh_Finish is performed, only used
shadowmeshvertexhash_t **vertexhashtable, *vertexhashentries;
// element buffer object (stores triangles in video memory)
// (created by Mod_ShadowMesh_Finish if possible)
- int ebo;
+ int ebo3i;
+ int ebo3s;
// vertex buffer object (stores vertices in video memory)
// (created by Mod_ShadowMesh_Finish if possible)
int vbo;
}
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 Q3PATHLENGTH 64
#define TEXTURE_MAXFRAMES 64
-#define Q3SHADER_MAXLAYERS 8
+#define Q3WAVEPARMS 4
+#define Q3DEFORM_MAXPARMS 3
+#define Q3SHADER_MAXLAYERS 2 // FIXME support more than that (currently only two are used, so why keep more in RAM?)
#define Q3RGBGEN_MAXPARMS 3
#define Q3ALPHAGEN_MAXPARMS 1
#define Q3TCGEN_MAXPARMS 6
#define Q3TCMOD_MAXPARMS 6
-#define Q3MAXTCMODS 4
+#define Q3MAXTCMODS 8
+#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_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;
- char texturename[TEXTURE_MAXFRAMES][Q3PATHLENGTH];
+ int texflags;
+ char** texturename;
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];
qboolean lighting;
qboolean vertexalpha;
qboolean textureblendalpha;
- q3shaderinfo_layer_t *primarylayer, *backgroundlayer;
+ int primarylayer, backgroundlayer;
q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS];
char skyboxname[Q3PATHLENGTH];
+ q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
+
+ // dp-specific additions:
+
+ // shadow control
+ qboolean dpshadow;
+ qboolean dpnoshadow;
+
+ // 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
}
q3shaderinfo_t;
// current material flags (updated each bmodel render)
int currentmaterialflags;
+ // PolygonOffset values for rendering this material
+ // (these are added to the r_refdef values and submodel values)
+ float biaspolygonfactor;
+ float biaspolygonoffset;
+
// textures to use when rendering this material
skinframe_t *currentskinframe;
int numskinframes;
// (this is an optimization in the renderer)
int animated;
+ // renderer checks if this texture needs updating...
+ int update_lastrenderframe;
+ void *update_lastrenderentity;
// the current alpha of this texture (may be affected by r_wateralpha)
float currentalpha;
// the current texture frame in animation
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];
+ // 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];
// from q3 shaders
int customblendfunc[2];
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)
+ float r_water_wateralpha; // additional wateralpha to apply when r_water is active
}
texture_t;
{
// texture mapping properties used by this surface
mtexinfo_t *texinfo; // q1bsp
- // index into r_refdef.lightstylevalue array, 255 means not used (black)
+ // index into r_refdef.scene.lightstylevalue array, 255 means not used (black)
unsigned char styles[MAXLIGHTMAPS]; // q1bsp
// RGB lighting data [numstyles][height][width][3]
unsigned char *samples; // q1bsp
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)
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
qboolean ishlbsp;
- // true if this model is a Martial Concert .bsp file
- qboolean ismcbsp;
// string of entity definitions (.map format)
char *entities;
- // if non-zero this is a submodel
+ // 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 if .isworldmodel is true
+ // pointers to each of the submodels
struct model_s **submodels;
int num_planes;
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);
typedef struct model_brushq1_s
{
- // lightmap format, set to r_lightmaprgba when model is loaded
- int lightmaprgba;
-
dmodel_t *submodels;
int numvertexes;
int *surfedges;
int numclipnodes;
- dclipnode_t *clipnodes;
+ mclipnode_t *clipnodes;
hull_t hulls[MAX_MAP_HULLS];
unsigned char *nmaplightdata; // deluxemap file
// lightmap update chains for light styles
- int light_styles;
- unsigned char *light_style;
- int *light_stylevalue;
- msurface_t ***light_styleupdatechains;
- msurface_t **light_styleupdatechainsbuffer;
+ 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;
}
model_brushq1_t;
// true if the detected deluxemaps are the modelspace kind, rather than
// the faster tangentspace kind
qboolean 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;
+
typedef struct model_s
{
// name and path of model, for example "progs/player.mdl"
qboolean loaded;
// set if the model is used in current map, models which are not, are purged
qboolean used;
- // true if this is the world model (I.E. defines what sky to use, and may contain submodels)
- qboolean isworldmodel;
// CRC of the file this model was loaded from, to reload if changed
unsigned int crc;
// mod_brush, mod_alias, mod_sprite
// range of surface numbers in this (sub)model
int firstmodelsurface;
int nummodelsurfaces;
+ int *sortedmodelsurfaces;
// range of collision brush numbers in this (sub)model
int firstmodelbrush;
int nummodelbrushes;
msurface_lightmapinfo_t *data_surfaces_lightmapinfo;
// all surfaces belong to this mesh
surfmesh_t surfmesh;
+ // data type of model
+ const char *modeldatatypestring;
+ // generates vertex data for a given frameblend
+ void(*AnimateVertices)(const struct model_s *model, const struct frameblend_s *frameblend, float *vertex3f, float *normal3f, float *svector3f, float *tvector3f);
// 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);
+ 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);
// 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, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs);
+ 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
void (*TraceBox)(struct model_s *model, int frame, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask);
+ // find the supercontents value at a point in this model
+ int (*PointSuperContents)(struct model_s *model, int frame, const vec3_t point);
// fields belonging to some types of model
model_sprite_t sprite;
model_brush_t brush;
model_brushq2_t brushq2;
*/
model_brushq3_t brushq3;
- // skin files can have different tags for each skin
- overridetagnameset_t *data_overridetagnamesforskin;
// flags this model for offseting sounds to the model center (used by brush models)
int soundfromcenter;
}
-model_t;
+dp_model_t;
//============================================================================
// model loading
-extern model_t *loadmodel;
+extern dp_model_t *loadmodel;
extern unsigned char *mod_base;
// sky/water subdivision
//extern cvar_t gl_subdivide_size;
void Mod_Init (void);
void Mod_Reload (void);
-model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, qboolean isworldmodel);
-model_t *Mod_FindName (const char *name);
-model_t *Mod_ForName (const char *name, qboolean crash, qboolean checkdisk, qboolean isworldmodel);
-void Mod_UnloadModel (model_t *mod);
+dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk);
+dp_model_t *Mod_FindName (const char *name, const char *parentname);
+dp_model_t *Mod_ForName (const char *name, qboolean crash, qboolean checkdisk, const char *parentname);
+void Mod_UnloadModel (dp_model_t *mod);
void Mod_ClearUsed(void);
void Mod_PurgeUnused(void);
-void Mod_RemoveStaleWorldModels(model_t *skip); // only used during loading!
+void Mod_RemoveStaleWorldModels(dp_model_t *skip); // only used during loading!
-extern model_t *loadmodel;
+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_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);
+void Mod_MakeSortedSurfaces(dp_model_t *mod);
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);
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);
+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 q1bsp, qboolean q3bsp, qboolean md3);
+qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qboolean warnmissing, qboolean fallback, int defaulttexflags);
extern cvar_t r_mipskins;
// 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_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_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, unsigned char *visitingleafpvs);
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);
+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);
// alias models
struct frameblend_s;
void Mod_AliasInit(void);
-void Mod_Alias_GetMesh_Vertices(const model_t *model, const struct frameblend_s *frameblend, float *vertex3f, float *normal3f, float *svector3f, float *tvector3f);
-int Mod_Alias_GetTagMatrix(const model_t *model, int poseframe, int tagindex, matrix4x4_t *outmatrix);
-int Mod_Alias_GetTagIndexForName(const model_t *model, unsigned int skin, const char *tagname);
+int Mod_Alias_GetTagMatrix(const dp_model_t *model, int poseframe, int tagindex, matrix4x4_t *outmatrix);
+int Mod_Alias_GetTagIndexForName(const dp_model_t *model, unsigned int skin, const char *tagname);
+int Mod_Alias_GetExtendedTagInfoForIndex(const dp_model_t *model, unsigned int skin, int poseframe, int tagindex, int *parentindex, const char **tagname, matrix4x4_t *tag_localmatrix);
// sprite models
void Mod_SpriteInit(void);
// loaders
-void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_IBSP_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_MAP_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_IDP0_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_IDP2_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_IDP3_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_DARKPLACESMODEL_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_PSKMODEL_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_IDSP_Load(model_t *mod, void *buffer, void *bufferend);
-void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend);
+void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_IBSP_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_MAP_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_IDP0_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_IDP2_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_IDP3_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_ZYMOTICMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_DARKPLACESMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_PSKMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend);
+void Mod_IDS2_Load(dp_model_t *mod, void *buffer, void *bufferend);
// utility
-qboolean Mod_CanSeeBox_Trace(int numsamples, float t, model_t *model, vec3_t eye, vec3_t minsX, vec3_t maxsX);
+qboolean Mod_CanSeeBox_Trace(int numsamples, float t, dp_model_t *model, vec3_t eye, vec3_t minsX, vec3_t maxsX);
#endif // MODEL_SHARED_H