X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_shared.h;h=cf64465f42b4f0d8b12248bb6d622115e4e28d4b;hb=26e5b80cd0a43345efe839789be857f31db1bdc1;hp=54331d1a10b23764b0dd08008ef27901b8297290;hpb=4498a86fd5db6f1066559fae990b648ddfe2df22;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.h b/model_shared.h index 54331d1a..cf64465f 100644 --- a/model_shared.h +++ b/model_shared.h @@ -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 @@ -210,44 +191,29 @@ shadowmeshvertexhash_t; 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; @@ -744,9 +710,6 @@ typedef struct msurface_s 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 @@ -1159,13 +1122,11 @@ void Mod_MakeSortedSurfaces(dp_model_t *mod); // 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); @@ -1260,6 +1221,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