ParticleModel2D.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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. static const int srcBlendFuncs[] =
  33. {
  34. 1, // GL_ONE
  35. 1, // GL_ONE
  36. 0x0306, // GL_DST_COLOR
  37. 0x0302, // GL_SRC_ALPHA
  38. 0x0302, // GL_SRC_ALPHA
  39. 1, // GL_ONE
  40. 0x0305 // GL_ONE_MINUS_DST_ALPHA
  41. };
  42. static const int destBlendFuncs[] =
  43. {
  44. 0, // GL_ZERO
  45. 1, // GL_ONE
  46. 0, // GL_ZERO
  47. 0x0303, // GL_ONE_MINUS_SRC_ALPHA
  48. 1, // GL_ONE
  49. 0x0303, // GL_ONE_MINUS_SRC_ALPHA
  50. 0x0304 // GL_DST_ALPHA
  51. };
  52. ParticleModel2D::ParticleModel2D(Context* context) : Resource(context),
  53. blendMode_(BLEND_ALPHA),
  54. duration_(-1.0f),
  55. emitterType_(EMITTER_TYPE_GRAVITY),
  56. sourcePositionVariance_(Vector2::ZERO),
  57. maxParticles_(32),
  58. particleLifeSpan_(1.0f),
  59. particleLifeSpanVariance_(0.0f),
  60. startParticleSize_(1.0f),
  61. startParticleSizeVariance_(0.0f),
  62. endParticleSize_(0.0f),
  63. endParticleSizeVariance_(0.0f),
  64. emitAngle_(0.0f),
  65. emitAngleVariance_(0.0f),
  66. speed_(100.0f),
  67. speedVariance_(0.0f),
  68. gravity_(Vector2::ZERO),
  69. radialAcceleration_(0.0f),
  70. radialAccelerationVariance_(0.0f),
  71. tangentialAcceleration_(0.0f),
  72. tangentialAccelerationVariance_(0.0f),
  73. maxRadius_(100.0f),
  74. maxRadiusVariance_(0.0f),
  75. minRadius_(0.0f),
  76. rotatePerSecond_(0.0f),
  77. rotatePerSecondVariance_(0.0f),
  78. startColor_(Color::WHITE),
  79. startColorVariance_(Color::TRANSPARENT),
  80. endColor_(Color::WHITE),
  81. endColorVariance_(Color::TRANSPARENT)
  82. {
  83. }
  84. ParticleModel2D::~ParticleModel2D()
  85. {
  86. }
  87. void ParticleModel2D::RegisterObject(Context* context)
  88. {
  89. context->RegisterFactory<ParticleModel2D>();
  90. }
  91. bool ParticleModel2D::Load(Deserializer& source)
  92. {
  93. XMLFile xmlFile(context_);
  94. if (!xmlFile.Load(source))
  95. return false;
  96. XMLElement plistElem = xmlFile.GetRoot("plist");
  97. if (!plistElem)
  98. return false;
  99. XMLElement dictElem = plistElem.GetChild();
  100. if (!dictElem || dictElem.GetName() != "dict")
  101. return false;
  102. VariantMap keyValueMapping;
  103. XMLElement keyElem = dictElem.GetChild();
  104. while (keyElem)
  105. {
  106. if (keyElem.GetName() != "key")
  107. return false;
  108. XMLElement valueElem = keyElem.GetNext();
  109. if (!valueElem)
  110. return false;
  111. String key = keyElem.GetValue();
  112. String type = valueElem.GetName();
  113. String value = valueElem.GetValue();
  114. if (type == "integer")
  115. keyValueMapping[key] = ToInt(value);
  116. else if (type == "real")
  117. keyValueMapping[key] = ToFloat(value);
  118. else
  119. keyValueMapping[key] = value;
  120. keyElem = valueElem.GetNext();
  121. }
  122. const String& textureFileName = keyValueMapping["textureFileName"].GetString();
  123. ResourceCache* cache = GetSubsystem<ResourceCache>();
  124. sprite_= cache->GetResource<Sprite2D>(textureFileName);
  125. if (!sprite_)
  126. return false;
  127. int blendFuncSource = keyValueMapping["blendFuncSource"].GetInt();
  128. int blendFuncDestination = keyValueMapping["blendFuncDestination"].GetInt();
  129. blendMode_ = BLEND_ALPHA;
  130. for (int i = 0; i < MAX_BLENDMODES; ++i)
  131. {
  132. if (blendFuncSource == srcBlendFuncs[i] && blendFuncDestination == destBlendFuncs[i])
  133. {
  134. blendMode_ = (BlendMode)i;
  135. break;
  136. }
  137. }
  138. duration_ = keyValueMapping["duration"].GetFloat();
  139. emitterType_ = (EmitterType2D)(int)keyValueMapping["emitterType"].GetFloat();
  140. sourcePositionVariance_.x_ = keyValueMapping["sourcePositionVariancex"].GetFloat();
  141. sourcePositionVariance_.y_ = keyValueMapping["sourcePositionVariancey"].GetFloat();
  142. maxParticles_ = (unsigned)keyValueMapping["maxParticles"].GetFloat();
  143. particleLifeSpan_ = keyValueMapping["particleLifespan"].GetFloat();
  144. particleLifeSpanVariance_ = keyValueMapping["particleLifespanVariance"].GetFloat();
  145. startParticleSize_ = keyValueMapping["startParticleSize"].GetFloat();
  146. startParticleSizeVariance_ = keyValueMapping["startParticleSizeVariance"].GetFloat();
  147. endParticleSize_ = keyValueMapping["finishParticleSize"].GetFloat();
  148. endParticleSizeVariance_ = keyValueMapping["finishParticleSizeVariance"].GetFloat();
  149. emitAngle_ = keyValueMapping["angle"].GetFloat();
  150. emitAngleVariance_ = keyValueMapping["angleVariance"].GetFloat();
  151. speed_ = keyValueMapping["speed"].GetFloat();
  152. speedVariance_ = keyValueMapping["speedVariance"].GetFloat();
  153. gravity_.x_ = keyValueMapping["gravityx"].GetFloat();
  154. gravity_.y_ = keyValueMapping["gravityy"].GetFloat();
  155. radialAcceleration_ = keyValueMapping["radialAcceleration"].GetFloat();
  156. radialAccelerationVariance_ = keyValueMapping["radialAccelVariance"].GetFloat();
  157. tangentialAcceleration_ = keyValueMapping["tangentialAcceleration"].GetFloat();
  158. tangentialAccelerationVariance_ = keyValueMapping["tangentialAccelVariance"].GetFloat();
  159. maxRadius_ = keyValueMapping["maxRadius"].GetFloat();
  160. maxRadiusVariance_ = keyValueMapping["maxRadiusVariance"].GetFloat();
  161. minRadius_ = keyValueMapping["minRadius"].GetFloat();
  162. rotatePerSecond_ = keyValueMapping["rotatePerSecond"].GetFloat();
  163. rotatePerSecondVariance_ = keyValueMapping["rotatePerSecondVariance"].GetFloat();
  164. startColor_.r_ = keyValueMapping["startColorRed"].GetFloat();
  165. startColor_.g_ = keyValueMapping["startColorGreen"].GetFloat();
  166. startColor_.b_ = keyValueMapping["startColorBlue"].GetFloat();
  167. startColor_.a_ = keyValueMapping["startColorAlpha"].GetFloat();
  168. startColorVariance_.r_ = keyValueMapping["startColorVarianceRed"].GetFloat();
  169. startColorVariance_.g_ = keyValueMapping["startColorVarianceGreen"].GetFloat();
  170. startColorVariance_.b_ = keyValueMapping["startColorVarianceBlue"].GetFloat();
  171. startColorVariance_.a_ = keyValueMapping["startColorVarianceAlpha"].GetFloat();
  172. endColor_.r_ = keyValueMapping["finishColorRed"].GetFloat();
  173. endColor_.g_ = keyValueMapping["finishColorGreen"].GetFloat();
  174. endColor_.b_ = keyValueMapping["finishColorBlue"].GetFloat();
  175. endColor_.a_ = keyValueMapping["finishColorAlpha"].GetFloat();
  176. endColorVariance_.r_ = keyValueMapping["finishColorVarianceRed"].GetFloat();
  177. endColorVariance_.g_ = keyValueMapping["finishColorVarianceGreen"].GetFloat();
  178. endColorVariance_.b_ = keyValueMapping["finishColorVarianceBlue"].GetFloat();
  179. endColorVariance_.a_ = keyValueMapping["finishColorVarianceAlpha"].GetFloat();
  180. return true;
  181. }
  182. bool ParticleModel2D::Save(Serializer& dest) const
  183. {
  184. return false;
  185. }
  186. Sprite2D* ParticleModel2D::GetSprite() const
  187. {
  188. return sprite_;
  189. }
  190. }