X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_shared.h;h=e1bad6226a52e82ff13503e40ed26fe17a20f692;hb=be63e498406167cfaec398888d8b3dd0d02d5fc2;hp=b455609ad7b367bb634a33f72cafe38570dcdec4;hpb=605d97b6a067c316cc432311eb98d7054ded7034;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.h b/model_shared.h index b455609a..e1bad622 100644 --- a/model_shared.h +++ b/model_shared.h @@ -30,7 +30,7 @@ m*_t structures are in-memory */ -typedef enum modtype_e {mod_invalid, mod_brushq1, mod_sprite, mod_alias, mod_brushq2, mod_brushq3, mod_null} modtype_t; +typedef enum modtype_e {mod_invalid, mod_brushq1, mod_sprite, mod_alias, mod_brushq2, mod_brushq3, mod_obj, mod_null} modtype_t; typedef struct animscene_s { @@ -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; } @@ -383,6 +392,9 @@ typedef struct q3shaderinfo_s qboolean dpshadow; qboolean dpnoshadow; + // 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) @@ -408,16 +420,6 @@ typedef enum texturelayertype_e } texturelayertype_t; -typedef enum texturelayerflag_e -{ - // indicates that the pass should apply fog darkening; used on - // transparent surfaces where simply blending an alpha fog as a final - // pass would not behave properly, so all the surfaces must be darkened, - // and the fog color added as a separate pass - TEXTURELAYERFLAG_FOGDARKEN = 1, -} -texturelayerflag_t; - typedef struct texturelayer_s { texturelayertype_t type; @@ -427,7 +429,6 @@ typedef struct texturelayer_s rtexture_t *texture; matrix4x4_t texmatrix; vec4_t color; - int flags; } texturelayer_t; @@ -491,10 +492,19 @@ typedef struct texture_s q3shaderinfo_deform_t deforms[Q3MAXDEFORMS]; qboolean colormapping; - rtexture_t *basetexture; - rtexture_t *glosstexture; - rtexture_t *backgroundbasetexture; - rtexture_t *backgroundglosstexture; + rtexture_t *basetexture; // original texture without pants/shirt/glow + rtexture_t *pantstexture; // pants only (in greyscale) + rtexture_t *shirttexture; // shirt only (in greyscale) + rtexture_t *nmaptexture; // normalmap (bumpmap for dot3) + 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) + rtexture_t *backgroundglowtexture; // glow only (fullbrights) float specularscale; float specularpower; // color tint (colormod * currentalpha) used for rtlighting this material @@ -570,6 +580,16 @@ typedef struct msurface_s rtexture_t *lightmaptexture; // the lighting direction texture fragment to use on the rendering mesh rtexture_t *deluxemaptexture; + // lightmaptexture rebuild information not used in q3bsp + msurface_lightmapinfo_t *lightmapinfo; // q1bsp + // fog volume info in q3bsp + struct q3deffect_s *effect; // q3bsp + // mesh information for collisions (only used by q3bsp curves) + 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 @@ -580,27 +600,18 @@ typedef struct msurface_s // shadow volume building information int num_firstshadowmeshtriangle; // index into model->brush.shadowmesh - // lightmaptexture rebuild information not used in q3bsp - msurface_lightmapinfo_t *lightmapinfo; // q1bsp - // mesh information for collisions (only used by q3bsp curves) int num_collisiontriangles; // q3bsp - int *data_collisionelement3i; // q3bsp int num_collisionvertices; // q3bsp - float *data_collisionvertex3f; // q3bsp - struct q3deffect_s *effect; // q3bsp + 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 - - // optimization... - float *data_collisionbbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles - int num_collisionbboxstride; - float *data_bbox6f; // collision optimization - contains combined bboxes of every data_collisionstride triangles - int num_bboxstride; + 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" @@ -680,6 +691,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; @@ -751,6 +768,7 @@ typedef struct model_brushq1_s // this contains bytes that are 1 if a surface needs its lightmap rebuilt unsigned char *lightmapupdateflags; + qboolean firstrender; // causes all surface lightmaps to be loaded in first frame } model_brushq1_t; @@ -864,6 +882,8 @@ 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; // for md3 models int num_tags; int num_tagframes; @@ -871,13 +891,17 @@ typedef struct model_s // for skeletal models int num_bones; aliasbone_t *data_bones; + float num_posescale; // scaling factor from origin in poses6s format (includes divide by 32767) + float num_poseinvscale; // scaling factor to origin in poses6s format (includes multiply by 32767) int num_poses; - float *data_poses; + short *data_poses6s; // origin xyz, quat xyz, w implied negative, unit length, values normalized to +/-32767 range float *data_baseboneposeinverse; // textures of this model 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; @@ -967,6 +991,10 @@ void Mod_BuildTextureVectorsFromNormals(int firstvertex, int numvertices, int nu void Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors); void Mod_MakeSortedSurfaces(dp_model_t *mod); +// called specially by brush model loaders before generating submodels +// automatically called after model loader returns +void Mod_BuildVBOs(void); + shadowmesh_t *Mod_ShadowMesh_Alloc(mempool_t *mempool, int maxverts, int maxtriangles, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, int light, int neighbors, int expandable); shadowmesh_t *Mod_ShadowMesh_ReAlloc(mempool_t *mempool, shadowmesh_t *oldmesh, int light, int neighbors); int Mod_ShadowMesh_AddVertex(shadowmesh_t *mesh, float *vertex14f); @@ -1011,6 +1039,7 @@ skinfile_t; skinfile_t *Mod_LoadSkinFiles(void); void Mod_FreeSkinFiles(skinfile_t *skinfile); int Mod_CountSkinFiles(skinfile_t *skinfile); +void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfile, const char *meshname, const char *shadername); void Mod_SnapVertices(int numcomponents, int numvertices, float *vertices, float snap); int Mod_RemoveDegenerateTriangles(int numtriangles, const int *inelement3i, int *outelement3i, const float *vertex3f); @@ -1058,6 +1087,14 @@ 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_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); +void Mod_MakeCollisionBIH(dp_model_t *model, qboolean userendersurfaces); + // alias models struct frameblend_s; struct skeleton_s; @@ -1066,6 +1103,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);