}
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
-{
- // 88 bytes
- float vertex3f[3];
- float color4f[4];
- float texcoordtexture2f[2];
- float texcoordlightmap2f[2];
- float svector3f[3];
- float tvector3f[3];
- float normal3f[3];
- unsigned char skeletalindex4ub[4];
- unsigned char skeletalweight4ub[4];
-}
-r_vertexmesh_t;
-
typedef struct r_meshbuffer_s
{
int bufferobject; // OpenGL
// 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;
- int 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;
- int data_element3s_bufferoffset;
+
// vertex data in system memory
int num_vertices; // number of vertices in the mesh
float *data_vertex3f; // float[verts*3] vertex locations
unsigned char *data_skeletalindex4ub;
unsigned char *data_skeletalweight4ub;
int *data_lightmapoffsets; // index into surface's lightmap samples for vertex lighting
- r_vertexmesh_t *data_vertexmesh; // interleaved arrays for D3D
- // vertex buffer object (stores geometry in video memory)
- r_meshbuffer_t *vbo_vertexbuffer;
- int vbooffset_vertex3f;
- int vbooffset_svector3f;
- int vbooffset_tvector3f;
- int vbooffset_normal3f;
- int vbooffset_texcoordtexture2f;
- int vbooffset_texcoordlightmap2f;
- int vbooffset_lightmapcolor4f;
- int vbooffset_skeletalindex4ub;
- int vbooffset_skeletalweight4ub;
- int vbooffset_vertexmesh;
+ // index buffer - only one of these will be non-NULL
+ r_meshbuffer_t *data_element3i_indexbuffer;
+ int 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;
+ int data_element3s_bufferoffset;
+ // vertex buffers
+ r_meshbuffer_t *data_vertex3f_vertexbuffer;
+ int data_vertex3f_bufferoffset;
+ r_meshbuffer_t *data_svector3f_vertexbuffer;
+ int data_svector3f_bufferoffset;
+ r_meshbuffer_t *data_tvector3f_vertexbuffer;
+ int data_tvector3f_bufferoffset;
+ r_meshbuffer_t *data_normal3f_vertexbuffer;
+ int data_normal3f_bufferoffset;
+ r_meshbuffer_t *data_texcoordtexture2f_vertexbuffer;
+ int data_texcoordtexture2f_bufferoffset;
+ r_meshbuffer_t *data_texcoordlightmap2f_vertexbuffer;
+ int data_texcoordlightmap2f_bufferoffset;
+ r_meshbuffer_t *data_lightmapcolor4f_vertexbuffer;
+ int data_lightmapcolor4f_bufferoffset;
+ r_meshbuffer_t *data_skeletalindex4ub_vertexbuffer;
+ int data_skeletalindex4ub_bufferoffset;
+ r_meshbuffer_t *data_skeletalweight4ub_vertexbuffer;
+ int data_skeletalweight4ub_bufferoffset;
// morph blending, these are zero if model is skeletal or static
int num_morphframes;
struct md3vertex_s *data_morphmd3vertex;
// set if there is some kind of animation on this model
qboolean isanimated;
- // vertex and index buffers for rendering
- r_meshbuffer_t *vertexmesh_vertexbuffer;
-
// dynamic mesh building support (Mod_Mesh_*)
int num_vertexhashsize; // always pow2 for simple masking
int *data_vertexhash; // hash table - wrapping buffer for storing index of similar vertex with -1 as terminator
typedef struct shadowmesh_s
{
- // next mesh in chain
- struct shadowmesh_s *next;
- // used for light mesh (NULL on shadow mesh)
- rtexture_t *map_diffuse;
- rtexture_t *map_specular;
- rtexture_t *map_normal;
- // buffer sizes
- int numverts, maxverts;
- int numtriangles, maxtriangles;
- // used always
+ mempool_t *mempool;
+
+ int numverts;
+ int maxverts;
float *vertex3f;
- // used for light mesh (NULL on shadow mesh)
- float *svector3f;
- float *tvector3f;
- float *normal3f;
- float *texcoord2f;
- // used always
+ r_meshbuffer_t *vbo_vertexbuffer;
+ int vbooffset_vertex3f;
+
+ int numtriangles;
+ int maxtriangles;
int *element3i;
r_meshbuffer_t *element3i_indexbuffer;
int element3i_bufferoffset;
unsigned short *element3s;
r_meshbuffer_t *element3s_indexbuffer;
int element3s_bufferoffset;
- // vertex/index buffers for rendering
- // (created by Mod_ShadowMesh_Finish if possible)
- r_vertexmesh_t *vertexmesh; // usually NULL
+
// used for shadow mapping cubemap side partitioning
int sideoffsets[6], sidetotals[6];
+
// these are NULL after Mod_ShadowMesh_Finish is performed, only used
// while building meshes
shadowmeshvertexhash_t **vertexhashtable, *vertexhashentries;
- r_meshbuffer_t *vbo_vertexbuffer;
- int vbooffset_vertex3f;
- int vbooffset_svector3f;
- int vbooffset_tvector3f;
- int vbooffset_normal3f;
- int vbooffset_texcoord2f;
- int vbooffset_vertexmesh;
}
shadowmesh_t;
}
texture_shaderpass_t;
-typedef enum texturelayertype_e
-{
- TEXTURELAYERTYPE_INVALID,
- TEXTURELAYERTYPE_LITTEXTURE,
- TEXTURELAYERTYPE_TEXTURE,
- TEXTURELAYERTYPE_FOG
-}
-texturelayertype_t;
-
-typedef struct texturelayer_s
-{
- texturelayertype_t type;
- qboolean depthmask;
- int blendfunc1;
- int blendfunc2;
- rtexture_t *texture;
- matrix4x4_t texmatrix;
- vec4_t color;
-}
-texturelayer_t;
-
typedef struct texture_s
{
- // q1bsp
// name
- //char name[16];
+ char name[64];
+
+ // q1bsp
// size
unsigned int width, height;
// SURF_ flags
void *update_lastrenderentity;
// the current alpha of this texture (may be affected by r_wateralpha, also basealpha, and ent->alpha)
float currentalpha;
+ // current value of blendfunc - one of:
+ // {GL_SRC_ALPHA, GL_ONE}
+ // {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}
+ // {customblendfunc[0], customblendfunc[1]}
+ // {GL_ONE, GL_ZERO}
+ int currentblendfunc[2];
// the current texture frame in animation
struct texture_s *currentframe;
// current texture transform matrix (used for water scrolling)
// from q3 shaders
int customblendfunc[2];
- int currentnumlayers;
- texturelayer_t currentlayers[16];
-
// q3bsp
- char name[64];
int surfaceflags;
int supercontents;
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
+ float refractive_index; // used by r_shadow_bouncegrid for bending photons for refracted light
int camera_entity; // entity number for use by cameras
// offsetmapping
// diffuse and ambient
float rtlightambient;
+
+ // used by Mod_Mesh_GetTexture for drawflag and materialflag overrides, to disambiguate the same texture with different hints
+ int mesh_drawflag;
+ int mesh_defaulttexflags;
+ int mesh_defaultmaterialflags;
}
texture_t;
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
int num_vertices; // number of vertices
int num_firstvertex; // first vertex
- // shadow volume building information
- int num_firstshadowmeshtriangle; // index into model->brush.shadowmesh
-
// mesh information for collisions (only used by q3bsp curves)
int num_collisiontriangles; // q3bsp
int num_collisionvertices; // q3bsp
- int deprecatedq3num_collisionbboxstride;
- int deprecatedq3num_bboxstride;
- // FIXME: collisionmarkframe should be kept in a separate array
- int deprecatedq3collisionmarkframe; // q3bsp // don't collide twice in one trace
// used by Mod_Mesh_Finalize when building sortedmodelsurfaces
qboolean included;
}
model_brushq1_t;
-typedef struct model_brushq2_s
-{
- int dummy; // MSVC can't handle an empty struct
-}
-model_brushq2_t;
-
typedef struct model_brushq3_s
{
int num_models;
rtexture_t **data_lightmaps;
rtexture_t **data_deluxemaps;
- // voxel light data with directional shading
+ // voxel light data with directional shading - data for cpu sampling of it...
int num_lightgrid;
q3dlightgrid_t *data_lightgrid;
// size of each cell (may vary by map, typically 64 64 128)
int num_lightgrid_isize[3];
// transform modelspace coordinates to lightgrid index
matrix4x4_t num_lightgrid_indexfromworld;
+ // parameters for fragment shader to sample the texture version of it:
+ int lightgridtexturesize[3]; // 3 layers tall (ambient, lightcolor, lightdir)
+ matrix4x4_t lightgridworldtotexturematrix;
+ rtexture_t *lightgridtexture;
// true if this q3bsp file has been detected as using deluxemapping
// (lightmap texture pairs, every odd one is never directly refernced,
model_sprite_t sprite;
model_brush_t brush;
model_brushq1_t brushq1;
- model_brushq2_t brushq2;
model_brushq3_t brushq3;
// flags this model for offseting sounds to the model center (used by brush models)
int soundfromcenter;
// texture fullbrights
extern cvar_t r_fullbrights;
+extern cvar_t mod_noshader_default_offsetmapping;
+extern cvar_t mod_q3shader_default_offsetmapping;
+extern cvar_t mod_q3shader_default_offsetmapping_scale;
+extern cvar_t mod_q3shader_default_offsetmapping_bias;
+extern cvar_t mod_q3shader_default_polygonoffset;
+extern cvar_t mod_q3shader_default_polygonfactor;
+extern cvar_t mod_q3shader_default_refractive_index;
+extern cvar_t mod_q3shader_force_addalpha;
+extern cvar_t mod_q3shader_force_terrain_alphaflag;
+extern cvar_t mod_q3bsp_lightgrid_texture;
+extern cvar_t mod_q3bsp_lightgrid_world_surfaces;
+extern cvar_t mod_q3bsp_lightgrid_bsp_surfaces;
+
void Mod_Init (void);
void Mod_Reload (void);
dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk);
// 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 expandable);
-shadowmesh_t *Mod_ShadowMesh_ReAlloc(mempool_t *mempool, shadowmesh_t *oldmesh, int light);
-int Mod_ShadowMesh_AddVertex(shadowmesh_t *mesh, float *vertex14f);
-void Mod_ShadowMesh_AddTriangle(mempool_t *mempool, shadowmesh_t *mesh, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, float *vertex14f);
-void Mod_ShadowMesh_AddMesh(mempool_t *mempool, shadowmesh_t *mesh, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, const float *vertex3f, const float *svector3f, const float *tvector3f, const float *normal3f, const float *texcoord2f, int numtris, const int *element3i);
-shadowmesh_t *Mod_ShadowMesh_Begin(mempool_t *mempool, int maxverts, int maxtriangles, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, int light, int expandable);
-shadowmesh_t *Mod_ShadowMesh_Finish(mempool_t *mempool, shadowmesh_t *firstmesh, qboolean light, qboolean createvbo);
+shadowmesh_t *Mod_ShadowMesh_Alloc(mempool_t *mempool, int maxverts, int maxtriangles);
+int Mod_ShadowMesh_AddVertex(shadowmesh_t *mesh, const float *vertex3f);
+void Mod_ShadowMesh_AddMesh(shadowmesh_t *mesh, const float *vertex3f, int numtris, const int *element3i);
+shadowmesh_t *Mod_ShadowMesh_Begin(mempool_t *mempool, int maxverts, int maxtriangles);
+shadowmesh_t *Mod_ShadowMesh_Finish(shadowmesh_t *firstmesh, qboolean createvbo);
void Mod_ShadowMesh_CalcBBox(shadowmesh_t *firstmesh, vec3_t mins, vec3_t maxs, vec3_t center, float *radius);
void Mod_ShadowMesh_Free(shadowmesh_t *mesh);
void Mod_Mesh_Create(dp_model_t *mod, const char *name);
void Mod_Mesh_Destroy(dp_model_t *mod);
void Mod_Mesh_Reset(dp_model_t *mod);
-texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name, int defaultdrawflags, int defaulttexflags, int addmaterialflags);
+texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name, int defaultdrawflags, int defaulttexflags, int defaultmaterialflags);
msurface_t *Mod_Mesh_AddSurface(dp_model_t *mod, texture_t *tex, qboolean batchwithprevioussurface);
int Mod_Mesh_IndexForVertex(dp_model_t *mod, msurface_t *surf, float x, float y, float z, float nx, float ny, float nz, float s, float t, float u, float v, float r, float g, float b, float a);
void Mod_Mesh_AddTriangle(dp_model_t *mod, msurface_t *surf, int e0, int e1, int e2);
+void Mod_Mesh_Validate(dp_model_t *mod);
void Mod_Mesh_Finalize(dp_model_t *mod);
// Collision optimization using Bounding Interval Hierarchy