X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=model_shared.h;h=ff098bbfad02b37420cffc9c66cadf739d8d6cc3;hp=e02b49e441d5ed404a90a2d411a92a4df70771b9;hb=6744466ae09f99384c8957c1622b21b351b0fb69;hpb=3797d3256c2b3eebe81d26845ee7ba205be417df diff --git a/model_shared.h b/model_shared.h index e02b49e4..ff098bbf 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; @@ -232,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 { @@ -386,6 +432,7 @@ typedef struct q3shaderinfo_s char name[Q3PATHLENGTH]; #define Q3SHADERINFO_COMPARE_START surfaceparms int surfaceparms; + int surfaceflags; int textureflags; int numlayers; qboolean lighting; @@ -399,12 +446,16 @@ typedef struct q3shaderinfo_s // dp-specific additions: // shadow control + qboolean dpnortlight; qboolean dpshadow; qboolean dpnoshadow; // add collisions to all triangles of the surface qboolean dpmeshcollisions; + // kill shader based on cvar checks + qboolean dpshaderkill; + // fake reflection char dpreflectcube[Q3PATHLENGTH]; @@ -416,15 +467,23 @@ 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; + float offsetbias; // 0 is normal, 1 leads to alpha 0 being neutral and alpha 1 pushing "out" + + // polygonoffset (only used if Q3TEXTUREFLAG_POLYGONOFFSET) + float biaspolygonoffset, biaspolygonfactor; // gloss float specularscalemod; float specularpowermod; -#define Q3SHADERINFO_COMPARE_END specularpowermod + + // rtlightning ambient addition + float rtlightambient; +#define Q3SHADERINFO_COMPARE_END rtlightambient } q3shaderinfo_t; @@ -433,7 +492,7 @@ typedef enum texturelayertype_e TEXTURELAYERTYPE_INVALID, TEXTURELAYERTYPE_LITTEXTURE, TEXTURELAYERTYPE_TEXTURE, - TEXTURELAYERTYPE_FOG, + TEXTURELAYERTYPE_FOG } texturelayertype_t; @@ -541,7 +600,6 @@ typedef struct texture_s char name[64]; int surfaceflags; int supercontents; - int surfaceparms; int textureflags; // reflection @@ -552,15 +610,20 @@ 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; + float offsetbias; // gloss float specularscalemod; float specularpowermod; + + // diffuse and ambient + float rtlightambient; } texture_t; @@ -824,7 +887,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; @@ -906,6 +971,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; @@ -913,10 +979,10 @@ 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) + float num_posescale; // scaling factor from origin in poses7s format (includes divide by 32767) + float num_poseinvscale; // scaling factor to origin in poses7s format (includes multiply by 32767) int num_poses; - short *data_poses6s; // origin xyz, quat xyz, w implied negative, unit length, values normalized to +/-32767 range + short *data_poses7s; // origin xyz, quat xyzw, unit length, values normalized to +/-32767 range float *data_baseboneposeinverse; // textures of this model int num_textures; @@ -961,12 +1027,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; @@ -977,6 +1046,10 @@ 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; + float lightmapscale; } dp_model_t; @@ -989,6 +1062,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); @@ -1035,13 +1109,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 { @@ -1113,9 +1181,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;