Object properties: Add 'glow', disables light's effect if negative
authorRob Blanckaert <rob@withpiper.com>
Sat, 2 Sep 2017 06:12:15 +0000 (23:12 -0700)
committerparamat <mat.gregory@virginmedia.com>
Thu, 14 Sep 2017 03:06:05 +0000 (04:06 +0100)
The 'glow' value is added to the ambient light value.
Negative 'glow' disables light's effect on object colour, for faking
self-lighting, UI-style entities, or programmatic colouring in mods.

doc/lua_api.txt
src/content_cao.cpp
src/content_cao.h
src/network/networkprotocol.h
src/object_properties.cpp
src/object_properties.h
src/script/common/c_content.cpp
src/script/common/c_converter.cpp
src/script/common/c_converter.h

index 3c2278c8dc853f6a368a52b724210bd3f63a3d91..eac6f6697fa9bfc02feb298d6e0735b4a9ac6bf4 100644 (file)
@@ -4131,6 +4131,10 @@ Definition tables
     --  ^ Limit automatic rotation to this value in degrees per second,
     --    value < 0 no limit.
         backface_culling = true, -- false to disable backface_culling for model
+        glow = 0,
+    --  ^ Add this much extra lighting when calculating texture color.
+          value < 0 disables light's effect on texture color.
+          For faking self-lighting, UI style entities, or programmatic coloring in mods.
         nametag = "", -- by default empty, for players their name is shown if empty
         nametag_color = <color>, -- sets color of nametag as ColorSpec
         infotext = "", -- by default empty, text to be shown when pointed at object
index 7659871b691b578a7d0c0490f3952d04dc5b61dc..9a493daff3409e14ce374a7beda893f8fd3283cc 100644 (file)
@@ -659,7 +659,10 @@ void GenericCAO::updateLight(u8 light_at_pos)
 
 void GenericCAO::updateLightNoCheck(u8 light_at_pos)
 {
-       u8 li = decode_light(light_at_pos);
+       if (m_glow < 0)
+               return;
+
+       u8 li = decode_light(light_at_pos + m_glow);
        if (li != m_last_light) {
                m_last_light = li;
                video::SColor color(255,li,li,li);
@@ -978,6 +981,7 @@ void GenericCAO::updateTextures(std::string mod)
 
        m_previous_texture_modifier = m_current_texture_modifier;
        m_current_texture_modifier = mod;
+       m_glow = m_prop.glow;
 
        if (m_spritenode) {
                if (m_prop.visual == "sprite") {
index 93b532aadd4083f632170d8c8c7d1cd31096a2e4..575aad24145f9adac48a4c1432f1bf96087417bf 100644 (file)
@@ -106,6 +106,7 @@ private:
        float m_step_distance_counter = 0.0f;
        u8 m_last_light = 255;
        bool m_is_visible = false;
+       s8 m_glow = 0;
 
        std::vector<u16> m_children;
 
index 6d11dacc635b5389eb7638a0ba888304ef9eee52..f4258e9cdfff3c466c775b51afa98774307b9e99 100644 (file)
@@ -179,6 +179,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
        PROTOCOL VERSION 36:
                Backwards compatibility drop
                Add 'can_zoom' to player object properties
+               Add glow to object properties
 */
 
 #define LATEST_PROTOCOL_VERSION 36
index 172eec92538067589a803792dc5c43c202e6c360..4171317de0d068388140847f90d7be057a834c9e 100644 (file)
@@ -33,31 +33,32 @@ ObjectProperties::ObjectProperties()
 std::string ObjectProperties::dump()
 {
        std::ostringstream os(std::ios::binary);
-       os<<"hp_max="<<hp_max;
-       os<<", physical="<<physical;
-       os<<", collideWithObjects="<<collideWithObjects;
-       os<<", weight="<<weight;
-       os<<", collisionbox="<<PP(collisionbox.MinEdge)<<","<<PP(collisionbox.MaxEdge);
-       os<<", visual="<<visual;
-       os<<", mesh="<<mesh;
-       os<<", visual_size="<<PP2(visual_size);
-       os<<", textures=[";
+       os << "hp_max=" << hp_max;
+       os << ", physical=" << physical;
+       os << ", collideWithObjects=" << collideWithObjects;
+       os << ", weight=" << weight;
+       os << ", collisionbox=" << PP(collisionbox.MinEdge) << "," << PP(collisionbox.MaxEdge);
+       os << ", visual=" << visual;
+       os << ", mesh=" << mesh;
+       os << ", visual_size=" << PP2(visual_size);
+       os << ", textures=[";
        for (const std::string &texture : textures) {
-               os<<"\""<< texture <<"\" ";
+               os << "\"" << texture << "\" ";
        }
-       os<<"]";
-       os<<", colors=[";
+       os << "]";
+       os << ", colors=[";
        for (const video::SColor &color : colors) {
                os << "\"" << color.getAlpha() << "," << color.getRed() << ","
                        << color.getGreen() << "," << color.getBlue() << "\" ";
        }
-       os<<"]";
-       os<<", spritediv="<<PP2(spritediv);
-       os<<", initial_sprite_basepos="<<PP2(initial_sprite_basepos);
-       os<<", is_visible="<<is_visible;
-       os<<", makes_footstep_sound="<<makes_footstep_sound;
-       os<<", automatic_rotate="<<automatic_rotate;
-       os<<", backface_culling="<<backface_culling;
+       os << "]";
+       os << ", spritediv=" << PP2(spritediv);
+       os << ", initial_sprite_basepos=" << PP2(initial_sprite_basepos);
+       os << ", is_visible=" << is_visible;
+       os << ", makes_footstep_sound=" << makes_footstep_sound;
+       os << ", automatic_rotate="<< automatic_rotate;
+       os << ", backface_culling="<< backface_culling;
+       os << ", glow=" << glow;
        os << ", nametag=" << nametag;
        os << ", nametag_color=" << "\"" << nametag_color.getAlpha() << "," << nametag_color.getRed()
                        << "," << nametag_color.getGreen() << "," << nametag_color.getBlue() << "\" ";
@@ -106,6 +107,7 @@ void ObjectProperties::serialize(std::ostream &os) const
        os << serializeString(infotext);
        os << serializeString(wield_item);
        writeU8(os, can_zoom);
+       writeS8(os, glow);
 
        // Add stuff only at the bottom.
        // Never remove anything, because we don't want new versions of this
@@ -153,4 +155,5 @@ void ObjectProperties::deSerialize(std::istream &is)
        infotext = deSerializeString(is);
        wield_item = deSerializeString(is);
        can_zoom = readU8(is);
+       glow = readS8(is);
 }
index bd519e9eec43ce963d07ee894208b9a3b97d029d..8ab1fa7fd4a302b18a7c2891120d7bc1419fb23c 100644 (file)
@@ -50,6 +50,7 @@ struct ObjectProperties
        bool automatic_face_movement_dir = false;
        f32 automatic_face_movement_dir_offset = 0.0f;
        bool backface_culling = true;
+       s8 glow = 0;
        std::string nametag = "";
        video::SColor nametag_color = video::SColor(255, 255, 255, 255);
        f32 automatic_face_movement_max_rotation_per_sec = -1.0f;
index ad92741f85797876b1f8ac59fef0a6dcc74fbc9e..206ca55d02e19a03ef7a7dfbe6c65e4b727f003e 100644 (file)
@@ -277,6 +277,7 @@ void read_object_properties(lua_State *L, int index,
        }
        lua_pop(L, 1);
        getboolfield(L, -1, "backface_culling", prop->backface_culling);
+       getintfield(L, -1, "glow", prop->glow);
 
        getstringfield(L, -1, "nametag", prop->nametag);
        lua_getfield(L, -1, "nametag_color");
@@ -362,6 +363,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
        lua_setfield(L, -2, "automatic_face_movement_dir");
        lua_pushboolean(L, prop->backface_culling);
        lua_setfield(L, -2, "backface_culling");
+       lua_pushnumber(L, prop->glow);
+       lua_setfield(L, -2, "glow");
        lua_pushlstring(L, prop->nametag.c_str(), prop->nametag.size());
        lua_setfield(L, -2, "nametag");
        push_ARGB8(L, prop->nametag_color);
index e5d89dea901d1acf9e3ea37d2d840468a3ae7cbf..8f88aeb604818165e928281aff7572cd2c636837 100644 (file)
@@ -426,6 +426,19 @@ bool getintfield(lua_State *L, int table,
        return got;
 }
 
+bool getintfield(lua_State *L, int table,
+               const char *fieldname, s8 &result)
+{
+       lua_getfield(L, table, fieldname);
+       bool got = false;
+       if (lua_isnumber(L, -1)) {
+               result = lua_tointeger(L, -1);
+               got = true;
+       }
+       lua_pop(L, 1);
+       return got;
+}
+
 bool getintfield(lua_State *L, int table,
                const char *fieldname, u16 &result)
 {
index f94996c887053f90d023cc966ac18888b3af8134..18b8f65316392a3a99dcc1e2adb3869ca5f27c2e 100644 (file)
@@ -54,6 +54,8 @@ bool               getintfield(lua_State *L, int table,
                              const char *fieldname, int &result);
 bool               getintfield(lua_State *L, int table,
                              const char *fieldname, u8 &result);
+bool               getintfield(lua_State *L, int table,
+                             const char *fieldname, s8 &result);
 bool               getintfield(lua_State *L, int table,
                              const char *fieldname, u16 &result);
 bool               getintfield(lua_State *L, int table,