merged image_loadskin and image_freeskin into Mod_LoadSkinFrame
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 23 Apr 2007 18:11:15 +0000 (18:11 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 23 Apr 2007 18:11:15 +0000 (18:11 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7158 d7cf8633-e32d-0410-b094-e92efae38249

image.c
image.h
model_shared.c

diff --git a/image.c b/image.c
index 2624544..7f5ed1f 100644 (file)
--- a/image.c
+++ b/image.c
@@ -762,30 +762,16 @@ unsigned char *LoadWAL (const unsigned char *f, int filesize, int matchwidth, in
 }
 
 
-static void Image_StripImageExtension (const char *in, char *out, size_t size_out)
+void Image_StripImageExtension (const char *in, char *out, size_t size_out)
 {
-       const char *end, *temp;
+       const char *ext;
 
        if (size_out == 0)
                return;
 
-       end = in + strlen(in);
-       if ((end - in) >= 4)
-       {
-               temp = end - 4;
-               if (strcmp(temp, ".tga") == 0
-                || strcmp(temp, ".pcx") == 0
-                || strcmp(temp, ".lmp") == 0
-                || strcmp(temp, ".png") == 0
-                || strcmp(temp, ".jpg") == 0)
-                       end = temp;
-               while (in < end && size_out > 1)
-               {
-                       *out++ = *in++;
-                       size_out--;
-               }
-               *out++ = 0;
-       }
+       ext = FS_FileExtension(in);
+       if (ext && (!strcmp(ext, "tga") || !strcmp(ext, "pcx") || !strcmp(ext, "lmp") || !strcmp(ext, "png") || !strcmp(ext, "jpg")))
+               FS_StripExtension(in, out, size_out);
        else
                strlcpy(out, in, size_out);
 }
@@ -1540,120 +1526,3 @@ void Image_HeightmapToNormalmap(const unsigned char *inpixels, unsigned char *ou
                }
        }
 }
-
-int image_loadskin(imageskin_t *s, const char *shadername)
-{
-       int j;
-       unsigned char *bumppixels;
-       int bumppixels_width, bumppixels_height;
-       char name[MAX_QPATH];
-       Image_StripImageExtension(shadername, name, sizeof(name));
-       memset(s, 0, sizeof(*s));
-       s->basepixels = loadimagepixels(name, false, 0, 0);
-       if (s->basepixels == NULL)
-               return false;
-       s->basepixels_width = image_width;
-       s->basepixels_height = image_height;
-
-       bumppixels = NULL;bumppixels_width = 0;bumppixels_height = 0;
-       for (j = 3;j < s->basepixels_width * s->basepixels_height * 4;j += 4)
-               if (s->basepixels[j] < 255)
-                       break;
-       if (j < s->basepixels_width * s->basepixels_height * 4)
-       {
-               // has transparent pixels
-               s->maskpixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, s->basepixels_width * s->basepixels_height * 4);
-               s->maskpixels_width = s->basepixels_width;
-               s->maskpixels_height = s->basepixels_height;
-               memcpy(s->maskpixels, s->basepixels, s->maskpixels_width * s->maskpixels_height * 4);
-               for (j = 0;j < s->basepixels_width * s->basepixels_height * 4;j += 4)
-               {
-                       s->maskpixels[j+0] = 255;
-                       s->maskpixels[j+1] = 255;
-                       s->maskpixels[j+2] = 255;
-               }
-       }
-
-       // _luma is supported for tenebrae compatibility
-       // (I think it's a very stupid name, but oh well)
-       if ((s->glowpixels = loadimagepixels(va("%s_glow", name), false, 0, 0)) != NULL
-        || (s->glowpixels = loadimagepixels(va("%s_luma", name), false, 0, 0)) != NULL)
-       {
-               s->glowpixels_width = image_width;
-               s->glowpixels_height = image_height;
-       }
-       // _norm is the name used by tenebrae
-       // (I don't like the name much)
-       if ((s->nmappixels = loadimagepixels(va("%s_norm", name), false, 0, 0)) != NULL)
-       {
-               s->nmappixels_width = image_width;
-               s->nmappixels_height = image_height;
-       }
-       else if ((bumppixels = loadimagepixels(va("%s_bump", name), false, 0, 0)) != NULL)
-       {
-               bumppixels_width = image_width;
-               bumppixels_height = image_height;
-       }
-       if ((s->glosspixels = loadimagepixels(va("%s_gloss", name), false, 0, 0)) != NULL)
-       {
-               s->glosspixels_width = image_width;
-               s->glosspixels_height = image_height;
-       }
-       if ((s->pantspixels = loadimagepixels(va("%s_pants", name), false, 0, 0)) != NULL)
-       {
-               s->pantspixels_width = image_width;
-               s->pantspixels_height = image_height;
-       }
-       if ((s->shirtpixels = loadimagepixels(va("%s_shirt", name), false, 0, 0)) != NULL)
-       {
-               s->shirtpixels_width = image_width;
-               s->shirtpixels_height = image_height;
-       }
-
-       if (s->nmappixels == NULL)
-       {
-               if (bumppixels != NULL)
-               {
-                       if (r_shadow_bumpscale_bumpmap.value > 0)
-                       {
-                               s->nmappixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, bumppixels_width * bumppixels_height * 4);
-                               s->nmappixels_width = bumppixels_width;
-                               s->nmappixels_height = bumppixels_height;
-                               Image_HeightmapToNormalmap(bumppixels, s->nmappixels, s->nmappixels_width, s->nmappixels_height, false, r_shadow_bumpscale_bumpmap.value);
-                       }
-               }
-               else
-               {
-                       if (r_shadow_bumpscale_basetexture.value > 0)
-                       {
-                               s->nmappixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, s->basepixels_width * s->basepixels_height * 4);
-                               s->nmappixels_width = s->basepixels_width;
-                               s->nmappixels_height = s->basepixels_height;
-                               Image_HeightmapToNormalmap(s->basepixels, s->nmappixels, s->nmappixels_width, s->nmappixels_height, false, r_shadow_bumpscale_basetexture.value);
-                       }
-               }
-       }
-       if (bumppixels != NULL)
-               Mem_Free(bumppixels);
-       return true;
-}
-
-void image_freeskin(imageskin_t *s)
-{
-       if (s->basepixels)
-               Mem_Free(s->basepixels);
-       if (s->maskpixels)
-               Mem_Free(s->maskpixels);
-       if (s->nmappixels)
-               Mem_Free(s->nmappixels);
-       if (s->glowpixels)
-               Mem_Free(s->glowpixels);
-       if (s->glosspixels)
-               Mem_Free(s->glosspixels);
-       if (s->pantspixels)
-               Mem_Free(s->pantspixels);
-       if (s->shirtpixels)
-               Mem_Free(s->shirtpixels);
-       memset(s, 0, sizeof(*s));
-}
-
diff --git a/image.h b/image.h
index 20a5fd5..17b6149 100644 (file)
--- a/image.h
+++ b/image.h
@@ -18,6 +18,8 @@ void Image_GammaRemapRGB(const unsigned char *in, unsigned char *out, int pixels
 // converts 8bit image data to RGBA, in can not be the same as out
 void Image_Copy8bitRGBA(const unsigned char *in, unsigned char *out, int pixels, const unsigned int *pal);
 
+void Image_StripImageExtension (const char *in, char *out, size_t size_out);
+
 unsigned char *LoadTGA (const unsigned char *f, int filesize, int matchwidth, int matchheight);
 
 // loads a texture, as pixel data
@@ -43,20 +45,5 @@ unsigned char *LoadLMP (const unsigned char *f, int filesize, int matchwidth, in
 
 void Image_HeightmapToNormalmap(const unsigned char *inpixels, unsigned char *outpixels, int width, int height, int clamp, float bumpscale);
 
-typedef struct imageskin_s
-{
-       unsigned char *basepixels;int basepixels_width;int basepixels_height;
-       unsigned char *nmappixels;int nmappixels_width;int nmappixels_height;
-       unsigned char *glowpixels;int glowpixels_width;int glowpixels_height;
-       unsigned char *glosspixels;int glosspixels_width;int glosspixels_height;
-       unsigned char *pantspixels;int pantspixels_width;int pantspixels_height;
-       unsigned char *shirtpixels;int shirtpixels_width;int shirtpixels_height;
-       unsigned char *maskpixels;int maskpixels_width;int maskpixels_height;
-}
-imageskin_t;
-
-int image_loadskin(imageskin_t *s, const char *name);
-void image_freeskin(imageskin_t *s);
-
 #endif
 
index de52950..083369d 100644 (file)
@@ -1045,15 +1045,110 @@ static rtexture_t *GL_TextureForSkinLayer(const unsigned char *in, int width, in
        return R_LoadTexture2D (loadmodel->texturepool, name, width, height, in, TEXTYPE_PALETTE, textureflags, palette);
 }
 
+typedef struct imageskin_s
+{
+       unsigned char *basepixels;int basepixels_width;int basepixels_height;
+       unsigned char *nmappixels;int nmappixels_width;int nmappixels_height;
+       unsigned char *glowpixels;int glowpixels_width;int glowpixels_height;
+       unsigned char *glosspixels;int glosspixels_width;int glosspixels_height;
+       unsigned char *pantspixels;int pantspixels_width;int pantspixels_height;
+       unsigned char *shirtpixels;int shirtpixels_width;int shirtpixels_height;
+       unsigned char *maskpixels;int maskpixels_width;int maskpixels_height;
+}
+imageskin_t;
+
 int Mod_LoadSkinFrame(skinframe_t *skinframe, const char *basename, int textureflags, int loadpantsandshirt, int loadglowtexture)
 {
+       int j;
        imageskin_t s;
+       char name[MAX_QPATH];
+       memset(&s, 0, sizeof(s));
        memset(skinframe, 0, sizeof(*skinframe));
+       Image_StripImageExtension(basename, name, sizeof(name));
        skinframe->base = r_texture_notexture;
        if (cls.state == ca_dedicated)
                return false;
-       if (!image_loadskin(&s, basename))
+
+       s.basepixels = loadimagepixels(name, false, 0, 0);
+       if (s.basepixels == NULL)
                return false;
+       s.basepixels_width = image_width;
+       s.basepixels_height = image_height;
+
+       for (j = 3;j < s.basepixels_width * s.basepixels_height * 4;j += 4)
+               if (s.basepixels[j] < 255)
+                       break;
+       if (j < s.basepixels_width * s.basepixels_height * 4)
+       {
+               // has transparent pixels
+               s.maskpixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, s.basepixels_width * s.basepixels_height * 4);
+               s.maskpixels_width = s.basepixels_width;
+               s.maskpixels_height = s.basepixels_height;
+               memcpy(s.maskpixels, s.basepixels, s.maskpixels_width * s.maskpixels_height * 4);
+               for (j = 0;j < s.basepixels_width * s.basepixels_height * 4;j += 4)
+               {
+                       s.maskpixels[j+0] = 255;
+                       s.maskpixels[j+1] = 255;
+                       s.maskpixels[j+2] = 255;
+               }
+       }
+
+       // _luma is supported for tenebrae compatibility
+       // (I think it's a very stupid name, but oh well)
+       if ((s.glowpixels = loadimagepixels(va("%s_glow", name), false, 0, 0)) != NULL
+        || (s.glowpixels = loadimagepixels(va("%s_luma", name), false, 0, 0)) != NULL)
+       {
+               s.glowpixels_width = image_width;
+               s.glowpixels_height = image_height;
+       }
+       // _norm is the name used by tenebrae
+       // (I don't like the name much)
+       if ((s.nmappixels = loadimagepixels(va("%s_norm", name), false, 0, 0)) != NULL)
+       {
+               s.nmappixels_width = image_width;
+               s.nmappixels_height = image_height;
+       }
+       else
+       {
+               unsigned char *bumppixels;
+               if ((bumppixels = loadimagepixels(va("%s_bump", name), false, 0, 0)) != NULL)
+               {
+                       if (r_shadow_bumpscale_bumpmap.value > 0)
+                       {
+                               s.nmappixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, image_width * image_height * 4);
+                               s.nmappixels_width = image_width;
+                               s.nmappixels_height = image_height;
+                               Image_HeightmapToNormalmap(bumppixels, s.nmappixels, s.nmappixels_width, s.nmappixels_height, false, r_shadow_bumpscale_bumpmap.value);
+                       }
+                       Mem_Free(bumppixels);
+               }
+               else
+               {
+                       if (r_shadow_bumpscale_basetexture.value > 0)
+                       {
+                               s.nmappixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, s.basepixels_width * s.basepixels_height * 4);
+                               s.nmappixels_width = s.basepixels_width;
+                               s.nmappixels_height = s.basepixels_height;
+                               Image_HeightmapToNormalmap(s.basepixels, s.nmappixels, s.nmappixels_width, s.nmappixels_height, false, r_shadow_bumpscale_basetexture.value);
+                       }
+               }
+       }
+       if ((s.glosspixels = loadimagepixels(va("%s_gloss", name), false, 0, 0)) != NULL)
+       {
+               s.glosspixels_width = image_width;
+               s.glosspixels_height = image_height;
+       }
+       if ((s.pantspixels = loadimagepixels(va("%s_pants", name), false, 0, 0)) != NULL)
+       {
+               s.pantspixels_width = image_width;
+               s.pantspixels_height = image_height;
+       }
+       if ((s.shirtpixels = loadimagepixels(va("%s_shirt", name), false, 0, 0)) != NULL)
+       {
+               s.shirtpixels_width = image_width;
+               s.shirtpixels_height = image_height;
+       }
+
        skinframe->base = R_LoadTexture2D (loadmodel->texturepool, basename, s.basepixels_width, s.basepixels_height, s.basepixels, TEXTYPE_RGBA, textureflags, NULL);
        if (s.nmappixels != NULL)
                skinframe->nmap = R_LoadTexture2D (loadmodel->texturepool, va("%s_nmap", basename), s.nmappixels_width, s.nmappixels_height, s.nmappixels, TEXTYPE_RGBA, textureflags, NULL);
@@ -1074,7 +1169,22 @@ int Mod_LoadSkinFrame(skinframe_t *skinframe, const char *basename, int texturef
                skinframe->base = r_texture_notexture;
        if (!skinframe->nmap)
                skinframe->nmap = r_texture_blanknormalmap;
-       image_freeskin(&s);
+
+       if (s.basepixels)
+               Mem_Free(s.basepixels);
+       if (s.maskpixels)
+               Mem_Free(s.maskpixels);
+       if (s.nmappixels)
+               Mem_Free(s.nmappixels);
+       if (s.glowpixels)
+               Mem_Free(s.glowpixels);
+       if (s.glosspixels)
+               Mem_Free(s.glosspixels);
+       if (s.pantspixels)
+               Mem_Free(s.pantspixels);
+       if (s.shirtpixels)
+               Mem_Free(s.shirtpixels);
+
        return true;
 }