aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2020-06-01 19:01:47 +0200
committerGitHub <noreply@github.com>2020-06-01 19:01:47 +0200
commita08d18acad345363780f5286300d65b39ea9c9f9 (patch)
tree0929b7f73ea7c781a8c46aeafdd445634b55a443
parentf849917bbe9c5eff51bee0a3125eabed16efb172 (diff)
downloadminetest-a08d18acad345363780f5286300d65b39ea9c9f9.tar.gz
minetest-a08d18acad345363780f5286300d65b39ea9c9f9.tar.bz2
minetest-a08d18acad345363780f5286300d65b39ea9c9f9.zip
ContentCAO: Update light of all attached entities (#9975)
-rw-r--r--src/client/clientenvironment.cpp30
-rw-r--r--src/client/clientobject.h6
-rw-r--r--src/client/content_cao.cpp42
-rw-r--r--src/client/content_cao.h4
4 files changed, 22 insertions, 60 deletions
diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp
index 6840f2db3..44ea1e4a1 100644
--- a/src/client/clientenvironment.cpp
+++ b/src/client/clientenvironment.cpp
@@ -320,21 +320,8 @@ void ClientEnvironment::step(float dtime)
// Step object
cao->step(dtime, this);
- if (update_lighting) {
- // Update lighting
- u8 light = 0;
- bool pos_ok;
-
- // Get node at head
- v3s16 p = cao->getLightPosition();
- MapNode n = this->m_map->getNode(p, &pos_ok);
- if (pos_ok)
- light = n.getLightBlend(day_night_ratio, m_client->ndef());
- else
- light = blend_light(day_night_ratio, LIGHT_SUN, 0);
-
- cao->updateLight(light);
- }
+ if (update_lighting)
+ cao->updateLight(day_night_ratio);
};
m_ao_manager.step(dtime, cb_state);
@@ -402,18 +389,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
object->addToScene(m_texturesource);
// Update lighting immediately
- u8 light = 0;
- bool pos_ok;
-
- // Get node at head
- v3s16 p = object->getLightPosition();
- MapNode n = m_map->getNode(p, &pos_ok);
- if (pos_ok)
- light = n.getLightBlend(getDayNightRatio(), m_client->ndef());
- else
- light = blend_light(getDayNightRatio(), LIGHT_SUN, 0);
-
- object->updateLight(light);
+ object->updateLight(getDayNightRatio());
return object->getId();
}
diff --git a/src/client/clientobject.h b/src/client/clientobject.h
index 12e0db35b..8e64b8406 100644
--- a/src/client/clientobject.h
+++ b/src/client/clientobject.h
@@ -41,10 +41,10 @@ public:
virtual void addToScene(ITextureSource *tsrc) {}
virtual void removeFromScene(bool permanent) {}
- // 0 <= light_at_pos <= LIGHT_SUN
- virtual void updateLight(u8 light_at_pos) {}
- virtual void updateLightNoCheck(u8 light_at_pos) {}
+
+ virtual void updateLight(u32 day_night_ratio) {}
virtual v3s16 getLightPosition() { return v3s16(0, 0, 0); }
+
virtual bool getCollisionBox(aabb3f *toset) const { return false; }
virtual bool getSelectionBox(aabb3f *toset) const { return false; }
virtual bool collideWithObjects() const { return false; }
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp
index dde31899b..d0682e51e 100644
--- a/src/client/content_cao.cpp
+++ b/src/client/content_cao.cpp
@@ -181,7 +181,7 @@ public:
void addToScene(ITextureSource *tsrc);
void removeFromScene(bool permanent);
- void updateLight(u8 light_at_pos);
+ void updateLight(u32 day_night_ratio);
v3s16 getLightPosition();
void updateNodePos();
@@ -254,7 +254,7 @@ void TestCAO::removeFromScene(bool permanent)
m_node = NULL;
}
-void TestCAO::updateLight(u8 light_at_pos)
+void TestCAO::updateLight(u32 day_night_ratio)
{
}
@@ -784,34 +784,22 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
setNodeLight(m_last_light);
}
-void GenericCAO::updateLight(u8 light_at_pos)
+void GenericCAO::updateLight(u32 day_night_ratio)
{
- // Don't update light of attached one
- if (getParent() != NULL) {
- return;
- }
-
- updateLightNoCheck(light_at_pos);
-
- // Update light of all children
- for (u16 i : m_attachment_child_ids) {
- ClientActiveObject *obj = m_env->getActiveObject(i);
- if (obj) {
- obj->updateLightNoCheck(light_at_pos);
- }
- }
-}
-
-void GenericCAO::updateLightNoCheck(u8 light_at_pos)
-{
- if (m_glow < 0)
- return;
+ u8 light_at_pos = 0;
+ bool pos_ok;
- u8 li = decode_light(light_at_pos + m_glow);
+ v3s16 p = getLightPosition();
+ MapNode n = m_env->getMap().getNode(p, &pos_ok);
+ if (pos_ok)
+ light_at_pos = n.getLightBlend(day_night_ratio, m_client->ndef());
+ else
+ light_at_pos = blend_light(day_night_ratio, LIGHT_SUN, 0);
- if (li != m_last_light) {
- m_last_light = li;
- setNodeLight(li);
+ u8 light = decode_light(light_at_pos);
+ if (light != m_last_light) {
+ m_last_light = light;
+ setNodeLight(light);
}
}
diff --git a/src/client/content_cao.h b/src/client/content_cao.h
index 8e2a13ea8..7693dd3d2 100644
--- a/src/client/content_cao.h
+++ b/src/client/content_cao.h
@@ -236,9 +236,7 @@ public:
m_visuals_expired = true;
}
- void updateLight(u8 light_at_pos);
-
- void updateLightNoCheck(u8 light_at_pos);
+ void updateLight(u32 day_night_ratio);
void setNodeLight(u8 light);