Group.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. //#ident "$Id: Group.cpp,v 1.10 2003/06/13 13:39:45 rzr Exp $"
  2. /***************************************************************************
  3. Group.cpp - description
  4. -------------------
  5. begin : Wed Jan 26 2000
  6. copyright : (C) 2000 by Henrik Enqvist
  7. email : henqvist@excite.com
  8. ***************************************************************************/
  9. #include "Private.h"
  10. #include "Group.h"
  11. #include "Visitor.h"
  12. #include "Shape3D.h"
  13. #include "Behavior.h"
  14. #include "BillBoard.h"
  15. #include "CollisionBounds.h"
  16. #include "Sound.h"
  17. #include "Camera.h"
  18. #include "Polygon.h"
  19. #include "SignalSender.h"
  20. #include "Light.h"
  21. Group::Group() {
  22. m_iProperties = 0;
  23. m_iUserProperties = 0;
  24. m_iCollisionGroup = 0;
  25. strncpy(m_Name, "unknown", 256);
  26. p_BillBoard = NULL;
  27. p_CollisionBounds = NULL;
  28. p_Sound = NULL;
  29. p_Camera = NULL;
  30. p_Light = NULL;
  31. p_Parent = NULL;
  32. m_Name[0] = '\0';
  33. m_vChildren.clear();
  34. m_vShape3D.clear();
  35. //m_vBehavior.clear();
  36. p_Behavior = NULL;
  37. EM_COUT("Group::Group()" << endl, 0);
  38. }
  39. Group::~Group() {
  40. this->freeObjects();
  41. }
  42. void Group::freeObjects() {
  43. vector<Group*>::iterator giter = m_vChildren.begin();
  44. vector<Group*>::iterator gend = m_vChildren.end();
  45. for (; giter != gend; ++giter) {
  46. EmAssert(*giter != NULL, "Group::freeObjects group NULL");
  47. delete (*giter);
  48. }
  49. m_vChildren.clear();
  50. vector<Shape3D*>::iterator siter = m_vShape3D.begin();
  51. vector<Shape3D*>::iterator send = m_vShape3D.end();
  52. for (; siter != send; ++siter) {
  53. EmAssert(*siter != NULL, "Group::freeObjects shape NULL");
  54. delete (*siter);
  55. }
  56. m_vShape3D.clear();
  57. // vector<Behavior*>::iterator biter = m_vBehavior.begin();
  58. // vector<Behavior*>::iterator bend = m_vBehavior.end();
  59. // for (; biter != bend; ++biter) {
  60. // EmAssert(*biter != NULL, "Group::freeObjects behavior NULL");
  61. // delete (*biter);
  62. // }
  63. // m_vBehavior.clear();
  64. #ifdef RZR_LIBSTATIC
  65. if (p_Behavior != NULL) p_Behavior->clear(); //!+-rzr reuse allocated obj
  66. #else
  67. if (p_Behavior != NULL) delete p_Behavior;
  68. #endif
  69. if (p_BillBoard != NULL) delete p_BillBoard;
  70. if (p_Camera != NULL) delete p_Camera;
  71. if (p_Light != NULL) delete p_Light;
  72. if (p_Sound != NULL) delete p_Sound;
  73. if (p_CollisionBounds != NULL) delete p_CollisionBounds;
  74. }
  75. void Group::accept(Visitor * v) {
  76. // TODO: if property
  77. v->visit(this);
  78. vector<Group*>::iterator iter = m_vChildren.begin();
  79. vector<Group*>::iterator end = m_vChildren.end();
  80. for ( ; iter != end; iter++) {
  81. (*iter)->accept(v);
  82. }
  83. }
  84. void Group::setName(const char * name) {
  85. strncpy(m_Name, name, 256);
  86. }
  87. const char * Group::getName() {
  88. return m_Name;
  89. }
  90. void Group::add(Group * g) {
  91. if (g == NULL) return;
  92. m_vChildren.push_back(g);
  93. g->setParent(this);
  94. }
  95. void Group::removeGroup(Group * g) {
  96. if (g == NULL) return;
  97. vector<Group*>::iterator iter = m_vChildren.begin();
  98. vector<Group*>::iterator end = m_vChildren.end();
  99. for ( ; iter != end; iter++) {
  100. if ((*iter) == g) {
  101. m_vChildren.erase(iter);
  102. return;
  103. }
  104. }
  105. }
  106. Group * Group::getGroup(int i) {
  107. if (i < 0 || (signed)m_vChildren.size() <= i) return NULL;
  108. return m_vChildren[i];
  109. }
  110. void Group::addShape3D(Shape3D * s) {
  111. if (s == NULL) return;
  112. m_vShape3D.push_back(s);
  113. s->setParent(this);
  114. }
  115. void Group::removeShape3D(Shape3D * s) {
  116. if (s == NULL) return;
  117. vector<Shape3D*>::iterator iter = m_vShape3D.begin();
  118. vector<Shape3D*>::iterator end = m_vShape3D.end();
  119. for (; iter != end; iter++) {
  120. if ((*iter) == s) {
  121. m_vShape3D.erase(iter);
  122. return;
  123. }
  124. }
  125. }
  126. // void Group::addBehavior(Behavior * b, bool signal) {
  127. // if (b == NULL) return;
  128. // m_vBehavior.push_back(b);
  129. // b->setParent(this);
  130. // if (signal) SignalSender::getInstance()->addGroup(this);
  131. // }
  132. void Group::setBehavior(Behavior * b, bool signal) {
  133. p_Behavior = b;
  134. b->setParent(this);
  135. if (b != NULL && signal) {
  136. SignalSender::getInstance()->addGroup(this);
  137. }
  138. }
  139. // void Group::removeBehavior(Behavior * b) {
  140. // if (b == NULL) return;
  141. // vector<Behavior*>::iterator iter = m_vBehavior.begin();
  142. // vector<Behavior*>::iterator end = m_vBehavior.end();
  143. // for (; iter != end; iter++) {
  144. // if ((*iter) == b) {
  145. // m_vBehavior.erase(iter);
  146. // return;
  147. // }
  148. // }
  149. // }
  150. Shape3D * Group::getShape3D(int i) {
  151. if (i < 0 || (signed) m_vShape3D.size() <= i) return NULL;
  152. return m_vShape3D[i];
  153. }
  154. int Group::getShape3DSize() {
  155. return m_vShape3D.size();
  156. }
  157. // Behavior * Group::getBehavior(int i) {
  158. // if (i < 0 || (signed) m_vBehavior.size() <= i) return NULL;
  159. // return m_vBehavior[i];
  160. // }
  161. // int Group::getBehaviorSize() {
  162. // return m_vBehavior.size();
  163. // }
  164. Behavior * Group::getBehavior() {
  165. return p_Behavior;
  166. }
  167. BillBoard * Group::getBillBoard() {
  168. return p_BillBoard;
  169. }
  170. Camera * Group::getCamera() {
  171. return p_Camera;
  172. }
  173. CollisionBounds * Group::getCollisionBounds() {
  174. return p_CollisionBounds;
  175. }
  176. Light * Group::getLight() {
  177. return p_Light;
  178. }
  179. Group * Group::getParent() {
  180. return p_Parent;
  181. }
  182. int Group::getProperties() {
  183. return m_iProperties;
  184. }
  185. int Group::getUserProperties() {
  186. return m_iUserProperties;
  187. }
  188. void Group::setBillBoard(BillBoard * b) {
  189. p_BillBoard = b;
  190. if (b == NULL) return;
  191. b->setParent(this);
  192. }
  193. void Group::setCamera(Camera * c) {
  194. p_Camera = c;
  195. }
  196. void Group::setCollisionBounds(CollisionBounds* cb) {
  197. p_CollisionBounds = cb;
  198. if (cb == NULL) return;
  199. cb->setParent(this);
  200. }
  201. void Group::setSound(Sound * s) {
  202. p_Sound = s;
  203. if (s == NULL) return;
  204. s->setParent(this);
  205. }
  206. void Group::setLight(Light * l) {
  207. p_Light = l;
  208. if (l == NULL) return;
  209. l->setParent(this);
  210. }
  211. void Group::setParent(Group * p) {
  212. p_Parent = p;
  213. }
  214. void Group::setProperty(int p) {
  215. m_iProperties |= p;
  216. }
  217. void Group::setUserProperty(int p) {
  218. m_iUserProperties |= p;
  219. }
  220. /* Sets properties, also set property for all children. */
  221. void Group::setPropertyRecursive(int p) {
  222. m_iProperties |= p;
  223. vector<Group*>::iterator iter = m_vChildren.begin();
  224. vector<Group*>::iterator end = m_vChildren.end();
  225. for ( ; iter != end; iter++) {
  226. (*iter)->setPropertyRecursive(p);
  227. }
  228. }
  229. void Group::unsetProperty(int p) {
  230. m_iProperties -= (m_iProperties & p);
  231. }
  232. void Group::unsetUserProperty(int p) {
  233. m_iUserProperties -= (m_iUserProperties & p);
  234. }
  235. /* Unsets properties, also unset property for all children. */
  236. void Group::unsetPropertyRecursive(int p) {
  237. m_iProperties -= (m_iProperties & p);
  238. vector<Group*>::iterator iter = m_vChildren.begin();
  239. vector<Group*>::iterator end = m_vChildren.end();
  240. for ( ; iter != end; iter++) {
  241. (*iter)->unsetPropertyRecursive(p);
  242. }
  243. }
  244. //TODO: Compute Bounds //!rzr
  245. //EOF $Id: Group.cpp,v 1.10 2003/06/13 13:39:45 rzr Exp $