X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=model_shared.h;h=bc030221b27d37f082a9d0a16a2c12b34022812a;hp=571dcc65754753413993cbe33a0fce7ce5f30e2c;hb=8ebb89488cfbf28c6d0234dbb6fec83c59e29e1e;hpb=8faf3f3afe212ca98defd31285143d94757c06f4 diff --git a/model_shared.h b/model_shared.h index 571dcc65..bc030221 100644 --- a/model_shared.h +++ b/model_shared.h @@ -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]; @@ -186,17 +193,21 @@ shadowmesh_t; // 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 8 +#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 4 +#define Q3MAXTCMODS 8 #define Q3MAXDEFORMS 4 typedef enum q3wavefunc_e @@ -290,37 +301,61 @@ typedef enum q3tcmod_e } 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[TEXTURE_MAXFRAMES][Q3PATHLENGTH]; + char** texturename; int blendfunc[2]; - q3rgbgen_t rgbgen; - float rgbgen_parms[Q3RGBGEN_MAXPARMS]; - q3wavefunc_t rgbgen_wavefunc; - float rgbgen_waveparms[Q3WAVEPARMS]; - q3alphagen_t alphagen; - float alphagen_parms[Q3ALPHAGEN_MAXPARMS]; - q3wavefunc_t alphagen_wavefunc; - float alphagen_waveparms[Q3WAVEPARMS]; - q3tcgen_t tcgen; - float tcgen_parms[Q3TCGEN_MAXPARMS]; - q3tcmod_t tcmod[Q3MAXTCMODS]; - float tcmod_parms[Q3MAXTCMODS][Q3TCMOD_MAXPARMS]; - q3wavefunc_t tcmod_wavefunc[Q3MAXTCMODS]; - float tcmod_waveparms[Q3MAXTCMODS][Q3WAVEPARMS]; + 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 deform_parms[Q3DEFORM_MAXPARMS]; - q3wavefunc_t deform_wavefunc; - float deform_waveparms[Q3WAVEPARMS]; + float parms[Q3DEFORM_MAXPARMS]; + q3wavefunc_t wavefunc; + float waveparms[Q3WAVEPARMS]; } q3shaderinfo_deform_t; @@ -333,10 +368,17 @@ typedef struct q3shaderinfo_s qboolean lighting; qboolean vertexalpha; qboolean textureblendalpha; - q3shaderinfo_layer_t *primarylayer, *backgroundlayer; + 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; @@ -387,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; @@ -415,25 +462,11 @@ typedef struct texture_s 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]; - q3deform_t deform; - float deform_parms[Q3DEFORM_MAXPARMS]; - q3wavefunc_t deform_wavefunc; - float deform_waveparms[Q3WAVEPARMS]; - q3rgbgen_t rgbgen; - float rgbgen_parms[Q3RGBGEN_MAXPARMS]; - q3wavefunc_t rgbgen_wavefunc; - float rgbgen_waveparms[Q3WAVEPARMS]; - q3alphagen_t alphagen; - float alphagen_parms[Q3ALPHAGEN_MAXPARMS]; - q3wavefunc_t alphagen_wavefunc; - float alphagen_waveparms[Q3WAVEPARMS]; - q3tcgen_t tcgen; - float tcgen_parms[Q3TCGEN_MAXPARMS]; - q3tcmod_t tcmod[Q3MAXTCMODS]; - float tcmod_parms[Q3MAXTCMODS][Q3TCMOD_MAXPARMS]; - q3wavefunc_t tcmod_wavefunc[Q3MAXTCMODS]; - float tcmod_waveparms[Q3MAXTCMODS][Q3WAVEPARMS]; qboolean colormapping; rtexture_t *basetexture; @@ -442,6 +475,12 @@ typedef struct texture_s rtexture_t *backgroundglosstexture; float specularscale; float specularpower; + // color tint (colormod * currentalpha) used for rtlighting this material + float dlightcolor[3]; + // color tint (colormod * 2) used for lightmapped lighting on this material + // includes alpha as 4th component + // replaces role of gl_Color in GLSL shader + float lightmapcolor[4]; // from q3 shaders int customblendfunc[2]; @@ -455,6 +494,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; @@ -536,6 +583,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 @@ -600,7 +656,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); @@ -629,9 +685,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; @@ -647,8 +700,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; @@ -659,11 +713,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; @@ -797,12 +848,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 @@ -907,9 +964,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);