X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=model_shared.c;h=368c1c3af5149915738b575bd923fac7f498a855;hb=720eab4a3bd5ccedd42cb307727a8f80e5914abb;hp=34859f8c8ad611ab30ef73a06c0fcca25c0c6171;hpb=c651b263f8a63fa5846df832051d4f5658680a03;p=xonotic%2Fdarkplaces.git diff --git a/model_shared.c b/model_shared.c index 34859f8c..368c1c3a 100644 --- a/model_shared.c +++ b/model_shared.c @@ -30,8 +30,8 @@ cvar_t r_mipskins = {CVAR_SAVE, "r_mipskins", "0"}; model_t *loadmodel; -// LordHavoc: increased from 512 to 2048 -#define MAX_MOD_KNOWN 2048 +// LordHavoc: was 512 +#define MAX_MOD_KNOWN (MAX_MODELS + 256) static model_t mod_known[MAX_MOD_KNOWN]; rtexturepool_t *mod_shared_texturepool; @@ -178,17 +178,11 @@ static void mod_newmap(void) { for (surfacenum = 0, surface = mod_known[i].brush.data_surfaces;surfacenum < mod_known[i].brush.num_surfaces;surfacenum++, surface++) { - if (surface->stainsamples) + if (surface->lightmapinfo && surface->lightmapinfo->stainsamples) { - ssize = (surface->extents[0] >> 4) + 1; - tsize = (surface->extents[1] >> 4) + 1; - - if (ssize > 256 || tsize > 256) - Host_Error("Bad surface extents"); - - if (surface->stainsamples) - memset(surface->stainsamples, 255, ssize * tsize * 3); - + ssize = (surface->lightmapinfo->extents[0] >> 4) + 1; + tsize = (surface->lightmapinfo->extents[1] >> 4) + 1; + memset(surface->lightmapinfo->stainsamples, 255, ssize * tsize * 3); surface->cached_dlight = true; } } @@ -280,14 +274,6 @@ static model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, Con_DPrintf("loading model %s\n", mod->name); // LordHavoc: unload the existing model in this slot (if there is one) Mod_UnloadModel(mod); - if (isworldmodel) - { - // clear out any stale submodels lying around, as well as the old world model itself - int i; - for (i = 0;i < MAX_MOD_KNOWN;i++) - if (mod_known[i].isworldmodel) - Mod_UnloadModel(mod_known + i); - } // load the model mod->isworldmodel = isworldmodel; @@ -320,6 +306,7 @@ static model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, else if (!memcmp(buf, "IDP2", 4)) Mod_IDP2_Load(mod, buf); else if (!memcmp(buf, "IDP3", 4)) Mod_IDP3_Load(mod, buf); else if (!memcmp(buf, "IDSP", 4)) Mod_IDSP_Load(mod, buf); + else if (!memcmp(buf, "IDS2", 4)) Mod_IDS2_Load(mod, buf); else if (!memcmp(buf, "IBSP", 4)) Mod_IBSP_Load(mod, buf); else if (!memcmp(buf, "ZYMOTICMODEL", 12)) Mod_ZYMOTICMODEL_Load(mod, buf); else if (strlen(mod->name) >= 4 && !strcmp(mod->name - 4, ".map")) Mod_MAP_Load(mod, buf); @@ -384,6 +371,15 @@ void Mod_PurgeUnused(void) Mod_FreeModel(mod); } +// only used during loading! +void Mod_RemoveStaleWorldModels(model_t *skip) +{ + int i; + for (i = 0;i < MAX_MOD_KNOWN;i++) + if (mod_known[i].isworldmodel && skip != &mod_known[i]) + Mod_UnloadModel(mod_known + i); +} + void Mod_LoadModels(void) { int i; @@ -616,13 +612,13 @@ void Mod_ValidateElements(const int *elements, int numtriangles, int numverts, c } // warning: this is an expensive function! -void Mod_BuildNormals(int numverts, int numtriangles, const float *vertex3f, const int *elements, float *normal3f) +void Mod_BuildNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const int *elements, float *normal3f) { int i, tnum; float normal[3], *v; const int *e; // clear the vectors - memset(normal3f, 0, numverts * sizeof(float[3])); + memset(normal3f + 3 * firstvertex, 0, numvertices * sizeof(float[3])); // process each vertex of each triangle and accumulate the results for (tnum = 0, e = elements;tnum < numtriangles;tnum++, e += 3) { @@ -643,7 +639,7 @@ void Mod_BuildNormals(int numverts, int numtriangles, const float *vertex3f, con } // now we could divide the vectors by the number of averaged values on // each vertex... but instead normalize them - for (i = 0, v = normal3f;i < numverts;i++, v += 3) + for (i = 0, v = normal3f + 3 * firstvertex;i < numvertices;i++, v += 3) VectorNormalize(v); } @@ -697,18 +693,18 @@ void Mod_BuildBumpVectors(const float *v0, const float *v1, const float *v2, con } // warning: this is a very expensive function! -void Mod_BuildTextureVectorsAndNormals(int numverts, int numtriangles, const float *vertex3f, const float *texcoord2f, const int *elements, float *svector3f, float *tvector3f, float *normal3f) +void Mod_BuildTextureVectorsAndNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const float *texcoord2f, const int *elements, float *svector3f, float *tvector3f, float *normal3f) { int i, tnum; float sdir[3], tdir[3], normal[3], *v; const int *e; // clear the vectors if (svector3f) - memset(svector3f, 0, numverts * sizeof(float[3])); + memset(svector3f + 3 * firstvertex, 0, numvertices * sizeof(float[3])); if (tvector3f) - memset(tvector3f, 0, numverts * sizeof(float[3])); + memset(tvector3f + 3 * firstvertex, 0, numvertices * sizeof(float[3])); if (normal3f) - memset(normal3f, 0, numverts * sizeof(float[3])); + memset(normal3f + 3 * firstvertex, 0, numvertices * sizeof(float[3])); // process each vertex of each triangle and accumulate the results for (tnum = 0, e = elements;tnum < numtriangles;tnum++, e += 3) { @@ -745,27 +741,25 @@ void Mod_BuildTextureVectorsAndNormals(int numverts, int numtriangles, const flo // each vertex... but instead normalize them // 4 assignments, 1 divide, 1 sqrt, 2 adds, 6 multiplies if (svector3f) - for (i = 0, v = svector3f;i < numverts;i++, v += 3) + for (i = 0, v = svector3f + 3 * firstvertex;i < numvertices;i++, v += 3) VectorNormalize(v); // 4 assignments, 1 divide, 1 sqrt, 2 adds, 6 multiplies if (tvector3f) - for (i = 0, v = tvector3f;i < numverts;i++, v += 3) + for (i = 0, v = tvector3f + 3 * firstvertex;i < numvertices;i++, v += 3) VectorNormalize(v); // 4 assignments, 1 divide, 1 sqrt, 2 adds, 6 multiplies if (normal3f) - for (i = 0, v = normal3f;i < numverts;i++, v += 3) + for (i = 0, v = normal3f + 3 * firstvertex;i < numvertices;i++, v += 3) VectorNormalize(v); } -surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, int numcollisionvertices, int numcollisiontriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors) +surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors) { surfmesh_t *mesh; qbyte *data; - mesh = Mem_Alloc(mempool, sizeof(surfmesh_t) + numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (detailtexcoords ? 2 : 0) + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + 3) * sizeof(int) + numcollisionvertices * sizeof(float[3]) + numcollisiontriangles * sizeof(int[3])); + mesh = Mem_Alloc(mempool, sizeof(surfmesh_t) + numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (detailtexcoords ? 2 : 0) + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + 3 + (neighbors ? 3 : 0)) * sizeof(int)); mesh->num_vertices = numvertices; mesh->num_triangles = numtriangles; - mesh->num_collisionvertices = numcollisionvertices; - mesh->num_collisiontriangles = numcollisiontriangles; data = (qbyte *)(mesh + 1); if (mesh->num_vertices) { @@ -785,12 +779,10 @@ surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriang if (mesh->num_triangles) { mesh->data_element3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles; - mesh->data_neighbor3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles; + mesh->data_element3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles; + if (neighbors) + mesh->data_neighbor3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles; } - if (mesh->num_collisionvertices) - mesh->data_collisionvertex3f = (float *)data, data += sizeof(float[3]) * mesh->num_collisionvertices; - if (mesh->num_collisiontriangles) - mesh->data_collisionelement3i = (int *)data, data += sizeof(int[3]) * mesh->num_collisiontriangles; return mesh; }