mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-07-01 13:56:06 -04:00
--Bug fixes
-Fix crash on palette editor when opening it with certain palette files in a particular order. -An xform with only a post variation in it might have showed up wrong. -The xforms combo box was obscuring the name of the xforms by not being wide enough. -Make variation state preservation be a little bit more correct in OpenCL. --Code changes -Make all iterators on the CPU use a temporary point.
This commit is contained in:
@ -58,7 +58,7 @@
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:10pt;">Fractorium 1.0.0.18</span></p><p align="center"><span style=" font-size:10pt;">A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><a href="http://fractorium.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">fractorium.com</span></a></p></body></html></string>
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:10pt;">Fractorium 1.0.0.19</span></p><p align="center"><span style=" font-size:10pt;">A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><a href="http://fractorium.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">fractorium.com</span></a></p></body></html></string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::RichText</enum>
|
||||
|
@ -139,6 +139,7 @@ public slots:
|
||||
void OnActionNewEmptyFlameInCurrentFile(bool checked);
|
||||
void OnActionNewRandomFlameInCurrentFile(bool checked);
|
||||
void OnActionCopyFlameInCurrentFile(bool checked);
|
||||
void OnActionCreateReferenceFile(bool checked);
|
||||
void OnActionOpen(bool checked);
|
||||
void OnActionSaveCurrentAsXml(bool checked);
|
||||
void OnActionSaveEntireFileAsXml(bool checked);
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
virtual void NewEmptyFlameInCurrentFile() { }
|
||||
virtual void NewRandomFlameInCurrentFile() { }
|
||||
virtual void CopyFlameInCurrentFile() { }
|
||||
virtual void CreateReferenceFile() { }
|
||||
virtual void OpenAndPrepFiles(const QStringList& filenames, bool append) { }
|
||||
virtual void SaveCurrentAsXml() { }
|
||||
virtual void SaveEntireFileAsXml() { }
|
||||
@ -384,6 +385,7 @@ public:
|
||||
virtual void NewEmptyFlameInCurrentFile() override;
|
||||
virtual void NewRandomFlameInCurrentFile() override;
|
||||
virtual void CopyFlameInCurrentFile() override;
|
||||
virtual void CreateReferenceFile() override;
|
||||
virtual void OpenAndPrepFiles(const QStringList& filenames, bool append) override;
|
||||
virtual void SaveCurrentAsXml() override;
|
||||
virtual void SaveEntireFileAsXml() override;
|
||||
|
@ -11,6 +11,7 @@ void Fractorium::InitMenusUI()
|
||||
connect(ui.ActionNewEmptyFlameInCurrentFile, SIGNAL(triggered(bool)), this, SLOT(OnActionNewEmptyFlameInCurrentFile(bool)), Qt::QueuedConnection);
|
||||
connect(ui.ActionNewRandomFlameInCurrentFile, SIGNAL(triggered(bool)), this, SLOT(OnActionNewRandomFlameInCurrentFile(bool)), Qt::QueuedConnection);
|
||||
connect(ui.ActionCopyFlameInCurrentFile, SIGNAL(triggered(bool)), this, SLOT(OnActionCopyFlameInCurrentFile(bool)), Qt::QueuedConnection);
|
||||
connect(ui.ActionCreateReferenceFile, SIGNAL(triggered(bool)), this, SLOT(OnActionCreateReferenceFile(bool)), Qt::QueuedConnection);
|
||||
connect(ui.ActionOpen, SIGNAL(triggered(bool)), this, SLOT(OnActionOpen(bool)), Qt::QueuedConnection);
|
||||
connect(ui.ActionSaveCurrentAsXml, SIGNAL(triggered(bool)), this, SLOT(OnActionSaveCurrentAsXml(bool)), Qt::QueuedConnection);
|
||||
connect(ui.ActionSaveEntireFileAsXml, SIGNAL(triggered(bool)), this, SLOT(OnActionSaveEntireFileAsXml(bool)), Qt::QueuedConnection);
|
||||
@ -172,6 +173,104 @@ void FractoriumEmberController<T>::CopyFlameInCurrentFile()
|
||||
|
||||
void Fractorium::OnActionCopyFlameInCurrentFile(bool checked) { m_Controller->CopyFlameInCurrentFile(); }
|
||||
|
||||
/// <summary>
|
||||
/// Create a reference file containing one ember for every possible regular variation, plus one for post_smartcrop
|
||||
/// since it only exists in post form.
|
||||
/// This will replace whatever file the user has open.
|
||||
/// Clears the undo state.
|
||||
/// Resets the rendering process.
|
||||
/// </summary>
|
||||
template <typename T>
|
||||
void FractoriumEmberController<T>::CreateReferenceFile()
|
||||
{
|
||||
bool nv = false;
|
||||
size_t i;
|
||||
StopAllPreviewRenderers();
|
||||
auto temppal = m_Ember.m_Palette;
|
||||
m_EmberFile.Clear();
|
||||
m_EmberFile.m_Filename = QString("Reference_") + EMBER_VERSION;
|
||||
auto varList = VariationList<T>::Instance();
|
||||
auto& regVars = varList->RegVars();
|
||||
auto count = regVars.size();
|
||||
auto addsquaresfunc = [&](size_t i, const Variation<T>* var)
|
||||
{
|
||||
Ember<T> ember;
|
||||
Xform<T> xf0, xf1, xf2, xf3, xf4, xffinal;
|
||||
//
|
||||
xf0.AddVariation(varList->GetVariationCopy(eVariationId::VAR_SQUARE, T(0.5)));
|
||||
//
|
||||
xf1.m_Affine.C(T(0.5));
|
||||
xf1.m_Affine.F(T(0.5));
|
||||
xf1.AddVariation(varList->GetVariationCopy(eVariationId::VAR_LINEAR));
|
||||
//
|
||||
xf2.m_Affine.C(T(-0.5));
|
||||
xf2.m_Affine.F(T(0.5));
|
||||
xf2.AddVariation(varList->GetVariationCopy(eVariationId::VAR_LINEAR));
|
||||
//
|
||||
xf3.m_Affine.C(T(-0.5));
|
||||
xf3.m_Affine.F(T(-0.5));
|
||||
xf3.AddVariation(varList->GetVariationCopy(eVariationId::VAR_LINEAR));
|
||||
//
|
||||
xf4.m_Affine.C(T(0.5));
|
||||
xf4.m_Affine.F(T(-0.5));
|
||||
xf4.AddVariation(varList->GetVariationCopy(eVariationId::VAR_LINEAR));
|
||||
//
|
||||
xffinal.AddVariation(var->Copy());
|
||||
//
|
||||
ember.AddXform(xf0);
|
||||
ember.AddXform(xf1);
|
||||
ember.AddXform(xf2);
|
||||
ember.AddXform(xf3);
|
||||
ember.AddXform(xf4);
|
||||
ember.SetFinalXform(xffinal);
|
||||
ember.EqualizeWeights();
|
||||
ember.m_Index = i;
|
||||
ember.m_MaxRadDE = 0;
|
||||
ember.m_Name = var->Name() + " Squares";
|
||||
ember.m_Palette = temppal;
|
||||
m_EmberFile.m_Embers.push_back(ember);
|
||||
};
|
||||
auto addsbarsfunc = [&](size_t i, const Variation<T>* var)
|
||||
{
|
||||
Ember<T> ember;
|
||||
Xform<T> xf0, xf1, xf2, xffinal;
|
||||
//
|
||||
xf0.AddVariation(varList->GetVariationCopy(eVariationId::VAR_PRE_BLUR, T(100)));
|
||||
xf0.AddVariation(varList->GetVariationCopy(eVariationId::VAR_CYLINDER, T(0.1)));
|
||||
//
|
||||
xf1.m_Affine.C(T(0.4));
|
||||
xf1.AddVariation(varList->GetVariationCopy(eVariationId::VAR_LINEAR));
|
||||
//
|
||||
xf2.m_Affine.C(T(-0.4));
|
||||
xf2.AddVariation(varList->GetVariationCopy(eVariationId::VAR_LINEAR));
|
||||
//
|
||||
xffinal.AddVariation(var->Copy());
|
||||
ember.AddXform(xf0);
|
||||
ember.AddXform(xf1);
|
||||
ember.AddXform(xf2);
|
||||
ember.SetFinalXform(xffinal);
|
||||
ember.EqualizeWeights();
|
||||
ember.m_Index = i;
|
||||
ember.m_MaxRadDE = 0;
|
||||
ember.m_Name = var->Name() + " Bars";
|
||||
ember.m_Palette = temppal;
|
||||
m_EmberFile.m_Embers.push_back(ember);
|
||||
};
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
addsquaresfunc(i, regVars[i]);
|
||||
addsbarsfunc(i, regVars[i]);
|
||||
}
|
||||
|
||||
addsquaresfunc(i, varList->GetVariation(eVariationId::VAR_POST_SMARTCROP));//post_smartcrop is the only variation that exists only in post form, so it must be done manually here.
|
||||
addsbarsfunc(i, varList->GetVariation(eVariationId::VAR_POST_SMARTCROP));
|
||||
m_LastSaveAll = "";
|
||||
FillLibraryTree();
|
||||
}
|
||||
|
||||
void Fractorium::OnActionCreateReferenceFile(bool checked) { m_Controller->CreateReferenceFile(); }
|
||||
|
||||
/// <summary>
|
||||
/// Open a list of ember Xml files, apply various values from the GUI widgets.
|
||||
/// Either append these newly read embers to the existing open embers,
|
||||
|
@ -36,7 +36,7 @@ void Fractorium::InitXformsUI()
|
||||
ui.CurrentXformCombo->view()->setMinimumWidth(100);
|
||||
ui.CurrentXformCombo->view()->setMaximumWidth(500);
|
||||
//ui.CurrentXformCombo->view()->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
ui.CurrentXformCombo->view()->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContentsOnFirstShow);
|
||||
ui.CurrentXformCombo->view()->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents);
|
||||
#ifndef _WIN32
|
||||
//For some reason linux makes these 24x24, even though the designer explicitly says 16x16.
|
||||
ui.AddXformButton->setIconSize(QSize(16, 16));
|
||||
@ -518,9 +518,9 @@ void FractoriumEmberController<T>::FillWithXform(Xform<T>* xform)
|
||||
|
||||
if (auto item = m_Fractorium->ui.XformWeightNameTable->item(0, 1))
|
||||
{
|
||||
m_Fractorium->ui.XformWeightNameTable->blockSignals(true);
|
||||
item->setText(QString::fromStdString(xform->m_Name));
|
||||
m_Fractorium->ui.XformWeightNameTable->blockSignals(false);
|
||||
m_Fractorium->m_XformNameEdit->blockSignals(true);
|
||||
m_Fractorium->m_XformNameEdit->setText(QString::fromStdString(xform->m_Name));
|
||||
m_Fractorium->m_XformNameEdit->blockSignals(false);
|
||||
}
|
||||
|
||||
FillVariationTreeWithXform(xform);
|
||||
@ -656,7 +656,7 @@ void FractoriumEmberController<T>::UpdateXformName(int index)
|
||||
auto view = m_Fractorium->ui.CurrentXformCombo->view();
|
||||
auto fontMetrics1 = view->fontMetrics();
|
||||
auto textWidth = m_Fractorium->ui.CurrentXformCombo->width();
|
||||
auto ww = fontMetrics1.width("WW");
|
||||
auto ww = fontMetrics1.width("WW") * 3;
|
||||
|
||||
for (int i = 0; i < m_Fractorium->ui.CurrentXformCombo->count(); ++i)
|
||||
textWidth = std::max(fontMetrics1.width(m_Fractorium->ui.CurrentXformCombo->itemText(i)) + ww, textWidth);
|
||||
|
@ -433,7 +433,7 @@ void PaletteEditor::OnCopyPaletteFileButtonClicked()
|
||||
/// </summary>
|
||||
void PaletteEditor::OnAppendPaletteButtonClicked()
|
||||
{
|
||||
auto& pal = m_GradientColorView->GetPalette(256);
|
||||
auto& pal = GetPalette(256);
|
||||
m_PaletteList->AddPaletteToFile(m_CurrentPaletteFilePath, pal);
|
||||
::FillPaletteTable(m_CurrentPaletteFilePath, ui->PaletteListTable, m_PaletteList);
|
||||
m_PaletteIndex = ui->PaletteListTable->rowCount() - 1;
|
||||
@ -446,7 +446,7 @@ void PaletteEditor::OnAppendPaletteButtonClicked()
|
||||
/// </summary>
|
||||
void PaletteEditor::OnOverwritePaletteButtonClicked()
|
||||
{
|
||||
auto& pal = m_GradientColorView->GetPalette(256);
|
||||
auto& pal = GetPalette(256);
|
||||
m_PaletteList->Replace(m_CurrentPaletteFilePath, pal, m_PaletteIndex);
|
||||
::FillPaletteTable(m_CurrentPaletteFilePath, ui->PaletteListTable, m_PaletteList);
|
||||
emit PaletteFileChanged();
|
||||
@ -632,10 +632,11 @@ void PaletteEditor::EnablePaletteFileControls()
|
||||
void PaletteEditor::EnablePaletteControls()
|
||||
{
|
||||
bool b = IsCurrentPaletteAndFileEditable();//Both the file and the current palette must be editable.
|
||||
auto& pal = GetPalette(256);
|
||||
ui->DeletePaletteButton->setEnabled(b);
|
||||
ui->CopyPaletteFileButton->setEnabled(b);
|
||||
ui->AppendPaletteButton->setEnabled(b);
|
||||
ui->OverwritePaletteButton->setEnabled(b && (GetFilename(m_CurrentPaletteFilePath) == GetFilename(*m_GradientColorView->GetPalette(256).m_Filename.get())));//Only allow overwrite if the palette is from the file it's overwriting a palette in.
|
||||
ui->OverwritePaletteButton->setEnabled(b && pal.m_Filename.get() && (GetFilename(m_CurrentPaletteFilePath) == GetFilename(*pal.m_Filename.get())));//Only allow overwrite if the palette is from the file it's overwriting a palette in.
|
||||
ui->AddColorButton->setEnabled(b);
|
||||
ui->DistributeColorsButton->setEnabled(b);
|
||||
ui->AutoDistributeCheckBox->setEnabled(b);
|
||||
@ -654,5 +655,5 @@ void PaletteEditor::EnablePaletteControls()
|
||||
/// <returns>True if both the currently selected palette is editable and if all palettes in the currently selected file are editable.</returns>
|
||||
bool PaletteEditor::IsCurrentPaletteAndFileEditable()
|
||||
{
|
||||
return m_PaletteList->IsModifiable(m_CurrentPaletteFilePath) && !m_GradientColorView->GetPalette(256).m_SourceColors.empty();
|
||||
return m_PaletteList->IsModifiable(m_CurrentPaletteFilePath) && !GetPalette(256).m_SourceColors.empty();
|
||||
}
|
||||
|
Reference in New Issue
Block a user