[Bf-blender-cvs] [3dbc123] master: BGE: allow setting velocity to zero in a motion actuator.

Sybren A. Stüvel noreply at git.blender.org
Tue Nov 10 13:39:40 CET 2015


Commit: 3dbc123061aa063efd1fca358f5e295b0ce7b302
Author: Sybren A. Stüvel
Date:   Fri Oct 9 12:12:13 2015 +0200
Branches: master
https://developer.blender.org/rB3dbc123061aa063efd1fca358f5e295b0ce7b302

BGE: allow setting velocity to zero in a motion actuator.

The motion actuator goes out of its way to prevent setting zero velocities,
which should actually be supported. This patch just works around it as a
first test. We should investigate whether the flags
`m_bitLocalFlag.ZeroLinearVelocity` and `m_bitLocalFlag.ZeroAngularVelocity`
are actually needed/desired at all.

One of the issues that's already visible with this simple change, is
that objects aren't actually frozen but still move a little bit; see
test with {F241908}.

Reviewers: lordloki, hg1, moguri, panzergame

Reviewed By: lordloki, panzergame

Differential Revision: https://developer.blender.org/D1545

===================================================================

M	source/gameengine/Ketsji/KX_ObjectActuator.cpp

===================================================================

diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
index 12abcb2..762148d 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
@@ -276,8 +276,16 @@ bool KX_ObjectActuator::Update()
 			{
 				parent->ApplyRotation(m_drot,(m_bitLocalFlag.DRot) != 0);
 			}
-			if (!m_bitLocalFlag.ZeroLinearVelocity)
-			{
+
+			if (m_bitLocalFlag.ZeroLinearVelocity) {
+				if (!m_bitLocalFlag.AddOrSetLinV) {
+					/* No need to select local or world, as the velocity is zero anyway,
+					 * and setLinearVelocity() converts local to world first. We do need to
+					 * pass a true zero vector, as m_linear_velocity is only fuzzily zero. */
+					parent->setLinearVelocity(MT_Vector3(0, 0, 0), false);
+				}
+			}
+			else {
 				if (m_bitLocalFlag.AddOrSetLinV) {
 					parent->addLinearVelocity(m_linear_velocity,(m_bitLocalFlag.LinearVelocity) != 0);
 				} else {
@@ -302,8 +310,13 @@ bool KX_ObjectActuator::Update()
 					}
 				}
 			}
-			if (!m_bitLocalFlag.ZeroAngularVelocity)
-			{
+			if (m_bitLocalFlag.ZeroAngularVelocity) {
+				/* No need to select local or world, as the velocity is zero anyway,
+				 * and setAngularVelocity() converts local to world first. We do need to
+				 * pass a true zero vector, as m_angular_velocity is only fuzzily zero. */
+				parent->setAngularVelocity(MT_Vector3(0, 0, 0), false);
+			}
+			else {
 				m_active_combined_velocity = true;
 				if (m_damping > 0) {
 					MT_Vector3 angV;




More information about the Bf-blender-cvs mailing list