CAO/SAO: Nicer velocity-controlled, interpolated rotation property:
authorSmallJoker <mk939@ymail.com>
Sun, 26 Nov 2017 14:37:55 +0000 (15:37 +0100)
committerparamat <mat.gregory@virginmedia.com>
Fri, 1 Dec 2017 05:36:49 +0000 (05:36 +0000)
'automatic_face_movement_max_rotation_per_sec'.
Rotate towards the smaller angle.

src/content_cao.cpp
src/content_sao.cpp

index 861dc83e74cfaae16e7fcb05587f161c2cb561c6..7b6570653978992d425114d88bfbae6bed41d94d 100644 (file)
@@ -904,19 +904,19 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
        }
 
        if (!getParent() && m_prop.automatic_face_movement_dir &&
-                       (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
+                       (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)) {
+
+               float target_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;
+               float delta = wrapDegrees_0_360(target_yaw - m_yaw);
 
-               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;
+               if (delta > max_rotation_delta && 360 - delta > max_rotation_delta) {
+                       m_yaw += (delta < 180) ? max_rotation_delta : -max_rotation_delta;
+                       m_yaw = wrapDegrees_0_360(m_yaw);
                } else {
-                       m_yaw = optimal_yaw;
+                       m_yaw = target_yaw;
                }
                updateNodePos();
        }
index e2bfdbef2450998bab56d0f1c5588f5cfec66f78..61384493ac954e8428013e29129ce9efd5fff33d 100644 (file)
@@ -372,20 +372,20 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
                        m_velocity += dtime * m_acceleration;
                }
 
-               if((m_prop.automatic_face_movement_dir) &&
-                               (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;
+               if (m_prop.automatic_face_movement_dir &&
+                               (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)) {
+
+                       float target_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;
+                       float delta = wrapDegrees_0_360(target_yaw - m_yaw);
 
-                       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;
+                       if (delta > max_rotation_delta && 360 - delta > max_rotation_delta) {
+                               m_yaw += (delta < 180) ? max_rotation_delta : -max_rotation_delta;
+                               m_yaw = wrapDegrees_0_360(m_yaw);
                        } else {
-                               m_yaw = optimal_yaw;
+                               m_yaw = target_yaw;
                        }
                }
        }