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