|
Blender
V2.59
|
00001 /* 00002 * $Id: KX_BlenderMouseDevice.cpp 35166 2011-02-25 13:29:48Z jesterking $ 00003 * ***** BEGIN GPL LICENSE BLOCK ***** 00004 * 00005 * This program is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU General Public License 00007 * as published by the Free Software Foundation; either version 2 00008 * of the License, or (at your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the Free Software Foundation, 00017 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00018 * 00019 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. 00020 * All rights reserved. 00021 * 00022 * The Original Code is: all of this file. 00023 * 00024 * Contributor(s): none yet. 00025 * 00026 * ***** END GPL LICENSE BLOCK ***** 00027 */ 00028 00034 #if defined(WIN32) && !defined(FREE_WINDOWS) 00035 // annoying warnings about truncated STL debug info 00036 #pragma warning (disable :4786) 00037 #endif 00038 00039 #include "KX_BlenderMouseDevice.h" 00040 00041 KX_BlenderMouseDevice::KX_BlenderMouseDevice() 00042 { 00043 00044 } 00045 KX_BlenderMouseDevice::~KX_BlenderMouseDevice() 00046 { 00047 00048 } 00049 00054 bool KX_BlenderMouseDevice::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode) 00055 { 00056 const SCA_InputEvent & inevent = m_eventStatusTables[m_currentTable][inputcode]; 00057 bool pressed = (inevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED || 00058 inevent.m_status == SCA_InputEvent::KX_ACTIVE); 00059 return pressed; 00060 } 00061 /*const SCA_InputEvent& KX_BlenderMouseDevice::GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode) 00062 { 00063 return m_eventStatusTables[m_currentTable][inputcode]; 00064 } 00065 */ 00066 00072 void KX_BlenderMouseDevice::NextFrame() 00073 { 00074 SCA_IInputDevice::NextFrame(); 00075 00076 // now convert justpressed keyevents into regular (active) keyevents 00077 int previousTable = 1-m_currentTable; 00078 for (int mouseevent= KX_BEGINMOUSE; mouseevent< KX_ENDMOUSEBUTTONS;mouseevent++) 00079 { 00080 SCA_InputEvent& oldevent = m_eventStatusTables[previousTable][mouseevent]; 00081 if (oldevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED || 00082 oldevent.m_status == SCA_InputEvent::KX_ACTIVE ) 00083 { 00084 m_eventStatusTables[m_currentTable][mouseevent] = oldevent; 00085 m_eventStatusTables[m_currentTable][mouseevent].m_status = SCA_InputEvent::KX_ACTIVE; 00086 } 00087 } 00088 for (int mousemove= KX_ENDMOUSEBUTTONS; mousemove< KX_ENDMOUSE;mousemove++) 00089 { 00090 SCA_InputEvent& oldevent = m_eventStatusTables[previousTable][mousemove]; 00091 m_eventStatusTables[m_currentTable][mousemove] = oldevent; 00092 if (oldevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED || 00093 oldevent.m_status == SCA_InputEvent::KX_ACTIVE ) 00094 { 00095 00096 m_eventStatusTables[m_currentTable][mousemove].m_status = SCA_InputEvent::KX_JUSTRELEASED; 00097 } else 00098 { 00099 if (oldevent.m_status == SCA_InputEvent::KX_JUSTRELEASED) 00100 { 00101 00102 m_eventStatusTables[m_currentTable][mousemove].m_status = SCA_InputEvent::KX_NO_INPUTSTATUS ; 00103 } 00104 } 00105 } 00106 } 00107 00108 00115 bool KX_BlenderMouseDevice::ConvertBlenderEvent(unsigned short incode,short val) 00116 { 00117 bool result = false; 00118 00119 // convert event 00120 KX_EnumInputs kxevent = this->ToNative(incode); 00121 int previousTable = 1-m_currentTable; 00122 00123 // only process it, if it's a key 00124 if (kxevent > KX_BEGINMOUSE && kxevent < KX_ENDMOUSEBUTTONS) 00125 { 00126 if (val == KM_PRESS) 00127 { 00128 m_eventStatusTables[m_currentTable][kxevent].m_eventval = val ; //??? 00129 00130 switch (m_eventStatusTables[previousTable][kxevent].m_status) 00131 { 00132 00133 case SCA_InputEvent::KX_ACTIVE: 00134 case SCA_InputEvent::KX_JUSTACTIVATED: 00135 { 00136 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_ACTIVE; 00137 break; 00138 } 00139 case SCA_InputEvent::KX_JUSTRELEASED: 00140 { 00141 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTACTIVATED; 00142 break; 00143 } 00144 default: 00145 { 00146 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTACTIVATED; 00147 } 00148 } 00149 00150 } else if (val == KM_RELEASE) 00151 { 00152 // blender eventval == 0 00153 switch (m_eventStatusTables[previousTable][kxevent].m_status) 00154 { 00155 case SCA_InputEvent::KX_JUSTACTIVATED: 00156 case SCA_InputEvent::KX_ACTIVE: 00157 { 00158 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTRELEASED; 00159 break; 00160 } 00161 default: 00162 { 00163 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_NO_INPUTSTATUS; 00164 } 00165 } 00166 } 00167 } 00168 00169 if (kxevent > KX_ENDMOUSEBUTTONS && kxevent < KX_ENDMOUSE) 00170 { 00171 m_eventStatusTables[m_currentTable][kxevent].m_eventval = val ; //remember mouse position 00172 00173 switch (m_eventStatusTables[previousTable][kxevent].m_status) 00174 { 00175 00176 case SCA_InputEvent::KX_ACTIVE: 00177 case SCA_InputEvent::KX_JUSTACTIVATED: 00178 { 00179 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_ACTIVE; 00180 break; 00181 } 00182 case SCA_InputEvent::KX_JUSTRELEASED: 00183 { 00184 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_ACTIVE; 00185 break; 00186 } 00187 default: 00188 { 00189 m_eventStatusTables[m_currentTable][kxevent].m_status = SCA_InputEvent::KX_JUSTACTIVATED; 00190 } 00191 } 00192 } 00193 00194 00195 return result; 00196 }