2018-07-09 02:55:57 -04:00
# pragma once
2014-07-08 03:11:14 -04:00
# include "EmberFile.h"
# include "DoubleSpinBox.h"
# include "GLEmberController.h"
/// <summary>
/// FractoriumEmberControllerBase and FractoriumEmberController<T> classes.
/// </summary>
/// <summary>
/// An enum representing the type of edit being done.
/// </summary>
2016-01-04 19:50:15 -05:00
enum class eEditUndoState : et { REGULAR_EDIT , UNDO_REDO , EDIT_UNDO } ;
2015-04-27 01:11:56 -04:00
/// <summary>
/// An enum representing which xforms an update should be applied to.
/// </summary>
2017-05-31 22:50:05 -04:00
enum class eXformUpdate : et { UPDATE_SPECIFIC , UPDATE_CURRENT , UPDATE_SELECTED , UPDATE_CURRENT_AND_SELECTED , UPDATE_SELECTED_EXCEPT_FINAL , UPDATE_ALL , UPDATE_ALL_EXCEPT_FINAL } ;
2014-07-08 03:11:14 -04:00
2016-04-03 21:55:12 -04:00
/// <summary>
/// An enum representing the type of synchronizing to do between the list of Embers kept in memory
/// and the widgets in the library tree.
/// </summary>
enum eLibraryUpdate { INDEX = 1 , NAME = 2 , POINTER = 4 } ;
2014-07-08 03:11:14 -04:00
/// <summary>
/// FractoriumEmberController and Fractorium need each other, but each can't include the other.
/// So Fractorium includes this file, and Fractorium is declared as a forward declaration here.
/// </summary>
class Fractorium ;
2016-06-11 20:47:03 -04:00
template < typename T > class PreviewRenderer ;
template < typename T > class TreePreviewRenderer ;
2014-07-08 03:11:14 -04:00
# define PREVIEW_SIZE 256
# define UNDO_SIZE 128
/// <summary>
/// FractoriumEmberControllerBase serves as a non-templated base class with virtual
/// functions which will be overridden in a derived class that takes a template parameter.
/// The controller serves as a way to access both the Fractorium GUI and the underlying ember
/// objects through an interface that doesn't require template argument, but does allow
/// templated objects to be used underneath.
/// Note that there are a few functions which access a templated object, so for those both
/// versions for float and double must be provided, then overridden in the templated derived
/// class. It's definitely a design flaw, but C++ doesn't offer any alternative since
/// templated virtual functions are not supported.
/// The functions not implemented in this file can be found in the GUI files which use them.
/// </summary>
class FractoriumEmberControllerBase : public RenderCallback
{
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
friend Fractorium ;
2014-07-08 03:11:14 -04:00
public :
FractoriumEmberControllerBase ( Fractorium * fractorium ) ;
2016-04-03 21:55:12 -04:00
FractoriumEmberControllerBase ( const FractoriumEmberControllerBase & controller ) = delete ;
2014-07-08 03:11:14 -04:00
virtual ~ FractoriumEmberControllerBase ( ) ;
//Embers.
2016-04-13 23:59:57 -04:00
virtual void SetEmber ( const Ember < float > & ember , bool verbatim , bool updatePointer ) { }
2015-01-19 11:39:50 -05:00
virtual void CopyEmber ( Ember < float > & ember , std : : function < void ( Ember < float > & ember ) > perEmberOperation /* = [&](Ember<float>& ember) { } */ ) { } //Uncomment default lambdas once LLVM fixes a crash in their compiler with default lambda parameters.//TODO
2016-06-11 20:47:03 -04:00
virtual void SetEmberFile ( const EmberFile < float > & emberFile , bool move ) { }
virtual void CopyEmberFile ( EmberFile < float > & emberFile , bool sequence , std : : function < void ( Ember < float > & ember ) > perEmberOperation /* = [&](Ember<float>& ember) { } */ ) { }
2014-07-08 03:11:14 -04:00
virtual void SetTempPalette ( const Palette < float > & palette ) { }
virtual void CopyTempPalette ( Palette < float > & palette ) { }
# ifdef DO_DOUBLE
2016-04-13 23:59:57 -04:00
virtual void SetEmber ( const Ember < double > & ember , bool verbatim , bool updatePointer ) { }
2015-01-14 08:15:23 -05:00
virtual void CopyEmber ( Ember < double > & ember , std : : function < void ( Ember < double > & ember ) > perEmberOperation /* = [&](Ember<double>& ember) { } */ ) { }
2016-06-11 20:47:03 -04:00
virtual void SetEmberFile ( const EmberFile < double > & emberFile , bool move ) { }
virtual void CopyEmberFile ( EmberFile < double > & emberFile , bool sequence , std : : function < void ( Ember < double > & ember ) > perEmberOperation /* = [&](Ember<double>& ember) { } */ ) { }
2014-07-08 03:11:14 -04:00
virtual void SetTempPalette ( const Palette < double > & palette ) { }
virtual void CopyTempPalette ( Palette < double > & palette ) { }
# endif
2016-04-13 23:59:57 -04:00
virtual void SetEmber ( size_t index , bool verbatim ) { }
2014-07-08 03:11:14 -04:00
virtual void AddXform ( ) { }
2015-06-24 23:49:09 -04:00
virtual void AddLinkedXform ( ) { }
2014-07-08 03:11:14 -04:00
virtual void DuplicateXform ( ) { }
2015-04-27 01:11:56 -04:00
virtual void ClearXform ( ) { }
virtual void DeleteXforms ( ) { }
2014-07-08 03:11:14 -04:00
virtual void AddFinalXform ( ) { }
virtual bool UseFinalXform ( ) { return false ; }
2014-10-14 11:53:15 -04:00
virtual size_t XformCount ( ) const { return 0 ; }
virtual size_t TotalXformCount ( ) const { return 0 ; }
virtual QString Name ( ) const { return " " ; }
virtual void Name ( const string & s ) { }
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
virtual size_t FinalRasW ( ) const { return 0 ; }
virtual void FinalRasW ( size_t w ) { }
virtual size_t FinalRasH ( ) const { return 0 ; }
virtual void FinalRasH ( size_t h ) { }
2014-10-14 11:53:15 -04:00
virtual size_t Index ( ) const { return 0 ; }
2014-07-08 03:11:14 -04:00
virtual void AddSymmetry ( int sym , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) { }
virtual void CalcNormalizedWeights ( ) { }
//Menu.
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
virtual void NewFlock ( size_t count ) { } //File.
2014-07-08 03:11:14 -04:00
virtual void NewEmptyFlameInCurrentFile ( ) { }
virtual void NewRandomFlameInCurrentFile ( ) { }
virtual void CopyFlameInCurrentFile ( ) { }
2014-10-14 11:53:15 -04:00
virtual void OpenAndPrepFiles ( const QStringList & filenames , bool append ) { }
2014-07-08 03:11:14 -04:00
virtual void SaveCurrentAsXml ( ) { }
virtual void SaveEntireFileAsXml ( ) { }
2016-06-07 23:37:15 -04:00
virtual uint SaveCurrentToOpenedFile ( bool render = true ) { return 0 ; }
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
virtual void SaveCurrentFileOnShutdown ( ) { }
2014-07-08 03:11:14 -04:00
virtual void Undo ( ) { } //Edit.
virtual void Redo ( ) { }
virtual void CopyXml ( ) { }
virtual void CopyAllXml ( ) { }
virtual void PasteXmlAppend ( ) { }
virtual void PasteXmlOver ( ) { }
2015-05-19 22:31:33 -04:00
virtual void CopySelectedXforms ( ) { }
virtual void PasteSelectedXforms ( ) { }
2018-07-31 00:39:41 -04:00
virtual void CopyKernel ( ) { }
2014-07-08 03:11:14 -04:00
virtual void AddReflectiveSymmetry ( ) { } //Tools.
virtual void AddRotationalSymmetry ( ) { }
virtual void AddBothSymmetry ( ) { }
Numerous fixes
0.4.0.5 Beta 07/18/2014
--User Changes
Allow for vibrancy values > 1.
Add flatten and unflatten menu items.
Automatically flatten like Apophysis does.
Add plugin and new_linear tags to Xml to be compatible with Apophysis.
--Bug Fixes
Fix blur, blur3d, bubble, cropn, cross, curl, curl3d, epispiral, ho,
julia3d, julia3dz, loonie, mirror_x, mirror_y, mirror_z, rotate_x,
sinusoidal, spherical, spherical3d, stripes.
Unique filename on final render was completely broken.
Two severe OpenCL bugs. Random seeds were biased and fusing was being
reset too often leading to results that differ from the CPU.
Subtle, but sometimes severe bug in the setup of the xaos weights.
Use properly defined epsilon by getting the value from
std::numeric_limits, rather than hard coding 1e-6 or 1e-10.
Omit incorrect usage of epsilon everywhere. It should not be
automatically added to denominators. Rather, it should only be used if
the denominator is zero.
Force final render progress bars to 100 on completion. Sometimes they
didn't seem to make it there.
Make variation name and params comparisons be case insensitive.
--Code Changes
Make ForEach and FindIf wrappers around std::for_each and std::find_if.
2014-07-19 02:33:18 -04:00
virtual void Flatten ( ) { }
virtual void Unflatten ( ) { }
2014-07-08 03:11:14 -04:00
virtual void ClearFlame ( ) { }
//Toolbar.
2015-03-21 18:27:37 -04:00
//Library.
2016-04-03 21:55:12 -04:00
virtual void SyncLibrary ( eLibraryUpdate update ) { }
2015-03-21 18:27:37 -04:00
virtual void FillLibraryTree ( int selectIndex = - 1 ) { }
virtual void UpdateLibraryTree ( ) { }
virtual void EmberTreeItemChanged ( QTreeWidgetItem * item , int col ) { }
virtual void EmberTreeItemDoubleClicked ( QTreeWidgetItem * item , int col ) { }
2016-06-11 20:47:03 -04:00
virtual void RenderLibraryPreviews ( uint start = UINT_MAX , uint end = UINT_MAX ) { }
virtual void RenderSequencePreviews ( uint start = UINT_MAX , uint end = UINT_MAX ) { }
virtual void SequenceTreeItemChanged ( QTreeWidgetItem * item , int col ) { }
virtual void StopLibraryPreviewRender ( ) { }
virtual void StopSequencePreviewRender ( ) { }
virtual void StopAllPreviewRenderers ( ) { }
2016-12-05 22:04:33 -05:00
virtual void MoveLibraryItems ( const QModelIndexList & items , int destRow ) { }
virtual void Delete ( const vector < pair < size_t , QTreeWidgetItem * > > & v ) { }
2016-06-11 20:47:03 -04:00
virtual void FillSequenceTree ( ) { }
virtual void SequenceGenerateButtonClicked ( ) { }
virtual void SequenceSaveButtonClicked ( ) { }
virtual void SequenceOpenButtonClicked ( ) { }
2015-03-21 18:27:37 -04:00
2014-07-08 03:11:14 -04:00
//Params.
virtual void SetCenter ( double x , double y ) { }
virtual void FillParamTablesAndPalette ( ) { }
virtual void BrightnessChanged ( double d ) { }
virtual void GammaChanged ( double d ) { }
virtual void GammaThresholdChanged ( double d ) { }
virtual void VibrancyChanged ( double d ) { }
virtual void HighlightPowerChanged ( double d ) { }
2014-12-06 00:05:09 -05:00
virtual void PaletteModeChanged ( uint i ) { }
virtual void WidthChanged ( uint i ) { }
virtual void HeightChanged ( uint i ) { }
2018-07-08 11:31:26 -04:00
virtual void ResizeAndScale ( int width , int height , eScaleType scaleType ) { }
2014-07-08 03:11:14 -04:00
virtual void CenterXChanged ( double d ) { }
virtual void CenterYChanged ( double d ) { }
virtual void ScaleChanged ( double d ) { }
virtual void ZoomChanged ( double d ) { }
virtual void RotateChanged ( double d ) { }
virtual void ZPosChanged ( double d ) { }
virtual void PerspectiveChanged ( double d ) { }
virtual void PitchChanged ( double d ) { }
virtual void YawChanged ( double d ) { }
virtual void DepthBlurChanged ( double d ) { }
virtual void SpatialFilterWidthChanged ( double d ) { }
virtual void SpatialFilterTypeChanged ( const QString & text ) { }
virtual void TemporalFilterWidthChanged ( double d ) { }
virtual void TemporalFilterTypeChanged ( const QString & text ) { }
virtual void DEFilterMinRadiusWidthChanged ( double d ) { }
virtual void DEFilterMaxRadiusWidthChanged ( double d ) { }
virtual void DEFilterCurveWidthChanged ( double d ) { }
2014-11-28 04:37:51 -05:00
virtual void SbsChanged ( int d ) { }
virtual void FuseChanged ( int d ) { }
2014-07-08 03:11:14 -04:00
virtual void QualityChanged ( double d ) { }
virtual void SupersampleChanged ( int d ) { }
2014-11-28 04:37:51 -05:00
virtual void TemporalSamplesChanged ( int d ) { }
2014-07-08 03:11:14 -04:00
virtual void AffineInterpTypeChanged ( int i ) { }
virtual void InterpTypeChanged ( int i ) { }
virtual void BackgroundChanged ( const QColor & color ) { }
2017-07-22 16:43:35 -04:00
virtual void ClearColorCurves ( int i ) { }
2015-04-27 01:11:56 -04:00
virtual void ColorCurveChanged ( int curveIndex , int pointInxed , const QPointF & point ) { }
2014-07-08 03:11:14 -04:00
//Xforms.
virtual void CurrentXformComboChanged ( int index ) { }
virtual void XformWeightChanged ( double d ) { }
virtual void EqualizeWeights ( ) { }
virtual void XformNameChanged ( int row , int col ) { }
2016-02-02 20:51:58 -05:00
virtual void XformAnimateChanged ( int state ) { }
2015-05-03 20:13:14 -04:00
virtual void FillXforms ( int index = 0 ) { }
2018-07-31 00:39:41 -04:00
virtual void UpdateXformName ( int index ) { }
2014-07-08 03:11:14 -04:00
//Xforms Affine.
virtual void AffineSetHelper ( double d , int index , bool pre ) { }
2015-04-27 01:11:56 -04:00
virtual void FlipXforms ( bool horizontal , bool vertical , bool pre ) { }
virtual void RotateXformsByAngle ( double angle , bool pre ) { }
virtual void MoveXforms ( double x , double y , bool pre ) { }
virtual void ScaleXforms ( double scale , bool pre ) { }
virtual void ResetXformsAffine ( bool pre ) { }
2018-09-15 06:11:12 -04:00
virtual void CopyXformsAffine ( bool pre ) { }
virtual void PasteXformsAffine ( bool pre ) { }
2016-05-23 22:48:04 -04:00
virtual void RandomXformsAffine ( bool pre ) { }
2015-02-03 20:11:16 -05:00
virtual void FillBothAffines ( ) { }
2018-09-30 17:20:02 -04:00
virtual void SwapAffines ( ) { }
2016-02-02 20:51:58 -05:00
double LockedScale ( ) { return m_LockedScale ; }
2016-12-05 22:04:33 -05:00
double LockedX ( ) { return m_LockedX ; }
double LockedY ( ) { return m_LockedY ; }
2016-02-29 19:35:25 -05:00
void LockedScale ( double scale ) { m_LockedScale = scale ; }
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual void InitLockedScale ( ) { }
2014-07-08 03:11:14 -04:00
//Xforms Color.
2017-08-18 01:40:03 -04:00
virtual void XformColorIndexChanged ( double d , bool updateRender , bool updateSpinner , bool updateScroll , eXformUpdate update = eXformUpdate : : UPDATE_SELECTED , size_t index = 0 ) { }
2016-05-02 19:54:56 -04:00
virtual void RandomColorIndicesButtonClicked ( ) { }
virtual void ToggleColorIndicesButtonClicked ( ) { }
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual void RandomColorSpeedButtonClicked ( ) { }
virtual void ToggleColorSpeedButtonClicked ( ) { }
2014-07-08 03:11:14 -04:00
virtual void XformColorSpeedChanged ( double d ) { }
virtual void XformOpacityChanged ( double d ) { }
virtual void XformDirectColorChanged ( double d ) { }
2018-07-31 00:39:41 -04:00
virtual void SoloXformCheckBoxStateChanged ( int state , int index ) { }
2015-07-15 23:27:32 -04:00
virtual QColor ColorIndexToQColor ( double d ) { return QColor ( ) ; }
2014-07-08 03:11:14 -04:00
//Xforms Variations.
2015-07-23 21:16:36 -04:00
virtual void Filter ( const QString & text ) { }
2016-03-28 21:49:10 -04:00
virtual void SetupVariationsTree ( ) { }
2014-07-08 03:11:14 -04:00
virtual void ClearVariationsTree ( ) { }
virtual void VariationSpinBoxValueChanged ( double d ) { }
2015-08-10 23:10:23 -04:00
virtual void FilteredVariations ( ) { }
2018-07-31 00:39:41 -04:00
virtual void FillVariationTreeWithCurrentXform ( ) { }
2014-07-08 03:11:14 -04:00
2015-04-27 01:11:56 -04:00
//Xforms Selection.
2018-09-15 06:11:12 -04:00
virtual QString MakeXformCaption ( size_t i ) { return " " ; }
2015-04-27 01:11:56 -04:00
//Xaos.
2015-04-08 21:23:29 -04:00
virtual void FillXaos ( ) { }
2015-05-30 00:08:44 -04:00
virtual void XaosChanged ( int x , int y , double val ) { }
2014-07-08 03:11:14 -04:00
virtual void ClearXaos ( ) { }
2014-10-15 23:09:44 -04:00
virtual void RandomXaos ( ) { }
2018-07-31 00:39:41 -04:00
virtual void AddLayer ( int xforms ) { }
2014-07-08 03:11:14 -04:00
//Palette.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual size_t InitPaletteList ( const QString & s ) { return 0 ; }
2015-04-08 21:23:29 -04:00
virtual bool FillPaletteTable ( const string & s ) { return false ; }
2014-07-08 03:11:14 -04:00
virtual void ApplyPaletteToEmber ( ) { }
virtual void PaletteAdjust ( ) { }
virtual void PaletteCellClicked ( int row , int col ) { }
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual void SetBasePaletteAndAdjust ( const Palette < float > & palette ) { }
virtual void PaletteEditorButtonClicked ( ) { }
2015-07-15 23:27:32 -04:00
QImage & FinalPaletteImage ( ) { return m_FinalPaletteImage ; }
2014-07-08 03:11:14 -04:00
//Info.
2015-07-15 23:27:32 -04:00
virtual void FillSummary ( ) { }
2015-12-31 16:41:59 -05:00
2014-07-08 03:11:14 -04:00
//Rendering/progress.
virtual bool Render ( ) { return false ; }
2017-07-22 16:43:35 -04:00
virtual bool CreateRenderer ( eRendererType renderType , const vector < pair < size_t , size_t > > & devices , bool updatePreviews , bool shared = true ) { return false ; }
2014-12-06 00:05:09 -05:00
virtual uint SizeOfT ( ) const { return 0 ; }
2014-07-08 03:11:14 -04:00
virtual void ClearUndo ( ) { }
2017-12-21 23:09:08 -05:00
virtual void DeleteRenderer ( ) { }
2015-01-02 18:11:36 -05:00
virtual GLEmberControllerBase * GLController ( ) { return nullptr ; }
2018-03-30 12:56:24 -04:00
virtual void Pause ( bool pause ) ;
virtual bool Paused ( ) ;
2014-07-08 03:11:14 -04:00
bool RenderTimerRunning ( ) ;
void StartRenderTimer ( ) ;
void DelayedStartRenderTimer ( ) ;
void StopRenderTimer ( bool wait ) ;
2015-03-21 18:27:37 -04:00
void ClearFinalImages ( ) ;
2014-07-08 03:11:14 -04:00
void Shutdown ( ) ;
2015-12-31 19:00:36 -05:00
void UpdateRender ( eProcessAction action = eProcessAction : : FULL_RENDER ) ;
2017-07-22 16:43:35 -04:00
void SaveCurrentRender ( const QString & filename , const EmberImageComments & comments , vector < v4F > & pixels , size_t width , size_t height , bool png16Bit , bool transparency ) ;
2014-07-08 03:11:14 -04:00
RendererBase * Renderer ( ) { return m_Renderer . get ( ) ; }
2017-07-22 16:43:35 -04:00
vector < v4F > * FinalImage ( ) { return & ( m_FinalImage ) ; }
vector < v4F > * PreviewFinalImage ( ) { return & m_PreviewFinalImage ; }
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
EmberStats Stats ( ) { return m_Stats ; }
2018-09-15 06:11:12 -04:00
eProcessState ProcessState ( ) { return m_Renderer . get ( ) ? m_Renderer - > ProcessState ( ) : eProcessState : : NONE ; }
2014-07-08 03:11:14 -04:00
protected :
//Rendering/progress.
void AddProcessAction ( eProcessAction action ) ;
eProcessAction CondenseAndClearProcessActions ( ) ;
2015-12-31 16:41:59 -05:00
2014-07-08 03:11:14 -04:00
//Non-templated members.
2016-04-03 21:55:12 -04:00
bool m_Rendering = false ;
2014-07-08 03:11:14 -04:00
bool m_LastEditWasUndoRedo ;
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
vector < pair < size_t , size_t > > m_Devices ;
2016-04-03 21:55:12 -04:00
size_t m_SubBatchCount = 1 ; //Will be ovewritten by the options on first render.
uint m_FailedRenders = 0 ;
size_t m_UndoIndex = 0 ;
double m_LockedScale = 1 ;
2016-12-05 22:04:33 -05:00
double m_LockedX = 0 ;
double m_LockedY = 0 ;
2016-04-03 21:55:12 -04:00
eRendererType m_RenderType = eRendererType : : CPU_RENDERER ;
2014-07-08 03:11:14 -04:00
eEditUndoState m_EditState ;
2016-04-03 21:55:12 -04:00
GLuint m_OutputTexID = 0 ;
2014-07-08 03:11:14 -04:00
Timing m_RenderElapsedTimer ;
2014-10-14 11:53:15 -04:00
EmberStats m_Stats ;
2014-07-08 03:11:14 -04:00
QImage m_FinalPaletteImage ;
QString m_LastSaveAll ;
QString m_LastSaveCurrent ;
2015-04-08 21:23:29 -04:00
string m_CurrentPaletteFilePath ;
2016-02-12 00:38:21 -05:00
std : : recursive_mutex m_Cs ;
2015-01-19 11:39:50 -05:00
std : : thread m_WriteThread ;
2017-07-22 16:43:35 -04:00
vector < v4F > m_FinalImage ;
vector < v4F > m_PreviewFinalImage ;
2014-07-08 03:11:14 -04:00
vector < eProcessAction > m_ProcessActions ;
2015-08-10 23:10:23 -04:00
vector < eVariationId > m_FilteredVariations ;
2014-10-18 17:07:07 -04:00
unique_ptr < EmberNs : : RendererBase > m_Renderer ;
2014-07-08 03:11:14 -04:00
QTIsaac < ISAAC_SIZE , ISAAC_INT > m_Rand ;
Fractorium * m_Fractorium ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
Palette < float > m_TempPalette ;
2016-02-12 00:38:21 -05:00
std : : unique_ptr < QTimer > m_RenderTimer ;
std : : unique_ptr < QTimer > m_RenderRestartTimer ;
2017-02-26 12:34:43 -05:00
shared_ptr < PaletteList < float > > m_PaletteList ;
2016-04-03 21:55:12 -04:00
shared_ptr < OpenCLInfo > m_Info = OpenCLInfo : : Instance ( ) ;
2014-07-08 03:11:14 -04:00
} ;
/// <summary>
/// Templated derived class which implements all interaction functionality between the embers
/// of a specific template type and the GUI.
/// Switching between template arguments requires complete re-creation of the controller and the
/// underlying renderer. Switching between CPU and OpenCL only requires re-creation of the renderer.
/// </summary>
template < typename T >
class FractoriumEmberController : public FractoriumEmberControllerBase
{
2016-06-11 20:47:03 -04:00
friend PreviewRenderer < T > ;
friend TreePreviewRenderer < T > ;
2014-07-08 03:11:14 -04:00
public :
FractoriumEmberController ( Fractorium * fractorium ) ;
2016-04-03 21:55:12 -04:00
FractoriumEmberController ( const FractoriumEmberController < T > & controller ) = delete ;
2014-07-08 03:11:14 -04:00
virtual ~ FractoriumEmberController ( ) ;
//Embers.
2016-04-13 23:59:57 -04:00
virtual void SetEmber ( const Ember < float > & ember , bool verbatim , bool updatePointer ) override ;
2015-01-14 08:15:23 -05:00
virtual void CopyEmber ( Ember < float > & ember , std : : function < void ( Ember < float > & ember ) > perEmberOperation /* = [&](Ember<float>& ember) { } */ ) override ;
2016-06-11 20:47:03 -04:00
virtual void SetEmberFile ( const EmberFile < float > & emberFile , bool move ) override ;
virtual void CopyEmberFile ( EmberFile < float > & emberFile , bool sequence , std : : function < void ( Ember < float > & ember ) > perEmberOperation /* = [&](Ember<float>& ember) { } */ ) override ;
2014-10-14 11:53:15 -04:00
virtual void SetTempPalette ( const Palette < float > & palette ) override ;
virtual void CopyTempPalette ( Palette < float > & palette ) override ;
2014-07-08 03:11:14 -04:00
# ifdef DO_DOUBLE
2016-04-13 23:59:57 -04:00
virtual void SetEmber ( const Ember < double > & ember , bool verbatim , bool updatePointer ) override ;
2015-01-14 08:15:23 -05:00
virtual void CopyEmber ( Ember < double > & ember , std : : function < void ( Ember < double > & ember ) > perEmberOperation /* = [&](Ember<double>& ember) { } */ ) override ;
2016-06-11 20:47:03 -04:00
virtual void SetEmberFile ( const EmberFile < double > & emberFile , bool move ) override ;
virtual void CopyEmberFile ( EmberFile < double > & emberFile , bool sequence , std : : function < void ( Ember < double > & ember ) > perEmberOperation /* = [&](Ember<double>& ember) { } */ ) override ;
2014-10-14 11:53:15 -04:00
virtual void SetTempPalette ( const Palette < double > & palette ) override ;
virtual void CopyTempPalette ( Palette < double > & palette ) override ;
2014-07-08 03:11:14 -04:00
# endif
2016-04-13 23:59:57 -04:00
virtual void SetEmber ( size_t index , bool verbatim ) override ;
2014-10-14 11:53:15 -04:00
virtual void AddXform ( ) override ;
2015-06-24 23:49:09 -04:00
virtual void AddLinkedXform ( ) override ;
2014-10-14 11:53:15 -04:00
virtual void DuplicateXform ( ) override ;
2015-04-27 01:11:56 -04:00
virtual void ClearXform ( ) override ;
virtual void DeleteXforms ( ) override ;
2014-10-14 11:53:15 -04:00
virtual void AddFinalXform ( ) override ;
virtual bool UseFinalXform ( ) override { return m_Ember . UseFinalXform ( ) ; }
virtual size_t XformCount ( ) const override { return m_Ember . XformCount ( ) ; }
virtual size_t TotalXformCount ( ) const override { return m_Ember . TotalXformCount ( ) ; }
virtual QString Name ( ) const override { return QString : : fromStdString ( m_Ember . m_Name ) ; }
virtual void Name ( const string & s ) override { m_Ember . m_Name = s ; }
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
virtual size_t FinalRasW ( ) const override { return m_Ember . m_FinalRasW ; }
virtual void FinalRasW ( size_t w ) override { m_Ember . m_FinalRasW = w ; }
virtual size_t FinalRasH ( ) const override { return m_Ember . m_FinalRasH ; }
virtual void FinalRasH ( size_t h ) override { m_Ember . m_FinalRasH = h ; }
2014-10-14 11:53:15 -04:00
virtual size_t Index ( ) const override { return m_Ember . m_Index ; }
virtual void AddSymmetry ( int sym , QTIsaac < ISAAC_SIZE , ISAAC_INT > & rand ) override { m_Ember . AddSymmetry ( sym , rand ) ; }
virtual void CalcNormalizedWeights ( ) override { m_Ember . CalcNormalizedWeights ( m_NormalizedWeights ) ; }
void ConstrainDimensions ( Ember < T > & ember ) ;
2014-07-08 03:11:14 -04:00
Ember < T > * CurrentEmber ( ) ;
//Menu.
--User changes
-Add support for multiple GPU devices.
--These options are present in the command line and in Fractorium.
-Change scheme of specifying devices from platform,device to just total device index.
--Single number on the command line.
--Change from combo boxes for device selection to a table of all devices in Fractorium.
-Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Bug fixes
-EmberAnimate, EmberRender, FractoriumSettings, FinalRenderDialog: Fix wrong order of arguments to Clamp() when assigning thread priority.
-VariationsDC.h: Fix NVidia OpenCL compilation error in DCTriangleVariation.
-FractoriumXformsColor.cpp: Checking for null pixmap pointer is not enough, must also check if the underlying buffer is null via call to QPixmap::isNull().
--Code changes
-Ember.h: Add case for FLAME_MOTION_NONE and default in ApplyFlameMotion().
-EmberMotion.h: Call base constructor.
-EmberPch.h: #pragma once only on Windows.
-EmberToXml.h:
--Handle different types of exceptions.
--Add default cases to ToString().
-Isaac.h: Remove unused variable in constructor.
-Point.h: Call base constructor in Color().
-Renderer.h/cpp:
--Add bool to Alloc() to only allocate memory for the histogram. Needed for multi-GPU.
--Make CoordMap() return a const ref, not a pointer.
-SheepTools.h:
--Use 64-bit types like the rest of the code already does.
--Fix some comment misspellings.
-Timing.h: Make BeginTime(), EndTime(), ElapsedTime() and Format() be const functions.
-Utils.h:
--Add new functions Equal() and Split().
--Handle more exception types in ReadFile().
--Get rid of most legacy blending of C and C++ argument parsing.
-XmlToEmber.h:
--Get rid of most legacy blending of C and C++ code from flam3.
--Remove some unused variables.
-EmberAnimate:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--If a render fails, exit since there is no point in continuing an animation with a missing frame.
--Pass variables to threaded save better, which most likely fixes a very subtle bug that existed before.
--Remove some unused variables.
-EmberGenome, EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
-EmberRender:
--Support multi-GPU processing that alternates full frames between devices.
--Use OpenCLInfo instead of OpenCLWrapper for --openclinfo option.
--Remove bucketT template parameter, and hard code float in its place.
--Only print values when not rendering with OpenCL, since they're always 0 in that case.
-EmberCLPch.h:
--#pragma once only on Windows.
--#include <atomic>.
-IterOpenCLKernelCreator.h: Add new kernel for summing two histograms. This is needed for multi-GPU.
-OpenCLWrapper.h:
--Move all OpenCL info related code into its own class OpenCLInfo.
--Add members to cache the values of global memory size and max allocation size.
-RendererCL.h/cpp:
--Redesign to accomodate multi-GPU.
--Constructor now takes a vector of devices.
--Remove DumpErrorReport() function, it's handled in the base.
--ClearBuffer(), ReadPoints(), WritePoints(), ReadHist() and WriteHist() now optionally take a device index as a parameter.
--MakeDmap() override and m_DmapCL member removed because it no longer applies since the histogram is always float since the last commit.
--Add new function SumDeviceHist() to sum histograms from two devices by first copying to a temporary on the host, then a temporary on the device, then summing.
--m_Calls member removed, as it's now per-device.
--OpenCLWrapper removed.
--m_Seeds member is now a vector of vector of seeds, to accomodate a separate and different array of seeds for each device.
--Added member m_Devices, a vector of unique_ptr of RendererCLDevice.
-EmberCommon.h
--Added Devices() function to convert from a vector of device indices to a vector of platform,device indices.
--Changed CreateRenderer() to accept a vector of devices to create a single RendererCL which will split work across multiple devices.
--Added CreateRenderers() function to accept a vector of devices to create multiple RendererCL, each which will render on a single device.
--Add more comments to some existing functions.
-EmberCommonPch.h: #pragma once only on Windows.
-EmberOptions.h:
--Remove --platform option, it's just sequential device number now with the --device option.
--Make --out be OPT_USE_RENDER instead of OPT_RENDER_ANIM since it's an error condition when animating. It makes no sense to write all frames to a single image.
--Add Devices() function to parse comma separated --device option string and return a vector of device indices.
--Make int and uint types be 64-bit, so intmax_t and size_t.
--Make better use of macros.
-JpegUtils.h: Make string parameters to WriteJpeg() and WritePng() be const ref.
-All project files: Turn off buffer security check option in Visual Studio (/Gs-)
-deployment.pri: Remove the line OTHER_FILES +=, it's pointless and was causing problems.
-Ember.pro, EmberCL.pro: Add CONFIG += plugin, otherwise it wouldn't link.
-EmberCL.pro: Add new files for multi-GPU support.
-build_all.sh: use -j4 and QMAKE=${QMAKE:/usr/bin/qmake}
-shared_settings.pri:
-Add version string.
-Remove old DESTDIR definitions.
-Add the following lines or else nothing would build:
CONFIG(release, debug|release) {
CONFIG += warn_off
DESTDIR = ../../../Bin/release
}
CONFIG(debug, debug|release) {
DESTDIR = ../../../Bin/debug
}
QMAKE_POST_LINK += $$quote(cp --update ../../../Data/flam3-palettes.xml $${DESTDIR}$$escape_expand(\n\t))
LIBS += -L/usr/lib -lpthread
-AboutDialog.ui: Another futile attempt to make it look correct on Linux.
-FinalRenderDialog.h/cpp:
--Add support for multi-GPU.
--Change from combo boxes for device selection to a table of all devices.
--Ensure device selection makes sense.
--Remove "FinalRender" prefix of various function names, it's implied given the context.
-FinalRenderEmberController.h/cpp:
--Add support for multi-GPU.
--Change m_FinishedImageCount to be atomic.
--Move CancelRender() from the base to FinalRenderEmberController<T>.
--Refactor RenderComplete() to omit any progress related functionality or image saving since it can be potentially ran in a thread.
--Consolidate setting various renderer fields into SyncGuiToRenderer().
-Fractorium.cpp: Allow for resizing of the options dialog to show the entire device table.
-FractoriumCommon.h: Add various functions to handle a table showing the available OpenCL devices on the system.
-FractoriumEmberController.h/cpp: Remove m_FinalImageIndex, it's no longer needed.
-FractoriumRender.cpp: Scale the interactive sub batch count and quality by the number of devices used.
-FractoriumSettings.h/cpp:
--Temporal samples defaults to 100 instead of 1000 which was needless overkill.
--Add multi-GPU support, remove old device,platform pair.
-FractoriumToolbar.cpp: Disable OpenCL toolbar button if there are no devices present on the system.
-FractoriumOptionsDialog.h/cpp:
--Add support for multi-GPU.
--Consolidate more assignments in DataToGui().
--Enable/disable CPU/OpenCL items in response to OpenCL checkbox event.
-Misc: Convert almost everything to size_t for unsigned, intmax_t for signed.
2015-09-12 21:33:45 -04:00
virtual void NewFlock ( size_t count ) override ;
2014-10-14 11:53:15 -04:00
virtual void NewEmptyFlameInCurrentFile ( ) override ;
virtual void NewRandomFlameInCurrentFile ( ) override ;
virtual void CopyFlameInCurrentFile ( ) override ;
virtual void OpenAndPrepFiles ( const QStringList & filenames , bool append ) override ;
virtual void SaveCurrentAsXml ( ) override ;
virtual void SaveEntireFileAsXml ( ) override ;
2016-06-07 23:37:15 -04:00
virtual uint SaveCurrentToOpenedFile ( bool render = true ) override ;
--User changes
-Support 4k monitors, and in general, properly scale any monitor that is not HD.
-Allow for a spatial filter of radius zero, which means do not use a spatial filter.
-Add new variations: concentric, cpow3, helicoid, helix, rand_cubes, sphereblur.
-Use a new method for computing elliptic which is more precise. Developed by Discord user Claude.
-Remove the 8 variation per xform limitation on the GPU.
-Allow for loading the last flame file on startup, rather than randoms.
-Use two different default quality values in the interactive renderer, one each for CPU and GPU.
-Creating linked xforms was using non-standard behavior. Make it match Apo and also support creating multiple linked xforms at once.
--Bug fixes
-No variations in an xform used to have the same behavior as a single linear variation with weight 1. While sensible, this breaks backward compatibility. No variations now sets the output point to zeroes.
-Prevent crashing the program when adjusting a value on the main window while a final render is in progress.
-The xaos table was inverted.
--Code changes
-Convert projects to Visual Studio 2017.
-Change bad vals from +- 1e10 to +-1e20.
-Reintroduce the symmetry tag in xforms for legacy support in programs that do not use color_speed.
-Compiler will not let us use default values in templated member functions anymore.
2017-11-26 20:27:00 -05:00
virtual void SaveCurrentFileOnShutdown ( ) override ;
2014-10-14 11:53:15 -04:00
virtual void Undo ( ) override ;
virtual void Redo ( ) override ;
virtual void CopyXml ( ) override ;
virtual void CopyAllXml ( ) override ;
virtual void PasteXmlAppend ( ) override ;
virtual void PasteXmlOver ( ) override ;
2015-05-19 22:31:33 -04:00
virtual void CopySelectedXforms ( ) override ;
virtual void PasteSelectedXforms ( ) override ;
2018-07-31 00:39:41 -04:00
virtual void CopyKernel ( ) override ;
2014-10-14 11:53:15 -04:00
virtual void AddReflectiveSymmetry ( ) override ;
virtual void AddRotationalSymmetry ( ) override ;
virtual void AddBothSymmetry ( ) override ;
virtual void Flatten ( ) override ;
virtual void Unflatten ( ) override ;
virtual void ClearFlame ( ) override ;
2014-07-08 03:11:14 -04:00
//Toolbar.
2015-03-21 18:27:37 -04:00
//Library.
2016-04-03 21:55:12 -04:00
virtual void SyncLibrary ( eLibraryUpdate update ) override ;
2015-03-21 18:27:37 -04:00
virtual void FillLibraryTree ( int selectIndex = - 1 ) override ;
virtual void UpdateLibraryTree ( ) override ;
2016-12-05 22:04:33 -05:00
virtual void MoveLibraryItems ( const QModelIndexList & items , int destRow ) override ;
virtual void Delete ( const vector < pair < size_t , QTreeWidgetItem * > > & v ) override ;
2015-03-21 18:27:37 -04:00
virtual void EmberTreeItemChanged ( QTreeWidgetItem * item , int col ) override ;
virtual void EmberTreeItemDoubleClicked ( QTreeWidgetItem * item , int col ) override ;
2016-06-11 20:47:03 -04:00
void RenderPreviews ( QTreeWidget * tree , TreePreviewRenderer < T > * renderer , EmberFile < T > & file , uint start = UINT_MAX , uint end = UINT_MAX ) ;
virtual void RenderLibraryPreviews ( uint start = UINT_MAX , uint end = UINT_MAX ) override ;
virtual void RenderSequencePreviews ( uint start = UINT_MAX , uint end = UINT_MAX ) override ;
virtual void SequenceTreeItemChanged ( QTreeWidgetItem * item , int col ) override ;
virtual void StopLibraryPreviewRender ( ) override ;
virtual void StopSequencePreviewRender ( ) override ;
virtual void StopAllPreviewRenderers ( ) override ;
virtual void FillSequenceTree ( ) override ;
virtual void SequenceGenerateButtonClicked ( ) override ;
virtual void SequenceSaveButtonClicked ( ) override ;
virtual void SequenceOpenButtonClicked ( ) override ;
2015-03-21 18:27:37 -04:00
2014-07-08 03:11:14 -04:00
//Params.
2014-10-14 11:53:15 -04:00
virtual void SetCenter ( double x , double y ) override ;
virtual void FillParamTablesAndPalette ( ) override ;
virtual void BrightnessChanged ( double d ) override ;
virtual void GammaChanged ( double d ) override ;
virtual void GammaThresholdChanged ( double d ) override ;
virtual void VibrancyChanged ( double d ) override ;
virtual void HighlightPowerChanged ( double d ) override ;
2014-12-06 00:05:09 -05:00
virtual void PaletteModeChanged ( uint i ) override ;
virtual void WidthChanged ( uint i ) override ;
virtual void HeightChanged ( uint i ) override ;
2018-07-08 11:31:26 -04:00
virtual void ResizeAndScale ( int width , int height , eScaleType scaleType ) override ;
2014-10-14 11:53:15 -04:00
virtual void CenterXChanged ( double d ) override ;
virtual void CenterYChanged ( double d ) override ;
virtual void ScaleChanged ( double d ) override ;
virtual void ZoomChanged ( double d ) override ;
virtual void RotateChanged ( double d ) override ;
virtual void ZPosChanged ( double d ) override ;
virtual void PerspectiveChanged ( double d ) override ;
virtual void PitchChanged ( double d ) override ;
virtual void YawChanged ( double d ) override ;
virtual void DepthBlurChanged ( double d ) override ;
virtual void SpatialFilterWidthChanged ( double d ) override ;
virtual void SpatialFilterTypeChanged ( const QString & text ) override ;
virtual void TemporalFilterWidthChanged ( double d ) override ;
virtual void TemporalFilterTypeChanged ( const QString & text ) override ;
virtual void DEFilterMinRadiusWidthChanged ( double d ) override ;
virtual void DEFilterMaxRadiusWidthChanged ( double d ) override ;
virtual void DEFilterCurveWidthChanged ( double d ) override ;
2014-11-28 04:37:51 -05:00
virtual void SbsChanged ( int d ) override ;
virtual void FuseChanged ( int d ) override ;
2014-10-14 11:53:15 -04:00
virtual void QualityChanged ( double d ) override ;
virtual void SupersampleChanged ( int d ) override ;
2014-11-28 04:37:51 -05:00
virtual void TemporalSamplesChanged ( int d ) override ;
2014-10-14 11:53:15 -04:00
virtual void AffineInterpTypeChanged ( int index ) override ;
virtual void InterpTypeChanged ( int index ) override ;
virtual void BackgroundChanged ( const QColor & col ) override ;
2017-07-22 16:43:35 -04:00
virtual void ClearColorCurves ( int i ) override ;
2015-04-27 01:11:56 -04:00
virtual void ColorCurveChanged ( int curveIndex , int pointInxed , const QPointF & point ) override ;
2014-07-08 03:11:14 -04:00
//Xforms.
2014-10-14 11:53:15 -04:00
virtual void CurrentXformComboChanged ( int index ) override ;
virtual void XformWeightChanged ( double d ) override ;
virtual void EqualizeWeights ( ) override ;
virtual void XformNameChanged ( int row , int col ) override ;
2016-02-02 20:51:58 -05:00
virtual void XformAnimateChanged ( int state ) override ;
2015-05-03 20:13:14 -04:00
virtual void FillXforms ( int index = 0 ) override ;
2018-07-31 00:39:41 -04:00
virtual void UpdateXformName ( int index ) override ;
2014-07-08 03:11:14 -04:00
void FillWithXform ( Xform < T > * xform ) ;
Xform < T > * CurrentXform ( ) ;
--User changes
-No longer constrain pitch, yaw or depth spinners to -180 - 180.
--Bug fixes
-Properly set color index on padded xforms.
-Adding a padding final xform included a linear variation with a weight of zero to not appear empty. Made it have a weight of 1.
-Always write animate tag on final xform when saving to Xml.
-Motion was being applied to the wrong flame in SheepTools::Edge(), so apply it to the correct one.
-Prevent divide by zero when normalizing variation weights.
-Was accidentally adding the placeholder value of -9999 for motion_offset to varation weights and parameters when applying motion. Set to zero if no value present.
-Clamp flame rotation values to -180 - 180 when reading a flame from Xml.
-Events were not properly wired for user changes in the random rotations per blend controls in the sequencer.
-Fix major UI bugs with sequencer min/max random controls which made it nearly impossible to hand type values.
-Values from rotations per blend and rotations per blend max were not being saved to file between program runs.
-Checking animate for an xform was not applied to all flames even if Apply All was checked.
-Changing interpolation type, temporal filter width, temporal type, and affine interpolation type were not actually saving to the flame when changed.
-Grid on the main window was not being drawn at the right scale initially due to some OpenGL initialization occurring in the wrong order.
-Severe bugs in sequence generation code:
--Improperly detected padding xforms.
--When looking for specific variations during xform aligning, only presence was detected, when it should have been presence plus a weight greater than zero.
--When adding specific variations during xform aligning, must first remove any variations of that type.
--Two variables were unsigned when they should have been signed. This prevented large blocks of code from ever executing.
--When interpolating affines, an EPS that was too small was used, causing affine values to interpolate incorrectly. Instead use 1e-10 to ensure results equal to flam3.
--Code changes
-Modify FractoriumEmberController::UpdateXform() to pass the selected xform index as well as the absolute index to func().
2018-06-13 00:20:15 -04:00
void UpdateXform ( std : : function < void ( Xform < T > * , size_t , size_t ) > func , eXformUpdate updateType = eXformUpdate : : UPDATE_CURRENT , bool updateRender = true , eProcessAction action = eProcessAction : : FULL_RENDER , size_t index = 0 ) ;
2014-07-08 03:11:14 -04:00
//Xforms Affine.
2014-10-14 11:53:15 -04:00
virtual void AffineSetHelper ( double d , int index , bool pre ) override ;
2015-04-27 01:11:56 -04:00
virtual void FlipXforms ( bool horizontal , bool vertical , bool pre ) override ;
virtual void RotateXformsByAngle ( double angle , bool pre ) override ;
virtual void MoveXforms ( double x , double y , bool pre ) override ;
virtual void ScaleXforms ( double scale , bool pre ) override ;
virtual void ResetXformsAffine ( bool pre ) override ;
2018-09-15 06:11:12 -04:00
virtual void CopyXformsAffine ( bool pre ) override ;
virtual void PasteXformsAffine ( bool pre ) override ;
2016-05-23 22:48:04 -04:00
virtual void RandomXformsAffine ( bool pre ) override ;
2015-02-03 20:11:16 -05:00
virtual void FillBothAffines ( ) override ;
2018-09-30 17:20:02 -04:00
virtual void SwapAffines ( ) override ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual void InitLockedScale ( ) override ;
2014-07-08 03:11:14 -04:00
void FillAffineWithXform ( Xform < T > * xform , bool pre ) ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
void ChangeLockedScale ( T value ) ;
2016-02-02 20:51:58 -05:00
T AffineScaleCurrentToLocked ( ) ;
T AffineScaleLockedToCurrent ( ) ;
2014-07-08 03:11:14 -04:00
//Xforms Color.
2017-08-18 01:40:03 -04:00
virtual void XformColorIndexChanged ( double d , bool updateRender , bool updateSpinner , bool updateScroll , eXformUpdate update = eXformUpdate : : UPDATE_SELECTED , size_t index = 0 ) override ;
2016-05-02 19:54:56 -04:00
virtual void RandomColorIndicesButtonClicked ( ) override ;
virtual void ToggleColorIndicesButtonClicked ( ) override ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual void RandomColorSpeedButtonClicked ( ) override ;
virtual void ToggleColorSpeedButtonClicked ( ) override ;
2014-10-14 11:53:15 -04:00
virtual void XformColorSpeedChanged ( double d ) override ;
virtual void XformOpacityChanged ( double d ) override ;
virtual void XformDirectColorChanged ( double d ) override ;
2018-07-31 00:39:41 -04:00
virtual void SoloXformCheckBoxStateChanged ( int state , int index ) override ;
2015-07-15 23:27:32 -04:00
virtual QColor ColorIndexToQColor ( double d ) override ;
2014-07-08 03:11:14 -04:00
void FillColorWithXform ( Xform < T > * xform ) ;
//Xforms Variations.
2015-07-23 21:16:36 -04:00
virtual void Filter ( const QString & text ) override ;
2016-03-28 21:49:10 -04:00
virtual void SetupVariationsTree ( ) override ;
2014-10-14 11:53:15 -04:00
virtual void ClearVariationsTree ( ) override ;
virtual void VariationSpinBoxValueChanged ( double d ) override ;
2015-08-10 23:10:23 -04:00
virtual void FilteredVariations ( ) override ;
2018-07-31 00:39:41 -04:00
virtual void FillVariationTreeWithCurrentXform ( ) override ;
2014-07-08 03:11:14 -04:00
void FillVariationTreeWithXform ( Xform < T > * xform ) ;
//Xforms Xaos.
2015-04-08 21:23:29 -04:00
virtual void FillXaos ( ) override ;
2015-05-30 00:08:44 -04:00
virtual void XaosChanged ( int x , int y , double val ) override ;
2014-10-14 11:53:15 -04:00
virtual void ClearXaos ( ) override ;
2014-10-15 23:09:44 -04:00
virtual void RandomXaos ( ) override ;
2018-07-31 00:39:41 -04:00
virtual void AddLayer ( int xforms ) override ;
2015-12-31 16:41:59 -05:00
2016-12-05 22:04:33 -05:00
//Xforms Selection.
2018-09-15 06:11:12 -04:00
virtual QString MakeXformCaption ( size_t i ) override ;
2016-12-05 22:04:33 -05:00
bool XformCheckboxAt ( int i , std : : function < void ( QCheckBox * ) > func ) ;
bool XformCheckboxAt ( Xform < T > * xform , std : : function < void ( QCheckBox * ) > func ) ;
2014-07-08 03:11:14 -04:00
//Palette.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual size_t InitPaletteList ( const QString & s ) override ;
2015-04-08 21:23:29 -04:00
virtual bool FillPaletteTable ( const string & s ) override ;
2014-10-14 11:53:15 -04:00
virtual void ApplyPaletteToEmber ( ) override ;
virtual void PaletteAdjust ( ) override ;
virtual void PaletteCellClicked ( int row , int col ) override ;
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
virtual void SetBasePaletteAndAdjust ( const Palette < float > & palette ) override ;
virtual void PaletteEditorButtonClicked ( ) override ;
2014-07-08 03:11:14 -04:00
//Info.
2015-07-15 23:27:32 -04:00
virtual void FillSummary ( ) override ;
2014-07-08 03:11:14 -04:00
//Rendering/progress.
2014-10-14 11:53:15 -04:00
virtual bool Render ( ) override ;
2017-07-22 16:43:35 -04:00
virtual bool CreateRenderer ( eRendererType renderType , const vector < pair < size_t , size_t > > & devices , bool updatePreviews , bool shared = true ) override ;
2014-12-06 00:05:09 -05:00
virtual uint SizeOfT ( ) const override { return sizeof ( T ) ; }
2014-10-14 11:53:15 -04:00
virtual int ProgressFunc ( Ember < T > & ember , void * foo , double fraction , int stage , double etaMs ) override ;
virtual void ClearUndo ( ) override ;
virtual GLEmberControllerBase * GLController ( ) override { return m_GLController . get ( ) ; }
2017-12-21 23:09:08 -05:00
virtual void DeleteRenderer ( ) override ;
2014-07-08 03:11:14 -04:00
private :
//Embers.
void ApplyXmlSavingTemplate ( Ember < T > & ember ) ;
2016-04-13 23:59:57 -04:00
template < typename U > void SetEmberPrivate ( const Ember < U > & ember , bool verbatim , bool updatePointer ) ;
2014-07-08 03:11:14 -04:00
//Params.
void ParamsToEmber ( Ember < T > & ember ) ;
//Xforms.
void SetNormalizedWeightText ( Xform < T > * xform ) ;
bool IsFinal ( Xform < T > * xform ) ;
//Xforms Color.
2015-03-21 18:27:37 -04:00
void FillCurvesControl ( ) ;
2014-07-08 03:11:14 -04:00
//Palette.
--User changes
-Add a palette editor.
-Add support for reading .ugr/.gradient/.gradients palette files.
-Allow toggling on spinners whose minimum value is not zero.
-Allow toggling display of image, affines and grid.
-Add new variations: cylinder2, circlesplit, tile_log, truchet_fill, waves2_radial.
--Bug fixes
-cpow2 was wrong.
-Palettes with rapid changes in color would produce slightly different outputs from Apo/Chaotica. This was due to a long standing bug from flam3.
-Use exec() on Apple and show() on all other OSes for dialog boxes.
-Trying to render a sequence with no frames would crash.
-Selecting multiple xforms and rotating them would produce the wrong rotation.
-Better handling when parsing flames using different encoding, such as unicode and UTF-8.
-Switching between SP/DP didn't reselect the selected flame in the Library tab.
--Code changes
-Make all types concerning palettes be floats, including PaletteTableWidgetItem.
-PaletteTableWidgetItem is no longer templated because all palettes are float.
-Include the source colors for user created gradients.
-Change parallel_for() calls to work with very old versions of TBB which are lingering on some systems.
-Split conditional out of accumulation loop on the CPU for better performance.
-Vectorize summing when doing density filter for better performance.
-Make all usage of palettes be of type float, double is pointless.
-Allow palettes to reside in multiple folders, while ensuring only one of each name is added.
-Refactor some palette path searching code.
-Make ReadFile() throw and catch an exception if the file operation fails.
-A little extra safety in foci and foci3D with a call to Zeps().
-Cast to (real_t) in the OpenCL string for the w variation, which was having trouble compiling on Mac.
-Fixing missing comma between paths in InitPaletteList().
-Move Xml and PaletteList classes into cpp to shorten build times when working on them.
-Remove default param values for IterOpenCLKernelCreator<T>::SharedDataIndexDefines in cpp file.
-Change more NULL to nullptr.
2017-02-26 03:02:21 -05:00
void UpdateAdjustedPaletteGUI ( Palette < float > & palette ) ;
2014-07-08 03:11:14 -04:00
//Rendering/progress.
2015-12-31 19:00:36 -05:00
void Update ( std : : function < void ( void ) > func , bool updateRender = true , eProcessAction action = eProcessAction : : FULL_RENDER ) ;
2018-04-13 20:45:31 -04:00
void UpdateAll ( std : : function < void ( Ember < T > & , bool ) > func , bool updateRender = true , eProcessAction action = eProcessAction : : FULL_RENDER , bool applyAll = false ) ;
2014-10-14 11:53:15 -04:00
bool SyncSizes ( ) ;
2014-07-08 03:11:14 -04:00
//Templated members.
2016-04-03 21:55:12 -04:00
bool m_PreviewRunning = false ;
2014-07-08 03:11:14 -04:00
vector < T > m_TempOpacities ;
vector < T > m_NormalizedWeights ;
Ember < T > m_Ember ;
2018-04-13 20:45:31 -04:00
Ember < T > * m_EmberFilePointer = nullptr ;
2014-07-08 03:11:14 -04:00
EmberFile < T > m_EmberFile ;
2016-06-11 20:47:03 -04:00
EmberFile < T > m_SequenceFile ;
2014-07-08 03:11:14 -04:00
deque < Ember < T > > m_UndoList ;
2015-05-19 22:31:33 -04:00
vector < Xform < T > > m_CopiedXforms ;
Xform < T > m_CopiedFinalXform ;
2018-09-15 06:11:12 -04:00
Affine2D < T > m_CopiedAffine ;
2016-04-13 23:59:57 -04:00
shared_ptr < VariationList < T > > m_VariationList ;
2015-08-10 23:10:23 -04:00
unique_ptr < SheepTools < T , float > > m_SheepTools ;
2014-10-18 17:07:07 -04:00
unique_ptr < GLEmberController < T > > m_GLController ;
2016-06-11 20:47:03 -04:00
unique_ptr < TreePreviewRenderer < T > > m_LibraryPreviewRenderer ;
unique_ptr < TreePreviewRenderer < T > > m_SequencePreviewRenderer ;
} ;
/// <summary>
/// Base class for encapsulating a preview renderer which will be used
/// in such places as the main library tree, the sequence tree and the
/// single preview thumbnail shown in the final render dialog.
/// Derived classes will implement PreviewRenderFunc() to handle the rendering
/// functionality specific to their previews.
/// </summary>
template < typename T >
class PreviewRenderer
{
public :
PreviewRenderer ( )
{
}
void Render ( uint start , uint end )
{
Stop ( ) ;
m_PreviewResult = QtConcurrent : : run ( [ & ] ( uint s , uint e )
{
rlg l ( m_PreviewCs ) ;
m_PreviewRun = true ;
PreviewRenderFunc ( s , e ) ;
m_PreviewRun = false ;
} , start , end ) ;
}
void Stop ( )
{
m_PreviewRun = false ;
m_PreviewRenderer . Abort ( ) ;
m_PreviewResult . cancel ( ) ;
while ( m_PreviewResult . isRunning ( ) )
QApplication : : processEvents ( ) ;
}
bool EarlyClip ( )
{
return m_PreviewRenderer . EarlyClip ( ) ;
}
bool YAxisUp ( )
{
return m_PreviewRenderer . YAxisUp ( ) ;
}
bool Running ( )
{
return m_PreviewRun | | m_PreviewResult . isRunning ( ) ;
}
virtual void PreviewRenderFunc ( uint start , uint end ) { }
protected :
volatile bool m_PreviewRun = false ;
Ember < T > m_PreviewEmber ;
2017-07-22 16:43:35 -04:00
vector < byte > m_PreviewVec ;
vv4F m_PreviewFinalImage ;
2016-06-11 20:47:03 -04:00
EmberNs : : Renderer < T , float > m_PreviewRenderer ;
private :
2014-07-08 03:11:14 -04:00
QFuture < void > m_PreviewResult ;
2016-06-11 20:47:03 -04:00
std : : recursive_mutex m_PreviewCs ;
2014-07-08 03:11:14 -04:00
} ;
2016-06-11 20:47:03 -04:00
/// <summary>
/// Thin derivation to handle preview rendering multiple embers previews to a tree.
/// </summary>
template < typename T >
class TreePreviewRenderer : public PreviewRenderer < T >
{
public :
using PreviewRenderer < T > : : m_PreviewRun ;
using PreviewRenderer < T > : : m_PreviewEmber ;
2017-07-22 16:43:35 -04:00
using PreviewRenderer < T > : : m_PreviewVec ;
2016-06-11 20:47:03 -04:00
using PreviewRenderer < T > : : m_PreviewRenderer ;
using PreviewRenderer < T > : : m_PreviewFinalImage ;
2016-12-05 22:04:33 -05:00
2016-06-11 20:47:03 -04:00
/// <summary>
/// Initializes a new instance of the <see cref="TreePreviewRenderer{T}"/> class.
/// </summary>
/// <param name="controller">A pointer to the controller this instance is a member of</param>
/// <param name="tree">A pointer to the tree to render to</param>
/// <param name="emberFile">A reference to the ember file to render</param>
TreePreviewRenderer ( FractoriumEmberController < T > * controller , QTreeWidget * tree , EmberFile < T > & emberFile ) :
m_Controller ( controller ) ,
m_Tree ( tree ) ,
m_EmberFile ( emberFile )
{
auto f = m_Controller - > m_Fractorium ;
m_PreviewRenderer . Callback ( nullptr ) ;
m_PreviewRenderer . EarlyClip ( f - > m_Settings - > EarlyClip ( ) ) ;
m_PreviewRenderer . YAxisUp ( f - > m_Settings - > YAxisUp ( ) ) ;
}
virtual void PreviewRenderFunc ( uint start , uint end ) override ;
protected :
FractoriumEmberController < T > * m_Controller ;
QTreeWidget * m_Tree ;
EmberFile < T > & m_EmberFile ;
} ;