]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.h
reenabled R_UpdateAllTextureInfo calls when lighting the world model
[xonotic/darkplaces.git] / model_shared.h
index 95826bd0e73fd5cb0d45d12db06b9faa3888fea0..9ec9bf16e545ab6f55af169b358b4aa83965546e 100644 (file)
@@ -90,7 +90,13 @@ typedef struct overridetagnameset_s
 overridetagnameset_t;
 
 struct md3vertex_s;
-struct trivertex_s;
+struct trivertx_s;
+typedef struct texvecvertex_s
+{
+       signed char svec[3];
+       signed char tvec[3];
+}
+texvecvertex_t;
 
 // used for mesh lists in q1bsp/q3bsp map models
 // (the surfaces reference portions of these meshes)
@@ -125,6 +131,7 @@ typedef struct surfmesh_s
        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];
@@ -182,7 +189,198 @@ typedef struct shadowmesh_s
 }
 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 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 8
+#define Q3MAXDEFORMS 4
+
+typedef enum q3wavefunc_e
+{
+       Q3WAVEFUNC_NONE,
+       Q3WAVEFUNC_INVERSESAWTOOTH,
+       Q3WAVEFUNC_NOISE,
+       Q3WAVEFUNC_SAWTOOTH,
+       Q3WAVEFUNC_SIN,
+       Q3WAVEFUNC_SQUARE,
+       Q3WAVEFUNC_TRIANGLE,
+       Q3WAVEFUNC_COUNT
+}
+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,
+       Q3RGBGEN_CONST,
+       Q3RGBGEN_ENTITY,
+       Q3RGBGEN_EXACTVERTEX,
+       Q3RGBGEN_IDENTITYLIGHTING,
+       Q3RGBGEN_LIGHTINGDIFFUSE,
+       Q3RGBGEN_ONEMINUSENTITY,
+       Q3RGBGEN_ONEMINUSVERTEX,
+       Q3RGBGEN_VERTEX,
+       Q3RGBGEN_WAVE,
+       Q3RGBGEN_COUNT
+}
+q3rgbgen_t;
+
+typedef enum q3alphagen_e
+{
+       Q3ALPHAGEN_IDENTITY,
+       Q3ALPHAGEN_CONST,
+       Q3ALPHAGEN_ENTITY,
+       Q3ALPHAGEN_LIGHTINGSPECULAR,
+       Q3ALPHAGEN_ONEMINUSENTITY,
+       Q3ALPHAGEN_ONEMINUSVERTEX,
+       Q3ALPHAGEN_PORTAL,
+       Q3ALPHAGEN_VERTEX,
+       Q3ALPHAGEN_WAVE,
+       Q3ALPHAGEN_COUNT
+}
+q3alphagen_t;
+
+typedef enum q3tcgen_e
+{
+       Q3TCGEN_NONE,
+       Q3TCGEN_TEXTURE, // very common
+       Q3TCGEN_ENVIRONMENT, // common
+       Q3TCGEN_LIGHTMAP,
+       Q3TCGEN_VECTOR,
+       Q3TCGEN_COUNT
+}
+q3tcgen_t;
+
+typedef enum q3tcmod_e
+{
+       Q3TCMOD_NONE,
+       Q3TCMOD_ENTITYTRANSLATE,
+       Q3TCMOD_ROTATE,
+       Q3TCMOD_SCALE,
+       Q3TCMOD_SCROLL,
+       Q3TCMOD_STRETCH,
+       Q3TCMOD_TRANSFORM,
+       Q3TCMOD_TURBULENT,
+       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;
+       int blendfunc[2];
+       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];
+       int surfaceparms;
+       int textureflags;
+       int numlayers;
+       qboolean lighting;
+       qboolean vertexalpha;
+       qboolean textureblendalpha;
+       int primarylayer, backgroundlayer;
+       q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS];
+       char skyboxname[Q3PATHLENGTH];
+       q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
+
+       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)
+}
+q3shaderinfo_t;
 
 typedef enum texturelayertype_e
 {
@@ -231,6 +429,11 @@ typedef struct texture_s
        // 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;
@@ -258,6 +461,13 @@ typedef struct texture_s
        // current texture transform matrix (used for water scrolling)
        matrix4x4_t currenttexmatrix;
 
+       // 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_deform_t deforms[Q3MAXDEFORMS];
+
        qboolean colormapping;
        rtexture_t *basetexture;
        rtexture_t *glosstexture;
@@ -265,6 +475,8 @@ typedef struct texture_s
        rtexture_t *backgroundglosstexture;
        float specularscale;
        float specularpower;
+       // color tint (colormod * currentalpha) used for rtlighting this material
+       float dlightcolor[3];
 
        // from q3 shaders
        int customblendfunc[2];
@@ -278,6 +490,14 @@ typedef struct texture_s
        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)
 }
 texture_t;
 
@@ -359,6 +579,15 @@ model_sprite_t;
 
 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
@@ -423,7 +652,7 @@ typedef struct model_brush_s
        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);
@@ -452,9 +681,6 @@ model_brush_t;
 
 typedef struct model_brushq1_s
 {
-       // lightmap format, set to r_lightmaprgba when model is loaded
-       int                             lightmaprgba;
-
        dmodel_t                *submodels;
 
        int                             numvertexes;
@@ -470,8 +696,9 @@ typedef struct model_brushq1_s
        int                             *surfedges;
 
        int                             numclipnodes;
-       dclipnode_t             *clipnodes;
+       mclipnode_t             *clipnodes;
 
+       int                             numhulls;       // this variable is only used by MCBSP, other formats know it intuitively
        hull_t                  hulls[MAX_MAP_HULLS];
 
        int                             num_compressedpvs;
@@ -482,11 +709,8 @@ typedef struct model_brushq1_s
        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;
 }
 model_brushq1_t;
 
@@ -620,12 +844,18 @@ typedef struct model_s
        msurface_lightmapinfo_t *data_surfaces_lightmapinfo;
        // all surfaces belong to this mesh
        surfmesh_t              surfmesh;
+       // data type of model
+       const char              *modeldatatypestring;
        // 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);
        // compile a shadow volume for the model based on light source
@@ -693,116 +923,6 @@ shadowmesh_t *Mod_ShadowMesh_Finish(mempool_t *mempool, shadowmesh_t *firstmesh,
 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);
 
-#define Q3SHADER_MAXLAYERS 8
-#define Q3RGBGEN_MAXPARMS 3
-#define Q3ALPHAGEN_MAXPARMS 1
-#define Q3TCGEN_MAXPARMS 6
-#define Q3TCMOD_MAXPARMS 6
-
-typedef enum q3wavefunc_e
-{
-       Q3WAVEFUNC_NONE,
-       Q3WAVEFUNC_INVERSESAWTOOTH,
-       Q3WAVEFUNC_NOISE,
-       Q3WAVEFUNC_SAWTOOTH,
-       Q3WAVEFUNC_SIN,
-       Q3WAVEFUNC_SQUARE,
-       Q3WAVEFUNC_TRIANGLE,
-       Q3WAVEFUNC_COUNT
-}
-q3wavefunc_t;
-
-typedef enum q3rgbgen_e
-{
-       Q3RGBGEN_IDENTITY,
-       Q3RGBGEN_CONST,
-       Q3RGBGEN_ENTITY,
-       Q3RGBGEN_EXACTVERTEX,
-       Q3RGBGEN_IDENTITYLIGHTING,
-       Q3RGBGEN_LIGHTINGDIFFUSE,
-       Q3RGBGEN_ONEMINUSENTITY,
-       Q3RGBGEN_ONEMINUSVERTEX,
-       Q3RGBGEN_VERTEX,
-       Q3RGBGEN_WAVE,
-       Q3RGBGEN_COUNT
-}
-q3rgbgen_t;
-
-typedef enum q3alphagen_e
-{
-       Q3ALPHAGEN_IDENTITY,
-       Q3ALPHAGEN_CONST,
-       Q3ALPHAGEN_ENTITY,
-       Q3ALPHAGEN_LIGHTINGSPECULAR,
-       Q3ALPHAGEN_ONEMINUSENTITY,
-       Q3ALPHAGEN_ONEMINUSVERTEX,
-       Q3ALPHAGEN_PORTAL,
-       Q3ALPHAGEN_VERTEX,
-       Q3ALPHAGEN_WAVE,
-       Q3ALPHAGEN_COUNT
-}
-q3alphagen_t;
-
-typedef enum q3tcgen_e
-{
-       Q3TCGEN_NONE,
-       Q3TCGEN_TEXTURE, // very common
-       Q3TCGEN_ENVIRONMENT, // common
-       Q3TCGEN_LIGHTMAP,
-       Q3TCGEN_VECTOR,
-       Q3TCGEN_COUNT
-}
-q3tcgen_t;
-
-typedef enum q3tcmod_e
-{
-       Q3TCMOD_NONE,
-       Q3TCMOD_ENTITYTRANSLATE,
-       Q3TCMOD_ROTATE,
-       Q3TCMOD_SCALE,
-       Q3TCMOD_SCROLL,
-       Q3TCMOD_STRETCH,
-       Q3TCMOD_TRANSFORM,
-       Q3TCMOD_TURB,
-       Q3TCMOD_COUNT
-}
-q3tcmod_t;
-
-typedef struct q3shaderinfo_layer_s
-{
-       int alphatest;
-       int clampmap;
-       float framerate;
-       int numframes;
-       char texturename[TEXTURE_MAXFRAMES][Q3PATHLENGTH];
-       int blendfunc[2];
-       q3rgbgen_t rgbgen;
-       q3alphagen_t alphagen;
-       q3tcgen_t tcgen;
-       q3tcmod_t tcmod;
-       float rgbgen_parms[Q3RGBGEN_MAXPARMS];
-       float alphagen_parms[Q3ALPHAGEN_MAXPARMS];
-       float tcgen_parms[Q3TCGEN_MAXPARMS];
-       float tcmod_parms[Q3TCMOD_MAXPARMS];
-       q3wavefunc_t tcmod_wavefunc;
-}
-q3shaderinfo_layer_t;
-
-typedef struct q3shaderinfo_s
-{
-       char name[Q3PATHLENGTH];
-       int surfaceparms;
-       int textureflags;
-       int numlayers;
-       qboolean lighting;
-       qboolean vertexalpha;
-       qboolean textureblendalpha;
-       q3shaderinfo_layer_t *primarylayer, *backgroundlayer;
-       q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS];
-       char skyboxname[Q3PATHLENGTH];
-}
-q3shaderinfo_t;
-
 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);
@@ -840,9 +960,11 @@ int Mod_Q1BSP_SuperContentsFromNativeContents(struct model_s *model, int nativec
 
 // 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_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_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);