Add option to use texture alpha channel
authorkwolekr <kwolekr@minetest.net>
Tue, 23 Apr 2013 22:39:10 +0000 (18:39 -0400)
committerkwolekr <kwolekr@minetest.net>
Wed, 24 Apr 2013 02:15:51 +0000 (22:15 -0400)
client/shaders/test_shader_3/base.txt [new file with mode: 0644]
client/shaders/test_shader_3/opengl_fragment.glsl [new file with mode: 0644]
client/shaders/test_shader_3/opengl_vertex.glsl [new file with mode: 0644]
doc/lua_api.txt
src/mapblock_mesh.cpp
src/nodedef.cpp
src/scriptapi_content.cpp
src/tile.h

diff --git a/client/shaders/test_shader_3/base.txt b/client/shaders/test_shader_3/base.txt
new file mode 100644 (file)
index 0000000..1c26471
--- /dev/null
@@ -0,0 +1 @@
+trans_alphach
diff --git a/client/shaders/test_shader_3/opengl_fragment.glsl b/client/shaders/test_shader_3/opengl_fragment.glsl
new file mode 100644 (file)
index 0000000..78abadc
--- /dev/null
@@ -0,0 +1,23 @@
+\r
+uniform sampler2D myTexture;\r
+uniform float fogDistance;\r
+\r
+varying vec3 vPosition;\r
+\r
+void main (void)\r
+{\r
+       vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));\r
+       col *= gl_Color;\r
+       col = col * col; // SRGB -> Linear\r
+       col *= 1.8;\r
+       col.r = 1.0 - exp(1.0 - col.r) / exp(1.0);\r
+       col.g = 1.0 - exp(1.0 - col.g) / exp(1.0);\r
+       col.b = 1.0 - exp(1.0 - col.b) / exp(1.0);\r
+       col = sqrt(col); // Linear -> SRGB\r
+       float a = col.a;
+       if(fogDistance != 0.0){\r
+               float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));\r
+               a = mix(a, 0.0, d);\r
+       }\r
+       gl_FragColor = vec4(col.r, col.g, col.b, a);\r
+}\r
diff --git a/client/shaders/test_shader_3/opengl_vertex.glsl b/client/shaders/test_shader_3/opengl_vertex.glsl
new file mode 100644 (file)
index 0000000..2881bad
--- /dev/null
@@ -0,0 +1,51 @@
+\r
+uniform mat4 mWorldViewProj;\r
+uniform mat4 mInvWorld;\r
+uniform mat4 mTransWorld;\r
+uniform float dayNightRatio;\r
+\r
+varying vec3 vPosition;\r
+\r
+void main(void)\r
+{\r
+       gl_Position = mWorldViewProj * gl_Vertex;\r
+\r
+       vPosition = (mWorldViewProj * gl_Vertex).xyz;\r
+\r
+       vec4 color;\r
+       //color = vec4(1.0, 1.0, 1.0, 1.0);\r
+\r
+       float day = gl_Color.r;\r
+       float night = gl_Color.g;\r
+       float light_source = gl_Color.b;\r
+\r
+       /*color.r = mix(night, day, dayNightRatio);\r
+       color.g = color.r;\r
+       color.b = color.r;*/\r
+\r
+       float rg = mix(night, day, dayNightRatio);\r
+       rg += light_source * 1.0; // Make light sources brighter\r
+       float b = rg;\r
+\r
+       // Moonlight is blue\r
+       b += (day - night) / 13.0;\r
+       rg -= (day - night) / 13.0;\r
+\r
+       // Emphase blue a bit in darker places\r
+       // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
+       b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025);\r
+\r
+       // Artificial light is yellow-ish\r
+       // See C++ implementation in mapblock_mesh.cpp finalColorBlend()\r
+       rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);\r
+\r
+       color.r = rg;\r
+       color.g = rg;\r
+       color.b = b;\r
+\r
+       color.a = gl_Color.a;\r
+\r
+       gl_FrontColor = gl_BackColor = color;\r
+\r
+       gl_TexCoord[0] = gl_MultiTexCoord0;\r
+}\r
index 531a40b297aafc25ad8474b803f9d34dc02d674d..42579fda300aa18296bda8f7831b4f70dc88e38b 100644 (file)
@@ -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"
index f68a79e411c77f88ee5a41c9788e7af3dad31052..f8a0b5f0631a412f612ee4a3bb6424823bd259bf 100644 (file)
@@ -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];
@@ -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);
 
index e2b72333f33d4a6185cc60b4153437e85966edaa..e09c1910d352a0f3b76b51915bc8374fe95a39b1 100644 (file)
@@ -658,15 +658,11 @@ public:
                                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++){
index 3b7ed517962936994707ea60b793bb6811ce70a7..30fd703496bec445ba9c209eff0cc22ce7ebe5fa 100644 (file)
@@ -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 */
 
index c5c7f930346eef67859078355a41c8ae5e5b9c26..ea5c4be54b4598d1aeadede016ed27a114448205 100644 (file)
@@ -162,6 +162,7 @@ IWritableTextureSource* createTextureSource(IrrlichtDevice *device);
 
 enum MaterialType{
        TILE_MATERIAL_BASIC,
+       TILE_MATERIAL_ALPHA,
        TILE_MATERIAL_LIQUID_TRANSPARENT,
        TILE_MATERIAL_LIQUID_OPAQUE,
 };
@@ -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;
@@ -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;