2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): none yet.
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp
33 #if defined(WIN32) && !defined(FREE_WINDOWS)
34 // annoying warnings about truncated STL debug info
35 #pragma warning (disable :4786)
38 #include "KX_BlenderMouseDevice.h"
40 KX_BlenderMouseDevice::KX_BlenderMouseDevice()
44 KX_BlenderMouseDevice::~KX_BlenderMouseDevice()
50 IsPressed gives boolean information about mouse status, true if pressed, false if not
53 bool KX_BlenderMouseDevice::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode)
55 const SCA_InputEvent & inevent = m_eventStatusTables[m_currentTable][inputcode];
56 bool pressed = (inevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED ||
57 inevent.m_status == SCA_InputEvent::KX_ACTIVE);
60 /*const SCA_InputEvent& KX_BlenderMouseDevice::GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode)
62 return m_eventStatusTables[m_currentTable][inputcode];
67 NextFrame toggles currentTable with previousTable,
68 and copy relevant event information from previous to current
69 (pressed keys need to be remembered)
71 void KX_BlenderMouseDevice::NextFrame()
73 SCA_IInputDevice::NextFrame();
75 // now convert justpressed keyevents into regular (active) keyevents
76 int previousTable = 1-m_currentTable;
77 for (int mouseevent= KX_BEGINMOUSE; mouseevent< KX_ENDMOUSEBUTTONS;mouseevent++)
79 SCA_InputEvent& oldevent = m_eventStatusTables[previousTable][mouseevent];
80 if (oldevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED ||
81 oldevent.m_status == SCA_InputEvent::KX_ACTIVE )
83 m_eventStatusTables[m_currentTable][mouseevent] = oldevent;
84 m_eventStatusTables[m_currentTable][mouseevent].m_status = SCA_InputEvent::KX_ACTIVE;
87 for (int mousemove= KX_ENDMOUSEBUTTONS; mousemove< KX_ENDMOUSE;mousemove++)
89 SCA_InputEvent& oldevent = m_eventStatusTables[previousTable][mousemove];
90 m_eventStatusTables[m_currentTable][mousemove] = oldevent;
91 if (oldevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED ||
92 oldevent.m_status == SCA_InputEvent::KX_ACTIVE )
95 m_eventStatusTables[m_currentTable][mousemove].m_status = SCA_InputEvent::KX_JUSTRELEASED;
98 if (oldevent.m_status == SCA_InputEvent::KX_JUSTRELEASED)
101 m_eventStatusTables[m_currentTable][mousemove].m_status = SCA_InputEvent::KX_NO_INPUTSTATUS;
109 ConvertBlenderEvent translates blender mouse events into ketsji kbd events
110 extra event information is stored, like ramp-mode (just released/pressed)
114 bool KX_BlenderMouseDevice::ConvertBlenderEvent(unsigned short incode,short val)
119 KX_EnumInputs kxevent = this->ToNative(incode);
120 int previousTable = 1-m_currentTable;
122 // only process it, if it's a key
123 if (kxevent > KX_BEGINMOUSE && kxevent < KX_ENDMOUSEBUTTONS)
127 m_eventStatusTables[m_currentTable][kxevent].m_eventval = val ; //???
129 switch (m_eventStatusTables[previousTable][kxevent].m_status)
132 case SCA_InputEvent::KX_ACTIVE:
133 case SCA_InputEvent::KX_JUSTACTIVATED:
135 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_ACTIVE;
138 case SCA_InputEvent::KX_JUSTRELEASED:
140 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTACTIVATED;
145 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTACTIVATED;
149 } else if (val == KM_RELEASE)
151 // blender eventval == 0
152 switch (m_eventStatusTables[previousTable][kxevent].m_status)
154 case SCA_InputEvent::KX_JUSTACTIVATED:
155 case SCA_InputEvent::KX_ACTIVE:
157 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTRELEASED;
162 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_NO_INPUTSTATUS;
168 if (kxevent > KX_ENDMOUSEBUTTONS && kxevent < KX_ENDMOUSE)
170 m_eventStatusTables[m_currentTable][kxevent].m_eventval = val ; //remember mouse position
172 switch (m_eventStatusTables[previousTable][kxevent].m_status)
175 case SCA_InputEvent::KX_ACTIVE:
176 case SCA_InputEvent::KX_JUSTACTIVATED:
178 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_ACTIVE;
181 case SCA_InputEvent::KX_JUSTRELEASED:
183 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_ACTIVE;
188 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTACTIVATED;