typedef struct model_brushq1_s
{
- int firstmodelsurface, nummodelsurfaces;
-
// lightmap format, set to r_lightmaprgba when model is loaded
int lightmaprgba;
int *light_stylevalue;
msurface_t ***light_styleupdatechains;
msurface_t **light_styleupdatechainsbuffer;
- float light_ambient;
mleaf_t *(*PointInLeaf)(struct model_s *model, const float *p);
void (*BuildPVSTextureChains)(struct model_s *model);
// temporary use by light processing
int lighttemp_castshadow;
}
-q3mface_t;
+q3msurface_t;
typedef struct model_brushq3_s
{
q3mbrush_t **data_leafbrushes;
int num_leaffaces;
- q3mface_t **data_leaffaces;
+ q3msurface_t **data_leaffaces;
int num_models;
q3mmodel_t *data_models;
q3meffect_t *data_effects;
int num_faces;
- q3mface_t *data_faces;
+ q3msurface_t *data_faces;
// lightmap textures
int num_lightmaps;
animscene_t *skinscenes; // [numskins]
// skin animation info
animscene_t *animscenes; // [numframes]
+ // range of surface numbers in this (sub)model
+ int firstmodelsurface;
+ int nummodelsurfaces;
+ // list of surface numbers in this (sub)model
+ int *surfacelist;
// draw the model's sky polygons (only used by brush models)
void(*DrawSky)(struct entity_render_s *ent);
// draw the model using lightmap/dlight shading
void(*Draw)(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 *outclusterlist, qbyte *outclusterpvs, int *outnumclusterspointer, int *outsurfacelist, qbyte *outsurfacepvs, int *outnumsurfacespointer);
// draw a shadow volume for the model based on light source
- void(*DrawShadowVolume)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius);
+ void(*DrawShadowVolume)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, int numsurfaces, const int *surfacelist);
// draw the lighting on a model (through stencil)
- void(*DrawLight)(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltolight, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz, rtexture_t *lightcubemap);
+ void(*DrawLight)(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltolight, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz, rtexture_t *lightcubemap, int numsurfaces, const int *surfacelist);
// trace a box against this model
void (*TraceBox)(struct model_s *model, int frame, struct trace_s *trace, const vec3_t boxstartmins, const vec3_t boxstartmaxs, const vec3_t boxendmins, const vec3_t boxendmaxs, int hitsupercontentsmask);
// fields belonging to each type of model