diff --git a/Source/Fractorium/FractoriumEmberController.cpp b/Source/Fractorium/FractoriumEmberController.cpp index 239066a..1c0838f 100644 --- a/Source/Fractorium/FractoriumEmberController.cpp +++ b/Source/Fractorium/FractoriumEmberController.cpp @@ -200,13 +200,13 @@ void FractoriumEmberController::Update(std::function func, bool u /// The action to add to the rendering queue. Default: eProcessAction::FULL_RENDER. /// True to apply the action to all embers in the file in addition to the curent one, false to apply the action only to the current one. template -void FractoriumEmberController::UpdateAll(std::function& ember)> func, bool updateRender, eProcessAction action, bool applyAll) +void FractoriumEmberController::UpdateAll(std::function& ember, bool isMain)> func, bool updateRender, eProcessAction action, bool applyAll) { - func(m_Ember); + func(m_Ember, true); if (applyAll) for (auto& it : m_EmberFile.m_Embers) - func(it); + func(it, false); if (updateRender) UpdateRender(action); @@ -344,8 +344,10 @@ void FractoriumEmberController::SetEmberPrivate(const Ember& ember, bool v size_t h = m_Ember.m_FinalRasH; m_Ember = ember; - if (updatePointer) - m_EmberFilePointer = &ember; + if (updatePointer && (typeid(T) == typeid(U))) + m_EmberFilePointer = (Ember*)&ember; + else + m_EmberFilePointer = nullptr; if (!verbatim) { diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h index 0e65578..ff27812 100644 --- a/Source/Fractorium/FractoriumEmberController.h +++ b/Source/Fractorium/FractoriumEmberController.h @@ -542,7 +542,7 @@ private: //Rendering/progress. void Update(std::function func, bool updateRender = true, eProcessAction action = eProcessAction::FULL_RENDER); - void UpdateAll(std::function&)> func, bool updateRender = true, eProcessAction action = eProcessAction::FULL_RENDER, bool applyAll = false); + void UpdateAll(std::function&, bool)> func, bool updateRender = true, eProcessAction action = eProcessAction::FULL_RENDER, bool applyAll = false); bool SyncSizes(); //Templated members. @@ -550,7 +550,7 @@ private: vector m_TempOpacities; vector m_NormalizedWeights; Ember m_Ember; - const void* m_EmberFilePointer = nullptr; + Ember* m_EmberFilePointer = nullptr; EmberFile m_EmberFile; EmberFile m_SequenceFile; deque> m_UndoList; diff --git a/Source/Fractorium/FractoriumLibrary.cpp b/Source/Fractorium/FractoriumLibrary.cpp index 4be14bc..283d2b6 100644 --- a/Source/Fractorium/FractoriumLibrary.cpp +++ b/Source/Fractorium/FractoriumLibrary.cpp @@ -261,7 +261,7 @@ void FractoriumEmberController::EmberTreeItemChanged(QTreeWidgetItem* item, i SyncLibrary(eLibraryUpdate::NAME);//Copy all ember names to the tree items since some might have changed to be made unique. newName = emberItem->GetEmber()->m_Name;//Get the new, final, unique name. - if (m_EmberFilePointer == emberItem->GetEmber() && oldName != newName)//If the ember edited was the current one, and the name was indeed changed, update the name of the current one. + if (m_EmberFilePointer && m_EmberFilePointer == emberItem->GetEmber() && oldName != newName)//If the ember edited was the current one, and the name was indeed changed, update the name of the current one. { m_Ember.m_Name = newName; m_LastSaveCurrent = "";//Reset will force the dialog to show on the next save current since the user probably wants a different name. diff --git a/Source/Fractorium/FractoriumMenus.cpp b/Source/Fractorium/FractoriumMenus.cpp index 0dd5631..f1117c6 100644 --- a/Source/Fractorium/FractoriumMenus.cpp +++ b/Source/Fractorium/FractoriumMenus.cpp @@ -833,7 +833,7 @@ void Fractorium::OnActionAddBothSymmetry(bool checked) { m_Controller->AddBothSy template void FractoriumEmberController::Flatten() { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.Flatten(XmlToEmber::m_FlattenNames); }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -848,7 +848,7 @@ void Fractorium::OnActionFlatten(bool checked) { m_Controller->Flatten(); } template void FractoriumEmberController::Unflatten() { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.Unflatten(); }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); diff --git a/Source/Fractorium/FractoriumParams.cpp b/Source/Fractorium/FractoriumParams.cpp index 7463fe5..b60cf1b 100644 --- a/Source/Fractorium/FractoriumParams.cpp +++ b/Source/Fractorium/FractoriumParams.cpp @@ -125,7 +125,7 @@ bool Fractorium::ApplyAll() template void FractoriumEmberController::BrightnessChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_Brightness = d; }, true, eProcessAction::FILTER_AND_ACCUM, m_Fractorium->ApplyAll()); @@ -141,7 +141,7 @@ void Fractorium::OnBrightnessChanged(double d) { m_Controller->BrightnessChanged /// The gamma value template void FractoriumEmberController::GammaChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_Gamma = d; }, true, m_Renderer->EarlyClip() ? eProcessAction::FILTER_AND_ACCUM : eProcessAction::ACCUM_ONLY, m_Fractorium->ApplyAll()); @@ -156,7 +156,7 @@ void Fractorium::OnGammaChanged(double d) { m_Controller->GammaChanged(d); } /// The gamma threshold template void FractoriumEmberController::GammaThresholdChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_GammaThresh = d; }, true, m_Renderer->EarlyClip() ? eProcessAction::FILTER_AND_ACCUM : eProcessAction::ACCUM_ONLY, m_Fractorium->ApplyAll()); @@ -171,7 +171,7 @@ void Fractorium::OnGammaThresholdChanged(double d) { m_Controller->GammaThreshol /// The vibrancy template void FractoriumEmberController::VibrancyChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_Vibrancy = d; }, true, m_Renderer->EarlyClip() ? eProcessAction::FILTER_AND_ACCUM : eProcessAction::ACCUM_ONLY, m_Fractorium->ApplyAll()); @@ -186,7 +186,7 @@ void Fractorium::OnVibrancyChanged(double d) { m_Controller->VibrancyChanged(d); /// The highlight power template void FractoriumEmberController::HighlightPowerChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_HighlightPower = d; }, true, m_Renderer->EarlyClip() ? eProcessAction::FILTER_AND_ACCUM : eProcessAction::ACCUM_ONLY, m_Fractorium->ApplyAll()); @@ -221,7 +221,7 @@ void FractoriumEmberController::BackgroundChanged(const QColor& color) auto b = ToString(color.blue()); colorTable->item(itemRow, 1)->setTextColor(VisibleColor(color)); colorTable->item(itemRow, 1)->setText("rgb(" + r + ", " + g + ", " + b + ")"); - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { //Color is 0-255, normalize to 0-1. ember.m_Background.r = color.red() / 255.0; @@ -240,7 +240,7 @@ void Fractorium::OnColorSelected(const QColor& color) { m_Controller->Background /// The index of the palette mode combo box template void FractoriumEmberController::PaletteModeChanged(uint i) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_PaletteMode = i == 0 ? ePaletteMode::PALETTE_STEP : ePaletteMode::PALETTE_LINEAR; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -258,7 +258,7 @@ void Fractorium::OnPaletteModeComboCurrentIndexChanged(int index) { m_Controller /// Ignored template void FractoriumEmberController::WidthChanged(uint i) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_FinalRasW = i; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -272,7 +272,7 @@ void Fractorium::OnWidthChanged(int i) { m_Controller->WidthChanged(i); } /// Ignored template void FractoriumEmberController::HeightChanged(uint i) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_FinalRasH = i; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -286,7 +286,7 @@ void Fractorium::OnHeightChanged(int i) { m_Controller->HeightChanged(i); } /// The x offset value template void FractoriumEmberController::CenterXChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CenterX = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -300,7 +300,7 @@ void Fractorium::OnCenterXChanged(double d) { m_Controller->CenterXChanged(d); } /// The y offset value template void FractoriumEmberController::CenterYChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CenterY = ember.m_RotCenterY = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -317,7 +317,7 @@ void Fractorium::OnCenterYChanged(double d) { m_Controller->CenterYChanged(d); } /// The scale value template void FractoriumEmberController::ScaleChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_PixelsPerUnit = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -334,7 +334,7 @@ void Fractorium::OnScaleChanged(double d) { m_Controller->ScaleChanged(d); } /// The zoom value template void FractoriumEmberController::ZoomChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_Zoom = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -349,7 +349,7 @@ void Fractorium::OnZoomChanged(double d) { m_Controller->ZoomChanged(d); } /// The rotation in angles template void FractoriumEmberController::RotateChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_Rotate = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -358,7 +358,7 @@ void Fractorium::OnRotateChanged(double d) { m_Controller->RotateChanged(d); } template void FractoriumEmberController::ZPosChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CamZPos = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -367,7 +367,7 @@ void Fractorium::OnZPosChanged(double d) { m_Controller->ZPosChanged(d); } template void FractoriumEmberController::PerspectiveChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CamPerspective = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -376,7 +376,7 @@ void Fractorium::OnPerspectiveChanged(double d) { m_Controller->PerspectiveChang template void FractoriumEmberController::PitchChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CamPitch = d * DEG_2_RAD; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -385,7 +385,7 @@ void Fractorium::OnPitchChanged(double d) { m_Controller->PitchChanged(d); } template void FractoriumEmberController::YawChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CamYaw = d * DEG_2_RAD; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -394,7 +394,7 @@ void Fractorium::OnYawChanged(double d) { m_Controller->YawChanged(d); } template void FractoriumEmberController::DepthBlurChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CamDepthBlur = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -413,7 +413,7 @@ void Fractorium::OnDepthBlurChanged(double d) { m_Controller->DepthBlurChanged(d /// The spatial filter width template void FractoriumEmberController::SpatialFilterWidthChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_SpatialFilterRadius = d; }, true, m_Renderer->EarlyClip() ? eProcessAction::FILTER_AND_ACCUM : eProcessAction::ACCUM_ONLY, m_Fractorium->ApplyAll()); @@ -429,7 +429,7 @@ void Fractorium::OnSpatialFilterWidthChanged(double d) { m_Controller->SpatialFi /// The spatial filter type template void FractoriumEmberController::SpatialFilterTypeChanged(const QString& text) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_SpatialFilterType = SpatialFilterCreator::FromString(text.toStdString()); }, true, m_Renderer->EarlyClip() ? eProcessAction::FILTER_AND_ACCUM : eProcessAction::ACCUM_ONLY, m_Fractorium->ApplyAll()); @@ -446,7 +446,7 @@ void Fractorium::OnSpatialFilterTypeComboCurrentIndexChanged(const QString& text /// The temporal filter width template void FractoriumEmberController::TemporalFilterWidthChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_TemporalFilterWidth = d; }, true, eProcessAction::NOTHING, m_Fractorium->ApplyAll());//Don't do anything until animation is implemented. @@ -462,7 +462,7 @@ void Fractorium::OnTemporalFilterWidthChanged(double d) { m_Controller->Temporal /// The name of the temporal filter template void FractoriumEmberController::TemporalFilterTypeChanged(const QString& text) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_TemporalFilterType = TemporalFilterCreator::FromString(text.toStdString()); }, true, eProcessAction::NOTHING, m_Fractorium->ApplyAll());//Don't do anything until animation is implemented. @@ -479,7 +479,7 @@ void FractoriumEmberController::DEFilterMinRadiusWidthChanged(double d) { if (m_Ember.m_MinRadDE != d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_MinRadDE = d; }, true, eProcessAction::FILTER_AND_ACCUM, m_Fractorium->ApplyAll()); @@ -502,7 +502,7 @@ void FractoriumEmberController::DEFilterMaxRadiusWidthChanged(double d) { if (m_Ember.m_MaxRadDE != d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_MaxRadDE = d; }, true, eProcessAction::FILTER_AND_ACCUM, m_Fractorium->ApplyAll()); @@ -522,7 +522,7 @@ void Fractorium::OnDEFilterMaxRadiusWidthChanged(double d) /// The curve value template void FractoriumEmberController::DEFilterCurveWidthChanged(double d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CurveDE = d; }, true, eProcessAction::FILTER_AND_ACCUM, m_Fractorium->ApplyAll()); @@ -542,7 +542,7 @@ void Fractorium::OnDEFilterCurveWidthChanged(double d) { m_Controller->DEFilterC /// The sub batch size value to set template void FractoriumEmberController::SbsChanged(int d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_SubBatchSize = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -557,7 +557,7 @@ void Fractorium::OnSbsChanged(int d) { m_Controller->SbsChanged(d); } /// The fuse count value to set template void FractoriumEmberController::FuseChanged(int d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_FuseCount = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -590,7 +590,7 @@ void Fractorium::OnQualityChanged(double d) { m_Controller->QualityChanged(d); } /// The supersample value to set template void FractoriumEmberController::SupersampleChanged(int d) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_Supersample = d; }, true, eProcessAction::FULL_RENDER, m_Fractorium->ApplyAll()); @@ -606,7 +606,7 @@ void Fractorium::OnSupersampleChanged(int d) { m_Controller->SupersampleChanged( /// The temporal samples value template void FractoriumEmberController::TemporalSamplesChanged(int i) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_TemporalSamples = i; }, true, eProcessAction::NOTHING, m_Fractorium->ApplyAll());//Don't do anything until animation is implemented. @@ -623,7 +623,7 @@ void Fractorium::OnTemporalSamplesChanged(int d) { m_Controller->TemporalSamples template void FractoriumEmberController::AffineInterpTypeChanged(int i) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { if (i == 0) ember.m_AffineInterp = eAffineInterp::AFFINE_INTERP_LINEAR; @@ -646,7 +646,7 @@ void Fractorium::OnAffineInterpTypeComboCurrentIndexChanged(int index) { m_Contr template void FractoriumEmberController::InterpTypeChanged(int i) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { if (i == 0) ember.m_Interp = eInterp::EMBER_INTERP_LINEAR; @@ -669,7 +669,7 @@ void Fractorium::OnInterpTypeComboCurrentIndexChanged(int index) { m_Controller- template void FractoriumEmberController::SetCenter(double x, double y) { - UpdateAll([&](Ember& ember) + UpdateAll([&](Ember& ember, bool isMain) { ember.m_CenterX = x; ember.m_CenterY = ember.m_RotCenterY = y; diff --git a/Source/Fractorium/FractoriumXforms.cpp b/Source/Fractorium/FractoriumXforms.cpp index ebe2811..2569b89 100644 --- a/Source/Fractorium/FractoriumXforms.cpp +++ b/Source/Fractorium/FractoriumXforms.cpp @@ -402,20 +402,29 @@ void FractoriumEmberController::XformAnimateChanged(int state) { bool final = IsFinal(CurrentXform()); auto index = m_Fractorium->ui.CurrentXformCombo->currentIndex(); - UpdateAll([&](Ember& ember) + T animate = state > 0 ? 1 : 0; + UpdateAll([&](Ember& ember, bool isMain) { if (final)//If the current xform was final, only apply to other embers which also have a final xform. { if (ember.UseFinalXform()) { auto xform = ember.NonConstFinalXform(); - xform->m_Animate = state > 0 ? 1 : 0; + xform->m_Animate = animate; } + + if (!m_Fractorium->ApplyAll()) + if (m_EmberFilePointer && m_EmberFilePointer->UseFinalXform()) + m_EmberFilePointer->NonConstFinalXform()->m_Animate = animate; } else//Current was not final, so apply to other embers which have a non-final xform at this index. { if (auto xform = ember.GetXform(index)) - xform->m_Animate = state > 0 ? 1 : 0; + xform->m_Animate = animate; + + if (!m_Fractorium->ApplyAll() && m_EmberFilePointer) + if (auto xform = m_EmberFilePointer->GetXform(index)) + xform->m_Animate = animate; } }, false, eProcessAction::NOTHING, m_Fractorium->ApplyAll()); }