BGE Python API
This changes how the BGE classes and Python work together, which hasnt changed since blender went opensource. The main difference is PyObjectPlus - the base class for most game engine classes, no longer inherit from PyObject, and cannot be cast to a PyObject. This has the advantage that the BGE does not have to keep 2 reference counts valid for C++ and Python. Previously C++ classes would never be freed while python held a reference, however this reference could be problematic eg: a GameObject that isnt in a scene anymore should not be used by python, doing so could even crash blender in some cases. Instead PyObjectPlus has a member "PyObject *m_proxy" which is lazily initialized when python needs it. m_proxy reference counts are managed by python, though it should never be freed while the C++ class exists since it holds a reference to avoid making and freeing it all the time. When the C++ class is free'd it sets the m_proxy reference to NULL, If python accesses this variable it will raise a RuntimeError, (check the isValid attribute to see if its valid without raising an error). - This replaces the m_zombie bool and IsZombie() tests added recently. In python return values that used to be.. return value->AddRef(); Are now return value->GetProxy(); or... return value->NewProxy(true); // true means python owns this C++ value which will be deleted when the PyObject is freed
This commit is contained in:
@@ -434,26 +434,35 @@ static int ImageMirror_init (PyObject * pySelf, PyObject * args, PyObject * kwds
|
||||
{
|
||||
// get scene pointer
|
||||
KX_Scene * scenePtr (NULL);
|
||||
if (scene != NULL && PyObject_TypeCheck(scene, &KX_Scene::Type))
|
||||
scenePtr = static_cast<KX_Scene*>(scene);
|
||||
else
|
||||
if (scene != NULL && PyObject_TypeCheck(scene, &KX_Scene::Type))
|
||||
scenePtr = static_cast<KX_Scene*>BGE_PROXY_REF(scene);
|
||||
else
|
||||
THRWEXCP(SceneInvalid, S_OK);
|
||||
|
||||
|
||||
if(scenePtr==NULL) /* incase the python proxy reference is invalid */
|
||||
THRWEXCP(SceneInvalid, S_OK);
|
||||
|
||||
// get observer pointer
|
||||
KX_GameObject * observerPtr (NULL);
|
||||
if (observer != NULL && PyObject_TypeCheck(observer, &KX_GameObject::Type))
|
||||
observerPtr = static_cast<KX_GameObject*>(observer);
|
||||
observerPtr = static_cast<KX_GameObject*>BGE_PROXY_REF(observer);
|
||||
else if (observer != NULL && PyObject_TypeCheck(observer, &KX_Camera::Type))
|
||||
observerPtr = static_cast<KX_Camera*>(observer);
|
||||
observerPtr = static_cast<KX_Camera*>BGE_PROXY_REF(observer);
|
||||
else
|
||||
THRWEXCP(ObserverInvalid, S_OK);
|
||||
|
||||
if(observerPtr==NULL) /* incase the python proxy reference is invalid */
|
||||
THRWEXCP(ObserverInvalid, S_OK);
|
||||
|
||||
// get mirror pointer
|
||||
KX_GameObject * mirrorPtr (NULL);
|
||||
if (mirror != NULL && PyObject_TypeCheck(mirror, &KX_GameObject::Type))
|
||||
mirrorPtr = static_cast<KX_GameObject*>(mirror);
|
||||
mirrorPtr = static_cast<KX_GameObject*>BGE_PROXY_REF(mirror);
|
||||
else
|
||||
THRWEXCP(MirrorInvalid, S_OK);
|
||||
|
||||
if(mirrorPtr==NULL) /* incase the python proxy reference is invalid */
|
||||
THRWEXCP(MirrorInvalid, S_OK);
|
||||
|
||||
// locate the material in the mirror
|
||||
RAS_IPolyMaterial * material = getMaterial(mirror, materialID);
|
||||
|
Reference in New Issue
Block a user