]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
experimental new mode "r_showsurfaces 3": shows faces in average texture color
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Sat, 6 Dec 2008 13:02:02 +0000 (13:02 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Sat, 6 Dec 2008 13:02:02 +0000 (13:02 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8565 d7cf8633-e32d-0410-b094-e92efae38249

gl_rmain.c
model_shared.h

index e5937b7ed7cebda3faeb1bfd59081178441c4d82..ac81253a69ab9d44346a82c0a7f9657019684d31 100644 (file)
@@ -1921,6 +1921,7 @@ skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int texturefl
        int basepixels_width;
        int basepixels_height;
        skinframe_t *skinframe;
+       double avgcolor[4];
 
        *has_alpha = false;
 
@@ -1980,6 +1981,30 @@ skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int texturefl
                }
        }
 
+       avgcolor[0] = 0;
+       avgcolor[1] = 0;
+       avgcolor[2] = 0;
+       avgcolor[3] = 0;
+       for(j = 0; j < basepixels_width * basepixels_height * 4; j += 4)
+       {
+               avgcolor[2] += basepixels[j + 0];
+               avgcolor[1] += basepixels[j + 1];
+               avgcolor[0] += basepixels[j + 2];
+               avgcolor[3] += basepixels[j + 3];
+       }
+       if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
+               avgcolor[3] = 255.0 * basepixels_width * basepixels_height;
+       if(avgcolor[3] == 0) // no pixels seen? even worse
+               avgcolor[3] = 1;
+       avgcolor[0] /= avgcolor[3];
+       avgcolor[1] /= avgcolor[3];
+       avgcolor[2] /= avgcolor[3];
+       avgcolor[3] /= basepixels_width * 255.0 * basepixels_height; // to 0..1 range
+       skinframe->avgcolor[0] = avgcolor[0];
+       skinframe->avgcolor[1] = avgcolor[1];
+       skinframe->avgcolor[2] = avgcolor[2];
+       skinframe->avgcolor[3] = avgcolor[3];
+
        // _norm is the name used by tenebrae and has been adopted as standard
        if (loadnormalmap)
        {
@@ -2045,6 +2070,8 @@ skinframe_t *R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, co
        int i;
        unsigned char *temp1, *temp2;
        skinframe_t *skinframe;
+       double avgcolor[4];
+       int j;
 
        if (cls.state == ca_dedicated)
                return NULL;
@@ -2096,6 +2123,30 @@ skinframe_t *R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, co
                }
        }
 
+       avgcolor[0] = 0;
+       avgcolor[1] = 0;
+       avgcolor[2] = 0;
+       avgcolor[3] = 0;
+       for(j = 0; j < width * height * 4; j += 4)
+       {
+               avgcolor[2] += skindata[j + 0];
+               avgcolor[1] += skindata[j + 1];
+               avgcolor[0] += skindata[j + 2];
+               avgcolor[3] += skindata[j + 3];
+       }
+       if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
+               avgcolor[3] = 255.0 * width * height;
+       if(avgcolor[3] == 0) // no pixels seen? even worse
+               avgcolor[3] = 1;
+       avgcolor[0] /= avgcolor[3];
+       avgcolor[1] /= avgcolor[3];
+       avgcolor[2] /= avgcolor[3];
+       avgcolor[3] /= width * 255.0 * height; // to 0..1 range
+       skinframe->avgcolor[0] = avgcolor[0];
+       skinframe->avgcolor[1] = avgcolor[1];
+       skinframe->avgcolor[2] = avgcolor[2];
+       skinframe->avgcolor[3] = avgcolor[3];
+
        return skinframe;
 }
 
@@ -2104,6 +2155,8 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
        int i;
        unsigned char *temp1, *temp2;
        skinframe_t *skinframe;
+       double avgcolor[4];
+       int j;
 
        if (cls.state == ca_dedicated)
                return NULL;
@@ -2160,6 +2213,31 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
                        skinframe->fog = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_fog", skinframe->basename), palette_bgra_alpha, skinframe->textureflags, true); // fog mask
        }
 
+       avgcolor[0] = 0;
+       avgcolor[1] = 0;
+       avgcolor[2] = 0;
+       avgcolor[3] = 0;
+       for(j = 0; j < width * height; ++j)
+       {
+               temp1 = ((unsigned char *)palette_bgra_alpha) + (skindata[j]*4);
+               avgcolor[2] += temp1[0];
+               avgcolor[1] += temp1[1];
+               avgcolor[0] += temp1[2];
+               avgcolor[3] += temp1[3];
+       }
+       if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
+               avgcolor[3] = 255.0 * width * height;
+       if(avgcolor[3] == 0) // no pixels seen? even worse
+               avgcolor[3] = 1;
+       avgcolor[0] /= avgcolor[3];
+       avgcolor[1] /= avgcolor[3];
+       avgcolor[2] /= avgcolor[3];
+       avgcolor[3] /= width * 255.0 * height; // to 0..1 range
+       skinframe->avgcolor[0] = avgcolor[0];
+       skinframe->avgcolor[1] = avgcolor[1];
+       skinframe->avgcolor[2] = avgcolor[2];
+       skinframe->avgcolor[3] = avgcolor[3];
+
        return skinframe;
 }
 
@@ -2181,6 +2259,11 @@ skinframe_t *R_SkinFrame_LoadMissing(void)
        skinframe->glow = NULL;
        skinframe->fog = NULL;
 
+       skinframe->avgcolor[0] = rand() / RAND_MAX;
+       skinframe->avgcolor[1] = rand() / RAND_MAX;
+       skinframe->avgcolor[2] = rand() / RAND_MAX;
+       skinframe->avgcolor[3] = 1;
+
        return skinframe;
 }
 
@@ -6400,7 +6483,17 @@ static void R_ProcessTextureSurfaceList(int texturenumsurfaces, msurface_t **tex
                        GL_Color(0, 0, 0, 1);
                        RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
                }
-               else
+               else if (r_showsurfaces.integer == 3)
+               {
+                       const float cbase[4] = {1, 0, 1, 1};
+                       const float *c = cbase;
+                       if(rsurface.texture && rsurface.texture->currentskinframe)
+                               c = rsurface.texture->currentskinframe->avgcolor;
+                       GL_Color(c[0], c[1], c[2], c[3]);
+                       RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
+                       // TODO how to apply vertex light here?
+               }
+               else 
                        RSurf_DrawBatch_ShowSurfaces(texturenumsurfaces, texturesurfacelist);
        }
        else if (rsurface.texture->currentmaterialflags & MATERIALFLAG_SKY)
index e8b918c0c76a24f9ada20cb7beca8da50d038660..7bf5e0207a972c4d37b23c5c3bfa031d2920b71b 100644 (file)
@@ -70,6 +70,8 @@ typedef struct skinframe_s
        int loadsequence;
        // on 32bit systems this makes the struct 128 bytes long
        int padding;
+       // average texture color, if applicable
+       float avgcolor[4];
 }
 skinframe_t;