Committing patch "[#29763] Adding an active_events property to SCA_PythonKeyboard...
authorMitchell Stokes <mogurijin@gmail.com>
Sun, 22 Jan 2012 05:45:56 +0000 (05:45 +0000)
committerMitchell Stokes <mogurijin@gmail.com>
Sun, 22 Jan 2012 05:45:56 +0000 (05:45 +0000)
Here is the description:
As the summary says, this patch adds a new event to both SCA_PythonKeyboard and SCA_PythonMouse. This property is similar to the events property that both have, but it only returns events which are not KX_NO_INPUTSTATUS. This moves the "no input" check from Python to C, which gave my input handling code a 2x speed up. Python sucks (performance-wise) with iterating lists and SCA_PythonKeyboard has close to 200 events (I think something like 177, but I don't know for sure).

doc/python_api/rst/bge.types.rst
source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
source/gameengine/GameLogic/SCA_PythonKeyboard.h
source/gameengine/GameLogic/SCA_PythonMouse.cpp
source/gameengine/GameLogic/SCA_PythonMouse.h

index bb3ac004d5155f2ceca218d10802d931d67d7724..6988f90cc1ec2327a1987d4aefd63157a9cf0ded 100644 (file)
@@ -66,6 +66,12 @@ Game Types (bge.types)
 
       :type: dictionary {:ref:`keycode<keyboard-keys>`::ref:`status<input-status>`, ...}
 
+   .. attribute:: active_events
+
+      A dictionary containing the status of only the active keyboard events or keys. (read-only).
+
+      :type: dictionary {:ref:`keycode<keyboard-keys>`::ref:`status<input-status>`, ...}
+
 .. class:: SCA_PythonMouse(PyObjectPlus)
 
    The current mouse.
@@ -75,6 +81,12 @@ Game Types (bge.types)
       a dictionary containing the status of each mouse event. (read-only).
 
       :type: dictionary {:ref:`keycode<mouse-keys>`::ref:`status<input-status>`, ...}
+
+   .. attribute:: active_events
+
+      a dictionary containing the status of only the active mouse events. (read-only).
+
+      :type: dictionary {:ref:`keycode<mouse-keys>`::ref:`status<input-status>`, ...}
       
    .. attribute:: position
 
index 9c7f38315678819410616b7dfa61a40066ca206f..46c43b5e339d58489394362f0b16956bd6e43073 100644 (file)
@@ -84,6 +84,7 @@ PyMethodDef SCA_PythonKeyboard::Methods[] = {
 
 PyAttributeDef SCA_PythonKeyboard::Attributes[] = {
        KX_PYATTRIBUTE_RO_FUNCTION("events", SCA_PythonKeyboard, pyattr_get_events),
+       KX_PYATTRIBUTE_RO_FUNCTION("active_events", SCA_PythonKeyboard, pyattr_get_active_events),
        { NULL }        //Sentinel
 };
 
@@ -101,4 +102,21 @@ PyObject* SCA_PythonKeyboard::pyattr_get_events(void *self_v, const KX_PYATTRIBU
        return self->m_event_dict;
 }
 
+PyObject* SCA_PythonKeyboard::pyattr_get_active_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+       SCA_PythonKeyboard* self = static_cast<SCA_PythonKeyboard*>(self_v);
+
+       PyDict_Clear(self->m_event_dict);
+       
+       for (int i=SCA_IInputDevice::KX_BEGINKEY; i<=SCA_IInputDevice::KX_ENDKEY; i++)
+       {
+               const SCA_InputEvent & inevent = self->m_keyboard->GetEventValue((SCA_IInputDevice::KX_EnumInputs)i);
+               
+               if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS)
+                       PyDict_SetItem(self->m_event_dict, PyLong_FromSsize_t(i), PyLong_FromSsize_t(inevent.m_status));
+       }
+       Py_INCREF(self->m_event_dict);
+       return self->m_event_dict;
+}
+
 #endif
index 7ecf76d1581c8b07d3e345f73b81dcea35707ee3..f44bb40e13c6ccd5893fedbbf6a222bb964c1049 100644 (file)
@@ -43,6 +43,7 @@ public:
 
 #ifdef WITH_PYTHON
        static PyObject*        pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+       static PyObject*        pyattr_get_active_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
 #endif
 };
 
index 4f06445a79fade489cbe60786a34eb7c85d587aa..cdbeaba2235a97ed606194edff185ecbf08ac170 100644 (file)
@@ -86,6 +86,7 @@ PyMethodDef SCA_PythonMouse::Methods[] = {
 
 PyAttributeDef SCA_PythonMouse::Attributes[] = {
        KX_PYATTRIBUTE_RO_FUNCTION("events", SCA_PythonMouse, pyattr_get_events),
+       KX_PYATTRIBUTE_RO_FUNCTION("active_events", SCA_PythonMouse, pyattr_get_active_events),
        KX_PYATTRIBUTE_RW_FUNCTION("position", SCA_PythonMouse, pyattr_get_position, pyattr_set_position),
        KX_PYATTRIBUTE_RW_FUNCTION("visible", SCA_PythonMouse, pyattr_get_visible, pyattr_set_visible),
        { NULL }        //Sentinel
@@ -105,6 +106,22 @@ PyObject* SCA_PythonMouse::pyattr_get_events(void *self_v, const KX_PYATTRIBUTE_
        return self->m_event_dict;
 }
 
+PyObject* SCA_PythonMouse::pyattr_get_active_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+       SCA_PythonMouse* self = static_cast<SCA_PythonMouse*>(self_v);
+
+       PyDict_Clear(self->m_event_dict);
+       
+       for (int i=SCA_IInputDevice::KX_BEGINMOUSE; i<=SCA_IInputDevice::KX_ENDMOUSE; i++)
+       {
+               const SCA_InputEvent & inevent = self->m_mouse->GetEventValue((SCA_IInputDevice::KX_EnumInputs)i);
+               
+               if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS)
+                       PyDict_SetItem(self->m_event_dict, PyLong_FromSsize_t(i), PyLong_FromSsize_t(inevent.m_status));
+       }
+       Py_INCREF(self->m_event_dict);
+       return self->m_event_dict;
+}
 
 PyObject* SCA_PythonMouse::pyattr_get_position(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
index 4ad655dce8fd2e3cce151b22d5b2a5b9fd1f7af2..41d286a8048bd15fd194825dc334b62aaac2a99a 100644 (file)
@@ -48,6 +48,7 @@ public:
        KX_PYMETHOD_DOC(SCA_PythonMouse, show);
 
        static PyObject*        pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+       static PyObject*        pyattr_get_active_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
        static PyObject*        pyattr_get_position(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
        static int                      pyattr_set_position(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value);
        static PyObject*        pyattr_get_visible(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);