Skip to content

Commit

Permalink
premultiplied alpha for grass
Browse files Browse the repository at this point in the history
git-svn-id: https://sauerbraten.svn.sourceforge.net/svnroot/sauerbraten/src@3315 ac1f7847-fce6-4368-a212-70e9bdee79d4
  • Loading branch information
eihrul committed Nov 19, 2010
1 parent 598f023 commit 4c19f78
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 11 deletions.
6 changes: 3 additions & 3 deletions engine/grass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,9 @@ static void gengrassquads(grassgroup *&group, const grasswedge &w, const grasstr
tc1 = tc.dot(p1) + offset, tc2 = tc.dot(p2) + offset,
lm1u = g.tcu.dot(p1), lm1v = g.tcv.dot(p1),
lm2u = g.tcu.dot(p2), lm2v = g.tcv.dot(p2),
fade = dist > taperdist ? (grassdist - dist)*taperscale : 1,
fade = dist > taperdist ? (grassdist - dist)*taperscale*grassalpha : grassalpha,
height = grassheight * fade;
uchar color[4] = { grasscolor.x, grasscolor.y, grasscolor.z, uchar(fade*grassalpha*255) };
uchar color[4] = { grasscolor.x, grasscolor.y, grasscolor.z, uchar(fade*255) };

#define GRASSVERT(n, tcv, modify) { \
grassvert &gv = grassverts.add(); \
Expand Down Expand Up @@ -229,7 +229,7 @@ void rendergrass()

glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(renderpath==R_FIXEDFUNCTION ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);

SETSHADER(grass);
Expand Down
12 changes: 6 additions & 6 deletions engine/shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1395,17 +1395,17 @@ static void genfogshader(vector<char> &vsbuf, vector<char> &psbuf, const char *v
const char *psend = strrchr(ps, '}');
if(psend)
{
static const int rgbalen = strlen("#pragma CUBE2_fogrgba");
bool rgba = pspragma && !strncmp(pspragma, "#pragma CUBE2_fogrgba", rgbalen);
psbuf.put(ps, psend - ps);
const char *psdef = "\n#define FOG_COLOR ";
const char *psfog = rgba ?
"\ngl_FragColor = mix((FOG_COLOR), gl_FragColor, clamp((gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale, 0.0, 1.0));\n" :
"\ngl_FragColor.rgb = mix((FOG_COLOR).rgb, gl_FragColor.rgb, clamp((gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale, 0.0, 1.0));\n";
const char *psfog =
pspragma && !strncmp(pspragma+pragmalen, "rgba", 4) ?
"\ngl_FragColor = mix((FOG_COLOR), gl_FragColor, clamp((gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale, 0.0, 1.0));\n" :
"\ngl_FragColor.rgb = mix((FOG_COLOR).rgb, gl_FragColor.rgb, clamp((gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale, 0.0, 1.0));\n";
int clen = 0;
if(pspragma)
{
pspragma += rgba ? rgbalen : pragmalen;
pspragma += pragmalen;
while (isalpha(*pspragma)) pspragma++;
while(*pspragma && !isspace(*pspragma)) pspragma++;
pspragma += strspn(pspragma, " \t\v\f");
clen = strcspn(pspragma, "\r\n");
Expand Down
33 changes: 31 additions & 2 deletions engine/texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,26 @@ void texgrey(ImageData &s)
s.replace(d);
}

void texpremul(ImageData &s)
{
switch(s.bpp)
{
case 2:
writetex(s,
dst[0] = uchar((uint(dst[0])*uint(dst[1]))/255);
);
break;
case 4:
writetex(s,
uint alpha = dst[3];
dst[0] = uchar((uint(dst[0])*alpha)/255);
dst[1] = uchar((uint(dst[1])*alpha)/255);
dst[2] = uchar((uint(dst[2])*alpha)/255);
);
break;
}
}

VAR(hwtexsize, 1, 0, 0);
VAR(hwcubetexsize, 1, 0, 0);
VAR(hwmaxaniso, 1, 0, 0);
Expand Down Expand Up @@ -1014,7 +1034,7 @@ static bool texturedata(ImageData &d, const char *tname, Slot::Tex *tex = NULL,
else if(!strncmp(cmd, "ffmask", len))
{
texffmask(d, atof(arg[0]), atof(arg[1]));
if(!d.data) return true;
if(!d.data) break;
}
else if(!strncmp(cmd, "normal", len))
{
Expand All @@ -1033,6 +1053,7 @@ static bool texturedata(ImageData &d, const char *tname, Slot::Tex *tex = NULL,
int emphasis = atoi(arg[0]), repeat = atoi(arg[1]);
texblur(d, emphasis > 0 ? clamp(emphasis, 1, 2) : 1, repeat > 0 ? repeat : 1);
}
else if(!strncmp(cmd, "premul", len)) texpremul(d);
else if(!strncmp(cmd, "compress", len) || !strncmp(cmd, "dds", len))
{
int scale = atoi(arg[0]);
Expand All @@ -1050,6 +1071,10 @@ static bool texturedata(ImageData &d, const char *tname, Slot::Tex *tex = NULL,
if(h <= 0 || h > (1<<12)) h = w;
if(d.w > w || d.h > h) scaleimage(d, w, h);
}
else if(!strncmp(cmd, "ffskip", len))
{
if(renderpath==R_FIXEDFUNCTION) break;
}
}

return true;
Expand Down Expand Up @@ -1517,7 +1542,7 @@ void autograss(char *name)
if(slots.empty()) return;
Slot &s = *slots.last();
DELETEA(s.autograss);
s.autograss = name[0] ? newstring(makerelpath("packages", name)) : NULL;
s.autograss = name[0] ? newstring(makerelpath("packages", name, NULL, "<ffskip><premul>")) : NULL;
}
COMMAND(autograss, "s");

Expand Down Expand Up @@ -2376,7 +2401,9 @@ enum
DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x00008000,
DDSCAPS2_VOLUME = 0x00200000,
FOURCC_DXT1 = 0x31545844,
FOURCC_DXT2 = 0x32545844,
FOURCC_DXT3 = 0x33545844,
FOURCC_DXT4 = 0x34545844,
FOURCC_DXT5 = 0x35545844

};
Expand Down Expand Up @@ -2423,7 +2450,9 @@ bool loaddds(const char *filename, ImageData &image)
switch(d.ddpfPixelFormat.dwFourCC)
{
case FOURCC_DXT1: format = d.ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS ? GL_COMPRESSED_RGBA_S3TC_DXT1_EXT : GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break;
case FOURCC_DXT2:
case FOURCC_DXT3: format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
case FOURCC_DXT4:
case FOURCC_DXT5: format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
}
}
Expand Down

0 comments on commit 4c19f78

Please sign in to comment.