// submodels to load)
int numsubmodels;
// common functions
- void (*AmbientSoundLevelsForPoint)(struct model_s *model, const vec3_t p, qbyte *out, int outsize);
+ int (*SuperContentsFromNativeContents)(struct model_s *model, int nativecontents);
+ int (*NativeContentsFromSuperContents)(struct model_s *model, int supercontents);
+ qbyte *(*GetPVS)(struct model_s *model, const vec3_t p);
int (*FatPVS)(struct model_s *model, const vec3_t org, vec_t radius, qbyte *pvsbuffer, int pvsbufferlength);
int (*BoxTouchingPVS)(struct model_s *model, const qbyte *pvs, const vec3_t mins, const vec3_t maxs);
void (*LightPoint)(struct model_s *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal);
void (*FindNonSolidLocation)(struct model_s *model, const vec3_t in, vec3_t out, vec_t radius);
- void (*TraceBox)(struct model_s *model, struct trace_s *trace, const vec3_t boxstartmins, const vec3_t boxstartmaxs, const vec3_t boxendmins, const vec3_t boxendmaxs);
- // this is actually only found on brushq1, but NULL is handled gracefully
+ void (*TraceBox)(struct model_s *model, struct trace_s *trace, const vec3_t boxstartmins, const vec3_t boxstartmaxs, const vec3_t boxendmins, const vec3_t boxendmaxs, int hitsupercontentsmask);
+ // these are actually only found on brushq1, but NULL is handled gracefully
+ void (*AmbientSoundLevelsForPoint)(struct model_s *model, const vec3_t p, qbyte *out, int outsize);
void (*RoundUpToHullSize)(struct model_s *cmodel, const vec3_t inmins, const vec3_t inmaxs, vec3_t outmins, vec3_t outmaxs);
}
model_brush_t;
model_brushq2_t;
*/
+#define Q3MTEXTURERENDERFLAGS_NODRAW 1
+#define Q3MTEXTURERENDERFLAGS_SKY 2
+
typedef struct q3mtexture_s
{
char name[Q3PATHLENGTH];
int surfaceflags;
- int contents;
+ int nativecontents;
+ int supercontents;
+ int renderflags;
int number;
skinframe_t skin;
typedef struct q3mnode_s
{
+ //this part shared between node and leaf
int isnode; // true
struct q3mnode_s *parent;
+ vec3_t mins;
+ vec3_t maxs;
+ // this part unique to nodes
struct mplane_s *plane;
struct q3mnode_s *children[2];
}
typedef struct q3mleaf_s
{
+ //this part shared between node and leaf
int isnode; // false
struct q3mnode_s *parent;
+ vec3_t mins;
+ vec3_t maxs;
+ // this part unique to leafs
int clusterindex;
int areaindex;
int numleaffaces;
struct q3mface_s **firstleafface;
int numleafbrushes;
struct q3mbrush_s **firstleafbrush;
- vec3_t mins;
- vec3_t maxs;
}
q3mleaf_t;
struct q3mtexture_s *texture;
struct q3meffect_s *effect;
rtexture_t *lightmaptexture;
+ int collisions; // performs per triangle collisions on this surface
+ int collisionmarkframe; // don't collide twice in one trace
int type;
int firstvertex;
int numvertices;
int firstelement;
int numelements;
int patchsize[2];
+ // used for processing
+ int markframe;
+ // (world only) visframe == r_framecount means it is visible this frame
+ int visframe;
+ // bounding box for culling
+ float mins[3];
+ float maxs[3];
float *data_vertex3f;
- float *data_texturetexcoord2f;
- float *data_lightmaptexcoord2f;
+ float *data_texcoordtexture2f;
+ float *data_texcoordlightmap2f;
float *data_svector3f;
float *data_tvector3f;
float *data_normal3f;
typedef struct model_brushq3_s
{
+ // if non-zero this is a submodel
+ // (this is the number of the submodel, an index into data_models)
+ int submodel;
+
int num_textures;
q3mtexture_t *data_textures;
int num_models;
q3mmodel_t *data_models;
// each submodel gets its own model struct so this is different for each.
- q3mmodel_t data_thismodel;
+ q3mmodel_t *data_thismodel;
int num_brushes;
q3mbrush_t *data_brushes;
int num_vertices;
float *data_vertex3f;
- float *data_texturetexcoord2f;
- float *data_lightmaptexcoord2f;
+ float *data_texcoordtexture2f;
+ float *data_texcoordlightmap2f;
float *data_svector3f;
float *data_tvector3f;
float *data_normal3f;
void(*DrawSky)(struct entity_render_s *ent);
// draw the model using lightmap/dlight shading
void(*Draw)(struct entity_render_s *ent);
- // draw a fake shadow for the model
- void(*DrawFakeShadow)(struct entity_render_s *ent);
// draw a shadow volume for the model based on light source
void(*DrawShadowVolume)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius);
// draw the lighting on a model (through stencil)
// every texture must be in a pool...
extern rtexturepool_t *mod_shared_texturepool;
+extern rtexture_t *mod_shared_distorttexture;
+
// model loading
extern model_t *loadmodel;
extern qbyte *mod_base;
int Mod_LoadSkinFrame(skinframe_t *skinframe, char *basename, int textureflags, int loadpantsandshirt, int usedetailtexture, int loadglowtexture);
int Mod_LoadSkinFrame_Internal(skinframe_t *skinframe, char *basename, int textureflags, int loadpantsandshirt, int usedetailtexture, int loadglowtexture, qbyte *skindata, int width, int height);
+// 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);
+
extern cvar_t r_mipskins;
typedef struct skinfileitem_s
void Mod_FreeSkinFiles(skinfile_t *skinfile);
int Mod_CountSkinFiles(skinfile_t *skinfile);
+int Mod_RemoveDegenerateTriangles(int numtriangles, const int *inelement3i, int *outelement3i, const float *vertex3f);
+
#endif // __MODEL__