RParticleSystemLoader.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "RParticleSystemLoader.h"
  2. using namespace cocos2d;
  3. using namespace RRP;
  4. #define PROPERTY_BLENDFUNC "blendFunc"
  5. #define PROPERTY_TEXTURE "texture"
  6. #define PROPERTY_DISPLAYFRAME "displayFrame"
  7. typedef std::function<void(Node*, void*)> Setter;
  8. template <class C, class V>
  9. class Accessor {
  10. public:
  11. typedef void (C::*SetFuncV)(V v);
  12. typedef void (C::*SetFuncR)(const V& v);
  13. static Setter New(SetFuncV fn)
  14. {
  15. return [fn](Node* node, void* ptr) {
  16. (((C*)node)->*fn)(*((V*)ptr));
  17. };
  18. }
  19. static Setter New(SetFuncR fn)
  20. {
  21. return [fn](Node* node, void* ptr) {
  22. (((C*)node)->*fn)(*((V*)ptr));
  23. };
  24. }
  25. };
  26. #define VAR(NAME, TYPENAME, TYPE, FUNC) {NAME, Accessor<RParticleSystem, TYPE>::New(&RParticleSystem::set##FUNC) },
  27. static std::map<std::string, Setter> s_setters({
  28. #include "rparticle/RParticleSystemProps.h"
  29. });
  30. namespace redream {
  31. void RParticleSystemLoader::onHandlePropTypeFloat(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, float pFloat, REDReader * ccbReader) {
  32. auto it = s_setters.find(pPropertyName);
  33. if (it != s_setters.end()) {
  34. it->second(pNode, &pFloat);
  35. } else {
  36. NodeLoader::onHandlePropTypeFloat(pNode, pParent, pPropertyName, pFloat, ccbReader);
  37. }
  38. }
  39. void RParticleSystemLoader::onHandlePropTypeInteger(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, int pInteger, REDReader * ccbReader) {
  40. auto it = s_setters.find(pPropertyName);
  41. if (it != s_setters.end()) {
  42. it->second(pNode, &pInteger);
  43. } else {
  44. NodeLoader::onHandlePropTypeInteger(pNode, pParent, pPropertyName, pInteger, ccbReader);
  45. }
  46. }
  47. void RParticleSystemLoader::onHandlePropTypeIntegerLabeled(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, int pInteger, REDReader * ccbReader) {
  48. auto it = s_setters.find(pPropertyName);
  49. if (it != s_setters.end()) {
  50. it->second(pNode, &pInteger);
  51. } else {
  52. NodeLoader::onHandlePropTypeInteger(pNode, pParent, pPropertyName, pInteger, ccbReader);
  53. }
  54. }
  55. void RParticleSystemLoader::onHandlePropTypeFloatXY(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, float * pFloatVar, REDReader * ccbReader) {
  56. auto it = s_setters.find(pPropertyName);
  57. if (it != s_setters.end()) {
  58. Vec2 vec(pFloatVar[0], pFloatVar[1]);
  59. it->second(pNode, &vec);
  60. } else {
  61. NodeLoader::onHandlePropTypeFloatXY(pNode, pParent, pPropertyName, pFloatVar, ccbReader);
  62. }
  63. }
  64. void RParticleSystemLoader::onHandlePropTypeCheck(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, bool pCheck, REDReader * ccbReader) {
  65. auto it = s_setters.find(pPropertyName);
  66. if (it != s_setters.end()) {
  67. it->second(pNode, &pCheck);
  68. } else {
  69. NodeLoader::onHandlePropTypeCheck(pNode, pParent, pPropertyName, pCheck, ccbReader);
  70. }
  71. }
  72. void RParticleSystemLoader::onHandlePropTypeSpriteFrame(Node * pNode, Node * pParent, const char * pPropertyName, SpriteFrame * pFrame, REDReader * ccbReader) {
  73. if(strcmp(pPropertyName, PROPERTY_DISPLAYFRAME) == 0) {
  74. static_cast<RParticleSystem*>(pNode)->setDisplayFrame(pFrame);
  75. } else {
  76. NodeLoader::onHandlePropTypeSpriteFrame(pNode, pParent, pPropertyName, pFrame, ccbReader);
  77. }
  78. //static_cast<ParticleSystemQuad*>(pNode)->setPositionType(ParticleSystem::PositionType::GROUPED);
  79. }
  80. void RParticleSystemLoader::onHandlePropTypeTexture(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, cocos2d::Texture2D * pTexture2D, REDReader * ccbReader)
  81. {
  82. if(strcmp(pPropertyName, PROPERTY_TEXTURE) == 0) {
  83. static_cast<RParticleSystem*>(pNode)->setTexture(pTexture2D);
  84. } else {
  85. NodeLoader::onHandlePropTypeTexture(pNode, pParent, pPropertyName, pTexture2D, ccbReader);
  86. }
  87. }
  88. void RParticleSystemLoader::onHandlePropTypeBlendFunc(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, cocos2d::BlendFunc pBlendFunc, REDReader * ccbReader)
  89. {
  90. if(strcmp(pPropertyName, PROPERTY_BLENDFUNC) == 0) {
  91. static_cast<RParticleSystem*>(pNode)->setBlendFunc(pBlendFunc);
  92. } else {
  93. NodeLoader::onHandlePropTypeBlendFunc(pNode, pParent, pPropertyName, pBlendFunc, ccbReader);
  94. }
  95. }
  96. void RParticleSystemLoader::onHandlePropTypeSeparatorCheck(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, bool check, REDReader * ccbReader) {
  97. auto it = s_setters.find(pPropertyName);
  98. if (it != s_setters.end()) {
  99. it->second(pNode, &check);
  100. } else {
  101. NodeLoader::onHandlePropTypeSeparatorCheck(pNode, pParent, pPropertyName, check, ccbReader);
  102. }
  103. }
  104. void RParticleSystemLoader::onHandlePropTypeMinMaxGradientData(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, RRP::MinMaxGradientData& minMaxGradientData, REDReader * ccbReader) {
  105. auto it = s_setters.find(pPropertyName);
  106. if (it != s_setters.end()) {
  107. it->second(pNode, &minMaxGradientData);
  108. } else {
  109. NodeLoader::onHandlePropTypeMinMaxGradientData(pNode, pParent, pPropertyName, minMaxGradientData, ccbReader);
  110. }
  111. }
  112. void RParticleSystemLoader::onHandlePropTypeMinMaxCurveData(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, RRP::MinMaxCurveData& minMaxCurveData, REDReader * ccbReader) {
  113. auto it = s_setters.find(pPropertyName);
  114. if (it != s_setters.end()) {
  115. it->second(pNode, &minMaxCurveData);
  116. } else {
  117. NodeLoader::onHandlePropTypeMinMaxCurveData(pNode, pParent, pPropertyName, minMaxCurveData, ccbReader);
  118. }
  119. }
  120. void RParticleSystemLoader::onHandlePropTypeEmissionData(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, RRP::EmissionData& emissionData, REDReader * ccbReader) {
  121. auto it = s_setters.find(pPropertyName);
  122. if (it != s_setters.end()) {
  123. it->second(pNode, &emissionData);
  124. } else {
  125. NodeLoader::onHandlePropTypeEmissionData(pNode, pParent, pPropertyName, emissionData, ccbReader);
  126. }
  127. }
  128. void RParticleSystemLoader::onHandlePropTypeFloatXYZ(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, float * pFloatVar, REDReader * ccbReader) {
  129. auto it = s_setters.find(pPropertyName);
  130. if (it != s_setters.end()) {
  131. Vec3 vec(pFloatVar[0], pFloatVar[1], pFloatVar[2]);
  132. it->second(pNode, &vec);
  133. } else {
  134. NodeLoader::onHandlePropTypeFloatXYZ(pNode, pParent, pPropertyName, pFloatVar, ccbReader);
  135. }
  136. }
  137. void RParticleSystemLoader::onHandlePropTypeMaterialFile(cocos2d::Node * pNode, cocos2d::Node * pParent, const char* pPropertyName, const char * materialFile, REDReader * ccbReader) {
  138. auto it = s_setters.find(pPropertyName);
  139. if (it != s_setters.end()) {
  140. std::string str = materialFile;
  141. it->second(pNode, &str);
  142. } else {
  143. NodeLoader::onHandlePropTypeMaterialFile(pNode, pParent, pPropertyName, materialFile, ccbReader);
  144. }
  145. }
  146. void RParticleSystemLoader::onHandlePropTypeString(cocos2d::Node *pNode, cocos2d::Node *pParent, const char *pPropertyName, const char *pString, REDReader *ccbReader) {
  147. auto it = s_setters.find(pPropertyName);
  148. if (it != s_setters.end()) {
  149. std::string str = pString;
  150. it->second(pNode, &str);
  151. } else {
  152. NodeLoader::onHandlePropTypeString(pNode, pParent, pPropertyName, pString, ccbReader);
  153. }
  154. }
  155. }