Skip to content

Commit

Permalink
Add option to use texture alpha channel
Browse files Browse the repository at this point in the history
  • Loading branch information
kwolekr committed Apr 24, 2013
1 parent 3674779 commit 770305e
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 11 deletions.
1 change: 1 addition & 0 deletions client/shaders/test_shader_3/base.txt
@@ -0,0 +1 @@
trans_alphach
23 changes: 23 additions & 0 deletions client/shaders/test_shader_3/opengl_fragment.glsl
@@ -0,0 +1,23 @@

uniform sampler2D myTexture;
uniform float fogDistance;

varying vec3 vPosition;

void main (void)
{
vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));
col *= gl_Color;
col = col * col; // SRGB -> Linear
col *= 1.8;
col.r = 1.0 - exp(1.0 - col.r) / exp(1.0);
col.g = 1.0 - exp(1.0 - col.g) / exp(1.0);
col.b = 1.0 - exp(1.0 - col.b) / exp(1.0);
col = sqrt(col); // Linear -> SRGB
float a = col.a;
if(fogDistance != 0.0){
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
a = mix(a, 0.0, d);
}
gl_FragColor = vec4(col.r, col.g, col.b, a);
}
51 changes: 51 additions & 0 deletions client/shaders/test_shader_3/opengl_vertex.glsl
@@ -0,0 +1,51 @@

uniform mat4 mWorldViewProj;
uniform mat4 mInvWorld;
uniform mat4 mTransWorld;
uniform float dayNightRatio;

varying vec3 vPosition;

void main(void)
{
gl_Position = mWorldViewProj * gl_Vertex;

vPosition = (mWorldViewProj * gl_Vertex).xyz;

vec4 color;
//color = vec4(1.0, 1.0, 1.0, 1.0);

float day = gl_Color.r;
float night = gl_Color.g;
float light_source = gl_Color.b;

/*color.r = mix(night, day, dayNightRatio);
color.g = color.r;
color.b = color.r;*/

float rg = mix(night, day, dayNightRatio);
rg += light_source * 1.0; // Make light sources brighter
float b = rg;

// Moonlight is blue
b += (day - night) / 13.0;
rg -= (day - night) / 13.0;

// Emphase blue a bit in darker places
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025);

// Artificial light is yellow-ish
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);

color.r = rg;
color.g = rg;
color.b = b;

color.a = gl_Color.a;

gl_FrontColor = gl_BackColor = color;

gl_TexCoord[0] = gl_MultiTexCoord0;
}
1 change: 1 addition & 0 deletions doc/lua_api.txt
Expand Up @@ -1649,6 +1649,7 @@ Node definition (register_node)
^ Special textures of node; used rarely (old field name: special_materials)
^ List can be shortened to needed length
alpha = 255,
use_texture_alpha = false, -- Use texture's alpha channel
post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
paramtype = "none", -- See "Nodes"
paramtype2 = "none", -- See "Nodes"
Expand Down
4 changes: 3 additions & 1 deletion src/mapblock_mesh.cpp
Expand Up @@ -1099,6 +1099,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
getShader("test_shader_1").material;
video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
getShader("test_shader_2").material;
video::E_MATERIAL_TYPE shadermat3 = m_gamedef->getShaderSource()->
getShader("test_shader_3").material;
for(u32 i = 0; i < collector.prebuffers.size(); i++)
{
PreMeshBuffer &p = collector.prebuffers[i];
Expand Down Expand Up @@ -1174,7 +1176,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
= video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
material.setTexture(0, p.tile.texture.atlas);
if(enable_shaders)
p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2);
p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2, shadermat3);
else
p.tile.applyMaterialOptions(material);

Expand Down
14 changes: 5 additions & 9 deletions src/nodedef.cpp
Expand Up @@ -658,15 +658,11 @@ class CNodeDefManager: public IWritableNodeDefManager
break;
}

u8 material_type = 0;
if(is_liquid){
if(f->alpha == 255)
material_type = TILE_MATERIAL_LIQUID_OPAQUE;
else
material_type = TILE_MATERIAL_LIQUID_TRANSPARENT;
} else{
material_type = TILE_MATERIAL_BASIC;
}
u8 material_type;
if (is_liquid)
material_type = (f->alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
else
material_type = (f->alpha == 255) ? TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;

// Tiles (fill in f->tiles[])
for(u16 j=0; j<6; j++){
Expand Down
5 changes: 5 additions & 0 deletions src/scriptapi_content.cpp
Expand Up @@ -225,6 +225,11 @@ ContentFeatures read_content_features(lua_State *L, int index)
lua_pop(L, 1);

f.alpha = getintfield_default(L, index, "alpha", 255);

bool usealpha = getboolfield_default(L, index,
"use_texture_alpha", false);
if (usealpha)
f.alpha = 0;

/* Other stuff */

Expand Down
10 changes: 9 additions & 1 deletion src/tile.h
Expand Up @@ -162,6 +162,7 @@ IWritableTextureSource* createTextureSource(IrrlichtDevice *device);

enum MaterialType{
TILE_MATERIAL_BASIC,
TILE_MATERIAL_ALPHA,
TILE_MATERIAL_LIQUID_TRANSPARENT,
TILE_MATERIAL_LIQUID_OPAQUE,
};
Expand Down Expand Up @@ -222,6 +223,9 @@ struct TileSpec
case TILE_MATERIAL_BASIC:
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
break;
case TILE_MATERIAL_ALPHA:
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
break;
case TILE_MATERIAL_LIQUID_TRANSPARENT:
material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
break;
Expand All @@ -233,12 +237,16 @@ struct TileSpec
}
void applyMaterialOptionsWithShaders(video::SMaterial &material,
const video::E_MATERIAL_TYPE &basic,
const video::E_MATERIAL_TYPE &liquid) const
const video::E_MATERIAL_TYPE &liquid,
const video::E_MATERIAL_TYPE &alpha) const
{
switch(material_type){
case TILE_MATERIAL_BASIC:
material.MaterialType = basic;
break;
case TILE_MATERIAL_ALPHA:
material.MaterialType = alpha;
break;
case TILE_MATERIAL_LIQUID_TRANSPARENT:
material.MaterialType = liquid;
break;
Expand Down

0 comments on commit 770305e

Please sign in to comment.