Browse Source

Replace plist particle file with Staring extension particle system (pex).

aster2013 11 years ago
parent
commit
6e5d43a56b

+ 1 - 1
Bin/Data/LuaScripts/25_Urho2DParticle.lua

@@ -47,7 +47,7 @@ function CreateScene()
     camera.orthographic = true
     camera.orthographic = true
     camera:SetOrthoSize(Vector2(graphics.width, graphics.height) * PIXEL_SIZE)
     camera:SetOrthoSize(Vector2(graphics.width, graphics.height) * PIXEL_SIZE)
 
 
-    local particleModel = cache:GetResource("ParticleModel2D", "Urho2D/LavaFlow.plist")
+    local particleModel = cache:GetResource("ParticleModel2D", "Urho2D/sun.pex")
     if particleModel == nil then
     if particleModel == nil then
         return
         return
     end
     end

+ 1 - 1
Bin/Data/Scripts/25_Urho2DParticle.as

@@ -51,7 +51,7 @@ void CreateScene()
     camera.orthographic = true;
     camera.orthographic = true;
     camera.SetOrthoSize(Vector2(graphics.width, graphics.height) * PIXEL_SIZE);
     camera.SetOrthoSize(Vector2(graphics.width, graphics.height) * PIXEL_SIZE);
 
 
-    ParticleModel2D@ particleModel = cache.GetResource("ParticleModel2D", "Urho2D/LavaFlow.plist");
+    ParticleModel2D@ particleModel = cache.GetResource("ParticleModel2D", "Urho2D/sun.pex");
     if (particleModel is null)
     if (particleModel is null)
         return;
         return;
 
 

+ 2 - 2
Bin/Data/Scripts/Editor/AttributeEditor.as

@@ -879,7 +879,7 @@ void InitResourcePicker()
     Array<String> soundFilters = {"*.wav","*.ogg"};
     Array<String> soundFilters = {"*.wav","*.ogg"};
     Array<String> scriptFilters = {"*.as", "*.asc"};
     Array<String> scriptFilters = {"*.as", "*.asc"};
     Array<String> materialFilters = {"*.xml", "*.material"};
     Array<String> materialFilters = {"*.xml", "*.material"};
-    Array<String> plistFilters = {"*.plist"};
+    Array<String> pexFilters = {"*.pex"};
     Array<String> anmFilters = {"*.anm"};
     Array<String> anmFilters = {"*.anm"};
     resourcePickers.Push(ResourcePicker("Animation", "*.ani", ACTION_PICK | ACTION_TEST));
     resourcePickers.Push(ResourcePicker("Animation", "*.ani", ACTION_PICK | ACTION_TEST));
     resourcePickers.Push(ResourcePicker("Font", fontFilters));
     resourcePickers.Push(ResourcePicker("Font", fontFilters));
@@ -894,7 +894,7 @@ void InitResourcePicker()
     resourcePickers.Push(ResourcePicker("Sound", soundFilters));
     resourcePickers.Push(ResourcePicker("Sound", soundFilters));
     resourcePickers.Push(ResourcePicker("Sprite2D", textureFilters, ACTION_PICK | ACTION_OPEN));
     resourcePickers.Push(ResourcePicker("Sprite2D", textureFilters, ACTION_PICK | ACTION_OPEN));
     resourcePickers.Push(ResourcePicker("Animation2D", anmFilters, ACTION_PICK | ACTION_OPEN));
     resourcePickers.Push(ResourcePicker("Animation2D", anmFilters, ACTION_PICK | ACTION_OPEN));
-    resourcePickers.Push(ResourcePicker("ParticleModel2D", plistFilters, ACTION_PICK | ACTION_OPEN));
+    resourcePickers.Push(ResourcePicker("ParticleModel2D", pexFilters, ACTION_PICK | ACTION_OPEN));
 }
 }
 
 
 ResourcePicker@ GetResourcePicker(ShortStringHash resourceType)
 ResourcePicker@ GetResourcePicker(ShortStringHash resourceType)

+ 0 - 100
Bin/Data/Urho2D/LavaFlow.plist

@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>angle</key>
-	<real>0.0</real>
-	<key>angleVariance</key>
-	<real>360</real>
-	<key>blendFuncDestination</key>
-	<integer>1</integer>
-	<key>blendFuncSource</key>
-	<integer>770</integer>
-	<key>duration</key>
-	<real>-1</real>
-	<key>emitterType</key>
-	<real>0.0</real>
-	<key>finishColorAlpha</key>
-	<real>1</real>
-	<key>finishColorBlue</key>
-	<real>0.0</real>
-	<key>finishColorGreen</key>
-	<real>1</real>
-	<key>finishColorRed</key>
-	<real>1</real>
-	<key>finishColorVarianceAlpha</key>
-	<real>0.0</real>
-	<key>finishColorVarianceBlue</key>
-	<real>0.0</real>
-	<key>finishColorVarianceGreen</key>
-	<real>0.0</real>
-	<key>finishColorVarianceRed</key>
-	<real>0.0</real>
-	<key>finishParticleSize</key>
-	<real>0.0</real>
-	<key>finishParticleSizeVariance</key>
-	<real>0.0</real>
-	<key>gravityx</key>
-	<real>0.0</real>
-	<key>gravityy</key>
-	<real>-197.3699951171875</real>
-	<key>maxParticles</key>
-	<real>861</real>
-	<key>maxRadius</key>
-	<real>100</real>
-	<key>maxRadiusVariance</key>
-	<real>0.0</real>
-	<key>minRadius</key>
-	<real>0.0</real>
-	<key>particleLifespan</key>
-	<real>0.46050000190734863</real>
-	<key>particleLifespanVariance</key>
-	<real>0.85530000925064087</real>
-	<key>radialAccelVariance</key>
-	<real>0.0</real>
-	<key>radialAcceleration</key>
-	<real>0.0</real>
-	<key>rotatePerSecond</key>
-	<real>0.0</real>
-	<key>rotatePerSecondVariance</key>
-	<real>0.0</real>
-	<key>sourcePositionVariancex</key>
-	<real>7</real>
-	<key>sourcePositionVariancey</key>
-	<real>7</real>
-	<key>sourcePositionx</key>
-	<real>0</real>
-	<key>sourcePositiony</key>
-	<real>100</real>
-	<key>speed</key>
-	<real>225</real>
-	<key>speedVariance</key>
-	<real>6.5799999237060547</real>
-	<key>startColorAlpha</key>
-	<real>0.090000003576278687</real>
-	<key>startColorBlue</key>
-	<real>0.0</real>
-	<key>startColorGreen</key>
-	<real>0.0</real>
-	<key>startColorRed</key>
-	<real>1</real>
-	<key>startColorVarianceAlpha</key>
-	<real>0.0</real>
-	<key>startColorVarianceBlue</key>
-	<real>0.0</real>
-	<key>startColorVarianceGreen</key>
-	<real>0.0</real>
-	<key>startColorVarianceRed</key>
-	<real>0.0</real>
-	<key>startParticleSize</key>
-	<real>45.049999237060547</real>
-	<key>startParticleSizeVariance</key>
-	<real>29.049999237060547</real>
-	<key>tangentialAccelVariance</key>
-	<real>0.0</real>
-	<key>tangentialAcceleration</key>
-	<real>0.0</real>
-	<key>textureFileName</key>
-	<string>Urho2D/LavaFlow.png</string>
-</dict>
-</plist>

BIN
Bin/Data/Urho2D/LavaFlow.png


+ 39 - 0
Bin/Data/Urho2D/sun.pex

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<particleEmitterConfig>
+  <texture name="sun_particle.png"/>
+  <sourcePosition x="157.97" y="228.41"/>
+  <sourcePositionVariance x="7.00" y="7.00"/>
+  <speed value="260.00"/>
+  <speedVariance value="10.00"/>
+  <particleLifeSpan value="1.0000"/>
+  <particleLifespanVariance value="0.7000"/>
+  <angle value="0.00"/>
+  <angleVariance value="360.00"/>
+  <gravity x="0.00" y="0.00"/>
+  <radialAcceleration value="-380.00"/>
+  <tangentialAcceleration value="-140.00"/>
+  <radialAccelVariance value="0.00"/>
+  <tangentialAccelVariance value="0.00"/>
+  <startColor red="1.00" green="0.00" blue="0.00" alpha="1.00"/>
+  <startColorVariance red="0.00" green="0.00" blue="0.00" alpha="0.00"/>
+  <finishColor red="1.00" green="1.00" blue="0.00" alpha="1.00"/>
+  <finishColorVariance red="0.00" green="0.00" blue="0.00" alpha="0.00"/>
+  <maxParticles value="600"/>
+  <startParticleSize value="60.00"/>
+  <startParticleSizeVariance value="40.00"/>
+  <finishParticleSize value="5.00"/>
+  <FinishParticleSizeVariance value="5.00"/>
+  <duration value="-1.00"/>
+  <emitterType value="0"/>
+  <maxRadius value="100.00"/>
+  <maxRadiusVariance value="0.00"/>
+  <minRadius value="0.00"/>
+  <rotatePerSecond value="0.00"/>
+  <rotatePerSecondVariance value="0.00"/>
+  <blendFuncSource value="772"/>
+  <blendFuncDestination value="771"/>
+  <rotationStart value="0.00"/>
+  <rotationStartVariance value="0.00"/>
+  <rotationEnd value="0.00"/>
+  <rotationEndVariance value="0.00"/>
+</particleEmitterConfig>

BIN
Bin/Data/Urho2D/sun_particle.png


+ 8 - 8
Source/Engine/Urho2D/ParticleEmitter2D.cpp

@@ -89,7 +89,7 @@ void ParticleEmitter2D::Update(const FrameInfo& frame)
     Vector3 worldPosition = GetNode()->GetWorldPosition();
     Vector3 worldPosition = GetNode()->GetWorldPosition();
     float worldScale = GetNode()->GetWorldScale().x_ * PIXEL_SIZE;
     float worldScale = GetNode()->GetWorldScale().x_ * PIXEL_SIZE;
 
 
-    unsigned particleIndex = 0;
+    int particleIndex = 0;
     while (particleIndex < numParticles_)
     while (particleIndex < numParticles_)
     {
     {
         Particle2D& currentParticle = particles_[particleIndex];
         Particle2D& currentParticle = particles_[particleIndex];
@@ -218,7 +218,7 @@ void ParticleEmitter2D::UpdateVertices()
     vertex2.uv_ = Vector2(1.0f, 0.0f);
     vertex2.uv_ = Vector2(1.0f, 0.0f);
     vertex3.uv_ = Vector2(1.0f, 1.0f);
     vertex3.uv_ = Vector2(1.0f, 1.0f);
 
 
-    for (unsigned i = 0; i < numParticles_; ++i)
+    for (int i = 0; i < numParticles_; ++i)
     {
     {
         Particle2D& p = particles_[i];
         Particle2D& p = particles_[i];
 
 
@@ -254,7 +254,7 @@ void ParticleEmitter2D::EmitParticle(const Vector3& worldPosition, float worldAn
     if (numParticles_ >= model_->GetMaxParticles())
     if (numParticles_ >= model_->GetMaxParticles())
         return;
         return;
 
 
-    float lifespan = model_->GetParticleLifeSpan() + model_->GetParticleLifeSpanVariance() * Random(-1.0f, 1.0f);
+    float lifespan = model_->GetParticleLifeSpan() + model_->GetParticleLifespanVariance() * Random(-1.0f, 1.0f);
     if (lifespan <= 0.0f) 
     if (lifespan <= 0.0f) 
         return;
         return;
     
     
@@ -266,7 +266,7 @@ void ParticleEmitter2D::EmitParticle(const Vector3& worldPosition, float worldAn
     particle.startPos_ = Vector2(worldPosition.x_, worldPosition.y_);
     particle.startPos_ = Vector2(worldPosition.x_, worldPosition.y_);
     particle.position_ = particle.startPos_ + model_->GetSourcePositionVariance() * Vector2(Random(-1.0f, 1.0f), Random(-1.0f, 1.0f)) * worldScale;
     particle.position_ = particle.startPos_ + model_->GetSourcePositionVariance() * Vector2(Random(-1.0f, 1.0f), Random(-1.0f, 1.0f)) * worldScale;
 
 
-    float emitAngle = worldAngle + model_->GetEmitAngle() + model_->GetEmitAngleVariance() * Random(-1.0f, 1.0f);
+    float emitAngle = worldAngle + model_->GetAngle() + model_->GetAngleVariance() * Random(-1.0f, 1.0f);
     float speed = worldScale * (model_->GetSpeed() + model_->GetSpeedVariance() * Random(-1.0f, 1.0f));
     float speed = worldScale * (model_->GetSpeed() + model_->GetSpeedVariance() * Random(-1.0f, 1.0f));
     particle.velocity_ = Vector2(Cos(emitAngle), Sin(emitAngle)) * speed;
     particle.velocity_ = Vector2(Cos(emitAngle), Sin(emitAngle)) * speed;
 
 
@@ -276,15 +276,15 @@ void ParticleEmitter2D::EmitParticle(const Vector3& worldPosition, float worldAn
     particle.rotation_ = emitAngle;
     particle.rotation_ = emitAngle;
     particle.rotationDelta_ = model_->GetRotatePerSecond() + model_->GetRotatePerSecondVariance() * Random(-1.0f, 1.0f);
     particle.rotationDelta_ = model_->GetRotatePerSecond() + model_->GetRotatePerSecondVariance() * Random(-1.0f, 1.0f);
 
 
-    particle.radialAccel_ = worldScale * (model_->GetRadialAcceleration() + model_->GetRadialAccelerationVariance() * Random(-1.0f, 1.0f));
-    particle.tangentialAccel_ = worldScale * (model_->GetTangentialAcceleration() + model_->GetTangentialAccelerationVariance() * Random(-1.0f, 1.0f));
+    particle.radialAccel_ = worldScale * (model_->GetRadialAcceleration() + model_->GetRadialAccelVariance() * Random(-1.0f, 1.0f));
+    particle.tangentialAccel_ = worldScale * (model_->GetTangentialAcceleration() + model_->GetTangentialAccelVariance() * Random(-1.0f, 1.0f));
 
 
     particle.size_  = worldScale * Max(0.1f, model_->GetStartParticleSize() + model_->GetStartParticleSizeVariance() * Random(-1.0f, 1.0f));
     particle.size_  = worldScale * Max(0.1f, model_->GetStartParticleSize() + model_->GetStartParticleSizeVariance() * Random(-1.0f, 1.0f));
-    float endParticleSize = worldScale * Max(0.1f, model_->GetEndParticleSize() + model_->GetEndParticleSizeVariance() * Random(-1.0f, 1.0f));
+    float endParticleSize = worldScale * Max(0.1f, model_->GetFinishParticleSize() + model_->GetFinishParticleSizeVariance() * Random(-1.0f, 1.0f));
     particle.sizeDelta_ = (endParticleSize - particle.size_) * invLifespan;
     particle.sizeDelta_ = (endParticleSize - particle.size_) * invLifespan;
 
 
     particle.color_ = model_->GetStartColor() + model_->GetStartColorVariance() * Random(-1.0f, 1.0f);
     particle.color_ = model_->GetStartColor() + model_->GetStartColorVariance() * Random(-1.0f, 1.0f);
-    Color endColor = model_->GetEndColor() + model_->GetEndColorVariance() * Random(-1.0f, 1.0f);
+    Color endColor = model_->GetFinishColor() + model_->GetFinishColorVariance() * Random(-1.0f, 1.0f);
     particle.colorDelta_ = (endColor - particle.color_) * invLifespan;
     particle.colorDelta_ = (endColor - particle.color_) * invLifespan;
 }
 }
 
 

+ 1 - 1
Source/Engine/Urho2D/ParticleEmitter2D.h

@@ -111,7 +111,7 @@ private:
     /// Life time;
     /// Life time;
     float lifeTime_;
     float lifeTime_;
     /// Num particles.
     /// Num particles.
-    unsigned numParticles_;
+    int numParticles_;
     /// Particles.
     /// Particles.
     Vector<Particle2D> particles_;
     Vector<Particle2D> particles_;
     /// Time to emit particle.
     /// Time to emit particle.

+ 258 - 104
Source/Engine/Urho2D/ParticleModel2D.cpp

@@ -22,6 +22,7 @@
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
 #include "Context.h"
 #include "Context.h"
+#include "FileSystem.h"
 #include "ParticleModel2D.h"
 #include "ParticleModel2D.h"
 #include "ResourceCache.h"
 #include "ResourceCache.h"
 #include "StringUtils.h"
 #include "StringUtils.h"
@@ -57,35 +58,40 @@ static const int destBlendFuncs[] =
 
 
 ParticleModel2D::ParticleModel2D(Context* context) :
 ParticleModel2D::ParticleModel2D(Context* context) :
     Resource(context),
     Resource(context),
-    blendMode_(BLEND_ALPHA),
+    sourcePosition_(157.97f, 228.41f),// Values from sun.pex
+    sourcePositionVariance_(7.0f, 7.0f),
+    speed_(260.0f),
+    speedVariance_(10.0f),
+    particleLifeSpan_(1.000f),
+    particleLifespanVariance_(0.700f),
+    angle_(0.0f),
+    angleVariance_(360.0f),
+    gravity_(0.0f, 0.0f),
+    radialAcceleration_(-380.0f),
+    tangentialAcceleration_(-140.0f),
+    radialAccelVariance_(0.0f),
+    tangentialAccelVariance_(0.0f),
+    startColor_(1.0f, 0.0f, 0.0f, 1.0f),
+    startColorVariance_(0.0f, 0.0f, 0.0f, 0.0f),
+    finishColor_(1.0f, 1.0f, 0.0f, 1.0f),
+    finishColorVariance_(0.0f, 0.0f, 0.0f, 0.0f),
+    maxParticles_(600),
+    startParticleSize_(60.0f),
+    startParticleSizeVariance_(40.0f),
+    finishParticleSize_(5.0f),
+    FinishParticleSizeVariance_(5.0f),
     duration_(-1.0f),
     duration_(-1.0f),
     emitterType_(EMITTER_TYPE_GRAVITY),
     emitterType_(EMITTER_TYPE_GRAVITY),
-    sourcePositionVariance_(Vector2::ZERO),
-    maxParticles_(32),
-    particleLifeSpan_(1.0f),
-    particleLifeSpanVariance_(0.0f),
-    startParticleSize_(1.0f),
-    startParticleSizeVariance_(0.0f),
-    endParticleSize_(0.0f),
-    endParticleSizeVariance_(0.0f),
-    emitAngle_(0.0f),
-    emitAngleVariance_(0.0f),
-    speed_(100.0f),
-    speedVariance_(0.0f),
-    gravity_(Vector2::ZERO),
-    radialAcceleration_(0.0f),
-    radialAccelerationVariance_(0.0f),
-    tangentialAcceleration_(0.0f),
-    tangentialAccelerationVariance_(0.0f),
     maxRadius_(100.0f),
     maxRadius_(100.0f),
     maxRadiusVariance_(0.0f),
     maxRadiusVariance_(0.0f),
     minRadius_(0.0f),
     minRadius_(0.0f),
     rotatePerSecond_(0.0f),
     rotatePerSecond_(0.0f),
     rotatePerSecondVariance_(0.0f),
     rotatePerSecondVariance_(0.0f),
-    startColor_(Color::WHITE),
-    startColorVariance_(Color::TRANSPARENT),
-    endColor_(Color::WHITE),
-    endColorVariance_(Color::TRANSPARENT)
+    blendMode_(BLEND_ALPHA),
+    rotationStart_(0.0f),
+    rotationStartVariance_(0.0f),
+    rotationEnd_(0.0f),
+    rotationEndVariance_(0.0f)
 {
 {
 }
 }
 
 
@@ -104,47 +110,62 @@ bool ParticleModel2D::Load(Deserializer& source)
     if (!xmlFile.Load(source))
     if (!xmlFile.Load(source))
         return false;
         return false;
 
 
-    XMLElement plistElem = xmlFile.GetRoot("plist");
-    if (!plistElem)
-        return false;
-
-    XMLElement dictElem = plistElem.GetChild();
-    if (!dictElem || dictElem.GetName() != "dict")
+    XMLElement rootElem = xmlFile.GetRoot("particleEmitterConfig");
+    if (!rootElem)
         return false;
         return false;
 
 
-    VariantMap keyValueMapping;
-    XMLElement keyElem = dictElem.GetChild();
-    while (keyElem)
-    {
-        if (keyElem.GetName() != "key")
-            return false;
-
-        XMLElement valueElem = keyElem.GetNext();
-        if (!valueElem)
-            return false;
-
-        String key = keyElem.GetValue();
-        String type = valueElem.GetName();
-        String value = valueElem.GetValue();
-
-        if (type == "integer")
-            keyValueMapping[key] = ToInt(value);
-        else if (type == "real")
-            keyValueMapping[key] = ToFloat(value);
-        else
-            keyValueMapping[key] = value;
-
-        keyElem = valueElem.GetNext();
-    }
-
-    const String& textureFileName = keyValueMapping["textureFileName"].GetString();
+    String texture = rootElem.GetChild("texture").GetAttribute("name");
     ResourceCache* cache = GetSubsystem<ResourceCache>();
     ResourceCache* cache = GetSubsystem<ResourceCache>();
-    sprite_= cache->GetResource<Sprite2D>(textureFileName);
+    sprite_= cache->GetResource<Sprite2D>(GetParentPath(GetName()) + texture);
     if (!sprite_)
     if (!sprite_)
         return false;
         return false;
 
 
-    int blendFuncSource = keyValueMapping["blendFuncSource"].GetInt();
-    int blendFuncDestination = keyValueMapping["blendFuncDestination"].GetInt();
+    sourcePosition_ = ReadVector2(rootElem.GetChild("sourcePosition"));
+    sourcePositionVariance_ = ReadVector2(rootElem.GetChild("sourcePositionVariance"));
+
+    speed_ = rootElem.GetChild("speed").GetFloat("value");
+    speedVariance_ = rootElem.GetChild("speedVariance").GetFloat("value");
+    
+    particleLifeSpan_ = rootElem.GetChild("particleLifeSpan").GetFloat("value");
+    particleLifespanVariance_ = rootElem.GetChild("particleLifespanVariance").GetFloat("value");
+    
+    angle_ = 360.0f - rootElem.GetChild("angle").GetFloat("value");
+    angleVariance_ = rootElem.GetChild("angleVariance").GetFloat("value");
+    
+    gravity_ = ReadVector2(rootElem.GetChild("gravity"));
+
+    radialAcceleration_ = rootElem.GetChild("radialAcceleration").GetFloat("value");
+    tangentialAcceleration_ = -rootElem.GetChild("tangentialAcceleration").GetFloat("value");
+    
+    radialAccelVariance_ = rootElem.GetChild("radialAccelVariance").GetFloat("value");
+    tangentialAccelVariance_ = rootElem.GetChild("tangentialAccelVariance").GetFloat("value");
+
+    startColor_ = ReadColor(rootElem.GetChild("startColor"));
+    startColorVariance_ = ReadColor(rootElem.GetChild("startColorVariance"));
+    
+    finishColor_ = ReadColor(rootElem.GetChild("finishColor"));
+    finishColorVariance_ = ReadColor(rootElem.GetChild("finishColorVariance"));
+
+    maxParticles_ = rootElem.GetChild("maxParticles").GetInt("value");
+    
+    startParticleSize_ = rootElem.GetChild("startParticleSize").GetFloat("value");
+    startParticleSizeVariance_ = rootElem.GetChild("startParticleSizeVariance").GetFloat("value");
+    
+    finishParticleSize_ = rootElem.GetChild("finishParticleSize").GetFloat("value");
+    FinishParticleSizeVariance_ = rootElem.GetChild("FinishParticleSizeVariance").GetFloat("value");
+    
+    duration_ = rootElem.GetChild("duration").GetFloat("value");
+    emitterType_ = (EmitterType2D)rootElem.GetChild("emitterType").GetInt("value");
+    
+    maxRadius_ = rootElem.GetChild("maxRadius").GetFloat("value");
+    maxRadiusVariance_ = rootElem.GetChild("maxRadiusVariance").GetFloat("value");
+    minRadius_ = rootElem.GetChild("minRadius").GetFloat("value");
+
+    rotatePerSecond_ = -rootElem.GetChild("rotatePerSecond").GetFloat("value");
+    rotatePerSecondVariance_ = rootElem.GetChild("rotatePerSecondVariance").GetFloat("value");
+    
+    int blendFuncSource = rootElem.GetChild("blendFuncSource").GetInt("value");
+    int blendFuncDestination = rootElem.GetChild("blendFuncDestination").GetInt("value");
     blendMode_ = BLEND_ALPHA;
     blendMode_ = BLEND_ALPHA;
     for (int i = 0; i < MAX_BLENDMODES; ++i)
     for (int i = 0; i < MAX_BLENDMODES; ++i)
     {
     {
@@ -155,71 +176,204 @@ bool ParticleModel2D::Load(Deserializer& source)
         }
         }
     }
     }
 
 
-    duration_ = keyValueMapping["duration"].GetFloat();
-    emitterType_ = (EmitterType2D)(int)keyValueMapping["emitterType"].GetFloat();
+    rotationStart_ = -rootElem.GetChild("rotationStart").GetFloat("value");
+    rotationStartVariance_ = rootElem.GetChild("rotationStartVariance").GetFloat("value");
+    
+    rotationEnd_ = -rootElem.GetChild("rotationEnd").GetFloat("value");
+    rotationEndVariance_ = rootElem.GetChild("rotationEndVariance").GetFloat("value");
+
+    return true;
+}
+
+bool ParticleModel2D::Save(Serializer& dest) const
+{
+    return false;
+}
+
+void ParticleModel2D::SetSourcePosition(const Vector2& sourcePosition)
+{
+    sourcePosition_ = sourcePosition;
+}
+
+void ParticleModel2D::SetSourcePositionVariance(const Vector2& sourcePositionVariance)
+{
+    sourcePositionVariance_ = sourcePositionVariance;
+}
+
+void ParticleModel2D::SetSpeed(float speed)
+{
+    speed_ = speed;
+}
 
 
-    sourcePositionVariance_.x_ = keyValueMapping["sourcePositionVariancex"].GetFloat();
-    sourcePositionVariance_.y_ = keyValueMapping["sourcePositionVariancey"].GetFloat();    
+void ParticleModel2D::SetSpeedVariance(float speedVariance)
+{
+    speedVariance_ = speedVariance;
+}
 
 
-    maxParticles_ = (unsigned)keyValueMapping["maxParticles"].GetFloat();
-    particleLifeSpan_ = keyValueMapping["particleLifespan"].GetFloat();
+void ParticleModel2D::SetParticleLifeSpan(float particleLifeSpan)
+{
+    particleLifeSpan_ = particleLifeSpan;
+}
 
 
-    particleLifeSpanVariance_ = keyValueMapping["particleLifespanVariance"].GetFloat();
-    startParticleSize_ = keyValueMapping["startParticleSize"].GetFloat();
-    startParticleSizeVariance_ = keyValueMapping["startParticleSizeVariance"].GetFloat();
-    endParticleSize_ = keyValueMapping["finishParticleSize"].GetFloat();
-    endParticleSizeVariance_ = keyValueMapping["finishParticleSizeVariance"].GetFloat();
-    emitAngle_ = keyValueMapping["angle"].GetFloat();
-    emitAngleVariance_ = keyValueMapping["angleVariance"].GetFloat();
+void ParticleModel2D::SetParticleLifespanVariance(float particleLifespanVariance)
+{
+    particleLifespanVariance_ = particleLifespanVariance;
+}
 
 
-    speed_ = keyValueMapping["speed"].GetFloat();
-    speedVariance_ = keyValueMapping["speedVariance"].GetFloat();
+void ParticleModel2D::SetAngle(float angle)
+{
+    angle_ = angle;
+}
 
 
-    gravity_.x_ = keyValueMapping["gravityx"].GetFloat();
-    gravity_.y_ = keyValueMapping["gravityy"].GetFloat();
+void ParticleModel2D::SetAngleVariance(float angleVariance)
+{
+    angleVariance_ = angleVariance;
+}
 
 
-    radialAcceleration_ = keyValueMapping["radialAcceleration"].GetFloat();
-    radialAccelerationVariance_ = keyValueMapping["radialAccelVariance"].GetFloat();
-    tangentialAcceleration_ = keyValueMapping["tangentialAcceleration"].GetFloat();
-    tangentialAccelerationVariance_ = keyValueMapping["tangentialAccelVariance"].GetFloat();
+void ParticleModel2D::SetGravity(const Vector2& gravity)
+{
+    gravity_ = gravity;
+}
 
 
-    maxRadius_ = keyValueMapping["maxRadius"].GetFloat();
-    maxRadiusVariance_ = keyValueMapping["maxRadiusVariance"].GetFloat();
-    minRadius_ = keyValueMapping["minRadius"].GetFloat();
-    rotatePerSecond_ = keyValueMapping["rotatePerSecond"].GetFloat();
-    rotatePerSecondVariance_ = keyValueMapping["rotatePerSecondVariance"].GetFloat();
+void ParticleModel2D::SetRadialAcceleration(float radialAcceleration)
+{
+    radialAcceleration_ = radialAcceleration;
+}
 
 
-    startColor_.r_ = keyValueMapping["startColorRed"].GetFloat();
-    startColor_.g_ = keyValueMapping["startColorGreen"].GetFloat();
-    startColor_.b_ = keyValueMapping["startColorBlue"].GetFloat();
-    startColor_.a_ = keyValueMapping["startColorAlpha"].GetFloat();
+void ParticleModel2D::SetTangentialAcceleration(float tangentialAcceleration)
+{
+    tangentialAcceleration_ = tangentialAcceleration;
+}
 
 
-    startColorVariance_.r_ = keyValueMapping["startColorVarianceRed"].GetFloat();
-    startColorVariance_.g_ = keyValueMapping["startColorVarianceGreen"].GetFloat();
-    startColorVariance_.b_ = keyValueMapping["startColorVarianceBlue"].GetFloat();
-    startColorVariance_.a_ = keyValueMapping["startColorVarianceAlpha"].GetFloat();
+void ParticleModel2D::SetRadialAccelVariance(float radialAccelVariance)
+{
+    radialAccelVariance_ = radialAccelVariance;
+}
 
 
-    endColor_.r_ = keyValueMapping["finishColorRed"].GetFloat();
-    endColor_.g_ = keyValueMapping["finishColorGreen"].GetFloat();
-    endColor_.b_ = keyValueMapping["finishColorBlue"].GetFloat();
-    endColor_.a_ = keyValueMapping["finishColorAlpha"].GetFloat();
+void ParticleModel2D::SetTangentialAccelVariance(float tangentialAccelVariance)
+{
+    tangentialAccelVariance_ = tangentialAccelVariance;
+}
 
 
-    endColorVariance_.r_ = keyValueMapping["finishColorVarianceRed"].GetFloat();
-    endColorVariance_.g_ = keyValueMapping["finishColorVarianceGreen"].GetFloat();
-    endColorVariance_.b_ = keyValueMapping["finishColorVarianceBlue"].GetFloat();
-    endColorVariance_.a_ = keyValueMapping["finishColorVarianceAlpha"].GetFloat();
+void ParticleModel2D::SetStartColor(const Color& startColor)
+{
+    startColor_ = startColor;
+}
 
 
-    return true;
+void ParticleModel2D::SetStartColorVariance(const Color& startColorVariance)
+{
+    startColorVariance_ = startColorVariance;
 }
 }
 
 
-bool ParticleModel2D::Save(Serializer& dest) const
+void ParticleModel2D::SetFinishColor(const Color& finishColor)
 {
 {
-    return false;
+    finishColor_ = finishColor;
+}
+
+void ParticleModel2D::SetFinishColorVariance(const Color& finishColorVariance)
+{
+    finishColorVariance_ = finishColorVariance;
+}
+
+void ParticleModel2D::SetMaxParticles(int maxParticles)
+{
+    maxParticles_ = maxParticles;
+}
+
+void ParticleModel2D::SetStartParticleSize(float startParticleSize)
+{
+    startParticleSize_ = startParticleSize;
+}
+
+void ParticleModel2D::SetStartParticleSizeVariance(float startParticleSizeVariance)
+{
+    startParticleSizeVariance_ = startParticleSizeVariance;
+}
+
+void ParticleModel2D::SetFinishParticleSize(float finishParticleSize)
+{
+    finishParticleSize_ = finishParticleSize;
+}
+
+void ParticleModel2D::SetFinishParticleSizeVariance(float FinishParticleSizeVariance)
+{
+    FinishParticleSizeVariance_ = FinishParticleSizeVariance;
+}
+
+void ParticleModel2D::SetDuration(float duration)
+{
+    duration_ = duration;
+}
+
+void ParticleModel2D::SetEmitterType(EmitterType2D emitterType)
+{
+    emitterType_ = emitterType;
+}
+
+void ParticleModel2D::SetMaxRadius(float maxRadius)
+{
+    maxRadius_ = maxRadius;
+}
+
+void ParticleModel2D::SetMaxRadiusVariance(float maxRadiusVariance)
+{
+    maxRadiusVariance_ = maxRadiusVariance;
+}
+
+void ParticleModel2D::SetMinRadius(float minRadius)
+{
+    minRadius_ = minRadius;
+}
+
+void ParticleModel2D::SetRotatePerSecond(float rotatePerSecond)
+{
+    rotatePerSecond_ = rotatePerSecond;
+}
+
+void ParticleModel2D::SetRotatePerSecondVariance(float rotatePerSecondVariance)
+{
+    rotatePerSecondVariance_ = rotatePerSecondVariance;
+}
+
+void ParticleModel2D::SetBlendMode(BlendMode blendMode)
+{
+    blendMode_ = blendMode;
+}
+
+void ParticleModel2D::SetRotationStart(float rotationStart)
+{
+    rotationStart_ = rotationStart;
+}
+
+void ParticleModel2D::SetRotationStartVariance(float rotationStartVariance)
+{
+    rotationStartVariance_ = rotationStartVariance;
+}
+
+void ParticleModel2D::SetRotationEnd(float rotationEnd)
+{
+    rotationEnd_ = rotationEnd;
+}
+
+void ParticleModel2D::SetRotationEndVariance(float rotationEndVariance)
+{
+    rotationEndVariance_ = rotationEndVariance;
+}
+
+Color ParticleModel2D::ReadColor(const XMLElement& element) const
+{
+    Color color;
+    color.r_ = element.GetFloat("red");
+    color.g_ = element.GetFloat("green");
+    color.b_ = element.GetFloat("blue");
+    color.a_ = element.GetFloat("alpha");
+    return color;
 }
 }
 
 
-Sprite2D* ParticleModel2D::GetSprite() const
+Vector2 ParticleModel2D::ReadVector2(const XMLElement& element) const
 {
 {
-    return sprite_;
+    // Flip y.
+    return Vector2(element.GetFloat("x"), -element.GetFloat("y"));
 }
 }
 
 
 }
 }

+ 172 - 73
Source/Engine/Urho2D/ParticleModel2D.h

@@ -28,6 +28,7 @@
 namespace Urho3D
 namespace Urho3D
 {
 {
 
 
+class XMLElement;
 class Sprite2D;
 class Sprite2D;
 
 
 /// 2D particle emitter types.
 /// 2D particle emitter types.
@@ -37,7 +38,7 @@ enum EmitterType2D
     EMITTER_TYPE_RADIAL
     EMITTER_TYPE_RADIAL
 };
 };
 
 
-/// 2D particle emitter component.
+/// 2D particle effect resource.
 class URHO3D_API ParticleModel2D : public Resource
 class URHO3D_API ParticleModel2D : public Resource
 {
 {
     OBJECT(ParticleModel2D);
     OBJECT(ParticleModel2D);
@@ -55,48 +56,127 @@ public:
     /// Save resource. Return true if successful.
     /// Save resource. Return true if successful.
     virtual bool Save(Serializer& dest) const;
     virtual bool Save(Serializer& dest) const;
 
 
+    /// Set sprite.
+    void SetSprite(const String& sprite);
+    /// Set source position.
+    void SetSourcePosition(const Vector2& sourcePosition);
+    /// Set source position variance.
+    void SetSourcePositionVariance(const Vector2& sourcePositionVariance);
+    /// Set speed.
+    void SetSpeed(float speed);
+    /// Set speed variance.
+    void SetSpeedVariance(float speedVariance);
+    /// Set particle lifespan.
+    void SetParticleLifeSpan(float particleLifeSpan);
+    /// Set particle lifespan variance.
+    void SetParticleLifespanVariance(float particleLifespanVariance);
+    /// Set angle.
+    void SetAngle(float angle);
+    /// Set angle variance.
+    void SetAngleVariance(float angleVariance);
+    /// Set gravity.
+    void SetGravity(const Vector2& gravity);
+    /// Set radial acceleration.
+    void SetRadialAcceleration(float radialAcceleration);
+    /// Set tangential acceleration.
+    void SetTangentialAcceleration(float tangentialAcceleration);
+    /// Set radial acceleration variance.
+    void SetRadialAccelVariance(float radialAccelVariance);
+    /// Set tangential acceleration variance.
+    void SetTangentialAccelVariance(float tangentialAccelVariance);
+    /// Set start color.
+    void SetStartColor(const Color& startColor);
+    /// Set start color variance.
+    void SetStartColorVariance(const Color& startColorVariance);
+    /// Set finish color.
+    void SetFinishColor(const Color& finishColor);
+    /// Set finish color variance.
+    void SetFinishColorVariance(const Color& finishColorVariance);
+    /// Set max particles.
+    void SetMaxParticles(int maxParticles);
+    /// Set start particle size.
+    void SetStartParticleSize(float startParticleSize);
+    /// Set start particle size variance.
+    void SetStartParticleSizeVariance(float startParticleSizeVariance);
+    /// Set finish particle size.
+    void SetFinishParticleSize(float finishParticleSize);
+    /// Set finish particle size variance.
+    void SetFinishParticleSizeVariance(float FinishParticleSizeVariance);
+    /// Set duration.
+    void SetDuration(float duration);
+    /// Set emitter type.
+    void SetEmitterType(EmitterType2D emitterType);
+    /// Set max radius.
+    void SetMaxRadius(float maxRadius);
+    /// Set max radius variance.
+    void SetMaxRadiusVariance(float maxRadiusVariance);
+    /// Set min radius.
+    void SetMinRadius(float minRadius);
+    /// Set rotate per second.
+    void SetRotatePerSecond(float rotatePerSecond);
+    /// Set rotate per second variance.
+    void SetRotatePerSecondVariance(float rotatePerSecondVariance);
+    /// Set blend mode.
+    void SetBlendMode(BlendMode blendMode);
+    /// Set rotation start.
+    void SetRotationStart(float rotationStart);
+    /// Set rotation start variance.
+    void SetRotationStartVariance(float rotationStartVariance);
+    /// Set rotation end.
+    void SetRotationEnd(float rotationEnd);
+    /// Set rotation end variance.
+    void SetRotationEndVariance(float rotationEndVariance);
+
     /// Return sprite.
     /// Return sprite.
-    Sprite2D* GetSprite() const;
-    /// Return blend mode.
-    BlendMode GetBlendMode() const { return blendMode_; }
-    /// Return duration.
-    float GetDuration() const { return duration_; }
-    /// Return emitter type.
-    EmitterType2D GetEmitterType() const { return emitterType_; }
+    Sprite2D* GetSprite() const { return sprite_; }
+    /// Return source position.
+    const Vector2& GetSourcePosition() const { return sourcePosition_; }
     /// Return source position variance.
     /// Return source position variance.
     const Vector2& GetSourcePositionVariance() const { return sourcePositionVariance_; }
     const Vector2& GetSourcePositionVariance() const { return sourcePositionVariance_; }
-    /// Return max particles.
-    unsigned GetMaxParticles() const { return maxParticles_; }
-    /// Return particle lifespan
-    float GetParticleLifeSpan() const { return particleLifeSpan_; }
-    /// Return particle lifespan variance.
-    float GetParticleLifeSpanVariance() const { return particleLifeSpanVariance_; }
-    /// Return start particle size.
-    float GetStartParticleSize() const { return startParticleSize_; }
-    /// Return start particle size variance.
-    float GetStartParticleSizeVariance() const { return startParticleSizeVariance_; }
-    /// Return end particle size.
-    float GetEndParticleSize() const { return endParticleSize_; }
-    /// Return end particle size variance.
-    float GetEndParticleSizeVariance() const { return endParticleSizeVariance_; }
-    /// Return angle.
-    float GetEmitAngle() const { return emitAngle_; }
-    /// Return angle variance.
-    float GetEmitAngleVariance() const { return emitAngleVariance_; }
     /// Return speed.
     /// Return speed.
     float GetSpeed() const { return speed_; }
     float GetSpeed() const { return speed_; }
     /// Return speed variance.
     /// Return speed variance.
     float GetSpeedVariance() const { return speedVariance_; }
     float GetSpeedVariance() const { return speedVariance_; }
+    /// Return particle lifespan.
+    float GetParticleLifeSpan() const { return particleLifeSpan_; }
+    /// Return particle lifespan variance.
+    float GetParticleLifespanVariance() const { return particleLifespanVariance_; }
+    /// Return angle.
+    float GetAngle() const { return angle_; }
+    /// Return angle variance.
+    float GetAngleVariance() const { return angleVariance_; }
     /// Return gravity.
     /// Return gravity.
     const Vector2& GetGravity() const { return gravity_; }
     const Vector2& GetGravity() const { return gravity_; }
     /// Return radial acceleration.
     /// Return radial acceleration.
     float GetRadialAcceleration() const { return radialAcceleration_; }
     float GetRadialAcceleration() const { return radialAcceleration_; }
-    /// Return radial acceleration variance.
-    float GetRadialAccelerationVariance() const { return radialAccelerationVariance_; }
     /// Return tangential acceleration.
     /// Return tangential acceleration.
     float GetTangentialAcceleration() const { return tangentialAcceleration_; }
     float GetTangentialAcceleration() const { return tangentialAcceleration_; }
+    /// Return radial acceleration variance.
+    float GetRadialAccelVariance() const { return radialAccelVariance_; }
     /// Return tangential acceleration variance.
     /// Return tangential acceleration variance.
-    float GetTangentialAccelerationVariance() const { return tangentialAccelerationVariance_; }
+    float GetTangentialAccelVariance() const { return tangentialAccelVariance_; }
+    /// Return start color.
+    const Color& GetStartColor() const { return startColor_; }
+    /// Return start color variance.
+    const Color& GetStartColorVariance() const { return startColorVariance_; }
+    /// Return finish color.
+    const Color& GetFinishColor() const { return finishColor_; }
+    /// Return finish color variance.
+    const Color& GetFinishColorVariance() const { return finishColorVariance_; }
+    /// Return max particles.
+    int GetMaxParticles() const { return maxParticles_; }
+    /// Return start particle size.
+    float GetStartParticleSize() const { return startParticleSize_; }
+    /// Return start particle size variance.
+    float GetStartParticleSizeVariance() const { return startParticleSizeVariance_; }
+    /// Return finish particle size.
+    float GetFinishParticleSize() const { return finishParticleSize_; }
+    /// Return finish particle size variance.
+    float GetFinishParticleSizeVariance() const { return FinishParticleSizeVariance_; }
+    /// Return duration.
+    float GetDuration() const { return duration_; }
+    /// Return emitter type.
+    EmitterType2D GetEmitterType() const { return emitterType_; }
     /// Return max radius.
     /// Return max radius.
     float GetMaxRadius() const { return maxRadius_; }
     float GetMaxRadius() const { return maxRadius_; }
     /// Return max radius variance.
     /// Return max radius variance.
@@ -107,58 +187,73 @@ public:
     float GetRotatePerSecond() const { return rotatePerSecond_; }
     float GetRotatePerSecond() const { return rotatePerSecond_; }
     /// Return rotate per second variance.
     /// Return rotate per second variance.
     float GetRotatePerSecondVariance() const { return rotatePerSecondVariance_; }
     float GetRotatePerSecondVariance() const { return rotatePerSecondVariance_; }
-    /// Return start color.
-    const Color& GetStartColor() const { return startColor_; }
-    /// Return start color variance.
-    const Color& GetStartColorVariance() const { return startColorVariance_; }
-    /// Return end color.
-    const Color& GetEndColor() const { return endColor_; }
-    /// Return end color variance.
-    const Color& GetEndColorVariance() const { return endColorVariance_; }
+    /// Return blend mode.
+    BlendMode GetBlendMode() const { return blendMode_; }
+    /// Return rotation start.
+    float GetRotationStart() const { return rotationStart_; }
+    /// Return rotation start variance.
+    float GetRotationStartVariance() const { return rotationStartVariance_; }
+    /// Return rotation end.
+    float GetRotationEnd() const { return rotationEnd_; }
+    /// Return rotation end variance.
+    float GetRotationEndVariance() const { return rotationEndVariance_; }
 
 
 private:
 private:
-    /// Texture.
+    /// Read Color.
+    Color ReadColor(const XMLElement& element) const;
+    /// Read Vector2.
+    Vector2 ReadVector2(const XMLElement& element) const;
+    
+    /// Sprite.
     SharedPtr<Sprite2D> sprite_;
     SharedPtr<Sprite2D> sprite_;
-    /// Blend mode.
-    BlendMode blendMode_;
-    /// Duration.
-    float duration_;
-    /// Emitter type.
-    EmitterType2D emitterType_;
+    /// Source position.
+    Vector2 sourcePosition_;
     /// Source position variance.
     /// Source position variance.
     Vector2 sourcePositionVariance_;
     Vector2 sourcePositionVariance_;
-    /// Max particles.
-    unsigned maxParticles_;
-    /// Particle lifespan
-    float particleLifeSpan_;
-    /// Particle lifespan variance.
-    float particleLifeSpanVariance_;
-    /// Start particle size.
-    float startParticleSize_;
-    /// Start particle size variance.
-    float startParticleSizeVariance_;
-    /// End particle size.
-    float endParticleSize_;
-    /// End particle size variance.
-    float endParticleSizeVariance_;
-    /// Angle.
-    float emitAngle_;
-    /// Angle variance.
-    float emitAngleVariance_;
     /// Speed.
     /// Speed.
     float speed_;
     float speed_;
     /// Speed variance.
     /// Speed variance.
     float speedVariance_;
     float speedVariance_;
+    /// Particle lifespan.
+    float particleLifeSpan_;
+    /// Particle lifespan variance.
+    float particleLifespanVariance_;
+    /// Angle.
+    float angle_;
+    /// Angle variance.
+    float angleVariance_;
     /// Gravity.
     /// Gravity.
     Vector2 gravity_;
     Vector2 gravity_;
     /// Radial acceleration.
     /// Radial acceleration.
     float radialAcceleration_;
     float radialAcceleration_;
-    /// Radial acceleration variance.
-    float radialAccelerationVariance_;
     /// Tangential acceleration.
     /// Tangential acceleration.
     float tangentialAcceleration_;
     float tangentialAcceleration_;
+    /// Radial acceleration variance.
+    float radialAccelVariance_;
     /// Tangential acceleration variance.
     /// Tangential acceleration variance.
-    float tangentialAccelerationVariance_;
+    float tangentialAccelVariance_;
+    /// Start color.
+    Color startColor_;
+    /// Start color variance.
+    Color startColorVariance_;
+    /// Finish color.
+    Color finishColor_;
+    /// Finish color variance.
+    Color finishColorVariance_;
+    /// Max particles.
+    int maxParticles_;
+    /// Start particle size.
+    float startParticleSize_;
+    /// Start particle size variance.
+    float startParticleSizeVariance_;
+    /// Finish particle size.
+    float finishParticleSize_;
+    /// Finish particle size variance.
+    float FinishParticleSizeVariance_;
+    /// Duration.
+    float duration_;
+    /// Emitter type.
+    EmitterType2D emitterType_;
     /// Max radius.
     /// Max radius.
     float maxRadius_;
     float maxRadius_;
     /// Max radius variance.
     /// Max radius variance.
@@ -169,14 +264,18 @@ private:
     float rotatePerSecond_;
     float rotatePerSecond_;
     /// Rotate per second variance.
     /// Rotate per second variance.
     float rotatePerSecondVariance_;
     float rotatePerSecondVariance_;
-    /// Start color.
-    Color startColor_;
-    /// Start color variance.
-    Color startColorVariance_;
-    /// End color.
-    Color endColor_;
-    /// End color variance.
-    Color endColorVariance_;
+    /// Blend mode.
+    BlendMode blendMode_;
+    /// Rotation start.
+    float rotationStart_;
+    /// Rotation start variance.
+    float rotationStartVariance_;
+    /// Rotation end.
+    float rotationEnd_;
+    /// Rotation end variance.
+    float rotationEndVariance_;
+
+
 };
 };
 
 
 }
 }

+ 1 - 1
Source/Samples/25_Urho2DParticle/Urho2DParticle.cpp

@@ -85,7 +85,7 @@ void Urho2DParticle::CreateScene()
     camera->SetOrthoSize(Vector2((float)graphics->GetWidth(), (float)graphics->GetHeight()) * PIXEL_SIZE);
     camera->SetOrthoSize(Vector2((float)graphics->GetWidth(), (float)graphics->GetHeight()) * PIXEL_SIZE);
 
 
     ResourceCache* cache = GetSubsystem<ResourceCache>();
     ResourceCache* cache = GetSubsystem<ResourceCache>();
-    ParticleModel2D* particleModel = cache->GetResource<ParticleModel2D>("Urho2D/LavaFlow.plist");
+    ParticleModel2D* particleModel = cache->GetResource<ParticleModel2D>("Urho2D/sun.pex");
     if (!particleModel)
     if (!particleModel)
         return;
         return;