BGE Py API
* Removed modules Expression and CValue, neither were ever available. * Added GameLogic.EvalExpression(exp) from the Expression module, evaluates an expression like the expression controller (not sure if this is really that useful since python is far more advanced). * resetting the original blend file path didint work (own fault == -> =) * Py3.x PyModule_Create didnt allow importing since it didn't add to sys.modules, Looks like they want us to use init-tab array, but this doesn't suit us since it needs to be setup before python is initialized. * Documented GameLogic.globalDict
This commit is contained in:
@@ -1104,6 +1104,7 @@ PyObject *BGL_Init(const char *from)
|
||||
PyObject *mod, *dict, *item;
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
mod = PyModule_Create(&BGL_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), BGL_module_def.m_name, mod);
|
||||
#else
|
||||
mod= Py_InitModule(from, BGL_methods);
|
||||
#endif
|
||||
|
||||
@@ -99,6 +99,7 @@ PyObject *Geometry_Init(const char *from)
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
submodule = PyModule_Create(&M_Geometry_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), M_Geometry_module_def.m_name, submodule);
|
||||
#else
|
||||
submodule = Py_InitModule3(from, M_Geometry_methods, M_Geometry_doc);
|
||||
#endif
|
||||
|
||||
@@ -139,6 +139,7 @@ PyObject *Mathutils_Init(const char *from)
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
submodule = PyModule_Create(&M_Mathutils_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), M_Mathutils_module_def.m_name, submodule);
|
||||
#else
|
||||
submodule = Py_InitModule3(from, M_Mathutils_methods, M_Mathutils_doc);
|
||||
#endif
|
||||
|
||||
@@ -636,63 +636,3 @@ void CParser::SetContext(CValue* context)
|
||||
}
|
||||
m_identifierContext = context;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
PyObject* CParserPyMake(PyObject* ignored,PyObject* args)
|
||||
{
|
||||
char* txt;
|
||||
if (!PyArg_ParseTuple(args,"s",&txt))
|
||||
return NULL;
|
||||
CParser parser;
|
||||
CExpression* expr = parser.ProcessText(txt);
|
||||
CValue* val = expr->Calculate();
|
||||
expr->Release();
|
||||
return val->GetProxy();
|
||||
}
|
||||
|
||||
static PyMethodDef CParserMethods[] =
|
||||
{
|
||||
{ "calc", CParserPyMake , METH_VARARGS},
|
||||
{ NULL,NULL} // Sentinel
|
||||
};
|
||||
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
static struct PyModuleDef Expression_module_def = {
|
||||
{}, /* m_base */
|
||||
"Expression", /* m_name */
|
||||
0, /* m_doc */
|
||||
0, /* m_size */
|
||||
CParserMethods, /* m_methods */
|
||||
0, /* m_reload */
|
||||
0, /* m_traverse */
|
||||
0, /* m_clear */
|
||||
0, /* m_free */
|
||||
};
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
void initExpressionModule(void)
|
||||
{
|
||||
PyObject *m;
|
||||
/* Use existing module where possible
|
||||
* be careful not to init any runtime vars after this */
|
||||
m = PyImport_ImportModule( "Expression" );
|
||||
if(m) {
|
||||
Py_DECREF(m);
|
||||
//return m;
|
||||
}
|
||||
else {
|
||||
PyErr_Clear();
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
PyModule_Create(&Expression_module_def);
|
||||
#else
|
||||
Py_InitModule("Expression",CParserMethods);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -725,54 +725,6 @@ PyObject* CValue::ConvertKeysToPython( void )
|
||||
return pylist;
|
||||
}
|
||||
|
||||
/*
|
||||
PyObject* CValue::PyMake(PyObject* ignored,PyObject* args)
|
||||
{
|
||||
|
||||
//if (!PyArg_ParseTuple(args,"s:make",&name)) return NULL;
|
||||
Py_RETURN_NONE;//new CValue();
|
||||
}
|
||||
*/
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
static struct PyModuleDef CValue_module_def = {
|
||||
{}, /* m_base */
|
||||
"CValue", /* m_name */
|
||||
0, /* m_doc */
|
||||
0, /* m_size */
|
||||
CValueMethods, /* m_methods */
|
||||
0, /* m_reload */
|
||||
0, /* m_traverse */
|
||||
0, /* m_clear */
|
||||
0, /* m_free */
|
||||
};
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
void initCValue(void)
|
||||
{
|
||||
PyObject *m;
|
||||
/* Use existing module where possible
|
||||
* be careful not to init any runtime vars after this */
|
||||
m = PyImport_ImportModule( "CValue" );
|
||||
if(m) {
|
||||
Py_DECREF(m);
|
||||
//return m;
|
||||
}
|
||||
else {
|
||||
PyErr_Clear();
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
PyModule_Create(&CValue_module_def);
|
||||
#else
|
||||
Py_InitModule("CValue",CValueMethods);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif //NO_EXP_PYTHON_EMBEDDING
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -630,6 +630,7 @@ PyObject* initPythonConstraintBinding()
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
m = PyModule_Create(&PhysicsConstraints_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), PhysicsConstraints_module_def.m_name, m);
|
||||
#else
|
||||
m = Py_InitModule4("PhysicsConstraints", physicsconstraints_methods,
|
||||
PhysicsConstraints_module_documentation,
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
#include "MT_Vector3.h"
|
||||
#include "MT_Point3.h"
|
||||
#include "ListValue.h"
|
||||
#include "InputParser.h"
|
||||
#include "KX_Scene.h"
|
||||
#include "SND_DeviceManager.h"
|
||||
|
||||
@@ -498,6 +499,32 @@ static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
|
||||
}
|
||||
|
||||
|
||||
static PyObject *gEvalExpression(PyObject*, PyObject* value)
|
||||
{
|
||||
char* txt= PyString_AsString(value);
|
||||
|
||||
if (txt==NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "Expression.calc(text): expects a single string argument");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CParser parser;
|
||||
CExpression* expr = parser.ProcessText(txt);
|
||||
CValue* val = expr->Calculate();
|
||||
expr->Release();
|
||||
|
||||
if (val) {
|
||||
PyObject* pyobj = val->ConvertValueToPython();
|
||||
if (pyobj)
|
||||
return pyobj;
|
||||
else
|
||||
return val->GetProxy();
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static struct PyMethodDef game_methods[] = {
|
||||
{"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (PY_METHODCHAR)gPyExpandPath_doc},
|
||||
{"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (PY_METHODCHAR)gPySendMessage_doc},
|
||||
@@ -526,6 +553,7 @@ static struct PyMethodDef game_methods[] = {
|
||||
{"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (PY_METHODCHAR)"Gets the estimated average frame rate"},
|
||||
{"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (PY_METHODCHAR)"Gets a list of blend files in the same directory as the current blend file"},
|
||||
{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (PY_METHODCHAR)"Prints GL Extension Info"},
|
||||
{"EvalExpression", (PyCFunction)gEvalExpression, METH_O, (PY_METHODCHAR)"Evaluate a string as a game logic expression"},
|
||||
{NULL, (PyCFunction) NULL, 0, NULL }
|
||||
};
|
||||
|
||||
@@ -1032,6 +1060,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
|
||||
// Create the module and add the functions
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
m = PyModule_Create(&GameLogic_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), GameLogic_module_def.m_name, m);
|
||||
#else
|
||||
m = Py_InitModule4("GameLogic", game_methods,
|
||||
GameLogic_module_documentation,
|
||||
@@ -1697,6 +1726,7 @@ PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
|
||||
// Create the module and add the functions
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
m = PyModule_Create(&Rasterizer_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), Rasterizer_module_def.m_name, m);
|
||||
#else
|
||||
m = Py_InitModule4("Rasterizer", rasterizer_methods,
|
||||
Rasterizer_module_documentation,
|
||||
@@ -1831,6 +1861,7 @@ PyObject* initGameKeys()
|
||||
// Create the module and add the functions
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
m = PyModule_Create(&GameKeys_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), GameKeys_module_def.m_name, m);
|
||||
#else
|
||||
m = Py_InitModule4("GameKeys", gamekeys_methods,
|
||||
GameKeys_module_documentation,
|
||||
@@ -2106,5 +2137,5 @@ void setGamePythonPath(char *path)
|
||||
// engine but loading blend files within the BGE wont overwrite gp_GamePythonPathOrig
|
||||
void resetGamePythonPath()
|
||||
{
|
||||
gp_GamePythonPathOrig[0] == '\0';
|
||||
gp_GamePythonPathOrig[0] = '\0';
|
||||
}
|
||||
|
||||
@@ -271,7 +271,7 @@ Documentation for the GameLogic Module.
|
||||
@var KX_PARENT_REMOVE:
|
||||
@var KX_PARENT_SET:
|
||||
|
||||
@group Shader: MODELMATRIX*, MODELVIEWMATRIX*, VIEWMATRIX*, CAM_POS, CONSTANT_TIMER
|
||||
@group Shader: MODELMATRIX*, MODELVIEWMATRIX*, VIEWMATRIX*, CAM_POS, CONSTANT_TIMER, SHD_TANGENT
|
||||
@var VIEWMATRIX:
|
||||
@var VIEWMATRIX_INVERSE:
|
||||
@var VIEWMATRIX_INVERSETRANSPOSE:
|
||||
@@ -285,8 +285,8 @@ Documentation for the GameLogic Module.
|
||||
@var MODELVIEWMATRIX_INVERSETRANSPOSE:
|
||||
@var MODELVIEWMATRIX_TRANSPOSE:
|
||||
@var CAM_POS: Current camera position
|
||||
@var CONSTANT_TIMER: Current camera position
|
||||
@var SHD_TANGENT: Current camera position
|
||||
@var CONSTANT_TIMER: User a timer for the uniform value.
|
||||
@var SHD_TANGENT: Not yet documented.
|
||||
|
||||
@group Blender Material: BL_*
|
||||
@var BL_DST_ALPHA:
|
||||
@@ -302,6 +302,13 @@ Documentation for the GameLogic Module.
|
||||
@var BL_ZERO:
|
||||
|
||||
@group Deprecated: addActiveActuator
|
||||
|
||||
@var globalDict: A dictionary that is saved between loading blend files so you can use
|
||||
it to store inventory and other variables you want to store between
|
||||
scenes and blend files. It can also be written to a file and loaded
|
||||
later on with the game load/save actuators.
|
||||
note: only python built in types such as int/string/bool/float/tuples/lists
|
||||
can be saved, GameObjects, Actuators etc will not work as expectred.
|
||||
"""
|
||||
|
||||
import GameTypes
|
||||
@@ -441,6 +448,14 @@ def setPhysicsTicRate(ticrate):
|
||||
@type ticrate: float
|
||||
"""
|
||||
|
||||
def EvalExpression(text):
|
||||
"""
|
||||
Evaluate the string as an expression, similar to the expression controller logic brick.
|
||||
@param text: The expression to evaluate.
|
||||
@type text: string
|
||||
@return: The result of the expression. The type depends on the expression.
|
||||
"""
|
||||
|
||||
#{ Utility functions
|
||||
def getAverageFrameRate():
|
||||
"""
|
||||
|
||||
@@ -204,6 +204,7 @@ PyObject* initVideoTexture(void)
|
||||
|
||||
#if (PY_VERSION_HEX >= 0x03000000)
|
||||
m = PyModule_Create(&VideoTexture_module_def);
|
||||
PyDict_SetItemString(PySys_GetObject("modules"), VideoTexture_module_def.m_name, m);
|
||||
#else
|
||||
m = Py_InitModule4("VideoTexture", moduleMethods,
|
||||
"Module that allows to play video files on textures in GameBlender.",
|
||||
|
||||
Reference in New Issue
Block a user