forked from Mirrorlandia_minetest/minetest
Optional alpha channel support for entities
This commit is contained in:
parent
0396717256
commit
821e3f7072
@ -11,6 +11,7 @@ core.features = {
|
|||||||
area_store_custom_ids = true,
|
area_store_custom_ids = true,
|
||||||
add_entity_with_staticdata = true,
|
add_entity_with_staticdata = true,
|
||||||
no_chat_message_prediction = true,
|
no_chat_message_prediction = true,
|
||||||
|
object_use_texture_alpha = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
function core.has_feature(arg)
|
function core.has_feature(arg)
|
||||||
|
@ -2660,7 +2660,7 @@ Strings that need to be translated can contain several escapes, preceded by `@`.
|
|||||||
chat_send_player_param3 = true,
|
chat_send_player_param3 = true,
|
||||||
get_all_craft_recipes_works = true,
|
get_all_craft_recipes_works = true,
|
||||||
use_texture_alpha = true,
|
use_texture_alpha = true,
|
||||||
-- ^ The transparency channel of textures can be used optionally
|
-- ^ The transparency channel of textures can optionally be used on nodes
|
||||||
no_legacy_abms = true,
|
no_legacy_abms = true,
|
||||||
-- ^ Tree and grass ABMs are no longer done from C++
|
-- ^ Tree and grass ABMs are no longer done from C++
|
||||||
texture_names_parens = true,
|
texture_names_parens = true,
|
||||||
@ -2671,6 +2671,9 @@ Strings that need to be translated can contain several escapes, preceded by `@`.
|
|||||||
-- ^ add_entity supports passing initial staticdata to on_activate
|
-- ^ add_entity supports passing initial staticdata to on_activate
|
||||||
no_chat_message_prediction = true,
|
no_chat_message_prediction = true,
|
||||||
-- ^ Chat messages are no longer predicted
|
-- ^ Chat messages are no longer predicted
|
||||||
|
object_use_texture_alpha = true
|
||||||
|
-- ^ The transparency channel of textures can optionally be used on
|
||||||
|
-- objects (ie: players and lua entities)
|
||||||
}
|
}
|
||||||
* `minetest.has_feature(arg)`: returns `boolean, missing_features`
|
* `minetest.has_feature(arg)`: returns `boolean, missing_features`
|
||||||
* `arg`: string or table in format `{foo=true, bar=true}`
|
* `arg`: string or table in format `{foo=true, bar=true}`
|
||||||
@ -4957,6 +4960,10 @@ Definition tables
|
|||||||
-- ^ "wielditem" expects 'textures = {itemname}' (see 'visual' above).
|
-- ^ "wielditem" expects 'textures = {itemname}' (see 'visual' above).
|
||||||
colors = {},
|
colors = {},
|
||||||
-- ^ Number of required colors depends on visual.
|
-- ^ Number of required colors depends on visual.
|
||||||
|
use_texture_alpha = false,
|
||||||
|
-- ^ Use texture's alpha channel, excludes "upright_sprite" and "wielditem"
|
||||||
|
-- ^ Note: currently causes visual issues when viewed through other
|
||||||
|
-- ^ semi-transparent materials such as water.
|
||||||
spritediv = {x = 1, y = 1},
|
spritediv = {x = 1, y = 1},
|
||||||
-- ^ Used with spritesheet textures for animation and/or frame selection
|
-- ^ Used with spritesheet textures for animation and/or frame selection
|
||||||
-- according to position relative to player.
|
-- according to position relative to player.
|
||||||
|
@ -477,6 +477,9 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video::E_MATERIAL_TYPE material_type = (m_prop.use_texture_alpha) ?
|
||||||
|
video::EMT_TRANSPARENT_ALPHA_CHANNEL : video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
|
|
||||||
if (m_prop.visual == "sprite") {
|
if (m_prop.visual == "sprite") {
|
||||||
infostream<<"GenericCAO::addToScene(): single_sprite"<<std::endl;
|
infostream<<"GenericCAO::addToScene(): single_sprite"<<std::endl;
|
||||||
m_spritenode = RenderingEngine::get_scene_manager()->addBillboardSceneNode(
|
m_spritenode = RenderingEngine::get_scene_manager()->addBillboardSceneNode(
|
||||||
@ -486,7 +489,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
|
|||||||
tsrc->getTextureForMesh("unknown_node.png"));
|
tsrc->getTextureForMesh("unknown_node.png"));
|
||||||
m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
|
m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||||
m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
m_spritenode->setMaterialType(material_type);
|
||||||
m_spritenode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
|
m_spritenode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
|
||||||
u8 li = m_last_light;
|
u8 li = m_last_light;
|
||||||
m_spritenode->setColor(video::SColor(255,li,li,li));
|
m_spritenode->setColor(video::SColor(255,li,li,li));
|
||||||
@ -564,7 +567,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
|
|||||||
|
|
||||||
m_meshnode->setMaterialFlag(video::EMF_LIGHTING, false);
|
m_meshnode->setMaterialFlag(video::EMF_LIGHTING, false);
|
||||||
m_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
m_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
m_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
m_meshnode->setMaterialType(material_type);
|
||||||
m_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
|
m_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
|
||||||
}
|
}
|
||||||
else if(m_prop.visual == "mesh") {
|
else if(m_prop.visual == "mesh") {
|
||||||
@ -587,15 +590,12 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
|
|||||||
|
|
||||||
setAnimatedMeshColor(m_animated_meshnode, video::SColor(255,li,li,li));
|
setAnimatedMeshColor(m_animated_meshnode, video::SColor(255,li,li,li));
|
||||||
|
|
||||||
bool backface_culling = m_prop.backface_culling;
|
|
||||||
if (m_is_player)
|
|
||||||
backface_culling = false;
|
|
||||||
|
|
||||||
m_animated_meshnode->setMaterialFlag(video::EMF_LIGHTING, true);
|
m_animated_meshnode->setMaterialFlag(video::EMF_LIGHTING, true);
|
||||||
m_animated_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
m_animated_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
m_animated_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
m_animated_meshnode->setMaterialType(material_type);
|
||||||
m_animated_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
|
m_animated_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
|
||||||
m_animated_meshnode->setMaterialFlag(video::EMF_BACK_FACE_CULLING, backface_culling);
|
m_animated_meshnode->setMaterialFlag(video::EMF_BACK_FACE_CULLING,
|
||||||
|
m_prop.backface_culling);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
|
errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
|
||||||
@ -994,12 +994,16 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
m_current_texture_modifier = mod;
|
m_current_texture_modifier = mod;
|
||||||
m_glow = m_prop.glow;
|
m_glow = m_prop.glow;
|
||||||
|
|
||||||
|
video::E_MATERIAL_TYPE material_type = (m_prop.use_texture_alpha) ?
|
||||||
|
video::EMT_TRANSPARENT_ALPHA_CHANNEL : video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
|
|
||||||
if (m_spritenode) {
|
if (m_spritenode) {
|
||||||
if (m_prop.visual == "sprite") {
|
if (m_prop.visual == "sprite") {
|
||||||
std::string texturestring = "unknown_node.png";
|
std::string texturestring = "unknown_node.png";
|
||||||
if (!m_prop.textures.empty())
|
if (!m_prop.textures.empty())
|
||||||
texturestring = m_prop.textures[0];
|
texturestring = m_prop.textures[0];
|
||||||
texturestring += mod;
|
texturestring += mod;
|
||||||
|
m_spritenode->getMaterial(0).MaterialType = material_type;
|
||||||
m_spritenode->setMaterialTexture(0,
|
m_spritenode->setMaterialTexture(0,
|
||||||
tsrc->getTextureForMesh(texturestring));
|
tsrc->getTextureForMesh(texturestring));
|
||||||
|
|
||||||
@ -1034,9 +1038,11 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
|
|
||||||
// Set material flags and texture
|
// Set material flags and texture
|
||||||
video::SMaterial& material = m_animated_meshnode->getMaterial(i);
|
video::SMaterial& material = m_animated_meshnode->getMaterial(i);
|
||||||
|
material.MaterialType = material_type;
|
||||||
material.TextureLayer[0].Texture = texture;
|
material.TextureLayer[0].Texture = texture;
|
||||||
material.setFlag(video::EMF_LIGHTING, true);
|
material.setFlag(video::EMF_LIGHTING, true);
|
||||||
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
|
material.setFlag(video::EMF_BACK_FACE_CULLING, m_prop.backface_culling);
|
||||||
|
|
||||||
// don't filter low-res textures, makes them look blurry
|
// don't filter low-res textures, makes them look blurry
|
||||||
// player models have a res of 64
|
// player models have a res of 64
|
||||||
@ -1078,6 +1084,7 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
|
|
||||||
// Set material flags and texture
|
// Set material flags and texture
|
||||||
video::SMaterial& material = m_meshnode->getMaterial(i);
|
video::SMaterial& material = m_meshnode->getMaterial(i);
|
||||||
|
material.MaterialType = material_type;
|
||||||
material.setFlag(video::EMF_LIGHTING, false);
|
material.setFlag(video::EMF_LIGHTING, false);
|
||||||
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
material.setTexture(0,
|
material.setTexture(0,
|
||||||
|
@ -803,6 +803,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
|
|||||||
m_prop.eye_height = 1.625f;
|
m_prop.eye_height = 1.625f;
|
||||||
// End of default appearance
|
// End of default appearance
|
||||||
m_prop.is_visible = true;
|
m_prop.is_visible = true;
|
||||||
|
m_prop.backface_culling = false;
|
||||||
m_prop.makes_footstep_sound = true;
|
m_prop.makes_footstep_sound = true;
|
||||||
m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS;
|
m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS;
|
||||||
m_hp = m_prop.hp_max;
|
m_hp = m_prop.hp_max;
|
||||||
|
@ -68,6 +68,7 @@ std::string ObjectProperties::dump()
|
|||||||
os << ", static_save=" << static_save;
|
os << ", static_save=" << static_save;
|
||||||
os << ", eye_height=" << eye_height;
|
os << ", eye_height=" << eye_height;
|
||||||
os << ", zoom_fov=" << zoom_fov;
|
os << ", zoom_fov=" << zoom_fov;
|
||||||
|
os << ", use_texture_alpha=" << use_texture_alpha;
|
||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,6 +114,7 @@ void ObjectProperties::serialize(std::ostream &os) const
|
|||||||
writeU16(os, breath_max);
|
writeU16(os, breath_max);
|
||||||
writeF1000(os, eye_height);
|
writeF1000(os, eye_height);
|
||||||
writeF1000(os, zoom_fov);
|
writeF1000(os, zoom_fov);
|
||||||
|
writeU8(os, use_texture_alpha);
|
||||||
|
|
||||||
// Add stuff only at the bottom.
|
// Add stuff only at the bottom.
|
||||||
// Never remove anything, because we don't want new versions of this
|
// Never remove anything, because we don't want new versions of this
|
||||||
@ -164,4 +166,5 @@ void ObjectProperties::deSerialize(std::istream &is)
|
|||||||
breath_max = readU16(is);
|
breath_max = readU16(is);
|
||||||
eye_height = readF1000(is);
|
eye_height = readF1000(is);
|
||||||
zoom_fov = readF1000(is);
|
zoom_fov = readF1000(is);
|
||||||
|
use_texture_alpha = readU8(is);
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ struct ObjectProperties
|
|||||||
bool static_save = true;
|
bool static_save = true;
|
||||||
float eye_height = 1.625f;
|
float eye_height = 1.625f;
|
||||||
float zoom_fov = 0.0f;
|
float zoom_fov = 0.0f;
|
||||||
|
bool use_texture_alpha = false;
|
||||||
|
|
||||||
ObjectProperties();
|
ObjectProperties();
|
||||||
std::string dump();
|
std::string dump();
|
||||||
|
@ -304,6 +304,7 @@ void read_object_properties(lua_State *L, int index,
|
|||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
getfloatfield(L, -1, "zoom_fov", prop->zoom_fov);
|
getfloatfield(L, -1, "zoom_fov", prop->zoom_fov);
|
||||||
|
getboolfield(L, -1, "use_texture_alpha", prop->use_texture_alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@ -386,6 +387,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
|
|||||||
lua_setfield(L, -2, "wield_item");
|
lua_setfield(L, -2, "wield_item");
|
||||||
lua_pushnumber(L, prop->zoom_fov);
|
lua_pushnumber(L, prop->zoom_fov);
|
||||||
lua_setfield(L, -2, "zoom_fov");
|
lua_setfield(L, -2, "zoom_fov");
|
||||||
|
lua_pushboolean(L, prop->use_texture_alpha);
|
||||||
|
lua_setfield(L, -2, "use_texture_alpha");
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
Loading…
Reference in New Issue
Block a user