-void Mod_CreateCollisionMesh(dp_model_t *mod)
-{
- int k, numcollisionmeshtriangles;
- qboolean usesinglecollisionmesh = false;
- const msurface_t *surface = NULL;
-
- mempool_t *mempool = mod->mempool;
- if (!mempool && mod->brush.parentmodel)
- mempool = mod->brush.parentmodel->mempool;
- // make a single combined collision mesh for physics engine use
- // TODO rewrite this to use the collision brushes as source, to fix issues with e.g. common/caulk which creates no drawsurface
- numcollisionmeshtriangles = 0;
- for (k = 0;k < mod->nummodelsurfaces;k++)
- {
- surface = mod->data_surfaces + mod->firstmodelsurface + k;
- if (!strcmp(surface->texture->name, "collision") || !strcmp(surface->texture->name, "collisionconvex")) // found collision mesh
- {
- usesinglecollisionmesh = true;
- numcollisionmeshtriangles = surface->num_triangles;
- break;
- }
- if (!(surface->texture->supercontents & SUPERCONTENTS_SOLID))
- continue;
- numcollisionmeshtriangles += surface->num_triangles;
- }
- mod->brush.collisionmesh = Mod_ShadowMesh_Begin(mempool, numcollisionmeshtriangles * 3, numcollisionmeshtriangles, NULL, NULL, NULL, false, true);
- if (usesinglecollisionmesh)
- Mod_ShadowMesh_AddMesh(mempool, mod->brush.collisionmesh, NULL, NULL, NULL, mod->surfmesh.data_vertex3f, NULL, NULL, NULL, NULL, surface->num_triangles, (mod->surfmesh.data_element3i + 3 * surface->num_firsttriangle));
- else
- {
- for (k = 0;k < mod->nummodelsurfaces;k++)
- {
- surface = mod->data_surfaces + mod->firstmodelsurface + k;
- if (!(surface->texture->supercontents & SUPERCONTENTS_SOLID))
- continue;
- Mod_ShadowMesh_AddMesh(mempool, mod->brush.collisionmesh, NULL, NULL, NULL, mod->surfmesh.data_vertex3f, NULL, NULL, NULL, NULL, surface->num_triangles, (mod->surfmesh.data_element3i + 3 * surface->num_firsttriangle));
- }
- }
- mod->brush.collisionmesh = Mod_ShadowMesh_Finish(mempool, mod->brush.collisionmesh, false, false);
-}
-