From 42e1a127140965cac1be6e51e48192e341c2a29e Mon Sep 17 00:00:00 2001 From: Paramat Date: Wed, 27 Mar 2019 00:18:43 +0000 Subject: [PATCH] Require 'waving = 3' in a nodedef to apply the liquid waving shader (#8418) 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 | 4 ++-- client/shaders/nodes_shader/opengl_vertex.glsl | 2 +- doc/lua_api.txt | 13 ++++++++----- src/client/shader.cpp | 10 ++++++++-- src/client/tile.h | 8 +++++++- src/nodedef.cpp | 12 ++++++++++-- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 71b2d88fa..75d7ceee8 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -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", diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 54b569c5e..f1e63d5d9 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -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); diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9ac37e881..6d38e14c1 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -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 = , diff --git a/src/client/shader.cpp b/src/client/shader.cpp index 3b49a36ba..f36ff3d85 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -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 += " "; diff --git a/src/client/tile.h b/src/client/tile.h index 2a33dd160..d0c45b4a4 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -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: diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 03a163bd3..83e3968c3 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -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);