Require 'waving = 3' in a nodedef to apply the liquid waving shader (#8418)
authorParamat <paramat@users.noreply.github.com>
Wed, 27 Mar 2019 00:18:43 +0000 (00:18 +0000)
committerGitHub <noreply@github.com>
Wed, 27 Mar 2019 00:18:43 +0000 (00:18 +0000)
Makes the liquid waving shader per-nodedef like waving leaves/plants,
instead of being applied to all liquids.
Like the waving leaves/plants shaders, the liquid waving shader can
also be applied to meshes and nodeboxes.

Derived from a PR by t0ny2.

builtin/mainmenu/tab_settings.lua
client/shaders/nodes_shader/opengl_vertex.glsl
doc/lua_api.txt
src/client/shader.cpp
src/client/tile.h
src/nodedef.cpp

index 71b2d88fa8888b2c4d1bb78a60f5a6ce3a0c3c18..75d7ceee80ad6835dd9b2f21f9d00ead4b91d943 100644 (file)
@@ -254,7 +254,7 @@ local function formspec(tabview, name, tabdata)
                                        .. dump(core.settings:get_bool("generate_normalmaps")) .. "]" ..
                        "checkbox[8.25,2;cb_parallax;" .. fgettext("Parallax Occlusion") .. ";"
                                        .. dump(core.settings:get_bool("enable_parallax_occlusion")) .. "]" ..
-                       "checkbox[8.25,2.5;cb_waving_water;" .. fgettext("Waving Water") .. ";"
+                       "checkbox[8.25,2.5;cb_waving_water;" .. fgettext("Waving Liquids") .. ";"
                                        .. dump(core.settings:get_bool("enable_waving_water")) .. "]" ..
                        "checkbox[8.25,3;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";"
                                        .. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" ..
@@ -271,7 +271,7 @@ local function formspec(tabview, name, tabdata)
                        "label[8.38,2.2;" .. core.colorize("#888888",
                                        fgettext("Parallax Occlusion")) .. "]" ..
                        "label[8.38,2.7;" .. core.colorize("#888888",
-                                       fgettext("Waving Water")) .. "]" ..
+                                       fgettext("Waving Liquids")) .. "]" ..
                        "label[8.38,3.2;" .. core.colorize("#888888",
                                        fgettext("Waving Leaves")) .. "]" ..
                        "label[8.38,3.7;" .. core.colorize("#888888",
index 54b569c5eef29793238c0a1e19b357e66ac3df39..f1e63d5d973eb5d95b89c3d6b005cd8e73681609 100644 (file)
@@ -68,7 +68,7 @@ float disp_z;
 #endif
 
 
-#if (MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE) && ENABLE_WAVING_WATER
+#if (MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_OPAQUE || MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_BASIC) && ENABLE_WAVING_WATER
        vec4 pos = gl_Vertex;
        pos.y -= 2.0;
        float posYbuf = (pos.z / WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH);
index 9ac37e8815604b97165aadeb5990e56a5a609688..6d38e14c1ff642c1a3961300e1fb02c31833efd1 100644 (file)
@@ -6135,12 +6135,15 @@ Used by `minetest.register_node`.
         legacy_wallmounted = false,
 
         waving = 0,
-        -- Valid for mesh, nodebox, plantlike, allfaces_optional nodes.
-        -- 1 - wave node like plants (top of node moves, bottom is fixed)
+        -- Valid for drawtypes:
+        -- mesh, nodebox, plantlike, allfaces_optional, liquid, flowingliquid.
+        -- 1 - wave node like plants (node top moves side-to-side, bottom is fixed)
         -- 2 - wave node like leaves (whole node moves side-to-side)
-        -- caveats: not all models will properly wave.
-        -- plantlike drawtype nodes can only wave like plants.
-        -- allfaces_optional drawtype nodes can only wave like leaves.
+        -- 3 - wave node like liquids (whole node moves up and down)
+        -- Not all models will properly wave.
+        -- plantlike drawtype can only wave like plants.
+        -- allfaces_optional drawtype can only wave like leaves.
+        -- liquid, flowingliquid drawtypes can only wave like liquids.
 
         sounds = {
             footstep = <SimpleSoundSpec>,
index 3b49a36bad48c25f6753e1f0bb61a9314c6dd010..f36ff3d85417b20356a9358877ccab3d30c0654a 100644 (file)
@@ -527,15 +527,18 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
        switch (material_type) {
        case TILE_MATERIAL_OPAQUE:
        case TILE_MATERIAL_LIQUID_OPAQUE:
+       case TILE_MATERIAL_WAVING_LIQUID_OPAQUE:
                shaderinfo.base_material = video::EMT_SOLID;
                break;
        case TILE_MATERIAL_ALPHA:
        case TILE_MATERIAL_LIQUID_TRANSPARENT:
+       case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT:
                shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
                break;
        case TILE_MATERIAL_BASIC:
        case TILE_MATERIAL_WAVING_LEAVES:
        case TILE_MATERIAL_WAVING_PLANTS:
+       case TILE_MATERIAL_WAVING_LIQUID_BASIC:
                shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
                break;
        }
@@ -631,10 +634,13 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
                "TILE_MATERIAL_LIQUID_OPAQUE",
                "TILE_MATERIAL_WAVING_LEAVES",
                "TILE_MATERIAL_WAVING_PLANTS",
-               "TILE_MATERIAL_OPAQUE"
+               "TILE_MATERIAL_OPAQUE",
+               "TILE_MATERIAL_WAVING_LIQUID_BASIC",
+               "TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT",
+               "TILE_MATERIAL_WAVING_LIQUID_OPAQUE",
        };
 
-       for (int i = 0; i < 7; i++){
+       for (int i = 0; i < 10; i++){
                shaders_header += "#define ";
                shaders_header += materialTypes[i];
                shaders_header += " ";
index 2a33dd160801ed35acf1f3a0c7cab26f099cdce2..d0c45b4a4025fa7cdbec67039cfaaf7f129fb4a8 100644 (file)
@@ -144,7 +144,10 @@ enum MaterialType{
        TILE_MATERIAL_LIQUID_OPAQUE,
        TILE_MATERIAL_WAVING_LEAVES,
        TILE_MATERIAL_WAVING_PLANTS,
-       TILE_MATERIAL_OPAQUE
+       TILE_MATERIAL_OPAQUE,
+       TILE_MATERIAL_WAVING_LIQUID_BASIC,
+       TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT,
+       TILE_MATERIAL_WAVING_LIQUID_OPAQUE,
 };
 
 // Material flags
@@ -208,16 +211,19 @@ struct TileLayer
                switch (material_type) {
                case TILE_MATERIAL_OPAQUE:
                case TILE_MATERIAL_LIQUID_OPAQUE:
+               case TILE_MATERIAL_WAVING_LIQUID_OPAQUE:
                        material.MaterialType = video::EMT_SOLID;
                        break;
                case TILE_MATERIAL_BASIC:
                case TILE_MATERIAL_WAVING_LEAVES:
                case TILE_MATERIAL_WAVING_PLANTS:
+               case TILE_MATERIAL_WAVING_LIQUID_BASIC:
                        material.MaterialTypeParam = 0.5;
                        material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
                        break;
                case TILE_MATERIAL_ALPHA:
                case TILE_MATERIAL_LIQUID_TRANSPARENT:
+               case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT:
                        material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
                        break;
                default:
index 03a163bd3412a6ec28ab68a2ab01c7ec7275811e..83e3968c3d3c784a38fb40c534cbca4d9c5339e0 100644 (file)
@@ -798,6 +798,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
                        material_type = TILE_MATERIAL_WAVING_PLANTS;
                else if (waving == 2)
                        material_type = TILE_MATERIAL_WAVING_LEAVES;
+               else if (waving == 3)
+                       material_type = TILE_MATERIAL_WAVING_LIQUID_BASIC;
                break;
        case NDT_TORCHLIKE:
        case NDT_SIGNLIKE:
@@ -815,8 +817,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
                correctAlpha(tdef, 6);
                correctAlpha(tdef_overlay, 6);
                correctAlpha(tdef_spec, CF_SPECIAL_COUNT);
-               material_type = (alpha == 255) ?
-                       TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
+
+               if (waving == 3) {
+                       material_type = (alpha == 255) ? TILE_MATERIAL_WAVING_LIQUID_OPAQUE :
+                               TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT;
+               } else {
+                       material_type = (alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE :
+                               TILE_MATERIAL_LIQUID_TRANSPARENT;
+               }
        }
 
        u32 tile_shader = shdsrc->getShader("nodes_shader", material_type, drawtype);