From 761247943a1edd72c37d1993ab17b06a3ad7a339 Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 23 Apr 2007 18:11:15 +0000 Subject: [PATCH] merged image_loadskin and image_freeskin into Mod_LoadSkinFrame git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7158 d7cf8633-e32d-0410-b094-e92efae38249 --- image.c | 141 ++----------------------------------------------- image.h | 17 +----- model_shared.c | 114 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 119 insertions(+), 153 deletions(-) diff --git a/image.c b/image.c index 2624544f..7f5ed1fc 100644 --- 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 20a5fd51..17b6149f 100644 --- 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 diff --git a/model_shared.c b/model_shared.c index de529503..083369d7 100644 --- a/model_shared.c +++ b/model_shared.c @@ -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; } -- 2.39.2