[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54201] trunk/blender: BGE: Some various changes to make moving the character physics type easier:

Mitchell Stokes mogurijin at gmail.com
Wed Jan 30 06:55:28 CET 2013


Revision: 54201
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54201
Author:   moguri
Date:     2013-01-30 05:55:17 +0000 (Wed, 30 Jan 2013)
Log Message:
-----------
BGE: Some various changes to make moving the character physics type easier:
  * Undoing the previous applyMovement() changes for characters. This was causing bugs for the Motion Actuator.
  * Creating a Character Motion type for the Motion Actuator with specific controls for characters. This includes moving, rotating and jumping.
  * Adding a KX_CharacterWrapper.walkDirection to set the character's direction and speed.

Note, this also resolves the following bugs:
[#33585] "Setting dLoc of motion actuator [0,0,0] via python won't stop object" reported by Manuel Bellersen (urfoex)
[#33503] "Character physics type won?\194?\180t accept more than one motion anymore" reported by Mr Larodos

Modified Paths:
--------------
    trunk/blender/doc/python_api/rst/bge.types.rst
    trunk/blender/source/blender/editors/space_logic/logic_window.c
    trunk/blender/source/blender/makesdna/DNA_actuator_types.h
    trunk/blender/source/blender/makesrna/intern/rna_actuator.c
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/common/PHY_ICharacter.h

Modified: trunk/blender/doc/python_api/rst/bge.types.rst
===================================================================
--- trunk/blender/doc/python_api/rst/bge.types.rst	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/doc/python_api/rst/bge.types.rst	2013-01-30 05:55:17 UTC (rev 54201)
@@ -3761,6 +3761,12 @@
 
       :type: int
 
+   .. attribute:: walkDirection
+   
+      The speed and direction the character is traveling in using world coordinates. This should be used instead of applyMovement() to properly move the character.
+
+      :type: list [x, y, z]
+
    .. method:: jump()
 
       The character jumps based on it's jump speed.

Modified: trunk/blender/source/blender/editors/space_logic/logic_window.c
===================================================================
--- trunk/blender/source/blender/editors/space_logic/logic_window.c	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/blender/editors/space_logic/logic_window.c	2013-01-30 05:55:17 UTC (rev 54201)
@@ -1860,6 +1860,25 @@
 			uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 			uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 			break;
+		case ACT_OBJECT_CHARACTER:
+			split = uiLayoutSplit(layout, 0.9, FALSE);
+			row = uiLayoutRow(split, FALSE);
+			uiItemR(row, ptr, "offset_location", 0, NULL, ICON_NONE);
+			row = uiLayoutRow(split, TRUE);
+			uiItemR(row, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+			uiItemR(row, ptr, "use_add_character_location", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+
+			split = uiLayoutSplit(layout, 0.9, FALSE);
+			row = uiLayoutRow(split, FALSE);
+			uiItemR(row, ptr, "offset_rotation", 0, NULL, ICON_NONE);
+			uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+
+			split = uiLayoutSplit(layout, 0.9, FALSE);
+			row = uiLayoutRow(split, FALSE);
+			split = uiLayoutSplit(row, 0.7, FALSE);
+			uiItemL(split, "", ICON_NONE); /*Just use this for some spacing */
+			uiItemR(split, ptr, "use_character_jump", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+			break;
 	}
 }
 

Modified: trunk/blender/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2013-01-30 05:55:17 UTC (rev 54201)
@@ -277,10 +277,13 @@
 #define ACT_ANG_VEL_LOCAL		32
 //#define ACT_ADD_LIN_VEL_LOCAL	64
 #define ACT_ADD_LIN_VEL			64
+#define ACT_ADD_CHAR_LOC		128
+#define ACT_CHAR_JUMP			256
 
 /* objectactuator->type */
-#define ACT_OBJECT_NORMAL	0
-#define ACT_OBJECT_SERVO	1
+#define ACT_OBJECT_NORMAL		0
+#define ACT_OBJECT_SERVO		1
+#define ACT_OBJECT_CHARACTER	2
 
 /* actuator->type */
 #define ACT_OBJECT		0

Modified: trunk/blender/source/blender/makesrna/intern/rna_actuator.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_actuator.c	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/blender/makesrna/intern/rna_actuator.c	2013-01-30 05:55:17 UTC (rev 54201)
@@ -389,6 +389,12 @@
 				oa->forcerot[1] = 0.5f;
 				oa->forcerot[2] = 0.0f;
 				break;
+
+			case ACT_OBJECT_CHARACTER:
+				memset(oa, 0, sizeof(bObjectActuator));
+				oa->flag = ACT_DLOC_LOCAL | ACT_DROT_LOCAL;
+				oa->type = ACT_OBJECT_CHARACTER;
+				break;
 		}
 	}
 }
@@ -701,6 +707,7 @@
 	static EnumPropertyItem prop_type_items[] = {
 		{ACT_OBJECT_NORMAL, "OBJECT_NORMAL", 0, "Simple Motion", ""},
 		{ACT_OBJECT_SERVO, "OBJECT_SERVO", 0, "Servo Control", ""},
+		{ACT_OBJECT_CHARACTER, "OBJECT_CHARACTER", 0, "Character Motion", ""},
 		{0, NULL, 0, NULL, NULL}
 	};
 
@@ -867,6 +874,11 @@
 	RNA_def_property_ui_text(prop, "Add", "Toggles between ADD and SET linV");
 	RNA_def_property_update(prop, NC_LOGIC, NULL);
 
+	prop = RNA_def_property(srna, "use_add_character_location", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_ADD_CHAR_LOC);
+	RNA_def_property_ui_text(prop, "Add", "Toggles between ADD and SET character location");
+	RNA_def_property_update(prop, NC_LOGIC, NULL);
+
 	prop = RNA_def_property(srna, "use_servo_limit_x", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_X);
 	RNA_def_property_ui_text(prop, "X", "Set limit to force along the X axis");
@@ -881,6 +893,11 @@
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SERVO_LIMIT_Z);
 	RNA_def_property_ui_text(prop, "Z", "Set limit to force along the Z axis");
 	RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+	prop = RNA_def_property(srna, "use_character_jump", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_CHAR_JUMP);
+	RNA_def_property_ui_text(prop, "Jump", "Makes the character jump using the settings in the physics properties");
+	RNA_def_property_update(prop, NC_LOGIC, NULL);
 }
 
 static void rna_def_camera_actuator(BlenderRNA *brna)

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2013-01-30 05:55:17 UTC (rev 54201)
@@ -180,7 +180,10 @@
 				bitLocalFlag.LinearVelocity = bool((obact->flag & ACT_LIN_VEL_LOCAL)!=0);
 				bitLocalFlag.AngularVelocity = bool((obact->flag & ACT_ANG_VEL_LOCAL)!=0);
 				bitLocalFlag.ServoControl = bool(obact->type == ACT_OBJECT_SERVO);
+				bitLocalFlag.CharacterMotion = bool(obact->type == ACT_OBJECT_CHARACTER);
+				bitLocalFlag.CharacterJump = bool((obact->flag & ACT_CHAR_JUMP)!=0);
 				bitLocalFlag.AddOrSetLinV = bool((obact->flag & ACT_ADD_LIN_VEL)!=0);
+				bitLocalFlag.AddOrSetCharLoc = bool((obact->flag & ACT_ADD_CHAR_LOC)!=0);
 				if (obact->reference && bitLocalFlag.ServoControl)
 				{
 					obref = converter->FindGameObject(obact->reference);

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp	2013-01-30 05:55:17 UTC (rev 54201)
@@ -75,6 +75,11 @@
 	CcdPhysicsController::SetLinVelocityMin(val);
 }
 
+void KX_BulletPhysicsController::Jump()
+{
+	CcdPhysicsController::Jump();
+}
+
 float KX_BulletPhysicsController::GetLinVelocityMax()
 {
 	return (float)CcdPhysicsController::GetLinVelocityMax();
@@ -119,6 +124,11 @@
 
 }
 
+void	KX_BulletPhysicsController::SetWalkDirection(const MT_Vector3& dloc,bool local)
+{
+	CcdPhysicsController::SetWalkDirection(dloc[0],dloc[1],dloc[2],local);
+}
+
 void	KX_BulletPhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool local)
 {
 	float	rotval[9];
@@ -155,6 +165,13 @@
 	return MT_Vector3(linVel[0],linVel[1],linVel[2]);
 }
 
+MT_Vector3 KX_BulletPhysicsController::GetWalkDirection()
+{
+	float dir[3];
+	CcdPhysicsController::GetWalkDirection(dir[0], dir[1], dir[2]);
+	return MT_Vector3(dir[0], dir[1], dir[2]);
+}
+
 void	KX_BulletPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local)
 {
 	CcdPhysicsController::SetAngularVelocity(ang_vel.x(),ang_vel.y(),ang_vel.z(),local);

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h	2013-01-30 05:55:17 UTC (rev 54201)
@@ -40,11 +40,14 @@
 	virtual void	RelativeRotate(const MT_Matrix3x3& drot,bool local);
 	virtual void	ApplyTorque(const MT_Vector3& torque,bool local);
 	virtual void	ApplyForce(const MT_Vector3& force,bool local);
+	virtual void	SetWalkDirection(const MT_Vector3& dir,bool local);
 	virtual MT_Vector3 GetLinearVelocity();
 	virtual MT_Vector3 GetAngularVelocity();
 	virtual MT_Vector3 GetVelocity(const MT_Point3& pos);
+	virtual MT_Vector3 GetWalkDirection();
 	virtual void	SetAngularVelocity(const MT_Vector3& ang_vel,bool local);
 	virtual void	SetLinearVelocity(const MT_Vector3& lin_vel,bool local);
+	virtual void	Jump();
 	virtual	void	getOrientation(MT_Quaternion& orn);
 	virtual	void setOrientation(const MT_Matrix3x3& orn);
 	virtual	void setPosition(const MT_Point3& pos);

Modified: trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp	2013-01-30 05:19:27 UTC (rev 54200)
+++ trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp	2013-01-30 05:55:17 UTC (rev 54201)
@@ -5,6 +5,7 @@
 
 #include "KX_CharacterWrapper.h"
 #include "PHY_ICharacter.h"
+#include "KX_PyMath.h"
 
 KX_CharacterWrapper::KX_CharacterWrapper(PHY_ICharacter* character) :
 		PyObjectPlus(),
@@ -47,6 +48,7 @@
 	KX_PYATTRIBUTE_RW_FUNCTION("gravity", KX_CharacterWrapper, pyattr_get_gravity, pyattr_set_gravity),
 	KX_PYATTRIBUTE_RW_FUNCTION("maxJumps", KX_CharacterWrapper, pyattr_get_max_jumps, pyattr_set_max_jumps),
 	KX_PYATTRIBUTE_RO_FUNCTION("jumpCount", KX_CharacterWrapper, pyattr_get_jump_count),
+	KX_PYATTRIBUTE_RW_FUNCTION("walkDirection", KX_CharacterWrapper, pyattr_get_walk_dir, pyattr_set_walk_dir),
 	{ NULL }	//Sentinel
 };
 
@@ -108,6 +110,33 @@
 	return PyLong_FromLong(self->m_character->GetJumpCount());
 }
 
+PyObject *KX_CharacterWrapper::pyattr_get_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v);
+	PHY__Vector3 vec = self->m_character->GetWalkDirection();
+	MT_Vector3 retval = MT_Vector3(vec[0], vec[1], vec[2]);
+
+	return PyObjectFrom(retval);
+}
+
+int KX_CharacterWrapper::pyattr_set_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+	KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v);
+	MT_Vector3 dir;
+	if (!PyVecTo(value, dir)) {
+		PyErr_SetString(PyExc_TypeError, "KX_CharacterWrapper.walkDirection: expected a vector");
+		return PY_SET_ATTR_FAIL;
+	}
+
+	PHY__Vector3 vec;
+	vec[0] = dir[0];
+	vec[1] = dir[1];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list