diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp index d7eb312..f37508d 100644 --- a/Source/Fractorium/Fractorium.cpp +++ b/Source/Fractorium/Fractorium.cpp @@ -706,7 +706,8 @@ void Fractorium::SetTabOrders() w = SetTabOrder(this, w, ui.SequenceStopFlameSpinBox); w = SetTabOrder(this, w, ui.SequenceAllButton); w = SetTabOrder(this, w, ui.SequenceRandomizeStaggerCheckBox); - w = SetTabOrder(this, w, ui.SequenceStaggerCheckBox); + w = SetTabOrder(this, w, ui.SequenceStaggerSpinBox); + w = SetTabOrder(this, w, ui.SequenceRandomStaggerMaxSpinBox); w = SetTabOrder(this, w, ui.SequenceRandomizeFramesPerRotCheckBox); w = SetTabOrder(this, w, ui.SequenceFramesPerRotSpinBox); w = SetTabOrder(this, w, ui.SequenceRandomFramesPerRotMaxSpinBox); diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index fea62e3..767b7f0 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -171,9 +171,12 @@ public slots: void OnSequenceRenderButtonClicked(bool checked); void OnSequenceSaveButtonClicked(bool checked); void OnSequenceOpenButtonClicked(bool checked); + void OnSequenceRandomizeStaggerCheckBoxStateChanged(int state); void OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int state); void OnSequenceRandomizeRotationsCheckBoxStateChanged(int state); void OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int state); + void OnSequenceStaggerSpinBoxChanged(double d); + void OnSequenceRandomStaggerMaxSpinBoxChanged(double d); void OnSequenceStartFlameSpinBoxChanged(int d); void OnSequenceStopFlameSpinBoxChanged(int d); void OnSequenceFramesPerRotSpinBoxChanged(int d); diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui index 86719ae..8c119da 100644 --- a/Source/Fractorium/Fractorium.ui +++ b/Source/Fractorium/Fractorium.ui @@ -3513,8 +3513,8 @@ 0 0 - 263 - 700 + 118 + 672 @@ -5581,8 +5581,8 @@ 0 0 - 259 - 652 + 133 + 52 @@ -6867,19 +6867,6 @@ - - - - - 0 - 0 - - - - Stagger - - - @@ -7186,6 +7173,50 @@ + + + + + 0 + 0 + + + + QAbstractSpinBox::NoButtons + + + Stagger: + + + 1.000000000000000 + + + 0.100000000000000 + + + + + + + false + + + QAbstractSpinBox::NoButtons + + + Stagger max: + + + 1.000000000000000 + + + 0.100000000000000 + + + 1.000000000000000 + + + diff --git a/Source/Fractorium/FractoriumLibrary.cpp b/Source/Fractorium/FractoriumLibrary.cpp index d9cad4d..03785d7 100644 --- a/Source/Fractorium/FractoriumLibrary.cpp +++ b/Source/Fractorium/FractoriumLibrary.cpp @@ -7,6 +7,8 @@ void Fractorium::InitLibraryUI() { ui.LibraryTree->SetMainWindow(this); + ui.SequenceStaggerSpinBox->setValue(m_Settings->Stagger()); + ui.SequenceRandomStaggerMaxSpinBox->setValue(m_Settings->StaggerMax()); ui.SequenceFramesPerRotSpinBox->setValue(m_Settings->FramesPerRot()); ui.SequenceRandomFramesPerRotMaxSpinBox->setValue(m_Settings->FramesPerRotMax()); ui.SequenceRotationsSpinBox->setValue(m_Settings->Rotations()); @@ -24,9 +26,12 @@ void Fractorium::InitLibraryUI() connect(ui.SequenceRenderButton, SIGNAL(clicked(bool)), this, SLOT(OnSequenceRenderButtonClicked(bool)), Qt::QueuedConnection); connect(ui.SequenceSaveButton, SIGNAL(clicked(bool)), this, SLOT(OnSequenceSaveButtonClicked(bool)), Qt::QueuedConnection); connect(ui.SequenceOpenButton, SIGNAL(clicked(bool)), this, SLOT(OnSequenceOpenButtonClicked(bool)), Qt::QueuedConnection); + connect(ui.SequenceRandomizeStaggerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeStaggerCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.SequenceRandomizeFramesPerRotCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.SequenceRandomizeRotationsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeRotationsCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.SequenceRandomizeBlendFramesCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceStaggerSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceStaggerSpinBoxChanged(double)), Qt::QueuedConnection); + connect(ui.SequenceRandomStaggerMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRandomStaggerMaxSpinBoxChanged(double)), Qt::QueuedConnection); connect(ui.SequenceStartFlameSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceStartFlameSpinBoxChanged(int)), Qt::QueuedConnection); connect(ui.SequenceStopFlameSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceStopFlameSpinBoxChanged(int)), Qt::QueuedConnection); connect(ui.SequenceFramesPerRotSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceFramesPerRotSpinBoxChanged(int)), Qt::QueuedConnection); @@ -505,7 +510,8 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() bool randFramesRot = ui.SequenceRandomizeFramesPerRotCheckBox->isChecked(); bool randRot = ui.SequenceRandomizeRotationsCheckBox->isChecked(); bool randBlend = ui.SequenceRandomizeBlendFramesCheckBox->isChecked(); - bool stagger = ui.SequenceStaggerCheckBox->isChecked(); + double stagger = ui.SequenceStaggerSpinBox->value(); + double staggerMax = ui.SequenceRandomStaggerMaxSpinBox->value(); double rots = ui.SequenceRotationsSpinBox->value(); double rotsMax = ui.SequenceRandomRotationsMaxSpinBox->value(); int framesPerRot = ui.SequenceFramesPerRotSpinBox->value(); @@ -529,7 +535,7 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() #endif SheepTools tools(palettePath, EmberCommon::CreateRenderer(eRendererType::CPU_RENDERER, devices, false, 0, emberReport)); tools.SetSpinParams(true, - randStagger ? m_Rand.RandBit() : stagger, + stagger,//Will be set again below if random is used. 0, 0, s->Nick().toStdString(), @@ -601,15 +607,14 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() embers[1] = *(++it2);//Get the next ember to be used with blending below. size_t blendFrames = randBlend ? m_Rand.Frand(framesBlend, framesBlendMax) : framesBlend; + if (randStagger) + tools.Stagger(m_Rand.Frand(stagger, staggerMax)); + for (frame = 0; frame < blendFrames; frame++) { bool seqFlag = frame == 0 || (frame == blendFrames - 1); blend = frame / double(blendFrames); result.Clear(); - - if (randStagger) - tools.Stagger(m_Rand.RandBit()); - tools.SpinInter(&embers[0], nullptr, result, startCount + frameCount++, seqFlag, blend); FormatName(result, os, padding); m_SequenceFile.m_Embers.push_back(result); @@ -718,6 +723,7 @@ void FractoriumEmberController::SequenceOpenButtonClicked() void Fractorium::OnSequenceOpenButtonClicked(bool checked) { m_Controller->SequenceOpenButtonClicked(); } +void Fractorium::OnSequenceRandomizeStaggerCheckBoxStateChanged(int state) { ui.SequenceRandomStaggerMaxSpinBox->setEnabled(state); } void Fractorium::OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int state) { ui.SequenceRandomFramesPerRotMaxSpinBox->setEnabled(state); } void Fractorium::OnSequenceRandomizeRotationsCheckBoxStateChanged(int state) { ui.SequenceRandomRotationsMaxSpinBox->setEnabled(state); } void Fractorium::OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int state) { ui.SequenceRandomBlendMaxFramesSpinBox->setEnabled(state); } @@ -725,20 +731,24 @@ void Fractorium::OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int state) { /// /// Constrain all min/max spinboxes. /// -void Fractorium::OnSequenceStartFlameSpinBoxChanged(int d) { ConstrainLow(ui.SequenceStartFlameSpinBox, ui.SequenceStopFlameSpinBox); } -void Fractorium::OnSequenceStopFlameSpinBoxChanged(int d) { ConstrainHigh(ui.SequenceStartFlameSpinBox, ui.SequenceStopFlameSpinBox); } -void Fractorium::OnSequenceFramesPerRotSpinBoxChanged(int d) { if (ui.SequenceRandomizeFramesPerRotCheckBox->isChecked()) ConstrainLow(ui.SequenceFramesPerRotSpinBox, ui.SequenceRandomFramesPerRotMaxSpinBox); } +void Fractorium::OnSequenceStaggerSpinBoxChanged(double d) { if (ui.SequenceRandomizeStaggerCheckBox->isChecked()) ConstrainLow(ui.SequenceStaggerSpinBox, ui.SequenceRandomStaggerMaxSpinBox); } +void Fractorium::OnSequenceRandomStaggerMaxSpinBoxChanged(double d) { ConstrainHigh(ui.SequenceStaggerSpinBox, ui.SequenceRandomStaggerMaxSpinBox); } +void Fractorium::OnSequenceStartFlameSpinBoxChanged(int d) { ConstrainLow(ui.SequenceStartFlameSpinBox, ui.SequenceStopFlameSpinBox); } +void Fractorium::OnSequenceStopFlameSpinBoxChanged(int d) { ConstrainHigh(ui.SequenceStartFlameSpinBox, ui.SequenceStopFlameSpinBox); } +void Fractorium::OnSequenceFramesPerRotSpinBoxChanged(int d) { if (ui.SequenceRandomizeFramesPerRotCheckBox->isChecked()) ConstrainLow(ui.SequenceFramesPerRotSpinBox, ui.SequenceRandomFramesPerRotMaxSpinBox); } void Fractorium::OnSequenceRandomFramesPerRotMaxSpinBoxChanged(int d) { ConstrainHigh(ui.SequenceFramesPerRotSpinBox, ui.SequenceRandomFramesPerRotMaxSpinBox); } -void Fractorium::OnSequenceRotationsSpinBoxChanged(double d) { if (ui.SequenceRandomizeRotationsCheckBox->isChecked()) ConstrainLow(ui.SequenceRotationsSpinBox, ui.SequenceRandomRotationsMaxSpinBox); } +void Fractorium::OnSequenceRotationsSpinBoxChanged(double d) { if (ui.SequenceRandomizeRotationsCheckBox->isChecked()) ConstrainLow(ui.SequenceRotationsSpinBox, ui.SequenceRandomRotationsMaxSpinBox); } void Fractorium::OnSequenceRandomRotationsMaxSpinBoxChanged(double d) { ConstrainHigh(ui.SequenceRotationsSpinBox, ui.SequenceRandomRotationsMaxSpinBox); } -void Fractorium::OnSequenceBlendFramesSpinBoxChanged(int d) { if (ui.SequenceRandomizeBlendFramesCheckBox->isChecked()) ConstrainLow(ui.SequenceBlendFramesSpinBox, ui.SequenceRandomBlendMaxFramesSpinBox); } -void Fractorium::OnSequenceRandomBlendMaxFramesSpinBoxChanged(int d) { ConstrainHigh(ui.SequenceBlendFramesSpinBox, ui.SequenceRandomBlendMaxFramesSpinBox); } +void Fractorium::OnSequenceBlendFramesSpinBoxChanged(int d) { if (ui.SequenceRandomizeBlendFramesCheckBox->isChecked()) ConstrainLow(ui.SequenceBlendFramesSpinBox, ui.SequenceRandomBlendMaxFramesSpinBox); } +void Fractorium::OnSequenceRandomBlendMaxFramesSpinBoxChanged(int d) { ConstrainHigh(ui.SequenceBlendFramesSpinBox, ui.SequenceRandomBlendMaxFramesSpinBox); } /// /// Save all sequence settings to match the values in the controls. /// void Fractorium::SyncSequenceSettings() { + m_Settings->Stagger(ui.SequenceStaggerSpinBox->value()); + m_Settings->StaggerMax(ui.SequenceRandomStaggerMaxSpinBox->value()); m_Settings->FramesPerRot(ui.SequenceFramesPerRotSpinBox->value()); m_Settings->FramesPerRotMax(ui.SequenceRandomFramesPerRotMaxSpinBox->value()); m_Settings->Rotations(ui.SequenceRotationsSpinBox->value()); diff --git a/Source/Fractorium/FractoriumSettings.cpp b/Source/Fractorium/FractoriumSettings.cpp index 8cb5d09..12f72e0 100644 --- a/Source/Fractorium/FractoriumSettings.cpp +++ b/Source/Fractorium/FractoriumSettings.cpp @@ -138,16 +138,27 @@ void FractoriumSettings::RandomCount(uint i) { setValue(RANDOMCOUNT, i); /// Sequence generation settings. /// +double FractoriumSettings::Stagger() { return value(STAGGER).toDouble(); } +void FractoriumSettings::Stagger(double d) { setValue(STAGGER, d); } + +double FractoriumSettings::StaggerMax() { return value(STAGGERMAX).toDouble(); } +void FractoriumSettings::StaggerMax(double d) { setValue(STAGGERMAX, d); } + uint FractoriumSettings::FramesPerRot() { return value(FRAMESPERROT).toUInt(); } void FractoriumSettings::FramesPerRot(uint i) { setValue(FRAMESPERROT, i); } + uint FractoriumSettings::FramesPerRotMax() { return value(FRAMESPERROTMAX).toUInt(); } void FractoriumSettings::FramesPerRotMax(uint i) { setValue(FRAMESPERROTMAX, i); } -uint FractoriumSettings::Rotations() { return value(ROTATIONS).toUInt(); } -void FractoriumSettings::Rotations(uint i) { setValue(ROTATIONS, i); } -uint FractoriumSettings::RotationsMax() { return value(ROTATIONSMAX).toUInt(); } -void FractoriumSettings::RotationsMax(uint i) { setValue(ROTATIONSMAX, i); } + +uint FractoriumSettings::Rotations() { return value(ROTATIONS).toDouble(); } +void FractoriumSettings::Rotations(double d) { setValue(ROTATIONS, d); } + +uint FractoriumSettings::RotationsMax() { return value(ROTATIONSMAX).toDouble(); } +void FractoriumSettings::RotationsMax(double d) { setValue(ROTATIONSMAX, d); } + uint FractoriumSettings::BlendFrames() { return value(BLENDFRAMES).toUInt(); } void FractoriumSettings::BlendFrames(uint i) { setValue(BLENDFRAMES, i); } + uint FractoriumSettings::BlendFramesMax() { return value(BLENDFRAMESMAX).toUInt(); } void FractoriumSettings::BlendFramesMax(uint i) { setValue(BLENDFRAMESMAX, i); } diff --git a/Source/Fractorium/FractoriumSettings.h b/Source/Fractorium/FractoriumSettings.h index c0f3ffe..0a18a65 100644 --- a/Source/Fractorium/FractoriumSettings.h +++ b/Source/Fractorium/FractoriumSettings.h @@ -21,6 +21,8 @@ #define OPENCLSUBBATCH "render/openclsubbatch" #define RANDOMCOUNT "render/randomcount" +#define STAGGER "sequence/stagger" +#define STAGGERMAX "sequence/staggermax" #define FRAMESPERROT "sequence/framesperrot" #define FRAMESPERROTMAX "sequence/framesperrotmax" #define ROTATIONS "sequence/rotations" @@ -133,16 +135,27 @@ public: uint RandomCount(); void RandomCount(uint i); + double Stagger(); + void Stagger(double i); + + double StaggerMax(); + void StaggerMax(double i); + uint FramesPerRot(); void FramesPerRot(uint i); + uint FramesPerRotMax(); void FramesPerRotMax(uint i); + uint Rotations(); - void Rotations(uint i); + void Rotations(double d); + uint RotationsMax(); - void RotationsMax(uint i); + void RotationsMax(double d); + uint BlendFrames(); void BlendFrames(uint i); + uint BlendFramesMax(); void BlendFramesMax(uint i);