| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /******************************************************************************/
- #include "stdafx.h"
- namespace EE{
- /******************************************************************************/
- void Grab::zero()
- {
- _immediate=false;
- _power=0;
- _local_pos.zero();
- _actor=null;
- }
- Grab::Grab() {zero();}
- /******************************************************************************/
- Grab& Grab::del()
- {
- if(is())
- {
- _joint.del();
- _grab .del();
- zero();
- }
- return T;
- }
- Grab& Grab::create(Actor &actor, C Vec &local_pos, Flt power)
- {
- del();
- T._local_pos= local_pos;
- T._actor =&actor;
- Vec world=local_pos*actor.matrix();
- T._grab.create (Ball(0.1f, world), 100, null, true) // increase density (this is needed for Bullet)
- .collision(false)
- .ray (false);
- T._power =power;
- T._immediate=true;
- T._joint.createSpherical(actor, &_grab, world, Vec(0, 1, 0));
- return T;
- }
- Grab& Grab::pos(C Vec &pos)
- {
- if(is())
- {
- Vec world =_local_pos*_actor->matrix();
- Bool immediate=(!_actor->cuts() && !_actor->sweep(pos-world));
- if(T._immediate!=immediate)
- {
- T._immediate=immediate;
- if(immediate)
- {
- _grab .pos(world);
- _joint.createSpherical(*_actor, &_grab, world, Vec(0, 1, 0));
- }else
- {
- _joint.createDist(*_actor, &_grab, _local_pos, VecZero, 0, 0, &Spring(_power, 5));
- }
- }
- _grab.kinematicMoveTo(pos);
- }
- return T;
- }
- /******************************************************************************/
- }
- /******************************************************************************/
|