--- /dev/null
+trans_alphach
--- /dev/null
+\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
--- /dev/null
+\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
^ 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"
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];
= 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);
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++){
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 */
enum MaterialType{
TILE_MATERIAL_BASIC,
+ TILE_MATERIAL_ALPHA,
TILE_MATERIAL_LIQUID_TRANSPARENT,
TILE_MATERIAL_LIQUID_OPAQUE,
};
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;
}
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;