[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19809] trunk/blender/source/gameengine: BGE Python API
Campbell Barton
ideasman42 at gmail.com
Mon Apr 20 11:14:00 CEST 2009
Revision: 19809
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19809
Author: campbellbarton
Date: 2009-04-20 11:13:59 +0200 (Mon, 20 Apr 2009)
Log Message:
-----------
BGE Python API
- initialize pythons sys.argv in the blenderplayer
- ignore all arguments after a single " - " in the blenderplayer (like in blender), so args can be passed to the game.
- add a utility function PyOrientationTo() - to take a Py euler, quat or 3x3 matrix and convert into a C++ MT_Matrix3x3.
- add utility function ConvertPythonToMesh to get a RAS_MeshObject from a KX_MeshProxy or a name.
- Added error prefix arguments to ConvertPythonToGameObject, ConvertPythonToMesh and PyOrientationTo so the error messages can include what function they came from.
- deprecated brick.getOwner() for the "owner" attribute.
Modified Paths:
--------------
trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp
trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp
trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.h
trunk/blender/source/gameengine/Ketsji/KX_ParentActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_PyMath.cpp
trunk/blender/source/gameengine/Ketsji/KX_PyMath.h
trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h
trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_TrackToActuator.cpp
trunk/blender/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
trunk/blender/source/gameengine/PyDoc/KX_VehicleWrapper.py
trunk/blender/source/gameengine/PyDoc/SCA_ILogicBrick.py
Modified: trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -246,8 +246,8 @@
PyMethodDef SCA_ILogicBrick::Methods[] = {
+ // --> Deprecated
{"getOwner", (PyCFunction) SCA_ILogicBrick::sPyGetOwner, METH_NOARGS},
- // --> Deprecated
{"getExecutePriority", (PyCFunction) SCA_ILogicBrick::sPyGetExecutePriority, METH_NOARGS},
{"setExecutePriority", (PyCFunction) SCA_ILogicBrick::sPySetExecutePriority, METH_VARARGS},
// <-- Deprecated
@@ -255,6 +255,7 @@
};
PyAttributeDef SCA_ILogicBrick::Attributes[] = {
+ KX_PYATTRIBUTE_RO_FUNCTION("owner", SCA_ILogicBrick, pyattr_get_owner),
KX_PYATTRIBUTE_INT_RW("executePriority",0,100000,false,SCA_ILogicBrick,m_Execute_Ueber_Priority),
{NULL} //Sentinel
};
@@ -291,6 +292,8 @@
PyObject* SCA_ILogicBrick::PyGetOwner()
{
+ ShowDeprecationWarning("getOwner()", "the owner property");
+
CValue* parent = GetParent();
if (parent)
{
@@ -327,7 +330,20 @@
}
+/*Attribute functions */
+PyObject* SCA_ILogicBrick::pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_ILogicBrick* self= static_cast<SCA_ILogicBrick*>(self_v);
+ CValue* parent = self->GetParent();
+
+ if (parent)
+ return parent->GetProxy();
+
+ Py_RETURN_NONE;
+}
+
+
/* Conversions for making life better. */
bool SCA_ILogicBrick::PyArgToBool(int boolArg)
{
@@ -338,8 +354,6 @@
}
}
-
-
PyObject* SCA_ILogicBrick::BoolToPyArg(bool boolarg)
{
return PyInt_FromLong(boolarg? KX_TRUE: KX_FALSE);
Modified: trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h 2009-04-20 09:13:59 UTC (rev 19809)
@@ -90,6 +90,8 @@
KX_PYMETHOD_NOARGS(SCA_ILogicBrick,GetOwner);
KX_PYMETHOD_VARARGS(SCA_ILogicBrick,SetExecutePriority);
KX_PYMETHOD_NOARGS(SCA_ILogicBrick,GetExecutePriority);
+
+ static PyObject* pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
// check that attribute is a property
static int CheckProperty(void *self, const PyAttributeDef *attrdef);
Modified: trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ActiveX/BlenderPlayerCtl.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -661,8 +661,8 @@
startscenename,
m_gamedata->curscene);
- PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Highest, m_gamedata->main);
- //PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_gamedata->main);
+ PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Highest, m_gamedata->main, 0, NULL);
+ //PyObject* m_dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_gamedata->main, 0, NULL);
///python scripting doesn't work
m_ketsjiengine->SetPythonDictionary(m_dictionaryobject);
Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -151,7 +151,7 @@
-bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene)
+bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene, int argc, char **argv)
{
bool result = false;
@@ -163,6 +163,10 @@
m_startScene = scene;
result = true;
}
+
+ /* Python needs these */
+ m_argc= argc;
+ m_argv= argv;
return result;
}
@@ -681,7 +685,7 @@
// some python things
- PyObject* dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_maggie);
+ PyObject* dictionaryobject = initGamePlayerPythonScripting("Ketsji", psl_Lowest, m_maggie, m_argc, m_argv);
m_ketsjiengine->SetPythonDictionary(dictionaryobject);
initRasterizer(m_rasterizer, m_canvas);
PyObject *gameLogic = initGameLogic(m_ketsjiengine, startscene);
Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h 2009-04-20 09:13:59 UTC (rev 19809)
@@ -58,7 +58,7 @@
GPG_Application(GHOST_ISystem* system);
~GPG_Application(void);
- bool SetGameEngineData(struct Main* maggie, struct Scene* scene);
+ bool SetGameEngineData(struct Main* maggie, struct Scene* scene, int argc, char** argv);
bool startWindow(STR_String& title, int windowLeft, int windowTop, int windowWidth, int windowHeight,
const bool stereoVisual, const int stereoMode);
bool startFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode);
@@ -154,5 +154,9 @@
*/
char* m_pyGlobalDictString;
int m_pyGlobalDictString_Length;
+
+ /* argc and argv need to be passed on to python */
+ int m_argc;
+ char** m_argv;
};
Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -206,6 +206,8 @@
printf(" blender_material 0 Enable material settings\n");
printf(" ignore_deprecation_warnings 1 Ignore deprecation warnings\n");
printf("\n");
+ printf(" - : all arguments after this are ignored, allowing python to access them from sys.argv\n");
+ printf("\n");
printf("example: %s -w 320 200 10 10 -g noaudio c:\\loadtest.blend\n", program);
printf("example: %s -g show_framerate = 0 c:\\loadtest.blend\n", program);
}
@@ -293,6 +295,7 @@
int main(int argc, char** argv)
{
int i;
+ int argc_py_clamped= argc; /* use this so python args can be added after ' - ' */
bool error = false;
SYS_SystemHandle syshandle = SYS_GetSystem();
bool fullScreen = false;
@@ -393,6 +396,12 @@
#endif
if (argv[i][0] == '-')
{
+ /* ignore all args after " - ", allow python to have own args */
+ if (argv[i][1]=='\0') {
+ argc_py_clamped= i;
+ break;
+ }
+
switch (argv[i][1])
{
case 'g':
@@ -596,7 +605,7 @@
char pathname[FILE_MAXDIR + FILE_MAXFILE];
char *titlename;
- get_filename(argc, argv, filename);
+ get_filename(argc_py_clamped, argv, filename);
if(filename[0])
BLI_convertstringcwd(filename);
@@ -691,7 +700,7 @@
}
// GPG_Application app (system, maggie, startscenename);
- app.SetGameEngineData(maggie, scene);
+ app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
BLI_strncpy(pathname, maggie->name, sizeof(pathname));
BLI_strncpy(G.sce, maggie->name, sizeof(G.sce));
Modified: trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/GamePlayer/netscape/src/ketsji/KXH_ketsji_hooks.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -526,7 +526,7 @@
PyObject* dictionaryobject
= initGamePlayerPythonScripting("Ketsji",
- psl_Highest);
+ psl_Highest, 0, NULL);
if (k->keyboarddevice
&& k->mousedevice
&& k->net_dev
Modified: trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/Ketsji/KX_CameraActuator.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -462,7 +462,7 @@
ShowDeprecationWarning("setObject()", "the object property");
- if (!ConvertPythonToGameObject(value, &gameobj, true))
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.setObject(value): KX_CameraActuator"))
return NULL; // ConvertPythonToGameObject sets the error
if (m_ob != NULL)
@@ -589,7 +589,7 @@
KX_CameraActuator* self= static_cast<KX_CameraActuator*>(self_v);
KX_GameObject *gameobj;
- if (!ConvertPythonToGameObject(value, &gameobj, true))
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_CameraActuator"))
return 1; // ConvertPythonToGameObject sets the error
if (self->m_ob)
Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2009-04-20 04:58:22 UTC (rev 19808)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2009-04-20 09:13:59 UTC (rev 19809)
@@ -1182,22 +1182,12 @@
PyObject* KX_GameObject::PyReplaceMesh(PyObject* value)
{
KX_Scene *scene = KX_GetActiveScene();
- char* meshname;
- void* mesh_pt;
-
- meshname = PyString_AsString(value);
- if (meshname==NULL) {
- PyErr_SetString(PyExc_ValueError, "gameOb.replaceMesh(value): KX_GameObject, expected a mesh name");
- return NULL;
- }
- mesh_pt = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname));
+ RAS_MeshObject* new_mesh;
- if (mesh_pt==NULL) {
- PyErr_SetString(PyExc_ValueError, "gameOb.replaceMesh(value): KX_GameObject, the mesh name given does not exist");
+ if (!ConvertPythonToMesh(value, &new_mesh, false, "gameOb.replaceMesh(value): KX_GameObject"))
return NULL;
- }
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list