CCColliderDetector.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /****************************************************************************
  2. Copyright (c) 2013-2017 Chukong Technologies Inc.
  3. http://www.cocos2d-x.org
  4. Permission is hereby granted, free of charge, to any person obtaining a copy
  5. of this software and associated documentation files (the "Software"), to deal
  6. in the Software without restriction, including without limitation the rights
  7. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. copies of the Software, and to permit persons to whom the Software is
  9. furnished to do so, subject to the following conditions:
  10. The above copyright notice and this permission notice shall be included in
  11. all copies or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  15. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  17. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  18. THE SOFTWARE.
  19. ****************************************************************************/
  20. #ifndef __CCCOLLIDERDETECTOR_H__
  21. #define __CCCOLLIDERDETECTOR_H__
  22. #include "editor-support/cocostudio/CCArmatureDefine.h"
  23. #include "editor-support/cocostudio/CCDatas.h"
  24. #include "editor-support/cocostudio/CocosStudioExport.h"
  25. #ifndef PT_RATIO
  26. #define PT_RATIO 32
  27. #endif
  28. #if ENABLE_PHYSICS_CHIPMUNK_DETECT
  29. #include "chipmunk/chipmunk.h"
  30. #elif ENABLE_PHYSICS_BOX2D_DETECT
  31. #include "Box2D/Box2D.h"
  32. #endif
  33. namespace cocostudio {
  34. class Bone;
  35. /**
  36. * @js NA
  37. * @lua NA
  38. */
  39. class CC_STUDIO_DLL ColliderFilter
  40. {
  41. public:
  42. virtual ~ColliderFilter() { }
  43. #if ENABLE_PHYSICS_BOX2D_DETECT
  44. public:
  45. ColliderFilter(uint16 categoryBits = 0x0001, uint16 maskBits = 0xFFFF, int16 groupIndex = 0);
  46. void updateShape(b2Fixture *fixture);
  47. virtual void setCategoryBits(uint16 categoryBits) { _categoryBits = categoryBits; }
  48. virtual uint16 getCategoryBits() const { return _categoryBits; }
  49. virtual void setMaskBits(uint16 maskBits) { _maskBits = maskBits; }
  50. virtual uint16 getMaskBits() const { return _maskBits; }
  51. virtual void setGroupIndex(int16 groupIndex) { _groupIndex = groupIndex; }
  52. virtual int16 getGroupIndex() const { return _groupIndex; }
  53. protected:
  54. uint16 _categoryBits;
  55. uint16 _maskBits;
  56. int16 _groupIndex;
  57. #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
  58. public:
  59. ColliderFilter(cpCollisionType collisionType = 0, cpGroup group = 0);
  60. void updateShape(cpShape *shape);
  61. virtual void setCollisionType(cpCollisionType collisionType) { _collisionType = collisionType; }
  62. virtual cpCollisionType getCollisionType() const { return _collisionType; }
  63. virtual void setGroup(cpGroup group) { _group = group; }
  64. virtual cpGroup getGroup() const { return _group; }
  65. protected:
  66. cpCollisionType _collisionType;
  67. cpGroup _group;
  68. #endif
  69. };
  70. class CC_STUDIO_DLL ColliderBody : public cocos2d::Ref
  71. {
  72. public:
  73. ColliderBody(ContourData *contourData);
  74. ~ColliderBody();
  75. inline ContourData *getContourData() { return _contourData; }
  76. #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT
  77. void setColliderFilter(ColliderFilter *filter);
  78. ColliderFilter *getColliderFilter();
  79. #endif
  80. #if ENABLE_PHYSICS_BOX2D_DETECT
  81. virtual void setB2Fixture(b2Fixture *fixture) { _fixture = fixture; }
  82. virtual b2Fixture *getB2Fixture() const { return _fixture; }
  83. #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
  84. virtual void setShape(cpShape *shape) { _shape = shape; }
  85. virtual cpShape *getShape() const { return _shape; }
  86. #elif ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX
  87. virtual const std::vector<cocos2d::Vec2> &getCalculatedVertexList() const { return _calculatedVertexList; }
  88. #endif
  89. private:
  90. #if ENABLE_PHYSICS_BOX2D_DETECT
  91. b2Fixture *_fixture;
  92. ColliderFilter *_filter;
  93. #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
  94. cpShape *_shape;
  95. ColliderFilter *_filter;
  96. #elif ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX
  97. std::vector<cocos2d::Vec2> _calculatedVertexList;
  98. #endif
  99. ContourData *_contourData;
  100. friend class ColliderDetector;
  101. };
  102. /*
  103. * @brief ContourSprite used to draw the contour of the display
  104. * @js NA
  105. * @lua NA
  106. */
  107. class CC_STUDIO_DLL ColliderDetector : public cocos2d::Ref
  108. {
  109. public:
  110. static ColliderDetector *create();
  111. static ColliderDetector *create(Bone *bone);
  112. public:
  113. /**
  114. * @js ctor
  115. */
  116. ColliderDetector();
  117. /**
  118. * @js NA
  119. * @lua NA
  120. */
  121. ~ColliderDetector(void);
  122. virtual bool init();
  123. virtual bool init(Bone *bone);
  124. void addContourData(ContourData *contourData);
  125. void addContourDataList(cocos2d::Vector<ContourData*> &contourDataList);
  126. void removeContourData(ContourData *contourData);
  127. void removeAll();
  128. void updateTransform(cocos2d::Mat4 &t);
  129. void setActive(bool active);
  130. bool getActive();
  131. const cocos2d::Vector<ColliderBody*>& getColliderBodyList();
  132. #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT
  133. virtual void setColliderFilter(ColliderFilter *filter);
  134. virtual ColliderFilter *getColliderFilter();
  135. #endif
  136. virtual void setBone(Bone *bone) { _bone = bone; }
  137. virtual Bone *getBone() const { return _bone; }
  138. #if ENABLE_PHYSICS_BOX2D_DETECT
  139. virtual void setBody(b2Body *body);
  140. virtual b2Body *getBody() const;
  141. #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
  142. virtual void setBody(cpBody *body);
  143. virtual cpBody *getBody() const;
  144. #endif
  145. protected:
  146. cocos2d::Vector<ColliderBody*> _colliderBodyList;
  147. Bone *_bone;
  148. #if ENABLE_PHYSICS_BOX2D_DETECT
  149. b2Body *_body;
  150. ColliderFilter *_filter;
  151. #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
  152. cpBody *_body;
  153. ColliderFilter *_filter;
  154. #endif
  155. protected:
  156. bool _active;
  157. };
  158. }
  159. #endif /*__CCCOLLIDERDETECTOR_H__*/