ParticleModel2D.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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) :
  53. 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>();
  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. // Apply model scale
  140. const float modelScale = 0.01f;
  141. duration_ = keyValueMapping["duration"].GetFloat();
  142. emitterType_ = (EmitterType2D)(int)keyValueMapping["emitterType"].GetFloat();
  143. sourcePositionVariance_.x_ = keyValueMapping["sourcePositionVariancex"].GetFloat() * modelScale;
  144. sourcePositionVariance_.y_ = keyValueMapping["sourcePositionVariancey"].GetFloat() * modelScale;
  145. maxParticles_ = (unsigned)keyValueMapping["maxParticles"].GetFloat();
  146. particleLifeSpan_ = keyValueMapping["particleLifespan"].GetFloat();
  147. particleLifeSpanVariance_ = keyValueMapping["particleLifespanVariance"].GetFloat();
  148. startParticleSize_ = keyValueMapping["startParticleSize"].GetFloat() * modelScale;
  149. startParticleSizeVariance_ = keyValueMapping["startParticleSizeVariance"].GetFloat() * modelScale;
  150. endParticleSize_ = keyValueMapping["finishParticleSize"].GetFloat() * modelScale;
  151. endParticleSizeVariance_ = keyValueMapping["finishParticleSizeVariance"].GetFloat() * modelScale;
  152. emitAngle_ = keyValueMapping["angle"].GetFloat();
  153. emitAngleVariance_ = keyValueMapping["angleVariance"].GetFloat();
  154. speed_ = keyValueMapping["speed"].GetFloat() * modelScale;
  155. speedVariance_ = keyValueMapping["speedVariance"].GetFloat() * modelScale;
  156. gravity_.x_ = keyValueMapping["gravityx"].GetFloat() * modelScale;
  157. gravity_.y_ = keyValueMapping["gravityy"].GetFloat() * modelScale;
  158. radialAcceleration_ = keyValueMapping["radialAcceleration"].GetFloat() * modelScale;
  159. radialAccelerationVariance_ = keyValueMapping["radialAccelVariance"].GetFloat() * modelScale;
  160. tangentialAcceleration_ = keyValueMapping["tangentialAcceleration"].GetFloat() * modelScale;
  161. tangentialAccelerationVariance_ = keyValueMapping["tangentialAccelVariance"].GetFloat() * modelScale;
  162. maxRadius_ = keyValueMapping["maxRadius"].GetFloat() * modelScale;
  163. maxRadiusVariance_ = keyValueMapping["maxRadiusVariance"].GetFloat() * modelScale;
  164. minRadius_ = keyValueMapping["minRadius"].GetFloat() * modelScale;
  165. rotatePerSecond_ = keyValueMapping["rotatePerSecond"].GetFloat();
  166. rotatePerSecondVariance_ = keyValueMapping["rotatePerSecondVariance"].GetFloat();
  167. startColor_.r_ = keyValueMapping["startColorRed"].GetFloat();
  168. startColor_.g_ = keyValueMapping["startColorGreen"].GetFloat();
  169. startColor_.b_ = keyValueMapping["startColorBlue"].GetFloat();
  170. startColor_.a_ = keyValueMapping["startColorAlpha"].GetFloat();
  171. startColorVariance_.r_ = keyValueMapping["startColorVarianceRed"].GetFloat();
  172. startColorVariance_.g_ = keyValueMapping["startColorVarianceGreen"].GetFloat();
  173. startColorVariance_.b_ = keyValueMapping["startColorVarianceBlue"].GetFloat();
  174. startColorVariance_.a_ = keyValueMapping["startColorVarianceAlpha"].GetFloat();
  175. endColor_.r_ = keyValueMapping["finishColorRed"].GetFloat();
  176. endColor_.g_ = keyValueMapping["finishColorGreen"].GetFloat();
  177. endColor_.b_ = keyValueMapping["finishColorBlue"].GetFloat();
  178. endColor_.a_ = keyValueMapping["finishColorAlpha"].GetFloat();
  179. endColorVariance_.r_ = keyValueMapping["finishColorVarianceRed"].GetFloat();
  180. endColorVariance_.g_ = keyValueMapping["finishColorVarianceGreen"].GetFloat();
  181. endColorVariance_.b_ = keyValueMapping["finishColorVarianceBlue"].GetFloat();
  182. endColorVariance_.a_ = keyValueMapping["finishColorVarianceAlpha"].GetFloat();
  183. return true;
  184. }
  185. bool ParticleModel2D::Save(Serializer& dest) const
  186. {
  187. return false;
  188. }
  189. Sprite2D* ParticleModel2D::GetSprite() const
  190. {
  191. return sprite_;
  192. }
  193. }