KX_ConvertSensors.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. /*
  2. * ***** BEGIN GPL LICENSE BLOCK *****
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version 2
  7. * of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software Foundation,
  16. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. *
  18. * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  19. * All rights reserved.
  20. *
  21. * The Original Code is: all of this file.
  22. *
  23. * Contributor(s): none yet.
  24. *
  25. * ***** END GPL LICENSE BLOCK *****
  26. */
  27. /** \file gameengine/Converter/KX_ConvertSensors.cpp
  28. * \ingroup bgeconv
  29. *
  30. * Conversion of Blender data blocks to KX sensor system
  31. */
  32. #include <stdio.h>
  33. #ifdef _MSC_VER
  34. # pragma warning (disable:4786)
  35. #endif
  36. #include "wm_event_types.h"
  37. #include "KX_BlenderSceneConverter.h"
  38. #include "KX_ConvertSensors.h"
  39. /* This little block needed for linking to Blender... */
  40. #ifdef _MSC_VER
  41. # include "BLI_winstuff.h"
  42. #endif
  43. #include "DNA_object_types.h"
  44. #include "DNA_material_types.h"
  45. #include "DNA_sensor_types.h"
  46. #include "DNA_controller_types.h"
  47. #include "DNA_actuator_types.h" /* for SENS_ALL_KEYS ? this define is
  48. * probably misplaced */
  49. /* end of blender include block */
  50. #include "RAS_IPolygonMaterial.h"
  51. // Sensors
  52. #include "KX_GameObject.h"
  53. #include "RAS_MeshObject.h"
  54. #include "SCA_KeyboardSensor.h"
  55. #include "SCA_MouseSensor.h"
  56. #include "SCA_AlwaysSensor.h"
  57. #include "KX_TouchSensor.h"
  58. #include "KX_NearSensor.h"
  59. #include "KX_RadarSensor.h"
  60. #include "KX_MouseFocusSensor.h"
  61. #include "KX_ArmatureSensor.h"
  62. #include "SCA_JoystickSensor.h"
  63. #include "KX_NetworkMessageSensor.h"
  64. #include "SCA_ActuatorSensor.h"
  65. #include "SCA_DelaySensor.h"
  66. #include "SCA_PropertySensor.h"
  67. #include "SCA_RandomSensor.h"
  68. #include "KX_RaySensor.h"
  69. #include "SCA_EventManager.h"
  70. #include "SCA_LogicManager.h"
  71. #include "KX_BlenderInputDevice.h"
  72. #include "KX_Scene.h"
  73. #include "EXP_IntValue.h"
  74. #include "KX_BlenderKeyboardDevice.h"
  75. #include "RAS_ICanvas.h"
  76. #include "PHY_IPhysicsEnvironment.h"
  77. #include "KX_KetsjiEngine.h"
  78. #include "BL_BlenderDataConversion.h"
  79. void BL_ConvertSensors(struct Object* blenderobject,
  80. class KX_GameObject* gameobj,
  81. SCA_LogicManager* logicmgr,
  82. KX_Scene* kxscene,
  83. KX_KetsjiEngine* kxengine,
  84. int activeLayerBitInfo,
  85. bool isInActiveLayer,
  86. RAS_ICanvas* canvas,
  87. KX_BlenderSceneConverter* converter
  88. )
  89. {
  90. int executePriority = 0;
  91. int uniqueint = 0;
  92. int count = 0;
  93. bSensor* sens = (bSensor*)blenderobject->sensors.first;
  94. bool pos_pulsemode = false;
  95. bool neg_pulsemode = false;
  96. int skipped_ticks = 0;
  97. bool invert = false;
  98. bool level = false;
  99. bool tap = false;
  100. while (sens)
  101. {
  102. sens = sens->next;
  103. count++;
  104. }
  105. gameobj->ReserveSensor(count);
  106. sens = (bSensor*)blenderobject->sensors.first;
  107. while (sens) {
  108. if (!(sens->flag & SENS_DEACTIVATE)) {
  109. SCA_ISensor* gamesensor=NULL;
  110. /* All sensors have a pulse toggle, skipped ticks parameter, and invert field. */
  111. /* These are extracted here, and set when the sensor is added to the */
  112. /* list. */
  113. pos_pulsemode = (sens->pulse & SENS_PULSE_REPEAT)!=0;
  114. neg_pulsemode = (sens->pulse & SENS_NEG_PULSE_MODE)!=0;
  115. skipped_ticks = sens->freq;
  116. invert = !(sens->invert == 0);
  117. level = !(sens->level == 0);
  118. tap = !(sens->tap == 0);
  119. switch (sens->type)
  120. {
  121. case SENS_ALWAYS:
  122. {
  123. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
  124. if (eventmgr)
  125. {
  126. gamesensor = new SCA_AlwaysSensor(eventmgr, gameobj);
  127. }
  128. break;
  129. }
  130. case SENS_DELAY:
  131. {
  132. // we can reuse the Always event manager for the delay sensor
  133. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
  134. if (eventmgr)
  135. {
  136. bDelaySensor* delaysensor = (bDelaySensor*)sens->data;
  137. gamesensor = new SCA_DelaySensor(eventmgr,
  138. gameobj,
  139. delaysensor->delay,
  140. delaysensor->duration,
  141. (delaysensor->flag & SENS_DELAY_REPEAT) != 0);
  142. }
  143. break;
  144. }
  145. case SENS_COLLISION:
  146. {
  147. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
  148. if (eventmgr)
  149. {
  150. // collision sensor can sense both materials and properties.
  151. bool bFindMaterial = false, bTouchPulse = false;
  152. bCollisionSensor* blendertouchsensor = (bCollisionSensor*)sens->data;
  153. bFindMaterial = (blendertouchsensor->mode & SENS_COLLISION_MATERIAL);
  154. bTouchPulse = (blendertouchsensor->mode & SENS_COLLISION_PULSE);
  155. const STR_String touchPropOrMatName = bFindMaterial ?
  156. blendertouchsensor->materialName : blendertouchsensor->name;
  157. if (gameobj->GetPhysicsController())
  158. {
  159. gamesensor = new KX_TouchSensor(eventmgr,
  160. gameobj,
  161. bFindMaterial,
  162. bTouchPulse,
  163. touchPropOrMatName);
  164. }
  165. }
  166. break;
  167. }
  168. case SENS_MESSAGE:
  169. {
  170. KX_NetworkEventManager* eventmgr = (KX_NetworkEventManager*)
  171. logicmgr->FindEventManager(SCA_EventManager::NETWORK_EVENTMGR);
  172. if (eventmgr) {
  173. bMessageSensor* msgSens = (bMessageSensor*) sens->data;
  174. /* Get our NetworkScene */
  175. NG_NetworkScene *NetworkScene = kxscene->GetNetworkScene();
  176. /* filter on the incoming subjects, might be empty */
  177. const STR_String subject = msgSens->subject;
  178. gamesensor = new KX_NetworkMessageSensor(
  179. eventmgr, // our eventmanager
  180. NetworkScene, // our NetworkScene
  181. gameobj, // the sensor controlling object
  182. subject); // subject to filter on
  183. }
  184. break;
  185. }
  186. case SENS_NEAR:
  187. {
  188. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
  189. if (eventmgr)
  190. {
  191. bNearSensor* blendernearsensor = (bNearSensor*)sens->data;
  192. const STR_String nearpropertyname = (char *)blendernearsensor->name;
  193. //DT_ShapeHandle shape = DT_Sphere(0.0);
  194. // this sumoObject is not deleted by a gameobj, so delete it ourself
  195. // later (memleaks)!
  196. float radius = blendernearsensor->dist;
  197. const MT_Vector3& wpos = gameobj->NodeGetWorldPosition();
  198. bool bFindMaterial = false;
  199. PHY_IPhysicsController* physCtrl = kxscene->GetPhysicsEnvironment()->CreateSphereController(radius,wpos);
  200. //will be done in KX_TouchEventManager::RegisterSensor()
  201. //if (isInActiveLayer)
  202. // kxscene->GetPhysicsEnvironment()->addSensor(physCtrl);
  203. gamesensor = new KX_NearSensor(eventmgr,gameobj,
  204. blendernearsensor->dist,
  205. blendernearsensor->resetdist,
  206. bFindMaterial,
  207. nearpropertyname,
  208. physCtrl);
  209. }
  210. break;
  211. }
  212. case SENS_KEYBOARD:
  213. {
  214. /* temporary input device, for converting the code for the keyboard sensor */
  215. bKeyboardSensor* blenderkeybdsensor = (bKeyboardSensor*)sens->data;
  216. SCA_KeyboardManager* eventmgr = (SCA_KeyboardManager*) logicmgr->FindEventManager(SCA_EventManager::KEYBOARD_EVENTMGR);
  217. if (eventmgr)
  218. {
  219. gamesensor = new SCA_KeyboardSensor(eventmgr,
  220. ConvertKeyCode(blenderkeybdsensor->key),
  221. ConvertKeyCode(blenderkeybdsensor->qual),
  222. ConvertKeyCode(blenderkeybdsensor->qual2),
  223. (blenderkeybdsensor->type == SENS_ALL_KEYS),
  224. blenderkeybdsensor->targetName,
  225. blenderkeybdsensor->toggleName,
  226. gameobj,
  227. KX_KetsjiEngine::GetExitKey()); // blenderkeybdsensor->pad);
  228. }
  229. break;
  230. }
  231. case SENS_MOUSE:
  232. {
  233. int keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_NODEF;
  234. int trackfocus = 0;
  235. bMouseSensor *bmouse = (bMouseSensor *)sens->data;
  236. /* There are two main types of mouse sensors. If there is
  237. * no focus-related behavior requested, we can make do
  238. * with a basic sensor. This cuts down memory usage and
  239. * gives a slight performance gain. */
  240. SCA_MouseManager *eventmgr
  241. = (SCA_MouseManager*) logicmgr->FindEventManager(SCA_EventManager::MOUSE_EVENTMGR);
  242. if (eventmgr) {
  243. /* Determine key mode. There is at most one active mode. */
  244. switch (bmouse->type) {
  245. case BL_SENS_MOUSE_LEFT_BUTTON:
  246. keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_LEFTBUTTON;
  247. break;
  248. case BL_SENS_MOUSE_MIDDLE_BUTTON:
  249. keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_MIDDLEBUTTON;
  250. break;
  251. case BL_SENS_MOUSE_RIGHT_BUTTON:
  252. keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_RIGHTBUTTON;
  253. break;
  254. case BL_SENS_MOUSE_WHEEL_UP:
  255. keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_WHEELUP;
  256. break;
  257. case BL_SENS_MOUSE_WHEEL_DOWN:
  258. keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_WHEELDOWN;
  259. break;
  260. case BL_SENS_MOUSE_MOVEMENT:
  261. keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_MOVEMENT;
  262. break;
  263. case BL_SENS_MOUSE_MOUSEOVER:
  264. trackfocus = 1;
  265. break;
  266. case BL_SENS_MOUSE_MOUSEOVER_ANY:
  267. trackfocus = 2;
  268. break;
  269. default:
  270. ; /* error */
  271. }
  272. /* initial mouse position */
  273. int startx = canvas->GetWidth()/2;
  274. int starty = canvas->GetHeight()/2;
  275. if (!trackfocus) {
  276. /* plain, simple mouse sensor */
  277. gamesensor = new SCA_MouseSensor(eventmgr,
  278. startx,starty,
  279. keytype,
  280. gameobj);
  281. } else {
  282. /* give us a focus-aware sensor */
  283. bool bFindMaterial = (bmouse->mode & SENS_COLLISION_MATERIAL);
  284. bool bXRay = (bmouse->flag & SENS_RAY_XRAY);
  285. STR_String checkname = (bFindMaterial? bmouse->matname : bmouse->propname);
  286. gamesensor = new KX_MouseFocusSensor(eventmgr,
  287. startx,
  288. starty,
  289. keytype,
  290. trackfocus,
  291. (bmouse->flag & SENS_MOUSE_FOCUS_PULSE) ? true:false,
  292. checkname,
  293. bFindMaterial,
  294. bXRay,
  295. kxscene,
  296. kxengine,
  297. gameobj);
  298. }
  299. } else {
  300. // cout << "\n Could't find mouse event manager..."; - should throw an error here...
  301. }
  302. break;
  303. }
  304. case SENS_PROPERTY:
  305. {
  306. bPropertySensor* blenderpropsensor = (bPropertySensor*) sens->data;
  307. SCA_EventManager* eventmgr
  308. = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
  309. if (eventmgr)
  310. {
  311. STR_String propname=blenderpropsensor->name;
  312. STR_String propval=blenderpropsensor->value;
  313. STR_String propmaxval=blenderpropsensor->maxvalue;
  314. SCA_PropertySensor::KX_PROPSENSOR_TYPE
  315. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_NODEF;
  316. /* Better do an explicit conversion here! (was implicit */
  317. /* before...) */
  318. switch (blenderpropsensor->type) {
  319. case SENS_PROP_EQUAL:
  320. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_EQUAL;
  321. break;
  322. case SENS_PROP_NEQUAL:
  323. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_NOTEQUAL;
  324. break;
  325. case SENS_PROP_INTERVAL:
  326. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_INTERVAL;
  327. break;
  328. case SENS_PROP_CHANGED:
  329. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_CHANGED;
  330. break;
  331. case SENS_PROP_EXPRESSION:
  332. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION;
  333. /* error */
  334. break;
  335. case SENS_PROP_LESSTHAN:
  336. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_LESSTHAN;
  337. break;
  338. case SENS_PROP_GREATERTHAN:
  339. propchecktype = SCA_PropertySensor::KX_PROPSENSOR_GREATERTHAN;
  340. break;
  341. default:
  342. ; /* error */
  343. }
  344. gamesensor = new SCA_PropertySensor(eventmgr,gameobj,propname,propval,propmaxval,propchecktype);
  345. }
  346. break;
  347. }
  348. case SENS_ACTUATOR:
  349. {
  350. bActuatorSensor* blenderactsensor = (bActuatorSensor*) sens->data;
  351. // we will reuse the property event manager, there is nothing special with this sensor
  352. SCA_EventManager* eventmgr
  353. = logicmgr->FindEventManager(SCA_EventManager::ACTUATOR_EVENTMGR);
  354. if (eventmgr)
  355. {
  356. STR_String propname=blenderactsensor->name;
  357. gamesensor = new SCA_ActuatorSensor(eventmgr,gameobj,propname);
  358. }
  359. break;
  360. }
  361. case SENS_ARMATURE:
  362. {
  363. bArmatureSensor* blenderarmsensor = (bArmatureSensor*) sens->data;
  364. // we will reuse the property event manager, there is nothing special with this sensor
  365. SCA_EventManager* eventmgr
  366. = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
  367. if (eventmgr)
  368. {
  369. STR_String bonename=blenderarmsensor->posechannel;
  370. STR_String constraintname=blenderarmsensor->constraint;
  371. gamesensor = new KX_ArmatureSensor(eventmgr,gameobj,bonename,constraintname, blenderarmsensor->type, blenderarmsensor->value);
  372. }
  373. break;
  374. }
  375. case SENS_RADAR:
  376. {
  377. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
  378. if (eventmgr)
  379. {
  380. bRadarSensor* blenderradarsensor = (bRadarSensor*) sens->data;
  381. const STR_String radarpropertyname = blenderradarsensor->name;
  382. int radaraxis = blenderradarsensor->axis;
  383. MT_Scalar coneheight = blenderradarsensor->range;
  384. // janco: the angle was doubled, so should I divide the factor in 2
  385. // or the blenderradarsensor->angle?
  386. // nzc: the angle is the opening angle. We need to init with
  387. // the axis-hull angle,so /2.0.
  388. MT_Scalar factor = tan(blenderradarsensor->angle * 0.5f);
  389. //MT_Scalar coneradius = coneheight * (factor / 2);
  390. MT_Scalar coneradius = coneheight * factor;
  391. // this sumoObject is not deleted by a gameobj, so delete it ourself
  392. // later (memleaks)!
  393. MT_Scalar smallmargin = 0.0;
  394. MT_Scalar largemargin = 0.0;
  395. bool bFindMaterial = false;
  396. PHY_IPhysicsController* ctrl = kxscene->GetPhysicsEnvironment()->CreateConeController((float)coneradius, (float)coneheight);
  397. gamesensor = new KX_RadarSensor(
  398. eventmgr,
  399. gameobj,
  400. ctrl,
  401. coneradius,
  402. coneheight,
  403. radaraxis,
  404. smallmargin,
  405. largemargin,
  406. bFindMaterial,
  407. radarpropertyname);
  408. }
  409. break;
  410. }
  411. case SENS_RAY:
  412. {
  413. bRaySensor* blenderraysensor = (bRaySensor*) sens->data;
  414. //blenderradarsensor->angle;
  415. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
  416. if (eventmgr)
  417. {
  418. bool bFindMaterial = (blenderraysensor->mode & SENS_COLLISION_MATERIAL);
  419. bool bXRay = (blenderraysensor->mode & SENS_RAY_XRAY);
  420. STR_String checkname = (bFindMaterial? blenderraysensor->matname : blenderraysensor->propname);
  421. // don't want to get rays of length 0.0 or so
  422. double distance = (blenderraysensor->range < 0.01f ? 0.01f : blenderraysensor->range);
  423. int axis = blenderraysensor->axisflag;
  424. gamesensor = new KX_RaySensor(eventmgr,
  425. gameobj,
  426. checkname,
  427. bFindMaterial,
  428. bXRay,
  429. distance,
  430. axis,
  431. kxscene);
  432. }
  433. break;
  434. }
  435. case SENS_RANDOM:
  436. {
  437. bRandomSensor* blenderrndsensor = (bRandomSensor*) sens->data;
  438. // some files didn't write randomsensor, avoid crash now for NULL ptr's
  439. if (blenderrndsensor)
  440. {
  441. SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
  442. if (eventmgr)
  443. {
  444. int randomSeed = blenderrndsensor->seed;
  445. if (randomSeed == 0)
  446. {
  447. randomSeed = (int)(kxengine->GetRealTime()*100000.0);
  448. randomSeed ^= (intptr_t)blenderrndsensor;
  449. }
  450. gamesensor = new SCA_RandomSensor(eventmgr, gameobj, randomSeed);
  451. }
  452. }
  453. break;
  454. }
  455. case SENS_JOYSTICK:
  456. {
  457. int joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_NODEF;
  458. bJoystickSensor* bjoy = (bJoystickSensor*) sens->data;
  459. SCA_JoystickManager *eventmgr
  460. = (SCA_JoystickManager*) logicmgr->FindEventManager(SCA_EventManager::JOY_EVENTMGR);
  461. if (eventmgr)
  462. {
  463. int axis =0;
  464. int axisf =0;
  465. int button =0;
  466. int hat =0;
  467. int hatf =0;
  468. int prec =0;
  469. switch (bjoy->type) {
  470. case SENS_JOY_AXIS:
  471. axis = bjoy->axis;
  472. axisf = bjoy->axisf;
  473. prec = bjoy->precision;
  474. joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_AXIS;
  475. break;
  476. case SENS_JOY_BUTTON:
  477. button = bjoy->button;
  478. joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_BUTTON;
  479. break;
  480. case SENS_JOY_HAT:
  481. hat = bjoy->hat;
  482. hatf = bjoy->hatf;
  483. joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_HAT;
  484. break;
  485. case SENS_JOY_AXIS_SINGLE:
  486. axis = bjoy->axis_single;
  487. prec = bjoy->precision;
  488. joysticktype = SCA_JoystickSensor::KX_JOYSENSORMODE_AXIS_SINGLE;
  489. break;
  490. default:
  491. printf("Error: bad case statement\n");
  492. break;
  493. }
  494. gamesensor = new SCA_JoystickSensor(
  495. eventmgr,
  496. gameobj,
  497. bjoy->joyindex,
  498. joysticktype,
  499. axis,axisf,
  500. prec,
  501. button,
  502. hat,hatf,
  503. (bjoy->flag & SENS_JOY_ANY_EVENT));
  504. }
  505. else
  506. {
  507. printf("Error there was a problem finding the event manager\n");
  508. }
  509. break;
  510. }
  511. default:
  512. {
  513. }
  514. }
  515. if (gamesensor)
  516. {
  517. gamesensor->SetExecutePriority(executePriority++);
  518. STR_String uniquename = sens->name;
  519. uniquename += "#SENS#";
  520. uniqueint++;
  521. CIntValue* uniqueval = new CIntValue(uniqueint);
  522. uniquename += uniqueval->GetText();
  523. uniqueval->Release();
  524. /* Conversion succeeded, so we can set the generic props here. */
  525. gamesensor->SetPulseMode(pos_pulsemode,
  526. neg_pulsemode,
  527. skipped_ticks);
  528. gamesensor->SetInvert(invert);
  529. gamesensor->SetLevel(level);
  530. gamesensor->SetTap(tap);
  531. gamesensor->SetName(sens->name);
  532. gamesensor->SetLogicManager(logicmgr);
  533. gameobj->AddSensor(gamesensor);
  534. // only register to manager if it's in an active layer
  535. // Make registration dynamic: only when sensor is activated
  536. //if (isInActiveLayer)
  537. // gamesensor->RegisterToManager();
  538. gamesensor->ReserveController(sens->totlinks);
  539. for (int i=0;i<sens->totlinks;i++)
  540. {
  541. bController* linkedcont = (bController*) sens->links[i];
  542. if (linkedcont) {
  543. // If the controller is deactived doesn't register it
  544. if (!(linkedcont->flag & CONT_DEACTIVATE)) {
  545. SCA_IController* gamecont = converter->FindGameController(linkedcont);
  546. if (gamecont) {
  547. logicmgr->RegisterToSensor(gamecont,gamesensor);
  548. }
  549. else {
  550. printf("Warning, sensor \"%s\" could not find its controller "
  551. "(link %d of %d) from object \"%s\"\n"
  552. "\tthere has been an error converting the blender controller for the game engine,"
  553. "logic may be incorrect\n", sens->name, i+1, sens->totlinks, blenderobject->id.name+2);
  554. }
  555. }
  556. }
  557. else {
  558. printf("Warning, sensor \"%s\" has lost a link to a controller "
  559. "(link %d of %d) from object \"%s\"\n"
  560. "\tpossible causes are partially appended objects or an error reading the file,"
  561. "logic may be incorrect\n", sens->name, i+1, sens->totlinks, blenderobject->id.name+2);
  562. }
  563. }
  564. // special case: Keyboard sensor with no link
  565. // this combination is usually used for key logging.
  566. if (sens->type == SENS_KEYBOARD && sens->totlinks == 0) {
  567. // Force the registration so that the sensor runs
  568. gamesensor->IncLink();
  569. }
  570. // done with gamesensor
  571. gamesensor->Release();
  572. }
  573. }
  574. sens=sens->next;
  575. }
  576. }