From 3f0cbbc372d5f359af18f5cbad37a1b165d3df4e Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sun, 7 Jun 2020 19:58:09 +0200 Subject: [PATCH] Use multiple light positions for CAO lighting --- src/client/clientobject.h | 1 - src/client/content_cao.cpp | 42 ++++++++++++++++++++++---------------- src/client/content_cao.h | 5 ++++- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/client/clientobject.h b/src/client/clientobject.h index 8e64b8406..ecd8059ef 100644 --- a/src/client/clientobject.h +++ b/src/client/clientobject.h @@ -43,7 +43,6 @@ public: virtual void removeFromScene(bool permanent) {} 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; } diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 644a71e6e..eec4e3de0 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -182,7 +182,6 @@ public: void addToScene(ITextureSource *tsrc); void removeFromScene(bool permanent); void updateLight(u32 day_night_ratio); - v3s16 getLightPosition(); void updateNodePos(); void step(float dtime, ClientEnvironment *env); @@ -258,11 +257,6 @@ void TestCAO::updateLight(u32 day_night_ratio) { } -v3s16 TestCAO::getLightPosition() -{ - return floatToInt(m_position, BS); -} - void TestCAO::updateNodePos() { if (!m_node) @@ -799,13 +793,20 @@ void GenericCAO::updateLight(u32 day_night_ratio) return; u8 light_at_pos = 0; - bool pos_ok; - - 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 + bool pos_ok = false; + + v3s16 pos[3]; + u16 npos = getLightPosition(pos); + for (u16 i = 0; i < npos; i++) { + bool this_ok; + MapNode n = m_env->getMap().getNode(pos[i], &this_ok); + if (this_ok) { + u8 this_light = n.getLightBlend(day_night_ratio, m_client->ndef()); + light_at_pos = MYMAX(light_at_pos, this_light); + pos_ok = true; + } + } + if (!pos_ok) light_at_pos = blend_light(day_night_ratio, LIGHT_SUN, 0); u8 light = decode_light(light_at_pos + m_glow); @@ -856,12 +857,17 @@ void GenericCAO::setNodeLight(u8 light) } } -v3s16 GenericCAO::getLightPosition() +u16 GenericCAO::getLightPosition(v3s16 *pos) { - if (m_is_player) - return floatToInt(m_position + v3f(0, 0.5 * BS, 0), BS); - - return floatToInt(m_position, BS); + const auto &box = m_prop.collisionbox; + pos[0] = floatToInt(m_position + box.MinEdge * BS, BS); + pos[1] = floatToInt(m_position + box.MaxEdge * BS, BS); + + // Skip center pos if it falls into the same node as Min or MaxEdge + if ((box.MaxEdge - box.MinEdge).getLengthSQ() < 3.0f) + return 2; + pos[2] = floatToInt(m_position + box.getCenter() * BS, BS); + return 3; } void GenericCAO::updateNametag() diff --git a/src/client/content_cao.h b/src/client/content_cao.h index 7693dd3d2..699148c52 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -240,7 +240,10 @@ public: void setNodeLight(u8 light); - v3s16 getLightPosition(); + /* Get light position(s). + * returns number of positions written into pos[], which must have space + * for at least 3 vectors. */ + u16 getLightPosition(v3s16 *pos); void updateNametag(); -- 2.25.1