*/
-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;
Q3TCMOD_STRETCH,
Q3TCMOD_TRANSFORM,
Q3TCMOD_TURBULENT,
+ Q3TCMOD_PAGE,
Q3TCMOD_COUNT
}
q3tcmod_t;
typedef struct q3shaderinfo_s
{
char name[Q3PATHLENGTH];
+#define Q3SHADERINFO_COMPARE_START surfaceparms
int surfaceparms;
int textureflags;
int numlayers;
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 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
+#define Q3SHADERINFO_COMPARE_END r_water_wateralpha
}
q3shaderinfo_t;
// (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
struct texture_s *currentframe;
// current texture transform matrix (used for water scrolling)
matrix4x4_t currenttexmatrix;
+ matrix4x4_t currentbackgroundtexmatrix;
// 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_layer_tcmod_t backgroundtcmods[Q3MAXTCMODS];
q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
qboolean colormapping;
struct q3deffect_s *effect; // q3bsp
// FIXME: collisionmarkframe should be kept in a separate array
int collisionmarkframe; // q3bsp // don't collide twice in one trace
+
+ // optimization...
+ float *data_collisionbbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles
+ int num_collisionbboxstride;
+ float *data_bbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles
+ int num_bboxstride;
}
msurface_t;
// 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 num_lightgrid_imins[3];
int num_lightgrid_imaxs[3];
int num_lightgrid_isize[3];
- // indexing/clamping
- int num_lightgrid_dimensions[3];
// transform modelspace coordinates to lightgrid index
matrix4x4_t num_lightgrid_indexfromworld;
// 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;
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;
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);
+ // draw depth into a shadowmap
+ void(*DrawShadowMap)(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);
// 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 Mod_Init (void);
void Mod_Reload (void);
-dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk, qboolean isworldmodel);
-dp_model_t *Mod_FindName (const char *name);
-dp_model_t *Mod_ForName (const char *name, qboolean crash, qboolean checkdisk, qboolean isworldmodel);
+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_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 warnmissing, qboolean fallback, int defaulttexflags);
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_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_DrawShadowMap(struct entity_render_s *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, 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);
void Mod_AliasInit(void);
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);
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);