]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.h
r_dlightmap 0 mode removed (vertex dlights on lightmapped walls)
[xonotic/darkplaces.git] / model_shared.h
index 05075887a82908dfeb141c5822bf6e3b50746619..e87a913363e203ac0549c2c5ee5b8decf1c7e87e 100644 (file)
@@ -152,13 +152,16 @@ typedef struct model_brush_s
        // 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;
@@ -265,11 +268,16 @@ typedef struct model_brushq2_s
 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;
@@ -278,8 +286,12 @@ q3mtexture_t;
 
 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];
 }
@@ -287,16 +299,18 @@ q3mnode_t;
 
 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;
 
@@ -340,12 +354,21 @@ typedef struct q3mface_s
        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_texcoordtexture2f;
@@ -362,6 +385,10 @@ q3mface_t;
 
 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;
 
@@ -488,8 +515,6 @@ typedef struct model_s
        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)
@@ -517,6 +542,8 @@ extern rtexture_t *mod_shared_detailtextures[NUM_DETAILTEXTURES];
 // 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;
@@ -559,6 +586,10 @@ void Mod_ShadowMesh_Free(shadowmesh_t *mesh);
 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
@@ -580,5 +611,7 @@ skinfile_t *Mod_LoadSkinFiles(void);
 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__