diff options
author | SmallJoker <SmallJoker@users.noreply.github.com> | 2020-06-01 19:01:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-01 19:01:47 +0200 |
commit | a08d18acad345363780f5286300d65b39ea9c9f9 (patch) | |
tree | 0929b7f73ea7c781a8c46aeafdd445634b55a443 /src | |
parent | f849917bbe9c5eff51bee0a3125eabed16efb172 (diff) | |
download | minetest-a08d18acad345363780f5286300d65b39ea9c9f9.tar.gz minetest-a08d18acad345363780f5286300d65b39ea9c9f9.tar.bz2 minetest-a08d18acad345363780f5286300d65b39ea9c9f9.zip |
ContentCAO: Update light of all attached entities (#9975)
Diffstat (limited to 'src')
-rw-r--r-- | src/client/clientenvironment.cpp | 30 | ||||
-rw-r--r-- | src/client/clientobject.h | 6 | ||||
-rw-r--r-- | src/client/content_cao.cpp | 42 | ||||
-rw-r--r-- | src/client/content_cao.h | 4 |
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); |