From d9d676393c2ca326660ff8bfb1d8a7483c1b6fa6 Mon Sep 17 00:00:00 2001 From: mfeemster Date: Sat, 26 Jul 2014 12:03:51 -0700 Subject: [PATCH] 0.4.0.7 Beta 07/26/2014 0.4.0.7 Beta 07/26/2014 --User Changes Color code xforms like Apo does. Change other aspects of xform color drawing. Add option to invert the Y axis to both the options final render dialogs. Coordinate Y axis setting with preview renders. Add option to show all xforms when dragging. Previously, only the current one was shown. Make final render dialog appear in the middle of the screen. Immediately draw yellow selection dot on mouse down. --Bug Fixes Resize final render dialog vertically if it's taller than the 90% of the desktop area. --- .../FractoriumInstaller.wixproj | 2 +- .../VS2010/FractoriumInstaller/Product.wxs | 4 +- Data/Version History.txt | 13 ++ Source/Ember/EmberDefines.h | 2 +- Source/Ember/Renderer.cpp | 21 ++- Source/Ember/Renderer.h | 6 + Source/EmberAnimate/EmberAnimate.rc | 8 +- Source/EmberCL/EmberCLStructs.h | 2 + .../EmberCL/FinalAccumOpenCLKernelCreator.cpp | 9 +- Source/EmberCL/RendererCL.cpp | 1 + Source/EmberGenome/EmberGenome.rc | 8 +- Source/EmberRender/EmberRender.rc | 8 +- Source/Fractorium/AboutDialog.ui | 2 +- Source/Fractorium/FinalRenderDialog.cpp | 19 +++ Source/Fractorium/FinalRenderDialog.h | 2 + Source/Fractorium/FinalRenderDialog.ui | 158 ++++++++++-------- .../Fractorium/FinalRenderEmberController.cpp | 4 + .../Fractorium/FinalRenderEmberController.h | 1 + Source/Fractorium/Fractorium.cpp | 35 +++- Source/Fractorium/Fractorium.h | 3 + Source/Fractorium/Fractorium.rc | Bin 4574 -> 4574 bytes Source/Fractorium/Fractorium.ui | 38 +++-- .../Fractorium/FractoriumEmberController.cpp | 2 + Source/Fractorium/FractoriumInfo.cpp | 4 +- Source/Fractorium/FractoriumPch.h | 2 + Source/Fractorium/FractoriumRender.cpp | 10 ++ Source/Fractorium/FractoriumSettings.cpp | 19 ++- Source/Fractorium/FractoriumSettings.h | 12 ++ Source/Fractorium/FractoriumXforms.cpp | 11 +- Source/Fractorium/GLWidget.cpp | 83 +++++---- Source/Fractorium/GLWidget.h | 2 +- Source/Fractorium/OptionsDialog.cpp | 16 +- Source/Fractorium/OptionsDialog.h | 2 + Source/Fractorium/OptionsDialog.ui | 72 +++++--- 34 files changed, 394 insertions(+), 187 deletions(-) diff --git a/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj b/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj index a9d1cf3..e8c2ec5 100644 --- a/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj +++ b/Builds/MSVC/VS2010/FractoriumInstaller/FractoriumInstaller.wixproj @@ -6,7 +6,7 @@ 3.7 {c8096c47-e358-438c-a520-146d46b0637d} 2.0 - Fractorium_Beta_0.4.0.6 + Fractorium_Beta_0.4.0.7 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets diff --git a/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs b/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs index 959ef86..7ced111 100644 --- a/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs +++ b/Builds/MSVC/VS2010/FractoriumInstaller/Product.wxs @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + ::epsilon()//Apoplugin.h uses -20, but it's more mathematically correct to do it this way. #define ISAAC_SIZE 4 diff --git a/Source/Ember/Renderer.cpp b/Source/Ember/Renderer.cpp index a92dc18..dc962b8 100644 --- a/Source/Ember/Renderer.cpp +++ b/Source/Ember/Renderer.cpp @@ -13,6 +13,7 @@ Renderer::Renderer() m_Abort = false; m_LockAccum = false; m_EarlyClip = false; + m_YAxisUp = false; m_InsertPalette = false; m_ReclaimOnResize = false; m_SubBatchSize = 1024 * 10; @@ -1451,7 +1452,7 @@ eRenderStatus Renderer::AccumulatorToFinalImage(unsigned char* pixel parallel_for((unsigned int)0, FinalRasH(), [&] (unsigned int j) { Color newBucket; - int pixelsRowStart = j * FinalRowSize();//Pull out of inner loop for optimization. + int pixelsRowStart = (m_YAxisUp ? ((FinalRasH() - j) - 1) : j) * FinalRowSize();//Pull out of inner loop for optimization. unsigned int y = m_DensityFilterOffset + (j * Supersample());//Start at the beginning row of each super sample block. unsigned short* p16; @@ -1755,6 +1756,24 @@ void Renderer::EarlyClip(bool earlyClip) ChangeVal([&] { m_EarlyClip = earlyClip; }, FILTER_AND_ACCUM); } +/// +/// Get whether the positive Y coordinate of the final output image is up. +/// Default: false. +/// +/// True if up, else false. +template +bool Renderer::YAxisUp() const { return m_YAxisUp; } + +/// +/// Set whether the positive Y axis of the final output image is up. +/// +/// True if the positive y axis is up, else false. +template +void Renderer::YAxisUp(bool yup) +{ + ChangeVal([&] { m_YAxisUp = yup; }, ACCUM_ONLY); +} + /// /// Get whether to insert the palette as a block of colors in the final output image. /// This is useful for debugging palette issues. diff --git a/Source/Ember/Renderer.h b/Source/Ember/Renderer.h index 77c25fc..c22e88f 100644 --- a/Source/Ember/Renderer.h +++ b/Source/Ember/Renderer.h @@ -111,6 +111,8 @@ public: virtual void ReclaimOnResize(bool reclaimOnResize) { } virtual bool EarlyClip() const { return false; } virtual void EarlyClip(bool earlyClip) { } + virtual bool YAxisUp() const { return false; } + virtual void YAxisUp(bool yup) { } virtual void ThreadCount(unsigned int threads, const char* seedString = NULL) { } virtual void Transparency(bool transparency) { } virtual void InteractiveFilter(eInteractiveFilter filter) { } @@ -221,6 +223,9 @@ public: virtual bool EarlyClip() const; virtual void EarlyClip(bool earlyClip); + virtual bool YAxisUp() const; + virtual void YAxisUp(bool yup); + inline bool InsertPalette() const; void InsertPalette(bool insertPalette); @@ -335,6 +340,7 @@ private: protected: bool m_EarlyClip; + bool m_YAxisUp; bool m_Transparency; unsigned int m_SuperRasW; unsigned int m_SuperRasH; diff --git a/Source/EmberAnimate/EmberAnimate.rc b/Source/EmberAnimate/EmberAnimate.rc index e81789c..b7bbd84 100644 --- a/Source/EmberAnimate/EmberAnimate.rc +++ b/Source/EmberAnimate/EmberAnimate.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,0,6 - PRODUCTVERSION 0,4,0,6 + FILEVERSION 0,4,0,7 + PRODUCTVERSION 0,4,0,7 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Renders fractal flames as animations with motion blur" - VALUE "FileVersion", "0.4.0.6" + VALUE "FileVersion", "0.4.0.7" VALUE "InternalName", "EmberAnimate.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberAnimate.rc" VALUE "ProductName", "Ember Animate" - VALUE "ProductVersion", "0.4.0.6" + VALUE "ProductVersion", "0.4.0.7" END END BLOCK "VarFileInfo" diff --git a/Source/EmberCL/EmberCLStructs.h b/Source/EmberCL/EmberCLStructs.h index 49a2a2f..26328d4 100644 --- a/Source/EmberCL/EmberCLStructs.h +++ b/Source/EmberCL/EmberCLStructs.h @@ -313,6 +313,7 @@ struct ALIGN SpatialFilterCL unsigned int m_BytesPerChannel; unsigned int m_DensityFilterOffset; unsigned int m_Transparency; + unsigned int m_YAxisUp; T m_Vibrancy; T m_HighlightPower; T m_Gamma; @@ -337,6 +338,7 @@ static const char* SpatialFilterCLStructString = " uint m_BytesPerChannel;\n" " uint m_DensityFilterOffset;\n" " uint m_Transparency;\n" +" uint m_YAxisUp;\n" " real_t m_Vibrancy;\n" " real_t m_HighlightPower;\n" " real_t m_Gamma;\n" diff --git a/Source/EmberCL/FinalAccumOpenCLKernelCreator.cpp b/Source/EmberCL/FinalAccumOpenCLKernelCreator.cpp index 5866fd6..f785c66 100644 --- a/Source/EmberCL/FinalAccumOpenCLKernelCreator.cpp +++ b/Source/EmberCL/FinalAccumOpenCLKernelCreator.cpp @@ -65,7 +65,7 @@ template string FinalAccumOpenCLKernelCreator::FinalAccumLateCli template string FinalAccumOpenCLKernelCreator::GammaCorrectionEntryPoint(unsigned int channels, bool transparency) { - bool alphaCalc = (channels > 3 && transparency); + bool alphaCalc = ((channels > 3) && transparency); return alphaCalc ? m_GammaCorrectionWithAlphaCalcEntryPoint : m_GammaCorrectionWithoutAlphaCalcEntryPoint; } @@ -78,7 +78,7 @@ string FinalAccumOpenCLKernelCreator::GammaCorrectionEntryPoint(unsigned int template string FinalAccumOpenCLKernelCreator::GammaCorrectionKernel(unsigned int channels, bool transparency) { - bool alphaCalc = (channels > 3 && transparency); + bool alphaCalc = ((channels > 3) && transparency); return alphaCalc ? m_GammaCorrectionWithAlphaCalcKernel : m_GammaCorrectionWithoutAlphaCalcKernel; } @@ -94,7 +94,7 @@ string FinalAccumOpenCLKernelCreator::GammaCorrectionKernel(unsigned int chan template string FinalAccumOpenCLKernelCreator::FinalAccumEntryPoint(bool earlyClip, unsigned int channels, bool transparency, T& alphaBase, T& alphaScale) { - bool alphaCalc = (channels > 3 && transparency); + bool alphaCalc = ((channels > 3) && transparency); bool alphaAccum = channels > 3; if (alphaAccum) @@ -241,10 +241,9 @@ string FinalAccumOpenCLKernelCreator::CreateFinalAccumKernelString(bool early "\n" " unsigned int accumX = spatialFilter->m_DensityFilterOffset + (GLOBAL_ID_X * spatialFilter->m_Supersample);\n" " unsigned int accumY = spatialFilter->m_DensityFilterOffset + (GLOBAL_ID_Y * spatialFilter->m_Supersample);\n" - " int2 finalCoord;\n" " finalCoord.x = GLOBAL_ID_X;\n" - " finalCoord.y = GLOBAL_ID_Y;\n" + " finalCoord.y = (int)((spatialFilter->m_YAxisUp == 1) ? ((spatialFilter->m_FinalRasH - GLOBAL_ID_Y) - 1) : GLOBAL_ID_Y);\n" " float4floats finalColor;\n" " real_t alpha, ls;\n" " int ii, jj;\n" diff --git a/Source/EmberCL/RendererCL.cpp b/Source/EmberCL/RendererCL.cpp index 4e14109..800ee13 100644 --- a/Source/EmberCL/RendererCL.cpp +++ b/Source/EmberCL/RendererCL.cpp @@ -1250,6 +1250,7 @@ SpatialFilterCL RendererCL::ConvertSpatialFilter() filterCL.m_BytesPerChannel = BytesPerChannel(); filterCL.m_DensityFilterOffset = DensityFilterOffset(); filterCL.m_Transparency = Transparency(); + filterCL.m_YAxisUp = (unsigned int)m_YAxisUp; filterCL.m_Vibrancy = vibrancy; filterCL.m_HighlightPower = HighlightPower(); filterCL.m_Gamma = g; diff --git a/Source/EmberGenome/EmberGenome.rc b/Source/EmberGenome/EmberGenome.rc index b8b10bf..9938fe1 100644 --- a/Source/EmberGenome/EmberGenome.rc +++ b/Source/EmberGenome/EmberGenome.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,0,6 - PRODUCTVERSION 0,4,0,6 + FILEVERSION 0,4,0,7 + PRODUCTVERSION 0,4,0,7 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Manipulates fractal flames parameter files" - VALUE "FileVersion", "0.4.0.6" + VALUE "FileVersion", "0.4.0.7" VALUE "InternalName", "EmberGenome.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberGenome.rc" VALUE "ProductName", "Ember Genome" - VALUE "ProductVersion", "0.4.0.6" + VALUE "ProductVersion", "0.4.0.7" END END BLOCK "VarFileInfo" diff --git a/Source/EmberRender/EmberRender.rc b/Source/EmberRender/EmberRender.rc index e76496c..a15adc8 100644 --- a/Source/EmberRender/EmberRender.rc +++ b/Source/EmberRender/EmberRender.rc @@ -49,8 +49,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,4,0,6 - PRODUCTVERSION 0,4,0,6 + FILEVERSION 0,4,0,7 + PRODUCTVERSION 0,4,0,7 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -67,12 +67,12 @@ BEGIN BEGIN VALUE "CompanyName", "Open Source" VALUE "FileDescription", "Renders fractal flames as single images" - VALUE "FileVersion", "0.4.0.6" + VALUE "FileVersion", "0.4.0.7" VALUE "InternalName", "EmberRender.rc" VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2013, GPL v3" VALUE "OriginalFilename", "EmberRender.rc" VALUE "ProductName", "Ember Render" - VALUE "ProductVersion", "0.4.0.6" + VALUE "ProductVersion", "0.4.0.7" END END BLOCK "VarFileInfo" diff --git a/Source/Fractorium/AboutDialog.ui b/Source/Fractorium/AboutDialog.ui index c3faee0..95933a5 100644 --- a/Source/Fractorium/AboutDialog.ui +++ b/Source/Fractorium/AboutDialog.ui @@ -52,7 +52,7 @@ - <html><head/><body><p align="center"><br/><span style=" font-size:12pt;">Fractorium 0.4.0.6 Beta</span></p><p align="center"><span style=" font-size:10pt;"><br/>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"><span style=" font-size:10pt;">Matt Feemster</span></p></body></html> + <html><head/><body><p align="center"><br/><span style=" font-size:12pt;">Fractorium 0.4.0.7 Beta</span></p><p align="center"><span style=" font-size:10pt;"><br/>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"><span style=" font-size:10pt;">Matt Feemster</span></p></body></html> Qt::RichText diff --git a/Source/Fractorium/FinalRenderDialog.cpp b/Source/Fractorium/FinalRenderDialog.cpp index f4ad550..bf0f4d9 100644 --- a/Source/Fractorium/FinalRenderDialog.cpp +++ b/Source/Fractorium/FinalRenderDialog.cpp @@ -25,6 +25,7 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set m_Settings = settings; ui.FinalRenderThreadCountSpin->setRange(1, Timing::ProcessorCount()); connect(ui.FinalRenderEarlyClipCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnEarlyClipCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.FinalRenderYAxisUpCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnYAxisUpCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.FinalRenderTransparencyCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnTransparencyCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.FinalRenderOpenCLCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnOpenCLCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.FinalRenderDoublePrecisionCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnDoublePrecisionCheckBoxStateChanged(int)), Qt::QueuedConnection); @@ -87,6 +88,7 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set } ui.FinalRenderEarlyClipCheckBox->setChecked( m_Settings->FinalEarlyClip()); + ui.FinalRenderYAxisUpCheckBox->setChecked( m_Settings->FinalYAxisUp()); ui.FinalRenderTransparencyCheckBox->setChecked( m_Settings->FinalTransparency()); ui.FinalRenderDoublePrecisionCheckBox->setChecked(m_Settings->FinalDouble()); ui.FinalRenderSaveXmlCheckBox->setChecked( m_Settings->FinalSaveXml()); @@ -111,6 +113,12 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set //Explicitly call these to enable/disable the appropriate controls. OnOpenCLCheckBoxStateChanged(ui.FinalRenderOpenCLCheckBox->isChecked()); OnDoAllCheckBoxStateChanged(ui.FinalRenderDoAllCheckBox->isChecked()); + + QSize s = size(); + int desktopHeight = qApp->desktop()->availableGeometry().height(); + + s.setHeight(min(s.height(), (int)((double)desktopHeight * 0.90))); + setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, qApp->desktop()->availableGeometry())); } /// @@ -118,6 +126,7 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set /// bool FractoriumFinalRenderDialog::EarlyClip() { return ui.FinalRenderEarlyClipCheckBox->isChecked(); } +bool FractoriumFinalRenderDialog::YAxisUp() { return ui.FinalRenderYAxisUpCheckBox->isChecked(); } bool FractoriumFinalRenderDialog::Transparency() { return ui.FinalRenderTransparencyCheckBox->isChecked(); } bool FractoriumFinalRenderDialog::OpenCL() { return ui.FinalRenderOpenCLCheckBox->isChecked(); } bool FractoriumFinalRenderDialog::Double() { return ui.FinalRenderDoublePrecisionCheckBox->isChecked(); } @@ -149,6 +158,7 @@ FinalRenderGuiState FractoriumFinalRenderDialog::State() FinalRenderGuiState state; state.m_EarlyClip = EarlyClip(); + state.m_YAxisUp = YAxisUp(); state.m_Transparency = Transparency(); state.m_OpenCL = OpenCL(); state.m_Double = Double(); @@ -223,6 +233,15 @@ void FractoriumFinalRenderDialog::OnEarlyClipCheckBoxStateChanged(int state) SetMemory(); } +/// +/// Whether the positive Y axis of the final output image is up. +/// +/// True if the positive y axis is up, else false. +void FractoriumFinalRenderDialog::OnYAxisUpCheckBoxStateChanged(int state) +{ + SetMemory(); +} + /// /// Whether to use transparency in png images. /// diff --git a/Source/Fractorium/FinalRenderDialog.h b/Source/Fractorium/FinalRenderDialog.h index 299592d..d188b7f 100644 --- a/Source/Fractorium/FinalRenderDialog.h +++ b/Source/Fractorium/FinalRenderDialog.h @@ -45,6 +45,7 @@ class FractoriumFinalRenderDialog : public QDialog public: FractoriumFinalRenderDialog(FractoriumSettings* settings, QWidget* parent, Qt::WindowFlags f = 0); bool EarlyClip(); + bool YAxisUp(); bool Transparency(); bool OpenCL(); bool Double(); @@ -72,6 +73,7 @@ public: public Q_SLOTS: void MoveCursorToEnd(); void OnEarlyClipCheckBoxStateChanged(int state); + void OnYAxisUpCheckBoxStateChanged(int state); void OnTransparencyCheckBoxStateChanged(int state); void OnOpenCLCheckBoxStateChanged(int state); void OnDoublePrecisionCheckBoxStateChanged(int state); diff --git a/Source/Fractorium/FinalRenderDialog.ui b/Source/Fractorium/FinalRenderDialog.ui index 2d35c28..db9da53 100644 --- a/Source/Fractorium/FinalRenderDialog.ui +++ b/Source/Fractorium/FinalRenderDialog.ui @@ -7,7 +7,7 @@ 0 0 519 - 801 + 813 @@ -61,7 +61,7 @@ 0 0 507 - 789 + 801 @@ -82,77 +82,7 @@ - - - - Render all open flames instead of just the current one - - - Render All - - - - - - - Use temporal samples value to achieve motion blur effect between flames - - - Render as Animation Sequence - - - - - - - <html><head/><body><p>Checked: use 64-bit double precision numbers (slower, but better image quality).</p><p>Unchecked: use 32-bit single precision numbers (faster, but worse image quality).</p></body></html> - - - Use Double Precision - - - - - - - <html><head/><body><p>Use OpenCL to render if your video card supports it.</p><p>This is highly recommended as it will dramatically speed up render time.</p></body></html> - - - Use OpenCL - - - - - - - <html><head/><body><p>Checked: clip colors and gamma correct after density filtering.</p><p>Unchecked: do it after spatial filtering.</p></body></html> - - - Early Clip - - - - - - - Save an Xml parameter file for each flame rendered - - - Save Xml - - - - - - - <html><head/><body><p>Use transparency in the final image.</p><p>Only supported for Png format.</p></body></html> - - - Transparency - - - - + @@ -212,7 +142,7 @@ - + @@ -283,6 +213,26 @@ + + + + <html><head/><body><p>Checked: clip colors and gamma correct after density filtering.</p><p>Unchecked: do it after spatial filtering.</p></body></html> + + + Early Clip + + + + + + + Save an Xml parameter file for each flame rendered + + + Save Xml + + + @@ -296,6 +246,66 @@ + + + + Use temporal samples value to achieve motion blur effect between flames + + + Render as Animation Sequence + + + + + + + Render all open flames instead of just the current one + + + Render All + + + + + + + <html><head/><body><p>Checked: Positive Y direction is up.</p><p>Unchecked: Positive Y direction is down.</p></body></html> + + + Positive Y Up + + + + + + + <html><head/><body><p>Checked: use 64-bit double precision numbers (slower, but better image quality).</p><p>Unchecked: use 32-bit single precision numbers (faster, but worse image quality).</p></body></html> + + + Use Double Precision + + + + + + + <html><head/><body><p>Use OpenCL to render if your video card supports it.</p><p>This is highly recommended as it will dramatically speed up render time.</p></body></html> + + + Use OpenCL + + + + + + + <html><head/><body><p>Use transparency in the final image.</p><p>Only supported for Png format.</p></body></html> + + + Transparency + + + diff --git a/Source/Fractorium/FinalRenderEmberController.cpp b/Source/Fractorium/FinalRenderEmberController.cpp index 55fb19b..2ca9564 100644 --- a/Source/Fractorium/FinalRenderEmberController.cpp +++ b/Source/Fractorium/FinalRenderEmberController.cpp @@ -116,6 +116,7 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD QApplication::processEvents(); m_PreviewRenderer->EarlyClip(m_FinalRender->EarlyClip()); + m_PreviewRenderer->YAxisUp(m_FinalRender->YAxisUp()); m_PreviewRenderer->Transparency(m_FinalRender->Transparency()); m_PreviewRenderer->SetEmber(m_PreviewEmber); @@ -158,6 +159,7 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD QMetaObject::invokeMethod(m_FinalRender->ui.FinalRenderTextOutput, "setText", Qt::QueuedConnection, Q_ARG(QString, "Begin rendering...")); m_Renderer->EarlyClip(m_GuiState.m_EarlyClip); + m_Renderer->YAxisUp(m_GuiState.m_YAxisUp); m_Renderer->ThreadCount(m_GuiState.m_ThreadCount); m_Renderer->Transparency(m_GuiState.m_Transparency); @@ -312,6 +314,7 @@ int FinalRenderEmberController::ProgressFunc(Ember& ember, void* foo, doub //Save whatever options were specified on the GUI to the settings. m_Settings->FinalEarlyClip(m_GuiState.m_EarlyClip); + m_Settings->FinalYAxisUp(m_GuiState.m_YAxisUp); m_Settings->FinalTransparency(m_GuiState.m_Transparency); m_Settings->FinalOpenCL(m_GuiState.m_OpenCL); m_Settings->FinalDouble(m_GuiState.m_Double); @@ -463,6 +466,7 @@ bool FinalRenderEmberController::CreateRenderer(eRendererType renderType, uns m_Renderer->NumChannels(channels); m_Renderer->ReclaimOnResize(false); m_Renderer->EarlyClip(m_FinalRender->EarlyClip()); + m_Renderer->YAxisUp(m_FinalRender->YAxisUp()); m_Renderer->ThreadCount(m_FinalRender->ThreadCount()); m_Renderer->Transparency(m_FinalRender->Transparency()); } diff --git a/Source/Fractorium/FinalRenderEmberController.h b/Source/Fractorium/FinalRenderEmberController.h index f5a0218..82ef798 100644 --- a/Source/Fractorium/FinalRenderEmberController.h +++ b/Source/Fractorium/FinalRenderEmberController.h @@ -20,6 +20,7 @@ class FractoriumFinalRenderDialog; struct FinalRenderGuiState { bool m_EarlyClip; + bool m_YAxisUp; bool m_AlphaChannel; bool m_Transparency; bool m_OpenCL; diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp index 3429e53..285bd4a 100644 --- a/Source/Fractorium/Fractorium.cpp +++ b/Source/Fractorium/Fractorium.cpp @@ -10,8 +10,8 @@ Fractorium::Fractorium(QWidget* parent) : QMainWindow(parent) { - int spinHeight = 20; - size_t i, j; + int spinHeight = 20, iconSize = 9; + size_t i = 0; Timing t; ui.setupUi(this); qRegisterMetaType>("QVector");//For previews. @@ -34,6 +34,37 @@ Fractorium::Fractorium(QWidget* parent) m_OptionsDialog->setSizeGripEnabled(false); connect(m_ColorDialog, SIGNAL(colorSelected(const QColor&)), this, SLOT(OnColorSelected(const QColor&)), Qt::QueuedConnection); + m_XformComboColors[i++] = QColor(0XFF, 0X00, 0X00); + m_XformComboColors[i++] = QColor(0XCC, 0XCC, 0X00); + m_XformComboColors[i++] = QColor(0X00, 0XCC, 0X00); + m_XformComboColors[i++] = QColor(0X00, 0XCC, 0XCC); + m_XformComboColors[i++] = QColor(0X40, 0X40, 0XFF); + + m_XformComboColors[i++] = QColor(0XCC, 0X00, 0XCC); + m_XformComboColors[i++] = QColor(0XCC, 0X80, 0X00); + m_XformComboColors[i++] = QColor(0X80, 0X00, 0X4F); + m_XformComboColors[i++] = QColor(0X80, 0X80, 0X22); + m_XformComboColors[i++] = QColor(0X60, 0X80, 0X60); + + m_XformComboColors[i++] = QColor(0X50, 0X80, 0X80); + m_XformComboColors[i++] = QColor(0X4F, 0X4F, 0X80); + m_XformComboColors[i++] = QColor(0X80, 0X50, 0X80); + m_XformComboColors[i++] = QColor(0X80, 0X60, 0X22); + m_FinalXformComboColor = QColor(0x7F, 0x7F, 0x7F); + + for (i = 0; i < XFORM_COLOR_COUNT; i++) + { + QPixmap pixmap(iconSize, iconSize); + + pixmap.fill(m_XformComboColors[i]); + m_XformComboIcons[i] = QIcon(pixmap); + } + + QPixmap pixmap(iconSize, iconSize); + + pixmap.fill(m_FinalXformComboColor); + m_FinalXformComboIcon = QIcon(pixmap); + InitToolbarUI(); InitParamsUI(); InitXformsUI(); diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index 982ebd9..c2dc2a8 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -117,6 +117,7 @@ public slots: void OnActionFinalRender(bool checked); void OnFinalRenderClose(int result); void OnActionOptions(bool checked); + void OnActionAbout(bool checked);//Help. //Toolbar. @@ -388,6 +389,8 @@ private: char m_HString[16]; char m_DEString[16]; char m_CoordinateString[128]; + QColor m_XformComboColors[XFORM_COLOR_COUNT], m_FinalXformComboColor; + QIcon m_XformComboIcons[XFORM_COLOR_COUNT], m_FinalXformComboIcon; int m_FontSize; int m_VarSortMode; diff --git a/Source/Fractorium/Fractorium.rc b/Source/Fractorium/Fractorium.rc index 8911044d063ed224c5ed60a27368cdfb4f024bf5..cbc6af5af91c5acb1ad969c22a77ed2adea73444 100644 GIT binary patch delta 46 wcmcbod{23U7YC#HWN!{bM)S?J9PG?Mjv|-%WC32W&6~KHm>}HEXLyBJ059}HEXLyBJ056COzyJUM diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui index 564b366..8806d71 100644 --- a/Source/Fractorium/Fractorium.ui +++ b/Source/Fractorium/Fractorium.ui @@ -340,7 +340,7 @@ QTabWidget::Triangular - 0 + 2 true @@ -1993,7 +1993,7 @@ - 4 + 2 @@ -2005,13 +2005,13 @@ - 50 + 60 22 - 40 + 60 16777215 @@ -2024,6 +2024,15 @@ 12 + + + 9 + 9 + + + + true + @@ -2036,7 +2045,7 @@ - 30 + 25 0 @@ -2062,7 +2071,7 @@ - 30 + 25 0 @@ -2088,7 +2097,7 @@ - 30 + 25 0 @@ -2114,7 +2123,7 @@ - 30 + 25 0 @@ -2140,13 +2149,13 @@ - 50 + 58 0 - 60 + 58 16777215 @@ -2730,8 +2739,8 @@ SpinBox 0 0 - 238 - 752 + 118 + 597 @@ -5615,6 +5624,11 @@ SpinBox Remove the Flatten variation from each xform + + + Fl&ip + + diff --git a/Source/Fractorium/FractoriumEmberController.cpp b/Source/Fractorium/FractoriumEmberController.cpp index a8c2b97..bdfefad 100644 --- a/Source/Fractorium/FractoriumEmberController.cpp +++ b/Source/Fractorium/FractoriumEmberController.cpp @@ -80,6 +80,8 @@ FractoriumEmberController::FractoriumEmberController(Fractorium* fractorium) m_PreviewRenderer->Callback(NULL); m_PreviewRenderer->NumChannels(4); m_PreviewRenderer->ReclaimOnResize(true); + m_PreviewRenderer->EarlyClip(m_Fractorium->m_Settings->EarlyClip()); + m_PreviewRenderer->YAxisUp(m_Fractorium->m_Settings->YAxisUp()); m_PreviewRenderer->SetEmber(m_Ember);//Give it an initial ember, will be updated many times later. //m_PreviewRenderer->ThreadCount(1);//For debugging. diff --git a/Source/Fractorium/FractoriumInfo.cpp b/Source/Fractorium/FractoriumInfo.cpp index fad2927..8e283c5 100644 --- a/Source/Fractorium/FractoriumInfo.cpp +++ b/Source/Fractorium/FractoriumInfo.cpp @@ -12,8 +12,8 @@ void Fractorium::UpdateHistogramBounds() { sprintf_s(m_ULString, 32, "UL: %3.3f, %3.3f", r->LowerLeftX(), r->UpperRightY());//These bounds include gutter padding. sprintf_s(m_URString, 32, "UR: %3.3f, %3.3f", -r->LowerLeftX(), r->UpperRightY()); - sprintf_s(m_LRString, 32, "LR: %3.3f, %3.3f", -r->LowerLeftX(), -r->UpperRightY()); - sprintf_s(m_LLString, 32, "LL: %3.3f, %3.3f", r->LowerLeftX(), -r->UpperRightY()); + sprintf_s(m_LRString, 32, "LR: %3.3f, %3.3f", -r->LowerLeftX(), r->LowerLeftY()); + sprintf_s(m_LLString, 32, "LL: %3.3f, %3.3f", r->LowerLeftX(), r->LowerLeftY()); sprintf_s(m_WString, 16, "W: %4d" , r->SuperRasW()); sprintf_s(m_HString, 16, "H: %4d" , r->SuperRasH()); diff --git a/Source/Fractorium/FractoriumPch.h b/Source/Fractorium/FractoriumPch.h index 9fc1d72..df82582 100644 --- a/Source/Fractorium/FractoriumPch.h +++ b/Source/Fractorium/FractoriumPch.h @@ -39,6 +39,8 @@ #include "glm/gtc/matrix_transform.hpp" #include "glm/gtc/type_ptr.hpp" +#define XFORM_COLOR_COUNT 14 + using namespace std; using namespace EmberNs; using namespace EmberCLns; \ No newline at end of file diff --git a/Source/Fractorium/FractoriumRender.cpp b/Source/Fractorium/FractoriumRender.cpp index 19cda2f..505bba8 100644 --- a/Source/Fractorium/FractoriumRender.cpp +++ b/Source/Fractorium/FractoriumRender.cpp @@ -478,6 +478,7 @@ bool FractoriumEmberController::CreateRenderer(eRendererType renderType, unsi m_Renderer->ReclaimOnResize(true); m_Renderer->SetEmber(m_Ember);//Give it an initial ember, will be updated many times later. m_Renderer->EarlyClip(s->EarlyClip()); + m_Renderer->YAxisUp(s->YAxisUp()); m_Renderer->ThreadCount(s->ThreadCount()); m_Renderer->Transparency(s->Transparency()); @@ -486,6 +487,15 @@ bool FractoriumEmberController::CreateRenderer(eRendererType renderType, unsi else m_Renderer->InteractiveFilter(s->OpenCLDEFilter() ? FILTER_DE : FILTER_LOG); + if ((m_Renderer->EarlyClip() != m_PreviewRenderer->EarlyClip()) || + (m_Renderer->YAxisUp() != m_PreviewRenderer->YAxisUp())) + { + StopPreviewRender(); + m_PreviewRenderer->EarlyClip(m_Renderer->EarlyClip()); + m_PreviewRenderer->YAxisUp(m_Renderer->YAxisUp()); + RenderPreviews(); + } + m_FailedRenders = 0; m_RenderElapsedTimer.Tic(); //Leave rendering in a stopped state. The caller is responsible for restarting the render loop again. diff --git a/Source/Fractorium/FractoriumSettings.cpp b/Source/Fractorium/FractoriumSettings.cpp index 8f1fe42..4cb8a94 100644 --- a/Source/Fractorium/FractoriumSettings.cpp +++ b/Source/Fractorium/FractoriumSettings.cpp @@ -54,7 +54,7 @@ void FractoriumSettings::EnsureDefaults() FinalThreadCount(Timing::ProcessorCount()); if (CpuSubBatch() < 1) - CpuSubBatch(10); + CpuSubBatch(1); if (OpenCLSubBatch() < 1) OpenCLSubBatch(1); @@ -99,15 +99,21 @@ void FractoriumSettings::EnsureDefaults() bool FractoriumSettings::EarlyClip() { return value(EARLYCLIP).toBool(); } void FractoriumSettings::EarlyClip(bool b) { setValue(EARLYCLIP, b); } - + +bool FractoriumSettings::YAxisUp() { return value(YAXISUP).toBool(); } +void FractoriumSettings::YAxisUp(bool b) { setValue(YAXISUP, b); } + bool FractoriumSettings::Transparency() { return value(TRANSPARENCY).toBool(); } void FractoriumSettings::Transparency(bool b) { setValue(TRANSPARENCY, b); } +bool FractoriumSettings::OpenCL() { return value(OPENCL).toBool(); } +void FractoriumSettings::OpenCL(bool b) { setValue(OPENCL, b); } + bool FractoriumSettings::Double() { return value(DOUBLEPRECISION).toBool(); } void FractoriumSettings::Double(bool b) { setValue(DOUBLEPRECISION, b); } -bool FractoriumSettings::OpenCL() { return value(OPENCL).toBool(); } -void FractoriumSettings::OpenCL(bool b) { setValue(OPENCL, b); } +bool FractoriumSettings::ShowAllXforms() { return value(SHOWALLXFORMS).toBool(); } +void FractoriumSettings::ShowAllXforms(bool b) { setValue(SHOWALLXFORMS, b); } unsigned int FractoriumSettings::PlatformIndex() { return value(PLATFORMINDEX).toUInt(); } void FractoriumSettings::PlatformIndex(unsigned int i) { setValue(PLATFORMINDEX, i); } @@ -136,7 +142,10 @@ void FractoriumSettings::OpenCLSubBatch(unsigned int b) { setValue(OPENCLSUBB bool FractoriumSettings::FinalEarlyClip() { return value(FINALEARLYCLIP).toBool(); } void FractoriumSettings::FinalEarlyClip(bool b) { setValue(FINALEARLYCLIP, b); } - + +bool FractoriumSettings::FinalYAxisUp() { return value(FINALYAXISUP).toBool(); } +void FractoriumSettings::FinalYAxisUp(bool b) { setValue(FINALYAXISUP, b); } + bool FractoriumSettings::FinalTransparency() { return value(FINALTRANSPARENCY).toBool(); } void FractoriumSettings::FinalTransparency(bool b) { setValue(FINALTRANSPARENCY, b); } diff --git a/Source/Fractorium/FractoriumSettings.h b/Source/Fractorium/FractoriumSettings.h index bc263fc..cb7dfa5 100644 --- a/Source/Fractorium/FractoriumSettings.h +++ b/Source/Fractorium/FractoriumSettings.h @@ -7,9 +7,11 @@ /// #define EARLYCLIP "render/earlyclip" +#define YAXISUP "render/yaxisup" #define TRANSPARENCY "render/transparency" #define OPENCL "render/opencl" #define DOUBLEPRECISION "render/dp64" +#define SHOWALLXFORMS "render/dragshowallxforms" #define PLATFORMINDEX "render/platformindex" #define DEVICEINDEX "render/deviceindex" #define THREADCOUNT "render/threadcount" @@ -19,6 +21,7 @@ #define OPENCLSUBBATCH "render/openclsubbatch" #define FINALEARLYCLIP "finalrender/earlyclip" +#define FINALYAXISUP "finalrender/finalyaxisup" #define FINALTRANSPARENCY "finalrender/transparency" #define FINALOPENCL "finalrender/opencl" #define FINALDOUBLEPRECISION "finalrender/dp64" @@ -69,6 +72,9 @@ public: bool EarlyClip(); void EarlyClip(bool b); + + bool YAxisUp(); + void YAxisUp(bool b); bool Transparency(); void Transparency(bool b); @@ -79,6 +85,9 @@ public: bool Double(); void Double(bool b); + bool ShowAllXforms(); + void ShowAllXforms(bool b); + unsigned int PlatformIndex(); void PlatformIndex(unsigned int b); @@ -102,6 +111,9 @@ public: bool FinalEarlyClip(); void FinalEarlyClip(bool b); + + bool FinalYAxisUp(); + void FinalYAxisUp(bool b); bool FinalTransparency(); void FinalTransparency(bool b); diff --git a/Source/Fractorium/FractoriumXforms.cpp b/Source/Fractorium/FractoriumXforms.cpp index 689bb95..9419d8e 100644 --- a/Source/Fractorium/FractoriumXforms.cpp +++ b/Source/Fractorium/FractoriumXforms.cpp @@ -201,6 +201,7 @@ void FractoriumEmberController::AddFinalXform() xform.AddVariation(new LinearVariation());//Just a placeholder so other parts of the code don't see it as being empty. m_Ember.SetFinalXform(xform); combo->addItem("Final"); + combo->setItemIcon(combo->count() - 1, m_Fractorium->m_FinalXformComboIcon); combo->setCurrentIndex(combo->count() - 1);//Set index to the last item. UpdateRender(); } @@ -325,17 +326,23 @@ bool FractoriumEmberController::IsFinal(Xform* xform) /// void Fractorium::FillXforms() { - int spinHeight = 20; + int i = 0, spinHeight = 20; QComboBox* combo = ui.CurrentXformCombo; combo->blockSignals(true); combo->clear(); - for (int i = 0; i < m_Controller->XformCount(); i++) + for (i = 0; i < m_Controller->XformCount(); i++) + { combo->addItem(QString::number(i + 1)); + combo->setItemIcon(i, m_XformComboIcons[i % XFORM_COLOR_COUNT]); + } if (m_Controller->UseFinalXform()) + { combo->addItem("Final"); + combo->setItemIcon(i, m_FinalXformComboIcon); + } combo->blockSignals(false); combo->setCurrentIndex(0); diff --git a/Source/Fractorium/GLWidget.cpp b/Source/Fractorium/GLWidget.cpp index dc6828b..bad50bd 100644 --- a/Source/Fractorium/GLWidget.cpp +++ b/Source/Fractorium/GLWidget.cpp @@ -275,6 +275,7 @@ void GLEmberController::DrawAffines(bool pre, bool post) { QueryVMP();//Resolves to float or double specialization function depending on T. Ember* ember = m_FractoriumEmberController->CurrentEmber(); + bool dragging = m_DragState == DragDragging; //Draw grid if control key is pressed. if ((m_DragModifier & DragModControl) == DragModControl) @@ -282,27 +283,21 @@ void GLEmberController::DrawAffines(bool pre, bool post) m_GL->glLineWidth(1.0f); m_GL->DrawGrid(); } + //When dragging, only draw the selected xform's affine and hide all others. - if (m_DragState == DragDragging) + if (!m_Fractorium->m_Settings->ShowAllXforms() && dragging) { if (m_SelectedXform) DrawAffine(m_SelectedXform, m_AffineType == AffinePre, true); - - m_GL->glPointSize(6.0f);//Draw large yellow dot on select or drag. - m_GL->glBegin(GL_POINTS); - m_GL->glColor4f(1.0f, 1.0f, 0.5f, 1.0f); - m_GL->glVertex2f(m_DragHandlePos.x, m_DragHandlePos.y); - m_GL->glEnd(); - m_GL->glPointSize(1.0f);//Restore point size. } - else//Not dragging, just hovering/mouse move. + else//Show all while dragging, or not dragging just hovering/mouse move. { if (pre && m_Fractorium->DrawAllPre())//Draw all pre affine if specified. { for (unsigned int i = 0; i < ember->TotalXformCount(); i++) { Xform* xform = ember->GetTotalXform(i); - bool selected = m_HoverXform == xform; + bool selected = dragging ? (m_SelectedXform == xform) : (m_HoverXform == xform); DrawAffine(xform, true, selected); } @@ -317,7 +312,7 @@ void GLEmberController::DrawAffines(bool pre, bool post) for (unsigned int i = 0; i < ember->TotalXformCount(); i++) { Xform* xform = ember->GetTotalXform(i); - bool selected = m_HoverXform == xform; + bool selected = dragging ? (m_SelectedXform == xform) : (m_HoverXform == xform); DrawAffine(xform, false, selected); } @@ -326,17 +321,25 @@ void GLEmberController::DrawAffines(bool pre, bool post) { DrawAffine(m_HoverXform, false, true); } + } - //Draw large turquoise dot on hover if they are hovering over the selected xform. - if (m_HoverType != HoverNone && m_HoverXform == m_SelectedXform) - { - m_GL->glPointSize(6.0f); - m_GL->glBegin(GL_POINTS); - m_GL->glColor4f(0.5f, 1.0f, 1.0f, 1.0f); - m_GL->glVertex2f(m_HoverHandlePos.x, m_HoverHandlePos.y); - m_GL->glEnd(); - m_GL->glPointSize(1.0f); - } + if (dragging)//Draw large yellow dot on select or drag. + { + m_GL->glPointSize(6.0f); + m_GL->glBegin(GL_POINTS); + m_GL->glColor4f(1.0f, 1.0f, 0.5f, 1.0f); + m_GL->glVertex2f(m_DragHandlePos.x, m_DragHandlePos.y); + m_GL->glEnd(); + m_GL->glPointSize(1.0f);//Restore point size. + } + else if (m_HoverType != HoverNone && m_HoverXform == m_SelectedXform)//Draw large turquoise dot on hover if they are hovering over the selected xform. + { + m_GL->glPointSize(6.0f); + m_GL->glBegin(GL_POINTS); + m_GL->glColor4f(0.5f, 1.0f, 1.0f, 1.0f); + m_GL->glVertex2f(m_HoverHandlePos.x, m_HoverHandlePos.y); + m_GL->glEnd(); + m_GL->glPointSize(1.0f); } } @@ -473,6 +476,13 @@ void GLEmberController::MousePress(QMouseEvent* e) //The user has selected an xform by clicking on it, so update the main GUI by selecting this xform in the combo box. m_Fractorium->CurrentXform(xformIndex); + + //Update selected xform dot. + bool pre = m_Fractorium->ui.PreAffineGroupBox->isChecked(); + bool post = m_Fractorium->ui.PostAffineGroupBox->isChecked(); + + DrawAffines(pre, post); + m_GL->update(); } else//Nothing was selected. { @@ -937,6 +947,7 @@ void GLEmberController::DrawAffine(Xform* xform, bool pre, bool selected) { Ember* ember = m_FractoriumEmberController->CurrentEmber(); bool final = ember->IsFinalXform(xform); + int index = ember->GetXformIndex(xform); size_t size = ember->m_Palette.m_Entries.size(); v4T color = ember->m_Palette.m_Entries[Clamp(xform->m_ColorX * size, 0, size - 1)]; Affine2D* affine = pre ? &xform->m_Affine : &xform->m_Post; @@ -950,10 +961,10 @@ void GLEmberController::DrawAffine(Xform* xform, bool pre, bool selected) m_GL->glLoadIdentity(); MultMatrix(mat); m_GL->glLineWidth(3.0f);//One 3px wide, colored black, except green on x axis for post affine. - m_GL->DrawAffineHelper(selected, pre, final, true); + m_GL->DrawAffineHelper(index, selected, pre, final, true); m_GL->glLineWidth(1.0f);//Again 1px wide, colored white, to give a white middle with black outline effect. - m_GL->DrawAffineHelper(selected, pre, final, false); + m_GL->DrawAffineHelper(index, selected, pre, final, false); m_GL->glPointSize(5.0f);//Three black points, one in the center and two on the circle. Drawn big 5px first to give a black outline. m_GL->glBegin(GL_POINTS); @@ -984,25 +995,27 @@ void GLEmberController::DrawAffine(Xform* xform, bool pre, bool selected) /// Draw the axes, and optionally the surrounding circle /// of an affine transform. /// +/// /// True if selected (draw enclosing circle), else false (only draw axes). -void GLWidget::DrawAffineHelper(bool selected, bool pre, bool final, bool background) +/// +/// +/// +void GLWidget::DrawAffineHelper(int index, bool selected, bool pre, bool final, bool background) { float px = 1.0f; float py = 0.0f; + QColor col = final ? m_Fractorium->m_FinalXformComboColor : m_Fractorium->m_XformComboColors[index % XFORM_COLOR_COUNT]; glBegin(GL_LINES); //Circle part. if (!background) { - if (pre) - glColor4f(1.0f, 1.0f, 1.0f, 1.0f);//Draw pre affine transform with white. - else - glColor4f(0.0f, 0.75f, 0.0f, 1.0f);//Draw post affine transform with green. + glColor4f(col.redF(), col.greenF(), col.blueF(), 1.0f);//Draw pre affine transform with white. } else { - glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glColor4f(0.0f, 0.0f, 0.0f, 1.0f);//Draw pre affine transform outline with white. } if (selected) @@ -1023,19 +1036,17 @@ void GLWidget::DrawAffineHelper(bool selected, bool pre, bool final, bool backgr //Lines from center to circle. if (!background) { - if (final) - glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//Draw final xforms with red. - else - glColor4f(1.0f, 1.0f, 1.0f, 1.0f);//Draw normal xforms with white. + glColor4f(col.redF(), col.greenF(), col.blueF(), 1.0f); } else { - if (!pre) - glColor4f(0.0f, 0.75f, 0.0f, 1.0f);//Draw post affine transform with green outline. + if (pre) + glColor4f(0.0f, 0.0f, 0.0f, 1.0f);//Draw pre affine transform outline with white. + else + glColor4f(0.0f, 0.75f, 0.0f, 1.0f);//Draw post affine transform outline with green. } //The lines from the center to the circle. - glVertex2f(0.0f, 0.0f);//X axis. glVertex2f(1.0f, 0.0f); diff --git a/Source/Fractorium/GLWidget.h b/Source/Fractorium/GLWidget.h index a48a694..182bb2a 100644 --- a/Source/Fractorium/GLWidget.h +++ b/Source/Fractorium/GLWidget.h @@ -62,7 +62,7 @@ private: void SetViewport(); void DrawGrid(); void DrawUnitSquare(); - void DrawAffineHelper(bool selected, bool pre, bool final, bool background); + void DrawAffineHelper(int index, bool selected, bool pre, bool final, bool background); GLEmberControllerBase* GLController(); bool m_Init; diff --git a/Source/Fractorium/OptionsDialog.cpp b/Source/Fractorium/OptionsDialog.cpp index 61739b9..976fbf2 100644 --- a/Source/Fractorium/OptionsDialog.cpp +++ b/Source/Fractorium/OptionsDialog.cpp @@ -71,10 +71,12 @@ FractoriumOptionsDialog::FractoriumOptionsDialog(FractoriumSettings* settings, Q ui.OpenCLCheckBox->setEnabled(false); } - ui.EarlyClipCheckBox->setChecked( m_Settings->EarlyClip()); - ui.TransparencyCheckBox->setChecked(m_Settings->Transparency()); - ui.DoublePrecisionCheckBox->setChecked( m_Settings->Double()); - ui.ThreadCountSpin->setValue( m_Settings->ThreadCount()); + ui.EarlyClipCheckBox->setChecked( m_Settings->EarlyClip()); + ui.YAxisUpCheckBox->setChecked( m_Settings->YAxisUp()); + ui.TransparencyCheckBox->setChecked( m_Settings->Transparency()); + ui.DoublePrecisionCheckBox->setChecked(m_Settings->Double()); + ui.ShowAllXformsCheckBox->setChecked( m_Settings->ShowAllXforms()); + ui.ThreadCountSpin->setValue( m_Settings->ThreadCount()); if (m_Settings->CpuDEFilter()) ui.CpuFilteringDERadioButton->setChecked(true); @@ -103,9 +105,11 @@ FractoriumOptionsDialog::FractoriumOptionsDialog(FractoriumSettings* settings, Q /// bool FractoriumOptionsDialog::EarlyClip() { return ui.EarlyClipCheckBox->isChecked(); } +bool FractoriumOptionsDialog::YAxisUp() { return ui.YAxisUpCheckBox->isChecked(); } bool FractoriumOptionsDialog::Transparency() { return ui.TransparencyCheckBox->isChecked(); } bool FractoriumOptionsDialog::OpenCL() { return ui.OpenCLCheckBox->isChecked(); } bool FractoriumOptionsDialog::Double() { return ui.DoublePrecisionCheckBox->isChecked(); } +bool FractoriumOptionsDialog::ShowAllXforms() { return ui.ShowAllXformsCheckBox->isChecked(); } unsigned int FractoriumOptionsDialog::PlatformIndex() { return ui.PlatformCombo->currentIndex(); } unsigned int FractoriumOptionsDialog::DeviceIndex() { return ui.DeviceCombo->currentIndex(); } unsigned int FractoriumOptionsDialog::ThreadCount() { return ui.ThreadCountSpin->value(); } @@ -149,9 +153,11 @@ void FractoriumOptionsDialog::accept() { //Interactive rendering. m_Settings->EarlyClip(EarlyClip()); + m_Settings->YAxisUp(YAxisUp()); m_Settings->Transparency(Transparency()); m_Settings->OpenCL(OpenCL()); m_Settings->Double(Double()); + m_Settings->ShowAllXforms(ShowAllXforms()); m_Settings->PlatformIndex(PlatformIndex()); m_Settings->DeviceIndex(DeviceIndex()); m_Settings->ThreadCount(ThreadCount()); @@ -183,9 +189,11 @@ void FractoriumOptionsDialog::reject() { //Interactive rendering. ui.EarlyClipCheckBox->setChecked(m_Settings->EarlyClip()); + ui.YAxisUpCheckBox->setChecked(m_Settings->YAxisUp()); ui.TransparencyCheckBox->setChecked(m_Settings->Transparency()); ui.OpenCLCheckBox->setChecked(m_Settings->OpenCL()); ui.DoublePrecisionCheckBox->setChecked(m_Settings->Double()); + ui.ShowAllXformsCheckBox->setChecked(m_Settings->ShowAllXforms()); ui.PlatformCombo->setCurrentIndex(m_Settings->PlatformIndex()); ui.DeviceCombo->setCurrentIndex(m_Settings->DeviceIndex()); ui.ThreadCountSpin->setValue(m_Settings->ThreadCount()); diff --git a/Source/Fractorium/OptionsDialog.h b/Source/Fractorium/OptionsDialog.h index 405c470..7308612 100644 --- a/Source/Fractorium/OptionsDialog.h +++ b/Source/Fractorium/OptionsDialog.h @@ -34,10 +34,12 @@ public slots: private: bool EarlyClip(); + bool YAxisUp(); bool AlphaChannel(); bool Transparency(); bool OpenCL(); bool Double(); + bool ShowAllXforms(); unsigned int PlatformIndex(); unsigned int DeviceIndex(); unsigned int ThreadCount(); diff --git a/Source/Fractorium/OptionsDialog.ui b/Source/Fractorium/OptionsDialog.ui index 5f5563f..d56b0df 100644 --- a/Source/Fractorium/OptionsDialog.ui +++ b/Source/Fractorium/OptionsDialog.ui @@ -6,8 +6,8 @@ 0 0 - 286 - 388 + 300 + 411 @@ -18,14 +18,14 @@ - 286 - 388 + 300 + 411 - 286 - 388 + 300 + 411 @@ -39,7 +39,7 @@ 6 - 6 + 4 6 @@ -94,7 +94,7 @@ - + <html><head/><body><p>Use transparency in the final image.</p><p>This will not make a difference in the editor, but will when saving as .png and opening in other programs.</p></body></html> @@ -104,23 +104,13 @@ - - - - <html><head/><body><p>Use OpenCL to render if your video card supports it.</p><p>This is highly recommended as it will give fluid, real-time interactive editing.</p></body></html> - - - Use OpenCL - - - - + - + - + <html><head/><body><p>The number of threads to use with CPU rendering.</p><p>Decrease for more responsive editing, increase for better performance.</p></body></html> @@ -136,7 +126,7 @@ - + CPU Filtering @@ -183,7 +173,7 @@ - + OpenCL Filtering @@ -227,7 +217,7 @@ - + The number of 10,000 iteration chunks ran per thread on the CPU @@ -244,7 +234,7 @@ in interactive mode for each mouse movement - + The number of ~8M iteration chunks ran using OpenCL @@ -261,7 +251,27 @@ in interactive mode for each mouse movement - + + + + <html><head/><body><p>Checked: Positive Y direction is up.</p><p>Unchecked: Positive Y direction is down.</p></body></html> + + + Positive Y Up + + + + + + + <html><head/><body><p>Use OpenCL to render if your video card supports it.</p><p>This is highly recommended as it will give fluid, real-time interactive editing.</p></body></html> + + + Use OpenCL + + + + <html><head/><body><p>Checked: use 64-bit double precision numbers (slower, but better image quality).</p><p>Unchecked: use 32-bit single precision numbers (faster, but worse image quality).</p></body></html> @@ -271,6 +281,16 @@ in interactive mode for each mouse movement + + + + <html><head/><body><p>Checked: show all xforms while dragging.</p><p>Unchecked: only show current xform while dragging.</p></body></html> + + + Show All Xforms + + +