106
104
#include "BL_BlenderDataConversion.h"
109
* KX_BLENDERTRUNC needed to round 'almost' zero values to zero, else velocities etc. are incorrectly set
107
* KX_flt_trunc needed to round 'almost' zero values to zero, else velocities etc. are incorrectly set
112
#define KX_BLENDERTRUNC(x) (( x < 0.0001 && x > -0.0001 ) ? 0.0 : x)
110
BLI_INLINE float KX_flt_trunc(const float x)
112
return ( x < 0.0001f && x > -0.0001f ) ? 0.0f : x;
114
115
void BL_ConvertActuators(const char* maggiename,
115
struct Object* blenderobject,
116
KX_GameObject* gameobj,
117
SCA_LogicManager* logicmgr,
119
KX_KetsjiEngine* ketsjiEngine,
120
int activeLayerBitInfo,
121
bool isInActiveLayer,
122
RAS_IRenderTools* rendertools,
123
KX_BlenderSceneConverter* converter
116
struct Object* blenderobject,
117
KX_GameObject* gameobj,
118
SCA_LogicManager* logicmgr,
120
KX_KetsjiEngine* ketsjiEngine,
121
int activeLayerBitInfo,
122
bool isInActiveLayer,
123
RAS_IRenderTools* rendertools,
124
KX_BlenderSceneConverter* converter
127
128
int uniqueint = 0;
148
149
bObjectActuator* obact = (bObjectActuator*) bact->data;
149
150
KX_GameObject* obref = NULL;
150
MT_Vector3 forcevec(KX_BLENDERTRUNC(obact->forceloc[0]),
151
KX_BLENDERTRUNC(obact->forceloc[1]),
152
KX_BLENDERTRUNC(obact->forceloc[2]));
153
MT_Vector3 torquevec(obact->forcerot[0],obact->forcerot[1],obact->forcerot[2]);
154
MT_Vector3 dlocvec ( KX_BLENDERTRUNC(obact->dloc[0]),
155
KX_BLENDERTRUNC(obact->dloc[1]),
156
KX_BLENDERTRUNC(obact->dloc[2]));
157
MT_Vector3 drotvec ( KX_BLENDERTRUNC(obact->drot[0]),obact->drot[1],obact->drot[2]);
158
MT_Vector3 linvelvec ( KX_BLENDERTRUNC(obact->linearvelocity[0]),
159
KX_BLENDERTRUNC(obact->linearvelocity[1]),
160
KX_BLENDERTRUNC(obact->linearvelocity[2]));
161
MT_Vector3 angvelvec ( KX_BLENDERTRUNC(obact->angularvelocity[0]),
162
KX_BLENDERTRUNC(obact->angularvelocity[1]),
163
KX_BLENDERTRUNC(obact->angularvelocity[2]));
151
MT_Vector3 forcevec(KX_flt_trunc(obact->forceloc[0]),
152
KX_flt_trunc(obact->forceloc[1]),
153
KX_flt_trunc(obact->forceloc[2]));
154
MT_Vector3 torquevec(obact->forcerot[0],
157
MT_Vector3 dlocvec(KX_flt_trunc(obact->dloc[0]),
158
KX_flt_trunc(obact->dloc[1]),
159
KX_flt_trunc(obact->dloc[2]));
160
MT_Vector3 drotvec(KX_flt_trunc(obact->drot[0]),
161
obact->drot[1],obact->drot[2]);
162
MT_Vector3 linvelvec(KX_flt_trunc(obact->linearvelocity[0]),
163
KX_flt_trunc(obact->linearvelocity[1]),
164
KX_flt_trunc(obact->linearvelocity[2]));
165
MT_Vector3 angvelvec(KX_flt_trunc(obact->angularvelocity[0]),
166
KX_flt_trunc(obact->angularvelocity[1]),
167
KX_flt_trunc(obact->angularvelocity[2]));
164
168
short damping = obact->damping;
166
170
/* Blender uses a bit vector internally for the local-flags. In */
167
171
/* KX, we have four bools. The compiler should be smart enough */
168
172
/* to do the right thing. We need to explicitly convert here! */
176
180
bitLocalFlag.LinearVelocity = bool((obact->flag & ACT_LIN_VEL_LOCAL)!=0);
177
181
bitLocalFlag.AngularVelocity = bool((obact->flag & ACT_ANG_VEL_LOCAL)!=0);
178
182
bitLocalFlag.ServoControl = bool(obact->type == ACT_OBJECT_SERVO);
183
bitLocalFlag.CharacterMotion = bool(obact->type == ACT_OBJECT_CHARACTER);
184
bitLocalFlag.CharacterJump = bool((obact->flag & ACT_CHAR_JUMP)!=0);
179
185
bitLocalFlag.AddOrSetLinV = bool((obact->flag & ACT_ADD_LIN_VEL)!=0);
186
bitLocalFlag.AddOrSetCharLoc = bool((obact->flag & ACT_ADD_CHAR_LOC)!=0);
180
187
if (obact->reference && bitLocalFlag.ServoControl)
182
189
obref = converter->FindGameObject(obact->reference);
185
KX_ObjectActuator* tmpbaseact = new KX_ObjectActuator(gameobj,
188
torquevec.getValue(),
191
linvelvec.getValue(),
192
angvelvec.getValue(),
192
KX_ObjectActuator* tmpbaseact = new KX_ObjectActuator(
196
torquevec.getValue(),
199
linvelvec.getValue(),
200
angvelvec.getValue(),
196
203
baseact = tmpbaseact;
211
218
if (actact->flag & ACT_IPOCHILD) ipo_flags |= BL_Action::ACT_IPOFLAG_CHILD;
213
220
BL_ActionActuator* tmpbaseact = new BL_ActionActuator(
220
actact->type, // + 1, because Blender starts to count at zero,
224
actact->layer_weight,
228
// Ketsji at 1, because zero is reserved for "NoDef"
227
actact->type, // + 1, because Blender starts to count at zero,
231
actact->layer_weight,
235
// Ketsji at 1, because zero is reserved for "NoDef"
230
237
baseact= tmpbaseact;
238
245
STR_String propframe = (actact->frameProp ? actact->frameProp : "");
240
247
BL_ShapeActionActuator* tmpbaseact = new BL_ShapeActionActuator(
247
actact->type, // + 1, because Blender starts to count at zero,
251
// Ketsji at 1, because zero is reserved for "NoDef"
254
actact->type, // + 1, because Blender starts to count at zero,
257
actact->stridelength);
258
// Ketsji at 1, because zero is reserved for "NoDef"
253
259
baseact= tmpbaseact;
268
274
bool ipo_add = (ipoact->flag & ACT_IPOADD);
270
276
KX_IpoActuator* tmpbaseact = new KX_IpoActuator(
277
ipoact->type + 1, // + 1, because Blender starts to count at zero,
278
// Ketsji at 1, because zero is reserved for "NoDef"
283
ipoact->type + 1, // + 1, because Blender starts to count at zero,
284
// Ketsji at 1, because zero is reserved for "NoDef"
282
288
baseact = tmpbaseact;
334
340
? (char*) msgAct->body
337
KX_NetworkMessageActuator *tmpmsgact =
338
new KX_NetworkMessageActuator(
339
gameobj, // actuator controlling object
340
scene->GetNetworkScene(), // needed for replication
343
KX_NetworkMessageActuator *tmpmsgact = new KX_NetworkMessageActuator(
344
gameobj, // actuator controlling object
345
scene->GetNetworkScene(), // needed for replication
345
350
baseact = tmpmsgact;
386
391
bSound* sound = soundact->sound;
387
392
bool is3d = soundact->flag & ACT_SND_3D_SOUND ? true : false;
388
AUD_Reference<AUD_IFactory> snd_sound;
393
boost::shared_ptr<AUD_IFactory> snd_sound;
389
394
KX_3DSoundSettings settings;
390
395
settings.cone_inner_angle = soundact->sound3D.cone_inner_angle;
391
396
settings.cone_outer_angle = soundact->sound3D.cone_outer_angle;
407
snd_sound = *reinterpret_cast<AUD_Reference<AUD_IFactory>*>(sound->playback_handle);
412
snd_sound = *reinterpret_cast<boost::shared_ptr<AUD_IFactory>*>(sound->playback_handle);
409
414
// if sound shall be 3D but isn't mono, we have to make it mono!
414
AUD_Reference<AUD_IReader> reader = snd_sound->createReader();
419
boost::shared_ptr<AUD_IReader> reader = snd_sound->createReader();
415
420
if (reader->getSpecs().channels != AUD_CHANNELS_MONO)
417
422
AUD_DeviceSpecs specs;
418
423
specs.channels = AUD_CHANNELS_MONO;
419
424
specs.rate = AUD_RATE_INVALID;
420
425
specs.format = AUD_FORMAT_INVALID;
421
snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs);
426
snd_sound = boost::shared_ptr<AUD_IFactory>(new AUD_ChannelMapperFactory(snd_sound, specs));
424
429
catch(AUD_Exception&)
495
KX_SCA_AddObjectActuator* tmpaddact =
496
new KX_SCA_AddObjectActuator(
501
editobact->linVelocity,
502
(editobact->localflag & ACT_EDOB_LOCAL_LINV)!=0,
503
editobact->angVelocity,
504
(editobact->localflag & ACT_EDOB_LOCAL_ANGV)!=0
500
KX_SCA_AddObjectActuator* tmpaddact = new KX_SCA_AddObjectActuator(
505
editobact->linVelocity,
506
(editobact->localflag & ACT_EDOB_LOCAL_LINV) != 0,
507
editobact->angVelocity,
508
(editobact->localflag & ACT_EDOB_LOCAL_ANGV) != 0);
507
510
//editobact->ob to gameobj
508
511
baseact = tmpaddact;
520
523
RAS_MeshObject *tmpmesh = NULL;
521
524
if (editobact->me)
522
525
tmpmesh = BL_ConvertMesh(
529
KX_SCA_ReplaceMeshActuator* tmpreplaceact
530
= new KX_SCA_ReplaceMeshActuator(
534
(editobact->flag & ACT_EDOB_REPLACE_MESH_NOGFX)==0,
535
(editobact->flag & ACT_EDOB_REPLACE_MESH_PHYS)!=0
539
baseact = tmpreplaceact;
533
KX_SCA_ReplaceMeshActuator* tmpreplaceact = new KX_SCA_ReplaceMeshActuator(
537
(editobact->flag & ACT_EDOB_REPLACE_MESH_NOGFX) == 0,
538
(editobact->flag & ACT_EDOB_REPLACE_MESH_PHYS) != 0);
540
baseact = tmpreplaceact;
542
543
case ACT_EDOB_TRACK_TO:
545
546
if (editobact->ob)
546
547
originalval = converter->FindGameObject(editobact->ob);
548
KX_TrackToActuator* tmptrackact
549
= new KX_TrackToActuator(gameobj,
553
blenderobject->trackflag,
554
blenderobject->upflag
556
baseact = tmptrackact;
549
KX_TrackToActuator* tmptrackact = new KX_TrackToActuator(
554
blenderobject->trackflag,
555
blenderobject->upflag);
556
baseact = tmptrackact;
559
559
case ACT_EDOB_DYNAMICS:
561
KX_SCA_DynamicActuator* tmpdynact
562
= new KX_SCA_DynamicActuator(gameobj,
563
editobact->dyn_operation,
561
KX_SCA_DynamicActuator* tmpdynact = new KX_SCA_DynamicActuator(
563
editobact->dyn_operation,
578
577
/* convert settings... degrees in the ui become radians */
580
579
if (conact->type == ACT_CONST_TYPE_ORI) {
581
min = (float)((MT_2_PI * conact->minloc[0])/360.0);
582
max = (float)((MT_2_PI * conact->maxloc[0])/360.0);
580
min = (float)(((float)MT_2_PI * conact->minloc[0]) / 360.0f);
581
max = (float)(((float)MT_2_PI * conact->maxloc[0]) / 360.0f);
583
582
switch (conact->mode) {
584
583
case ACT_CONST_DIRPX:
585
584
locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX;
1003
tmp = new SCA_2DFilterActuator(gameobj, filtermode, _2dfilter->flag,
1004
_2dfilter->float_arg,_2dfilter->int_arg,ketsjiEngine->GetRasterizer(),scene);
1004
tmp = new SCA_2DFilterActuator(gameobj, filtermode, _2dfilter->flag,
1005
_2dfilter->float_arg, _2dfilter->int_arg,
1006
ketsjiEngine->GetRasterizer(), scene);
1006
1008
if (_2dfilter->text)
1056
1057
bArmatureActuator* armAct = (bArmatureActuator*) bact->data;
1057
1058
KX_GameObject *tmpgob = converter->FindGameObject(armAct->target);
1058
1059
KX_GameObject *subgob = converter->FindGameObject(armAct->subtarget);
1059
BL_ArmatureActuator* tmparmact = new BL_ArmatureActuator(gameobj, armAct->type, armAct->posechannel, armAct->constraint, tmpgob, subgob, armAct->weight, armAct->influence);
1060
BL_ArmatureActuator* tmparmact = new BL_ArmatureActuator(
1063
armAct->posechannel,
1060
1069
baseact = tmparmact;