|
Blender
V2.59
|
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