X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=model_shared.h;h=3dbedd5e2305e7fa7f7ab4941a40078c1df0c8ba;hb=df2f87da97af1289f4f0d07f36afae6e36a71527;hp=c0e263f1ff57974493b2519a530730c3575ba9d8;hpb=0d4e1d479bd3074c00c0e81b9198f11c86581ef3;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.h b/model_shared.h index c0e263f1..3dbedd5e 100644 --- a/model_shared.h +++ b/model_shared.h @@ -53,6 +53,7 @@ typedef struct skinframe_s rtexture_t *gloss; // glossmap (for dot3) rtexture_t *glow; // glow only (fullbrights) rtexture_t *fog; // alpha of the base texture (if not opaque) + rtexture_t *reflect; // colored mask for cubemap reflections // accounting data for hash searches: // the compare variables are used to identify internal skins from certain // model formats @@ -93,6 +94,13 @@ typedef struct texvecvertex_s } texvecvertex_t; +typedef struct blendweights_s +{ + unsigned char index[4]; + unsigned char influence[4]; +} +blendweights_t; + // used for mesh lists in q1bsp/q3bsp map models // (the surfaces reference portions of these meshes) typedef struct surfmesh_s @@ -133,8 +141,9 @@ typedef struct surfmesh_s float num_morphmdlframescale[3]; float num_morphmdlframetranslate[3]; // skeletal blending, these are NULL if model is morph or static - int *data_vertexweightindex4i; - float *data_vertexweightinfluence4f; + struct blendweights_s *data_blendweights; + int num_blends; + unsigned short *blends; // set if there is some kind of animation on this model qboolean isanimated; } @@ -198,6 +207,7 @@ shadowmesh_t; #define Q3TEXTUREFLAG_REFRACTION 256 #define Q3TEXTUREFLAG_REFLECTION 512 #define Q3TEXTUREFLAG_WATERSHADER 1024 +#define Q3TEXTUREFLAG_CAMERA 2048 #define Q3PATHLENGTH 64 #define TEXTURE_MAXFRAMES 64 @@ -222,7 +232,10 @@ typedef enum q3wavefunc_e Q3WAVEFUNC_TRIANGLE, Q3WAVEFUNC_COUNT } -q3wavefunc_t; +q3wavefunc_e; +typedef int q3wavefunc_t; +#define Q3WAVEFUNC_USER_COUNT 4 +#define Q3WAVEFUNC_USER_SHIFT 8 // use 8 bits for wave func type typedef enum q3deform_e { @@ -362,6 +375,15 @@ typedef struct q3shaderinfo_deform_s } q3shaderinfo_deform_t; +typedef enum dpoffsetmapping_technique_s +{ + OFFSETMAPPING_OFF, // none + OFFSETMAPPING_DEFAULT, // cvar-set + OFFSETMAPPING_LINEAR, // linear + OFFSETMAPPING_RELIEF // relief +}dpoffsetmapping_technique_t; + + typedef struct q3shaderinfo_s { char name[Q3PATHLENGTH]; @@ -383,6 +405,12 @@ typedef struct q3shaderinfo_s qboolean dpshadow; qboolean dpnoshadow; + // add collisions to all triangles of the surface + qboolean dpmeshcollisions; + + // fake reflection + char dpreflectcube[Q3PATHLENGTH]; + // 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) @@ -391,6 +419,14 @@ typedef struct q3shaderinfo_s float reflectfactor; // amount of reflection distort (1.0 = like the cvar specifies) vec4_t reflectcolor4f; // color tint of reflection (including alpha factor) float r_water_wateralpha; // additional wateralpha to apply when r_water is active + float r_water_waterscroll[2]; // water normalmapscrollblend - scale and speed + + // offsetmapping + dpoffsetmapping_technique_t offsetmapping; + float offsetscale; + + // polygonoffset (only used if Q3TEXTUREFLAG_POLYGONOFFSET) + float biaspolygonoffset, biaspolygonfactor; // gloss float specularscalemod; @@ -487,6 +523,8 @@ typedef struct texture_s rtexture_t *glosstexture; // glossmap (for dot3) rtexture_t *glowtexture; // glow only (fullbrights) rtexture_t *fogtexture; // alpha of the base texture (if not opaque) + rtexture_t *reflectmasktexture; // mask for fake reflections + rtexture_t *reflectcubetexture; // fake reflections cubemap rtexture_t *backgroundbasetexture; // original texture without pants/shirt/glow rtexture_t *backgroundnmaptexture; // normalmap (bumpmap for dot3) rtexture_t *backgroundglosstexture; // glossmap (for dot3) @@ -521,12 +559,18 @@ typedef struct texture_s float reflectfactor; // amount of reflection distort (1.0 = like the cvar specifies) vec4_t reflectcolor4f; // color tint of reflection (including alpha factor) float r_water_wateralpha; // additional wateralpha to apply when r_water is active + float r_water_waterscroll[2]; // scale and speed + int camera_entity; // entity number for use by cameras + + // offsetmapping + dpoffsetmapping_technique_t offsetmapping; + float offsetscale; // gloss float specularscalemod; float specularpowermod; } -texture_t; + texture_t; typedef struct mtexinfo_s { @@ -571,10 +615,11 @@ typedef struct msurface_s // fog volume info in q3bsp struct q3deffect_s *effect; // q3bsp // mesh information for collisions (only used by q3bsp curves) - int *data_collisionelement3i; // q3bsp - float *data_collisionvertex3f; // q3bsp - float *data_collisionbbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles - float *data_bbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles + int num_firstcollisiontriangle; + int *deprecatedq3data_collisionelement3i; // q3bsp + float *deprecatedq3data_collisionvertex3f; // q3bsp + float *deprecatedq3data_collisionbbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles + float *deprecatedq3data_bbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles // surfaces own ranges of vertices and triangles in the model->surfmesh int num_triangles; // number of triangles @@ -588,14 +633,15 @@ typedef struct msurface_s // mesh information for collisions (only used by q3bsp curves) int num_collisiontriangles; // q3bsp int num_collisionvertices; // q3bsp - int num_collisionbboxstride; - int num_bboxstride; + int deprecatedq3num_collisionbboxstride; + int deprecatedq3num_bboxstride; // FIXME: collisionmarkframe should be kept in a separate array - int collisionmarkframe; // q3bsp // don't collide twice in one trace + int deprecatedq3collisionmarkframe; // q3bsp // don't collide twice in one trace } msurface_t; #include "matrixlib.h" +#include "bih.h" #include "model_brush.h" #include "model_sprite.h" @@ -675,6 +721,12 @@ typedef struct model_brush_s //pvschain = model->brush.data_pvsclusters + mycluster * model->brush.num_pvsclusterbytes; //if (pvschain[thatcluster >> 3] & (1 << (thatcluster & 7))) + // collision geometry for q3 curves + int num_collisionvertices; + int num_collisiontriangles; + float *data_collisionvertex3f; + int *data_collisionelement3i; + // a mesh containing all shadow casting geometry for the whole model (including submodels), portions of this are referenced by each surface's num_firstshadowmeshtriangle shadowmesh_t *shadowmesh; @@ -780,7 +832,9 @@ typedef struct model_brushq3_s // lightmap textures int num_originallightmaps; int num_mergedlightmaps; - int num_lightmapmergepower; + int num_lightmapmergedwidthpower; + int num_lightmapmergedheightpower; + int num_lightmapmergedwidthheightdeluxepower; int num_lightmapmerge; rtexture_t **data_lightmaps; rtexture_t **data_deluxemaps; @@ -860,6 +914,9 @@ typedef struct model_s // range of collision brush numbers in this (sub)model int firstmodelbrush; int nummodelbrushes; + // BIH (Bounding Interval Hierarchy) for this (sub)model + bih_t collision_bih; + bih_t render_bih; // if not set, use collision_bih instead for rendering purposes too // for md3 models int num_tags; int num_tagframes; @@ -876,6 +933,8 @@ typedef struct model_s int num_textures; int num_texturesperskin; texture_t *data_textures; + qboolean wantnormals; + qboolean wanttangents; // surfaces of this model int num_surfaces; msurface_t *data_surfaces; @@ -886,7 +945,7 @@ typedef struct model_s // data type of model const char *modeldatatypestring; // generates vertex data for a given frameblend - void(*AnimateVertices)(const struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, float *vertex3f, float *normal3f, float *svector3f, float *tvector3f); + void(*AnimateVertices)(const struct model_s * RESTRICT model, const struct frameblend_s * RESTRICT frameblend, const struct skeleton_s *skeleton, float * RESTRICT vertex3f, float * RESTRICT normal3f, float * RESTRICT svector3f, float * RESTRICT tvector3f); // 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) @@ -913,6 +972,7 @@ typedef struct model_s void(*DrawLight)(struct entity_render_s *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs); // trace a box against this model void (*TraceBox)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask); + void (*TraceBrush)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, struct colbrushf_s *start, struct colbrushf_s *end, int hitsupercontentsmask); // trace a box against this model void (*TraceLine)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask); // trace a point against this model (like PointSuperContents) @@ -929,6 +989,9 @@ typedef struct model_s model_brushq3_t brushq3; // flags this model for offseting sounds to the model center (used by brush models) int soundfromcenter; + + // if set, the model contains light information (lightmap, or vertexlight) + qboolean lit; } dp_model_t; @@ -987,6 +1050,7 @@ q3shaderinfo_t *Mod_LookupQ3Shader(const char *name); qboolean Mod_LoadTextureFromQ3Shader(texture_t *texture, const char *name, qboolean warnmissing, qboolean fallback, int defaulttexflags); extern cvar_t r_mipskins; +extern cvar_t r_mipnormalmaps; typedef struct skeleton_s { @@ -1061,6 +1125,15 @@ void R_Q1BSP_CompileShadowVolume(struct entity_render_s *ent, vec3_t relativelig void R_Q1BSP_DrawShadowVolume(struct entity_render_s *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs); void R_Q1BSP_DrawLight(struct entity_render_s *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs); +// Collision optimization using Bounding Interval Hierarchy +void Mod_CollisionBIH_TracePoint(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask); +void Mod_CollisionBIH_TraceLine(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask); +void Mod_CollisionBIH_TraceBox(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask); +void Mod_CollisionBIH_TraceBrush(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, struct colbrushf_s *start, struct colbrushf_s *end, int hitsupercontentsmask); +void Mod_CollisionBIH_TracePoint_Mesh(dp_model_t *model, const struct frameblend_s *frameblend, const skeleton_t *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask); +int Mod_CollisionBIH_PointSuperContents_Mesh(struct model_s *model, int frame, const vec3_t point); +bih_t *Mod_MakeCollisionBIH(dp_model_t *model, qboolean userendersurfaces, bih_t *out); + // alias models struct frameblend_s; struct skeleton_s; @@ -1069,6 +1142,8 @@ int Mod_Alias_GetTagMatrix(const dp_model_t *model, const struct frameblend_s *f int Mod_Alias_GetTagIndexForName(const dp_model_t *model, unsigned int skin, const char *tagname); int Mod_Alias_GetExtendedTagInfoForIndex(const dp_model_t *model, unsigned int skin, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, int tagindex, int *parentindex, const char **tagname, matrix4x4_t *tag_localmatrix); +void Mod_Skeletal_FreeBuffers(void); + // sprite models void Mod_SpriteInit(void); @@ -1085,6 +1160,7 @@ void Mod_DARKPLACESMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend); void Mod_PSKMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend); void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend); void Mod_IDS2_Load(dp_model_t *mod, void *buffer, void *bufferend); +void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend); #endif // MODEL_SHARED_H