Blender  V2.59
KX_ConvertSensors.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: KX_ConvertSensors.cpp 36083 2011-04-10 09:37:04Z campbellbarton $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
00021  * All rights reserved.
00022  *
00023  * The Original Code is: all of this file.
00024  *
00025  * Contributor(s): none yet.
00026  *
00027  * ***** END GPL LICENSE BLOCK *****
00028  * Conversion of Blender data blocks to KX sensor system
00029  */
00030 
00036 #include <stdio.h>
00037 
00038 #if defined(WIN32) && !defined(FREE_WINDOWS)
00039 #pragma warning (disable : 4786)
00040 #endif //WIN32
00041 
00042 #include "wm_event_types.h"
00043 #include "KX_BlenderSceneConverter.h"
00044 #include "KX_ConvertSensors.h"
00045 
00046 /* This little block needed for linking to Blender... */
00047 #if defined(WIN32) && !defined(FREE_WINDOWS)
00048 #include "BLI_winstuff.h"
00049 #endif
00050 
00051 #include "DNA_object_types.h"
00052 #include "DNA_material_types.h"
00053 #include "DNA_sensor_types.h"
00054 #include "DNA_actuator_types.h" /* for SENS_ALL_KEYS ? this define is
00055 probably misplaced */
00056 /* end of blender include block */
00057 
00058 #include "RAS_IPolygonMaterial.h"
00059 // Sensors
00060 #include "KX_GameObject.h"
00061 #include "RAS_MeshObject.h"
00062 #include "SCA_KeyboardSensor.h"
00063 #include "SCA_MouseSensor.h"
00064 #include "SCA_AlwaysSensor.h"
00065 #include "KX_TouchSensor.h"
00066 #include "KX_NearSensor.h"
00067 #include "KX_RadarSensor.h"
00068 #include "KX_MouseFocusSensor.h"
00069 #include "KX_ArmatureSensor.h"
00070 #include "SCA_JoystickSensor.h"
00071 #include "KX_NetworkMessageSensor.h"
00072 #include "SCA_ActuatorSensor.h"
00073 #include "SCA_DelaySensor.h"
00074 
00075 
00076 #include "SCA_PropertySensor.h"
00077 #include "SCA_RandomSensor.h"
00078 #include "KX_RaySensor.h"
00079 #include "SCA_EventManager.h"
00080 #include "SCA_LogicManager.h"
00081 #include "KX_BlenderInputDevice.h"
00082 #include "KX_Scene.h"
00083 #include "IntValue.h"
00084 #include "KX_BlenderKeyboardDevice.h"
00085 #include "KX_BlenderGL.h"
00086 #include "RAS_ICanvas.h"
00087 #include "PHY_IPhysicsEnvironment.h"
00088 
00089 #include "KX_KetsjiEngine.h"
00090 #include "KX_BlenderSceneConverter.h"
00091 
00092 // this map is Blender specific: a conversion between blender and ketsji enums
00093 std::map<int,SCA_IInputDevice::KX_EnumInputs> gReverseKeyTranslateTable;
00094 
00095 
00096 void BL_ConvertSensors(struct Object* blenderobject,
00097                                            class KX_GameObject* gameobj,
00098                                            SCA_LogicManager* logicmgr,
00099                                            KX_Scene* kxscene,
00100                                            KX_KetsjiEngine* kxengine,
00101                                            int activeLayerBitInfo,
00102                                            bool isInActiveLayer,
00103                                            RAS_ICanvas* canvas,
00104                                            KX_BlenderSceneConverter* converter
00105                                            )
00106 {
00107         static bool reverseTableConverted = false;      
00108         
00109         if (!reverseTableConverted)
00110         {
00111                 reverseTableConverted = true;
00112                 
00113                 /* The reverse table. In order to not confuse ourselves, we      */
00114                 /* immediately convert all events that come in to KX codes.      */
00115                 gReverseKeyTranslateTable[LEFTMOUSE                     ] =     SCA_IInputDevice::KX_LEFTMOUSE;
00116                 gReverseKeyTranslateTable[MIDDLEMOUSE           ] =     SCA_IInputDevice::KX_MIDDLEMOUSE;
00117                 gReverseKeyTranslateTable[RIGHTMOUSE            ] =     SCA_IInputDevice::KX_RIGHTMOUSE;
00118                 gReverseKeyTranslateTable[WHEELUPMOUSE          ] =     SCA_IInputDevice::KX_WHEELUPMOUSE;
00119                 gReverseKeyTranslateTable[WHEELDOWNMOUSE        ] =     SCA_IInputDevice::KX_WHEELDOWNMOUSE;
00120                 gReverseKeyTranslateTable[MOUSEX                        ] = SCA_IInputDevice::KX_MOUSEX;
00121                 gReverseKeyTranslateTable[MOUSEY                        ] =     SCA_IInputDevice::KX_MOUSEY;
00122                 
00123                 // TIMERS                                                                                                  
00124                 
00125                 gReverseKeyTranslateTable[TIMER0                        ] = SCA_IInputDevice::KX_TIMER0;                  
00126                 gReverseKeyTranslateTable[TIMER1                        ] = SCA_IInputDevice::KX_TIMER1;                  
00127                 gReverseKeyTranslateTable[TIMER2                        ] = SCA_IInputDevice::KX_TIMER2;                  
00128                 
00129                 // SYSTEM                                                                                                  
00130                 
00131 #if 0                   
00132                 /* **** XXX **** */
00133                 gReverseKeyTranslateTable[KEYBD                         ] = SCA_IInputDevice::KX_KEYBD;                  
00134                 gReverseKeyTranslateTable[RAWKEYBD                      ] = SCA_IInputDevice::KX_RAWKEYBD;                  
00135                 gReverseKeyTranslateTable[REDRAW                        ] = SCA_IInputDevice::KX_REDRAW;                  
00136                 gReverseKeyTranslateTable[INPUTCHANGE           ] = SCA_IInputDevice::KX_INPUTCHANGE;                  
00137                 gReverseKeyTranslateTable[QFULL                         ] = SCA_IInputDevice::KX_QFULL;                  
00138                 gReverseKeyTranslateTable[WINFREEZE                     ] = SCA_IInputDevice::KX_WINFREEZE;                  
00139                 gReverseKeyTranslateTable[WINTHAW                       ] = SCA_IInputDevice::KX_WINTHAW;                  
00140                 gReverseKeyTranslateTable[WINCLOSE                      ] = SCA_IInputDevice::KX_WINCLOSE;                  
00141                 gReverseKeyTranslateTable[WINQUIT                       ] = SCA_IInputDevice::KX_WINQUIT;                  
00142                 gReverseKeyTranslateTable[Q_FIRSTTIME           ] = SCA_IInputDevice::KX_Q_FIRSTTIME;                  
00143                 /* **** XXX **** */
00144 #endif  
00145                 
00146                 // standard keyboard                                                                                       
00147                 
00148                 gReverseKeyTranslateTable[AKEY                          ] = SCA_IInputDevice::KX_AKEY;                  
00149                 gReverseKeyTranslateTable[BKEY                          ] = SCA_IInputDevice::KX_BKEY;                  
00150                 gReverseKeyTranslateTable[CKEY                          ] = SCA_IInputDevice::KX_CKEY;                  
00151                 gReverseKeyTranslateTable[DKEY                          ] = SCA_IInputDevice::KX_DKEY;                  
00152                 gReverseKeyTranslateTable[EKEY                          ] = SCA_IInputDevice::KX_EKEY;                  
00153                 gReverseKeyTranslateTable[FKEY                          ] = SCA_IInputDevice::KX_FKEY;                  
00154                 gReverseKeyTranslateTable[GKEY                          ] = SCA_IInputDevice::KX_GKEY;                  
00155 
00156 //XXX clean up
00157 #ifdef WIN32
00158 #define HKEY    'h'
00159 #endif
00160                 gReverseKeyTranslateTable[HKEY                          ] = SCA_IInputDevice::KX_HKEY;                  
00161 //XXX clean up
00162 #ifdef WIN32
00163 #undef HKEY
00164 #endif
00165 
00166                 gReverseKeyTranslateTable[IKEY                          ] = SCA_IInputDevice::KX_IKEY;                  
00167                 gReverseKeyTranslateTable[JKEY                          ] = SCA_IInputDevice::KX_JKEY;                  
00168                 gReverseKeyTranslateTable[KKEY                          ] = SCA_IInputDevice::KX_KKEY;                  
00169                 gReverseKeyTranslateTable[LKEY                          ] = SCA_IInputDevice::KX_LKEY;                  
00170                 gReverseKeyTranslateTable[MKEY                          ] = SCA_IInputDevice::KX_MKEY;                  
00171                 gReverseKeyTranslateTable[NKEY                          ] = SCA_IInputDevice::KX_NKEY;                  
00172                 gReverseKeyTranslateTable[OKEY                          ] = SCA_IInputDevice::KX_OKEY;                  
00173                 gReverseKeyTranslateTable[PKEY                          ] = SCA_IInputDevice::KX_PKEY;                  
00174                 gReverseKeyTranslateTable[QKEY                          ] = SCA_IInputDevice::KX_QKEY;                  
00175                 gReverseKeyTranslateTable[RKEY                          ] = SCA_IInputDevice::KX_RKEY;                  
00176                 gReverseKeyTranslateTable[SKEY                          ] = SCA_IInputDevice::KX_SKEY;                  
00177                 gReverseKeyTranslateTable[TKEY                          ] = SCA_IInputDevice::KX_TKEY;                  
00178                 gReverseKeyTranslateTable[UKEY                          ] = SCA_IInputDevice::KX_UKEY;                  
00179                 gReverseKeyTranslateTable[VKEY                          ] = SCA_IInputDevice::KX_VKEY;                  
00180                 gReverseKeyTranslateTable[WKEY                          ] = SCA_IInputDevice::KX_WKEY;                  
00181                 gReverseKeyTranslateTable[XKEY                          ] = SCA_IInputDevice::KX_XKEY;                  
00182                 gReverseKeyTranslateTable[YKEY                          ] = SCA_IInputDevice::KX_YKEY;                  
00183                 gReverseKeyTranslateTable[ZKEY                          ] = SCA_IInputDevice::KX_ZKEY;                  
00184                 
00185                 gReverseKeyTranslateTable[ZEROKEY                       ] = SCA_IInputDevice::KX_ZEROKEY;                  
00186                 gReverseKeyTranslateTable[ONEKEY                        ] = SCA_IInputDevice::KX_ONEKEY;                  
00187                 gReverseKeyTranslateTable[TWOKEY                        ] = SCA_IInputDevice::KX_TWOKEY;                  
00188                 gReverseKeyTranslateTable[THREEKEY                      ] = SCA_IInputDevice::KX_THREEKEY;                  
00189                 gReverseKeyTranslateTable[FOURKEY                       ] = SCA_IInputDevice::KX_FOURKEY;                  
00190                 gReverseKeyTranslateTable[FIVEKEY                       ] = SCA_IInputDevice::KX_FIVEKEY;                  
00191                 gReverseKeyTranslateTable[SIXKEY                        ] = SCA_IInputDevice::KX_SIXKEY;                  
00192                 gReverseKeyTranslateTable[SEVENKEY                      ] = SCA_IInputDevice::KX_SEVENKEY;                  
00193                 gReverseKeyTranslateTable[EIGHTKEY                      ] = SCA_IInputDevice::KX_EIGHTKEY;                  
00194                 gReverseKeyTranslateTable[NINEKEY                       ] = SCA_IInputDevice::KX_NINEKEY;                  
00195                 
00196                 gReverseKeyTranslateTable[CAPSLOCKKEY           ] = SCA_IInputDevice::KX_CAPSLOCKKEY;                  
00197                 
00198                 gReverseKeyTranslateTable[LEFTCTRLKEY           ] = SCA_IInputDevice::KX_LEFTCTRLKEY;                  
00199                 gReverseKeyTranslateTable[LEFTALTKEY            ] = SCA_IInputDevice::KX_LEFTALTKEY;                  
00200                 gReverseKeyTranslateTable[RIGHTALTKEY           ] = SCA_IInputDevice::KX_RIGHTALTKEY;                  
00201                 gReverseKeyTranslateTable[RIGHTCTRLKEY          ] = SCA_IInputDevice::KX_RIGHTCTRLKEY;                  
00202                 gReverseKeyTranslateTable[RIGHTSHIFTKEY         ] = SCA_IInputDevice::KX_RIGHTSHIFTKEY;                  
00203                 gReverseKeyTranslateTable[LEFTSHIFTKEY          ] = SCA_IInputDevice::KX_LEFTSHIFTKEY;                  
00204                 
00205                 gReverseKeyTranslateTable[ESCKEY                        ] = SCA_IInputDevice::KX_ESCKEY;                  
00206                 gReverseKeyTranslateTable[TABKEY                        ] = SCA_IInputDevice::KX_TABKEY;                  
00207                 gReverseKeyTranslateTable[RETKEY                        ] = SCA_IInputDevice::KX_RETKEY;                  
00208                 gReverseKeyTranslateTable[SPACEKEY                      ] = SCA_IInputDevice::KX_SPACEKEY;                  
00209                 gReverseKeyTranslateTable[LINEFEEDKEY           ] = SCA_IInputDevice::KX_LINEFEEDKEY;                  
00210                 gReverseKeyTranslateTable[BACKSPACEKEY          ] = SCA_IInputDevice::KX_BACKSPACEKEY;                  
00211                 gReverseKeyTranslateTable[DELKEY                        ] = SCA_IInputDevice::KX_DELKEY;                  
00212                 gReverseKeyTranslateTable[SEMICOLONKEY          ] = SCA_IInputDevice::KX_SEMICOLONKEY;                  
00213                 gReverseKeyTranslateTable[PERIODKEY                     ] = SCA_IInputDevice::KX_PERIODKEY;                  
00214                 gReverseKeyTranslateTable[COMMAKEY                      ] = SCA_IInputDevice::KX_COMMAKEY;                  
00215                 gReverseKeyTranslateTable[QUOTEKEY                      ] = SCA_IInputDevice::KX_QUOTEKEY;                  
00216                 gReverseKeyTranslateTable[ACCENTGRAVEKEY        ] = SCA_IInputDevice::KX_ACCENTGRAVEKEY;                  
00217                 gReverseKeyTranslateTable[MINUSKEY                      ] = SCA_IInputDevice::KX_MINUSKEY;                  
00218                 gReverseKeyTranslateTable[SLASHKEY                      ] = SCA_IInputDevice::KX_SLASHKEY;                  
00219                 gReverseKeyTranslateTable[BACKSLASHKEY          ] = SCA_IInputDevice::KX_BACKSLASHKEY;                  
00220                 gReverseKeyTranslateTable[EQUALKEY                      ] = SCA_IInputDevice::KX_EQUALKEY;                  
00221                 gReverseKeyTranslateTable[LEFTBRACKETKEY        ] = SCA_IInputDevice::KX_LEFTBRACKETKEY;                  
00222                 gReverseKeyTranslateTable[RIGHTBRACKETKEY       ] = SCA_IInputDevice::KX_RIGHTBRACKETKEY;                  
00223                 
00224                 gReverseKeyTranslateTable[LEFTARROWKEY          ] = SCA_IInputDevice::KX_LEFTARROWKEY;                  
00225                 gReverseKeyTranslateTable[DOWNARROWKEY          ] = SCA_IInputDevice::KX_DOWNARROWKEY;                  
00226                 gReverseKeyTranslateTable[RIGHTARROWKEY         ] = SCA_IInputDevice::KX_RIGHTARROWKEY;                  
00227                 gReverseKeyTranslateTable[UPARROWKEY            ] = SCA_IInputDevice::KX_UPARROWKEY;                  
00228                 
00229                 gReverseKeyTranslateTable[PAD2                          ] = SCA_IInputDevice::KX_PAD2;                  
00230                 gReverseKeyTranslateTable[PAD4                          ] = SCA_IInputDevice::KX_PAD4;                  
00231                 gReverseKeyTranslateTable[PAD6                          ] = SCA_IInputDevice::KX_PAD6;                  
00232                 gReverseKeyTranslateTable[PAD8                          ] = SCA_IInputDevice::KX_PAD8;                  
00233                 
00234                 gReverseKeyTranslateTable[PAD1                          ] = SCA_IInputDevice::KX_PAD1;                  
00235                 gReverseKeyTranslateTable[PAD3                          ] = SCA_IInputDevice::KX_PAD3;                  
00236                 gReverseKeyTranslateTable[PAD5                          ] = SCA_IInputDevice::KX_PAD5;                  
00237                 gReverseKeyTranslateTable[PAD7                          ] = SCA_IInputDevice::KX_PAD7;                  
00238                 gReverseKeyTranslateTable[PAD9                          ] = SCA_IInputDevice::KX_PAD9;                  
00239                 
00240                 gReverseKeyTranslateTable[PADPERIOD                     ] = SCA_IInputDevice::KX_PADPERIOD;                  
00241                 gReverseKeyTranslateTable[PADSLASHKEY           ] = SCA_IInputDevice::KX_PADSLASHKEY;                  
00242                 gReverseKeyTranslateTable[PADASTERKEY           ] = SCA_IInputDevice::KX_PADASTERKEY;                  
00243                 
00244                 gReverseKeyTranslateTable[PAD0                          ] = SCA_IInputDevice::KX_PAD0;                  
00245                 gReverseKeyTranslateTable[PADMINUS                      ] = SCA_IInputDevice::KX_PADMINUS;                  
00246                 gReverseKeyTranslateTable[PADENTER                      ] = SCA_IInputDevice::KX_PADENTER;                  
00247                 gReverseKeyTranslateTable[PADPLUSKEY            ] = SCA_IInputDevice::KX_PADPLUSKEY;                  
00248                 
00249                 
00250                 gReverseKeyTranslateTable[F1KEY                         ] = SCA_IInputDevice::KX_F1KEY;                  
00251                 gReverseKeyTranslateTable[F2KEY                         ] = SCA_IInputDevice::KX_F2KEY;                  
00252                 gReverseKeyTranslateTable[F3KEY                         ] = SCA_IInputDevice::KX_F3KEY;                  
00253                 gReverseKeyTranslateTable[F4KEY                         ] = SCA_IInputDevice::KX_F4KEY;                  
00254                 gReverseKeyTranslateTable[F5KEY                         ] = SCA_IInputDevice::KX_F5KEY;                  
00255                 gReverseKeyTranslateTable[F6KEY                         ] = SCA_IInputDevice::KX_F6KEY;                  
00256                 gReverseKeyTranslateTable[F7KEY                         ] = SCA_IInputDevice::KX_F7KEY;                  
00257                 gReverseKeyTranslateTable[F8KEY                         ] = SCA_IInputDevice::KX_F8KEY;                  
00258                 gReverseKeyTranslateTable[F9KEY                         ] = SCA_IInputDevice::KX_F9KEY;                  
00259                 gReverseKeyTranslateTable[F10KEY                        ] = SCA_IInputDevice::KX_F10KEY;                  
00260                 gReverseKeyTranslateTable[F11KEY                        ] = SCA_IInputDevice::KX_F11KEY;                  
00261                 gReverseKeyTranslateTable[F12KEY                        ] = SCA_IInputDevice::KX_F12KEY;
00262                 gReverseKeyTranslateTable[F13KEY                        ] = SCA_IInputDevice::KX_F13KEY;
00263                 gReverseKeyTranslateTable[F14KEY                        ] = SCA_IInputDevice::KX_F14KEY;
00264                 gReverseKeyTranslateTable[F15KEY                        ] = SCA_IInputDevice::KX_F15KEY;
00265                 gReverseKeyTranslateTable[F16KEY                        ] = SCA_IInputDevice::KX_F16KEY;
00266                 gReverseKeyTranslateTable[F17KEY                        ] = SCA_IInputDevice::KX_F17KEY;
00267                 gReverseKeyTranslateTable[F18KEY                        ] = SCA_IInputDevice::KX_F18KEY;
00268                 gReverseKeyTranslateTable[F19KEY                        ] = SCA_IInputDevice::KX_F19KEY;
00269                 
00270                 
00271                 gReverseKeyTranslateTable[PAUSEKEY                      ] = SCA_IInputDevice::KX_PAUSEKEY;                  
00272                 gReverseKeyTranslateTable[INSERTKEY                     ] = SCA_IInputDevice::KX_INSERTKEY;                  
00273                 gReverseKeyTranslateTable[HOMEKEY                       ] = SCA_IInputDevice::KX_HOMEKEY;                  
00274                 gReverseKeyTranslateTable[PAGEUPKEY                     ] = SCA_IInputDevice::KX_PAGEUPKEY;                  
00275                 gReverseKeyTranslateTable[PAGEDOWNKEY           ] = SCA_IInputDevice::KX_PAGEDOWNKEY;                  
00276                 gReverseKeyTranslateTable[ENDKEY                        ] = SCA_IInputDevice::KX_ENDKEY;
00277         }
00278 
00279     int executePriority = 0;
00280         int uniqueint = 0;
00281         int count = 0;
00282         bSensor* sens = (bSensor*)blenderobject->sensors.first;
00283         bool pos_pulsemode = false;
00284         bool neg_pulsemode = false;
00285         int frequency = 0;
00286         bool invert = false;
00287         bool level = false;
00288         bool tap = false;
00289         
00290         while (sens)
00291         {
00292                 sens = sens->next;
00293                 count++;
00294         }
00295         gameobj->ReserveSensor(count);
00296         sens = (bSensor*)blenderobject->sensors.first;
00297         while(sens)
00298         {
00299                 SCA_ISensor* gamesensor=NULL;
00300                 /* All sensors have a pulse toggle, frequency, and invert field.     */
00301                 /* These are extracted here, and set when the sensor is added to the */
00302                 /* list.                                                             */
00303                 pos_pulsemode = (sens->pulse & SENS_PULSE_REPEAT)!=0;
00304                 neg_pulsemode = (sens->pulse & SENS_NEG_PULSE_MODE)!=0;
00305                 
00306                 frequency = sens->freq;
00307                 invert    = !(sens->invert == 0);
00308                 level     = !(sens->level == 0);
00309                 tap       = !(sens->tap == 0);
00310 
00311                 switch (sens->type)
00312                 {
00313                 case  SENS_ALWAYS:
00314                         {
00315                                 
00316                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
00317                                 if (eventmgr)
00318                                 {
00319                                         gamesensor = new SCA_AlwaysSensor(eventmgr, gameobj);
00320                                 }
00321                                 
00322                                 break;
00323                         }
00324                         
00325                 case  SENS_DELAY:
00326                         {
00327                                 // we can reuse the Always event manager for the delay sensor
00328                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
00329                                 if (eventmgr)
00330                                 {
00331                                         bDelaySensor* delaysensor = (bDelaySensor*)sens->data;
00332                                         gamesensor = new SCA_DelaySensor(eventmgr, 
00333                                                 gameobj,
00334                                                 delaysensor->delay,
00335                                                 delaysensor->duration,
00336                                                 (delaysensor->flag & SENS_DELAY_REPEAT) != 0);
00337                                 }
00338                                 break;
00339                         }
00340 
00341                 case SENS_COLLISION:
00342                         {
00343                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
00344                                 if (eventmgr)
00345                                 {
00346                                         // collision sensor can sense both materials and properties. 
00347                                         
00348                                         bool bFindMaterial = false, bTouchPulse = false;
00349                                         
00350                                         bCollisionSensor* blendertouchsensor = (bCollisionSensor*)sens->data;
00351                                         
00352                                         bFindMaterial = (blendertouchsensor->mode & SENS_COLLISION_MATERIAL);
00353                                         bTouchPulse = (blendertouchsensor->mode & SENS_COLLISION_PULSE);
00354                                         
00355                                         
00356                                         STR_String touchPropOrMatName = ( bFindMaterial ? 
00357                                                 blendertouchsensor->materialName:
00358                                         (blendertouchsensor->name ? blendertouchsensor->name: ""));
00359                                         
00360                                         
00361                                         if (gameobj->GetPhysicsController())
00362                                         {       
00363                                                 gamesensor = new KX_TouchSensor(eventmgr,
00364                                                         gameobj,
00365                                                         bFindMaterial,
00366                                                         bTouchPulse,
00367                                                         touchPropOrMatName);
00368                                         }
00369                                         
00370                                 }
00371                                 
00372                                 break;
00373                         }
00374                 case SENS_TOUCH:
00375                         {
00376                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
00377                                 if (eventmgr)
00378                                 {
00379                                         STR_String touchpropertyname;
00380                                         bTouchSensor* blendertouchsensor = (bTouchSensor*)sens->data;
00381                                         
00382                                         if (blendertouchsensor->ma)
00383                                         {
00384                                                 touchpropertyname = (char*) (blendertouchsensor->ma->id.name+2);
00385                                         }
00386                                         bool bFindMaterial = true;
00387                                         if (gameobj->GetPhysicsController())
00388                                         {       
00389                                                 gamesensor = new KX_TouchSensor(eventmgr,
00390                                                         gameobj,
00391                                                         bFindMaterial,
00392                                                         false,
00393                                                         touchpropertyname);
00394                                         }
00395                                 }
00396                                 break;
00397                         }
00398                 case SENS_MESSAGE:
00399                         {
00400                                 KX_NetworkEventManager* eventmgr = (KX_NetworkEventManager*)
00401                                         logicmgr->FindEventManager(SCA_EventManager::NETWORK_EVENTMGR);
00402                                 if (eventmgr) {
00403                                         bMessageSensor* msgSens = (bMessageSensor*) sens->data; 
00404                                         
00405                                         /* Get our NetworkScene */
00406                                         NG_NetworkScene *NetworkScene = kxscene->GetNetworkScene();
00407                                         /* filter on the incoming subjects, might be empty */
00408                                         STR_String subject = (msgSens->subject
00409                                                 ? (char*)msgSens->subject
00410                                                 : "");
00411                                         
00412                                         gamesensor = new KX_NetworkMessageSensor(
00413                                                 eventmgr,               // our eventmanager
00414                                                 NetworkScene,   // our NetworkScene
00415                                                 gameobj,                // the sensor controlling object
00416                                                 subject);               // subject to filter on
00417                                 }
00418                                 break;
00419                         }
00420                 case SENS_NEAR:
00421                         {
00422                                 
00423                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
00424                                 if (eventmgr)
00425                                 {
00426                                         STR_String nearpropertyname;    
00427                                         bNearSensor* blendernearsensor = (bNearSensor*)sens->data;
00428                                         if (blendernearsensor->name)
00429                                         {
00430                                                 // only objects that own this property will be taken into account
00431                                                 nearpropertyname = (char*) blendernearsensor->name;
00432                                         }
00433                                         
00434                                         //DT_ShapeHandle shape  =       DT_Sphere(0.0);
00435                                         
00436                                         // this sumoObject is not deleted by a gameobj, so delete it ourself
00437                                         // later (memleaks)!
00438                                         float radius = blendernearsensor->dist;
00439                                         PHY__Vector3 pos;
00440                                         const MT_Vector3& wpos = gameobj->NodeGetWorldPosition();
00441                                         pos[0] = (float)wpos[0];
00442                                         pos[1] = (float)wpos[1];
00443                                         pos[2] = (float)wpos[2];
00444                                         pos[3] = 0.f;
00445                                         bool bFindMaterial = false;
00446                                         PHY_IPhysicsController* physCtrl = kxscene->GetPhysicsEnvironment()->CreateSphereController(radius,pos);
00447 
00448                                         //will be done in KX_TouchEventManager::RegisterSensor()  
00449                                         //if (isInActiveLayer)
00450                                         //      kxscene->GetPhysicsEnvironment()->addSensor(physCtrl);
00451 
00452                                                 
00453 
00454                                         gamesensor = new KX_NearSensor(eventmgr,gameobj,
00455                                                 blendernearsensor->dist,
00456                                                 blendernearsensor->resetdist,
00457                                                 bFindMaterial,
00458                                                 nearpropertyname,
00459                                                 physCtrl);
00460                                         
00461                                 }
00462                                 break;
00463                         }
00464                         
00465                         
00466                 case SENS_KEYBOARD:
00467                         {
00468                                 /* temporary input device, for converting the code for the keyboard sensor */
00469                                 
00470                                 bKeyboardSensor* blenderkeybdsensor = (bKeyboardSensor*)sens->data;
00471                                 SCA_KeyboardManager* eventmgr = (SCA_KeyboardManager*) logicmgr->FindEventManager(SCA_EventManager::KEYBOARD_EVENTMGR);
00472                                 if (eventmgr)
00473                                 {
00474                                         gamesensor = new SCA_KeyboardSensor(eventmgr,
00475                                                 gReverseKeyTranslateTable[blenderkeybdsensor->key],
00476                                                 gReverseKeyTranslateTable[blenderkeybdsensor->qual],
00477                                                 gReverseKeyTranslateTable[blenderkeybdsensor->qual2],
00478                                                 (blenderkeybdsensor->type == SENS_ALL_KEYS),
00479                                                 blenderkeybdsensor->targetName,
00480                                                 blenderkeybdsensor->toggleName,
00481                                                 gameobj); //                    blenderkeybdsensor->pad);
00482                                         
00483                                 } 
00484                                 
00485                                 break;
00486                         }
00487                 case SENS_MOUSE:
00488                         {
00489                                 int keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_NODEF;                        
00490                                 int trackfocus = 0;
00491                                 bMouseSensor *bmouse = (bMouseSensor *)sens->data;
00492                                 
00493                                 /* There are two main types of mouse sensors. If there is
00494                                 * no focus-related behaviour requested, we can make do
00495                                 * with a basic sensor. This cuts down memory usage and
00496                                 * gives a slight performance gain. */
00497                                 
00498                                 SCA_MouseManager *eventmgr 
00499                                         = (SCA_MouseManager*) logicmgr->FindEventManager(SCA_EventManager::MOUSE_EVENTMGR);
00500                                 if (eventmgr) {
00501                                         
00502                                         /* Determine key mode. There is at most one active mode. */
00503                                         switch (bmouse->type) {
00504                                         case BL_SENS_MOUSE_LEFT_BUTTON:
00505                                                 keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_LEFTBUTTON;
00506                                                 break;
00507                                         case BL_SENS_MOUSE_MIDDLE_BUTTON:
00508                                                 keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_MIDDLEBUTTON;
00509                                                 break;
00510                                         case BL_SENS_MOUSE_RIGHT_BUTTON:
00511                                                 keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_RIGHTBUTTON;
00512                                                 break;
00513                                         case BL_SENS_MOUSE_WHEEL_UP:
00514                                                 keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_WHEELUP;
00515                                                 break;
00516                                         case BL_SENS_MOUSE_WHEEL_DOWN:
00517                                                 keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_WHEELDOWN;
00518                                                 break;
00519                                         case BL_SENS_MOUSE_MOVEMENT:
00520                                                 keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_MOVEMENT;
00521                                                 break;
00522                                         case BL_SENS_MOUSE_MOUSEOVER:
00523                                                 trackfocus = 1;
00524                                                 break;
00525                                         case BL_SENS_MOUSE_MOUSEOVER_ANY:
00526                                                 trackfocus = 2;
00527                                                 break;
00528 
00529                                         default:
00530                                                 ; /* error */
00531                                         }
00532                                         
00533                                         /* initial mouse position */                             
00534                                         int startx  = canvas->GetWidth()/2;
00535                                         int starty = canvas->GetHeight()/2;
00536                                         
00537                                         if (!trackfocus) {
00538                                                 /* plain, simple mouse sensor */
00539                                                 gamesensor = new SCA_MouseSensor(eventmgr,
00540                                                         startx,starty,
00541                                                         keytype,
00542                                                         gameobj);
00543                                         } else {
00544                                                 /* give us a focus-aware sensor */
00545                                                 gamesensor = new KX_MouseFocusSensor(eventmgr,
00546                                                         startx,
00547                                                         starty,
00548                                                         keytype,
00549                                                         trackfocus,
00550                                                         (bmouse->flag & SENS_MOUSE_FOCUS_PULSE) ? true:false,
00551                                                         kxscene,
00552                                                         kxengine,
00553                                                         gameobj); 
00554                                         }
00555                                 } else {
00556                                         //                              cout << "\n Could't find mouse event manager..."; - should throw an error here... 
00557                                 }
00558                                 break;
00559                         }
00560                 case SENS_PROPERTY:
00561                         {
00562                                 bPropertySensor* blenderpropsensor = (bPropertySensor*) sens->data;
00563                                 SCA_EventManager* eventmgr 
00564                                         = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
00565                                 if (eventmgr)
00566                                 {
00567                                         STR_String propname=blenderpropsensor->name;
00568                                         STR_String propval=blenderpropsensor->value;
00569                                         STR_String propmaxval=blenderpropsensor->maxvalue;
00570                                         
00571                                         SCA_PropertySensor::KX_PROPSENSOR_TYPE 
00572                                                 propchecktype = SCA_PropertySensor::KX_PROPSENSOR_NODEF;
00573                                         
00574                                         /* Better do an explicit conversion here! (was implicit      */
00575                                         /* before...)                                                */
00576                                         switch(blenderpropsensor->type) {
00577                                         case SENS_PROP_EQUAL:
00578                                                 propchecktype = SCA_PropertySensor::KX_PROPSENSOR_EQUAL;
00579                                                 break;
00580                                         case SENS_PROP_NEQUAL:
00581                                                 propchecktype = SCA_PropertySensor::KX_PROPSENSOR_NOTEQUAL;
00582                                                 break;
00583                                         case SENS_PROP_INTERVAL:
00584                                                 propchecktype = SCA_PropertySensor::KX_PROPSENSOR_INTERVAL;
00585                                                 break;
00586                                         case SENS_PROP_CHANGED:
00587                                                 propchecktype = SCA_PropertySensor::KX_PROPSENSOR_CHANGED;
00588                                                 break;
00589                                         case SENS_PROP_EXPRESSION:
00590                                                 propchecktype = SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION;
00591                                                 /* error */
00592                                                 break;
00593                                         default:
00594                                                 ; /* error */
00595                                         }
00596                                         gamesensor = new SCA_PropertySensor(eventmgr,gameobj,propname,propval,propmaxval,propchecktype);
00597                                 }
00598                                 
00599                                 break;
00600                         }
00601                 case SENS_ACTUATOR:
00602                         {
00603                                 bActuatorSensor* blenderactsensor = (bActuatorSensor*) sens->data;
00604                                 // we will reuse the property event manager, there is nothing special with this sensor
00605                                 SCA_EventManager* eventmgr 
00606                                         = logicmgr->FindEventManager(SCA_EventManager::ACTUATOR_EVENTMGR);
00607                                 if (eventmgr)
00608                                 {
00609                                         STR_String propname=blenderactsensor->name;
00610                                         gamesensor = new SCA_ActuatorSensor(eventmgr,gameobj,propname);
00611                                 }
00612                                 break;
00613                         }
00614                         
00615                 case SENS_ARMATURE:
00616                         {
00617                                 bArmatureSensor* blenderarmsensor = (bArmatureSensor*) sens->data;
00618                                 // we will reuse the property event manager, there is nothing special with this sensor
00619                                 SCA_EventManager* eventmgr 
00620                                         = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
00621                                 if (eventmgr)
00622                                 {
00623                                         STR_String bonename=blenderarmsensor->posechannel;
00624                                         STR_String constraintname=blenderarmsensor->constraint;
00625                                         gamesensor = new KX_ArmatureSensor(eventmgr,gameobj,bonename,constraintname, blenderarmsensor->type, blenderarmsensor->value);
00626                                 }
00627                                 break;
00628                         }
00629 
00630                 case SENS_RADAR:
00631                         {
00632                                 
00633                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
00634                                 if (eventmgr)
00635                                 {
00636                                         STR_String radarpropertyname;
00637                                         STR_String touchpropertyname;
00638                                         bRadarSensor* blenderradarsensor = (bRadarSensor*) sens->data;
00639                                         
00640                                         int radaraxis = blenderradarsensor->axis;
00641                                         
00642                                         if (blenderradarsensor->name)
00643                                         {
00644                                                 // only objects that own this property will be taken into account
00645                                                 radarpropertyname = (char*) blenderradarsensor->name;
00646                                         }
00647                                         
00648                                         MT_Scalar coneheight = blenderradarsensor->range;
00649                                         
00650                                         // janco: the angle was doubled, so should I divide the factor in 2
00651                                         // or the blenderradarsensor->angle?
00652                                         // nzc: the angle is the opening angle. We need to init with 
00653                                         // the axis-hull angle,so /2.0.
00654                                         MT_Scalar factor = tan(MT_radians((blenderradarsensor->angle)/2.0));
00655                                         //MT_Scalar coneradius = coneheight * (factor / 2);
00656                                         MT_Scalar coneradius = coneheight * factor;
00657                                         
00658                                         
00659                                         // this sumoObject is not deleted by a gameobj, so delete it ourself
00660                                         // later (memleaks)!
00661                                         MT_Scalar smallmargin = 0.0;
00662                                         MT_Scalar largemargin = 0.0;
00663                                         
00664                                         bool bFindMaterial = false;
00665                                         PHY_IPhysicsController* ctrl = kxscene->GetPhysicsEnvironment()->CreateConeController((float)coneradius, (float)coneheight);
00666 
00667                                         gamesensor = new KX_RadarSensor(
00668                                                 eventmgr,
00669                                                 gameobj,
00670                                                 ctrl,
00671                                                 coneradius,
00672                                                 coneheight,
00673                                                 radaraxis,
00674                                                 smallmargin,
00675                                                 largemargin,
00676                                                 bFindMaterial,
00677                                                 radarpropertyname);
00678                                                 
00679                                 }
00680                         
00681                                 break;
00682                         }
00683                 case SENS_RAY:
00684                         {
00685                                 bRaySensor* blenderraysensor = (bRaySensor*) sens->data;
00686                                 
00687                                 //blenderradarsensor->angle;
00688                                 SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
00689                                 if (eventmgr)
00690                                 {
00691                                         bool bFindMaterial = (blenderraysensor->mode & SENS_COLLISION_MATERIAL);
00692                                         bool bXRay = (blenderraysensor->mode & SENS_RAY_XRAY);
00693                                         
00694                                         STR_String checkname = (bFindMaterial? blenderraysensor->matname : blenderraysensor->propname);
00695 
00696                                         // don't want to get rays of length 0.0 or so
00697                                         double distance = (blenderraysensor->range < 0.01 ? 0.01 : blenderraysensor->range );
00698                                         int axis = blenderraysensor->axisflag;
00699 
00700                                         
00701                                         gamesensor = new KX_RaySensor(eventmgr,
00702                                                                                                   gameobj,
00703                                                                                                   checkname,
00704                                                                                                   bFindMaterial,
00705                                                                                                   bXRay,
00706                                                                                                   distance,
00707                                                                                                   axis,
00708                                                                                                   kxscene);
00709 
00710                                 }
00711                                 break;
00712                         }
00713                         
00714                 case SENS_RANDOM:
00715                         {
00716                                 bRandomSensor* blenderrndsensor = (bRandomSensor*) sens->data;
00717                                 // some files didn't write randomsensor, avoid crash now for NULL ptr's
00718                                 if (blenderrndsensor)
00719                                 {
00720                                         SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
00721                                         if (eventmgr)
00722                                         {
00723                                                 int randomSeed = blenderrndsensor->seed;
00724                                                 if (randomSeed == 0)
00725                                                 {
00726                                                         randomSeed = (int)(kxengine->GetRealTime()*100000.0);
00727                                                         randomSeed ^= (intptr_t)blenderrndsensor;
00728                                                 }
00729                                                 gamesensor = new SCA_RandomSensor(eventmgr, gameobj, randomSeed);
00730                                         }
00731                                 }
00732                                 break;
00733                         }
00734                 case SENS_JOYSTICK:
00735                         {
00736                                 int joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_NODEF;
00737                                 
00738                                 bJoystickSensor* bjoy = (bJoystickSensor*) sens->data;
00739                                 
00740                                 SCA_JoystickManager *eventmgr 
00741                                         = (SCA_JoystickManager*) logicmgr->FindEventManager(SCA_EventManager::JOY_EVENTMGR);
00742                                 if (eventmgr) 
00743                                 {
00744                                         int axis        =0;
00745                                         int axisf       =0;
00746                                         int button      =0;
00747                                         int hat         =0; 
00748                                         int hatf        =0;
00749                                         int prec        =0;
00750                                         
00751                                         switch(bjoy->type)
00752                                         {
00753                                         case SENS_JOY_AXIS:
00754                                                 axis    = bjoy->axis;
00755                                                 axisf   = bjoy->axisf;
00756                                                 prec    = bjoy->precision;
00757                                                 joysticktype  = SCA_JoystickSensor::KX_JOYSENSORMODE_AXIS;
00758                                                 break;
00759                                         case SENS_JOY_BUTTON:
00760                                                 button  = bjoy->button;
00761                                                 joysticktype  = SCA_JoystickSensor::KX_JOYSENSORMODE_BUTTON;
00762                                                 break;
00763                                         case SENS_JOY_HAT:
00764                                                 hat             = bjoy->hat;
00765                                                 hatf    = bjoy->hatf;
00766                                                 joysticktype  = SCA_JoystickSensor::KX_JOYSENSORMODE_HAT;
00767                                                 break;
00768                                         case SENS_JOY_AXIS_SINGLE:
00769                                                 axis    = bjoy->axis_single;
00770                                                 prec    = bjoy->precision;
00771                                                 joysticktype  = SCA_JoystickSensor::KX_JOYSENSORMODE_AXIS_SINGLE;
00772                                                 break;
00773                                         default:
00774                                                 printf("Error: bad case statement\n");
00775                                                 break;
00776                                         }
00777                                         gamesensor = new SCA_JoystickSensor(
00778                                                 eventmgr,
00779                                                 gameobj,
00780                                                 bjoy->joyindex,
00781                                                 joysticktype,
00782                                                 axis,axisf,
00783                                                 prec,
00784                                                 button,
00785                                                 hat,hatf,
00786                                                 (bjoy->flag & SENS_JOY_ANY_EVENT));
00787                                 } 
00788                                 else
00789                                 {
00790                                         printf("Error there was a problem finding the event manager\n");
00791                                 }
00792 
00793                                 break;
00794                         }
00795                 default:
00796                         {
00797                         }
00798                 }
00799 
00800                 if (gamesensor)
00801                 {
00802                         gamesensor->SetExecutePriority(executePriority++);
00803                         STR_String uniquename = sens->name;
00804                         uniquename += "#SENS#";
00805                         uniqueint++;
00806                         CIntValue* uniqueval = new CIntValue(uniqueint);
00807                         uniquename += uniqueval->GetText();
00808                         uniqueval->Release();
00809                         
00810                         /* Conversion succeeded, so we can set the generic props here.   */
00811                         gamesensor->SetPulseMode(pos_pulsemode, 
00812                                                                          neg_pulsemode, 
00813                                                                          frequency);
00814                         gamesensor->SetInvert(invert);
00815                         gamesensor->SetLevel(level);
00816                         gamesensor->SetTap(tap);
00817                         gamesensor->SetName(sens->name);                        
00818                         
00819                         gameobj->AddSensor(gamesensor);
00820                         
00821                         // only register to manager if it's in an active layer
00822                         // Make registration dynamic: only when sensor is activated
00823                         //if (isInActiveLayer)
00824                         //      gamesensor->RegisterToManager();
00825                         
00826                         gamesensor->ReserveController(sens->totlinks);
00827                         for (int i=0;i<sens->totlinks;i++)
00828                         {
00829                                 bController* linkedcont = (bController*) sens->links[i];
00830                                 if (linkedcont) {
00831                                         SCA_IController* gamecont = converter->FindGameController(linkedcont);
00832 
00833                                         if (gamecont) {
00834                                                 logicmgr->RegisterToSensor(gamecont,gamesensor);
00835                                         } else {
00836                                                 printf(
00837                                                         "Warning, sensor \"%s\" could not find its controller "
00838                                                         "(link %d of %d) from object \"%s\"\n"
00839                                                         "\tthere has been an error converting the blender controller for the game engine,"
00840                                                         "logic may be incorrect\n", sens->name, i+1, sens->totlinks, blenderobject->id.name+2);
00841                                         }
00842                                 } else {
00843                                         printf(
00844                                                 "Warning, sensor \"%s\" has lost a link to a controller "
00845                                                 "(link %d of %d) from object \"%s\"\n"
00846                                                 "\tpossible causes are partially appended objects or an error reading the file,"
00847                                                 "logic may be incorrect\n", sens->name, i+1, sens->totlinks, blenderobject->id.name+2);
00848                                 }
00849                         }
00850                         // special case: Keyboard sensor with no link
00851                         // this combination is usually used for key logging. 
00852                         if (sens->type == SENS_KEYBOARD && sens->totlinks == 0) {
00853                                 // Force the registration so that the sensor runs
00854                                 gamesensor->IncLink();
00855                         }
00856                                 
00857                         // done with gamesensor
00858                         gamesensor->Release();
00859                         
00860                 }
00861                 sens=sens->next;
00862         }
00863 }
00864