Skip to content

Commit

Permalink
Fix entity lighting (#9514)
Browse files Browse the repository at this point in the history
fixes #9482
  • Loading branch information
FunkyDck committed Mar 16, 2020
1 parent ca64648 commit 5c1b725
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 37 deletions.
72 changes: 35 additions & 37 deletions src/client/content_cao.cpp
Expand Up @@ -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);
{
Expand All @@ -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();
Expand Down Expand Up @@ -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") {
Expand All @@ -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);

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -795,6 +788,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
updateAnimation();
updateBonePosition();
updateAttachments();
setNodeLight(m_last_light);
}

void GenericCAO::updateLight(u8 light_at_pos)
Expand Down Expand Up @@ -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);
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/client/content_cao.h
Expand Up @@ -238,6 +238,8 @@ class GenericCAO : public ClientActiveObject

void updateLightNoCheck(u8 light_at_pos);

void setNodeLight(u8 light);

v3s16 getLightPosition();

void updateNodePos();
Expand Down

0 comments on commit 5c1b725

Please sign in to comment.