From 5cdfe0b6b9911ab17c1842d0271c543102d2eb5e Mon Sep 17 00:00:00 2001 From: Person Date: Mon, 5 Dec 2016 19:04:33 -0800 Subject: [PATCH] 1.0.0.2 12/05/2016 --User changes -Add many tooltips to help clarify functionality. -Select multiple flames in library for del/move. Still only one allowed to be set as the current. -Show checkbox for current flame. Remember this is not necessarily what's selected. -User can now drag a square to select xforms, which keeps in sync with checkboxes. -Remove --nframes from command line. Replace with new params: --loopframes, --interpframes, --interploops. -Add two new options to EmberGenome: --cwloops --cwinterploops to specify whether rotation should go clockwise instead of the default counter clockwise. -Add these to Fractorium as checkboxes. -Apply All now also works for toggling animate flag on xforms. -Options dialog now allows user to set whether double click toggles spinners, or right click does. --Bug fixes -Selecting final and non-final xforms, and then dragging the non-final did not drag the final with it. -Selecting all xforms when a final was present, then deleting crashed the program. -Remove support for ppm files in the command line programs, it's an outdated format. -Switching between SP and DP kept reapplying the palette adjustments. --Code changes -Move build system to Visual Studio 2015 and Qt 5.6. -SSE used during addition of points to the histogram. -Remove last remnants of old flam3 C code and replace with C++. -Remove unused code involving tbb::task_group. -Make settings object a global shared_ptr singleton, so it doesn't have to be passed around. --- .gitignore | 22 +- .../Installer/FractoriumInstaller.wixproj | 2 +- Builds/MSVC/Installer/Product.wxs | 19 +- Builds/MSVC/VS2015/Ember.rc | Bin 0 -> 4502 bytes Builds/MSVC/VS2015/Ember.vcxproj | 166 ++++ Builds/MSVC/VS2015/Ember.vcxproj.filters | 160 +++ Builds/MSVC/VS2015/EmberAnimate.rc | 98 ++ Builds/MSVC/VS2015/EmberAnimate.vcxproj | 149 +++ .../MSVC/VS2015/EmberAnimate.vcxproj.filters | 62 ++ Builds/MSVC/VS2015/EmberCL.rc | Bin 0 -> 4528 bytes Builds/MSVC/VS2015/EmberCL.vcxproj | 151 +++ Builds/MSVC/VS2015/EmberCL.vcxproj.filters | 89 ++ Builds/MSVC/VS2015/EmberGenome.rc | 98 ++ Builds/MSVC/VS2015/EmberGenome.vcxproj | 148 +++ .../MSVC/VS2015/EmberGenome.vcxproj.filters | 61 ++ Builds/MSVC/VS2015/EmberRender.rc | 98 ++ Builds/MSVC/VS2015/EmberRender.vcxproj | 149 +++ .../MSVC/VS2015/EmberRender.vcxproj.filters | 61 ++ Builds/MSVC/VS2015/EmberTester.vcxproj | 141 +++ .../MSVC/VS2015/EmberTester.vcxproj.filters | 48 + Builds/MSVC/VS2015/Fractorium.rc | Bin 0 -> 4470 bytes Builds/MSVC/VS2015/Fractorium.sln | 76 ++ Builds/MSVC/VS2015/Fractorium.vcxproj | 632 ++++++++++++ Builds/MSVC/VS2015/Fractorium.vcxproj.filters | 417 ++++++++ Builds/MSVC/VS2015/resource.h | 14 + Builds/MSVC/VS2015/resource1.h | 14 + Builds/MSVC/VS2015/zlib.props | 37 + Builds/MSVC/WIN32.MAK | 491 +++++++++ Builds/QtCreator/defaults.pri | 22 +- Data/Version History.txt | 25 + Source/Ember/EmberDefines.h | 5 +- Source/Ember/EmberPch.h | 5 +- Source/Ember/EmberToXml.h | 3 - Source/Ember/Iterator.h | 2 +- Source/Ember/PaletteList.h | 44 +- Source/Ember/Renderer.cpp | 187 ++-- Source/Ember/RendererBase.h | 1 - Source/Ember/SheepTools.h | 48 +- Source/Ember/Utils.h | 72 +- Source/Ember/XmlToEmber.h | 237 +---- Source/EmberAnimate/EmberAnimate.cpp | 5 +- Source/EmberCL/EmberCLPch.h | 1 + Source/EmberCommon/EmberCommonPch.h | 3 - Source/EmberCommon/EmberOptions.h | 197 ++-- Source/EmberCommon/JpegUtils.h | 125 +-- Source/EmberGenome/EmberGenome.cpp | 58 +- Source/EmberRender/EmberRender.cpp | 5 +- Source/EmberTester/EmberTester.cpp | 9 +- Source/Fractorium/AboutDialog.ui | 2 +- Source/Fractorium/DoubleSpinBox.cpp | 61 +- Source/Fractorium/DoubleSpinBox.h | 3 +- Source/Fractorium/EmberTreeWidgetItem.h | 2 + Source/Fractorium/FinalRenderDialog.cpp | 4 +- Source/Fractorium/FinalRenderDialog.h | 4 +- .../Fractorium/FinalRenderEmberController.cpp | 8 +- .../Fractorium/FinalRenderEmberController.h | 4 +- Source/Fractorium/Fractorium.cpp | 21 +- Source/Fractorium/Fractorium.h | 15 +- Source/Fractorium/Fractorium.ui | 932 ++++++++++++------ Source/Fractorium/FractoriumCommon.h | 20 + .../Fractorium/FractoriumEmberController.cpp | 11 +- Source/Fractorium/FractoriumEmberController.h | 20 +- Source/Fractorium/FractoriumInfo.cpp | 33 +- Source/Fractorium/FractoriumLibrary.cpp | 164 ++- Source/Fractorium/FractoriumRender.cpp | 13 +- Source/Fractorium/FractoriumSettings.cpp | 10 +- Source/Fractorium/FractoriumSettings.h | 11 +- Source/Fractorium/FractoriumXforms.cpp | 22 +- Source/Fractorium/FractoriumXformsAffine.cpp | 2 + Source/Fractorium/FractoriumXformsColor.cpp | 3 + Source/Fractorium/FractoriumXformsSelect.cpp | 19 +- Source/Fractorium/GLEmberController.h | 2 +- Source/Fractorium/GLWidget.cpp | 39 + Source/Fractorium/LibraryTreeWidget.cpp | 4 +- Source/Fractorium/OptionsDialog.cpp | 7 +- Source/Fractorium/OptionsDialog.h | 5 +- Source/Fractorium/OptionsDialog.ui | 10 + Source/Fractorium/QssDialog.cpp | 56 +- Source/Fractorium/SpinBox.cpp | 65 +- Source/Fractorium/SpinBox.h | 2 +- Source/Fractorium/VariationsDialog.cpp | 4 +- Source/Fractorium/VariationsDialog.h | 4 +- makedeps.bat | 9 +- 83 files changed, 4892 insertions(+), 1156 deletions(-) create mode 100644 Builds/MSVC/VS2015/Ember.rc create mode 100644 Builds/MSVC/VS2015/Ember.vcxproj create mode 100644 Builds/MSVC/VS2015/Ember.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/EmberAnimate.rc create mode 100644 Builds/MSVC/VS2015/EmberAnimate.vcxproj create mode 100644 Builds/MSVC/VS2015/EmberAnimate.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/EmberCL.rc create mode 100644 Builds/MSVC/VS2015/EmberCL.vcxproj create mode 100644 Builds/MSVC/VS2015/EmberCL.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/EmberGenome.rc create mode 100644 Builds/MSVC/VS2015/EmberGenome.vcxproj create mode 100644 Builds/MSVC/VS2015/EmberGenome.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/EmberRender.rc create mode 100644 Builds/MSVC/VS2015/EmberRender.vcxproj create mode 100644 Builds/MSVC/VS2015/EmberRender.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/EmberTester.vcxproj create mode 100644 Builds/MSVC/VS2015/EmberTester.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/Fractorium.rc create mode 100644 Builds/MSVC/VS2015/Fractorium.sln create mode 100644 Builds/MSVC/VS2015/Fractorium.vcxproj create mode 100644 Builds/MSVC/VS2015/Fractorium.vcxproj.filters create mode 100644 Builds/MSVC/VS2015/resource.h create mode 100644 Builds/MSVC/VS2015/resource1.h create mode 100644 Builds/MSVC/VS2015/zlib.props create mode 100644 Builds/MSVC/WIN32.MAK diff --git a/.gitignore b/.gitignore index b4f07db..03df18a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,9 +27,24 @@ *.msi *.idb *.flam3 +*.flame +*.bmp +*.jpg +*.png +*.zip +*.avi +*.ini +*.bin +*.aps +*.db +*.opendb *moc_* *GeneratedFiles* *.unsuccessfulbuild +*~* +*-pre1 +Makefile.Debug +Makefile.Release *\Obj\* Builds/MSVC/VS2013/Obj/x64/Debug/EmberCL_manifest.rc Builds/MSVC/VS2013/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc @@ -38,8 +53,12 @@ Builds/MSVC/VS2013/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc Builds/MSVC/VS2013/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc Builds/MSVC/VS2013/Obj/Ember/x64/Debug/Ember_manifest.rc Builds/MSVC/Installer/obj/ +Builds/MSVC/VS2015/GeneratedFiles +Builds/MSVC/VS2015/ipch +Builds/MSVC/VS2015/Obj Bin/x64/Release/testallvarsout.flame -Data/~$Bench.xlsx +fractorium.com/ +Site/ *.ps1 *.o ui_*.h @@ -65,3 +84,4 @@ Builds/QtCreator/Fractorium/Makefile Builds/lib/libOpenCL.so Builds/include/CL Builds/include/GL +/Data/Variations Bench.xlsx diff --git a/Builds/MSVC/Installer/FractoriumInstaller.wixproj b/Builds/MSVC/Installer/FractoriumInstaller.wixproj index e124eba..c581c50 100644 --- a/Builds/MSVC/Installer/FractoriumInstaller.wixproj +++ b/Builds/MSVC/Installer/FractoriumInstaller.wixproj @@ -6,7 +6,7 @@ 3.7 {c8096c47-e358-438c-a520-146d46b0637d} 2.0 - Fractorium_1.0.0.1 + Fractorium_1.0.0.2 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets diff --git a/Builds/MSVC/Installer/Product.wxs b/Builds/MSVC/Installer/Product.wxs index b777f28..f367af7 100644 --- a/Builds/MSVC/Installer/Product.wxs +++ b/Builds/MSVC/Installer/Product.wxs @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + - - + + - - + + - - + + + + + diff --git a/Builds/MSVC/VS2015/Ember.rc b/Builds/MSVC/VS2015/Ember.rc new file mode 100644 index 0000000000000000000000000000000000000000..fba1881fbea82d68b1a84914f52a5e14bba1b20b GIT binary patch literal 4502 zcmd6qTTc@~6vxkNP5cgPd68(KMPg!NOt_RvER@*NXhPBeZIJ|9(rrZ&KfC(-&vfW+ zcNau`XePTmmvg_(*>p4t<*th?_DyF*T|fbKciw|3+9dQi9lbIrcky8_s9 zhL@nr4q9AR9L<5FCpot4$XeF6W81ZTYg*SnT8-UZ=7-j>&+N2#AJ{fK4dy{s$-8_b zNEg15)v@8CKL%K7WM9#Lf^}qvHd=q;y^q#A=qY>D*x%q;^xi}MD$o4o@zVBRK8pp3 zd~{5)m7;Ed-hUSx!SaFba(#nz5#Ak=t5;+~ObkT!9G?$ag`90M^BEl5YEBfyiJZE0 z_Ij4etsWG&Y>%k&In^S6j>)baICqJz219gzFrq@tHZ(pG!(Ffr!C!S;OWv7f9?-Q%cs&Wa7%eUT=0Z(=3@w~EkM;R{u z_DEKvvYk-XPKbAZGe`#Q-7nLtzmnB=2fI@EXso3ioyTO_npf( zpQ)cv*AS!k2+zz6kEvPhN8klcd#>Wtk@SEn)uLWRMA&zGMRjS+c%*BM>SB#bbxam{sY__) z<(^aXRH_LYed>6O^&Y~hq;Pc8snVtG(?n9wVH0UJHt(>4ENwcXBP8{38<}%oZ_`k7 z-iuX2mAQ$HWuG$KCq#jIzzcN0M6*5?7$WEBE?e)XAc-sX#z}t0JLLExRtK-B(~%x! z_^Ttj=FS`1EfICfs?Waek23OIvl=pQ0T=q%Ksik*NWBY2vd{H#9Vl+YK|YJz9ejq) zr#!c;rRkWjDwgj?f<1I5xN~#Hjm^Hs0E zXqy_AI&w z@(wMzUT2G)7CrK6_}rZOVNO0s@3hE>aarpb3z=Yz_un&eBSN>hBh{hy9> z`EI))k+e@fzV_euzmdJ&m%q=Hw*E%Z>|g&s)pOyK8sUE6p*+0%~ H1W4Q8LF^rp literal 0 HcmV?d00001 diff --git a/Builds/MSVC/VS2015/Ember.vcxproj b/Builds/MSVC/VS2015/Ember.vcxproj new file mode 100644 index 0000000..d332f66 --- /dev/null +++ b/Builds/MSVC/VS2015/Ember.vcxproj @@ -0,0 +1,166 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67} + Win32Proj + EmberNs + Ember + + + + DynamicLibrary + true + MultiByte + false + v140 + + + DynamicLibrary + false + false + MultiByte + v140 + + + + + + + + + + + + + true + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + + + $(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include + Default + EmberPch.h + Precise + /bigobj %(AdditionalOptions) + true + false + true + false + + + Windows + true + libxml2.lib;tbb.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;%(AdditionalLibraryDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBER;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + + + $(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\tbb\include + Speed + EmberPch.h + true + /bigobj %(AdditionalOptions) + Precise + true + false + false + false + + + Windows + true + true + true + libxml2.lib;tbb.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/Ember.vcxproj.filters b/Builds/MSVC/VS2015/Ember.vcxproj.filters new file mode 100644 index 0000000..88dd77d --- /dev/null +++ b/Builds/MSVC/VS2015/Ember.vcxproj.filters @@ -0,0 +1,160 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {bc119dca-b280-4071-b72d-f8c377b2e192} + + + {39f9b624-d25e-4af7-9f76-3b1a36a8a0f5} + + + {1ae77918-b5ee-4186-9fec-802fed55144e} + + + {782f9ed7-c2d4-4cad-9676-f707ccde10a6} + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Filters + + + Header Files\Filters + + + Header Files\Filters + + + Header Files\Xml + + + Header Files\Xml + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Variations + + + Header Files\Variations + + + Header Files\Variations + + + Header Files\Variations + + + Header Files\Variations + + + Header Files\Variations + + + Header Files\Variations + + + Header Files\Variations + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Variations + + + Header Files + + + Header Files\Variations + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Header Files\Variations + + + + + Resource Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberAnimate.rc b/Builds/MSVC/VS2015/EmberAnimate.rc new file mode 100644 index 0000000..d3ad1d7 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberAnimate.rc @@ -0,0 +1,98 @@ +// Microsoft Visual C++ generated resource script. +// +#include +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) + LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + #pragma code_page(1252) + + ///////////////////////////////////////////////////////////////////////////// + // + // Icon + // + + // Icon with lowest ID value placed first to ensure application icon + // remains consistent on all systems. + IDI_ICON1 ICON "..\\..\\..\\Source\\Fractorium\\Icons\\Fractorium.ico" + + #ifdef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // TEXTINCLUDE + // + + 1 TEXTINCLUDE + BEGIN + "resource.h\0" + END + + 2 TEXTINCLUDE + BEGIN + "\0" + END + + 3 TEXTINCLUDE + BEGIN + "\r\n" + "\0" + END + + #endif // APSTUDIO_INVOKED + + + ///////////////////////////////////////////////////////////////////////////// + // + // Version + // + + VS_VERSION_INFO VERSIONINFO + FILEVERSION 1, 0, 0, 2 + PRODUCTVERSION 1, 0, 0, 2 + FILEFLAGSMASK 0x3fL + #ifdef _DEBUG + FILEFLAGS 0x1L + #else + FILEFLAGS 0x0L + #endif + FILEOS 0x40004L + FILETYPE 0x0L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Open Source" + VALUE "FileDescription", "Renders fractal flames as animations with motion blur" + VALUE "FileVersion", "1.0.0.2" + VALUE "InternalName", "EmberAnimate.exe" + VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2016, GPL v3" + VALUE "OriginalFilename", "EmberAnimate.exe" + VALUE "ProductName", "Ember Animate" + VALUE "ProductVersion", "1.0.0.2" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // Generated from the TEXTINCLUDE 3 resource. + // + + + ///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Builds/MSVC/VS2015/EmberAnimate.vcxproj b/Builds/MSVC/VS2015/EmberAnimate.vcxproj new file mode 100644 index 0000000..1e55712 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberAnimate.vcxproj @@ -0,0 +1,149 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {35285FCF-6FA8-410E-841B-70AE744D38B8} + Win32Proj + EmberAnimate + EmberAnimate + + + + Application + true + MultiByte + false + v140 + + + Application + false + false + MultiByte + v140 + + + + + + + + + + + + + true + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + false + true + false + + + Console + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + true + false + false + + + Console + true + true + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + + + + + {2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67} + + + {f6a9102c-69a9-48fb-bc4b-49e49af43236} + + + + + + + + + + + + + + + + Create + Create + + + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberAnimate.vcxproj.filters b/Builds/MSVC/VS2015/EmberAnimate.vcxproj.filters new file mode 100644 index 0000000..5b0a143 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberAnimate.vcxproj.filters @@ -0,0 +1,62 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + Resource Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberCL.rc b/Builds/MSVC/VS2015/EmberCL.rc new file mode 100644 index 0000000000000000000000000000000000000000..eada694b926dd183cc91f5c9f79a2321e51d7a41 GIT binary patch literal 4528 zcmd6qTWcCY6vxl2g?@*vd1+`#)PzEz6ml^()Wi^tv=ERaY8ps2xY{((&))X;pK;=@ zt_IUS$gsO}IrrO~{quX%HZ8IvyRj=9Sl?ovt_|61vKQOPF6@@op1om2c5NN&@eJ4> z@@=y>;48clvn%EiD^a_#J76~KrM-a5ru(k3+vD^W=(dCXVE1mX4TXC!H|(2zoCBMm z;U(z2gBF)HN3-kbNsb*mvAQ+v%=YcjYSyw-E3>=L{Mf4Ym7O~8Bim)C$~?#_c~@@) z>B2X%3O1bfM;9yg?K}Dpv5xG}K*(O{McU}FKz$TvsjSG zN5=?TDeAiD{k+%+mJf7S>l>tt@NSP>y(JT3Vj!~D_`Js|_S{<`Cu19yjYg`FMV ziqx>mruSt`h-b7mHL}4GBBh_4wQhhq-tw%sW580?S)SAE&5?(TzdMq( zC~xP~v~!}}-wTpKdy8e-dX`Mfb6Ruty6s{xf~ST&nN^QwBT*LgRt(->z3)W6$xPjZ zdWIOi`*>z@qM2Vc$)rUgjT^e&c zflH0JJfmVYmcR>~4qUydAn6e`s!p|th_IiwMQy2$d88|is$!Wsbw&<(sdH%N<(^RU zREh~29jbVY^`62hq;Pc4sm`VCQ$teEVH;^RwjZ&AEDidh6D0L;rI~YIZPQQ_-qSTg zb-9L(WuH9UheUxoz-x5BL9-4P=pkqSFa$ynHdMk;@s`D|(bu9o%B+(%BZID$-jQ#!qPu1$jd~!ho+j z|7ly5vD~FQmlPXB*)1bmnksPDj*9Gmhb5%-HT}pC3~&3{6ZI;4u6H;BcgTo{l@8-O zw(zp4b1jhF?;Mp1@mdAy2icb`No~wokteN!7qv=8!ZO;OK(mkjBj>xtcFLA2O<@_I zP43j>{hD)K&?MWMXg7G&^{G5d$9V%xWlM~;tIqi>ln;x}7lm=9$(Br2X#UOj ze|pu`y9t9t(mwh4dtuR^$n4F(`W>jW^|y^?|N3XDek}XXbkgYto36TT=0|>y3ZnWp L`!6~h0n+v_m8v1y literal 0 HcmV?d00001 diff --git a/Builds/MSVC/VS2015/EmberCL.vcxproj b/Builds/MSVC/VS2015/EmberCL.vcxproj new file mode 100644 index 0000000..13b8841 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberCL.vcxproj @@ -0,0 +1,151 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {F6A9102C-69A9-48FB-BC4B-49E49AF43236} + Win32Proj + EmberCLns + EmberCL + + + + DynamicLibrary + true + MultiByte + false + v140 + + + DynamicLibrary + false + false + MultiByte + v140 + + + + + + + + + + + + + true + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + + + $(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + Default + EmberCLPch.h + true + false + true + false + + + Windows + true + libxml2.lib;tbb.lib;opencl.lib;Opengl32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + + + $(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + Speed + EmberCLPch.h + /bigobj %(AdditionalOptions) + Precise + true + false + true + false + + + Windows + true + true + true + libxml2.lib;tbb.lib;opencl.lib;Opengl32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + + + {2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67} + true + true + false + true + false + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberCL.vcxproj.filters b/Builds/MSVC/VS2015/EmberCL.vcxproj.filters new file mode 100644 index 0000000..9fb2fd9 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberCL.vcxproj.filters @@ -0,0 +1,89 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {d66f35ca-a4cd-470a-9c56-653b0665b598} + + + + + Source Files + + + Source Files + + + Source Files + + + Kernel Creators + + + Kernel Creators + + + Kernel Creators + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Kernel Creators + + + Kernel Creators + + + Kernel Creators + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberGenome.rc b/Builds/MSVC/VS2015/EmberGenome.rc new file mode 100644 index 0000000..8784729 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberGenome.rc @@ -0,0 +1,98 @@ +// Microsoft Visual C++ generated resource script. +// +#include +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) + LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + #pragma code_page(1252) + + ///////////////////////////////////////////////////////////////////////////// + // + // Icon + // + + // Icon with lowest ID value placed first to ensure application icon + // remains consistent on all systems. + IDI_ICON1 ICON "..\\..\\..\\Source\\Fractorium\\Icons\\Fractorium.ico" + + #ifdef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // TEXTINCLUDE + // + + 1 TEXTINCLUDE + BEGIN + "resource.h\0" + END + + 2 TEXTINCLUDE + BEGIN + "\0" + END + + 3 TEXTINCLUDE + BEGIN + "\r\n" + "\0" + END + + #endif // APSTUDIO_INVOKED + + + ///////////////////////////////////////////////////////////////////////////// + // + // Version + // + + VS_VERSION_INFO VERSIONINFO + FILEVERSION 1, 0, 0, 2 + PRODUCTVERSION 1, 0, 0, 2 + FILEFLAGSMASK 0x3fL + #ifdef _DEBUG + FILEFLAGS 0x1L + #else + FILEFLAGS 0x0L + #endif + FILEOS 0x40004L + FILETYPE 0x0L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Open Source" + VALUE "FileDescription", "Manipulates fractal flames parameter files" + VALUE "FileVersion", "1.0.0.2" + VALUE "InternalName", "EmberGenome.exe" + VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2016, GPL v3" + VALUE "OriginalFilename", "EmberGenome.exe" + VALUE "ProductName", "Ember Genome" + VALUE "ProductVersion", "1.0.0.2" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // Generated from the TEXTINCLUDE 3 resource. + // + + + ///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Builds/MSVC/VS2015/EmberGenome.vcxproj b/Builds/MSVC/VS2015/EmberGenome.vcxproj new file mode 100644 index 0000000..fc1a2a4 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberGenome.vcxproj @@ -0,0 +1,148 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {7930CAAC-9FC4-4202-B6A3-E760F73F88B7} + Win32Proj + EmberGenome + EmberGenome + + + + Application + true + MultiByte + false + v140 + + + Application + false + false + MultiByte + v140 + + + + + + + + + + + + + true + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + false + true + false + + + Console + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + true + false + false + + + Console + true + true + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + + + + {2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67} + + + {f6a9102c-69a9-48fb-bc4b-49e49af43236} + + + + + + + + + + + + + + + Create + Create + + + + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberGenome.vcxproj.filters b/Builds/MSVC/VS2015/EmberGenome.vcxproj.filters new file mode 100644 index 0000000..3d1270f --- /dev/null +++ b/Builds/MSVC/VS2015/EmberGenome.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Resource Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberRender.rc b/Builds/MSVC/VS2015/EmberRender.rc new file mode 100644 index 0000000..55ed080 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberRender.rc @@ -0,0 +1,98 @@ +// Microsoft Visual C++ generated resource script. +// +#include +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) + LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + #pragma code_page(1252) + + ///////////////////////////////////////////////////////////////////////////// + // + // Icon + // + + // Icon with lowest ID value placed first to ensure application icon + // remains consistent on all systems. + IDI_ICON1 ICON "..\\..\\..\\Source\\Fractorium\\Icons\\Fractorium.ico" + + #ifdef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // TEXTINCLUDE + // + + 1 TEXTINCLUDE + BEGIN + "resource.h\0" + END + + 2 TEXTINCLUDE + BEGIN + "\0" + END + + 3 TEXTINCLUDE + BEGIN + "\r\n" + "\0" + END + + #endif // APSTUDIO_INVOKED + + + ///////////////////////////////////////////////////////////////////////////// + // + // Version + // + + VS_VERSION_INFO VERSIONINFO + FILEVERSION 1, 0, 0, 2 + PRODUCTVERSION 1, 0, 0, 2 + FILEFLAGSMASK 0x3fL + #ifdef _DEBUG + FILEFLAGS 0x1L + #else + FILEFLAGS 0x0L + #endif + FILEOS 0x40004L + FILETYPE 0x0L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Open Source" + VALUE "FileDescription", "Renders fractal flames as single images" + VALUE "FileVersion", "1.0.0.2" + VALUE "InternalName", "EmberRender.exe" + VALUE "LegalCopyright", "Copyright (C) Matt Feemster 2016, GPL v3" + VALUE "OriginalFilename", "EmberRender.exe" + VALUE "ProductName", "Ember Render" + VALUE "ProductVersion", "1.0.0.2" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED + ///////////////////////////////////////////////////////////////////////////// + // + // Generated from the TEXTINCLUDE 3 resource. + // + + + ///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Builds/MSVC/VS2015/EmberRender.vcxproj b/Builds/MSVC/VS2015/EmberRender.vcxproj new file mode 100644 index 0000000..c170098 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberRender.vcxproj @@ -0,0 +1,149 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29} + Win32Proj + EmberRender + EmberRender + + + + Application + true + MultiByte + false + v140 + + + Application + false + false + MultiByte + v140 + + + + + + + + + + + + + true + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + false + true + false + + + Console + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + Precise + true + false + true + false + + + Console + true + true + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + + + + {2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67} + + + {f6a9102c-69a9-48fb-bc4b-49e49af43236} + + + + + + + + + + + + + + + Create + Create + + + + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberRender.vcxproj.filters b/Builds/MSVC/VS2015/EmberRender.vcxproj.filters new file mode 100644 index 0000000..8b02474 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberRender.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Resource Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberTester.vcxproj b/Builds/MSVC/VS2015/EmberTester.vcxproj new file mode 100644 index 0000000..1be7f77 --- /dev/null +++ b/Builds/MSVC/VS2015/EmberTester.vcxproj @@ -0,0 +1,141 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {320F611A-F9CE-4196-A8DC-FA24B2E8A320} + Win32Proj + EmberTester + EmberTester + + + + Application + true + MultiByte + false + v140 + + + Application + false + false + MultiByte + v140 + + + + + + + + + + + + + true + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + false + true + false + + + Console + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(TargetDir)$(TargetName).pdb + $(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include + + + EmberCommonPch.h + true + true + false + false + + + Console + true + true + true + libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;opencl.lib;opencl.lib;Ws2_32.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\..\Deps;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" + + + + + + {2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67} + + + {f6a9102c-69a9-48fb-bc4b-49e49af43236} + + + + + + + + + + + + + + Create + Create + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/EmberTester.vcxproj.filters b/Builds/MSVC/VS2015/EmberTester.vcxproj.filters new file mode 100644 index 0000000..be5b41b --- /dev/null +++ b/Builds/MSVC/VS2015/EmberTester.vcxproj.filters @@ -0,0 +1,48 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/Fractorium.rc b/Builds/MSVC/VS2015/Fractorium.rc new file mode 100644 index 0000000000000000000000000000000000000000..edaa68f9af60211a9c24368c27329c10618785e8 GIT binary patch literal 4470 zcmd6rU2hsk6o$_&k@_Dt=^gkfc(7d)wzd zvje*}*rw_Q8ZEOkbG|=k`RDIl+qJ|F?b^<5YB!eh3~a_;pS{%Pc4k9X@9iZcu`9c@ zG0&9!8S@2uQ)c1Kc{}GlVI^wUHUVbGezGTU+4cDuyJJp=KwmiQ8~g5i7f|>P=8k=} zw`*X_cX$c9yx<@%+c%>AiPg~k3f*Pduh{9iov?Gguw<9FVAs@MtgvkAnu?z6H~`|Q zTXEnPlsBH+zSZpyJGEoDb*%%3W4u>m=fGMF(fx~&ti|j>4GLvcb9u&ky!9XIJSfAAnzLy z?mn3OSs6|{_L*^e?jm2TF*>hf2U$zDQMH-d$nm0YQeUlt+R1DbDo5~I$SBn$<<-6& z5uZJx^Z-peu5X)~*s+g9{z2yH?T_1h@OBKgK)g zHJnZ|`qb&9;>oV?`+Z7-+RH!~hn6T=TNvGsajjq!5Y-(ruR41Qw)5xDF zDzzVQ>%g}-FTx~5rFu*y_q&&29KoeSWStP(y$$dpr@Hs729h391-j(B`24U}__dYs zDAo#f)*8L;ge(YBm(U={y`&bXRC6>gsj?~7dkCjez!}rG6=OyFbdWS~c#X6guNPQR zmY#j0s;O^FpC#3J9y<0qsM}et-rm8+vQHWAGq1tA-_((Bh+a+dXFzQZRknnMiglt$ zK@wN&H<$bizw5C2cttf!dX(XRL)D+q2gY=(HuDJ1Wsi$8@=aK&r{#M`q+FyFr9J>7 ze}4^e9Vz~fp1;@^_{ejiOUEu0Zps664^pVl3P$%kb*TIK7V{|btI`E4*|WEXg6ymw zK4q2+x2>?c16~pXvQ&tpqAgmSTsbY-cY+?N|3ugLrHK^^NRWElDTitb2=ei(b+y@9E8TJc9BK-kJLi;xRT`En$() zCSF{2z + + + + Debug + x64 + + + Release + x64 + + + + {6547D5FA-64CE-44BA-9D3C-B6E217456445} + Qt4VSv1.0 + + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + AllRules.ruleset + + + AllRules.ruleset + + + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)..\..\..\Bin\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + $(SolutionDir)Obj\$(TargetName)\$(Platform)\$(Configuration)\ + + + + UNICODE;WIN32;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_MULTIMEDIA_LIB;QT_HELP_LIB;QT_OPENGL_LIB;QT_WIDGETS_LIB;QT_XML_LIB;%(PreprocessorDefinitions) + .;$(QTDIR)\include;$(ProjectDir)..\..\..\Fractorium\GeneratedFiles;$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName;$(QTDIR)\..\qtmultimedia\include\QtMultimedia;$(QTDIR)\..\qtmultimedia\include;$(QTDIR)\..\qttools\include;$(QTDIR)\..\qttools\include\QtHelp;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtOpenGL;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtXml;.\GeneratedFiles;$(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories) + Disabled + ProgramDatabase + MultiThreadedDebugDLL + false + Use + FractoriumPch.h + $(IntDir)$(TargetName).pch + $(TargetDir)$(TargetName).pdb + + + /bigobj -Zm150 %(AdditionalOptions) + true + true + false + Level3 + + + Windows + $(OutDir)\$(ProjectName).exe + $(ProjectDir)..\..\..\Deps;$(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName);%(AdditionalLibraryDirectories) + true + qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5OpenGLd.lib;opengl32.lib;glu32.lib;opencl.lib;Qt5Widgetsd.lib;Qt5Xmld.lib;Ws2_32.lib;libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;%(AdditionalDependencies) + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\dark.qss" "$(OutDir)" + +xcopy /F /Y /R /D "$(QTDIR)\bin\Qt5Cored.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(QTDIR)\bin\Qt5Guid.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(QTDIR)\bin\Qt5Widgetsd.dll" "$(OutDir)" + +xcopy /F /Y /R /D "$(QTDIR)\plugins\platforms\qwindowsd.dll" "$(OutDir)\platforms\" + + + + + + UNICODE;WIN32;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_MULTIMEDIA_LIB;QT_HELP_LIB;QT_OPENGL_LIB;QT_WIDGETS_LIB;QT_XML_LIB;%(PreprocessorDefinitions) + .;$(QTDIR)\include;$(ProjectDir)..\..\..\Fractorium\GeneratedFiles;$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName;$(QTDIR)\..\qtmultimedia\include\QtMultimedia;$(QTDIR)\..\qtmultimedia\include;$(QTDIR)\..\qttools\include;$(QTDIR)\..\qttools\include\QtHelp;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtOpenGL;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtXml;.\GeneratedFiles;$(ProjectDir)..\..\..\Source\Ember;$(ProjectDir)..\..\..\Source\EmberCL;$(ProjectDir)..\..\..\Source\EmberCommon;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libjpeg;$(ProjectDir)..\..\..\..\libpng;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories) + ProgramDatabase + MultiThreadedDLL + false + Use + FractoriumPch.h + $(IntDir)$(TargetName).pch + $(TargetDir)$(TargetName).pdb + + + true + true + false + /bigobj -Zm150 %(AdditionalOptions) + false + Level3 + + + Windows + $(OutDir)\$(ProjectName).exe + $(ProjectDir)..\..\..\Deps;$(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName);%(AdditionalLibraryDirectories) + true + qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5OpenGL.lib;opengl32.lib;glu32.lib;opencl.lib;Qt5Widgets.lib;Ws2_32.lib;libjpeg.lib;libpng.lib;libxml2.lib;tbb.lib;zlib.lib;%(AdditionalDependencies) + 0.1 + + + xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Deps\*.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" +xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\dark.qss" "$(OutDir)" + +xcopy /F /Y /R /D "$(QTDIR)\bin\Qt5Core.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(QTDIR)\bin\Qt5Gui.dll" "$(OutDir)" +xcopy /F /Y /R /D "$(QTDIR)\bin\Qt5Widgets.dll" "$(OutDir)" + +xcopy /F /Y /R /D "$(QTDIR)\plugins\platforms\qwindows.dll" "$(OutDir)\platforms\" + + + + + Use + Use + + + + + + + Use + Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + + + + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + + Moc%27ing VariationsDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing VariationsDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing QssDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing QssDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing csshighlighter.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/csshighlighter.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing csshighlighter.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/csshighlighter.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing LibraryTreeWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/LibraryTreeWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing LibraryTreeWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/LibraryTreeWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + + + + + Moc%27ing QssTextEdit.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssTextEdit.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing QssTextEdit.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssTextEdit.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + + Moc%27ing OptionsDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/OptionsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing OptionsDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/OptionsDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing AboutDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/AboutDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing AboutDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/AboutDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing FinalRenderDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FinalRenderDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing FinalRenderDialog.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FinalRenderDialog.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + %(AdditionalInputs) + + + + + + + %(AdditionalInputs) + + + + + + + + + Moc%27ing FractoriumSettings.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FractoriumSettings.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing FractoriumSettings.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FractoriumSettings.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing TwoButtonComboWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/TwoButtonComboWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing TwoButtonComboWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/TwoButtonComboWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + Moc%27ing CurvesGraphicsView.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/CurvesGraphicsView.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing CurvesGraphicsView.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/CurvesGraphicsView.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing DoubleSpinBoxTableItemDelegate.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBoxTableItemDelegate.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing DoubleSpinBoxTableItemDelegate.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBoxTableItemDelegate.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + + + + + + + + + Moc%27ing GLWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/GLWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing GLWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/GLWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + Moc%27ing DoubleSpinBox.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBox.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing DoubleSpinBox.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBox.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing SpinBox.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/SpinBox.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing SpinBox.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/SpinBox.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + Moc%27ing StealthComboBox.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/StealthComboBox.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing StealthComboBox.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/StealthComboBox.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + %(AdditionalInputs) + + + + + + + %(AdditionalInputs) + + + + + + + + + Moc%27ing TableWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/TableWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing TableWidget.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/TableWidget.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + Moc%27ing Fractorium.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/Fractorium.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing Fractorium.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/Fractorium.h" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_MULTIMEDIA_LIB -DQT_HELP_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_XML_LIB -D_MBCS "-I." "-I$(QTDIR)\include" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles" "-I$(ProjectDir)..\..\..\Fractorium\GeneratedFiles\ConfigurationName" "-I$(QTDIR)\..\qtmultimedia\include\QtMultimedia" "-I$(QTDIR)\..\qtmultimedia\include" "-I$(QTDIR)\..\qttools\include" "-I$(QTDIR)\..\qttools\include\QtHelp" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtXml" "-I.\GeneratedFiles" "-I$(ProjectDir)..\..\..\Source\Ember" "-I$(ProjectDir)..\..\..\Source\EmberCL" "-I$(ProjectDir)..\..\..\Source\EmberCommon" "-I$(ProjectDir)..\..\..\..\glm" "-I$(ProjectDir)..\..\..\..\tbb\include" "-I$(ProjectDir)..\..\..\..\libjpeg" "-I$(ProjectDir)..\..\..\..\libpng" "-I$(ProjectDir)..\..\..\..\libxml2\include" "-I$(AMDAPPSDKROOT)\include" "-I$(CUDA_PATH)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath) + $(QTDIR)\bin\moc.exe;%(FullPath) + + + + + + Document + %(FullPath);%(AdditionalInputs) + Rcc%27ing %(Identity)... + .\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs) + "$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp + %(FullPath);%(AdditionalInputs) + Rcc%27ing %(Identity)... + .\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs) + "$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp + Designer + + + + + Document + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + Designer + + + + + {2bdb7a54-bb1a-476b-a6e5-f81e90ad4e67} + + + {f6a9102c-69a9-48fb-bc4b-49e49af43236} + + + + + Document + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + + + + + Document + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + Designer + + + + + Document + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + + + + + + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + + + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/Fractorium.vcxproj.filters b/Builds/MSVC/VS2015/Fractorium.vcxproj.filters new file mode 100644 index 0000000..36aabeb --- /dev/null +++ b/Builds/MSVC/VS2015/Fractorium.vcxproj.filters @@ -0,0 +1,417 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;cxx;c;def + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h + + + {99349809-55BA-4b9d-BF79-8FDBB0286EB3} + ui + + + {D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E} + qrc;* + false + + + {71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11} + moc;h;cpp + False + + + {44a6e761-1e1f-46ce-820d-b80d1c0265ae} + cpp;moc + False + + + {cc25f297-1a73-4c08-9b5f-8dad7c7c7452} + cpp;moc + False + + + {d61ea4d8-e7a6-4d86-934e-992611e1c181} + + + {84e24710-0e4f-4aa3-9f74-82cd2a3b39a7} + + + {5555e39d-b8d2-4bac-bf6c-6763228b15bc} + + + {26fa32d9-268c-4021-8398-d40d46344dff} + + + {811962f9-51c1-48ba-a9da-f5ce981aea71} + + + {5ba9fccd-8922-4037-956f-d57177a43700} + + + + + Source Files + + + Generated Files + + + Source Files + + + Widgets + + + Widgets + + + Dialogs + + + Dialogs + + + Dialogs + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + MainWindows + + + Source Files + + + MainWindows + + + Controllers + + + Controllers + + + Controllers + + + Widgets + + + MainWindows + + + MainWindows + + + Dialogs + + + Dialogs\Qss + + + Dialogs\Qss + + + Dialogs\Qss + + + Dialogs\Qss + + + Dialogs\Qss + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Widgets + + + + + Generated Files + + + Glm + + + Header Files + + + Header Files + + + Generated Files + + + Generated Files + + + Generated Files + + + Header Files + + + Controllers + + + Controllers + + + Controllers + + + Header Files + + + Header Files + + + Widgets + + + Generated Files + + + Generated Files + + + Dialogs\Qss + + + Dialogs\Qss + + + + + Resource Files + + + Form Files + + + Form Files + + + Form Files + + + Form Files + + + Widgets + + + Widgets + + + Widgets + + + Dialogs + + + Dialogs + + + Dialogs + + + Widgets + + + MainWindows + + + MainWindows + + + Widgets + + + Widgets + + + Header Files + + + Widgets + + + Widgets + + + Widgets + + + Form Files + + + Dialogs + + + Form Files + + + Dialogs\Qss + + + Dialogs\Qss + + + Dialogs\Qss + + + Widgets + + + + + + + + Resource Files + + + \ No newline at end of file diff --git a/Builds/MSVC/VS2015/resource.h b/Builds/MSVC/VS2015/resource.h new file mode 100644 index 0000000..320fe20 --- /dev/null +++ b/Builds/MSVC/VS2015/resource.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by EmberCL.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Builds/MSVC/VS2015/resource1.h b/Builds/MSVC/VS2015/resource1.h new file mode 100644 index 0000000..dad2fe4 --- /dev/null +++ b/Builds/MSVC/VS2015/resource1.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Ember.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Builds/MSVC/VS2015/zlib.props b/Builds/MSVC/VS2015/zlib.props new file mode 100644 index 0000000..25979fd --- /dev/null +++ b/Builds/MSVC/VS2015/zlib.props @@ -0,0 +1,37 @@ + + + + + + + ..\..\..\..\zlib + + diff --git a/Builds/MSVC/WIN32.MAK b/Builds/MSVC/WIN32.MAK new file mode 100644 index 0000000..28aa1c0 --- /dev/null +++ b/Builds/MSVC/WIN32.MAK @@ -0,0 +1,491 @@ +# ========================================================================= +# WIN32.MAK - Win32 application master NMAKE definitions file for the +# Microsoft Plaform SDK for Win32 programming samples +# Copyright 1991 - 1998 Microsoft Corporation +# ------------------------------------------------------------------------- +# This files should be included at the top of all MAKEFILEs as follows: +# !include +# ------------------------------------------------------------------------- +# +# Define APPVER = [ 4.0 | 5.0 ] prior to including win32.mak to get +# build time checking for version dependencies and to mark the executable +# with version information. +# +# Define TARGETOS = [ WIN95 | WINNT | BOTH ] prior to including win32.mak +# to get some build time checking for platform dependencies. +# +# Define TARGETLANG = [ LANG_JAPANESE | LANG_CHINESE | LANG_KOREAN ] prior +# to including win32.mak to getcompile & link flags for building +# applications to run on Far-East Windows. (This is an optional parameter. +# The system locale is the default.) +# +# Define _WIN32_IE = [ 0x0300 | 0x0400 ] prior to including win32.mak to +# get compile and link flags for building applications and components to +# run on Internet Explorer. (This is an optional parameter. IE 4.0 is +# the default.) +# +# ------------------------------------------------------------------------- +# NMAKE Options +# +# Use the table below to determine the additional options for NMAKE to +# generate various application debugging, profiling and performance tuning +# information. +# +# Application Information Type Invoke NMAKE +# ---------------------------- ------------ +# For No Debugging Info nmake nodebug=1 +# For Working Set Tuner Info nmake tune=1 +# For Call Attributed Profiling Info nmake profile=1 +# +# Note: The three options above are mutually exclusive (you may use only +# one to compile/link the application). +# +# Note: creating the environment variables NODEBUG, TUNE, and PROFILE is an +# alternate method to setting these options via the nmake command line. +# +# Additional NMAKE Options Invoke NMAKE +# ---------------------------- ------------ +# For No ANSI NULL Compliance nmake no_ansi=1 +# (ANSI NULL is defined as PVOID 0) +# +# ========================================================================= + +!IFNDEF _WIN32_MAK_ +_WIN32_MAK_ = 1 + +# ------------------------------------------------------------------------- +# Get CPU Type - exit if CPU environment variable is not defined +# ------------------------------------------------------------------------- + +# Win95 does not define PROCESSOR_ARCHITECTURE - default to i386 + +!IF "$(PROCESSOR_ARCHITECTURE)" == "" +CPU=i386 +PROCESSOR_ARCHITECTURE=x86 +!endif + +!IF !DEFINED(CPU) || "$(CPU)" == "" +CPU = $(PROCESSOR_ARCHITECTURE) +!ENDIF # CPU + +# if PROCESSOR_ARCHITECTURE was x86 or X86 change CPU to i386 + +!IF ( "$(CPU)" == "X86" ) || ( "$(CPU)" == "x86" ) +CPU = i386 +!ENDIF # CPU == X86 + +!IF "$(CPU)" != "i386" +!IF "$(CPU)" != "ALPHA" +!ERROR Must specify CPU environment variable ( CPU=i386, CPU=ALPHA) +!ENDIF +!ENDIF + + +# ------------------------------------------------------------------------- +# Get Target Operating System - Default to WINNT +# ------------------------------------------------------------------------- +!IFNDEF TARGETOS +TARGETOS = WINNT +!ENDIF + +!IF "$(TARGETOS)" != "WINNT" +!IF "$(TARGETOS)" != "WIN95" +!IF "$(TARGETOS)" != "BOTH" +!ERROR Must specify TARGETOS environment variable (BOTH, WIN95, WINNT) +!ENDIF +!ENDIF +!ENDIF + +# default to APPVER of 4.0 + +!IFNDEF APPVER +APPVER = 4.0 +!ENDIF + +!IF "$(APPVER)" != "5.0" +!IF "$(APPVER)" != "4.0" +!ERROR Must specify APPVER environment variable (4.0, 5.0) +!ENDIF +!ENDIF + +!IF "$(APPVER)" =="5.0" +!IFNDEF _WIN32_IE +_WIN32_IE = 0x0400 +!ENDIF # _WIN32_IE +!ENDIF # APPVER == 5.0 + +!IFNDEF _WIN32_IE +_WIN32_IE = 0x0300 +!ENDIF + + +# binary declarations common to all platforms +cc = cl +rc = rc +link = link +implib = lib +hc = hcrtf -xn + +# for compatibility with older-style makefiles +cvtobj = REM !!! CVTOBJ is no longer necessary - please remove !!! +cvtres = REM !!! CVTRES is no longer necessary - please remove !!! + + +# ------------------------------------------------------------------------- +# Platform Dependent Compile Flags - must be specified after $(cc) +# +# Note: Debug switches are on by default for current release +# +# These switches allow for source level debugging with WinDebug for local +# and global variables. +# +# Both compilers now use the same front end - you must still define either +# _X86_ or _ALPHA_. These have replaced the i386 and ALPHA definitions +# which are not ANSI compliant. +# +# Common compiler flags: +# -c - compile without linking +# -W3 - Set warning level to level 3 +# -Zi - generate debugging information +# -Od - disable all optimizations +# -Ox - use maximum optimizations +# -Zd - generate only public symbols and line numbers for debugging +# +# i386 specific compiler flags: +# -Gz - stdcall +# +# ------------------------------------------------------------------------- + +# declarations common to all compiler options +ccommon = -c -W3 -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo + +# for compatibility with old source code, map {try, except, leave, finally} +# to their proper names (i.e. prefaced by "__") +!IFDEF SEHMAP +ccommon = $(ccommon) -FIsehmap.h +!ENDIF + +!IF "$(TARGETLANG)" == "LANG_JAPANESE" +ccommon = $(ccommon) -DJAPAN -DDBCS -DFE_IME +!ENDIF + +!IF "$(TARGETLANG)" == "LANG_CHINESE" +ccommon = $(ccommon) -DDBCS -DFE_IME +!ENDIF + +!IF "$(TARGETLANG)" == "LANG_KOREAN" +ccommon = $(ccommon) -DDBCS -DFE_IME +!ENDIF + + + +!IF "$(CPU)" == "i386" +cflags = $(ccommon) -D_X86_=1 +scall = -Gz +!ELSE +!IF "$(CPU)" == "ALPHA" +cflags = $(ccommon) -D_ALPHA_=1 +scall = +!ENDIF +!ENDIF + + +!IF "$(APPVER)" == "4.0" + +NMAKE_WINVER = 0x0400 +! IFNDEF _WIN32_IE +_WIN32_IE = 0x0300 +! ENDIF + +!ELSEIF "$(APPVER)" == "5.0" + +NMAKE_WINVER = 0x0500 +! IFNDEF _WIN32_IE +_WIN32_IE = 0x0400 +! ENDIF + +!ENDIF + + + +!IF "$(TARGETOS)" == "WINNT" +cflags = $(cflags) -D_WINNT -D_WIN32_WINNT=$(NMAKE_WINVER) +!ENDIF + +!IF "$(TARGETOS)" == "WIN95" +cflags = $(cflags) -D_WIN95 -D_WIN32_WINDOWS=$(NMAKE_WINVER) +!ENDIF + +# regardless of the TARGET OS, define compile time WINVER to match APPVER macro +cflags = $(cflags) -D_WIN32_IE=$(_WIN32_IE) -DWINVER=$(NMAKE_WINVER) + + +!IFDEF NODEBUG +cdebug = -Ox +!ELSE +!IFDEF PROFILE +cdebug = -Gh -Zd -Ox +!ELSE +!IFDEF TUNE +cdebug = -Gh -Zd -Ox +!ELSE +cdebug = -Z7 -Od +!ENDIF +!ENDIF +!ENDIF + +# ------------------------------------------------------------------------- +# Target Module & Subsystem Dependent Compile Defined Variables - must be +# specified after $(cc) +# +# The following table indicates the various acceptable combinations of +# the C Run-Time libraries LIBC, LIBCMT, and CRTDLL respect to the creation +# of a EXE and/or DLL target object. The appropriate compiler flag macros +# that should be used for each combination are also listed. +# +# Link EXE Create Exe Link DLL Create DLL +# with Using with Using +# ---------------------------------------------------- +# LIBC CVARS None None * +# LIBC CVARS LIBC CVARS +# LIBC CVARS LIBCMT CVARSMT +# LIBCMT CVARSMT None None * +# LIBCMT CVARSMT LIBC CVARS +# LIBCMT CVARSMT LIBCMT CVARSMT +# CRTDLL CVARSDLL None None * +# CRTDLL CVARSDLL LIBC CVARS +# CRTDLL CVARSDLL LIBCMT CVARSMT +# CRTDLL CVARSDLL CRTDLL CVARSDLL * +# +# * - Denotes the Recommended Configuration +# +# When building single-threaded applications you can link your executable +# with either LIBC, LIBCMT, or CRTDLL, although LIBC will provide the best +# performance. +# +# When building multi-threaded applications, either LIBCMT or CRTDLL can +# be used as the C-Runtime library, as both are multi-thread safe. +# +# Note: Any executable which accesses a DLL linked with CRTDLL.LIB must +# also link with CRTDLL.LIB instead of LIBC.LIB or LIBCMT.LIB. +# When using DLLs, it is recommended that all of the modules be +# linked with CRTDLL.LIB. +# +# Note: The macros of the form xDLL are used when linking the object with +# the DLL version of the C Run-Time (that is, CRTDLL.LIB). They are +# not used when the target object is itself a DLL. +# +# ------------------------------------------------------------------------- + +!IFDEF NO_ANSI +noansi = -DNULL=0 +!ENDIF + +# for Windows applications that use the C Run-Time libraries +cvars = -DWIN32 $(noansi) -D_WIN32 +cvarsmt = $(cvars) -D_MT -MT +cvarsdll = $(cvars) -D_MT -D_DLL -MD + +# for compatibility with older-style makefiles +cvarsmtdll = $(cvarsmt) -D_DLL + +# for POSIX applications +psxvars = -D_POSIX_ + +# resource compiler +rcflags = /r +rcvars = -DWIN32 -D_WIN32 -DWINVER=$(NMAKE_WINVER) $(noansi) + +!IF "$(TARGETLANG)" == "LANG_JAPANESE" +rcflags = $(rcflags) /c932 +rcvars = $(rcvars) -DJAPAN -DDBCS -DFE_IME +!ENDIF + +!IF "$(TARGETLANG)" == "LANG_CHINESE" +rcvars = $(rcvars) -DDBCS -DFE_IME +!ENDIF + +!IF "$(TARGETLANG)" == "LANG_KOREAN" +rcvars = $(rcvars) -DDBCS -DFE_IME +!ENDIF + + + +# ------------------------------------------------------------------------- +# Platform Dependent Link Flags - must be specified after $(link) +# +# Note: $(DLLENTRY) should be appended to each -entry: flag on the link +# line. +# +# Note: When creating a DLL that uses C Run-Time functions it is +# recommended to include the entry point function of the name DllMain +# in the DLL's source code. Also, the MAKEFILE should include the +# -entry:_DllMainCRTStartup$(DLLENTRY) option for the creation of +# this DLL. (The C Run-Time entry point _DllMainCRTStartup in turn +# calls the DLL defined DllMain entry point.) +# +# ------------------------------------------------------------------------- + +# declarations common to all linker options +lflags = /NODEFAULTLIB /INCREMENTAL:NO /PDB:NONE /RELEASE /NOLOGO + +# declarations for use on Intel i386, i486, and Pentium systems +!IF "$(CPU)" == "i386" +DLLENTRY = @12 +!ENDIF + +# declarations for use on self hosted Digital Alpha AXP systems +!IF "$(CPU)" == "ALPHA" +DLLENTRY = +!ENDIF + +# ------------------------------------------------------------------------- +# Target Module Dependent Link Debug Flags - must be specified after $(link) +# +# These switches allow the inclusion of the necessary symbolic information +# for source level debugging with WinDebug, profiling and/or performance +# tuning. +# +# Note: Debug switches are on by default. +# ------------------------------------------------------------------------- + +!IFDEF NODEBUG +ldebug = /RELEASE +!ELSE +!IFDEF PROFILE +ldebug = -debug:mapped,partial -debugtype:coff +!ELSE +!IFDEF TUNE +ldebug = -debug:mapped,partial -debugtype:coff +!ELSE +ldebug = -debug:full -debugtype:cv +!ENDIF +!ENDIF +!ENDIF + +# for compatibility with older-style makefiles +linkdebug = $(ldebug) + +# ------------------------------------------------------------------------- +# Subsystem Dependent Link Flags - must be specified after $(link) +# +# These switches allow for source level debugging with WinDebug for local +# and global variables. They also provide the standard application type and +# entry point declarations. +# +# Note that on x86 screensavers have a WinMain entrypoint, but on RISC +# platforms it is main. This is a Win95 compatibility issue. +# +# ------------------------------------------------------------------------- + +# for Windows applications that use the C Run-Time libraries +conlflags = $(lflags) -subsystem:console,$(APPVER) +guilflags = $(lflags) -subsystem:windows,$(APPVER) +dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll + +!IF "$(CPU)" == "i386" +savlflags = $(lflags) -subsystem:windows,$(APPVER) -entry:WinMainCRTStartup +!ELSE +savlflags = $(lflags) -subsystem:windows,$(APPVER) -entry:mainCRTStartup +!ENDIF + +# for POSIX applications +psxlflags = $(lflags) -subsystem:posix -entry:__PosixProcessStartup + +# for compatibility with older-style makefiles +conflags = $(conlflags) +guiflags = $(guilflags) +psxflags = $(psxlflags) + +# ------------------------------------------------------------------------- +# C Run-Time Target Module Dependent Link Libraries +# +# Below is a table which describes which libraries to use depending on the +# target module type, although the table specifically refers to Graphical +# User Interface apps, the exact same dependencies apply to Console apps. +# That is, you could replace all occurrences of 'GUI' with 'CON' in the +# following: +# +# Desired CRT Libraries Desired CRT Libraries +# Library to link Library to link +# for EXE with EXE for DLL with DLL +# ---------------------------------------------------- +# LIBC GUILIBS None None * +# LIBC GUILIBS LIBC GUILIBS +# LIBC GUILIBS LIBCMT GUILIBSMT +# LIBCMT GUILIBSMT None None * +# LIBCMT GUILIBSMT LIBC GUILIBS +# LIBCMT GUILIBSMT LIBCMT GUILIBSMT +# CRTDLL GUILIBSDLL None None * +# CRTDLL GUILIBSDLL LIBC GUILIBS +# CRTDLL GUILIBSDLL LIBCMT GUILIBSMT +# CRTDLL GUILIBSDLL CRTDLL GUILIBSDLL * +# +# * - Recommended Configurations. +# +# Note: Any executable which accesses a DLL linked with CRTDLL.LIB must +# also link with CRTDLL.LIB instead of LIBC.LIB or LIBCMT.LIB. +# +# Note: For POSIX applications, link with $(psxlibs). +# +# ------------------------------------------------------------------------- + +# These CRT Libraries assume the use of Microsoft Visual C++. If you are +# using another Compiler product, change the libc* variable to correspond +# to your import library names. + +libc = libc.lib oldnames.lib +libcmt = libcmt.lib oldnames.lib +libcdll = msvcrt.lib oldnames.lib + +# for POSIX applications +psxlibs = libcpsx.lib psxdll.lib psxrtl.lib oldnames.lib + + +# optional profiling and tuning libraries +!IFDEF PROFILE +optlibs = cap.lib +!ELSE +!IFDEF TUNE +optlibs = wst.lib +!ELSE +optlibs = +!ENDIF +!ENDIF + +# if building for basic Windows 95, use WinSock1, else use WinSock2 +!IF "$(TARGETOS)" == "WIN95" +!IF "$(APPVER)" == "4.0" +winsocklibs = wsock32.lib +!ELSE +winsocklibs = ws2_32.lib mswsock.lib +!ENDIF +!ELSE +winsocklibs = ws2_32.lib mswsock.lib +!ENDIF + + +# basic subsystem specific libraries, less the C Run-Time +baselibs = kernel32.lib $(optlibs) $(winsocklibs) advapi32.lib +winlibs = $(baselibs) user32.lib gdi32.lib comdlg32.lib winspool.lib + +# for Windows applications that use the C Run-Time libraries +conlibs = $(libc) $(baselibs) +conlibsmt = $(libcmt) $(baselibs) +conlibsdll = $(libcdll) $(baselibs) +guilibs = $(libc) $(winlibs) +guilibsmt = $(libcmt) $(winlibs) +guilibsdll = $(libcdll) $(winlibs) + +# for OLE applications +olelibs = ole32.lib uuid.lib oleaut32.lib $(guilibs) +olelibsmt = ole32.lib uuid.lib oleaut32.lib $(guilibsmt) +olelibsdll = ole32.lib uuid.lib oleaut32.lib $(guilibsdll) + +# for backward compatibility +ole2libs = $(olelibs) +ole2libsmt = $(olelibsmt) +ole2libsdll = $(olelibsdll) + +#ENDIF _WIN32_MAK_ +!ENDIF diff --git a/Builds/QtCreator/defaults.pri b/Builds/QtCreator/defaults.pri index 1a90047..33d1067 100644 --- a/Builds/QtCreator/defaults.pri +++ b/Builds/QtCreator/defaults.pri @@ -1,4 +1,4 @@ -VERSION = 0.9.9.5 +VERSION = 1.0.0.2 win32:CONFIG += skip_target_version_ext #message(PWD: $$absolute_path($$PWD)) @@ -61,13 +61,19 @@ win32 { LIBS = "" LIBS += OpenGL32.lib LIBS += WS2_32.lib - LIBS += $$(AMDAPPSDKROOT)/lib/x86_64/OpenCL.lib - LIBS += $$(CUDA_PATH)/lib/x64/OpenCL.lib - LIBS += $$absolute_path($$EXTERNAL_LIB)/libjpeg.lib - LIBS += $$absolute_path($$EXTERNAL_LIB)/libpng.lib /NODEFAULTLIB:LIBCMT - LIBS += $$absolute_path($$EXTERNAL_LIB)/libxml2.lib - LIBS += $$absolute_path($$EXTERNAL_LIB)/tbb.lib - LIBS += $$absolute_path($$EXTERNAL_LIB)/zlib.lib +_AMDAPPSDK = $$(AMDAPPSDKROOT) + +isEmpty(_AMDAPPSDK) { + LIBS += $$(CUDA_PATH)/lib/x64/OpenCL.lib +} +else { + LIBS += $$(AMDAPPSDKROOT)/lib/x86_64/OpenCL.lib +} + LIBS += $$absolute_path($$EXTERNAL_LIB)/libjpeg.lib + LIBS += $$absolute_path($$EXTERNAL_LIB)/libpng.lib + LIBS += $$absolute_path($$EXTERNAL_LIB)/libxml2.lib + LIBS += $$absolute_path($$EXTERNAL_LIB)/tbb.lib + LIBS += $$absolute_path($$EXTERNAL_LIB)/zlib.lib } !win32 { diff --git a/Data/Version History.txt b/Data/Version History.txt index d500ee3..8bbcb7b 100644 --- a/Data/Version History.txt +++ b/Data/Version History.txt @@ -1,3 +1,28 @@ +1.0.0.2 12/05/2016 +--User changes + -Add many tooltips to help clarify functionality. + -Select multiple flames in library for del/move. Still only one allowed to be set as the current. + -Show checkbox for current flame. Remember this is not necessarily what's selected. + -User can now drag a square to select xforms, which keeps in sync with checkboxes. + -Remove --nframes from command line. Replace with new params: --loopframes, --interpframes, --interploops. + -Add two new options to EmberGenome: --cwloops --cwinterploops to specify whether rotation should go clockwise instead of the default counter clockwise. + -Add these to Fractorium as checkboxes. + -Apply All now also works for toggling animate flag on xforms. + -Options dialog now allows user to set whether double click toggles spinners, or right click does. + +--Bug fixes + -Selecting final and non-final xforms, and then dragging the non-final did not drag the final with it. + -Selecting all xforms when a final was present, then deleting crashed the program. + -Remove support for ppm files in the command line programs, it's an outdated format. + -Switching between SP and DP kept reapplying the palette adjustments. + +--Code changes + -Move build system to Visual Studio 2015 and Qt 5.6. + -SSE used during addition of points to the histogram. + -Remove last remnants of old flam3 C code and replace with C++. + -Remove unused code involving tbb::task_group. + -Make settings object a global shared_ptr singleton, so it doesn't have to be passed around. + 1.0.0.1 06/21/2016 --Bug fixes -Highlight power values less than 0 were accidentally disabled on the UI. diff --git a/Source/Ember/EmberDefines.h b/Source/Ember/EmberDefines.h index 16bb876..c0a212c 100644 --- a/Source/Ember/EmberDefines.h +++ b/Source/Ember/EmberDefines.h @@ -18,9 +18,6 @@ #define _stat stat #define _fstat fstat #define _stricmp strcmp - #define sscanf_s sscanf - #define sprintf_s snprintf - #define snprintf_s snprintf typedef int errno_t; #endif @@ -40,7 +37,7 @@ static void sincos(float x, float* s, float* c) namespace EmberNs { -#define EMBER_VERSION "1.0.0.1" +#define EMBER_VERSION "1.0.0.2" #define EPS6 T(1e-6) #define EPS std::numeric_limits::epsilon()//Apoplugin.h uses -20, but it's more mathematically correct to do it this way. #define ISAAC_SIZE 4 diff --git a/Source/Ember/EmberPch.h b/Source/Ember/EmberPch.h index 0661215..26802b9 100644 --- a/Source/Ember/EmberPch.h +++ b/Source/Ember/EmberPch.h @@ -13,8 +13,6 @@ #ifdef _WIN32 #pragma warning(disable : 4251; disable : 4661; disable : 4100) #define basename(x) _strdup(x) - #define snprintf _snprintf - #define snprintf_s _snprintf_s #define WIN32_LEAN_AND_MEAN #define EMBER_OS "WIN" @@ -69,11 +67,12 @@ #endif //Intel's Threading Building Blocks is what's used for all threading. -#include #include #include #define GLM_FORCE_RADIANS 1 +#define GLM_ENABLE_EXPERIMENTAL 1 + #ifndef __APPLE__ #define GLM_FORCE_INLINE 1 #endif diff --git a/Source/Ember/EmberToXml.h b/Source/Ember/EmberToXml.h index afaeb56..fd89669 100644 --- a/Source/Ember/EmberToXml.h +++ b/Source/Ember/EmberToXml.h @@ -121,9 +121,6 @@ public: b = false; } - if (f.is_open()) - f.close(); - return b; } diff --git a/Source/Ember/Iterator.h b/Source/Ember/Iterator.h index 1f9734c..4a065e3 100644 --- a/Source/Ember/Iterator.h +++ b/Source/Ember/Iterator.h @@ -145,7 +145,7 @@ public: throw "Out of bounds xform index in selection distribution."; #endif - //printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity); + //cout << "offset = " << j << ", xform = " << i << ", running sum = " << tempDensity << "\n"; m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i); tempDensity += densityPerElement; j++; diff --git a/Source/Ember/PaletteList.h b/Source/Ember/PaletteList.h index d782d85..ddcc904 100644 --- a/Source/Ember/PaletteList.h +++ b/Source/Ember/PaletteList.h @@ -241,7 +241,6 @@ private: /// The vector to store the paresed palettes associated with this file in. void ParsePalettes(xmlNode* node, const shared_ptr& filename, vector>& palettes) { - bool hexError = false; char* val; const char* loc = __FUNCTION__; xmlAttrPtr attr; @@ -259,33 +258,31 @@ private: if (!Compare(attr->name, "data")) { - int colorIndex = 0; - uint r, g, b; - int colorCount = 0; - hexError = false; + string s1, s; + size_t tmp, colorCount = 0, colorIndex = 0; + stringstream ss, temp(val); ss >> std::hex; + s.reserve(2048); - do + while (temp >> s1) + s += s1; + + auto length = s.size(); + + for (size_t strIndex = 0; strIndex < length;) { - int ret = sscanf_s(static_cast(&(val[colorIndex])), "00%2x%2x%2x", &r, &g, &b); + strIndex += 2;//Skip past the 00 at the beginning of each RGB. - if (ret != 3) + for (glm::length_t i = 0; i < 3 && colorCount < palette.Size(); i++) { - AddToReport(string(loc) + " : Problem reading hexadecimal color data " + string(&val[colorIndex])); - hexError = true; - break; + const char tmpStr[3] = { s[strIndex++], s[strIndex++], 0 };//Read out and convert the string two characters at a time. + ss.clear();//Reset and fill the string stream. + ss.str(tmpStr); + ss >> tmp;//Do the conversion. + palette.m_Entries[colorCount][i] = T(tmp) / T(255);//Hex palette is [0..255], convert to [0..1]. } - colorIndex += 8; - - while (isspace(int(val[colorIndex]))) - colorIndex++; - - palette[colorCount].r = T(r) / T(255);//Store as normalized colors in the range of 0-1. - palette[colorCount].g = T(g) / T(255); - palette[colorCount].b = T(b) / T(255); colorCount++; } - while (colorCount < COLORMAP_LENGTH); } else if (!Compare(attr->name, "number")) { @@ -300,11 +297,8 @@ private: attr = attr->next; } - if (!hexError) - { - palette.m_Filename = filename; - palettes.push_back(palette); - } + palette.m_Filename = filename; + palettes.push_back(palette); } else { diff --git a/Source/Ember/Renderer.cpp b/Source/Ember/Renderer.cpp index d1ee3db..d34c8d3 100644 --- a/Source/Ember/Renderer.cpp +++ b/Source/Ember/Renderer.cpp @@ -354,9 +354,6 @@ eRenderStatus Renderer::Run(vector& finalImage, double time, s size_t i, temporalSample = 0; T deTime; auto success = eRenderStatus::RENDER_OK; - //double iterationTime = 0; - //double accumulationTime = 0; - //Timing it; //Reset timers and progress percent if: Beginning anew or only filtering and/or accumulating. if (!resume || accumOnly || filterAndAccumOnly) @@ -1294,6 +1291,7 @@ EmberStats Renderer::Iterate(size_t iterCount, size_t temporalSample size_t totalItersPerThread = size_t(ceil(double(iterCount) / double(m_ThreadsToUse))); double percent, etaMs; EmberStats stats; + //vector accumTimes(4); //Do this every iteration for an animation, or else do it once for a single image. CPU only. if (!m_LastIter) @@ -1302,106 +1300,91 @@ EmberStats Renderer::Iterate(size_t iterCount, size_t temporalSample m_ThreadEmbers.insert(m_ThreadEmbers.begin(), m_ThreadsToUse, m_Ember); } -#ifdef TG - size_t threadIndex; - - for (size_t i = 0; i < m_ThreadsToUse; i++) - { - threadIndex = i; - m_TaskGroup.run([&, threadIndex] () - { -#else parallel_for(size_t(0), m_ThreadsToUse, [&] (size_t threadIndex) { -#endif #if defined(_WIN32) - SetThreadPriority(GetCurrentThread(), int(m_Priority)); + SetThreadPriority(GetCurrentThread(), int(m_Priority)); #elif defined(__APPLE__) - sched_param sp = {0}; - sp.sched_priority = m_Priority; - pthread_setschedparam(pthread_self(), SCHED_RR, &sp); + sched_param sp = {0}; + sp.sched_priority = m_Priority; + pthread_setschedparam(pthread_self(), SCHED_RR, &sp); #else - pthread_setschedprio(pthread_self(), int(m_Priority)); + pthread_setschedprio(pthread_self(), int(m_Priority)); #endif - //Timing t; - IterParams params; - m_BadVals[threadIndex] = 0; - params.m_Count = std::min(totalItersPerThread, SubBatchSize()); - params.m_Skip = FuseCount(); - //params.m_OneColDiv2 = m_CarToRas.OneCol() / 2; - //params.m_OneRowDiv2 = m_CarToRas.OneRow() / 2; + //Timing t; + IterParams params; + m_BadVals[threadIndex] = 0; + params.m_Count = std::min(totalItersPerThread, SubBatchSize()); + params.m_Skip = FuseCount(); + //params.m_OneColDiv2 = m_CarToRas.OneCol() / 2; + //params.m_OneRowDiv2 = m_CarToRas.OneRow() / 2; - //Sub batch iterations, loop 2. - for (m_SubBatch[threadIndex] = 0; (m_SubBatch[threadIndex] < totalItersPerThread) && !m_Abort; m_SubBatch[threadIndex] += params.m_Count) + //Sub batch iterations, loop 2. + for (m_SubBatch[threadIndex] = 0; (m_SubBatch[threadIndex] < totalItersPerThread) && !m_Abort; m_SubBatch[threadIndex] += params.m_Count) + { + //Must recalculate the number of iters to run on each sub batch because the last batch will most likely have less than SubBatchSize iters. + //For example, if 51,000 are requested, and the sbs is 10,000, it should run 5 sub batches of 10,000 iters, and one final sub batch of 1,000 iters. + params.m_Count = std::min(params.m_Count, totalItersPerThread - m_SubBatch[threadIndex]); + //Use first as random point, the rest are iterated points. + //Note that this gets reset with a new random point for each subBatchSize iterations. + //This helps correct if iteration happens to be on a bad trajectory. + m_Samples[threadIndex][0].m_X = m_Rand[threadIndex].template Frand11(); + m_Samples[threadIndex][0].m_Y = m_Rand[threadIndex].template Frand11(); + m_Samples[threadIndex][0].m_Z = 0;//m_Ember.m_CamZPos;//Apo set this to 0, then made the user use special variations to kick it. It seems easier to just set it to zpos. + m_Samples[threadIndex][0].m_ColorX = m_Rand[threadIndex].template Frand01(); + //Finally, iterate. + //t.Tic(); + //Iterating, loop 3. + m_BadVals[threadIndex] += m_Iterator->Iterate(m_ThreadEmbers[threadIndex], params, m_Samples[threadIndex].data(), m_Rand[threadIndex]); + //m_BadVals[threadIndex] += m_Iterator->Iterate(m_Ember, params, m_Samples[threadIndex].data(), m_Rand[threadIndex]); + //iterationTime += t.Toc(); + + if (m_LockAccum) + m_AccumCs.lock(); + + //t.Tic(); + //Map temp buffer samples into the histogram using the palette for color. + Accumulate(m_Rand[threadIndex], m_Samples[threadIndex].data(), params.m_Count, &m_Dmap); + //accumTimes[threadIndex] += t.Toc(); + + if (m_LockAccum) + m_AccumCs.unlock(); + + if (m_Callback && threadIndex == 0) { - //Must recalculate the number of iters to run on each sub batch because the last batch will most likely have less than SubBatchSize iters. - //For example, if 51,000 are requested, and the sbs is 10,000, it should run 5 sub batches of 10,000 iters, and one final sub batch of 1,000 iters. - params.m_Count = std::min(params.m_Count, totalItersPerThread - m_SubBatch[threadIndex]); - //Use first as random point, the rest are iterated points. - //Note that this gets reset with a new random point for each subBatchSize iterations. - //This helps correct if iteration happens to be on a bad trajectory. - m_Samples[threadIndex][0].m_X = m_Rand[threadIndex].template Frand11(); - m_Samples[threadIndex][0].m_Y = m_Rand[threadIndex].template Frand11(); - m_Samples[threadIndex][0].m_Z = 0;//m_Ember.m_CamZPos;//Apo set this to 0, then made the user use special variations to kick it. It seems easier to just set it to zpos. - m_Samples[threadIndex][0].m_ColorX = m_Rand[threadIndex].template Frand01(); - //Finally, iterate. - //t.Tic(); - //Iterating, loop 3. - m_BadVals[threadIndex] += m_Iterator->Iterate(m_ThreadEmbers[threadIndex], params, m_Samples[threadIndex].data(), m_Rand[threadIndex]); - //m_BadVals[threadIndex] += m_Iterator->Iterate(m_Ember, params, m_Samples[threadIndex].data(), m_Rand[threadIndex]); - //iterationTime += t.Toc(); - - if (m_LockAccum) - m_AccumCs.lock(); - - //t.Tic(); - //Map temp buffer samples into the histogram using the palette for color. - Accumulate(m_Rand[threadIndex], m_Samples[threadIndex].data(), params.m_Count, &m_Dmap); - - //accumulationTime += t.Toc(); - if (m_LockAccum) - m_AccumCs.unlock(); - - if (m_Callback && threadIndex == 0) - { - percent = 100.0 * + percent = 100.0 * + double + ( double ( double ( - double - ( - //Takes progress of current thread and multiplies by thread count. - //This assumes the threads progress at roughly the same speed. - double(m_LastIter + (m_SubBatch[threadIndex] * m_ThreadsToUse)) / double(ItersPerTemporalSample()) - ) + temporalSample - ) / double(TemporalSamples()) - ); - double percentDiff = percent - m_LastIterPercent; - double toc = m_ProgressTimer.Toc(); + //Takes progress of current thread and multiplies by thread count. + //This assumes the threads progress at roughly the same speed. + double(m_LastIter + (m_SubBatch[threadIndex] * m_ThreadsToUse)) / double(ItersPerTemporalSample()) + ) + temporalSample + ) / double(TemporalSamples()) + ); + double percentDiff = percent - m_LastIterPercent; + double toc = m_ProgressTimer.Toc(); - if (percentDiff >= 10 || (toc > 1000 && percentDiff >= 1))//Call callback function if either 10% has passed, or one second (and 1%). - { - etaMs = ((100.0 - percent) / percent) * m_RenderTimer.Toc(); + if (percentDiff >= 10 || (toc > 1000 && percentDiff >= 1))//Call callback function if either 10% has passed, or one second (and 1%). + { + etaMs = ((100.0 - percent) / percent) * m_RenderTimer.Toc(); - if (!m_Callback->ProgressFunc(m_Ember, m_ProgressParameter, percent, 0, etaMs)) - Abort(); + if (!m_Callback->ProgressFunc(m_Ember, m_ProgressParameter, percent, 0, etaMs)) + Abort(); - m_LastIterPercent = percent; - m_ProgressTimer.Tic(); - } + m_LastIterPercent = percent; + m_ProgressTimer.Tic(); } } - }); -#ifdef TG - } - - m_TaskGroup.wait(); -#endif - + } + }); stats.m_Iters = std::accumulate(m_SubBatch.begin(), m_SubBatch.end(), 0ULL);//Sum of iter count of all threads. stats.m_Badvals = std::accumulate(m_BadVals.begin(), m_BadVals.end(), 0ULL); stats.m_IterMs = m_IterTimer.Toc(); + //cout << "Accum time: " << std::accumulate(accumTimes.begin(), accumTimes.end(), 0.0) << endl; //t2.Toc(__FUNCTION__); return stats; } @@ -1609,19 +1592,49 @@ void Renderer::Accumulate(QTIsaac& rand, Poin colorIndexFrac = colorIndex - bucketT(intColorIndex);//Interpolate between intColorIndex and intColorIndex + 1. } + bucketT* __restrict hist = glm::value_ptr(m_HistBuckets[histIndex]);//Vectorizer can't tell these point to different locations. + const bucketT* __restrict pal = glm::value_ptr(palette->m_Entries[intColorIndex]); + const bucketT* __restrict pal2 = glm::value_ptr(palette->m_Entries[intColorIndex + 1]); + auto cifm1 = bucketT(1) - colorIndexFrac; + + //Loops are unrolled to allow auto vectorization. if (p.m_VizAdjusted == 1) - m_HistBuckets[histIndex] += ((dmap[intColorIndex] * (1 - colorIndexFrac)) + (dmap[intColorIndex + 1] * colorIndexFrac)); + { + hist[0] += (pal[0] * cifm1) + (pal2[0] * colorIndexFrac); + hist[1] += (pal[1] * cifm1) + (pal2[1] * colorIndexFrac); + hist[2] += (pal[2] * cifm1) + (pal2[2] * colorIndexFrac); + hist[3] += (pal[3] * cifm1) + (pal2[3] * colorIndexFrac); + } else - m_HistBuckets[histIndex] += (((dmap[intColorIndex] * (1 - colorIndexFrac)) + (dmap[intColorIndex + 1] * colorIndexFrac)) * bucketT(p.m_VizAdjusted)); + { + auto va = bucketT(p.m_VizAdjusted); + hist[0] += ((pal[0] * cifm1) + (pal2[0] * colorIndexFrac)) * va; + hist[1] += ((pal[1] * cifm1) + (pal2[1] * colorIndexFrac)) * va; + hist[2] += ((pal[2] * cifm1) + (pal2[2] * colorIndexFrac)) * va; + hist[3] += ((pal[3] * cifm1) + (pal2[3] * colorIndexFrac)) * va; + } } else if (PaletteMode() == ePaletteMode::PALETTE_STEP) { intColorIndex = Clamp(size_t(p.m_ColorX * COLORMAP_LENGTH), 0, COLORMAP_LENGTH_MINUS_1); + bucketT* __restrict hist = glm::value_ptr(m_HistBuckets[histIndex]);//Vectorizer can't tell these point to different locations. + const bucketT* __restrict pal = glm::value_ptr(palette->m_Entries[intColorIndex]); if (p.m_VizAdjusted == 1) - m_HistBuckets[histIndex] += dmap[intColorIndex]; + { + hist[0] += pal[0]; + hist[1] += pal[1]; + hist[2] += pal[2]; + hist[3] += pal[3]; + } else - m_HistBuckets[histIndex] += (dmap[intColorIndex] * bucketT(p.m_VizAdjusted)); + { + auto va = bucketT(p.m_VizAdjusted); + hist[0] += pal[0] * va; + hist[1] += pal[1] * va; + hist[2] += pal[2] * va; + hist[3] += pal[3] * va; + } } } } diff --git a/Source/Ember/RendererBase.h b/Source/Ember/RendererBase.h index 36bb163..6e87671 100644 --- a/Source/Ember/RendererBase.h +++ b/Source/Ember/RendererBase.h @@ -229,7 +229,6 @@ protected: vector m_SubBatch; vector m_BadVals; vector> m_Rand; - unique_ptr m_TaskGroup = make_unique(); std::recursive_mutex m_RenderingCs, m_AccumCs, m_FinalAccumCs, m_ResizeCs; Timing m_RenderTimer, m_IterTimer, m_ProgressTimer; }; diff --git a/Source/Ember/SheepTools.h b/Source/Ember/SheepTools.h index a68f0ad..1abe240 100644 --- a/Source/Ember/SheepTools.h +++ b/Source/Ember/SheepTools.h @@ -424,7 +424,6 @@ public: size_t i; T t; ostringstream os; - char ministr[32]; if (crossMode == eCrossMode::CROSS_NOT_SPECIFIED) { @@ -463,8 +462,7 @@ public: for (i = 0; i < emberOut.TotalXformCount(); i++) emberOut.GetTotalXform(i)->DeleteMotionElements(); - sprintf_s(ministr, 32, "%7.5g", t); - os << "cross interpolate " << ministr; + os << "cross interpolate " << std::to_string(t); } else//Alternate mode. { @@ -953,7 +951,8 @@ public: /// The ember to rotate /// The rotated xform /// The time percentage value which dictates how much of a percentage of 360 degrees it should be rotated and the time position for the motion elements - void Loop(Ember& ember, Ember& rotated, T blend) + /// True to rotate clockwise, else rotate counter clockwise. Ignored if rotations is 0. + void Loop(Ember& ember, Ember& rotated, T blend, bool cw) { rotated = ember; @@ -970,7 +969,7 @@ public: } rotated.ApplyFlameMotion(blend); - rotated.RotateAffines(-blend * 360);//Rotate the affines. + rotated.RotateAffines((cw ? blend : -blend) * 360);//Rotate the affines. rotated.DeleteMotionElements();//Delete all motion elements from the looped ember, at the xform level and at the parent ember level. } @@ -981,8 +980,10 @@ public: /// The embers to interpolate /// The result of the interpolation /// The interpolation time + /// The number of times to rotate within the interpolation + /// True to rotate clockwise, else rotate counter clockwise. Ignored if rotations is 0. /// True if embers points to the first or last ember in the entire sequence, else false. - void Edge(Ember* embers, Ember& result, T blend, bool seqFlag) + void Edge(Ember* embers, Ember& result, T blend, size_t rotations, bool cw, bool seqFlag) { size_t i, si; @@ -1016,9 +1017,15 @@ public: m_EdgeSpun[1].m_Time = 1; //Call this first to establish the asymmetric reference angles. Interpolater::AsymmetricRefAngles(m_EdgeSpun, 2); + //Rotate the aligned xforms. - m_EdgeSpun[0].RotateAffines(-blend * 360); - m_EdgeSpun[1].RotateAffines(-blend * 360); + if (rotations) + { + auto cwblend = cw ? blend : -blend; + m_EdgeSpun[0].RotateAffines(cwblend * (360 * rotations)); + m_EdgeSpun[1].RotateAffines(cwblend * (360 * rotations)); + } + m_Interpolater.Interpolate(m_EdgeSpun, 2, m_Smooth ? Interpolater::Smoother(blend) : blend, m_Stagger, result); } @@ -1037,11 +1044,13 @@ public: /// The result of the spin /// The frame in the sequence to be stored in the m_Time member of result /// The interpolation time - void Spin(Ember& parent, Ember* templ, Ember& result, size_t frame, T blend) + /// True to rotate clockwise, else rotate counter clockwise. Ignored if rotations is 0. + void Spin(Ember& parent, Ember* templ, Ember& result, size_t frame, T blend, bool cw) { - char temp[50]; + auto cwblend = cw ? blend : -blend; + string temp = "rotate " + std::to_string(cwblend * 360.0); //Spin the parent blend degrees. - Loop(parent, result, blend); + Loop(parent, result, blend, cw); //Apply the template if necessary. if (templ) @@ -1052,14 +1061,12 @@ public: result.m_Interp = eInterp::EMBER_INTERP_LINEAR; result.m_PaletteInterp = ePaletteInterp::INTERP_HSV; //Create the edit doc xml. - sprintf_s(temp, 50, "rotate %g", blend * 360.0); result.ClearEdit(); result.m_Edits = m_EmberToXml.CreateNewEditdoc(&parent, nullptr, temp, m_Nick, m_Url, m_Id, m_Comment, m_SheepGen, m_SheepId); //Subpixel jitter. Offset(result, m_OffsetX, m_OffsetY); //Make the name of the flame the time. - sprintf_s(temp, 50, "%f", result.m_Time); - result.m_Name = string(temp); + result.m_Name = std::to_string(result.m_Time); } /// @@ -1074,11 +1081,14 @@ public: /// The frame in the sequence to be stored in the m_Time member of result /// True if embers points to the first or last ember in the entire sequence, else false. /// The interpolation time - void SpinInter(Ember* parents, Ember* templ, Ember& result, size_t frame, bool seqFlag, T blend) + /// The number of times to rotate within the interpolation + /// True to rotate clockwise, else rotate counter clockwise. Ignored if rotations is 0. + void SpinInter(Ember* parents, Ember* templ, Ember& result, size_t frame, bool seqFlag, T blend, size_t rotations, bool cw) { - char temp[50]; + auto cwblend = cw ? blend : -blend; + string temp = "interpolate " + std::to_string(cwblend * 360.0); //Interpolate between spun parents. - Edge(parents, result, blend, seqFlag); + Edge(parents, result, blend, rotations, cw, seqFlag); //Original did an interpolated palette hack here for random palettes, but it was never used anywhere so ember omits it.//ORIG @@ -1089,14 +1099,12 @@ public: //Set ember parameters accordingly. result.m_Time = T(frame); //Create the edit doc xml. - sprintf_s(temp, 50, "interpolate %g", blend * 360.0); result.ClearEdit(); result.m_Edits = m_EmberToXml.CreateNewEditdoc(&parents[0], &parents[1], temp, m_Nick, m_Url, m_Id, m_Comment, m_SheepGen, m_SheepId); //Subpixel jitter. Offset(result, m_OffsetX, m_OffsetY); //Make the name of the flame the time. - sprintf_s(temp, 50, "%f", result.m_Time); - result.m_Name = string(temp); + result.m_Name = std::to_string(result.m_Time); } /// diff --git a/Source/Ember/Utils.h b/Source/Ember/Utils.h index 8321c25..486cea2 100644 --- a/Source/Ember/Utils.h +++ b/Source/Ember/Utils.h @@ -222,6 +222,28 @@ public: return temp; } + /// + /// For creating an object without passing parameters. + /// When the derived class has a default constructor, this should + /// not be called. This is only for when the derived class constructor + /// requires arguments. In that case, Instance() must first be called + /// with the proper values. Then once the singleton is constructed, this + /// can be called to just retrieve the object without having to worry about + /// parameters. + /// This is enforced by throwing if this has been called before Instance() is called. + /// + /// The constructed object + static std::shared_ptr DefInstance() + { + auto& staticInstance = GetStaticInstance(); + auto temp = staticInstance.lock(); + + if (!temp) + throw "Cannot create singleton with defaults, must first call at least once with proper arguments."; + + return temp; + } + protected: /// /// Clever hack to get a static to behave like a member variable that can be seen between classes and functions in the hierarchy. @@ -255,64 +277,34 @@ protected: /// Open a file in binary mode and read its entire contents into a vector of bytes. Optionally null terminate. /// /// The full path to the file to read -/// The vector which will be populated with the file's contents +/// The string which will be populated with the file's contents /// Whether to append a NULL character as the last element of the vector. Needed when reading text files. Default: true. /// True if successfully read and populated, else false static bool ReadFile(const char* filename, string& buf, bool nullTerminate = true) { - bool b = false; - FILE* f = nullptr; - try { - fopen_s(&f, filename, "rb");//Open in binary mode. + ifstream ifs(filename, ios::binary | ios::ate); + auto pos = ifs.tellg(); + buf.resize(pos + streampos(nullTerminate ? 1 : 0)); + ifs.seekg(0, ios::beg); + ifs.read(&buf[0], pos); - if (f) - { - struct _stat statBuf; -#if defined(_WIN32) || defined(__APPLE__) - int statResult = _fstat(f->_file, &statBuf);//Get data associated with file. -#else - int statResult = _fstat(f->_fileno, &statBuf);//Get data associated with file. -#endif + if (nullTerminate)//Optionally NULL terminate if they want to treat it as a string. + buf[buf.size() - 1] = 0; - if (statResult == 0)//Check if statistics are valid. - { - buf.resize(statBuf.st_size + (nullTerminate ? 1 : 0));//Allocate vector to be the size of the entire file, with an optional additional character for nullptr. - - if (buf.size() == static_cast(statBuf.st_size + 1))//Ensure allocation succeeded. - { - size_t bytesRead = fread(&buf[0], 1, statBuf.st_size, f);//Read the entire file at once. - - if (bytesRead == (static_cast(statBuf.st_size)))//Ensure the number of bytes read matched what was requested. - { - if (nullTerminate)//Optionally nullptr terminate if they want to treat it as a string. - buf[buf.size() - 1] = 0; - - b = true;//Success. - } - } - } - - fclose(f); - f = nullptr; - } + return true; } catch (const std::exception& e) { cout << "Error: Reading file " << filename << " failed: " << e.what() << "\n"; - b = false; } catch (...) { cout << "Error: Reading file " << filename << " failed.\n"; - b = false; } - if (f) - fclose(f); - - return b; + return false; } /// diff --git a/Source/Ember/XmlToEmber.h b/Source/Ember/XmlToEmber.h index 214bfb2..5070cb5 100644 --- a/Source/Ember/XmlToEmber.h +++ b/Source/Ember/XmlToEmber.h @@ -442,42 +442,6 @@ public: return b; } - /// - /// Convert an integer to a string. - /// Just a wrapper around _itoa_s() which wraps the result in a std::string. - /// - /// The integer to convert - /// The radix of the integer. Default: 10. - /// The converted string - static string Itos(int i, int radix = 10) - { - char ch[16]; -#ifdef _WIN32 - _itoa_s(i, ch, 16, radix); -#else - sprintf(ch, "%d", i); -#endif - return string(ch); - } - - /// - /// Convert an unsigned 64-bit integer to a string. - /// Just a wrapper around _ui64toa_s() which wraps the result in a std::string. - /// - /// The unsigned 64-bit integer to convert - /// The radix of the integer. Default: 10. - /// The converted string - static string Itos64(size_t i, int radix = 10) - { - char ch[64]; -#ifdef _WIN32 - _ui64toa_s(i, ch, 64, radix); -#else - sprintf(ch, "%lu", i); -#endif - return string(ch); - } - static vector m_FlattenNames; private: @@ -523,7 +487,7 @@ private: if (auto pal = m_PaletteList.GetPalette(PaletteList::m_DefaultFilename, currentEmber.PaletteIndex())) currentEmber.m_Palette = *pal; else - AddToReport(string(loc) + " : Error assigning palette with index " + Itos(currentEmber.PaletteIndex())); + AddToReport(string(loc) + " : Error assigning palette with index " + std::to_string(currentEmber.PaletteIndex())); } if (!currentEmber.XformCount())//Ensure there is always at least one xform or else the renderer will crash when trying to render. @@ -532,8 +496,6 @@ private: currentEmber.AddXform(xform); } - //if (!Interpolater::InterpMissingColors(currentEmber.m_Palette.m_Entries)) - // AddToReport(string(loc) + " : Error interpolating missing palette colors"); currentEmber.CacheXforms(); currentEmber.m_Index = embers.size(); currentEmber.m_ParentFilename = parentFileString; @@ -562,7 +524,6 @@ private: const char* loc = __FUNCTION__; int soloXform = -1; size_t i, count = 0, index = 0; - double vals[16]; xmlAttrPtr att, curAtt; xmlNodePtr editNode, childNode, motionNode; currentEmber.m_Palette.Clear();//Wipe out the current palette. @@ -655,28 +616,16 @@ private: } else if (!Compare(curAtt->name, "size")) { - if (sscanf_s(attStr, "%lu %lu", ¤tEmber.m_FinalRasW, ¤tEmber.m_FinalRasH) != 2) - { - AddToReport(string(loc) + " : Invalid size attribute " + string(attStr)); - //Assign reasonable defaults. - currentEmber.m_FinalRasW = 1000; - currentEmber.m_FinalRasH = 1000; - } - + istringstream is(attStr); + is >> currentEmber.m_FinalRasW >> currentEmber.m_FinalRasH; currentEmber.m_OrigFinalRasW = currentEmber.m_FinalRasW; currentEmber.m_OrigFinalRasH = currentEmber.m_FinalRasH; } else if (!Compare(curAtt->name, "center")) { - if (sscanf_s(attStr, "%lf %lf", &vals[0], &vals[1]) != 2) - { - AddToReport(string(loc) + " : Invalid center attribute " + string(attStr)); - vals[0] = 0; - vals[1] = 0; - } - - currentEmber.m_CenterX = T(vals[0]); - currentEmber.m_CenterY = currentEmber.m_RotCenterY = T(vals[1]); + istringstream is(attStr); + is >> currentEmber.m_CenterX >> currentEmber.m_CenterY; + currentEmber.m_RotCenterY = currentEmber.m_CenterY; } else if (!Compare(curAtt->name, "filter_shape")) { @@ -700,29 +649,22 @@ private: } else if (!Compare(curAtt->name, "background")) { - if (sscanf_s(attStr, "%lf %lf %lf", &vals[0], &vals[1], &vals[2]) != 3) - { - AddToReport(string(loc) + " : Invalid background attribute " + string(attStr)); - vals[0] = 0; - vals[1] = 0; - vals[2] = 0; - } - - currentEmber.m_Background[0] = T(vals[0]);//[0..1] - currentEmber.m_Background[1] = T(vals[1]); - currentEmber.m_Background[2] = T(vals[2]); + istringstream is(attStr); + is >> currentEmber.m_Background[0]//[0..1] + >> currentEmber.m_Background[1] + >> currentEmber.m_Background[2]; } else if (!Compare(curAtt->name, "curves")) { - stringstream ss(attStr); + istringstream is(attStr); for (i = 0; i < 4; i++) { for (glm::length_t j = 0; j < 4; j++) { - ss >> currentEmber.m_Curves.m_Points[i][j].x; - ss >> currentEmber.m_Curves.m_Points[i][j].y; - ss >> currentEmber.m_Curves.m_Weights[i][j]; + is >> currentEmber.m_Curves.m_Points[i][j].x + >> currentEmber.m_Curves.m_Points[i][j].y + >> currentEmber.m_Curves.m_Weights[i][j]; } } } @@ -748,36 +690,24 @@ private: for (curAtt = att; curAtt; curAtt = curAtt->next) { - attStr = reinterpret_cast(xmlGetProp(childNode, curAtt->name)); a = 255; + attStr = reinterpret_cast(xmlGetProp(childNode, curAtt->name)); + istringstream is(attStr); //This signifies that a palette is not being retrieved from the palette file, rather it's being parsed directly out of the ember xml. //This also means the palette has already been hue adjusted and it doesn't need to be done again, which would be necessary if it were //coming from the palette file. currentEmber.m_Palette.m_Index = -1; if (!Compare(curAtt->name, "index")) - { Aton(attStr, index); - } else if (!Compare(curAtt->name, "rgb")) - { - if (sscanf_s(attStr, "%lf %lf %lf", &r, &g, &b) != 3) - AddToReport(string(loc) + " : Invalid rgb attribute " + string(attStr)); - } + is >> r >> g >> b; else if (!Compare(curAtt->name, "rgba")) - { - if (sscanf_s(attStr, "%lf %lf %lf %lf", &r, &g, &b, &a) != 4) - AddToReport(string(loc) + " : Invalid rgba attribute " + string(attStr)); - } + is >> r >> g >> b >> a; else if (!Compare(curAtt->name, "a")) - { - if (sscanf_s(attStr, "%lf", &a) != 1) - AddToReport(string(loc) + " : Invalid a attribute " + string(attStr)); - } + is >> a; else - { AddToReport(string(loc) + " : Unknown color attribute " + string(CCX(curAtt->name))); - } xmlFree(attStr); } @@ -1051,13 +981,9 @@ private: ret = ret && AttToEmberMotionFloat(att, attStr, eEmberMotionParam::FLAME_MOTION_VIBRANCY, motion); else if (!Compare(curAtt->name, "background")) { - double r, g, b; - - if (sscanf_s(attStr, "%lf %lf %lf", &r, &g, &b) != 3) - { - AddToReport(string(loc) + " : Invalid flame motion background attribute " + string(attStr)); - r = g = b = 0; - } + double r = 0, g = 0, b = 0; + istringstream is(attStr); + is >> r >> g >> b; if (r != 0) motion.m_MotionParams.push_back(MotionParam(eEmberMotionParam::FLAME_MOTION_BACKGROUND_R, T(r))); @@ -1070,13 +996,9 @@ private: } else if (!Compare(curAtt->name, "center")) { - double cx, cy; - - if (sscanf_s(attStr, "%lf %lf", &cx, &cy) != 2) - { - AddToReport(string(loc) + " : Invalid flame motion center attribute " + string(attStr)); - cx = cy = 0; - } + double cx = 0, cy = 0; + istringstream is(attStr); + is >> cx >> cy; if (cx != 0) motion.m_MotionParams.push_back(MotionParam(eEmberMotionParam::FLAME_MOTION_CENTER_X, T(cx))); @@ -1148,7 +1070,6 @@ private: size_t j; T temp; double a, b, c, d, e, f; - double vals[10]; xmlAttrPtr attPtr, curAtt; //Loop through the attributes of the xform element. attPtr = childNode->properties; @@ -1203,30 +1124,17 @@ private: } else if (!Compare(curAtt->name, "color")) { - xform.m_ColorX = xform.m_ColorY = 0; - - //Try two coords first . - if (sscanf_s(attStr, "%lf %lf", &vals[0], &vals[1]) == 2) - { - xform.m_ColorX = T(vals[0]); - xform.m_ColorY = T(vals[1]); - } - else if (sscanf_s(attStr, "%lf", &vals[0]) == 1)//Try one color. - { - xform.m_ColorX = T(vals[0]); - } - else - { - xform.m_ColorX = xform.m_ColorY = T(0.5); - AddToReport(string(loc) + " : Malformed xform color attribute " + string(attStr) + ", using 0.5, 0.5"); - } + istringstream is(attStr); + xform.m_ColorX = xform.m_ColorY = T(0.5); + is >> xform.m_ColorX; + is >> xform.m_ColorY;//Very unlikely to be present, but leave for future use. } else if (!Compare(curAtt->name, "chaos")) { - stringstream ss(attStr); + istringstream is(attStr); j = 0; - while (ss >> temp) + while (is >> temp) { xform.SetXaos(j, temp); j++; @@ -1243,12 +1151,9 @@ private: } else if (!Compare(curAtt->name, "coefs")) { - if (sscanf_s(attStr, "%lf %lf %lf %lf %lf %lf", &a, &d, &b, &e, &c, &f) != 6)//Original did a complicated parsing scheme. This is easier.//ORIG - { - a = d = b = e = c = f = 0; - AddToReport(string(loc) + " : Bad coeffs attribute " + string(attStr)); - } - + istringstream is(attStr); + a = b = c = d = e = f = 0; + is >> a >> d >> b >> e >> c >> f; xform.m_Affine.A(T(a)); xform.m_Affine.B(T(b)); xform.m_Affine.C(T(c)); @@ -1258,12 +1163,9 @@ private: } else if (!Compare(curAtt->name, "post")) { - if (sscanf_s(attStr, "%lf %lf %lf %lf %lf %lf", &a, &d, &b, &e, &c, &f) != 6)//Original did a complicated parsing scheme. This is easier.//ORIG - { - a = d = b = e = c = f = 0; - AddToReport(string(loc) + " : Bad post coeffs attribute " + string(attStr)); - } - + istringstream is(attStr); + a = b = c = d = e = f = 0; + is >> a >> d >> b >> e >> c >> f; xform.m_Post.A(T(a)); xform.m_Post.B(T(b)); xform.m_Post.C(T(c)); @@ -1469,64 +1371,33 @@ private: /// True if there were no errors, else false. bool ParseHexColors(char* colstr, Ember& ember, size_t numColors, intmax_t chan) { - size_t colorIndex = 0; - size_t colorCount = 0; - uint r, g, b, a; - int ret; - char tmps[2]; - size_t skip = std::abs(chan); - bool ok = true; const char* loc = __FUNCTION__; + stringstream ss, temp(colstr); ss >> std::hex; + string s1, s; + size_t tmp, colorCount = 0, colorIndex = 0; + s.reserve(1536); - //Strip whitespace prior to first color. - while (isspace(static_cast(colstr[colorIndex]))) - colorIndex++; + while (temp >> s1) + s += s1; - do + auto length = s.size(); + + for (size_t strIndex = 0; strIndex < length;) { - //Parse an RGB triplet at a time. - if (chan == 3) - ret = sscanf_s(&(colstr[colorIndex]), "%2x%2x%2x", &r, &g, &b); - else if (chan == -4) - ret = sscanf_s(&(colstr[colorIndex]), "00%2x%2x%2x", &r, &g, &b); - else // chan==4 - ret = sscanf_s(&(colstr[colorIndex]), "%2x%2x%2x%2x", &r, &g, &b, &a); - - a = 1;//Original allows for alpha, even though it will most likely never happen. Ember omits support for it. - - if ((chan != 4 && ret != 3) || (chan == 4 && ret != 4)) + for (glm::length_t i = 0; i < 3 && colorCount < ember.m_Palette.Size(); i++) { - ok = false; - r = g = b = 0; - AddToReport(string(loc) + " : Problem reading hexadecimal color data, assigning to 0"); - break; + const char tmpStr[3] = { s[strIndex++], s[strIndex++], 0 };//Read out and convert the string two characters at a time. + ss.clear();//Reset and fill the string stream. + ss.str(tmpStr); + ss >> tmp;//Do the conversion. + ember.m_Palette.m_Entries[colorCount][i] = T(tmp) / T(255);//Hex palette is [0..255], convert to [0..1]. } - colorIndex += 2 * skip; - - while (isspace(static_cast(colstr[colorIndex]))) - colorIndex++; - - ember.m_Palette.m_Entries[colorCount].r = T(r) / T(255);//Hex palette is [0..255], convert to [0..1]. - ember.m_Palette.m_Entries[colorCount].g = T(g) / T(255); - ember.m_Palette.m_Entries[colorCount].b = T(b) / T(255); - ember.m_Palette.m_Entries[colorCount].a = T(a); + ember.m_Palette.m_Entries[colorCount][3] = T(1); colorCount++; } - while (colorCount < numColors && colorCount < ember.m_Palette.m_Entries.size()); -#ifdef _WIN32 - - if (sscanf_s(&(colstr[colorIndex]), "%1s", tmps, sizeof(tmps)) > 0) //Really need to migrate all of this parsing to C++.//TODO -#else - if (sscanf_s(&(colstr[colorIndex]), "%1s", tmps) > 0) -#endif - { - AddToReport(string(loc) + " : Extra data at end of hex color data " + string(&(colstr[colorIndex]))); - ok = false; - } - - return ok; + return length >= 256; } /// diff --git a/Source/EmberAnimate/EmberAnimate.cpp b/Source/EmberAnimate/EmberAnimate.cpp index f97ac38..d946214 100644 --- a/Source/EmberAnimate/EmberAnimate.cpp +++ b/Source/EmberAnimate/EmberAnimate.cpp @@ -155,10 +155,9 @@ bool EmberAnimate(EmberOptions& opt) if (opt.Format() != "jpg" && opt.Format() != "png" && - opt.Format() != "ppm" && opt.Format() != "bmp") { - cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg.\n"; + cout << "Format must be jpg, png, or bmp not " << opt.Format() << ". Setting to jpg.\n"; } channels = opt.Format() == "png" ? 4 : 3; @@ -317,8 +316,6 @@ bool EmberAnimate(EmberOptions& opt) writeSuccess = WritePng(filename.c_str(), finalImagep, w, h, opt.BitsPerChannel() / 8, opt.PngComments(), comments, opt.Id(), opt.Url(), opt.Nick()); else if (opt.Format() == "jpg") writeSuccess = WriteJpeg(filename.c_str(), finalImagep, w, h, int(opt.JpegQuality()), opt.JpegComments(), comments, opt.Id(), opt.Url(), opt.Nick()); - else if (opt.Format() == "ppm") - writeSuccess = WritePpm(filename.c_str(), finalImagep, w, h); else if (opt.Format() == "bmp") writeSuccess = WriteBmp(filename.c_str(), finalImagep, w, h); diff --git a/Source/EmberCL/EmberCLPch.h b/Source/EmberCL/EmberCLPch.h index 7224fc4..0613ec8 100644 --- a/Source/EmberCL/EmberCLPch.h +++ b/Source/EmberCL/EmberCLPch.h @@ -9,6 +9,7 @@ #define NOMINMAX #define WIN32_LEAN_AND_MEAN//Exclude rarely-used stuff from Windows headers. #define _USE_MATH_DEFINES +//#define CL_USE_DEPRECATED_OPENCL_1_2_APIS 1 #include "Timing.h" #include "Renderer.h" diff --git a/Source/EmberCommon/EmberCommonPch.h b/Source/EmberCommon/EmberCommonPch.h index d51d366..a635a59 100644 --- a/Source/EmberCommon/EmberCommonPch.h +++ b/Source/EmberCommon/EmberCommonPch.h @@ -18,13 +18,11 @@ #include #include #include - #define snprintf _snprintf #else #include #define _TCHAR char #define _tmain main #define _T - #define fprintf_s fprintf #endif #include @@ -43,7 +41,6 @@ #define PNG_SKIP_SETJMP_CHECK 1 #include "png.h" -//#include "pnginfo.h" //Ember. #include "Ember.h" diff --git a/Source/EmberCommon/EmberOptions.h b/Source/EmberCommon/EmberOptions.h index 1d59d7c..ff781f2 100644 --- a/Source/EmberCommon/EmberOptions.h +++ b/Source/EmberCommon/EmberOptions.h @@ -65,6 +65,8 @@ enum class eOptionIDs : et OPT_ENCLOSED, OPT_NO_EDITS, OPT_UNSMOOTH_EDGE, + OPT_CW_LOOPS, + OPT_CW_INTERP_LOOPS, OPT_LOCK_ACCUM, OPT_DUMP_KERNEL, @@ -80,7 +82,9 @@ enum class eOptionIDs : et OPT_END, OPT_FRAME, OPT_DTIME, - OPT_NFRAMES, + OPT_LOOP_FRAMES, + OPT_INTERP_FRAMES, + OPT_INTERP_LOOPS, OPT_SYMMETRY, OPT_SHEEP_GEN, OPT_SHEEP_ID, @@ -236,7 +240,7 @@ private: { \ if (member.m_Option.nArgType == SO_OPT) \ { \ - member(!strcmp(args.OptionArg(), "true")); \ + member(!_stricmp(args.OptionArg(), "true")); \ } \ else \ { \ @@ -245,50 +249,40 @@ private: } \ break +//Parsing is the same for all numerical option types. +#define PARSEOPTION(e, member) \ + case (e): \ + { \ + ss.clear(); \ + ss.str(args.OptionArg()); \ + ss >> member.m_Val; \ + break; \ + } + //Int. #define Eoi EmberOptionEntry #define INITINTOPTION(member, option) \ member = option; \ m_IntArgs.push_back(&member) -#define PARSEINTOPTION(e, member) \ - case (e): \ - sscanf_s(args.OptionArg(), "%ld", &member.m_Val); \ - break - //Uint. #define Eou EmberOptionEntry #define INITUINTOPTION(member, option) \ member = option; \ m_UintArgs.push_back(&member) -#define PARSEUINTOPTION(e, member) \ - case (e): \ - sscanf_s(args.OptionArg(), "%lu", &member.m_Val); \ - break - //Double. #define Eod EmberOptionEntry #define INITDOUBLEOPTION(member, option) \ member = option; \ m_DoubleArgs.push_back(&member) -#define PARSEDOUBLEOPTION(e, member) \ - case (e): \ - sscanf_s(args.OptionArg(), "%lf", &member.m_Val); \ - break - //String. #define Eos EmberOptionEntry #define INITSTRINGOPTION(member, option) \ member = option; \ m_StringArgs.push_back(&member) -#define PARSESTRINGOPTION(e, member) \ - case (e): \ - member.m_Val = args.OptionArg(); \ - break - /// /// Class for holding all available options across all command line programs. /// Some are used only for a single program, while others are used for more than one. @@ -345,6 +339,8 @@ public: INITBOOLOPTION(Enclosed, Eob(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_ENCLOSED, _T("--enclosed"), true, SO_OPT, " --enclosed Use enclosing Xml tags [default: true].\n")); INITBOOLOPTION(NoEdits, Eob(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_NO_EDITS, _T("--noedits"), false, SO_NONE, " --noedits Exclude edit tags when writing Xml [default: false].\n")); INITBOOLOPTION(UnsmoothEdge, Eob(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_UNSMOOTH_EDGE, _T("--unsmoother"), false, SO_NONE, " --unsmoother Do not use smooth blending for sheep edges [default: false].\n")); + INITBOOLOPTION(CwLoops, Eob(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_CW_LOOPS, _T("--cwloops"), false, SO_NONE, " --cwloops Rotate loops clockwise [default: false].\n")); + INITBOOLOPTION(CwInterpLoops, Eob(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_CW_INTERP_LOOPS, _T("--cwinterploops"), false, SO_NONE, " --cwinterploops Rotate clockwise during interpolation, ignored if --interploops is 0 [default: false].\n")); INITBOOLOPTION(LockAccum, Eob(eOptionUse::OPT_USE_ALL, eOptionIDs::OPT_LOCK_ACCUM, _T("--lock_accum"), false, SO_NONE, " --lock_accum Lock threads when accumulating to the histogram using the CPU. This will drop performance to that of single threading [default: false].\n")); INITBOOLOPTION(DumpKernel, Eob(eOptionUse::OPT_USE_RENDER, eOptionIDs::OPT_DUMP_KERNEL, _T("--dump_kernel"), false, SO_NONE, " --dump_kernel Print the iteration kernel string when using OpenCL (ignored for CPU) [default: false].\n")); //Int. @@ -368,20 +364,22 @@ public: INITUINTOPTION(LastFrame, Eou(eOptionUse::OPT_USE_ANIMATE, eOptionIDs::OPT_END, _T("--end"), UINT_MAX, SO_REQ_SEP, " --end= Time of last frame to render [default: last time specified in the input file].\n")); INITUINTOPTION(Frame, Eou(eOptionUse::OPT_ANIM_GENOME, eOptionIDs::OPT_FRAME, _T("--frame"), UINT_MAX, SO_REQ_SEP, " --frame= Time of first and last frame (ie do one frame).\n")); INITUINTOPTION(Dtime, Eou(eOptionUse::OPT_USE_ANIMATE, eOptionIDs::OPT_DTIME, _T("--dtime"), 1, SO_REQ_SEP, " --dtime= Time between frames [default: 1].\n")); - INITUINTOPTION(Frames, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_NFRAMES, _T("--nframes"), 20, SO_REQ_SEP, " --nframes= Number of frames per loop and per interpolation in the animation [default: 20].\n")); + INITUINTOPTION(LoopFrames, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_LOOP_FRAMES, _T("--loopframes"), 20, SO_REQ_SEP, " --loopframes= Number of frames per loop in the animation [default: 20].\n")); + INITUINTOPTION(InterpFrames, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_INTERP_FRAMES, _T("--interpframes"), 20, SO_REQ_SEP, " --interpframes= Number of frames per interpolation in the animation [default: 20].\n")); + INITUINTOPTION(InterpLoops, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_INTERP_LOOPS, _T("--interploops"), 1, SO_REQ_SEP, " --interploops= The number of 360 degree loops to rotate when interpolating between keyframes [default: 1].\n")); INITUINTOPTION(Repeat, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_REPEAT, _T("--repeat"), 1, SO_REQ_SEP, " --repeat= Number of new flames to create. Ignored if sequence, inter or rotate were specified [default: 1].\n")); INITUINTOPTION(Tries, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_TRIES, _T("--tries"), 10, SO_REQ_SEP, " --tries= Number times to try creating a flame that meets the specified constraints. Ignored if sequence, inter or rotate were specified [default: 10].\n")); INITUINTOPTION(MaxXforms, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_MAX_XFORMS, _T("--maxxforms"), UINT_MAX, SO_REQ_SEP, " --maxxforms= The maximum number of xforms allowed in the final output.\n")); INITUINTOPTION(StartCount, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_START_COUNT, _T("--startcount"), 0, SO_REQ_SEP, " --startcount= The number to add to each flame name when generating a sequence. Useful for programs like ffmpeg which require numerically increasing filenames [default: 0].\n")); INITUINTOPTION(Padding, Eou(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_PADDING, _T("--padding"), 0, SO_REQ_SEP, " --padding= Override the amount of zero padding added to each flame name when generating a sequence. Useful for programs like ffmpeg which require fixed width filenames [default: 0 (auto calculate padding)].\n")); //Double. - INITDOUBLEOPTION(SizeScale, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_SS, _T("--ss"), 1, SO_REQ_SEP, " --ss= Size scale. All dimensions are scaled by this amount [default: 1.0].\n")); - INITDOUBLEOPTION(QualityScale, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_QS, _T("--qs"), 1, SO_REQ_SEP, " --qs= Quality scale. All quality values are scaled by this amount [default: 1.0].\n")); - INITDOUBLEOPTION(Quality, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_QUALITY, _T("--quality"), 0, SO_REQ_SEP, " --quality= Override the quality of the flame if not 0 [default: 0].\n")); - INITDOUBLEOPTION(DeMin, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_DE_MIN, _T("--demin"), -1, SO_REQ_SEP, " --demin= Override the minimum size of the density estimator filter radius if not -1 [default: -1].\n")); - INITDOUBLEOPTION(DeMax, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_DE_MAX, _T("--demax"), -1, SO_REQ_SEP, " --demax= Override the maximum size of the density estimator filter radius if not -1 [default: -1].\n")); - INITDOUBLEOPTION(AspectRatio, Eod(eOptionUse::OPT_USE_ALL, eOptionIDs::OPT_PIXEL_ASPECT, _T("--pixel_aspect"), 1, SO_REQ_SEP, " --pixel_aspect= Aspect ratio of pixels (width over height), eg. 0.90909 for NTSC [default: 1.0].\n")); - INITDOUBLEOPTION(Stagger, Eod(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_STAGGER, _T("--stagger"), 0, SO_REQ_SEP, " --stagger= Affects simultaneity of xform interpolation during flame interpolation.\n" + INITDOUBLEOPTION(SizeScale, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_SS, _T("--ss"), 1.0, SO_REQ_SEP, " --ss= Size scale. All dimensions are scaled by this amount [default: 1.0].\n")); + INITDOUBLEOPTION(QualityScale, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_QS, _T("--qs"), 1.0, SO_REQ_SEP, " --qs= Quality scale. All quality values are scaled by this amount [default: 1.0].\n")); + INITDOUBLEOPTION(Quality, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_QUALITY, _T("--quality"), 0.0, SO_REQ_SEP, " --quality= Override the quality of the flame if not 0 [default: 0].\n")); + INITDOUBLEOPTION(DeMin, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_DE_MIN, _T("--demin"), -1.0, SO_REQ_SEP, " --demin= Override the minimum size of the density estimator filter radius if not -1 [default: -1].\n")); + INITDOUBLEOPTION(DeMax, Eod(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_DE_MAX, _T("--demax"), -1.0, SO_REQ_SEP, " --demax= Override the maximum size of the density estimator filter radius if not -1 [default: -1].\n")); + INITDOUBLEOPTION(AspectRatio, Eod(eOptionUse::OPT_USE_ALL, eOptionIDs::OPT_PIXEL_ASPECT, _T("--pixel_aspect"), 1.0, SO_REQ_SEP, " --pixel_aspect= Aspect ratio of pixels (width over height), eg. 0.90909 for NTSC [default: 1.0].\n")); + INITDOUBLEOPTION(Stagger, Eod(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_STAGGER, _T("--stagger"), 0.0, SO_REQ_SEP, " --stagger= Affects simultaneity of xform interpolation during flame interpolation.\n" "\t Represents how 'separate' the xforms are interpolated. Set to 1 for each\n" "\t xform to be interpolated individually, fractions control interpolation overlap [default: 0].\n")); INITDOUBLEOPTION(AvgThresh, Eod(eOptionUse::OPT_USE_GENOME, eOptionIDs::OPT_AVG_THRESH, _T("--avg"), 20.0, SO_REQ_SEP, " --avg= Minimum average pixel channel sum (r + g + b) threshold from 0 - 765. Ignored if sequence, inter or rotate were specified [default: 20].\n")); @@ -399,7 +397,7 @@ public: INITSTRINGOPTION(Out, Eos(eOptionUse::OPT_USE_RENDER, eOptionIDs::OPT_OUT, _T("--out"), "", SO_REQ_SEP, " --out= Name of a single output file. Not recommended when rendering more than one image.\n")); INITSTRINGOPTION(Prefix, Eos(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_PREFIX, _T("--prefix"), "", SO_REQ_SEP, " --prefix= Prefix to prepend to all output files.\n")); INITSTRINGOPTION(Suffix, Eos(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_SUFFIX, _T("--suffix"), "", SO_REQ_SEP, " --suffix= Suffix to append to all output files.\n")); - INITSTRINGOPTION(Format, Eos(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_FORMAT, _T("--format"), "png", SO_REQ_SEP, " --format= Format of the output file. Valid values are: bmp, jpg, png, ppm [default: png].\n")); + INITSTRINGOPTION(Format, Eos(eOptionUse::OPT_RENDER_ANIM, eOptionIDs::OPT_FORMAT, _T("--format"), "png", SO_REQ_SEP, " --format= Format of the output file. Valid values are: bmp, jpg, png [default: png].\n")); INITSTRINGOPTION(PalettePath, Eos(eOptionUse::OPT_USE_ALL, eOptionIDs::OPT_PALETTE_FILE, _T("--flam3_palettes"), "flam3-palettes.xml", SO_REQ_SEP, " --flam3_palettes= Path and name of the palette file [default: flam3-palettes.xml].\n")); INITSTRINGOPTION(Id, Eos(eOptionUse::OPT_USE_ALL, eOptionIDs::OPT_ID, _T("--id"), "", SO_REQ_SEP, " --id= ID to use in tags / image comments.\n")); INITSTRINGOPTION(Url, Eos(eOptionUse::OPT_USE_ALL, eOptionIDs::OPT_URL, _T("--url"), "", SO_REQ_SEP, " --url= URL to use in tags / image comments.\n")); @@ -436,6 +434,7 @@ public: EmberOptions options; vector sOptions = options.GetSimpleOptions(); CSimpleOpt args(argc, argv, sOptions.data()); + stringstream ss; //Process args. while (args.Next()) @@ -492,72 +491,76 @@ public: PARSEBOOLOPTION(eOptionIDs::OPT_ENCLOSED, Enclosed); PARSEBOOLOPTION(eOptionIDs::OPT_NO_EDITS, NoEdits); PARSEBOOLOPTION(eOptionIDs::OPT_UNSMOOTH_EDGE, UnsmoothEdge); + PARSEBOOLOPTION(eOptionIDs::OPT_CW_LOOPS, CwLoops); + PARSEBOOLOPTION(eOptionIDs::OPT_CW_INTERP_LOOPS, CwInterpLoops); PARSEBOOLOPTION(eOptionIDs::OPT_LOCK_ACCUM, LockAccum); PARSEBOOLOPTION(eOptionIDs::OPT_DUMP_KERNEL, DumpKernel); - PARSEINTOPTION(eOptionIDs::OPT_SYMMETRY, Symmetry);//Int args - PARSEINTOPTION(eOptionIDs::OPT_SHEEP_GEN, SheepGen); - PARSEINTOPTION(eOptionIDs::OPT_SHEEP_ID, SheepId); - PARSEINTOPTION(eOptionIDs::OPT_PRIORITY, Priority); - PARSEUINTOPTION(eOptionIDs::OPT_NTHREADS, ThreadCount);//uint args. - PARSEUINTOPTION(eOptionIDs::OPT_STRIPS, Strips); - PARSEUINTOPTION(eOptionIDs::OPT_SUPERSAMPLE, Supersample); - PARSEUINTOPTION(eOptionIDs::OPT_TEMPSAMPLES, TemporalSamples); - PARSEUINTOPTION(eOptionIDs::OPT_BPC, BitsPerChannel); - PARSEUINTOPTION(eOptionIDs::OPT_PRINT_EDIT_DEPTH, PrintEditDepth); - PARSEUINTOPTION(eOptionIDs::OPT_JPEG, JpegQuality); - PARSEUINTOPTION(eOptionIDs::OPT_BEGIN, FirstFrame); - PARSEUINTOPTION(eOptionIDs::OPT_END, LastFrame); - PARSEUINTOPTION(eOptionIDs::OPT_FRAME, Frame); - PARSEUINTOPTION(eOptionIDs::OPT_DTIME, Dtime); - PARSEUINTOPTION(eOptionIDs::OPT_NFRAMES, Frames); - PARSEUINTOPTION(eOptionIDs::OPT_REPEAT, Repeat); - PARSEUINTOPTION(eOptionIDs::OPT_TRIES, Tries); - PARSEUINTOPTION(eOptionIDs::OPT_MAX_XFORMS, MaxXforms); - PARSEUINTOPTION(eOptionIDs::OPT_START_COUNT, StartCount); - PARSEUINTOPTION(eOptionIDs::OPT_PADDING, Padding); - PARSEDOUBLEOPTION(eOptionIDs::OPT_SS, SizeScale);//Float args. - PARSEDOUBLEOPTION(eOptionIDs::OPT_QS, QualityScale); - PARSEDOUBLEOPTION(eOptionIDs::OPT_QUALITY, Quality); - PARSEDOUBLEOPTION(eOptionIDs::OPT_DE_MIN, DeMin); - PARSEDOUBLEOPTION(eOptionIDs::OPT_DE_MAX, DeMax); - PARSEDOUBLEOPTION(eOptionIDs::OPT_PIXEL_ASPECT, AspectRatio); - PARSEDOUBLEOPTION(eOptionIDs::OPT_STAGGER, Stagger); - PARSEDOUBLEOPTION(eOptionIDs::OPT_AVG_THRESH, AvgThresh); - PARSEDOUBLEOPTION(eOptionIDs::OPT_BLACK_THRESH, BlackThresh); - PARSEDOUBLEOPTION(eOptionIDs::OPT_WHITE_LIMIT, WhiteLimit); - PARSEDOUBLEOPTION(eOptionIDs::OPT_SPEED, Speed); - PARSEDOUBLEOPTION(eOptionIDs::OPT_OFFSETX, OffsetX); - PARSEDOUBLEOPTION(eOptionIDs::OPT_OFFSETY, OffsetY); - PARSEDOUBLEOPTION(eOptionIDs::OPT_USEMEM, UseMem); - PARSEDOUBLEOPTION(eOptionIDs::OPT_LOOPS, Loops); - PARSESTRINGOPTION(eOptionIDs::OPT_OPENCL_DEVICE, Device);//String args. - PARSESTRINGOPTION(eOptionIDs::OPT_ISAAC_SEED, IsaacSeed); - PARSESTRINGOPTION(eOptionIDs::OPT_IN, Input); - PARSESTRINGOPTION(eOptionIDs::OPT_OUT, Out); - PARSESTRINGOPTION(eOptionIDs::OPT_PREFIX, Prefix); - PARSESTRINGOPTION(eOptionIDs::OPT_SUFFIX, Suffix); - PARSESTRINGOPTION(eOptionIDs::OPT_FORMAT, Format); - PARSESTRINGOPTION(eOptionIDs::OPT_PALETTE_FILE, PalettePath); + PARSEOPTION(eOptionIDs::OPT_SYMMETRY, Symmetry);//Int args + PARSEOPTION(eOptionIDs::OPT_SHEEP_GEN, SheepGen); + PARSEOPTION(eOptionIDs::OPT_SHEEP_ID, SheepId); + PARSEOPTION(eOptionIDs::OPT_PRIORITY, Priority); + PARSEOPTION(eOptionIDs::OPT_NTHREADS, ThreadCount);//uint args. + PARSEOPTION(eOptionIDs::OPT_STRIPS, Strips); + PARSEOPTION(eOptionIDs::OPT_SUPERSAMPLE, Supersample); + PARSEOPTION(eOptionIDs::OPT_TEMPSAMPLES, TemporalSamples); + PARSEOPTION(eOptionIDs::OPT_BPC, BitsPerChannel); + PARSEOPTION(eOptionIDs::OPT_PRINT_EDIT_DEPTH, PrintEditDepth); + PARSEOPTION(eOptionIDs::OPT_JPEG, JpegQuality); + PARSEOPTION(eOptionIDs::OPT_BEGIN, FirstFrame); + PARSEOPTION(eOptionIDs::OPT_END, LastFrame); + PARSEOPTION(eOptionIDs::OPT_FRAME, Frame); + PARSEOPTION(eOptionIDs::OPT_DTIME, Dtime); + PARSEOPTION(eOptionIDs::OPT_LOOP_FRAMES, LoopFrames); + PARSEOPTION(eOptionIDs::OPT_INTERP_FRAMES, InterpFrames); + PARSEOPTION(eOptionIDs::OPT_INTERP_LOOPS, InterpLoops); + PARSEOPTION(eOptionIDs::OPT_REPEAT, Repeat); + PARSEOPTION(eOptionIDs::OPT_TRIES, Tries); + PARSEOPTION(eOptionIDs::OPT_MAX_XFORMS, MaxXforms); + PARSEOPTION(eOptionIDs::OPT_START_COUNT, StartCount); + PARSEOPTION(eOptionIDs::OPT_PADDING, Padding); + PARSEOPTION(eOptionIDs::OPT_SS, SizeScale);//Float args. + PARSEOPTION(eOptionIDs::OPT_QS, QualityScale); + PARSEOPTION(eOptionIDs::OPT_QUALITY, Quality); + PARSEOPTION(eOptionIDs::OPT_DE_MIN, DeMin); + PARSEOPTION(eOptionIDs::OPT_DE_MAX, DeMax); + PARSEOPTION(eOptionIDs::OPT_PIXEL_ASPECT, AspectRatio); + PARSEOPTION(eOptionIDs::OPT_STAGGER, Stagger); + PARSEOPTION(eOptionIDs::OPT_AVG_THRESH, AvgThresh); + PARSEOPTION(eOptionIDs::OPT_BLACK_THRESH, BlackThresh); + PARSEOPTION(eOptionIDs::OPT_WHITE_LIMIT, WhiteLimit); + PARSEOPTION(eOptionIDs::OPT_SPEED, Speed); + PARSEOPTION(eOptionIDs::OPT_OFFSETX, OffsetX); + PARSEOPTION(eOptionIDs::OPT_OFFSETY, OffsetY); + PARSEOPTION(eOptionIDs::OPT_USEMEM, UseMem); + PARSEOPTION(eOptionIDs::OPT_LOOPS, Loops); + PARSEOPTION(eOptionIDs::OPT_OPENCL_DEVICE, Device);//String args. + PARSEOPTION(eOptionIDs::OPT_ISAAC_SEED, IsaacSeed); + PARSEOPTION(eOptionIDs::OPT_IN, Input); + PARSEOPTION(eOptionIDs::OPT_OUT, Out); + PARSEOPTION(eOptionIDs::OPT_PREFIX, Prefix); + PARSEOPTION(eOptionIDs::OPT_SUFFIX, Suffix); + PARSEOPTION(eOptionIDs::OPT_FORMAT, Format); + PARSEOPTION(eOptionIDs::OPT_PALETTE_FILE, PalettePath); //PARSESTRINGOPTION(eOptionIDs::OPT_PALETTE_IMAGE, PaletteImage); - PARSESTRINGOPTION(eOptionIDs::OPT_ID, Id); - PARSESTRINGOPTION(eOptionIDs::OPT_URL, Url); - PARSESTRINGOPTION(eOptionIDs::OPT_NICK, Nick); - PARSESTRINGOPTION(eOptionIDs::OPT_COMMENT, Comment); - PARSESTRINGOPTION(eOptionIDs::OPT_TEMPLATE, TemplateFile); - PARSESTRINGOPTION(eOptionIDs::OPT_CLONE, Clone); - PARSESTRINGOPTION(eOptionIDs::OPT_CLONE_ALL, CloneAll); - PARSESTRINGOPTION(eOptionIDs::OPT_CLONE_ACTION, CloneAction); - PARSESTRINGOPTION(eOptionIDs::OPT_ANIMATE, Animate); - PARSESTRINGOPTION(eOptionIDs::OPT_MUTATE, Mutate); - PARSESTRINGOPTION(eOptionIDs::OPT_CROSS0, Cross0); - PARSESTRINGOPTION(eOptionIDs::OPT_CROSS1, Cross1); - PARSESTRINGOPTION(eOptionIDs::OPT_METHOD, Method); - PARSESTRINGOPTION(eOptionIDs::OPT_INTER, Inter); - PARSESTRINGOPTION(eOptionIDs::OPT_ROTATE, Rotate); - PARSESTRINGOPTION(eOptionIDs::OPT_SEQUENCE, Sequence); - PARSESTRINGOPTION(eOptionIDs::OPT_USE_VARS, UseVars); - PARSESTRINGOPTION(eOptionIDs::OPT_DONT_USE_VARS, DontUseVars); - PARSESTRINGOPTION(eOptionIDs::OPT_EXTRAS, Extras); + PARSEOPTION(eOptionIDs::OPT_ID, Id); + PARSEOPTION(eOptionIDs::OPT_URL, Url); + PARSEOPTION(eOptionIDs::OPT_NICK, Nick); + PARSEOPTION(eOptionIDs::OPT_COMMENT, Comment); + PARSEOPTION(eOptionIDs::OPT_TEMPLATE, TemplateFile); + PARSEOPTION(eOptionIDs::OPT_CLONE, Clone); + PARSEOPTION(eOptionIDs::OPT_CLONE_ALL, CloneAll); + PARSEOPTION(eOptionIDs::OPT_CLONE_ACTION, CloneAction); + PARSEOPTION(eOptionIDs::OPT_ANIMATE, Animate); + PARSEOPTION(eOptionIDs::OPT_MUTATE, Mutate); + PARSEOPTION(eOptionIDs::OPT_CROSS0, Cross0); + PARSEOPTION(eOptionIDs::OPT_CROSS1, Cross1); + PARSEOPTION(eOptionIDs::OPT_METHOD, Method); + PARSEOPTION(eOptionIDs::OPT_INTER, Inter); + PARSEOPTION(eOptionIDs::OPT_ROTATE, Rotate); + PARSEOPTION(eOptionIDs::OPT_SEQUENCE, Sequence); + PARSEOPTION(eOptionIDs::OPT_USE_VARS, UseVars); + PARSEOPTION(eOptionIDs::OPT_DONT_USE_VARS, DontUseVars); + PARSEOPTION(eOptionIDs::OPT_EXTRAS, Extras); default: { @@ -775,6 +778,8 @@ public: Eob Enclosed; Eob NoEdits; Eob UnsmoothEdge; + Eob CwLoops; + Eob CwInterpLoops; Eob LockAccum; Eob DumpKernel; @@ -794,7 +799,9 @@ public: Eou LastFrame; Eou Frame; Eou Dtime; - Eou Frames; + Eou LoopFrames; + Eou InterpFrames; + Eou InterpLoops; Eou Repeat; Eou Tries; Eou MaxXforms; diff --git a/Source/EmberCommon/JpegUtils.h b/Source/EmberCommon/JpegUtils.h index d016dc7..2a2606b 100644 --- a/Source/EmberCommon/JpegUtils.h +++ b/Source/EmberCommon/JpegUtils.h @@ -4,31 +4,6 @@ #define PNG_COMMENT_MAX 8 -/// -/// Write a PPM file. -/// -/// The full path and name of the file -/// Pointer to the image data to write -/// Width of the image in pixels -/// Height of the image in pixels -/// True if success, else false -static bool WritePpm(const char* filename, byte* image, size_t width, size_t height) -{ - bool b = false; - size_t size = width * height * 3; - FILE* file; - - if (fopen_s(&file, filename, "wb") == 0) - { - fprintf_s(file, "P6\n"); - fprintf_s(file, "%lu %lu\n255\n", width, height); - b = (size == fwrite(image, 1, size, file)); - fclose(file); - } - - return b; -} - /// /// Write a JPEG file. /// @@ -53,15 +28,16 @@ static bool WriteJpeg(const char* filename, byte* image, size_t width, size_t he size_t i; jpeg_error_mgr jerr; jpeg_compress_struct info; - char nickString[64], urlString[128], idString[128]; - char bvString[64], niString[64], rtString[64]; - char genomeString[65536], verString[64]; + string nickString, urlString, idString; + string bvString, niString, rtString; + string genomeString, verString; //Create the mandatory comment strings. - snprintf_s(genomeString, 65536, "flam3_genome: %s", comments.m_Genome.c_str()); - snprintf_s(bvString, 64, "flam3_error_rate: %s", comments.m_Badvals.c_str()); - snprintf_s(niString, 64, "flam3_samples: %s", comments.m_NumIters.c_str()); - snprintf_s(rtString, 64, "flam3_time: %s", comments.m_Runtime.c_str()); - snprintf_s(verString, 64, "flam3_version: %s", EmberVersion()); + ostringstream os; + os << "genome: " << comments.m_Genome; genomeString = os.str(); os.str(""); + os << "error_rate: " << comments.m_Badvals; bvString = os.str(); os.str(""); + os << "samples: " << comments.m_NumIters; niString = os.str(); os.str(""); + os << "time: " << comments.m_Runtime; rtString = os.str(); os.str(""); + os << "version: " << EmberVersion(); verString = os.str(); os.str(""); info.err = jpeg_std_error(&jerr); jpeg_create_compress(&info); jpeg_stdio_dest(&info, file); @@ -83,36 +59,43 @@ static bool WriteJpeg(const char* filename, byte* image, size_t width, size_t he //Write comments to jpeg. if (enableComments) { - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(verString), uint(strlen(verString))); + string s; + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(verString.c_str()), uint(verString.size())); if (nick != "") { - snprintf_s(nickString, 64, "flam3_nickname: %s", nick.c_str()); - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(nickString), uint(strlen(nickString))); + os.str(""); + os << "nickname: " << nick; + s = os.str(); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(s.c_str()), uint(s.size())); } if (url != "") { - snprintf_s(urlString, 128, "flam3_url: %s", url.c_str()); - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(urlString), uint(strlen(urlString))); + os.str(""); + os << "url: " << url; + s = os.str(); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(s.c_str()), uint(s.size())); } if (id != "") { - snprintf_s(idString, 128, "flam3_id: %s", id.c_str()); - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(idString), uint(strlen(idString))); + os.str(""); + os << "id: " << id; + s = os.str(); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(s.c_str()), uint(s.size())); } - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(bvString), uint(strlen(bvString))); - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(niString), uint(strlen(niString))); - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(rtString), uint(strlen(rtString))); - jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(genomeString), uint(strlen(genomeString))); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(bvString.c_str()), uint(bvString.size())); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(niString.c_str()), uint(niString.size())); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(rtString.c_str()), uint(rtString.size())); + jpeg_write_marker(&info, JPEG_COM, reinterpret_cast(genomeString.c_str()), uint(genomeString.size())); } for (i = 0; i < height; i++) { JSAMPROW row_pointer[1]; - row_pointer[0] = reinterpret_cast(image) + (3 * width * i); + row_pointer[0] = image + (3 * width * i); jpeg_write_scanlines(&info, row_pointer, 1); } @@ -209,7 +192,7 @@ static bool WritePng(const char* filename, byte* image, size_t width, size_t hei png_set_swap(png_ptr); } - png_write_image(png_ptr, const_cast(rows.data())); + png_write_image(png_ptr, rows.data()); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(file); @@ -227,10 +210,10 @@ static bool WritePng(const char* filename, byte* image, size_t width, size_t hei /// The height. /// The size of the new buffer created /// The converted buffer if successful, else NULL. -static byte* ConvertRGBToBMPBuffer(byte* buffer, size_t width, size_t height, size_t& newSize) +static vector ConvertRGBToBMPBuffer(byte* buffer, size_t width, size_t height, size_t& newSize) { if (buffer == nullptr || width == 0 || height == 0) - return nullptr; + return vector(); size_t padding = 0; size_t scanlinebytes = width * 3; @@ -240,34 +223,27 @@ static byte* ConvertRGBToBMPBuffer(byte* buffer, size_t width, size_t height, si size_t psw = scanlinebytes + padding; newSize = height * psw; - byte* newBuf = new byte[newSize]; + vector newBuf(newSize); + size_t bufpos = 0; + size_t newpos = 0; - if (newBuf) + for (size_t y = 0; y < height; y++) { - memset (newBuf, 0, newSize); - size_t bufpos = 0; - size_t newpos = 0; - - for (size_t y = 0; y < height; y++) + for (size_t x = 0; x < 3 * width; x += 3) { - for (size_t x = 0; x < 3 * width; x += 3) - { - bufpos = y * 3 * width + x; // position in original buffer - newpos = (height - y - 1) * psw + x; // position in padded buffer - newBuf[newpos] = buffer[bufpos + 2]; // swap r and b - newBuf[newpos + 1] = buffer[bufpos + 1]; // g stays - newBuf[newpos + 2] = buffer[bufpos]; // swap b and r - //No swap. - //newBuf[newpos] = buffer[bufpos]; - //newBuf[newpos + 1] = buffer[bufpos + 1]; - //newBuf[newpos + 2] = buffer[bufpos + 2]; - } + bufpos = y * 3 * width + x; // position in original buffer + newpos = (height - y - 1) * psw + x; // position in padded buffer + newBuf[newpos] = buffer[bufpos + 2]; // swap r and b + newBuf[newpos + 1] = buffer[bufpos + 1]; // g stays + newBuf[newpos + 2] = buffer[bufpos]; // swap b and r + //No swap. + //newBuf[newpos] = buffer[bufpos]; + //newBuf[newpos + 1] = buffer[bufpos + 1]; + //newBuf[newpos + 2] = buffer[bufpos + 2]; } - - return newBuf; } - return nullptr; + return newBuf; } /// @@ -279,7 +255,7 @@ static byte* ConvertRGBToBMPBuffer(byte* buffer, size_t width, size_t height, si /// Height of the image in pixels /// Padded size, greater than or equal to total image size. /// True if success, else false -static bool SaveBmp(const char* filename, byte* image, size_t width, size_t height, size_t paddedSize) +static bool SaveBmp(const char* filename, const byte* image, size_t width, size_t height, size_t paddedSize) { #ifdef _WIN32 BITMAPFILEHEADER bmfh; @@ -346,10 +322,7 @@ static bool WriteBmp(const char* filename, byte* image, size_t width, size_t hei { bool b = false; size_t newSize; - unique_ptr bgrBuf(ConvertRGBToBMPBuffer(image, width, height, newSize)); - - if (bgrBuf.get()) - b = SaveBmp(filename, bgrBuf.get(), width, height, newSize); - + auto bgrBuf = ConvertRGBToBMPBuffer(image, width, height, newSize); + b = SaveBmp(filename, bgrBuf.data(), width, height, newSize); return b; } diff --git a/Source/EmberGenome/EmberGenome.cpp b/Source/EmberGenome/EmberGenome.cpp index 0ec8308..89a2d33 100644 --- a/Source/EmberGenome/EmberGenome.cpp +++ b/Source/EmberGenome/EmberGenome.cpp @@ -453,9 +453,21 @@ bool EmberGenome(EmberOptions& opt) { Ember result; - if (opt.Frames() == 0) + if (!opt.LoopFrames() && !opt.InterpFrames()) { - cerr << "nframes must be positive and non-zero, not " << opt.Frames() << ".\n"; + cerr << "loop frames or interp frames must be positive and non-zero, not " << opt.LoopFrames() << ", " << opt.InterpFrames() << ".\n"; + return false; + } + + if (opt.LoopFrames() > 0 && !opt.Loops()) + { + cerr << "loop frames cannot be positive while loops is zero: " << opt.LoopFrames() << ", " << opt.Loops() << ".\n"; + return false; + } + + if (opt.Loops() > 0 && !opt.LoopFrames()) + { + cerr << "loops cannot be positive while loopframes is zero: " << opt.Loops() << ", " << opt.LoopFrames() << ".\n"; return false; } @@ -465,19 +477,19 @@ bool EmberGenome(EmberOptions& opt) frameCount = 0; os.str(""); os << setfill('0') << setprecision(0) << fixed; - auto padding = opt.Padding() ? streamsize(opt.Padding()) : (streamsize(std::log10(opt.StartCount() + (((opt.Frames() * opt.Loops()) + opt.Frames()) * embers.size()))) + 1); + auto padding = opt.Padding() ? streamsize(opt.Padding()) : (streamsize(std::log10(opt.StartCount() + (((opt.LoopFrames() * opt.Loops()) + opt.InterpFrames()) * embers.size()))) + 1); t.Tic(); for (i = 0; i < embers.size(); i++) { if (opt.Loops() > 0) { - size_t roundFrames = size_t(std::round(opt.Frames() * opt.Loops())); + size_t roundFrames = size_t(std::round(opt.LoopFrames() * opt.Loops())); for (frame = 0; frame < roundFrames; frame++) { - blend = T(frame) / T(opt.Frames()); - tools.Spin(embers[i], pTemplate, result, opt.StartCount() + frameCount++, blend);//Result is cleared and reassigned each time inside of Spin(). + blend = T(frame) / T(opt.LoopFrames()); + tools.Spin(embers[i], pTemplate, result, opt.StartCount() + frameCount++, blend, opt.CwLoops());//Result is cleared and reassigned each time inside of Spin(). FormatName(result, os, padding); cout << emberToXml.ToString(result, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); } @@ -486,8 +498,8 @@ bool EmberGenome(EmberOptions& opt) //Rotate the next step and save in result, but do not print. //result will be the starting point for the interp phase below. frame = roundFrames; - blend = T(frame) / T(opt.Frames()); - tools.Spin(embers[i], pTemplate, result, opt.StartCount() + frameCount, blend);//Do not increment frameCount here. + blend = T(frame) / T(opt.LoopFrames()); + tools.Spin(embers[i], pTemplate, result, opt.StartCount() + frameCount, blend, opt.CwLoops());//Do not increment frameCount here. FormatName(result, os, padding); } @@ -496,19 +508,19 @@ bool EmberGenome(EmberOptions& opt) if (opt.Loops() > 0)//Store the last result as the flame to interpolate from. This applies for whole or fractional values of opt.Loops(). embers[i] = result; - for (frame = 0; frame < opt.Frames(); frame++) + for (frame = 0; frame < opt.InterpFrames(); frame++) { - seqFlag = frame == 0 || (frame == opt.Frames() - 1); - blend = frame / T(opt.Frames()); + seqFlag = frame == 0 || (frame == opt.InterpFrames() - 1); + blend = frame / T(opt.InterpFrames()); result.Clear(); - tools.SpinInter(&embers[i], pTemplate, result, opt.StartCount() + frameCount++, seqFlag, blend); + tools.SpinInter(&embers[i], pTemplate, result, opt.StartCount() + frameCount++, seqFlag, blend, opt.InterpLoops(), opt.CwInterpLoops()); FormatName(result, os, padding); cout << emberToXml.ToString(result, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); } } } - tools.Spin(embers.back(), pTemplate, result, opt.StartCount() + frameCount, 0); + tools.Spin(embers.back(), pTemplate, result, opt.StartCount() + frameCount, 0, opt.CwInterpLoops()); FormatName(result, os, padding); cout << emberToXml.ToString(result, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); t.Toc("Sequencing"); @@ -523,15 +535,15 @@ bool EmberGenome(EmberOptions& opt) { Ember result, result1, result2, result3; - if (opt.Frames() == 0) + if (!opt.LoopFrames() && !opt.InterpFrames()) { - cerr << "nframes must be positive and non-zero, not " << opt.Frames() << ".\n"; + cerr << "loop frames or interp frames must be positive and non-zero, not " << opt.LoopFrames() << ", " << opt.InterpFrames() << ".\n"; return false; } frame = opt.Frame(); - blend = frame / T(opt.Frames());//Percentage between first and second flame to treat as the center flame. - spread = 1 / T(opt.Frames());//Amount to move backward and forward from the center flame. + blend = frame / T(opt.InterpFrames());//Percentage between first and second flame to treat as the center flame. + spread = 1 / T(opt.InterpFrames());//Amount to move backward and forward from the center flame. if (opt.Enclosed()) cout << "\n"; @@ -546,12 +558,12 @@ bool EmberGenome(EmberOptions& opt) if (frame)//Cannot spin backward below frame zero. { - tools.Spin(embers[0], pTemplate, result1, frame - 1, blend - spread); + tools.Spin(embers[0], pTemplate, result1, frame - 1, blend - spread, opt.CwLoops()); cout << emberToXml.ToString(result1, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); } - tools.Spin(embers[0], pTemplate, result2, frame , blend ); - tools.Spin(embers[0], pTemplate, result3, frame + 1, blend + spread); + tools.Spin(embers[0], pTemplate, result2, frame , blend , opt.CwLoops()); + tools.Spin(embers[0], pTemplate, result3, frame + 1, blend + spread, opt.CwLoops()); cout << emberToXml.ToString(result2, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); cout << emberToXml.ToString(result3, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); } @@ -565,12 +577,12 @@ bool EmberGenome(EmberOptions& opt) if (frame)//Cannot interpolate backward below frame zero. { - tools.SpinInter(embers.data(), pTemplate, result1, frame - 1, false, blend - spread); + tools.SpinInter(embers.data(), pTemplate, result1, frame - 1, false, blend - spread, opt.InterpLoops(), opt.CwInterpLoops()); cout << emberToXml.ToString(result1, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); } - tools.SpinInter(embers.data(), pTemplate, result2, frame , false, blend ); - tools.SpinInter(embers.data(), pTemplate, result3, frame + 1, false, blend + spread); + tools.SpinInter(embers.data(), pTemplate, result2, frame , false, blend , opt.InterpLoops(), opt.CwInterpLoops()); + tools.SpinInter(embers.data(), pTemplate, result3, frame + 1, false, blend + spread, opt.InterpLoops(), opt.CwInterpLoops()); cout << emberToXml.ToString(result2, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); cout << emberToXml.ToString(result3, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), opt.HexPalette()); } diff --git a/Source/EmberRender/EmberRender.cpp b/Source/EmberRender/EmberRender.cpp index 6be2ec4..889d924 100644 --- a/Source/EmberRender/EmberRender.cpp +++ b/Source/EmberRender/EmberRender.cpp @@ -117,10 +117,9 @@ bool EmberRender(EmberOptions& opt) if (opt.Format() != "jpg" && opt.Format() != "png" && - opt.Format() != "ppm" && opt.Format() != "bmp") { - cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg.\n"; + cout << "Format must be jpg, png, or bmp not " << opt.Format() << ". Setting to jpg.\n"; } channels = opt.Format() == "png" ? 4 : 3; @@ -302,8 +301,6 @@ bool EmberRender(EmberOptions& opt) writeSuccess = WritePng(filename.c_str(), finalImagep, finalEmber.m_FinalRasW, finalEmber.m_FinalRasH, opt.BitsPerChannel() / 8, opt.PngComments(), comments, opt.Id(), opt.Url(), opt.Nick()); else if (opt.Format() == "jpg") writeSuccess = WriteJpeg(filename.c_str(), finalImagep, finalEmber.m_FinalRasW, finalEmber.m_FinalRasH, int(opt.JpegQuality()), opt.JpegComments(), comments, opt.Id(), opt.Url(), opt.Nick()); - else if (opt.Format() == "ppm") - writeSuccess = WritePpm(filename.c_str(), finalImagep, finalEmber.m_FinalRasW, finalEmber.m_FinalRasH); else if (opt.Format() == "bmp") writeSuccess = WriteBmp(filename.c_str(), finalImagep, finalEmber.m_FinalRasW, finalEmber.m_FinalRasH); diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp index a411266..05b9391 100644 --- a/Source/EmberTester/EmberTester.cpp +++ b/Source/EmberTester/EmberTester.cpp @@ -18,12 +18,9 @@ using namespace EmberCommon; template void SaveFinalImage(Renderer& renderer, vector& pixels, char* suffix) { - Timing t; - //renderer.AccumulatorToFinalImage(pixels); - //t.Toc("AccumulatorToFinalImage()"); long newSize; - char ch[50]; - sprintf_s(ch, 50, ".\\BasicFlame_%d_%s.bmp", sizeof(T), suffix); + ostringstream os; + os << ".\\BasicFlame_" << sizeof(T) << "_" << suffix ".bmp"; BYTE* bgrBuf = ConvertRGBToBMPBuffer(pixels.data(), renderer.FinalRasW(), renderer.FinalRasH(), newSize); SaveBMP(ch, bgrBuf, renderer.FinalRasW(), renderer.FinalRasH(), newSize); delete [] bgrBuf; @@ -1870,7 +1867,7 @@ void DistribTester() throw "Out of bounds xform index in selection distribution."; #endif - //printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity); + //cout << "offset = " << j << ", xform = " << i << ", running sum = " << tempDensity << "\n"; m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i); tempDensity += densityPerElement; j++; diff --git a/Source/Fractorium/AboutDialog.ui b/Source/Fractorium/AboutDialog.ui index 6d9d479..fbbee6c 100644 --- a/Source/Fractorium/AboutDialog.ui +++ b/Source/Fractorium/AboutDialog.ui @@ -58,7 +58,7 @@ QFrame::NoFrame - <html><head/><body><p align="center"><br/>Fractorium 1.0.0.1</p><p align="center"><span style=" font-size:10pt;">A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><a href="http://fractorium.com">fractorium.com</a><span style=" font-size:10pt;"><br/>Lead: Matt Feemster<br/>Contributors: Simon Detheridge</span></p></body></html> + <html><head/><body><p align="center"><br/>Fractorium 1.0.0.2</p><p align="center"><span style=" font-size:10pt;">A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><a href="http://fractorium.com">fractorium.com</a><span style=" font-size:10pt;"><br/>Lead: Matt Feemster<br/>Contributors: Simon Detheridge</span></p></body></html> Qt::RichText diff --git a/Source/Fractorium/DoubleSpinBox.cpp b/Source/Fractorium/DoubleSpinBox.cpp index 08f1429..23635f4 100644 --- a/Source/Fractorium/DoubleSpinBox.cpp +++ b/Source/Fractorium/DoubleSpinBox.cpp @@ -1,5 +1,6 @@ #include "FractoriumPch.h" #include "DoubleSpinBox.h" +#include "FractoriumSettings.h" QTimer DoubleSpinBox::s_Timer; @@ -15,7 +16,6 @@ QTimer DoubleSpinBox::s_Timer; DoubleSpinBox::DoubleSpinBox(QWidget* p, int h, double step) : QDoubleSpinBox(p) { - m_Select = false; m_DoubleClick = false; m_DoubleClickNonZero = 0; m_DoubleClickZero = 1; @@ -159,36 +159,39 @@ void DoubleSpinBox::OnTimeout() bool DoubleSpinBox::eventFilter(QObject* o, QEvent* e) { QMouseEvent* me = dynamic_cast(e); + auto settings = FractoriumSettings::DefInstance(); - if (isEnabled() && - me && - me->type() == QMouseEvent::MouseButtonPress && - me->button() == Qt::RightButton) + if (isEnabled() && me) { - m_MouseDownPoint = m_MouseMovePoint = me->pos(); - StartTimer(); - } - else if (isEnabled() && - me && - me->type() == QMouseEvent::MouseButtonRelease && - me->button() == Qt::RightButton) - { - StopTimer(); - m_MouseDownPoint = m_MouseMovePoint = me->pos(); - } - else if (isEnabled() && - me && - me->type() == QMouseEvent::MouseMove && - QGuiApplication::mouseButtons() & Qt::RightButton) - { - m_MouseMovePoint = me->pos(); - } - else if (m_DoubleClick && e->type() == QMouseEvent::MouseButtonDblClick && isEnabled()) - { - if (IsNearZero(value())) - setValue(m_DoubleClickZero); - else - setValue(m_DoubleClickNonZero); + if (!settings->ToggleType() &&//Ensure double click toggles, not right click. + me->type() == QMouseEvent::MouseButtonPress && + me->button() == Qt::RightButton) + { + m_MouseDownPoint = m_MouseMovePoint = me->pos(); + StartTimer(); + } + else if (!settings->ToggleType() && + me->type() == QMouseEvent::MouseButtonRelease && + me->button() == Qt::RightButton) + { + StopTimer(); + m_MouseDownPoint = m_MouseMovePoint = me->pos(); + } + else if (!settings->ToggleType() && + me->type() == QMouseEvent::MouseMove && + QGuiApplication::mouseButtons() & Qt::RightButton) + { + m_MouseMovePoint = me->pos(); + } + else if (m_DoubleClick && + ((!settings->ToggleType() && e->type() == QMouseEvent::MouseButtonDblClick && me->button() == Qt::LeftButton) || + (settings->ToggleType() && me->type() == QMouseEvent::MouseButtonRelease && me->button() == Qt::RightButton))) + { + if (IsNearZero(value())) + setValue(m_DoubleClickZero); + else + setValue(m_DoubleClickNonZero); + } } else { diff --git a/Source/Fractorium/DoubleSpinBox.h b/Source/Fractorium/DoubleSpinBox.h index 5b1eb60..d33cefc 100644 --- a/Source/Fractorium/DoubleSpinBox.h +++ b/Source/Fractorium/DoubleSpinBox.h @@ -6,6 +6,8 @@ /// DoubleSpinBox and VariationTreeDoubleSpinBox classes. /// +enum class eSpinToggle : et { NONE = 0, SPIN_DOUBLE_CLICK = 1, SPIN_RIGHT_CLICK = 2 }; + /// /// A derivation to prevent the spin box from selecting its own text /// when editing. Also to prevent multiple spin boxes from all having @@ -43,7 +45,6 @@ private: void StartTimer(); void StopTimer(); - bool m_Select; bool m_DoubleClick; double m_DoubleClickNonZero; double m_DoubleClickZero; diff --git a/Source/Fractorium/EmberTreeWidgetItem.h b/Source/Fractorium/EmberTreeWidgetItem.h index 4451ece..b1875a6 100644 --- a/Source/Fractorium/EmberTreeWidgetItem.h +++ b/Source/Fractorium/EmberTreeWidgetItem.h @@ -73,6 +73,7 @@ public: m_Ember(ember) { setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); + setCheckState(0, Qt::Unchecked); } /// @@ -86,6 +87,7 @@ public: m_Ember(ember) { setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); + setCheckState(0, Qt::Unchecked); } /// diff --git a/Source/Fractorium/FinalRenderDialog.cpp b/Source/Fractorium/FinalRenderDialog.cpp index 91c8158..b8f1242 100644 --- a/Source/Fractorium/FinalRenderDialog.cpp +++ b/Source/Fractorium/FinalRenderDialog.cpp @@ -10,7 +10,7 @@ /// Pointer to the global settings object to use /// The parent widget /// The window flags. Default: 0. -FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) +FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(QWidget* p, Qt::WindowFlags f) : QDialog(p, f) { ui.setupUi(this); @@ -19,7 +19,7 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set QTableWidget* table = ui.FinalRenderParamsTable; m_Info = OpenCLInfo::Instance(); m_Fractorium = qobject_cast(p); - m_Settings = settings; + m_Settings = FractoriumSettings::DefInstance(); ui.FinalRenderThreadCountSpin->setRange(1, Timing::ProcessorCount()); connect(ui.FinalRenderEarlyClipCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnEarlyClipCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.FinalRenderYAxisUpCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnYAxisUpCheckBoxStateChanged(int)), Qt::QueuedConnection); diff --git a/Source/Fractorium/FinalRenderDialog.h b/Source/Fractorium/FinalRenderDialog.h index 3c01abb..a553767 100644 --- a/Source/Fractorium/FinalRenderDialog.h +++ b/Source/Fractorium/FinalRenderDialog.h @@ -50,7 +50,7 @@ class FractoriumFinalRenderDialog : public QDialog #endif public: - FractoriumFinalRenderDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f = 0); + FractoriumFinalRenderDialog(QWidget* p, Qt::WindowFlags f = 0); void Show(bool fromSequence); bool EarlyClip(); bool YAxisUp(); @@ -132,7 +132,7 @@ private: TwoButtonComboWidget* m_Tbcw; QLineEdit* m_PrefixEdit; QLineEdit* m_SuffixEdit; - FractoriumSettings* m_Settings; + shared_ptr m_Settings; Fractorium* m_Fractorium; shared_ptr m_Info; vector m_Wrappers; diff --git a/Source/Fractorium/FinalRenderEmberController.cpp b/Source/Fractorium/FinalRenderEmberController.cpp index 446de21..38655ca 100644 --- a/Source/Fractorium/FinalRenderEmberController.cpp +++ b/Source/Fractorium/FinalRenderEmberController.cpp @@ -14,7 +14,7 @@ FinalRenderEmberControllerBase::FinalRenderEmberControllerBase(FractoriumFinalRe m_FinalRenderDialog(finalRenderDialog) { m_FinishedImageCount.store(0); - m_Settings = m_Fractorium->m_Settings; + m_Settings = FractoriumSettings::DefInstance(); } /// @@ -28,8 +28,8 @@ void FinalRenderEmberController::CancelRender() { if (m_Result.isRunning()) { - tbb::task_group g; - g.run([&] + //tbb::task_group g; + std::thread th([&] { m_Run = false; @@ -61,7 +61,7 @@ void FinalRenderEmberController::CancelRender() } } }); - g.wait(); + Join(th); while (m_Result.isRunning()) QApplication::processEvents(); diff --git a/Source/Fractorium/FinalRenderEmberController.h b/Source/Fractorium/FinalRenderEmberController.h index 86b5a10..69ee122 100644 --- a/Source/Fractorium/FinalRenderEmberController.h +++ b/Source/Fractorium/FinalRenderEmberController.h @@ -81,7 +81,7 @@ protected: QFuture m_Result; std::function m_FinalRenderFunc; - FractoriumSettings* m_Settings; + shared_ptr m_Settings; FractoriumFinalRenderDialog* m_FinalRenderDialog; FinalRenderGuiState m_GuiState; std::recursive_mutex m_ProgressCs; @@ -161,7 +161,7 @@ public: using PreviewRenderer::m_PreviewEmber; using PreviewRenderer::m_PreviewRenderer; using PreviewRenderer::m_PreviewFinalImage; - + FinalRenderPreviewRenderer(FinalRenderEmberController* controller) : m_Controller(controller) { } diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp index f37508d..e0135da 100644 --- a/Source/Fractorium/Fractorium.cpp +++ b/Source/Fractorium/Fractorium.cpp @@ -45,13 +45,13 @@ Fractorium::Fractorium(QWidget* p) m_VarSortMode = 1;//Sort by weight by default. m_PaletteSortMode = 0;//Sort by palette ascending by default. m_ColorDialog = new QColorDialog(this); - m_Settings = new FractoriumSettings(this); + m_Settings = FractoriumSettings::Instance(); m_QssDialog = new QssDialog(this); m_FileDialog = nullptr;//Use lazy instantiation upon first use. m_FolderDialog = nullptr; - m_FinalRenderDialog = new FractoriumFinalRenderDialog(m_Settings, this); - m_OptionsDialog = new FractoriumOptionsDialog(m_Settings, this); - m_VarDialog = new FractoriumVariationsDialog(m_Settings, this); + m_FinalRenderDialog = new FractoriumFinalRenderDialog(this); + m_OptionsDialog = new FractoriumOptionsDialog(this); + m_VarDialog = new FractoriumVariationsDialog(this); m_AboutDialog = new FractoriumAboutDialog(this); //Put the about dialog in the screen center. const QRect screen = QApplication::desktop()->screenGeometry(); @@ -157,6 +157,7 @@ Fractorium::Fractorium(QWidget* p) if (ifs.is_open()) { string total, qs; + total.reserve(20 * 1024); while (std::getline(ifs, qs)) total += qs + "\n"; @@ -213,9 +214,9 @@ Fractorium::~Fractorium() /// The cartesian world y coordinate void Fractorium::SetCoordinateStatus(int rasX, int rasY, float worldX, float worldY) { - //Use sprintf rather than allocating and concatenating 6 QStrings for efficiency since this is called on every mouse move. - sprintf_s(m_CoordinateString, sizeof(m_CoordinateString), "Window: %4d, %4d World: %2.2f, %2.2f", rasX, rasY, worldX, worldY); - m_CoordinateStatusLabel->setText(QString(m_CoordinateString)); + static QString coords; + coords.sprintf("Window: %4d, %4d World: %2.2f, %2.2f", rasX, rasY, worldX, worldY); + m_CoordinateStatusLabel->setText(coords); } /// @@ -327,10 +328,10 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e) //Require shift for deleting to prevent it from triggering when the user enters delete in the edit box. if (ke->key() == Qt::Key_Delete && e->type() == QEvent::KeyRelease && shift) { - auto p = GetCurrentEmberIndex(); + auto v = GetCurrentEmberIndex(); - if (ui.LibraryTree->topLevelItem(0)->childCount() > 1 && p.second) - OnDelete(p); + if (ui.LibraryTree->topLevelItem(0)->childCount() > 1) + OnDelete(v); } } } diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index 767b7f0..1dadae7 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -162,7 +162,7 @@ public slots: //Library. void OnEmberTreeItemChanged(QTreeWidgetItem* item, int col); void OnEmberTreeItemDoubleClicked(QTreeWidgetItem* item, int col); - void OnDelete(const pair& p); + void OnDelete(const vector>& v); void OnSequenceTreeItemChanged(QTreeWidgetItem* item, int col); void OnSequenceStartPreviewsButtonClicked(bool checked); void OnSequenceStopPreviewsButtonClicked(bool checked); @@ -175,6 +175,7 @@ public slots: void OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int state); void OnSequenceRandomizeRotationsCheckBoxStateChanged(int state); void OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int state); + void OnSequenceRandomizeRotationsPerBlendCheckBoxStateChanged(int state); void OnSequenceStaggerSpinBoxChanged(double d); void OnSequenceRandomStaggerMaxSpinBoxChanged(double d); void OnSequenceStartFlameSpinBoxChanged(int d); @@ -370,7 +371,7 @@ private: void SyncOptionsToToolbar(); //Library. - pair GetCurrentEmberIndex(); + vector> GetCurrentEmberIndex(); void SyncSequenceSettings(); //Params. @@ -459,7 +460,7 @@ private: DoubleSpinBox* m_XformWeightSpin; SpinnerButtonWidget* m_XformWeightSpinnerButtonWidget; QFormLayout* m_XformsSelectionLayout; - QVector m_XformSelections; + vector m_XformSelections; //Xforms Color. QTableWidgetItem* m_XformColorValueItem; @@ -522,13 +523,7 @@ private: QProgressBar* m_ProgressBar; QLabel* m_RenderStatusLabel; QLabel* m_CoordinateStatusLabel; - FractoriumSettings* m_Settings; - char m_ULString[64]; - char m_URString[64]; - char m_LRString[64]; - char m_LLString[64]; - char m_WHString[64]; - char m_DEString[64]; + shared_ptr m_Settings; char m_CoordinateString[128]; QColor m_XformComboColors[XFORM_COLOR_COUNT], m_FinalXformComboColor; QIcon m_XformComboIcons[XFORM_COLOR_COUNT], m_FinalXformComboIcon; diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui index 8c119da..c9155f2 100644 --- a/Source/Fractorium/Fractorium.ui +++ b/Source/Fractorium/Fractorium.ui @@ -6,7 +6,7 @@ 0 0 - 1451 + 1712 1054 @@ -74,7 +74,7 @@ 0 0 - 1016 + 1284 987 @@ -143,7 +143,7 @@ - <html><head/><body><p>Apply adjustments to all flames in the file. Also applies to flatten/unflatten menu items.</p></body></html> + <html><head/><body><p>Apply adjustments to all flames in the file.</p><p>Also applies to flatten/unflatten menu items and some other xform operations.</p></body></html> Apply All @@ -318,6 +318,9 @@ Sub Batch Size + + <html><head/><body><p>Iteration is broken up into chunks, and after each chunk the point trajectory is set to a random number before beginning the next chunk.</p><p>For images which need a tighter, more concentrated look, increase this value because larger values reset the trajectory less often.</p><p>In practice, this has no noticeable effect on most images and therefore will almost never need to be adjusted.</p></body></html> + @@ -328,6 +331,9 @@ Fuse Count + + <html><head/><body><p>The number of iterations discarded at the beginning of each sub batch.</p><p>For images which need a tighter, more concentrated look, increase this value because larger values allow greater convergence before plotting.</p><p>In practice, this has no noticeable effect on most images and therefore will almost never need to be adjusted.</p></body></html> + @@ -338,6 +344,9 @@ Quality + + <html><head/><body><p>The number of iterations per pixel in the final output image. Keep this value low for a responsive UI while editing, then increase it when using the Final Render Dialog.</p><p>If this value is increased while a render is in progress, the updated value will be used once it finishes and it will pick up rendering where it left off.</p><p>This allows successive quality increases without restarting the render.</p><p>One way to increase the quality in this manner is to just type another digit in the field.</p><p>Decreases in quality will restart the process from the beginning.</p></body></html> + @@ -348,6 +357,9 @@ Supersample + + <html><head/><body><p>The value to multiply the dimensions of the histogram and density filter buffer by to help eliminate jagged lines.</p><p>During interactive editing, it should always be 1, and should only be increased when preparing for a final render. Values greater than one will significantly impact performance and will increase memory usage.</p><p>While a value of 2 offers some visual improvement, values greater than 2 usually don’t offer noticeable improvement.</p></body></html> + @@ -852,11 +864,17 @@ Width + + + Height + + + @@ -922,6 +940,9 @@ Width + + Width of the final image. Double click to sync to window width. + @@ -932,6 +953,9 @@ Height + + Height of the final image. Double click to sync to window height. + @@ -942,6 +966,9 @@ Center X + + Horizontal center of the image. Drag with the middle mouse button to pan. + @@ -952,6 +979,9 @@ Center Y + + Vertical center of the image. Drag with the middle mouse button to pan. + @@ -962,6 +992,9 @@ Scale + + Zoom level of the image. Adjust by scrolling the mouse wheel or dragging with the right mouse button. + @@ -972,6 +1005,9 @@ Zoom + + Zoom level of the image. This will greatly increase render time, so prefer using scale instead of zoom. + @@ -982,6 +1018,9 @@ Rotate + + Rotation of the image around the Z axis. Adjust by dragging the right mouse button. + @@ -990,7 +1029,10 @@ - Z Pos + Z Pos (3D) + + + Zoom used for 3D effect. Only works when at least one of the other 3D fields below have non-zero values. @@ -1000,7 +1042,10 @@ - Perspective + Perspective (3D) + + + Camera tilt angle @@ -1010,7 +1055,10 @@ - Pitch + Pitch (3D) + + + Rotation angle around the X axis @@ -1020,7 +1068,10 @@ - Yaw + Yaw (3D) + + + Rotation angle around the Z axis. This is more powerful than the Rotate field because it takes other 3D transformations into account. @@ -1030,7 +1081,10 @@ - Depth Blur + Depth Blur (3D) + + + Blurriness of points farther away on the Z axis @@ -1177,6 +1231,9 @@ Spatial Filter Width + + <html><head/><body><p>The width of the spatial filter applied to the final image.</p><p>Adjusting this value can help smooth out jagged lines. Values above 1.0 might make the image look too blurry.</p></body></html> + @@ -1187,6 +1244,9 @@ Spatial Filter Type + + The type of the spatial filter applied to the final image. Experimenting with these can provide interesting effects. + @@ -1197,6 +1257,9 @@ DE Filter Min Radius + + <html><head/><body><p>The minimum filter radius to use when performing density filtering. Increasing this value will add additional blurring even in high density areas, so it can be thought of as a sort of anti-aliasing technique.</p><p>However, larger values will result in too much blurring which is generally undesirable. This must always be less than or equal to the DE max radius.</p></body></html> + @@ -1207,6 +1270,9 @@ DE Filter Max Radius + + <html><head/><body><p>The maximum filter radius to use when performing density filtering. Increasing this value will add additional blurring only to low density areas, which is generally desirable.</p><p>This must always be greater than or equal to the DE min radius.</p></body></html> + @@ -1217,6 +1283,9 @@ DE Curve + + <html><head/><body><p>The speed with which the density filter values decrease when moving away from the center pixel being filtered.</p><p>This value will almost never need to be anything other than the default.</p></body></html> + @@ -1381,6 +1450,9 @@ Brightness + + The brightness of the final output image. + @@ -1391,6 +1463,9 @@ Gamma + + <html><head/><body><p>The gamma of the final output image.</p><p>Higher values will give better color, but will reveal more scattered points. Lower values will reduce scattered points but will wash the colors out to white.</p></body></html> + @@ -1401,6 +1476,9 @@ Gamma Threshold + + <html><head/><body><p>The gamma threshold of the final output image.</p><p>Higher values will reduce scattered points, but will also reduce color quality. Lower values will reveal more scattered points, but give better color.</p><p>This field shows 4 decimal places because it is extremely sensitive in some cases.</p></body></html> + @@ -1411,6 +1489,9 @@ Vibrancy + + <html><head/><body><p>The scale factor to apply to the alpha channel log scaling when gamma correcting the final output image.</p><p>Higher values will give more saturated colors. Lower values will wash the colors out to white.</p></body></html> + @@ -1421,6 +1502,9 @@ Highlight Power + + <html><head/><body><p>Used to mitigate over saturated areas that are too white.</p><p>A value of -1 disables this, all other values control how quickly each pixel saturates to white.</p></body></html> + @@ -1431,6 +1515,9 @@ Background + + <html><head/><body><p>The background color of the image. Click the ... button to display a color chooser dialog.</p></body></html> + @@ -1441,6 +1528,9 @@ Palette Mode + + <html><head/><body><p>The mode used for palette indexing when accumulating to the histogram. Changing this rarely makes any noticeable difference in the final image.</p><p>Step: If the specified palette index is a fraction, round down to the nearest integer.</p><p>Linear: Blend the specified index with the one after it.</p></body></html> + @@ -1664,26 +1754,41 @@ Interpolation + + <html><head/><body><p>The method to use when interpolating flames during sequence generation. Linear uses basic linear interpolation when generating all of the steps between key frames, while Smooth uses log interpolation.</p><p>The first and last key frames in a sequence must use Linear.</p></body></html> + Affine Interpolation + + <html><head/><body><p>The method to use when interpolating affine transforms during sequence generation.</p><p>Linear uses basic linear interpolation for each coefficient of affines, while Log converts to polar coordinates before interpolating.</p></body></html> + Temporal Samples + + <html><head/><body><p>The number of temporal samples used to blend between sequence frames during animation.</p><p>Even after a sequence has been generated that produces a number of steps between key frames, when performing the animation render, each of those sequence steps is blended between the surrounding sequence steps.</p><p>Temporal samples is the number of blended steps between each sequence step that get combined into a single output frame.</p><p>Values between 100 and 1000 are often used. Higher values will produce more of a motion blurring effect when animating.</p><p>When rendering a single image, this value will always be set to 1 by Fractorium right before rendering regardless of the value set in the UI.</p></body></html> + Temporal Filter Width + + <html><head/><body><p>The width of the temporal filter used during animation.</p><p>When computing the temporal samples to render, boundary frames must be computed to know what to blend between. By default this is just the sequence frames before and after the one currently being rendered.</p><p>However, the time bounds of what’s being blended can be less than that, or even greater which means it will be blended across several sequence steps.</p><p>In practice, this will almost always have its default value of 1.</p></body></html> + Temporal Filter Type + + <html><head/><body><p>The type of the temporal filter used during animation.</p><p>This is similar to the spatial filter in that the type can be chosen to produce different effects.</p></body></html> + @@ -1771,7 +1876,7 @@ - Randomize all xaos values in all xforms + <html><head/><body><p>Set all xaos values to a random decimal value between 0 and 3, inclusive.</p></body></html> Random Xaos @@ -2252,26 +2357,41 @@ Hue + + The degrees to rotate the hue of the HSV representation of the RGB color by + Contrast + + <html><head/><body><p>The difference between the lightest and darkest colors in the palette.</p><p>Negative values decrease the difference, and bring the colors toward gray.</p><p>Positive values increase the difference and make the colors more saturated.</p></body></html> + Saturation + + The percentage to add to the saturation (intensity) component of the HSV representation of the RGB color + Blur + + The width in pixels of the blurring + Brightness + + <html><head/><body><p>The value to add to each channel. Negative values bring it toward black, positive values toward white.</p></body></html> + @@ -2282,6 +2402,9 @@ Frequency + + <html><head/><body><p>The number of times to repeat the palette</p></body></html> + @@ -2353,6 +2476,9 @@ 0 + + <html><head/><body><p>Reset all of the curves to their default position. This has the effect of disabling application of the color curves.</p></body></html> + Reset Curves @@ -2423,6 +2549,9 @@ + + <html><head/><body><p>When curves are on top of each other, it can be hard to grab them with the mouse, so use these radio buttons to specify which color you intend to grab.</p><p>If they are not on top of each other, just dragging the desired dot with the mouse will work.</p></body></html> + Curve @@ -2986,6 +3115,9 @@ Qt::NoFocus + + + false @@ -3070,10 +3202,21 @@ + + + + + + + + + + + AlignLeading|AlignVCenter @@ -3377,6 +3520,9 @@ Color Speed + + <html><head/><body><p>The speed with which the color indices are pulled toward the current xform’s color index. Negative values push the color index away.</p></body></html> + @@ -3395,6 +3541,9 @@ Opacity + + <html><head/><body><p>How visible the current xform’s contribution to the image is.</p><p>0 is invisible, 1 is fully visible.</p></body></html> + @@ -3405,6 +3554,9 @@ Direct Color + + <html><head/><body><p>Amount of directly computed color value to add to the color index.</p><p>Used only with variations that use direct coloring which are usually prefixed with dc_.</p></body></html> + @@ -3445,6 +3597,9 @@ + + <html><head/><body><p>When checked, the current xform is the only visible one. This feature is useful for determining how much each xform contributes to the final image.</p><p>Note that checking this does not affect the opacity values stored in the Xml file when saved. It is only a temporary adjustment when editing within the program.</p></body></html> + Solo @@ -3489,6 +3644,9 @@ + + <html><head/><body><p>Checking this box will lock the display size of the affines at their current level, allowing for easy manipulation no matter what zoom level is used.</p><p>Unchecking this resets the scale used to draw the affines to its native value.</p><p>Note this only affects the display and does not alter any internal values used for rendering.</p></body></html> + Lock Affine Scale @@ -3513,8 +3671,8 @@ 0 0 - 118 - 672 + 263 + 700 @@ -3988,7 +4146,7 @@ - Reset xform to the identity matrix + <html><head/><body><p>Reset pre affine xform to the identity matrix</p></body></html> Reset @@ -4258,6 +4416,9 @@ 24 + + <html><head/><body><p>Set each of the six pre affine values to a separate random number between -1 and 1, inclusive.</p></body></html> + Random @@ -4267,6 +4428,9 @@ + + <html><head/><body><p>Show current only draws the current xform’s pre affine transform.</p><p>Show all draws all xforms’ pre affine transforms. This can sometimes clutter the view if the flame contains many xforms.</p></body></html> + false @@ -4731,7 +4895,7 @@ - Reset xform to the identity matrix + <html><head/><body><p>Reset post affine xform to the identity matrix</p></body></html> Reset @@ -5082,6 +5246,9 @@ 24 + + <html><head/><body><p>Set each of the six post affine values to a separate random number between -1 and 1, inclusive.</p></body></html> + Random @@ -5094,6 +5261,9 @@ true + + <html><head/><body><p>Show current only draws the current xform’s post affine transform.</p><p>Show all draws all xforms’ post affine transforms. This can sometimes clutter the view if the flame contains many xforms.</p></body></html> + false @@ -5144,6 +5314,9 @@ + + <html><head/><body><p>Check to display affine values in polar coordinates, uncheck to display them in Cartesian form.</p></body></html> + Polar @@ -5151,6 +5324,9 @@ + + <html><head/><body><p>This affects the behavior of dragging the affines in the render window.</p><p>When dragging the X or Y component of an affine transform and holding Shift+Alt:</p><p>--Local: Rotate the point around the center of the transform.</p><p>--World: Rotate the point around 0, 0.</p><p>When dragging the center of an affine transform and holding Shift:</p><p>--Local: Rotate entire transform around the origin, keeping its local orientation fixed.</p><p>--World: Rotate entire transform around the origin, also rotating the local orientation.</p><p>When reflecting an affine transform:</p><p>--Local: Reflect horizontally and vertically around the center of the transform.</p><p>--World: Reflect horizontally around the Y axis, and vertically around the X axis.</p></body></html> + false @@ -5581,8 +5757,8 @@ 0 0 - 133 - 52 + 259 + 652 @@ -5635,7 +5811,7 @@ - <html><head/><body><p>Rotate this xform when creating a sequence for animation</p></body></html> + <html><head/><body><p>Rotate this xform during the rotation phase when creating a sequence for animation</p></body></html> Animate @@ -5767,6 +5943,9 @@ Summary + + <html><head/><body><p>A rough overview of the attributes of the current flame</p></body></html> + 5 @@ -6104,6 +6283,9 @@ Bounds + + <html><head/><body><p>Information that is only useful as an engineering interest, and a log output in the event something went wrong</p></body></html> + 0 @@ -6586,7 +6768,7 @@ 0 0 - 1451 + 1712 21 @@ -6778,6 +6960,9 @@ Qt::MoveAction + + QAbstractItemView::ExtendedSelection + QAbstractItemView::SelectRows @@ -6811,8 +6996,8 @@ 0 0 - 424 - 589 + 432 + 572 @@ -6842,6 +7027,369 @@ 4 + + + + 4 + + + + + + 0 + 0 + + + + + 95 + 0 + + + + <html><head/><body><p>The number of times the xforms will do a 360 degree rotation while interpolating from one keyframe to the next. Note that only xforms which have the animate flag set to true will be rotated.</p><p>Set to 0 to omit rotation while interpolating.</p></body></html> + + + QAbstractSpinBox::NoButtons + + + Rot per blend: + + + 100 + + + 1 + + + + + + + <html><head/><body><p>Direction of rotation during interpolation. Clockwise vs. counter clockwise.</p></body></html> + + + CW + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Check any checkbox to have the value corresponding to its row be randomly selected between the values of first and second controls on that row</p></body></html> + + + Qt::LeftToRight + + + Random + + + + + + + + 0 + 0 + + + + <html><head/><body><p>The number of frames used to interpolate from one keyframe to the next. Larger values give slower movement.</p></body></html> + + + QAbstractSpinBox::NoButtons + + + + + + Blend frames: + + + 10000 + + + 120 + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + 125 + 16777215 + + + + <html><head/><body><p>The 0-based index of the first flame in the file to start the sequence with</p></body></html> + + + QAbstractSpinBox::NoButtons + + + Start flame: + + + 999999999 + + + 0 + + + + + + + false + + + QAbstractSpinBox::NoButtons + + + Blend frames max: + + + 10000 + + + 120 + + + + + + + false + + + QAbstractSpinBox::NoButtons + + + Rotations max: + + + 10000.000000000000000 + + + 3.000000000000000 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + <html><head/><body><p>The starting number to use as the name of the first flame in the sequence. This is useful when using an animation program that expects a certain number for the filename.</p></body></html> + + + true + + + QAbstractSpinBox::NoButtons + + + Start count: + + + 999999999 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + <html><head/><body><p>The 0-based index of the last flame in the file to end the sequence on</p></body></html> + + + QAbstractSpinBox::NoButtons + + + Stop flame: + + + 999999999 + + + + + + + + 0 + 0 + + + + + 33 + 0 + + + + + 16777215 + 16777215 + + + + All + + + + + + + + 0 + 0 + + + + Start Previews + + + + + + + false + + + QAbstractSpinBox::NoButtons + + + Stagger max: + + + 1.000000000000000 + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + + 0 + 0 + + + + <html><head/><body><p>A decimal number between 0 and 1 which governs the xform interpolation behavior like so:</p><p> 0 (default): xforms will interpolate all at once.</p><p> 0.5: the interpolation of each xform is staggered so that when the first xform is half done, the second one starts, and so on.</p><p> 1: each xform interpolates consecutively with no overlap.</p></body></html> + + + QAbstractSpinBox::NoButtons + + + Stagger: + + + 1.000000000000000 + + + 0.100000000000000 + + + + + + + + 0 + 0 + + + + Stop Previews + + + + + + + false + + + QAbstractSpinBox::NoButtons + + + Rot per blend max: + + + 0 + + + @@ -6850,6 +7398,9 @@ 0 + + <html><head/><body><p>The number of frames for each rotation specified by Rotations. Larger values give slower movement.</p></body></html> + QAbstractSpinBox::NoButtons @@ -6867,29 +7418,7 @@ - - - - - 0 - 0 - - - - QAbstractSpinBox::NoButtons - - - Rotations: - - - 10000.000000000000000 - - - 3.000000000000000 - - - - + @@ -6936,86 +7465,7 @@ - - - - - 0 - 0 - - - - Qt::LeftToRight - - - Random - - - - - - - - 0 - 0 - - - - QAbstractSpinBox::NoButtons - - - - - - Blend frames: - - - 10000 - - - 120 - - - - - - - false - - - QAbstractSpinBox::NoButtons - - - Blend max frames: - - - 10000 - - - 120 - - - - - - - false - - - QAbstractSpinBox::NoButtons - - - Rotations max: - - - 10000.000000000000000 - - - 3.000000000000000 - - - - + @@ -7028,194 +7478,50 @@ - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - - 125 - 16777215 - - - - QAbstractSpinBox::NoButtons - - - Start flame: - - - 999999999 - - - 0 - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - QAbstractSpinBox::NoButtons - - - Stop flame: - - - 999999999 - - - - - - - - 0 - 0 - - - - - 33 - 0 - - - - - 16777215 - 16777215 - - - - All - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - true - - - QAbstractSpinBox::NoButtons - - - Start count: - - - 999999999 - - - - - - - - 0 - 0 - - - - Start Previews - - - - - - - - 0 - 0 - - - - Stop Previews - - - - - - - 0 - 0 - + + + QLayout::SetDefaultConstraint - - QAbstractSpinBox::NoButtons + + 4 - - Stagger: - - - 1.000000000000000 - - - 0.100000000000000 - - - - - - - false - - - QAbstractSpinBox::NoButtons - - - Stagger max: - - - 1.000000000000000 - - - 0.100000000000000 - - - 1.000000000000000 - - + + + + + 0 + 0 + + + + <html><head/><body><p>The number of times the xforms of a keyframe will do a 360 degree rotation before moving on to the next interpolation step. Note that only xforms which have the animate flag set to true will be rotated.</p><p>Set to 0 to omit rotation before interpolating.</p></body></html> + + + QAbstractSpinBox::NoButtons + + + Rotations: + + + 10000.000000000000000 + + + 3.000000000000000 + + + + + + + <html><head/><body><p>Direction of loop rotation. Clockwise vs. counter clockwise.</p></body></html> + + + CW + + + + @@ -7226,6 +7532,9 @@ + + <html><head/><body><p>Generate the sequence from the main library file, using the values specified in the controls.</p><p>When sequence generation completes, the thumbnails will begin rendering. Click Stop Previews to abort this process.</p></body></html> + Generate @@ -7233,6 +7542,9 @@ + + <html><head/><body><p>Send the generated sequence to the Final Render dialog with the Render All and Render as Animation Sequence checkboxes automatically checked</p></body></html> + Render @@ -7240,6 +7552,9 @@ + + <html><head/><body><p>Save the generated sequence out as a file</p></body></html> + Save @@ -7247,6 +7562,9 @@ + + <html><head/><body><p>Open an existing sequence file to be loaded into the sequence tree.</p><p>More than one file can be selected, although this may not give a visually appealing sequence if the flames used to create them were not contiguous between files.</p></body></html> + Open diff --git a/Source/Fractorium/FractoriumCommon.h b/Source/Fractorium/FractoriumCommon.h index 43f6554..893b1aa 100644 --- a/Source/Fractorium/FractoriumCommon.h +++ b/Source/Fractorium/FractoriumCommon.h @@ -1,6 +1,7 @@ #pragma once #include "FractoriumPch.h" +#include "FractoriumSettings.h" /// /// Fractorium global utility functions. @@ -30,6 +31,7 @@ template static void SetupSpinner(QTableWidget* table, const QObject* receiver, int& row, int col, spinType*& spinBox, int height, valType min, valType max, valType step, const char* signal, const char* slot, bool incRow = true, valType val = 0, valType doubleClickZero = -999, valType doubleClickNonZero = -999) { + auto settings = FractoriumSettings::DefInstance(); spinBox = new spinType(table, height, step); spinBox->setRange(min, max); spinBox->setValue(val); @@ -450,3 +452,21 @@ bool ConstrainHigh(T* low, T* high) return false; } + +/// +/// Move all, possibly disjointly, selected items in a range to +/// a new location and update all existing locations. +/// Atribution: Sean Parent, Going Native 2013. +/// +/// The location of the first selected item, or the start of the collection. +/// The location of the last selected item, or the end of the collection. +/// A pair of iterators representing the start and end locations of the list of newly moved items +template +pair Gather(I f, I l, I p, S s) +{ + return + { + stable_partition(f, p, [&](const typename iterator_traits::value_type & x) { return !s(x); }), + stable_partition(p, l, s) + }; +} diff --git a/Source/Fractorium/FractoriumEmberController.cpp b/Source/Fractorium/FractoriumEmberController.cpp index 99e13e6..cd120e7 100644 --- a/Source/Fractorium/FractoriumEmberController.cpp +++ b/Source/Fractorium/FractoriumEmberController.cpp @@ -151,7 +151,10 @@ void FractoriumEmberController::SetEmber(size_t index, bool verbatim) for (int i = 0; i < top->childCount(); i++) { if (auto emberItem = dynamic_cast*>(top->child(i))) + { emberItem->setSelected(i == index); + emberItem->setCheckState(0, i == index ? Qt::Checked : Qt::Unchecked); + } } } @@ -228,9 +231,9 @@ void FractoriumEmberController::UpdateXform(std::function*)> fu while (auto xform = m_Ember.GetTotalXform(i)) { - if (auto child = m_Fractorium->m_XformsSelectionLayout->itemAt(i)) + if (i < m_Fractorium->m_XformSelections.size()) { - if (auto w = qobject_cast(child->widget())) + if (auto w = m_Fractorium->m_XformSelections[i]) { if (w->isChecked()) { @@ -257,9 +260,9 @@ void FractoriumEmberController::UpdateXform(std::function*)> fu while (auto xform = (doFinal ? m_Ember.GetTotalXform(i) : m_Ember.GetXform(i))) { - if (auto child = m_Fractorium->m_XformsSelectionLayout->itemAt(i)) + if (i < m_Fractorium->m_XformSelections.size()) { - if (auto w = qobject_cast(child->widget())) + if (auto w = m_Fractorium->m_XformSelections[i]) { if (w->isChecked()) { diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h index 44c46ff..548a090 100644 --- a/Source/Fractorium/FractoriumEmberController.h +++ b/Source/Fractorium/FractoriumEmberController.h @@ -127,8 +127,8 @@ public: virtual void StopLibraryPreviewRender() { } virtual void StopSequencePreviewRender() { } virtual void StopAllPreviewRenderers() { } - virtual void MoveLibraryItems(int startRow, int destRow) { } - virtual void Delete(const pair& p) { } + virtual void MoveLibraryItems(const QModelIndexList& items, int destRow) { } + virtual void Delete(const vector>& v) { } virtual void FillSequenceTree() { } virtual void SequenceGenerateButtonClicked() { } virtual void SequenceSaveButtonClicked() { } @@ -191,6 +191,8 @@ public: virtual void RandomXformsAffine(bool pre) { } virtual void FillBothAffines() { } double LockedScale() { return m_LockedScale; } + double LockedX() { return m_LockedX; } + double LockedY() { return m_LockedY; } void LockedScale(double scale) { m_LockedScale = scale; } virtual void LockAffineScaleCheckBoxStateChanged(int state) { } @@ -265,6 +267,8 @@ protected: uint m_FailedRenders = 0; size_t m_UndoIndex = 0; double m_LockedScale = 1; + double m_LockedX = 0; + double m_LockedY = 0; eRendererType m_RenderType = eRendererType::CPU_RENDERER; eEditUndoState m_EditState; GLuint m_OutputTexID = 0; @@ -372,8 +376,8 @@ public: virtual void SyncLibrary(eLibraryUpdate update) override; virtual void FillLibraryTree(int selectIndex = -1) override; virtual void UpdateLibraryTree() override; - virtual void MoveLibraryItems(int startRow, int destRow) override; - virtual void Delete(const pair& p) override; + virtual void MoveLibraryItems(const QModelIndexList& items, int destRow) override; + virtual void Delete(const vector>& v) override; virtual void EmberTreeItemChanged(QTreeWidgetItem* item, int col) override; virtual void EmberTreeItemDoubleClicked(QTreeWidgetItem* item, int col) override; void RenderPreviews(QTreeWidget* tree, TreePreviewRenderer* renderer, EmberFile& file, uint start = UINT_MAX, uint end = UINT_MAX); @@ -477,6 +481,10 @@ public: virtual void ClearXaos() override; virtual void RandomXaos() override; + //Xforms Selection. + bool XformCheckboxAt(int i, std::function func); + bool XformCheckboxAt(Xform* xform, std::function func); + //Palette. virtual size_t InitPaletteList(const string& s) override; virtual bool FillPaletteTable(const string& s) override; @@ -512,8 +520,6 @@ private: //Xforms Selection. QString MakeXformCaption(size_t i); - bool XformCheckboxAt(int i, std::function func); - bool XformCheckboxAt(Xform* xform, std::function func); //Palette. void UpdateAdjustedPaletteGUI(Palette& palette); @@ -624,7 +630,7 @@ public: using PreviewRenderer::m_PreviewEmber; using PreviewRenderer::m_PreviewRenderer; using PreviewRenderer::m_PreviewFinalImage; - + /// /// Initializes a new instance of the class. /// diff --git a/Source/Fractorium/FractoriumInfo.cpp b/Source/Fractorium/FractoriumInfo.cpp index 3d4a103..b66d789 100644 --- a/Source/Fractorium/FractoriumInfo.cpp +++ b/Source/Fractorium/FractoriumInfo.cpp @@ -183,25 +183,28 @@ void Fractorium::FillSummary() /// void Fractorium::UpdateHistogramBounds() { - if (RendererBase* r = m_Controller->Renderer()) + static QString ul, ur, lr, ll, wh, g, de; + + if (auto r = m_Controller->Renderer()) { - sprintf_s(m_ULString, sizeof(m_ULString), "UL: %3.3f, %3.3f", r->LowerLeftX(), r->UpperRightY());//These bounds include gutter padding. - sprintf_s(m_URString, sizeof(m_URString), "UR: %3.3f, %3.3f", -r->LowerLeftX(), r->UpperRightY()); - sprintf_s(m_LRString, sizeof(m_LRString), "LR: %3.3f, %3.3f", -r->LowerLeftX(), r->LowerLeftY()); - sprintf_s(m_LLString, sizeof(m_LLString), "LL: %3.3f, %3.3f", r->LowerLeftX(), r->LowerLeftY()); - sprintf_s(m_WHString, sizeof(m_WHString), "W x H: %4lu x %4lu", r->SuperRasW(), r->SuperRasH()); - ui.InfoBoundsLabelUL->setText(QString(m_ULString)); - ui.InfoBoundsLabelUR->setText(QString(m_URString)); - ui.InfoBoundsLabelLR->setText(QString(m_LRString)); - ui.InfoBoundsLabelLL->setText(QString(m_LLString)); - ui.InfoBoundsLabelWH->setText(QString(m_WHString)); - ui.InfoBoundsTable->item(0, 1)->setText(ToString(r->GutterWidth())); + ul.sprintf("UL: %3.3f, %3.3f", r->LowerLeftX(), r->UpperRightY());//These bounds include gutter padding. + ur.sprintf("UR: %3.3f, %3.3f", -r->LowerLeftX(), r->UpperRightY()); + lr.sprintf("LR: %3.3f, %3.3f", -r->LowerLeftX(), r->LowerLeftY()); + ll.sprintf("LL: %3.3f, %3.3f", r->LowerLeftX(), r->LowerLeftY()); + wh.sprintf("W x H: %4u x %4u", r->SuperRasW(), r->SuperRasH()); + g.sprintf("%u", (uint)r->GutterWidth()); + ui.InfoBoundsLabelUL->setText(ul); + ui.InfoBoundsLabelUR->setText(ur); + ui.InfoBoundsLabelLR->setText(lr); + ui.InfoBoundsLabelLL->setText(ll); + ui.InfoBoundsLabelWH->setText(wh); + ui.InfoBoundsTable->item(0, 1)->setText(g); if (r->GetDensityFilter()) { - uint deWidth = (r->GetDensityFilter()->FilterWidth() * 2) + 1; - sprintf_s(m_DEString, sizeof(m_DEString), "%d x %d", deWidth, deWidth); - ui.InfoBoundsTable->item(1, 1)->setText(QString(m_DEString)); + auto deWidth = (r->GetDensityFilter()->FilterWidth() * 2) + 1; + de.sprintf("%d x %d", deWidth, deWidth); + ui.InfoBoundsTable->item(1, 1)->setText(de); } else ui.InfoBoundsTable->item(1, 1)->setText("N/A"); diff --git a/Source/Fractorium/FractoriumLibrary.cpp b/Source/Fractorium/FractoriumLibrary.cpp index 3d5b49a..fca1a3d 100644 --- a/Source/Fractorium/FractoriumLibrary.cpp +++ b/Source/Fractorium/FractoriumLibrary.cpp @@ -26,31 +26,33 @@ void Fractorium::InitLibraryUI() connect(ui.SequenceRenderButton, SIGNAL(clicked(bool)), this, SLOT(OnSequenceRenderButtonClicked(bool)), Qt::QueuedConnection); connect(ui.SequenceSaveButton, SIGNAL(clicked(bool)), this, SLOT(OnSequenceSaveButtonClicked(bool)), Qt::QueuedConnection); connect(ui.SequenceOpenButton, SIGNAL(clicked(bool)), this, SLOT(OnSequenceOpenButtonClicked(bool)), Qt::QueuedConnection); - connect(ui.SequenceRandomizeStaggerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeStaggerCheckBoxStateChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceRandomizeFramesPerRotCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceRandomizeRotationsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeRotationsCheckBoxStateChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceRandomizeBlendFramesCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceStaggerSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceStaggerSpinBoxChanged(double)), Qt::QueuedConnection); - connect(ui.SequenceRandomStaggerMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRandomStaggerMaxSpinBoxChanged(double)), Qt::QueuedConnection); - connect(ui.SequenceStartFlameSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceStartFlameSpinBoxChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceStopFlameSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceStopFlameSpinBoxChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceFramesPerRotSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceFramesPerRotSpinBoxChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceRandomFramesPerRotMaxSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceRandomFramesPerRotMaxSpinBoxChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceRotationsSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRotationsSpinBoxChanged(double)), Qt::QueuedConnection); - connect(ui.SequenceRandomRotationsMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRandomRotationsMaxSpinBoxChanged(double)), Qt::QueuedConnection); - connect(ui.SequenceBlendFramesSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceBlendFramesSpinBoxChanged(int)), Qt::QueuedConnection); - connect(ui.SequenceRandomBlendMaxFramesSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceRandomBlendMaxFramesSpinBoxChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomizeStaggerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeStaggerCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomizeFramesPerRotCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomizeRotationsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeRotationsCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomizeBlendFramesCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomizeRotationsPerBlendCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnSequenceRandomizeRotationsPerBlendCheckBoxStateChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceStaggerSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceStaggerSpinBoxChanged(double)), Qt::QueuedConnection); + connect(ui.SequenceRandomStaggerMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRandomStaggerMaxSpinBoxChanged(double)), Qt::QueuedConnection); + connect(ui.SequenceStartFlameSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceStartFlameSpinBoxChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceStopFlameSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceStopFlameSpinBoxChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceFramesPerRotSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceFramesPerRotSpinBoxChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomFramesPerRotMaxSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceRandomFramesPerRotMaxSpinBoxChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRotationsSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRotationsSpinBoxChanged(double)), Qt::QueuedConnection); + connect(ui.SequenceRandomRotationsMaxSpinBox, SIGNAL(valueChanged(double)), this, SLOT(OnSequenceRandomRotationsMaxSpinBoxChanged(double)), Qt::QueuedConnection); + connect(ui.SequenceBlendFramesSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceBlendFramesSpinBoxChanged(int)), Qt::QueuedConnection); + connect(ui.SequenceRandomBlendMaxFramesSpinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSequenceRandomBlendMaxFramesSpinBoxChanged(int)), Qt::QueuedConnection); } /// /// Get the index of the currently selected ember in the library tree. /// /// A pair containing the index of the item clicked and a pointer to the item -pair Fractorium::GetCurrentEmberIndex() +vector> Fractorium::GetCurrentEmberIndex() { int index = 0; QTreeWidgetItem* item = nullptr; auto tree = ui.LibraryTree; + vector> v; if (auto top = tree->topLevelItem(0)) { @@ -58,14 +60,14 @@ pair Fractorium::GetCurrentEmberIndex() { item = top->child(index); - if (item && !item->isSelected()) - index++; - else - break; + if (item && item->isSelected()) + v.push_back(make_pair(index, item)); + + index++; } } - return make_pair(index, item); + return v; } /// @@ -218,6 +220,9 @@ void FractoriumEmberController::EmberTreeItemChanged(QTreeWidgetItem* item, i if (auto emberItem = dynamic_cast*>(item)) { + if (!emberItem->isSelected())//Checking/unchecking other items shouldn't perform the processing below. + return; + if (emberItem->text(0).isEmpty())//Prevent empty string. { emberItem->UpdateEditText(); @@ -225,11 +230,16 @@ void FractoriumEmberController::EmberTreeItemChanged(QTreeWidgetItem* item, i } string oldName = emberItem->GetEmber()->m_Name;//First preserve the previous name. + string newName = emberItem->text(0).toStdString(); + + if (oldName == newName)//If nothing changed, nothing to do. + return; + tree->blockSignals(true); emberItem->UpdateEmberName();//Copy edit text to the ember's name variable. m_EmberFile.MakeNamesUnique();//Ensure all names remain unique. SyncLibrary(eLibraryUpdate::NAME);//Copy all ember names to the tree items since some might have changed to be made unique. - string newName = emberItem->GetEmber()->m_Name;//Get the new, final, unique name. + newName = emberItem->GetEmber()->m_Name;//Get the new, final, unique name. if (m_EmberFilePointer == emberItem->GetEmber() && oldName != newName)//If the ember edited was the current one, and the name was indeed changed, update the name of the current one. { @@ -263,20 +273,15 @@ void Fractorium::OnEmberTreeItemChanged(QTreeWidgetItem* item, int col) { m_Cont /// Clears the undo state. /// Resets the rendering process. /// Called when the user double clicks on a library tree item. -/// This will get called twice for some reason, and there's no way to prevent it. -/// Doesn't seem to cause any problems. +/// This will get called twice for some reason, so the check state is checked to prevent duplicate processing. /// /// The item double clicked on -/// The column clicked, ignored. +/// The column clicked template void FractoriumEmberController::EmberTreeItemDoubleClicked(QTreeWidgetItem* item, int col) { - if (auto emberItem = dynamic_cast*>(item)) - { - //qDebug() << "Setting current ember to: " << QString::fromStdString(emberItem->GetEmber()->m_Name); - ClearUndo(); - SetEmber(*emberItem->GetEmber(), false, true); - } + if (item->checkState(col) == Qt::Unchecked) + SetEmber(m_Fractorium->ui.LibraryTree->currentIndex().row(), false); } void Fractorium::OnEmberTreeItemDoubleClicked(QTreeWidgetItem* item, int col) { m_Controller->EmberTreeItemDoubleClicked(item, col); } @@ -287,32 +292,56 @@ void Fractorium::OnEmberTreeItemDoubleClicked(QTreeWidgetItem* item, int col) { /// The index of the source item to move /// The destination index to move the item to template -void FractoriumEmberController::MoveLibraryItems(int startRow, int destRow) +void FractoriumEmberController::MoveLibraryItems(const QModelIndexList& items, int destRow) { int i = 0; + auto startRow = items[0].row(); auto tree = m_Fractorium->ui.LibraryTree; auto top = tree->topLevelItem(0); + list names; + + for (auto& item : items) + if (auto temp = m_EmberFile.Get(item.row())) + names.push_back(QString::fromStdString(temp->m_Name)); + auto b = m_EmberFile.m_Embers.begin(); - auto s = Advance(b, startRow); - auto d = Advance(b, destRow); - m_EmberFile.m_Embers.splice(d, m_EmberFile.m_Embers, s); - SyncLibrary(eLibraryUpdate::INDEX);//Only indices need syncing. + auto result = Gather(b, m_EmberFile.m_Embers.end(), Advance(b, destRow), [&](const Ember& ember) + { + auto qname = QString::fromStdString(ember.m_Name); + auto position = std::find(names.begin(), names.end(), qname); + + if (position != names.end()) + { + names.erase(position); + return true; + } + + return false; + }); + SyncLibrary(eLibraryUpdate(eLibraryUpdate::INDEX | eLibraryUpdate::POINTER)); } /// -/// Delete the currently selected item in the tree. -/// Note this is not necessarilly the current ember, it's just the item -/// in the tree that is selected. +/// Delete the currently selected items in the tree. +/// Note this is not necessarilly the current ember, it's just the items +/// in the tree that are selected. /// -/// A pair containing the index of the item clicked and a pointer to the item +/// A vector of pairs, each containing the index of the item selected and a pointer to the item template -void FractoriumEmberController::Delete(const pair& p) +void FractoriumEmberController::Delete(const vector>& v) { - if (m_EmberFile.Delete(p.first)) + size_t offset = 0; + + for (auto& p : v) { - delete p.second; - SyncLibrary(eLibraryUpdate::INDEX); - m_Fractorium->SyncFileCountToSequenceCount(); + if (p.second && m_EmberFile.Delete(p.first - offset)) + { + delete p.second; + SyncLibrary(eLibraryUpdate::INDEX); + m_Fractorium->SyncFileCountToSequenceCount(); + } + + offset++; } //If there is now only one item left and it wasn't selected, select it. @@ -327,10 +356,10 @@ void FractoriumEmberController::Delete(const pair& /// Called when the user presses and releases the delete key while the library tree has the focus, /// and an item is selected. /// -/// A pair containing the index of the item clicked and a pointer to the item -void Fractorium::OnDelete(const pair& p) +/// A vector of pairs, each containing the index of the item selected and a pointer to the item +void Fractorium::OnDelete(const vector>& v) { - m_Controller->Delete(p); + m_Controller->Delete(v); } /// @@ -506,18 +535,30 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() Ember result; auto& ui = m_Fractorium->ui; auto s = m_Fractorium->m_Settings; + //Bools for determining whether to use hard coded vs. random values. bool randStagger = ui.SequenceRandomizeStaggerCheckBox->isChecked(); bool randFramesRot = ui.SequenceRandomizeFramesPerRotCheckBox->isChecked(); bool randRot = ui.SequenceRandomizeRotationsCheckBox->isChecked(); bool randBlend = ui.SequenceRandomizeBlendFramesCheckBox->isChecked(); + bool randBlendRot = ui.SequenceRandomizeRotationsPerBlendCheckBox->isChecked(); + //The direction to rotate the loops. + bool loopsCw = ui.SequenceRotationsCWCheckBox->isChecked(); + bool loopsBlendCw = ui.SequenceRotationsPerBlendCWCheckBox->isChecked(); + //Whether to stagger, default is 1 which means no stagger. double stagger = ui.SequenceStaggerSpinBox->value(); double staggerMax = ui.SequenceRandomStaggerMaxSpinBox->value(); + //Rotations on keyframes. double rots = ui.SequenceRotationsSpinBox->value(); double rotsMax = ui.SequenceRandomRotationsMaxSpinBox->value(); + //Number of frames it takes to rotate a keyframe. int framesPerRot = ui.SequenceFramesPerRotSpinBox->value(); int framesPerRotMax = ui.SequenceRandomFramesPerRotMaxSpinBox->value(); + //Number of frames it takes to interpolate. int framesBlend = ui.SequenceBlendFramesSpinBox->value(); int framesBlendMax = ui.SequenceRandomBlendMaxFramesSpinBox->value(); + //Number of rotations performed during interpolation. + int rotsPerBlend = ui.SequenceRotationsPerBlendSpinBox->value(); + int rotsPerBlendMax = ui.SequenceRotationsPerBlendMaxSpinBox->value(); size_t start = ui.SequenceStartFlameSpinBox->value(); size_t stop = ui.SequenceStopFlameSpinBox->value(); size_t startCount = ui.SequenceStartCountSpinBox->value(); @@ -533,6 +574,24 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() #else "~/.config/fractorium"; #endif + + if (!randRot && !randBlend) + { + if ((!rots || !framesPerRot) && !framesBlend) + { + QMessageBox::critical(m_Fractorium, "Animation sequence parameters error", + "Rotations and Frames per rot, or blend frames must be positive and non-zero"); + return; + } + + if (framesPerRot > 1 && !rots)//Because framesPerRot control has a min value of 1, check greater than 1. Also don't need to check the inverse like in EmberGenome. + { + QMessageBox::critical(m_Fractorium, "Animation sequence parameters error", + "Frames per rot cannot be positive while Rotations is zero"); + return; + } + } + SheepTools tools(palettePath, EmberCommon::CreateRenderer(eRendererType::CPU_RENDERER, devices, false, 0, emberReport)); tools.SetSpinParams(true, stagger,//Will be set again below if random is used. @@ -584,7 +643,7 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() for (frame = 0; frame < roundFrames; frame++) { blend = frame / rotFrames; - tools.Spin(embers[0], nullptr, result, startCount + frameCount++, blend);//Result is cleared and reassigned each time inside of Spin(). + tools.Spin(embers[0], nullptr, result, startCount + frameCount++, blend, loopsCw);//Result is cleared and reassigned each time inside of Spin(). FormatName(result, os, padding); m_SequenceFile.m_Embers.push_back(result); } @@ -594,7 +653,7 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() //result will be the starting point for the interp phase below. frame = roundFrames; blend = frame / rotFrames; - tools.Spin(embers[0], nullptr, result, startCount + frameCount, blend);//Do not increment frameCount here. + tools.Spin(embers[0], nullptr, result, startCount + frameCount, blend, loopsCw);//Do not increment frameCount here. FormatName(result, os, padding); } @@ -606,6 +665,8 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() auto it2 = it;//Need a quick temporary to avoid modifying it which is used in the loop. embers[1] = *(++it2);//Get the next ember to be used with blending below. size_t blendFrames = randBlend ? m_Rand.Frand(framesBlend, framesBlendMax) : framesBlend; + double d = randBlendRot ? m_Rand.Frand(rotsPerBlend, rotsPerBlendMax) : double(rotsPerBlend); + size_t rpb = size_t(std::round(d)); if (randStagger) tools.Stagger(m_Rand.Frand(stagger, staggerMax)); @@ -615,7 +676,7 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() bool seqFlag = frame == 0 || (frame == blendFrames - 1); blend = frame / double(blendFrames); result.Clear(); - tools.SpinInter(&embers[0], nullptr, result, startCount + frameCount++, seqFlag, blend); + tools.SpinInter(&embers[0], nullptr, result, startCount + frameCount++, seqFlag, blend, rpb, loopsBlendCw); FormatName(result, os, padding); m_SequenceFile.m_Embers.push_back(result); } @@ -623,7 +684,7 @@ void FractoriumEmberController::SequenceGenerateButtonClicked() } it = Advance(m_EmberFile.m_Embers.begin(), stop); - tools.Spin(*it, nullptr, result, startCount + frameCount, 0); + tools.Spin(*it, nullptr, result, startCount + frameCount, 0, loopsBlendCw); FormatName(result, os, padding); m_SequenceFile.m_Embers.push_back(result); FillSequenceTree();//The sequence has been generated, now create preview thumbnails. @@ -730,6 +791,7 @@ void Fractorium::OnSequenceRandomizeStaggerCheckBoxStateChanged(int state) { ui. void Fractorium::OnSequenceRandomizeFramesPerRotCheckBoxStateChanged(int state) { ui.SequenceRandomFramesPerRotMaxSpinBox->setEnabled(state); } void Fractorium::OnSequenceRandomizeRotationsCheckBoxStateChanged(int state) { ui.SequenceRandomRotationsMaxSpinBox->setEnabled(state); } void Fractorium::OnSequenceRandomizeBlendFramesCheckBoxStateChanged(int state) { ui.SequenceRandomBlendMaxFramesSpinBox->setEnabled(state); } +void Fractorium::OnSequenceRandomizeRotationsPerBlendCheckBoxStateChanged(int state) { ui.SequenceRotationsPerBlendMaxSpinBox->setEnabled(state); } /// /// Constrain all min/max spinboxes. diff --git a/Source/Fractorium/FractoriumRender.cpp b/Source/Fractorium/FractoriumRender.cpp index a014879..2949fab 100644 --- a/Source/Fractorium/FractoriumRender.cpp +++ b/Source/Fractorium/FractoriumRender.cpp @@ -642,6 +642,8 @@ bool Fractorium::CreateRendererFromOptions() //If using OpenCL, will only get here if creating RendererCL failed, but creating a backup CPU Renderer succeeded. ShowCritical("Renderer Creation Error", "Error creating renderer, most likely a GPU problem. Using CPU instead."); m_Settings->OpenCL(false); + ui.ActionCpu->setChecked(true); + ui.ActionCL->setChecked(false); m_OptionsDialog->ui.OpenCLCheckBox->setChecked(false); m_FinalRenderDialog->ui.FinalRenderOpenCLCheckBox->setChecked(false); ok = false; @@ -674,11 +676,9 @@ bool Fractorium::CreateControllerFromOptions() double scale; uint current = 0; #ifdef DO_DOUBLE - Ember ed; EmberFile efd; Palette tempPalette; #else - Ember ed; EmberFile efd; Palette tempPalette; #endif @@ -689,16 +689,13 @@ bool Fractorium::CreateControllerFromOptions() { scale = m_Controller->LockedScale(); m_Controller->StopAllPreviewRenderers();//Must stop any previews first, else changing controllers will crash the program and SaveCurrentToOpenedFile() will return 0. - current = m_Controller->SaveCurrentToOpenedFile(false); m_Controller->CopyTempPalette(tempPalette);//Convert float to double or save double verbatim; + current = m_Controller->SaveCurrentToOpenedFile(false); //Replace below with this once LLVM fixes a crash in their compiler with default lambda parameters.//TODO - //m_Controller->CopyEmber(ed); //m_Controller->CopyEmberFile(efd); #ifdef DO_DOUBLE - m_Controller->CopyEmber(ed, [&](Ember& ember) { }); m_Controller->CopyEmberFile(efd, false, [&](Ember& ember) { }); #else - m_Controller->CopyEmber(ed, [&](Ember& ember) { }); m_Controller->CopyEmberFile(efd, false, [&](Ember& ember) { }); #endif m_Controller->Shutdown(); @@ -715,7 +712,9 @@ bool Fractorium::CreateControllerFromOptions() //Restore the ember and ember file. if (m_Controller.get()) { - ed.m_Palette = tempPalette;//Restore base temp palette. Adjustments will be then be applied and stored back in in m_Ember.m_Palette below. + if (auto prev = efd.Get(current))//Restore base temp palette. Adjustments will be then be applied and stored back in in m_Ember.m_Palette below. + prev->m_Palette = tempPalette; + m_Controller->SetEmberFile(efd, true); m_Controller->SetEmber(current, true); m_Controller->LockedScale(scale); diff --git a/Source/Fractorium/FractoriumSettings.cpp b/Source/Fractorium/FractoriumSettings.cpp index 12f72e0..88308e9 100644 --- a/Source/Fractorium/FractoriumSettings.cpp +++ b/Source/Fractorium/FractoriumSettings.cpp @@ -5,12 +5,11 @@ /// Constructor that passes the parent to the base and sets up reasonable defaults /// if the settings file was not present or corrupted. /// -/// The parent widget -FractoriumSettings::FractoriumSettings(QObject* p) +FractoriumSettings::FractoriumSettings() #ifdef _WIN32 - : QSettings(QSettings::IniFormat, QSettings::UserScope, "Fractorium", "Fractorium", p) + : QSettings(QSettings::IniFormat, QSettings::UserScope, "Fractorium", "Fractorium", nullptr) #else - : QSettings(QSettings::IniFormat, QSettings::UserScope, "fractorium", "fractorium", p) + : QSettings(QSettings::IniFormat, QSettings::UserScope, "fractorium", "fractorium", nullptr) #endif { EnsureDefaults(); @@ -110,6 +109,9 @@ void FractoriumSettings::Double(bool b) { setValue(DOUBLEPRECISION, b); bool FractoriumSettings::ShowAllXforms() { return value(SHOWALLXFORMS).toBool(); } void FractoriumSettings::ShowAllXforms(bool b) { setValue(SHOWALLXFORMS, b); } +bool FractoriumSettings::ToggleType() { return value(TOGGLETYPE).toBool(); } +void FractoriumSettings::ToggleType(bool b) { setValue(TOGGLETYPE, b); } + bool FractoriumSettings::ContinuousUpdate() { return value(CONTUPDATE).toBool(); } void FractoriumSettings::ContinuousUpdate(bool b) { setValue(CONTUPDATE, b); } diff --git a/Source/Fractorium/FractoriumSettings.h b/Source/Fractorium/FractoriumSettings.h index 0a18a65..9ea00c7 100644 --- a/Source/Fractorium/FractoriumSettings.h +++ b/Source/Fractorium/FractoriumSettings.h @@ -13,6 +13,7 @@ #define DOUBLEPRECISION "render/dp64" #define CONTUPDATE "render/continuousupdate" #define SHOWALLXFORMS "render/dragshowallxforms" +#define TOGGLETYPE "render/toggletype" #define DEVICES "render/devices" #define THREADCOUNT "render/threadcount" #define CPUDEFILTER "render/cpudefilter" @@ -86,11 +87,11 @@ /// runs of Fractorium. Each of these generally corresponds /// to items in the options dialog and the final render dialog. /// -class FractoriumSettings : public QSettings +class FractoriumSettings : public QSettings, public Singleton { Q_OBJECT public: - FractoriumSettings(QObject* p); + SINGLETON_DERIVED_IMPL(FractoriumSettings); void EnsureDefaults(); bool EarlyClip(); @@ -111,6 +112,9 @@ public: bool ShowAllXforms(); void ShowAllXforms(bool b); + bool ToggleType(); + void ToggleType(bool b); + bool ContinuousUpdate(); void ContinuousUpdate(bool b); @@ -281,4 +285,7 @@ public: QString Theme(); void Theme(const QString& s); + +private: + FractoriumSettings(); }; diff --git a/Source/Fractorium/FractoriumXforms.cpp b/Source/Fractorium/FractoriumXforms.cpp index c9e9df4..8738750 100644 --- a/Source/Fractorium/FractoriumXforms.cpp +++ b/Source/Fractorium/FractoriumXforms.cpp @@ -228,7 +228,7 @@ void FractoriumEmberController::DeleteXforms() checked++; //Do not allow deleting the only remaining non-final xform. - if (haveFinal && count <= 2 && i == 0) + if (haveFinal && count <= 2 && !(i - offset)) return; if (!haveFinal && count == 1) @@ -354,10 +354,24 @@ void Fractorium::OnXformNameChanged(int row, int col) { m_Controller->XformNameC template void FractoriumEmberController::XformAnimateChanged(int state) { - UpdateXform([&](Xform* xform) + bool final = IsFinal(CurrentXform()); + auto index = m_Fractorium->ui.CurrentXformCombo->currentIndex(); + UpdateAll([&](Ember& ember) { - xform->m_Animate = state > 0 ? 1 : 0; - }, eXformUpdate::UPDATE_SELECTED, false); + if (final)//If the current xform was final, only apply to other embers which also have a final xform. + { + if (ember.UseFinalXform()) + { + auto xform = ember.NonConstFinalXform(); + xform->m_Animate = state > 0 ? 1 : 0; + } + } + else//Current was not final, so apply to other embers which have a non-final xform at this index. + { + if (auto xform = ember.GetXform(index)) + xform->m_Animate = state > 0 ? 1 : 0; + } + }, false, eProcessAction::NOTHING, m_Fractorium->ApplyAll()); } void Fractorium::OnXformAnimateCheckBoxStateChanged(int state) { m_Controller->XformAnimateChanged(state); } diff --git a/Source/Fractorium/FractoriumXformsAffine.cpp b/Source/Fractorium/FractoriumXformsAffine.cpp index 3f1bfaf..ad94c22 100644 --- a/Source/Fractorium/FractoriumXformsAffine.cpp +++ b/Source/Fractorium/FractoriumXformsAffine.cpp @@ -163,6 +163,8 @@ template void FractoriumEmberController::LockAffineScaleCheckBoxStateChanged(int state) { m_LockedScale = m_Ember.m_PixelsPerUnit; + m_LockedX = m_Ember.m_CenterX; + m_LockedY = m_Ember.m_CenterY; m_Fractorium->ui.GLDisplay->update(); } diff --git a/Source/Fractorium/FractoriumXformsColor.cpp b/Source/Fractorium/FractoriumXformsColor.cpp index 7b62af7..a3524f3 100644 --- a/Source/Fractorium/FractoriumXformsColor.cpp +++ b/Source/Fractorium/FractoriumXformsColor.cpp @@ -8,6 +8,9 @@ void Fractorium::InitXformsColorUI() { int spinHeight = 20, row = 0; m_XformColorValueItem = new QTableWidgetItem(); + //Can't set this in the designer, so do it here. + m_XformColorValueItem->setToolTip("The index in the palette the current xform uses.\r\n\r\n" + "This value can be changed by scrolling the mouse wheel in the box displaying the value or by dragging the scroll bar."); ui.XformColorIndexTable->setItem(0, 0, m_XformColorValueItem); m_PaletteRefItem = new QTableWidgetItem(); ui.XformPaletteRefTable->setItem(0, 0, m_PaletteRefItem); diff --git a/Source/Fractorium/FractoriumXformsSelect.cpp b/Source/Fractorium/FractoriumXformsSelect.cpp index f038219..92e8f92 100644 --- a/Source/Fractorium/FractoriumXformsSelect.cpp +++ b/Source/Fractorium/FractoriumXformsSelect.cpp @@ -31,8 +31,8 @@ void Fractorium::OnXformsSelectNoneButtonClicked(bool checked) { ForEachXformChe /// True if checked, else false. bool Fractorium::IsXformSelected(size_t i) { - if (auto child = m_XformsSelectionLayout->itemAt(int(i))) - if (auto w = qobject_cast(child->widget())) + if (i < m_XformSelections.size()) + if (auto w = m_XformSelections[i]) return w->isChecked(); return false; @@ -70,7 +70,7 @@ QString FractoriumEmberController::MakeXformCaption(size_t i) bool isFinal = m_Ember.FinalXform() == m_Ember.GetTotalXform(i); QString caption = isFinal ? "Final" : QString::number(i + 1); - if (Xform* xform = m_Ember.GetTotalXform(i)) + if (auto xform = m_Ember.GetTotalXform(i)) { if (!xform->m_Name.empty()) caption += " (" + QString::fromStdString(xform->m_Name) + ")"; @@ -87,13 +87,8 @@ void Fractorium::ForEachXformCheckbox(std::function func) { int i = 0; - while (QLayoutItem* child = m_XformsSelectionLayout->itemAt(i)) - { - if (auto w = qobject_cast(child->widget())) - func(i, w); - - i++; - } + for (auto& cb : m_XformSelections) + func(i++, cb); } /// @@ -105,9 +100,9 @@ void Fractorium::ForEachXformCheckbox(std::function func) template bool FractoriumEmberController::XformCheckboxAt(int i, std::function func) { - if (auto child = m_Fractorium->m_XformsSelectionLayout->itemAt(i)) + if (i < m_Fractorium->m_XformSelections.size()) { - if (auto w = qobject_cast(child->widget())) + if (auto w = m_Fractorium->m_XformSelections[i]) { func(w); return true; diff --git a/Source/Fractorium/GLEmberController.h b/Source/Fractorium/GLEmberController.h index 3ab0537..50ef4fc 100644 --- a/Source/Fractorium/GLEmberController.h +++ b/Source/Fractorium/GLEmberController.h @@ -19,7 +19,7 @@ enum class eHoverType : et { HoverNone, HoverXAxis, HoverYAxis, HoverTranslation /// /// Dragging an affine transform or panning, rotating or scaling the image. /// -enum class eDragState : et { DragNone, DragPanning, DragDragging, DragRotateScale }; +enum class eDragState : et { DragNone, DragSelect, DragPanning, DragDragging, DragRotateScale }; /// /// Dragging with no keys pressed, shift, control or alt. diff --git a/Source/Fractorium/GLWidget.cpp b/Source/Fractorium/GLWidget.cpp index 2bde937..14bdc9f 100644 --- a/Source/Fractorium/GLWidget.cpp +++ b/Source/Fractorium/GLWidget.cpp @@ -333,6 +333,22 @@ void GLEmberController::DrawAffines(bool pre, bool post) m_GL->glEnd(); m_GL->glPointSize(1.0f);//Restore point size. } + else if (m_DragState == eDragState::DragSelect) + { + m_GL->glLineWidth(2.0f); + m_GL->glBegin(GL_LINES); + m_GL->glColor4f(0.0f, 0.0f, 1.0f, 1.0f); + m_GL->glVertex2f(m_MouseDownWorldPos.x, m_MouseDownWorldPos.y);//UL->UR + m_GL->glVertex2f(m_MouseWorldPos.x, m_MouseDownWorldPos.y); + m_GL->glVertex2f(m_MouseDownWorldPos.x, m_MouseWorldPos.y);//LL->LR + m_GL->glVertex2f(m_MouseWorldPos.x, m_MouseWorldPos.y); + m_GL->glVertex2f(m_MouseDownWorldPos.x, m_MouseDownWorldPos.y);//UL->LL + m_GL->glVertex2f(m_MouseDownWorldPos.x, m_MouseWorldPos.y); + m_GL->glVertex2f(m_MouseWorldPos.x, m_MouseDownWorldPos.y);//UR->LR + m_GL->glVertex2f(m_MouseWorldPos.x, m_MouseWorldPos.y); + m_GL->glEnd(); + m_GL->glLineWidth(1.0f); + } else if (m_HoverType != eHoverType::HoverNone && m_HoverXform == m_SelectedXform)//Draw large turquoise dot on hover if they are hovering over the selected xform. { m_GL->glPointSize(6.0f); @@ -514,6 +530,9 @@ void GLEmberController::MouseRelease(QMouseEvent* e) if (m_DragState == eDragState::DragDragging && (e->button() & Qt::LeftButton)) UpdateHover(mouseFlipped); + if (m_DragState == eDragState::DragNone) + m_Fractorium->OnXformsSelectNoneButtonClicked(false); + m_DragState = eDragState::DragNone; m_DragModifier = 0; m_GL->repaint();//Force immediate redraw. @@ -571,6 +590,26 @@ void GLEmberController::MouseMove(QMouseEvent* e) m_FractoriumEmberController->FillAffineWithXform(m_SelectedXform, pre);//Update the spinners in the affine tab of the main window. m_FractoriumEmberController->UpdateRender();//Restart the rendering process. } + else if ((m_DragState == eDragState::DragNone || m_DragState == eDragState::DragSelect) && (e->buttons() & Qt::LeftButton)) + { + m_DragState = eDragState::DragSelect;//Only set drag state once the user starts moving the mouse with the left button down. + //Iterate over each xform, seeing if it's in the bounding box. + QPointF tl(m_MouseDownWorldPos.x, m_MouseDownWorldPos.y); + QPointF br(m_MouseWorldPos.x, m_MouseWorldPos.y); + QRectF qrf(tl, br); + T scale = m_FractoriumEmberController->AffineScaleCurrentToLocked(); + int i = 0; + m_FractoriumEmberController->UpdateXform([&](Xform* xform) + { + QPointF cd(xform->m_Affine.C() * scale, xform->m_Affine.F() * scale); + bool b = qrf.contains(cd); + m_FractoriumEmberController->XformCheckboxAt(i, [&](QCheckBox * cb) + { + cb->setChecked(b); + }); + i++; + }, eXformUpdate::UPDATE_ALL, false); + } else if (m_DragState == eDragState::DragPanning)//Translating the whole image. { T x = -(m_MouseWorldPos.x - m_MouseDownWorldPos.x); diff --git a/Source/Fractorium/LibraryTreeWidget.cpp b/Source/Fractorium/LibraryTreeWidget.cpp index c18d759..d081b64 100644 --- a/Source/Fractorium/LibraryTreeWidget.cpp +++ b/Source/Fractorium/LibraryTreeWidget.cpp @@ -18,7 +18,7 @@ void LibraryTreeWidget::SetMainWindow(Fractorium* f) void LibraryTreeWidget::dropEvent(QDropEvent* de) { QModelIndex droppedIndex = indexAt(de->pos()); - auto items = selectionModel()->selectedIndexes(); + auto items = selectionModel()->selectedRows(); if (!droppedIndex.isValid())//Don't process drop because it's outside of the droppable area. { @@ -33,7 +33,7 @@ void LibraryTreeWidget::dropEvent(QDropEvent* de) if (dp == QAbstractItemView::BelowItem) row++; - m_Fractorium->m_Controller->MoveLibraryItems(items[0].row(), row); + QTimer::singleShot(500, [ = ]() { m_Fractorium->m_Controller->MoveLibraryItems(items, row); });//Need to fire this after this event has internally reshuffled the items. } QTreeWidget::dropEvent(de); diff --git a/Source/Fractorium/OptionsDialog.cpp b/Source/Fractorium/OptionsDialog.cpp index 49c68a7..ab4234a 100644 --- a/Source/Fractorium/OptionsDialog.cpp +++ b/Source/Fractorium/OptionsDialog.cpp @@ -8,12 +8,12 @@ /// A pointer to the settings object to use /// The parent widget. Default: nullptr. /// The window flags. Default: 0. -FractoriumOptionsDialog::FractoriumOptionsDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) +FractoriumOptionsDialog::FractoriumOptionsDialog(QWidget* p, Qt::WindowFlags f) : QDialog(p, f) { int i, row = 0, spinHeight = 20; ui.setupUi(this); - m_Settings = settings; + m_Settings = FractoriumSettings::DefInstance(); m_Info = OpenCLInfo::Instance(); QTableWidget* table = ui.OptionsXmlSavingTable; ui.ThreadCountSpin->setRange(1, Timing::ProcessorCount()); @@ -66,6 +66,7 @@ bool FractoriumOptionsDialog::ContinuousUpdate() { return ui.ContinuousUpdateChe bool FractoriumOptionsDialog::OpenCL() { return ui.OpenCLCheckBox->isChecked(); } bool FractoriumOptionsDialog::Double() { return ui.DoublePrecisionCheckBox->isChecked(); } bool FractoriumOptionsDialog::ShowAllXforms() { return ui.ShowAllXformsCheckBox->isChecked(); } +bool FractoriumOptionsDialog::ToggleType() { return ui.ToggleTypeCheckBox->isChecked(); } bool FractoriumOptionsDialog::AutoUnique() { return ui.AutoUniqueCheckBox->isChecked(); } uint FractoriumOptionsDialog::ThreadCount() { return ui.ThreadCountSpin->value(); } uint FractoriumOptionsDialog::RandomCount() { return ui.RandomCountSpin->value(); } @@ -172,6 +173,7 @@ void FractoriumOptionsDialog::GuiToData() m_Settings->OpenCL(OpenCL()); m_Settings->Double(Double()); m_Settings->ShowAllXforms(ShowAllXforms()); + m_Settings->ToggleType(ToggleType()); m_Settings->ThreadCount(ThreadCount()); m_Settings->RandomCount(RandomCount()); m_Settings->CpuSubBatch(ui.CpuSubBatchSpin->value()); @@ -204,6 +206,7 @@ void FractoriumOptionsDialog::DataToGui() ui.OpenCLCheckBox->setChecked(m_Settings->OpenCL()); ui.DoublePrecisionCheckBox->setChecked(m_Settings->Double()); ui.ShowAllXformsCheckBox->setChecked(m_Settings->ShowAllXforms()); + ui.ToggleTypeCheckBox->setChecked(m_Settings->ToggleType()); ui.ThreadCountSpin->setValue(m_Settings->ThreadCount()); ui.RandomCountSpin->setValue(m_Settings->RandomCount()); ui.CpuSubBatchSpin->setValue(m_Settings->CpuSubBatch()); diff --git a/Source/Fractorium/OptionsDialog.h b/Source/Fractorium/OptionsDialog.h index 0aae7a7..4b83acd 100644 --- a/Source/Fractorium/OptionsDialog.h +++ b/Source/Fractorium/OptionsDialog.h @@ -24,7 +24,7 @@ class FractoriumOptionsDialog : public QDialog friend Fractorium; public: - FractoriumOptionsDialog(FractoriumSettings* settings, QWidget* p = nullptr, Qt::WindowFlags f = 0); + FractoriumOptionsDialog(QWidget* p = nullptr, Qt::WindowFlags f = 0); public slots: void OnOpenCLCheckBoxStateChanged(int state); @@ -45,6 +45,7 @@ private: bool OpenCL(); bool Double(); bool ShowAllXforms(); + bool ToggleType(); bool AutoUnique(); uint ThreadCount(); uint RandomCount(); @@ -59,5 +60,5 @@ private: QLineEdit* m_IdEdit; QLineEdit* m_UrlEdit; QLineEdit* m_NickEdit; - FractoriumSettings* m_Settings; + shared_ptr m_Settings; }; diff --git a/Source/Fractorium/OptionsDialog.ui b/Source/Fractorium/OptionsDialog.ui index df2852d..e1617d5 100644 --- a/Source/Fractorium/OptionsDialog.ui +++ b/Source/Fractorium/OptionsDialog.ui @@ -414,6 +414,16 @@ in interactive mode for each mouse movement + + + + <html><head/><body><p>Checked: right clicking toggles spin boxes, right button dragging disabled.</p><p>Unchecked: double clicking toggles spin boxes, right button dragging enabled.</p></body></html> + + + Right Click Toggles Spinboxes + + + diff --git a/Source/Fractorium/QssDialog.cpp b/Source/Fractorium/QssDialog.cpp index 1a0d697..da2e2a7 100644 --- a/Source/Fractorium/QssDialog.cpp +++ b/Source/Fractorium/QssDialog.cpp @@ -57,27 +57,22 @@ QssDialog::QssDialog(Fractorium* parent) : m_LastStyle = m_Parent->styleSheet(); setWindowTitle("QSS Editor - default.qss"); connect(ui->QssEdit, SIGNAL(textChanged()), this, SLOT(SlotTextChanged())); - QToolBar* toolBar = new QToolBar(this); QMenu* colorActionMenu = new QMenu(this); QMenu* geomActionMenu = new QMenu(this); QMenu* borderActionMenu = new QMenu(this); QMenu* styleActionMenu = new QMenu(this); - (m_ColorActionMapper = new QSignalMapper(this))->setMapping(m_AddColorAction, QString()); (m_GeomActionMapper = new QSignalMapper(this))->setMapping(m_AddGeomAction, QString()); (m_BorderActionMapper = new QSignalMapper(this))->setMapping(m_AddBorderAction, QString()); (m_StyleActionMapper = new QSignalMapper(this))->setMapping(m_AddStyleAction, QString()); - connect(ui->QssLoadButton, SIGNAL(clicked()), this, SLOT(LoadButton_clicked()), Qt::QueuedConnection); connect(ui->QssSaveButton, SIGNAL(clicked()), this, SLOT(SaveButton_clicked()), Qt::QueuedConnection); connect(ui->QssBasicButton, SIGNAL(clicked()), this, SLOT(BasicButton_clicked()), Qt::QueuedConnection); connect(ui->QssMediumButton, SIGNAL(clicked()), this, SLOT(MediumButton_clicked()), Qt::QueuedConnection); connect(ui->QssAdvancedButton, SIGNAL(clicked()), this, SLOT(AdvancedButton_clicked()), Qt::QueuedConnection); connect(m_AddFontAction, SIGNAL(triggered()), this, SLOT(SlotAddFont())); - QVector> colorVec; - colorVec.reserve(12); colorVec.push_back(QPair("color", "")); colorVec.push_back(QPair("background-color", "")); @@ -94,14 +89,12 @@ QssDialog::QssDialog(Fractorium* parent) : for (auto& c : colorVec) { auto colorAction = colorActionMenu->addAction(c.first); - m_ColorMap[c.first] = c.second; connect(colorAction, SIGNAL(triggered()), m_ColorActionMapper, SLOT(map())); m_ColorActionMapper->setMapping(colorAction, c.first); } QVector> geomVec; - geomVec.reserve(12); geomVec.push_back(QPair("width", "100px")); geomVec.push_back(QPair("height", "50px")); @@ -120,14 +113,12 @@ QssDialog::QssDialog(Fractorium* parent) : for (auto& g : geomVec) { auto geomAction = geomActionMenu->addAction(g.first); - m_GeomMap[g.first] = g.second; connect(geomAction, SIGNAL(triggered()), m_GeomActionMapper, SLOT(map())); m_GeomActionMapper->setMapping(geomAction, g.first); } QVector> borderVec; - borderVec.reserve(8); borderVec.push_back(QPair("border", "1px solid black")); borderVec.push_back(QPair("border-top", "1px inset black")); @@ -141,18 +132,16 @@ QssDialog::QssDialog(Fractorium* parent) : for (auto& b : borderVec) { auto borderAction = borderActionMenu->addAction(b.first); - m_BorderMap[b.first] = b.second; connect(borderAction, SIGNAL(triggered()), m_BorderActionMapper, SLOT(map())); m_BorderActionMapper->setMapping(borderAction, b.first); } auto styles = QStyleFactory::keys(); - + for (auto& s : styles) { auto styleAction = styleActionMenu->addAction(s); - m_StyleMap[s] = s; connect(styleAction, SIGNAL(triggered()), m_StyleActionMapper, SLOT(map())); m_StyleActionMapper->setMapping(styleAction, s); @@ -162,12 +151,10 @@ QssDialog::QssDialog(Fractorium* parent) : connect(m_GeomActionMapper, SIGNAL(mapped(QString)), this, SLOT(SlotAddGeom(QString))); connect(m_BorderActionMapper, SIGNAL(mapped(QString)), this, SLOT(SlotAddBorder(QString))); connect(m_StyleActionMapper, SIGNAL(mapped(QString)), this, SLOT(SlotSetTheme(QString))); - m_AddColorAction->setMenu(colorActionMenu); m_AddGeomAction->setMenu(geomActionMenu); m_AddBorderAction->setMenu(borderActionMenu); m_AddStyleAction->setMenu(styleActionMenu); - toolBar->addAction(m_AddColorAction); toolBar->addAction(m_AddGeomAction); toolBar->addAction(m_AddBorderAction); @@ -237,7 +224,6 @@ QList QssDialog::GetClassNames(bool includeObjectNames) { QSet dlgSet; auto dlgWidgetList = dlg->findChildren();//Find all children of the dialog. - dlgSet.insert(classAndName);//Add the basic dialog class name, opening curly brace will be added later. classAndName += " "; @@ -290,8 +276,10 @@ bool QssDialog::IsStyleSheetValid(const QString& styleSheet) { QCss::Parser parser(styleSheet); QCss::StyleSheet sheet; + if (parser.parse(&sheet)) return true; + QString fullSheet = QStringLiteral("* { "); fullSheet += styleSheet; fullSheet += QLatin1Char('}'); @@ -344,7 +332,7 @@ void QssDialog::showEvent(QShowEvent* e) m_LastTheme = m_Parent->m_Theme;//The style() member cannot be relied upon, it is *not* the same object passed to setStyle(); SetText(m_LastStyle); } - + QDialog::showEvent(e); } @@ -378,12 +366,12 @@ void QssDialog::SlotAddColor(const QString& s) if (color.alpha() == 255) { colorStr = QString(QStringLiteral("rgb(%1, %2, %3)")).arg( - color.red()).arg(color.green()).arg(color.blue()); + color.red()).arg(color.green()).arg(color.blue()); } else { colorStr = QString(QStringLiteral("rgba(%1, %2, %3, %4)")).arg( - color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha()); + color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha()); } InsertCssProperty(s, colorStr); @@ -396,7 +384,6 @@ void QssDialog::SlotAddColor(const QString& s) void QssDialog::SlotAddGeom(const QString& s) { auto val = m_GeomMap[s]; - InsertCssProperty(s, val); } @@ -407,7 +394,6 @@ void QssDialog::SlotAddGeom(const QString& s) void QssDialog::SlotAddBorder(const QString& s) { auto val = m_BorderMap[s]; - InsertCssProperty(s, val); } @@ -446,14 +432,16 @@ void QssDialog::SlotAddFont() switch (font.style()) { - case QFont::StyleItalic: - fontStr += QStringLiteral("italic "); - break; - case QFont::StyleOblique: - fontStr += QStringLiteral("oblique "); - break; - default: - break; + case QFont::StyleItalic: + fontStr += QStringLiteral("italic "); + break; + + case QFont::StyleOblique: + fontStr += QStringLiteral("oblique "); + break; + + default: + break; } fontStr += QString::number(font.pointSize()); @@ -526,10 +514,7 @@ void QssDialog::SaveButton_clicked() string s = Text().toStdString(); if (of.is_open()) - { of << s; - of.close(); - } else QMessageBox::critical(this, "File save error", "Failed to save " + path + ", style will not be set as default"); } @@ -547,10 +532,7 @@ void QssDialog::SaveAsDefault() auto s = Text().toStdString(); if (of.is_open()) - { of << s; - of.close(); - } else QMessageBox::critical(this, "File save error", "Failed to save " + path + ", style will not be set as default"); } @@ -615,13 +597,12 @@ void QssDialog::InsertCssProperty(const QString& name, const QString& value) cursor.beginEditBlock(); cursor.removeSelectedText(); cursor.movePosition(QTextCursor::EndOfLine); - //Simple check to see if we're in a selector scope. const QTextDocument* doc = editor->document(); const QTextCursor closing = doc->find(QStringLiteral("}"), cursor, QTextDocument::FindBackward); const QTextCursor opening = doc->find(QStringLiteral("{"), cursor, QTextDocument::FindBackward); const bool inSelector = !opening.isNull() && (closing.isNull() || - closing.position() < opening.position()); + closing.position() < opening.position()); QString insertion; //Reasonable attempt at positioning things correctly. This can and often is wrong, but is sufficient for our purposes. @@ -666,9 +647,7 @@ void QssDialog::SetupFileDialog() QString QssDialog::OpenFile() { QStringList filenames; - SetupFileDialog(); - m_FileDialog->setFileMode(QFileDialog::ExistingFile); m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen); m_FileDialog->setNameFilter("Qss (*.qss)"); @@ -688,7 +667,6 @@ QString QssDialog::OpenFile() QString QssDialog::SaveFile() { QStringList filenames; - SetupFileDialog(); m_FileDialog->setFileMode(QFileDialog::AnyFile); m_FileDialog->setAcceptMode(QFileDialog::AcceptSave); diff --git a/Source/Fractorium/SpinBox.cpp b/Source/Fractorium/SpinBox.cpp index c74bfe1..4c288da 100644 --- a/Source/Fractorium/SpinBox.cpp +++ b/Source/Fractorium/SpinBox.cpp @@ -1,5 +1,6 @@ #include "FractoriumPch.h" #include "SpinBox.h" +#include "FractoriumSettings.h" QTimer SpinBox::s_Timer; @@ -15,7 +16,6 @@ QTimer SpinBox::s_Timer; SpinBox::SpinBox(QWidget* p, int h, int step) : QSpinBox(p) { - m_Select = false; m_DoubleClick = false; m_DoubleClickNonZero = 0; m_DoubleClickZero = 1; @@ -135,36 +135,39 @@ void SpinBox::OnTimeout() bool SpinBox::eventFilter(QObject* o, QEvent* e) { QMouseEvent* me = dynamic_cast(e); + auto settings = FractoriumSettings::DefInstance(); - if (isEnabled() && - me && - me->type() == QMouseEvent::MouseButtonPress && - me->button() == Qt::RightButton) + if (isEnabled() && me) { - m_MouseDownPoint = m_MouseMovePoint = me->pos(); - StartTimer(); - } - else if (isEnabled() && - me && - me->type() == QMouseEvent::MouseButtonRelease && - me->button() == Qt::RightButton) - { - StopTimer(); - m_MouseDownPoint = m_MouseMovePoint = me->pos(); - } - else if (isEnabled() && - me && - me->type() == QMouseEvent::MouseMove && - QGuiApplication::mouseButtons() & Qt::RightButton) - { - m_MouseMovePoint = me->pos(); - } - else if (m_DoubleClick && e->type() == QMouseEvent::MouseButtonDblClick && isEnabled()) - { - if (value() == 0) - setValue(m_DoubleClickZero); - else - setValue(m_DoubleClickNonZero); + if (!settings->ToggleType() &&//Ensure double click toggles, not right click. + me->type() == QMouseEvent::MouseButtonPress && + me->button() == Qt::RightButton) + { + m_MouseDownPoint = m_MouseMovePoint = me->pos(); + StartTimer(); + } + else if (!settings->ToggleType() && + me->type() == QMouseEvent::MouseButtonRelease && + me->button() == Qt::RightButton) + { + StopTimer(); + m_MouseDownPoint = m_MouseMovePoint = me->pos(); + } + else if (!settings->ToggleType() && + me->type() == QMouseEvent::MouseMove && + QGuiApplication::mouseButtons() & Qt::RightButton) + { + m_MouseMovePoint = me->pos(); + } + else if (m_DoubleClick && + ((!settings->ToggleType() && e->type() == QMouseEvent::MouseButtonDblClick && me->button() == Qt::LeftButton) || + (settings->ToggleType() && me->type() == QMouseEvent::MouseButtonRelease && me->button() == Qt::RightButton))) + { + if (IsNearZero(value())) + setValue(m_DoubleClickZero); + else + setValue(m_DoubleClickNonZero); + } } else { @@ -172,9 +175,9 @@ bool SpinBox::eventFilter(QObject* o, QEvent* e) { //Take special action for shift to reduce the scroll amount. Control already //increases it automatically. - if (QWheelEvent* wev = dynamic_cast(e)) + if (QWheelEvent* we = dynamic_cast(e)) { - Qt::KeyboardModifiers mod = wev->modifiers(); + Qt::KeyboardModifiers mod = we->modifiers(); if (mod.testFlag(Qt::ShiftModifier)) setSingleStep(m_SmallStep); diff --git a/Source/Fractorium/SpinBox.h b/Source/Fractorium/SpinBox.h index 35ad263..edc574f 100644 --- a/Source/Fractorium/SpinBox.h +++ b/Source/Fractorium/SpinBox.h @@ -1,6 +1,7 @@ #pragma once #include "FractoriumPch.h" +#include "DoubleSpinBox.h" /// /// SpinBox class. @@ -41,7 +42,6 @@ private: void StartTimer(); void StopTimer(); - bool m_Select; bool m_DoubleClick; int m_DoubleClickNonZero; int m_DoubleClickZero; diff --git a/Source/Fractorium/VariationsDialog.cpp b/Source/Fractorium/VariationsDialog.cpp index 99c2b17..2ef3496 100644 --- a/Source/Fractorium/VariationsDialog.cpp +++ b/Source/Fractorium/VariationsDialog.cpp @@ -8,13 +8,13 @@ /// Pointer to the global settings object to use /// The parent widget. Default: nullptr. /// The window flags. Default: 0. -FractoriumVariationsDialog::FractoriumVariationsDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) +FractoriumVariationsDialog::FractoriumVariationsDialog(QWidget* p, Qt::WindowFlags f) : QDialog(p, f), - m_Settings(settings), m_VariationList(VariationList::Instance()) { ui.setupUi(this); auto table = ui.VariationsTable; + m_Settings = FractoriumSettings::DefInstance(); m_Vars = m_Settings->Variations(); Populate(); OnSelectAllButtonClicked(true); diff --git a/Source/Fractorium/VariationsDialog.h b/Source/Fractorium/VariationsDialog.h index 986850c..d40edee 100644 --- a/Source/Fractorium/VariationsDialog.h +++ b/Source/Fractorium/VariationsDialog.h @@ -19,7 +19,7 @@ class FractoriumVariationsDialog : public QDialog { Q_OBJECT public: - FractoriumVariationsDialog(FractoriumSettings* settings, QWidget* p = nullptr, Qt::WindowFlags f = nullptr); + FractoriumVariationsDialog(QWidget* p = nullptr, Qt::WindowFlags f = nullptr); void ForEachCell(std::function func); void ForEachSelectedCell(std::function func); void SyncSettings(); @@ -46,6 +46,6 @@ private: shared_ptr> m_VariationList; vector m_CheckBoxes; QMap m_Vars; - FractoriumSettings* m_Settings; + shared_ptr m_Settings; Ui::VariationsDialog ui; }; diff --git a/makedeps.bat b/makedeps.bat index 8edf31e..d57cd57 100644 --- a/makedeps.bat +++ b/makedeps.bat @@ -9,12 +9,13 @@ git clone https://github.com/GNOME/libxml2.git git clone https://github.com/g-truc/glm.git REM Set VC paths -set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include; +set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin; REM libjpeg +copy fractorium\Builds\MSVC\WIN32.MAK libjpeg cd libjpeg -nmake /f makefile.vc setup-v10 -nmake nodebug=1 /f makefile.vc all +nmake /f makefile.vc setup-v10 CPU=i386 +nmake nodebug=1 /f makefile.vc all CPU=i386 copy libjpeg.lib ..\fractorium\Deps cd .. @@ -44,7 +45,7 @@ copy libpng.lib ..\fractorium\Deps cd .. REM tbb -cd tbb\build\vs2010 +cd tbb\build\vs2012 devenv.exe tbb.vcxproj /upgrade msbuild tbb.vcxproj /p:Configuration=Release copy X64\Release\tbb.dll ..\..\..\fractorium\Deps