]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.h
Reworked VM_CL_PolygonBegin/Vertex/End functions to do the commit to the mesh in...
[xonotic/darkplaces.git] / model_shared.h
index 5977d18006c9b3f88263a783557fbfb57ba4f516..db71e4b112dae04b3210def3ec60f47c5f308714 100644 (file)
@@ -101,30 +101,6 @@ 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
-{
-       // 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
@@ -145,11 +121,7 @@ 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;
-       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
@@ -162,19 +134,31 @@ typedef struct surfmesh_s
        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;
@@ -190,9 +174,6 @@ typedef struct surfmesh_s
        // 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
@@ -504,27 +485,6 @@ typedef struct texture_shaderpass_s
 }
 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
@@ -566,6 +526,12 @@ typedef struct texture_s
        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)
@@ -623,9 +589,6 @@ typedef struct texture_s
        // from q3 shaders
        int customblendfunc[2];
 
-       int currentnumlayers;
-       texturelayer_t currentlayers[16];
-
        // q3bsp
        char name[64];
        int surfaceflags;
@@ -651,6 +614,7 @@ typedef struct texture_s
        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
@@ -667,6 +631,11 @@ typedef struct texture_s
 
        // 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;
 
@@ -1115,6 +1084,16 @@ extern unsigned char *mod_base;
 // 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;
+
 void Mod_Init (void);
 void Mod_Reload (void);
 dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk);
@@ -1240,6 +1219,7 @@ texture_t *Mod_Mesh_GetTexture(dp_model_t *mod, const char *name, int defaultdra
 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