KX_ConvertActuators.cpp 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  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. * Convert Blender actuators for use in the GameEngine
  27. */
  28. /** \file gameengine/Converter/KX_ConvertActuators.cpp
  29. * \ingroup bgeconv
  30. */
  31. #ifdef _MSC_VER
  32. # pragma warning (disable:4786)
  33. #endif
  34. #include <math.h>
  35. #include "MEM_guardedalloc.h"
  36. #include "KX_BlenderSceneConverter.h"
  37. #include "KX_ConvertActuators.h"
  38. #ifdef WITH_AUDASPACE
  39. # include AUD_SOUND_H
  40. #endif
  41. // Actuators
  42. //SCA logiclibrary native logicbricks
  43. #include "SCA_PropertyActuator.h"
  44. #include "SCA_LogicManager.h"
  45. #include "SCA_RandomActuator.h"
  46. #include "SCA_2DFilterActuator.h"
  47. // Ketsji specific logicbricks
  48. #include "KX_SceneActuator.h"
  49. #include "KX_SoundActuator.h"
  50. #include "KX_ObjectActuator.h"
  51. #include "KX_TrackToActuator.h"
  52. #include "KX_ConstraintActuator.h"
  53. #include "KX_CameraActuator.h"
  54. #include "KX_GameActuator.h"
  55. #include "KX_StateActuator.h"
  56. #include "KX_VisibilityActuator.h"
  57. #include "KX_SCA_AddObjectActuator.h"
  58. #include "KX_SCA_EndObjectActuator.h"
  59. #include "KX_SCA_ReplaceMeshActuator.h"
  60. #include "KX_ParentActuator.h"
  61. #include "KX_SCA_DynamicActuator.h"
  62. #include "KX_SteeringActuator.h"
  63. #include "KX_MouseActuator.h"
  64. #include "KX_Scene.h"
  65. #include "KX_KetsjiEngine.h"
  66. #include "EXP_IntValue.h"
  67. #include "KX_GameObject.h"
  68. /* This little block needed for linking to Blender... */
  69. #include "BKE_text.h"
  70. #include "BLI_blenlib.h"
  71. #include "BLI_math.h"
  72. #include "BLI_path_util.h"
  73. #include "KX_NetworkMessageActuator.h"
  74. #ifdef WIN32
  75. #include "BLI_winstuff.h"
  76. #endif
  77. #include "DNA_object_types.h"
  78. #include "DNA_sound_types.h"
  79. #include "DNA_scene_types.h"
  80. #include "DNA_actuator_types.h"
  81. #include "DNA_packedFile_types.h"
  82. #include "BL_ActionActuator.h"
  83. #include "BL_ShapeActionActuator.h"
  84. #include "BL_ArmatureActuator.h"
  85. #include "RNA_access.h"
  86. #include "BL_Action.h"
  87. /* end of blender include block */
  88. #include "BL_BlenderDataConversion.h"
  89. /**
  90. * KX_flt_trunc needed to round 'almost' zero values to zero, else velocities etc. are incorrectly set
  91. */
  92. BLI_INLINE float KX_flt_trunc(const float x)
  93. {
  94. return ( x < 0.0001f && x > -0.0001f ) ? 0.0f : x;
  95. }
  96. void BL_ConvertActuators(const char* maggiename,
  97. struct Object* blenderobject,
  98. KX_GameObject* gameobj,
  99. SCA_LogicManager* logicmgr,
  100. KX_Scene* scene,
  101. KX_KetsjiEngine* ketsjiEngine,
  102. int activeLayerBitInfo,
  103. bool isInActiveLayer,
  104. KX_BlenderSceneConverter* converter
  105. )
  106. {
  107. int uniqueint = 0;
  108. int actcount = 0;
  109. int executePriority = 0;
  110. bActuator* bact = (bActuator*) blenderobject->actuators.first;
  111. while (bact)
  112. {
  113. actcount++;
  114. bact = bact->next;
  115. }
  116. gameobj->ReserveActuator(actcount);
  117. bact = (bActuator*) blenderobject->actuators.first;
  118. while (bact)
  119. {
  120. STR_String uniquename = bact->name;
  121. STR_String& objectname = gameobj->GetName();
  122. SCA_IActuator* baseact = NULL;
  123. switch (bact->type)
  124. {
  125. case ACT_OBJECT:
  126. {
  127. bObjectActuator* obact = (bObjectActuator*) bact->data;
  128. KX_GameObject* obref = NULL;
  129. MT_Vector3 forcevec(KX_flt_trunc(obact->forceloc[0]),
  130. KX_flt_trunc(obact->forceloc[1]),
  131. KX_flt_trunc(obact->forceloc[2]));
  132. MT_Vector3 torquevec(obact->forcerot[0],
  133. obact->forcerot[1],
  134. obact->forcerot[2]);
  135. MT_Vector3 dlocvec(KX_flt_trunc(obact->dloc[0]),
  136. KX_flt_trunc(obact->dloc[1]),
  137. KX_flt_trunc(obact->dloc[2]));
  138. MT_Vector3 drotvec(KX_flt_trunc(obact->drot[0]),
  139. obact->drot[1],obact->drot[2]);
  140. MT_Vector3 linvelvec(KX_flt_trunc(obact->linearvelocity[0]),
  141. KX_flt_trunc(obact->linearvelocity[1]),
  142. KX_flt_trunc(obact->linearvelocity[2]));
  143. MT_Vector3 angvelvec(KX_flt_trunc(obact->angularvelocity[0]),
  144. KX_flt_trunc(obact->angularvelocity[1]),
  145. KX_flt_trunc(obact->angularvelocity[2]));
  146. short damping = obact->damping;
  147. /* Blender uses a bit vector internally for the local-flags. In */
  148. /* KX, we have four bools. The compiler should be smart enough */
  149. /* to do the right thing. We need to explicitly convert here! */
  150. KX_LocalFlags bitLocalFlag;
  151. bitLocalFlag.Force = bool((obact->flag & ACT_FORCE_LOCAL)!=0);
  152. bitLocalFlag.Torque = bool((obact->flag & ACT_TORQUE_LOCAL) !=0);//rlocal;
  153. bitLocalFlag.DLoc = bool((obact->flag & ACT_DLOC_LOCAL)!=0);
  154. bitLocalFlag.DRot = bool((obact->flag & ACT_DROT_LOCAL)!=0);
  155. bitLocalFlag.LinearVelocity = bool((obact->flag & ACT_LIN_VEL_LOCAL)!=0);
  156. bitLocalFlag.AngularVelocity = bool((obact->flag & ACT_ANG_VEL_LOCAL)!=0);
  157. bitLocalFlag.ServoControl = bool(obact->type == ACT_OBJECT_SERVO);
  158. bitLocalFlag.CharacterMotion = bool(obact->type == ACT_OBJECT_CHARACTER);
  159. bitLocalFlag.CharacterJump = bool((obact->flag & ACT_CHAR_JUMP)!=0);
  160. bitLocalFlag.AddOrSetLinV = bool((obact->flag & ACT_ADD_LIN_VEL)!=0);
  161. bitLocalFlag.AddOrSetCharLoc = bool((obact->flag & ACT_ADD_CHAR_LOC)!=0);
  162. if (obact->reference && bitLocalFlag.ServoControl)
  163. {
  164. obref = converter->FindGameObject(obact->reference);
  165. }
  166. KX_ObjectActuator* tmpbaseact = new KX_ObjectActuator(
  167. gameobj,
  168. obref,
  169. forcevec.getValue(),
  170. torquevec.getValue(),
  171. dlocvec.getValue(),
  172. drotvec.getValue(),
  173. linvelvec.getValue(),
  174. angvelvec.getValue(),
  175. damping,
  176. bitLocalFlag);
  177. baseact = tmpbaseact;
  178. break;
  179. }
  180. case ACT_ACTION:
  181. {
  182. bActionActuator* actact = (bActionActuator*) bact->data;
  183. STR_String propname = actact->name;
  184. STR_String propframe = actact->frameProp;
  185. short ipo_flags = 0;
  186. // Convert flags
  187. if (actact->flag & ACT_IPOFORCE) ipo_flags |= BL_Action::ACT_IPOFLAG_FORCE;
  188. if (actact->flag & ACT_IPOLOCAL) ipo_flags |= BL_Action::ACT_IPOFLAG_LOCAL;
  189. if (actact->flag & ACT_IPOADD) ipo_flags |= BL_Action::ACT_IPOFLAG_ADD;
  190. if (actact->flag & ACT_IPOCHILD) ipo_flags |= BL_Action::ACT_IPOFLAG_CHILD;
  191. BL_ActionActuator* tmpbaseact = new BL_ActionActuator(
  192. gameobj,
  193. propname,
  194. propframe,
  195. actact->sta,
  196. actact->end,
  197. actact->act,
  198. actact->type, // + 1, because Blender starts to count at zero,
  199. actact->blend_mode,
  200. actact->blendin,
  201. actact->priority,
  202. actact->layer,
  203. actact->layer_weight,
  204. ipo_flags,
  205. actact->end_reset,
  206. actact->stridelength
  207. // Ketsji at 1, because zero is reserved for "NoDef"
  208. );
  209. baseact= tmpbaseact;
  210. break;
  211. }
  212. case ACT_SHAPEACTION:
  213. {
  214. if (blenderobject->type==OB_MESH) {
  215. bActionActuator* actact = (bActionActuator*) bact->data;
  216. STR_String propname = actact->name;
  217. STR_String propframe = actact->frameProp;
  218. BL_ShapeActionActuator* tmpbaseact = new BL_ShapeActionActuator(
  219. gameobj,
  220. propname,
  221. propframe,
  222. actact->sta,
  223. actact->end,
  224. actact->act,
  225. actact->type, // + 1, because Blender starts to count at zero,
  226. actact->blendin,
  227. actact->priority,
  228. actact->stridelength);
  229. // Ketsji at 1, because zero is reserved for "NoDef"
  230. baseact= tmpbaseact;
  231. break;
  232. }
  233. else
  234. printf ("Discarded shape action actuator from non-mesh object [%s]\n", blenderobject->id.name+2);
  235. }
  236. case ACT_LAMP:
  237. {
  238. break;
  239. }
  240. case ACT_CAMERA:
  241. {
  242. bCameraActuator *camact = (bCameraActuator *) bact->data;
  243. if (camact->ob) {
  244. KX_GameObject *tmpgob = converter->FindGameObject(camact->ob);
  245. /* visifac, fac and axis are not copied from the struct... */
  246. /* that's some internal state... */
  247. KX_CameraActuator *tmpcamact = new KX_CameraActuator(
  248. gameobj,
  249. tmpgob,
  250. camact->height,
  251. camact->min,
  252. camact->max,
  253. camact->axis,
  254. camact->damping);
  255. baseact = tmpcamact;
  256. }
  257. break;
  258. }
  259. case ACT_MESSAGE:
  260. {
  261. bMessageActuator *msgAct = (bMessageActuator *) bact->data;
  262. /* Get the name of the properties that objects must own that
  263. * we're sending to, if present
  264. */
  265. STR_String toPropName = msgAct->toPropName;
  266. /* Get the Message Subject to send.
  267. */
  268. STR_String subject = msgAct->subject;
  269. /* Get the bodyType
  270. */
  271. int bodyType = msgAct->bodyType;
  272. /* Get the body (text message or property name whose value
  273. * we'll be sending, might be empty
  274. */
  275. const STR_String body = msgAct->body;
  276. KX_NetworkMessageActuator *tmpmsgact = new KX_NetworkMessageActuator(
  277. gameobj, // actuator controlling object
  278. scene->GetNetworkScene(), // needed for replication
  279. toPropName,
  280. subject,
  281. bodyType,
  282. body);
  283. baseact = tmpmsgact;
  284. break;
  285. }
  286. case ACT_MATERIAL:
  287. {
  288. break;
  289. }
  290. case ACT_SOUND:
  291. {
  292. bSoundActuator* soundact = (bSoundActuator*) bact->data;
  293. /* get type, and possibly a start and end frame */
  294. KX_SoundActuator::KX_SOUNDACT_TYPE
  295. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_NODEF;
  296. switch (soundact->type) {
  297. case ACT_SND_PLAY_STOP_SOUND:
  298. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_PLAYSTOP;
  299. break;
  300. case ACT_SND_PLAY_END_SOUND:
  301. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_PLAYEND;
  302. break;
  303. case ACT_SND_LOOP_STOP_SOUND:
  304. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_LOOPSTOP;
  305. break;
  306. case ACT_SND_LOOP_END_SOUND:
  307. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_LOOPEND;
  308. break;
  309. case ACT_SND_LOOP_BIDIRECTIONAL_SOUND:
  310. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL;
  311. break;
  312. case ACT_SND_LOOP_BIDIRECTIONAL_STOP_SOUND:
  313. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP;
  314. break;
  315. default:
  316. /* This is an error!!! */
  317. soundActuatorType = KX_SoundActuator::KX_SOUNDACT_NODEF;
  318. }
  319. if (soundActuatorType != KX_SoundActuator::KX_SOUNDACT_NODEF)
  320. {
  321. bSound* sound = soundact->sound;
  322. bool is3d = soundact->flag & ACT_SND_3D_SOUND ? true : false;
  323. AUD_Sound* snd_sound = NULL;
  324. KX_3DSoundSettings settings;
  325. settings.cone_inner_angle = RAD2DEGF(soundact->sound3D.cone_inner_angle);
  326. settings.cone_outer_angle = RAD2DEGF(soundact->sound3D.cone_outer_angle);
  327. settings.cone_outer_gain = soundact->sound3D.cone_outer_gain;
  328. settings.max_distance = soundact->sound3D.max_distance;
  329. settings.max_gain = soundact->sound3D.max_gain;
  330. settings.min_gain = soundact->sound3D.min_gain;
  331. settings.reference_distance = soundact->sound3D.reference_distance;
  332. settings.rolloff_factor = soundact->sound3D.rolloff_factor;
  333. if (!sound)
  334. {
  335. std::cout << "WARNING: Sound actuator \"" << bact->name <<
  336. "\" from object \"" << blenderobject->id.name+2 <<
  337. "\" has no sound datablock." << std::endl;
  338. }
  339. else
  340. {
  341. snd_sound = sound->playback_handle;
  342. // if sound shall be 3D but isn't mono, we have to make it mono!
  343. if (is3d)
  344. {
  345. snd_sound = AUD_Sound_rechannel(snd_sound, AUD_CHANNELS_MONO);
  346. }
  347. }
  348. KX_SoundActuator* tmpsoundact =
  349. new KX_SoundActuator(gameobj,
  350. snd_sound,
  351. soundact->volume,
  352. (float)(expf((soundact->pitch / 12.0f) * (float)M_LN2)),
  353. is3d,
  354. settings,
  355. soundActuatorType);
  356. // if we made it mono, we have to free it
  357. if (sound && snd_sound && snd_sound != sound->playback_handle) {
  358. AUD_Sound_free(snd_sound);
  359. }
  360. tmpsoundact->SetName(bact->name);
  361. baseact = tmpsoundact;
  362. }
  363. break;
  364. }
  365. case ACT_PROPERTY:
  366. {
  367. bPropertyActuator* propact = (bPropertyActuator*) bact->data;
  368. SCA_IObject* destinationObj = NULL;
  369. /*
  370. * here the destinationobject is searched. problem with multiple scenes: other scenes
  371. * have not been converted yet, so the destobj will not be found, so the prop will
  372. * not be copied.
  373. * possible solutions:
  374. * - convert everything when possible and not realtime only when needed.
  375. * - let the object-with-property report itself to the act when converted
  376. */
  377. if (propact->ob)
  378. destinationObj = converter->FindGameObject(propact->ob);
  379. SCA_PropertyActuator* tmppropact = new SCA_PropertyActuator(
  380. gameobj,
  381. destinationObj,
  382. propact->name,
  383. propact->value,
  384. propact->type + 1); // + 1 because Ketsji Logic starts
  385. // with 0 for KX_ACT_PROP_NODEF
  386. baseact = tmppropact;
  387. break;
  388. }
  389. case ACT_EDIT_OBJECT:
  390. {
  391. bEditObjectActuator *editobact
  392. = (bEditObjectActuator *) bact->data;
  393. /* There are four different kinds of 'edit object' thingies */
  394. /* The alternative to this lengthy conversion is packing */
  395. /* several actuators in one, which is not very nice design.. */
  396. switch (editobact->type) {
  397. case ACT_EDOB_ADD_OBJECT:
  398. {
  399. // does the 'original' for replication exists, and
  400. // is it in a non-active layer ?
  401. SCA_IObject* originalval = NULL;
  402. if (editobact->ob)
  403. {
  404. if (editobact->ob->lay & activeLayerBitInfo)
  405. {
  406. fprintf(stderr, "Warning, object \"%s\" from AddObject actuator \"%s\" is not in a hidden layer.\n", objectname.Ptr(), uniquename.Ptr());
  407. }
  408. else {
  409. originalval = converter->FindGameObject(editobact->ob);
  410. }
  411. }
  412. KX_SCA_AddObjectActuator* tmpaddact = new KX_SCA_AddObjectActuator(
  413. gameobj,
  414. originalval,
  415. editobact->time,
  416. scene,
  417. editobact->linVelocity,
  418. (editobact->localflag & ACT_EDOB_LOCAL_LINV) != 0,
  419. editobact->angVelocity,
  420. (editobact->localflag & ACT_EDOB_LOCAL_ANGV) != 0);
  421. //editobact->ob to gameobj
  422. baseact = tmpaddact;
  423. }
  424. break;
  425. case ACT_EDOB_END_OBJECT:
  426. {
  427. KX_SCA_EndObjectActuator* tmpendact
  428. = new KX_SCA_EndObjectActuator(gameobj,scene);
  429. baseact = tmpendact;
  430. }
  431. break;
  432. case ACT_EDOB_REPLACE_MESH:
  433. {
  434. RAS_MeshObject *tmpmesh = converter->FindGameMesh(editobact->me);
  435. if (!tmpmesh) {
  436. std::cout << "Warning: object \"" << objectname <<
  437. "\" from ReplaceMesh actuator \"" << uniquename <<
  438. "\" uses a mesh not owned by an object in scene \"" <<
  439. scene->GetName() << "\"." << std::endl;
  440. }
  441. KX_SCA_ReplaceMeshActuator* tmpreplaceact = new KX_SCA_ReplaceMeshActuator(
  442. gameobj,
  443. tmpmesh,
  444. scene,
  445. (editobact->flag & ACT_EDOB_REPLACE_MESH_NOGFX) == 0,
  446. (editobact->flag & ACT_EDOB_REPLACE_MESH_PHYS) != 0);
  447. baseact = tmpreplaceact;
  448. }
  449. break;
  450. case ACT_EDOB_TRACK_TO:
  451. {
  452. SCA_IObject* originalval = NULL;
  453. if (editobact->ob)
  454. originalval = converter->FindGameObject(editobact->ob);
  455. KX_TrackToActuator* tmptrackact = new KX_TrackToActuator(
  456. gameobj,
  457. originalval,
  458. editobact->time,
  459. editobact->flag,
  460. editobact->trackflag,
  461. editobact->upflag);
  462. baseact = tmptrackact;
  463. break;
  464. }
  465. case ACT_EDOB_DYNAMICS:
  466. {
  467. KX_SCA_DynamicActuator* tmpdynact = new KX_SCA_DynamicActuator(
  468. gameobj,
  469. editobact->dyn_operation,
  470. editobact->mass);
  471. baseact = tmpdynact;
  472. }
  473. }
  474. break;
  475. }
  476. case ACT_CONSTRAINT:
  477. {
  478. float min = 0.0, max = 0.0;
  479. char *prop = NULL;
  480. KX_ConstraintActuator::KX_CONSTRAINTTYPE locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_NODEF;
  481. bConstraintActuator *conact
  482. = (bConstraintActuator*) bact->data;
  483. /* convert settings... degrees in the ui become radians */
  484. /* internally */
  485. if (conact->type == ACT_CONST_TYPE_ORI) {
  486. min = conact->minloc[0];
  487. max = conact->maxloc[0];
  488. switch (conact->mode) {
  489. case ACT_CONST_DIRPX:
  490. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX;
  491. break;
  492. case ACT_CONST_DIRPY:
  493. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIY;
  494. break;
  495. case ACT_CONST_DIRPZ:
  496. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIZ;
  497. break;
  498. }
  499. } else if (conact->type == ACT_CONST_TYPE_DIST) {
  500. switch (conact->mode) {
  501. case ACT_CONST_DIRPX:
  502. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPX;
  503. min = conact->minloc[0];
  504. max = conact->maxloc[0];
  505. break;
  506. case ACT_CONST_DIRPY:
  507. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPY;
  508. min = conact->minloc[1];
  509. max = conact->maxloc[1];
  510. break;
  511. case ACT_CONST_DIRPZ:
  512. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRPZ;
  513. min = conact->minloc[2];
  514. max = conact->maxloc[2];
  515. break;
  516. case ACT_CONST_DIRNX:
  517. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNX;
  518. min = conact->minloc[0];
  519. max = conact->maxloc[0];
  520. break;
  521. case ACT_CONST_DIRNY:
  522. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNY;
  523. min = conact->minloc[1];
  524. max = conact->maxloc[1];
  525. break;
  526. case ACT_CONST_DIRNZ:
  527. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_DIRNZ;
  528. min = conact->minloc[2];
  529. max = conact->maxloc[2];
  530. break;
  531. }
  532. prop = conact->matprop;
  533. } else if (conact->type == ACT_CONST_TYPE_FH) {
  534. switch (conact->mode) {
  535. case ACT_CONST_DIRPX:
  536. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX;
  537. min = conact->minloc[0];
  538. max = conact->maxloc[0];
  539. break;
  540. case ACT_CONST_DIRPY:
  541. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY;
  542. min = conact->minloc[1];
  543. max = conact->maxloc[1];
  544. break;
  545. case ACT_CONST_DIRPZ:
  546. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ;
  547. min = conact->minloc[2];
  548. max = conact->maxloc[2];
  549. break;
  550. case ACT_CONST_DIRNX:
  551. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX;
  552. min = conact->minloc[0];
  553. max = conact->maxloc[0];
  554. break;
  555. case ACT_CONST_DIRNY:
  556. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY;
  557. min = conact->minloc[1];
  558. max = conact->maxloc[1];
  559. break;
  560. case ACT_CONST_DIRNZ:
  561. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ;
  562. min = conact->minloc[2];
  563. max = conact->maxloc[2];
  564. break;
  565. }
  566. prop = conact->matprop;
  567. } else {
  568. switch (conact->flag) {
  569. case ACT_CONST_LOCX:
  570. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX;
  571. min = conact->minloc[0];
  572. max = conact->maxloc[0];
  573. break;
  574. case ACT_CONST_LOCY:
  575. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCY;
  576. min = conact->minloc[1];
  577. max = conact->maxloc[1];
  578. break;
  579. case ACT_CONST_LOCZ:
  580. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCZ;
  581. min = conact->minloc[2];
  582. max = conact->maxloc[2];
  583. break;
  584. case ACT_CONST_ROTX:
  585. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTX;
  586. min = conact->minrot[0] * (float)MT_RADS_PER_DEG;
  587. max = conact->maxrot[0] * (float)MT_RADS_PER_DEG;
  588. break;
  589. case ACT_CONST_ROTY:
  590. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTY;
  591. min = conact->minrot[1] * (float)MT_RADS_PER_DEG;
  592. max = conact->maxrot[1] * (float)MT_RADS_PER_DEG;
  593. break;
  594. case ACT_CONST_ROTZ:
  595. locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTZ;
  596. min = conact->minrot[2] * (float)MT_RADS_PER_DEG;
  597. max = conact->maxrot[2] * (float)MT_RADS_PER_DEG;
  598. break;
  599. default:
  600. ; /* error */
  601. }
  602. }
  603. KX_ConstraintActuator *tmpconact = new KX_ConstraintActuator(
  604. gameobj,
  605. conact->damp,
  606. conact->rotdamp,
  607. min,
  608. max,
  609. conact->maxrot,
  610. locrot,
  611. conact->time,
  612. conact->flag,
  613. prop);
  614. baseact = tmpconact;
  615. break;
  616. }
  617. case ACT_GROUP:
  618. {
  619. // deprecated
  620. }
  621. break;
  622. case ACT_SCENE:
  623. {
  624. bSceneActuator *sceneact = (bSceneActuator *) bact->data;
  625. STR_String nextSceneName("");
  626. KX_SceneActuator* tmpsceneact;
  627. int mode = KX_SceneActuator::KX_SCENE_NODEF;
  628. KX_Camera *cam = NULL;
  629. //KX_Scene* scene = NULL;
  630. switch (sceneact->type)
  631. {
  632. case ACT_SCENE_RESUME:
  633. case ACT_SCENE_SUSPEND:
  634. case ACT_SCENE_ADD_FRONT:
  635. case ACT_SCENE_ADD_BACK:
  636. case ACT_SCENE_REMOVE:
  637. case ACT_SCENE_SET:
  638. {
  639. switch (sceneact->type)
  640. {
  641. case ACT_SCENE_RESUME:
  642. mode = KX_SceneActuator::KX_SCENE_RESUME;
  643. break;
  644. case ACT_SCENE_SUSPEND:
  645. mode = KX_SceneActuator::KX_SCENE_SUSPEND;
  646. break;
  647. case ACT_SCENE_ADD_FRONT:
  648. mode = KX_SceneActuator::KX_SCENE_ADD_FRONT_SCENE;
  649. break;
  650. case ACT_SCENE_ADD_BACK:
  651. mode = KX_SceneActuator::KX_SCENE_ADD_BACK_SCENE;
  652. break;
  653. case ACT_SCENE_REMOVE:
  654. mode = KX_SceneActuator::KX_SCENE_REMOVE_SCENE;
  655. break;
  656. case ACT_SCENE_SET:
  657. default:
  658. mode = KX_SceneActuator::KX_SCENE_SET_SCENE;
  659. break;
  660. };
  661. if (sceneact->scene) {
  662. nextSceneName = sceneact->scene->id.name + 2;
  663. }
  664. break;
  665. }
  666. case ACT_SCENE_CAMERA:
  667. mode = KX_SceneActuator::KX_SCENE_SET_CAMERA;
  668. if (sceneact->camera)
  669. {
  670. KX_GameObject *tmp = converter->FindGameObject(sceneact->camera);
  671. if (tmp && tmp->GetGameObjectType() == SCA_IObject::OBJ_CAMERA)
  672. cam = (KX_Camera*)tmp;
  673. }
  674. break;
  675. case ACT_SCENE_RESTART:
  676. {
  677. mode = KX_SceneActuator::KX_SCENE_RESTART;
  678. break;
  679. }
  680. default:
  681. ; /* flag error */
  682. }
  683. tmpsceneact = new KX_SceneActuator(
  684. gameobj,
  685. mode,
  686. scene,
  687. ketsjiEngine,
  688. nextSceneName,
  689. cam);
  690. baseact = tmpsceneact;
  691. break;
  692. }
  693. case ACT_GAME:
  694. {
  695. bGameActuator *gameact = (bGameActuator *) bact->data;
  696. KX_GameActuator* tmpgameact;
  697. STR_String filename = maggiename;
  698. STR_String loadinganimationname = "";
  699. int mode = KX_GameActuator::KX_GAME_NODEF;
  700. switch (gameact->type)
  701. {
  702. case ACT_GAME_LOAD:
  703. {
  704. mode = KX_GameActuator::KX_GAME_LOAD;
  705. filename = gameact->filename;
  706. loadinganimationname = gameact->loadaniname;
  707. break;
  708. }
  709. case ACT_GAME_START:
  710. {
  711. mode = KX_GameActuator::KX_GAME_START;
  712. filename = gameact->filename;
  713. loadinganimationname = gameact->loadaniname;
  714. break;
  715. }
  716. case ACT_GAME_RESTART:
  717. {
  718. mode = KX_GameActuator::KX_GAME_RESTART;
  719. break;
  720. }
  721. case ACT_GAME_QUIT:
  722. {
  723. mode = KX_GameActuator::KX_GAME_QUIT;
  724. break;
  725. }
  726. case ACT_GAME_SAVECFG:
  727. {
  728. mode = KX_GameActuator::KX_GAME_SAVECFG;
  729. break;
  730. }
  731. case ACT_GAME_LOADCFG:
  732. {
  733. mode = KX_GameActuator::KX_GAME_LOADCFG;
  734. break;
  735. }
  736. case ACT_GAME_SCREENSHOT:
  737. {
  738. mode = KX_GameActuator::KX_GAME_SCREENSHOT;
  739. filename = gameact->filename;
  740. break;
  741. }
  742. default:
  743. ; /* flag error */
  744. }
  745. tmpgameact = new KX_GameActuator(
  746. gameobj,
  747. mode,
  748. filename,
  749. loadinganimationname,
  750. scene,
  751. ketsjiEngine);
  752. baseact = tmpgameact;
  753. break;
  754. }
  755. case ACT_RANDOM:
  756. {
  757. bRandomActuator *randAct
  758. = (bRandomActuator *) bact->data;
  759. unsigned long seedArg = randAct->seed;
  760. if (seedArg == 0)
  761. {
  762. seedArg = (int)(ketsjiEngine->GetRealTime()*100000.0);
  763. seedArg ^= (intptr_t)randAct;
  764. }
  765. SCA_RandomActuator::KX_RANDOMACT_MODE modeArg
  766. = SCA_RandomActuator::KX_RANDOMACT_NODEF;
  767. SCA_RandomActuator *tmprandomact;
  768. float paraArg1 = 0.0;
  769. float paraArg2 = 0.0;
  770. switch (randAct->distribution) {
  771. case ACT_RANDOM_BOOL_CONST:
  772. modeArg = SCA_RandomActuator::KX_RANDOMACT_BOOL_CONST;
  773. paraArg1 = (float) randAct->int_arg_1;
  774. break;
  775. case ACT_RANDOM_BOOL_UNIFORM:
  776. modeArg = SCA_RandomActuator::KX_RANDOMACT_BOOL_UNIFORM;
  777. break;
  778. case ACT_RANDOM_BOOL_BERNOUILLI:
  779. paraArg1 = randAct->float_arg_1;
  780. modeArg = SCA_RandomActuator::KX_RANDOMACT_BOOL_BERNOUILLI;
  781. break;
  782. case ACT_RANDOM_INT_CONST:
  783. modeArg = SCA_RandomActuator::KX_RANDOMACT_INT_CONST;
  784. paraArg1 = (float) randAct->int_arg_1;
  785. break;
  786. case ACT_RANDOM_INT_UNIFORM:
  787. paraArg1 = (float) randAct->int_arg_1;
  788. paraArg2 = (float) randAct->int_arg_2;
  789. modeArg = SCA_RandomActuator::KX_RANDOMACT_INT_UNIFORM;
  790. break;
  791. case ACT_RANDOM_INT_POISSON:
  792. paraArg1 = randAct->float_arg_1;
  793. modeArg = SCA_RandomActuator::KX_RANDOMACT_INT_POISSON;
  794. break;
  795. case ACT_RANDOM_FLOAT_CONST:
  796. paraArg1 = randAct->float_arg_1;
  797. modeArg = SCA_RandomActuator::KX_RANDOMACT_FLOAT_CONST;
  798. break;
  799. case ACT_RANDOM_FLOAT_UNIFORM:
  800. paraArg1 = randAct->float_arg_1;
  801. paraArg2 = randAct->float_arg_2;
  802. modeArg = SCA_RandomActuator::KX_RANDOMACT_FLOAT_UNIFORM;
  803. break;
  804. case ACT_RANDOM_FLOAT_NORMAL:
  805. paraArg1 = randAct->float_arg_1;
  806. paraArg2 = randAct->float_arg_2;
  807. modeArg = SCA_RandomActuator::KX_RANDOMACT_FLOAT_NORMAL;
  808. break;
  809. case ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL:
  810. paraArg1 = randAct->float_arg_1;
  811. modeArg = SCA_RandomActuator::KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL;
  812. break;
  813. default:
  814. ; /* error */
  815. }
  816. tmprandomact = new SCA_RandomActuator(
  817. gameobj,
  818. seedArg,
  819. modeArg,
  820. paraArg1,
  821. paraArg2,
  822. randAct->propname);
  823. baseact = tmprandomact;
  824. }
  825. break;
  826. case ACT_VISIBILITY:
  827. {
  828. bVisibilityActuator *vis_act = (bVisibilityActuator *) bact->data;
  829. KX_VisibilityActuator * tmp_vis_act = NULL;
  830. bool v = ((vis_act->flag & ACT_VISIBILITY_INVISIBLE) != 0);
  831. bool o = ((vis_act->flag & ACT_VISIBILITY_OCCLUSION) != 0);
  832. bool recursive = ((vis_act->flag & ACT_VISIBILITY_RECURSIVE) != 0);
  833. tmp_vis_act = new KX_VisibilityActuator(gameobj, !v, o, recursive);
  834. baseact = tmp_vis_act;
  835. }
  836. break;
  837. case ACT_STATE:
  838. {
  839. bStateActuator *sta_act = (bStateActuator *) bact->data;
  840. KX_StateActuator * tmp_sta_act = NULL;
  841. tmp_sta_act =
  842. new KX_StateActuator(gameobj, sta_act->type, sta_act->mask);
  843. baseact = tmp_sta_act;
  844. }
  845. break;
  846. case ACT_2DFILTER:
  847. {
  848. bTwoDFilterActuator *_2dfilter = (bTwoDFilterActuator*) bact->data;
  849. SCA_2DFilterActuator *tmp = NULL;
  850. RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode;
  851. switch (_2dfilter->type) {
  852. case ACT_2DFILTER_MOTIONBLUR:
  853. filtermode = RAS_2DFilterManager::RAS_2DFILTER_MOTIONBLUR;
  854. break;
  855. case ACT_2DFILTER_BLUR:
  856. filtermode = RAS_2DFilterManager::RAS_2DFILTER_BLUR;
  857. break;
  858. case ACT_2DFILTER_SHARPEN:
  859. filtermode = RAS_2DFilterManager::RAS_2DFILTER_SHARPEN;
  860. break;
  861. case ACT_2DFILTER_DILATION:
  862. filtermode = RAS_2DFilterManager::RAS_2DFILTER_DILATION;
  863. break;
  864. case ACT_2DFILTER_EROSION:
  865. filtermode = RAS_2DFilterManager::RAS_2DFILTER_EROSION;
  866. break;
  867. case ACT_2DFILTER_LAPLACIAN:
  868. filtermode = RAS_2DFilterManager::RAS_2DFILTER_LAPLACIAN;
  869. break;
  870. case ACT_2DFILTER_SOBEL:
  871. filtermode = RAS_2DFilterManager::RAS_2DFILTER_SOBEL;
  872. break;
  873. case ACT_2DFILTER_PREWITT:
  874. filtermode = RAS_2DFilterManager::RAS_2DFILTER_PREWITT;
  875. break;
  876. case ACT_2DFILTER_GRAYSCALE:
  877. filtermode = RAS_2DFilterManager::RAS_2DFILTER_GRAYSCALE;
  878. break;
  879. case ACT_2DFILTER_SEPIA:
  880. filtermode = RAS_2DFilterManager::RAS_2DFILTER_SEPIA;
  881. break;
  882. case ACT_2DFILTER_INVERT:
  883. filtermode = RAS_2DFilterManager::RAS_2DFILTER_INVERT;
  884. break;
  885. case ACT_2DFILTER_CUSTOMFILTER:
  886. filtermode = RAS_2DFilterManager::RAS_2DFILTER_CUSTOMFILTER;
  887. break;
  888. case ACT_2DFILTER_NOFILTER:
  889. filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER;
  890. break;
  891. case ACT_2DFILTER_DISABLED:
  892. filtermode = RAS_2DFilterManager::RAS_2DFILTER_DISABLED;
  893. break;
  894. case ACT_2DFILTER_ENABLED:
  895. filtermode = RAS_2DFilterManager::RAS_2DFILTER_ENABLED;
  896. break;
  897. default:
  898. filtermode = RAS_2DFilterManager::RAS_2DFILTER_NOFILTER;
  899. break;
  900. }
  901. tmp = new SCA_2DFilterActuator(gameobj, filtermode, _2dfilter->flag,
  902. _2dfilter->float_arg, _2dfilter->int_arg,
  903. ketsjiEngine->GetRasterizer(), scene);
  904. if (_2dfilter->text)
  905. {
  906. char *buf;
  907. // this is some blender specific code
  908. buf = txt_to_buf(_2dfilter->text);
  909. if (buf)
  910. {
  911. tmp->SetShaderText(buf);
  912. MEM_freeN(buf);
  913. }
  914. }
  915. baseact = tmp;
  916. }
  917. break;
  918. case ACT_PARENT:
  919. {
  920. bParentActuator *parAct = (bParentActuator *) bact->data;
  921. int mode = KX_ParentActuator::KX_PARENT_NODEF;
  922. bool addToCompound = true;
  923. bool ghost = true;
  924. KX_GameObject *tmpgob = NULL;
  925. switch (parAct->type) {
  926. case ACT_PARENT_SET:
  927. mode = KX_ParentActuator::KX_PARENT_SET;
  928. tmpgob = converter->FindGameObject(parAct->ob);
  929. addToCompound = !(parAct->flag & ACT_PARENT_COMPOUND);
  930. ghost = !(parAct->flag & ACT_PARENT_GHOST);
  931. break;
  932. case ACT_PARENT_REMOVE:
  933. mode = KX_ParentActuator::KX_PARENT_REMOVE;
  934. tmpgob = NULL;
  935. break;
  936. }
  937. KX_ParentActuator *tmpparact
  938. = new KX_ParentActuator(gameobj,
  939. mode,
  940. addToCompound,
  941. ghost,
  942. tmpgob);
  943. baseact = tmpparact;
  944. break;
  945. }
  946. case ACT_ARMATURE:
  947. {
  948. bArmatureActuator* armAct = (bArmatureActuator*) bact->data;
  949. KX_GameObject *tmpgob = converter->FindGameObject(armAct->target);
  950. KX_GameObject *subgob = converter->FindGameObject(armAct->subtarget);
  951. BL_ArmatureActuator* tmparmact = new BL_ArmatureActuator(
  952. gameobj,
  953. armAct->type,
  954. armAct->posechannel,
  955. armAct->constraint,
  956. tmpgob,
  957. subgob,
  958. armAct->weight,
  959. armAct->influence);
  960. baseact = tmparmact;
  961. break;
  962. }
  963. case ACT_STEERING:
  964. {
  965. bSteeringActuator *stAct = (bSteeringActuator *) bact->data;
  966. KX_GameObject *navmeshob = NULL;
  967. if (stAct->navmesh)
  968. {
  969. PointerRNA settings_ptr;
  970. RNA_pointer_create((ID *)stAct->navmesh, &RNA_GameObjectSettings, stAct->navmesh, &settings_ptr);
  971. if (RNA_enum_get(&settings_ptr, "physics_type") == OB_BODY_TYPE_NAVMESH)
  972. navmeshob = converter->FindGameObject(stAct->navmesh);
  973. }
  974. KX_GameObject *targetob = converter->FindGameObject(stAct->target);
  975. int mode = KX_SteeringActuator::KX_STEERING_NODEF;
  976. switch (stAct->type) {
  977. case ACT_STEERING_SEEK:
  978. mode = KX_SteeringActuator::KX_STEERING_SEEK;
  979. break;
  980. case ACT_STEERING_FLEE:
  981. mode = KX_SteeringActuator::KX_STEERING_FLEE;
  982. break;
  983. case ACT_STEERING_PATHFOLLOWING:
  984. mode = KX_SteeringActuator::KX_STEERING_PATHFOLLOWING;
  985. break;
  986. }
  987. bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0;
  988. bool enableVisualization = (stAct->flag & ACT_STEERING_ENABLEVISUALIZATION) !=0;
  989. short facingMode = (stAct->flag & ACT_STEERING_AUTOMATICFACING) ? stAct->facingaxis : 0;
  990. bool normalup = (stAct->flag & ACT_STEERING_NORMALUP) !=0;
  991. bool lockzvel = (stAct->flag & ACT_STEERING_LOCKZVEL) !=0;
  992. KX_SteeringActuator *tmpstact
  993. = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist,
  994. stAct->velocity, stAct->acceleration, stAct->turnspeed,
  995. selfTerminated, stAct->updateTime,
  996. scene->GetObstacleSimulation(), facingMode, normalup, enableVisualization, lockzvel);
  997. baseact = tmpstact;
  998. break;
  999. }
  1000. case ACT_MOUSE:
  1001. {
  1002. bMouseActuator* mouAct = (bMouseActuator*) bact->data;
  1003. int mode = KX_MouseActuator::KX_ACT_MOUSE_NODEF;
  1004. switch (mouAct->type) {
  1005. case ACT_MOUSE_VISIBILITY:
  1006. {
  1007. mode = KX_MouseActuator::KX_ACT_MOUSE_VISIBILITY;
  1008. break;
  1009. }
  1010. case ACT_MOUSE_LOOK:
  1011. {
  1012. mode = KX_MouseActuator::KX_ACT_MOUSE_LOOK;
  1013. break;
  1014. }
  1015. }
  1016. bool visible = (mouAct->flag & ACT_MOUSE_VISIBLE) != 0;
  1017. bool use_axis[2] = {(mouAct->flag & ACT_MOUSE_USE_AXIS_X) != 0, (mouAct->flag & ACT_MOUSE_USE_AXIS_Y) != 0};
  1018. bool reset[2] = {(mouAct->flag & ACT_MOUSE_RESET_X) != 0, (mouAct->flag & ACT_MOUSE_RESET_Y) != 0};
  1019. bool local[2] = {(mouAct->flag & ACT_MOUSE_LOCAL_X) != 0, (mouAct->flag & ACT_MOUSE_LOCAL_Y) != 0};
  1020. SCA_MouseManager* eventmgr = (SCA_MouseManager*) logicmgr->FindEventManager(SCA_EventManager::MOUSE_EVENTMGR);
  1021. if (eventmgr) {
  1022. KX_MouseActuator* tmpbaseact = new KX_MouseActuator(gameobj,
  1023. ketsjiEngine,
  1024. eventmgr,
  1025. mode,
  1026. visible,
  1027. use_axis,
  1028. mouAct->threshold,
  1029. reset,
  1030. mouAct->object_axis,
  1031. local,
  1032. mouAct->sensitivity,
  1033. mouAct->limit_x,
  1034. mouAct->limit_y);
  1035. baseact = tmpbaseact;
  1036. } else {
  1037. //cout << "\n Couldn't find mouse event manager..."; - should throw an error here...
  1038. }
  1039. break;
  1040. }
  1041. default:
  1042. ; /* generate some error */
  1043. }
  1044. if (baseact && !(bact->flag & ACT_DEACTIVATE))
  1045. {
  1046. baseact->SetExecutePriority(executePriority++);
  1047. uniquename += "#ACT#";
  1048. uniqueint++;
  1049. CIntValue* uniqueval = new CIntValue(uniqueint);
  1050. uniquename += uniqueval->GetText();
  1051. uniqueval->Release();
  1052. baseact->SetName(bact->name);
  1053. baseact->SetLogicManager(logicmgr);
  1054. //gameobj->SetProperty(uniquename,baseact);
  1055. gameobj->AddActuator(baseact);
  1056. converter->RegisterGameActuator(baseact, bact);
  1057. // done with baseact, release it
  1058. baseact->Release();
  1059. }
  1060. else if (baseact)
  1061. baseact->Release();
  1062. bact = bact->next;
  1063. }
  1064. }