- shadowmesh_t *mesh;
- mesh = Mem_Alloc(mempool, sizeof(shadowmesh_t) + maxverts * sizeof(float[3]) + maxverts * sizeof(int[3]) + maxverts * sizeof(int[3]) + SHADOWMESHVERTEXHASH * sizeof(shadowmeshvertexhash_t *) + maxverts * sizeof(shadowmeshvertexhash_t));
- mesh->maxverts = maxverts;
- mesh->maxtriangles = maxverts;
- mesh->numverts = 0;
- mesh->numtriangles = 0;
- mesh->vertex3f = (float *)(mesh + 1);
- mesh->element3i = (int *)(mesh->vertex3f + mesh->maxverts * 3);
- mesh->neighbor3i = (int *)(mesh->element3i + mesh->maxtriangles * 3);
- mesh->vertexhashtable = (shadowmeshvertexhash_t **)(mesh->neighbor3i + mesh->maxtriangles * 3);
- mesh->vertexhashentries = (shadowmeshvertexhash_t *)(mesh->vertexhashtable + SHADOWMESHVERTEXHASH);
- return mesh;
+ shadowmesh_t *newmesh;
+ qbyte *data;
+ int size;
+ size = sizeof(shadowmesh_t);
+ size += maxverts * sizeof(float[3]);
+ if (light)
+ size += maxverts * sizeof(float[11]);
+ size += maxtriangles * sizeof(int[3]);
+ if (neighbors)
+ size += maxtriangles * sizeof(int[3]);
+ if (expandable)
+ size += SHADOWMESHVERTEXHASH * sizeof(shadowmeshvertexhash_t *) + maxverts * sizeof(shadowmeshvertexhash_t);
+ data = Mem_Alloc(mempool, size);
+ newmesh = (void *)data;data += sizeof(*newmesh);
+ newmesh->map_diffuse = map_diffuse;
+ newmesh->map_specular = map_specular;
+ newmesh->map_normal = map_normal;
+ newmesh->maxverts = maxverts;
+ newmesh->maxtriangles = maxtriangles;
+ newmesh->numverts = 0;
+ newmesh->numtriangles = 0;
+
+ newmesh->vertex3f = (void *)data;data += maxverts * sizeof(float[3]);
+ if (light)
+ {
+ newmesh->svector3f = (void *)data;data += maxverts * sizeof(float[3]);
+ newmesh->tvector3f = (void *)data;data += maxverts * sizeof(float[3]);
+ newmesh->normal3f = (void *)data;data += maxverts * sizeof(float[3]);
+ newmesh->texcoord2f = (void *)data;data += maxverts * sizeof(float[2]);
+ }
+ newmesh->element3i = (void *)data;data += maxtriangles * sizeof(int[3]);
+ if (neighbors)
+ {
+ newmesh->neighbor3i = (void *)data;data += maxtriangles * sizeof(int[3]);
+ }
+ if (expandable)
+ {
+ newmesh->vertexhashtable = (void *)data;data += SHADOWMESHVERTEXHASH * sizeof(shadowmeshvertexhash_t *);
+ newmesh->vertexhashentries = (void *)data;data += maxverts * sizeof(shadowmeshvertexhash_t);
+ }
+ return newmesh;