summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanila Shutov <dcbrwn2@gmail.com>2020-06-16 22:48:31 +0300
committerGitHub <noreply@github.com>2020-06-16 20:48:31 +0100
commit3a6dfda358112e2fb5d6f887a1a1e936eacddadd (patch)
tree340e1e0442ef8ba346b522580b2b6bee66246b30
parent0a1181f7637adab6fe1ba5d3c09038912a06b37f (diff)
downloadminetest-3a6dfda358112e2fb5d6f887a1a1e936eacddadd.tar.gz
minetest-3a6dfda358112e2fb5d6f887a1a1e936eacddadd.tar.bz2
minetest-3a6dfda358112e2fb5d6f887a1a1e936eacddadd.zip
Make shading of CAOs optional (#10033)
-rw-r--r--client/shaders/object_shader/opengl_vertex.glsl4
-rw-r--r--doc/lua_api.txt3
-rw-r--r--games/devtest/mods/testentities/visuals.lua12
-rw-r--r--src/client/content_cao.cpp15
-rw-r--r--src/client/mesh.cpp2
-rw-r--r--src/client/shader.cpp6
-rw-r--r--src/client/tile.h2
-rw-r--r--src/object_properties.cpp6
-rw-r--r--src/object_properties.h1
-rw-r--r--src/script/common/c_content.cpp3
10 files changed, 47 insertions, 7 deletions
diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl
index 59171145f..968a07e22 100644
--- a/client/shaders/object_shader/opengl_vertex.glsl
+++ b/client/shaders/object_shader/opengl_vertex.glsl
@@ -39,11 +39,15 @@ void main(void)
lightVec = sunPosition - worldPosition;
eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz;
+#if (MATERIAL_TYPE == TILE_MATERIAL_PLAIN) || (MATERIAL_TYPE == TILE_MATERIAL_PLAIN_ALPHA)
+ vIDiff = 1.0;
+#else
// This is intentional comparison with zero without any margin.
// If normal is not equal to zero exactly, then we assume it's a valid, just not normalized vector
vIDiff = length(gl_Normal) == 0.0
? 1.0
: directional_ambient(normalize(gl_Normal));
+#endif
gl_FrontColor = gl_BackColor = gl_Color;
}
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 07e9698e8..11c5cfb91 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -6644,6 +6644,9 @@ Player properties need to be saved manually.
damage_texture_modifier = "^[brighten",
-- Texture modifier to be applied for a short duration when object is hit
+
+ shaded = true,
+ -- Setting this to 'false' disables diffuse lighting of entity
}
Entity definition
diff --git a/games/devtest/mods/testentities/visuals.lua b/games/devtest/mods/testentities/visuals.lua
index 314f51657..83f361f16 100644
--- a/games/devtest/mods/testentities/visuals.lua
+++ b/games/devtest/mods/testentities/visuals.lua
@@ -55,6 +55,17 @@ minetest.register_entity("testentities:mesh", {
},
})
+minetest.register_entity("testentities:mesh_unshaded", {
+ initial_properties = {
+ visual = "mesh",
+ mesh = "testnodes_pyramid.obj",
+ textures = {
+ "testnodes_mesh_stripes2.png"
+ },
+ shaded = false,
+ },
+})
+
-- Advanced visual tests
-- A test entity for testing animated and yaw-modulated sprites
@@ -71,4 +82,3 @@ minetest.register_entity("testentities:yawsprite", {
self.object:set_sprite({x=0, y=0}, 1, 0, true)
end,
})
-
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp
index eec4e3de0..5352c35f4 100644
--- a/src/client/content_cao.cpp
+++ b/src/client/content_cao.cpp
@@ -577,10 +577,16 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
if (m_enable_shaders) {
IShaderSource *shader_source = m_client->getShaderSource();
- u32 shader_id = shader_source->getShader(
- "object_shader",
- (m_prop.use_texture_alpha) ? TILE_MATERIAL_ALPHA : TILE_MATERIAL_BASIC,
- NDT_NORMAL);
+ MaterialType material_type;
+
+ if (m_prop.shaded && m_prop.glow == 0)
+ material_type = (m_prop.use_texture_alpha) ?
+ TILE_MATERIAL_ALPHA : TILE_MATERIAL_BASIC;
+ else
+ material_type = (m_prop.use_texture_alpha) ?
+ TILE_MATERIAL_PLAIN_ALPHA : TILE_MATERIAL_PLAIN;
+
+ u32 shader_id = shader_source->getShader("object_shader", material_type, NDT_NORMAL);
m_material_type = shader_source->getShaderInfo(shader_id).material;
} else {
m_material_type = (m_prop.use_texture_alpha) ?
@@ -1504,6 +1510,7 @@ bool GenericCAO::visualExpiryRequired(const ObjectProperties &new_) const
return old.backface_culling != new_.backface_culling ||
old.is_visible != new_.is_visible ||
old.mesh != new_.mesh ||
+ old.shaded != new_.shaded ||
old.use_texture_alpha != new_.use_texture_alpha ||
old.visual != new_.visual ||
old.visual_size != new_.visual_size ||
diff --git a/src/client/mesh.cpp b/src/client/mesh.cpp
index 68832849e..e1ec22068 100644
--- a/src/client/mesh.cpp
+++ b/src/client/mesh.cpp
@@ -341,7 +341,7 @@ bool checkMeshNormals(scene::IMesh *mesh)
// hurting the performance and covering only really weird broken models.
f32 length = buffer->getNormal(0).getLength();
- if (!std::isfinite(length) || std::fabs(length) < 1e-10f)
+ if (!std::isfinite(length) || length < 1e-10f)
return false;
}
diff --git a/src/client/shader.cpp b/src/client/shader.cpp
index eda415ce6..ee6079f7a 100644
--- a/src/client/shader.cpp
+++ b/src/client/shader.cpp
@@ -537,11 +537,13 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
shaderinfo.base_material = video::EMT_SOLID;
break;
case TILE_MATERIAL_ALPHA:
+ case TILE_MATERIAL_PLAIN_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_PLAIN:
case TILE_MATERIAL_WAVING_LEAVES:
case TILE_MATERIAL_WAVING_PLANTS:
case TILE_MATERIAL_WAVING_LIQUID_BASIC:
@@ -644,9 +646,11 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
"TILE_MATERIAL_WAVING_LIQUID_BASIC",
"TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT",
"TILE_MATERIAL_WAVING_LIQUID_OPAQUE",
+ "TILE_MATERIAL_PLAIN",
+ "TILE_MATERIAL_PLAIN_ALPHA",
};
- for (int i = 0; i < 10; i++){
+ for (int i = 0; i < 12; i++){
shaders_header += "#define ";
shaders_header += materialTypes[i];
shaders_header += " ";
diff --git a/src/client/tile.h b/src/client/tile.h
index 533df676e..52e0a2b2b 100644
--- a/src/client/tile.h
+++ b/src/client/tile.h
@@ -150,6 +150,8 @@ enum MaterialType{
TILE_MATERIAL_WAVING_LIQUID_BASIC,
TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT,
TILE_MATERIAL_WAVING_LIQUID_OPAQUE,
+ TILE_MATERIAL_PLAIN,
+ TILE_MATERIAL_PLAIN_ALPHA
};
// Material flags
diff --git a/src/object_properties.cpp b/src/object_properties.cpp
index 6ff344dce..8d51bcbfa 100644
--- a/src/object_properties.cpp
+++ b/src/object_properties.cpp
@@ -69,6 +69,7 @@ std::string ObjectProperties::dump()
os << ", zoom_fov=" << zoom_fov;
os << ", use_texture_alpha=" << use_texture_alpha;
os << ", damage_texture_modifier=" << damage_texture_modifier;
+ os << ", shaded=" << shaded;
return os.str();
}
@@ -116,6 +117,7 @@ void ObjectProperties::serialize(std::ostream &os) const
writeF32(os, zoom_fov);
writeU8(os, use_texture_alpha);
os << serializeString(damage_texture_modifier);
+ writeU8(os, shaded);
// Add stuff only at the bottom.
// Never remove anything, because we don't want new versions of this
@@ -170,5 +172,9 @@ void ObjectProperties::deSerialize(std::istream &is)
use_texture_alpha = readU8(is);
try {
damage_texture_modifier = deSerializeString(is);
+ u8 tmp = readU8(is);
+ if (is.eof())
+ throw SerializationError("");
+ shaded = tmp;
} catch (SerializationError &e) {}
}
diff --git a/src/object_properties.h b/src/object_properties.h
index f7848f5a2..f010c1daf 100644
--- a/src/object_properties.h
+++ b/src/object_properties.h
@@ -61,6 +61,7 @@ struct ObjectProperties
float eye_height = 1.625f;
float zoom_fov = 0.0f;
bool use_texture_alpha = false;
+ bool shaded = true;
ObjectProperties();
std::string dump();
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 2157d087d..3dfd7ce61 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -327,6 +327,7 @@ void read_object_properties(lua_State *L, int index,
getfloatfield(L, -1, "zoom_fov", prop->zoom_fov);
getboolfield(L, -1, "use_texture_alpha", prop->use_texture_alpha);
+ getboolfield(L, -1, "shaded", prop->shaded);
getstringfield(L, -1, "damage_texture_modifier", prop->damage_texture_modifier);
}
@@ -411,6 +412,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
lua_setfield(L, -2, "zoom_fov");
lua_pushboolean(L, prop->use_texture_alpha);
lua_setfield(L, -2, "use_texture_alpha");
+ lua_pushboolean(L, prop->shaded);
+ lua_setfield(L, -2, "shaded");
lua_pushlstring(L, prop->damage_texture_modifier.c_str(), prop->damage_texture_modifier.size());
lua_setfield(L, -2, "damage_texture_modifier");
}