Fix entity lighting (#9514)

fixes #9482
This commit is contained in:
Danila Shutov 2020-03-17 00:58:13 +03:00 committed by GitHub
parent ca646487f2
commit 5c1b72544a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 37 deletions

View File

@ -621,8 +621,6 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
setSceneNodeMaterial(m_spritenode);
u8 li = m_last_light;
m_spritenode->setColor(video::SColor(255,li,li,li));
m_spritenode->setSize(v2f(m_prop.visual_size.X,
m_prop.visual_size.Y) * BS);
{
@ -636,8 +634,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
scene::SMesh *mesh = new scene::SMesh();
double dx = BS * m_prop.visual_size.X / 2;
double dy = BS * m_prop.visual_size.Y / 2;
u8 li = m_last_light;
video::SColor c(255, li, li, li);
video::SColor c(0xFFFFFFFF);
{ // Front
scene::IMeshBuffer *buf = new scene::SMeshBuffer();
@ -717,8 +714,6 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
mesh->drop();
m_meshnode->setScale(m_prop.visual_size);
u8 li = m_last_light;
setMeshColor(m_meshnode->getMesh(), video::SColor(255,li,li,li));
setSceneNodeMaterial(m_meshnode);
} else if (m_prop.visual == "mesh") {
@ -731,12 +726,11 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
mesh->drop(); // The scene node took hold of it
m_animated_meshnode->animateJoints(); // Needed for some animations
m_animated_meshnode->setScale(m_prop.visual_size);
u8 li = m_last_light;
// set vertex colors to ensure alpha is set
setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li));
setMeshColor(m_animated_meshnode->getMesh(), video::SColor(0xFFFFFFFF));
setAnimatedMeshColor(m_animated_meshnode, video::SColor(255,li,li,li));
setAnimatedMeshColor(m_animated_meshnode, video::SColor(0xFFFFFFFF));
setSceneNodeMaterial(m_animated_meshnode);
@ -766,8 +760,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
(m_prop.visual == "wielditem"));
m_wield_meshnode->setScale(m_prop.visual_size / 2.0f);
u8 li = m_last_light;
m_wield_meshnode->setColor(video::SColor(255, li, li, li));
m_wield_meshnode->setColor(video::SColor(0xFFFFFFFF));
} else {
infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual
<<"\" not supported"<<std::endl;
@ -795,6 +788,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
updateAnimation();
updateBonePosition();
updateAttachments();
setNodeLight(m_last_light);
}
void GenericCAO::updateLight(u8 light_at_pos)
@ -824,39 +818,43 @@ void GenericCAO::updateLightNoCheck(u8 light_at_pos)
if (li != m_last_light) {
m_last_light = li;
video::SColor color(255,li,li,li);
setNodeLight(li);
}
}
if (m_enable_shaders) {
scene::ISceneNode *node = getSceneNode();
void GenericCAO::setNodeLight(u8 light)
{
video::SColor color(255, light, light, light);
if (node == nullptr) {
return;
}
if (m_enable_shaders) {
scene::ISceneNode *node = getSceneNode();
if (m_prop.visual == "upright_sprite") {
scene::IMesh *mesh = m_meshnode->getMesh();
for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) {
scene::IMeshBuffer* buf = mesh->getMeshBuffer(i);
video::SMaterial& material = buf->getMaterial();
material.EmissiveColor = color;
}
} else {
for (u32 i = 0; i < node->getMaterialCount(); ++i) {
video::SMaterial& material = node->getMaterial(i);
material.EmissiveColor = color;
}
if (node == nullptr)
return;
if (m_prop.visual == "upright_sprite") {
scene::IMesh *mesh = m_meshnode->getMesh();
for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) {
scene::IMeshBuffer *buf = mesh->getMeshBuffer(i);
video::SMaterial &material = buf->getMaterial();
material.EmissiveColor = color;
}
} else {
if (m_meshnode) {
setMeshColor(m_meshnode->getMesh(), color);
} else if (m_animated_meshnode) {
setAnimatedMeshColor(m_animated_meshnode, color);
} else if (m_wield_meshnode) {
m_wield_meshnode->setColor(color);
} else if (m_spritenode) {
m_spritenode->setColor(color);
for (u32 i = 0; i < node->getMaterialCount(); ++i) {
video::SMaterial &material = node->getMaterial(i);
material.EmissiveColor = color;
}
}
} else {
if (m_meshnode) {
setMeshColor(m_meshnode->getMesh(), color);
} else if (m_animated_meshnode) {
setAnimatedMeshColor(m_animated_meshnode, color);
} else if (m_wield_meshnode) {
m_wield_meshnode->setColor(color);
} else if (m_spritenode) {
m_spritenode->setColor(color);
}
}
}

View File

@ -238,6 +238,8 @@ public:
void updateLightNoCheck(u8 light_at_pos);
void setNodeLight(u8 light);
v3s16 getLightPosition();
void updateNodePos();