return item;
}
+#define R_SKINFRAME_LOAD_AVERAGE_COLORS(cnt, getpixel) \
+ { \
+ unsigned long long avgcolor[5], wsum; \
+ int pix, comp, w; \
+ avgcolor[0] = 0; \
+ avgcolor[1] = 0; \
+ avgcolor[2] = 0; \
+ avgcolor[3] = 0; \
+ avgcolor[4] = 0; \
+ wsum = 0; \
+ for(pix = 0; pix < cnt; ++pix) \
+ { \
+ w = 0; \
+ for(comp = 0; comp < 3; ++comp) \
+ w += getpixel; \
+ if(w) /* ignore perfectly black pixels because that is better for model skins */ \
+ { \
+ ++wsum; \
+ /* comp = 3; -- not needed, comp is always 3 when we get here */ \
+ w = getpixel; \
+ for(comp = 0; comp < 3; ++comp) \
+ avgcolor[comp] += getpixel * w; \
+ avgcolor[3] += w; \
+ } \
+ /* comp = 3; -- not needed, comp is always 3 when we get here */ \
+ avgcolor[4] += getpixel; \
+ } \
+ if(avgcolor[3] == 0) /* no pixels seen? even worse */ \
+ avgcolor[3] = 1; \
+ skinframe->avgcolor[0] = avgcolor[2] / (255.0 * avgcolor[3]); \
+ skinframe->avgcolor[1] = avgcolor[1] / (255.0 * avgcolor[3]); \
+ skinframe->avgcolor[2] = avgcolor[0] / (255.0 * avgcolor[3]); \
+ skinframe->avgcolor[3] = avgcolor[4] / (255.0 * cnt); \
+ }
+
skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int textureflags, qboolean complain, qboolean *has_alpha)
{
// FIXME: it should be possible to disable loading various layers using
int basepixels_width;
int basepixels_height;
skinframe_t *skinframe;
- double avgcolor[5], w, wsum;
*has_alpha = false;
}
}
- avgcolor[0] = 0;
- avgcolor[1] = 0;
- avgcolor[2] = 0;
- avgcolor[3] = 0;
- avgcolor[4] = 0;
- wsum = 0;
- for(j = 0; j < basepixels_width * basepixels_height * 4; j += 4)
- {
- w = (int)basepixels[j + 0] + (int)basepixels[j + 1] + (int)basepixels[j + 2]; // use this weight, so black pixels don't contribute (needed for model skins)
- avgcolor[2] += basepixels[j + 0] * w;
- avgcolor[1] += basepixels[j + 1] * w;
- avgcolor[0] += basepixels[j + 2] * w;
- avgcolor[3] += basepixels[j + 3] * w;
- avgcolor[4] += basepixels[j + 3];
- wsum += w;
- }
- if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
- avgcolor[3] = 255.0 * wsum;
- 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] /= 255.0 * wsum; // to 0..1 range
- skinframe->avgcolor[0] = avgcolor[0];
- skinframe->avgcolor[1] = avgcolor[1];
- skinframe->avgcolor[2] = avgcolor[2];
- skinframe->avgcolor[3] = avgcolor[4] / (basepixels_width * 255.0 * basepixels_height);
+ R_SKINFRAME_LOAD_AVERAGE_COLORS(basepixels_width * basepixels_height, basepixels[4 * pix + comp]);
+ //Con_Printf("Texture %s has average colors %f %f %f alpha %f\n", name, skinframe->avgcolor[0], skinframe->avgcolor[1], skinframe->avgcolor[2], skinframe->avgcolor[3]);
// _norm is the name used by tenebrae and has been adopted as standard
if (loadnormalmap)
int i;
unsigned char *temp1, *temp2;
skinframe_t *skinframe;
- double avgcolor[5], w, wsum;
- int j;
if (cls.state == ca_dedicated)
return NULL;
}
}
- avgcolor[0] = 0;
- avgcolor[1] = 0;
- avgcolor[2] = 0;
- avgcolor[3] = 0;
- avgcolor[4] = 0;
- wsum = 0;
- for(j = 0; j < width * height * 4; j += 4)
- {
- w = (int)skindata[j + 0] + (int)skindata[j + 1] + (int)skindata[j + 2];
- avgcolor[2] += skindata[j + 0] * w;
- avgcolor[1] += skindata[j + 1] * w;
- avgcolor[0] += skindata[j + 2] * w;
- avgcolor[3] += skindata[j + 3] * w;
- avgcolor[4] += skindata[j + 3];
- wsum += w;
- }
- if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
- avgcolor[3] = 255.0 * wsum;
- 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] /= 255.0 * wsum; // to 0..1 range
- skinframe->avgcolor[0] = avgcolor[0];
- skinframe->avgcolor[1] = avgcolor[1];
- skinframe->avgcolor[2] = avgcolor[2];
- skinframe->avgcolor[3] = avgcolor[4] / (width * 255.0 * height);
+ R_SKINFRAME_LOAD_AVERAGE_COLORS(width * height, skindata[4 * pix + comp]);
+ //Con_Printf("Texture %s has average colors %f %f %f alpha %f\n", name, skinframe->avgcolor[0], skinframe->avgcolor[1], skinframe->avgcolor[2], skinframe->avgcolor[3]);
return skinframe;
}
{
int i;
unsigned char *temp1, *temp2;
+ unsigned int *palette;
skinframe_t *skinframe;
- double avgcolor[5], w, wsum;
- int j;
if (cls.state == ca_dedicated)
return NULL;
if (skinframe && skinframe->base)
return skinframe;
+ palette = (loadglowtexture ? palette_bgra_nofullbrights : ((skinframe->textureflags & TEXF_ALPHA) ? palette_bgra_transparent : palette_bgra_complete));
+
skinframe->stain = NULL;
skinframe->merged = NULL;
skinframe->base = r_texture_notexture;
Mem_Free(temp1);
}
// use either a custom palette, or the quake palette
- skinframe->base = skinframe->merged = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_merged", skinframe->basename), (loadglowtexture ? palette_bgra_nofullbrights : ((skinframe->textureflags & TEXF_ALPHA) ? palette_bgra_transparent : palette_bgra_complete)), skinframe->textureflags, true); // all
+ skinframe->base = skinframe->merged = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_merged", skinframe->basename), palette, skinframe->textureflags, true); // all
if (loadglowtexture)
skinframe->glow = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_glow", skinframe->basename), palette_bgra_onlyfullbrights, skinframe->textureflags, false); // glow
if (loadpantsandshirt)
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;
- avgcolor[4] = 0;
- wsum = 0;
- for(j = 0; j < width * height; ++j)
- {
- temp1 = ((unsigned char *)palette_bgra_alpha) + (skindata[j]*4);
- w = (int)temp1[0] + (int)temp1[1] + (int)temp1[2];
- avgcolor[2] += temp1[0] * w;
- avgcolor[1] += temp1[1] * w;
- avgcolor[0] += temp1[2] * w;
- avgcolor[3] += temp1[3] * w;
- avgcolor[4] += temp1[3];
- wsum += w;
- }
- if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
- avgcolor[3] = 255.0 * wsum;
- 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] /= 255.0 * wsum; // to 0..1 range
- skinframe->avgcolor[0] = avgcolor[0];
- skinframe->avgcolor[1] = avgcolor[1];
- skinframe->avgcolor[2] = avgcolor[2];
- skinframe->avgcolor[3] = avgcolor[4] / (width * 255.0 * height);
+ R_SKINFRAME_LOAD_AVERAGE_COLORS(width * height, ((unsigned char *)palette)[skindata[pix]*4 + comp]);
+ //Con_Printf("Texture %s has average colors %f %f %f alpha %f\n", name, skinframe->avgcolor[0], skinframe->avgcolor[1], skinframe->avgcolor[2], skinframe->avgcolor[3]);
return skinframe;
}
{
int texturesurfaceindex;
int i;
- float f;
float *v, *c2;
for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
{
const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
for (i = 0, v = (rsurface.vertex3f + 3 * surface->num_firstvertex), c2 = (rsurface.array_color4f + 4 * surface->num_firstvertex);i < surface->num_vertices;i++, v += 3, c2 += 4)
{
- f = FogPoint_Model(v);
- c2[0] = 1;
- c2[1] = 1;
- c2[2] = 1;
+ c2[0] = 0.5;
+ c2[1] = 0.5;
+ c2[2] = 0.5;
c2[3] = 1;
}
}
const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
for (i = 0, c = (rsurface.lightmapcolor4f + 4 * surface->num_firstvertex), c2 = (rsurface.array_color4f + 4 * surface->num_firstvertex);i < surface->num_vertices;i++, c += 4, c2 += 4)
{
- c2[0] = c[0] + r_refdef.scene.ambient / 64.0;
- c2[1] = c[1] + r_refdef.scene.ambient / 64.0;
- c2[2] = c[2] + r_refdef.scene.ambient / 64.0;
+ c2[0] = c[0] + r_refdef.scene.ambient / 128.0;
+ c2[1] = c[1] + r_refdef.scene.ambient / 128.0;
+ c2[2] = c[2] + r_refdef.scene.ambient / 128.0;
c2[3] = c[3];
}
}
c[3] = 1;
}
- // brighten it up (as texture value 127 means "unlit")
- c[0] *= 2;
- c[1] *= 2;
- c[2] *= 2;
-
if (rsurface.texture->currentskinframe->pants || rsurface.texture->currentskinframe->shirt)
{
- c[0] = rsurface.colormap_pantscolor[0] * 0.3 + rsurface.colormap_shirtcolor[0] * 0.7;
- c[1] = rsurface.colormap_pantscolor[1] * 0.3 + rsurface.colormap_shirtcolor[1] * 0.7;
- c[2] = rsurface.colormap_pantscolor[2] * 0.3 + rsurface.colormap_shirtcolor[2] * 0.7;
+ c[0] = 0.5 * (rsurface.colormap_pantscolor[0] * 0.3 + rsurface.colormap_shirtcolor[0] * 0.7);
+ c[1] = 0.5 * (rsurface.colormap_pantscolor[1] * 0.3 + rsurface.colormap_shirtcolor[1] * 0.7);
+ c[2] = 0.5 * (rsurface.colormap_pantscolor[2] * 0.3 + rsurface.colormap_shirtcolor[2] * 0.7);
}
+ // brighten it up (as texture value 127 means "unlit")
+ c[0] *= 2 * r_refdef.view.colorscale;
+ c[1] *= 2 * r_refdef.view.colorscale;
+ c[2] *= 2 * r_refdef.view.colorscale;
+
if(rsurface.texture->currentmaterialflags & MATERIALFLAG_WATERALPHA)
c[3] *= r_wateralpha.value;
GL_DepthMask(writedepth);
}
- rsurface.lightmapcolor4f = rsurface.modellightmapcolor4f;
- rsurface.lightmapcolor4f_bufferobject = rsurface.modellightmapcolor4f_bufferobject;
- rsurface.lightmapcolor4f_bufferoffset = rsurface.modellightmapcolor4f_bufferoffset;
+ rsurface.lightmapcolor4f = NULL;
- if(!rsurface.lightmapcolor4f)
- RSurf_DrawBatch_GL11_MakeFullbrightLightmapColorArray(texturenumsurfaces, texturesurfacelist);
+ if (rsurface.texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT)
+ {
+ RSurf_PrepareVerticesForBatch(false, false, texturenumsurfaces, texturesurfacelist);
- if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
+ rsurface.lightmapcolor4f = NULL;
+ rsurface.lightmapcolor4f_bufferobject = 0;
+ rsurface.lightmapcolor4f_bufferoffset = 0;
+ }
+ else if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
{
qboolean applycolor = true;
float one = 1.0;
RSurf_PrepareVerticesForBatch(true, false, texturenumsurfaces, texturesurfacelist);
+
r_refdef.lightmapintensity = 1;
RSurf_DrawBatch_GL11_ApplyVertexShade(texturenumsurfaces, texturesurfacelist, &one, &one, &one, &one, &applycolor);
r_refdef.lightmapintensity = 0; // we're in showsurfaces, after all
}
else
+ {
RSurf_PrepareVerticesForBatch(false, false, texturenumsurfaces, texturesurfacelist);
+ rsurface.lightmapcolor4f = rsurface.modellightmapcolor4f;
+ rsurface.lightmapcolor4f_bufferobject = rsurface.modellightmapcolor4f_bufferobject;
+ rsurface.lightmapcolor4f_bufferoffset = rsurface.modellightmapcolor4f_bufferoffset;
+ }
+
+ if(!rsurface.lightmapcolor4f)
+ RSurf_DrawBatch_GL11_MakeFullbrightLightmapColorArray(texturenumsurfaces, texturesurfacelist);
+
RSurf_DrawBatch_GL11_ApplyAmbient(texturenumsurfaces, texturesurfacelist);
RSurf_DrawBatch_GL11_ApplyColor(texturenumsurfaces, texturesurfacelist, c[0], c[1], c[2], c[3]);
if(r_refdef.fogenabled)