Browse Source

Working to add improved color frame editing.

hdunderscore 11 years ago
parent
commit
f75e915bc0

+ 33 - 19
Bin/Data/Scripts/Editor/EditorParticleEffect.as

@@ -37,6 +37,7 @@ void CreateParticleEffectEditor()
     SubscribeToEvent(particleEffectWindow.GetChild("SaveAsButton", true), "Released", "SaveParticleEffectAs");
     SubscribeToEvent(particleEffectWindow.GetChild("CloseButton", true), "Released", "HideParticleEffectEditor");
     SubscribeToEvent(particleEffectWindow.GetChild("NewColorFrame", true), "Released", "EditParticleEffectColorFrameNew");
+    SubscribeToEvent(particleEffectWindow.GetChild("ColorFrameSort", true), "Released", "EditParticleEffectColorFrameSort");
     SubscribeToEvent(particleEffectWindow.GetChild("ConstantForceX", true), "TextChanged", "EditParticleEffectConstantForce");
     SubscribeToEvent(particleEffectWindow.GetChild("ConstantForceY", true), "TextChanged", "EditParticleEffectConstantForce");
     SubscribeToEvent(particleEffectWindow.GetChild("ConstantForceZ", true), "TextChanged", "EditParticleEffectConstantForce");
@@ -83,11 +84,16 @@ void EditParticleEffectColorFrameNew(StringHash eventType, VariantMap& eventData
         return;
 
     uint num = editParticleEffect.numColorFrames;
-    log.Info(String(num));
-    //ColorFrame@ cf = ColorFrame(Color(0,0,0), 0.0);
-    //editParticleEffect.SetColorFrame(0, cf);
+    editParticleEffect.numColorFrames = num + 1;
+    RefreshParticleEffectColorFrames();
 }
 
+void EditParticleEffectColorFrameSort(StringHash eventType, VariantMap& eventData)
+{
+    RefreshParticleEffectColorFrames();
+}
+
+
 void InitParticleEffectBasicAttributes()
 {
     CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("ConstantForceX", true)));
@@ -122,7 +128,7 @@ void InitParticleEffectBasicAttributes()
     CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("RotationMax", true)));
 
     CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("RotationSpeedMin", true)));
-    CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("RotationSpeedMin", true)));
+    CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("RotationSpeedMax", true)));
 
     CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("SizeAdd", true)));
     CreateDragSlider(cast<LineEdit>(particleEffectWindow.GetChild("SizeMultiply", true)));
@@ -587,6 +593,8 @@ void RefreshParticleEffectColorFrames()
     if (editParticleEffect is null)
         return;
 
+    editParticleEffect.SortColorFrames();
+
     ListView@ lv = particleEffectWindow.GetChild("ColorFrameListView", true);
     lv.RemoveAllItems();
 
@@ -594,91 +602,97 @@ void RefreshParticleEffectColorFrames()
     {
         ColorFrame@ colorFrame = editParticleEffect.GetColorFrame(i);
 
-        Window@ container = Window();
-        container.style = "Window";
-        container.minSize = IntVector2(0, 16);
-        container.maxSize = IntVector2(2147483647, 16);
+        Button@ container = Button();
+        lv.AddItem(container);
+        container.style = "Button";
+        container.imageRect = IntRect(18, 2, 30, 14);
+        container.minSize = IntVector2(0, 20);
+        container.maxSize = IntVector2(2147483647, 20);
         container.layoutMode = LM_HORIZONTAL;
         container.layoutBorder = IntRect(1,1,1,1);
         container.layoutSpacing = 4;
-        lv.AddItem(container);
         
         UIElement@ labelContainer = UIElement();
+        container.AddChild(labelContainer);
         labelContainer.style = "HorizontalPanel";
         labelContainer.minSize = IntVector2(0, 16);
         labelContainer.maxSize = IntVector2(2147483647, 16);
-        container.AddChild(labelContainer);
 
         {
             LineEdit@ le = LineEdit();
+            labelContainer.AddChild(le);
             le.name = "ColorTime";
             le.vars["ColorFrame"] = i;
             le.style = "LineEdit";
             le.minSize = IntVector2(0, 16);
             le.maxSize = IntVector2(40, 16);
             le.text = colorFrame.time;
-            labelContainer.AddChild(le);
+            le.cursorPosition = 0;
             CreateDragSlider(le);
 
             SubscribeToEvent(le, "TextChanged", "EditParticleEffectColorFrame");
         }
 
         UIElement@ textContainer = UIElement();
+        labelContainer.AddChild(textContainer);
         textContainer.minSize = IntVector2(0, 16);
         textContainer.maxSize = IntVector2(2147483647, 16);
-        labelContainer.AddChild(textContainer);
 
         Text@ t = Text();
+        textContainer.AddChild(t);
         t.style = "Text";
         t.text = "Color";
-        textContainer.AddChild(t);
 
         UIElement@ editContainer = UIElement();
+        container.AddChild(editContainer);
         editContainer.style = "HorizontalPanel";
         editContainer.minSize = IntVector2(0, 16);
         editContainer.maxSize = IntVector2(2147483647, 16);
-        container.AddChild(editContainer);
 
         {
             LineEdit@ le = LineEdit();
+            editContainer.AddChild(le);
             le.name = "ColorR";
             le.vars["ColorFrame"] = i;
             le.style = "LineEdit";
             le.text = colorFrame.color.r;
-            editContainer.AddChild(le);
+            le.cursorPosition = 0;
             CreateDragSlider(le);
 
             SubscribeToEvent(le, "TextChanged", "EditParticleEffectColorFrame");
         }
         {
             LineEdit@ le = LineEdit();
+            editContainer.AddChild(le);
             le.name = "ColorG";
             le.vars["ColorFrame"] = i;
             le.style = "LineEdit";
             le.text = colorFrame.color.g;
-            editContainer.AddChild(le);
+            le.cursorPosition = 0;
             CreateDragSlider(le);
 
             SubscribeToEvent(le, "TextChanged", "EditParticleEffectColorFrame");
         }
         {
             LineEdit@ le = LineEdit();
+            editContainer.AddChild(le);
             le.name = "ColorB";
             le.vars["ColorFrame"] = i;
             le.style = "LineEdit";
             le.text = colorFrame.color.b;
-            editContainer.AddChild(le);
+            le.cursorPosition = 0;
             CreateDragSlider(le);
 
             SubscribeToEvent(le, "TextChanged", "EditParticleEffectColorFrame");
         }
         {
             LineEdit@ le = LineEdit();
+            editContainer.AddChild(le);
             le.name = "ColorA";
             le.vars["ColorFrame"] = i;
             le.style = "LineEdit";
             le.text = colorFrame.color.a;
-            editContainer.AddChild(le);
+            le.cursorPosition = 0;
             CreateDragSlider(le);
 
             SubscribeToEvent(le, "TextChanged", "EditParticleEffectColorFrame");
@@ -780,7 +794,7 @@ void RefreshParticleEffectBasicAttributes()
     cast<LineEdit>(particleEffectWindow.GetChild("RotationMax", true)).text = editParticleEffect.maxRotation;
 
     cast<LineEdit>(particleEffectWindow.GetChild("RotationSpeedMin", true)).text = editParticleEffect.minRotationSpeed;
-    cast<LineEdit>(particleEffectWindow.GetChild("RotationSpeedMin", true)).text = editParticleEffect.maxRotationSpeed;
+    cast<LineEdit>(particleEffectWindow.GetChild("RotationSpeedMax", true)).text = editParticleEffect.maxRotationSpeed;
 
     cast<LineEdit>(particleEffectWindow.GetChild("SizeAdd", true)).text = editParticleEffect.sizeAdd;
     cast<LineEdit>(particleEffectWindow.GetChild("SizeMultiply", true)).text = editParticleEffect.sizeMul;

+ 1 - 0
Bin/Data/UI/EditorParticleEffectWindow.xml

@@ -369,6 +369,7 @@
                     </element>
                     <element type="ListView" style="PanelView">
                         <attribute name="Name" value="ColorFrameListView" />
+                        <attribute name="Highlight Mode" value="Always" />
                         <attribute name="Min Size" value="0 60" />
                     </element>
                     <element>

+ 49 - 0
Source/Engine/Graphics/ParticleEffect.cpp

@@ -540,6 +540,47 @@ void ParticleEffect::SetSizeMul(float sizeMul)
     sizeMul_ = sizeMul;
 }
 
+void ParticleEffect::AddColorFrame(const Color& color, const float time)
+{
+    unsigned s = colorFrames_.Size();
+    colorFrames_.Resize(s + 1);
+
+    for (unsigned i = 0; i < s; i++)
+    {
+        LOGINFO("i: " + String(i));
+        if (colorFrames_[i].time_ > time)
+        {
+            for (unsigned j = s; j > i; j--)
+            {
+                LOGINFO("j: " + String(j) + ", time: " + String(colorFrames_[j].time_) + " -> " + String(colorFrames_[j-1].time_));
+                colorFrames_[j].color_ = colorFrames_[j - 1].color_;
+                colorFrames_[j].time_ = colorFrames_[j - 1].time_;
+            }
+            colorFrames_[i].color_ = color;
+            colorFrames_[i].time_ = time;
+            // = ColorFrame(color, time);
+            return;
+        }
+    }
+
+    // highest time, add last:
+    colorFrames_[s].color_ = color;
+    colorFrames_[s].time_ = time;
+}
+
+void ParticleEffect::RemoveColorFrame(unsigned index)
+{
+    unsigned s = colorFrames_.Size();
+
+    for (unsigned i = index; i < s - 1 ; i++)
+    {
+        colorFrames_[i].color_ = colorFrames_[i + 1].color_;
+        colorFrames_[i].time_ = colorFrames_[i + 1].time_;
+    }
+
+    colorFrames_.Resize(s - 1);
+}
+
 void ParticleEffect::SetColorFrames(const Vector<ColorFrame>& colorFrames)
 {
     colorFrames_ = colorFrames;
@@ -552,6 +593,14 @@ void ParticleEffect::SetColorFrame(unsigned index, const ColorFrame& colorFrame)
     colorFrames_[index] = colorFrame;
 }
 
+void ParticleEffect::SetNumColorFrames(unsigned number)
+{
+    unsigned s = colorFrames_.Size();
+    if (s != number)
+         colorFrames_.Resize(number);
+}
+
+
 void ParticleEffect::SetTextureFrames(const Vector<TextureFrame>& textureFrames)
 {
     textureFrames_ = textureFrames;

+ 7 - 1
Source/Engine/Graphics/ParticleEffect.h

@@ -176,10 +176,16 @@ public:
     void SetSizeAdd(float sizeAdd);
     /// Set particle size multiplicative modifier.
     void SetSizeMul(float sizeMul);
+    /// Add a color frame sorted in the correct position based on time.
+    void AddColorFrame(const Color& color, const float time);
+    /// Remove color frame at index
+    void RemoveColorFrame(unsigned index);
     /// Set color animation of particles.
     void SetColorFrames(const Vector<ColorFrame>& colorFrames);
-    /// Set number of color animation frames.
+    /// Set color animation frame at index. If index is greater than number of color frames, new color frames are added.
     void SetColorFrame(unsigned index, const ColorFrame& colorFrame);
+    /// Set number of color frames.
+    void SetNumColorFrames(unsigned number);
     /// Set particle texture animation.
     void SetTextureFrames(const Vector<TextureFrame>& animation);
     /// Set number of texture animation frames.

+ 5 - 2
Source/Engine/Script/GraphicsAPI.cpp

@@ -1145,10 +1145,13 @@ static void RegisterParticleEffect(asIScriptEngine* engine)
     engine->RegisterObjectMethod("ParticleEffect", "void set_sizeMul(float)", asMETHOD(ParticleEffect, SetSizeMul), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEffect", "float get_sizeMul() const", asMETHOD(ParticleEffect, GetSizeMul), asCALL_THISCALL);
 
-    engine->RegisterObjectMethod("ParticleEffect", "void SetColorFrame(uint, ColorFrame@+) const", asMETHOD(ParticleEffect, SetColorFrame), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEffect", "void AddColorFrame(Color&, float)", asMETHOD(ParticleEffect, AddColorFrame), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEffect", "void RemoveColorFrame(uint)", asMETHOD(ParticleEffect, RemoveColorFrame), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEffect", "void SetColorFrame(uint, ColorFrame@+)", asMETHOD(ParticleEffect, SetColorFrame), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEffect", "void set_numColorFrames(uint)", asMETHOD(ParticleEffect, SetNumColorFrames), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEffect", "uint get_numColorFrames() const", asMETHOD(ParticleEffect, GetNumColorFrames), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEffect", "ColorFrame@+ GetColorFrame(uint) const", asMETHOD(ParticleEffect, GetColorFrame), asCALL_THISCALL);
-    engine->RegisterObjectMethod("ParticleEffect", "void SetTextureFrame(uint, TextureFrame@+) const", asMETHOD(ParticleEffect, SetTextureFrame), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEffect", "void SetTextureFrame(uint, TextureFrame@+)", asMETHOD(ParticleEffect, SetTextureFrame), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEffect", "uint get_numTextureFrames() const", asMETHOD(ParticleEffect, GetNumTextureFrames), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEffect", "TextureFrame@+ GetTextureFrame(uint) const", asMETHOD(ParticleEffect, GetTextureFrame), asCALL_THISCALL);
 }