X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=model_shared.h;h=c34890cad8af0c43ee088e057f387b2a303817a0;hb=cee29b1d7d961bbfced617202d03bc29ca78c72a;hp=40dc7e31c85e2aa00690bc44f4d97f6ac9445bb4;hpb=63bd4cc6bae869cbcd1ef49d27687184c9168fb0;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.h b/model_shared.h index 40dc7e31..c34890ca 100644 --- a/model_shared.h +++ b/model_shared.h @@ -101,6 +101,40 @@ typedef struct blendweights_s } blendweights_t; +typedef struct r_vertexgeneric_s +{ + // 36 bytes + float vertex3f[3]; + float color4f[4]; + float texcoord2f[2]; +} +r_vertexgeneric_t; + +typedef struct r_vertexmesh_s +{ + // 80 bytes + float vertex3f[3]; + float color4f[4]; + float texcoordtexture2f[2]; + float texcoordlightmap2f[2]; + float svector3f[3]; + float tvector3f[3]; + float normal3f[3]; +} +r_vertexmesh_t; + +typedef struct r_meshbuffer_s +{ + int bufferobject; // OpenGL + void *devicebuffer; // Direct3D + size_t size; + qboolean isindexbuffer; + qboolean isdynamic; + qboolean isindex16; + char name[MAX_QPATH]; +} +r_meshbuffer_t; + // used for mesh lists in q1bsp/q3bsp map models // (the surfaces reference portions of these meshes) typedef struct surfmesh_s @@ -108,11 +142,12 @@ typedef struct surfmesh_s // triangle data in system memory 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 + r_meshbuffer_t *data_element3i_indexbuffer; + size_t data_element3i_bufferoffset; unsigned short *data_element3s; // unsigned short[tris*3] triangles of the mesh in unsigned short format (NULL if num_vertices > 65536) + r_meshbuffer_t *data_element3s_indexbuffer; + size_t data_element3s_bufferoffset; int *data_neighbor3i; // int[tris*3] neighboring triangle on each edge (-1 if none) - // element buffer object (stores triangles in video memory) - int ebo3i; // unsigned int format (only allocated if num_vertices > 65536) - int ebo3s; // unsigned short format (only allocated if num_vertices <= 65536) // vertex data in system memory int num_vertices; // number of vertices in the mesh float *data_vertex3f; // float[verts*3] vertex locations @@ -124,7 +159,7 @@ typedef struct surfmesh_s float *data_lightmapcolor4f; int *data_lightmapoffsets; // index into surface's lightmap samples for vertex lighting // vertex buffer object (stores geometry in video memory) - int vbo; + r_meshbuffer_t *vbo_vertexbuffer; size_t vbooffset_vertex3f; size_t vbooffset_svector3f; size_t vbooffset_tvector3f; @@ -146,6 +181,11 @@ typedef struct surfmesh_s unsigned short *blends; // set if there is some kind of animation on this model qboolean isanimated; + + // vertex and index buffers for rendering + r_vertexmesh_t *vertexmesh; + r_meshbuffer_t *vertex3fbuffer; + r_meshbuffer_t *vertexmeshbuffer; } surfmesh_t; @@ -176,7 +216,11 @@ typedef struct shadowmesh_s float *texcoord2f; // used always int *element3i; + r_meshbuffer_t *element3i_indexbuffer; + size_t element3i_bufferoffset; unsigned short *element3s; + r_meshbuffer_t *element3s_indexbuffer; + size_t element3s_bufferoffset; // used for shadow mapping cubemap side partitioning int sideoffsets[6], sidetotals[6]; // used for shadow mesh (NULL on light mesh) @@ -184,18 +228,17 @@ typedef struct shadowmesh_s // these are NULL after Mod_ShadowMesh_Finish is performed, only used // while building meshes shadowmeshvertexhash_t **vertexhashtable, *vertexhashentries; - // element buffer object (stores triangles in video memory) - // (created by Mod_ShadowMesh_Finish if possible) - int ebo3i; - int ebo3s; - // vertex buffer object (stores vertices in video memory) - // (created by Mod_ShadowMesh_Finish if possible) - int vbo; + r_meshbuffer_t *vbo_vertexbuffer; size_t vbooffset_vertex3f; size_t vbooffset_svector3f; size_t vbooffset_tvector3f; size_t vbooffset_normal3f; size_t vbooffset_texcoord2f; + // vertex/index buffers for rendering + // (created by Mod_ShadowMesh_Finish if possible) + r_vertexmesh_t *vertexmesh; // usually NULL + r_meshbuffer_t *vertex3fbuffer; + r_meshbuffer_t *vertexmeshbuffer; // usually NULL } shadowmesh_t; @@ -207,6 +250,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 @@ -231,7 +275,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 { @@ -398,6 +445,7 @@ typedef struct q3shaderinfo_s // dp-specific additions: // shadow control + qboolean dpnortlight; qboolean dpshadow; qboolean dpnoshadow; @@ -415,11 +463,15 @@ 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; float specularpowermod; @@ -432,7 +484,7 @@ typedef enum texturelayertype_e TEXTURELAYERTYPE_INVALID, TEXTURELAYERTYPE_LITTEXTURE, TEXTURELAYERTYPE_TEXTURE, - TEXTURELAYERTYPE_FOG, + TEXTURELAYERTYPE_FOG } texturelayertype_t; @@ -551,6 +603,8 @@ 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; @@ -822,7 +876,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; @@ -904,6 +960,7 @@ typedef struct model_s 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; @@ -959,12 +1016,15 @@ 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) void (*TracePoint)(struct model_s *model, const struct frameblend_s *frameblend, const struct skeleton_s *skeleton, struct trace_s *trace, const vec3_t start, int hitsupercontentsmask); // find the supercontents value at a point in this model int (*PointSuperContents)(struct model_s *model, int frame, const vec3_t point); + // trace a line against geometry in this model and report correct texture (used by r_shadow_bouncegrid) + void (*TraceLineAgainstSurfaces)(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); // fields belonging to some types of model model_sprite_t sprite; model_brush_t brush; @@ -975,6 +1035,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 @@ extern unsigned char *mod_base; //extern cvar_t gl_subdivide_size; // texture fullbrights extern cvar_t r_fullbrights; +extern cvar_t r_enableshadowvolumes; void Mod_Init (void); void Mod_Reload (void); @@ -1033,13 +1097,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; - -typedef struct skeleton_s -{ - const dp_model_t *model; - matrix4x4_t *relativetransforms; -} -skeleton_t; +extern cvar_t r_mipnormalmaps; typedef struct skinfileitem_s { @@ -1111,9 +1169,10 @@ void R_Q1BSP_DrawLight(struct entity_render_s *ent, int numsurfaces, const int * 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); -void Mod_MakeCollisionBIH(dp_model_t *model, qboolean userendersurfaces); +bih_t *Mod_MakeCollisionBIH(dp_model_t *model, qboolean userendersurfaces, bih_t *out); // alias models struct frameblend_s; @@ -1141,6 +1200,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