strlcpy(name, mod->name, sizeof(name));
isworldmodel = mod->isworldmodel;
used = mod->used;
- if (mod->surfmesh.ebo)
- R_Mesh_DestroyBufferObject(mod->surfmesh.ebo);
+ if (mod->surfmesh.ebo3i)
+ R_Mesh_DestroyBufferObject(mod->surfmesh.ebo3i);
+ if (mod->surfmesh.ebo3s)
+ R_Mesh_DestroyBufferObject(mod->surfmesh.ebo3s);
if (mod->surfmesh.vbo)
R_Mesh_DestroyBufferObject(mod->surfmesh.vbo);
// free textures/memory attached to the model
void Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors)
{
unsigned char *data;
- data = (unsigned char *)Mem_Alloc(mempool, numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + (neighbors ? 3 : 0)) * sizeof(int));
+ data = (unsigned char *)Mem_Alloc(mempool, numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + (neighbors ? 3 : 0)) * sizeof(int) + (numvertices <= 65536 ? numtriangles * sizeof(unsigned short[3]) : 0));
loadmodel->surfmesh.num_vertices = numvertices;
loadmodel->surfmesh.num_triangles = numtriangles;
if (loadmodel->surfmesh.num_vertices)
loadmodel->surfmesh.data_element3i = (int *)data, data += sizeof(int[3]) * loadmodel->surfmesh.num_triangles;
if (neighbors)
loadmodel->surfmesh.data_neighbor3i = (int *)data, data += sizeof(int[3]) * loadmodel->surfmesh.num_triangles;
+ if (loadmodel->surfmesh.num_vertices <= 65536)
+ loadmodel->surfmesh.data_element3s = (unsigned short *)data, data += sizeof(unsigned short[3]) * loadmodel->surfmesh.num_triangles;
}
}
if (light)
size += maxverts * sizeof(float[11]);
size += maxtriangles * sizeof(int[3]);
+ if (maxverts <= 65536)
+ size += maxtriangles * sizeof(unsigned short[3]);
if (neighbors)
size += maxtriangles * sizeof(int[3]);
if (expandable)
newmesh->vertexhashtable = (shadowmeshvertexhash_t **)data;data += SHADOWMESHVERTEXHASH * sizeof(shadowmeshvertexhash_t *);
newmesh->vertexhashentries = (shadowmeshvertexhash_t *)data;data += maxverts * sizeof(shadowmeshvertexhash_t);
}
+ if (maxverts <= 65536)
+ newmesh->element3s = (unsigned short *)data;data += maxtriangles * sizeof(unsigned short[3]);
return newmesh;
}
// element buffer is easy because it's just one array
if (mesh->numtriangles)
- mesh->ebo = R_Mesh_CreateStaticBufferObject(GL_ELEMENT_ARRAY_BUFFER_ARB, mesh->element3i, mesh->numtriangles * sizeof(int[3]), "shadowmesh");
+ {
+ if (mesh->element3s)
+ mesh->ebo3s = R_Mesh_CreateStaticBufferObject(GL_ELEMENT_ARRAY_BUFFER_ARB, mesh->element3s, mesh->numtriangles * sizeof(unsigned short[3]), "shadowmesh");
+ else
+ mesh->ebo3i = R_Mesh_CreateStaticBufferObject(GL_ELEMENT_ARRAY_BUFFER_ARB, mesh->element3i, mesh->numtriangles * sizeof(unsigned int[3]), "shadowmesh");
+ }
// vertex buffer is several arrays and we put them in the same buffer
//
newmesh = Mod_ShadowMesh_ReAlloc(mempool, mesh, light, neighbors);
newmesh->next = firstmesh;
firstmesh = newmesh;
+ if (newmesh->element3s)
+ {
+ int i;
+ for (i = 0;i < newmesh->numtriangles*3;i++)
+ newmesh->element3s[i] = newmesh->element3i[i];
+ }
if (createvbo)
Mod_ShadowMesh_CreateVBOs(newmesh);
}
shadowmesh_t *nextmesh;
for (;mesh;mesh = nextmesh)
{
- if (mesh->ebo)
- R_Mesh_DestroyBufferObject(mesh->ebo);
+ if (mesh->ebo3i)
+ R_Mesh_DestroyBufferObject(mesh->ebo3i);
+ if (mesh->ebo3s)
+ R_Mesh_DestroyBufferObject(mesh->ebo3s);
if (mesh->vbo)
R_Mesh_DestroyBufferObject(mesh->vbo);
nextmesh = mesh->next;
// element buffer is easy because it's just one array
if (loadmodel->surfmesh.num_triangles)
- loadmodel->surfmesh.ebo = R_Mesh_CreateStaticBufferObject(GL_ELEMENT_ARRAY_BUFFER_ARB, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.num_triangles * sizeof(int[3]), loadmodel->name);
+ {
+ if (loadmodel->surfmesh.data_element3s)
+ {
+ int i;
+ for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
+ loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
+ loadmodel->surfmesh.ebo3s = R_Mesh_CreateStaticBufferObject(GL_ELEMENT_ARRAY_BUFFER_ARB, loadmodel->surfmesh.data_element3s, loadmodel->surfmesh.num_triangles * sizeof(unsigned short[3]), loadmodel->name);
+ }
+ else
+ loadmodel->surfmesh.ebo3i = R_Mesh_CreateStaticBufferObject(GL_ELEMENT_ARRAY_BUFFER_ARB, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.num_triangles * sizeof(unsigned int[3]), loadmodel->name);
+ }
// vertex buffer is several arrays and we put them in the same buffer
//