Grab.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. void Grab::zero()
  6. {
  7. _immediate=false;
  8. _power=0;
  9. _local_pos.zero();
  10. _actor=null;
  11. }
  12. Grab::Grab() {zero();}
  13. /******************************************************************************/
  14. Grab& Grab::del()
  15. {
  16. if(is())
  17. {
  18. _joint.del();
  19. _grab .del();
  20. zero();
  21. }
  22. return T;
  23. }
  24. Grab& Grab::create(Actor &actor, C Vec &local_pos, Flt power)
  25. {
  26. del();
  27. T._local_pos= local_pos;
  28. T._actor =&actor;
  29. Vec world=local_pos*actor.matrix();
  30. T._grab.create (Ball(0.1f, world), 100, null, true) // increase density (this is needed for Bullet)
  31. .collision(false)
  32. .ray (false);
  33. T._power =power;
  34. T._immediate=true;
  35. T._joint.createSpherical(actor, &_grab, world, Vec(0, 1, 0));
  36. return T;
  37. }
  38. Grab& Grab::pos(C Vec &pos)
  39. {
  40. if(is())
  41. {
  42. Vec world =_local_pos*_actor->matrix();
  43. Bool immediate=(!_actor->cuts() && !_actor->sweep(pos-world));
  44. if(T._immediate!=immediate)
  45. {
  46. T._immediate=immediate;
  47. if(immediate)
  48. {
  49. _grab .pos(world);
  50. _joint.createSpherical(*_actor, &_grab, world, Vec(0, 1, 0));
  51. }else
  52. {
  53. _joint.createDist(*_actor, &_grab, _local_pos, VecZero, 0, 0, &Spring(_power, 5));
  54. }
  55. }
  56. _grab.kinematicMoveTo(pos);
  57. }
  58. return T;
  59. }
  60. /******************************************************************************/
  61. }
  62. /******************************************************************************/