ParticleModel2D.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. //
  2. // Copyright (c) 2008-2014 the Urho3D project.
  3. //
  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. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. // THE SOFTWARE.
  21. //
  22. #include "Precompiled.h"
  23. #include "Context.h"
  24. #include "ParticleModel2D.h"
  25. #include "ResourceCache.h"
  26. #include "StringUtils.h"
  27. #include "Sprite2D.h"
  28. #include "XMLFile.h"
  29. #include "DebugNew.h"
  30. namespace Urho3D
  31. {
  32. extern const char* URHO2D_CATEGORY;
  33. static const int srcBlendFuncs[] =
  34. {
  35. 1, // GL_ONE
  36. 1, // GL_ONE
  37. 0x0306, // GL_DST_COLOR
  38. 0x0302, // GL_SRC_ALPHA
  39. 0x0302, // GL_SRC_ALPHA
  40. 1, // GL_ONE
  41. 0x0305 // GL_ONE_MINUS_DST_ALPHA
  42. };
  43. static const int destBlendFuncs[] =
  44. {
  45. 0, // GL_ZERO
  46. 1, // GL_ONE
  47. 0, // GL_ZERO
  48. 0x0303, // GL_ONE_MINUS_SRC_ALPHA
  49. 1, // GL_ONE
  50. 0x0303, // GL_ONE_MINUS_SRC_ALPHA
  51. 0x0304 // GL_DST_ALPHA
  52. };
  53. ParticleModel2D::ParticleModel2D(Context* context) : Resource(context),
  54. blendMode_(BLEND_ALPHA),
  55. duration_(-1.0f),
  56. emitterType_(EMITTER_TYPE_GRAVITY),
  57. sourcePositionVariance_(Vector2::ZERO),
  58. maxParticles_(32),
  59. particleLifeSpan_(1.0f),
  60. particleLifeSpanVariance_(0.0f),
  61. startParticleSize_(1.0f),
  62. startParticleSizeVariance_(0.0f),
  63. endParticleSize_(0.0f),
  64. endParticleSizeVariance_(0.0f),
  65. emitAngle_(0.0f),
  66. emitAngleVariance_(0.0f),
  67. speed_(100.0f),
  68. speedVariance_(0.0f),
  69. gravity_(Vector2::ZERO),
  70. radialAcceleration_(0.0f),
  71. radialAccelerationVariance_(0.0f),
  72. tangentialAcceleration_(0.0f),
  73. tangentialAccelerationVariance_(0.0f),
  74. maxRadius_(100.0f),
  75. maxRadiusVariance_(0.0f),
  76. minRadius_(0.0f),
  77. rotatePerSecond_(0.0f),
  78. rotatePerSecondVariance_(0.0f),
  79. startColor_(Color::WHITE),
  80. startColorVariance_(Color::TRANSPARENT),
  81. endColor_(Color::WHITE),
  82. endColorVariance_(Color::TRANSPARENT)
  83. {
  84. }
  85. ParticleModel2D::~ParticleModel2D()
  86. {
  87. }
  88. void ParticleModel2D::RegisterObject(Context* context)
  89. {
  90. context->RegisterFactory<ParticleModel2D>(URHO2D_CATEGORY);
  91. }
  92. bool ParticleModel2D::Load(Deserializer& source)
  93. {
  94. XMLFile xmlFile(context_);
  95. if (!xmlFile.Load(source))
  96. return false;
  97. XMLElement plistElem = xmlFile.GetRoot("plist");
  98. if (!plistElem)
  99. return false;
  100. XMLElement dictElem = plistElem.GetChild();
  101. if (!dictElem || dictElem.GetName() != "dict")
  102. return false;
  103. VariantMap keyValueMapping;
  104. XMLElement keyElem = dictElem.GetChild();
  105. while (keyElem)
  106. {
  107. if (keyElem.GetName() != "key")
  108. return false;
  109. XMLElement valueElem = keyElem.GetNext();
  110. if (!valueElem)
  111. return false;
  112. String key = keyElem.GetValue();
  113. String type = valueElem.GetName();
  114. String value = valueElem.GetValue();
  115. if (type == "integer")
  116. keyValueMapping[key] = ToInt(value);
  117. else if (type == "real")
  118. keyValueMapping[key] = ToFloat(value);
  119. else
  120. keyValueMapping[key] = value;
  121. keyElem = valueElem.GetNext();
  122. }
  123. const String& textureFileName = keyValueMapping["textureFileName"].GetString();
  124. ResourceCache* cache = GetSubsystem<ResourceCache>();
  125. sprite_= cache->GetResource<Sprite2D>(textureFileName);
  126. if (!sprite_)
  127. return false;
  128. int blendFuncSource = keyValueMapping["blendFuncSource"].GetInt();
  129. int blendFuncDestination = keyValueMapping["blendFuncDestination"].GetInt();
  130. blendMode_ = BLEND_ALPHA;
  131. for (int i = 0; i < MAX_BLENDMODES; ++i)
  132. {
  133. if (blendFuncSource == srcBlendFuncs[i] && blendFuncDestination == destBlendFuncs[i])
  134. {
  135. blendMode_ = (BlendMode)i;
  136. break;
  137. }
  138. }
  139. duration_ = keyValueMapping["duration"].GetFloat();
  140. emitterType_ = (EmitterType2D)(int)keyValueMapping["emitterType"].GetFloat();
  141. sourcePositionVariance_.x_ = keyValueMapping["sourcePositionVariancex"].GetFloat();
  142. sourcePositionVariance_.y_ = keyValueMapping["sourcePositionVariancey"].GetFloat();
  143. maxParticles_ = (int)keyValueMapping["maxParticles"].GetFloat();
  144. particleLifeSpan_ = keyValueMapping["particleLifespan"].GetFloat();
  145. particleLifeSpanVariance_ = keyValueMapping["particleLifespanVariance"].GetFloat();
  146. startParticleSize_ = keyValueMapping["startParticleSize"].GetFloat();
  147. startParticleSizeVariance_ = keyValueMapping["startParticleSizeVariance"].GetFloat();
  148. endParticleSize_ = keyValueMapping["finishParticleSize"].GetFloat();
  149. endParticleSizeVariance_ = keyValueMapping["finishParticleSizeVariance"].GetFloat();
  150. emitAngle_ = keyValueMapping["angle"].GetFloat();
  151. emitAngleVariance_ = keyValueMapping["angleVariance"].GetFloat();
  152. speed_ = keyValueMapping["speed"].GetFloat();
  153. speedVariance_ = keyValueMapping["speedVariance"].GetFloat();
  154. gravity_.x_ = keyValueMapping["gravityx"].GetFloat();
  155. gravity_.y_ = keyValueMapping["gravityy"].GetFloat();
  156. radialAcceleration_ = keyValueMapping["radialAcceleration"].GetFloat();
  157. radialAccelerationVariance_ = keyValueMapping["radialAccelVariance"].GetFloat();
  158. tangentialAcceleration_ = keyValueMapping["tangentialAcceleration"].GetFloat();
  159. tangentialAccelerationVariance_ = keyValueMapping["tangentialAccelVariance"].GetFloat();
  160. maxRadius_ = keyValueMapping["maxRadius"].GetFloat();
  161. maxRadiusVariance_ = keyValueMapping["maxRadiusVariance"].GetFloat();
  162. minRadius_ = keyValueMapping["minRadius"].GetFloat();
  163. rotatePerSecond_ = keyValueMapping["rotatePerSecond"].GetFloat();
  164. rotatePerSecondVariance_ = keyValueMapping["rotatePerSecondVariance"].GetFloat();
  165. startColor_.r_ = keyValueMapping["startColorRed"].GetFloat();
  166. startColor_.g_ = keyValueMapping["startColorGreen"].GetFloat();
  167. startColor_.b_ = keyValueMapping["startColorBlue"].GetFloat();
  168. startColor_.a_ = keyValueMapping["startColorAlpha"].GetFloat();
  169. startColorVariance_.r_ = keyValueMapping["startColorVarianceRed"].GetFloat();
  170. startColorVariance_.g_ = keyValueMapping["startColorVarianceGreen"].GetFloat();
  171. startColorVariance_.b_ = keyValueMapping["startColorVarianceBlue"].GetFloat();
  172. startColorVariance_.a_ = keyValueMapping["startColorVarianceAlpha"].GetFloat();
  173. endColor_.r_ = keyValueMapping["finishColorRed"].GetFloat();
  174. endColor_.g_ = keyValueMapping["finishColorGreen"].GetFloat();
  175. endColor_.b_ = keyValueMapping["finishColorBlue"].GetFloat();
  176. endColor_.a_ = keyValueMapping["finishColorAlpha"].GetFloat();
  177. endColorVariance_.r_ = keyValueMapping["finishColorVarianceRed"].GetFloat();
  178. endColorVariance_.g_ = keyValueMapping["finishColorVarianceGreen"].GetFloat();
  179. endColorVariance_.b_ = keyValueMapping["finishColorVarianceBlue"].GetFloat();
  180. endColorVariance_.a_ = keyValueMapping["finishColorVarianceAlpha"].GetFloat();
  181. return true;
  182. }
  183. bool ParticleModel2D::Save(Serializer& dest) const
  184. {
  185. return false;
  186. }
  187. Sprite2D* ParticleModel2D::GetSprite() const
  188. {
  189. return sprite_;
  190. }
  191. }