[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51873] trunk/blender: BGE: This patch adds a character wrapper ( similar to the already implemented vehicle wrapper) to control character physics options.

Mitchell Stokes mogurijin at gmail.com
Sun Nov 4 21:56:05 CET 2012


Revision: 51873
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51873
Author:   moguri
Date:     2012-11-04 20:56:02 +0000 (Sun, 04 Nov 2012)
Log Message:
-----------
BGE: This patch adds a character wrapper (similar to the already implemented vehicle wrapper) to control character physics options. Currently supported options are:
  * jump() -- causes the character to jump
  * onGround -- specifies whether or not the character is on the ground
  * gravity -- controls the "gravity" that the character physics uses for the character

More options could be added (such as jump speed, step height, make fall speed, max slope, etc).

Modified Paths:
--------------
    trunk/blender/doc/python_api/rst/bge.constraints.rst
    trunk/blender/doc/python_api/rst/bge.types.rst
    trunk/blender/source/gameengine/Ketsji/CMakeLists.txt
    trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/common/CMakeLists.txt
    trunk/blender/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h

Added Paths:
-----------
    trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.h
    trunk/blender/source/gameengine/Physics/common/PHY_ICharacter.h

Modified: trunk/blender/doc/python_api/rst/bge.constraints.rst
===================================================================
--- trunk/blender/doc/python_api/rst/bge.constraints.rst	2012-11-04 20:41:25 UTC (rev 51872)
+++ trunk/blender/doc/python_api/rst/bge.constraints.rst	2012-11-04 20:56:02 UTC (rev 51873)
@@ -78,7 +78,15 @@
 
    :return: a vehicle constraint object.
    :rtype: :class:`bge.types.KX_VehicleWrapper`
+   
+.. function:: getCharacter(gameobj)
 
+   :arg gameobj: The game object with the character physics.
+   :type gameobj: :class:`bge.types.KX_GameObject`
+
+   :return: character wrapper
+   :rtype: :class:`bge.types.KX_CharacterWrapper`
+
 .. function:: removeConstraint(constraintId)
 
    Removes a constraint.

Modified: trunk/blender/doc/python_api/rst/bge.types.rst
===================================================================
--- trunk/blender/doc/python_api/rst/bge.types.rst	2012-11-04 20:41:25 UTC (rev 51872)
+++ trunk/blender/doc/python_api/rst/bge.types.rst	2012-11-04 20:56:02 UTC (rev 51873)
@@ -3464,6 +3464,26 @@
       :arg wheelIndex: the wheel index
       :type wheelIndex: integer
 
+.. class:: KX_CharacterWrapper(PyObjectPlus)
+
+   A wrapper to expose character physics options.
+
+   .. attribute:: onGround
+
+      Whether or not the character is on the ground. (read-only)
+
+	  :type: boolean
+
+   .. attribute:: gravity
+
+      The gravity value used for the character.
+
+      :type: float
+
+   .. method:: jump()
+
+      The character jumps based on it's jump speed.
+
 .. class:: KX_VertexProxy(SCA_IObject)
 
    A vertex holds position, UV, color and normal information.

Modified: trunk/blender/source/gameengine/Ketsji/CMakeLists.txt
===================================================================
--- trunk/blender/source/gameengine/Ketsji/CMakeLists.txt	2012-11-04 20:41:25 UTC (rev 51872)
+++ trunk/blender/source/gameengine/Ketsji/CMakeLists.txt	2012-11-04 20:56:02 UTC (rev 51873)
@@ -74,6 +74,7 @@
 	KX_Camera.cpp
 	KX_CameraActuator.cpp
 	KX_CameraIpoSGController.cpp
+	KX_CharacterWrapper.cpp
 	KX_ConstraintActuator.cpp
 	KX_ConstraintWrapper.cpp
 	KX_ConvertPhysicsObjects.cpp
@@ -149,6 +150,7 @@
 	KX_Camera.h
 	KX_CameraActuator.h
 	KX_CameraIpoSGController.h
+	KX_CharacterWrapper.h
 	KX_ClientObjectInfo.h
 	KX_ConstraintActuator.h
 	KX_ConstraintWrapper.h

Added: trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp	                        (rev 0)
+++ trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp	2012-11-04 20:56:02 UTC (rev 51873)
@@ -0,0 +1,94 @@
+/** \file gameengine/Ketsji/KX_CharacterWrapper.cpp
+ *  \ingroup ketsji
+ */
+
+
+#include "KX_CharacterWrapper.h"
+#include "PHY_ICharacter.h"
+
+KX_CharacterWrapper::KX_CharacterWrapper(PHY_ICharacter* character) :
+		PyObjectPlus(),
+		m_character(character)
+{
+}
+
+KX_CharacterWrapper::~KX_CharacterWrapper()
+{
+	if (m_character)
+		delete m_character; // We're responsible for the character object!
+}
+
+#ifdef WITH_PYTHON
+
+PyTypeObject KX_CharacterWrapper::Type = {
+	PyVarObject_HEAD_INIT(NULL, 0)
+	"KX_CharacterWrapper",
+	sizeof(PyObjectPlus_Proxy),
+	0,
+	py_base_dealloc,
+	0,
+	0,
+	0,
+	0,
+	py_base_repr,
+	0,0,0,0,0,0,0,0,0,
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+	0,0,0,0,0,0,0,
+	Methods,
+	0,
+	0,
+	&PyObjectPlus::Type,
+	0,0,0,0,0,0,
+	py_base_new
+};
+
+PyAttributeDef KX_CharacterWrapper::Attributes[] = {
+	KX_PYATTRIBUTE_RO_FUNCTION("onGround", KX_CharacterWrapper, pyattr_get_onground),
+	KX_PYATTRIBUTE_RW_FUNCTION("gravity", KX_CharacterWrapper, pyattr_get_gravity, pyattr_set_gravity),
+	{ NULL }	//Sentinel
+};
+
+PyObject *KX_CharacterWrapper::pyattr_get_onground(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v);
+
+	return PyBool_FromLong(self->m_character->OnGround());
+}
+
+PyObject *KX_CharacterWrapper::pyattr_get_gravity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v);
+
+	return PyFloat_FromDouble(self->m_character->GetGravity());
+}
+
+int KX_CharacterWrapper::pyattr_set_gravity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+	KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v);
+	double param = PyFloat_AsDouble(value);
+
+	if (param == -1)
+	{
+		PyErr_SetString(PyExc_ValueError, "KX_CharacterWrapper.gravity: expected a float");
+		return PY_SET_ATTR_FAIL;
+	}
+
+	self->m_character->SetGravity((float)param);
+	return PY_SET_ATTR_SUCCESS;
+}
+
+PyMethodDef KX_CharacterWrapper::Methods[] = {
+	KX_PYMETHODTABLE_NOARGS(KX_CharacterWrapper, jump),
+	{NULL,NULL} //Sentinel
+};
+
+KX_PYMETHODDEF_DOC_NOARGS(KX_CharacterWrapper, jump,
+	"jump()\n"
+	"makes the character jump.\n")
+{
+	m_character->Jump();
+
+	Py_RETURN_NONE;
+}
+
+#endif // WITH_PYTHON


Property changes on: trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.cpp
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.h	                        (rev 0)
+++ trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.h	2012-11-04 20:56:02 UTC (rev 51873)
@@ -0,0 +1,35 @@
+
+/** \file KX_CharacterWrapper.h
+ *  \ingroup ketsji
+ */
+
+#ifndef __KX_CHARACTERWRAPPER_H__
+#define __KX_CHARACTERWRAPPER_H__
+
+#include "Value.h"
+#include "PHY_DynamicTypes.h"
+class PHY_ICharacter;
+
+
+///Python interface to character physics
+class	KX_CharacterWrapper : public PyObjectPlus
+{
+	Py_Header
+
+public:
+	KX_CharacterWrapper(PHY_ICharacter* character);
+	virtual ~KX_CharacterWrapper();
+#ifdef WITH_PYTHON
+	KX_PYMETHOD_DOC_NOARGS(KX_CharacterWrapper, jump);
+
+	static PyObject* pyattr_get_onground(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+	
+	static PyObject*	pyattr_get_gravity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+	static int			pyattr_set_gravity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+#endif // WITH_PYTHON
+
+private:
+	PHY_ICharacter*			 m_character;
+};
+
+#endif //__KX_CHARACTERWRAPPER_H__


Property changes on: trunk/blender/source/gameengine/Ketsji/KX_CharacterWrapper.h
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp	2012-11-04 20:41:25 UTC (rev 51872)
+++ trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp	2012-11-04 20:56:02 UTC (rev 51873)
@@ -33,12 +33,15 @@
 #include "PHY_IPhysicsEnvironment.h"
 #include "KX_ConstraintWrapper.h"
 #include "KX_VehicleWrapper.h"
+#include "KX_CharacterWrapper.h"
 #include "KX_PhysicsObjectWrapper.h"
 #include "PHY_IPhysicsController.h"
 #include "PHY_IVehicle.h"
 #include "PHY_DynamicTypes.h"
 #include "MT_Matrix3x3.h"
 
+#include "KX_GameObject.h" // ConvertPythonToGameObject()
+
 #include "PyObjectPlus.h" 
 
 #ifdef USE_BULLET
@@ -81,6 +84,7 @@
 
 static char gPyCreateConstraint__doc__[] = "createConstraint(ob1,ob2,float restLength,float restitution,float damping)";
 static char gPyGetVehicleConstraint__doc__[] = "getVehicleConstraint(int constraintId)";
+static char gPyGetCharacter__doc__[] = "getCharacter(KX_GameObject obj)";
 static char gPyRemoveConstraint__doc__[] = "removeConstraint(int constraintId)";
 static char gPyGetAppliedImpulse__doc__[] = "getAppliedImpulse(int constraintId)";
 
@@ -402,7 +406,34 @@
 	Py_RETURN_NONE;
 }
 
+static PyObject* gPyGetCharacter(PyObject* self,
+                                 PyObject* args,
+                                 PyObject* kwds)
+{
+	PyObject* pyob;
+	KX_GameObject *ob;
 
+	if (!PyArg_ParseTuple(args,"O", &pyob))
+		return NULL;
+
+	if (!ConvertPythonToGameObject(pyob, &ob, false, "bge.constraints.getCharacter(value)"))
+		return NULL;
+
+	if (PHY_GetActiveEnvironment())
+	{
+			
+		PHY_ICharacter* character= PHY_GetActiveEnvironment()->getCharacterController(ob);
+		if (character)
+		{
+			KX_CharacterWrapper* pyWrapper = new KX_CharacterWrapper(character);
+			return pyWrapper->NewProxy(true);
+		}
+
+	}
+
+	Py_RETURN_NONE;
+}
+
 static PyObject *gPyCreateConstraint(PyObject *self,
                                      PyObject *args,
                                      PyObject *kwds)
@@ -631,6 +662,9 @@
 	{"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint,
 	 METH_VARARGS, (const char *)gPyGetVehicleConstraint__doc__},
 
+	{"getCharacter",(PyCFunction) gPyGetCharacter,
+	 METH_VARARGS, (const char *)gPyGetCharacter__doc__},
+
 	{"removeConstraint",(PyCFunction) gPyRemoveConstraint,
 	 METH_VARARGS, (const char *)gPyRemoveConstraint__doc__},
 	{"getAppliedImpulse",(PyCFunction) gPyGetAppliedImpulse,

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp	2012-11-04 20:41:25 UTC (rev 51872)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInitTypes.cpp	2012-11-04 20:56:02 UTC (rev 51873)
@@ -42,6 +42,7 @@
 #include "BL_ArmatureChannel.h"
 #include "KX_BlenderMaterial.h"
 #include "KX_CameraActuator.h"
+#include "KX_CharacterWrapper.h"
 #include "KX_ConstraintActuator.h"
 #include "KX_ConstraintWrapper.h"
 #include "KX_GameActuator.h"
@@ -189,6 +190,7 @@
 		PyType_Ready_Attr(dict, KX_BlenderMaterial, init_getset);
 		PyType_Ready_Attr(dict, KX_Camera, init_getset);
 		PyType_Ready_Attr(dict, KX_CameraActuator, init_getset);
+		PyType_Ready_Attr(dict, KX_CharacterWrapper, init_getset);
 		PyType_Ready_Attr(dict, KX_ConstraintActuator, init_getset);
 		PyType_Ready_Attr(dict, KX_ConstraintWrapper, init_getset);
 		PyType_Ready_Attr(dict, KX_GameActuator, init_getset);

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp	2012-11-04 20:41:25 UTC (rev 51872)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list