X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=model_shared.h;h=cf771ed11ffc180d26d84913ab48c347b2b2aaa7;hp=136cf854ad5c34edd2c6761ecf3284bcd19cd7d0;hb=e3272446d9f13cc12b1822a99b4e7cf512454db9;hpb=c651b263f8a63fa5846df832051d4f5658680a03 diff --git a/model_shared.h b/model_shared.h index 136cf854..cf771ed1 100644 --- a/model_shared.h +++ b/model_shared.h @@ -73,27 +73,38 @@ typedef struct overridetagnameset_s } overridetagnameset_t; -// LordHavoc: replaces glpoly, triangle mesh +typedef struct surfmeshvertexboneweight_s +{ + unsigned int vertexindex; + unsigned int boneindex; + float origin[3]; + float weight; +} +surfmeshvertexboneweight_t; + +// used for mesh lists in q1bsp/q3bsp map models +// (the surfaces reference portions of these meshes) typedef struct surfmesh_s { - int num_vertices; // number of vertices in the mesh int num_triangles; // number of triangles in the mesh + int *data_element3i; // int[tris*3] triangles of the mesh, 3 indices into vertex arrays for each + int *data_neighbor3i; // int[tris*3] neighboring triangle on each edge (-1 if none) + int num_vertices; // number of vertices in the mesh float *data_vertex3f; // float[verts*3] vertex locations float *data_svector3f; // float[verts*3] direction of 'S' (right) texture axis for each vertex float *data_tvector3f; // float[verts*3] direction of 'T' (down) texture axis for each vertex float *data_normal3f; // float[verts*3] direction of 'R' (out) texture axis for each vertex - int *data_lightmapoffsets; // index into surface's lightmap samples for vertex lighting float *data_texcoordtexture2f; // float[verts*2] texcoords for surface texture float *data_texcoordlightmap2f; // float[verts*2] texcoords for lightmap texture float *data_texcoorddetail2f; // float[verts*2] texcoords for detail texture float *data_lightmapcolor4f; - int *data_element3i; // int[tris*3] triangles of the mesh, 3 indices into vertex arrays for each - int *data_neighbor3i; // int[tris*3] neighboring triangle on each edge (-1 if none) - - int num_collisionvertices; - int num_collisiontriangles; - float *data_collisionvertex3f; - int *data_collisionelement3i; + int *data_lightmapoffsets; // index into surface's lightmap samples for vertex lighting + // morph blending, these are zero if model is skeletal or static + int num_morphframes; + float *data_morphvertex3f; + // skeletal blending, these are zero if model is morph or static + int num_vertexboneweights; + surfmeshvertexboneweight_t *data_vertexboneweights; } surfmesh_t; @@ -132,33 +143,115 @@ typedef struct shadowmesh_s } shadowmesh_t; +typedef struct texture_s +{ + // q1bsp + // name + //char name[16]; + // size + unsigned int width, height; + // SURF_ flags + //unsigned int flags; + + // base material flags + int basematerialflags; + // current material flags (updated each bmodel render) + int currentmaterialflags; + + // loaded the same as model skins + skinframe_t skin; + + // total frames in sequence and alternate sequence + int anim_total[2]; + // direct pointers to each of the frames in the sequences + // (indexed as [alternate][frame]) + struct texture_s *anim_frames[2][10]; + // set if animated or there is an alternate frame set + // (this is an optimization in the renderer) + int animated; + // the current texture frame in animation + struct texture_s *currentframe; + // current alpha of the texture + float currentalpha; + + // q3bsp + char name[64]; + char firstpasstexturename[64]; // used only during loading + int surfaceflags; + int supercontents; + int surfaceparms; + int textureflags; + + //skinframe_t skin; +} +texture_t; -#include "matrixlib.h" - -#include "model_brush.h" -#include "model_sprite.h" -#include "model_alias.h" +typedef struct +{ + float vecs[2][4]; + texture_t *texture; + int flags; +} +mtexinfo_t; -typedef struct model_alias_s +typedef struct msurface_lightmapinfo_s { - // mdl/md2/md3/zym model formats are treated the same after loading + // texture mapping properties used by this surface + mtexinfo_t *texinfo; // q1bsp + // index into d_lightstylevalue array, 255 means not used (black) + qbyte styles[MAXLIGHTMAPS]; // q1bsp + // RGB lighting data [numstyles][height][width][3] + qbyte *samples; // q1bsp + // stain to apply on lightmap (soot/dirt/blood/whatever) + qbyte *stainsamples; // q1bsp + // the stride when building lightmaps to comply with fragment update + int lightmaptexturestride; // q1bsp + int texturemins[2]; // q1bsp + int extents[2]; // q1bsp +} +msurface_lightmapinfo_t; - // the shader meshes comprising this model - int aliasnum_meshes; - aliasmesh_t *aliasdata_meshes; +struct q3deffect_s; +typedef struct msurface_s +{ + // bounding box for onscreen checks + vec3_t mins; + vec3_t maxs; + // the texture to use on the surface + texture_t *texture; + // the lightmap texture fragment to use on the rendering mesh + rtexture_t *lightmaptexture; + + // this surface is part of this mesh + surfmesh_t *groupmesh; + int num_triangles; // number of triangles in the mesh + int num_firsttriangle; // first triangle in the mesh (index into groupmesh) + int num_vertices; // number of vertices in the mesh + int num_firstvertex; // first vertex in the mesh (index into groupmesh) + + // shadow volume building information + int num_firstshadowmeshtriangle; // index into model->brush.shadowmesh + + // lightmaptexture rebuild information not used in q3bsp + int cached_dlight; // q1bsp // forces rebuild of lightmaptexture + 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 + // FIXME: collisionmarkframe should be kept in a separate array + int collisionmarkframe; // q3bsp // don't collide twice in one trace +} +msurface_t; - // for md3 models - int aliasnum_tags; - int aliasnum_tagframes; - aliastag_t *aliasdata_tags; +#include "matrixlib.h" - // for skeletal models - int aliasnum_bones; - aliasbone_t *aliasdata_bones; - int aliasnum_poses; - float *aliasdata_poses; -} -model_alias_t; +#include "model_brush.h" +#include "model_sprite.h" +#include "model_alias.h" typedef struct model_sprite_s { @@ -210,12 +303,6 @@ typedef struct model_brush_s int num_portalpoints; mvertex_t *data_portalpoints; - int num_textures; - texture_t *data_textures; - - int num_surfaces; - msurface_t *data_surfaces; - int num_brushes; q3mbrush_t *data_brushes; @@ -239,9 +326,11 @@ typedef struct model_brush_s 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); + int (*BoxTouchingLeafPVS)(struct model_s *model, const qbyte *pvs, const vec3_t mins, const vec3_t maxs); int (*BoxTouchingVisibleLeafs)(struct model_s *model, const qbyte *visibleleafs, 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); + mleaf_t *(*PointInLeaf)(struct model_s *model, const float *p); // 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); @@ -292,8 +381,6 @@ typedef struct model_brushq1_s int *light_stylevalue; msurface_t ***light_styleupdatechains; msurface_t **light_styleupdatechainsbuffer; - - mleaf_t *(*PointInLeaf)(struct model_s *model, const float *p); } model_brushq1_t; @@ -395,6 +482,23 @@ typedef struct model_s int nummodelbrushes; // list of surface numbers in this (sub)model int *surfacelist; + // for md3 models + int num_tags; + int num_tagframes; + aliastag_t *data_tags; + // for skeletal models + int num_bones; + aliasbone_t *data_bones; + int num_poses; + float *data_poses; + // textures of this model + int num_textures; + texture_t *data_textures; + // surfaces of this model + int num_surfaces; + msurface_t *data_surfaces; + // optional lightmapinfo data for surface lightmap updates + msurface_lightmapinfo_t *data_surfaces_lightmapinfo; // surface meshes are merged to a smaller set of meshes to allow reduced // vertex array switching, the meshes are limited to 65536 vertices each // to play nice with Geforce1 hardware @@ -405,15 +509,14 @@ typedef struct model_s // draw the model using lightmap/dlight shading void(*Draw)(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 *outclusterlist, qbyte *outclusterpvs, int *outnumclusterspointer, int *outsurfacelist, qbyte *outsurfacepvs, int *outnumsurfacespointer); + void(*GetLightInfo)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, qbyte *outleafpvs, int *outnumleafspointer, int *outsurfacelist, qbyte *outsurfacepvs, int *outnumsurfacespointer); // draw a shadow volume for the model based on light source void(*DrawShadowVolume)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs); // draw the lighting on a model (through stencil) - void(*DrawLight)(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltolight, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz, rtexture_t *lightcubemap, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int numsurfaces, const int *surfacelist); + void(*DrawLight)(struct entity_render_s *ent, float *lightcolor, int numsurfaces, const int *surfacelist); // trace a box against this model void (*TraceBox)(struct model_s *model, int frame, struct trace_s *trace, const vec3_t boxstartmins, const vec3_t boxstartmaxs, const vec3_t boxendmins, const vec3_t boxendmaxs, int hitsupercontentsmask); - // fields belonging to each type of model - model_alias_t alias; + // fields belonging to some types of model model_sprite_t sprite; model_brush_t brush; model_brushq1_t brushq1; @@ -430,15 +533,6 @@ model_t; //============================================================================ -// this can be used for anything without a valid texture -extern rtexture_t *r_texture_notexture; -#define NUM_DETAILTEXTURES 1 -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[64]; - // model loading extern model_t *loadmodel; extern qbyte *mod_base; @@ -448,7 +542,8 @@ extern qbyte *mod_base; extern cvar_t r_fullbrights; void Mod_Init (void); -void Mod_CheckLoaded (model_t *mod); +#define Mod_CheckLoaded(mod) (mod ? (mod->loaded ? (mod->used = true) : (Mod_LoadModel(mod, true, true, mod->isworldmodel), true)) : false) +model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, qboolean isworldmodel); void Mod_ClearAll (void); model_t *Mod_FindName (const char *name); model_t *Mod_ForName (const char *name, qboolean crash, qboolean checkdisk, qboolean isworldmodel); @@ -456,6 +551,7 @@ void Mod_UnloadModel (model_t *mod); void Mod_ClearUsed(void); void Mod_PurgeUnused(void); +void Mod_RemoveStaleWorldModels(model_t *skip); // only used during loading! void Mod_LoadModels(void); extern model_t *loadmodel; @@ -463,11 +559,11 @@ extern char loadname[32]; // for hunk tags int Mod_BuildVertexRemapTableFromElements(int numelements, const int *elements, int numvertices, int *remapvertices); void Mod_BuildTriangleNeighbors(int *neighbors, const int *elements, int numtriangles); -void Mod_ValidateElements(const int *elements, int numtriangles, int numverts, const char *filename, int fileline); -void Mod_BuildNormals(int numverts, int numtriangles, const float *vertex3f, const int *elements, float *normal3f); -void Mod_BuildTextureVectorsAndNormals(int numverts, int numtriangles, const float *vertex, const float *texcoord, const int *elements, float *svectors, float *tvectors, float *normals); +void Mod_ValidateElements(int *elements, int numtriangles, int numverts, const char *filename, int fileline); +void Mod_BuildNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const int *elements, float *normal3f, qboolean areaweighting); +void Mod_BuildTextureVectorsAndNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex, const float *texcoord, const int *elements, float *svectors, float *tvectors, float *normals, qboolean areaweighting); -surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, int numcollisionvertices, int numcollisiontriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors); +surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors); 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); @@ -482,10 +578,6 @@ 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 @@ -510,5 +602,34 @@ int Mod_CountSkinFiles(skinfile_t *skinfile); void Mod_SnapVertices(int numcomponents, int numvertices, float *vertices, float snap); int Mod_RemoveDegenerateTriangles(int numtriangles, const int *inelement3i, int *outelement3i, const float *vertex3f); +// bsp models +void Mod_BrushInit(void); +// 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); + +// alias models +struct frameblend_s; +void Mod_AliasInit(void); +void Mod_Alias_GetMesh_Vertex3f(const model_t *model, const struct frameblend_s *frameblend, const struct surfmesh_s *mesh, float *out3f); +int Mod_Alias_GetTagMatrix(const model_t *model, int poseframe, int tagindex, matrix4x4_t *outmatrix); +int Mod_Alias_GetTagIndexForName(const model_t *model, unsigned int skin, const char *tagname); + +// sprite models +void Mod_SpriteInit(void); + +// loaders +void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_IBSP_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_MAP_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_IDP0_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_IDP2_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_IDP3_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_DARKPLACESMODEL_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_PSKMODEL_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_IDSP_Load(model_t *mod, void *buffer, void *bufferend); +void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend); + #endif // MODEL_SHARED_H