mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-11 07:11:39 +00:00
When deleting GL skin textures, handle the case where they are aliased.
That is, have a second loop over all models run for each deleted tex and null the texname. This is ugly, sure, but it's better than calling glDeleteTextures on stale names. git-svn-id: https://svn.eduke32.com/eduke32@2619 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
28bbde2377
commit
6ac80f29ff
1 changed files with 70 additions and 26 deletions
|
@ -155,50 +155,93 @@ void freeallmodels()
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearskins()
|
|
||||||
|
// Skin texture names can be aliased! This is ugly, but at least correct.
|
||||||
|
static void nullskintexids(GLuint texid)
|
||||||
{
|
{
|
||||||
mdmodel_t *m;
|
|
||||||
int32_t i, j;
|
int32_t i, j;
|
||||||
|
|
||||||
for (i=0; i<nextmodelid; i++)
|
for (i=0; i<nextmodelid; i++)
|
||||||
{
|
{
|
||||||
m = models[i];
|
mdmodel_t *m = models[i];
|
||||||
if (m->mdnum == 1)
|
|
||||||
|
if (m->mdnum == 2 || m->mdnum == 3)
|
||||||
{
|
{
|
||||||
voxmodel_t *v = (voxmodel_t *)m;
|
|
||||||
for (j=0; j<MAXPALOOKUPS; j++)
|
|
||||||
{
|
|
||||||
if (v->texid[j]) bglDeleteTextures(1,(GLuint *)&v->texid[j]);
|
|
||||||
v->texid[j] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (m->mdnum == 2 || m->mdnum == 3)
|
|
||||||
{
|
|
||||||
md2model_t *m2 = (md2model_t *)m;
|
|
||||||
mdskinmap_t *sk;
|
mdskinmap_t *sk;
|
||||||
|
md2model_t *m2 = (md2model_t *)m;
|
||||||
|
|
||||||
for (j=0; j<m2->numskins*(HICEFFECTMASK+1); j++)
|
for (j=0; j<m2->numskins*(HICEFFECTMASK+1); j++)
|
||||||
{
|
if (m2->texid[j] == texid)
|
||||||
if (m2->texid[j]) bglDeleteTextures(1,(GLuint *)&m2->texid[j]);
|
m2->texid[j] = 0;
|
||||||
m2->texid[j] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (sk=m2->skinmap; sk; sk=sk->next)
|
for (sk=m2->skinmap; sk; sk=sk->next)
|
||||||
for (j=0; j<(HICEFFECTMASK+1); j++)
|
for (j=0; j<(HICEFFECTMASK+1); j++)
|
||||||
|
if (sk->texid[j] == texid)
|
||||||
|
sk->texid[j] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearskins()
|
||||||
|
{
|
||||||
|
int32_t i, j;
|
||||||
|
|
||||||
|
for (i=0; i<nextmodelid; i++)
|
||||||
|
{
|
||||||
|
mdmodel_t *m = models[i];
|
||||||
|
|
||||||
|
if (m->mdnum == 1)
|
||||||
|
{
|
||||||
|
voxmodel_t *v = (voxmodel_t *)m;
|
||||||
|
|
||||||
|
for (j=0; j<MAXPALOOKUPS; j++)
|
||||||
|
if (v->texid[j])
|
||||||
{
|
{
|
||||||
if (sk->texid[j]) bglDeleteTextures(1,(GLuint *)&sk->texid[j]);
|
bglDeleteTextures(1, &v->texid[j]);
|
||||||
sk->texid[j] = 0;
|
v->texid[j] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (m->mdnum == 2 || m->mdnum == 3)
|
||||||
|
{
|
||||||
|
mdskinmap_t *sk;
|
||||||
|
md2model_t *m2 = (md2model_t *)m;
|
||||||
|
|
||||||
|
for (j=0; j<m2->numskins*(HICEFFECTMASK+1); j++)
|
||||||
|
if (m2->texid[j])
|
||||||
|
{
|
||||||
|
GLuint otexid = m2->texid[j];
|
||||||
|
|
||||||
|
bglDeleteTextures(1, &m2->texid[j]);
|
||||||
|
m2->texid[j] = 0;
|
||||||
|
|
||||||
|
nullskintexids(otexid);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (sk=m2->skinmap; sk; sk=sk->next)
|
||||||
|
for (j=0; j<(HICEFFECTMASK+1); j++)
|
||||||
|
if (sk->texid[j])
|
||||||
|
{
|
||||||
|
GLuint otexid = sk->texid[j];
|
||||||
|
|
||||||
|
bglDeleteTextures(1, &sk->texid[j]);
|
||||||
|
sk->texid[j] = 0;
|
||||||
|
|
||||||
|
nullskintexids(otexid);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<MAXVOXELS; i++)
|
for (i=0; i<MAXVOXELS; i++)
|
||||||
{
|
{
|
||||||
voxmodel_t *v = (voxmodel_t *)voxmodels[i]; if (!v) continue;
|
voxmodel_t *v = voxmodels[i];
|
||||||
|
if (!v) continue;
|
||||||
|
|
||||||
for (j=0; j<MAXPALOOKUPS; j++)
|
for (j=0; j<MAXPALOOKUPS; j++)
|
||||||
{
|
if (v->texid[j])
|
||||||
if (v->texid[j]) bglDeleteTextures(1,(GLuint *)&v->texid[j]);
|
{
|
||||||
v->texid[j] = 0;
|
bglDeleteTextures(1, &v->texid[j]);
|
||||||
}
|
v->texid[j] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,7 +506,8 @@ int32_t md_defineskin(int32_t modelid, const char *skinfn, int32_t palnum, int32
|
||||||
|
|
||||||
skl = NULL;
|
skl = NULL;
|
||||||
for (sk = m->skinmap; sk; skl = sk, sk = sk->next)
|
for (sk = m->skinmap; sk; skl = sk, sk = sk->next)
|
||||||
if (sk->palette == (uint8_t)palnum && skinnum == sk->skinnum && surfnum == sk->surfnum) break;
|
if (sk->palette == (uint8_t)palnum && skinnum == sk->skinnum && surfnum == sk->surfnum)
|
||||||
|
break;
|
||||||
if (!sk)
|
if (!sk)
|
||||||
{
|
{
|
||||||
sk = (mdskinmap_t *)Bcalloc(1,sizeof(mdskinmap_t));
|
sk = (mdskinmap_t *)Bcalloc(1,sizeof(mdskinmap_t));
|
||||||
|
|
Loading…
Reference in a new issue