Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp2
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.cpp115
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.h51
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.cpp185
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.h60
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h2
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp20
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp4
-rw-r--r--source/gameengine/PyDoc/GameKeys.py9
-rw-r--r--source/gameengine/PyDoc/GameLogic.py3
-rw-r--r--source/gameengine/PyDoc/GameTypes.py37
-rw-r--r--source/gameengine/Rasterizer/RAS_ICanvas.h9
13 files changed, 498 insertions, 1 deletions
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index 9139d6ea729..d563a17fe06 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -139,6 +139,8 @@ SetViewPort(
void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate)
{
+ m_mousestate = mousestate;
+
switch (mousestate)
{
case MOUSE_INVISIBLE:
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
new file mode 100644
index 00000000000..ef6d2ad8cab
--- /dev/null
+++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
@@ -0,0 +1,115 @@
+/**
+ * Python Keyboard Object
+ *
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "SCA_PythonKeyboard.h"
+#include "SCA_IInputDevice.h"
+
+/* ------------------------------------------------------------------------- */
+/* Native functions */
+/* ------------------------------------------------------------------------- */
+
+SCA_PythonKeyboard::SCA_PythonKeyboard(SCA_IInputDevice* keyboard)
+: PyObjectPlus(),
+m_keyboard(keyboard)
+{
+}
+
+SCA_PythonKeyboard::~SCA_PythonKeyboard()
+{
+ /* intentionally empty */
+}
+
+#ifndef DISABLE_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python functions */
+/* ------------------------------------------------------------------------- */
+
+/* Integration hooks ------------------------------------------------------- */
+PyTypeObject SCA_PythonKeyboard::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "SCA_PythonKeyboard",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &PyObjectPlus::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef SCA_PythonKeyboard::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef SCA_PythonKeyboard::Attributes[] = {
+ KX_PYATTRIBUTE_RO_FUNCTION("events", SCA_PythonKeyboard, pyattr_get_events),
+ { NULL } //Sentinel
+};
+
+PyObject* SCA_PythonKeyboard::pyattr_get_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_PythonKeyboard* self = static_cast<SCA_PythonKeyboard*>(self_v);
+
+ PyObject* resultlist = PyList_New(0);
+
+ 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)
+ {
+ PyObject* keypair = PyList_New(2);
+ PyList_SET_ITEM(keypair, 0, PyLong_FromSsize_t(i));
+ PyList_SET_ITEM(keypair, 1, PyLong_FromSsize_t(inevent.m_status));
+ PyList_Append(resultlist, keypair);
+ }
+ }
+
+ return resultlist;
+}
+
+#endif
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.h b/source/gameengine/GameLogic/SCA_PythonKeyboard.h
new file mode 100644
index 00000000000..4c178d61cb0
--- /dev/null
+++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.h
@@ -0,0 +1,51 @@
+/**
+ * SCA_PythonKeyboard.h
+ *
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __KX_PYKEYBOARD
+#define __KX_PYKEYBOARD
+
+#include "PyObjectPlus.h"
+
+class SCA_PythonKeyboard : public PyObjectPlus
+{
+ Py_Header;
+ class SCA_IInputDevice *m_keyboard;
+public:
+ SCA_PythonKeyboard(class SCA_IInputDevice* keyboard);
+ virtual ~SCA_PythonKeyboard();
+
+#ifndef DISABLE_PYTHON
+ static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+#endif
+};
+
+#endif //__KX_PYKEYBOARD
+
diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.cpp b/source/gameengine/GameLogic/SCA_PythonMouse.cpp
new file mode 100644
index 00000000000..405c4110301
--- /dev/null
+++ b/source/gameengine/GameLogic/SCA_PythonMouse.cpp
@@ -0,0 +1,185 @@
+/**
+ * Python Mouse Object
+ *
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "SCA_PythonMouse.h"
+#include "SCA_IInputDevice.h"
+#include "RAS_ICanvas.h"
+
+/* ------------------------------------------------------------------------- */
+/* Native functions */
+/* ------------------------------------------------------------------------- */
+
+SCA_PythonMouse::SCA_PythonMouse(SCA_IInputDevice* mouse, RAS_ICanvas* canvas)
+: PyObjectPlus(),
+m_canvas(canvas),
+m_mouse(mouse)
+{
+}
+
+SCA_PythonMouse::~SCA_PythonMouse()
+{
+ /* intentionally empty */
+}
+
+#ifndef DISABLE_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python functions */
+/* ------------------------------------------------------------------------- */
+
+/* Integration hooks ------------------------------------------------------- */
+PyTypeObject SCA_PythonMouse::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "SCA_PythonMouse",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &PyObjectPlus::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef SCA_PythonMouse::Methods[] = {
+// KX_PYMETHODTABLE(SCA_PythonMouse, show),
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef SCA_PythonMouse::Attributes[] = {
+ KX_PYATTRIBUTE_RO_FUNCTION("events", SCA_PythonMouse, pyattr_get_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
+};
+
+PyObject* SCA_PythonMouse::pyattr_get_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_PythonMouse* self = static_cast<SCA_PythonMouse*>(self_v);
+
+ PyObject* resultlist = PyList_New(0);
+
+ 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)
+ {
+ PyObject* keypair = PyList_New(2);
+ PyList_SET_ITEM(keypair, 0, PyLong_FromSsize_t(i));
+ PyList_SET_ITEM(keypair, 1, PyLong_FromSsize_t(inevent.m_status));
+ PyList_Append(resultlist, keypair);
+ }
+ }
+
+ return resultlist;
+}
+
+PyObject* SCA_PythonMouse::pyattr_get_position(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_PythonMouse* self = static_cast<SCA_PythonMouse*>(self_v);
+ const SCA_InputEvent & xevent = self->m_mouse->GetEventValue(SCA_IInputDevice::KX_MOUSEX);
+ const SCA_InputEvent & yevent = self->m_mouse->GetEventValue(SCA_IInputDevice::KX_MOUSEY);
+
+ PyObject* resultlist = PyList_New(2);
+
+ PyList_SET_ITEM(resultlist, 0, PyFloat_FromDouble(float(xevent.m_eventval)/self->m_canvas->GetWidth()));
+
+ PyList_SET_ITEM(resultlist, 1, PyFloat_FromDouble(float(yevent.m_eventval)/self->m_canvas->GetHeight()));
+
+ return resultlist;
+}
+
+int SCA_PythonMouse::pyattr_set_position(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ SCA_PythonMouse* self = static_cast<SCA_PythonMouse*>(self_v);
+ int x, y;
+ float pyx, pyy;
+ if (!PyArg_ParseTuple(value, "ff:position", &pyx, &pyy))
+ return PY_SET_ATTR_FAIL;
+
+ x = (int)(pyx*self->m_canvas->GetWidth());
+ y = (int)(pyy*self->m_canvas->GetHeight());
+
+ self->m_canvas->SetMousePosition(x, y);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* SCA_PythonMouse::pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ SCA_PythonMouse* self = static_cast<SCA_PythonMouse*>(self_v);
+
+ int visible;
+
+ if (self->m_canvas->GetMouseState() == RAS_ICanvas::MOUSE_INVISIBLE)
+ visible = 0;
+ else
+ visible = 1;
+
+ return PyBool_FromLong(visible);
+}
+
+int SCA_PythonMouse::pyattr_set_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ SCA_PythonMouse* self = static_cast<SCA_PythonMouse*>(self_v);
+
+ int visible = PyObject_IsTrue(value);
+
+ if (visible == -1)
+ {
+ PyErr_SetString(PyExc_AttributeError, "SCA_PythonMouse.visible = bool: SCA_PythonMouse, expected True or False");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ if (visible)
+ self->m_canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ else
+ self->m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+#endif
diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.h b/source/gameengine/GameLogic/SCA_PythonMouse.h
new file mode 100644
index 00000000000..b3ce107995b
--- /dev/null
+++ b/source/gameengine/GameLogic/SCA_PythonMouse.h
@@ -0,0 +1,60 @@
+/**
+ * SCA_PythonMouse.h
+ *
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __KX_PYMOUSE
+#define __KX_PYMOUSE
+
+#include "PyObjectPlus.h"
+
+class SCA_PythonMouse : public PyObjectPlus
+{
+ Py_Header;
+ class SCA_IInputDevice *m_mouse;
+ class RAS_ICanvas *m_canvas;
+public:
+ SCA_PythonMouse(class SCA_IInputDevice* mouse, class RAS_ICanvas* canvas);
+ virtual ~SCA_PythonMouse();
+
+ void Show(bool visible);
+
+#ifndef DISABLE_PYTHON
+ KX_PYMETHOD_DOC(SCA_PythonMouse, show);
+
+ static PyObject* pyattr_get_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);
+ static int pyattr_set_visible(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value);
+#endif
+};
+
+#endif //__KX_PYMOUSE
+
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp b/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
index 0a96fbbe503..4eb9a4cfcd7 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
@@ -79,6 +79,8 @@ void GPG_Canvas::SetMousePosition(int x, int y)
void GPG_Canvas::SetMouseState(RAS_MouseState mousestate)
{
+ m_mousestate = mousestate;
+
if (m_window)
{
switch (mousestate)
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index 36db8685afb..b3549c5fdab 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -213,6 +213,8 @@ public:
RAS_IRasterizer* GetRasterizer(){return m_rasterizer;};
RAS_ICanvas* GetCanvas(){return m_canvas;};
RAS_IRenderTools* GetRenderTools(){return m_rendertools;};
+ SCA_IInputDevice* GetKeyboardDevice(){return m_keyboarddevice;};
+ SCA_IInputDevice* GetMouseDevice(){return m_mousedevice;};
/// Dome functions
void InitDome(short res, short mode, short angle, float resbuf, short tilt, struct Text* text);
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 082f802010d..675cf3c09f6 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -73,6 +73,8 @@ extern "C" {
#include "SCA_PropertySensor.h"
#include "SCA_RandomActuator.h"
#include "SCA_KeyboardSensor.h" /* IsPrintable, ToCharacter */
+#include "SCA_PythonKeyboard.h"
+#include "SCA_PythonMouse.h"
#include "KX_ConstraintActuator.h"
#include "KX_IpoActuator.h"
#include "KX_SoundActuator.h"
@@ -1280,6 +1282,13 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
+ // Add keyboard and mouse attributes to this module
+ SCA_PythonKeyboard* pykeyb = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
+ PyDict_SetItemString(d, "keyboard", pykeyb->NewProxy(true));
+
+ SCA_PythonMouse* pymouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
+ PyDict_SetItemString(d, "mouse", pymouse->NewProxy(true));
+
ErrorObject = PyUnicode_FromString("GameLogic.error");
PyDict_SetItemString(d, "error", ErrorObject);
Py_DECREF(ErrorObject);
@@ -1978,7 +1987,7 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *
#endif
/* could be done a lot more nicely, but for now a quick way to get bge.* working */
- PyRun_SimpleString("__import__('sys').modules['bge']=[mod for mod in (type(__builtins__)('bge'), ) if mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'keys':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')}) is None][0]");
+ PyRun_SimpleString("__import__('sys').modules['bge']=[mod for mod in (type(__builtins__)('bge'), ) if mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')}) is None][0]");
}
static struct PyModuleDef Rasterizer_module_def = {
@@ -2257,6 +2266,15 @@ PyObject* initGameKeys()
KX_MACRO_addTypesToDict(d, PAGEDOWNKEY, SCA_IInputDevice::KX_PAGEDOWNKEY);
KX_MACRO_addTypesToDict(d, ENDKEY, SCA_IInputDevice::KX_ENDKEY);
+ // MOUSE
+ KX_MACRO_addTypesToDict(d, LEFTMOUSE, SCA_IInputDevice::KX_LEFTMOUSE);
+ KX_MACRO_addTypesToDict(d, MIDDLEMOUSE, SCA_IInputDevice::KX_MIDDLEMOUSE);
+ KX_MACRO_addTypesToDict(d, RIGHTMOUSE, SCA_IInputDevice::KX_RIGHTMOUSE);
+ KX_MACRO_addTypesToDict(d, WHEELUPMOUSE, SCA_IInputDevice::KX_WHEELUPMOUSE);
+ KX_MACRO_addTypesToDict(d, WHEELDOWNMOUSE, SCA_IInputDevice::KX_WHEELDOWNMOUSE);
+ KX_MACRO_addTypesToDict(d, MOUSEX, SCA_IInputDevice::KX_MOUSEX);
+ KX_MACRO_addTypesToDict(d, MOUSEY, SCA_IInputDevice::KX_MOUSEY);
+
// Check for errors
if (PyErr_Occurred())
{
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index 278e0236b2e..6b9d7a2cccf 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -79,6 +79,8 @@
#include "SCA_RandomSensor.h"
#include "SCA_XNORController.h"
#include "SCA_XORController.h"
+#include "SCA_PythonKeyboard.h"
+#include "SCA_PythonMouse.h"
#include "KX_IpoActuator.h"
#include "KX_NearSensor.h"
#include "KX_RadarSensor.h"
@@ -239,6 +241,8 @@ void initPyTypes(void)
PyType_Ready_Attr(dict, SCA_XNORController, init_getset);
PyType_Ready_Attr(dict, SCA_XORController, init_getset);
PyType_Ready_Attr(dict, SCA_IController, init_getset);
+ PyType_Ready_Attr(dict, SCA_PythonKeyboard, init_getset);
+ PyType_Ready_Attr(dict, SCA_PythonMouse, init_getset);
}
diff --git a/source/gameengine/PyDoc/GameKeys.py b/source/gameengine/PyDoc/GameKeys.py
index e798f6c901b..8e5c7d3ae24 100644
--- a/source/gameengine/PyDoc/GameKeys.py
+++ b/source/gameengine/PyDoc/GameKeys.py
@@ -150,6 +150,15 @@ Example::
@var SPACEKEY:
@var TABKEY:
+@group Mouse Events: LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE, WHEELUPMOUSE, WHEELDOWNMOUSE, MOUSEX, MOUSEY
+@var LEFTMOUSE:
+@var MIDDLEMOUSE:
+@var RIGHTMOUSE:
+@var WHEELUPMOUSE:
+@var WHEELDOWNMOUSE:
+@var MOUSEX:
+@var MOUSEY:
+
"""
def EventToString(event):
diff --git a/source/gameengine/PyDoc/GameLogic.py b/source/gameengine/PyDoc/GameLogic.py
index 56a9ea0d4f4..4bef65e42b3 100644
--- a/source/gameengine/PyDoc/GameLogic.py
+++ b/source/gameengine/PyDoc/GameLogic.py
@@ -308,6 +308,9 @@ Documentation for the GameLogic Module.
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.
+
+@var keyboard: The current keyboard wrapped in an SCA_PythonKeyboard object.
+@var mouse: The current mouse wrapped in an SCA_PythonMouse object.
"""
import GameTypes
diff --git a/source/gameengine/PyDoc/GameTypes.py b/source/gameengine/PyDoc/GameTypes.py
index 839f228c3d5..45d08d2e96a 100644
--- a/source/gameengine/PyDoc/GameTypes.py
+++ b/source/gameengine/PyDoc/GameTypes.py
@@ -108,6 +108,43 @@ class SCA_ILogicBrick(CValue):
"""
#}
+class SCA_PythonKeyboard(PyObjectPlus)
+ """
+ The current keyboard.
+ @ivar events: a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only).
+
+ - 'keycode' matches the values in L{GameKeys}.
+ - 'status' uses...
+ - L{GameLogic.KX_INPUT_NONE}
+ - L{GameLogic.KX_INPUT_JUST_ACTIVATED}
+ - L{GameLogic.KX_INPUT_ACTIVE}
+ - L{GameLogic.KX_INPUT_JUST_RELEASED}
+
+ @type events: list [[keycode, status], ...]
+ """
+ pass
+
+class SCA_PythonMouse(PyObjectPlus)
+ """
+ The current mouse.
+
+ @ivar events: a list of pressed buttons that have either been pressed, or just released, or are active this frame. (read-only).
+
+ - 'keycode' matches the values in L{GameKeys}.
+ - 'status' uses...
+ - L{GameLogic.KX_INPUT_NONE}
+ - L{GameLogic.KX_INPUT_JUST_ACTIVATED}
+ - L{GameLogic.KX_INPUT_ACTIVE}
+ - L{GameLogic.KX_INPUT_JUST_RELEASED}
+
+ @type events: list [[keycode, status], ...]
+ @ivar position: The normalized x and y position of the mouse cursor.
+ @type position: list [x, y]
+ @ivar visible: The visibility of the mouse cursor
+ @type visible: boolean
+ """
+ pass
+
class SCA_IObject(CValue):
"""
This class has no python functions
diff --git a/source/gameengine/Rasterizer/RAS_ICanvas.h b/source/gameengine/Rasterizer/RAS_ICanvas.h
index 2ab06be26e7..0821e369f75 100644
--- a/source/gameengine/Rasterizer/RAS_ICanvas.h
+++ b/source/gameengine/Rasterizer/RAS_ICanvas.h
@@ -172,12 +172,21 @@ public:
int y
)=0;
+ virtual
+ RAS_MouseState
+ GetMouseState()
+ {
+ return m_mousestate;
+ }
+
virtual
void
MakeScreenShot(
const char* filename
)=0;
+protected:
+ RAS_MouseState m_mousestate;
#ifdef WITH_CXX_GUARDEDALLOC
public: