From c1eb3e77c3480e5c3d7cbc4edbf8eea74d0dedd2 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 19 May 2012 09:15:26 +0900 Subject: [PATCH] Process each vertex texcoord only once. Double converting texcoords results in 0,0 for all affected texcoords. Mr Fixit was looking rather ill. Now he looks weird (something wrong in the renderer?). --- libs/models/iqm/sw_model_iqm.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/libs/models/iqm/sw_model_iqm.c b/libs/models/iqm/sw_model_iqm.c index ee6f528d0..dd8dfd55e 100644 --- a/libs/models/iqm/sw_model_iqm.c +++ b/libs/models/iqm/sw_model_iqm.c @@ -139,7 +139,12 @@ sw_iqm_load_textures (iqm_t *iqm) dstring_t *str = dstring_new (); swiqm_t *sw = (swiqm_t *) iqm->extra_data; tex_t *tex; + byte *done_verts; + int bytes; + bytes = (iqm->num_verts + 7) / 8; + done_verts = alloca (bytes); + memset (done_verts, 0, bytes); sw->skins = malloc (iqm->num_meshes * sizeof (tex_t)); for (i = 0; i < iqm->num_meshes; i++) { for (j = 0; j < i; j++) { @@ -153,14 +158,19 @@ sw_iqm_load_textures (iqm_t *iqm) dstring_copystr (str, iqm->text + iqm->meshes[i].material); QFS_StripExtension (str->str, str->str); if ((tex = LoadImage (va ("textures/%s", str->str)))) - sw->skins[i] = convert_tex (tex); + tex = sw->skins[i] = convert_tex (tex); else - sw->skins[i] = &null_texture; + tex = sw->skins[i] = &null_texture; for (j = 0; j < (int) iqm->meshes[i].num_triangles * 3; j++) { int ind = iqm->meshes[i].first_triangle * 3 + j; int vind = iqm->elements[ind]; byte *vert = iqm->vertices + iqm->stride * vind; byte *tc = vert + sw->texcoord->offset; + + if (done_verts[vind / 8] & (1 << (vind % 8))) + continue; + done_verts[vind / 8] |= (1 << (vind % 8)); + *(int32_t *) (tc + 0) = *(float *) (tc + 0) * tex->width; *(int32_t *) (tc + 4) = *(float *) (tc + 4) * tex->height; }