forked from bartvdbraak/blender
BGE: Fix for [#33839] "a logic.joysticks Crashes BGE" reported by Josiah Lane (solarlune).
On a scene change the SCA_JoystickManager gets destroyed which in turn means all of it's joystick instances are released. Since SCA_PythonJoystick was just using a borrowed reference, this allowed the joystick to be freed. Now the joystick's refcount is incremented so that the SCA_PythonJoystick's joystick reference will survive across scene changes.
This commit is contained in:
parent
2f4cc3530d
commit
03df7e9a56
@ -46,6 +46,10 @@ m_joystick(joystick)
|
|||||||
|
|
||||||
SCA_PythonJoystick::~SCA_PythonJoystick()
|
SCA_PythonJoystick::~SCA_PythonJoystick()
|
||||||
{
|
{
|
||||||
|
// The joystick reference we got in the constructor was a new instance,
|
||||||
|
// so we release it here
|
||||||
|
m_joystick->ReleaseInstance();
|
||||||
|
|
||||||
#ifdef WITH_PYTHON
|
#ifdef WITH_PYTHON
|
||||||
PyDict_Clear(m_event_dict);
|
PyDict_Clear(m_event_dict);
|
||||||
Py_DECREF(m_event_dict);
|
Py_DECREF(m_event_dict);
|
||||||
|
@ -1428,15 +1428,15 @@ PyObject *initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
|
|||||||
PyDict_SetItemString(d, "mouse", gp_PythonMouse->NewProxy(true));
|
PyDict_SetItemString(d, "mouse", gp_PythonMouse->NewProxy(true));
|
||||||
|
|
||||||
PyObject* joylist = PyList_New(JOYINDEX_MAX);
|
PyObject* joylist = PyList_New(JOYINDEX_MAX);
|
||||||
SCA_JoystickManager* joyevent = (SCA_JoystickManager*)gp_KetsjiScene->GetLogicManager()->FindEventManager(SCA_EventManager::JOY_EVENTMGR);
|
|
||||||
for (int i=0; i<JOYINDEX_MAX; ++i) {
|
for (int i=0; i<JOYINDEX_MAX; ++i) {
|
||||||
SCA_Joystick* joy = joyevent->GetJoystickDevice(i);
|
SCA_Joystick* joy = SCA_Joystick::GetInstance(i);
|
||||||
if (joy && joy->Connected()) {
|
if (joy && joy->Connected()) {
|
||||||
gp_PythonJoysticks[i] = new SCA_PythonJoystick(joy);
|
gp_PythonJoysticks[i] = new SCA_PythonJoystick(joy);
|
||||||
PyObject* tmp = gp_PythonJoysticks[i]->NewProxy(true);
|
PyObject* tmp = gp_PythonJoysticks[i]->NewProxy(true);
|
||||||
Py_INCREF(tmp);
|
Py_INCREF(tmp);
|
||||||
PyList_SET_ITEM(joylist, i, tmp);
|
PyList_SET_ITEM(joylist, i, tmp);
|
||||||
} else {
|
} else {
|
||||||
|
joy->ReleaseInstance();
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
PyList_SET_ITEM(joylist, i, Py_None);
|
PyList_SET_ITEM(joylist, i, Py_None);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user