aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSapier <sapier@does.not.have.an.email>2015-12-15 00:03:18 +0100
committerSapier <sapier AT gmx dot net>2015-12-19 17:00:36 +0100
commit70ea5d552e283bd5bce3278cbf3819bd87ba2602 (patch)
treeee1a61eb38e1d29696dd71ed240625933176d939
parent06632205d8765b5417c36df798617721bab0d02f (diff)
downloadminetest-70ea5d552e283bd5bce3278cbf3819bd87ba2602.tar.gz
minetest-70ea5d552e283bd5bce3278cbf3819bd87ba2602.tar.bz2
minetest-70ea5d552e283bd5bce3278cbf3819bd87ba2602.zip
Add support for limiting rotation of automatic face movement dir entitys
-rw-r--r--src/content_cao.cpp12
-rw-r--r--src/content_sao.cpp16
-rw-r--r--src/object_properties.cpp6
-rw-r--r--src/object_properties.h2
-rw-r--r--src/script/common/c_content.cpp6
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);
}