diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h
index 6a4d469..ac92fe1 100644
--- a/Source/Fractorium/Fractorium.h
+++ b/Source/Fractorium/Fractorium.h
@@ -190,6 +190,7 @@ public slots:
//Xforms.
void OnCurrentXformComboChanged(int index);
void OnAddXformButtonClicked(bool checked);
+ void OnAddLinkedXformButtonClicked(bool checked);
void OnDuplicateXformButtonClicked(bool checked);
void OnClearXformButtonClicked(bool checked);
void OnDeleteXformButtonClicked(bool checked);
diff --git a/Source/Fractorium/Fractorium.qrc b/Source/Fractorium/Fractorium.qrc
index 4526a6f..7aa53a3 100644
--- a/Source/Fractorium/Fractorium.qrc
+++ b/Source/Fractorium/Fractorium.qrc
@@ -38,6 +38,7 @@
Icons/infomation.png
Icons/del.png
Icons/add.png
+ Icons/link-add.png
Icons/eraser.png
Icons/editraise.png
Icons/square.png
diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui
index 8ded213..caf978c 100644
--- a/Source/Fractorium/Fractorium.ui
+++ b/Source/Fractorium/Fractorium.ui
@@ -2146,15 +2146,15 @@
- 300
+ 280
0
- 240
+ 267
881
- 240
+ 267
613
@@ -2261,6 +2261,38 @@
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 25
+ 24
+
+
+
+
+ 16777215
+ 24
+
+
+
+ Add linked xform
+
+
+
+
+
+
+ :/Fractorium/Icons/link-add.png:/Fractorium/Icons/link-add.png
+
+
+
-
@@ -3252,7 +3284,7 @@ SpinBox
0
0
- 216
+ 237
745
@@ -4909,7 +4941,7 @@ SpinBox
0
0
- 216
+ 237
680
diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h
index 25cce67..4a6b5af 100644
--- a/Source/Fractorium/FractoriumEmberController.h
+++ b/Source/Fractorium/FractoriumEmberController.h
@@ -62,6 +62,7 @@ public:
virtual void SetEmber(size_t index) { }
//virtual void Clear() { }
virtual void AddXform() { }
+ virtual void AddLinkedXform() { }
virtual void DuplicateXform() { }
virtual void ClearXform() { }
virtual void DeleteXforms() { }
@@ -290,6 +291,7 @@ public:
virtual void SetEmber(size_t index) override;
//virtual void Clear() override { }
virtual void AddXform() override;
+ virtual void AddLinkedXform() override;
virtual void DuplicateXform() override;
virtual void ClearXform() override;
virtual void DeleteXforms() override;
diff --git a/Source/Fractorium/FractoriumXforms.cpp b/Source/Fractorium/FractoriumXforms.cpp
index b2105aa..85dda72 100644
--- a/Source/Fractorium/FractoriumXforms.cpp
+++ b/Source/Fractorium/FractoriumXforms.cpp
@@ -9,6 +9,7 @@ void Fractorium::InitXformsUI()
int spinHeight = 20, row = 0;
connect(ui.AddXformButton, SIGNAL(clicked(bool)), this, SLOT(OnAddXformButtonClicked(bool)), Qt::QueuedConnection);
+ connect(ui.AddLinkedXformButton, SIGNAL(clicked(bool)), this, SLOT(OnAddLinkedXformButtonClicked(bool)), Qt::QueuedConnection);
connect(ui.DuplicateXformButton, SIGNAL(clicked(bool)), this, SLOT(OnDuplicateXformButtonClicked(bool)), Qt::QueuedConnection);
connect(ui.ClearXformButton, SIGNAL(clicked(bool)), this, SLOT(OnClearXformButtonClicked(bool)), Qt::QueuedConnection);
connect(ui.DeleteXformButton, SIGNAL(clicked(bool)), this, SLOT(OnDeleteXformButtonClicked(bool)), Qt::QueuedConnection);
@@ -86,6 +87,7 @@ void FractoriumEmberController::CurrentXformComboChanged(int index)
m_Fractorium->ui.DuplicateXformButton->setEnabled(enable);
m_Fractorium->m_XformWeightSpin->setEnabled(enable);
m_Fractorium->ui.SoloXformCheckBox->setEnabled(enable);
+ m_Fractorium->ui.AddLinkedXformButton->setEnabled(enable);
m_Fractorium->ui.AddFinalXformButton->setEnabled(enable);
}
}
@@ -104,7 +106,6 @@ void FractoriumEmberController::AddXform()
Update([&]()
{
Xform newXform;
- QComboBox* combo = m_Fractorium->ui.CurrentXformCombo;
newXform.m_Weight = 0.25;
newXform.m_ColorX = m_Rand.Frand01();
@@ -116,6 +117,55 @@ void FractoriumEmberController::AddXform()
void Fractorium::OnAddXformButtonClicked(bool checked) { m_Controller->AddXform(); }
+///
+/// Add a new linked xform in the current ember and set it as the current xform.
+/// Linked means:
+///
+/// Called when the add xform button is clicked.
+/// Resets the rendering process.
+///
+/// Ignored
+template
+void FractoriumEmberController::AddLinkedXform()
+{
+ UpdateXform([&](Xform* xform)
+ {
+ size_t i, count = m_Ember.XformCount();
+ Xform newXform;
+
+ newXform.m_Weight = 0.5;
+ newXform.m_Opacity = 1;
+ newXform.m_ColorSpeed = 1;
+ newXform.m_ColorX = xform->m_ColorX;
+ //newXform.m_ColorY = xform->m_ColorY;
+
+ //Set all of the new xform's xaos values to the selected xform's xaos values,
+ //then set the selected xform's xaos values to 0.
+ for (i = 0; i < count; i++)
+ {
+ newXform.SetXaos(i, xform->Xaos(i));
+ xform->SetXaos(i, 0);
+ }
+
+ //Add the new xform and update the total count.
+ m_Ember.AddXform(newXform);
+ count = m_Ember.XformCount();
+
+ //Set the xaos for all xforms pointing to the new one to zero.
+ for (i = 0; i < count; i++)
+ if (auto* xf = m_Ember.GetXform(i))
+ xf->SetXaos(count - 1, 0);
+
+ xform->SetXaos(count - 1, 1);//Set the xaos value for the previous xform pointing to the new one to one.
+ xform->m_Opacity = 0;//Clear the opacity of the previous xform.
+ int index = m_Ember.TotalXformCount() - (m_Ember.UseFinalXform() ? 2 : 1);//Set index to the last item before final.
+ FillXforms(index);
+ FillXaos();
+ }, eXformUpdate::UPDATE_CURRENT);
+}
+
+void Fractorium::OnAddLinkedXformButtonClicked(bool checked) { m_Controller->AddLinkedXform(); }
+
///
/// Duplicate the specified xforms in the current ember, and set the last one as the current xform.
/// Called when the duplicate xform button is clicked.
diff --git a/Source/Fractorium/Icons/link-add.png b/Source/Fractorium/Icons/link-add.png
new file mode 100644
index 0000000..8dfce00
Binary files /dev/null and b/Source/Fractorium/Icons/link-add.png differ