SignalSender.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /***************************************************************************
  2. SignalVisitor.cpp - description
  3. -------------------
  4. begin : Wed Jan 26 2000
  5. copyright : (C) 2000 by Henrik Enqvist
  6. email : henqvist@excite.com
  7. ***************************************************************************/
  8. #include <cstddef>
  9. #include "Private.h"
  10. #include "SignalSender.h"
  11. #include "Group.h"
  12. #include "Behavior.h"
  13. SignalSender * SignalSender::p_SignalSender = NULL;
  14. SignalSender::SignalSender() {
  15. }
  16. SignalSender::~SignalSender() {
  17. p_SignalSender = NULL;
  18. }
  19. SignalSender * SignalSender::getInstance() {
  20. if (p_SignalSender == NULL) {
  21. p_SignalSender = new SignalSender();
  22. }
  23. return p_SignalSender;
  24. }
  25. void SignalSender::addSignal(int signal, int delay, Group * sender, Group * reciever) {
  26. SignalStruct sig;
  27. sig.signal = signal;
  28. sig.delay = delay;
  29. sig.sender = sender;
  30. sig.reciever = reciever;
  31. // add the signal to the buffer
  32. m_vSignalBuffer.push_back(sig);
  33. }
  34. void SignalSender::addGroup(Group * g) {
  35. EmAssert(g != NULL, "Added NULL as a group to SignalSender");
  36. // TODO: check that the group is not added already
  37. m_vGroup.push_back(g);
  38. }
  39. void SignalSender::clear() {
  40. EM_COUT("SignalSender::clear()", 1);
  41. m_vSignal.clear();
  42. m_vSignalBuffer.clear();
  43. m_vGroup.clear();
  44. }
  45. /* Called each engine tick. */
  46. void SignalSender::tick() {
  47. EM_COUT("SignalSender::tick() " << m_vGroup.size() << " groups", 0);
  48. // use a buffer to avoid changes in m_vSignal during loop
  49. vector<SignalStruct>::iterator sigIter = m_vSignalBuffer.begin();
  50. vector<SignalStruct>::iterator sigEnd = m_vSignalBuffer.end();
  51. for (; sigIter != sigEnd; sigIter++) {
  52. m_vSignal.push_back((*sigIter));
  53. }
  54. m_vSignalBuffer.clear();
  55. // send signals
  56. sigIter = m_vSignal.begin();
  57. sigEnd = m_vSignal.end();
  58. for (; sigIter != sigEnd; ++sigIter) {
  59. // check the delay and re-add it to the buffer
  60. if ((*sigIter).delay > 0) {
  61. (*sigIter).delay--;
  62. m_vSignalBuffer.push_back((*sigIter));
  63. continue;
  64. }
  65. // send to groups
  66. vector<Group*>::iterator groupIter = m_vGroup.begin();
  67. vector<Group*>::iterator groupEnd = m_vGroup.end();
  68. for(; groupIter != groupEnd; ++groupIter) {
  69. if ((*groupIter)->m_iProperties & EM_GROUP_NO_SIGNAL) continue;
  70. // check the address, NULL is multicast
  71. if ((*sigIter).reciever != NULL && (*sigIter).reciever != (*groupIter)) continue;
  72. // call onSignal function i behaviors
  73. // TODO: should use a hashtable for groups
  74. //cerr << "size " << (*groupIter)->m_vBehavior.size() << endl;
  75. // vector<Behavior*>::iterator behIter = (*groupIter)->m_vBehavior.begin();
  76. // vector<Behavior*>::iterator behEnd = (*groupIter)->m_vBehavior.end();
  77. // for (; behIter != behEnd; ++behIter) {
  78. // (*behIter)->onSignal((*sigIter).signal, (*sigIter).sender);
  79. // }
  80. if ((*groupIter)->getBehavior() != NULL) {
  81. (*groupIter)->getBehavior()->onSignal((*sigIter).signal, (*sigIter).sender);
  82. }
  83. }
  84. }
  85. m_vSignal.clear();
  86. }