BGE Py API

added exception messages for replaceMesh.setMesh() and allowed None as an argument.
added exception messages for other BGE module functions.
This commit is contained in:
Campbell Barton 2008-09-05 02:53:12 +00:00
parent 3c95d91a57
commit e3a1547eea
6 changed files with 228 additions and 229 deletions

@ -108,7 +108,7 @@ struct PyMethodDef M_Mathutils_methods[] = {
};
/*----------------------------MODULE INIT-------------------------*/
/* from can be Blender.Mathutils or GameLogic.Mathutils for the BGE */
PyObject *Mathutils_Init(char *from)
PyObject *Mathutils_Init(const char *from)
{
PyObject *submodule;

@ -38,7 +38,7 @@
#include "euler.h"
#include "point.h"
PyObject *Mathutils_Init( char * from );
PyObject *Mathutils_Init( const char * from );
PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat);
PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec);
PyObject *row_point_multiplication(PointObject* pt, MatrixObject * mat);

@ -123,15 +123,13 @@ static PyObject* gPyGetRandomFloat(PyObject*)
static PyObject* gPySetGravity(PyObject*, PyObject* args)
{
MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec))
{
if (gp_KetsjiScene)
gp_KetsjiScene->SetGravity(vec);
Py_Return;
}
if (!PyVecArgTo(args, vec))
return NULL;
if (gp_KetsjiScene)
gp_KetsjiScene->SetGravity(vec);
return NULL;
Py_RETURN_NONE;
}
static char gPyExpandPath_doc[] =
@ -149,13 +147,12 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args)
char expanded[FILE_MAXDIR + FILE_MAXFILE];
char* filename;
if (PyArg_ParseTuple(args,"s",&filename))
{
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
BLI_convertstringcode(expanded, G.sce);
return PyString_FromString(expanded);
}
return NULL;
if (!PyArg_ParseTuple(args,"s",&filename))
return NULL;
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
BLI_convertstringcode(expanded, G.sce);
return PyString_FromString(expanded);
}
@ -183,6 +180,12 @@ static PyObject* gPyGetSpectrum(PyObject*)
PyList_SetItem(resultlist, index, PyFloat_FromDouble(spectrum[index]));
}
}
else {
for (int index = 0; index < 512; index++)
{
PyList_SetItem(resultlist, index, PyFloat_FromDouble(0.0));
}
}
return resultlist;
}
@ -193,16 +196,17 @@ static PyObject* gPyStartDSP(PyObject*, PyObject* args)
{
SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
if (audiodevice)
{
if (!usedsp)
{
audiodevice->StartUsingDSP();
usedsp = true;
Py_Return;
}
if (!audiodevice) {
PyErr_SetString(PyExc_RuntimeError, "no audio device available");
return NULL;
}
return NULL;
if (!usedsp) {
audiodevice->StartUsingDSP();
usedsp = true;
}
Py_RETURN_NONE;
}
@ -211,28 +215,27 @@ static PyObject* gPyStopDSP(PyObject*, PyObject* args)
{
SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
if (audiodevice)
{
if (usedsp)
{
audiodevice->StopUsingDSP();
usedsp = false;
Py_Return;
}
if (!audiodevice) {
PyErr_SetString(PyExc_RuntimeError, "no audio device available");
return NULL;
}
return NULL;
if (usedsp) {
audiodevice->StopUsingDSP();
usedsp = true;
}
Py_RETURN_NONE;
}
static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
{
float ticrate;
if (PyArg_ParseTuple(args, "f", &ticrate))
{
KX_KetsjiEngine::SetTicRate(ticrate);
Py_Return;
}
if (!PyArg_ParseTuple(args, "f", &ticrate))
return NULL;
return NULL;
KX_KetsjiEngine::SetTicRate(ticrate);
Py_RETURN_NONE;
}
static PyObject* gPyGetLogicTicRate(PyObject*)
@ -243,26 +246,21 @@ static PyObject* gPyGetLogicTicRate(PyObject*)
static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
{
float ticrate;
if (PyArg_ParseTuple(args, "f", &ticrate))
{
PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate);
Py_Return;
}
if (!PyArg_ParseTuple(args, "f", &ticrate))
return NULL;
return NULL;
PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate);
Py_RETURN_NONE;
}
static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args)
{
int debugMode;
if (PyArg_ParseTuple(args, "i", &debugMode))
{
PHY_GetActiveEnvironment()->setDebugMode(debugMode);
Py_Return;
}
if (!PyArg_ParseTuple(args, "i", &debugMode))
return NULL;
return NULL;
PHY_GetActiveEnvironment()->setDebugMode(debugMode);
Py_RETURN_NONE;
}
@ -425,22 +423,14 @@ static struct PyMethodDef game_methods[] = {
static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
{
int height = (gp_Canvas ? gp_Canvas->GetHeight() : 0);
PyObject* heightval = PyInt_FromLong(height);
return heightval;
return PyInt_FromLong((gp_Canvas ? gp_Canvas->GetHeight() : 0));
}
static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
{
int width = (gp_Canvas ? gp_Canvas->GetWidth() : 0);
PyObject* widthval = PyInt_FromLong(width);
return widthval;
return PyInt_FromLong((gp_Canvas ? gp_Canvas->GetWidth() : 0));
}
@ -451,15 +441,11 @@ bool gUseVisibilityTemp = false;
static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
{
int visible;
if (PyArg_ParseTuple(args,"i",&visible))
{
gUseVisibilityTemp = (visible != 0);
}
else
{
if (!PyArg_ParseTuple(args,"i",&visible))
return NULL;
}
Py_Return;
gUseVisibilityTemp = (visible != 0);
Py_RETURN_NONE;
}
@ -467,23 +453,20 @@ static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
static PyObject* gPyShowMouse(PyObject*, PyObject* args)
{
int visible;
if (PyArg_ParseTuple(args,"i",&visible))
{
if (visible)
{
if (gp_Canvas)
gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
} else
{
if (gp_Canvas)
gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
}
}
else {
if (!PyArg_ParseTuple(args,"i",&visible))
return NULL;
if (visible)
{
if (gp_Canvas)
gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
} else
{
if (gp_Canvas)
gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
}
Py_Return;
Py_RETURN_NONE;
}
@ -491,74 +474,81 @@ static PyObject* gPyShowMouse(PyObject*, PyObject* args)
static PyObject* gPySetMousePosition(PyObject*, PyObject* args)
{
int x,y;
if (PyArg_ParseTuple(args,"ii",&x,&y))
{
if (gp_Canvas)
gp_Canvas->SetMousePosition(x,y);
}
else {
if (!PyArg_ParseTuple(args,"ii",&x,&y))
return NULL;
}
Py_Return;
if (gp_Canvas)
gp_Canvas->SetMousePosition(x,y);
Py_RETURN_NONE;
}
static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args)
{
float sep;
if (PyArg_ParseTuple(args, "f", &sep))
{
if (gp_Rasterizer)
gp_Rasterizer->SetEyeSeparation(sep);
Py_Return;
if (!PyArg_ParseTuple(args, "f", &sep))
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
return NULL;
gp_Rasterizer->SetEyeSeparation(sep);
Py_RETURN_NONE;
}
static PyObject* gPyGetEyeSeparation(PyObject*, PyObject*, PyObject*)
{
if (gp_Rasterizer)
return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation());
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
return NULL;
return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation());
}
static PyObject* gPySetFocalLength(PyObject*, PyObject* args)
{
float focus;
if (PyArg_ParseTuple(args, "f", &focus))
{
if (gp_Rasterizer)
gp_Rasterizer->SetFocalLength(focus);
Py_Return;
}
if (!PyArg_ParseTuple(args, "f", &focus))
return NULL;
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
gp_Rasterizer->SetFocalLength(focus);
Py_RETURN_NONE;
}
static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
{
if (gp_Rasterizer)
return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength());
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength());
Py_RETURN_NONE;
}
static PyObject* gPySetBackgroundColor(PyObject*, PyObject* args)
{
MT_Vector4 vec = MT_Vector4(0., 0., 0.3, 0.);
if (PyVecArgTo(args, vec))
{
if (gp_Canvas)
{
gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
}
Py_Return;
}
if (!PyVecArgTo(args, vec))
return NULL;
return NULL;
if (gp_Canvas)
{
gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
}
Py_RETURN_NONE;
}
@ -567,16 +557,16 @@ static PyObject* gPySetMistColor(PyObject*, PyObject* args)
{
MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec))
{
if (gp_Rasterizer)
{
gp_Rasterizer->SetFogColor(vec[0], vec[1], vec[2]);
}
Py_Return;
}
if (!PyVecArgTo(args, vec))
return NULL;
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
gp_Rasterizer->SetFogColor(vec[0], vec[1], vec[2]);
Py_RETURN_NONE;
}
@ -585,17 +575,17 @@ static PyObject* gPySetMistStart(PyObject*, PyObject* args)
{
float miststart;
if (PyArg_ParseTuple(args,"f",&miststart))
{
if (gp_Rasterizer)
{
gp_Rasterizer->SetFogStart(miststart);
}
}
else {
if (!PyArg_ParseTuple(args,"f",&miststart))
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
Py_Return;
gp_Rasterizer->SetFogStart(miststart);
Py_RETURN_NONE;
}
@ -604,17 +594,17 @@ static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
{
float mistend;
if (PyArg_ParseTuple(args,"f",&mistend))
{
if (gp_Rasterizer)
{
gp_Rasterizer->SetFogEnd(mistend);
}
}
else {
if (!PyArg_ParseTuple(args,"f",&mistend))
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
Py_Return;
gp_Rasterizer->SetFogEnd(mistend);
Py_RETURN_NONE;
}
@ -622,16 +612,16 @@ static PyObject* gPySetAmbientColor(PyObject*, PyObject* args)
{
MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec))
{
if (gp_Rasterizer)
{
gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
}
Py_Return;
}
if (!PyVecArgTo(args, vec))
return NULL;
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
Py_RETURN_NONE;
}
@ -640,42 +630,43 @@ static PyObject* gPySetAmbientColor(PyObject*, PyObject* args)
static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args)
{
char* filename;
if (PyArg_ParseTuple(args,"s",&filename))
{
if (gp_Canvas)
{
gp_Canvas->MakeScreenShot(filename);
}
}
else {
if (!PyArg_ParseTuple(args,"s",&filename))
return NULL;
if (gp_Canvas)
{
gp_Canvas->MakeScreenShot(filename);
}
Py_Return;
Py_RETURN_NONE;
}
static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args)
{
float motionblurvalue;
if (PyArg_ParseTuple(args,"f",&motionblurvalue))
{
if(gp_Rasterizer)
{
gp_Rasterizer->EnableMotionBlur(motionblurvalue);
}
}
else {
if (!PyArg_ParseTuple(args,"f",&motionblurvalue))
return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
Py_Return;
gp_Rasterizer->EnableMotionBlur(motionblurvalue);
Py_RETURN_NONE;
}
static PyObject* gPyDisableMotionBlur(PyObject*, PyObject* args)
{
if(gp_Rasterizer)
{
gp_Rasterizer->DisableMotionBlur();
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
Py_Return;
gp_Rasterizer->DisableMotionBlur();
Py_RETURN_NONE;
}
int getGLSLSettingFlag(char *setting)
@ -704,30 +695,33 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
int enable, flag;
if (PyArg_ParseTuple(args,"si",&setting,&enable))
{
flag = getGLSLSettingFlag(setting);
return NULL;
flag = getGLSLSettingFlag(setting);
if (flag==-1) {
PyErr_SetString(PyExc_ValueError, "glsl setting is not known");
return NULL;
}
if (enable)
G.fileflags &= ~flag;
else
G.fileflags |= flag;
if(flag != -1) {
if (enable)
G.fileflags &= ~flag;
else
G.fileflags |= flag;
/* display lists and GLSL materials need to be remade */
if(gp_KetsjiEngine) {
KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
KX_SceneList::iterator it;
/* display lists and GLSL materials need to be remade */
if(gp_KetsjiEngine) {
KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
KX_SceneList::iterator it;
for(it=scenes->begin(); it!=scenes->end(); it++)
if((*it)->GetBucketManager())
(*it)->GetBucketManager()->ReleaseDisplayLists();
}
GPU_materials_free();
}
for(it=scenes->begin(); it!=scenes->end(); it++)
if((*it)->GetBucketManager())
(*it)->GetBucketManager()->ReleaseDisplayLists();
}
Py_Return;
GPU_materials_free();
Py_RETURN_NONE;
}
static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
@ -737,14 +731,17 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
char *setting;
int enabled = 0, flag;
if (PyArg_ParseTuple(args,"s",&setting))
{
flag = getGLSLSettingFlag(setting);
if(flag != -1)
enabled = ((G.fileflags & flag) != 0);
if (!PyArg_ParseTuple(args,"s",&setting))
return NULL;
flag = getGLSLSettingFlag(setting);
if (flag==-1) {
PyErr_SetString(PyExc_ValueError, "glsl setting is not known");
return NULL;
}
enabled = ((G.fileflags & flag) != 0);
return PyInt_FromLong(enabled);
}

@ -80,7 +80,7 @@ PyParentObject KX_SCA_ReplaceMeshActuator::Parents[] = {
PyMethodDef KX_SCA_ReplaceMeshActuator::Methods[] = {
{"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_VARARGS, SetMesh_doc},
{"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_O, SetMesh_doc},
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, instantReplaceMesh),
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, getMesh),
@ -99,28 +99,29 @@ PyObject* KX_SCA_ReplaceMeshActuator::_getattr(const STR_String& attr)
/* 1. setMesh */
char KX_SCA_ReplaceMeshActuator::SetMesh_doc[] =
"setMesh(name)\n"
"\t- name: string\n"
"\t- name: string or None\n"
"\tSet the mesh that will be substituted for the current one.\n";
PyObject* KX_SCA_ReplaceMeshActuator::PySetMesh(PyObject* self,
PyObject* args,
PyObject* kwds)
PyObject* KX_SCA_ReplaceMeshActuator::PySetMesh(PyObject* self, PyObject* value)
{
char* meshname;
if (!PyArg_ParseTuple(args, "s", &meshname))
{
return NULL;
}
void* mesh = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname));
if (mesh) {
if (value == Py_None) {
m_mesh = NULL;
} else {
char* meshname = PyString_AsString(value);
if (!meshname) {
PyErr_SetString(PyExc_ValueError, "Expected the name of a mesh or None");
return NULL;
}
void* mesh = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname));
if (mesh==NULL) {
PyErr_SetString(PyExc_ValueError, "The mesh name given does not exist");
return NULL;
}
m_mesh= (class RAS_MeshObject*)mesh;
Py_Return;
}
return NULL;
Py_RETURN_NONE;
}
KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, getMesh,
@ -129,7 +130,7 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, getMesh,
)
{
if (!m_mesh)
Py_Return;
Py_RETURN_NONE;
return PyString_FromString(const_cast<char *>(m_mesh->GetName().ReadPtr()));
}
@ -139,7 +140,7 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh,
"instantReplaceMesh() : immediately replace mesh without delay\n")
{
InstantReplaceMesh();
Py_Return;
Py_RETURN_NONE;
}
/* ------------------------------------------------------------------------- */

@ -76,7 +76,7 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
void InstantReplaceMesh();
/* 1. setMesh */
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,SetMesh);
KX_PYMETHOD_DOC_O(KX_SCA_ReplaceMeshActuator,SetMesh);
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,getMesh);
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,instantReplaceMesh);

@ -59,8 +59,9 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator):
def setMesh(name):
"""
Sets the name of the mesh that will replace the current one.
When the name is None it will unset the mesh value so no action is taken.
@type name: string
@type name: string or None
"""
def getMesh():
"""
@ -68,6 +69,6 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator):
Returns None if no mesh has been scheduled to be added.
@rtype: string
@rtype: string or None
"""