From 70ea5d552e283bd5bce3278cbf3819bd87ba2602 Mon Sep 17 00:00:00 2001 From: Sapier Date: Tue, 15 Dec 2015 00:03:18 +0100 Subject: [PATCH] Add support for limiting rotation of automatic face movement dir entitys --- src/content_cao.cpp | 12 +++++++++++- src/content_sao.cpp | 16 ++++++++++++++-- src/object_properties.cpp | 6 +++++- src/object_properties.h | 2 +- src/script/common/c_content.cpp | 6 ++++++ 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index ed4e3b713..1b8e84c8f 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1260,8 +1260,18 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) if (getParent() == NULL && m_prop.automatic_face_movement_dir && (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)) { - m_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + float optimal_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + m_prop.automatic_face_movement_dir_offset; + float max_rotation_delta = + dtime * m_prop.automatic_face_movement_max_rotation_per_sec; + + if ((m_prop.automatic_face_movement_max_rotation_per_sec > 0) && + (fabs(m_yaw - optimal_yaw) > max_rotation_delta)) { + + m_yaw = optimal_yaw < m_yaw ? m_yaw - max_rotation_delta : m_yaw + max_rotation_delta; + } else { + m_yaw = optimal_yaw; + } updateNodePos(); } } diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 0a1cfe770..4d144aa17 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -283,8 +283,20 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) } if((m_prop.automatic_face_movement_dir) && - (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)){ - m_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + m_prop.automatic_face_movement_dir_offset; + (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)) + { + float optimal_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + + m_prop.automatic_face_movement_dir_offset; + float max_rotation_delta = + dtime * m_prop.automatic_face_movement_max_rotation_per_sec; + + if ((m_prop.automatic_face_movement_max_rotation_per_sec > 0) && + (fabs(m_yaw - optimal_yaw) > max_rotation_delta)) { + + m_yaw = optimal_yaw < m_yaw ? m_yaw - max_rotation_delta : m_yaw + max_rotation_delta; + } else { + m_yaw = optimal_yaw; + } } } diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 3cec51672..abd1bbd09 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -45,7 +45,8 @@ ObjectProperties::ObjectProperties(): automatic_face_movement_dir_offset(0.0), backface_culling(true), nametag(""), - nametag_color(255, 255, 255, 255) + nametag_color(255, 255, 255, 255), + automatic_face_movement_max_rotation_per_sec(-1) { textures.push_back("unknown_object.png"); colors.push_back(video::SColor(255,255,255,255)); @@ -116,6 +117,8 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, backface_culling); os << serializeString(nametag); writeARGB8(os, nametag_color); + writeF1000(os, automatic_face_movement_max_rotation_per_sec); + // Add stuff only at the bottom. // Never remove anything, because we don't want new versions of this } @@ -155,6 +158,7 @@ void ObjectProperties::deSerialize(std::istream &is) backface_culling = readU8(is); nametag = deSerializeString(is); nametag_color = readARGB8(is); + automatic_face_movement_max_rotation_per_sec = readF1000(is); }catch(SerializationError &e){} } else diff --git a/src/object_properties.h b/src/object_properties.h index 5dd3f57a1..47698cff7 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -50,7 +50,7 @@ struct ObjectProperties bool backface_culling; std::string nametag; video::SColor nametag_color; - + f32 automatic_face_movement_max_rotation_per_sec; ObjectProperties(); std::string dump(); diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 4d277ec59..f9370c4dc 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -201,6 +201,7 @@ void read_object_properties(lua_State *L, int index, } lua_pop(L, 1); getboolfield(L, -1, "backface_culling", prop->backface_culling); + getstringfield(L, -1, "nametag", prop->nametag); lua_getfield(L, -1, "nametag_color"); if (!lua_isnil(L, -1)) { @@ -208,6 +209,11 @@ void read_object_properties(lua_State *L, int index, if (read_color(L, -1, &color)) prop->nametag_color = color; } + + lua_getfield(L, -1, "automatic_face_movement_max_rotation_per_sec"); + if (lua_isnumber(L, -1)) { + prop->automatic_face_movement_max_rotation_per_sec = luaL_checknumber(L, -1); + } lua_pop(L, 1); }