diff --git a/.bzrignore b/.bzrignore index 39b5c6f..fc97f58 100644 --- a/.bzrignore +++ b/.bzrignore @@ -30,12 +30,13 @@ *GeneratedFiles* *.unsuccessfulbuild *\Obj\* -Builds/MSVC/VS2010/Obj/x64/Debug/EmberCL_manifest.rc -Builds/MSVC/VS2010/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc -Builds/MSVC/VS2010/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc -Builds/MSVC/VS2010/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc -Builds/MSVC/VS2010/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc -Builds/MSVC/VS2010/Obj/Ember/x64/Debug/Ember_manifest.rc +Builds/MSVC/VS2013/Obj/x64/Debug/EmberCL_manifest.rc +Builds/MSVC/VS2013/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc +Builds/MSVC/VS2013/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc +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/ Bin/x64/Release/testallvarsout.flame Data/~$Bench.xlsx *.ps1 diff --git a/.gitignore b/.gitignore index 39b5c6f..fc97f58 100644 --- a/.gitignore +++ b/.gitignore @@ -30,12 +30,13 @@ *GeneratedFiles* *.unsuccessfulbuild *\Obj\* -Builds/MSVC/VS2010/Obj/x64/Debug/EmberCL_manifest.rc -Builds/MSVC/VS2010/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc -Builds/MSVC/VS2010/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc -Builds/MSVC/VS2010/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc -Builds/MSVC/VS2010/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc -Builds/MSVC/VS2010/Obj/Ember/x64/Debug/Ember_manifest.rc +Builds/MSVC/VS2013/Obj/x64/Debug/EmberCL_manifest.rc +Builds/MSVC/VS2013/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc +Builds/MSVC/VS2013/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc +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/ Bin/x64/Release/testallvarsout.flame Data/~$Bench.xlsx *.ps1 diff --git a/Builds/MSVC/VS2013/Ember.vcxproj b/Builds/MSVC/VS2013/Ember.vcxproj index 6af20e9..3160a48 100644 --- a/Builds/MSVC/VS2013/Ember.vcxproj +++ b/Builds/MSVC/VS2013/Ember.vcxproj @@ -279,6 +279,7 @@ + diff --git a/Builds/MSVC/VS2013/Ember.vcxproj.filters b/Builds/MSVC/VS2013/Ember.vcxproj.filters index 04447a9..fb9f959 100644 --- a/Builds/MSVC/VS2013/Ember.vcxproj.filters +++ b/Builds/MSVC/VS2013/Ember.vcxproj.filters @@ -119,6 +119,9 @@ Header Files\Variations + + Header Files + diff --git a/Builds/MSVC/VS2013/EmberCL.vcxproj b/Builds/MSVC/VS2013/EmberCL.vcxproj index 0cb5041..471b77f 100644 --- a/Builds/MSVC/VS2013/EmberCL.vcxproj +++ b/Builds/MSVC/VS2013/EmberCL.vcxproj @@ -154,7 +154,7 @@ WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions) $(TargetDir)$(TargetName).pdb 4251;4661 - $(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include + $(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include Default EmberCLPch.h true @@ -166,7 +166,7 @@ Windows true opencl.lib;Opengl32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) @@ -227,7 +227,7 @@ WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions) $(TargetDir)$(TargetName).pdb 4251;4661 - $(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include + $(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include Speed EmberCLPch.h /bigobj %(AdditionalOptions) @@ -243,7 +243,7 @@ true true opencl.lib;Opengl32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) diff --git a/Builds/MSVC/VS2013/EmberGenome.vcxproj b/Builds/MSVC/VS2013/EmberGenome.vcxproj index e99eb28..85ebda6 100644 --- a/Builds/MSVC/VS2013/EmberGenome.vcxproj +++ b/Builds/MSVC/VS2013/EmberGenome.vcxproj @@ -158,7 +158,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"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 + $(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 4251 EmberCommonPch.h true @@ -170,7 +170,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Console true opencl.lib;Ws2_32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" @@ -244,7 +244,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"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 + $(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 4251 EmberCommonPch.h true @@ -258,7 +258,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"true true opencl.lib;Ws2_32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" diff --git a/Builds/MSVC/VS2013/EmberRender.vcxproj b/Builds/MSVC/VS2013/EmberRender.vcxproj index 36d597f..d82d66f 100644 --- a/Builds/MSVC/VS2013/EmberRender.vcxproj +++ b/Builds/MSVC/VS2013/EmberRender.vcxproj @@ -158,7 +158,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"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 + $(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 4251 EmberCommonPch.h true @@ -170,7 +170,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Console true opencl.lib;Ws2_32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" @@ -244,7 +244,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"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 + $(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 4251 EmberCommonPch.h Precise @@ -259,7 +259,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"true true opencl.lib;Ws2_32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" diff --git a/Builds/MSVC/VS2013/EmberTester.vcxproj b/Builds/MSVC/VS2013/EmberTester.vcxproj index fdf9396..9b1bef6 100644 --- a/Builds/MSVC/VS2013/EmberTester.vcxproj +++ b/Builds/MSVC/VS2013/EmberTester.vcxproj @@ -158,7 +158,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"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 + $(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 4251 EmberCommonPch.h true @@ -170,7 +170,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Console true opencl.lib;Ws2_32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" @@ -244,7 +244,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"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 + $(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 4251 EmberCommonPch.h true @@ -258,7 +258,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"true true opencl.lib;Ws2_32.lib;%(AdditionalDependencies) - $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName) + $(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName) xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" diff --git a/Builds/MSVC/VS2013/Fractorium.sln b/Builds/MSVC/VS2013/Fractorium.sln index 8daf31f..5393c07 100644 --- a/Builds/MSVC/VS2013/Fractorium.sln +++ b/Builds/MSVC/VS2013/Fractorium.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30723.0 +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ember", "Ember.vcxproj", "{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}" EndProject @@ -119,10 +119,6 @@ Global Release-MT|Win32 = Release-MT|Win32 Release-MT|x64 = Release-MT|x64 Release-MT|x86 = Release-MT|x86 - ReleaseNvidia|Mixed Platforms = ReleaseNvidia|Mixed Platforms - ReleaseNvidia|Win32 = ReleaseNvidia|Win32 - ReleaseNvidia|x64 = ReleaseNvidia|x64 - ReleaseNvidia|x86 = ReleaseNvidia|x86 ReleaseWithoutAsm|Mixed Platforms = ReleaseWithoutAsm|Mixed Platforms ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 @@ -179,12 +175,6 @@ Global {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|x64.ActiveCfg = Release|x64 {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|x64.Build.0 = Release|x64 {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|x86.ActiveCfg = Release|x64 - {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -241,12 +231,6 @@ Global {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|x64.ActiveCfg = Release|x64 {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|x64.Build.0 = Release|x64 {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|x86.ActiveCfg = Release|x64 - {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -303,12 +287,6 @@ Global {6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|x64.ActiveCfg = Release|x64 {6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|x64.Build.0 = Release|x64 {6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|x86.ActiveCfg = Release|x64 - {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -365,12 +343,6 @@ Global {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|x64.ActiveCfg = Release|x64 {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|x64.Build.0 = Release|x64 {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|x86.ActiveCfg = Release|x64 - {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -427,12 +399,6 @@ Global {35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|x64.ActiveCfg = Release|x64 {35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|x64.Build.0 = Release|x64 {35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|x86.ActiveCfg = Release|x64 - {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -489,12 +455,6 @@ Global {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|x64.ActiveCfg = Release|x64 {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|x64.Build.0 = Release|x64 {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|x86.ActiveCfg = Release|x64 - {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -551,13 +511,6 @@ Global {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|x64.ActiveCfg = Release|x64 {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|x64.Build.0 = Release|x64 {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|x86.ActiveCfg = Release|x64 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Mixed Platforms.ActiveCfg = ReleaseNvidia|x64 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Mixed Platforms.Build.0 = ReleaseNvidia|x64 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Win32.ActiveCfg = ReleaseNvidia|Win32 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|Win32.Build.0 = ReleaseNvidia|Win32 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseNvidia|x86.ActiveCfg = ReleaseNvidia|x64 {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -616,12 +569,6 @@ Global {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.ActiveCfg = Release-MT|x64 {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.Build.0 = Release-MT|x64 {F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x86.ActiveCfg = Release-MT|x64 - {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|x64.ActiveCfg = Release|x64 - {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|x64.Build.0 = Release|x64 - {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|x64 {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|x64 @@ -678,12 +625,6 @@ Global {60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|Win32.Build.0 = Release|Win32 {60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|x64.ActiveCfg = Release|Win32 {60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|x86.ActiveCfg = Release|Win32 - {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|x64.ActiveCfg = Release|x64 - {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|x64.Build.0 = Release|x64 - {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32 {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 @@ -740,12 +681,6 @@ Global {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|Win32.Build.0 = Release|Win32 {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|x64.ActiveCfg = Release|Win32 {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|x86.ActiveCfg = Release|Win32 - {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|x64.ActiveCfg = Release|x64 - {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|x64.Build.0 = Release|x64 - {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32 {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 @@ -802,12 +737,6 @@ Global {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|Win32.Build.0 = Release|Win32 {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|x64.ActiveCfg = Release|Win32 {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|x86.ActiveCfg = Release|Win32 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|x64.ActiveCfg = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|x64.Build.0 = Release|x64 - {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32 {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 @@ -864,12 +793,6 @@ Global {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|Win32.Build.0 = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|x64.ActiveCfg = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|x86.ActiveCfg = Release|Win32 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|x64.ActiveCfg = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|x64.Build.0 = Release|x64 - {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 @@ -926,12 +849,6 @@ Global {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|Win32.Build.0 = Release|Win32 {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|x64.ActiveCfg = Release|Win32 {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|x86.ActiveCfg = Release|Win32 - {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|Mixed Platforms.ActiveCfg = Release|x64 - {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|Mixed Platforms.Build.0 = Release|x64 - {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|Win32.ActiveCfg = Release|x64 - {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|x64.ActiveCfg = Release|x64 - {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|x64.Build.0 = Release|x64 - {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseNvidia|x86.ActiveCfg = Release|x64 {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = Release|Win32 {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 @@ -1001,14 +918,6 @@ Global {C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x64.Build.0 = ReleaseNvidia|x64 {C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x86.ActiveCfg = ReleaseNvidia|x86 {C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x86.Build.0 = ReleaseNvidia|x86 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Mixed Platforms.ActiveCfg = ReleaseNvidia|x86 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Mixed Platforms.Build.0 = ReleaseNvidia|x86 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Win32.ActiveCfg = ReleaseNvidia|x86 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|Win32.Build.0 = ReleaseNvidia|x86 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|x64.ActiveCfg = ReleaseNvidia|x64 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|x64.Build.0 = ReleaseNvidia|x64 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|x86.ActiveCfg = ReleaseNvidia|x86 - {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseNvidia|x86.Build.0 = ReleaseNvidia|x86 {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Mixed Platforms.ActiveCfg = ReleaseNvidia|x86 {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = ReleaseNvidia|x86 {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseNvidia|x86 diff --git a/Builds/MSVC/VS2013/Fractorium.vcxproj b/Builds/MSVC/VS2013/Fractorium.vcxproj index cef44f6..a6339e1 100644 --- a/Builds/MSVC/VS2013/Fractorium.vcxproj +++ b/Builds/MSVC/VS2013/Fractorium.vcxproj @@ -147,7 +147,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" 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;$(ProjectDir)..\..\..\..\glew\include;$(AMDAPPSDKROOT)\include;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories) + .;$(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 @@ -165,7 +165,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" Windows $(OutDir)\$(ProjectName).exe - $(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName);%(AdditionalLibraryDirectories) + $(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;%(AdditionalDependencies) @@ -233,7 +233,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" 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;$(ProjectDir)..\..\..\..\glew\include;$(AMDAPPSDKROOT)\include;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories) + .;$(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 @@ -251,7 +251,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)" Windows $(OutDir)\$(ProjectName).exe - $(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName);%(AdditionalLibraryDirectories) + $(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;%(AdditionalDependencies) 0.1 @@ -680,7 +680,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath) 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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing VariationsDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -688,7 +688,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath) 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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/VariationsDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing VariationsDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -706,7 +706,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing QssDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -714,7 +714,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(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_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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing QssDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -732,7 +732,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/csshighlighter.h" $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing csshighlighter.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -740,7 +740,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(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_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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/csshighlighter.h" $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing csshighlighter.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -760,7 +760,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath) 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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssTextEdit.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing QssTextEdit.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -768,7 +768,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath) 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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/QssTextEdit.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing QssTextEdit.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -788,7 +788,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing OptionsDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/OptionsDialog.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/OptionsDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing OptionsDialog.h... @@ -803,7 +803,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing OptionsDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/OptionsDialog.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/OptionsDialog.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -814,7 +814,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing AboutDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/AboutDialog.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/AboutDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing AboutDialog.h... @@ -829,7 +829,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing AboutDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/AboutDialog.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/AboutDialog.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -840,7 +840,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing FinalRenderDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FinalRenderDialog.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FinalRenderDialog.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing FinalRenderDialog.h... @@ -855,7 +855,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing FinalRenderDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FinalRenderDialog.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FinalRenderDialog.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -910,7 +910,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing FractoriumSettings.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FractoriumSettings.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FractoriumSettings.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing FractoriumSettings.h... @@ -925,7 +925,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing FractoriumSettings.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FractoriumSettings.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/FractoriumSettings.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -963,7 +963,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/CurvesGraphicsView.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing CurvesGraphicsView.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -971,7 +971,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(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_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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/CurvesGraphicsView.h" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing CurvesGraphicsView.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -1024,7 +1024,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing GLWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/GLWidget.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/GLWidget.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing GLWidget.h... @@ -1039,7 +1039,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing GLWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/GLWidget.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/GLWidget.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -1051,7 +1051,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing DoubleSpinBox.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBox.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBox.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing DoubleSpinBox.h... @@ -1066,7 +1066,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing DoubleSpinBox.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBox.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/DoubleSpinBox.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -1077,7 +1077,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing SpinBox.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/SpinBox.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/SpinBox.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing SpinBox.h... @@ -1092,7 +1092,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing SpinBox.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/SpinBox.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/SpinBox.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." @@ -1201,7 +1201,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing Fractorium.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/Fractorium.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/Fractorium.h" $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) $(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs) Moc%27ing Fractorium.h... @@ -1216,7 +1216,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"Moc%27ing Fractorium.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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$(ProjectDir)..\..\..\..\glew\include" "-I$(AMDAPPSDKROOT)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/Fractorium.h" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -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)\." "-fFractoriumPch.h" "-f../../../../../Source/Fractorium/Fractorium.h" "$(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$(ProjectDir)..\..\..\..\glew\include" "-I$(CUDA_PATH)include" "-I.\GeneratedFiles\$(ConfigurationName)\." diff --git a/Builds/MSVC/VS2013/Fractorium.vcxproj.filters b/Builds/MSVC/VS2013/Fractorium.vcxproj.filters index ab5eb74..e08fa27 100644 --- a/Builds/MSVC/VS2013/Fractorium.vcxproj.filters +++ b/Builds/MSVC/VS2013/Fractorium.vcxproj.filters @@ -301,9 +301,6 @@ Generated Files\ReleaseNvidia - - Dialogs\Qss - Dialogs\Qss diff --git a/Builds/QtCreator/Ember/Ember.pro b/Builds/QtCreator/Ember/Ember.pro index ac070ab..f7e1b17 100644 --- a/Builds/QtCreator/Ember/Ember.pro +++ b/Builds/QtCreator/Ember/Ember.pro @@ -60,6 +60,7 @@ HEADERS += \ $$PRJ_DIR/Variations05.h \ $$PRJ_DIR/Variations06.h \ $$PRJ_DIR/VariationsDC.h \ + $$PRJ_DIR/VarFuncs.h \ $$PRJ_DIR/Xform.h \ $$PRJ_DIR/XmlToEmber.h diff --git a/Builds/QtCreator/defaults.pri b/Builds/QtCreator/defaults.pri index c2b89cd..c73ba07 100644 --- a/Builds/QtCreator/defaults.pri +++ b/Builds/QtCreator/defaults.pri @@ -12,19 +12,20 @@ unix|macx { SHARE_INSTALL_DIR = /usr/share/fractorium } +EMBER_ROOT = ./../../../ +SRC_DIR = $$EMBER_ROOT/Source +SRC_COMMON_DIR = $$EMBER_ROOT/Source/EmberCommon +ASSETS_DIR = $$EMBER_ROOT/Data + CONFIG(release, debug|release) { CONFIG += warn_off - DESTDIR = $$(PWD)/../../../Bin/release + DESTDIR = $$EMBER_ROOT/Bin/release } CONFIG(debug, debug|release) { - DESTDIR = $$(PWD)/../../../Bin/debug + DESTDIR = $$EMBER_ROOT/Bin/debug } -SRC_DIR = $$(PWD)/../../../Source -SRC_COMMON_DIR = $$(PWD)/../../../Source/EmberCommon -ASSETS_DIR = $$(PWD)/../../../Data - macx { LIBS += -framework OpenGL LIBS += -framework OpenCL @@ -48,10 +49,6 @@ macx { QMAKE_LFLAGS_RELEASE += -s } -nvidia { - QMAKE_CXXFLAGS += -DNVIDIA -} - native { QMAKE_CXXFLAGS += -march=native } else { diff --git a/Data/Variations.xlsx b/Data/Variations.xlsx index e6c1ea4..5ac3a17 100644 Binary files a/Data/Variations.xlsx and b/Data/Variations.xlsx differ diff --git a/Source/Ember/Ember.cpp b/Source/Ember/Ember.cpp index 0d2f96a..9105f24 100644 --- a/Source/Ember/Ember.cpp +++ b/Source/Ember/Ember.cpp @@ -15,6 +15,7 @@ template<> CriticalSection QTIsaac::m_CS = CriticalSectio #include "Palette.h" #include "PaletteList.h" #include "Point.h" +#include "VarFuncs.h" #include "Variation.h" #include "Variations01.h" #include "Variations02.h" @@ -42,7 +43,6 @@ template<> CriticalSection QTIsaac::m_CS = CriticalSectio /// All new templated classes, such as new variations, must be added here. /// Additional instances of static class member variables. /// - namespace EmberNs { bool Timing::m_TimingInit = false; @@ -71,6 +71,7 @@ uint Timing::m_ProcessorCount; template EMBER_API class MotionParam; \ template EMBER_API class EmberMotion; \ template EMBER_API class IteratorHelper; \ + template EMBER_API class VarFuncs; \ template EMBER_API class Variation; \ template EMBER_API class ParamWithName; \ template EMBER_API class ParametricVariation; \ @@ -377,12 +378,14 @@ uint Timing::m_ProcessorCount; EXPORTPREPOSTREGVAR(Crob, T) \ EXPORTPREPOSTREGVAR(BubbleT3D, T) \ EXPORTPREPOSTREGVAR(Synth, T) \ + EXPORTPREPOSTREGVAR(Crackle, T) \ EXPORTPREPOSTREGVAR(DCBubble, T) \ EXPORTPREPOSTREGVAR(DCCarpet, T) \ EXPORTPREPOSTREGVAR(DCCube, T) \ EXPORTPREPOSTREGVAR(DCCylinder, T) \ EXPORTPREPOSTREGVAR(DCGridOut, T) \ EXPORTPREPOSTREGVAR(DCLinear, T) \ + EXPORTPREPOSTREGVAR(DCPerlin, T) \ EXPORTPREPOSTREGVAR(DCZTransl, T) \ EXPORTPREPOSTREGVAR(DCTriangle, T) \ template EMBER_API class VariationList; \ @@ -410,7 +413,6 @@ uint Timing::m_ProcessorCount; template EMBER_API class TemporalFilterCreator; \ template EMBER_API class Interpolater; \ template EMBER_API class Ember; \ - /*template EMBER_API class RenderCallback;*/ \ template EMBER_API class CarToRas; \ template EMBER_API class Curves; \ template EMBER_API class XmlToEmber; \ diff --git a/Source/Ember/Ember.h b/Source/Ember/Ember.h index 345b207..f19aadb 100644 --- a/Source/Ember/Ember.h +++ b/Source/Ember/Ember.h @@ -107,7 +107,6 @@ public: m_Supersample = ember.m_Supersample; m_TemporalSamples = ember.m_TemporalSamples; m_Symmetry = ember.m_Symmetry; - m_Quality = T(ember.m_Quality); m_PixelsPerUnit = T(ember.m_PixelsPerUnit); m_Zoom = T(ember.m_Zoom); @@ -130,29 +129,22 @@ public: m_Background = ember.m_Background; m_Interp = ember.m_Interp; m_AffineInterp = ember.m_AffineInterp; - m_MinRadDE = T(ember.m_MinRadDE); m_MaxRadDE = T(ember.m_MaxRadDE); m_CurveDE = T(ember.m_CurveDE); - m_SpatialFilterType = ember.m_SpatialFilterType; m_SpatialFilterRadius = T(ember.m_SpatialFilterRadius); - m_TemporalFilterType = ember.m_TemporalFilterType; m_TemporalFilterExp = T(ember.m_TemporalFilterExp); m_TemporalFilterWidth = T(ember.m_TemporalFilterWidth); - m_PaletteMode = ember.m_PaletteMode; m_PaletteInterp = ember.m_PaletteInterp; - m_Name = ember.m_Name; m_ParentFilename = ember.m_ParentFilename; - m_Index = ember.m_Index; m_ScaleType = ember.ScaleType(); m_Palette = ember.m_Palette; m_Curves = ember.m_Curves; - m_Xforms.clear(); for (size_t i = 0; i < ember.XformCount(); i++) @@ -160,13 +152,11 @@ public: if (Xform* p = ember.GetXform(i)) { Xform xform = *p;//Will call assignment operator to convert between types T and U. - AddXform(xform); } } Xform finalXform = *ember.FinalXform();//Will call assignment operator to convert between types T and U. - SetFinalXform(finalXform); //Interpolated-against final xforms need animate & color speed set to 0. @@ -184,7 +174,6 @@ public: m_Edits = xmlCopyDoc(ember.m_Edits, 1); CopyVec(m_EmberMotionElements, ember.m_EmberMotionElements); - return *this; } @@ -227,36 +216,28 @@ public: m_Background.Reset(); m_Interp = EMBER_INTERP_LINEAR; m_AffineInterp = AFFINE_INTERP_LOG; - //DE filter. m_MinRadDE = 0; m_MaxRadDE = 9; m_CurveDE = T(0.4); - //Spatial filter. m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER; m_SpatialFilterRadius = T(0.5); - //Temporal filter. m_TemporalFilterType = BOX_TEMPORAL_FILTER; m_TemporalFilterExp = 0; m_TemporalFilterWidth = 1; - //Palette. - m_PaletteMode = PALETTE_STEP; + m_PaletteMode = PALETTE_LINEAR; m_PaletteInterp = INTERP_HSV; - //Curves. m_Curves.Init(); - m_Name = "No name"; m_ParentFilename = "No parent"; - //Internal values. m_Index = 0; m_ScaleType = eScaleType::SCALE_NONE; m_Xforms.reserve(12); - m_Edits = nullptr; } @@ -280,7 +261,6 @@ public: for (size_t i = 0; i < count; i++) { Xform xform; - AddXform(xform); } } @@ -304,7 +284,6 @@ public: Ember Copy(size_t xformPad = 0, bool doFinal = false) { Ember ember(*this); - ember.PadXforms(xformPad); if (doFinal) @@ -367,7 +346,7 @@ public: bool DeleteTotalXform(size_t i) { if (DeleteXform(i)) - { } + { } else if (i == XformCount() && UseFinalXform()) m_FinalXform.Clear(); else @@ -485,7 +464,6 @@ public: for (size_t i = 0; i < TotalXformCount(); i++) { Xform* xform = GetTotalXform(i); - xform->CacheColorVals(); xform->SetPrecalcFlags(); } @@ -624,6 +602,7 @@ public: normalizedWeights.resize(m_Xforms.size()); for (auto& xform : m_Xforms) norm += xform.m_Weight; + for (auto& weight : normalizedWeights) { weight = (norm == T(0) ? T(0) : m_Xforms[i].m_Weight / norm); i++; } } @@ -636,13 +615,15 @@ public: void GetPresentVariations(vector*>& variations, bool baseOnly = true) const { size_t i = 0, xformIndex = 0, totalVarCount = m_FinalXform.TotalVariationCount(); - variations.clear(); - for (auto& xform : m_Xforms) totalVarCount += xform.TotalVariationCount(); + while (auto xform = GetTotalXform(xformIndex++)) + totalVarCount += xform->TotalVariationCount(); + + xformIndex = 0; variations.reserve(totalVarCount); - while (Xform* xform = GetTotalXform(xformIndex++)) + while (auto xform = GetTotalXform(xformIndex++)) { i = 0; totalVarCount = xform->TotalVariationCount(); @@ -654,7 +635,7 @@ public: string tempVarBaseName = tempVar->BaseName(); if (!FindIf(variations, [&] (const Variation* var) -> bool { return tempVar->VariationId() == var->VariationId(); }) && - !FindIf(variations, [&] (const Variation* var) -> bool { return tempVarBaseName == var->BaseName(); })) + !FindIf(variations, [&] (const Variation* var) -> bool { return tempVarBaseName == var->BaseName(); })) variations.push_back(tempVar); } else @@ -676,24 +657,29 @@ public: { bool flattened = false; - for (auto& xform : m_Xforms) flattened |= xform.Flatten(names); + for (auto& xform : m_Xforms) + flattened |= xform.Flatten(names); + + if (UseFinalXform()) + flattened |= m_FinalXform.Flatten(names); return flattened; } /// - /// Flatten all xforms by adding a flatten variation in each if not already present. + /// Unflatten all xforms by removing flatten, pre_flatten and post_flatten. /// - /// True if flatten was removed, false if it wasn't present. + /// True if any flatten was removed, false if it wasn't present. bool Unflatten() { + size_t xformIndex = 0; bool unflattened = false; - for (auto& xform : m_Xforms) + while (auto xform = GetTotalXform(xformIndex++)) { - unflattened |= xform.DeleteVariationById(VAR_PRE_FLATTEN); - unflattened |= xform.DeleteVariationById(VAR_FLATTEN); - unflattened |= xform.DeleteVariationById(VAR_POST_FLATTEN); + unflattened |= xform->DeleteVariationById(VAR_PRE_FLATTEN); + unflattened |= xform->DeleteVariationById(VAR_FLATTEN); + unflattened |= xform->DeleteVariationById(VAR_POST_FLATTEN); } return unflattened; @@ -770,7 +756,6 @@ public: m_TemporalFilterType = embers[0].m_TemporalFilterType; m_PaletteMode = embers[0].m_PaletteMode; m_AffineInterp = embers[0].m_AffineInterp; - //Interpolate ember parameters, these should be in the same order the members are declared. InterpI<&Ember::m_FinalRasW>(embers, coefs, size); InterpI<&Ember::m_FinalRasH>(embers, coefs, size); @@ -804,10 +789,8 @@ public: InterpT<&Ember::m_CurveDE>(embers, coefs, size); InterpT<&Ember::m_SpatialFilterRadius>(embers, coefs, size); InterpX, &Ember::m_Curves>(embers, coefs, size); - //Normally done in assignment, must manually do here. SetProjFunc(); - //An extra step needed here due to the OOD that was not needed in the original. //A small price to pay for the conveniences it affords us elsewhere. //First clear the xforms, and find out the max number of xforms in all of the embers in the list. @@ -855,7 +838,6 @@ public: { Variation* var = thisXform->GetVariation(j); ParametricVariation* parVar = dynamic_cast*>(var);//Will use below if it's parametric. - var->m_Weight = 0; if (parVar) @@ -901,7 +883,6 @@ public: InterpXform<&Xform::m_ColorSpeed>(thisXform, i, embers, coefs, size); InterpXform<&Xform::m_Opacity> (thisXform, i, embers, coefs, size); InterpXform<&Xform::m_Animate> (thisXform, i, embers, coefs, size); - ClampGte0Ref(thisXform->m_Weight); ClampRef(thisXform->m_ColorX, 0, 1); ClampRef(thisXform->m_ColorSpeed, -1, 1); @@ -912,13 +893,10 @@ public: vector cxMag(size); vector cxAng(size); vector cxTrn(size); - thisXform->m_Affine.m_Mat = m23T(0); - //Affine part. Interpolater::ConvertLinearToPolar(embers, size, i, 0, cxAng, cxMag, cxTrn); Interpolater::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Affine); - //Post part. allID = true; @@ -1032,12 +1010,10 @@ public: T t2 = t * t; T t3 = t2 * t; vector cmc(4); - cmc[0] = (2 * t2 - t - t3) / 2; cmc[1] = (3 * t3 - 5 * t2 + 2) / 2; cmc[2] = (4 * t2 - 3 * t3 + t) / 2; cmc[3] = (t3 - t2) / 2; - Interpolate(embers, size, cmc, 0); } @@ -1083,13 +1059,14 @@ public: if (sym == 0) { - static intmax_t symDistrib[] = { + static intmax_t symDistrib[] = + { -4, -3, -2, -2, -2, -1, -1, -1, - 2, 2, 2, - 3, 3, - 4, 4, + 2, 2, 2, + 3, 3, + 4, 4, }; if (rand.Rand() & 1) @@ -1110,7 +1087,6 @@ public: i = XformCount();//Don't apply sym to final. Xform xform; AddXform(xform); - m_Xforms[i].m_Weight = 1; m_Xforms[i].m_ColorSpeed = 0; m_Xforms[i].m_Animate = 0; @@ -1123,7 +1099,6 @@ public: m_Xforms[i].m_Affine.E(1); m_Xforms[i].m_Affine.F(0); m_Xforms[i].AddVariation(new LinearVariation()); - result++; sym = -sym; } @@ -1135,7 +1110,6 @@ public: i = XformCount(); Xform xform; AddXform(xform); - m_Xforms[i].m_Weight = 1; m_Xforms[i].m_ColorSpeed = 0; m_Xforms[i].m_Animate = 0; @@ -1147,7 +1121,6 @@ public: m_Xforms[i].m_Affine.C(0); m_Xforms[i].m_Affine.F(0); m_Xforms[i].AddVariation(new LinearVariation()); - result++; } @@ -1164,9 +1137,13 @@ public: size_t val = 0; if (m_CamZPos != 0) val |= PROJBITS_ZPOS; + if (m_CamPerspective != 0) val |= PROJBITS_PERSP; + if (m_CamPitch != 0) val |= PROJBITS_PITCH; + if (m_CamYaw != 0) val |= PROJBITS_YAW; + if (m_CamDepthBlur != 0) val |= PROJBITS_BLUR; return val; @@ -1199,7 +1176,6 @@ public: void ProjectZPerspective(Point& point, QTIsaac& rand) { T zr = Zeps(1 - m_CamPerspective * (point.m_Z - m_CamZPos)); - point.m_X /= zr; point.m_Y /= zr; point.m_Z -= m_CamZPos; @@ -1215,7 +1191,6 @@ public: T z = point.m_Z - m_CamZPos; T y = m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z; T zr = Zeps(1 - m_CamPerspective * (m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z)); - point.m_X /= zr; point.m_Y = y / zr; point.m_Z -= m_CamZPos; @@ -1231,16 +1206,12 @@ public: T y, z, zr; T dsin, dcos; T t = rand.Frand01() * M_2PI; - z = point.m_Z - m_CamZPos; y = m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z; z = m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z; zr = Zeps(1 - m_CamPerspective * z); - sincos(t, &dsin, &dcos); - T dr = rand.Frand01() * m_BlurCoef * z; - point.m_X = (point.m_X + dr * dcos) / zr; point.m_Y = (y + dr * dsin) / zr; point.m_Z -= m_CamZPos; @@ -1258,14 +1229,10 @@ public: T z = point.m_Z - m_CamZPos; T x = m_CamMat[0][0] * point.m_X + m_CamMat[1][0] * point.m_Y; T y = m_CamMat[0][1] * point.m_X + m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z; - z = m_CamMat[0][2] * point.m_X + m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z; - T zr = Zeps(1 - m_CamPerspective * z); T dr = rand.Frand01() * m_BlurCoef * z; - sincos(t, &dsin, &dcos); - point.m_X = (x + dr * dcos) / zr; point.m_Y = (y + dr * dsin) / zr; point.m_Z -= m_CamZPos; @@ -1282,7 +1249,6 @@ public: T x = m_CamMat[0][0] * point.m_X + m_CamMat[1][0] * point.m_Y; T y = m_CamMat[0][1] * point.m_X + m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z; T zr = Zeps(1 - m_CamPerspective * (m_CamMat[0][2] * point.m_X + m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z)); - point.m_X = x / zr; point.m_Y = y / zr; point.m_Z -= m_CamZPos; @@ -1306,60 +1272,77 @@ public: switch (param.first) { - case FLAME_MOTION_ZOOM: - APP_FMP(m_Zoom); - break; - case FLAME_MOTION_ZPOS: - APP_FMP(m_CamZPos); - break; - case FLAME_MOTION_PERSPECTIVE: - APP_FMP(m_CamPerspective); - break; - case FLAME_MOTION_YAW: - APP_FMP(m_CamYaw); - break; - case FLAME_MOTION_PITCH: - APP_FMP(m_CamPitch); - break; - case FLAME_MOTION_DEPTH_BLUR: - APP_FMP(m_CamDepthBlur); - break; - case FLAME_MOTION_CENTER_X: - APP_FMP(m_CenterX); - break; - case FLAME_MOTION_CENTER_Y: - APP_FMP(m_CenterY); - break; - case FLAME_MOTION_ROTATE: - APP_FMP(m_Rotate); - break; - case FLAME_MOTION_BRIGHTNESS: - APP_FMP(m_Brightness); - break; - case FLAME_MOTION_GAMMA: - APP_FMP(m_Gamma); - break; - case FLAME_MOTION_GAMMA_THRESH: - APP_FMP(m_GammaThresh); - break; - case FLAME_MOTION_HIGHLIGHT_POWER: - APP_FMP(m_HighlightPower); - break; - case FLAME_MOTION_BACKGROUND_R: - APP_FMP(m_Background.r); - break; - case FLAME_MOTION_BACKGROUND_G: - APP_FMP(m_Background.g); - break; - case FLAME_MOTION_BACKGROUND_B: - APP_FMP(m_Background.b); - break; - case FLAME_MOTION_VIBRANCY: - APP_FMP(m_Vibrancy); - break; - case FLAME_MOTION_NONE: - default: - break; + case FLAME_MOTION_ZOOM: + APP_FMP(m_Zoom); + break; + + case FLAME_MOTION_ZPOS: + APP_FMP(m_CamZPos); + break; + + case FLAME_MOTION_PERSPECTIVE: + APP_FMP(m_CamPerspective); + break; + + case FLAME_MOTION_YAW: + APP_FMP(m_CamYaw); + break; + + case FLAME_MOTION_PITCH: + APP_FMP(m_CamPitch); + break; + + case FLAME_MOTION_DEPTH_BLUR: + APP_FMP(m_CamDepthBlur); + break; + + case FLAME_MOTION_CENTER_X: + APP_FMP(m_CenterX); + break; + + case FLAME_MOTION_CENTER_Y: + APP_FMP(m_CenterY); + break; + + case FLAME_MOTION_ROTATE: + APP_FMP(m_Rotate); + break; + + case FLAME_MOTION_BRIGHTNESS: + APP_FMP(m_Brightness); + break; + + case FLAME_MOTION_GAMMA: + APP_FMP(m_Gamma); + break; + + case FLAME_MOTION_GAMMA_THRESH: + APP_FMP(m_GammaThresh); + break; + + case FLAME_MOTION_HIGHLIGHT_POWER: + APP_FMP(m_HighlightPower); + break; + + case FLAME_MOTION_BACKGROUND_R: + APP_FMP(m_Background.r); + break; + + case FLAME_MOTION_BACKGROUND_G: + APP_FMP(m_Background.g); + break; + + case FLAME_MOTION_BACKGROUND_B: + APP_FMP(m_Background.b); + break; + + case FLAME_MOTION_VIBRANCY: + APP_FMP(m_Vibrancy); + break; + + case FLAME_MOTION_NONE: + default: + break; } } } @@ -1475,70 +1458,62 @@ public: { size_t i; ostringstream ss; - - ss << "Final Raster Width: " << m_FinalRasW << endl - << "Final Raster Height: " << m_FinalRasH << endl - << "Original Raster Width: " << m_OrigFinalRasW << endl - << "Original Raster Height: " << m_OrigFinalRasH << endl - << "Supersample: " << m_Supersample << endl - << "Temporal Samples: " << m_TemporalSamples << endl - << "Symmetry: " << m_Symmetry << endl - - << "Quality: " << m_Quality << endl - << "Pixels Per Unit: " << m_PixelsPerUnit << endl - << "Original Pixels Per Unit: " << m_OrigPixPerUnit << endl - << "Sub Batch Size: " << m_SubBatchSize << endl - << "Fuse Count: " << m_FuseCount << endl - << "Zoom: " << m_Zoom << endl - << "ZPos: " << m_CamZPos << endl - << "Perspective: " << m_CamPerspective << endl - << "Yaw: " << m_CamYaw << endl - << "Pitch: " << m_CamPitch << endl - << "Depth Blur: " << m_CamDepthBlur << endl - << "CenterX: " << m_CenterX << endl - << "CenterY: " << m_CenterY << endl - << "RotCenterY: " << m_RotCenterY << endl - << "Rotate: " << m_Rotate << endl - << "Brightness: " << m_Brightness << endl - << "Gamma: " << m_Gamma << endl - << "Vibrancy: " << m_Vibrancy << endl - << "Gamma Threshold: " << m_GammaThresh << endl - << "Highlight Power: " << m_HighlightPower << endl - << "Time: " << m_Time << endl - << "Background: " << m_Background.r << ", " << m_Background.g << ", " << m_Background.b << ", " << m_Background.a << endl - - << "Interp: " << m_Interp << endl - << "Affine Interp Type: " << m_AffineInterp << endl - - << "Minimum DE Radius: " << m_MinRadDE << endl - << "Maximum DE Radius: " << m_MaxRadDE << endl - << "DE Curve: " << m_CurveDE << endl - - << "Spatial Filter Type: " << m_SpatialFilterType << endl - << "Spatial Filter Radius: " << m_SpatialFilterRadius << endl - - << "Temporal Filter Type: " << m_TemporalFilterType << endl - << "Temporal Filter Exp: " << m_TemporalFilterExp << endl - << "Temporal Filter Width: " << m_TemporalFilterWidth << endl - - << "Palette Mode: " << m_PaletteMode << endl - << "Palette Interp: " << m_PaletteInterp << endl - << "Palette Index: " << m_Palette.m_Index << endl + ss << "Final Raster Width: " << m_FinalRasW << "\n" + << "Final Raster Height: " << m_FinalRasH << "\n" + << "Original Raster Width: " << m_OrigFinalRasW << "\n" + << "Original Raster Height: " << m_OrigFinalRasH << "\n" + << "Supersample: " << m_Supersample << "\n" + << "Temporal Samples: " << m_TemporalSamples << "\n" + << "Symmetry: " << m_Symmetry << "\n" + << "Quality: " << m_Quality << "\n" + << "Pixels Per Unit: " << m_PixelsPerUnit << "\n" + << "Original Pixels Per Unit: " << m_OrigPixPerUnit << "\n" + << "Sub Batch Size: " << m_SubBatchSize << "\n" + << "Fuse Count: " << m_FuseCount << "\n" + << "Zoom: " << m_Zoom << "\n" + << "ZPos: " << m_CamZPos << "\n" + << "Perspective: " << m_CamPerspective << "\n" + << "Yaw: " << m_CamYaw << "\n" + << "Pitch: " << m_CamPitch << "\n" + << "Depth Blur: " << m_CamDepthBlur << "\n" + << "CenterX: " << m_CenterX << "\n" + << "CenterY: " << m_CenterY << "\n" + << "RotCenterY: " << m_RotCenterY << "\n" + << "Rotate: " << m_Rotate << "\n" + << "Brightness: " << m_Brightness << "\n" + << "Gamma: " << m_Gamma << "\n" + << "Vibrancy: " << m_Vibrancy << "\n" + << "Gamma Threshold: " << m_GammaThresh << "\n" + << "Highlight Power: " << m_HighlightPower << "\n" + << "Time: " << m_Time << "\n" + << "Background: " << m_Background.r << ", " << m_Background.g << ", " << m_Background.b << ", " << m_Background.a << "\n" + << "Interp: " << m_Interp << "\n" + << "Affine Interp Type: " << m_AffineInterp << "\n" + << "Minimum DE Radius: " << m_MinRadDE << "\n" + << "Maximum DE Radius: " << m_MaxRadDE << "\n" + << "DE Curve: " << m_CurveDE << "\n" + << "Spatial Filter Type: " << m_SpatialFilterType << "\n" + << "Spatial Filter Radius: " << m_SpatialFilterRadius << "\n" + << "Temporal Filter Type: " << m_TemporalFilterType << "\n" + << "Temporal Filter Exp: " << m_TemporalFilterExp << "\n" + << "Temporal Filter Width: " << m_TemporalFilterWidth << "\n" + << "Palette Mode: " << m_PaletteMode << "\n" + << "Palette Interp: " << m_PaletteInterp << "\n" + << "Palette Index: " << m_Palette.m_Index << "\n" //Add palette info here if needed. - - << "Name: " << m_Name << endl - << "Index: " << m_Index << endl - << "Scale Type: " << m_ScaleType << endl - << "Parent Filename: " << m_ParentFilename << endl - << endl; + << "Name: " << m_Name << "\n" + << "Index: " << m_Index << "\n" + << "Scale Type: " << m_ScaleType << "\n" + << "Parent Filename: " << m_ParentFilename << "\n" + << "\n"; for (i = 0; i < XformCount(); i++) { - ss << "Xform " << i << ":" << endl << m_Xforms[i].ToString() << endl; + ss << "Xform " << i << ":\n" << m_Xforms[i].ToString() << "\n"; } if (UseFinalXform()) - ss << "Final Xform: " << m_FinalXform.ToString() << endl; + ss << "Final Xform: " << m_FinalXform.ToString() << "\n"; return ss.str(); } diff --git a/Source/Ember/EmberPch.h b/Source/Ember/EmberPch.h index e57b407..5a32122 100644 --- a/Source/Ember/EmberPch.h +++ b/Source/Ember/EmberPch.h @@ -28,6 +28,7 @@ //Standard headers. #include +#include #include #include #include @@ -38,9 +39,9 @@ #include #include #ifdef __APPLE__ -#include + #include #else -#include + #include #endif #include #include @@ -57,9 +58,9 @@ //Third party headers. #ifdef _WIN32 -#include "libxml/parser.h" + #include "libxml/parser.h" #else -#include "libxml2/libxml/parser.h" + #include "libxml2/libxml/parser.h" #endif //Intel's Threading Building Blocks is what's used for all threading. @@ -69,7 +70,7 @@ #define GLM_FORCE_RADIANS 1 #ifndef __APPLE__ -#define GLM_FORCE_INLINE 1 + #define GLM_FORCE_INLINE 1 #endif //glm is what's used for matrix math. diff --git a/Source/Ember/Iterator.h b/Source/Ember/Iterator.h index c277d4f..b02ff46 100644 --- a/Source/Ember/Iterator.h +++ b/Source/Ember/Iterator.h @@ -124,7 +124,6 @@ public: //Original returned false if all were 0, but it's allowed here //which will just end up setting all elements to 0 which means //only the first xform will get used. - //Calculate how much of a fraction of a the total density each element represents. size_t j = 0; //These must be double, else roundoff error will prevent the last element of m_XformDistributions from being set. @@ -147,9 +146,11 @@ public: while (tempDensity < currentDensityLimit && j < CHOOSE_XFORM_GRAIN) { #ifdef _DEBUG + //Ensure distribution contains no out of bounds indices. if (byte(i) >= ember.XformCount()) throw "Out of bounds xform index in selection distribution."; + #endif //printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity); m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i); @@ -159,10 +160,16 @@ public: } #ifdef _DEBUG + //Ensure every element of the distribution was populated. if (j < CHOOSE_XFORM_GRAIN) throw "Not all distribution elements set, undefined behavior."; + #endif + + for (; j < CHOOSE_XFORM_GRAIN; j++)//Make absolutely sure they are set to a valid value. + m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i - 1); + //Flam3 did this, which gives the same result. //T t = xforms[0].m_Weight; // @@ -217,7 +224,6 @@ protected: firstBadPoint.m_Z = 0; firstBadPoint.m_ColorX = point->m_ColorX; firstBadPoint.m_VizAdjusted = point->m_VizAdjusted; - xformIndex = NextXformFromIndex(rand.Rand()); if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand)) @@ -250,7 +256,6 @@ protected: if (IsClose(ember.FinalXform()->m_Opacity, 1) || rand.Frand01() < ember.FinalXform()->m_Opacity) { T tempVizAdjusted = tempPoint.m_VizAdjusted; - ember.NonConstFinalXform()->Apply(&tempPoint, sample, rand); sample->m_VizAdjusted = tempVizAdjusted; } @@ -282,7 +287,7 @@ protected: template class EMBER_API StandardIterator : public Iterator { -ITERATORUSINGS + ITERATORUSINGS public: /// /// Empty constructor. @@ -405,7 +410,7 @@ public: template class EMBER_API XaosIterator : public Iterator { -ITERATORUSINGS + ITERATORUSINGS public: /// /// Empty constructor. @@ -439,7 +444,6 @@ public: firstBadPoint.m_Z = 0; firstBadPoint.m_ColorX = point->m_ColorX; firstBadPoint.m_VizAdjusted = point->m_VizAdjusted; - xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed); if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand)) diff --git a/Source/Ember/Utils.h b/Source/Ember/Utils.h index da8f49d..dc31b2a 100644 --- a/Source/Ember/Utils.h +++ b/Source/Ember/Utils.h @@ -50,7 +50,7 @@ static inline bool FindIf(c& container, pr pred) template static inline bool Contains(c& container, const T& val) { - return std::find_if(container.begin(), container.end(), [&](const T& t) -> bool { return t == val; }) != container.end(); + return std::find_if(container.begin(), container.end(), [&](const T & t) -> bool { return t == val; }) != container.end(); } /// @@ -178,6 +178,67 @@ private: vector m_ErrorReport; }; +/// +/// A base class for handling singletons that ensures only one instance exists, but +/// also deletes the instance after there are no more references to it. +/// This fixes the problem of the normal singleton pattern that uses a static function +/// variable. That pattern does not delete the instance until after main() exits +/// which can cause serious problems with certain libraries. +/// This class will delete before main exits. +/// Note that it still uses a local static variable because static templated +/// member variables cannot be exported across module boundaries. +/// Derived classes should inherit from this using the CRTP, and declare a friend to it. +/// They also should make their constructors private and destructors public. +/// Attribution: This class is a combination of +/// http://btorpey.github.io/blog/2014/02/12/shared-singletons/ +/// and +/// http://enki-tech.blogspot.com/2012/08/c11-generic-singleton.html +/// +template +class Singleton +{ +public: + /// + /// Create and return an instance of T. + /// + /// The args to forward to the constructor of T + /// A shared_ptr + template + static shared_ptr Instance(Args... args) + { + static weak_ptr staticInstance; + auto temp = staticInstance.lock(); + + if (!temp) + { + temp.reset(new T(std::forward(args)...)); + staticInstance = temp; + } + + return temp; + } +}; + +//Use this if the body of the destructor will be implemented in a cpp file. +#define SINGLETON_DERIVED_DECL(x) \ + friend class Singleton; \ + public: \ + ~x(); \ + \ + private: \ + x(const x& other) = delete; \ + const x& operator=(const x& other) = delete//Semicolon deliberately omitted to force it on the caller. + +//Use this if the body of the destructor is empty and is will be implemented inline in the header file. +#define SINGLETON_DERIVED_IMPL(x) \ + friend class Singleton; \ + public: \ + ~x(){} \ + \ + private: \ + x(const x& other) = delete; \ + const x& operator=(const x& other) = delete + /// /// Open a file in binary mode and read its entire contents into a vector of bytes. Optionally null terminate. /// @@ -197,7 +258,6 @@ static bool ReadFile(const char* filename, string& buf, bool nullTerminate = tru if (f) { struct _stat statBuf; - #if defined(_WIN32) || defined(__APPLE__) int statResult = _fstat(f->_file, &statBuf);//Get data associated with file. #else @@ -582,7 +642,7 @@ static inline T SafeTan(T x) template <> #ifdef _WIN32 -static + static #endif float SafeTan(float x) { @@ -591,7 +651,7 @@ float SafeTan(float x) template <> #ifdef _WIN32 -static + static #endif double SafeTan(double x) { @@ -694,7 +754,6 @@ template static inline T Fabsmod(T v) { T dummy; - return modf(v, &dummy); } @@ -831,7 +890,6 @@ static inline T NormalizeDeg360(T angle) static string ToLower(const string& str) { string lower; - lower.resize(str.size());//Allocate the destination space. std::transform(str.begin(), str.end(), lower.begin(), ::tolower);//Convert the source string to lower case storing the result in the destination string. return lower; @@ -845,7 +903,6 @@ static string ToLower(const string& str) static string ToUpper(const string& str) { string upper; - upper.resize(str.size());//Allocate the destination space. std::transform(str.begin(), str.end(), upper.begin(), ::toupper);//Convert the source string to lower case storing the result in the destination string. return upper; @@ -924,7 +981,6 @@ static inline T Arg(char* name, T def) { T tempVal; istringstream istr(ch); - istr >> tempVal; if (!istr.bad() && !istr.fail()) @@ -947,7 +1003,7 @@ static inline T Arg(char* name, T def) /// The value of the specified environment variable if found, else default template <> #ifdef _WIN32 -static + static #endif bool Arg(char* name, bool def) { @@ -962,7 +1018,7 @@ bool Arg(char* name, bool def) /// The value of the specified environment variable if found, else default template <> #ifdef _WIN32 -static + static #endif string Arg(char* name, string def) { diff --git a/Source/Ember/VarFuncs.h b/Source/Ember/VarFuncs.h new file mode 100644 index 0000000..a13a3e8 --- /dev/null +++ b/Source/Ember/VarFuncs.h @@ -0,0 +1,710 @@ +#pragma once + +#include "Utils.h" + +/// +/// VarFuncs class. +/// + +namespace EmberNs +{ +/// +/// Central coordinating place for code and data common to some variations. +/// This class is a singleton since all of its data is shared and read-only. +/// +template +class EMBER_API VarFuncs : public Singleton> +{ +public: + /// + /// Retrieve information about a piece of shared data by looking + /// up its name. + /// + /// The name of the shared data to retrieve + /// A pointer to the beginning of the data and its size in terms of sizeof(T) + std::pair* GetSharedData(const string& name) + { + const auto& data = m_GlobalMap.find(name); + + if (data != m_GlobalMap.end()) + return &data->second; + else + return nullptr; + } + + /// + /// The size of the index array. + /// + /// size_t + inline size_t IndexCount() const + { + return m_P.size(); + } + + /// + /// Get the index value at the specified index. + /// + /// The index to retrieve + /// int + inline int Index(int i) const + { + return m_P[i]; + } + + /// + /// Get a const reference to the 3 component vector at the specified index. + /// + /// The index to retrieve + /// v3T& + inline v3T& Grad(int i) + { + return m_Grad[i]; + } + + /// + /// Get the size of the gradient vector. + /// + /// size_t + inline size_t GradCount() const + { + return m_Grad.size(); + } + + /// + /// Get a pointer to the floating point index values. + /// + /// T* + inline T* IndexFloats() const + { + return const_cast(m_PFloats.data()); + } + + /// + /// Compute 3D simplex nosie value based on the 3 component vector passed in. + /// + /// The vector to use to compute the value + /// T + T SimplexNoise3D(const v3T& v) + { + v3T c[4]; // Co-ordinates of four simplex shape corners in (x,y,z) + T n = 0; // Noise total value + int gi[4]; // Hashed grid index for each corner, used to determine gradient + T t; // Temp double + // Convert input co-ordinates ( x, y, z ) to + // integer-based simplex grid ( i, j, k ) + T skewIn = (v.x + v.y + v.z) * T(0.3333); + intmax_t i = Floor(v.x + skewIn); + intmax_t j = Floor(v.y + skewIn); + intmax_t k = Floor(v.z + skewIn); + t = (i + j + k) * T(0.16666); + // Cell origin co-ordinates in input space (x,y,z) + T x0 = i - t; + T y0 = j - t; + T z0 = k - t; + // This value of t finished with, not used later . . . + // Point offset within cell, in input space (x,y,z) + c[0].x = v.x - x0; + c[0].y = v.y - y0; + c[0].z = v.z - z0; + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // The nested logic determines which simplex we are in, and therefore in which + // order to get gradients for the four corners + int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + + // The fourth corner is always i3 = 1, j3 = 1, k3 = 1, so no need to + // calculate values + if (c[0].x >= c[0].y) + { + if (c[0].y >= c[0].z) + { + i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0; + } + else // y0= c[0].z) + { + i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1; + } + else + { + i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1; + } + } + } + else // x0 0) + { + v3T u = m_Grad[gi[corner]]; + t *= t; + n += t * t * (u.x * c[corner].x + u.y * c[corner].y + u.z * c[corner].z); + } + } + + // The result is scaled be fit -1.0 to 1.0 + return 32 * n; + } + + /// + /// Compute a perlin noise value based on the values passed in. + /// This will iteratively call SimplexNoise3D(). + /// + /// The vector + /// A value to scale a by + /// A value to scale f by + /// The number of iterations to perform + /// T + T PerlinNoise3D(v3T& v, T aScale, T fScale, int octaves) + { + int i; + T n = 0, a = 1; + v3T u = v; + + for (i = 0; i < octaves; i++) + { + n += SimplexNoise3D(u) / a; + a *= aScale; + u.x *= fScale; + u.y *= fScale; + u.x *= fScale; + } + + return n; + } + + /// + /// Find the element in p which is closest to u and return + /// the index of that element. + /// + /// The vector of points to examine + /// The number of points in p to examine + /// The point to compare p gainst + /// Integer index in p which contained the closest point + static int Closest(v2T* p, int n, v2T& u) + { + T d2; + T d2min = TMAX; + int i, j = 0; + + for (i = 0; i < n; i++) + { + d2 = Sqr(p[i].x - u.x) + Sqr(p[i].y - u.y); + + if (d2 < d2min) + { + d2min = d2; + j = i; + } + } + + return j; + } + + /// + /// Unsure. + /// + static T Vratio(const v2T& p, const v2T& q, const v2T& u) + { + v2T pmq = p - q; + + if (pmq.x == 0 || pmq.y == 0) + return 1; + + return 2 * ((u.x - q.x) * pmq.x + (u.y - q.y) * pmq.y) / (pmq.x * pmq.x + pmq.y * pmq.y); + } + + /// + /// Unsure. + /// + static T Voronoi(v2T* p, int n, int q, v2T& u) + { + T ratio; + T ratiomax = TLOW; + int i; + + for (i = 0; i < n; i++) + { + if (i != q) + { + ratio = Vratio(p[i], p[q], u); + + if (ratio > ratiomax) + ratiomax = ratio; + } + } + + return ratiomax; + } + + SINGLETON_DERIVED_IMPL(VarFuncs); + +private: + /// + /// Constructor which initializes data and adds information about them to a global map. + /// + VarFuncs() + { + m_P = InitInts(); + m_Grad = InitGrad(); + m_GlobalMap["NOISE_INDEX"] = make_pair(m_PFloats.data(), m_PFloats.size()); + m_GlobalMap["NOISE_POINTS"] = make_pair(static_cast(&(m_Grad[0].x)), SizeOf(m_Grad) / sizeof(T)); + } + + /// + /// Initializes integer indices via initializer list. + /// Called once from the constructor. + /// + /// A copy of the locally declared vector + std::vector InitInts() + { + std::vector p = + { + 127, 71, 882, 898, 798, 463, 517, 451, 454, 634, 578, 695, 728, 742, 325, 350, 684, 153, 340, + 311, 992, 706, 218, 285, 96, 486, 160, 98, 686, 288, 193, 119, 410, 246, 536, 415, 953, 417, + 784, 573, 734, 1, 136, 381, 177, 678, 773, 22, 301, 51, 874, 844, 775, 744, 633, 468, 1019, + 287, 475, 78, 294, 724, 519, 17, 323, 191, 187, 446, 262, 212, 170, 33, 7, 227, 566, 526, 264, + 556, 717, 477, 815, 671, 225, 207, 692, 663, 969, 393, 658, 877, 353, 788, 128, 303, 614, 501, + 490, 387, 53, 941, 951, 736, 539, 102, 163, 175, 584, 988, 35, 347, 442, 649, 642, 198, 727, + 939, 913, 811, 894, 858, 181, 412, 307, 830, 154, 479, 704, 326, 681, 619, 698, 621, 552, 598, + 74, 890, 299, 922, 701, 481, 867, 214, 817, 731, 768, 673, 315, 338, 576, 222, 484, 305, 623, + 239, 269, 46, 748, 608, 546, 537, 125, 667, 998, 714, 529, 823, 247, 289, 771, 808, 973, 735, + 516, 974, 702, 636, 357, 455, 600, 80, 336, 696, 963, 297, 92, 980, 670, 958, 625, 712, 406, + 173, 19, 763, 470, 793, 283, 655, 59, 421, 1016, 219, 13, 105, 840, 111, 38, 408, 945, 242, + 559, 206, 443, 331, 737, 580, 767, 1020, 220, 31, 968, 15, 527, 833, 139, 129, 859, 739, 418, + 783, 933, 49, 789, 178, 124, 772, 627, 0, 23, 388, 950, 976, 940, 485, 685, 21, 523, 723, 244, + 637, 488, 835, 379, 342, 452, 862, 295, 765, 897, 507, 370, 567, 416, 100, 914, 300, 120, 392, + 694, 94, 265, 791, 171, 200, 787, 441, 868, 672, 769, 983, 911, 427, 82, 69, 224, 176, 920, + 500, 462, 263, 513, 797, 293, 322, 645, 469, 635, 40, 215, 687, 960, 818, 826, 34, 603, 316, + 994, 611, 511, 93, 899, 114, 73, 241, 585, 327, 674, 280, 957, 471, 24, 502, 355, 159, 1017, + 855, 270, 538, 521, 162, 880, 334, 986, 740, 719, 266, 820, 97, 41, 52, 750, 893, 838, 616, 83, + 896, 777, 464, 562, 183, 362, 411, 478, 398, 384, 912, 599, 587, 609, 822, 243, 504, 753, 857, + 157, 964, 65, 261, 81, 371, 435, 924, 885, 884, 863, 613, 721, 669, 121, 639, 989, 487, 238, + 448, 216, 852, 643, 713, 676, 277, 879, 133, 123, 304, 547, 396, 70, 141, 909, 848, 900, 318, + 146, 356, 802, 4, 807, 558, 764, 545, 588, 872, 554, 467, 544, 505, 149, 62, 901, 64, 45, 813, + 27, 109, 718, 803, 853, 996, 1014, 476, 575, 28, 199, 688, 6, 482, 703, 560, 395, 66, 341, 794, + 422, 376, 601, 76, 14, 569, 480, 39, 1011, 1001, 854, 55, 89, 335, 761, 363, 419, 252, 799, + 358, 324, 1012, 152, 312, 496, 235, 916, 582, 615, 979, 1005, 891, 1013, 641, 18, 148, 185, + 512, 378, 58, 211, 495, 594, 87, 762, 366, 660, 449, 520, 424, 886, 819, 281, 147, 290, 390, + 32, 572, 993, 720, 683, 309, 254, 607, 568, 256, 533, 394, 620, 429, 67, 831, 103, 423, 668, + 693, 518, 551, 697, 253, 949, 54, 875, 116, 434, 743, 644, 590, 279, 843, 589, 11, 647, 586, + 806, 549, 375, 226, 851, 499, 450, 978, 29, 982, 189, 107, 508, 373, 796, 20, 700, 110, 26, + 461, 782, 591, 828, 57, 904, 847, 328, 122, 630, 711, 44, 397, 404, 209, 365, 84, 194, 1021, + 675, 135, 965, 329, 557, 691, 79, 352, 498, 629, 869, 90, 921, 233, 622, 871, 755, 439, 955, + 228, 63, 825, 43, 943, 438, 144, 961, 359, 330, 682, 626, 425, 259, 249, 801, 754, 1003, 230, + 377, 217, 878, 1007, 313, 2, 915, 550, 271, 437, 846, 548, 145, 715, 346, 251, 372, 99, 543, + 16, 47, 195, 679, 174, 905, 188, 804, 169, 785, 231, 726, 814, 339, 531, 420, 258, 1009, 134, + 972, 458, 234, 690, 260, 666, 646, 142, 184, 91, 628, 987, 10, 210, 926, 348, 386, 161, 60, + 409, 680, 204, 164, 444, 708, 276, 68, 383, 491, 382, 42, 816, 483, 699, 150, 9, 565, 555, 433, + 593, 86, 952, 839, 618, 751, 889, 108, 361, 595, 677, 407, 856, 255, 604, 85, 648, 928, 824, + 213, 192, 267, 902, 792, 656, 631, 403, 389, 493, 333, 756, 602, 925, 113, 632, 354, 37, 873, + 577, 56, 278, 930, 367, 428, 332, 317, 530, 364, 800, 774, 497, 1023, 12, 137, 845, 653, 101, + 888, 542, 167, 48, 158, 1002, 745, 292, 944, 456, 990, 574, 25, 1018, 937, 298, 966, 430, 400, + 349, 860, 689, 320, 117, 778, 104, 314, 786, 205, 606, 440, 936, 457, 932, 934, 948, 168, 445, + 931, 757, 291, 571, 919, 360, 284, 509, 296, 245, 836, 166, 3, 257, 50, 282, 151, 810, 344, + 947, 236, 946, 865, 752, 77, 610, 967, 795, 131, 302, 760, 781, 190, 938, 61, 1022, 652, 138, + 984, 832, 202, 140, 985, 5, 657, 997, 401, 319, 431, 662, 405, 275, 650, 651, 887, 310, 1004, + 368, 208, 596, 248, 758, 8, 126, 730, 489, 343, 337, 506, 515, 432, 232, 250, 532, 954, 524, + 115, 229, 522, 908, 729, 186, 561, 995, 156, 196, 118, 805, 399, 918, 991, 849, 273, 747, 640, + 143, 321, 624, 268, 306, 30, 722, 540, 534, 710, 130, 155, 883, 716, 525, 426, 812, 345, 929, + 975, 472, 837, 605, 664, 391, 581, 272, 746, 112, 659, 665, 780, 240, 841, 474, 563, 36, 579, + 286, 436, 907, 369, 201, 402, 962, 106, 749, 172, 494, 88, 466, 473, 414, 597, 374, 942, 308, + 766, 459, 821, 592, 881, 380, 759, 866, 779, 809, 876, 541, 829, 528, 999, 221, 661, 927, 413, + 977, 182, 583, 733, 892, 741, 570, 351, 617, 956, 72, 709, 850, 732, 770, 870, 95, 935, 223, + 179, 861, 917, 447, 385, 132, 827, 923, 75, 465, 612, 460, 725, 492, 553, 1008, 910, 981, 503, + 165, 895, 834, 1000, 180, 638, 906, 510, 274, 776, 971, 564, 738, 903, 654, 864, 959, 1015, + 453, 535, 237, 197, 1006, 790, 514, 842, 970, 705, 707, 1010, 203, + + // 1k Block repeats here + + 127, 71, 882, 898, 798, 463, 517, 451, 454, 634, 578, 695, 728, 742, 325, 350, 684, 153, 340, + 311, 992, 706, 218, 285, 96, 486, 160, 98, 686, 288, 193, 119, 410, 246, 536, 415, 953, 417, + 784, 573, 734, 1, 136, 381, 177, 678, 773, 22, 301, 51, 874, 844, 775, 744, 633, 468, 1019, + 287, 475, 78, 294, 724, 519, 17, 323, 191, 187, 446, 262, 212, 170, 33, 7, 227, 566, 526, 264, + 556, 717, 477, 815, 671, 225, 207, 692, 663, 969, 393, 658, 877, 353, 788, 128, 303, 614, 501, + 490, 387, 53, 941, 951, 736, 539, 102, 163, 175, 584, 988, 35, 347, 442, 649, 642, 198, 727, + 939, 913, 811, 894, 858, 181, 412, 307, 830, 154, 479, 704, 326, 681, 619, 698, 621, 552, 598, + 74, 890, 299, 922, 701, 481, 867, 214, 817, 731, 768, 673, 315, 338, 576, 222, 484, 305, 623, + 239, 269, 46, 748, 608, 546, 537, 125, 667, 998, 714, 529, 823, 247, 289, 771, 808, 973, 735, + 516, 974, 702, 636, 357, 455, 600, 80, 336, 696, 963, 297, 92, 980, 670, 958, 625, 712, 406, + 173, 19, 763, 470, 793, 283, 655, 59, 421, 1016, 219, 13, 105, 840, 111, 38, 408, 945, 242, + 559, 206, 443, 331, 737, 580, 767, 1020, 220, 31, 968, 15, 527, 833, 139, 129, 859, 739, 418, + 783, 933, 49, 789, 178, 124, 772, 627, 0, 23, 388, 950, 976, 940, 485, 685, 21, 523, 723, 244, + 637, 488, 835, 379, 342, 452, 862, 295, 765, 897, 507, 370, 567, 416, 100, 914, 300, 120, 392, + 694, 94, 265, 791, 171, 200, 787, 441, 868, 672, 769, 983, 911, 427, 82, 69, 224, 176, 920, + 500, 462, 263, 513, 797, 293, 322, 645, 469, 635, 40, 215, 687, 960, 818, 826, 34, 603, 316, + 994, 611, 511, 93, 899, 114, 73, 241, 585, 327, 674, 280, 957, 471, 24, 502, 355, 159, 1017, + 855, 270, 538, 521, 162, 880, 334, 986, 740, 719, 266, 820, 97, 41, 52, 750, 893, 838, 616, 83, + 896, 777, 464, 562, 183, 362, 411, 478, 398, 384, 912, 599, 587, 609, 822, 243, 504, 753, 857, + 157, 964, 65, 261, 81, 371, 435, 924, 885, 884, 863, 613, 721, 669, 121, 639, 989, 487, 238, + 448, 216, 852, 643, 713, 676, 277, 879, 133, 123, 304, 547, 396, 70, 141, 909, 848, 900, 318, + 146, 356, 802, 4, 807, 558, 764, 545, 588, 872, 554, 467, 544, 505, 149, 62, 901, 64, 45, 813, + 27, 109, 718, 803, 853, 996, 1014, 476, 575, 28, 199, 688, 6, 482, 703, 560, 395, 66, 341, 794, + 422, 376, 601, 76, 14, 569, 480, 39, 1011, 1001, 854, 55, 89, 335, 761, 363, 419, 252, 799, + 358, 324, 1012, 152, 312, 496, 235, 916, 582, 615, 979, 1005, 891, 1013, 641, 18, 148, 185, + 512, 378, 58, 211, 495, 594, 87, 762, 366, 660, 449, 520, 424, 886, 819, 281, 147, 290, 390, + 32, 572, 993, 720, 683, 309, 254, 607, 568, 256, 533, 394, 620, 429, 67, 831, 103, 423, 668, + 693, 518, 551, 697, 253, 949, 54, 875, 116, 434, 743, 644, 590, 279, 843, 589, 11, 647, 586, + 806, 549, 375, 226, 851, 499, 450, 978, 29, 982, 189, 107, 508, 373, 796, 20, 700, 110, 26, + 461, 782, 591, 828, 57, 904, 847, 328, 122, 630, 711, 44, 397, 404, 209, 365, 84, 194, 1021, + 675, 135, 965, 329, 557, 691, 79, 352, 498, 629, 869, 90, 921, 233, 622, 871, 755, 439, 955, + 228, 63, 825, 43, 943, 438, 144, 961, 359, 330, 682, 626, 425, 259, 249, 801, 754, 1003, 230, + 377, 217, 878, 1007, 313, 2, 915, 550, 271, 437, 846, 548, 145, 715, 346, 251, 372, 99, 543, + 16, 47, 195, 679, 174, 905, 188, 804, 169, 785, 231, 726, 814, 339, 531, 420, 258, 1009, 134, + 972, 458, 234, 690, 260, 666, 646, 142, 184, 91, 628, 987, 10, 210, 926, 348, 386, 161, 60, + 409, 680, 204, 164, 444, 708, 276, 68, 383, 491, 382, 42, 816, 483, 699, 150, 9, 565, 555, 433, + 593, 86, 952, 839, 618, 751, 889, 108, 361, 595, 677, 407, 856, 255, 604, 85, 648, 928, 824, + 213, 192, 267, 902, 792, 656, 631, 403, 389, 493, 333, 756, 602, 925, 113, 632, 354, 37, 873, + 577, 56, 278, 930, 367, 428, 332, 317, 530, 364, 800, 774, 497, 1023, 12, 137, 845, 653, 101, + 888, 542, 167, 48, 158, 1002, 745, 292, 944, 456, 990, 574, 25, 1018, 937, 298, 966, 430, 400, + 349, 860, 689, 320, 117, 778, 104, 314, 786, 205, 606, 440, 936, 457, 932, 934, 948, 168, 445, + 931, 757, 291, 571, 919, 360, 284, 509, 296, 245, 836, 166, 3, 257, 50, 282, 151, 810, 344, + 947, 236, 946, 865, 752, 77, 610, 967, 795, 131, 302, 760, 781, 190, 938, 61, 1022, 652, 138, + 984, 832, 202, 140, 985, 5, 657, 997, 401, 319, 431, 662, 405, 275, 650, 651, 887, 310, 1004, + 368, 208, 596, 248, 758, 8, 126, 730, 489, 343, 337, 506, 515, 432, 232, 250, 532, 954, 524, + 115, 229, 522, 908, 729, 186, 561, 995, 156, 196, 118, 805, 399, 918, 991, 849, 273, 747, 640, + 143, 321, 624, 268, 306, 30, 722, 540, 534, 710, 130, 155, 883, 716, 525, 426, 812, 345, 929, + 975, 472, 837, 605, 664, 391, 581, 272, 746, 112, 659, 665, 780, 240, 841, 474, 563, 36, 579, + 286, 436, 907, 369, 201, 402, 962, 106, 749, 172, 494, 88, 466, 473, 414, 597, 374, 942, 308, + 766, 459, 821, 592, 881, 380, 759, 866, 779, 809, 876, 541, 829, 528, 999, 221, 661, 927, 413, + 977, 182, 583, 733, 892, 741, 570, 351, 617, 956, 72, 709, 850, 732, 770, 870, 95, 935, 223, + 179, 861, 917, 447, 385, 132, 827, 923, 75, 465, 612, 460, 725, 492, 553, 1008, 910, 981, 503, + 165, 895, 834, 1000, 180, 638, 906, 510, 274, 776, 971, 564, 738, 903, 654, 864, 959, 1015, + 453, 535, 237, 197, 1006, 790, 514, 842, 970, 705, 707, 1010, 203, + + // 2k block overlaps by two items here . . . (to allow for over-runs caused by taking + // "next item in sequence") + + 127, 71 + }; + //Make a copy of all ints as floats. This is used + //when passed to the OpenCL since the global shared array + //is of type T. + m_PFloats.clear(); + m_PFloats.reserve(p.size()); + + for (size_t i = 0; i < p.size(); i++) + m_PFloats.push_back(T(p[i])); + + return p; + } + + /// + /// Initializes the gradient texture. + /// + /// A copy of the locally declared vector + std::vector InitGrad() + { + std::vector g = + { + v3T{ 0.79148875, 0.11986299, -0.59931496 }, v3T{ 0.51387411, -0.61170974, 0.60145208 }, v3T{ -0.95395128, -0.21599571, 0.20814132 }, v3T{ 0.59830026, 0.67281067, 0.43515813 }, + v3T{ -0.93971346, 0.16019818, -0.30211777 }, v3T{ -0.74549699, -0.35758846, 0.56246309 }, v3T{ -0.78850321, -0.29060783, 0.54204223 }, v3T{ 0.61332339, 0.38915256, 0.68730976 }, + v3T{ -0.64370632, -0.40843865, 0.64716307 }, v3T{ -0.23922684, 0.70399949, -0.66869667 }, v3T{ -0.82882802, -0.00130741, 0.55950192 }, v3T{ 0.07987672, 0.62439350, -0.77701510 }, + v3T{ -0.46863456, -0.57517073, 0.67049257 }, v3T{ 0.30792870, 0.42464616, -0.85138449 }, v3T{ -0.06972001, 0.30439513, 0.94999091 }, v3T{ 0.58798450, -0.00151777, 0.80887077 }, + v3T{ -0.32757867, 0.51578941, 0.79161449 }, v3T{ -0.44745031, 0.86883688, 0.21192142 }, v3T{ -0.38042636, 0.71222019, 0.58993066 }, v3T{ -0.32616370, 0.61421101, -0.71858339 }, + v3T{ 0.45483340, 0.19928843, -0.86799234 }, v3T{ -0.81020233, -0.05930352, 0.58314259 }, v3T{ 0.81994145, 0.39825895, 0.41120046 }, v3T{ 0.49257662, 0.74240487, 0.45409612 }, + v3T{ 0.95124863, -0.26667257, -0.15495734 }, v3T{ -0.95745656, 0.09203090, -0.27350914 }, v3T{ 0.20842499, -0.82482150, -0.52557446 }, v3T{ 0.46829293, -0.47740985, -0.74349282 }, + v3T{ -0.65000311, -0.74754355, 0.13665502 }, v3T{ 0.83566743, 0.53294928, -0.13275921 }, v3T{ 0.90454761, -0.35449497, -0.23691126 }, v3T{ -0.64270969, 0.21532175, 0.73522839 }, + v3T{ -0.39693478, -0.17553935, -0.90090439 }, v3T{ 0.45073049, 0.65155528, 0.61017845 }, v3T{ 0.69618384, -0.07989842, 0.71340333 }, v3T{ 0.09059934, 0.85274641, -0.51440773 }, + v3T{ -0.00560267, 0.69197466, 0.72190005 }, v3T{ 0.23586856, -0.95830502, 0.16129945 }, v3T{ 0.20354340, -0.96925430, -0.13826128 }, v3T{ -0.45516395, 0.63885905, 0.62022970 }, + v3T{ 0.80792021, 0.47917579, 0.34300946 }, v3T{ 0.40886670, -0.32579857, -0.85245722 }, v3T{ -0.83819701, -0.30910810, 0.44930831 }, v3T{ -0.57602641, -0.75801200, 0.30595978 }, + v3T{ -0.16591524, -0.96579983, -0.19925569 }, v3T{ 0.27174061, 0.93638167, -0.22214053 }, v3T{ -0.45758922, 0.73185326, -0.50497812 }, v3T{ -0.18029934, -0.78067110, -0.59836843 }, + v3T{ 0.14087163, -0.39189764, -0.90915974 }, v3T{ -0.03534787, -0.02750024, 0.99899663 }, v3T{ 0.91016878, 0.06772570, 0.40866370 }, v3T{ 0.70142578, 0.70903193, 0.07263332 }, + v3T{ -0.49486157, -0.54111502, -0.67993129 }, v3T{ -0.26972486, -0.84418773, -0.46324462 }, v3T{ 0.91931005, 0.03121901, 0.39229378 }, v3T{ -0.15332070, -0.87495538, 0.45928842 }, + v3T{ -0.59010107, -0.66883868, 0.45214549 }, v3T{ 0.51964273, -0.78565398, -0.33573688 }, v3T{ -0.25845001, 0.87348329, -0.41259003 }, v3T{ -0.64741807, -0.59846669, 0.47189773 }, + v3T{ -0.79348688, -0.32782128, -0.51274923 }, v3T{ -0.86280237, -0.14342378, -0.48476972 }, v3T{ 0.19469709, -0.76349966, 0.61576076 }, v3T{ 0.39371236, -0.70742193, -0.58697938 }, + v3T{ 0.62103834, -0.50000004, -0.60358209 }, v3T{ -0.19652824, -0.51508695, 0.83430335 }, v3T{ -0.96016549, -0.26826630, -0.07820118 }, v3T{ 0.52655683, 0.84118729, 0.12305219 }, + v3T{ 0.56222101, 0.70557745, -0.43135599 }, v3T{ 0.06395307, 0.99025162, -0.12374061 }, v3T{ -0.65379289, 0.52521996, 0.54470070 }, v3T{ 0.81206590, -0.38643765, 0.43728128 }, + v3T{ -0.69449067, -0.71926243, -0.01855435 }, v3T{ 0.33968533, 0.75504287, 0.56082452 }, v3T{ -0.52402654, -0.70537870, -0.47732282 }, v3T{ -0.65379327, -0.46369816, 0.59794512 }, + v3T{ -0.08582021, -0.01217948, 0.99623619 }, v3T{ -0.66287577, 0.49604924, 0.56083051 }, v3T{ 0.70911302, 0.68748287, -0.15660789 }, v3T{ -0.58662137, -0.46475685, 0.66323181 }, + v3T{ -0.76681755, 0.63310950, -0.10565607 }, v3T{ 0.68601816, -0.59353001, 0.42083395 }, v3T{ 0.64792478, -0.72668696, 0.22829704 }, v3T{ 0.68756542, -0.69062543, 0.22425499 }, + v3T{ -0.46901797, -0.72307343, -0.50713604 }, v3T{ -0.71418521, -0.11738817, 0.69004312 }, v3T{ 0.50880449, -0.80611081, 0.30216445 }, v3T{ 0.27793962, -0.58372922, -0.76289565 }, + v3T{ -0.39417207, 0.91575060, -0.07764800 }, v3T{ -0.84724113, -0.47860304, 0.23048124 }, v3T{ 0.67628991, 0.54362408, -0.49709638 }, v3T{ 0.65073821, -0.09420630, 0.75343544 }, + v3T{ 0.66910202, 0.73566783, -0.10533437 }, v3T{ 0.72191995, -0.00305613, 0.69196983 }, v3T{ -0.00313125, 0.06634333, 0.99779194 }, v3T{ -0.06908811, 0.28990653, -0.95455803 }, + v3T{ 0.17507626, 0.73870621, 0.65089280 }, v3T{ -0.57470594, 0.75735703, 0.31003777 }, v3T{ -0.91870733, 0.08883536, 0.38481830 }, v3T{ -0.27399536, 0.39846316, 0.87530203 }, + v3T{ 0.99772699, -0.05473919, 0.03929993 }, v3T{ 0.22663907, 0.97393801, -0.00891541 }, v3T{ 0.62338001, 0.59656797, -0.50547405 }, v3T{ 0.59177247, 0.49473684, -0.63642816 }, + v3T{ -0.24457664, -0.31345545, 0.91756632 }, v3T{ -0.44691491, -0.89198404, -0.06805539 }, v3T{ -0.83115967, -0.44685014, 0.33090566 }, v3T{ -0.39940345, 0.67719937, -0.61796270 }, + v3T{ 0.55460272, -0.63265953, -0.54051619 }, v3T{ 0.82284412, 0.14794174, -0.54867185 }, v3T{ -0.39887172, -0.82890906, -0.39218761 }, v3T{ 0.28591109, 0.71270085, 0.64055628 }, + v3T{ -0.15438831, 0.66966606, 0.72643762 }, v3T{ -0.75134796, 0.54289699, 0.37515211 }, v3T{ 0.32016243, 0.77691605, -0.54212311 }, v3T{ 0.50884942, 0.15171482, -0.84738119 }, + v3T{ 0.08945627, 0.73684807, 0.67011379 }, v3T{ -0.68792851, -0.71885270, -0.10002580 }, v3T{ 0.02292266, -0.07249674, 0.99710520 }, v3T{ 0.94083723, -0.10191422, 0.32316993 }, + v3T{ -0.81053204, 0.43703808, 0.38991733 }, v3T{ -0.19558496, -0.07485841, 0.97782552 }, v3T{ 0.68911052, -0.49915226, -0.52533200 }, v3T{ 0.19796974, 0.93342057, 0.29922235 }, + v3T{ -0.79540501, -0.26473293, 0.54520395 }, v3T{ -0.27945416, -0.91288360, 0.29757168 }, v3T{ 0.82074194, 0.43648314, 0.36859889 }, v3T{ -0.20594999, -0.70696486, -0.67659832 }, + v3T{ -0.05687654, -0.70968577, 0.70221874 }, v3T{ -0.26280466, 0.69993747, -0.66409430 }, v3T{ -0.54551347, -0.78469719, 0.29438983 }, v3T{ 0.90609571, 0.39319111, 0.15617717 }, + v3T{ 0.69129692, 0.67317351, 0.26257571 }, v3T{ 0.98391565, -0.05206160, 0.17087883 }, v3T{ 0.63806303, 0.67740288, -0.36606134 }, v3T{ -0.50096077, 0.83542684, -0.22605378 }, + v3T{ 0.65237128, 0.35509583, 0.66956603 }, v3T{ -0.85711882, -0.19885856, 0.47518691 }, v3T{ 0.79383271, -0.12451513, 0.59525256 }, v3T{ -0.63301076, 0.07907192, 0.77009416 }, + v3T{ 0.57925311, -0.49077742, 0.65084818 }, v3T{ 0.14070842, 0.97298117, 0.18305403 }, v3T{ -0.59601232, 0.69646383, -0.39963413 }, v3T{ -0.68205637, -0.47455943, 0.55641033 }, + v3T{ 0.47997775, -0.84805982, -0.22453484 }, v3T{ 0.83562547, -0.48273957, 0.26209270 }, v3T{ 0.59180830, 0.36411758, 0.71915320 }, v3T{ 0.66057023, -0.66033264, 0.35722231 }, + v3T{ 0.53319130, 0.75511965, 0.38144639 }, v3T{ -0.21631797, -0.12712992, 0.96801060 }, v3T{ -0.23971441, 0.89928294, -0.36582400 }, v3T{ -0.72825564, 0.27377922, -0.62824252 }, + v3T{ 0.02135570, 0.73882696, 0.67355672 }, v3T{ 0.48112026, 0.78759215, 0.38499597 }, v3T{ -0.58250985, -0.09956878, 0.80670213 }, v3T{ 0.21323385, 0.36856735, 0.90481459 }, + v3T{ -0.36459960, -0.93062781, -0.03160697 }, v3T{ -0.68684541, 0.17314748, -0.70587771 }, v3T{ 0.68032531, -0.07909205, -0.72863017 }, v3T{ 0.25007484, -0.61882132, 0.74466284 }, + v3T{ 0.77055613, 0.59380162, 0.23160935 }, v3T{ 0.67996118, -0.03835970, 0.73224403 }, v3T{ 0.43079959, 0.38901749, -0.81429547 }, v3T{ 0.76815116, -0.63831184, 0.05001794 }, + v3T{ -0.13601015, 0.75596033, -0.64033211 }, v3T{ 0.36884321, -0.45188838, -0.81225093 }, v3T{ 0.79562623, -0.43647179, 0.42008485 }, v3T{ -0.65875496, 0.39126701, -0.64261344 }, + v3T{ -0.68899899, 0.44217527, 0.57424858 }, v3T{ 0.25292617, 0.96620732, -0.04971687 }, v3T{ -0.68558843, -0.70460233, 0.18304118 }, v3T{ 0.86382379, 0.29507865, 0.40833448 }, + v3T{ 0.13627838, 0.31500179, 0.93925613 }, v3T{ 0.67187940, 0.64336667, 0.36695693 }, v3T{ 0.37977583, 0.31123423, 0.87115072 }, v3T{ -0.03326050, -0.99451574, -0.09915731 }, + v3T{ -0.66427749, -0.01424397, -0.74735033 }, v3T{ 0.68859558, 0.44744486, -0.57063931 }, v3T{ -0.56738045, 0.30154774, -0.76625608 }, v3T{ -0.58488004, 0.63357146, 0.50646080 }, + v3T{ 0.38842469, 0.92016339, 0.04925032 }, v3T{ 0.15316057, -0.97495961, -0.16123153 }, v3T{ 0.57623375, 0.51659393, 0.63331301 }, v3T{ 0.32392581, -0.79816566, -0.50794059 }, + v3T{ 0.73136440, -0.54179646, 0.41420129 }, v3T{ -0.58929886, -0.58690534, -0.55521975 }, v3T{ 0.64030162, 0.32487137, -0.69604054 }, v3T{ 0.80502987, -0.00635101, 0.59320028 }, + v3T{ 0.46595373, 0.62005710, -0.63120227 }, v3T{ 0.83612498, 0.53677947, 0.11297261 }, v3T{ -0.60753284, -0.29028728, -0.73934913 }, v3T{ -0.45583848, 0.84488003, 0.27998037 }, + v3T{ -0.27320563, -0.39709327, 0.87617100 }, v3T{ 0.84893256, -0.09000823, 0.52078021 }, v3T{ -0.35708766, -0.73203774, 0.58018027 }, v3T{ 0.10507148, -0.71032871, 0.69598355 }, + v3T{ 0.68468508, 0.26788814, -0.67782172 }, v3T{ -0.94602428, -0.13594737, -0.29420466 }, v3T{ 0.27104088, 0.95431757, 0.12575696 }, v3T{ -0.55840113, 0.14909310, 0.81606337 }, + v3T{ 0.47553129, 0.80729730, 0.34948685 }, v3T{ -0.01891509, -0.97526220, 0.22024047 }, v3T{ -0.65760518, -0.45924250, -0.59720327 }, v3T{ -0.70549425, 0.70862555, 0.01129989 }, + v3T{ -0.88864223, 0.43707946, -0.13883994 }, v3T{ 0.49252849, -0.43814774, 0.75195894 }, v3T{ -0.01398277, 0.69598571, 0.71791947 }, v3T{ -0.67265622, 0.27228276, -0.68803758 }, + v3T{ -0.91724038, -0.01083918, -0.39818663 }, v3T{ -0.24468025, 0.75690032, 0.60599792 }, v3T{ -0.49070434, -0.48530058, 0.72366608 }, v3T{ 0.67110346, -0.55453760, -0.49204492 }, + v3T{ -0.95532877, -0.26328211, -0.13427388 }, v3T{ -0.66012945, 0.41730904, 0.62456567 }, v3T{ 0.96822786, -0.03273592, 0.24791766 }, v3T{ 0.91952853, 0.23575545, -0.31446248 }, + v3T{ 0.63712542, 0.06762652, 0.76778763 }, v3T{ -0.21680947, 0.65843559, 0.72073312 }, v3T{ 0.06143588, 0.47272235, -0.87906724 }, v3T{ 0.70541616, -0.21884659, 0.67416186 }, + v3T{ -0.04396589, -0.67487644, -0.73661984 }, v3T{ -0.65032618, 0.75012744, 0.11993615 }, v3T{ -0.78840054, 0.58187068, -0.19962741 }, v3T{ 0.99318416, 0.11467779, 0.02083796 }, + v3T{ 0.76775820, 0.46845611, -0.43714554 }, v3T{ -0.70891635, -0.54302381, -0.45006972 }, v3T{ 0.55548849, -0.71825576, -0.41897638 }, v3T{ -0.62167600, 0.77500231, 0.11353575 }, + v3T{ 0.38413022, -0.79687865, 0.46629218 }, v3T{ -0.56271512, 0.54186596, -0.62428597 }, v3T{ 0.62019121, -0.70563211, -0.34270424 }, v3T{ 0.85913131, 0.50529005, 0.08108862 }, + v3T{ 0.54973106, -0.66129569, -0.51037612 }, v3T{ -0.74254469, -0.49670185, -0.44934914 }, v3T{ -0.75780366, 0.59195518, -0.27444976 }, v3T{ -0.40050287, 0.04302113, -0.91528500 }, + v3T{ -0.60859484, 0.35063171, 0.71180736 }, v3T{ -0.57297537, 0.81938865, -0.01736289 }, v3T{ 0.98721933, 0.09373543, -0.12888621 }, v3T{ 0.30397213, 0.87942861, 0.36634172 }, + v3T{ 0.32615126, -0.64515144, -0.69094498 }, v3T{ 0.83015604, 0.30783918, 0.46483974 }, v3T{ 0.42822875, -0.04288671, -0.90265213 }, v3T{ 0.16585965, 0.53714643, 0.82702133 }, + v3T{ -0.37193298, 0.88497229, 0.28016051 }, v3T{ 0.73544877, 0.67744273, 0.01365471 }, v3T{ -0.66150496, 0.09327263, -0.74411787 }, v3T{ 0.41664753, -0.23786298, -0.87739731 }, + v3T{ -0.78513086, -0.42653313, 0.44904233 }, v3T{ 0.08029855, 0.84803303, 0.52382451 }, v3T{ -0.09507221, 0.50524394, -0.85772364 }, v3T{ 0.66939507, -0.17805679, 0.72125309 }, + v3T{ -0.76923153, 0.41652205, -0.48455364 }, v3T{ 0.51989556, 0.79632686, 0.30914743 }, v3T{ 0.85617969, -0.51024476, 0.08128121 }, v3T{ 0.71830013, 0.03208003, 0.69499337 }, + v3T{ -0.96000528, -0.11640072, -0.25463844 }, v3T{ 0.66084196, -0.19355993, 0.72513617 }, v3T{ -0.57661819, -0.54757438, 0.60636109 }, v3T{ 0.65123443, -0.64818909, -0.39464494 }, + v3T{ 0.36952748, -0.22540306, -0.90146708 }, v3T{ 0.34048182, -0.33515083, 0.87849078 }, v3T{ 0.11132435, -0.75280467, 0.64876191 }, v3T{ 0.67563520, 0.64934616, -0.34909404 }, + v3T{ 0.23316576, 0.69276343, -0.68243135 }, v3T{ 0.30368064, -0.87532007, 0.37628825 }, v3T{ -0.27080673, -0.74246398, 0.61270789 }, v3T{ -0.21655683, -0.49565083, -0.84109060 }, + v3T{ -0.98776592, -0.14473189, 0.05806181 }, v3T{ 0.64562720, 0.38598860, 0.65892209 }, v3T{ -0.63746045, -0.57205546, 0.51613635 }, v3T{ 0.06117405, -0.78423981, -0.61743474 }, + v3T{ 0.74829362, 0.59119862, 0.30090006 }, v3T{ -0.42571462, 0.51302568, -0.74536683 }, v3T{ -0.56331794, 0.48608227, -0.66812943 }, v3T{ -0.75919788, -0.64885422, 0.05105673 }, + v3T{ 0.14385006, -0.53933953, 0.82971081 }, v3T{ -0.77031548, -0.28344830, 0.57120148 }, v3T{ -0.98358057, 0.17900745, 0.02292584 }, v3T{ -0.25051205, 0.10358351, 0.96255606 }, + v3T{ -0.32867861, -0.83176115, -0.44737430 }, v3T{ -0.36281449, -0.92995082, -0.05964161 }, v3T{ -0.53796595, -0.03614791, 0.84219117 }, v3T{ 0.92960703, 0.10461247, 0.35339354 }, + v3T{ 0.64021850, 0.61360003, 0.46218532 }, v3T{ 0.22343529, 0.69409296, 0.68433299 }, v3T{ 0.01781074, 0.89088149, 0.45388648 }, v3T{ -0.63004672, -0.26934609, 0.72835007 }, + v3T{ 0.48560056, -0.35192051, -0.80021500 }, v3T{ 0.62050161, 0.57366872, 0.53467931 }, v3T{ 0.00265452, 0.71539198, -0.69871830 }, v3T{ 0.64229521, 0.41380752, 0.64515130 }, + v3T{ 0.23080049, -0.43573115, 0.86998247 }, v3T{ 0.14620517, 0.61171896, -0.77744708 }, v3T{ -0.27436021, -0.61900378, 0.73590814 }, v3T{ 0.69959023, 0.71050058, 0.07591065 }, + v3T{ 0.70362024, 0.62044755, -0.34635731 }, v3T{ -0.29622242, -0.71700405, -0.63099721 }, v3T{ 0.31094340, -0.84299864, -0.43893905 }, v3T{ 0.07704196, -0.46344069, -0.88277248 }, + v3T{ -0.94533514, -0.04418570, 0.32309301 }, v3T{ 0.65845027, -0.36172634, -0.65999795 }, v3T{ 0.76069300, -0.18013255, 0.62361721 }, v3T{ 0.18607691, -0.45751624, -0.86951382 }, + v3T{ -0.67626808, -0.39178398, -0.62383235 }, v3T{ -0.58782719, 0.55645189, -0.58721418 }, v3T{ 0.37531624, 0.80640206, 0.45700485 }, v3T{ 0.32610790, -0.50457786, 0.79940905 }, + v3T{ 0.62915643, 0.76094546, -0.15850616 }, v3T{ 0.62803678, -0.75273385, -0.19738681 }, v3T{ 0.42539119, -0.89094420, 0.15893638 }, v3T{ 0.17668676, -0.40626331, 0.89651096 }, + v3T{ 0.02778178, -0.78957083, -0.61303024 }, v3T{ -0.25950053, -0.16244258, 0.95198313 }, v3T{ -0.44117714, 0.73727502, -0.51165249 }, v3T{ -0.30827444, 0.94136275, 0.13712420 }, + v3T{ 0.97572111, -0.04258044, -0.21483768 }, v3T{ 0.55607688, 0.60474525, -0.57014181 }, v3T{ -0.67430479, 0.12532345, 0.72774109 }, v3T{ -0.31325824, -0.81393777, -0.48925921 }, + v3T{ -0.34811982, -0.70956566, 0.61264114 }, v3T{ 0.22583632, 0.72502572, -0.65064250 }, v3T{ 0.76936493, 0.63742123, -0.04209247 }, v3T{ -0.55303394, -0.38417341, -0.73929984 }, + v3T{ -0.20953448, -0.92686077, -0.31148742 }, v3T{ -0.18786352, 0.39920999, 0.89740664 }, v3T{ 0.46307517, -0.88470611, 0.05344618 }, v3T{ -0.70328479, 0.30353783, 0.64284935 }, + v3T{ 0.85916171, 0.15710234, 0.48699077 }, v3T{ -0.26398391, 0.42122173, 0.86768932 }, v3T{ 0.82468427, 0.55134621, 0.12614757 }, v3T{ 0.05993298, 0.63414584, 0.77088721 }, + v3T{ -0.57291678, 0.81909656, -0.02910645 }, v3T{ 0.64075141, 0.74416542, -0.18882655 }, v3T{ 0.67112660, -0.55747979, -0.48867716 }, v3T{ 0.89932863, 0.23426637, -0.36922525 }, + v3T{ 0.59146340, -0.44386974, 0.67316469 }, v3T{ 0.46684506, 0.19781570, -0.86193076 }, v3T{ 0.18536399, 0.76259887, 0.61974443 }, v3T{ 0.84144446, -0.53500771, -0.07574940 }, + v3T{ 0.31212800, 0.82898453, -0.46406977 }, v3T{ -0.88440729, -0.27020677, -0.38054178 }, v3T{ 0.20051055, 0.77523319, 0.59900670 }, v3T{ 0.48749115, 0.44082691, -0.75367368 }, + v3T{ 0.24971103, -0.88242146, 0.39871892 }, v3T{ -0.29777449, -0.95158243, -0.07629705 }, v3T{ -0.37776905, -0.58777023, 0.71541366 }, v3T{ 0.22179317, 0.14730715, -0.96390269 }, + v3T{ 0.58348153, 0.68630504, 0.43420582 }, v3T{ -0.96759942, 0.14572096, 0.20619593 }, v3T{ -0.15181654, 0.47495708, 0.86681458 }, v3T{ 0.26580537, 0.74350537, -0.61363447 }, + v3T{ -0.39189499, 0.72950601, 0.56057051 }, v3T{ -0.01888074, 0.73557245, -0.67718290 }, v3T{ 0.73486517, 0.20569655, -0.64626783 }, v3T{ -0.26354754, -0.23595215, -0.93534447 }, + v3T{ -0.62584298, -0.65116585, 0.42930594 }, v3T{ -0.66666701, 0.61406968, 0.42246127 }, v3T{ 0.71799877, 0.67101619, 0.18497305 }, v3T{ 0.80098282, -0.45681211, -0.38697444 }, + v3T{ 0.13205975, 0.91574792, -0.37942847 }, v3T{ 0.68891728, 0.72389791, -0.03694308 }, v3T{ 0.50346408, 0.46323331, -0.72934136 }, v3T{ 0.84557323, 0.53378861, -0.00869685 }, + v3T{ 0.08666773, -0.81879883, 0.56750082 }, v3T{ -0.50044423, 0.65858460, -0.56198033 }, v3T{ 0.35669785, 0.32248792, -0.87679427 }, v3T{ -0.97346629, -0.22237373, -0.05397509 }, + v3T{ -0.53358835, -0.29312069, -0.79332448 }, v3T{ 0.12615748, 0.47083230, 0.87315591 }, v3T{ -0.97022570, 0.19065350, 0.14937651 }, v3T{ -0.57777643, 0.36008023, 0.73247295 }, + v3T{ 0.60132454, 0.72398065, 0.33802488 }, v3T{ 0.19047827, -0.94729649, -0.25757988 }, v3T{ -0.45904437, 0.69100108, 0.55838676 }, v3T{ 0.39148612, -0.51878308, 0.76000180 }, + v3T{ 0.04137949, -0.75662546, -0.65253786 }, v3T{ 0.20020542, -0.76439245, -0.61288006 }, v3T{ 0.07933739, -0.21074410, 0.97431643 }, v3T{ -0.40807425, 0.80614533, 0.42849166 }, + v3T{ -0.95397962, -0.09342040, -0.28494828 }, v3T{ -0.31365384, 0.14377778, -0.93858895 }, v3T{ 0.84618575, -0.39191761, 0.36106822 }, v3T{ -0.90177404, 0.07825801, -0.42506385 }, + v3T{ -0.19689944, -0.97296956, 0.12066831 }, v3T{ 0.61145370, 0.51715369, -0.59889601 }, v3T{ -0.57329050, -0.80450317, -0.15528251 }, v3T{ -0.27749150, -0.76245284, 0.58452044 }, + v3T{ -0.74877628, 0.66124357, 0.04572758 }, v3T{ 0.60284514, 0.58208119, 0.54567318 }, v3T{ 0.17695878, -0.67360184, 0.71759748 }, v3T{ -0.83953853, 0.41240184, 0.35369447 }, + v3T{ 0.37802442, -0.60322405, 0.70229501 }, v3T{ 0.51050450, -0.42970396, 0.74480847 }, v3T{ -0.48366785, -0.20902730, -0.84992529 }, v3T{ -0.87971286, -0.14820690, -0.45181855 }, + v3T{ -0.11520437, -0.59044778, -0.79881123 }, v3T{ 0.38877393, 0.92116844, -0.01742240 }, v3T{ 0.94330646, -0.27385756, -0.18754989 }, v3T{ -0.66585548, 0.46928680, -0.58000550 }, + v3T{ 0.20659390, -0.97226278, -0.10965425 }, v3T{ 0.70114934, 0.70875543, -0.07781609 }, v3T{ 0.50683262, 0.81003447, 0.29489803 }, v3T{ -0.75501572, 0.56485827, -0.33299610 }, + v3T{ -0.43930454, -0.48824131, 0.75407688 }, v3T{ -0.43442626, 0.51174617, 0.74120826 }, v3T{ -0.97139119, -0.22722375, 0.06905442 }, v3T{ -0.27189670, 0.51890879, -0.81043559 }, + v3T{ 0.34109465, 0.91412005, -0.21917797 }, v3T{ 0.23216825, -0.66497033, 0.70986785 }, v3T{ 0.87281521, 0.48669099, 0.03640737 }, v3T{ -0.60266004, -0.34235001, -0.72083101 }, + v3T{ -0.01994494, -0.52747354, 0.84933731 }, v3T{ -0.27000504, -0.77679344, -0.56893693 }, v3T{ -0.12330809, 0.85744248, -0.49958734 }, v3T{ -0.69270982, 0.61145042, -0.38246763 }, + v3T{ -0.60277814, 0.55015465, 0.57791727 }, v3T{ 0.64946165, -0.22132925, -0.72747023 }, v3T{ 0.24257305, 0.26557728, 0.93307397 }, v3T{ -0.66814908, 0.64881591, -0.36416303 }, + v3T{ -0.74538727, -0.44634982, -0.49514609 }, v3T{ 0.25115903, 0.38535072, -0.88793241 }, v3T{ -0.61584597, -0.69782826, -0.36574509 }, v3T{ 0.13745929, 0.92666227, 0.34985995 }, + v3T{ -0.50342245, -0.82980249, -0.24081874 }, v3T{ 0.11249648, 0.99333196, -0.02522230 }, v3T{ 0.83241096, 0.21922825, -0.50895085 }, v3T{ 0.50175590, 0.86108612, 0.08229039 }, + v3T{ -0.35527286, -0.56925625, -0.74143679 }, v3T{ 0.31441654, -0.91653449, 0.24719782 }, v3T{ 0.62936968, 0.70222610, 0.33282475 }, v3T{ 0.77755375, -0.56236234, -0.28135169 }, + v3T{ -0.80098254, -0.37712493, 0.46497715 }, v3T{ 0.59310190, -0.68181911, -0.42819720 }, v3T{ 0.15392285, -0.98282954, 0.10175390 }, v3T{ -0.96618662, 0.25781497, 0.00385483 }, + v3T{ 0.33750940, -0.86020836, 0.38226820 }, v3T{ -0.09597976, -0.40348179, -0.90993974 }, v3T{ -0.70910783, 0.60681107, -0.35909108 }, v3T{ 0.41726791, -0.90380775, 0.09496860 }, + v3T{ -0.03646000, 0.99581799, -0.08376873 }, v3T{ 0.35348135, -0.70899268, 0.61022972 }, v3T{ 0.66002017, 0.74115740, -0.12271547 }, v3T{ 0.18515044, 0.96534454, -0.18392727 }, + v3T{ -0.29364182, -0.88826809, -0.35320572 }, v3T{ 0.99692330, 0.02436644, -0.07449968 }, v3T{ -0.13529570, 0.35908874, 0.92344483 }, v3T{ -0.76888326, -0.29702475, 0.56621095 }, + v3T{ -0.31931644, 0.72859881, 0.60595444 }, v3T{ 0.52827199, -0.82385659, 0.20539968 }, v3T{ -0.83281688, -0.27413556, 0.48090097 }, v3T{ -0.76899198, 0.23377782, 0.59497837 }, + v3T{ -0.60599231, 0.54438401, -0.58001670 }, v3T{ -0.59616975, -0.18605791, 0.78100198 }, v3T{ -0.83753036, 0.32458912, -0.43952794 }, v3T{ 0.62016934, 0.71285793, 0.32745011 }, + v3T{ -0.62489231, 0.01790151, 0.78050570 }, v3T{ -0.44050813, -0.31396367, 0.84105850 }, v3T{ 0.82831903, 0.51349534, 0.22407615 }, v3T{ -0.54638365, -0.42878084, -0.71945250 }, + v3T{ -0.30690837, -0.54588407, -0.77962673 }, v3T{ -0.51419246, 0.49668914, 0.69921814 }, v3T{ 0.12759508, 0.79794754, 0.58906640 }, v3T{ 0.59812622, 0.53597438, 0.59579904 }, + v3T{ 0.75450428, 0.31026344, 0.57832507 }, v3T{ -0.34806954, -0.09710281, 0.93242621 }, v3T{ -0.40140375, -0.85287390, 0.33388792 }, v3T{ 0.57290191, 0.32347021, -0.75309390 }, + v3T{ -0.53362688, -0.81285892, 0.23345818 }, v3T{ -0.74679447, 0.64927639, 0.14400758 }, v3T{ -0.80251380, -0.59638095, 0.01736004 }, v3T{ -0.56868668, 0.61763086, -0.54325646 }, + v3T{ -0.72976559, 0.04179896, -0.68241852 }, v3T{ 0.57244144, -0.09255805, -0.81470474 }, v3T{ 0.97741613, 0.07186077, -0.19873032 }, v3T{ 0.72298477, 0.06613486, 0.68769121 }, + v3T{ -0.42596585, -0.65375247, -0.62542850 }, v3T{ 0.64840687, 0.16136696, -0.74399545 }, v3T{ 0.34352050, -0.92950264, 0.13423304 }, v3T{ 0.74687236, 0.45351768, -0.48631613 }, + v3T{ -0.51873425, -0.73762481, -0.43223191 }, v3T{ 0.29790392, 0.44209023, 0.84605525 }, v3T{ -0.67740274, 0.46717430, -0.56821977 }, v3T{ -0.36224935, -0.42773177, 0.82814307 }, + v3T{ -0.44192484, 0.73919980, 0.50821855 }, v3T{ -0.92680658, -0.18163204, -0.32869343 }, v3T{ -0.71384582, -0.70014113, 0.01505111 }, v3T{ 0.70600729, -0.70152253, 0.09705589 }, + v3T{ 0.90031692, -0.36943663, 0.23010002 }, v3T{ 0.25264659, -0.65121757, -0.71560141 }, v3T{ 0.96727807, 0.19056552, 0.16750499 }, v3T{ -0.65770755, -0.65887301, 0.36511251 }, + v3T{ 0.05208955, -0.10417910, 0.99319353 }, v3T{ -0.65282932, -0.40832320, 0.63803294 }, v3T{ -0.00628739, -0.99502463, -0.09943061 }, v3T{ -0.51900794, -0.62993523, 0.57776497 }, + v3T{ 0.83046729, -0.16527060, 0.53198657 }, v3T{ 0.66869945, -0.56606479, -0.48209097 }, v3T{ -0.54299772, -0.48639669, -0.68452300 }, v3T{ 0.52407156, -0.42268239, 0.73938393 }, + v3T{ 0.71446999, -0.30844019, -0.62801057 }, v3T{ -0.67320882, 0.39978543, 0.62206228 }, v3T{ -0.53289859, -0.05079670, -0.84465306 }, v3T{ 0.67708925, -0.71979254, 0.15313018 }, + v3T{ -0.61369683, 0.65230332, 0.44483321 }, v3T{ -0.26453665, -0.69129417, -0.67240816 }, v3T{ 0.85045794, 0.03075140, 0.52514345 }, v3T{ -0.76757885, -0.10940324, 0.63154861 }, + v3T{ 0.72754104, -0.17450402, -0.66350011 }, v3T{ -0.34075755, -0.67303082, 0.65644026 }, v3T{ 0.70044829, 0.13095479, -0.70158609 }, v3T{ 0.43950040, -0.88211196, 0.16946353 }, + v3T{ -0.35706397, 0.48041126, 0.80106825 }, v3T{ -0.77687193, 0.33320308, -0.53427120 }, v3T{ 0.51274543, 0.77662232, 0.36599165 }, v3T{ 0.33380578, 0.79591657, 0.50506486 }, + v3T{ -0.76587225, -0.03670574, 0.64194422 }, v3T{ -0.23491078, 0.43695339, -0.86826762 }, v3T{ 0.25698923, -0.62346599, 0.73840822 }, v3T{ 0.13009757, -0.93331414, -0.33466303 }, + v3T{ -0.54841950, 0.64297666, -0.53461861 }, v3T{ 0.69823865, 0.51710521, -0.49504039 }, v3T{ -0.64058874, -0.76638614, -0.04794108 }, v3T{ -0.99383538, 0.10829476, 0.02373760 }, + v3T{ 0.53702674, -0.26620457, -0.80046075 }, v3T{ 0.95618706, 0.14762618, 0.25280983 }, v3T{ 0.46882627, -0.32353926, -0.82190284 }, v3T{ 0.37771393, -0.17580406, -0.90907927 }, + v3T{ -0.38046162, 0.14393199, -0.91352752 }, v3T{ 0.99319923, -0.09757638, -0.06351493 }, v3T{ 0.50851715, 0.83898531, 0.19368521 }, v3T{ 0.32506349, -0.66811447, 0.66929574 }, + v3T{ -0.48035988, -0.63636898, -0.60356351 }, v3T{ -0.06435942, 0.26733173, 0.96145286 }, v3T{ 0.60598929, -0.04278909, 0.79432114 }, v3T{ -0.24869997, 0.88809619, -0.38656626 }, + v3T{ 0.37370464, 0.04464997, -0.92647246 }, v3T{ -0.48971589, -0.59472073, 0.63756224 }, v3T{ 0.69752714, 0.12358938, 0.70581978 }, v3T{ 0.52787180, 0.64468756, -0.55292794 }, + v3T{ -0.10489693, 0.16880171, -0.98005235 }, v3T{ -0.63336451, -0.45121552, -0.62869226 }, v3T{ 0.54866356, 0.65678858, 0.51729785 }, v3T{ -0.85968969, 0.49557488, -0.12385145 }, + v3T{ -0.47320716, -0.15150042, 0.86782637 }, v3T{ 0.19900943, -0.10259966, 0.97461200 }, v3T{ -0.52893938, 0.84740153, 0.04619294 }, v3T{ 0.65121421, -0.49243156, -0.57743503 }, + v3T{ 0.45693424, 0.73751862, 0.49726994 }, v3T{ -0.47661222, -0.77374319, -0.41732752 }, v3T{ -0.04808540, 0.90050093, 0.43218730 }, v3T{ 0.91129978, -0.31013948, 0.27082507 }, + v3T{ 0.58778939, -0.42668247, -0.68734686 }, v3T{ 0.82297839, -0.34772114, -0.44921773 }, v3T{ 0.29494223, -0.86544442, -0.40498769 }, v3T{ -0.39161493, 0.79055212, 0.47081322 }, + v3T{ 0.79434783, -0.59398096, -0.12727195 }, v3T{ 0.77174313, 0.29796481, 0.56180915 }, v3T{ 0.78482345, -0.44974833, 0.42635500 }, v3T{ -0.58988658, -0.54565594, 0.59522551 }, + v3T{ -0.97115669, 0.13450224, 0.19688532 }, v3T{ 0.42988246, 0.15513097, -0.88945796 }, v3T{ -0.30013401, -0.45617888, 0.83774722 }, v3T{ 0.50990724, -0.38026491, -0.77161727 }, + v3T{ -0.68923129, 0.29274099, -0.66276914 }, v3T{ -0.81531731, -0.42344291, -0.39490984 }, v3T{ 0.26048163, -0.96468719, -0.03908901 }, v3T{ 0.32147033, 0.32614689, -0.88897977 }, + v3T{ 0.70055924, -0.70700997, 0.09671429 }, v3T{ -0.58890140, -0.17999683, 0.78790626 }, v3T{ 0.70222863, 0.69308083, -0.16283095 }, v3T{ -0.75366081, -0.65098223, -0.09065052 }, + v3T{ -0.19053922, -0.78772343, -0.58582130 }, v3T{ -0.58846812, 0.34955220, 0.72905317 }, v3T{ -0.60563594, -0.40529546, -0.68479244 }, v3T{ -0.71315551, 0.69904447, 0.05240265 }, + v3T{ -0.45479055, 0.81186703, -0.36611129 }, v3T{ -0.29059626, 0.05377439, 0.95533352 }, v3T{ 0.56290473, 0.78501299, 0.25863657 }, v3T{ -0.43010366, -0.47609705, 0.76703484 }, + v3T{ 0.63372606, -0.06214270, -0.77105744 }, v3T{ 0.28788198, -0.78226752, -0.55243234 }, v3T{ -0.55506056, 0.67832002, -0.48144545 }, v3T{ -0.47229498, 0.84794057, -0.24069533 }, + v3T{ -0.27628326, 0.87423025, -0.39923556 }, v3T{ 0.97754921, -0.01429369, -0.21022189 }, v3T{ -0.78483628, 0.30941478, -0.53693064 }, v3T{ -0.35769150, -0.53057471, 0.76847073 }, + v3T{ 0.56804560, 0.59946775, -0.56388173 }, v3T{ 0.80328735, -0.57298006, -0.16255243 }, v3T{ -0.34327107, -0.35133498, -0.87105034 }, v3T{ 0.80357102, -0.01979284, -0.59487970 }, + v3T{ -0.87804782, 0.46346126, 0.11931336 }, v3T{ -0.11872912, -0.93845057, 0.32436695 }, v3T{ 0.68065237, 0.69467363, 0.23268195 }, v3T{ -0.71974506, -0.36713686, 0.58921776 }, + v3T{ 0.52822234, 0.82314813, -0.20834663 }, v3T{ -0.67654042, -0.73158271, 0.08414148 }, v3T{ -0.39062516, 0.89358947, -0.22115571 }, v3T{ -0.62142505, 0.43386674, -0.65237302 }, + v3T{ -0.48099381, -0.18611372, -0.85674188 }, v3T{ 0.05036514, -0.74987003, 0.65966528 }, v3T{ -0.49984895, -0.80920390, -0.30877188 }, v3T{ 0.50496868, 0.85618105, 0.10936472 }, + v3T{ -0.54084761, 0.24485715, 0.80469176 }, v3T{ -0.81973873, -0.50777759, 0.26493457 }, v3T{ 0.72082268, -0.43713926, -0.53788839 }, v3T{ 0.91725234, -0.15187152, 0.36821621 }, + v3T{ -0.17151325, 0.57985483, 0.79646192 }, v3T{ -0.74076471, 0.06061813, -0.66902398 }, v3T{ 0.32541463, -0.08200506, 0.94200875 }, v3T{ -0.10818362, 0.99402161, -0.01474260 }, + v3T{ -0.61710380, -0.78296663, 0.07839742 }, v3T{ -0.38878719, -0.57916742, 0.71652608 }, v3T{ 0.37911419, 0.92170992, 0.08199541 }, v3T{ -0.60810067, -0.43108035, 0.66662082 }, + v3T{ -0.11745691, 0.38395577, 0.91585034 }, v3T{ 0.47694470, -0.81050760, 0.34000174 }, v3T{ 0.40287244, 0.88894800, 0.21786522 }, v3T{ 0.46780815, -0.54966937, 0.69211207 }, + v3T{ 0.07109649, 0.79259959, -0.60558333 }, v3T{ -0.52073054, -0.06778631, 0.85102569 }, v3T{ -0.36866700, 0.77676019, -0.51061556 }, v3T{ -0.71702100, -0.35727116, 0.59853004 }, + v3T{ -0.59010862, -0.73536014, -0.33319257 }, v3T{ -0.66875911, 0.58597660, 0.45759445 }, v3T{ -0.59798034, -0.69169805, 0.40493619 }, v3T{ -0.20490060, 0.79048994, 0.57718402 }, + v3T{ 0.48765302, 0.85851673, 0.15856717 }, v3T{ 0.88918101, 0.10371433, 0.44564612 }, v3T{ 0.48664272, 0.83596000, 0.25367252 }, v3T{ -0.24554119, 0.50230038, -0.82909822 }, + v3T{ 0.03554055, -0.41884154, -0.90736356 }, v3T{ -0.03701100, -0.61772404, 0.78552352 }, v3T{ 0.42824046, 0.20582938, -0.87991158 }, v3T{ -0.06839464, -0.43555129, -0.89756183 }, + v3T{ -0.40866952, -0.70331213, -0.58167111 }, v3T{ -0.74822692, 0.38256599, 0.54203297 }, v3T{ 0.71541445, 0.51615594, 0.47091953 }, v3T{ 0.60759905, -0.70288934, -0.36982423 }, + v3T{ -0.01648745, -0.13394229, -0.99085197 }, v3T{ -0.64568452, -0.13342451, 0.75185730 }, v3T{ -0.42008783, 0.33302268, 0.84416948 }, v3T{ -0.63557180, -0.46817632, 0.61388877 }, + v3T{ -0.82478405, -0.45636029, 0.33386606 }, v3T{ -0.66628051, 0.24058840, 0.70582399 }, v3T{ -0.60499178, -0.78374178, -0.14047697 }, v3T{ 0.63041860, -0.60894989, -0.48140672 }, + v3T{ -0.07945150, -0.91288865, -0.40040202 }, v3T{ -0.66942344, 0.18523930, 0.71941550 }, v3T{ -0.00849762, -0.47038898, 0.88241827 }, v3T{ 0.66223413, -0.33585751, 0.66981019 }, + v3T{ 0.82512667, -0.23099667, -0.51556427 }, v3T{ -0.75186864, 0.65450118, -0.07950940 }, v3T{ 0.87383910, 0.08193441, 0.47926192 }, v3T{ -0.26554211, 0.78650504, 0.55758158 }, + v3T{ -0.49574252, 0.70523568, 0.50683527 }, v3T{ -0.49212635, -0.64694353, 0.58247381 }, v3T{ 0.32264136, 0.78159510, -0.53386482 }, v3T{ 0.71510371, -0.22498049, 0.66182359 }, + v3T{ 0.61434883, -0.51790453, 0.59527340 }, v3T{ -0.82551670, -0.14228251, -0.54614821 }, v3T{ -0.46251954, 0.64306734, -0.61036060 }, v3T{ -0.52117891, -0.69061769, 0.50141773 }, + v3T{ 0.27468699, -0.88951139, -0.36512537 }, v3T{ 0.65713642, -0.75365863, -0.01305358 }, v3T{ 0.94136220, -0.21960140, -0.25614924 }, v3T{ -0.85554460, 0.30842011, -0.41583708 }, + v3T{ -0.35233681, -0.15379949, 0.92314922 }, v3T{ -0.74432132, 0.44164975, -0.50093040 }, v3T{ 0.53994954, -0.79953954, -0.26304184 }, v3T{ 0.42964607, 0.11880600, 0.89514769 }, + v3T{ -0.87921789, 0.18018271, 0.44103298 }, v3T{ -0.80353079, 0.36514238, 0.47011628 }, v3T{ 0.50404538, 0.65465655, -0.56334986 }, v3T{ -0.92083981, -0.30381360, -0.24444087 }, + v3T{ 0.13956423, -0.96009192, -0.24237437 }, v3T{ -0.71698508, 0.68682212, 0.11919639 }, v3T{ -0.76698836, 0.61675487, -0.17703754 }, v3T{ -0.21874818, -0.57847904, -0.78581883 }, + v3T{ 0.55494484, -0.79971185, 0.22912262 }, v3T{ 0.79660662, -0.41090893, 0.44336412 }, v3T{ 0.66489466, 0.00947646, -0.74687703 }, v3T{ -0.59920476, 0.36935905, 0.71030103 }, + v3T{ -0.57524868, -0.51402380, -0.63629277 }, v3T{ 0.20536135, -0.69296940, 0.69110066 }, v3T{ -0.05544564, -0.99802158, 0.02964287 }, v3T{ 0.13201661, 0.16519726, -0.97738502 }, + v3T{ 0.46510187, 0.64584669, -0.60544390 }, v3T{ -0.80108393, -0.59762086, 0.03337417 }, v3T{ -0.39806873, -0.44410006, -0.80269323 }, v3T{ 0.95136791, -0.21916666, -0.21648342 }, + v3T{ -0.82086395, 0.17982074, 0.54207645 }, v3T{ 0.79513089, 0.37056075, 0.48005374 }, v3T{ 0.77112323, 0.56616567, 0.29124800 }, v3T{ 0.81176337, -0.24837815, 0.52853432 }, + v3T{ -0.81842091, 0.50060656, 0.28209979 }, v3T{ -0.38248924, -0.72602893, 0.57147525 }, v3T{ 0.46198573, 0.37950267, 0.80159024 }, v3T{ -0.59524911, 0.04222053, 0.80243126 }, + v3T{ -0.52273882, 0.79497643, -0.30782561 }, v3T{ -0.79922245, 0.45390541, 0.39397125 }, v3T{ 0.38051244, -0.76512679, 0.51941436 }, v3T{ 0.83818590, 0.22605420, 0.49633043 }, + v3T{ 0.63218067, 0.48127057, 0.60722832 }, v3T{ 0.59242495, 0.18424992, -0.78427333 }, v3T{ 0.85249021, -0.48552132, 0.19372531 }, v3T{ -0.43548364, -0.58439144, 0.68471939 }, + v3T{ 0.73179011, 0.29594379, -0.61392223 }, v3T{ -0.45280534, -0.80755156, 0.37792566 }, v3T{ 0.55557939, 0.30092870, -0.77509578 }, v3T{ 0.42575514, 0.70893498, 0.56226662 }, + v3T{ 0.60528173, -0.51550786, 0.60653580 }, v3T{ -0.51076670, 0.84729685, -0.14562083 }, v3T{ -0.33474095, 0.69713420, -0.63399716 }, v3T{ -0.48650711, 0.74561924, 0.45537104 }, + v3T{ -0.41670009, -0.87381546, -0.25061440 }, v3T{ 0.92586094, -0.34254116, -0.15952140 }, v3T{ -0.10682502, 0.59910669, 0.79351092 }, v3T{ -0.44718479, -0.59299328, 0.66961536 }, + v3T{ 0.69862855, -0.48858264, 0.52269031 }, v3T{ -0.74718902, 0.51933770, -0.41472512 }, v3T{ -0.56931667, 0.42835158, 0.70170753 }, v3T{ 0.05154068, 0.16647211, 0.98469823 }, + v3T{ 0.74568360, -0.66371406, 0.05864824 }, v3T{ 0.64686641, 0.41668704, 0.63869849 }, v3T{ 0.27796256, -0.73021674, 0.62411563 }, v3T{ 0.77079499, -0.62615383, 0.11750087 }, + v3T{ -0.06833979, 0.90160690, 0.42712371 }, v3T{ -0.98003087, -0.09480635, 0.17478914 }, v3T{ -0.85191651, 0.47279136, 0.22518122 }, v3T{ 0.52473004, -0.19693989, -0.82817454 }, + v3T{ 0.16081399, 0.75081437, -0.64063768 }, v3T{ 0.71441816, 0.52488995, -0.46270642 }, v3T{ -0.23333515, -0.88652173, 0.39954216 }, v3T{ 0.54760612, -0.74897952, -0.37303782 }, + v3T{ 0.48186221, -0.57810371, 0.65848683 }, v3T{ -0.21255857, -0.53489421, -0.81774509 }, v3T{ 0.77930308, 0.57549405, -0.24797842 }, v3T{ 0.60279872, -0.76604104, -0.22319235 }, + v3T{ 0.37230136, -0.52720909, 0.76383393 }, v3T{ -0.13321231, -0.92277683, 0.36157627 }, v3T{ -0.47833070, -0.49076061, -0.72825392 }, v3T{ 0.28828612, -0.93601402, 0.20191301 }, + v3T{ -0.66460360, -0.65589055, 0.35792406 }, v3T{ 0.90686144, 0.30403802, 0.29182738 }, v3T{ -0.00682204, 0.42199214, 0.90657382 }, v3T{ -0.33221520, 0.26584830, -0.90496284 }, + v3T{ -0.59515132, 0.55081686, 0.58514588 }, v3T{ 0.77123373, 0.59869357, -0.21625109 }, v3T{ -0.69765329, -0.61042387, 0.37505011 }, v3T{ 0.02426772, -0.55656860, -0.83044715 }, + v3T{ 0.65180023, 0.75814507, 0.01930051 }, v3T{ -0.01531784, -0.78276243, 0.62213209 }, v3T{ 0.63847163, 0.03936370, 0.76863807 }, v3T{ 0.40703600, -0.09783879, -0.90815707 }, + v3T{ -0.46223121, -0.64783550, -0.60551753 }, v3T{ 0.82788442, -0.46539053, 0.31307993 }, v3T{ -0.75467147, 0.24001984, 0.61062382 }, v3T{ -0.70062375, -0.69087941, 0.17835919 }, + v3T{ 0.35457466, 0.88605939, -0.29862279 }, v3T{ 0.20159504, -0.88658663, -0.41632150 }, v3T{ -0.32096612, 0.72494426, -0.60945597 }, v3T{ 0.14147986, 0.53949815, -0.83001518 }, + v3T{ 0.28297638, 0.93772862, 0.20146813 }, v3T{ 0.67192636, 0.43759891, -0.59751332 }, v3T{ 0.98497844, 0.01967209, 0.17155312 }, v3T{ 0.60388215, -0.68969665, 0.39955586 }, + v3T{ 0.41200242, 0.85002960, 0.32818240 }, v3T{ -0.83375884, 0.39266173, -0.38815328 }, v3T{ -0.70938505, -0.58502714, -0.39308535 }, v3T{ -0.63048972, 0.77513872, 0.04053013 }, + v3T{ 0.10261233, -0.69355480, -0.71305852 }, v3T{ 0.65702752, -0.38976767, -0.64528753 }, v3T{ -0.41388260, 0.33890875, 0.84489174 }, v3T{ 0.03028400, -0.46424256, -0.88519022 }, + v3T{ 0.45068344, -0.52775066, -0.71997478 }, v3T{ 0.48930093, 0.41323002, -0.76800101 }, v3T{ 0.28350070, 0.66390322, 0.69199701 }, v3T{ 0.42450922, -0.60916900, 0.66985450 }, + v3T{ 0.67306932, 0.51724488, -0.52861652 }, v3T{ 0.31095891, 0.94487804, -0.10251852 }, v3T{ -0.25569777, 0.90632689, -0.33643754 }, v3T{ -0.21431592, 0.07778980, -0.97366187 }, + v3T{ 0.27676605, -0.87464593, 0.39798876 }, v3T{ 0.00288072, -0.88726140, -0.46125796 }, v3T{ 0.51138622, 0.12353356, 0.85042554 }, v3T{ 0.59734197, 0.76052363, 0.25453168 }, + v3T{ -0.43336730, -0.76588813, 0.47498227 }, v3T{ 0.34180565, -0.68750195, -0.64071052 }, v3T{ -0.65078280, 0.51803512, 0.55508681 }, v3T{ -0.89824124, 0.40466264, -0.17149586 }, + v3T{ 0.54253116, 0.81082175, -0.21960883 }, v3T{ -0.53994336, 0.54836630, 0.63855741 }, v3T{ 0.68778819, 0.33483595, -0.64407475 }, v3T{ -0.63530446, -0.39864092, 0.66141792 }, + v3T{ 0.80728009, -0.58358794, -0.08788616 }, v3T{ 0.94835277, 0.26419320, 0.17558181 }, v3T{ -0.15823843, -0.51165316, 0.84449490 }, v3T{ 0.17510951, -0.22389002, 0.95875436 }, + v3T{ 0.13697442, -0.88598087, 0.44303037 }, v3T{ -0.73457485, -0.23332652, -0.63714874 }, v3T{ 0.95521505, -0.11801760, 0.27135964 }, v3T{ -0.40184319, -0.90170455, -0.15953355 }, + v3T{ 0.16857866, -0.70975159, -0.68398386 }, v3T{ -0.55230772, 0.37144476, 0.74631426 }, v3T{ 0.29875717, -0.61848962, -0.72678383 }, v3T{ 0.62465217, -0.76131685, 0.17379963 }, + v3T{ 0.75759704, 0.19352541, 0.62337360 }, v3T{ -0.10375594, 0.61563856, 0.78116827 }, v3T{ 0.52725731, 0.25296549, 0.81117704 }, v3T{ -0.71292545, -0.53989924, -0.44748867 }, + v3T{ 0.78246146, 0.54867457, 0.29446609 }, v3T{ 0.31458005, 0.63401883, -0.70644145 }, v3T{ -0.09360697, -0.99481997, -0.03963538 }, v3T{ -0.59000956, 0.10880136, -0.80003186 }, + v3T{ 0.49713243, 0.77379744, -0.39255173 }, v3T{ -0.92985377, 0.17383167, 0.32427537 }, v3T{ 0.73574353, -0.63730495, -0.22918086 }, v3T{ -0.04383386, -0.80273910, -0.59471719 }, + v3T{ 0.68411849, 0.52929683, -0.50182344 }, v3T{ -0.19561815, -0.57428906, -0.79493749 }, v3T{ 0.90257811, -0.06366895, -0.42579222 }, v3T{ 0.62294256, 0.39027502, -0.67795868 }, + v3T{ -0.39046281, -0.70398950, 0.59324327 }, v3T{ 0.70990020, 0.62433400, -0.32595821 }, v3T{ -0.99157404, 0.01300690, 0.12888658 }, v3T{ -0.55765988, -0.46179257, 0.68975581 }, + v3T{ -0.53736280, -0.34635255, -0.76894807 }, v3T{ 0.25083685, 0.44726649, -0.85850659 }, v3T{ 0.45758528, 0.86982087, -0.18446507 }, v3T{ -0.18615519, 0.23441065, -0.95414773 }, + v3T{ 0.56359579, -0.41325118, -0.71525048 }, v3T{ -0.48542469, 0.59678985, -0.63890903 }, v3T{ -0.72243931, -0.40815930, 0.55811059 }, v3T{ -0.23748605, 0.68466361, -0.68908354 }, + v3T{ -0.69257361, 0.27959985, -0.66495543 }, v3T{ -0.10352601, -0.17369566, -0.97934273 }, v3T{ 0.00192480, -0.09194122, 0.99576258 }, v3T{ 0.36297645, 0.86362173, 0.34986513 }, + v3T{ -0.71118388, -0.10242990, 0.69550385 }, v3T{ 0.45146824, 0.43080300, 0.78139952 }, v3T{ -0.13265094, -0.68773403, -0.71374059 }, v3T{ 0.56016516, -0.56270148, -0.60793259 }, + v3T{ -0.95871022, -0.27465634, -0.07374694 }, v3T{ -0.84169709, 0.06533746, -0.53598230 }, v3T{ 0.69711911, -0.61618111, -0.36653212 }, v3T{ -0.01620384, 0.59778204, -0.80149490 }, + v3T{ -0.34911215, 0.65899531, -0.66621760 }, v3T{ -0.19279427, -0.50540811, -0.84106659 }, v3T{ -0.60506152, 0.72292944, 0.33357695 }, v3T{ 0.79789244, -0.59553505, 0.09330415 }, + v3T{ -0.48173680, -0.74189415, 0.46639331 }, v3T{ 0.84140763, 0.31839867, 0.43664115 }, v3T{ 0.79614481, 0.60391839, -0.03789486 }, v3T{ 0.19384456, 0.57096572, 0.79776089 }, + v3T{ 0.83441754, -0.25078854, -0.49076723 }, v3T{ -0.62605441, 0.72550166, 0.28583776 }, v3T{ 0.55337866, -0.75558589, 0.35051679 }, v3T{ 0.80543476, -0.01571309, 0.59247611 }, + v3T{ -0.00851542, 0.98991715, 0.14139139 }, v3T{ -0.94076275, -0.29730096, -0.16302633 }, v3T{ -0.75465549, -0.41353736, -0.50939371 }, v3T{ 0.37739255, -0.63080384, 0.67798332 }, + v3T{ 0.47325376, -0.73145333, -0.49092453 }, v3T{ 0.12930721, -0.49066326, -0.86170135 }, v3T{ 0.71173142, -0.11663112, 0.69270165 }, v3T{ 0.41952295, -0.63051086, -0.65303641 }, + v3T{ 0.85916103, 0.42641569, 0.28286390 }, v3T{ 0.54792224, -0.66418740, 0.50856299 }, v3T{ 0.28479416, 0.43856869, 0.85237890 }, v3T{ -0.59050384, -0.68486024, -0.42693285 }, + v3T{ 0.54884141, 0.60847988, 0.57317130 }, v3T{ 0.87567478, 0.25649070, -0.40915304 }, v3T{ 0.02961573, 0.33496172, 0.94176619 }, v3T{ 0.67428181, 0.70665199, 0.21444580 }, + v3T{ 0.23609059, -0.51982231, 0.82100305 }, v3T{ 0.93726653, 0.00671493, 0.34854893 }, v3T{ -0.39891590, -0.91536143, -0.05458531 }, v3T{ 0.93359117, -0.35793085, 0.01711843 }, + v3T{ 0.53572079, -0.56879583, 0.62407896 }, v3T{ -0.61516933, -0.36856434, -0.69694119 }, v3T{ 0.74630703, -0.65946218, -0.09019675 }, v3T{ 0.50607373, -0.59204544, -0.62719342 }, + v3T{ -0.89793356, 0.43675114, 0.05444050 }, v3T{ -0.91682171, 0.07126199, 0.39288634 }, v3T{ -0.61178292, -0.15203616, -0.77627744 }, v3T{ -0.14028895, 0.63023583, 0.76362413 }, + v3T{ 0.71475895, -0.54060748, 0.44369268 }, v3T{ -0.31764961, 0.92630790, -0.20261391 }, v3T{ 0.59833443, -0.58864018, -0.54359788 }, v3T{ -0.81450219, 0.22699691, -0.53390879 }, + v3T{ 0.00452737, -0.06652318, 0.99777461 }, v3T{ 0.59311614, 0.19797584, -0.78039657 }, v3T{ -0.71375488, -0.02586188, 0.69991795 }, v3T{ -0.75600145, -0.26384588, -0.59903853 }, + v3T{ 0.25716644, 0.77480857, -0.57752671 }, v3T{ 0.71712423, 0.61984999, -0.31862018 }, v3T{ -0.28194922, -0.55108799, 0.78537040 }, v3T{ 0.57068285, -0.67066160, 0.47385030 }, + v3T{ 0.48969101, -0.22604767, -0.84208382 }, v3T{ -0.93763991, -0.34062289, 0.06933579 }, v3T{ -0.67376035, 0.15110895, -0.72333469 }, v3T{ -0.72414406, -0.65877431, -0.20403872 }, + v3T{ -0.71204285, 0.41163046, -0.56881926 }, v3T{ 0.23641604, -0.86280490, 0.44685026 }, v3T{ 0.84208951, 0.19949878, -0.50108432 }, v3T{ -0.67481860, 0.67904385, -0.28899707 }, + v3T{ 0.52167146, 0.66360202, 0.53618211 }, v3T{ -0.49330390, -0.48590434, 0.72149029 }, v3T{ -0.18240720, 0.04137646, -0.98235208 }, v3T{ 0.30714395, 0.55170433, 0.77542564 }, + v3T{ -0.14577549, 0.95376355, -0.26283949 }, v3T{ -0.54373260, -0.69781662, -0.46626905 }, v3T{ 0.01799205, -0.81833182, 0.57446437 }, v3T{ 0.51019037, -0.56615200, -0.64743934 }, + v3T{ 0.48463473, 0.59436639, 0.64176146 }, v3T{ 0.09115853, -0.52830175, -0.84414891 }, v3T{ -0.62962436, -0.38408030, -0.67531880 }, v3T{ 0.50864721, -0.48401592, -0.71204396 }, + v3T{ -0.69669235, -0.63427804, -0.33512853 }, v3T{ 0.60735178, -0.18339351, 0.77297518 }, v3T{ 0.74102699, 0.67064566, 0.03336744 }, v3T{ -0.47352242, -0.76145583, -0.44267543 }, + v3T{ 0.47751531, -0.79737827, -0.36900816 }, v3T{ 0.74175025, -0.64892413, 0.16942269 }, v3T{ 0.65484829, -0.70924167, -0.26105549 }, v3T{ 0.60455058, -0.64392987, -0.46890608 }, + v3T{ -0.61878613, -0.77223405, 0.14407742 }, v3T{ -0.72376655, -0.65562529, 0.21521492 }, v3T{ 0.24420910, -0.52118606, -0.81775731 }, v3T{ 0.61291622, 0.39870471, -0.68217906 }, + v3T{ 0.67751893, 0.65970488, 0.32520389 }, v3T{ -0.04366879, -0.96113671, 0.27259726 }, v3T{ 0.36541094, 0.62808212, 0.68701361 }, v3T{ -0.92572867, 0.10611717, -0.36299528 }, + v3T{ 0.80766374, -0.02031352, -0.58929335 }, v3T{ -0.82117076, 0.53034081, 0.21075390 }, v3T{ -0.62778197, -0.51872129, 0.58036025 }, v3T{ 0.37696186, 0.57743439, -0.72420251 }, + v3T{ -0.56818895, -0.47089866, -0.67484500 }, v3T{ -0.61126182, -0.69853192, 0.37203783 }, v3T{ 0.57901952, 0.81284241, -0.06343191 }, v3T{ -0.53287943, 0.70445351, 0.46881208 }, + v3T{ 0.22300157, -0.93258969, 0.28380764 }, v3T{ -0.63832115, -0.40157013, -0.65672486 }, v3T{ -0.22074780, 0.50999380, 0.83137040 }, v3T{ -0.59081050, -0.13684815, -0.79511982 }, + v3T{ -0.79824305, 0.52060475, -0.30295004 }, v3T{ -0.56871170, 0.76435226, 0.30386284 }, v3T{ 0.12786983, -0.64236825, -0.75565358 }, v3T{ -0.17631562, -0.76167939, -0.62350405 }, + v3T{ 0.34713709, 0.61125835, -0.71123770 }, v3T{ -0.39238887, -0.52886732, 0.75254922 }, v3T{ 0.38116332, 0.71358998, -0.58779577 }, v3T{ -0.72949527, -0.67040404, 0.13562844 }, + v3T{ -0.62057913, 0.45165344, -0.64100757 }, v3T{ -0.10668918, -0.98309252, -0.14881706 }, v3T{ 0.59490400, -0.46196716, -0.65778079 }, v3T{ 0.22433782, 0.49054463, 0.84204424 }, + v3T{ 0.77498791, -0.57220981, 0.26827165 }, v3T{ 0.26474565, 0.93986866, -0.21576987 }, v3T{ -0.01328623, 0.99975439, 0.01773780 }, v3T{ 0.53097408, 0.47771884, 0.69989373 }, + v3T{ 0.24635212, -0.37499947, -0.89369236 }, v3T{ 0.31300988, -0.54171955, 0.78010560 }, v3T{ 0.77494650, -0.52634980, 0.34987684 }, v3T{ 0.65518408, 0.51410661, -0.55355958 }, + v3T{ 0.78000762, -0.61855443, -0.09475515 }, v3T{ 0.58176976, 0.62638121, 0.51883574 }, v3T{ -0.62371886, -0.59433046, 0.50768699 }, v3T{ 0.85206333, 0.17478222, -0.49339564 }, + v3T{ 0.69974170, -0.42963013, 0.57077098 }, v3T{ -0.44953934, 0.62956163, -0.63369277 }, v3T{ 0.63562255, 0.51965998, -0.57090935 }, v3T{ -0.02766532, -0.52812789, -0.84871406 }, + v3T{ 0.78698609, 0.04742916, -0.61514500 }, v3T{ 0.37827449, 0.78614098, 0.48876454 }, v3T{ 0.90534508, -0.25600916, -0.33883565 }, v3T{ -0.37701605, 0.47347359, -0.79604124 }, + v3T{ -0.43802429, 0.40756165, -0.80126664 }, v3T{ -0.87945568, -0.47372426, -0.04629300 }, v3T{ -0.22787901, -0.82242670, 0.52123457 }, v3T{ 0.48721529, 0.74652617, -0.45312243 }, + v3T{ -0.68473990, -0.68222429, 0.25632263 }, v3T{ -0.33289944, 0.62102263, -0.70958358 }, v3T{ -0.07838790, -0.85438083, -0.51370101 }, v3T{ 0.18575601, 0.96209034, 0.19969195 }, + v3T{ 0.09048656, -0.68256793, -0.72519874 }, v3T{ 0.29506068, -0.68306389, -0.66810397 }, v3T{ -0.94937153, -0.17748927, 0.25921277 }, v3T{ -0.38725072, 0.16372291, 0.90732116 }, + v3T{ -0.02691563, 0.81898594, 0.57318198 }, v3T{ -0.65244629, -0.52276924, -0.54865851 }, v3T{ 0.15270967, -0.00097578, 0.98827061 }, v3T{ 0.39108739, 0.55471383, -0.73439990 }, + v3T{ 0.85379797, -0.05140234, 0.51806064 }, v3T{ 0.31443713, 0.14998906, -0.93735403 }, v3T{ -0.44277186, -0.56474741, -0.69642907 }, v3T{ -0.31521736, 0.37268196, 0.87278071 }, + v3T{ 0.97997903, -0.16829529, 0.10638514 }, v3T{ -0.25174419, -0.84939324, 0.46384910 }, v3T{ 0.03867740, -0.72044135, 0.69243651 }, v3T{ -0.80207202, 0.48047131, 0.35472214 }, + v3T{ 0.48200634, -0.48413492, 0.73026246 }, v3T{ -0.41800015, 0.44068588, -0.79440029 }, v3T{ 0.58661859, -0.43233611, 0.68480955 }, v3T{ 0.40830998, -0.53710845, 0.73810397 }, + v3T{ 0.61242611, -0.72220206, -0.32149407 }, v3T{ -0.34159283, -0.62199145, -0.70458567 }, v3T{ -0.29885191, 0.58492128, -0.75402562 }, v3T{ -0.62924060, 0.77130626, -0.09561862 }, + v3T{ 0.91118189, 0.27762192, 0.30442344 }, v3T{ 0.08064464, -0.99213777, -0.09570315 }, v3T{ 0.93083382, -0.34928416, -0.10746612 }, v3T{ 0.66101659, -0.67569323, 0.32633681 }, + v3T{ 0.07148482, -0.97619739, -0.20476469 }, v3T{ 0.30440743, -0.78193565, -0.54397863 }, v3T{ -0.35656518, -0.19962907, 0.91269355 }, v3T{ 0.82151650, -0.31061678, 0.47815045 }, + v3T{ -0.69709423, -0.71173375, -0.08657198 }, v3T{ -0.46044170, -0.78565215, -0.41321197 }, v3T{ -0.70275364, -0.21121895, 0.67935548 }, v3T{ 0.38087769, 0.63933041, 0.66797366 } + }; + return g; + } + + std::vector m_P; + std::vector m_PFloats; + std::vector m_Grad; + std::unordered_map> m_GlobalMap; +}; +} diff --git a/Source/Ember/Variation.h b/Source/Ember/Variation.h index 5dd231f..14f8b31 100644 --- a/Source/Ember/Variation.h +++ b/Source/Ember/Variation.h @@ -2,6 +2,7 @@ #include "Point.h" #include "Isaac.h" +#include "VarFuncs.h" /// /// Base variation classes. Individual variations will be grouped into files of roughly 50 @@ -101,6 +102,7 @@ enum eVariationId VAR_COTQ , VAR_CPOW , VAR_CPOW2 , + VAR_CRACKLE , VAR_CRESCENTS , VAR_CROB , VAR_CROP , @@ -409,6 +411,7 @@ enum eVariationId VAR_PRE_COTQ, VAR_PRE_CPOW, VAR_PRE_CPOW2, + VAR_PRE_CRACKLE, VAR_PRE_CRESCENTS, VAR_PRE_CROB, VAR_PRE_CROP, @@ -717,6 +720,7 @@ enum eVariationId VAR_POST_COTQ, VAR_POST_CPOW, VAR_POST_CPOW2, + VAR_POST_CRACKLE, VAR_POST_CRESCENTS, VAR_POST_CROB, VAR_POST_CROP, @@ -974,6 +978,7 @@ enum eVariationId VAR_DC_CYLINDER, VAR_DC_GRIDOUT, VAR_DC_LINEAR, + VAR_DC_PERLIN, VAR_DC_TRIANGLE, VAR_DC_ZTRANSL, @@ -983,6 +988,7 @@ enum eVariationId VAR_PRE_DC_CYLINDER, VAR_PRE_DC_GRIDOUT, VAR_PRE_DC_LINEAR, + VAR_PRE_DC_PERLIN, VAR_PRE_DC_TRIANGLE, VAR_PRE_DC_ZTRANSL, @@ -992,6 +998,7 @@ enum eVariationId VAR_POST_DC_CYLINDER, VAR_POST_DC_GRIDOUT, VAR_POST_DC_LINEAR, + VAR_POST_DC_PERLIN, VAR_POST_DC_TRIANGLE, VAR_POST_DC_ZTRANSL, @@ -1049,7 +1056,7 @@ public: bool needPrecalcAngles = false, bool needPrecalcAtanXY = false, bool needPrecalcAtanYX = false) - : m_Name(name)//Omit unnecessary default constructor call. + : m_Name(name)//Omit unnecessary default constructor call. { m_Xform = nullptr; m_VariationId = id; @@ -1133,7 +1140,6 @@ public: m_NeedPrecalcAngles = variation.NeedPrecalcAngles(); m_NeedPrecalcAtanXY = variation.NeedPrecalcAtanXY(); m_NeedPrecalcAtanYX = variation.NeedPrecalcAtanYX(); - return *this; } @@ -1288,9 +1294,7 @@ public: virtual string ToString() const { ostringstream ss; - ss << m_Name << "(" << m_Weight << ")"; - return ss.str(); } @@ -1346,6 +1350,12 @@ public: /// The names for global OpenCL functions specific to this variation virtual vector OpenCLGlobalFuncNames() const { return vector(); } + /// + /// If the OpenCL string depends on any global static data specific to this variation, and possibly shared among others, return their names. + /// + /// The names for global OpenCL data specific to this variation + virtual vector OpenCLGlobalDataNames() const { return vector(); } + /// /// If the OpenCL string depends on any functions specific to this variation, return them. /// @@ -1462,6 +1472,7 @@ template class ParametricVariation; /// Also, some of them can be considered precalculated values, rather than /// formal parameters. /// Further, some can change state between iterations. +/// The constructors for each case are deliberately different to prevent errors. /// This class encapsulates a single parameter. /// Template argument expected to be float or double. /// @@ -1485,11 +1496,13 @@ public: /// Whether the parameter is actually a precalculated value. Always true. /// A pointer to the parameter /// The name of the parameter + /// The length of the underlying memory in bytes. Needed for array types. Default: sizeof(T). ParamWithName(bool isPrecalc, - T* param, - string name) + T* param, + string name, + size_t size = sizeof(T)) { - Init(param, name, 0, REAL, TLOW, TMAX, true); + Init(param, name, 0, REAL, TLOW, TMAX, true, false, size); } /// @@ -1500,9 +1513,9 @@ public: /// A pointer to the parameter /// The name of the parameter ParamWithName(bool isPrecalc, - bool isState, - T* param, - string name) + bool isState, + T* param, + string name) { Init(param, name, 0, REAL, TLOW, TMAX, true, true); } @@ -1555,6 +1568,7 @@ public: m_Name = paramWithName.m_Name; m_IsPrecalc = paramWithName.m_IsPrecalc; m_IsState = paramWithName.m_IsState; + m_Size = paramWithName.m_Size; } return *this; @@ -1571,7 +1585,8 @@ public: /// The maximum value the parameter can be /// Whether the parameter is actually a precalculated value. Default: false. /// Whether the parameter changes state between iterations. Default: false. - void Init(T* param, const string& name, T def = 0, eParamType type = REAL, T min = TLOW, T max = TMAX, bool isPrecalc = false, bool isState = false) + /// The length of the underlying memory in bytes. Needed for array types. Default: sizeof(T). + void Init(T* param, const string& name, T def = 0, eParamType type = REAL, T min = TLOW, T max = TMAX, bool isPrecalc = false, bool isState = false, size_t size = sizeof(T)) { m_Param = param; m_Def = def; @@ -1581,7 +1596,7 @@ public: m_Name = name; m_IsPrecalc = isPrecalc; m_IsState = isState; - + m_Size = size; Set(m_Def);//Initial value. } @@ -1652,17 +1667,16 @@ public: string ToString() const { ostringstream ss; - - ss << "Param Name: " << m_Name << endl - << "Param Pointer: " << m_Param << endl - << "Param Value: " << *m_Param << endl - << "Param Def: " << m_Def << endl - << "Param Min: " << m_Min << endl - << "Param Max: " << m_Max << endl - << "Param Type: " << m_Type << endl - << "Is Precalc: " << m_IsPrecalc << endl - << "Is State: " << m_IsState << endl; - + ss << "Param Name: " << m_Name << "\n" + << "Param Pointer: " << m_Param << "\n" + << "Param Value: " << *m_Param << "\n" + << "Param Def: " << m_Def << "\n" + << "Param Min: " << m_Min << "\n" + << "Param Max: " << m_Max << "\n" + << "Param Type: " << m_Type << "\n" + << "Is Precalc: " << m_IsPrecalc << "\n" + << "Is State: " << m_IsState << "\n" + << "Size: " << m_Size << "\n"; return ss.str(); } @@ -1678,6 +1692,7 @@ public: string Name() const { return m_Name; } bool IsPrecalc() const { return m_IsPrecalc; } bool IsState() const { return m_IsState; } + size_t Size() const { return m_Size; } private: T* m_Param;//Pointer to the parameter value. @@ -1688,6 +1703,7 @@ private: string m_Name;//Name of the parameter. bool m_IsPrecalc;//Whether the parameter is actually a precalculated value. bool m_IsState;//Whether the parameter changes state between iterations. This is also considered precalc. + size_t m_Size;//The size of the field in bytes. Default: sizeof(T). }; #define VARUSINGS \ @@ -1729,17 +1745,17 @@ public: /// Whether it uses the precalc atan XY value in its calculations. Default: false. /// Whether it uses the precalc atan YX value in its calculations. Default: false. ParametricVariation(const char* name, eVariationId id, T weight = 1.0, - bool needPrecalcSumSquares = false, - bool needPrecalcSqrtSumSquares = false, - bool needPrecalcAngles = false, - bool needPrecalcAtanXY = false, - bool needPrecalcAtanYX = false) - : Variation(name, id, weight, - needPrecalcSumSquares, - needPrecalcSqrtSumSquares, - needPrecalcAngles, - needPrecalcAtanXY, - needPrecalcAtanYX) + bool needPrecalcSumSquares = false, + bool needPrecalcSqrtSumSquares = false, + bool needPrecalcAngles = false, + bool needPrecalcAtanXY = false, + bool needPrecalcAtanYX = false) + : Variation(name, id, weight, + needPrecalcSumSquares, + needPrecalcSqrtSumSquares, + needPrecalcAngles, + needPrecalcAtanXY, + needPrecalcAtanYX) { m_Params.reserve(5); } @@ -1884,7 +1900,9 @@ public: virtual void Random(QTIsaac& rand) override { Variation::Random(rand); + for (auto& param : m_Params) param.Set(rand.Frand11()); + this->Precalc(); } @@ -1894,6 +1912,7 @@ public: void Clear() { for (auto& param : m_Params) *(param.Param()) = 0; + this->Precalc(); } @@ -1905,8 +1924,8 @@ public: vector ParamNames(bool includePrecalcs = false) { vector vec; - vec.reserve(m_Params.size()); + for (auto& param : m_Params) { if ((includePrecalcs && param.IsPrecalc()) || !param.IsPrecalc()) @@ -1947,8 +1966,8 @@ public: virtual string ToString() const override { ostringstream ss; - ss << Variation::ToString() << endl; + for (auto& param : m_Params) ss << param.ToString() << endl; return ss.str(); @@ -2084,7 +2103,7 @@ protected: template \ class EMBER_API Pre##varName##Variation : public varName##Variation \ { \ - VARUSINGS \ + VARUSINGS \ public: \ Pre##varName##Variation(T weight = 1.0) : varName##Variation(weight) \ { \ @@ -2100,7 +2119,7 @@ protected: template \ class EMBER_API Post##varName##Variation : public varName##Variation \ { \ - VARUSINGS \ + VARUSINGS \ public:\ Post##varName##Variation(T weight = 1.0) : varName##Variation(weight) \ { \ @@ -2203,9 +2222,9 @@ protected: template \ class EMBER_API Pre##varName##Variation : public varName##Variation \ { \ - VARUSINGS \ - PARVARUSINGS \ - using varName##Variation::Init; \ + VARUSINGS \ + PARVARUSINGS \ + using varName##Variation::Init; \ public:\ Pre##varName##Variation(T weight = 1.0) : varName##Variation(weight) \ { \ @@ -2222,9 +2241,9 @@ protected: template \ class EMBER_API Post##varName##Variation : public varName##Variation \ { \ - VARUSINGS \ - PARVARUSINGS \ - using varName##Variation::Init; \ + VARUSINGS \ + PARVARUSINGS \ + using varName##Variation::Init; \ public:\ Post##varName##Variation(T weight = 1.0) : varName##Variation(weight) \ { \ @@ -2237,4 +2256,4 @@ protected: \ PREPOSTPARVARCOPY(Post##varName##Variation, varName##Variation) \ }; -} + } diff --git a/Source/Ember/VariationList.h b/Source/Ember/VariationList.h index a63a925..3acb26e 100644 --- a/Source/Ember/VariationList.h +++ b/Source/Ember/VariationList.h @@ -341,9 +341,9 @@ public: ADDPREPOSTREGVAR(Crob) ADDPREPOSTREGVAR(BubbleT3D) ADDPREPOSTREGVAR(Synth) + ADDPREPOSTREGVAR(Crackle) //ADDPREPOSTREGVAR(LinearXZ) //ADDPREPOSTREGVAR(LinearYZ) - //DC are special. ADDPREPOSTREGVAR(DCBubble) ADDPREPOSTREGVAR(DCCarpet) @@ -351,19 +351,22 @@ public: ADDPREPOSTREGVAR(DCCylinder) ADDPREPOSTREGVAR(DCGridOut) ADDPREPOSTREGVAR(DCLinear) + ADDPREPOSTREGVAR(DCPerlin) ADDPREPOSTREGVAR(DCTriangle) ADDPREPOSTREGVAR(DCZTransl) for (auto var : m_Variations) var->Precalc(); - std::sort(m_Variations.begin(), m_Variations.end(), [&](const Variation* var1, const Variation* var2) { return var1->VariationId() < var2->VariationId(); }); + std::sort(m_Variations.begin(), m_Variations.end(), [&](const Variation* var1, const Variation* var2) { return var1->VariationId() < var2->VariationId(); }); m_RegVariations.reserve(m_Variations.size() / 3); m_PreVariations.reserve(m_Variations.size() / 3); m_PostVariations.reserve(m_Variations.size() / 3); m_ParametricVariations.reserve(size_t(m_Variations.size() * .90));//This is a rough guess at how many are parametric. for (auto var : m_Variations) if (var->VarType() == VARTYPE_REG) m_RegVariations.push_back(var); + for (auto var : m_Variations) if (var->VarType() == VARTYPE_PRE) m_PreVariations.push_back(var); + for (auto var : m_Variations) if (var->VarType() == VARTYPE_POST) m_PostVariations.push_back(var); //Keep a list of which variations derive from ParametricVariation. @@ -522,7 +525,6 @@ private: if (var) { Variation* var2 = var->Copy(); - var2->m_Weight = weight; return var2; } diff --git a/Source/Ember/Variations06.h b/Source/Ember/Variations06.h index 84fc83f..cc137f8 100644 --- a/Source/Ember/Variations06.h +++ b/Source/Ember/Variations06.h @@ -38,8 +38,8 @@ public: static const v2T offset[4] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }; int i = 0; T di, dj; - T XCh, YCh, XCo, YCo, DXo, DYo, L, L1, L2, R, s, trgL, Vx, Vy; - v2T U; + T XCh, YCh, XCo, YCo, DXo, DYo, L, L1, L2, R, s, trgL; + v2T u, v; v2T P[7]; //For speed/convenience. s = m_Cellsize; @@ -49,10 +49,10 @@ public: return; //Get co-ordinates, and convert to hex co-ordinates. - U.x = helper.In.x; - U.y = helper.In.y; - XCh = T(Floor((AXhXo * U.x + AXhYo * U.y) / s)); - YCh = T(Floor((AYhXo * U.x + AYhYo * U.y) / s)); + u.x = helper.In.x; + u.y = helper.In.y; + XCh = T(Floor((AXhXo * u.x + AXhYo * u.y) / s)); + YCh = T(Floor((AYhXo * u.x + AYhYo * u.y) / s)); // Get a set of 4 hex center points, based around the one above for (di = XCh; di < XCh + T(1.1); di += 1) @@ -65,7 +65,7 @@ public: } } - int q = Closest(&P[0], 4, U); + int q = m_VarFuncs->Closest(&P[0], 4, u); //Remake list starting from chosen hex, ensure it is completely surrounded (total 7 points). //First adjust centers according to which one was found to be closest. XCh += offset[q].x; @@ -90,20 +90,19 @@ public: P[5].y = YCo - (AYoXh + AYoYh) * s; P[6].x = XCo - AXoXh * s; P[6].y = YCo - AYoXh * s; - L1 = Voronoi(&P[0], 7, 0, U); + L1 = m_VarFuncs->Voronoi(&P[0], 7, 0, u); //Delta vector from center of hex. - DXo = U.x - P[0].x; - DYo = U.y - P[0].y; + DXo = u.x - P[0].x; + DYo = u.y - P[0].y; //Apply "interesting bit" to cell's DXo and DYo co-ordinates. //trgL is the defined value of l, independent of any rotation. trgL = std::pow(Zeps(L1), m_Power) * m_Scale;//Original added 1e-100, use Zeps to be more precise. //Rotate. - Vx = DXo * m_RotCos + DYo * m_RotSin; - Vy = -DXo * m_RotSin + DYo * m_RotCos; + v.x = DXo * m_RotCos + DYo * m_RotSin; + v.y = -DXo * m_RotSin + DYo * m_RotCos; //Measure voronoi distance again. - U.x = Vx + P[0].x; - U.y = Vy + P[0].y; - L2 = Voronoi(&P[0], 7, 0, U); + u = v + P[0]; + L2 = m_VarFuncs->Voronoi(&P[0], 7, 0, u); //Scale to meet target size . . . adjust according to how close //we are to the edge. //Code here attempts to remove the "rosette" effect caused by @@ -125,14 +124,12 @@ public: R = ((trgL / L1) * (T(0.8) - L) + (trgL / L2) * (L - T(0.5))) / T(0.3); } - Vx *= R; - Vy *= R; + v *= R; //Add cell center co-ordinates back in. - Vx += P[0].x; - Vy += P[0].y; + v += P[0]; //Finally add values in. - helper.Out.x = m_Weight * Vx; - helper.Out.y = m_Weight * Vy; + helper.Out.x = m_Weight * v.x; + helper.Out.y = m_Weight * v.y; helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z; } @@ -242,7 +239,7 @@ public: virtual vector OpenCLGlobalFuncNames() const override { - return vector { "Zeps" }; + return vector { "Zeps", "Sqr", "Vratio", "Closest", "Vratio" }; } virtual string OpenCLFuncsString() const override @@ -257,60 +254,7 @@ public: "constant real_t AYoXh = (real_t)(1.7320508075688772935 / 2.0);\n" "constant real_t AYoYh = (real_t)(1.7320508075688772935 / 2.0);\n" "constant real2 offset[4] = { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } };\n" - "\n" - "real_t Vratio(real2* p, real2* q, real2* u)\n" - "{\n" - " real_t pmQx, pmQy;\n" - "\n" - " pmQx = (*p).x - (*q).x;\n" - " pmQy = (*p).y - (*q).y;\n" - "\n" - " if (pmQx == 0 && pmQy == 0)\n" - " return 1.0;\n" - "\n" - " return 2 * (((*u).x - (*q).x) * pmQx + ((*u).y - (*q).y) * pmQy) / (pmQx * pmQx + pmQy * pmQy);\n" - "}\n" - "\n" - "int Closest(real2* p, int n, real2* u)\n" - "{\n" - " real_t d2;\n" - " real_t d2min = TMAX;\n" - " int i, j;\n" - "\n" - " for (i = 0; i < n; i++)\n" - " {\n" - " d2 = (p[i].x - (*u).x) * (p[i].x - (*u).x) + (p[i].y - (*u).y) * (p[i].y - (*u).y);\n" - "\n" - " if (d2 < d2min)\n" - " {\n" - " d2min = d2;\n" - " j = i;\n" - " }\n" - " }\n" - "\n" - " return j;\n" - "}\n" - "\n" - "real_t Voronoi(real2* p, int n, int q, real2* u)\n" - "{\n" - " real_t ratio;\n" - " real_t ratiomax = TLOW;\n" - " int i;\n" - "\n" - " for (i = 0; i < n; i++)\n" - " {\n" - " if (i != q)\n" - " {\n" - " ratio = Vratio(&p[i], &p[q], u);\n" - "\n" - " if (ratio > ratiomax)\n" - " ratiomax = ratio;\n" - " }\n" - " }\n" - "\n" - " return ratiomax;\n" - "}\n" - ; + "\n"; } virtual void Precalc() override @@ -325,72 +269,22 @@ protected: string prefix = Prefix(); m_Params.clear(); m_Params.push_back(ParamWithName(&m_Cellsize, prefix + "hexes_cellsize", 1)); - m_Params.push_back(ParamWithName(&m_Power, prefix + "hexes_power", 1)); - m_Params.push_back(ParamWithName(&m_Rotate, prefix + "hexes_rotate", T(0.166))); - m_Params.push_back(ParamWithName(&m_Scale, prefix + "hexes_scale", 1)); + m_Params.push_back(ParamWithName(&m_Power, prefix + "hexes_power", 1)); + m_Params.push_back(ParamWithName(&m_Rotate, prefix + "hexes_rotate", T(0.166))); + m_Params.push_back(ParamWithName(&m_Scale, prefix + "hexes_scale", 1)); m_Params.push_back(ParamWithName(true, &m_RotSin, prefix + "hexes_rotsin"));//Precalc. m_Params.push_back(ParamWithName(true, &m_RotCos, prefix + "hexes_rotcos")); + m_VarFuncs = VarFuncs::Instance(); } private: - static T Vratio(v2T& p, v2T& q, v2T& u) - { - T pmQx, pmQy; - pmQx = p.x - q.x; - pmQy = p.y - q.y; - - if (pmQx == 0 && pmQy == 0) - return 1.0; - - return 2 * ((u.x - q.x) * pmQx + (u.y - q.y) * pmQy) / (pmQx * pmQx + pmQy * pmQy); - } - - static int Closest(v2T* p, int n, v2T& u) - { - T d2; - T d2min = TMAX; - int i, j; - - for (i = 0; i < n; i++) - { - d2 = (p[i].x - u.x) * (p[i].x - u.x) + (p[i].y - u.y) * (p[i].y - u.y); - - if (d2 < d2min) - { - d2min = d2; - j = i; - } - } - - return j; - } - - static T Voronoi(v2T* p, int n, int q, v2T& u) - { - T ratio; - T ratiomax = TLOW; - int i; - - for (i = 0; i < n; i++) - { - if (i != q) - { - ratio = Vratio(p[i], p[q], u); - - if (ratio > ratiomax) - ratiomax = ratio; - } - } - - return ratiomax; - } - T m_Cellsize; T m_Power; T m_Rotate; T m_Scale; T m_RotSin;//Precalc. T m_RotCos; + std::shared_ptr> m_VarFuncs; }; /// @@ -1916,34 +1810,34 @@ protected: { string prefix = Prefix(); m_Params.clear(); - m_Params.push_back(ParamWithName(&m_Top, prefix + "crob_top", -1)); - m_Params.push_back(ParamWithName(&m_Bottom, prefix + "crob_bottom", 1)); - m_Params.push_back(ParamWithName(&m_Left, prefix + "crob_left", -1)); - m_Params.push_back(ParamWithName(&m_Right, prefix + "crob_right", 1)); - m_Params.push_back(ParamWithName(&m_Blur, prefix + "crob_blur", 1, INTEGER)); - m_Params.push_back(ParamWithName(&m_RatioBlur, prefix + "crob_ratioBlur", T(0.5), REAL, 0, 1)); + m_Params.push_back(ParamWithName(&m_Top, prefix + "crob_top", -1)); + m_Params.push_back(ParamWithName(&m_Bottom, prefix + "crob_bottom", 1)); + m_Params.push_back(ParamWithName(&m_Left, prefix + "crob_left", -1)); + m_Params.push_back(ParamWithName(&m_Right, prefix + "crob_right", 1)); + m_Params.push_back(ParamWithName(&m_Blur, prefix + "crob_blur", 1, INTEGER)); + m_Params.push_back(ParamWithName(&m_RatioBlur, prefix + "crob_ratioBlur", T(0.5), REAL, 0, 1)); m_Params.push_back(ParamWithName(&m_DirectBlur, prefix + "crob_directBlur", 2)); - m_Params.push_back(ParamWithName(true, &m_XInterval, prefix + "crob_xinterval")); - m_Params.push_back(ParamWithName(true, &m_YInterval, prefix + "crob_yinterval")); - m_Params.push_back(ParamWithName(true, &m_XInt2, prefix + "crob_xint2")); - m_Params.push_back(ParamWithName(true, &m_YInt2, prefix + "crob_yint2")); - m_Params.push_back(ParamWithName(true, &m_MinInt2, prefix + "crob_minint2")); - m_Params.push_back(ParamWithName(true, &m_X0, prefix + "crob_x0")); - m_Params.push_back(ParamWithName(true, &m_Y0, prefix + "crob_y0")); - m_Params.push_back(ParamWithName(true, &m_X0c, prefix + "crob_x0c")); - m_Params.push_back(ParamWithName(true, &m_Y0c, prefix + "crob_y0c")); - m_Params.push_back(ParamWithName(true, &m_SetProb, prefix + "crob_set_prob")); - m_Params.push_back(ParamWithName(true, &m_SetProbH, prefix + "crob_set_prob_h")); - m_Params.push_back(ParamWithName(true, &m_SetProbQ, prefix + "crob_set_prob_q")); - m_Params.push_back(ParamWithName(true, &m_SetProbTQ, prefix + "crob_set_prob_tq")); - m_Params.push_back(ParamWithName(true, &m_SetCompProb, prefix + "crob_set_comp_prob")); - m_Params.push_back(ParamWithName(true, &m_SetCompProbH, prefix + "crob_set_comp_prob_h")); - m_Params.push_back(ParamWithName(true, &m_SetCompProbQ, prefix + "crob_set_comp_prob_q")); + m_Params.push_back(ParamWithName(true, &m_XInterval, prefix + "crob_xinterval")); + m_Params.push_back(ParamWithName(true, &m_YInterval, prefix + "crob_yinterval")); + m_Params.push_back(ParamWithName(true, &m_XInt2, prefix + "crob_xint2")); + m_Params.push_back(ParamWithName(true, &m_YInt2, prefix + "crob_yint2")); + m_Params.push_back(ParamWithName(true, &m_MinInt2, prefix + "crob_minint2")); + m_Params.push_back(ParamWithName(true, &m_X0, prefix + "crob_x0")); + m_Params.push_back(ParamWithName(true, &m_Y0, prefix + "crob_y0")); + m_Params.push_back(ParamWithName(true, &m_X0c, prefix + "crob_x0c")); + m_Params.push_back(ParamWithName(true, &m_Y0c, prefix + "crob_y0c")); + m_Params.push_back(ParamWithName(true, &m_SetProb, prefix + "crob_set_prob")); + m_Params.push_back(ParamWithName(true, &m_SetProbH, prefix + "crob_set_prob_h")); + m_Params.push_back(ParamWithName(true, &m_SetProbQ, prefix + "crob_set_prob_q")); + m_Params.push_back(ParamWithName(true, &m_SetProbTQ, prefix + "crob_set_prob_tq")); + m_Params.push_back(ParamWithName(true, &m_SetCompProb, prefix + "crob_set_comp_prob")); + m_Params.push_back(ParamWithName(true, &m_SetCompProbH, prefix + "crob_set_comp_prob_h")); + m_Params.push_back(ParamWithName(true, &m_SetCompProbQ, prefix + "crob_set_comp_prob_q")); m_Params.push_back(ParamWithName(true, &m_SetCompProbTQ, prefix + "crob_set_comp_prob_tq")); - m_Params.push_back(ParamWithName(true, &m_TopBorder, prefix + "crob_top_border")); - m_Params.push_back(ParamWithName(true, &m_BottomBorder, prefix + "crob_bottom_border")); - m_Params.push_back(ParamWithName(true, &m_LeftBorder, prefix + "crob_left_border")); - m_Params.push_back(ParamWithName(true, &m_RightBorder, prefix + "crob_right_border")); + m_Params.push_back(ParamWithName(true, &m_TopBorder, prefix + "crob_top_border")); + m_Params.push_back(ParamWithName(true, &m_BottomBorder, prefix + "crob_bottom_border")); + m_Params.push_back(ParamWithName(true, &m_LeftBorder, prefix + "crob_left_border")); + m_Params.push_back(ParamWithName(true, &m_RightBorder, prefix + "crob_right_border")); } private: @@ -2210,7 +2104,7 @@ public: "\t\t{\n" "\t\t while (angXY > " << angStrip2 << ")\n" "\t\t {\n" - "\t\t angXY -= " << angStrip2 << "; \n" + "\t\t angXY -= " << angStrip2 << ";\n" "\t\t }\n" "\t\t\n" "\t\t if (" << invStripes << " == 0)\n" @@ -2282,7 +2176,7 @@ public: "\t\t\n" "\t\tif ((x != 0) || (y != 0))\n" "\t\t{\n" - "\t\t z = 2 / pow(rad, " << exponentZ << ") - 1; \n" + "\t\t z = 2 / pow(rad, " << exponentZ << ") - 1;\n" "\t\t\n" "\t\t if (" << exponentZ << " <= 2)\n" "\t\t angZ = M_PI - acos((z / (Sqr(x) + Sqr(y) + Sqr(z))));\n" @@ -2309,7 +2203,7 @@ public: "\t\t }\n" "\t\t else\n" "\t\t {\n" - "\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2; \n" + "\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2;\n" "\t\t angZ -= M_PI_2;\n" "\t\t fac = cos(angTmp) / cos(angZ);\n" "\t\t x = x * fac;\n" @@ -2330,7 +2224,7 @@ public: "\t\t }\n" "\t\t else\n" "\t\t {\n" - "\t\t angTmp = M_PI - angZ / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2; \n" + "\t\t angTmp = M_PI - angZ / " << angHoleComp << " * " << angHoleTemp << " - M_PI_2;\n" "\t\t angZ -= M_PI_2;\n" "\t\t fac = cos(angTmp) / cos(angZ);\n" "\t\t x = x * fac;\n" @@ -2354,7 +2248,7 @@ public: "\t\t {\n" "\t\t if (angZ > " << angHoleTemp << ")\n" "\t\t {\n" - "\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * (M_PI - 2 * " << angHoleComp << ") + " << angHoleComp << " - M_PI_2; \n" + "\t\t angTmp = (M_PI - angZ) / " << angHoleComp << " * (M_PI - 2 * " << angHoleComp << ") + " << angHoleComp << " - M_PI_2;\n" "\t\t }\n" "\t\t else\n" "\t\t {\n" @@ -2903,7 +2797,7 @@ public: << "\t\treal_t Vx, Vy, radius, theta;\n" << "\t\treal_t thetaFactor;\n" << "\t\treal_t s, c, mu;\n" - << "\t\tint synthMode = (int)" << synthMode << "; \n" + << "\t\tint synthMode = (int)" << synthMode << ";\n" << "\t\tSynthStruct synth;\n" << "\n" << "\t\tsynth.SynthA = " << synthA << ";\n" @@ -3419,40 +3313,40 @@ protected: string prefix = Prefix(); m_Params.clear(); m_Params.reserve(34); - m_Params.push_back(ParamWithName(&m_SynthA, prefix + "synth_a")); - m_Params.push_back(ParamWithName(&m_SynthMode, prefix + "synth_mode", 3, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthPower, prefix + "synth_power", -2)); - m_Params.push_back(ParamWithName(&m_SynthMix, prefix + "synth_mix")); + m_Params.push_back(ParamWithName(&m_SynthA, prefix + "synth_a")); + m_Params.push_back(ParamWithName(&m_SynthMode, prefix + "synth_mode", 3, INTEGER)); + m_Params.push_back(ParamWithName(&m_SynthPower, prefix + "synth_power", -2)); + m_Params.push_back(ParamWithName(&m_SynthMix, prefix + "synth_mix")); m_Params.push_back(ParamWithName(&m_SynthSmooth, prefix + "synth_smooth", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthB, prefix + "synth_b")); - m_Params.push_back(ParamWithName(&m_SynthBType, prefix + "synth_b_type", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthBSkew, prefix + "synth_b_skew")); - m_Params.push_back(ParamWithName(&m_SynthBFrq, prefix + "synth_b_frq", 1, REAL)); - m_Params.push_back(ParamWithName(&m_SynthBPhs, prefix + "synth_b_phs")); + m_Params.push_back(ParamWithName(&m_SynthB, prefix + "synth_b")); + m_Params.push_back(ParamWithName(&m_SynthBType, prefix + "synth_b_type", 0, INTEGER)); + m_Params.push_back(ParamWithName(&m_SynthBSkew, prefix + "synth_b_skew")); + m_Params.push_back(ParamWithName(&m_SynthBFrq, prefix + "synth_b_frq", 1, REAL)); + m_Params.push_back(ParamWithName(&m_SynthBPhs, prefix + "synth_b_phs")); m_Params.push_back(ParamWithName(&m_SynthBLayer, prefix + "synth_b_layer", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthC, prefix + "synth_c")); - m_Params.push_back(ParamWithName(&m_SynthCType, prefix + "synth_c_type", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthCSkew, prefix + "synth_c_skew")); - m_Params.push_back(ParamWithName(&m_SynthCFrq, prefix + "synth_c_frq", 1, REAL)); - m_Params.push_back(ParamWithName(&m_SynthCPhs, prefix + "synth_c_phs")); + m_Params.push_back(ParamWithName(&m_SynthC, prefix + "synth_c")); + m_Params.push_back(ParamWithName(&m_SynthCType, prefix + "synth_c_type", 0, INTEGER)); + m_Params.push_back(ParamWithName(&m_SynthCSkew, prefix + "synth_c_skew")); + m_Params.push_back(ParamWithName(&m_SynthCFrq, prefix + "synth_c_frq", 1, REAL)); + m_Params.push_back(ParamWithName(&m_SynthCPhs, prefix + "synth_c_phs")); m_Params.push_back(ParamWithName(&m_SynthCLayer, prefix + "synth_c_layer", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthD, prefix + "synth_d")); - m_Params.push_back(ParamWithName(&m_SynthDType, prefix + "synth_d_type", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthDSkew, prefix + "synth_d_skew")); - m_Params.push_back(ParamWithName(&m_SynthDFrq, prefix + "synth_d_frq", 1, REAL)); - m_Params.push_back(ParamWithName(&m_SynthDPhs, prefix + "synth_d_phs")); + m_Params.push_back(ParamWithName(&m_SynthD, prefix + "synth_d")); + m_Params.push_back(ParamWithName(&m_SynthDType, prefix + "synth_d_type", 0, INTEGER)); + m_Params.push_back(ParamWithName(&m_SynthDSkew, prefix + "synth_d_skew")); + m_Params.push_back(ParamWithName(&m_SynthDFrq, prefix + "synth_d_frq", 1, REAL)); + m_Params.push_back(ParamWithName(&m_SynthDPhs, prefix + "synth_d_phs")); m_Params.push_back(ParamWithName(&m_SynthDLayer, prefix + "synth_d_layer", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthE, prefix + "synth_e")); - m_Params.push_back(ParamWithName(&m_SynthEType, prefix + "synth_e_type", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthESkew, prefix + "synth_e_skew")); - m_Params.push_back(ParamWithName(&m_SynthEFrq, prefix + "synth_e_frq", 1, REAL)); - m_Params.push_back(ParamWithName(&m_SynthEPhs, prefix + "synth_e_phs")); + m_Params.push_back(ParamWithName(&m_SynthE, prefix + "synth_e")); + m_Params.push_back(ParamWithName(&m_SynthEType, prefix + "synth_e_type", 0, INTEGER)); + m_Params.push_back(ParamWithName(&m_SynthESkew, prefix + "synth_e_skew")); + m_Params.push_back(ParamWithName(&m_SynthEFrq, prefix + "synth_e_frq", 1, REAL)); + m_Params.push_back(ParamWithName(&m_SynthEPhs, prefix + "synth_e_phs")); m_Params.push_back(ParamWithName(&m_SynthELayer, prefix + "synth_e_layer", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthF, prefix + "synth_f")); - m_Params.push_back(ParamWithName(&m_SynthFType, prefix + "synth_f_type", 0, INTEGER)); - m_Params.push_back(ParamWithName(&m_SynthFSkew, prefix + "synth_f_skew")); - m_Params.push_back(ParamWithName(&m_SynthFFrq, prefix + "synth_f_frq", 1, REAL)); - m_Params.push_back(ParamWithName(&m_SynthFPhs, prefix + "synth_f_phs")); + m_Params.push_back(ParamWithName(&m_SynthF, prefix + "synth_f")); + m_Params.push_back(ParamWithName(&m_SynthFType, prefix + "synth_f_type", 0, INTEGER)); + m_Params.push_back(ParamWithName(&m_SynthFSkew, prefix + "synth_f_skew")); + m_Params.push_back(ParamWithName(&m_SynthFFrq, prefix + "synth_f_frq", 1, REAL)); + m_Params.push_back(ParamWithName(&m_SynthFPhs, prefix + "synth_f_phs")); m_Params.push_back(ParamWithName(&m_SynthFLayer, prefix + "synth_f_layer", 0, INTEGER)); } @@ -3736,10 +3630,244 @@ private: T m_SynthFLayer; }; +#define CACHE_NUM 10 +#define CACHE_WIDTH 21 +#define VORONOI_MAXPOINTS 10 + +/// +/// crackle. +/// +template +class EMBER_API CrackleVariation : public ParametricVariation +{ +public: + CrackleVariation(T weight = 1.0) : ParametricVariation("crackle", VAR_CRACKLE, weight) + { + Init(); + } + + PARVARCOPY(CrackleVariation) + + virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override + { + int di, dj; + int i = 0; + T l, r, trgL; + v2T u, dO; + glm::ivec2 cv; + v2T p[VORONOI_MAXPOINTS]; + + if (m_CellSize == 0) + return; + + T blurr = (rand.Frand01() + rand.Frand01()) / 2 + (rand.Frand01() - T(0.5)) / 4; + T theta = M_2PI * rand.Frand01(); + u.x = blurr * std::sin(theta); + u.y = blurr * std::cos(theta); + cv.x = int(std::floor(u.x / m_HalfCellSize)); + cv.y = int(std::floor(u.y / m_HalfCellSize)); + + for (di = -1; di < 2; di++) + { + for (dj = -1; dj < 2; dj++) + { + CachedPosition(m_C, cv.x + di, cv.y + dj, m_Z, m_HalfCellSize, m_Distort, p[i]); + i++; + } + } + + int q = m_VarFuncs->Closest(p, 9, u); + glm::ivec2 offset[9] = { { -1, -1 }, { -1, 0 }, { -1, 1 }, + { 0, -1 }, { 0, 0 }, { 0, 1 }, + { 1, -1 }, { 1, 0 }, { 1, 1 } + }; + cv += offset[q]; + i = 0; + + for (di = -1; di < 2; di++) + { + for (dj = -1; dj < 2; dj++) + { + CachedPosition(m_C, cv.x + di, cv.y + dj, m_Z, m_HalfCellSize, m_Distort, p[i]); + i++; + } + } + + l = m_VarFuncs->Voronoi(p, 9, 4, u); + dO = u - p[4]; + trgL = std::pow(Zeps(l), m_Power) * m_Scale; + r = trgL / Zeps(l); + dO *= r; + dO += p[4]; + helper.Out.x = m_Weight * dO.x; + helper.Out.y = m_Weight * dO.y; + helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z; + } + + virtual vector OpenCLGlobalFuncNames() const override + { + return vector { "Zeps", "Sqr", "Closest", "Vratio", "Voronoi", "SimplexNoise3D" }; + } + + virtual vector OpenCLGlobalDataNames() const override + { + return vector { "NOISE_INDEX", "NOISE_POINTS" }; + } + + virtual string OpenCLFuncsString() const override + { + //CPU version uses a cache of points if the abs() values are <= 10. However, this crashes on Nvidia GPUs. + //The problem was traced to the usage of the cache array. + //No possible solution was found, so it is unused here. + //The full calculation is recomputed for every point. + return + "static void Position(__global real_t* p, __global real3* grad, int x, int y, real_t z, real_t s, real_t d, real2* v)\n" + "{\n" + " real3 e, f;\n" + " e.x = x * 2.5;\n" + " e.y = y * 2.5;\n" + " e.z = z * 2.5;\n" + " f.x = y * 2.5 + 30.2;\n" + " f.y = x * 2.5 - 12.1;\n" + " f.z = z * 2.5 + 19.8;\n" + " (*v).x = (x + d * SimplexNoise3D(&e, p, grad)) * s;\n" + " (*v).y = (y + d * SimplexNoise3D(&f, p, grad)) * s;\n" + "}\n" + "\n"; + } + + virtual string OpenCLString() const override + { + ostringstream ss, ss2; + intmax_t i = 0, varIndex = IndexInXform(); + ss2 << "_" << XformIndexInEmber(); + string index = ss2.str() + "]"; + string cellSize = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string power = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string distort = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string scale = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string z = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string halfCellSize = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + ss << "\t{\n" + << "\t\tint di = -1, dj = -1;\n" + << "\t\tint i = 0;\n" + << "\t\treal_t l, r, trgL;\n" + << "\t\treal2 u, dO;\n" + << "\t\tint2 cv;\n" + << "\t\treal2 p[" << VORONOI_MAXPOINTS << "];\n" + << "\n" + << "\t\tif (" << cellSize << " == 0)\n" + << "\t\t return;\n" + << "\n" + << "\t\treal_t blurr = (MwcNext01(mwc) + MwcNext01(mwc)) / 2 + (MwcNext01(mwc) - 0.5) / 4;\n" + << "\t\treal_t theta = M_2PI * MwcNext01(mwc);\n" + << "\t\tu.x = blurr * sin(theta);\n" + << "\t\tu.y = blurr * cos(theta);\n" + << "\t\tcv.x = (int)floor(u.x / " << halfCellSize << ");\n" + << "\t\tcv.y = (int)floor(u.y / " << halfCellSize << ");\n" + << "\n" + << "\t\tfor (di = -1; di < 2; di++)\n" + << "\t\t{\n" + << "\t\t for (dj = -1; dj < 2; dj++)\n" + << "\t\t {\n" + << "\t\t Position(globalShared + NOISE_INDEX, (__global real3*)(globalShared + NOISE_POINTS), cv.x + di, cv.y + dj, " << z << ", " << halfCellSize << ", " << distort << ", &p[i]);\n" + << "\t\t i++;\n" + << "\t\t }\n" + << "\t\t}\n" + << "\n" + << "\t\tint q = Closest(p, 9, &u);\n" + << "\t\tint2 offset[9] = { { -1, -1 }, { -1, 0 }, { -1, 1 }, \n" + << "\t\t{ 0, -1 }, { 0, 0 }, { 0, 1 },\n" + << "\t\t{ 1, -1 }, { 1, 0 }, { 1, 1 } };\n" + << "\t\tcv += offset[q];\n" + << "\t\ti = 0;\n" + << "\n" + << "\t\tfor (di = -1; di < 2; di++)\n" + << "\t\t{\n" + << "\t\t for (dj = -1; dj < 2; dj++)\n" + << "\t\t {\n" + << "\t\t Position(globalShared + NOISE_INDEX, (__global real3*)(globalShared + NOISE_POINTS), cv.x + di, cv.y + dj, " << z << ", " << halfCellSize << ", " << distort << ", &p[i]);\n" + << "\t\t i++;\n" + << "\t\t }\n" + << "\t\t}\n" + << "\n" + << "\t\tl = Voronoi(p, 9, 4, &u);\n" + << "\t\tdO = u - p[4];\n" + << "\t\ttrgL = pow(Zeps(l), " << power << ") * " << scale << ";\n" + << "\t\tr = trgL / Zeps(l);\n" + << "\t\tdO *= r;\n" + << "\t\tdO += p[4];\n" + << "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * dO.x;\n" + << "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * dO.y;\n" + << "\t\tvOut.z = " << ((m_VarType == VARTYPE_REG) ? "0" : "vIn.z") << ";\n" + << "\t}\n"; + return ss.str(); + } + + virtual void Precalc() override + { + int x, y; + m_HalfCellSize = Zeps(m_CellSize / 2); + + for (x = -CACHE_NUM; x <= CACHE_NUM; x++) + for (y = -CACHE_NUM; y <= CACHE_NUM; y++) + Position(x, y, m_Z, m_HalfCellSize, m_Distort, m_C[x + CACHE_NUM][y + CACHE_NUM]); + } + +protected: + void Init() + { + string prefix = Prefix(); + m_VarFuncs = VarFuncs::Instance(); + m_Params.clear(); + m_Params.reserve(8); + m_Params.push_back(ParamWithName(&m_CellSize, prefix + "crackle_cellsize", 1)); + m_Params.push_back(ParamWithName(&m_Power, prefix + "crackle_power", T(0.2))); + m_Params.push_back(ParamWithName(&m_Distort, prefix + "crackle_distort")); + m_Params.push_back(ParamWithName(&m_Scale, prefix + "crackle_scale", 1)); + m_Params.push_back(ParamWithName(&m_Z, prefix + "crackle_z")); + m_Params.push_back(ParamWithName(true, &m_HalfCellSize, prefix + "crackle_half_cellsize")); + } + +private: + void Position(int x, int y, T z, T s, T d, v2T& v) + { + v3T e, f; + // Values here are arbitrary, chosen simply to be far enough apart so they do not correlate + e.x = x * T(2.5); + e.y = y * T(2.5); + e.z = z * T(2.5); + // Cross-over between x and y is intentional + f.x = y * T(2.5) + T(30.2); + f.y = x * T(2.5) - T(12.1); + f.z = z * T(2.5) + T(19.8); + v.x = (x + d * m_VarFuncs->SimplexNoise3D(e)) * s; + v.y = (y + d * m_VarFuncs->SimplexNoise3D(f)) * s; + } + + void CachedPosition(v2T cache[CACHE_WIDTH][CACHE_WIDTH], int x, int y, T z, T s, T d, v2T& v) + { + if (std::abs(x) <= CACHE_NUM && std::abs(y) <= CACHE_NUM) + v = cache[x + CACHE_NUM][y + CACHE_NUM]; + else + Position(x, y, z, s, d, v); + } + + T m_CellSize; + T m_Power; + T m_Distort; + T m_Scale; + T m_Z; + T m_HalfCellSize;//Precalc + v2T m_C[CACHE_WIDTH][CACHE_WIDTH];//Not kept as a precalc because it crashes Nvidia GPUs. + std::shared_ptr> m_VarFuncs; +}; + MAKEPREPOSTPARVAR(Hexes, hexes, HEXES) MAKEPREPOSTPARVAR(Nblur, nBlur, NBLUR) MAKEPREPOSTPARVAR(Octapol, octapol, OCTAPOL) MAKEPREPOSTPARVAR(Crob, crob, CROB) MAKEPREPOSTPARVAR(BubbleT3D, bubbleT3D, BUBBLET3D) MAKEPREPOSTPARVAR(Synth, synth, SYNTH) +MAKEPREPOSTPARVAR(Crackle, crackle, CRACKLE) } diff --git a/Source/Ember/VariationsDC.h b/Source/Ember/VariationsDC.h index 1735da4..f836917 100644 --- a/Source/Ember/VariationsDC.h +++ b/Source/Ember/VariationsDC.h @@ -24,11 +24,9 @@ public: T r = helper.m_PrecalcSumSquares; T r4_1 = Zeps(r / 4 + 1); r4_1 = m_Weight / r4_1; - helper.Out.x = r4_1 * helper.In.x; helper.Out.y = r4_1 * helper.In.y; helper.Out.z = m_Weight * (2 / r4_1 - 1); - T sumX, sumY; if (m_VarType == VARTYPE_PRE) @@ -44,7 +42,6 @@ public: T tempX = helper.Out.x + sumX; T tempY = helper.Out.y + sumY; - outPoint.m_ColorX = fmod(fabs(m_Bdcs * (Sqr(tempX + m_CenterX) + Sqr(tempY + m_CenterY))), T(1.0)); } @@ -58,7 +55,6 @@ public: string centerX = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string centerY = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string bdcs = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc. - ss << "\t{\n" << "\t\treal_t r = precalcSumSquares;\n" << "\t\treal_t r4_1 = Zeps(r / 4 + 1);\n" @@ -73,23 +69,22 @@ public: if (m_VarType == VARTYPE_PRE) { ss - << "\t\tsumX = vIn.x;\n" - << "\t\tsumY = vIn.y;\n"; + << "\t\tsumX = vIn.x;\n" + << "\t\tsumY = vIn.y;\n"; } else { ss - << "\t\tsumX = outPoint->m_X;\n" - << "\t\tsumY = outPoint->m_Y;\n"; + << "\t\tsumX = outPoint->m_X;\n" + << "\t\tsumY = outPoint->m_Y;\n"; } ss - << "\t\treal_t tempX = vOut.x + sumX;\n" - << "\t\treal_t tempY = vOut.y + sumY;\n" - << "\n" - << "\t\toutPoint->m_ColorX = fmod(fabs(" << bdcs << " * (Sqr(tempX + " << centerX << ") + Sqr(tempY + " << centerY << "))), (real_t)(1.0));\n" - << "\t}\n"; - + << "\t\treal_t tempX = vOut.x + sumX;\n" + << "\t\treal_t tempY = vOut.y + sumY;\n" + << "\n" + << "\t\toutPoint->m_ColorX = fmod(fabs(" << bdcs << " * (Sqr(tempX + " << centerX << ") + Sqr(tempY + " << centerY << "))), (real_t)(1.0));\n" + << "\t}\n"; return ss.str(); } @@ -107,7 +102,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_CenterX, prefix + "dc_bubble_centerx"));//Params. m_Params.push_back(ParamWithName(&m_CenterY, prefix + "dc_bubble_centery")); @@ -144,7 +138,6 @@ public: T y = helper.In.y + y0; T x0_xor_y0 = T(x0 ^ y0); T h = -m_H + (1 - x0_xor_y0) * m_H; - helper.Out.x = m_Weight * (m_Xform->m_Affine.A() * x + m_Xform->m_Affine.B() * y + m_Xform->m_Affine.E()); helper.Out.y = m_Weight * (m_Xform->m_Affine.C() * x + m_Xform->m_Affine.D() * y + m_Xform->m_Affine.F()); helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z; @@ -159,7 +152,6 @@ public: string index = ss2.str(); string origin = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params. string h = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc. - ss << "\t{\n" << "\t\tint x0 = (MwcNext(mwc) & 1) ? -1 : 1;\n" << "\t\tint y0 = (MwcNext(mwc) & 1) ? -1 : 1;\n" @@ -173,7 +165,6 @@ public: << "\t\tvOut.z = " << ((m_VarType == VARTYPE_REG) ? "0" : "vIn.z") << ";\n" << "\t\toutPoint->m_ColorX = fmod(fabs(outPoint->m_ColorX * (real_t)(0.5) * (1 + h) + x0_xor_y0 * (1 - h) * (real_t)(0.5)), (real_t)(1.0));\n" << "\t}\n"; - return ss.str(); } @@ -186,7 +177,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_Origin, prefix + "dc_carpet_origin"));//Params. m_Params.push_back(ParamWithName(true, &m_H, prefix + "dc_carpet_h"));//Precalc. @@ -232,6 +222,7 @@ public: outPoint.m_ColorX = m_ClampC2; break; + case 1: x = m_Weight * p; y = m_Weight * (j ? -1 : 1); @@ -243,6 +234,7 @@ public: outPoint.m_ColorX = m_ClampC4; break; + case 2: default: x = m_Weight * p; @@ -283,7 +275,6 @@ public: string clampC4 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string clampC5 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string clampC6 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; - ss << "\t{\n" << "\t\treal_t x, y, z;\n" << "\t\treal_t p = 2 * MwcNext01(mwc) - 1;\n" @@ -332,7 +323,6 @@ public: << "\t\tvOut.y = y * " << cubeY << ";\n" << "\t\tvOut.z = z * " << cubeZ << ";\n" << "\t}\n"; - return ss.str(); } @@ -350,7 +340,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_DcCubeC1, prefix + "dc_cube_c1"));//Params. m_Params.push_back(ParamWithName(&m_DcCubeC2, prefix + "dc_cube_c2")); @@ -408,11 +397,9 @@ public: T sr = std::sin(temp); T cr = std::cos(temp); T r = m_Blur * (rand.Frand01() + rand.Frand01() + rand.Frand01() + rand.Frand01() - 2); - helper.Out.x = m_Weight * std::sin(helper.In.x + r * sr) * m_X; helper.Out.y = r + helper.In.y * m_Y; helper.Out.z = m_Weight * std::cos(helper.In.x + r * cr); - T sumX, sumY; if (m_VarType == VARTYPE_PRE) @@ -428,7 +415,6 @@ public: T tempX = helper.Out.x + sumX; T tempY = helper.Out.y + sumY; - outPoint.m_ColorX = fmod(fabs(T(0.5) * (m_Ldcs * ((m_Cosa * tempX + m_Sina * tempY + m_Offset)) + 1)), T(1.0)); } @@ -448,7 +434,6 @@ public: string cosa = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string ldcs = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string ldca = "parVars[" + ToUpper(m_Params[i++].Name()) + index; - ss << "\t{\n" << "\t\treal_t temp = MwcNext(mwc) * M_2PI;\n" << "\t\treal_t sr = sin(temp);\n" @@ -463,23 +448,22 @@ public: if (m_VarType == VARTYPE_PRE) { ss - << "\t\tsumX = vIn.x;\n" - << "\t\tsumY = vIn.y;\n"; + << "\t\tsumX = vIn.x;\n" + << "\t\tsumY = vIn.y;\n"; } else { ss - << "\t\tsumX = outPoint->m_X;\n" - << "\t\tsumY = outPoint->m_Y;\n"; + << "\t\tsumX = outPoint->m_X;\n" + << "\t\tsumY = outPoint->m_Y;\n"; } ss - << "\t\treal_t tempX = vOut.x + sumX;\n" - << "\t\treal_t tempY = vOut.y + sumY;\n" - << "\n" - << "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n" - << "\t}\n"; - + << "\t\treal_t tempX = vOut.x + sumX;\n" + << "\t\treal_t tempY = vOut.y + sumY;\n" + << "\n" + << "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n" + << "\t}\n"; return ss.str(); } @@ -494,7 +478,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_Offset, prefix + "dc_cylinder_offset"));//Params. m_Params.push_back(ParamWithName(&m_Angle, prefix + "dc_cylinder_angle"));//Original used a prefix of dc_cyl_, which is incompatible with Ember's design. @@ -613,7 +596,6 @@ public: { ostringstream ss; intmax_t varIndex = IndexInXform(); - ss << "\t{\n" << "\t\treal_t x = LRint(vIn.x);\n" << "\t\treal_t y = LRint(vIn.y);\n" @@ -689,7 +671,6 @@ public: << "\t\tvOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n" << "\t\toutPoint->m_ColorX = fmod(c, (real_t)(1.0));\n" << "\t}\n"; - return ss.str(); } @@ -719,7 +700,6 @@ public: helper.Out.x = m_Weight * helper.In.x; helper.Out.y = m_Weight * helper.In.y; helper.Out.z = m_Weight * helper.In.z; - T sumX, sumY; if (m_VarType == VARTYPE_PRE) @@ -735,7 +715,6 @@ public: T tempX = helper.Out.x + sumX; T tempY = helper.Out.y + sumY; - outPoint.m_ColorX = fmod(fabs(T(0.5) * (m_Ldcs * ((m_Cosa * tempX + m_Sina * tempY + m_Offset)) + T(1.0))), T(1.0)); } @@ -752,7 +731,6 @@ public: string ldca = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string sina = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string cosa = "parVars[" + ToUpper(m_Params[i++].Name()) + index; - ss << "\t{\n" << "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * vIn.x;\n" << "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vIn.y;\n" @@ -763,23 +741,22 @@ public: if (m_VarType == VARTYPE_PRE) { ss - << "\t\tsumX = vIn.x;\n" - << "\t\tsumY = vIn.y;\n"; + << "\t\tsumX = vIn.x;\n" + << "\t\tsumY = vIn.y;\n"; } else { ss - << "\t\tsumX = outPoint->m_X;\n" - << "\t\tsumY = outPoint->m_Y;\n"; + << "\t\tsumX = outPoint->m_X;\n" + << "\t\tsumY = outPoint->m_Y;\n"; } ss - << "\t\treal_t tempX = vOut.x + sumX;\n" - << "\t\treal_t tempY = vOut.y + sumY;\n" - << "\n" - << "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n" - << "\t}\n"; - + << "\t\treal_t tempX = vOut.x + sumX;\n" + << "\t\treal_t tempY = vOut.y + sumY;\n" + << "\n" + << "\t\toutPoint->m_ColorX = fmod(fabs((real_t)(0.5) * (" << ldcs << " * ((" << cosa << " * tempX + " << sina << " * tempY + " << offset << ")) + (real_t)(1.0))), (real_t)(1.0));\n" + << "\t}\n"; return ss.str(); } @@ -794,7 +771,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_Offset, prefix + "dc_linear_offset"));//Params. m_Params.push_back(ParamWithName(&m_Angle, prefix + "dc_linear_angle")); @@ -837,19 +813,16 @@ public: yx = m_Xform->m_Affine.C() * -1, yy = m_Xform->m_Affine.D() * -1, // Y ox = m_Xform->m_Affine.E(), oy = m_Xform->m_Affine.F(), // O px = helper.In.x - ox, py = helper.In.y - oy; // P - // calculate dot products const T dot00 = xx * xx + xy * xy; // X * X const T dot01 = xx * yx + xy * yy; // X * Y const T dot02 = xx * px + xy * py; // X * P const T dot11 = yx * yx + yy * yy; // Y * Y const T dot12 = yx * px + yy * py; // Y * P - // calculate barycentric coordinates const T denom = (dot00 * dot11 - dot01 * dot01); const T num_u = (dot11 * dot02 - dot01 * dot12); const T num_v = (dot00 * dot12 - dot01 * dot02); - // u, v must not be constant T u = num_u / denom; T v = num_v / denom; @@ -890,7 +863,6 @@ public: { u = (u + rand.Frand01() * m_A * f); v = (v + rand.Frand01() * m_A * f); - ClampRef(u, -1, 1); ClampRef(v, -1, 1); @@ -925,7 +897,6 @@ public: string scatterArea = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params. string zeroEdges = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string a = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc. - ss << "\t{\n" << "\t\tconst real_t\n" << "\t\txx = xform->m_A, xy = xform->m_B,\n" @@ -1003,7 +974,6 @@ public: << "\t\tvOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n" << "\t\toutPoint->m_ColorX = fmod(fabs(u + v), (real_t)(1.0));\n" << "\t}\n"; - return ss.str(); } @@ -1016,7 +986,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_ScatterArea, prefix + "dc_triangle_scatter_area", 0, REAL, -1, 1));//Params. m_Params.push_back(ParamWithName(&m_ZeroEdges, prefix + "dc_triangle_zero_edges", 0, INTEGER, 0, 1)); @@ -1075,7 +1044,6 @@ public: string x0_ = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string x1_ = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string x1_m_x0 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; - ss << "\t{\n" << "\t\treal_t zf = " << factor << " * (outPoint->m_ColorX - " << x0_ << ") / " << x1_m_x0 << ";\n" << "\n" @@ -1090,7 +1058,6 @@ public: << "\t\telse\n" << "\t\t vOut.z = xform->m_VariationWeights[" << varIndex << "] * zf;\n" << "\t}\n"; - return ss.str(); } @@ -1105,7 +1072,6 @@ protected: void Init() { string prefix = Prefix(); - m_Params.clear(); m_Params.push_back(ParamWithName(&m_X0, prefix + "dc_ztransl_x0", 0, REAL, 0, 1));//Params. m_Params.push_back(ParamWithName(&m_X1, prefix + "dc_ztransl_x1", 1, REAL, 0, 1)); @@ -1128,6 +1094,363 @@ private: T m_X1_m_x0; }; +#define SHAPE_SQUARE 0 +#define SHAPE_DISC 1 +#define SHAPE_BLUR 2 + +#define MAP_FLAT 0 +#define MAP_SPHERICAL 1 +#define MAP_HSPHERE 2 +#define MAP_QSPHERE 3 +#define MAP_BUBBLE 4 +#define MAP_BUBBLE2 5 + +/// +/// dc_perlin. +/// +template +class EMBER_API DCPerlinVariation : public ParametricVariation +{ +public: + DCPerlinVariation(T weight = 1.0) : ParametricVariation("dc_perlin", VAR_DC_PERLIN, weight) + { + Init(); + } + + PARVARCOPY(DCPerlinVariation) + + virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override + { + v3T v; + T vx, vy, col, r, theta, s, c, p, e; + int t = 0, iShape = int(m_Shape), iMap = int(m_Map), iOctaves = int(m_Octaves), iBailout = int(m_SelectBailout); + + do + { + // Default edge value + e = 0; + + // Assign vx, vy according to shape + switch (iShape) + { + case SHAPE_SQUARE: + vx = (1 + m_Edge) * (rand.Frand01() - T(0.5)); + vy = (1 + m_Edge) * (rand.Frand01() - T(0.5)); + r = SQR(vx) > SQR(vy) ? std::sqrt(SQR(vx)) : std::sqrt(SQR(vy)); + + if (r > 1 - m_Edge) + e = T(0.5) * (r - 1 + m_Edge) / m_Edge; + + break; + + case SHAPE_DISC: + r = rand.Frand01() + rand.Frand01(); + r = (r > 1) ? 2 - r : r; + r *= (1 + m_Edge); + + if (r > 1 - m_Edge) + e = T(0.5) * (r - 1 + m_Edge) / m_Edge; + + theta = rand.Frand01() * M_2PI; + sincos(theta, &s, &c); + vx = T(0.5) * r * s; + vy = T(0.5) * r * c; + break; + + case SHAPE_BLUR: + default: + r = (1 + m_Edge) * rand.Frand01(); + + if (r > 1 - m_Edge) + e = T(0.5) * (r - 1 + m_Edge) / m_Edge; + + theta = rand.Frand01() * M_2PI; + sincos(theta, &s, &c); + vx = T(0.5) * r * s; + vy = T(0.5) * r * c; + break; + } + + // Assign V for noise vector position according to map + switch (iMap) + { + case MAP_FLAT: + v.x = m_Scale * vx; + v.y = m_Scale * vy; + v.z = m_Scale * m_Z; + break; + + case MAP_SPHERICAL: + r = 1 / Zeps(SQR(vx) + SQR(vy)); + v.x = m_Scale * vx * r; + v.y = m_Scale * vy * r; + v.z = m_Scale * m_Z; + break; + + case MAP_HSPHERE: + r = 1 / (SQR(vx) + SQR(vy) + T(0.5)); + v.x = m_Scale * vx * r; + v.y = m_Scale * vy * r; + v.z = m_Scale * m_Z; + break; + + case MAP_QSPHERE: + r = 1 / (SQR(vx) + SQR(vy) + T(0.25)); + v.x = m_Scale * vx * r; + v.y = m_Scale * vy * r; + v.z = m_Scale * m_Z; + break; + + case MAP_BUBBLE: + r = T(0.25) - (SQR(vx) + SQR(vy)); + + if (r < 0) + r = std::sqrt(-r); + else + r = std::sqrt(r); + + v.x = m_Scale * vx; + v.y = m_Scale * vy; + v.z = m_Scale * (r + m_Z); + break; + + case MAP_BUBBLE2: + default: + r = T(0.25) - (SQR(vx) + SQR(vy)); + + if (r < 0) + r = std::sqrt(-r); + else + r = std::sqrt(r); + + v.x = m_Scale * vx; + v.y = m_Scale * vy; + v.z = m_Scale * (2 * r + m_Z); + break; + } + + p = m_VarFuncs->PerlinNoise3D(v, m_Amps, m_Freqs, iOctaves); + + // Add edge effects + if (p > 0) + e = p * (1 + e * e * 20) + 2 * e; + else + e = p * (1 + e * e * 20) - 2 * e; + } + while ((e < m_NotchBottom || e > m_NotchTop) && t++ < iBailout); + + // Add blur effect to transform + helper.Out.x = m_Weight * vx; + helper.Out.y = m_Weight * vy; + helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z; + col = m_Centre + m_Range * p; + outPoint.m_ColorX = col - Floor(col); + } + + virtual vector OpenCLGlobalFuncNames() const override + { + return vector { "Zeps", "SimplexNoise3D", "PerlinNoise3D" }; + } + + virtual vector OpenCLGlobalDataNames() const override + { + return vector { "NOISE_INDEX", "NOISE_POINTS" }; + } + + virtual string OpenCLString() const override + { + ostringstream ss, ss2; + intmax_t i = 0, varIndex = IndexInXform(); + ss2 << "_" << XformIndexInEmber(); + string index = ss2.str() + "]"; + string shape = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string map = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string selectCentre = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string selectRange = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string centre = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string range = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string edge = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string scale = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string octaves = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string amps = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string freqs = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string z = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string selectBailout = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string notchBottom = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + string notchTop = "parVars[" + ToUpper(m_Params[i++].Name()) + index; + ss << "\t{\n" + << "\t\treal3 v;\n" + << "\t\treal_t vx, vy, col, r, theta, s, c, p, e;\n" + << "\t\tint t = 0, iShape = (int)" << shape << ", iMap = (int)" << map << ", iOctaves = (int)" << octaves << ", iBailout = (int)" << selectBailout << ";\n" + << "\n" + << "\t\tdo\n" + << "\t\t{\n" + << "\t\t e = 0;\n" + << "\n" + << "\t\t switch (iShape)\n" + << "\t\t {\n" + << "\t\t case " << SHAPE_SQUARE << ": \n" + << "\t\t vx = (1 + " << edge << ") * (MwcNext01(mwc) - 0.5); \n" + << "\t\t vy = (1 + " << edge << ") * (MwcNext01(mwc) - 0.5); \n" + << "\t\t r = SQR(vx) > SQR(vy) ? sqrt(SQR(vx)) : sqrt(SQR(vy)); \n" + << "\n" + << "\t\t if (r > 1 - " << edge << ")\n" + << "\t\t e = 0.5 * (r - 1 + " << edge << ") / " << edge << "; \n" + << "\n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << SHAPE_DISC << ": \n" + << "\t\t r = MwcNext01(mwc) + MwcNext01(mwc); \n" + << "\t\t r = (r > 1) ? 2 - r : r; \n" + << "\t\t r *= (1 + " << edge << "); \n" + << "\n" + << "\t\t if (r > 1 - " << edge << ")\n" + << "\t\t e = 0.5 * (r - 1 + " << edge << ") / " << edge << "; \n" + << "\n" + << "\t\t theta = MwcNext01(mwc) * M_2PI; \n" + << "\t\t s = sincos(theta, &c); \n" + << "\t\t vx = 0.5 * r * s; \n" + << "\t\t vy = 0.5 * r * c; \n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << SHAPE_BLUR << ": \n" + << "\t\t r = (1 + " << edge << ") * MwcNext01(mwc); \n" + << "\n" + << "\t\t if (r > 1 - " << edge << ")\n" + << "\t\t e = 0.5 * (r - 1 + " << edge << ") / " << edge << "; \n" + << "\n" + << "\t\t theta = MwcNext01(mwc) * M_2PI; \n" + << "\t\t s = sincos(theta, &c); \n" + << "\t\t vx = 0.5 * r * s; \n" + << "\t\t vy = 0.5 * r * c; \n" + << "\t\t break; \n" + << "\t\t }\n" + << "\n" + << "\t\t switch (iMap)\n" + << "\t\t {\n" + << "\t\t case " << MAP_FLAT << ": \n" + << "\t\t v.x = " << scale << " * vx; \n" + << "\t\t v.y = " << scale << " * vy; \n" + << "\t\t v.z = " << scale << " * " << z << "; \n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << MAP_SPHERICAL << ": \n" + << "\t\t r = 1 / Zeps(SQR(vx) + SQR(vy)); \n" + << "\t\t v.x = " << scale << " * vx * r; \n" + << "\t\t v.y = " << scale << " * vy * r; \n" + << "\t\t v.z = " << scale << " * " << z << "; \n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << MAP_HSPHERE << ": \n" + << "\t\t r = 1 / (SQR(vx) + SQR(vy) + 0.5); \n" + << "\t\t v.x = " << scale << " * vx * r; \n" + << "\t\t v.y = " << scale << " * vy * r; \n" + << "\t\t v.z = " << scale << " * " << z << "; \n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << MAP_QSPHERE << ": \n" + << "\t\t r = 1 / (SQR(vx) + SQR(vy) + 0.25); \n" + << "\t\t v.x = " << scale << " * vx * r; \n" + << "\t\t v.y = " << scale << " * vy * r; \n" + << "\t\t v.z = " << scale << " * " << z << "; \n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << MAP_BUBBLE << ": \n" + << "\t\t r = 0.25 - (SQR(vx) + SQR(vy)); \n" + << "\n" + << "\t\t if (r < 0)\n" + << "\t\t r = sqrt(-r); \n" + << "\t\t else\n" + << "\t\t r = sqrt(r); \n" + << "\n" + << "\t\t v.x = " << scale << " * vx; \n" + << "\t\t v.y = " << scale << " * vy; \n" + << "\t\t v.z = " << scale << " * (r + " << z << "); \n" + << "\t\t break; \n" + << "\n" + << "\t\t case " << MAP_BUBBLE2 << ": \n" + << "\t\t r = 0.25 - (SQR(vx) + SQR(vy)); \n" + << "\n" + << "\t\t if (r < 0)\n" + << "\t\t r = sqrt(-r); \n" + << "\t\t else\n" + << "\t\t r = sqrt(r); \n" + << "\n" + << "\t\t v.x = " << scale << " * vx; \n" + << "\t\t v.y = " << scale << " * vy; \n" + << "\t\t v.z = " << scale << " * (2 * r + " << z << "); \n" + << "\t\t break; \n" + << "\t\t }\n" + << "\n" + << "\t\t p = PerlinNoise3D(&v, globalShared + NOISE_INDEX, (__global real3*)(globalShared + NOISE_POINTS), " << amps << ", " << freqs << ", iOctaves); \n" + << "\n" + << "\t\t if (p > 0)\n" + << "\t\t e = p * (1 + e * e * 20) + 2 * e; \n" + << "\t\t else\n" + << "\t\t e = p * (1 + e * e * 20) - 2 * e; \n" + << "}\n" + << "\t\twhile ((e < " << notchBottom << " || e > " << notchTop << ") && t++ < iBailout); \n" + << "\n" + << "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * vx; \n" + << "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vy; \n" + << "\t\tvOut.z = " << ((m_VarType == VARTYPE_REG) ? "0" : "vIn.z") << ";\n" + << "\t\tcol = " << centre << " + " << range << " * p; \n" + << "\t\toutPoint->m_ColorX = col - floor(col); \n" + << "\t}\n"; + return ss.str(); + } + + virtual void Precalc() override + { + m_NotchBottom = m_SelectCentre - m_SelectRange; + m_NotchBottom = (m_NotchBottom > T(0.75)) ? T(0.75) : m_NotchBottom; + m_NotchBottom = (m_NotchBottom < -2) ? -3 : m_NotchBottom; + m_NotchTop = m_SelectCentre + m_SelectRange; + m_NotchTop = (m_NotchTop < T(-0.75)) ? T(-0.75) : m_NotchTop; + m_NotchTop = (m_NotchTop > 3) ? 3 : m_NotchTop; + } +protected: + void Init() + { + string prefix = Prefix(); + m_VarFuncs = VarFuncs::Instance(); + m_Params.clear(); + m_Params.reserve(15); + m_Params.push_back(ParamWithName(&m_Shape, prefix + "dc_perlin_shape", 0, INTEGER, 0, 2));//Params. + m_Params.push_back(ParamWithName(&m_Map, prefix + "dc_perlin_map", 0, INTEGER, 0, 5)); + m_Params.push_back(ParamWithName(&m_SelectCentre, prefix + "dc_perlin_select_centre", 0, REAL, -1, 1)); + m_Params.push_back(ParamWithName(&m_SelectRange, prefix + "dc_perlin_select_range", 1, REAL, T(0.1), 2)); + m_Params.push_back(ParamWithName(&m_Centre, prefix + "dc_perlin_centre", T(0.25))); + m_Params.push_back(ParamWithName(&m_Range, prefix + "dc_perlin_range", T(0.25))); + m_Params.push_back(ParamWithName(&m_Edge, prefix + "dc_perlin_edge")); + m_Params.push_back(ParamWithName(&m_Scale, prefix + "dc_perlin_scale", 1)); + m_Params.push_back(ParamWithName(&m_Octaves, prefix + "dc_perlin_octaves", 2, INTEGER, 1, 5)); + m_Params.push_back(ParamWithName(&m_Amps, prefix + "dc_perlin_amps", 2)); + m_Params.push_back(ParamWithName(&m_Freqs, prefix + "dc_perlin_freqs", 2)); + m_Params.push_back(ParamWithName(&m_Z, prefix + "dc_perlin_z")); + m_Params.push_back(ParamWithName(&m_SelectBailout, prefix + "dc_perlin_select_bailout", 10, INTEGER, 2, 1000)); + m_Params.push_back(ParamWithName(true, &m_NotchBottom, prefix + "dc_perlin_notch_bottom")); + m_Params.push_back(ParamWithName(true, &m_NotchTop, prefix + "dc_perlin_notch_top")); + } +private: + T m_Shape;//Params. + T m_Map; + T m_SelectCentre; + T m_SelectRange; + T m_Centre; + T m_Range; + T m_Edge; + T m_Scale; + T m_Octaves; + T m_Amps; + T m_Freqs; + T m_Z; + T m_SelectBailout; + T m_NotchBottom;//Precalc. + T m_NotchTop; + shared_ptr> m_VarFuncs; +}; + MAKEPREPOSTPARVAR(DCBubble, dc_bubble, DC_BUBBLE) MAKEPREPOSTPARVAR(DCCarpet, dc_carpet, DC_CARPET) MAKEPREPOSTPARVARASSIGN(DCCube, dc_cube, DC_CUBE, ASSIGNTYPE_SUM) @@ -1136,4 +1459,5 @@ MAKEPREPOSTVAR(DCGridOut, dc_gridout, DC_GRIDOUT) MAKEPREPOSTPARVAR(DCLinear, dc_linear, DC_LINEAR) MAKEPREPOSTPARVAR(DCTriangle, dc_triangle, DC_TRIANGLE) MAKEPREPOSTPARVAR(DCZTransl, dc_ztransl, DC_ZTRANSL) +MAKEPREPOSTPARVAR(DCPerlin, dc_perlin, DC_PERLIN) } diff --git a/Source/Ember/Xform.h b/Source/Ember/Xform.h index 2d1cc7d..e063040 100644 --- a/Source/Ember/Xform.h +++ b/Source/Ember/Xform.h @@ -72,19 +72,16 @@ public: { Init(); - m_Weight = weight; m_ColorX = colorX; m_ColorSpeed = colorSpeed; m_Opacity = opacity; - m_Affine.A(a); m_Affine.B(b); m_Affine.C(c); m_Affine.D(d); m_Affine.E(e); m_Affine.F(f); - m_Post.A(pa); m_Post.B(pb); m_Post.C(pc); @@ -93,7 +90,6 @@ public: m_Post.F(pf); m_HasPost = !m_Post.IsID(); m_HasPreOrRegularVars = PreVariationCount() > 0 || VariationCount() > 0; - CacheColorVals();//Init already called this, but must call again since color was assigned above. } @@ -166,7 +162,6 @@ public: m_MotionFreq = xform.m_MotionFreq; m_MotionFunc = xform.m_MotionFunc; m_MotionOffset = xform.m_MotionOffset; - ClearAndDeleteVariations(); //Must manually add them via the AddVariation() function so that @@ -192,15 +187,14 @@ public: CopyVec(m_Xaos, xform.XaosVec()); CopyVec(m_Motion, xform.m_Motion); m_Name = xform.m_Name; - return *this; } /// /// Init default values. - /// Non default values are used to signify an uninitialized state. This is useful for + /// Non default values are used to signify an uninitialized state. This is useful for /// doing motion interpolation where we don't want to apply motion to all fields. By setting - /// unreasonable values before parsing, then only assigning the ones the motion tags specified, + /// unreasonable values before parsing, then only assigning the ones the motion tags specified, /// it is clear which fields are intended to have motion applied to them. /// /// Use reasonable default if true, else use out of bounds values. @@ -217,21 +211,18 @@ public: m_ColorY = 0; m_DirectColor = 1; m_Opacity = 1; - m_Affine.A(1); m_Affine.B(0); m_Affine.C(0); m_Affine.D(0); m_Affine.E(1); m_Affine.F(0); - m_Post.A(1); m_Post.B(0); m_Post.C(0); m_Post.D(0); m_Post.E(1); m_Post.F(0); - m_Wind[0] = 0; m_Wind[1] = 0; m_MotionFreq = 0; @@ -246,21 +237,18 @@ public: m_ColorY = EMPTYFIELD; m_DirectColor = EMPTYFIELD; m_Opacity = EMPTYFIELD; - m_Affine.A(EMPTYFIELD); m_Affine.B(EMPTYFIELD); m_Affine.C(EMPTYFIELD); m_Affine.D(EMPTYFIELD); m_Affine.E(EMPTYFIELD); m_Affine.F(EMPTYFIELD); - m_Post.A(EMPTYFIELD); m_Post.B(EMPTYFIELD); m_Post.C(EMPTYFIELD); m_Post.D(EMPTYFIELD); m_Post.E(EMPTYFIELD); m_Post.F(EMPTYFIELD); - m_Wind[0] = EMPTYFIELD; m_Wind[1] = EMPTYFIELD; m_MotionFreq = EMPTYFIELD; @@ -269,7 +257,6 @@ public: m_MotionFunc = MOTION_SIN; m_Motion.clear(); - m_NeedPrecalcSumSquares = false; m_NeedPrecalcSqrtSumSquares = false; m_NeedPrecalcAngles = false; @@ -340,8 +327,7 @@ public: { size_t count = 0; Variation* var = nullptr; - - const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (size_t i = 0; i < variations.size(); i++, count++) { @@ -353,7 +339,6 @@ public: } } }); - return var; } @@ -365,8 +350,7 @@ public: Variation* GetVariationById(eVariationId id) const { Variation* var = nullptr; - - const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (auto v : variations) { @@ -378,7 +362,6 @@ public: } } }); - return var; } @@ -390,8 +373,7 @@ public: Variation* GetVariationByName(const string& name) const { Variation* var = nullptr; - - const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (auto v : variations) { @@ -403,7 +385,6 @@ public: } } }); - return var; } @@ -416,8 +397,7 @@ public: intmax_t GetVariationIndex(Variation* var) const { intmax_t count = 0, index = -1; - - const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (size_t i = 0; i < variations.size(); i++, count++) { @@ -429,7 +409,6 @@ public: } } }); - return index; } @@ -442,8 +421,7 @@ public: bool DeleteVariationById(eVariationId id) { bool found = false; - - AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (size_t i = 0; i < variations.size(); i++) { @@ -475,7 +453,7 @@ public: /// void ClearAndDeleteVariations() { - AllVarsFunc([&] (vector*>& variations, bool& keepGoing) { ClearVec>(variations); }); + AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { ClearVec>(variations); }); SetPrecalcFlags(); } @@ -511,7 +489,6 @@ public: //Figure out which is right. //TODO. //m_ColorSpeedCache = m_ColorX * (1 - m_ColorSpeed) / 2;//Apo style. //m_OneMinusColorCache = (1 + m_ColorSpeed) / 2; - m_ColorSpeedCache = m_ColorSpeed * m_ColorX;//Flam3 style. m_OneMinusColorCache = T(1.0) - m_ColorSpeed; m_VizAdjusted = AdjustOpacityPercentage(m_Opacity); @@ -592,11 +569,12 @@ public: /// void NormalizeVariationWeights() { - AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { T norm = 0; for (auto var : variations) norm += var->m_Weight; + for (auto var : variations) var->m_Weight /= norm; }); } @@ -613,11 +591,9 @@ public: bool Apply(Point* inPoint, Point* outPoint, QTIsaac& rand) { size_t i; - //This must be local, rather than a member, because this function can be called //from multiple threads. If it were a member, they'd be clobbering each others' values. IteratorHelper iterHelper; - //Calculate the color coordinate/index in the palette to look up later when accumulating the output point //to the histogram. Calculate this value by interpolating between the index value of the //last iteration with the one specified in this xform. Note that some cached values are used @@ -653,7 +629,6 @@ public: iterHelper.In.x = iterHelper.m_TransX;//Only need to read once with regular variations, because transX/Y are fixed. iterHelper.In.y = iterHelper.m_TransY; iterHelper.In.z = iterHelper.m_TransZ; - //Since these get summed, initialize them to zero. outPoint->m_X = outPoint->m_Y = outPoint->m_Z = 0; @@ -682,7 +657,6 @@ public: { //There are no variations, so the affine transformed points can be assigned directly to the output points. T inX = inPoint->m_X; - outPoint->m_X = (m_Affine.A() * inX) + (m_Affine.B() * inPoint->m_Y) + m_Affine.C(); outPoint->m_Y = (m_Affine.D() * inX) + (m_Affine.E() * inPoint->m_Y) + m_Affine.F(); outPoint->m_Z = inPoint->m_Z; @@ -703,13 +677,11 @@ public: if (m_HasPost) { T postX = outPoint->m_X; - outPoint->m_X = (m_Post.A() * postX) + (m_Post.B() * outPoint->m_Y) + m_Post.C(); outPoint->m_Y = (m_Post.D() * postX) + (m_Post.E() * outPoint->m_Y) + m_Post.F(); } - outPoint->m_ColorX = outPoint->m_ColorX + m_DirectColor * (iterHelper.m_Color.x - outPoint->m_ColorX); - + outPoint->m_ColorX = iterHelper.m_Color.x + m_DirectColor * (outPoint->m_ColorX - iterHelper.m_Color.x); //Has the trajectory of x or y gone either to infinity, or too close to zero? return BadVal(outPoint->m_X) || BadVal(outPoint->m_Y)/* || BadVal(outPoint->m_Z)*/; } @@ -737,7 +709,6 @@ public: T freq = currentMot.m_MotionFreq; eMotion func = currentMot.m_MotionFunc; T offset = currentMot.m_MotionOffset; - //Clamp these to the appropriate range after all are applied. APPMOT(m_Weight); APPMOT(m_ColorX); @@ -751,7 +722,6 @@ public: { Variation* motVar = currentMot.GetVariation(j);//Get the variation, which may or may not be present in this xform. ParametricVariation* motParVar = dynamic_cast*>(motVar); - Variation* var = GetVariationById(motVar->VariationId());//See if the variation in the motion xform was present in the xform. if (!var)//It wasn't present, so add it and set the weight. @@ -861,7 +831,7 @@ public: m_NeedPrecalcAtanYX = true; } - AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (auto var : variations) { @@ -912,13 +882,13 @@ public: if (GetVariationById(VAR_FLATTEN) == nullptr) { - AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (auto var : variations) { if (var->m_Weight != 0)//This should never happen, but just to be safe. { - if (FindIf(names, [&] (const string& s) -> bool { return !_stricmp(s.c_str(), var->Name().c_str()); }))//If any variation is present, don't flatten. + if (FindIf(names, [&] (const string & s) -> bool { return !_stricmp(s.c_str(), var->Name().c_str()); })) //If any variation is present, don't flatten. { shouldFlatten = false; keepGoing = false; @@ -973,20 +943,21 @@ public: switch (varType) { - case VARTYPE_REG: - case VARTYPE_PRE: - s = - "\tvIn.x = transX;\n" - "\tvIn.y = transY;\n" - "\tvIn.z = transZ;\n"; - break; - case VARTYPE_POST: - default: - s = - "\tvIn.x = outPoint->m_X;\n" - "\tvIn.y = outPoint->m_Y;\n" - "\tvIn.z = outPoint->m_Z;\n"; - break; + case VARTYPE_REG: + case VARTYPE_PRE: + s = + "\tvIn.x = transX;\n" + "\tvIn.y = transY;\n" + "\tvIn.z = transZ;\n"; + break; + + case VARTYPE_POST: + default: + s = + "\tvIn.x = outPoint->m_X;\n" + "\tvIn.y = outPoint->m_Y;\n" + "\tvIn.z = outPoint->m_Z;\n"; + break; } return s; @@ -1008,6 +979,7 @@ public: helper.m_TransZ = helper.Out.z; break; } + case ASSIGNTYPE_SUM: default: { @@ -1035,6 +1007,7 @@ public: outPoint.m_Z = helper.Out.z; break; } + case ASSIGNTYPE_SUM: default: { @@ -1061,11 +1034,12 @@ public: case VARTYPE_REG: { s = - "\toutPoint->m_X += vOut.x;\n" - "\toutPoint->m_Y += vOut.y;\n" - "\toutPoint->m_Z += vOut.z;\n"; + "\toutPoint->m_X += vOut.x;\n" + "\toutPoint->m_Y += vOut.y;\n" + "\toutPoint->m_Z += vOut.z;\n"; break; } + case VARTYPE_PRE: { switch (assignType) @@ -1073,24 +1047,26 @@ public: case ASSIGNTYPE_SET: { s = - "\ttransX = vOut.x;\n" - "\ttransY = vOut.y;\n" - "\ttransZ = vOut.z;\n"; + "\ttransX = vOut.x;\n" + "\ttransY = vOut.y;\n" + "\ttransZ = vOut.z;\n"; break; } + case ASSIGNTYPE_SUM: default: { s = - "\ttransX += vOut.x;\n" - "\ttransY += vOut.y;\n" - "\ttransZ += vOut.z;\n"; + "\ttransX += vOut.x;\n" + "\ttransY += vOut.y;\n" + "\ttransZ += vOut.z;\n"; break; } } break; } + case VARTYPE_POST: default: { @@ -1099,18 +1075,19 @@ public: case ASSIGNTYPE_SET: { s = - "\toutPoint->m_X = vOut.x;\n" - "\toutPoint->m_Y = vOut.y;\n" - "\toutPoint->m_Z = vOut.z;\n"; + "\toutPoint->m_X = vOut.x;\n" + "\toutPoint->m_Y = vOut.y;\n" + "\toutPoint->m_Z = vOut.z;\n"; break; } + case ASSIGNTYPE_SUM: default: { s = - "\toutPoint->m_X += vOut.x;\n" - "\toutPoint->m_Y += vOut.y;\n" - "\toutPoint->m_Z += vOut.z;\n"; + "\toutPoint->m_X += vOut.x;\n" + "\toutPoint->m_Y += vOut.y;\n" + "\toutPoint->m_Z += vOut.z;\n"; break; } } @@ -1131,7 +1108,6 @@ public: string ToString() const { ostringstream ss; - ss << "A: " << m_Affine.A() << " " << "B: " << m_Affine.B() << " " << "C: " << m_Affine.C() << " " @@ -1161,8 +1137,7 @@ public: ss << "Motion Frequency: " << m_MotionFreq << endl; ss << "Motion Func: " << m_MotionFunc << endl; ss << "Motion Offset: " << m_MotionOffset << endl; - - const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool& keepGoing) + const_cast*>(this)->AllVarsFunc([&] (vector*>& variations, bool & keepGoing) { for (auto var : variations) ss << var->ToString() << endl; @@ -1252,7 +1227,6 @@ private: void AllVarsFunc(std::function*>&, bool&)> func) { bool keepGoing = true; - func(m_PreVariations, keepGoing); if (keepGoing) diff --git a/Source/EmberAnimate/EmberAnimate.cpp b/Source/EmberAnimate/EmberAnimate.cpp index 49fe753..dfaaba1 100644 --- a/Source/EmberAnimate/EmberAnimate.cpp +++ b/Source/EmberAnimate/EmberAnimate.cpp @@ -11,8 +11,7 @@ template bool EmberAnimate(EmberOptions& opt) { - OpenCLInfo& info(OpenCLInfo::Instance()); - + auto info = OpenCLInfo::Instance(); std::cout.imbue(std::locale("")); if (opt.DumpArgs()) @@ -21,7 +20,7 @@ bool EmberAnimate(EmberOptions& opt) if (opt.OpenCLInfo()) { cout << "\nOpenCL Info: " << endl; - cout << info.DumpInfo(); + cout << info->DumpInfo(); return true; } @@ -69,8 +68,8 @@ bool EmberAnimate(EmberOptions& opt) { for (auto& device : devices) { - cout << "Platform: " << info.PlatformName(device.first) << endl; - cout << "Device: " << info.DeviceName(device.first, device.second) << endl; + cout << "Platform: " << info->PlatformName(device.first) << endl; + cout << "Device: " << info->DeviceName(device.first, device.second) << endl; } } @@ -135,9 +134,9 @@ bool EmberAnimate(EmberOptions& opt) } if (opt.Format() != "jpg" && - opt.Format() != "png" && - opt.Format() != "ppm" && - opt.Format() != "bmp") + opt.Format() != "png" && + opt.Format() != "ppm" && + opt.Format() != "bmp") { cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg." << endl; } @@ -235,10 +234,9 @@ bool EmberAnimate(EmberOptions& opt) embers[i].m_FinalRasW = size_t(T(embers[i].m_FinalRasW) * opt.SizeScale()); embers[i].m_FinalRasH = size_t(T(embers[i].m_FinalRasH) * opt.SizeScale()); embers[i].m_PixelsPerUnit *= T(opt.SizeScale()); - //Cast to double in case the value exceeds 2^32. double imageMem = double(channels) * double(embers[i].m_FinalRasW) - * double(embers[i].m_FinalRasH) * double(renderers[0]->BytesPerChannel()); + * double(embers[i].m_FinalRasH) * double(renderers[0]->BytesPerChannel()); double maxMem = pow(2.0, double((sizeof(void*) * 8) - 1)); if (imageMem > maxMem)//Ensure the max amount of memory for a process isn't exceeded. @@ -256,11 +254,10 @@ bool EmberAnimate(EmberOptions& opt) } if ((embers[i].m_FinalRasW != embers[0].m_FinalRasW) || - (embers[i].m_FinalRasH != embers[0].m_FinalRasH)) + (embers[i].m_FinalRasH != embers[0].m_FinalRasH)) { cout << "Warning: flame " << i << " at time " << embers[i].m_Time << " size mismatch. (" << embers[i].m_FinalRasW << ", " << embers[i].m_FinalRasH << - ") should be (" << embers[0].m_FinalRasW << ", " << embers[0].m_FinalRasH << "). Setting to " << embers[0].m_FinalRasW << ", " << embers[0].m_FinalRasH << "." << endl; - + ") should be (" << embers[0].m_FinalRasW << ", " << embers[0].m_FinalRasH << "). Setting to " << embers[0].m_FinalRasW << ", " << embers[0].m_FinalRasH << "." << endl; embers[i].m_FinalRasW = embers[0].m_FinalRasW; embers[i].m_FinalRasH = embers[0].m_FinalRasH; } @@ -279,7 +276,7 @@ bool EmberAnimate(EmberOptions& opt) if (opt.LastFrame() == UINT_MAX) opt.LastFrame(ClampGte(size_t(embers.back().m_Time),//Make sure time - 1 is positive before converting to size_t. - opt.FirstFrame() + opt.Dtime()));//Make sure the final value is at least first frame + dtime. + opt.FirstFrame() + opt.Dtime()));//Make sure the final value is at least first frame + dtime. } if (!opt.Out().empty()) @@ -306,11 +303,11 @@ bool EmberAnimate(EmberOptions& opt) } std::function&, string, EmberImageComments, size_t, size_t, size_t)> saveFunc = [&](vector& finalImage, - string filename,//These are copies because this will be launched in a thread. - EmberImageComments comments, - size_t w, - size_t h, - size_t chan) + string filename,//These are copies because this will be launched in a thread. + EmberImageComments comments, + size_t w, + size_t h, + size_t chan) { bool writeSuccess = false; byte* finalImagep = finalImage.data(); @@ -330,9 +327,7 @@ bool EmberAnimate(EmberOptions& opt) if (!writeSuccess) cout << "Error writing " << filename << endl; }; - atomfTime.store(opt.FirstFrame()); - std::function iterFunc = [&](size_t index) { size_t ftime, finalImageIndex = 0; @@ -344,7 +339,6 @@ bool EmberAnimate(EmberOptions& opt) Ember centerEmber; vector finalImages[2]; std::thread writeThread; - os.imbue(std::locale("")); while (atomfTime.fetch_add(opt.Dtime()), ((ftime = atomfTime.load()) <= opt.LastFrame())) @@ -398,7 +392,9 @@ bool EmberAnimate(EmberOptions& opt) { verboseCs.Enter(); cout << "\nIters ran/requested: " + os.str() << endl; + if (!opt.EmberCL()) cout << "Bad values: " << stats.m_Badvals << endl; + cout << "Render time: " << t.Format(stats.m_RenderMs) << endl; cout << "Pure iter time: " << t.Format(stats.m_IterMs) << endl; cout << "Iters/sec: " << size_t(stats.m_Iters / (stats.m_IterMs / 1000.0)) << endl; @@ -425,7 +421,6 @@ bool EmberAnimate(EmberOptions& opt) if (writeThread.joinable())//One final check to make sure all writing is done before exiting this thread. writeThread.join(); }; - threadVec.reserve(renderers.size()); for (size_t r = 0; r < renderers.size(); r++) @@ -441,7 +436,6 @@ bool EmberAnimate(EmberOptions& opt) th.join(); t.Toc("\nFinished in: ", true); - return true; } @@ -455,7 +449,6 @@ int _tmain(int argc, _TCHAR* argv[]) { bool b = false; EmberOptions opt; - //Required for large allocs, else GPU memory usage will be severely limited to small sizes. //This must be done in the application and not in the EmberCL DLL. #ifdef WIN32 @@ -466,23 +459,23 @@ int _tmain(int argc, _TCHAR* argv[]) if (!opt.Populate(argc, argv, OPT_USE_ANIMATE)) { - #ifdef DO_DOUBLE + if (opt.Bits() == 64) { b = EmberAnimate(opt); } else #endif - if (opt.Bits() == 33) - { - b = EmberAnimate(opt); - } - else if (opt.Bits() == 32) - { - cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; - b = EmberAnimate(opt); - } + if (opt.Bits() == 33) + { + b = EmberAnimate(opt); + } + else if (opt.Bits() == 32) + { + cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; + b = EmberAnimate(opt); + } } return b ? 0 : 1; diff --git a/Source/EmberCL/EmberCLPch.h b/Source/EmberCL/EmberCLPch.h index 26d0506..f1d6b4f 100644 --- a/Source/EmberCL/EmberCLPch.h +++ b/Source/EmberCL/EmberCLPch.h @@ -16,6 +16,7 @@ #if defined(_WIN32) #include #include + #include "GL/gl.h" #elif defined(__APPLE__) #include #else @@ -23,21 +24,7 @@ #endif #include - -#ifdef NVIDIA - #ifdef CL_VERSION_1_2 - #undef CL_VERSION_1_2 - #endif - - #if !defined(WIN32) && !defined(_WIN32) - #ifndef CL_VERSION_1_1 - #define CL_VERSION_1_1 - #endif - #endif -#endif - #include - #include #include #include diff --git a/Source/EmberCL/EmberCLStructs.h b/Source/EmberCL/EmberCLStructs.h index 6b3a98a..7d31659 100644 --- a/Source/EmberCL/EmberCLStructs.h +++ b/Source/EmberCL/EmberCLStructs.h @@ -23,100 +23,101 @@ static string ConstantDefinesString(bool doublePrecision) if (doublePrecision) { os << "#if defined(cl_amd_fp64)\n"//AMD extension available? - " #pragma OPENCL EXTENSION cl_amd_fp64 : enable\n" - "#endif\n" - "#if defined(cl_khr_fp64)\n"//Khronos extension available? - " #pragma OPENCL EXTENSION cl_khr_fp64 : enable\n" - "#endif\n" - "#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable\n"//Only supported on nVidia. - "typedef long intPrec;\n" - "typedef uint atomi;\n"//Same size as real_bucket_t, always 4 bytes. - "typedef double real_t;\n" - "typedef float real_bucket_t;\n"//Assume buckets are always float, even though iter calcs are in double. - "typedef double2 real2;\n" - "typedef double4 real4;\n" - "typedef float4 real4_bucket;\n"//And here too. - "#define EPS (DBL_EPSILON)\n" - "#define TLOW (DBL_MIN)\n" - "#define TMAX (DBL_MAX)\n" - ; + " #pragma OPENCL EXTENSION cl_amd_fp64 : enable\n" + "#endif\n" + "#if defined(cl_khr_fp64)\n"//Khronos extension available? + " #pragma OPENCL EXTENSION cl_khr_fp64 : enable\n" + "#endif\n" + "#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable\n"//Only supported on nVidia. + "typedef long intPrec;\n" + "typedef uint atomi;\n"//Same size as real_bucket_t, always 4 bytes. + "typedef double real_t;\n" + "typedef float real_bucket_t;\n"//Assume buckets are always float, even though iter calcs are in double. + "typedef double2 real2;\n" + "typedef double3 real3;\n" + "typedef double4 real4;\n" + "typedef float4 real4_bucket;\n"//And here too. + "#define EPS (DBL_EPSILON)\n" + "#define TLOW (DBL_MIN)\n" + "#define TMAX (DBL_MAX)\n" + ; } else { os << "typedef int intPrec;\n" - "typedef uint atomi;\n" - "typedef float real_t;\n" - "typedef float real_bucket_t;\n" - "typedef float2 real2;\n" - "typedef float4 real4;\n" - "typedef float4 real4_bucket;\n" - "#define EPS (FLT_EPSILON)\n" - "#define TLOW (FLT_MIN)\n" - "#define TMAX (FLT_MAX)\n" - ; + "typedef uint atomi;\n" + "typedef float real_t;\n" + "typedef float real_bucket_t;\n" + "typedef float2 real2;\n" + "typedef float3 real3;\n" + "typedef float4 real4;\n" + "typedef float4 real4_bucket;\n" + "#define EPS (FLT_EPSILON)\n" + "#define TLOW (FLT_MIN)\n" + "#define TMAX (FLT_MAX)\n" + ; } os << - "typedef long int int64;\n" - "typedef unsigned long int uint64;\n" - "\n" - "#define EPS6 ((1e-6))\n" - "\n" - "//The number of threads per block used in the iteration function. Don't change\n" - "//it lightly; the block size is hard coded to be exactly 32 x 8.\n" - "#define NTHREADS 256u\n" - "#define THREADS_PER_WARP 32u\n" - "#define NWARPS (NTHREADS / THREADS_PER_WARP)\n" - "#define COLORMAP_LENGTH 256u\n" - "#define COLORMAP_LENGTH_MINUS_1 255u\n" - "#define DE_THRESH 100u\n" - "#define BadVal(x) (((x) != (x)) || ((x) > 1e10) || ((x) < -1e10))\n" - "#define Rint(A) floor((A) + (((A) < 0) ? -0.5 : 0.5))\n" - "#define SQR(x) ((x) * (x))\n" - "#define CUBE(x) ((x) * (x) * (x))\n" - "#define M_2PI (M_PI * 2)\n" - "#define M_3PI (M_PI * 3)\n" - "#define SQRT5 2.2360679774997896964091736687313\n" - "#define M_PHI 1.61803398874989484820458683436563\n" - "#define DEG_2_RAD (M_PI / 180)\n" - "\n" - "//Index in each dimension of a thread within a block.\n" - "#define THREAD_ID_X (get_local_id(0))\n" - "#define THREAD_ID_Y (get_local_id(1))\n" - "#define THREAD_ID_Z (get_local_id(2))\n" - "\n" - "//Index in each dimension of a block within a grid.\n" - "#define BLOCK_ID_X (get_group_id(0))\n" - "#define BLOCK_ID_Y (get_group_id(1))\n" - "#define BLOCK_ID_Z (get_group_id(2))\n" - "\n" - "//Absolute index in each dimension of a thread within a grid.\n" - "#define GLOBAL_ID_X (get_global_id(0))\n" - "#define GLOBAL_ID_Y (get_global_id(1))\n" - "#define GLOBAL_ID_Z (get_global_id(2))\n" - "\n" - "//Dimensions of a block.\n" - "#define BLOCK_SIZE_X (get_local_size(0))\n" - "#define BLOCK_SIZE_Y (get_local_size(1))\n" - "#define BLOCK_SIZE_Z (get_local_size(2))\n" - "\n" - "//Dimensions of a grid, in terms of blocks.\n" - "#define GRID_SIZE_X (get_num_groups(0))\n" - "#define GRID_SIZE_Y (get_num_groups(1))\n" - "#define GRID_SIZE_Z (get_num_groups(2))\n" - "\n" - "//Dimensions of a grid, in terms of threads.\n" - "#define GLOBAL_SIZE_X (get_global_size(0))\n" - "#define GLOBAL_SIZE_Y (get_global_size(1))\n" - "#define GLOBAL_SIZE_Z (get_global_size(2))\n" - "\n" - "#define INDEX_IN_BLOCK_2D (THREAD_ID_Y * BLOCK_SIZE_X + THREAD_ID_X)\n" - "#define INDEX_IN_BLOCK_3D ((BLOCK_SIZE_X * BLOCK_SIZE_Y * THREAD_ID_Z) + INDEX_IN_BLOCK_2D)\n" - "\n" - "#define INDEX_IN_GRID_2D (GLOBAL_ID_Y * GLOBAL_SIZE_X + GLOBAL_ID_X)\n" - "#define INDEX_IN_GRID_3D ((GLOBAL_SIZE_X * GLOBAL_SIZE_Y * GLOBAL_ID_Z) + INDEX_IN_GRID_2D)\n" - "\n"; - + "typedef long int int64;\n" + "typedef unsigned long int uint64;\n" + "\n" + "#define EPS6 ((1e-6))\n" + "\n" + "//The number of threads per block used in the iteration function. Don't change\n" + "//it lightly; the block size is hard coded to be exactly 32 x 8.\n" + "#define NTHREADS 256u\n" + "#define THREADS_PER_WARP 32u\n" + "#define NWARPS (NTHREADS / THREADS_PER_WARP)\n" + "#define COLORMAP_LENGTH 256u\n" + "#define COLORMAP_LENGTH_MINUS_1 255u\n" + "#define DE_THRESH 100u\n" + "#define BadVal(x) (((x) != (x)) || ((x) > 1e10) || ((x) < -1e10))\n" + "#define Rint(A) floor((A) + (((A) < 0) ? -0.5 : 0.5))\n" + "#define SQR(x) ((x) * (x))\n" + "#define CUBE(x) ((x) * (x) * (x))\n" + "#define M_2PI (M_PI * 2)\n" + "#define M_3PI (M_PI * 3)\n" + "#define SQRT5 2.2360679774997896964091736687313\n" + "#define M_PHI 1.61803398874989484820458683436563\n" + "#define DEG_2_RAD (M_PI / 180)\n" + "\n" + "//Index in each dimension of a thread within a block.\n" + "#define THREAD_ID_X (get_local_id(0))\n" + "#define THREAD_ID_Y (get_local_id(1))\n" + "#define THREAD_ID_Z (get_local_id(2))\n" + "\n" + "//Index in each dimension of a block within a grid.\n" + "#define BLOCK_ID_X (get_group_id(0))\n" + "#define BLOCK_ID_Y (get_group_id(1))\n" + "#define BLOCK_ID_Z (get_group_id(2))\n" + "\n" + "//Absolute index in each dimension of a thread within a grid.\n" + "#define GLOBAL_ID_X (get_global_id(0))\n" + "#define GLOBAL_ID_Y (get_global_id(1))\n" + "#define GLOBAL_ID_Z (get_global_id(2))\n" + "\n" + "//Dimensions of a block.\n" + "#define BLOCK_SIZE_X (get_local_size(0))\n" + "#define BLOCK_SIZE_Y (get_local_size(1))\n" + "#define BLOCK_SIZE_Z (get_local_size(2))\n" + "\n" + "//Dimensions of a grid, in terms of blocks.\n" + "#define GRID_SIZE_X (get_num_groups(0))\n" + "#define GRID_SIZE_Y (get_num_groups(1))\n" + "#define GRID_SIZE_Z (get_num_groups(2))\n" + "\n" + "//Dimensions of a grid, in terms of threads.\n" + "#define GLOBAL_SIZE_X (get_global_size(0))\n" + "#define GLOBAL_SIZE_Y (get_global_size(1))\n" + "#define GLOBAL_SIZE_Z (get_global_size(2))\n" + "\n" + "#define INDEX_IN_BLOCK_2D (THREAD_ID_Y * BLOCK_SIZE_X + THREAD_ID_X)\n" + "#define INDEX_IN_BLOCK_3D ((BLOCK_SIZE_X * BLOCK_SIZE_Y * THREAD_ID_Z) + INDEX_IN_BLOCK_2D)\n" + "\n" + "#define INDEX_IN_GRID_2D (GLOBAL_ID_Y * GLOBAL_SIZE_X + GLOBAL_ID_X)\n" + "#define INDEX_IN_GRID_3D ((GLOBAL_SIZE_X * GLOBAL_SIZE_Y * GLOBAL_ID_Z) + INDEX_IN_GRID_2D)\n" + "\n"; return os.str(); } @@ -141,15 +142,15 @@ struct ALIGN PointCL /// be supported, which will make it more than 4 members. /// static const char* PointCLStructString = -"typedef struct __attribute__ " ALIGN_CL " _Point\n" -"{\n" -" real_t m_X;\n" -" real_t m_Y;\n" -" real_t m_Z;\n" -" real_t m_ColorX;\n" -" uint m_LastXfUsed;\n" -"} Point;\n" -"\n"; + "typedef struct __attribute__ " ALIGN_CL " _Point\n" + "{\n" + " real_t m_X;\n" + " real_t m_Y;\n" + " real_t m_Z;\n" + " real_t m_ColorX;\n" + " uint m_LastXfUsed;\n" + "} Point;\n" + "\n"; #define MAX_CL_VARS 8//These must always match. #define MAX_CL_VARS_STRING "8" @@ -175,18 +176,18 @@ struct ALIGN XformCL /// The xform structure used to iterate in OpenCL. /// static const char* XformCLStructString = -"typedef struct __attribute__ " ALIGN_CL " _XformCL\n" -"{\n" -" real_t m_A, m_B, m_C, m_D, m_E, m_F;\n" -" real_t m_VariationWeights[" MAX_CL_VARS_STRING "];\n" -" real_t m_PostA, m_PostB, m_PostC, m_PostD, m_PostE, m_PostF;\n" -" real_t m_DirectColor;\n" -" real_t m_ColorSpeedCache;\n" -" real_t m_OneMinusColorCache;\n" -" real_t m_Opacity;\n" -" real_t m_VizAdjusted;\n" -"} XformCL;\n" -"\n"; + "typedef struct __attribute__ " ALIGN_CL " _XformCL\n" + "{\n" + " real_t m_A, m_B, m_C, m_D, m_E, m_F;\n" + " real_t m_VariationWeights[" MAX_CL_VARS_STRING "];\n" + " real_t m_PostA, m_PostB, m_PostC, m_PostD, m_PostE, m_PostF;\n" + " real_t m_DirectColor;\n" + " real_t m_ColorSpeedCache;\n" + " real_t m_OneMinusColorCache;\n" + " real_t m_Opacity;\n" + " real_t m_VizAdjusted;\n" + "} XformCL;\n" + "\n"; /// /// A structure on the host used to hold all of the needed information for an ember used on the device to iterate in OpenCL. @@ -210,27 +211,27 @@ struct ALIGN EmberCL /// The ember structure used to iterate in OpenCL. /// static const char* EmberCLStructString = -"typedef struct __attribute__ " ALIGN_CL " _EmberCL\n" -"{\n" -" real_t m_CamZPos;\n" -" real_t m_CamPerspective;\n" -" real_t m_CamYaw;\n" -" real_t m_CamPitch;\n" -" real_t m_CamDepthBlur;\n" -" real_t m_BlurCoef;\n" -" real_t m_C00;\n" -" real_t m_C01;\n" -" real_t m_C02;\n" -" real_t m_C10;\n" -" real_t m_C11;\n" -" real_t m_C12;\n" -" real_t m_C20;\n" -" real_t m_C21;\n" -" real_t m_C22;\n" -" real_t m_CenterX, m_CenterY;\n" -" real_t m_RotA, m_RotB, m_RotD, m_RotE;\n" -"} EmberCL;\n" -"\n"; + "typedef struct __attribute__ " ALIGN_CL " _EmberCL\n" + "{\n" + " real_t m_CamZPos;\n" + " real_t m_CamPerspective;\n" + " real_t m_CamYaw;\n" + " real_t m_CamPitch;\n" + " real_t m_CamDepthBlur;\n" + " real_t m_BlurCoef;\n" + " real_t m_C00;\n" + " real_t m_C01;\n" + " real_t m_C02;\n" + " real_t m_C10;\n" + " real_t m_C11;\n" + " real_t m_C12;\n" + " real_t m_C20;\n" + " real_t m_C21;\n" + " real_t m_C22;\n" + " real_t m_CenterX, m_CenterY;\n" + " real_t m_RotA, m_RotB, m_RotD, m_RotE;\n" + "} EmberCL;\n" + "\n"; /// /// A structure on the host used to hold all of the needed information for cartesian to raster mapping used on the device to iterate in OpenCL. @@ -249,14 +250,14 @@ struct ALIGN CarToRasCL /// The cartesian to raster structure used to iterate in OpenCL. /// static const char* CarToRasCLStructString = -"typedef struct __attribute__ " ALIGN_CL " _CarToRasCL\n" -"{\n" -" real_t m_PixPerImageUnitW, m_RasLlX;\n" -" uint m_RasWidth;\n" -" real_t m_PixPerImageUnitH, m_RasLlY;\n" -" real_t m_CarLlX, m_CarUrX, m_CarUrY, m_CarLlY;\n" -"} CarToRasCL;\n" -"\n"; + "typedef struct __attribute__ " ALIGN_CL " _CarToRasCL\n" + "{\n" + " real_t m_PixPerImageUnitW, m_RasLlX;\n" + " uint m_RasWidth;\n" + " real_t m_PixPerImageUnitH, m_RasLlY;\n" + " real_t m_CarLlX, m_CarUrX, m_CarUrY, m_CarLlY;\n" + "} CarToRasCL;\n" + "\n"; /// /// A structure on the host used to hold all of the needed information for density filtering used on the device to iterate in OpenCL. @@ -283,20 +284,20 @@ struct ALIGN DensityFilterCL /// Note that the actual filter buffer is held elsewhere. /// static const char* DensityFilterCLStructString = -"typedef struct __attribute__ " ALIGN_CL " _DensityFilterCL\n" -"{\n" -" real_bucket_t m_Curve;\n" -" real_bucket_t m_K1;\n" -" real_bucket_t m_K2;\n" -" uint m_Supersample;\n" -" uint m_SuperRasW;\n" -" uint m_SuperRasH;\n" -" uint m_KernelSize;\n" -" uint m_MaxFilterIndex;\n" -" uint m_MaxFilteredCounts;\n" -" uint m_FilterWidth;\n" -"} DensityFilterCL;\n" -"\n"; + "typedef struct __attribute__ " ALIGN_CL " _DensityFilterCL\n" + "{\n" + " real_bucket_t m_Curve;\n" + " real_bucket_t m_K1;\n" + " real_bucket_t m_K2;\n" + " uint m_Supersample;\n" + " uint m_SuperRasW;\n" + " uint m_SuperRasH;\n" + " uint m_KernelSize;\n" + " uint m_MaxFilterIndex;\n" + " uint m_MaxFilteredCounts;\n" + " uint m_FilterWidth;\n" + "} DensityFilterCL;\n" + "\n"; /// /// A structure on the host used to hold all of the needed information for spatial filtering used on the device to iterate in OpenCL. @@ -328,26 +329,26 @@ struct ALIGN SpatialFilterCL /// Note that the actual filter buffer is held elsewhere. /// static const char* SpatialFilterCLStructString = -"typedef struct __attribute__ ((aligned (16))) _SpatialFilterCL\n" -"{\n" -" uint m_SuperRasW;\n" -" uint m_SuperRasH;\n" -" uint m_FinalRasW;\n" -" uint m_FinalRasH;\n" -" uint m_Supersample;\n" -" uint m_FilterWidth;\n" -" uint m_NumChannels;\n" -" uint m_BytesPerChannel;\n" -" uint m_DensityFilterOffset;\n" -" uint m_Transparency;\n" -" uint m_YAxisUp;\n" -" real_bucket_t m_Vibrancy;\n" -" real_bucket_t m_HighlightPower;\n" -" real_bucket_t m_Gamma;\n" -" real_bucket_t m_LinRange;\n" -" real_bucket_t m_Background[4];\n"//For some reason, using float4/double4 here does not align no matter what. So just use an array of 4. -"} SpatialFilterCL;\n" -"\n"; + "typedef struct __attribute__ ((aligned (16))) _SpatialFilterCL\n" + "{\n" + " uint m_SuperRasW;\n" + " uint m_SuperRasH;\n" + " uint m_FinalRasW;\n" + " uint m_FinalRasH;\n" + " uint m_Supersample;\n" + " uint m_FilterWidth;\n" + " uint m_NumChannels;\n" + " uint m_BytesPerChannel;\n" + " uint m_DensityFilterOffset;\n" + " uint m_Transparency;\n" + " uint m_YAxisUp;\n" + " real_bucket_t m_Vibrancy;\n" + " real_bucket_t m_HighlightPower;\n" + " real_bucket_t m_Gamma;\n" + " real_bucket_t m_LinRange;\n" + " real_bucket_t m_Background[4];\n"//For some reason, using float4/double4 here does not align no matter what. So just use an array of 4. + "} SpatialFilterCL;\n" + "\n"; /// /// EmberCL makes extensive use of the build in vector types, however accessing @@ -355,40 +356,40 @@ static const char* SpatialFilterCLStructString = /// Declaring them in a union with a buffer resolves this problem. /// static const char* UnionCLStructString = -"typedef union\n" -"{\n" -" uchar3 m_Uchar3;\n" -" uchar m_Uchars[3];\n" -"} uchar3uchars;\n" -"\n" -"typedef union\n" -"{\n" -" uchar4 m_Uchar4;\n" -" uchar m_Uchars[4];\n" -"} uchar4uchars;\n" -"\n" -"typedef union\n" -"{\n" -" uint4 m_Uint4;\n" -" uint m_Uints[4];\n" -"} uint4uints;\n" -"\n" -"typedef union\n"//Use in places where float is required. -"{\n" -" float4 m_Float4;\n" -" float m_Floats[4];\n" -"} float4floats;\n" -"\n" -"typedef union\n"//Use in places where float or double can be used depending on the template type. -"{\n" -" real4 m_Real4;\n" -" real_t m_Reals[4];\n" -"} real4reals;\n" -"\n" -"typedef union\n"//Used to match the bucket template type. -"{\n" -" real4_bucket m_Real4;\n" -" real_bucket_t m_Reals[4];\n" -"} real4reals_bucket;\n" -"\n"; + "typedef union\n" + "{\n" + " uchar3 m_Uchar3;\n" + " uchar m_Uchars[3];\n" + "} uchar3uchars;\n" + "\n" + "typedef union\n" + "{\n" + " uchar4 m_Uchar4;\n" + " uchar m_Uchars[4];\n" + "} uchar4uchars;\n" + "\n" + "typedef union\n" + "{\n" + " uint4 m_Uint4;\n" + " uint m_Uints[4];\n" + "} uint4uints;\n" + "\n" + "typedef union\n"//Use in places where float is required. + "{\n" + " float4 m_Float4;\n" + " float m_Floats[4];\n" + "} float4floats;\n" + "\n" + "typedef union\n"//Use in places where float or double can be used depending on the template type. + "{\n" + " real4 m_Real4;\n" + " real_t m_Reals[4];\n" + "} real4reals;\n" + "\n" + "typedef union\n"//Used to match the bucket template type. + "{\n" + " real4_bucket m_Real4;\n" + " real_bucket_t m_Reals[4];\n" + "} real4reals_bucket;\n" + "\n"; } diff --git a/Source/EmberCL/FunctionMapper.cpp b/Source/EmberCL/FunctionMapper.cpp index c771db0..2da374d 100644 --- a/Source/EmberCL/FunctionMapper.cpp +++ b/Source/EmberCL/FunctionMapper.cpp @@ -15,31 +15,26 @@ FunctionMapper::FunctionMapper() " intPrec temp = (x >= 0.0 ? (intPrec)(x + 0.5) : (intPrec)(x - 0.5));\n" " return (real_t)temp;\n" "}\n"; - m_GlobalMap["Round"] = "inline real_t Round(real_t r)\n" "{\n" " return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);\n" "}\n"; - m_GlobalMap["Sign"] = "inline real_t Sign(real_t v)\n" "{\n" " return (v < 0.0) ? -1 : (v > 0.0) ? 1 : 0.0;\n" "}\n"; - m_GlobalMap["SignNz"] = "inline real_t SignNz(real_t v)\n" "{\n" " return (v < 0.0) ? -1.0 : 1.0;\n" "}\n"; - m_GlobalMap["Sqr"] = "inline real_t Sqr(real_t v)\n" "{\n" " return v * v;\n" "}\n"; - m_GlobalMap["SafeSqrt"] = "inline real_t SafeSqrt(real_t x)\n" "{\n" @@ -48,49 +43,41 @@ FunctionMapper::FunctionMapper() "\n" " return sqrt(x);\n" "}\n"; - m_GlobalMap["Cube"] = "inline real_t Cube(real_t v)\n" "{\n" " return v * v * v;\n" "}\n"; - m_GlobalMap["Hypot"] = "inline real_t Hypot(real_t x, real_t y)\n" "{\n" " return sqrt(SQR(x) + SQR(y));\n" "}\n"; - m_GlobalMap["Spread"] = "inline real_t Spread(real_t x, real_t y)\n" "{\n" " return Hypot(x, y) * ((x) > 0.0 ? 1.0 : -1.0);\n" "}\n"; - m_GlobalMap["Powq4"] = "inline real_t Powq4(real_t x, real_t y)\n" "{\n" " return pow(fabs(x), y) * SignNz(x);\n" "}\n"; - m_GlobalMap["Powq4c"] = "inline real_t Powq4c(real_t x, real_t y)\n" "{\n" " return y == 1.0 ? x : Powq4(x, y);\n" "}\n"; - m_GlobalMap["Zeps"] = "inline real_t Zeps(real_t x)\n" "{\n" " return x == 0.0 ? EPS : x;\n" "}\n"; - m_GlobalMap["Lerp"] = "inline real_t Lerp(real_t a, real_t b, real_t p)\n" "{\n" " return a + (b - a) * p;\n" "}\n"; - m_GlobalMap["Fabsmod"] = "inline real_t Fabsmod(real_t v)\n" "{\n" @@ -98,37 +85,31 @@ FunctionMapper::FunctionMapper() "\n" " return modf(v, &dummy);\n" "}\n"; - m_GlobalMap["Fosc"] = "inline real_t Fosc(real_t p, real_t amp, real_t ph)\n" "{\n" " return 0.5 - cos(p * amp + ph) * 0.5;\n" "}\n"; - m_GlobalMap["Foscn"] = "inline real_t Foscn(real_t p, real_t ph)\n" "{\n" " return 0.5 - cos(p + ph) * 0.5;\n" "}\n"; - m_GlobalMap["LogScale"] = "inline real_t LogScale(real_t x)\n" "{\n" " return x == 0.0 ? 0.0 : log((fabs(x) + 1) * M_E) * SignNz(x) / M_E;\n" "}\n"; - m_GlobalMap["LogMap"] = "inline real_t LogMap(real_t x)\n" "{\n" " return x == 0.0 ? 0.0 : (M_E + log(x * M_E)) * 0.25 * SignNz(x);\n" "}\n"; - m_GlobalMap["ClampGte"] = "inline real_t ClampGte(real_t val, real_t gte)\n" "{\n" " return (val < gte) ? gte : val;\n" "}\n"; - m_GlobalMap["Swap"] = "inline void Swap(real_t* val1, real_t* val2)\n" "{\n" @@ -136,13 +117,172 @@ FunctionMapper::FunctionMapper() " *val1 = *val2;\n" " *val2 = tmp;\n" "}\n"; + m_GlobalMap["Vratio"] = + "inline real_t Vratio(real2* p, real2* q, real2* u)\n" + "{\n" + " real_t pmQx, pmQy;\n" + "\n" + " pmQx = (*p).x - (*q).x;\n" + " pmQy = (*p).y - (*q).y;\n" + "\n" + " if (pmQx == 0 && pmQy == 0)\n" + " return 1.0;\n" + "\n" + " return 2 * (((*u).x - (*q).x) * pmQx + ((*u).y - (*q).y) * pmQy) / (pmQx * pmQx + pmQy * pmQy);\n" + "}\n"; + m_GlobalMap["Closest"] = + "inline int Closest(real2* p, int n, real2* u)\n" + "{\n" + " real_t d2;\n" + " real_t d2min = TMAX;\n" + " int i, j = 0;\n" + "\n" + " for (i = 0; i < n; i++)\n" + " {\n" + " d2 = Sqr(p[i].x - (*u).x) + Sqr(p[i].y - (*u).y);\n" + "\n" + " if (d2 < d2min)\n" + " {\n" + " d2min = d2;\n" + " j = i;\n" + " }\n" + " }\n" + "\n" + " return j;\n" + "}\n"; + m_GlobalMap["Voronoi"] = + "inline real_t Voronoi(real2* p, int n, int q, real2* u)\n" + "{\n" + " real_t ratio;\n" + " real_t ratiomax = TLOW;\n" + " int i;\n" + "\n" + " for (i = 0; i < n; i++)\n" + " {\n" + " if (i != q)\n" + " {\n" + " ratio = Vratio(&p[i], &p[q], u);\n" + "\n" + " if (ratio > ratiomax)\n" + " ratiomax = ratio;\n" + " }\n" + " }\n" + "\n" + " return ratiomax;\n" + "}\n"; + m_GlobalMap["SimplexNoise3D"] = + "inline real_t SimplexNoise3D(real3* v, __global real_t* p, __global real3* grad)\n" + "{\n" + " real3 c[4];\n" + " real_t n = 0;\n" + " int gi[4];\n" + " real_t t;\n" + " real_t skewIn = ((*v).x + (*v).y + (*v).z) * 0.3333;\n" + " int i = (int)floor((*v).x + skewIn);\n" + " int j = (int)floor((*v).y + skewIn);\n" + " int k = (int)floor((*v).z + skewIn);\n" + " t = (i + j + k) * 0.16666;\n" + " real_t x0 = i - t;\n" + " real_t y0 = j - t;\n" + " real_t z0 = k - t;\n" + " c[0].x = (*v).x - x0;\n" + " c[0].y = (*v).y - y0;\n" + " c[0].z = (*v).z - z0;\n" + " int i1, j1, k1;\n" + " int i2, j2, k2;\n" + "\n" + " if (c[0].x >= c[0].y)\n" + " {\n" + " if (c[0].y >= c[0].z)\n" + " {\n" + " i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n" + " }\n" + " else\n" + " {\n" + " if (c[0].x >= c[0].z)\n" + " {\n" + " i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n" + " }\n" + " else\n" + " {\n" + " i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n" + " }\n" + " }\n" + " }\n" + " else\n" + " {\n" + " if (c[0].y < c[0].z)\n" + " {\n" + " i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;\n" + " }\n" + " else\n" + " {\n" + " if (c[0].x < c[0].z)\n" + " {\n" + " i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;\n" + " }\n" + " else\n" + " {\n" + " i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n" + " }\n" + " }\n" + " }\n" + "\n" + " c[1].x = c[0].x - i1 + 0.16666;\n" + " c[1].y = c[0].y - j1 + 0.16666;\n" + " c[1].z = c[0].z - k1 + 0.16666;\n" + " c[2].x = c[0].x - i2 + 2 * 0.16666;\n" + " c[2].y = c[0].y - j2 + 2 * 0.16666;\n" + " c[2].z = c[0].z - k2 + 2 * 0.16666;\n" + " c[3].x = c[0].x - 1 + 3 * 0.16666;\n" + " c[3].y = c[0].y - 1 + 3 * 0.16666;\n" + " c[3].z = c[0].z - 1 + 3 * 0.16666;\n" + " int ii = i & 0x3ff;\n" + " int jj = j & 0x3ff;\n" + " int kk = k & 0x3ff;\n" + " gi[0] = (int)p[ii + (int)p[jj + (int)p[kk]]];\n" + " gi[1] = (int)p[ii + i1 + (int)p[jj + j1 + (int)p[kk + k1]]];\n" + " gi[2] = (int)p[ii + i2 + (int)p[jj + j2 + (int)p[kk + k2]]];\n" + " gi[3] = (int)p[ii + 1 + (int)p[jj + 1 + (int)p[kk + 1]]];\n" + " for (uint corner = 0; corner < 4; corner++)\n" + " {\n" + " t = 0.6 - c[corner].x * c[corner].x - c[corner].y * c[corner].y - c[corner].z * c[corner].z;\n" + "\n" + " if (t > 0)\n" + " {\n" + " real3 u = grad[gi[corner]];\n" + " t *= t;\n" + " n += t * t * (u.x * c[corner].x + u.y * c[corner].y + u.z * c[corner].z);\n" + " }\n" + " }\n" + "\n" + " return 32 * n;\n" + "}\n"; + m_GlobalMap["PerlinNoise3D"] = + "inline real_t PerlinNoise3D(real3* v, __global real_t* p, __global real3* grad, real_t aScale, real_t fScale, int octaves)\n" + "{\n" + " int i;\n" + " real_t n = 0, a = 1;\n" + " real3 u = *v;\n" + "\n" + " for (i = 0; i < octaves; i++)\n" + " {\n" + " n += SimplexNoise3D(&u, p, grad) / a;\n" + " a *= aScale;\n" + " u.x *= fScale;\n" + " u.y *= fScale;\n" + " u.x *= fScale;\n" + " }\n" + "\n" + " return n;\n" + "}\n"; } } const string* FunctionMapper::GetGlobalFunc(const string& func) { const auto& text = m_GlobalMap.find(func); - + if (text != m_GlobalMap.end()) return &text->second; else diff --git a/Source/EmberCL/IterOpenCLKernelCreator.cpp b/Source/EmberCL/IterOpenCLKernelCreator.cpp index ae0ead5..a0d6b58 100644 --- a/Source/EmberCL/IterOpenCLKernelCreator.cpp +++ b/Source/EmberCL/IterOpenCLKernelCreator.cpp @@ -38,15 +38,14 @@ template const string& IterOpenCLKernelCreator::IterEntryPoint() /// Debugging parameter to include or omit accumulating to the histogram. Default: true. /// The kernel string template -string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, string& parVarDefines, bool lockAccum, bool doAccum) +string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, const string& parVarDefines, const string& globalSharedDefines, bool lockAccum, bool doAccum) { bool doublePrecision = typeid(T) == typeid(double); size_t i, v, varIndex, varCount, totalXformCount = ember.TotalXformCount(); ostringstream kernelIterBody, xformFuncs, os; vector*> variations; - xformFuncs << VariationStateString(ember); - xformFuncs << parVarDefines << endl; + xformFuncs << parVarDefines << globalSharedDefines; ember.GetPresentVariations(variations); for (auto var : variations) @@ -56,19 +55,17 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, for (i = 0; i < totalXformCount; i++) { Xform* xform = ember.GetTotalXform(i); - //size_t totalVarCount = xform->TotalVariationCount(); bool needPrecalcSumSquares = false; bool needPrecalcSqrtSumSquares = false; bool needPrecalcAngles = false; bool needPrecalcAtanXY = false; bool needPrecalcAtanYX = false; - v = varIndex = varCount = 0; xformFuncs << - "void Xform" << i << "(__constant XformCL* xform, __constant real_t* parVars, Point* inPoint, Point* outPoint, uint2* mwc, VariationState* varState)\n" << - "{\n" - " real_t transX, transY, transZ;\n" - " real4 vIn, vOut = 0.0;\n"; + "void Xform" << i << "(__constant XformCL* xform, __constant real_t* parVars, __global real_t* globalShared, Point* inPoint, Point* outPoint, uint2* mwc, VariationState* varState)\n" << + "{\n" + " real_t transX, transY, transZ;\n" + " real4 vIn, vOut = 0.0;\n"; //Determine if any variations, regular, pre, or post need precalcs. while (Variation* var = xform->GetVariation(v++)) @@ -103,17 +100,16 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, if (xform->PreVariationCount() + xform->VariationCount() == 0) { xformFuncs << - " outPoint->m_X = (xform->m_A * inPoint->m_X) + (xform->m_B * inPoint->m_Y) + xform->m_C;\n" << - " outPoint->m_Y = (xform->m_D * inPoint->m_X) + (xform->m_E * inPoint->m_Y) + xform->m_F;\n" << - " outPoint->m_Z = inPoint->m_Z;\n"; + " outPoint->m_X = (xform->m_A * inPoint->m_X) + (xform->m_B * inPoint->m_Y) + xform->m_C;\n" << + " outPoint->m_Y = (xform->m_D * inPoint->m_X) + (xform->m_E * inPoint->m_Y) + xform->m_F;\n" << + " outPoint->m_Z = inPoint->m_Z;\n"; } else { xformFuncs << - " transX = (xform->m_A * inPoint->m_X) + (xform->m_B * inPoint->m_Y) + xform->m_C;\n" << - " transY = (xform->m_D * inPoint->m_X) + (xform->m_E * inPoint->m_Y) + xform->m_F;\n" << - " transZ = inPoint->m_Z;\n"; - + " transX = (xform->m_A * inPoint->m_X) + (xform->m_B * inPoint->m_Y) + xform->m_C;\n" << + " transY = (xform->m_D * inPoint->m_X) + (xform->m_E * inPoint->m_Y) + xform->m_F;\n" << + " transZ = inPoint->m_Z;\n"; varCount = xform->PreVariationCount(); if (varCount > 0) @@ -127,9 +123,9 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, { xformFuncs << "\n\t//" << var->Name() << ".\n"; xformFuncs << var->PrecalcOpenCLString(); - xformFuncs << xform->ReadOpenCLString(VARTYPE_PRE) << endl; - xformFuncs << var->OpenCLString() << endl; - xformFuncs << xform->WriteOpenCLString(VARTYPE_PRE, var->AssignType()) << endl; + xformFuncs << xform->ReadOpenCLString(VARTYPE_PRE) << "\n"; + xformFuncs << var->OpenCLString() << "\n"; + xformFuncs << xform->WriteOpenCLString(VARTYPE_PRE, var->AssignType()) << "\n"; } } } @@ -159,7 +155,6 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, xformFuncs << "\n\toutPoint->m_Z = 0;\n"; xformFuncs << "\n\t//Apply each of the " << xform->VariationCount() << " regular variations in this xform.\n\n"; xformFuncs << xform->ReadOpenCLString(VARTYPE_REG); - varCount += xform->VariationCount(); //Output the code for each regular variation in this xform. @@ -168,17 +163,17 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, if (Variation* var = xform->GetVariation(varIndex)) { xformFuncs << "\n\t//" << var->Name() << ".\n" - << var->OpenCLString() << (varIndex == varCount - 1 ? "\n" : "\n\n") - << xform->WriteOpenCLString(VARTYPE_REG, ASSIGNTYPE_SUM); + << var->OpenCLString() << (varIndex == varCount - 1 ? "\n" : "\n\n") + << xform->WriteOpenCLString(VARTYPE_REG, ASSIGNTYPE_SUM); } } } else { xformFuncs << - " outPoint->m_X = transX;\n" - " outPoint->m_Y = transY;\n" - " outPoint->m_Z = transZ;\n"; + " outPoint->m_X = transX;\n" + " outPoint->m_Y = transY;\n" + " outPoint->m_Z = transZ;\n"; } } @@ -194,8 +189,8 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, { xformFuncs << "\n\t//" << var->Name() << ".\n"; xformFuncs << var->PrecalcOpenCLString(); - xformFuncs << xform->ReadOpenCLString(VARTYPE_POST) << endl; - xformFuncs << var->OpenCLString() << endl; + xformFuncs << xform->ReadOpenCLString(VARTYPE_POST) << "\n"; + xformFuncs << var->OpenCLString() << "\n"; xformFuncs << xform->WriteOpenCLString(VARTYPE_POST, var->AssignType()) << (varIndex == varCount - 1 ? "\n" : "\n\n"); } } @@ -204,341 +199,336 @@ string IterOpenCLKernelCreator::CreateIterKernelString(const Ember& ember, if (xform->HasPost()) { xformFuncs << - "\n\t//Apply post affine transform.\n" - "\treal_t tempX = outPoint->m_X;\n" - "\n" - "\toutPoint->m_X = (xform->m_PostA * tempX) + (xform->m_PostB * outPoint->m_Y) + xform->m_PostC;\n" << - "\toutPoint->m_Y = (xform->m_PostD * tempX) + (xform->m_PostE * outPoint->m_Y) + xform->m_PostF;\n"; + "\n\t//Apply post affine transform.\n" + "\treal_t tempX = outPoint->m_X;\n" + "\n" + "\toutPoint->m_X = (xform->m_PostA * tempX) + (xform->m_PostB * outPoint->m_Y) + xform->m_PostC;\n" << + "\toutPoint->m_Y = (xform->m_PostD * tempX) + (xform->m_PostE * outPoint->m_Y) + xform->m_PostF;\n"; } - xformFuncs << "\toutPoint->m_ColorX = outPoint->m_ColorX + xform->m_DirectColor * (tempColor - outPoint->m_ColorX);\n"; + xformFuncs << "\toutPoint->m_ColorX = tempColor + xform->m_DirectColor * (outPoint->m_ColorX - tempColor);\n"; xformFuncs << "}\n" << "\n"; } os << - ConstantDefinesString(doublePrecision) << - GlobalFunctionsString(ember) << - RandFunctionString << - PointCLStructString << - XformCLStructString << - EmberCLStructString << - UnionCLStructString << - CarToRasCLStructString << - CarToRasFunctionString; + ConstantDefinesString(doublePrecision) << + GlobalFunctionsString(ember) << + RandFunctionString << + PointCLStructString << + XformCLStructString << + EmberCLStructString << + UnionCLStructString << + CarToRasCLStructString << + CarToRasFunctionString; if (lockAccum) os << AtomicString(); os << - xformFuncs.str() << - "__kernel void " << m_IterEntryPoint << "(\n" << - " uint iterCount,\n" - " uint fuseCount,\n" - " __global uint2* seeds,\n" - " __constant EmberCL* ember,\n" - " __constant XformCL* xforms,\n" - " __constant real_t* parVars,\n" - " __global uchar* xformDistributions,\n"//Using uchar is quicker than uint. Can't be constant because the size can be too large to fit when using xaos. - " __constant CarToRasCL* carToRas,\n" - " __global real4reals_bucket* histogram,\n" - " uint histSize,\n" - " __read_only image2d_t palette,\n" - " __global Point* points\n" - //" uint startRender\n" - "\t)\n" - "{\n" - " bool fuse, ok;\n" - " uint threadIndex = INDEX_IN_BLOCK_2D;\n" - " uint pointsIndex = INDEX_IN_GRID_2D;\n" - " uint i, itersToDo;\n" - " uint consec = 0;\n" - //" int badvals = 0;\n" - " uint histIndex;\n" - " real_t p00, p01;\n" - " Point firstPoint, secondPoint, tempPoint;\n" - " uint2 mwc = seeds[pointsIndex];\n" - " float4 palColor1;\n" - " int2 iPaletteCoord;\n" - " const sampler_t paletteSampler = CLK_NORMALIZED_COORDS_FALSE |\n"//Coords from 0 to 255. - " CLK_ADDRESS_CLAMP_TO_EDGE |\n"//Clamp to edge - " CLK_FILTER_NEAREST;\n"//Don't interpolate - " uint threadXY = (THREAD_ID_X + THREAD_ID_Y);\n" - " uint threadXDivRows = (THREAD_ID_X / NWARPS);\n" - " uint threadsMinus1 = NTHREADS - 1;\n" - " VariationState varState;\n" - ; - + xformFuncs.str() << + "__kernel void " << m_IterEntryPoint << "(\n" << + " uint iterCount,\n" + " uint fuseCount,\n" + " __global uint2* seeds,\n" + " __constant EmberCL* ember,\n" + " __constant XformCL* xforms,\n" + " __constant real_t* parVars,\n" + " __global real_t* globalShared,\n" + " __global uchar* xformDistributions,\n"//Using uchar is quicker than uint. Can't be constant because the size can be too large to fit when using xaos. + " __constant CarToRasCL* carToRas,\n" + " __global real4reals_bucket* histogram,\n" + " uint histSize,\n" + " __read_only image2d_t palette,\n" + " __global Point* points\n" + //" uint startRender\n" + "\t)\n" + "{\n" + " bool fuse, ok;\n" + " uint threadIndex = INDEX_IN_BLOCK_2D;\n" + " uint pointsIndex = INDEX_IN_GRID_2D;\n" + " uint i, itersToDo;\n" + " uint consec = 0;\n" + //" int badvals = 0;\n" + " uint histIndex;\n" + " real_t p00, p01;\n" + " Point firstPoint, secondPoint, tempPoint;\n" + " uint2 mwc = seeds[pointsIndex];\n" + " float4 palColor1;\n" + " int2 iPaletteCoord;\n" + " const sampler_t paletteSampler = CLK_NORMALIZED_COORDS_FALSE |\n"//Coords from 0 to 255. + " CLK_ADDRESS_CLAMP_TO_EDGE |\n"//Clamp to edge + " CLK_FILTER_NEAREST;\n"//Don't interpolate + " uint threadXY = (THREAD_ID_X + THREAD_ID_Y);\n" + " uint threadXDivRows = (THREAD_ID_X / NWARPS);\n" + " uint threadsMinus1 = NTHREADS - 1;\n" + " VariationState varState;\n" + ; os << - "\n" + "\n" #ifndef STRAIGHT_RAND - " __local Point swap[NTHREADS];\n" - " __local uint xfsel[NWARPS];\n" + " __local Point swap[NTHREADS];\n" + " __local uint xfsel[NWARPS];\n" #endif - "\n" - " iPaletteCoord.y = 0;\n" - "\n" - " if (fuseCount > 0)\n" - " {\n" - " fuse = true;\n" - " itersToDo = fuseCount;\n" - //Calling MwcNextNeg1Pos1() twice is deliberate. The first call to mwc is not very random since it just does - //an xor. So it must be called twice to get it in a good random state. - " firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" - " firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" - " firstPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n" - " firstPoint.m_Z = 0.0;\n" - " firstPoint.m_ColorX = MwcNext01(&mwc);\n" - " firstPoint.m_LastXfUsed = 0;\n" - " }\n" - " else\n" - " {\n" - " fuse = false;\n" - " itersToDo = iterCount;\n" - " firstPoint = points[pointsIndex];\n" - " }\n" - "\n" - ; - + "\n" + " iPaletteCoord.y = 0;\n" + "\n" + " if (fuseCount > 0)\n" + " {\n" + " fuse = true;\n" + " itersToDo = fuseCount;\n" + //Calling MwcNextNeg1Pos1() twice is deliberate. The first call to mwc is not very random since it just does + //an xor. So it must be called twice to get it in a good random state. + " firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" + " firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" + " firstPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n" + " firstPoint.m_Z = 0.0;\n" + " firstPoint.m_ColorX = MwcNext01(&mwc);\n" + " firstPoint.m_LastXfUsed = 0;\n" + " }\n" + " else\n" + " {\n" + " fuse = false;\n" + " itersToDo = iterCount;\n" + " firstPoint = points[pointsIndex];\n" + " }\n" + "\n" + ; auto varStateString = VariationStateInitString(ember); if (!varStateString.empty()) os << varStateString << "\n\n"; - //This is done once initially here and then again after each swap-sync in the main loop. - //This along with the randomness that the point shuffle provides gives sufficient randomness - //to produce results identical to those produced on the CPU. + //This is done once initially here and then again after each swap-sync in the main loop. + //This along with the randomness that the point shuffle provides gives sufficient randomness + //to produce results identical to those produced on the CPU. os << #ifndef STRAIGHT_RAND - " if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n" - " xfsel[THREAD_ID_X] = MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << ";\n"//It's faster to do the & here ahead of time than every time an xform is looked up to use inside the loop. - "\n" + " if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n" + " xfsel[THREAD_ID_X] = MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << ";\n"//It's faster to do the & here ahead of time than every time an xform is looked up to use inside the loop. + "\n" #endif - " barrier(CLK_LOCAL_MEM_FENCE);\n" - "\n" - " for (i = 0; i < itersToDo; i++)\n" - " {\n"; + " barrier(CLK_LOCAL_MEM_FENCE);\n" + "\n" + " for (i = 0; i < itersToDo; i++)\n" + " {\n"; + os << + " consec = 0;\n" + "\n" + " do\n" + " {\n"; + //If xaos is present, the a hybrid of the cuburn method is used. + //This makes each thread in a row pick the same offset into a distribution, using xfsel. + //However, the distribution the offset is in, is determined by firstPoint.m_LastXfUsed. + if (ember.XaosPresent()) + { os << - " consec = 0;\n" - "\n" - " do\n" - " {\n"; +#ifdef STRAIGHT_RAND + " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << " + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n"; +#else + " secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y] + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n";//Partial cuburn hybrid. +#endif + } + else + { + os << +#ifdef STRAIGHT_RAND + " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << "];\n\n";//For testing, using straight rand flam4/fractron style instead of cuburn. +#else + " secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y]];\n\n"; +#endif + } - //If xaos is present, the a hybrid of the cuburn method is used. - //This makes each thread in a row pick the same offset into a distribution, using xfsel. - //However, the distribution the offset is in, is determined by firstPoint.m_LastXfUsed. - if (ember.XaosPresent()) + for (i = 0; i < ember.XformCount(); i++) + { + if (i == 0) { os << -#ifdef STRAIGHT_RAND - " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << " + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n"; + " switch (secondPoint.m_LastXfUsed)\n" + " {\n"; + } + + os << + " case " << i << ":\n" + " {\n" << + " Xform" << i << "(&(xforms[" << i << "]), parVars, globalShared, &firstPoint, &secondPoint, &mwc, &varState);\n" << + " break;\n" + " }\n"; + + if (i == ember.XformCount() - 1) + { + os << + " }\n"; + } + } + + os << + "\n" + " ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y);\n" + //" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y) && !BadVal(secondPoint.m_Z);\n" + "\n" + " if (!ok)\n" + " {\n" + " firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" + " firstPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n" + " firstPoint.m_Z = 0.0;\n" + " firstPoint.m_ColorX = secondPoint.m_ColorX;\n" + " consec++;\n" + //" badvals++;\n" + " }\n" + " }\n" + " while (!ok && consec < 5);\n" + "\n" + " if (!ok)\n" + " {\n" + " secondPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" + " secondPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n" + " secondPoint.m_Z = 0.0;\n" + " }\n" +#ifndef STRAIGHT_RAND + "\n"//Rotate points between threads. This is how randomization is achieved. + " uint swr = threadXY + ((i & 1u) * threadXDivRows);\n" + " uint sw = (swr * THREADS_PER_WARP + THREAD_ID_X) & threadsMinus1;\n" + "\n" + //Write to another thread's location. + " swap[sw] = secondPoint;\n" + "\n" + //Populate randomized xform index buffer with new random values. + " if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n" + " xfsel[THREAD_ID_X] = MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << ";\n" + "\n" + " barrier(CLK_LOCAL_MEM_FENCE);\n" + //Another thread will have written to this thread's location, so read the new value and use it for accumulation below. + " firstPoint = swap[threadIndex];\n" #else - " secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y] + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n";//Partial cuburn hybrid. + " firstPoint = secondPoint;\n"//For testing, using straight rand flam4/fractron style instead of cuburn. #endif + "\n" + " if (fuse)\n" + " {\n" + " if (i >= fuseCount - 1)\n" + " {\n" + " i = 0;\n" + " fuse = false;\n" + " itersToDo = iterCount;\n" + " barrier(CLK_LOCAL_MEM_FENCE);\n"//Sort of seems necessary, sort of doesn't. Makes no speed difference. + " }\n" + "\n" + " continue;\n" + " }\n" + "\n"; + + if (ember.UseFinalXform()) + { + size_t finalIndex = ember.TotalXformCount() - 1; + //CPU takes an extra step here to preserve the opacity of the randomly selected xform, rather than the final xform's opacity. + //The same thing takes place here automatically because secondPoint.m_LastXfUsed is used below to retrieve the opacity when accumulating. + os << + " if ((xforms[" << finalIndex << "].m_Opacity == 1) || (MwcNext01(&mwc) < xforms[" << finalIndex << "].m_Opacity))\n" + " {\n" + " tempPoint.m_LastXfUsed = secondPoint.m_LastXfUsed;\n" + " Xform" << finalIndex << "(&(xforms[" << finalIndex << "]), parVars, globalShared, &secondPoint, &tempPoint, &mwc, &varState);\n" + " secondPoint = tempPoint;\n" + " }\n" + "\n"; + } + + os << CreateProjectionString(ember); + + if (doAccum) + { + os << + " p00 = secondPoint.m_X - ember->m_CenterX;\n" + " p01 = secondPoint.m_Y - ember->m_CenterY;\n" + " tempPoint.m_X = (p00 * ember->m_RotA) + (p01 * ember->m_RotB) + ember->m_CenterX;\n" + " tempPoint.m_Y = (p00 * ember->m_RotD) + (p01 * ember->m_RotE) + ember->m_CenterY;\n" + "\n" + //Add this point to the appropriate location in the histogram. + " if (CarToRasInBounds(carToRas, &tempPoint))\n" + " {\n" + " CarToRasConvertPointToSingle(carToRas, &tempPoint, &histIndex);\n" + "\n" + " if (histIndex < histSize)\n"//Provides an extra level of safety and makes no speed difference. + " {\n"; + + //Basic texture index interoplation does not produce identical results + //to the CPU. So the code here must explicitly do the same thing and not + //rely on the GPU texture coordinate lookup. + if (ember.m_PaletteMode == PALETTE_LINEAR) + { + os << + " real_t colorIndexFrac;\n" + " real_t colorIndex = secondPoint.m_ColorX * COLORMAP_LENGTH;\n" + " int intColorIndex = (int)colorIndex;\n" + " float4 palColor2;\n" + "\n" + " if (intColorIndex < 0)\n" + " {\n" + " intColorIndex = 0;\n" + " colorIndexFrac = 0;\n" + " }\n" + " else if (intColorIndex >= COLORMAP_LENGTH_MINUS_1)\n" + " {\n" + " intColorIndex = COLORMAP_LENGTH_MINUS_1 - 1;\n" + " colorIndexFrac = 1.0;\n" + " }\n" + " else\n" + " {\n" + " colorIndexFrac = colorIndex - (real_t)intColorIndex;\n"//Interpolate between intColorIndex and intColorIndex + 1. + " }\n" + "\n" + " iPaletteCoord.x = intColorIndex;\n"//Palette operations are strictly float because OpenCL does not support dp64 textures. + " palColor1 = read_imagef(palette, paletteSampler, iPaletteCoord);\n" + " iPaletteCoord.x += 1;\n" + " palColor2 = read_imagef(palette, paletteSampler, iPaletteCoord);\n" + " palColor1 = (palColor1 * (1.0f - (float)colorIndexFrac)) + (palColor2 * (float)colorIndexFrac);\n";//The 1.0f here *must* have the 'f' suffix at the end to compile. + } + else if (ember.m_PaletteMode == PALETTE_STEP) + { + os << + " iPaletteCoord.x = (int)(secondPoint.m_ColorX * COLORMAP_LENGTH);\n" + " palColor1 = read_imagef(palette, paletteSampler, iPaletteCoord);\n"; + } + + if (lockAccum) + { + os << + " AtomicAdd(&(histogram[histIndex].m_Reals[0]), palColor1.x * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"//Always apply opacity, even though it's usually 1. + " AtomicAdd(&(histogram[histIndex].m_Reals[1]), palColor1.y * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n" + " AtomicAdd(&(histogram[histIndex].m_Reals[2]), palColor1.z * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n" + " AtomicAdd(&(histogram[histIndex].m_Reals[3]), palColor1.w * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"; } else { os << -#ifdef STRAIGHT_RAND - " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << "];\n\n";//For testing, using straight rand flam4/fractron style instead of cuburn. -#else - " secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y]];\n\n"; -#endif - } - - for (i = 0; i < ember.XformCount(); i++) - { - if (i == 0) - { - os << - " switch (secondPoint.m_LastXfUsed)\n" - " {\n"; - } - - os << - " case " << i << ":\n" - " {\n" << - " Xform" << i << "(&(xforms[" << i << "]), parVars, &firstPoint, &secondPoint, &mwc, &varState);\n" << - " break;\n" - " }\n"; - - if (i == ember.XformCount() - 1) - { - os << - " }\n"; - } + " histogram[histIndex].m_Real4 += (palColor1 * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n";//real_bucket_t should always be float. } os << - "\n" - " ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y);\n" - //" ok = !BadVal(secondPoint.m_X) && !BadVal(secondPoint.m_Y) && !BadVal(secondPoint.m_Z);\n" - "\n" - " if (!ok)\n" - " {\n" - " firstPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" - " firstPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n" - " firstPoint.m_Z = 0.0;\n" - " firstPoint.m_ColorX = secondPoint.m_ColorX;\n" - " consec++;\n" - //" badvals++;\n" - " }\n" - " }\n" - " while (!ok && consec < 5);\n" - "\n" - " if (!ok)\n" - " {\n" - " secondPoint.m_X = MwcNextNeg1Pos1(&mwc);\n" - " secondPoint.m_Y = MwcNextNeg1Pos1(&mwc);\n" - " secondPoint.m_Z = 0.0;\n" - " }\n" -#ifndef STRAIGHT_RAND - "\n"//Rotate points between threads. This is how randomization is achieved. - " uint swr = threadXY + ((i & 1u) * threadXDivRows);\n" - " uint sw = (swr * THREADS_PER_WARP + THREAD_ID_X) & threadsMinus1;\n" - "\n" - - //Write to another thread's location. - " swap[sw] = secondPoint;\n" - "\n" - //Populate randomized xform index buffer with new random values. - " if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n" - " xfsel[THREAD_ID_X] = MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << ";\n" - "\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n" - //Another thread will have written to this thread's location, so read the new value and use it for accumulation below. - " firstPoint = swap[threadIndex];\n" -#else - " firstPoint = secondPoint;\n"//For testing, using straight rand flam4/fractron style instead of cuburn. -#endif - "\n" - " if (fuse)\n" - " {\n" - " if (i >= fuseCount - 1)\n" - " {\n" - " i = 0;\n" - " fuse = false;\n" - " itersToDo = iterCount;\n" - " barrier(CLK_LOCAL_MEM_FENCE);\n"//Sort of seems necessary, sort of doesn't. Makes no speed difference. - " }\n" - "\n" - " continue;\n" - " }\n" - "\n"; - - if (ember.UseFinalXform()) - { - size_t finalIndex = ember.TotalXformCount() - 1; - - //CPU takes an extra step here to preserve the opacity of the randomly selected xform, rather than the final xform's opacity. - //The same thing takes place here automatically because secondPoint.m_LastXfUsed is used below to retrieve the opacity when accumulating. - os << - " if ((xforms[" << finalIndex << "].m_Opacity == 1) || (MwcNext01(&mwc) < xforms[" << finalIndex << "].m_Opacity))\n" - " {\n" - " tempPoint.m_LastXfUsed = secondPoint.m_LastXfUsed;\n" - " Xform" << finalIndex << "(&(xforms[" << finalIndex << "]), parVars, &secondPoint, &tempPoint, &mwc, &varState);\n" - " secondPoint = tempPoint;\n" - " }\n" - "\n"; - } - - os << CreateProjectionString(ember); - - if (doAccum) - { - os << - " p00 = secondPoint.m_X - ember->m_CenterX;\n" - " p01 = secondPoint.m_Y - ember->m_CenterY;\n" - " tempPoint.m_X = (p00 * ember->m_RotA) + (p01 * ember->m_RotB) + ember->m_CenterX;\n" - " tempPoint.m_Y = (p00 * ember->m_RotD) + (p01 * ember->m_RotE) + ember->m_CenterY;\n" - "\n" - //Add this point to the appropriate location in the histogram. - " if (CarToRasInBounds(carToRas, &tempPoint))\n" - " {\n" - " CarToRasConvertPointToSingle(carToRas, &tempPoint, &histIndex);\n" - "\n" - " if (histIndex < histSize)\n"//Provides an extra level of safety and makes no speed difference. - " {\n"; - - //Basic texture index interoplation does not produce identical results - //to the CPU. So the code here must explicitly do the same thing and not - //rely on the GPU texture coordinate lookup. - if (ember.m_PaletteMode == PALETTE_LINEAR) - { - os << - " real_t colorIndexFrac;\n" - " real_t colorIndex = secondPoint.m_ColorX * COLORMAP_LENGTH;\n" - " int intColorIndex = (int)colorIndex;\n" - " float4 palColor2;\n" - "\n" - " if (intColorIndex < 0)\n" - " {\n" - " intColorIndex = 0;\n" - " colorIndexFrac = 0;\n" - " }\n" - " else if (intColorIndex >= COLORMAP_LENGTH_MINUS_1)\n" - " {\n" - " intColorIndex = COLORMAP_LENGTH_MINUS_1 - 1;\n" - " colorIndexFrac = 1.0;\n" - " }\n" - " else\n" - " {\n" - " colorIndexFrac = colorIndex - (real_t)intColorIndex;\n"//Interpolate between intColorIndex and intColorIndex + 1. - " }\n" - "\n" - " iPaletteCoord.x = intColorIndex;\n"//Palette operations are strictly float because OpenCL does not support dp64 textures. - " palColor1 = read_imagef(palette, paletteSampler, iPaletteCoord);\n" - " iPaletteCoord.x += 1;\n" - " palColor2 = read_imagef(palette, paletteSampler, iPaletteCoord);\n" - " palColor1 = (palColor1 * (1.0f - (float)colorIndexFrac)) + (palColor2 * (float)colorIndexFrac);\n";//The 1.0f here *must* have the 'f' suffix at the end to compile. - } - else if (ember.m_PaletteMode == PALETTE_STEP) - { - os << - " iPaletteCoord.x = (int)(secondPoint.m_ColorX * COLORMAP_LENGTH);\n" - " palColor1 = read_imagef(palette, paletteSampler, iPaletteCoord);\n"; - } - - if (lockAccum) - { - os << - " AtomicAdd(&(histogram[histIndex].m_Reals[0]), palColor1.x * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"//Always apply opacity, even though it's usually 1. - " AtomicAdd(&(histogram[histIndex].m_Reals[1]), palColor1.y * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n" - " AtomicAdd(&(histogram[histIndex].m_Reals[2]), palColor1.z * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n" - " AtomicAdd(&(histogram[histIndex].m_Reals[3]), palColor1.w * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n"; - } - else - { - os << - " histogram[histIndex].m_Real4 += (palColor1 * (real_bucket_t)xforms[secondPoint.m_LastXfUsed].m_VizAdjusted);\n";//real_bucket_t should always be float. - } - - os << - " }\n"//histIndex < histSize. - " }\n"//CarToRasInBounds. - "\n" - " barrier(CLK_GLOBAL_MEM_FENCE);\n";//Barrier every time, whether or not the point was in bounds, else artifacts will occur when doing strips. - } + " }\n"//histIndex < histSize. + " }\n"//CarToRasInBounds. + "\n" + " barrier(CLK_GLOBAL_MEM_FENCE);\n";//Barrier every time, whether or not the point was in bounds, else artifacts will occur when doing strips. + } os << - " }\n"//Main for loop. - "\n" - //At this point, iterating for this round is done, so write the final points back out - //to the global points buffer to be used as inputs for the next round. This preserves point trajectory - //between kernel calls. + " }\n"//Main for loop. + "\n" + //At this point, iterating for this round is done, so write the final points back out + //to the global points buffer to be used as inputs for the next round. This preserves point trajectory + //between kernel calls. #ifdef TEST_CL_BUFFERS//Use this to populate with test values and read back in EmberTester. - " points[pointsIndex].m_X = MwcNextNeg1Pos1(&mwc);\n" - " points[pointsIndex].m_Y = MwcNextNeg1Pos1(&mwc);\n" - " points[pointsIndex].m_Z = MwcNextNeg1Pos1(&mwc);\n" - " points[pointsIndex].m_ColorX = MwcNextNeg1Pos1(&mwc);\n" + " points[pointsIndex].m_X = MwcNextNeg1Pos1(&mwc);\n" + " points[pointsIndex].m_Y = MwcNextNeg1Pos1(&mwc);\n" + " points[pointsIndex].m_Z = MwcNextNeg1Pos1(&mwc);\n" + " points[pointsIndex].m_ColorX = MwcNextNeg1Pos1(&mwc);\n" #else - " points[pointsIndex] = firstPoint;\n" - " seeds[pointsIndex] = mwc;\n" + " points[pointsIndex] = firstPoint;\n" + " seeds[pointsIndex] = mwc;\n" #endif - " barrier(CLK_GLOBAL_MEM_FENCE);\n" - "}\n"; - + " barrier(CLK_GLOBAL_MEM_FENCE);\n" + "}\n"; return os.str(); } @@ -584,7 +574,7 @@ string IterOpenCLKernelCreator::GlobalFunctionsString(const Ember& ember) funcNames.push_back(zeps); for (auto& funcName : funcNames) - if(auto text = m_FunctionMapper.GetGlobalFunc(funcName)) + if (auto text = m_FunctionMapper.GetGlobalFunc(funcName)) os << *text << endl; return os.str(); @@ -655,10 +645,82 @@ void IterOpenCLKernelCreator::ParVarIndexDefines(const Ember& ember, pair< if (doString) os << "#define " << ToUpper(parVar->Params()[k].Name()) << "_" << i << " " << size << endl;//Uniquely identify this param in this variation in this xform. - if (doVals) - params.second.push_back(parVar->Params()[k].ParamVal()); + auto elements = parVar->Params()[k].Size() / sizeof(T); - size++; + if (doVals) + { + for (auto l = 0; l < elements; l++) + params.second.push_back(*(parVar->Params()[k].Param() + l)); + + //params.second.push_back(parVar->Params()[k].ParamVal()); + } + + //size++; + size += elements; + } + } + } + } + } + } + + if (doString) + { + os << "\n"; + params.first = os.str(); + } +} + +/// +/// Create an OpenCL string of #defines and a corresponding host side vector for globally shared data. +/// Certain variations, such as crackle and dc_perlin use static, read-only buffers of data. +/// These need to be created separate from the buffer of parametric variation values. +/// +/// The ember to create the values from +/// The string,vector pair to store the values in +/// True if the vector should be populated, else false. Default: true. +/// True if the string should be populated, else false. Default: true. +template +void IterOpenCLKernelCreator::SharedDataIndexDefines(const Ember& ember, pair>& params, bool doVals = true, bool doString = true) +{ + size_t i, j, offset = 0, xformCount = ember.TotalXformCount(); + string s; + vector dataNames;//Can't use a set here because they sort and we must preserve the insertion order due to nested function calls. + ostringstream os; + auto varFuncs = VarFuncs::Instance(); + + if (doVals) + params.second.clear(); + + for (i = 0; i < xformCount; i++) + { + if (auto xform = ember.GetTotalXform(i)) + { + size_t varCount = xform->TotalVariationCount(); + + for (j = 0; j < varCount; j++) + { + if (auto var = xform->GetVariation(j)) + { + auto names = var->OpenCLGlobalDataNames(); + + for (auto& name : names) + { + if (!Contains(dataNames, name)) + { + s = ToUpper(name); + + if (auto dataInfo = varFuncs->GetSharedData(s))///Will contain a name, pointer to data, and size of the data in units of sizeof(T). + { + if (doString) + os << "#define " << ToUpper(name) << " " << offset << endl; + + if (doVals) + params.second.insert(params.second.end(), dataInfo->first, dataInfo->first + dataInfo->second); + + dataNames.push_back(name); + offset += dataInfo->second; + } } } } @@ -684,7 +746,6 @@ template string IterOpenCLKernelCreator::VariationStateString(const Ember& ember) { ostringstream os; - os << "typedef struct __attribute__ " ALIGN_CL " _VariationState\n{"; for (size_t i = 0; i < ember.TotalXformCount(); i++) @@ -702,7 +763,6 @@ string IterOpenCLKernelCreator::VariationStateString(const Ember& ember) } os << "\n} VariationState;\n\n"; - return os.str(); } @@ -803,19 +863,17 @@ template string IterOpenCLKernelCreator::CreateZeroizeKernelString() const { ostringstream os; - os << - ConstantDefinesString(typeid(T) == typeid(double)) <= width || GLOBAL_ID_Y >= height)\n" - " return;\n" - "\n" - " buffer[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] = 0;\n"//Can't use INDEX_IN_GRID_2D here because the grid might be larger than the buffer to make even dimensions. - " barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe. - "}\n" - "\n"; - + ConstantDefinesString(typeid(T) == typeid(double)) <= width || GLOBAL_ID_Y >= height)\n" + " return;\n" + "\n" + " buffer[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] = 0;\n"//Can't use INDEX_IN_GRID_2D here because the grid might be larger than the buffer to make even dimensions. + " barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe. + "}\n" + "\n"; return os.str(); } @@ -831,23 +889,21 @@ template string IterOpenCLKernelCreator::CreateSumHistKernelString() const { ostringstream os; - os << - ConstantDefinesString(typeid(T) == typeid(double)) <= width || GLOBAL_ID_Y >= height)\n" - " return;\n" - "\n" - " dest[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] += source[(GLOBAL_ID_Y * width) + GLOBAL_ID_X];\n"//Can't use INDEX_IN_GRID_2D here because the grid might be larger than the buffer to make even dimensions. - "\n" - " if (clear)\n" - " source[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] = 0;\n" - "\n" - " barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe. - "}\n" - "\n"; - + ConstantDefinesString(typeid(T) == typeid(double)) <= width || GLOBAL_ID_Y >= height)\n" + " return;\n" + "\n" + " dest[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] += source[(GLOBAL_ID_Y * width) + GLOBAL_ID_X];\n"//Can't use INDEX_IN_GRID_2D here because the grid might be larger than the buffer to make even dimensions. + "\n" + " if (clear)\n" + " source[(GLOBAL_ID_Y * width) + GLOBAL_ID_X] = 0;\n" + "\n" + " barrier(CLK_GLOBAL_MEM_FENCE);\n"//Just to be safe. + "}\n" + "\n"; return os.str(); } @@ -871,44 +927,44 @@ string IterOpenCLKernelCreator::CreateProjectionString(const Ember& ember) if (projBits & PROJBITS_YAW) { os << - " real_t dsin, dcos;\n" - " real_t t = MwcNext01(&mwc) * M_2PI;\n" - " real_t z = secondPoint.m_Z - ember->m_CamZPos;\n" - " real_t x = ember->m_C00 * secondPoint.m_X + ember->m_C10 * secondPoint.m_Y;\n" - " real_t y = ember->m_C01 * secondPoint.m_X + ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" - "\n" - " z = ember->m_C02 * secondPoint.m_X + ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z;\n" - "\n" - " real_t zr = Zeps(1 - ember->m_CamPerspective * z);\n" - " real_t dr = MwcNext01(&mwc) * ember->m_BlurCoef * z;\n" - "\n" - " dsin = sin(t);\n" - " dcos = cos(t);\n" - "\n" - " secondPoint.m_X = (x + dr * dcos) / zr;\n" - " secondPoint.m_Y = (y + dr * dsin) / zr;\n" - " secondPoint.m_Z -= ember->m_CamZPos;\n"; + " real_t dsin, dcos;\n" + " real_t t = MwcNext01(&mwc) * M_2PI;\n" + " real_t z = secondPoint.m_Z - ember->m_CamZPos;\n" + " real_t x = ember->m_C00 * secondPoint.m_X + ember->m_C10 * secondPoint.m_Y;\n" + " real_t y = ember->m_C01 * secondPoint.m_X + ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" + "\n" + " z = ember->m_C02 * secondPoint.m_X + ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z;\n" + "\n" + " real_t zr = Zeps(1 - ember->m_CamPerspective * z);\n" + " real_t dr = MwcNext01(&mwc) * ember->m_BlurCoef * z;\n" + "\n" + " dsin = sin(t);\n" + " dcos = cos(t);\n" + "\n" + " secondPoint.m_X = (x + dr * dcos) / zr;\n" + " secondPoint.m_Y = (y + dr * dsin) / zr;\n" + " secondPoint.m_Z -= ember->m_CamZPos;\n"; } else { os << - " real_t y, z, zr;\n" - " real_t dsin, dcos;\n" - " real_t t = MwcNext01(&mwc) * M_2PI;\n" - "\n" - " z = secondPoint.m_Z - ember->m_CamZPos;\n" - " y = ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" - " z = ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z;\n" - " zr = Zeps(1 - ember->m_CamPerspective * z);\n" - "\n" - " dsin = sin(t);\n" - " dcos = cos(t);\n" - "\n" - " real_t dr = MwcNext01(&mwc) * ember->m_BlurCoef * z;\n" - "\n" - " secondPoint.m_X = (secondPoint.m_X + dr * dcos) / zr;\n" - " secondPoint.m_Y = (y + dr * dsin) / zr;\n" - " secondPoint.m_Z -= ember->m_CamZPos;\n"; + " real_t y, z, zr;\n" + " real_t dsin, dcos;\n" + " real_t t = MwcNext01(&mwc) * M_2PI;\n" + "\n" + " z = secondPoint.m_Z - ember->m_CamZPos;\n" + " y = ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" + " z = ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z;\n" + " zr = Zeps(1 - ember->m_CamPerspective * z);\n" + "\n" + " dsin = sin(t);\n" + " dcos = cos(t);\n" + "\n" + " real_t dr = MwcNext01(&mwc) * ember->m_BlurCoef * z;\n" + "\n" + " secondPoint.m_X = (secondPoint.m_X + dr * dcos) / zr;\n" + " secondPoint.m_Y = (y + dr * dsin) / zr;\n" + " secondPoint.m_Z -= ember->m_CamZPos;\n"; } } else if ((projBits & PROJBITS_PITCH) || (projBits & PROJBITS_YAW)) @@ -916,35 +972,35 @@ string IterOpenCLKernelCreator::CreateProjectionString(const Ember& ember) if (projBits & PROJBITS_YAW) { os << - " real_t z = secondPoint.m_Z - ember->m_CamZPos;\n" - " real_t x = ember->m_C00 * secondPoint.m_X + ember->m_C10 * secondPoint.m_Y;\n" - " real_t y = ember->m_C01 * secondPoint.m_X + ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" - " real_t zr = Zeps(1 - ember->m_CamPerspective * (ember->m_C02 * secondPoint.m_X + ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z));\n" - "\n" - " secondPoint.m_X = x / zr;\n" - " secondPoint.m_Y = y / zr;\n" - " secondPoint.m_Z -= ember->m_CamZPos;\n"; + " real_t z = secondPoint.m_Z - ember->m_CamZPos;\n" + " real_t x = ember->m_C00 * secondPoint.m_X + ember->m_C10 * secondPoint.m_Y;\n" + " real_t y = ember->m_C01 * secondPoint.m_X + ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" + " real_t zr = Zeps(1 - ember->m_CamPerspective * (ember->m_C02 * secondPoint.m_X + ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z));\n" + "\n" + " secondPoint.m_X = x / zr;\n" + " secondPoint.m_Y = y / zr;\n" + " secondPoint.m_Z -= ember->m_CamZPos;\n"; } else { os << - " real_t z = secondPoint.m_Z - ember->m_CamZPos;\n" - " real_t y = ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" - " real_t zr = Zeps(1 - ember->m_CamPerspective * (ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z));\n" - "\n" - " secondPoint.m_X /= zr;\n" - " secondPoint.m_Y = y / zr;\n" - " secondPoint.m_Z -= ember->m_CamZPos;\n"; + " real_t z = secondPoint.m_Z - ember->m_CamZPos;\n" + " real_t y = ember->m_C11 * secondPoint.m_Y + ember->m_C21 * z;\n" + " real_t zr = Zeps(1 - ember->m_CamPerspective * (ember->m_C12 * secondPoint.m_Y + ember->m_C22 * z));\n" + "\n" + " secondPoint.m_X /= zr;\n" + " secondPoint.m_Y = y / zr;\n" + " secondPoint.m_Z -= ember->m_CamZPos;\n"; } } else { os << - " real_t zr = Zeps(1 - ember->m_CamPerspective * (secondPoint.m_Z - ember->m_CamZPos));\n" - "\n" - " secondPoint.m_X /= zr;\n" - " secondPoint.m_Y /= zr;\n" - " secondPoint.m_Z -= ember->m_CamZPos;\n"; + " real_t zr = Zeps(1 - ember->m_CamPerspective * (secondPoint.m_Z - ember->m_CamZPos));\n" + "\n" + " secondPoint.m_X /= zr;\n" + " secondPoint.m_Y /= zr;\n" + " secondPoint.m_Z -= ember->m_CamZPos;\n"; } } diff --git a/Source/EmberCL/IterOpenCLKernelCreator.h b/Source/EmberCL/IterOpenCLKernelCreator.h index 3a13da0..c1c8618 100644 --- a/Source/EmberCL/IterOpenCLKernelCreator.h +++ b/Source/EmberCL/IterOpenCLKernelCreator.h @@ -30,9 +30,10 @@ public: const string& SumHistKernel() const; const string& SumHistEntryPoint() const; const string& IterEntryPoint() const; - string CreateIterKernelString(const Ember& ember, string& parVarDefines, bool lockAccum = false, bool doAccum = true); + string CreateIterKernelString(const Ember& ember, const string& parVarDefines, const string& globalSharedDefines, bool lockAccum = false, bool doAccum = true); string GlobalFunctionsString(const Ember& ember); static void ParVarIndexDefines(const Ember& ember, pair>& params, bool doVals = true, bool doString = true); + static void SharedDataIndexDefines(const Ember& ember, pair>& params, bool doVals = true, bool doString = true); static string VariationStateString(const Ember& ember); static string VariationStateInitString(const Ember& ember); static bool IsBuildRequired(const Ember& ember1, const Ember& ember2); diff --git a/Source/EmberCL/OpenCLInfo.cpp b/Source/EmberCL/OpenCLInfo.cpp index a8871de..8e774a3 100644 --- a/Source/EmberCL/OpenCLInfo.cpp +++ b/Source/EmberCL/OpenCLInfo.cpp @@ -3,17 +3,6 @@ namespace EmberCLns { -/// -/// Initialize and return a reference to the one and only OpenCLInfo object. -/// -/// A reference to the only OpenCLInfo object. -OpenCLInfo& OpenCLInfo::Instance() -{ - static OpenCLInfo instance; - - return instance; -} - /// /// Initialize the all platforms and devices and keep information about them in lists. /// @@ -23,7 +12,6 @@ OpenCLInfo::OpenCLInfo() vector platforms; vector> devices; intmax_t workingPlatformIndex = -1; - m_Init = false; cl::Platform::get(&platforms); devices.resize(platforms.size()); @@ -210,39 +198,36 @@ bool OpenCLInfo::CreateContext(const cl::Platform& platform, cl::Context& contex if (shared) { //Define OS-specific context properties and create the OpenCL context. - #if defined (__APPLE__) || defined(MACOSX) - CGLContextObj kCGLContext = CGLGetCurrentContext(); - CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext); - cl_context_properties props[] = - { - CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, - 0 - }; - - context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);//May need to tinker with this on Mac. - #else - #if defined WIN32 - cl_context_properties props[] = - { - CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), - CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), - CL_CONTEXT_PLATFORM, reinterpret_cast((platform)()), - 0 - }; - - context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err); - #else - cl_context_properties props[] = - { - CL_GL_CONTEXT_KHR, cl_context_properties(glXGetCurrentContext()), - CL_GLX_DISPLAY_KHR, cl_context_properties(glXGetCurrentDisplay()), - CL_CONTEXT_PLATFORM, reinterpret_cast((platform)()), - 0 - }; - - context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err); - #endif - #endif +#if defined (__APPLE__) || defined(MACOSX) + CGLContextObj kCGLContext = CGLGetCurrentContext(); + CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext); + cl_context_properties props[] = + { + CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, + 0 + }; + context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);//May need to tinker with this on Mac. +#else +#if defined WIN32 + cl_context_properties props[] = + { + CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), + CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), + CL_CONTEXT_PLATFORM, reinterpret_cast((platform)()), + 0 + }; + context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err); +#else + cl_context_properties props[] = + { + CL_GL_CONTEXT_KHR, cl_context_properties(glXGetCurrentContext()), + CL_GLX_DISPLAY_KHR, cl_context_properties(glXGetCurrentDisplay()), + CL_CONTEXT_PLATFORM, reinterpret_cast((platform)()), + 0 + }; + context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err); +#endif +#endif } else { @@ -252,7 +237,6 @@ bool OpenCLInfo::CreateContext(const cl::Platform& platform, cl::Context& contex reinterpret_cast((platform)()), 0 }; - context = cl::Context(CL_DEVICE_TYPE_ALL, props, nullptr, nullptr, &err); } @@ -276,7 +260,6 @@ string OpenCLInfo::DumpInfo() const { ostringstream os; vector sizes; - os.imbue(locale("")); for (size_t platform = 0; platform < m_Platforms.size(); platform++) @@ -294,17 +277,14 @@ string OpenCLInfo::DumpInfo() const os << "CL_DEVICE_MAX_WRITE_IMAGE_ARGS: " << GetInfo(platform, device, CL_DEVICE_MAX_WRITE_IMAGE_ARGS) << endl; os << "CL_DEVICE_MAX_MEM_ALLOC_SIZE: " << GetInfo(platform, device, CL_DEVICE_MAX_MEM_ALLOC_SIZE) << endl; os << "CL_DEVICE_ADDRESS_BITS: " << GetInfo(platform, device, CL_DEVICE_ADDRESS_BITS) << endl; - os << "CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: " << GetInfo(platform, device, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE) << endl; os << "CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: " << GetInfo(platform, device, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE) << endl; os << "CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: " << GetInfo(platform, device, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE) << endl; os << "CL_DEVICE_GLOBAL_MEM_SIZE: " << GetInfo(platform, device, CL_DEVICE_GLOBAL_MEM_SIZE) << endl; os << "CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: " << GetInfo(platform, device, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE) << endl; - os << "CL_DEVICE_MAX_CONSTANT_ARGS: " << GetInfo(platform, device, CL_DEVICE_MAX_CONSTANT_ARGS) << endl; os << "CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: " << GetInfo(platform, device, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS) << endl; os << "CL_DEVICE_MAX_WORK_GROUP_SIZE: " << GetInfo(platform, device, CL_DEVICE_MAX_WORK_GROUP_SIZE) << endl; - sizes = GetInfo>(platform, device, CL_DEVICE_MAX_WORK_ITEM_SIZES); os << "CL_DEVICE_MAX_WORK_ITEM_SIZES: " << sizes[0] << ", " << sizes[1] << ", " << sizes[2] << endl << endl; @@ -346,55 +326,105 @@ string OpenCLInfo::ErrorToStringCL(cl_int err) switch (err) { case CL_SUCCESS: return "Success"; + case CL_DEVICE_NOT_FOUND: return "Device not found"; + case CL_DEVICE_NOT_AVAILABLE: return "Device not available"; + case CL_COMPILER_NOT_AVAILABLE: return "Compiler not available"; + case CL_MEM_OBJECT_ALLOCATION_FAILURE: return "Memory object allocation failure"; + case CL_OUT_OF_RESOURCES: return "Out of resources"; + case CL_OUT_OF_HOST_MEMORY: return "Out of host memory"; + case CL_PROFILING_INFO_NOT_AVAILABLE: return "Profiling information not available"; + case CL_MEM_COPY_OVERLAP: return "Memory copy overlap"; + case CL_IMAGE_FORMAT_MISMATCH: return "Image format mismatch"; + case CL_IMAGE_FORMAT_NOT_SUPPORTED: return "Image format not supported"; + case CL_BUILD_PROGRAM_FAILURE: return "Program build failure"; + case CL_MAP_FAILURE: return "Map failure"; + case CL_MISALIGNED_SUB_BUFFER_OFFSET: return "Misaligned sub buffer offset"; + case CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST: return "Exec status error for events in wait list"; + case CL_INVALID_VALUE: return "Invalid value"; + case CL_INVALID_DEVICE_TYPE: return "Invalid device type"; + case CL_INVALID_PLATFORM: return "Invalid platform"; + case CL_INVALID_DEVICE: return "Invalid device"; + case CL_INVALID_CONTEXT: return "Invalid context"; + case CL_INVALID_QUEUE_PROPERTIES: return "Invalid queue properties"; + case CL_INVALID_COMMAND_QUEUE: return "Invalid command queue"; + case CL_INVALID_HOST_PTR: return "Invalid host pointer"; + case CL_INVALID_MEM_OBJECT: return "Invalid memory object"; + case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return "Invalid image format descriptor"; + case CL_INVALID_IMAGE_SIZE: return "Invalid image size"; + case CL_INVALID_SAMPLER: return "Invalid sampler"; + case CL_INVALID_BINARY: return "Invalid binary"; + case CL_INVALID_BUILD_OPTIONS: return "Invalid build options"; + case CL_INVALID_PROGRAM: return "Invalid program"; + case CL_INVALID_PROGRAM_EXECUTABLE: return "Invalid program executable"; + case CL_INVALID_KERNEL_NAME: return "Invalid kernel name"; + case CL_INVALID_KERNEL_DEFINITION: return "Invalid kernel definition"; + case CL_INVALID_KERNEL: return "Invalid kernel"; + case CL_INVALID_ARG_INDEX: return "Invalid argument index"; + case CL_INVALID_ARG_VALUE: return "Invalid argument value"; + case CL_INVALID_ARG_SIZE: return "Invalid argument size"; + case CL_INVALID_KERNEL_ARGS: return "Invalid kernel arguments"; + case CL_INVALID_WORK_DIMENSION: return "Invalid work dimension"; + case CL_INVALID_WORK_GROUP_SIZE: return "Invalid work group size"; + case CL_INVALID_WORK_ITEM_SIZE: return "Invalid work item size"; + case CL_INVALID_GLOBAL_OFFSET: return "Invalid global offset"; + case CL_INVALID_EVENT_WAIT_LIST: return "Invalid event wait list"; + case CL_INVALID_EVENT: return "Invalid event"; + case CL_INVALID_OPERATION: return "Invalid operation"; + case CL_INVALID_GL_OBJECT: return "Invalid OpenGL object"; + case CL_INVALID_BUFFER_SIZE: return "Invalid buffer size"; + case CL_INVALID_MIP_LEVEL: return "Invalid mip-map level"; + case CL_INVALID_GLOBAL_WORK_SIZE: return "Invalid global work size"; + case CL_INVALID_PROPERTY: return "Invalid property"; + default: { ostringstream ss; @@ -403,4 +433,4 @@ string OpenCLInfo::ErrorToStringCL(cl_int err) } } } -} +} \ No newline at end of file diff --git a/Source/EmberCL/OpenCLInfo.h b/Source/EmberCL/OpenCLInfo.h index eceedb0..8430303 100644 --- a/Source/EmberCL/OpenCLInfo.h +++ b/Source/EmberCL/OpenCLInfo.h @@ -17,10 +17,9 @@ namespace EmberCLns /// This class derives from EmberReport, so the caller is able /// to retrieve a text dump of error information if any errors occur. /// -class EMBERCL_API OpenCLInfo : public EmberReport +class EMBERCL_API OpenCLInfo : public EmberReport, public Singleton { public: - static OpenCLInfo& Instance(); const vector& Platforms() const; const string& PlatformName(size_t platform) const; const vector& PlatformNames() const; @@ -55,6 +54,8 @@ public: return val; } + SINGLETON_DERIVED_IMPL(OpenCLInfo); + private: OpenCLInfo(); diff --git a/Source/EmberCL/OpenCLWrapper.cpp b/Source/EmberCL/OpenCLWrapper.cpp index 69847ea..6ed2e07 100644 --- a/Source/EmberCL/OpenCLWrapper.cpp +++ b/Source/EmberCL/OpenCLWrapper.cpp @@ -9,19 +9,18 @@ namespace EmberCLns /// global OpenCLInfo object. The caller must explicitly do it. /// OpenCLWrapper::OpenCLWrapper() - : m_Info(OpenCLInfo::Instance()) { m_Init = false; m_Shared = false; m_PlatformIndex = 0; m_DeviceIndex = 0; m_LocalMemSize = 0; - //Pre-allocate some space to avoid temporary copying. m_Programs.reserve(4); m_Buffers.reserve(4); m_Images.reserve(4); m_GLImages.reserve(4); + m_Info = OpenCLInfo::Instance(); } /// @@ -35,25 +34,24 @@ OpenCLWrapper::OpenCLWrapper() bool OpenCLWrapper::Init(size_t platformIndex, size_t deviceIndex, bool shared) { cl_int err; - auto& platforms = m_Info.Platforms(); - auto& devices = m_Info.Devices(); - + auto& platforms = m_Info->Platforms(); + auto& devices = m_Info->Devices(); m_Init = false; ClearErrorReport(); - - if (m_Info.Ok()) + + if (m_Info->Ok()) { if (platformIndex < platforms.size() && platformIndex < devices.size()) { cl::Context context; - if (m_Info.CreateContext(platforms[platformIndex], context, shared))//Platform index is within range, now do context. + if (m_Info->CreateContext(platforms[platformIndex], context, shared))//Platform index is within range, now do context. { if (deviceIndex < devices[platformIndex].size())//Context is ok, now do device. { auto q = cl::CommandQueue(context, devices[platformIndex][deviceIndex], 0, &err);//At least one GPU device is present, so create a command queue. - if (m_Info.CheckCL(err, "cl::CommandQueue()"))//Everything was successful so assign temporaries to members. + if (m_Info->CheckCL(err, "cl::CommandQueue()"))//Everything was successful so assign temporaries to members. { m_Platform = platforms[platformIndex]; m_Device = devices[platformIndex][deviceIndex]; @@ -63,9 +61,9 @@ bool OpenCLWrapper::Init(size_t platformIndex, size_t deviceIndex, bool shared) m_DeviceIndex = deviceIndex; m_DeviceVec.clear(); m_DeviceVec.push_back(m_Device); - m_LocalMemSize = size_t(m_Info.GetInfo(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_LOCAL_MEM_SIZE)); - m_GlobalMemSize = size_t(m_Info.GetInfo(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_GLOBAL_MEM_SIZE)); - m_MaxAllocSize = size_t(m_Info.GetInfo(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_MAX_MEM_ALLOC_SIZE)); + m_LocalMemSize = size_t(m_Info->GetInfo(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_LOCAL_MEM_SIZE)); + m_GlobalMemSize = size_t(m_Info->GetInfo(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_GLOBAL_MEM_SIZE)); + m_MaxAllocSize = size_t(m_Info->GetInfo(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_MAX_MEM_ALLOC_SIZE)); m_Shared = shared; m_Init = true;//Command queue is ok, it's now ok to begin building and running programs. } @@ -139,28 +137,25 @@ bool OpenCLWrapper::AddBuffer(const string& name, size_t size, cl_mem_flags flag { cl::Buffer buff(m_Context, flags, size, nullptr, &err); - if (!m_Info.CheckCL(err, "cl::Buffer()")) + if (!m_Info->CheckCL(err, "cl::Buffer()")) return false; NamedBuffer nb(buff, name); - m_Buffers.push_back(nb); } else if (GetBufferSize(bufferIndex) != size)//If it did exist, only create and add if the sizes were different. { m_Buffers[bufferIndex] = NamedBuffer(cl::Buffer(m_Context, flags, 0, nullptr, &err), "emptybuffer");//First clear out the original so the two don't exist in memory at once. - cl::Buffer buff(m_Context, flags, size, nullptr, &err);//Create the new buffer. - if (!m_Info.CheckCL(err, "cl::Buffer()")) + if (!m_Info->CheckCL(err, "cl::Buffer()")) return false; NamedBuffer nb(buff, name);//Make a named buffer out of the new buffer. - m_Buffers[bufferIndex] = nb;//Finally, assign. } - //If the buffer existed and the sizes were the same, take no action. + //If the buffer existed and the sizes were the same, take no action. return true; } @@ -199,7 +194,6 @@ bool OpenCLWrapper::AddAndWriteBuffer(const string& name, void* data, size_t siz bool OpenCLWrapper::WriteBuffer(const string& name, void* data, size_t size) { int bufferIndex = FindBufferIndex(name); - return bufferIndex != -1 ? WriteBuffer(bufferIndex, data, size) : false; } @@ -216,11 +210,10 @@ bool OpenCLWrapper::WriteBuffer(size_t bufferIndex, void* data, size_t size) { cl::Event e; cl_int err = m_Queue.enqueueWriteBuffer(m_Buffers[bufferIndex].m_Buffer, CL_TRUE, 0, size, data, nullptr, &e); - e.wait(); m_Queue.finish(); - if (m_Info.CheckCL(err, "cl::CommandQueue::enqueueWriteBuffer()")) + if (m_Info->CheckCL(err, "cl::CommandQueue::enqueueWriteBuffer()")) return true; } @@ -237,7 +230,6 @@ bool OpenCLWrapper::WriteBuffer(size_t bufferIndex, void* data, size_t size) bool OpenCLWrapper::ReadBuffer(const string& name, void* data, size_t size) { int bufferIndex = FindBufferIndex(name); - return bufferIndex != -1 ? ReadBuffer(bufferIndex, data, size) : false; } @@ -254,11 +246,10 @@ bool OpenCLWrapper::ReadBuffer(size_t bufferIndex, void* data, size_t size) { cl::Event e; cl_int err = m_Queue.enqueueReadBuffer(m_Buffers[bufferIndex].m_Buffer, CL_TRUE, 0, size, data, nullptr, &e); - e.wait(); m_Queue.finish(); - if (m_Info.CheckCL(err, "cl::CommandQueue::enqueueReadBuffer()")) + if (m_Info->CheckCL(err, "cl::CommandQueue::enqueueReadBuffer()")) return true; } @@ -287,7 +278,6 @@ int OpenCLWrapper::FindBufferIndex(const string& name) size_t OpenCLWrapper::GetBufferSize(const string& name) { int bufferIndex = FindBufferIndex(name); - return bufferIndex != -1 ? GetBufferSize(bufferIndex) : 0; } @@ -345,7 +335,7 @@ bool OpenCLWrapper::AddAndWriteImage(const string& name, cl_mem_flags flags, con IMAGEGL2D imageGL(m_Context, flags, GL_TEXTURE_2D, 0, texName, &err); NamedImage2DGL namedImageGL(imageGL, name); - if (m_Info.CheckCL(err, "cl::ImageGL()")) + if (m_Info->CheckCL(err, "cl::ImageGL()")) { m_GLImages.push_back(namedImageGL); @@ -359,7 +349,7 @@ bool OpenCLWrapper::AddAndWriteImage(const string& name, cl_mem_flags flags, con { NamedImage2D namedImage(cl::Image2D(m_Context, flags, format, width, height, row_pitch, data, &err), name); - if (m_Info.CheckCL(err, "cl::Image2D()")) + if (m_Info->CheckCL(err, "cl::Image2D()")) { m_Images.push_back(namedImage); return true; @@ -376,7 +366,7 @@ bool OpenCLWrapper::AddAndWriteImage(const string& name, cl_mem_flags flags, con { NamedImage2DGL namedImageGL(IMAGEGL2D(m_Context, flags, GL_TEXTURE_2D, 0, texName, &err), name);//Sizes are different, so create new. - if (m_Info.CheckCL(err, "cl::ImageGL()")) + if (m_Info->CheckCL(err, "cl::ImageGL()")) { m_GLImages[imageIndex] = namedImageGL; } @@ -395,10 +385,9 @@ bool OpenCLWrapper::AddAndWriteImage(const string& name, cl_mem_flags flags, con if (!CompareImageParams(m_Images[imageIndex].m_Image, flags, format, width, height, row_pitch)) { m_Images[imageIndex] = NamedImage2D();//First clear out the original so the two don't exist in memory at once. - NamedImage2D namedImage(cl::Image2D(m_Context, flags, format, width, height, row_pitch, data, &err), name); - if (m_Info.CheckCL(err, "cl::Image2D()")) + if (m_Info->CheckCL(err, "cl::Image2D()")) { m_Images[imageIndex] = namedImage; return true; @@ -432,11 +421,9 @@ bool OpenCLWrapper::WriteImage2D(size_t index, bool shared, ::size_t width, ::si cl_int err; cl::Event e; cl::size_t<3> origin, region; - origin[0] = 0; origin[1] = 0; origin[2] = 0; - region[0] = width; region[1] = height; region[2] = 1; @@ -450,9 +437,8 @@ bool OpenCLWrapper::WriteImage2D(size_t index, bool shared, ::size_t width, ::si err = m_Queue.enqueueWriteImage(imageGL, CL_TRUE, origin, region, row_pitch, 0, data, nullptr, &e); e.wait(); m_Queue.finish(); - bool b = EnqueueReleaseGLObjects(imageGL); - return m_Info.CheckCL(err, "cl::enqueueWriteImage()") && b; + return m_Info->CheckCL(err, "cl::enqueueWriteImage()") && b; } } else if (!shared && index < m_Images.size()) @@ -460,7 +446,7 @@ bool OpenCLWrapper::WriteImage2D(size_t index, bool shared, ::size_t width, ::si err = m_Queue.enqueueWriteImage(m_Images[index].m_Image, CL_TRUE, origin, region, row_pitch, 0, data, nullptr, &e); e.wait(); m_Queue.finish(); - return m_Info.CheckCL(err, "cl::enqueueWriteImage()"); + return m_Info->CheckCL(err, "cl::enqueueWriteImage()"); } } @@ -507,11 +493,9 @@ bool OpenCLWrapper::ReadImage(size_t imageIndex, ::size_t width, ::size_t height cl_int err; cl::Event e; cl::size_t<3> origin, region; - origin[0] = 0; origin[1] = 0; origin[2] = 0; - region[0] = width; region[1] = height; region[2] = 1; @@ -524,13 +508,13 @@ bool OpenCLWrapper::ReadImage(size_t imageIndex, ::size_t width, ::size_t height { err = m_Queue.enqueueReadImage(m_GLImages[imageIndex].m_Image, true, origin, region, row_pitch, 0, data); bool b = EnqueueReleaseGLObjects(m_GLImages[imageIndex].m_Image); - return m_Info.CheckCL(err, "cl::enqueueReadImage()") && b; + return m_Info->CheckCL(err, "cl::enqueueReadImage()") && b; } } else if (!shared && imageIndex < m_Images.size()) { err = m_Queue.enqueueReadImage(m_Images[imageIndex].m_Image, true, origin, region, row_pitch, 0, data); - return m_Info.CheckCL(err, "cl::enqueueReadImage()"); + return m_Info->CheckCL(err, "cl::enqueueReadImage()"); } } @@ -588,7 +572,6 @@ size_t OpenCLWrapper::GetImageSize(size_t imageIndex, bool shared) if (shared && imageIndex < m_GLImages.size()) { vector images; - images.push_back(m_GLImages[imageIndex].m_Image); IMAGEGL2D image = m_GLImages[imageIndex].m_Image; @@ -620,12 +603,11 @@ size_t OpenCLWrapper::GetImageSize(size_t imageIndex, bool shared) bool OpenCLWrapper::CompareImageParams(cl::Image& image, cl_mem_flags flags, const cl::ImageFormat& format, ::size_t width, ::size_t height, ::size_t row_pitch) { cl_image_format tempFormat = image.getImageInfo(nullptr); - return (/*image.getImageInfo() == flags &&*/ - tempFormat.image_channel_data_type == format.image_channel_data_type && - tempFormat.image_channel_order == format.image_channel_order && - image.getImageInfo(nullptr) == width && - image.getImageInfo(nullptr) == height/* && + tempFormat.image_channel_data_type == format.image_channel_data_type && + tempFormat.image_channel_order == format.image_channel_order && + image.getImageInfo(nullptr) == width && + image.getImageInfo(nullptr) == height/* && image.getImageInfo() == row_pitch*/);//Pitch will be (width * bytes per pixel) + padding. } @@ -657,17 +639,15 @@ bool OpenCLWrapper::CreateImage2D(cl::Image2D& image2D, cl_mem_flags flags, cl:: if (m_Init) { cl_int err; - image2D = cl::Image2D(m_Context, - flags, - format, - width, - height, - row_pitch, - data, - &err); - - return m_Info.CheckCL(err, "cl::Image2D()"); + flags, + format, + width, + height, + row_pitch, + data, + &err); + return m_Info->CheckCL(err, "cl::Image2D()"); } return false; @@ -687,15 +667,13 @@ bool OpenCLWrapper::CreateImage2DGL(IMAGEGL2D& image2DGL, cl_mem_flags flags, GL if (m_Init) { cl_int err; - image2DGL = IMAGEGL2D(m_Context, - flags, - target, - miplevel, - texobj, - &err); - - return m_Info.CheckCL(err, "cl::ImageGL()"); + flags, + target, + miplevel, + texobj, + &err); + return m_Info->CheckCL(err, "cl::ImageGL()"); } return false; @@ -726,11 +704,10 @@ bool OpenCLWrapper::EnqueueAcquireGLObjects(IMAGEGL2D& image) if (m_Init && m_Shared) { vector images; - images.push_back(image); cl_int err = m_Queue.enqueueAcquireGLObjects(&images); m_Queue.finish(); - return m_Info.CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()"); + return m_Info->CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()"); } return false; @@ -761,11 +738,10 @@ bool OpenCLWrapper::EnqueueReleaseGLObjects(IMAGEGL2D& image) if (m_Init && m_Shared) { vector images; - images.push_back(image); cl_int err = m_Queue.enqueueReleaseGLObjects(&images); m_Queue.finish(); - return m_Info.CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()"); + return m_Info->CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()"); } return false; @@ -781,9 +757,8 @@ bool OpenCLWrapper::EnqueueAcquireGLObjects(const VECTOR_CLASS* memO if (m_Init && m_Shared) { cl_int err = m_Queue.enqueueAcquireGLObjects(memObjects); - m_Queue.finish(); - return m_Info.CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()"); + return m_Info->CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()"); } return false; @@ -799,9 +774,8 @@ bool OpenCLWrapper::EnqueueReleaseGLObjects(const VECTOR_CLASS* memO if (m_Init && m_Shared) { cl_int err = m_Queue.enqueueReleaseGLObjects(memObjects); - m_Queue.finish(); - return m_Info.CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()"); + return m_Info->CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()"); } return false; @@ -818,14 +792,12 @@ bool OpenCLWrapper::EnqueueReleaseGLObjects(const VECTOR_CLASS* memO bool OpenCLWrapper::CreateSampler(cl::Sampler& sampler, cl_bool normalizedCoords, cl_addressing_mode addressingMode, cl_filter_mode filterMode) { cl_int err; - sampler = cl::Sampler(m_Context, - normalizedCoords, - addressingMode, - filterMode, - &err); - - return m_Info.CheckCL(err, "cl::Sampler()"); + normalizedCoords, + addressingMode, + filterMode, + &err); + return m_Info->CheckCL(err, "cl::Sampler()"); } /// @@ -839,7 +811,6 @@ bool OpenCLWrapper::CreateSampler(cl::Sampler& sampler, cl_bool normalizedCoords bool OpenCLWrapper::SetBufferArg(size_t kernelIndex, cl_uint argIndex, const string& name) { int bufferIndex = OpenCLWrapper::FindBufferIndex(name); - return bufferIndex != -1 ? SetBufferArg(kernelIndex, argIndex, bufferIndex) : false; } @@ -897,12 +868,12 @@ bool OpenCLWrapper::SetImageArg(size_t kernelIndex, cl_uint argIndex, bool share if (shared && imageIndex < m_GLImages.size()) { err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, m_GLImages[imageIndex].m_Image); - return m_Info.CheckCL(err, "cl::Kernel::setArg()"); + return m_Info->CheckCL(err, "cl::Kernel::setArg()"); } else if (!shared && imageIndex < m_Images.size()) { err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, m_Images[imageIndex].m_Image); - return m_Info.CheckCL(err, "cl::Kernel::setArg()"); + return m_Info->CheckCL(err, "cl::Kernel::setArg()"); } } @@ -935,21 +906,20 @@ int OpenCLWrapper::FindKernelIndex(const string& name) /// Depth of each block /// True if success, else false. bool OpenCLWrapper::RunKernel(size_t kernelIndex, size_t totalGridWidth, size_t totalGridHeight, size_t totalGridDepth, - size_t blockWidth, size_t blockHeight, size_t blockDepth) + size_t blockWidth, size_t blockHeight, size_t blockDepth) { if (m_Init && kernelIndex < m_Programs.size()) { cl::Event e; cl_int err = m_Queue.enqueueNDRangeKernel(m_Programs[kernelIndex].m_Kernel, - cl::NullRange, - cl::NDRange(totalGridWidth, totalGridHeight, totalGridDepth), - cl::NDRange(blockWidth, blockHeight, blockDepth), - nullptr, - &e); - + cl::NullRange, + cl::NDRange(totalGridWidth, totalGridHeight, totalGridDepth), + cl::NDRange(blockWidth, blockHeight, blockDepth), + nullptr, + &e); e.wait(); m_Queue.finish(); - return m_Info.CheckCL(err, "cl::CommandQueue::enqueueNDRangeKernel()"); + return m_Info->CheckCL(err, "cl::CommandQueue::enqueueNDRangeKernel()"); } return false; @@ -963,7 +933,7 @@ bool OpenCLWrapper::Shared() const { return m_Shared; } const cl::Context& OpenCLWrapper::Context() const { return m_Context; } size_t OpenCLWrapper::PlatformIndex() const { return m_PlatformIndex; } size_t OpenCLWrapper::DeviceIndex() const { return m_DeviceIndex; } -const string& OpenCLWrapper::DeviceName() const { return m_Info.DeviceName(m_PlatformIndex, m_DeviceIndex); } +const string& OpenCLWrapper::DeviceName() const { return m_Info->DeviceName(m_PlatformIndex, m_DeviceIndex); } size_t OpenCLWrapper::LocalMemSize() const { return m_LocalMemSize; } size_t OpenCLWrapper::GlobalMemSize() const { return m_GlobalMemSize; } size_t OpenCLWrapper::MaxAllocSize() const { return m_MaxAllocSize; } @@ -997,7 +967,6 @@ bool OpenCLWrapper::CreateSPK(const string& name, const string& program, const s if (m_Init) { cl_int err; - spk.m_Name = name; spk.m_Source = cl::Program::Sources(1, std::make_pair(program.c_str(), program.length() + 1)); spk.m_Program = cl::Program(m_Context, spk.m_Source); @@ -1006,17 +975,18 @@ bool OpenCLWrapper::CreateSPK(const string& name, const string& program, const s err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable");//Tinker with other options later. else err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-no-signed-zeros -cl-single-precision-constant"); - //err = spk.m_Program.build(m_DeviceVec, "-cl-single-precision-constant"); - //err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-single-precision-constant"); - //err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-no-signed-zeros -cl-fast-relaxed-math -cl-single-precision-constant");//This can cause some rounding. - //err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-single-precision-constant"); - if (m_Info.CheckCL(err, "cl::Program::build()")) + //err = spk.m_Program.build(m_DeviceVec, "-cl-single-precision-constant"); + //err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-single-precision-constant"); + //err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-no-signed-zeros -cl-fast-relaxed-math -cl-single-precision-constant");//This can cause some rounding. + //err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable -cl-single-precision-constant"); + + if (m_Info->CheckCL(err, "cl::Program::build()")) { //Building of program is ok, now create kernel with the specified entry point. spk.m_Kernel = cl::Kernel(spk.m_Program, entryPoint.c_str(), &err); - if (m_Info.CheckCL(err, "cl::Kernel()")) + if (m_Info->CheckCL(err, "cl::Kernel()")) return true;//Everything is ok. } else diff --git a/Source/EmberCL/OpenCLWrapper.h b/Source/EmberCL/OpenCLWrapper.h index 4a2659a..f1a4101 100644 --- a/Source/EmberCL/OpenCLWrapper.h +++ b/Source/EmberCL/OpenCLWrapper.h @@ -9,11 +9,7 @@ namespace EmberCLns { -#if CL_VERSION_1_2 #define IMAGEGL2D cl::ImageGL -#else -#define IMAGEGL2D cl::Image2DGL -#endif /// /// Class to contain all of the things needed to store an OpenCL program. @@ -162,8 +158,7 @@ public: if (m_Init && kernelIndex < m_Programs.size()) { cl_int err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, arg); - - return m_Info.CheckCL(err, "cl::Kernel::setArg()"); + return m_Info->CheckCL(err, "cl::Kernel::setArg()"); } return false; @@ -201,7 +196,7 @@ private: cl::Context m_Context; cl::Device m_Device; cl::CommandQueue m_Queue; - OpenCLInfo& m_Info; + shared_ptr m_Info; std::vector m_DeviceVec; std::vector m_Programs; std::vector m_Buffers; diff --git a/Source/EmberCL/RendererCL.cpp b/Source/EmberCL/RendererCL.cpp index fd47508..2654653 100644 --- a/Source/EmberCL/RendererCL.cpp +++ b/Source/EmberCL/RendererCL.cpp @@ -41,11 +41,11 @@ void RendererCL::Init() m_Init = false; m_DoublePrecision = typeid(T) == typeid(double); m_NumChannels = 4; - //Buffer names. m_EmberBufferName = "Ember"; m_XformsBufferName = "Xforms"; m_ParVarsBufferName = "ParVars"; + m_GlobalSharedBufferName = "GlobalShared"; m_SeedsBufferName = "Seeds"; m_DistBufferName = "Dist"; m_CarToRasBufferName = "CarToRas"; @@ -60,7 +60,6 @@ void RendererCL::Init() m_AccumBufferName = "Accum"; m_FinalImageName = "Final"; m_PointsBufferName = "Points"; - //It's critical that these numbers never change. They are //based on the cuburn model of each kernel launch containing //256 threads. 32 wide by 8 high. Everything done in the OpenCL @@ -70,7 +69,6 @@ void RendererCL::Init() m_IterBlockHeight = 8; m_IterBlocksWide = 64; m_IterBlocksHigh = 2; - m_PaletteFormat.image_channel_order = CL_RGBA; m_PaletteFormat.image_channel_data_type = CL_FLOAT; m_FinalFormat.image_channel_order = CL_RGBA; @@ -111,11 +109,11 @@ bool RendererCL::Init(const vector>& devices, b auto& zeroizeProgram = m_IterOpenCLKernelCreator.ZeroizeKernel(); auto& sumHistProgram = m_IterOpenCLKernelCreator.SumHistKernel(); ostringstream os; - m_Init = false; m_Devices.clear(); m_Devices.reserve(devices.size()); m_OutputTexID = outputTexID; + m_GlobalShared.second.resize(16);//Dummy data until a real alloc is needed. for (size_t i = 0; i < devices.size(); i++) { @@ -126,8 +124,11 @@ bool RendererCL::Init(const vector>& devices, b if ((b = cld->Init()))//Build a simple program to ensure OpenCL is working right. { if (b && !(b = cld->m_Wrapper.AddProgram(m_IterOpenCLKernelCreator.ZeroizeEntryPoint(), zeroizeProgram, m_IterOpenCLKernelCreator.ZeroizeEntryPoint(), m_DoublePrecision))) { AddToReport(loc); } + if (b && !(b = cld->m_Wrapper.AddAndWriteImage("Palette", CL_MEM_READ_ONLY, m_PaletteFormat, 256, 1, 0, nullptr))) { AddToReport(loc); } + if (b && !(b = cld->m_Wrapper.AddAndWriteBuffer(m_GlobalSharedBufferName, m_GlobalShared.second.data(), m_GlobalShared.second.size() * sizeof(m_GlobalShared.second[0])))) { AddToReport(loc); }//Empty at start, will be filled in later if needed. + if (b) { m_Devices.push_back(std::move(cld));//Success, so move to the vector, else it will go out of scope and be deleted. @@ -156,9 +157,10 @@ bool RendererCL::Init(const vector>& devices, b { auto& firstWrapper = m_Devices[0]->m_Wrapper; m_DEOpenCLKernelCreator = DEOpenCLKernelCreator(m_DoublePrecision, m_Devices[0]->Nvidia()); - + //Build a simple program to ensure OpenCL is working right. if (b && !(b = firstWrapper.AddProgram(m_DEOpenCLKernelCreator.LogScaleAssignDEEntryPoint(), m_DEOpenCLKernelCreator.LogScaleAssignDEKernel(), m_DEOpenCLKernelCreator.LogScaleAssignDEEntryPoint(), m_DoublePrecision))) { AddToReport(loc); } + if (b && !(b = firstWrapper.AddProgram(m_IterOpenCLKernelCreator.SumHistEntryPoint(), sumHistProgram, m_IterOpenCLKernelCreator.SumHistEntryPoint(), m_DoublePrecision))) { AddToReport(loc); } if (b) @@ -170,7 +172,6 @@ bool RendererCL::Init(const vector>& devices, b //AMD is further limited because of less local memory so these have to be 16 on AMD. m_MaxDEBlockSizeW = m_Devices[0]->Nvidia() ? 24 : 16;//These *must* both be divisible by 8 or else pixels will go missing. m_MaxDEBlockSizeH = m_Devices[0]->Nvidia() ? 24 : 16; - FillSeeds(); for (size_t device = 0; device < m_Devices.size(); device++) @@ -533,7 +534,9 @@ bool RendererCL::CreateDEFilter(bool& newAlloc) auto& wrapper = m_Devices[0]->m_Wrapper; if (b && !(b = wrapper.AddAndWriteBuffer(m_DECoefsBufferName, reinterpret_cast(const_cast(m_DensityFilter->Coefs())), m_DensityFilter->CoefsSizeBytes()))) { AddToReport(loc); } + if (b && !(b = wrapper.AddAndWriteBuffer(m_DEWidthsBufferName, reinterpret_cast(const_cast(m_DensityFilter->Widths())), m_DensityFilter->WidthsSizeBytes()))) { AddToReport(loc); } + if (b && !(b = wrapper.AddAndWriteBuffer(m_DECoefIndicesBufferName, reinterpret_cast(const_cast(m_DensityFilter->CoefIndices())), m_DensityFilter->CoefsIndicesSizeBytes()))) { AddToReport(loc); } } } @@ -606,7 +609,7 @@ vector RendererCL::ErrorReport() auto s = device->m_Wrapper.ErrorReport(); ours.insert(ours.end(), s.begin(), s.end()); } - + return ours; } @@ -655,28 +658,37 @@ bool RendererCL::Alloc(bool histOnly) EnterResize(); m_XformsCL.resize(m_Ember.TotalXformCount()); - bool b = true; size_t histLength = SuperSize() * sizeof(v4bT); size_t accumLength = SuperSize() * sizeof(v4bT); const char* loc = __FUNCTION__; - auto& wrapper = m_Devices[0]->m_Wrapper; if (b && !(b = wrapper.AddBuffer(m_DEFilterParamsBufferName, sizeof(m_DensityFilterCL)))) { AddToReport(loc); } + if (b && !(b = wrapper.AddBuffer(m_SpatialFilterParamsBufferName, sizeof(m_SpatialFilterCL)))) { AddToReport(loc); } + if (b && !(b = wrapper.AddBuffer(m_CurvesCsaName, SizeOf(m_Csa.m_Entries)))) { AddToReport(loc); } + if (b && !(b = wrapper.AddBuffer(m_AccumBufferName, accumLength))) { AddToReport(loc); }//Accum buffer. for (auto& device : m_Devices) { if (b && !(b = device->m_Wrapper.AddBuffer(m_EmberBufferName, sizeof(m_EmberCL)))) { AddToReport(loc); break; } + if (b && !(b = device->m_Wrapper.AddBuffer(m_XformsBufferName, SizeOf(m_XformsCL)))) { AddToReport(loc); break; } + if (b && !(b = device->m_Wrapper.AddBuffer(m_ParVarsBufferName, 128 * sizeof(T)))) { AddToReport(loc); break; } + if (b && !(b = device->m_Wrapper.AddBuffer(m_DistBufferName, CHOOSE_XFORM_GRAIN))) { AddToReport(loc); break; }//Will be resized for xaos. + if (b && !(b = device->m_Wrapper.AddBuffer(m_CarToRasBufferName, sizeof(m_CarToRasCL)))) { AddToReport(loc); break; } + if (b && !(b = device->m_Wrapper.AddBuffer(m_HistBufferName, histLength))) { AddToReport(loc); break; }//Histogram. Will memset to zero later. + if (b && !(b = device->m_Wrapper.AddBuffer(m_PointsBufferName, IterGridKernelCount() * sizeof(PointCL)))) { AddToReport(loc); break; }//Points between iter calls. + + //Global shared is allocated once and written when building the kernel. } LeaveResize(); @@ -739,12 +751,9 @@ eRenderStatus RendererCL::GaussianDensityFilter() //} //else // return RENDER_ERROR; - //Timing t(4); - eRenderStatus status = RunDensityFilter(); //t.Toc(__FUNCTION__ " RunKernel()"); - return status; } @@ -802,36 +811,41 @@ EmberStats RendererCL::Iterate(size_t iterCount, size_t temporalSamp if (IterOpenCLKernelCreator::IsBuildRequired(m_Ember, m_LastBuiltEmber)) b = BuildIterProgramForEmber(true); - //Setup buffers on all devices. - for (auto& device : m_Devices) + if (b) { - auto& wrapper = device->m_Wrapper; - - if (b && !(b = wrapper.WriteBuffer (m_EmberBufferName, reinterpret_cast(&m_EmberCL), sizeof(m_EmberCL)))) { AddToReport(loc); } - if (b && !(b = wrapper.WriteBuffer (m_XformsBufferName, reinterpret_cast(m_XformsCL.data()), sizeof(m_XformsCL[0]) * m_XformsCL.size()))) { AddToReport(loc); } - if (b && !(b = wrapper.AddAndWriteBuffer(m_DistBufferName, reinterpret_cast(const_cast(XformDistributions())), XformDistributionsSize()))) { AddToReport(loc); }//Will be resized for xaos. - if (b && !(b = wrapper.WriteBuffer (m_CarToRasBufferName, reinterpret_cast(&m_CarToRasCL), sizeof(m_CarToRasCL)))) { AddToReport(loc); } - - if (b && !(b = wrapper.AddAndWriteImage("Palette", CL_MEM_READ_ONLY, m_PaletteFormat, m_Dmap.m_Entries.size(), 1, 0, m_Dmap.m_Entries.data()))) { AddToReport(loc); } - - if (b) + //Setup buffers on all devices. + for (auto& device : m_Devices) { - IterOpenCLKernelCreator::ParVarIndexDefines(m_Ember, m_Params, true, false);//Always do this to get the values (but no string), regardless of whether a rebuild is necessary. + auto& wrapper = device->m_Wrapper; - //Don't know the size of the parametric varations parameters buffer until the ember is examined. - //So set it up right before the run. - if (!m_Params.second.empty()) + if (b && !(b = wrapper.WriteBuffer(m_EmberBufferName, reinterpret_cast(&m_EmberCL), sizeof(m_EmberCL)))) + break; + + if (b && !(b = wrapper.WriteBuffer(m_XformsBufferName, reinterpret_cast(m_XformsCL.data()), sizeof(m_XformsCL[0]) * m_XformsCL.size()))) + break; + + if (b && !(b = wrapper.AddAndWriteBuffer(m_DistBufferName, reinterpret_cast(const_cast(XformDistributions())), XformDistributionsSize())))//Will be resized for xaos. + break; + + if (b && !(b = wrapper.WriteBuffer(m_CarToRasBufferName, reinterpret_cast(&m_CarToRasCL), sizeof(m_CarToRasCL)))) + break; + + if (b && !(b = wrapper.AddAndWriteImage("Palette", CL_MEM_READ_ONLY, m_PaletteFormat, m_Dmap.m_Entries.size(), 1, 0, m_Dmap.m_Entries.data()))) + break; + + if (b) { - if (!wrapper.AddAndWriteBuffer(m_ParVarsBufferName, m_Params.second.data(), m_Params.second.size() * sizeof(m_Params.second[0]))) - { - m_Abort = true; - AddToReport(loc); - return stats; - } + IterOpenCLKernelCreator::ParVarIndexDefines(m_Ember, m_Params, true, false);//Always do this to get the values (but no string), regardless of whether a rebuild is necessary. + + //Don't know the size of the parametric varations parameters buffer until the ember is examined. + //So set it up right before the run. + if (!m_Params.second.empty()) + if (!wrapper.AddAndWriteBuffer(m_ParVarsBufferName, m_Params.second.data(), m_Params.second.size() * sizeof(m_Params.second[0]))) + break; } + else + break; } - else - return stats; } } @@ -876,39 +890,53 @@ bool RendererCL::BuildIterProgramForEmber(bool doAccum) bool b = !m_Devices.empty(); const char* loc = __FUNCTION__; IterOpenCLKernelCreator::ParVarIndexDefines(m_Ember, m_Params, false, true);//Do with string and no vals. - m_IterKernel = m_IterOpenCLKernelCreator.CreateIterKernelString(m_Ember, m_Params.first, m_LockAccum, doAccum); - //cout << "Building: " << endl << iterProgram << endl; - vector threads; - std::function func = [&](RendererClDevice* dev) - { - if (!dev->m_Wrapper.AddProgram(m_IterOpenCLKernelCreator.IterEntryPoint(), m_IterKernel, m_IterOpenCLKernelCreator.IterEntryPoint(), m_DoublePrecision)) - { - m_ResizeCs.Enter();//Just use the resize CS for lack of a better one. - b = false; - AddToReport(string(loc) + "()\n" + dev->m_Wrapper.DeviceName() + ":\nBuilding the following program failed: \n" + m_IterKernel + "\n"); - m_ResizeCs.Leave(); - } - }; - - threads.reserve(m_Devices.size() - 1); - - for (size_t device = m_Devices.size() - 1; device >= 0 && device < m_Devices.size(); device--)//Check both extents because size_t will wrap. - { - if (!device)//Secondary devices on their own threads. - threads.push_back(std::thread([&](RendererClDevice* dev) { func(dev); }, m_Devices[device].get())); - else//Primary device on this thread. - func(m_Devices[device].get()); - } - - for (auto& th : threads) - if (th.joinable()) - th.join(); + IterOpenCLKernelCreator::SharedDataIndexDefines(m_Ember, m_GlobalShared, true, true);//Do with string and vals only once on build since it won't change until another build occurs. if (b) { - //t.Toc(__FUNCTION__ " program build"); - //cout << string(loc) << "():\nBuilding the following program succeeded: \n" << iterProgram << endl; - m_LastBuiltEmber = m_Ember; + m_IterKernel = m_IterOpenCLKernelCreator.CreateIterKernelString(m_Ember, m_Params.first, m_GlobalShared.first, m_LockAccum, doAccum); + //cout << "Building: " << endl << iterProgram << endl; + vector threads; + std::function func = [&](RendererClDevice * dev) + { + if (!dev->m_Wrapper.AddProgram(m_IterOpenCLKernelCreator.IterEntryPoint(), m_IterKernel, m_IterOpenCLKernelCreator.IterEntryPoint(), m_DoublePrecision)) + { + m_ResizeCs.Enter();//Just use the resize CS for lack of a better one. + b = false; + AddToReport(string(loc) + "()\n" + dev->m_Wrapper.DeviceName() + ":\nBuilding the following program failed: \n" + m_IterKernel + "\n"); + m_ResizeCs.Leave(); + } + else if (!m_GlobalShared.second.empty()) + { + if (!dev->m_Wrapper.AddAndWriteBuffer(m_GlobalSharedBufferName, m_GlobalShared.second.data(), m_GlobalShared.second.size() * sizeof(m_GlobalShared.second[0]))) + { + m_ResizeCs.Enter();//Just use the resize CS for lack of a better one. + b = false; + AddToReport(string(loc) + "()\n" + dev->m_Wrapper.DeviceName() + ":\nAdding global shared buffer failed.\n"); + m_ResizeCs.Leave(); + } + } + }; + threads.reserve(m_Devices.size() - 1); + + for (size_t device = m_Devices.size() - 1; device >= 0 && device < m_Devices.size(); device--)//Check both extents because size_t will wrap. + { + if (!device)//Secondary devices on their own threads. + threads.push_back(std::thread([&](RendererClDevice * dev) { func(dev); }, m_Devices[device].get())); + else//Primary device on this thread. + func(m_Devices[device].get()); + } + + for (auto& th : threads) + if (th.joinable()) + th.join(); + + if (b) + { + //t.Toc(__FUNCTION__ " program build"); + //cout << string(loc) << "():\nBuilding the following program succeeded: \n" << iterProgram << endl; + m_LastBuiltEmber = m_Ember; + } } return b; @@ -935,7 +963,6 @@ bool RendererCL::RunIter(size_t iterCount, size_t temporalSample, si std::atomic atomLaunchesRan; std::atomic atomItersRan, atomItersRemaining; size_t adjustedIterCountPerKernel = m_IterCountPerKernel; - itersRan = 0; atomItersRan.store(0); atomItersRemaining.store(iterCount); @@ -954,11 +981,9 @@ bool RendererCL::RunIter(size_t iterCount, size_t temporalSample, si } size_t fuseFreq = Renderer::SubBatchSize() / adjustedIterCountPerKernel;//Use the base sbs to determine when to fuse. - #ifdef TEST_CL m_Abort = false; #endif - std::function iterFunc = [&](size_t dev, int kernelIndex) { bool b = true; @@ -979,18 +1004,31 @@ bool RendererCL::RunIter(size_t iterCount, size_t temporalSample, si size_t iterCountThisLaunch = iterCountPerKernel * IterGridKernelWidth() * IterGridKernelHeight(); //cout << "itersRemaining " << itersRemaining << ", iterCountPerKernel " << iterCountPerKernel << ", iterCountThisLaunch " << iterCountThisLaunch << endl; - if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, iterCountPerKernel))) { AddToReport(loc); }//Number of iters for each thread to run. - if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, fuse))) { AddToReport(loc); }//Number of iters to fuse. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_SeedsBufferName))) { AddToReport(loc); }//Seeds. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_EmberBufferName))) { AddToReport(loc); }//Ember. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_XformsBufferName))) { AddToReport(loc); }//Xforms. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_ParVarsBufferName))) { AddToReport(loc); }//Parametric variation parameters. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_DistBufferName))) { AddToReport(loc); }//Xform distributions. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_CarToRasBufferName))) { AddToReport(loc); }//Coordinate converter. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_HistBufferName))) { AddToReport(loc); }//Histogram. - if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, histSuperSize))) { AddToReport(loc); }//Histogram size. - if (b && !(b = wrapper.SetImageArg (kernelIndex, argIndex++, false, "Palette"))) { AddToReport(loc); }//Palette. - if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_PointsBufferName))) { AddToReport(loc); }//Random start points. + if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, iterCountPerKernel))) { AddToReport(loc); }//Number of iters for each thread to run. + + if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, fuse))) { AddToReport(loc); }//Number of iters to fuse. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_SeedsBufferName))) { AddToReport(loc); }//Seeds. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_EmberBufferName))) { AddToReport(loc); }//Ember. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_XformsBufferName))) { AddToReport(loc); }//Xforms. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_ParVarsBufferName))) { AddToReport(loc); }//Parametric variation parameters. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_GlobalSharedBufferName))) { AddToReport(loc); }//Global shared data. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_DistBufferName))) { AddToReport(loc); }//Xform distributions. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_CarToRasBufferName))) { AddToReport(loc); }//Coordinate converter. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_HistBufferName))) { AddToReport(loc); }//Histogram. + + if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, histSuperSize))) { AddToReport(loc); }//Histogram size. + + if (b && !(b = wrapper.SetImageArg (kernelIndex, argIndex++, false, "Palette"))) { AddToReport(loc); }//Palette. + + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_PointsBufferName))) { AddToReport(loc); }//Random start points. if (b && !(b = wrapper.RunKernel(kernelIndex, IterGridKernelWidth(),//Total grid dims. @@ -1014,17 +1052,16 @@ bool RendererCL::RunIter(size_t iterCount, size_t temporalSample, si if (m_Callback && !dev)//Will only do callback on the first device, however it will report the progress of all devices. { double percent = 100.0 * - double - ( - double - ( - double - ( - double(m_LastIter + atomItersRan.load()) / double(ItersPerTemporalSample()) - ) + temporalSample - ) / double(TemporalSamples()) - ); - + double + ( + double + ( + double + ( + double(m_LastIter + atomItersRan.load()) / double(ItersPerTemporalSample()) + ) + temporalSample + ) / double(TemporalSamples()) + ); double percentDiff = percent - m_LastIterPercent; double toc = m_ProgressTimer.Toc(); @@ -1072,7 +1109,7 @@ bool RendererCL::RunIter(size_t iterCount, size_t temporalSample, si if (m_Devices.size() > 1)//Determine whether/when to sum histograms of secondary devices with the primary. { if (((TemporalSamples() == 1) || (temporalSample == TemporalSamples() - 1)) &&//If there are no temporal samples (not animating), or the current one is the last... - ((m_LastIter + itersRan) >= ItersPerTemporalSample()))//...and the required number of iters for that sample have completed... + ((m_LastIter + itersRan) >= ItersPerTemporalSample()))//...and the required number of iters for that sample have completed... if (success && !(success = SumDeviceHist())) { AddToReport(loc); }//...read the histogram from the secondary devices and sum them to the primary. } @@ -1104,17 +1141,19 @@ eRenderStatus RendererCL::RunLogScaleFilter() size_t blockH = 4;//A height of 4 seems to run the fastest. size_t gridW = m_DensityFilterCL.m_SuperRasW; size_t gridH = m_DensityFilterCL.m_SuperRasH; - OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); if (b && !(b = wrapper.AddAndWriteBuffer(m_DEFilterParamsBufferName, reinterpret_cast(&m_DensityFilterCL), sizeof(m_DensityFilterCL)))) { AddToReport(loc); } if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_HistBufferName))) { AddToReport(loc); }//Histogram. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_AccumBufferName))) { AddToReport(loc); }//Accumulator. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_DEFilterParamsBufferName))) { AddToReport(loc); }//DensityFilterCL. //t.Tic(); if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); } + //t.Toc(loc); } else @@ -1164,7 +1203,6 @@ eRenderStatus RendererCL::RunDensityFilter() //Can't just blindly pass dimension in vals. Must adjust them first to evenly divide the block count //into the total grid dimensions. OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH); - //t.Tic(); //The classic problem with performing DE on adjacent pixels is that the filter will overlap. //This can be solved in 2 ways. One is to use atomics, which is unacceptably slow. @@ -1188,7 +1226,6 @@ eRenderStatus RendererCL::RunDensityFilter() gapH = (uint)ceil((m_DensityFilterCL.m_FilterWidth * 2.0) / (double)32);//Block height is 1, but iterates over 32 rows. chunkSizeH = gapH + 1; totalChunks = chunkSizeW * chunkSizeH; - OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH); gridW /= chunkSizeW; gridH /= chunkSizeH; @@ -1199,6 +1236,7 @@ eRenderStatus RendererCL::RunDensityFilter() { //t2.Tic(); if (b && !(b = RunDensityFilterPrivate(kernelIndex, gridW, gridH, blockSizeW, blockSizeH, chunkSizeW, chunkSizeH, colChunk, rowChunk))) { m_Abort = true; AddToReport(loc); } + //t2.Toc(loc); if (b && m_Callback) @@ -1211,6 +1249,7 @@ eRenderStatus RendererCL::RunDensityFilter() } } } + #else gridW /= chunkSizeW; gridH /= chunkSizeH; @@ -1222,6 +1261,7 @@ eRenderStatus RendererCL::RunDensityFilter() { //t2.Tic(); if (b && !(b = RunDensityFilterPrivate(kernelIndex, gridW, gridH, blockSizeW, blockSizeH, chunkSizeW, chunkSizeH, colChunk, rowChunk))) { m_Abort = true; AddToReport(loc); } + //t2.Toc(loc); if (b && m_Callback) @@ -1234,6 +1274,7 @@ eRenderStatus RendererCL::RunDensityFilter() } } } + #endif if (b && m_Callback) @@ -1273,11 +1314,11 @@ eRenderStatus RendererCL::RunFinalAccum() if (!m_Abort && accumKernelIndex != -1) { auto& wrapper = m_Devices[0]->m_Wrapper; - //This is needed with or without early clip. ConvertSpatialFilter(); if (b && !(b = wrapper.AddAndWriteBuffer(m_SpatialFilterParamsBufferName, reinterpret_cast(&m_SpatialFilterCL), sizeof(m_SpatialFilterCL)))) { AddToReport(loc); } + if (b && !(b = wrapper.AddAndWriteBuffer(m_CurvesCsaName, m_Csa.m_Entries.data(), SizeOf(m_Csa.m_Entries)))) { AddToReport(loc); } //Since early clip requires gamma correcting the entire accumulator first, @@ -1297,6 +1338,7 @@ eRenderStatus RendererCL::RunFinalAccum() OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); if (b && !(b = wrapper.SetBufferArg(gammaCorrectKernelIndex, argIndex++, m_AccumBufferName))) { AddToReport(loc); }//Accumulator. + if (b && !(b = wrapper.SetBufferArg(gammaCorrectKernelIndex, argIndex++, m_SpatialFilterParamsBufferName))) { AddToReport(loc); }//SpatialFilterCL. if (b && !(b = wrapper.RunKernel(gammaCorrectKernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); } @@ -1316,13 +1358,19 @@ eRenderStatus RendererCL::RunFinalAccum() OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); if (b && !(b = wrapper.SetBufferArg(accumKernelIndex, argIndex++, m_AccumBufferName))) { AddToReport(loc); }//Accumulator. + if (b && !(b = wrapper.SetImageArg(accumKernelIndex, argIndex++, wrapper.Shared(), m_FinalImageName))) { AddToReport(loc); }//Final image. + if (b && !(b = wrapper.SetBufferArg(accumKernelIndex, argIndex++, m_SpatialFilterParamsBufferName))) { AddToReport(loc); }//SpatialFilterCL. + if (b && !(b = wrapper.SetBufferArg(accumKernelIndex, argIndex++, m_SpatialFilterCoefsBufferName))) { AddToReport(loc); }//Filter coefs. + if (b && !(b = wrapper.SetBufferArg(accumKernelIndex, argIndex++, m_CurvesCsaName))) { AddToReport(loc); }//Curve points. - + if (b && !(b = wrapper.SetArg (accumKernelIndex, argIndex++, curvesSet))) { AddToReport(loc); }//Do curves. + if (b && !(b = wrapper.SetArg (accumKernelIndex, argIndex++, bucketT(alphaBase)))) { AddToReport(loc); }//Alpha base. + if (b && !(b = wrapper.SetArg (accumKernelIndex, argIndex++, bucketT(alphaScale)))) { AddToReport(loc); }//Alpha scale. if (b && wrapper.Shared()) @@ -1371,13 +1419,15 @@ bool RendererCL::ClearBuffer(size_t device, const string& bufferName size_t blockH = m_Devices[device]->Nvidia() ? 32 : 16; size_t gridW = width * elementSize; size_t gridH = height; - b = true; OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, bufferName))) { AddToReport(loc); }//Buffer of byte. + if (b && !(b = wrapper.SetArg(kernelIndex, argIndex++, width * elementSize))) { AddToReport(loc); }//Width. + if (b && !(b = wrapper.SetArg(kernelIndex, argIndex++, height))) { AddToReport(loc); }//Height. + if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); } } else @@ -1416,21 +1466,31 @@ bool RendererCL::RunDensityFilterPrivate(size_t kernelIndex, size_t auto& wrapper = m_Devices[0]->m_Wrapper; if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_HistBufferName))) { AddToReport(loc); } argIndex++;//Histogram. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_AccumBufferName))) { AddToReport(loc); } argIndex++;//Accumulator. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_DEFilterParamsBufferName))) { AddToReport(loc); } argIndex++;//FlameDensityFilterCL. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_DECoefsBufferName))) { AddToReport(loc); } argIndex++;//Coefs. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_DEWidthsBufferName))) { AddToReport(loc); } argIndex++;//Widths. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_DECoefIndicesBufferName))) { AddToReport(loc); } argIndex++;//Coef indices. + if (b && !(b = wrapper.SetArg(kernelIndex, argIndex, chunkSizeW))) { AddToReport(loc); } argIndex++;//Chunk size width (gapW + 1). + if (b && !(b = wrapper.SetArg(kernelIndex, argIndex, chunkSizeH))) { AddToReport(loc); } argIndex++;//Chunk size height (gapH + 1). + if (b && !(b = wrapper.SetArg(kernelIndex, argIndex, chunkW))) { AddToReport(loc); } argIndex++;//Column chunk. + if (b && !(b = wrapper.SetArg(kernelIndex, argIndex, chunkH))) { AddToReport(loc); } argIndex++;//Row chunk. + //t.Toc(__FUNCTION__ " set args"); //t.Tic(); if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); }//Method 7, accumulating to temp box area. - //t.Toc(__FUNCTION__ " RunKernel()"); + //t.Toc(__FUNCTION__ " RunKernel()"); return b; } @@ -1490,6 +1550,7 @@ int RendererCL::MakeAndGetFinalAccumProgram(double& alphaBase, doubl if ((kernelIndex = wrapper.FindKernelIndex(finalAccumEntryPoint)) == -1)//Has not been built yet. { auto& kernel = m_FinalAccumOpenCLKernelCreator.FinalAccumKernel(EarlyClip(), Renderer::NumChannels(), Transparency()); + if (wrapper.AddProgram(finalAccumEntryPoint, kernel, finalAccumEntryPoint, m_DoublePrecision)) kernelIndex = wrapper.FindKernelIndex(finalAccumEntryPoint);//Try to find it again, it will be present if successfully built. else @@ -1562,10 +1623,15 @@ bool RendererCL::SumDeviceHist() cl_uint argIndex = 0; if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_AccumBufferName))) { break; }//Source buffer of v4bT. + if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_HistBufferName))) { break; }//Dest buffer of v4bT. + if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, uint(SuperRasW())))) { break; }//Width in pixels. + if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, uint(SuperRasH())))) { break; }//Height in pixels. + if (b && !(b = wrapper.SetArg (kernelIndex, argIndex++, (device == m_Devices.size() - 1) ? 1 : 0))) { break; }//Clear the source buffer on the last device. + if (b && !(b = wrapper.RunKernel (kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { break; } } else @@ -1579,11 +1645,10 @@ bool RendererCL::SumDeviceHist() } } } - + if (!b) { ostringstream os; - os << loc << ": failed to sum histograms from the secondary device(s) to the primary device."; AddToReport(os.str()); } @@ -1639,7 +1704,6 @@ void RendererCL::ConvertSpatialFilter() if (m_SpatialFilter.get()) { this->PrepFinalAccumVals(background, g, linRange, vibrancy); - m_SpatialFilterCL.m_SuperRasW = uint(SuperRasW()); m_SpatialFilterCL.m_SuperRasH = uint(SuperRasH()); m_SpatialFilterCL.m_FinalRasW = uint(FinalRasW()); @@ -1670,7 +1734,6 @@ template void RendererCL::ConvertEmber(Ember& ember, EmberCL& emberCL, vector>& xformsCL) { memset(&emberCL, 0, sizeof(EmberCL));//Might not really be needed. - emberCL.m_RotA = m_RotMat.A(); emberCL.m_RotB = m_RotMat.B(); emberCL.m_RotD = m_RotMat.D(); @@ -1688,21 +1751,18 @@ void RendererCL::ConvertEmber(Ember& ember, EmberCL& emberCL, for (size_t i = 0; i < ember.TotalXformCount() && i < xformsCL.size(); i++) { Xform* xform = ember.GetTotalXform(i); - xformsCL[i].m_A = xform->m_Affine.A(); xformsCL[i].m_B = xform->m_Affine.B(); xformsCL[i].m_C = xform->m_Affine.C(); xformsCL[i].m_D = xform->m_Affine.D(); xformsCL[i].m_E = xform->m_Affine.E(); xformsCL[i].m_F = xform->m_Affine.F(); - xformsCL[i].m_PostA = xform->m_Post.A(); xformsCL[i].m_PostB = xform->m_Post.B(); xformsCL[i].m_PostC = xform->m_Post.C(); xformsCL[i].m_PostD = xform->m_Post.D(); xformsCL[i].m_PostE = xform->m_Post.E(); xformsCL[i].m_PostF = xform->m_Post.F(); - xformsCL[i].m_DirectColor = xform->m_DirectColor; xformsCL[i].m_ColorSpeedCache = xform->ColorSpeedCache(); xformsCL[i].m_OneMinusColorCache = xform->OneMinusColorCache(); diff --git a/Source/EmberCL/RendererCL.h b/Source/EmberCL/RendererCL.h index dbe60af..e8461d0 100644 --- a/Source/EmberCL/RendererCL.h +++ b/Source/EmberCL/RendererCL.h @@ -41,57 +41,57 @@ public: template class EMBERCL_API RendererCL : public Renderer, public RendererCLBase { -using EmberNs::Renderer::RendererBase::Abort; -using EmberNs::Renderer::RendererBase::EarlyClip; -using EmberNs::Renderer::RendererBase::Transparency; -using EmberNs::Renderer::RendererBase::EnterResize; -using EmberNs::Renderer::RendererBase::LeaveResize; -using EmberNs::Renderer::RendererBase::FinalRasW; -using EmberNs::Renderer::RendererBase::FinalRasH; -using EmberNs::Renderer::RendererBase::SuperRasW; -using EmberNs::Renderer::RendererBase::SuperRasH; -using EmberNs::Renderer::RendererBase::SuperSize; -using EmberNs::Renderer::RendererBase::BytesPerChannel; -using EmberNs::Renderer::RendererBase::TemporalSamples; -using EmberNs::Renderer::RendererBase::ItersPerTemporalSample; -using EmberNs::Renderer::RendererBase::FuseCount; -using EmberNs::Renderer::RendererBase::DensityFilterOffset; -using EmberNs::Renderer::RendererBase::m_ProgressParameter; -using EmberNs::Renderer::RendererBase::m_YAxisUp; -using EmberNs::Renderer::RendererBase::m_LockAccum; -using EmberNs::Renderer::RendererBase::m_Abort; -using EmberNs::Renderer::RendererBase::m_NumChannels; -using EmberNs::Renderer::RendererBase::m_LastIter; -using EmberNs::Renderer::RendererBase::m_LastIterPercent; -using EmberNs::Renderer::RendererBase::m_Stats; -using EmberNs::Renderer::RendererBase::m_Callback; -using EmberNs::Renderer::RendererBase::m_Rand; -using EmberNs::Renderer::RendererBase::m_RenderTimer; -using EmberNs::Renderer::RendererBase::m_IterTimer; -using EmberNs::Renderer::RendererBase::m_ProgressTimer; -using EmberNs::Renderer::RendererBase::EmberReport::AddToReport; -using EmberNs::Renderer::RendererBase::m_ResizeCs; -using EmberNs::Renderer::RendererBase::m_ProcessAction; -using EmberNs::Renderer::m_RotMat; -using EmberNs::Renderer::m_Ember; -using EmberNs::Renderer::m_Csa; -using EmberNs::Renderer::m_CurvesSet; -using EmberNs::Renderer::CenterX; -using EmberNs::Renderer::CenterY; -using EmberNs::Renderer::K1; -using EmberNs::Renderer::K2; -using EmberNs::Renderer::Supersample; -using EmberNs::Renderer::HighlightPower; -using EmberNs::Renderer::HistBuckets; -using EmberNs::Renderer::AccumulatorBuckets; -using EmberNs::Renderer::GetDensityFilter; -using EmberNs::Renderer::GetSpatialFilter; -using EmberNs::Renderer::CoordMap; -using EmberNs::Renderer::XformDistributions; -using EmberNs::Renderer::XformDistributionsSize; -using EmberNs::Renderer::m_Dmap; -using EmberNs::Renderer::m_DensityFilter; -using EmberNs::Renderer::m_SpatialFilter; + using EmberNs::Renderer::RendererBase::Abort; + using EmberNs::Renderer::RendererBase::EarlyClip; + using EmberNs::Renderer::RendererBase::Transparency; + using EmberNs::Renderer::RendererBase::EnterResize; + using EmberNs::Renderer::RendererBase::LeaveResize; + using EmberNs::Renderer::RendererBase::FinalRasW; + using EmberNs::Renderer::RendererBase::FinalRasH; + using EmberNs::Renderer::RendererBase::SuperRasW; + using EmberNs::Renderer::RendererBase::SuperRasH; + using EmberNs::Renderer::RendererBase::SuperSize; + using EmberNs::Renderer::RendererBase::BytesPerChannel; + using EmberNs::Renderer::RendererBase::TemporalSamples; + using EmberNs::Renderer::RendererBase::ItersPerTemporalSample; + using EmberNs::Renderer::RendererBase::FuseCount; + using EmberNs::Renderer::RendererBase::DensityFilterOffset; + using EmberNs::Renderer::RendererBase::m_ProgressParameter; + using EmberNs::Renderer::RendererBase::m_YAxisUp; + using EmberNs::Renderer::RendererBase::m_LockAccum; + using EmberNs::Renderer::RendererBase::m_Abort; + using EmberNs::Renderer::RendererBase::m_NumChannels; + using EmberNs::Renderer::RendererBase::m_LastIter; + using EmberNs::Renderer::RendererBase::m_LastIterPercent; + using EmberNs::Renderer::RendererBase::m_Stats; + using EmberNs::Renderer::RendererBase::m_Callback; + using EmberNs::Renderer::RendererBase::m_Rand; + using EmberNs::Renderer::RendererBase::m_RenderTimer; + using EmberNs::Renderer::RendererBase::m_IterTimer; + using EmberNs::Renderer::RendererBase::m_ProgressTimer; + using EmberNs::Renderer::RendererBase::EmberReport::AddToReport; + using EmberNs::Renderer::RendererBase::m_ResizeCs; + using EmberNs::Renderer::RendererBase::m_ProcessAction; + using EmberNs::Renderer::m_RotMat; + using EmberNs::Renderer::m_Ember; + using EmberNs::Renderer::m_Csa; + using EmberNs::Renderer::m_CurvesSet; + using EmberNs::Renderer::CenterX; + using EmberNs::Renderer::CenterY; + using EmberNs::Renderer::K1; + using EmberNs::Renderer::K2; + using EmberNs::Renderer::Supersample; + using EmberNs::Renderer::HighlightPower; + using EmberNs::Renderer::HistBuckets; + using EmberNs::Renderer::AccumulatorBuckets; + using EmberNs::Renderer::GetDensityFilter; + using EmberNs::Renderer::GetSpatialFilter; + using EmberNs::Renderer::CoordMap; + using EmberNs::Renderer::XformDistributions; + using EmberNs::Renderer::XformDistributionsSize; + using EmberNs::Renderer::m_Dmap; + using EmberNs::Renderer::m_DensityFilter; + using EmberNs::Renderer::m_SpatialFilter; public: RendererCL(const vector>& devices, bool shared = false, GLuint outputTexID = 0); @@ -200,6 +200,7 @@ private: string m_EmberBufferName; string m_XformsBufferName; string m_ParVarsBufferName; + string m_GlobalSharedBufferName; string m_SeedsBufferName; string m_DistBufferName; string m_CarToRasBufferName; @@ -233,6 +234,7 @@ private: DEOpenCLKernelCreator m_DEOpenCLKernelCreator; FinalAccumOpenCLKernelCreator m_FinalAccumOpenCLKernelCreator; pair> m_Params; + pair> m_GlobalShared; vector> m_Devices; Ember m_LastBuiltEmber; }; diff --git a/Source/EmberCL/RendererClDevice.cpp b/Source/EmberCL/RendererClDevice.cpp index b3f860b..547e719 100644 --- a/Source/EmberCL/RendererClDevice.cpp +++ b/Source/EmberCL/RendererClDevice.cpp @@ -13,7 +13,6 @@ namespace EmberCLns /// True if shared with OpenGL, else false. /// True if success, else false. RendererClDevice::RendererClDevice(bool doublePrec, size_t platform, size_t device, bool shared) - : m_Info(OpenCLInfo::Instance()) { m_Init = false; m_Shared = shared; @@ -22,6 +21,7 @@ RendererClDevice::RendererClDevice(bool doublePrec, size_t platform, size_t devi m_Calls = 0; m_PlatformIndex = platform; m_DeviceIndex = device; + m_Info = OpenCLInfo::Instance(); } /// @@ -40,7 +40,7 @@ bool RendererClDevice::Init() if (b && m_Wrapper.Ok() && !m_Init) { - m_NVidia = ToLower(m_Info.PlatformName(m_PlatformIndex)).find_first_of("nvidia") != string::npos && m_Wrapper.LocalMemSize() > (32 * 1024); + m_NVidia = ToLower(m_Info->PlatformName(m_PlatformIndex)).find_first_of("nvidia") != string::npos && m_Wrapper.LocalMemSize() > (32 * 1024); m_WarpSize = m_NVidia ? 32 : 64; m_Init = true; } diff --git a/Source/EmberCL/RendererClDevice.h b/Source/EmberCL/RendererClDevice.h index bc22104..55a4eb5 100644 --- a/Source/EmberCL/RendererClDevice.h +++ b/Source/EmberCL/RendererClDevice.h @@ -37,6 +37,6 @@ private: size_t m_WarpSize; size_t m_PlatformIndex; size_t m_DeviceIndex; - OpenCLInfo& m_Info; + shared_ptr m_Info; }; } diff --git a/Source/EmberCommon/EmberCommon.h b/Source/EmberCommon/EmberCommon.h index e2548c3..f6fba61 100644 --- a/Source/EmberCommon/EmberCommon.h +++ b/Source/EmberCommon/EmberCommon.h @@ -166,7 +166,6 @@ static uint CalcStrips(double memRequired, double memAvailable, double useMem) return 1; strips = uint(ceil(memRequired / memAvailable)); - return strips; } @@ -210,7 +209,6 @@ static T NextLowestEvenDiv(T numerator, T denominator) { T result = 1; T numDiv2 = numerator / 2; - denominator--; if (denominator > numDiv2) @@ -239,9 +237,8 @@ static T NextLowestEvenDiv(T numerator, T denominator) static vector> Devices(const vector& selectedDevices) { vector> vec; - OpenCLInfo& info = OpenCLInfo::Instance(); - auto& devices = info.DeviceIndices(); - + auto info = OpenCLInfo::Instance(); + auto& devices = info->DeviceIndices(); vec.reserve(selectedDevices.size()); for (size_t i = 0; i < selectedDevices.size(); i++) @@ -400,10 +397,10 @@ static vector>> CreateRenderers(eRendererType rend /// True if all rendering was successful, else false. template static bool StripsRender(RendererBase* renderer, Ember& ember, vector& finalImage, double time, size_t strips, bool yAxisUp, - std::function perStripStart, - std::function perStripFinish, - std::function perStripError, - std::function& finalEmber)> allStripsFinished) + std::function perStripStart, + std::function perStripFinish, + std::function perStripError, + std::function& finalEmber)> allStripsFinished) { bool success = false; size_t origHeight, realHeight = ember.m_FinalRasH; @@ -412,7 +409,6 @@ static bool StripsRender(RendererBase* renderer, Ember& ember, vector& T zoomScale = pow(T(2), ember.m_Zoom); T centerBase = centerY - ((strips - 1) * floatStripH) / (2 * ember.m_PixelsPerUnit * zoomScale); vector> randVec; - ember.m_Quality *= strips; ember.m_FinalRasH = size_t(ceil(floatStripH)); @@ -469,7 +465,6 @@ static bool StripsRender(RendererBase* renderer, Ember& ember, vector& allStripsFinished(ember); Memset(finalImage); - return success; } @@ -485,9 +480,9 @@ static bool StripsRender(RendererBase* renderer, Ember& ember, vector& /// Called if for any reason the number of strips used will differ from the value passed in /// The actual number of strips that will be used static size_t VerifyStrips(size_t height, size_t strips, - std::function stripError1, - std::function stripError2, - std::function stripError3) + std::function stripError1, + std::function stripError2, + std::function stripError3) { ostringstream os; @@ -502,7 +497,6 @@ static size_t VerifyStrips(size_t height, size_t strips, { os << "A strips value of " << strips << " does not divide evenly into a height of " << height << "."; stripError2(os.str()); os.str(""); - strips = NextHighestEvenDiv(height, strips); if (strips == 1)//No higher divisor, check for a lower one. diff --git a/Source/EmberGenome/EmberGenome.cpp b/Source/EmberGenome/EmberGenome.cpp index f86c5ea..6755580 100644 --- a/Source/EmberGenome/EmberGenome.cpp +++ b/Source/EmberGenome/EmberGenome.cpp @@ -10,28 +10,28 @@ template void SetDefaultTestValues(Ember& ember) { - ember.m_Time = 0.0; - ember.m_Interp = EMBER_INTERP_LINEAR; - ember.m_PaletteInterp = INTERP_HSV; - ember.m_Background[0] = 0; - ember.m_Background[1] = 0; - ember.m_Background[2] = 0; - ember.m_Background[3] = 255; - ember.m_CenterX = 0; - ember.m_CenterY = 0; - ember.m_Rotate = 0; - ember.m_PixelsPerUnit = 64; - ember.m_FinalRasW = 128; - ember.m_FinalRasH = 128; - ember.m_Supersample = 1; - ember.m_SpatialFilterRadius = T(0.5); - ember.m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER; - ember.m_Zoom = 0; - ember.m_Quality = 1; - ember.m_TemporalSamples = 1; - ember.m_MaxRadDE = 0; - ember.m_MinRadDE = 0; - ember.m_CurveDE = T(0.6); + ember.m_Time = 0.0; + ember.m_Interp = EMBER_INTERP_LINEAR; + ember.m_PaletteInterp = INTERP_HSV; + ember.m_Background[0] = 0; + ember.m_Background[1] = 0; + ember.m_Background[2] = 0; + ember.m_Background[3] = 255; + ember.m_CenterX = 0; + ember.m_CenterY = 0; + ember.m_Rotate = 0; + ember.m_PixelsPerUnit = 64; + ember.m_FinalRasW = 128; + ember.m_FinalRasH = 128; + ember.m_Supersample = 1; + ember.m_SpatialFilterRadius = T(0.5); + ember.m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER; + ember.m_Zoom = 0; + ember.m_Quality = 1; + ember.m_TemporalSamples = 1; + ember.m_MaxRadDE = 0; + ember.m_MinRadDE = 0; + ember.m_CurveDE = T(0.6); } /// @@ -43,8 +43,7 @@ void SetDefaultTestValues(Ember& ember) template bool EmberGenome(EmberOptions& opt) { - OpenCLInfo& info(OpenCLInfo::Instance()); - + auto info = OpenCLInfo::Instance(); std::cout.imbue(std::locale("")); if (opt.DumpArgs()) @@ -53,7 +52,7 @@ bool EmberGenome(EmberOptions& opt) if (opt.OpenCLInfo()) { cerr << "\nOpenCL Info: " << endl; - cerr << info.DumpInfo(); + cerr << info->DumpInfo(); return true; } @@ -83,7 +82,6 @@ bool EmberGenome(EmberOptions& opt) unique_ptr> renderer(CreateRenderer(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, devices, false, 0, emberReport)); QTIsaac rand(ISAAC_INT(t.Tic()), ISAAC_INT(t.Tic() * 2), ISAAC_INT(t.Tic() * 3)); vector errorReport = emberReport.ErrorReport(); - os.imbue(std::locale("")); os2.imbue(std::locale("")); @@ -112,15 +110,14 @@ bool EmberGenome(EmberOptions& opt) { for (auto& device : devices) { - cerr << "Platform: " << info.PlatformName(device.first) << endl; - cerr << "Device: " << info.DeviceName(device.first, device.second) << endl; + cerr << "Platform: " << info->PlatformName(device.first) << endl; + cerr << "Device: " << info->DeviceName(device.first, device.second) << endl; } } } //SheepTools will own the created renderer and will take care of cleaning it up. SheepTools tools(opt.PalettePath(), CreateRenderer(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, devices, false, 0, emberReport2)); - tools.SetSpinParams(!opt.UnsmoothEdge(), T(opt.Stagger()), T(opt.OffsetX()), @@ -217,7 +214,6 @@ bool EmberGenome(EmberOptions& opt) bool doStrip = opt.Strip() != ""; bool doCross0 = opt.Cross0() != ""; bool doCross1 = opt.Cross1() != ""; - count += (doMutate ? 1 : 0); count += (doInter ? 1 : 0); count += (doRotate ? 1 : 0); @@ -448,7 +444,6 @@ bool EmberGenome(EmberOptions& opt) tools.Spin(embers[0], pTemplate, result1, frame - 1, blend - spread); tools.Spin(embers[0], pTemplate, result2, frame , blend ); tools.Spin(embers[0], pTemplate, result3, frame + 1, blend + spread); - cout << emberToXml.ToString(result1, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette()); cout << emberToXml.ToString(result2, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette()); cout << emberToXml.ToString(result3, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette()); @@ -464,7 +459,6 @@ bool EmberGenome(EmberOptions& opt) tools.SpinInter(embers.data(), pTemplate, result1, frame - 1, 0, blend - spread); tools.SpinInter(embers.data(), pTemplate, result2, frame , 0, blend ); tools.SpinInter(embers.data(), pTemplate, result3, frame + 1, 0, blend + spread); - cout << emberToXml.ToString(result1, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette()); cout << emberToXml.ToString(result2, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette()); cout << emberToXml.ToString(result3, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette()); @@ -484,17 +478,13 @@ bool EmberGenome(EmberOptions& opt) for (i = 0; i < embers.size(); i++) { T oldX, oldY; - embers[i].DeleteMotionElements(); - oldX = embers[i].m_CenterX; oldY = embers[i].m_CenterY; embers[i].m_FinalRasH = size_t(T(embers[i].m_FinalRasH) / T(opt.Frames())); - embers[i].m_CenterY = embers[i].m_CenterY - ((opt.Frames() - 1) * embers[i].m_FinalRasH) / - (2 * embers[i].m_PixelsPerUnit * pow(T(2.0), embers[i].m_Zoom)); + (2 * embers[i].m_PixelsPerUnit * pow(T(2.0), embers[i].m_Zoom)); embers[i].m_CenterY += embers[i].m_FinalRasH * opt.Frame() / (embers[i].m_PixelsPerUnit * pow(T(2.0), embers[i].m_Zoom)); - tools.RotateOldCenterBy(embers[i].m_CenterX, embers[i].m_CenterY, oldX, oldY, embers[i].m_Rotate); if (pTemplate) @@ -602,10 +592,8 @@ bool EmberGenome(EmberOptions& opt) { i0 = rand.Rand() % embers.size(); i1 = rand.Rand() % embers2.size(); - selp0 = embers[i0]; selp1 = embers2[i1]; - aselp0 = &selp0; aselp1 = &selp1; @@ -711,6 +699,7 @@ bool EmberGenome(EmberOptions& opt) tot += (finalImage[i] + finalImage[i + 1] + finalImage[i + 2]); if (0 == finalImage[i] && 0 == finalImage[i + 1] && 0 == finalImage[i + 2]) totb++; + if (255 == finalImage[i] && 255 == finalImage[i + 1] && 255 == finalImage[i + 2]) totw++; } @@ -723,10 +712,11 @@ bool EmberGenome(EmberOptions& opt) orig.Clear(); count++; - } while ((avgPix < opt.AvgThresh() || - fractionBlack < opt.BlackThresh() || - fractionWhite > opt.WhiteLimit()) && - count < opt.Tries()); + } + while ((avgPix < opt.AvgThresh() || + fractionBlack < opt.BlackThresh() || + fractionWhite > opt.WhiteLimit()) && + count < opt.Tries()); if (count == opt.Tries()) cerr << "Warning: reached maximum attempts, giving up." << endl; @@ -767,7 +757,6 @@ int _tmain(int argc, _TCHAR* argv[]) { bool b = false; EmberOptions opt; - //Required for large allocs, else GPU memory usage will be severely limited to small sizes. //This must be done in the application and not in the EmberCL DLL. #ifdef WIN32 @@ -778,23 +767,23 @@ int _tmain(int argc, _TCHAR* argv[]) if (!opt.Populate(argc, argv, OPT_USE_GENOME)) { - #ifdef DO_DOUBLE + if (opt.Bits() == 64) { b = EmberGenome(opt); } else #endif - if (opt.Bits() == 33) - { - b = EmberGenome(opt); - } - else if (opt.Bits() == 32) - { - cerr << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; - b = EmberGenome(opt); - } + if (opt.Bits() == 33) + { + b = EmberGenome(opt); + } + else if (opt.Bits() == 32) + { + cerr << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; + b = EmberGenome(opt); + } } return b ? 0 : 1; diff --git a/Source/EmberRender/EmberRender.cpp b/Source/EmberRender/EmberRender.cpp index 27cc6c8..739beda 100644 --- a/Source/EmberRender/EmberRender.cpp +++ b/Source/EmberRender/EmberRender.cpp @@ -2,6 +2,8 @@ #include "EmberRender.h" #include "JpegUtils.h" +//template weak_ptr Singleton::m_Instance = weak_ptr(); + /// /// The core of the EmberRender.exe program. /// Template argument expected to be float or double. @@ -11,8 +13,7 @@ template bool EmberRender(EmberOptions& opt) { - EmberCLns::OpenCLInfo& info(EmberCLns::OpenCLInfo::Instance()); - + auto info = EmberCLns::OpenCLInfo::Instance(); std::cout.imbue(std::locale("")); if (opt.DumpArgs()) @@ -21,7 +22,7 @@ bool EmberRender(EmberOptions& opt) if (opt.OpenCLInfo()) { cout << "\nOpenCL Info: " << endl; - cout << info.DumpInfo(); + cout << info->DumpInfo(); return true; } @@ -89,8 +90,8 @@ bool EmberRender(EmberOptions& opt) { for (auto& device : devices) { - cout << "Platform: " << info.PlatformName(device.first) << endl; - cout << "Device: " << info.DeviceName(device.first, device.second) << endl; + cout << "Platform: " << info->PlatformName(device.first) << endl; + cout << "Device: " << info->DeviceName(device.first, device.second) << endl; } } @@ -108,9 +109,9 @@ bool EmberRender(EmberOptions& opt) } if (opt.Format() != "jpg" && - opt.Format() != "png" && - opt.Format() != "ppm" && - opt.Format() != "bmp") + opt.Format() != "png" && + opt.Format() != "ppm" && + opt.Format() != "bmp") { cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg." << endl; } @@ -189,7 +190,7 @@ bool EmberRender(EmberOptions& opt) //Cast to double in case the value exceeds 2^32. double imageMem = double(renderer->NumChannels()) * double(embers[i].m_FinalRasW) - * double(embers[i].m_FinalRasH) * double(renderer->BytesPerChannel()); + * double(embers[i].m_FinalRasH) * double(renderer->BytesPerChannel()); double maxMem = pow(2.0, double((sizeof(void*) * 8) - 1)); if (imageMem > maxMem)//Ensure the max amount of memory for a process is not exceeded. @@ -217,10 +218,9 @@ bool EmberRender(EmberOptions& opt) } strips = VerifyStrips(embers[i].m_FinalRasH, strips, - [&](const string& s) { cout << s << endl; },//Greater than height. - [&](const string& s) { cout << s << endl; },//Mod height != 0. - [&](const string& s) { cout << s << endl; });//Final strips value to be set. - + [&](const string & s) { cout << s << endl; }, //Greater than height. + [&](const string & s) { cout << s << endl; }, //Mod height != 0. + [&](const string & s) { cout << s << endl; }); //Final strips value to be set. //For testing incremental renderer. //int sb = 1; //bool resume = false, success = false; @@ -231,9 +231,8 @@ bool EmberRender(EmberOptions& opt) // resume = true; //} //while (success && renderer->ProcessState() != ACCUM_DONE); - StripsRender(renderer.get(), embers[i], finalImage, 0, strips, opt.YAxisUp(), - [&](size_t strip)//Pre strip. + [&](size_t strip)//Pre strip. { if (opt.Verbose() && (strips > 1) && strip > 0) cout << endl; @@ -267,7 +266,6 @@ bool EmberRender(EmberOptions& opt) else { ostringstream fnstream; - fnstream << inputPath << opt.Prefix() << setfill('0') << setw(padding) << i << opt.Suffix() << "." << opt.Format(); filename = fnstream.str(); } @@ -278,9 +276,10 @@ bool EmberRender(EmberOptions& opt) comments = renderer->ImageComments(stats, opt.PrintEditDepth(), opt.IntPalette(), opt.HexPalette()); os.str(""); os << comments.m_NumIters << " / " << iterCount << " (" << std::fixed << std::setprecision(2) << ((double(stats.m_Iters) / double(iterCount)) * 100) << "%)"; - VerbosePrint("\nIters ran/requested: " + os.str()); + if (!opt.EmberCL()) VerbosePrint("Bad values: " << stats.m_Badvals); + VerbosePrint("Render time: " + t.Format(stats.m_RenderMs)); VerbosePrint("Pure iter time: " + t.Format(stats.m_IterMs)); VerbosePrint("Iters/sec: " << size_t(stats.m_Iters / (stats.m_IterMs / 1000.0)) << endl); @@ -310,11 +309,11 @@ bool EmberRender(EmberOptions& opt) if (auto rendererCL = dynamic_cast*>(renderer.get())) { cout << "Iteration kernel:\n" << - rendererCL->IterKernel() << "\n\n" << - "Density filter kernel:\n" << - rendererCL->DEKernel() << "\n\n" << - "Final accumulation kernel:\n" << - rendererCL->FinalAccumKernel() << endl; + rendererCL->IterKernel() << "\n\n" << + "Density filter kernel:\n" << + rendererCL->DEKernel() << "\n\n" << + "Final accumulation kernel:\n" << + rendererCL->FinalAccumKernel() << endl; } } @@ -322,7 +321,6 @@ bool EmberRender(EmberOptions& opt) } t.Toc("\nFinished in: ", true); - return true; } @@ -336,7 +334,6 @@ int _tmain(int argc, _TCHAR* argv[]) { bool b = false; EmberOptions opt; - //Required for large allocs, else GPU memory usage will be severely limited to small sizes. //This must be done in the application and not in the EmberCL DLL. #ifdef WIN32 @@ -348,23 +345,23 @@ int _tmain(int argc, _TCHAR* argv[]) if (!opt.Populate(argc, argv, OPT_USE_RENDER)) { - #ifdef DO_DOUBLE + if (opt.Bits() == 64) { b = EmberRender(opt); } else #endif - if (opt.Bits() == 33) - { - b = EmberRender(opt); - } - else if (opt.Bits() == 32) - { - cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; - b = EmberRender(opt); - } + if (opt.Bits() == 33) + { + b = EmberRender(opt); + } + else if (opt.Bits() == 32) + { + cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; + b = EmberRender(opt); + } } return b ? 0 : 1; diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp index db04a25..6e59aa9 100644 --- a/Source/EmberTester/EmberTester.cpp +++ b/Source/EmberTester/EmberTester.cpp @@ -20,7 +20,6 @@ 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); @@ -34,12 +33,10 @@ Ember CreateBasicEmber(uint width, uint height, uint ss, T quality, T centerX { Timing t; QTIsaac rand; - //t.Tic(); Ember ember1; //t.Toc("TestBasicFlame() : Constructor()"); //t.Tic(); - ember1.m_FinalRasW = width; ember1.m_FinalRasH = height; ember1.m_Supersample = ss; @@ -51,20 +48,16 @@ Ember CreateBasicEmber(uint width, uint height, uint ss, T quality, T centerX Xform xform2(T(0.25), rand.Frand01(), rand.Frand11(), T(1), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform3(T(0.25), rand.Frand01(), rand.Frand11(), T(1), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform4(T(0.25), rand.Frand01(), rand.Frand11(), T(1), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - xform1.AddVariation(new SphericalVariation()); xform2.AddVariation(new SphericalVariation()); xform3.AddVariation(new SphericalVariation()); xform4.AddVariation(new SphericalVariation()); xform4.AddVariation(new BlobVariation()); - ember1.AddXform(xform1); ember1.AddXform(xform2); ember1.AddXform(xform3); ember1.AddXform(xform4); - //ember1.SetFinalXform(xform4); - return ember1; } @@ -74,22 +67,20 @@ string GetEmberCLKernelString(Ember& ember, bool iter, bool log, bool de, IterOpenCLKernelCreator iterCreator; DEOpenCLKernelCreator deCreator(false, false); FinalAccumOpenCLKernelCreator accumCreator(false); - pair> pair; - + pair> pair, pair2; iterCreator.ParVarIndexDefines(ember, pair); + iterCreator.SharedDataIndexDefines(ember, pair2); if (iter) - os << "Iter kernel: \n" << iterCreator.CreateIterKernelString(ember, pair.first, true); + os << "Iter kernel: \n" << iterCreator.CreateIterKernelString(ember, pair.first, pair2.first, true); if (log) os << "Log scale de kernel: \n" << deCreator.LogScaleAssignDEKernel(); //if (de) // os << "Gaussian DE kernel: \n" << deCreator.GaussianDEKernel(ss); - //if (accum) // os << "Accum kernel: \n" << accumCreator.FinalAccumKernelLateClipWithoutAlpha(); - return os.str(); } @@ -101,17 +92,12 @@ void MakeTestAllVarsRegPrePost(vector>& embers) VariationList varList; PaletteList paletteList; QTIsaac rand; - paletteList.Add("flam3-palettes.xml"); - Timing t; - Ember emberNoVars; - emberNoVars.m_FinalRasW = 640; emberNoVars.m_FinalRasH = 480; emberNoVars.m_Quality = 100; - Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform3(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); @@ -119,7 +105,6 @@ void MakeTestAllVarsRegPrePost(vector>& embers) Xform xform5(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform6(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform7(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - emberNoVars.AddXform(xform1); emberNoVars.AddXform(xform2); emberNoVars.AddXform(xform3); @@ -127,7 +112,6 @@ void MakeTestAllVarsRegPrePost(vector>& embers) emberNoVars.AddXform(xform5); emberNoVars.AddXform(xform6); emberNoVars.AddXform(xform7); - ss << "NoVars"; emberNoVars.m_Name = ss.str(); ss.str(""); @@ -136,21 +120,19 @@ void MakeTestAllVarsRegPrePost(vector>& embers) while (index < varList.RegSize()) { - /*if (index != VAR_SYNTH) - { + /* if (index != VAR_SYNTH) + { index++; continue; - } -*/ + } + */ Ember ember1; unique_ptr> regVar(varList.GetVariationCopy(index, VARTYPE_REG)); unique_ptr> preVar(varList.GetVariationCopy("pre_" + regVar->Name())); unique_ptr> postVar(varList.GetVariationCopy("post_" + regVar->Name())); - ember1.m_FinalRasW = 640; ember1.m_FinalRasH = 480; ember1.m_Quality = 100; - Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform3(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); @@ -164,20 +146,15 @@ void MakeTestAllVarsRegPrePost(vector>& embers) xform1.AddVariation(preVar->Copy()); xform2.AddVariation(regVar->Copy()); xform3.AddVariation(postVar->Copy()); - xform4.AddVariation(preVar->Copy()); xform4.AddVariation(regVar->Copy()); - xform5.AddVariation(preVar->Copy()); xform5.AddVariation(postVar->Copy()); - xform6.AddVariation(regVar->Copy()); xform6.AddVariation(postVar->Copy()); - xform7.AddVariation(preVar->Copy()); xform7.AddVariation(regVar->Copy()); xform7.AddVariation(postVar->Copy()); - ember1.AddXform(xform1); ember1.AddXform(xform2); ember1.AddXform(xform3); @@ -192,7 +169,6 @@ void MakeTestAllVarsRegPrePost(vector>& embers) xform2.AddVariation(regVar->Copy()); xform3.AddVariation(regVar->Copy()); xform4.AddVariation(regVar->Copy()); - ember1.AddXform(xform1); ember1.AddXform(xform2); ember1.AddXform(xform3); @@ -214,7 +190,6 @@ void MakeTestAllVarsRegPrePostComboFile(const string& filename) { EmberToXml writer; vector> embers; - MakeTestAllVarsRegPrePost(embers); writer.Save(filename, embers, 0, true, false, true); } @@ -225,47 +200,45 @@ void TestAtomicAdd() ostringstream os; OpenCLWrapper wrapper; vector vec(32); - os << ConstantDefinesString(false) << UnionCLStructString << endl; os << - "void AtomicAdd(volatile __global float* source, const float operand)\n" - "{\n" - " union\n" - " {\n" - " uint intVal;\n" - " float floatVal;\n" - " } newVal;\n" - "\n" - " union\n" - " {\n" - " uint intVal;\n" - " float floatVal;\n" - " } prevVal;\n" - "\n" - " do\n" - " {\n" - " prevVal.floatVal = *source;\n" - " newVal.floatVal = prevVal.floatVal + operand;\n" - " } while (atomic_cmpxchg((volatile __global uint*)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);\n" - "}\n" - "\n" - "__kernel void MyKernel(\n" - " __global float* buff,\n" - " uint lockit\n" - "\t)\n" - "{\n" - " uint index = THREAD_ID_X;\n" - "\n" - " if (lockit)\n" - " {\n" - " AtomicAdd(&(buff[index]), (float)index * 0.54321);\n" - " }\n" - " else\n" - " {\n" - " buff[index] += (float)index * 0.54321;\n" - " }\n" - "}\n"; - + "void AtomicAdd(volatile __global float* source, const float operand)\n" + "{\n" + " union\n" + " {\n" + " uint intVal;\n" + " float floatVal;\n" + " } newVal;\n" + "\n" + " union\n" + " {\n" + " uint intVal;\n" + " float floatVal;\n" + " } prevVal;\n" + "\n" + " do\n" + " {\n" + " prevVal.floatVal = *source;\n" + " newVal.floatVal = prevVal.floatVal + operand;\n" + " } while (atomic_cmpxchg((volatile __global uint*)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);\n" + "}\n" + "\n" + "__kernel void MyKernel(\n" + " __global float* buff,\n" + " uint lockit\n" + "\t)\n" + "{\n" + " uint index = THREAD_ID_X;\n" + "\n" + " if (lockit)\n" + " {\n" + " AtomicAdd(&(buff[index]), (float)index * 0.54321);\n" + " }\n" + " else\n" + " {\n" + " buff[index] += (float)index * 0.54321;\n" + " }\n" + "}\n"; string program = os.str(); string entry = "MyKernel"; @@ -282,12 +255,12 @@ void TestAtomicAdd() wrapper.SetArg(0, 1, 0); if (wrapper.RunKernel(0, - 32,//Total grid dims. - 1, - 1, - 1,//Individual block dims. - 1, - 1)) + 32,//Total grid dims. + 1, + 1, + 1,//Individual block dims. + 1, + 1)) { wrapper.ReadBuffer(0, vec.data(), (uint)vec.size() * sizeof(vec[0])); cout << "Vector after unlocked add: " << endl; @@ -305,12 +278,12 @@ void TestAtomicAdd() wrapper.SetArg(0, 1, 1); if (wrapper.RunKernel(0, - 32,//Total grid dims. - 1, - 1, - 1,//Individual block dims. - 1, - 1)) + 32,//Total grid dims. + 1, + 1, + 1,//Individual block dims. + 1, + 1)) { wrapper.ReadBuffer(0, vec.data(), (uint)vec.size() * sizeof(vec[0])); cout << "\n\nVector after locked add: " << endl; @@ -422,7 +395,6 @@ bool TestVarUnique() VariationList vl; vector ids; vector names; - ids.reserve(vl.Size()); names.reserve(vl.Size()); @@ -478,7 +450,7 @@ bool TestVarPrecalcEqual(const Variation* var1, const Variation
* var2) cout << "NeedPrecalcAngles value of " << var1->NeedPrecalcAngles() << " for variation " << var1->Name() << " != NeedPrecalcAngles value of " << var2->NeedPrecalcAngles() << " for variation " << var2->Name() << endl; success = false; } - + if (var1->NeedPrecalcAtanXY() != var2->NeedPrecalcAtanXY()) { cout << "NeedPrecalcAtanXY value of " << var1->NeedPrecalcAtanXY() << " for variation " << var1->Name() << " != NeedPrecalcAtanXY value of " << var2->NeedPrecalcAtanXY() << " for variation " << var2->Name() << endl; @@ -681,7 +653,7 @@ bool TestVarCopy() auto var = vlf.GetVariation(i); Variation
* destVar = NULL; unique_ptr> copyVar(var->Copy());//Test Copy(). - + if (!TestVarEqual(var, copyVar.get())) { cout << "Variations " << var->Name() << "<" << typeid(sT).name() << "> and " << copyVar->Name() << "<" << typeid(sT).name() << "> (same template type) were not equal after Copy()." << endl; @@ -719,7 +691,6 @@ bool TestParVars() vector names; vector addresses; auto params = parVar->Params(); - names.reserve(parVar->ParamCount()); addresses.reserve(parVar->ParamCount()); @@ -764,13 +735,12 @@ bool TestVarRegPrePost() for (size_t i = 0; i < vlf.RegSize(); i++) { auto regVar = vlf.GetVariation(i, VARTYPE_REG); - + if (regVar) { if (regVar->Name().find("dc_") != 0) { string name = regVar->Name(); - auto preVar = vlf.GetVariation("pre_" + name); auto postVar = vlf.GetVariation("post_" + name); @@ -785,7 +755,7 @@ bool TestVarRegPrePost() cout << "Post variation equivalent of " << name << " could not be found." << endl; success = false; } - + if (!TestVarPrecalcEqual(regVar, preVar)) { cout << "Regular and pre variation precalc test failed for " << regVar->Name() << " and " << preVar->Name() << "." << endl; @@ -881,7 +851,7 @@ bool TestVarPrecalcUsedCL() } } } - + if (var->NeedPrecalcSumSquares()) { if (s.find("SQR(vIn.x) + SQR(vIn.y)") != string::npos || s.find("vIn.x * vIn.x + vIn.y * vIn.y") != string::npos) @@ -950,7 +920,7 @@ bool TestVarPrecalcUsedCL() success = false; } } - + if (var->NeedPrecalcAtanYX()) { if (s.find("precalcAtanyx") == string::npos) @@ -983,7 +953,6 @@ bool TestVarAssignTypes() bool success = true; VariationList vlf; vector vset, vsum; - vset.push_back("vIn.x"); vset.push_back("vIn.y"); vset.push_back("vIn.z"); @@ -993,7 +962,6 @@ bool TestVarAssignTypes() vset.push_back("precalcCosa"); vset.push_back("precalcAtanxy"); vset.push_back("precalcAtanyx"); - vsum.push_back("vIn.x"); vsum.push_back("vIn.y"); //vsum.push_back("vIn.z"); @@ -1043,19 +1011,16 @@ bool TestVarAssignVals() bool success = true; VariationList vlf; vector xout, yout, zout; - xout.push_back("vOut.x ="); xout.push_back("vOut.x +="); xout.push_back("vOut.x -="); xout.push_back("vOut.x *="); xout.push_back("vOut.x /="); - yout.push_back("vOut.y ="); yout.push_back("vOut.y +="); yout.push_back("vOut.y -="); yout.push_back("vOut.y *="); yout.push_back("vOut.y /="); - zout.push_back("vOut.z ="); zout.push_back("vOut.z +="); zout.push_back("vOut.z -="); @@ -1093,7 +1058,6 @@ bool TestZepsFloor() bool success = true; VariationList vlf; vector zeps; - zeps.push_back("Zeps(floor"); for (size_t i = 0; i < vlf.Size(); i++) @@ -1115,7 +1079,6 @@ bool TestConstants() bool success = true; VariationList vlf; vector stringVec; - stringVec.push_back("2 * M_PI"); stringVec.push_back("2*M_PI"); stringVec.push_back("M_PI*2"); @@ -1145,7 +1108,6 @@ bool TestGlobalFuncs() for (size_t i = 0; i < vlf.Size(); i++) { auto var = vlf.GetVariation(i); - funcs = var->OpenCLGlobalFuncNames(); for (auto& func : funcs) @@ -1170,7 +1132,7 @@ void PrintAllVars() uint i = 0; VariationList vlf; - while(auto var = vlf.GetVariation(i++)) + while (auto var = vlf.GetVariation(i++)) cout << var->Name() << endl; } @@ -1180,7 +1142,6 @@ void TestXformsInOutPoints() VariationList varList; PaletteList paletteList; QTIsaac rand; - paletteList.Add("flam3-palettes.xml"); while (index < varList.RegSize()) @@ -1193,7 +1154,6 @@ void TestXformsInOutPoints() { unique_ptr> preVar(varList.GetVariationCopy("pre_" + regVar->Name())); unique_ptr> postVar(varList.GetVariationCopy("post_" + regVar->Name())); - Xform xform0(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); @@ -1208,20 +1168,15 @@ void TestXformsInOutPoints() xform1.AddVariation(preVar->Copy()); xform2.AddVariation(regVar->Copy()); xform3.AddVariation(postVar->Copy()); - xform4.AddVariation(preVar->Copy()); xform4.AddVariation(regVar->Copy()); - xform5.AddVariation(preVar->Copy()); xform5.AddVariation(postVar->Copy()); - xform6.AddVariation(regVar->Copy()); xform6.AddVariation(postVar->Copy()); - xform7.AddVariation(preVar->Copy()); xform7.AddVariation(regVar->Copy()); xform7.AddVariation(postVar->Copy()); - xforms.push_back(xform0); xforms.push_back(xform1); xforms.push_back(xform2); @@ -1234,7 +1189,6 @@ void TestXformsInOutPoints() else { xform1.AddVariation(regVar->Copy()); - xforms.push_back(xform0); xforms.push_back(xform1); } @@ -1243,24 +1197,19 @@ void TestXformsInOutPoints() { bool badVals = false; Point orig; - orig.m_X = rand.Frand11(); orig.m_Y = rand.Frand11(); orig.m_Z = rand.Frand11(); orig.m_ColorX = rand.Frand01(); orig.m_VizAdjusted = rand.Frand01(); - Point p1 = orig, p2 = orig, p3; - xforms[i].Apply(&p1, &p1, rand); xforms[i].Apply(&p2, &p3, rand); - badVals |= (p1.m_X != p1.m_X); badVals |= (p1.m_Y != p1.m_Y); badVals |= (p1.m_Z != p1.m_Z); badVals |= (p1.m_ColorX != p1.m_ColorX); badVals |= (p1.m_VizAdjusted != p1.m_VizAdjusted); - badVals |= (p3.m_X != p3.m_X); badVals |= (p3.m_Y != p3.m_Y); badVals |= (p3.m_Z != p3.m_Z); @@ -1308,7 +1257,6 @@ void TestVarTime() IteratorHelper helper; QTIsaac rand; vector> times; - times.reserve(vlf.RegSize()); while (i < vlf.RegSize()) @@ -1316,13 +1264,11 @@ void TestVarTime() double sum = 0; Xform xform; Variation* var = vlf.GetVariationCopy(i, VARTYPE_REG); - xform.AddVariation(var); for (int iter = 0; iter < iters; iter++) { Point p; - xform.m_Affine.A(rand.Frand(-5, 5)); xform.m_Affine.B(rand.Frand(-5, 5)); xform.m_Affine.C(rand.Frand(-5, 5)); @@ -1337,14 +1283,12 @@ void TestVarTime() helper.In.z = helper.m_TransZ = p.m_Z; helper.m_Color.x = p.m_ColorX = rand.Frand01(); p.m_VizAdjusted = rand.Frand01(); - helper.m_PrecalcSumSquares = SQR(helper.m_TransX) + SQR(helper.m_TransY); helper.m_PrecalcSqrtSumSquares = sqrt(helper.m_PrecalcSumSquares); helper.m_PrecalcSina = helper.m_TransX / helper.m_PrecalcSqrtSumSquares; - helper.m_PrecalcCosa = helper.m_TransY / helper.m_PrecalcSqrtSumSquares; + helper.m_PrecalcCosa = helper.m_TransY / helper.m_PrecalcSqrtSumSquares; helper.m_PrecalcAtanxy = atan2(helper.m_TransX, helper.m_TransY); helper.m_PrecalcAtanyx = atan2(helper.m_TransY, helper.m_TransX); - var->Random(rand); t.Tic(); var->Func(helper, p, rand); @@ -1363,7 +1307,6 @@ void TestCasting() { vector stringVec; vector*> varVec; - stringVec.push_back("T("); stringVec.push_back(".0f"); stringVec.push_back(".1f"); @@ -1375,7 +1318,6 @@ void TestCasting() stringVec.push_back(".7f"); stringVec.push_back(".8f"); stringVec.push_back(".9f"); - varVec = FindVarsWith(stringVec); for (auto& it : varVec) @@ -1391,7 +1333,6 @@ void TestOperations() { vector stringVec; vector*> varVec; - //stringVec.push_back("%"); //varVec = FindVarsWith(Vec); // @@ -1402,10 +1343,8 @@ void TestOperations() // //stringVec.clear(); //ClearVec>(varVec); - stringVec.push_back("MwcNext(mwc) %"); stringVec.push_back("MwcNext(mwc)%"); - varVec = FindVarsWith(stringVec); for (size_t i = 0; i < varVec.size(); i++) @@ -1415,7 +1354,6 @@ void TestOperations() stringVec.clear(); ClearVec>(varVec); - } template @@ -1427,7 +1365,6 @@ void TestVarsSimilar() IteratorHelper helper; QTIsaac rand; vector> diffs; - diffs.reserve(vlf.RegSize()); while (i < vlf.RegSize()) @@ -1436,7 +1373,6 @@ void TestVarsSimilar() Xform xform; Variation* var = vlf.GetVariationCopy(i, VARTYPE_REG); pair match("", TMAX); - compIndex = 0; xform.AddVariation(var); @@ -1451,16 +1387,13 @@ void TestVarsSimilar() double sum = 0, xdiff = 0, ydiff = 0, zdiff = 0; Xform xformComp; Variation* varComp = vlf.GetVariationCopy(compIndex, VARTYPE_REG); - xformComp.AddVariation(varComp); - ParametricVariation* parVar = dynamic_cast*>(var); ParametricVariation* parVarComp = dynamic_cast*>(varComp); for (int iter = 0; iter < iters; iter++) { Point p, pComp; - xform.m_Affine.A(rand.Frand(-5, 5)); xform.m_Affine.B(rand.Frand(-5, 5)); xform.m_Affine.C(rand.Frand(-5, 5)); @@ -1468,7 +1401,6 @@ void TestVarsSimilar() xform.m_Affine.E(rand.Frand(-5, 5)); xform.m_Affine.F(rand.Frand(-5, 5)); xformComp.m_Affine = xform.m_Affine; - p.m_X = rand.Frand(-20, 20); p.m_Y = rand.Frand(-20, 20); p.m_Z = rand.Frand(-20, 20); @@ -1478,11 +1410,10 @@ void TestVarsSimilar() helper.m_Color.x = p.m_ColorX = rand.Frand01(); p.m_VizAdjusted = rand.Frand01(); pComp = p; - helper.m_PrecalcSumSquares = SQR(helper.m_TransX) + SQR(helper.m_TransY); helper.m_PrecalcSqrtSumSquares = sqrt(helper.m_PrecalcSumSquares); helper.m_PrecalcSina = helper.m_TransX / helper.m_PrecalcSqrtSumSquares; - helper.m_PrecalcCosa = helper.m_TransY / helper.m_PrecalcSqrtSumSquares; + helper.m_PrecalcCosa = helper.m_TransY / helper.m_PrecalcSqrtSumSquares; helper.m_PrecalcAtanxy = atan2(helper.m_TransX, helper.m_TransY); helper.m_PrecalcAtanyx = atan2(helper.m_TransY, helper.m_TransX); @@ -1509,13 +1440,11 @@ void TestVarsSimilar() var->Precalc(); var->Func(helper, p, rand); v4T varOut = helper.Out; - helper.Out = v4T(0); varComp->m_Weight = T(iter + 1); varComp->Precalc(); varComp->Func(helper, pComp, rand); v4T varCompOut = helper.Out; - xdiff += fabs(varOut.x - varCompOut.x); ydiff += fabs(varOut.y - varCompOut.y); zdiff += fabs(varOut.z - varCompOut.z); @@ -1552,7 +1481,6 @@ bool TestAllVarsCLBuild(size_t platform, size_t device, bool printSuccess = true QTIsaac rand; vector> devices{ std::make_pair(platform, device) }; RendererCL renderer(devices); - const char* loc = __FUNCTION__; if (!renderer.Ok()) @@ -1597,7 +1525,6 @@ void TestCpuGpuResults(size_t platform, size_t device) vector> points; vector> devices{ std::make_pair(platform, device) }; RendererCL renderer(devices); - points.resize(renderer.TotalIterKernelCount()); while (i < vlf.RegSize()) @@ -1623,13 +1550,11 @@ void TestCpuGpuResults(size_t platform, size_t device) Ember ember; Xform xform; Variation* varCopy = var->Copy(); - p.m_X = rand.Frand(-5, 5); p.m_Y = rand.Frand(-5, 5); p.m_Z = rand.Frand(-5, 5); p.m_ColorX = rand.Frand01(); p.m_VizAdjusted = rand.Frand01(); - varCopy->Random(rand); xform.AddVariation(varCopy); ember.AddXform(xform); @@ -1653,7 +1578,6 @@ void TestCpuGpuResults(size_t platform, size_t device) renderer.WritePoints(points); renderer.Iterate(1, 0, 1); renderer.ReadPoints(points); - T xdiff = fabs(p2.m_X - points[0].m_X); T ydiff = fabs(p2.m_Y - points[0].m_Y); T zdiff = fabs(p2.m_Z - points[0].m_Z); @@ -1697,23 +1621,18 @@ void TestGpuVectorRead(size_t platform, size_t device) vector> points; vector> devices{ std::make_pair(platform, device) }; RendererCL renderer(devices); - points.resize(renderer.TotalIterKernelCount()); - Variation* var = vlf.GetVariation(VAR_LINEAR); - bool newAlloc = false; Point p, p2; Ember ember; Xform xform; Variation* varCopy = var->Copy(); - p.m_X = rand.Frand(-5, 5); p.m_Y = rand.Frand(-5, 5); p.m_Z = rand.Frand(-5, 5); p.m_ColorX = rand.Frand01(); p.m_VizAdjusted = rand.Frand01(); - varCopy->Random(rand); xform.AddVariation(varCopy); ember.AddXform(xform); @@ -1732,7 +1651,6 @@ void TestGpuVectorRead(size_t platform, size_t device) uint i, iters = renderer.IterCountPerKernel() * renderer.TotalIterKernelCount();//Make each thread in each block run at least once. renderer.Iterate(iters, 0, 1); renderer.ReadPoints(points); - cout << __FUNCTION__ << ": GPU point test value results:" << endl; for (i = 0; i < points.size(); i++) @@ -1741,17 +1659,14 @@ void TestGpuVectorRead(size_t platform, size_t device) cout << "point[" << i << "].m_Y = " << points[i].m_Y << endl; cout << "point[" << i << "].m_Z = " << points[i].m_Z << endl; cout << "point[" << i << "].m_ColorX = " << points[i].m_ColorX << endl << endl; - minx = min(points[i].m_X, minx); miny = min(points[i].m_Y, miny); minz = min(points[i].m_Z, minz); mincolorx = min(points[i].m_ColorX, mincolorx); - maxx = max(points[i].m_X, maxx); maxy = max(points[i].m_Y, maxy); maxz = max(points[i].m_Z, maxz); maxcolorx = max(points[i].m_ColorX, maxcolorx); - sumx += points[i].m_X; sumy += points[i].m_Y; sumz += points[i].m_Z; @@ -1762,17 +1677,14 @@ void TestGpuVectorRead(size_t platform, size_t device) avgy = sumy / i; avgz = sumz / i; avgcolorx = sumcolorx / i; - cout << "avgx = " << avgx << endl; cout << "avgy = " << avgy << endl; cout << "avgz = " << avgz << endl; cout << "avgcolorx = " << avgcolorx << endl; - cout << "minx = " << minx << endl; cout << "miny = " << miny << endl; cout << "minz = " << minz << endl; cout << "mincolorx = " << mincolorx << endl << endl; - cout << "maxx = " << maxx << endl; cout << "maxy = " << maxy << endl; cout << "maxz = " << maxz << endl; @@ -1786,7 +1698,6 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache) size_t iters = vsize * ipp; vector vec; QTIsaac rand; - vec.resize(vsize); v4T* vdata = vec.data(); @@ -1797,7 +1708,6 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache) v4T v4(rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); int index = rand.Rand((ISAAC_INT)vsize); v4T v42 = vdata[index]; - v4.x = log(v4.x); v4.y = sqrt(v4.y); v4.z = sin(v4.z); @@ -1805,7 +1715,6 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache) v4 += T(1.234); v4 *= T(55.55); v4 /= T(0.0045); - vdata[index] = v4 + v42; } } @@ -1815,7 +1724,6 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache) { v4T v4(rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); int index = rand.Rand((ISAAC_INT)vsize); - v4.x = log(v4.x); v4.y = sqrt(v4.y); v4.z = sin(v4.z); @@ -1823,7 +1731,6 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache) v4 += T(1.234); v4 *= T(55.55); v4 /= T(0.0045); - vdata[index] += v4; } } @@ -1836,11 +1743,9 @@ void TestCross(T x, T y, T weight) T r = weight * sqrt(1 / (s * s + EPS)); T outX = x * r; T outY = y * r; - cout << "First way, outX, outY == " << outX << ", " << outY << endl; - r = fabs((x - y) * (x + y) + EPS); - + if (r < 0) r = -r; @@ -1852,7 +1757,7 @@ void TestCross(T x, T y, T weight) double RandD(QTIsaac& rand) { - return ((((rand.Rand()^(rand.Rand()<<15))&0xfffffff)*3.72529e-09)-0.5); + return ((((rand.Rand() ^ (rand.Rand() << 15)) & 0xfffffff) * 3.72529e-09) - 0.5); } // //#define BEZ_POINT_LENGTH 4 @@ -1860,7 +1765,7 @@ double RandD(QTIsaac& rand) //void BezierSolve(double t, glm::vec2* src, double* w, glm::vec2& solution) //{ // double s, s2, s3, t2, t3, nom_x, nom_y, denom; -// +// // s = 1 - t; // s2 = s * s; // s3 = s * s * s; @@ -1873,7 +1778,7 @@ double RandD(QTIsaac& rand) // // denom = w[0] * s3 + w[1] * s2 * 3 * t + w[2] * s * 3 * t2 + w[3] * t3; // -// +// // if (isnan(nom_x) || isnan(nom_y) || isnan(denom) || denom == 0) // return; // @@ -1929,16 +1834,15 @@ void TestThreadedKernel() if (wrapper1.Init(1, 0) && wrapper2.Init(2, 0)) { string k = ConstantDefinesString(false) + "\n__kernel void Kern()\n" - "{\n" - " int gid = GLOBAL_ID_X + GLOBAL_ID_Y;\n" - "}\n" - "\n"; + "{\n" + " int gid = GLOBAL_ID_X + GLOBAL_ID_Y;\n" + "}\n" + "\n"; if (wrapper1.AddProgram("prog1", k, "Kern", false) && - wrapper2.AddProgram("prog1", k, "Kern", false)) + wrapper2.AddProgram("prog1", k, "Kern", false)) { cout << "Builds ok, now run..." << endl; - std::thread th1([&]() { if (wrapper1.RunKernel(0, 256, 16, 1, 16, 16, 1)) @@ -1946,7 +1850,6 @@ void TestThreadedKernel() cout << "Successful run inside thread 1..." << endl; } }); - std::thread th2([&]() { if (wrapper2.RunKernel(0, 256, 16, 1, 16, 16, 1)) @@ -1954,7 +1857,6 @@ void TestThreadedKernel() cout << "Successful run inside thread 2..." << endl; } }); - th1.join(); th2.join(); cout << "Successful join of kernel thread..." << endl; @@ -1988,14 +1890,12 @@ void DistribTester() for (i = 0; i < xformCount; i++) { T d = weights[i]; - totalDensity += d; } //Original returned false if all were 0, but it's allowed here //which will just end up setting all elements to 0 which means //only the first xform will get used. - //Calculate how much of a fraction of a the total density each element represents. j = 0; tempDensity = 0; @@ -2015,9 +1915,11 @@ void DistribTester() while (tempDensity < currentDensityLimit && j < CHOOSE_XFORM_GRAIN) { #ifdef _DEBUG + //Ensure distribution contains no out of bounds indices. if (byte(i) >= xformCount) throw "Out of bounds xform index in selection distribution."; + #endif //printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity); m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i); @@ -2026,7 +1928,6 @@ void DistribTester() } } - //Flam3 did this, which gives the same result. //T t = xforms[0].m_Weight; // @@ -2060,51 +1961,50 @@ int _tmain(int argc, _TCHAR* argv[]) Timing t(4); QTIsaac rand(1, 2, 3); mt19937 meow(1729); - - /*MakeTestAllVarsRegPrePostComboFile("testallvarsout.flame"); - return 0; + /* MakeTestAllVarsRegPrePostComboFile("testallvarsout.flame"); + return 0; - TestThreadedKernel(); + TestThreadedKernel(); - PaletteList palf; - Palette* pal = palf.GetRandomPalette(); + PaletteList palf; + Palette* pal = palf.GetRandomPalette(); - cout << pal->Size() << endl; + cout << pal->Size() << endl; - double d = 1; + double d = 1; - for (int i = 0; i < 10; i++) - { + for (int i = 0; i < 10; i++) + { cout << "log10(" << d << ") = " << std::max(1u, uint(std::log10(d)) + 1u) << endl; d *= 10; - } + } - return 0;*/ + return 0;*/ /* - uint i, iters = (uint)10e7; - size_t total = 0; + uint i, iters = (uint)10e7; + size_t total = 0; - t.Tic(); - for (i = 0; i < iters; i++) - { + t.Tic(); + for (i = 0; i < iters; i++) + { total += rand.RandByte(); total += rand.Rand(); - } - t.Toc("Isaac sum"); + } + t.Toc("Isaac sum"); - cout << "Isaac total = " << total << " for " << i << " iters." << endl; + cout << "Isaac total = " << total << " for " << i << " iters." << endl; - total = 0; + total = 0; - t.Tic(); - for (i = 0; i < iters; i++) - { + t.Tic(); + for (i = 0; i < iters; i++) + { total += meow(); - } - t.Toc("Mt sum"); + } + t.Toc("Mt sum"); - cout << "Mt total = " << total << " for " << i << " iters." << endl; + cout << "Mt total = " << total << " for " << i << " iters." << endl; */ //glm::vec2 solution, src[4]; //double bezT = 1, w[4]; @@ -2112,18 +2012,16 @@ int _tmain(int argc, _TCHAR* argv[]) //BezierWeights curveWeights[4]; // //BezierSolve(bezT, src, w, solution); - //cout << pow(-1, 5.1) << endl; - - /*for (i = 0; i < 2500000000; i++) - { + /* for (i = 0; i < 2500000000; i++) + { double d = fabs(RandD(rand)); if (d >= 0.5) cout << d << endl; - } + } - return 0;*/ + return 0;*/ //cout << "sizeof(Ember): " << sizeof(Ember) << endl; //cout << "sizeof(Ember): " << sizeof(Ember) << endl; // @@ -2132,21 +2030,18 @@ int _tmain(int argc, _TCHAR* argv[]) // //cout << "sizeof(RendererCL): " << sizeof(RendererCL) << endl; //cout << "sizeof(RendererCL): " << sizeof(RendererCL) << endl; + /* unique_ptr> linV(new LinearVariation()); + unique_ptr> preLinV(new PreLinearVariation()); + unique_ptr> postLinV(new PostLinearVariation()); - /*unique_ptr> linV(new LinearVariation()); - unique_ptr> preLinV(new PreLinearVariation()); - unique_ptr> postLinV(new PostLinearVariation()); - - cout << linV->BaseName() << endl; - cout << preLinV->BaseName() << endl; - cout << postLinV->BaseName() << endl;*/ - + cout << linV->BaseName() << endl; + cout << preLinV->BaseName() << endl; + cout << postLinV->BaseName() << endl;*/ //float num = 1; //float denom = 4294967296.0f; //float frac = num / denom; // //cout << "num, denom, frac = " << num << ", " << denom << ", " << frac << endl; - //TestGpuVectorRead(); //TestGpuVectorRead(); //return 0; @@ -2173,117 +2068,91 @@ int _tmain(int argc, _TCHAR* argv[]) //TestCross(rand.Frand(-5, 5), rand.Frand(-5, 5), rand.Frand(-5, 5)); //TestCross(rand.Frand(-5, 5), rand.Frand(-5, 5), rand.Frand(-5, 5)); //TestCross(rand.Frand(-5, 5), rand.Frand(-5, 5), rand.Frand(-5, 5)); - //std::complex cd, cd2; - //cd2 = sin(cd); - t.Tic(); TestCasting(); t.Toc("TestCasting()"); - t.Tic(); VariationList vlf; t.Toc("Creating VariationList"); - cout << "There are " << vlf.Size() << " variations present." << endl; - #ifdef DO_DOUBLE t.Tic(); VariationList vld; t.Toc("Creating VariationList"); #endif - t.Tic(); TestVarCounts(); t.Toc("TestVarCounts()"); - t.Tic(); TestVarUnique(); t.Toc("TestVarUnique()"); - #ifdef DO_DOUBLE t.Tic(); TestVarUnique(); t.Toc("TestVarUnique()"); #endif - t.Tic(); TestVarCopy(); t.Toc("TestVarCopy()"); - #ifdef DO_DOUBLE t.Tic(); TestVarCopy(); t.Toc("TestVarCopy()"); - t.Tic(); TestVarCopy(); t.Toc("TestVarCopy()"); - t.Tic(); TestVarCopy(); t.Toc("TestVarCopy()"); #endif - t.Tic(); TestVarRegPrePost(); t.Toc("TestVarRegPrePost()"); - t.Tic(); TestParVars(); t.Toc("TestParVars()"); - t.Tic(); TestVarPrePostNames(); t.Toc("TestVarPrePostNames()"); - t.Tic(); TestVarPrecalcUsedCL(); t.Toc("TestVarPrecalcUsedCL()"); - t.Tic(); TestVarAssignTypes(); t.Toc("TestVarAssignTypes()"); - t.Tic(); TestVarAssignVals(); t.Toc("TestVarAssignVals()"); - t.Tic(); TestZepsFloor(); t.Toc("TestZepsFloor()"); - t.Tic(); TestConstants(); t.Toc("TestConstants()"); - t.Tic(); TestGlobalFuncs(); t.Toc("TestGlobalFuncs()"); - - /*t.Tic(); - TestXformsInOutPoints(); - t.Toc("TestXformsInOutPoints()"); - - t.Tic(); - TestVarTime(); - t.Toc("TestVarTime()"); - */ + /* t.Tic(); + TestXformsInOutPoints(); + t.Toc("TestXformsInOutPoints()"); + t.Tic(); + TestVarTime(); + t.Toc("TestVarTime()"); + */ t.Tic(); TestOperations(); t.Toc("TestOperations()"); - //t.Tic(); //TestVarsSimilar(); //t.Toc("TestVarsSimilar()"); - #ifdef TEST_CL //t.Tic(); //TestCpuGpuResults(); //t.Toc("TestCpuGpuResults()"); - + //t.Tic(); //b = TestAllVarsCLBuild(0, 0, true); //t.Toc("TestAllVarsCLBuild()"); @@ -2296,6 +2165,7 @@ int _tmain(int argc, _TCHAR* argv[]) } #ifdef DO_DOUBLE + //t.Tic(); //TestCpuGpuResults(); //t.Toc("TestCpuGpuResults()"); @@ -2312,9 +2182,9 @@ int _tmain(int argc, _TCHAR* argv[]) t.Toc("TestAllVarsCLBuild()"); } } -#endif -#endif +#endif +#endif //PrintAllVars(); //_CrtDumpMemoryLeaks(); return 0; diff --git a/Source/Fractorium/FinalRenderDialog.cpp b/Source/Fractorium/FinalRenderDialog.cpp index 1181424..2119313 100644 --- a/Source/Fractorium/FinalRenderDialog.cpp +++ b/Source/Fractorium/FinalRenderDialog.cpp @@ -11,17 +11,15 @@ /// The parent widget /// The window flags. Default: 0. FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) - : QDialog(p, f), - m_Info(OpenCLInfo::Instance()) -{ + : QDialog(p, f) +{ ui.setupUi(this); - int row = 0, spinHeight = 20; uint i; double dmax = numeric_limits::max(); QTableWidget* table = ui.FinalRenderParamsTable; QTableWidgetItem* item = nullptr; - + m_Info = OpenCLInfo::Instance(); m_Fractorium = qobject_cast(p); m_Settings = settings; ui.FinalRenderThreadCountSpin->setRange(1, Timing::ProcessorCount()); @@ -39,7 +37,6 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set connect(ui.FinalRenderScaleWidthRadioButton, SIGNAL(toggled(bool)), this, SLOT(OnScaleRadioButtonChanged(bool)), Qt::QueuedConnection); connect(ui.FinalRenderScaleHeightRadioButton, SIGNAL(toggled(bool)), this, SLOT(OnScaleRadioButtonChanged(bool)), Qt::QueuedConnection); connect(ui.FinalRenderDeviceTable, SIGNAL(cellChanged(int, int)), this, SLOT(OnDeviceTableCellChanged(int, int)), Qt::QueuedConnection); - SetupSpinner(ui.FinalRenderSizeTable, this, row, 1, m_WidthScaleSpin, spinHeight, 0.001, 99.99, 0.1, SIGNAL(valueChanged(double)), SLOT(OnWidthScaleChanged(double)), true, 1.0, 1.0, 1.0); SetupSpinner(ui.FinalRenderSizeTable, this, row, 1, m_HeightScaleSpin, spinHeight, 0.001, 99.99, 0.1, SIGNAL(valueChanged(double)), SLOT(OnHeightScaleChanged(double)), true, 1.0, 1.0, 1.0); m_WidthScaleSpin->setDecimals(3); @@ -48,46 +45,37 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set m_HeightScaleSpin->setSuffix(" ( )"); m_WidthScaleSpin->SmallStep(0.001); m_HeightScaleSpin->SmallStep(0.001); - row = 0; SetupSpinner(table, this, row, 1, m_QualitySpin, spinHeight, 1, dmax, 50, SIGNAL(valueChanged(double)), SLOT(OnQualityChanged(double)), true, 1000, 1000, 1000); SetupSpinner (table, this, row, 1, m_TemporalSamplesSpin, spinHeight, 1, 5000, 50, SIGNAL(valueChanged(int)), SLOT(OnTemporalSamplesChanged(int)), true, 1000, 1000, 1000); SetupSpinner (table, this, row, 1, m_SupersampleSpin, spinHeight, 1, 4, 1, SIGNAL(valueChanged(int)), SLOT(OnSupersampleChanged(int)), true, 2, 1, 1); SetupSpinner (table, this, row, 1, m_StripsSpin, spinHeight, 1, 64, 1, SIGNAL(valueChanged(int)), SLOT(OnStripsChanged(int)), true, 1, 1, 1); - m_MemoryCellIndex = row++;//Memory usage. m_ItersCellIndex = row++;//Iters. m_PathCellIndex = row; - QStringList comboList; - comboList.append("jpg"); comboList.append("png"); - m_Tbcw = new TwoButtonComboWidget("...", "Open", comboList, 22, 40, 22, table); table->setCellWidget(row, 1, m_Tbcw); table->item(row++, 1)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); connect(m_Tbcw->m_Button1, SIGNAL(clicked(bool)), this, SLOT(OnFileButtonClicked(bool)), Qt::QueuedConnection); connect(m_Tbcw->m_Button2, SIGNAL(clicked(bool)), this, SLOT(OnShowFolderButtonClicked(bool)), Qt::QueuedConnection); connect(m_Tbcw->m_Combo, SIGNAL(currentIndexChanged(int)), this, SLOT(OnExtIndexChanged(int)), Qt::QueuedConnection); - m_PrefixEdit = new QLineEdit(table); table->setCellWidget(row++, 1, m_PrefixEdit); - m_SuffixEdit = new QLineEdit(table); table->setCellWidget(row++, 1, m_SuffixEdit); connect(m_PrefixEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnPrefixChanged(const QString&)), Qt::QueuedConnection); connect(m_SuffixEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnSuffixChanged(const QString&)), Qt::QueuedConnection); - ui.FinalRenderStartButton->disconnect(SIGNAL(clicked(bool))); connect(ui.FinalRenderStartButton, SIGNAL(clicked(bool)), this, SLOT(OnRenderClicked(bool)), Qt::QueuedConnection); connect(ui.FinalRenderStopButton, SIGNAL(clicked(bool)), this, SLOT(OnCancelRenderClicked(bool)), Qt::QueuedConnection); - table = ui.FinalRenderDeviceTable; table->clearContents(); table->setRowCount(0); - if (m_Info.Ok() && !m_Info.Devices().empty()) + if (m_Info->Ok() && !m_Info->Devices().empty()) { SetupDeviceTable(table, m_Settings->FinalDevices()); @@ -124,28 +112,25 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(tpc); else ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(Clamp(m_Settings->FinalThreadPriority() / 25, 0, tpc)); -#endif +#endif m_QualitySpin->setValue(m_Settings->FinalQuality()); m_TemporalSamplesSpin->setValue(m_Settings->FinalTemporalSamples()); m_SupersampleSpin->setValue(m_Settings->FinalSupersample()); m_StripsSpin->setValue(m_Settings->FinalStrips()); - Scale(eScaleType(m_Settings->FinalScale())); if (m_Settings->FinalExt() == "jpg") m_Tbcw->m_Combo->setCurrentIndex(0); else m_Tbcw->m_Combo->setCurrentIndex(1); - + //Explicitly call these to enable/disable the appropriate controls. OnOpenCLCheckBoxStateChanged(ui.FinalRenderOpenCLCheckBox->isChecked()); OnDoAllCheckBoxStateChanged(ui.FinalRenderDoAllCheckBox->isChecked()); OnDoSequenceCheckBoxStateChanged(ui.FinalRenderDoSequenceCheckBox->isChecked()); - QSize s = size(); int desktopHeight = qApp->desktop()->availableGeometry().height(); - s.setHeight(std::min(s.height(), int(double(desktopHeight * 0.90)))); setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, qApp->desktop()->availableGeometry())); ui.FinalRenderThreadHorizontalLayout->setAlignment(Qt::AlignLeft); @@ -153,7 +138,6 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set ui.FinalRenderThreadHorizontalLayout->setAlignment(ui.FinalRenderThreadPriorityLabel, Qt::AlignLeft); ui.FinalRenderThreadHorizontalLayout->setAlignment(ui.FinalRenderThreadPriorityComboBox, Qt::AlignLeft); QWidget* w = SetTabOrder(this, ui.FinalRenderEarlyClipCheckBox, ui.FinalRenderYAxisUpCheckBox); - //Update these with new controls. w = SetTabOrder(this, w, ui.FinalRenderTransparencyCheckBox); w = SetTabOrder(this, w, ui.FinalRenderOpenCLCheckBox); @@ -238,7 +222,6 @@ QList FractoriumFinalRenderDialog::Devices() { return DeviceTableToSet FinalRenderGuiState FractoriumFinalRenderDialog::State() { FinalRenderGuiState state; - state.m_EarlyClip = EarlyClip(); state.m_YAxisUp = YAxisUp(); state.m_Transparency = Transparency(); @@ -262,7 +245,6 @@ FinalRenderGuiState FractoriumFinalRenderDialog::State() state.m_TemporalSamples = TemporalSamples(); state.m_Supersample = Supersample(); state.m_Strips = Strips(); - return state; } @@ -346,7 +328,6 @@ void FractoriumFinalRenderDialog::OnTransparencyCheckBoxStateChanged(int state) void FractoriumFinalRenderDialog::OnOpenCLCheckBoxStateChanged(int state) { bool checked = state == Qt::Checked; - ui.FinalRenderDeviceTable->setEnabled(checked); ui.FinalRenderThreadCountSpin->setEnabled(!checked); ui.FinalRenderThreadPriorityLabel->setEnabled(!checked); @@ -387,7 +368,6 @@ void FractoriumFinalRenderDialog::OnDoAllCheckBoxStateChanged(int state) void FractoriumFinalRenderDialog::OnDoSequenceCheckBoxStateChanged(int state) { bool checked = ui.FinalRenderDoSequenceCheckBox->isChecked(); - m_TemporalSamplesSpin->setEnabled(checked); if (checked) @@ -428,7 +408,7 @@ void FractoriumFinalRenderDialog::OnApplyAllCheckBoxStateChanged(int state) void FractoriumFinalRenderDialog::OnWidthScaleChanged(double d) { if (ui.FinalRenderKeepAspectCheckBox->isChecked() && m_Controller.get()) - m_HeightScaleSpin->SetValueStealth(m_WidthScaleSpin->value()); + m_HeightScaleSpin->SetValueStealth(m_WidthScaleSpin->value()); if (SetMemory()) m_Controller->SyncCurrentToSizeSpinners(false, true); @@ -443,7 +423,7 @@ void FractoriumFinalRenderDialog::OnWidthScaleChanged(double d) void FractoriumFinalRenderDialog::OnHeightScaleChanged(double d) { if (ui.FinalRenderKeepAspectCheckBox->isChecked() && m_Controller.get()) - m_WidthScaleSpin->SetValueStealth(m_HeightScaleSpin->value()); + m_WidthScaleSpin->SetValueStealth(m_HeightScaleSpin->value()); if (SetMemory()) m_Controller->SyncCurrentToSizeSpinners(false, true); @@ -578,7 +558,7 @@ void FractoriumFinalRenderDialog::OnFileButtonClicked(bool checked) void FractoriumFinalRenderDialog::OnShowFolderButtonClicked(bool checked) { QString s = m_Settings->SaveFolder(); - + if (Exists(s)) QDesktopServices::openUrl(QUrl::fromLocalFile(s)); else @@ -673,13 +653,12 @@ void FractoriumFinalRenderDialog::showEvent(QShowEvent* e) m_Controller->m_ImageCount = 0; SetMemory(); m_Controller->ResetProgress(); - QString s = m_Settings->SaveFolder(); if (Exists(s)) Path(m_Controller->ComposePath(m_Controller->Name()));//Update the GUI. } - + ui.FinalRenderTextOutput->clear(); QDialog::showEvent(e); } @@ -708,13 +687,12 @@ bool FractoriumFinalRenderDialog::CreateControllerFromGUI(bool createRenderer) { bool ok = true; int index = Current() - 1; - #ifdef DO_DOUBLE size_t elementSize = Double() ? sizeof(double) : sizeof(float); #else size_t elementSize = sizeof(float); #endif - + if (!m_Controller.get() || (m_Controller->SizeOfT() != elementSize)) { #ifdef DO_DOUBLE @@ -740,6 +718,7 @@ bool FractoriumFinalRenderDialog::CreateControllerFromGUI(bool createRenderer) //Create a float or double controller based on the GUI. #ifdef DO_DOUBLE + if (Double()) m_Controller = unique_ptr(new FinalRenderEmberController(this)); else @@ -778,10 +757,9 @@ bool FractoriumFinalRenderDialog::SetMemory() bool error = false; tuple p = m_Controller->SyncAndComputeMemory(); QString s; - ui.FinalRenderParamsTable->item(m_MemoryCellIndex, 1)->setText(ToString(get<1>(p))); ui.FinalRenderParamsTable->item(m_ItersCellIndex, 1)->setText(ToString(get<2>(p))); - + if (OpenCL() && !m_Wrappers.empty()) { auto devices = Devices(); @@ -799,13 +777,13 @@ bool FractoriumFinalRenderDialog::SetMemory() if (histSize > maxAlloc) { temp = "Histogram/Accumulator memory size of " + ToString(histSize) + - " is greater than the max OpenCL allocation size of " + ToString(maxAlloc); + " is greater than the max OpenCL allocation size of " + ToString(maxAlloc); } if (totalSize > totalAvail) { temp += "\n\nTotal required memory size of " + ToString(totalSize) + - " is greater than the max OpenCL available memory of " + ToString(totalAvail); + " is greater than the max OpenCL available memory of " + ToString(totalAvail); } if (!temp.isEmpty()) diff --git a/Source/Fractorium/FinalRenderDialog.h b/Source/Fractorium/FinalRenderDialog.h index 4833843..6e5874b 100644 --- a/Source/Fractorium/FinalRenderDialog.h +++ b/Source/Fractorium/FinalRenderDialog.h @@ -40,7 +40,7 @@ class FractoriumFinalRenderDialog : public QDialog friend Fractorium; friend FinalRenderEmberControllerBase; friend FinalRenderEmberController; - + #ifdef DO_DOUBLE friend FinalRenderEmberController; #endif @@ -112,7 +112,7 @@ protected: private: bool CreateControllerFromGUI(bool createRenderer); bool SetMemory(); - + int m_MemoryCellIndex; int m_ItersCellIndex; int m_PathCellIndex; @@ -128,7 +128,7 @@ private: QLineEdit* m_SuffixEdit; FractoriumSettings* m_Settings; Fractorium* m_Fractorium; - OpenCLInfo& m_Info; + shared_ptr m_Info; vector m_Wrappers; unique_ptr m_Controller; Ui::FinalRenderDialog ui; diff --git a/Source/Fractorium/FinalRenderEmberController.cpp b/Source/Fractorium/FinalRenderEmberController.cpp index c6a9de0..7db8451 100644 --- a/Source/Fractorium/FinalRenderEmberController.cpp +++ b/Source/Fractorium/FinalRenderEmberController.cpp @@ -32,7 +32,6 @@ void FinalRenderEmberController::CancelRender() if (m_Result.isRunning()) { tbb::task_group g; - g.run([&] { m_Run = false; @@ -65,7 +64,6 @@ void FinalRenderEmberController::CancelRender() } } }); - g.wait(); while (m_Result.isRunning()) @@ -82,9 +80,8 @@ void FinalRenderEmberController::CancelRender() /// True if a valid renderer is created or if no action is taken, else false. bool FinalRenderEmberControllerBase::CreateRendererFromGUI() { - bool useOpenCL = m_Info.Ok() && m_FinalRenderDialog->OpenCL(); + bool useOpenCL = m_Info->Ok() && m_FinalRenderDialog->OpenCL(); auto v = Devices(m_FinalRenderDialog->Devices()); - return CreateRenderer((useOpenCL && !v.empty()) ? OPENCL_RENDERER : CPU_RENDERER, v, false);//Not shared. @@ -111,13 +108,11 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_FinalPreviewRenderer = unique_ptr>(new EmberNs::Renderer()); m_FinalPreviewRenderer->Callback(nullptr); m_FinalPreviewRenderer->NumChannels(4); - m_FinalPreviewRenderFunc = [&]() { m_PreviewCs.Enter();//Thread prep. m_PreviewRun = true; m_FinalPreviewRenderer->Abort(); - T scalePercentage; size_t maxDim = 100; QLabel* widget = m_FinalRenderDialog->ui.FinalRenderPreviewLabel; @@ -134,32 +129,27 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_PreviewEmber.m_FinalRasW = std::max(1, std::min(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasW)));//Ensure neither is zero. m_PreviewEmber.m_FinalRasH = std::max(1, std::min(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasH))); m_PreviewEmber.m_PixelsPerUnit = scalePercentage * m_Ember->m_PixelsPerUnit; - m_FinalPreviewRenderer->EarlyClip(m_FinalRenderDialog->EarlyClip()); m_FinalPreviewRenderer->YAxisUp(m_FinalRenderDialog->YAxisUp()); m_FinalPreviewRenderer->Transparency(m_FinalRenderDialog->Transparency()); m_FinalPreviewRenderer->SetEmber(m_PreviewEmber); m_FinalPreviewRenderer->PrepFinalAccumVector(m_PreviewFinalImage);//Must manually call this first because it could be erroneously made smaller due to strips if called inside Renderer::Run(). - auto strips = VerifyStrips(m_PreviewEmber.m_FinalRasH, m_FinalRenderDialog->Strips(), - [&](const string& s) { }, [&](const string& s) { }, [&](const string& s) { }); - + [&](const string & s) { }, [&](const string & s) { }, [&](const string & s) { }); StripsRender(m_FinalPreviewRenderer.get(), m_PreviewEmber, m_PreviewFinalImage, 0, strips, m_FinalRenderDialog->YAxisUp(), - [&](size_t strip) { },//Pre strip. - [&](size_t strip) { },//Post strip. - [&](size_t strip) { },//Error. - [&](Ember& finalEmber)//Final strip. - { - QImage image(finalEmber.m_FinalRasW, finalEmber.m_FinalRasH, QImage::Format_RGBA8888);//The label wants RGBA. - memcpy(image.scanLine(0), m_PreviewFinalImage.data(), finalEmber.m_FinalRasW * finalEmber.m_FinalRasH * 4);//Memcpy the data in. - QPixmap pixmap = QPixmap::fromImage(image); - QMetaObject::invokeMethod(widget, "setPixmap", Qt::QueuedConnection, Q_ARG(QPixmap, pixmap)); - }); - + [&](size_t strip) { },//Pre strip. + [&](size_t strip) { },//Post strip. + [&](size_t strip) { },//Error. + [&](Ember& finalEmber)//Final strip. + { + QImage image(finalEmber.m_FinalRasW, finalEmber.m_FinalRasH, QImage::Format_RGBA8888);//The label wants RGBA. + memcpy(image.scanLine(0), m_PreviewFinalImage.data(), finalEmber.m_FinalRasW * finalEmber.m_FinalRasH * 4);//Memcpy the data in. + QPixmap pixmap = QPixmap::fromImage(image); + QMetaObject::invokeMethod(widget, "setPixmap", Qt::QueuedConnection, Q_ARG(QPixmap, pixmap)); + }); m_PreviewRun = false; m_PreviewCs.Leave(); }; - //The main rendering function which will be called in a Qt thread. //A backup Xml is made before the rendering process starts just in case it crashes before finishing. //If it finishes successfully, delete the backup file. @@ -168,7 +158,6 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_Run = true; m_TotalTimer.Tic();//Begin timing for progress of all operations. m_GuiState = m_FinalRenderDialog->State();//Cache render settings from the GUI before running. - size_t i; bool doAll = m_GuiState.m_DoAll && m_EmberFile.Size() > 1; size_t currentStripForProgress = 0;//Sort of a hack to get the strip value to the progress function. @@ -184,11 +173,10 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_FinishedImageCount.store(0); SyncGuiToRenderer(); FirstOrDefaultRenderer()->m_ProgressParameter = reinterpret_cast(¤tStripForProgress);//When animating, only the first (primary) device has a progress parameter. - m_GuiState.m_Strips = VerifyStrips(m_Ember->m_FinalRasH, m_GuiState.m_Strips, - [&](const string& s) { Output(QString::fromStdString(s)); },//Greater than height. - [&](const string& s) { Output(QString::fromStdString(s)); },//Mod height != 0. - [&](const string& s) { Output(QString::fromStdString(s) + "\n"); });//Final strips value to be set. + [&](const string & s) { Output(QString::fromStdString(s)); }, //Greater than height. + [&](const string & s) { Output(QString::fromStdString(s)); }, //Mod height != 0. + [&](const string & s) { Output(QString::fromStdString(s) + "\n"); }); //Final strips value to be set. ResetProgress(); //The rendering process is different between doing a single image, and doing multiple. @@ -205,7 +193,7 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD for (i = 0; i < m_EmberFile.Size() && m_Run; i++) { SyncGuiToEmber(m_EmberFile.m_Embers[i], firstEmber->m_FinalRasW, firstEmber->m_FinalRasH); - + if (i > 0) { if (m_EmberFile.m_Embers[i].m_Time <= m_EmberFile.m_Embers[i - 1].m_Time) @@ -221,13 +209,11 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD std::atomic atomfTime; vector threadVec; - //Not supporting strips with animation. //Shouldn't be a problem because animations will be at max 4k x 2k which will take about 1GB - //even when using double precision, which most cards at the time of this writing already exceed. + //even when using double precision, which most cards at the time of this writing already exceed. m_GuiState.m_Strips = 1; atomfTime.store(0); - std::function iterFunc = [&](size_t index) { size_t ftime; @@ -244,7 +230,6 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD while (atomfTime.fetch_add(1), ((ftime = atomfTime.load() - 1) < m_EmberFile.Size()) && m_Run)//Needed to set 1 to claim this iter from other threads, so decrement it to be zero-indexed here. { T localTime = T(ftime); - Output("Image " + ToString(ftime + 1ULL) + ":\n" + ComposePath(QString::fromStdString(m_EmberFile.m_Embers[ftime].m_Name))); renderer->Reset();//Have to manually set this since the ember is not set each time through. renderTimer.Tic();//Toc() is called in RenderComplete(). @@ -264,18 +249,16 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD stats = renderer->Stats(); comments = renderer->ImageComments(stats, 0, false, true); - writeThread = std::thread([&](size_t tempTime, size_t threadFinalImageIndex) { SaveCurrentRender(m_EmberFile.m_Embers[tempTime], - comments,//These all don't change during the renders, so it's ok to access them in the thread. - finalImages[threadFinalImageIndex], - renderer->FinalRasW(), - renderer->FinalRasH(), - renderer->NumChannels(), - renderer->BytesPerChannel()); + comments,//These all don't change during the renders, so it's ok to access them in the thread. + finalImages[threadFinalImageIndex], + renderer->FinalRasW(), + renderer->FinalRasH(), + renderer->NumChannels(), + renderer->BytesPerChannel()); }, ftime, finalImageIndex); - m_FinishedImageCount.fetch_add(1); RenderComplete(m_EmberFile.m_Embers[ftime], stats, renderTimer); @@ -289,7 +272,6 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD if (writeThread.joinable())//One final check to make sure all writing is done before exiting this thread. writeThread.join(); }; - threadVec.reserve(m_Renderers.size()); for (size_t r = 0; r < m_Renderers.size(); r++) @@ -318,7 +300,6 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD m_Stats.Clear(); Memset(m_FinalImage); m_RenderTimer.Tic();//Toc() is called in RenderComplete(). - StripsRender(m_Renderer.get(), m_EmberFile.m_Embers[i], m_FinalImage, 0, m_GuiState.m_Strips, m_GuiState.m_YAxisUp, [&](size_t strip) { currentStripForProgress = strip; },//Pre strip. [&](size_t strip) { m_Stats += m_Renderer->Stats(); },//Post strip. @@ -351,7 +332,6 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD Memset(m_FinalImage); Output(ComposePath(QString::fromStdString(m_Ember->m_Name))); m_RenderTimer.Tic();//Toc() is called in RenderComplete(). - StripsRender(m_Renderer.get(), *m_Ember, m_FinalImage, 0, m_GuiState.m_Strips, m_GuiState.m_YAxisUp, [&](size_t strip) { currentStripForProgress = strip; },//Pre strip. [&](size_t strip) { m_Stats += m_Renderer->Stats(); },//Post strip. @@ -375,7 +355,6 @@ FinalRenderEmberController::FinalRenderEmberController(FractoriumFinalRenderD QString totalTimeString = "All renders completed in: " + QString::fromStdString(m_TotalTimer.Format(m_TotalTimer.Toc())) + "."; Output(totalTimeString); - QFile::remove(backup); m_Run = false; }; @@ -457,7 +436,6 @@ bool FinalRenderEmberController::Render() if (CreateRendererFromGUI()) { m_FinalRenderDialog->ui.FinalRenderTextOutput->setText("Preparing all parameters.\n"); - //Note that a Qt thread must be used, rather than a tbb task. //This is because tbb does a very poor job of allocating thread resources //and dedicates an entire core just to this thread which does nothing waiting for the @@ -486,18 +464,16 @@ bool FinalRenderEmberController::CreateRenderer(eRendererType renderType, con bool deviceDiff = false; //uint channels = m_FinalRenderDialog->Ext().endsWith("png", Qt::CaseInsensitive) ? 4 : 3; bool renderTypeMismatch = (m_Renderer.get() && (m_Renderer->RendererType() != renderType)) || - (!m_Renderers.empty() && (m_Renderers[0]->RendererType() != renderType)); - + (!m_Renderers.empty() && (m_Renderers[0]->RendererType() != renderType)); CancelRender(); if ((!m_FinalRenderDialog->DoSequence() && (!m_Renderer.get() || !m_Renderer->Ok())) || - (m_FinalRenderDialog->DoSequence() && m_Renderers.empty()) || - renderTypeMismatch || - !Equal(m_Devices, devices)) + (m_FinalRenderDialog->DoSequence() && m_Renderers.empty()) || + renderTypeMismatch || + !Equal(m_Devices, devices)) { EmberReport emberReport; vector errorReport; - m_Devices = devices;//Store values for re-creation later on. m_OutputTexID = 0;//Don't care about tex ID when doing final render. m_Shared = shared;//So shared is of course false. @@ -555,7 +531,6 @@ int FinalRenderEmberController::ProgressFunc(Ember& ember, void* foo, doub QMetaObject::invokeMethod(m_FinalRenderDialog->ui.FinalRenderImageCountLabel, "setText", Qt::QueuedConnection, Q_ARG(const QString&, ToString(m_FinishedImageCount.load() + 1) + " / " + ToString(m_ImageCount) + " Eta: " + QString::fromStdString(m_RenderTimer.Format(etaMs)))); QMetaObject::invokeMethod(m_FinalRenderDialog->ui.FinalRenderTextOutput, "update", Qt::QueuedConnection); - return m_Run ? 1 : 0; } @@ -698,14 +673,12 @@ tuple FinalRenderEmberController::SyncAndComputeMemor size_t strips; bool b = false; uint channels = m_FinalRenderDialog->Ext() == "png" ? 4 : 3;//4 channels for Png, else 3. - SyncGuiToEmbers(); - + if (m_Renderer.get()) { strips = VerifyStrips(m_Ember->m_FinalRasH, m_FinalRenderDialog->Strips(), - [&](const string& s) {}, [&](const string& s) {}, [&](const string& s) {}); - + [&](const string & s) {}, [&](const string & s) {}, [&](const string & s) {}); m_Renderer->SetEmber(*m_Ember); m_Renderer->CreateSpatialFilter(b); m_Renderer->CreateTemporalFilter(b); @@ -715,7 +688,6 @@ tuple FinalRenderEmberController::SyncAndComputeMemor m_Renderer->ComputeCamera(); CancelPreviewRender(); m_FinalPreviewRenderFunc(); - p = m_Renderer->MemoryRequired(strips, true, m_FinalRenderDialog->DoSequence()); iterCount = m_Renderer->TotalIterCount(strips); } @@ -734,14 +706,12 @@ tuple FinalRenderEmberController::SyncAndComputeMemor CancelPreviewRender(); m_FinalPreviewRenderFunc(); - strips = 1; p = m_Renderers[0]->MemoryRequired(1, true, m_FinalRenderDialog->DoSequence()); iterCount = m_Renderers[0]->TotalIterCount(strips); } - m_FinalRenderDialog->m_StripsSpin->setSuffix(" (" + ToString(strips) +")"); - + m_FinalRenderDialog->m_StripsSpin->setSuffix(" (" + ToString(strips) + ")"); return tuple(p.first, p.second, iterCount); } @@ -757,7 +727,6 @@ QString FinalRenderEmberController::ComposePath(const QString& name) { QString path = MakeEnd(m_Settings->SaveFolder(), '/');//Base path. QString full = path + m_FinalRenderDialog->Prefix() + name + m_FinalRenderDialog->Suffix() + "." + m_FinalRenderDialog->Ext(); - return EmberFile::UniqueFilename(full); } @@ -794,7 +763,9 @@ void FinalRenderEmberController::CancelPreviewRender() m_FinalPreviewRenderer->Abort(); while (m_FinalPreviewRenderer->InRender()) { QApplication::processEvents(); } + while (m_PreviewRun) { QApplication::processEvents(); } + while (m_FinalPreviewResult.isRunning()) { QApplication::processEvents(); } } @@ -871,13 +842,12 @@ void FinalRenderEmberController::RenderComplete(Ember& ember, const EmberS QString status, filename = ComposePath(QString::fromStdString(ember.m_Name)); QString itersString = ToString(stats.m_Iters); QString itersPerSecString = ToString(size_t(stats.m_Iters / (stats.m_IterMs / 1000.0))); - + if (m_GuiState.m_SaveXml) { QFileInfo xmlFileInfo(filename);//Create another one in case it was modified for batch rendering. QString newPath = xmlFileInfo.absolutePath() + '/' + xmlFileInfo.completeBaseName() + ".flame"; xmlDocPtr tempEdit = ember.m_Edits; - ember.m_Edits = m_XmlWriter.CreateNewEditdoc(&ember, nullptr, "edit", m_Settings->Nick().toStdString(), m_Settings->Url().toStdString(), m_Settings->Id().toStdString(), "", 0, 0); m_XmlWriter.Save(newPath.toStdString().c_str(), ember, 0, true, false, true);//Note that the ember passed is used, rather than m_Ember because it's what was actually rendered. @@ -887,7 +857,6 @@ void FinalRenderEmberController::RenderComplete(Ember& ember, const EmberS status = "Pure render time: " + QString::fromStdString(renderTimeString); Output(status); - totalTimeString = renderTimer.Format(renderTimer.Toc()); status = "Total time: " + QString::fromStdString(totalTimeString) + "\nTotal iters: " + itersString + "\nIters/second: " + itersPerSecString + "\n"; Output(status); @@ -940,14 +909,12 @@ void FinalRenderEmberController::SyncGuiToEmber(Ember& ember, size_t width { double wScale = m_FinalRenderDialog->m_WidthScaleSpin->value(); double hScale = m_FinalRenderDialog->m_HeightScaleSpin->value(); - w = ember.m_OrigFinalRasW * wScale; h = ember.m_OrigFinalRasH * hScale; } w = std::max(w, 10); h = std::max(h, 10); - ember.SetSizeAndAdjustScale(w, h, false, m_FinalRenderDialog->Scale()); ember.m_Quality = m_FinalRenderDialog->m_QualitySpin->value(); ember.m_Supersample = m_FinalRenderDialog->m_SupersampleSpin->value(); diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp index cdd6e67..7e76e45 100644 --- a/Source/Fractorium/Fractorium.cpp +++ b/Source/Fractorium/Fractorium.cpp @@ -14,20 +14,18 @@ /// is present here, it's safe to assume it can't be done in the designer. ///
/// The parent widget of this item -Fractorium::Fractorium(QWidget* p) - : QMainWindow(p), - m_Info(OpenCLInfo::Instance()) +Fractorium::Fractorium(QWidget* p) + : QMainWindow(p) { int spinHeight = 20, iconSize_ = 9; size_t i = 0; string s; Timing t; ui.setupUi(this); - + m_Info = OpenCLInfo::Instance(); qRegisterMetaType>("QVector");//For previews. qRegisterMetaType>("vector"); qRegisterMetaType("EmberTreeWidgetItemBase*"); - setDockOptions(DockOption::AllowNestedDocks | DockOption::AllowTabbedDocks); setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::TabPosition::North); setTabShape(QTabWidget::TabShape::Triangular); @@ -36,7 +34,6 @@ Fractorium::Fractorium(QWidget* p) tabifyDockWidget(ui.XformsDockWidget, ui.XaosDockWidget); tabifyDockWidget(ui.XaosDockWidget, ui.PaletteDockWidget); tabifyDockWidget(ui.PaletteDockWidget, ui.InfoDockWidget); - m_Docks.reserve(8); m_Docks.push_back(ui.LibraryDockWidget); m_Docks.push_back(ui.FlameDockWidget); @@ -44,58 +41,48 @@ Fractorium::Fractorium(QWidget* p) m_Docks.push_back(ui.XaosDockWidget); m_Docks.push_back(ui.PaletteDockWidget); m_Docks.push_back(ui.InfoDockWidget); - m_FontSize = 9; 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_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_AboutDialog = new FractoriumAboutDialog(this); - //Put the about dialog in the screen center. const QRect screen = QApplication::desktop()->screenGeometry(); m_AboutDialog->move(screen.center() - m_AboutDialog->rect().center()); - connect(m_ColorDialog, SIGNAL(colorSelected(const QColor&)), this, SLOT(OnColorSelected(const QColor&)), Qt::QueuedConnection); - m_XformComboColors[i++] = QColor(0XFF, 0X00, 0X00); m_XformComboColors[i++] = QColor(0XCC, 0XCC, 0X00); m_XformComboColors[i++] = QColor(0X00, 0XCC, 0X00); m_XformComboColors[i++] = QColor(0X00, 0XCC, 0XCC); m_XformComboColors[i++] = QColor(0X40, 0X40, 0XFF); - m_XformComboColors[i++] = QColor(0XCC, 0X00, 0XCC); m_XformComboColors[i++] = QColor(0XCC, 0X80, 0X00); m_XformComboColors[i++] = QColor(0X80, 0X00, 0X4F); m_XformComboColors[i++] = QColor(0X80, 0X80, 0X22); m_XformComboColors[i++] = QColor(0X60, 0X80, 0X60); - m_XformComboColors[i++] = QColor(0X50, 0X80, 0X80); m_XformComboColors[i++] = QColor(0X4F, 0X4F, 0X80); m_XformComboColors[i++] = QColor(0X80, 0X50, 0X80); m_XformComboColors[i++] = QColor(0X80, 0X60, 0X22); m_FinalXformComboColor = QColor(0x7F, 0x7F, 0x7F); - + for (i = 0; i < XFORM_COLOR_COUNT; i++) { QPixmap pixmap(iconSize_, iconSize_); - pixmap.fill(m_XformComboColors[i]); m_XformComboIcons[i] = QIcon(pixmap); } QPixmap pixmap(iconSize_, iconSize_); - pixmap.fill(m_FinalXformComboColor); m_FinalXformComboIcon = QIcon(pixmap); - InitToolbarUI(); InitParamsUI(); InitXformsUI(); @@ -108,10 +95,10 @@ Fractorium::Fractorium(QWidget* p) InitLibraryUI(); InitInfoUI(); InitMenusUI(); - //This will init the controller and fill in the variations and palette tables with template specific instances //of their respective objects. #ifdef DO_DOUBLE + if (m_Settings->Double()) m_Controller = unique_ptr(new FractoriumEmberController(this)); else @@ -121,24 +108,21 @@ Fractorium::Fractorium(QWidget* p) m_Controller->SetupVariationTree(); m_Controller->FilteredVariations(); - if (m_Info.Ok() && m_Settings->OpenCL() && m_QualitySpin->value() < (30 * m_Settings->Devices().size())) + if (m_Info->Ok() && m_Settings->OpenCL() && m_QualitySpin->value() < (30 * m_Settings->Devices().size())) m_QualitySpin->setValue(30 * m_Settings->Devices().size()); int statusBarHeight = 20 * devicePixelRatio(); ui.StatusBar->setMinimumHeight(statusBarHeight); ui.StatusBar->setMaximumHeight(statusBarHeight); - m_RenderStatusLabel = new QLabel(this); m_RenderStatusLabel->setMinimumWidth(200); m_RenderStatusLabel->setAlignment(Qt::AlignRight); ui.StatusBar->addPermanentWidget(m_RenderStatusLabel); - m_CoordinateStatusLabel = new QLabel(this); m_CoordinateStatusLabel->setMinimumWidth(300); m_CoordinateStatusLabel->setMaximumWidth(300); m_CoordinateStatusLabel->setAlignment(Qt::AlignLeft); ui.StatusBar->addWidget(m_CoordinateStatusLabel); - int progressBarHeight = 15; int progressBarWidth = 300; m_ProgressBar = new QProgressBar(this); @@ -149,15 +133,13 @@ Fractorium::Fractorium(QWidget* p) m_ProgressBar->setMinimumWidth(progressBarWidth); m_ProgressBar->setMaximumWidth(progressBarWidth); ui.StatusBar->addPermanentWidget(m_ProgressBar); - //Setup pointer in the GL window to point back to here. ui.GLDisplay->SetMainWindow(this); bool restored = restoreState(m_Settings->value("windowState").toByteArray()); showMaximized();//This won't fully set things up and show them until after this constructor exits. - connect(ui.LibraryDockWidget, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(dockLocationChanged(Qt::DockWidgetArea))); connect(ui.LibraryDockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(OnDockTopLevelChanged(bool))); - + //Always ensure the library tab is selected, which will show preview renders. if (!restored) { @@ -243,7 +225,6 @@ void Fractorium::CenterScrollbars() { QScrollBar* w = ui.GLParentScrollArea->horizontalScrollBar(); QScrollBar* h = ui.GLParentScrollArea->verticalScrollBar(); - w->setValue(w->maximum() / 2); h->setValue(h->maximum() / 2); } @@ -267,7 +248,6 @@ void FractoriumEmberController::ApplyXmlSavingTemplate(Ember& ember) bool Fractorium::HaveFinal() { QComboBox* combo = ui.CurrentXformCombo; - return (combo->count() > 0 && combo->itemText(combo->count() - 1) == "Final"); } @@ -375,7 +355,7 @@ void Fractorium::resizeEvent(QResizeEvent* e) /// but telling it that this window has become the focus window forces /// it to refresh this. /// The event -void Fractorium::showEvent(QShowEvent *e) +void Fractorium::showEvent(QShowEvent* e) { //Tell Qt to refresh the native menubar from this widget. emit qGuiApp->focusWindowChanged(windowHandle()); @@ -476,7 +456,9 @@ void Fractorium::dropEvent(QDropEvent* e) void Fractorium::SetupCombo(QTableWidget* table, const QObject* receiver, int& row, int col, StealthComboBox*& comboBox, const vector& vals, const char* signal, const char* slot, Qt::ConnectionType connectionType) { comboBox = new StealthComboBox(table); + for (auto& s : vals) comboBox->addItem(s.c_str()); + table->setCellWidget(row, col, comboBox); connect(comboBox, signal, receiver, slot, connectionType); row++; @@ -507,14 +489,13 @@ QStringList Fractorium::SetupOpenXmlDialog() m_FileDialog = new QFileDialog(this); m_FileDialog->setViewMode(QFileDialog::List); } - + if (!m_FileDialog) return QStringList(""); QStringList filenames; m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); - connect(m_FileDialog, &QFileDialog::filterSelected, [=](const QString &filter) { m_Settings->OpenXmlExt(filter); }); - + connect(m_FileDialog, &QFileDialog::filterSelected, [ = ](const QString & filter) { m_Settings->OpenXmlExt(filter); }); m_FileDialog->setFileMode(QFileDialog::ExistingFiles); m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen); m_FileDialog->setNameFilter("Flam3 (*.flam3);;Flame (*.flame);;Xml (*.xml)"); @@ -547,15 +528,13 @@ QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename) m_FileDialog = new QFileDialog(this); m_FileDialog->setViewMode(QFileDialog::List); } - + if (!m_FileDialog) return ""; QString filename; - m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); - connect(m_FileDialog, &QFileDialog::filterSelected, [=](const QString &filter) { m_Settings->SaveXmlExt(filter); }); - + connect(m_FileDialog, &QFileDialog::filterSelected, [ = ](const QString & filter) { m_Settings->SaveXmlExt(filter); }); //This must come first because it clears various internal states which allow the file text to be properly set. //This is most likely a bug in QFileDialog. m_FileDialog->setAcceptMode(QFileDialog::AcceptSave); @@ -585,15 +564,13 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename) m_FileDialog = new QFileDialog(this); m_FileDialog->setViewMode(QFileDialog::List); } - + if (!m_FileDialog) return ""; - + QString filename; - m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); - connect(m_FileDialog, &QFileDialog::filterSelected, [=](const QString &filter) { m_Settings->SaveImageExt(filter); }); - + connect(m_FileDialog, &QFileDialog::filterSelected, [ = ](const QString & filter) { m_Settings->SaveImageExt(filter); }); //This must come first because it clears various internal states which allow the file text to be properly set. //This is most likely a bug in QFileDialog. m_FileDialog->setAcceptMode(QFileDialog::AcceptSave); @@ -625,12 +602,11 @@ QString Fractorium::SetupSaveFolderDialog() m_FolderDialog = new QFileDialog(this); m_FolderDialog->setViewMode(QFileDialog::List); } - + if (!m_FolderDialog) return ""; - + QString filename; - //This must come first because it clears various internal states which allow the file text to be properly set. //This is most likely a bug in QFileDialog. m_FolderDialog->setAcceptMode(QFileDialog::AcceptSave); @@ -672,14 +648,12 @@ void Fractorium::ShowCritical(const QString& title, const QString& text, bool in void Fractorium::SetTabOrders() { QWidget* w = SetTabOrder(this, ui.ColorTable, m_BrightnessSpin);//Flame. - w = SetTabOrder(this, w, m_GammaSpin); w = SetTabOrder(this, w, m_GammaThresholdSpin); w = SetTabOrder(this, w, m_VibrancySpin); w = SetTabOrder(this, w, m_HighlightSpin); w = SetTabOrder(this, w, m_BackgroundColorButton); w = SetTabOrder(this, w, m_PaletteModeCombo); - w = SetTabOrder(this, w, m_CenterXSpin); w = SetTabOrder(this, w, m_CenterYSpin); w = SetTabOrder(this, w, m_ScaleSpin); @@ -690,20 +664,17 @@ void Fractorium::SetTabOrders() w = SetTabOrder(this, w, m_PitchSpin); w = SetTabOrder(this, w, m_YawSpin); w = SetTabOrder(this, w, m_DepthBlurSpin); - w = SetTabOrder(this, w, m_SpatialFilterWidthSpin); w = SetTabOrder(this, w, m_SpatialFilterTypeCombo); w = SetTabOrder(this, w, m_TemporalFilterTypeCombo); w = SetTabOrder(this, w, m_DEFilterMinRadiusSpin); w = SetTabOrder(this, w, m_DEFilterMaxRadiusSpin); w = SetTabOrder(this, w, m_DECurveSpin); - w = SetTabOrder(this, w, m_TemporalSamplesSpin); w = SetTabOrder(this, w, m_QualitySpin); w = SetTabOrder(this, w, m_SupersampleSpin); w = SetTabOrder(this, w, m_AffineInterpTypeCombo); w = SetTabOrder(this, w, m_InterpTypeCombo); - w = SetTabOrder(this, ui.CurrentXformCombo, ui.AddXformButton);//Xforms. w = SetTabOrder(this, w, ui.DuplicateXformButton); w = SetTabOrder(this, w, ui.ClearXformButton); @@ -711,13 +682,11 @@ void Fractorium::SetTabOrders() w = SetTabOrder(this, w, ui.AddFinalXformButton); w = SetTabOrder(this, w, m_XformWeightSpin); w = SetTabOrder(this, w, m_XformWeightSpinnerButtonWidget->m_Button); - w = SetTabOrder(this, m_XformColorIndexSpin, ui.XformColorScroll);//Xforms color. w = SetTabOrder(this, w, m_XformColorSpeedSpin); w = SetTabOrder(this, w, m_XformOpacitySpin); w = SetTabOrder(this, w, m_XformDirectColorSpin); w = SetTabOrder(this, w, ui.SoloXformCheckBox); - w = SetTabOrder(this, ui.PreAffineGroupBox, m_PreX1Spin);//Xforms affine. w = SetTabOrder(this, w, m_PreX2Spin); w = SetTabOrder(this, w, m_PreY1Spin); @@ -769,12 +738,9 @@ void Fractorium::SetTabOrders() w = SetTabOrder(this, w, ui.ShowPostAffineAllRadio); w = SetTabOrder(this, w, ui.LocalPivotRadio); w = SetTabOrder(this, w, ui.WorldPivotRadio); - w = SetTabOrder(this, ui.VariationsFilterLineEdit, ui.VariationsFilterClearButton);//Xforms variation. w = SetTabOrder(this, w, ui.VariationsTree); - //Xforms xaos is done dynamically every time. - w = SetTabOrder(this, m_PaletteHueSpin, m_PaletteContrastSpin);//Palette. w = SetTabOrder(this, w, m_PaletteSaturationSpin); w = SetTabOrder(this, w, m_PaletteBlurSpin); @@ -783,12 +749,8 @@ void Fractorium::SetTabOrders() w = SetTabOrder(this, w, ui.PaletteFilterLineEdit); w = SetTabOrder(this, w, ui.PaletteFilterClearButton); w = SetTabOrder(this, w, ui.PaletteListTable); - - w = SetTabOrder(this, ui.SummaryTable, ui.SummaryTree);//Info summary. - w = SetTabOrder(this, ui.InfoBoundsGroupBox, ui.InfoBoundsFrame);//Info bounds. - w = SetTabOrder(this, w, ui.InfoBoundsTable); w = SetTabOrder(this, w, ui.InfoFileOpeningGroupBox); w = SetTabOrder(this, w, ui.InfoFileOpeningTextEdit); @@ -872,7 +834,6 @@ void Fractorium::ToggleTableCol(QTableView* table, int logicalIndex) auto model = table->model(); int rows = model->rowCount(); bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier); - auto tableWidget = qobject_cast(table); if (tableWidget) diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index 0657f6c..cf078ad 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -50,7 +50,7 @@ template class FinalRenderEmberController; /// upon first use with lazy instantiation and then kept around for the remainder of the program. /// Additional dialogs are for the about box, options, and final rendering out to a file. /// While all class member variables and functions are declared in this .h file, the implementation -/// for them is far too lengthy to put in a single .cpp file. So general functionality is placed in +/// for them is far too lengthy to put in a single .cpp file. So general functionality is placed in /// Fractorium.cpp and the other functional areas are each broken out into their own files. /// The order of the functions in each .cpp file should roughly match the order they appear in the .h file. /// Future todo list: @@ -74,13 +74,13 @@ class Fractorium : public QMainWindow friend FractoriumEmberController; friend FinalRenderEmberControllerBase; friend FinalRenderEmberController; - + #ifdef DO_DOUBLE friend GLEmberController; friend FractoriumEmberController; friend FinalRenderEmberController; #endif - + public: Fractorium(QWidget* p = 0); ~Fractorium(); @@ -99,7 +99,7 @@ public: bool DrawAllPre(); bool DrawAllPost(); bool LocalPivot(); - + public slots: //Dock. void OnDockTopLevelChanged(bool topLevel); @@ -306,7 +306,7 @@ protected: virtual void dragEnterEvent(QDragEnterEvent* e) override; virtual void dragMoveEvent(QDragMoveEvent* e) override; virtual void dropEvent(QDropEvent* e) override; - virtual void showEvent(QShowEvent *e) override; + virtual void showEvent(QShowEvent* e) override; private: void InitMenusUI(); @@ -353,7 +353,7 @@ private: //Xaos. void FillXaosTable(); - + //Palette. void ResetPaletteControls(); void SetPaletteFileComboIndex(const string& filename); @@ -415,7 +415,7 @@ private: SpinBox* m_TemporalSamplesSpin; StealthComboBox* m_AffineInterpTypeCombo; StealthComboBox* m_InterpTypeCombo; - + //Xforms. DoubleSpinBox* m_XformWeightSpin; SpinnerButtonWidget* m_XformWeightSpinnerButtonWidget; @@ -444,7 +444,7 @@ private: DoubleSpinBox* m_PostY2Spin; DoubleSpinBox* m_PostO1Spin; DoubleSpinBox* m_PostO2Spin; - + DoubleSpinBox* m_PreSpins[6]; DoubleSpinBox* m_PostSpins[6]; @@ -499,7 +499,7 @@ private: int m_VarSortMode; int m_PaletteSortMode; int m_PreviousPaletteRow; - OpenCLInfo& m_Info; + shared_ptr m_Info; unique_ptr m_Controller; Ui::FractoriumClass ui; }; diff --git a/Source/Fractorium/FractoriumCommon.h b/Source/Fractorium/FractoriumCommon.h index 29081d5..04e2f05 100644 --- a/Source/Fractorium/FractoriumCommon.h +++ b/Source/Fractorium/FractoriumCommon.h @@ -71,7 +71,7 @@ static QWidget* SetTabOrder(QWidget* p, QWidget* w1, QWidget* w2) /// The string to convert /// Pointer to boolean which stores the success value of the conversion /// The converted value if successful, else 0. -static double ToDouble(const QString &s, bool *ok) +static double ToDouble(const QString& s, bool* ok) { return QLocale::system().toDouble(s, ok); } @@ -109,7 +109,7 @@ static QString MakeEnd(const QString& s, T e) /// True if s was not empty and existed, else false. static bool Exists(const QString& s) { - return s != "" && QDir(s).exists(); + return s != "" && QDir(s).exists(); } /// @@ -121,9 +121,8 @@ static QColor VisibleColor(const QColor& color) { int threshold = 105; int delta = (color.red() * 0.299) + //Magic numbers gotten from a Stack Overflow post. - (color.green() * 0.587) + - (color.blue() * 0.114); - + (color.green() * 0.587) + + (color.blue() * 0.114); QColor textColor = (255 - delta < threshold) ? QColor(0, 0, 0) : QColor(255, 255, 255); return textColor; } @@ -196,9 +195,7 @@ static intmax_t IsXformLinked(Ember& ember, Xform* xform) static vector> Devices(const QList& selectedDevices) { vector> vec; - OpenCLInfo& info = OpenCLInfo::Instance(); - auto& devices = info.DeviceIndices(); - + auto& devices = OpenCLInfo::Instance()->DeviceIndices(); vec.reserve(selectedDevices.size()); for (size_t i = 0; i < selectedDevices.size(); i++) @@ -223,8 +220,7 @@ static vector> Devices(const QList& selectedDevic static void SetupDeviceTable(QTableWidget* table, const QList& settingsDevices) { bool primary = false; - auto& deviceNames = OpenCLInfo::Instance().AllDeviceNames(); - + auto& deviceNames = OpenCLInfo::Instance()->AllDeviceNames(); table->clearContents(); table->setRowCount(deviceNames.size()); @@ -233,7 +229,6 @@ static void SetupDeviceTable(QTableWidget* table, const QList& setting auto checkItem = new QTableWidgetItem(); auto radio = new QRadioButton(); auto deviceItem = new QTableWidgetItem(QString::fromStdString(deviceNames[i])); - table->setItem(i, 0, checkItem); table->setCellWidget(i, 1, radio); table->setItem(i, 2, deviceItem); @@ -365,17 +360,17 @@ static void HandleDeviceTableCheckChanged(QTableWidget* table, int row, int col) static QString BaseStyle() { return "/*---Base Style---\n" - "This is needed to deal with the large tabs in the fusion theme which is the default on Linux, and optional on Windows.\n" - "It's not needed for other themes." - "You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/\n" + "This is needed to deal with the large tabs in the fusion theme which is the default on Linux, and optional on Windows.\n" + "It's not needed for other themes." + "You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/\n" #ifndef WIN32 - "QTabBar::tab { height: 3ex; }\n\n" + "QTabBar::tab { height: 3ex; }\n\n" #else - "QTabBar::tab { height: 5ex; }\n\n" + "QTabBar::tab { height: 5ex; }\n\n" #endif - "/*This is needed to give the labels on the status bar some padding.*/\n" - "QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }\n\n" - ; + "/*This is needed to give the labels on the status bar some padding.*/\n" + "QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }\n\n" + ; } /// diff --git a/Source/Fractorium/FractoriumEmberController.cpp b/Source/Fractorium/FractoriumEmberController.cpp index 7c903f1..56d3eff 100644 --- a/Source/Fractorium/FractoriumEmberController.cpp +++ b/Source/Fractorium/FractoriumEmberController.cpp @@ -3,18 +3,14 @@ #include "Fractorium.h" #include "GLEmberController.h" -#define SAVE_EACH 1 - /// /// Constructor which initializes the non-templated members contained in this class. /// The renderer, other templated members and GUI setup will be done in the templated derived controller class. /// /// Pointer to the main window. FractoriumEmberControllerBase::FractoriumEmberControllerBase(Fractorium* fractorium) - : m_Info(OpenCLInfo::Instance()) { Timing t; - m_Rendering = false; m_Shared = true; m_FailedRenders = 0; @@ -25,12 +21,11 @@ FractoriumEmberControllerBase::FractoriumEmberControllerBase(Fractorium* fractor m_Fractorium = fractorium; m_RenderTimer = nullptr; m_RenderRestartTimer = nullptr; + m_Info = OpenCLInfo::Instance(); m_Rand = QTIsaac(ISAAC_INT(t.Tic()), ISAAC_INT(t.Tic() * 2), ISAAC_INT(t.Tic() * 3));//Ensure a different rand seed on each instance. - m_RenderTimer = new QTimer(m_Fractorium); m_RenderTimer->setInterval(0); m_Fractorium->connect(m_RenderTimer, SIGNAL(timeout()), SLOT(IdleTimer())); - m_RenderRestartTimer = new QTimer(m_Fractorium); m_Fractorium->connect(m_RenderRestartTimer, SIGNAL(timeout()), SLOT(StartRenderTimer())); } @@ -71,42 +66,34 @@ FractoriumEmberController::FractoriumEmberController(Fractorium* fractorium) m_PreviewRun = false; m_PreviewRunning = false; m_SheepTools = unique_ptr>(new SheepTools( - QString(QApplication::applicationDirPath() + "flam3-palettes.xml").toLocal8Bit().data(), - new EmberNs::Renderer())); + QString(QApplication::applicationDirPath() + "flam3-palettes.xml").toLocal8Bit().data(), + new EmberNs::Renderer())); m_GLController = unique_ptr>(new GLEmberController(fractorium, fractorium->ui.GLDisplay, this)); m_PreviewRenderer = unique_ptr>(new EmberNs::Renderer()); //Initial combo change event to fill the palette table will be called automatically later. - // Look hard for a palette. - - // TODO - // QStandardPaths::AppConfigLocation -- errors out, not a member. - // QStandardPaths::DataLocation -- how to parse this? It should include "/usr/share/fractorium" on Linux. - - if ( ! (InitPaletteList(QDir::currentPath().toLocal8Bit().data()) || - InitPaletteList(QDir::homePath().toLocal8Bit().data()) || - InitPaletteList(QCoreApplication::applicationDirPath().toLocal8Bit().data()) || - InitPaletteList(QString("/usr/local/share/fractorium").toLocal8Bit().data()) || - InitPaletteList(QString("/usr/share/fractorium").toLocal8Bit().data())) ) - { - // TODO better error dialog - throw "No palettes found, exiting."; - } + //Look hard for a palette. + if (!(InitPaletteList(QDir::currentPath().toLocal8Bit().data()) || + InitPaletteList(QDir::homePath().toLocal8Bit().data()) || + InitPaletteList(QCoreApplication::applicationDirPath().toLocal8Bit().data()) || + InitPaletteList(QString("/usr/local/share/fractorium").toLocal8Bit().data()) || + InitPaletteList(QString("/usr/share/fractorium").toLocal8Bit().data())) ) + { + throw "No palettes found, exiting."; + } BackgroundChanged(QColor(0, 0, 0));//Default to black. ClearUndo(); - m_PreviewRenderer->Callback(nullptr); m_PreviewRenderer->NumChannels(4); m_PreviewRenderer->EarlyClip(m_Fractorium->m_Settings->EarlyClip()); m_PreviewRenderer->YAxisUp(m_Fractorium->m_Settings->YAxisUp()); m_PreviewRenderer->SetEmber(m_Ember);//Give it an initial ember, will be updated many times later. //m_PreviewRenderer->ThreadCount(1);//For debugging. - m_PreviewRenderFunc = [&](uint start, uint end) { - while(m_PreviewRun || m_PreviewRunning) + while (m_PreviewRun || m_PreviewRunning) { } @@ -120,7 +107,6 @@ FractoriumEmberController::FractoriumEmberController(Fractorium* fractorium) for (size_t i = start; m_PreviewRun && i < end && i < m_EmberFile.Size(); i++) { Ember ember = m_EmberFile.m_Embers[i]; - ember.SyncSize(); ember.SetSizeAndAdjustScale(PREVIEW_SIZE, PREVIEW_SIZE, false, SCALE_WIDTH); ember.m_TemporalSamples = 1; @@ -136,11 +122,10 @@ FractoriumEmberController::FractoriumEmberController(Fractorium* fractorium) //This ensures the events are processed in order as each preview is updated, and that control does not return here //until the update is complete. QMetaObject::invokeMethod(m_Fractorium, "SetLibraryTreeItemData", Qt::BlockingQueuedConnection, - Q_ARG(EmberTreeWidgetItemBase*, dynamic_cast(treeItem)), - Q_ARG(vector&, m_PreviewFinalImage), - Q_ARG(uint, PREVIEW_SIZE), - Q_ARG(uint, PREVIEW_SIZE)); - + Q_ARG(EmberTreeWidgetItemBase*, dynamic_cast(treeItem)), + Q_ARG(vector&, m_PreviewFinalImage), + Q_ARG(uint, PREVIEW_SIZE), + Q_ARG(uint, PREVIEW_SIZE)); //treeItem->SetImage(m_PreviewFinalImage, PREVIEW_SIZE, PREVIEW_SIZE); } } @@ -287,7 +272,6 @@ void FractoriumEmberController::UpdateXform(std::function*)> fu if (Xform* xform = CurrentXform()) func(xform); } - break; case eXformUpdate::UPDATE_ALL: @@ -295,7 +279,6 @@ void FractoriumEmberController::UpdateXform(std::function*)> fu while (Xform* xform = m_Ember.GetTotalXform(i++)) func(xform); } - break; case eXformUpdate::UPDATE_ALL_EXCEPT_FINAL: @@ -304,7 +287,6 @@ void FractoriumEmberController::UpdateXform(std::function*)> fu while (Xform* xform = m_Ember.GetXform(i++)) func(xform); } - break; } @@ -326,10 +308,9 @@ void FractoriumEmberController::SetEmberPrivate(const Ember& ember, bool v { if (ember.m_Name != m_Ember.m_Name) m_LastSaveCurrent = ""; - + size_t w = m_Ember.m_FinalRasW;//Cache values for use below. size_t h = m_Ember.m_FinalRasH; - m_Ember = ember; if (!verbatim) @@ -340,20 +321,16 @@ void FractoriumEmberController::SetEmberPrivate(const Ember& ember, bool v m_Ember.m_Supersample = m_Fractorium->m_SupersampleSpin->value(); } -#ifdef SAVE_EACH - static EmberToXml writer; + static EmberToXml writer;//Save parameters of last full render just in case there is a crash. string filename = "last.flame"; - writer.Save(filename.c_str(), m_Ember, 0, true, false, true); -#endif - m_GLController->ResetMouseState(); FillXforms();//Must do this first because the palette setup in FillParamTablesAndPalette() uses the xforms combo. FillParamTablesAndPalette(); FillSummary(); //If a resize happened, this won't do anything because the new size is not reflected in the scroll area yet. - //However, it will have been taken care of in SyncSizes() in that case, so it's ok. + //However, it will have been taken care of in SyncSizes() in that case, so it's ok. //This is for when a new ember with the same size was loaded. If it was larger than the scroll area, and was scrolled, re-center it. if (m_Ember.m_FinalRasW == w && m_Ember.m_FinalRasH == h) m_Fractorium->CenterScrollbars(); diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h index 167f2f7..2a34606 100644 --- a/Source/Fractorium/FractoriumEmberController.h +++ b/Source/Fractorium/FractoriumEmberController.h @@ -206,7 +206,7 @@ public: //Info. virtual void FillSummary() { } - + //Rendering/progress. virtual bool Render() { return false; } virtual bool CreateRenderer(eRendererType renderType, const vector>& devices, bool shared = true) { return false; } @@ -232,7 +232,7 @@ protected: void AddProcessAction(eProcessAction action); eProcessAction CondenseAndClearProcessActions(); eProcessState ProcessState() { return m_Renderer.get() ? m_Renderer->ProcessState() : NONE; } - + //Non-templated members. bool m_Rendering; bool m_Shared; @@ -261,7 +261,7 @@ protected: Fractorium* m_Fractorium; QTimer* m_RenderTimer; QTimer* m_RenderRestartTimer; - OpenCLInfo& m_Info; + shared_ptr m_Info; }; /// @@ -434,7 +434,7 @@ public: virtual void XaosChanged(int x, int y, double val) override; virtual void ClearXaos() override; virtual void RandomXaos() override; - + //Palette. virtual int InitPaletteList(const string& s) override; virtual bool FillPaletteTable(const string& s) override; diff --git a/Source/Fractorium/FractoriumInfo.cpp b/Source/Fractorium/FractoriumInfo.cpp index 58c4b6c..eef2cf6 100644 --- a/Source/Fractorium/FractoriumInfo.cpp +++ b/Source/Fractorium/FractoriumInfo.cpp @@ -8,20 +8,19 @@ void Fractorium::InitInfoUI() { auto treeHeader = ui.SummaryTree->header(); auto tableHeader = ui.SummaryTable->horizontalHeader(); - treeHeader->setVisible(true); treeHeader->setSectionsClickable(true); treeHeader->setSectionResizeMode(QHeaderView::ResizeToContents); connect(treeHeader, SIGNAL(sectionClicked(int)), this, SLOT(OnSummaryTreeHeaderSectionClicked(int)), Qt::QueuedConnection); connect(tableHeader, SIGNAL(sectionResized(int, int, int)), this, SLOT(OnSummaryTableHeaderResized(int, int, int)), Qt::QueuedConnection); SetFixedTableHeader(ui.SummaryTable->verticalHeader()); - ui.SummaryTable->setItem(0, 0, m_InfoNameItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(1, 0, m_InfoPaletteItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(2, 0, m_Info3dItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(3, 0, m_InfoXaosItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(4, 0, m_InfoXformCountItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(5, 0, m_InfoFinalXformItem = new QTableWidgetItem("")); + ui.InfoTabWidget->setCurrentIndex(0);//Make summary tab focused by default. } /// @@ -93,7 +92,6 @@ void FractoriumEmberController::FillSummary() m_Fractorium->m_InfoXaosItem->setText(m_Ember.XaosPresent() ? "Yes" : "No"); m_Fractorium->m_InfoXformCountItem->setText(QString::number(m_Ember.XformCount())); m_Fractorium->m_InfoFinalXformItem->setText(m_Ember.UseFinalXform() ? "Yes" : "No"); - QPixmap pixmap = QPixmap::fromImage(m_FinalPaletteImage);//Create a QPixmap out of the QImage. QSize size(table->columnWidth(0), table->rowHeight(1) + 1); m_Fractorium->m_InfoPaletteItem->setData(Qt::DecorationRole, pixmap.scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); @@ -112,19 +110,18 @@ void FractoriumEmberController::FillSummary() if (!m_Ember.IsFinalXform(xform) && index != -1) { item1->setText(0, "Xform " + - QString::number(x + 1) + - " (" + QLocale::system().toString(xform->m_Weight, pc, p) + ") (" + - QLocale::system().toString(double(m_NormalizedWeights[index]), pc, p) + ") " + - linked); + QString::number(x + 1) + + " (" + QLocale::system().toString(xform->m_Weight, pc, p) + ") (" + + QLocale::system().toString(double(m_NormalizedWeights[index]), pc, p) + ") " + + linked); } else item1->setText(0, "Final xform"); item1->setText(1, xform->m_Name.c_str()); - auto affineItem = new QTreeWidgetItem(item1); affineItem->setText(0, "Affine"); - + if (xform->m_Affine.IsZero()) as += " Empty"; else if (xform->m_Affine.IsID()) @@ -139,7 +136,6 @@ void FractoriumEmberController::FillSummary() } affineItem->setText(1, as); - auto colorIndexItem = new QTreeWidgetItem(item1); colorIndexItem->setText(0, "Color index"); colorIndexItem->setText(1, QLocale::system().toString(xform->m_ColorX, pc, p)); @@ -147,15 +143,12 @@ void FractoriumEmberController::FillSummary() color.setAlphaF(xform->m_Opacity); colorIndexItem->setBackgroundColor(1, color); colorIndexItem->setTextColor(1, VisibleColor(color)); - auto colorSpeedItem = new QTreeWidgetItem(item1); colorSpeedItem->setText(0, "Color speed"); colorSpeedItem->setText(1, QLocale::system().toString(xform->m_ColorSpeed, pc, p)); - auto opacityItem = new QTreeWidgetItem(item1); opacityItem->setText(0, "Opacity"); opacityItem->setText(1, QLocale::system().toString(xform->m_Opacity, pc, p)); - auto dcItem = new QTreeWidgetItem(item1); dcItem->setText(0, "Direct color"); dcItem->setText(1, QLocale::system().toString(xform->m_DirectColor, pc, p)); @@ -163,7 +156,6 @@ void FractoriumEmberController::FillSummary() while (auto var = xform->GetVariation(i++)) { auto vitem = new QTreeWidgetItem(item1); - vitem->setText(0, QString::fromStdString(var->Name())); vitem->setText(1, QLocale::system().toString(var->m_Weight, pc, vp).rightJustified(vlen, ' ')); @@ -176,7 +168,6 @@ void FractoriumEmberController::FillSummary() if (!params[j].IsPrecalc()) { auto pitem = new QTreeWidgetItem(vitem); - pitem->setText(0, params[j].Name().c_str()); pitem->setText(1, QLocale::system().toString(params[j].ParamVal(), pc, vp).rightJustified(vlen, ' ')); } @@ -229,19 +220,16 @@ void Fractorium::UpdateHistogramBounds() sprintf_s(m_LRString, 32, "LR: %3.3f, %3.3f", -r->LowerLeftX(), r->LowerLeftY()); sprintf_s(m_LLString, 32, "LL: %3.3f, %3.3f", r->LowerLeftX(), r->LowerLeftY()); sprintf_s(m_WHString, 32, "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())); if (r->GetDensityFilter()) { uint deWidth = (r->GetDensityFilter()->FilterWidth() * 2) + 1; - sprintf_s(m_DEString, 16, "%d x %d", deWidth, deWidth); ui.InfoBoundsTable->item(1, 1)->setText(QString(m_DEString)); } diff --git a/Source/Fractorium/FractoriumParams.cpp b/Source/Fractorium/FractoriumParams.cpp index 0146c2b..ff9eaca 100644 --- a/Source/Fractorium/FractoriumParams.cpp +++ b/Source/Fractorium/FractoriumParams.cpp @@ -11,7 +11,6 @@ void Fractorium::InitParamsUI() double dmax = numeric_limits::max(); vector comboVals; QTableWidget* table = ui.ColorTable; - //Because QTableWidget does not allow for a single title bar/header //at the top of a multi-column table, the workaround hack is to just //make another single column table with no rows, and use the single @@ -21,14 +20,12 @@ void Fractorium::InitParamsUI() SetFixedTableHeader(ui.GeometryTableHeader->horizontalHeader()); SetFixedTableHeader(ui.FilterTableHeader->horizontalHeader()); SetFixedTableHeader(ui.IterationTableHeader->horizontalHeader()); - //Color. SetupSpinner(table, this, row, 1, m_BrightnessSpin, spinHeight, 0.05, 100, 1, SIGNAL(valueChanged(double)), SLOT(OnBrightnessChanged(double)), true, 4.0, 4.0, 4.0); SetupSpinner(table, this, row, 1, m_GammaSpin, spinHeight, 1, 9999, 0.5, SIGNAL(valueChanged(double)), SLOT(OnGammaChanged(double)), true, 4.0, 4.0, 4.0); SetupSpinner(table, this, row, 1, m_GammaThresholdSpin, spinHeight, 0, 10, 0.01, SIGNAL(valueChanged(double)), SLOT(OnGammaThresholdChanged(double)), true, 0.1, 0.1, 0.0); SetupSpinner(table, this, row, 1, m_VibrancySpin, spinHeight, 0, 30, 0.01, SIGNAL(valueChanged(double)), SLOT(OnVibrancyChanged(double)), true, 1.0, 1.0, 0.0); - SetupSpinner(table, this, row, 1, m_HighlightSpin, spinHeight, -1.0, 2.0, 0.1, SIGNAL(valueChanged(double)), SLOT(OnHighlightPowerChanged(double)), true, -1.0, -1.0, -1.0); - + SetupSpinner(table, this, row, 1, m_HighlightSpin, spinHeight, -1.0, 10, 0.1, SIGNAL(valueChanged(double)), SLOT(OnHighlightPowerChanged(double)), true, -1.0, -1.0, -1.0); m_GammaThresholdSpin->setDecimals(4); m_BackgroundColorButton = new QPushButton("...", table); m_BackgroundColorButton->setMinimumWidth(21); @@ -37,11 +34,10 @@ void Fractorium::InitParamsUI() table->item(row, 1)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); connect(m_BackgroundColorButton, SIGNAL(clicked(bool)), this, SLOT(OnBackgroundColorButtonClicked(bool)), Qt::QueuedConnection); row++; - comboVals.push_back("Step"); comboVals.push_back("Linear"); SetupCombo(table, this, row, 1, m_PaletteModeCombo, comboVals, SIGNAL(currentIndexChanged(int)), SLOT(OnPaletteModeComboCurrentIndexChanged(int))); - + m_PaletteModeCombo->SetCurrentIndexStealth(PALETTE_LINEAR); //Geometry. row = 0; table = ui.GeometryTable; @@ -57,31 +53,24 @@ void Fractorium::InitParamsUI() SetupSpinner(table, this, row, 1, m_PitchSpin, spinHeight, -180, 180, 1, SIGNAL(valueChanged(double)), SLOT(OnPitchChanged(double)), true, 0, 45, 0); SetupSpinner(table, this, row, 1, m_YawSpin, spinHeight, -180, 180, 1, SIGNAL(valueChanged(double)), SLOT(OnYawChanged(double)), true, 0, 45, 0); SetupSpinner(table, this, row, 1, m_DepthBlurSpin, spinHeight, -100, 100, 0.01, SIGNAL(valueChanged(double)), SLOT(OnDepthBlurChanged(double)), true, 0, 1, 0); - //Set w/h max values. m_CenterXSpin->setDecimals(3); m_CenterYSpin->setDecimals(3); m_ZPosSpin->setDecimals(3); m_PerspectiveSpin->setDecimals(4); m_DepthBlurSpin->setDecimals(3); - //Filter. row = 0; table = ui.FilterTable; SetupSpinner(table, this, row, 1, m_SpatialFilterWidthSpin, spinHeight, 0.1, 10, 0.1, SIGNAL(valueChanged(double)), SLOT(OnSpatialFilterWidthChanged(double)), true, 1.0, 1.0, 1.0); - comboVals = SpatialFilterCreator::FilterTypes(); SetupCombo(table, this, row, 1, m_SpatialFilterTypeCombo, comboVals, SIGNAL(currentIndexChanged(const QString&)), SLOT(OnSpatialFilterTypeComboCurrentIndexChanged(const QString&))); - SetupSpinner(table, this, row, 1, m_TemporalFilterWidthSpin, spinHeight, 1, 10, 1, SIGNAL(valueChanged(double)), SLOT(OnTemporalFilterWidthChanged(double)), true, 1); - comboVals = TemporalFilterCreator::FilterTypes(); SetupCombo(table, this, row, 1, m_TemporalFilterTypeCombo, comboVals, SIGNAL(currentIndexChanged(const QString&)), SLOT(OnTemporalFilterTypeComboCurrentIndexChanged(const QString&))); - SetupSpinner(table, this, row, 1, m_DEFilterMinRadiusSpin, spinHeight, 0, 25, 1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterMinRadiusWidthChanged(double)), true, 0, 0, 0); SetupSpinner(table, this, row, 1, m_DEFilterMaxRadiusSpin, spinHeight, 0, 25, 1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterMaxRadiusWidthChanged(double)), true, 0.0, 9.0, 0); SetupSpinner(table, this, row, 1, m_DECurveSpin, spinHeight, 0.15, 5, 0.1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterCurveWidthChanged(double)), true, 0.4, 0.4, 0.4); - //Iteration. row = 0; table = ui.IterationTable; @@ -90,12 +79,10 @@ void Fractorium::InitParamsUI() SetupSpinner(table, this, row, 1, m_QualitySpin, spinHeight, 1, dmax, 50, SIGNAL(valueChanged(double)), SLOT(OnQualityChanged(double)), true, 10, 10, 10); SetupSpinner( table, this, row, 1, m_SupersampleSpin, spinHeight, 1, 4, 1, SIGNAL(valueChanged(int)), SLOT(OnSupersampleChanged(int)), true, 1, 1, 1); SetupSpinner( table, this, row, 1, m_TemporalSamplesSpin, spinHeight, 1, 5000, 1, SIGNAL(valueChanged(int)), SLOT(OnTemporalSamplesChanged(int)), true, 1000); - comboVals.clear(); comboVals.push_back("Step"); comboVals.push_back("Linear"); SetupCombo(table, this, row, 1, m_AffineInterpTypeCombo, comboVals, SIGNAL(currentIndexChanged(int)), SLOT(OnAffineInterpTypeComboCurrentIndexChanged(int))); - comboVals.clear(); comboVals.push_back("Linear"); comboVals.push_back("Smooth"); @@ -277,10 +264,10 @@ void Fractorium::OnZPosChanged(double d) { m_Controller->ZPosChanged(d); } template void FractoriumEmberController::PerspectiveChanged(double d) { Update([&] { m_Ember.m_CamPerspective = d; }); } void Fractorium::OnPerspectiveChanged(double d) { m_Controller->PerspectiveChanged(d); } -template void FractoriumEmberController::PitchChanged(double d) { Update([&] { m_Ember.m_CamPitch = d * DEG_2_RAD; }); } +template void FractoriumEmberController::PitchChanged(double d) { Update([&] { m_Ember.m_CamPitch = d* DEG_2_RAD; }); } void Fractorium::OnPitchChanged(double d) { m_Controller->PitchChanged(d); } -template void FractoriumEmberController::YawChanged(double d) { Update([&] { m_Ember.m_CamYaw = d * DEG_2_RAD; }); } +template void FractoriumEmberController::YawChanged(double d) { Update([&] { m_Ember.m_CamYaw = d* DEG_2_RAD; }); } void Fractorium::OnYawChanged(double d) { m_Controller->YawChanged(d); } template void FractoriumEmberController::DepthBlurChanged(double d) { Update([&] { m_Ember.m_CamDepthBlur = d; }); } @@ -408,7 +395,7 @@ void Fractorium::OnFuseChanged(int d) { m_Controller->FuseChanged(d); } /// 20-50 is good for OpenCL. /// Above 500 seems to offer little additional value for final renders. /// Called when the quality spinner is changed. -/// If rendering is done, and the value is greater than the last value, +/// If rendering is done, and the value is greater than the last value, /// the rendering process is continued, else it's reset. /// /// The quality in terms of iterations per pixel @@ -545,20 +532,17 @@ void FractoriumEmberController::FillParamTablesAndPalette() m_Fractorium->m_TemporalSamplesSpin->SetValueStealth(m_Ember.m_TemporalSamples); m_Fractorium->m_AffineInterpTypeCombo->SetCurrentIndexStealth(m_Ember.m_AffineInterp); m_Fractorium->m_InterpTypeCombo->SetCurrentIndexStealth(m_Ember.m_Interp); - //Palette related items: //The temp palette is assigned the palette read when the file was parsed/saved. The user can apply adjustments on the GUI later. //These adjustments will be applied to the temp palette, then assigned back to m_Ember.m_Palette. //Normally, the temp palette is assigned whenever the user clicks on a palette cell. But since this is not //called in response to that event, it is skipped here so must do it manually. m_TempPalette = m_Ember.m_Palette; - //Palette controls are reset on each ember load. This means that if the palette was adjusted, saved, the selected ember //changed to another, then back, the previously adjusted palette will now be considered the base, and all adjustments set to 0. //To fix this, the caller must preserve the temp palette and the adjustment values and reassign. See Fractorium::CreateControllerFromOptions() //for an example. m_Fractorium->ResetPaletteControls(); - auto temp = m_Ember.m_Palette.m_Filename; if (temp.get()) @@ -578,7 +562,6 @@ template void FractoriumEmberController::ParamsToEmber(Ember& ember) { QColor color = m_Fractorium->ui.ColorTable->item(5, 1)->backgroundColor(); - ember.m_Brightness = m_Fractorium->m_BrightnessSpin->value();//Color. ember.m_Gamma = m_Fractorium->m_GammaSpin->value(); ember.m_GammaThresh = m_Fractorium->m_GammaThresholdSpin->value(); @@ -614,7 +597,6 @@ void FractoriumEmberController::ParamsToEmber(Ember& ember) ember.m_TemporalSamples = m_Fractorium->m_TemporalSamplesSpin->value(); ember.m_AffineInterp = eAffineInterp(m_Fractorium->m_AffineInterpTypeCombo->currentIndex()); ember.m_Interp = eInterp(m_Fractorium->m_InterpTypeCombo->currentIndex()); - ember.SyncSize(); } @@ -648,5 +630,5 @@ void Fractorium::SetScale(double scale) template class FractoriumEmberController; #ifdef DO_DOUBLE - template class FractoriumEmberController; +template class FractoriumEmberController; #endif diff --git a/Source/Fractorium/FractoriumRender.cpp b/Source/Fractorium/FractoriumRender.cpp index 86a874d..13b39a0 100644 --- a/Source/Fractorium/FractoriumRender.cpp +++ b/Source/Fractorium/FractoriumRender.cpp @@ -69,7 +69,7 @@ void FractoriumEmberControllerBase::Shutdown() StopRenderTimer(true); ClearFinalImages(); - while(m_Fractorium->ui.GLDisplay->Drawing()) + while (m_Fractorium->ui.GLDisplay->Drawing()) QApplication::processEvents(); } @@ -136,7 +136,7 @@ void FractoriumEmberControllerBase::SaveCurrentRender(const QString& filename, c QFileInfo fileInfo(filename); QString suffix = fileInfo.suffix(); FractoriumSettings* settings = m_Fractorium->m_Settings; - + //Ensure dimensions are valid. if (pixels.size() < (width * height * channels * bpc)) { @@ -145,14 +145,13 @@ void FractoriumEmberControllerBase::SaveCurrentRender(const QString& filename, c } data = pixels.data();//Png and channels == 4. - + if ((suffix == "jpg" || suffix == "bmp") && channels) { RgbaToRgb(pixels, vecRgb, width, height); - data = vecRgb.data(); } - + string s = filename.toStdString(); string id = settings->Id().toStdString(); string url = settings->Url().toStdString(); @@ -207,7 +206,7 @@ eProcessAction FractoriumEmberControllerBase::CondenseAndClearProcessActions() for (auto a : m_ProcessActions) if (a > action) action = a; - + m_ProcessActions.clear(); m_Cs.Leave(); return action; @@ -226,7 +225,6 @@ template int FractoriumEmberController::ProgressFunc(Ember& ember, void* foo, double fraction, int stage, double etaMs) { QString status; - m_Fractorium->m_ProgressBar->setValue(int(fraction));//Only really applies to iter and filter, because final accum only gives progress 0 and 100. if (stage == 0) @@ -297,12 +295,10 @@ template bool FractoriumEmberController::Render() { m_Rendering = true; - bool success = true; GLWidget* gl = m_Fractorium->ui.GLDisplay; RendererCL* rendererCL = nullptr; eProcessAction qualityAction, action; - //Quality is the only parameter we update inside the timer. //This is to allow the user to rapidly increase the quality spinner //without fully resetting the render. Instead, it will just keep iterating @@ -411,7 +407,6 @@ bool FractoriumEmberController::Render() QString iters = ToString(stats.m_Iters); QString scaledQuality = ToString(uint(m_Renderer->ScaledQuality())); string renderTime = m_RenderElapsedTimer.Format(m_RenderElapsedTimer.Toc()); - m_Fractorium->m_ProgressBar->setValue(100); //Only certain stats can be reported with OpenCL. @@ -424,10 +419,9 @@ bool FractoriumEmberController::Render() double percent = double(stats.m_Badvals) / double(stats.m_Iters); QString badVals = ToString(stats.m_Badvals); QString badPercent = QLocale::system().toString(percent * 100, 'f', 2); - m_Fractorium->m_RenderStatusLabel->setText("Iters: " + iters + ". Scaled quality: " + scaledQuality + ". Bad values: " + badVals + " (" + badPercent + "%). Total time: " + QString::fromStdString(renderTime) + "."); } - + if (m_LastEditWasUndoRedo && (m_UndoIndex == m_UndoList.size() - 1))//Traversing through undo list, reached the end, so put back in regular edit mode. { m_EditState = REGULAR_EDIT; @@ -445,7 +439,6 @@ bool FractoriumEmberController::Render() else if (!m_LastEditWasUndoRedo && m_UndoIndex < m_UndoList.size() - 1)//They were anywhere but the end of the undo list, then did a manual edit, so clear the undo list. { Ember ember(m_UndoList[m_UndoIndex]); - ClearUndo(); m_UndoList.push_back(ember); m_UndoList.push_back(m_Ember); @@ -458,15 +451,15 @@ bool FractoriumEmberController::Render() m_Fractorium->UpdateHistogramBounds();//Mostly of engineering interest. FillSummary();//Only update summary on render completion since it's not the type of thing the user needs real-time updates on. } - + //Update the GL window on start because the output will be forced. //Update it on finish because the rendering process is completely done. if (iterBegin || ProcessState() == ACCUM_DONE) { if (m_FinalImage.size() == m_Renderer->FinalBufferSize())//Make absolutely sure the correct amount of data is passed. gl->update(); - //gl->repaint(); - + + //gl->repaint(); //m_Fractorium->update(); //m_Fractorium->ui.GLParentScrollArea->update(); //Uncomment for debugging kernel build and execution errors. @@ -482,13 +475,12 @@ bool FractoriumEmberController::Render() else//Something went very wrong, show error report. { vector errors = m_Renderer->ErrorReport(); - success = false; m_FailedRenders++; m_Fractorium->m_RenderStatusLabel->setText("Rendering failed, see info tab. Try changing parameters."); m_Fractorium->ErrorReportToQTextEdit(errors, m_Fractorium->ui.InfoRenderingTextEdit); m_Renderer->ClearErrorReport(); - + if (m_FailedRenders >= 3) { m_Rendering = false; @@ -500,19 +492,18 @@ bool FractoriumEmberController::Render() if (rendererCL) { //string s = "OpenCL Kernels: \r\n" + rendererCL->IterKernel() + "\r\n" + rendererCL->DEKernel() + "\r\n" + rendererCL->FinalAccumKernel(); - rendererCL->ClearFinal(); //QMetaObject::invokeMethod(m_Fractorium->ui.InfoRenderingTextEdit, "setText", Qt::QueuedConnection, Q_ARG(const QString&, QString::fromStdString(s))); } } } } - + //Upon finishing, or having nothing to do, rest. if (ProcessState() == ACCUM_DONE) QThread::msleep(1); - //QApplication::processEvents(); + //QApplication::processEvents(); m_Rendering = false; return success; } @@ -536,7 +527,6 @@ bool FractoriumEmberController::CreateRenderer(eRendererType renderType, cons { EmberReport emberReport; vector errorReport; - DeleteRenderer();//Delete the renderer and refresh the textures. //Before starting, must take care of allocations. gl->Allocate(true);//Forcing a realloc of the texture is necessary on AMD, but not on nVidia. @@ -564,7 +554,6 @@ bool FractoriumEmberController::CreateRenderer(eRendererType renderType, cons if (m_RenderType == OPENCL_RENDERER) { auto val = 30 * m_Fractorium->m_Settings->Devices().size(); - m_Fractorium->m_QualitySpin->DoubleClickZero(val); m_Fractorium->m_QualitySpin->DoubleClickNonZero(val); @@ -588,14 +577,14 @@ bool FractoriumEmberController::CreateRenderer(eRendererType renderType, cons m_Renderer->YAxisUp(s->YAxisUp()); m_Renderer->ThreadCount(s->ThreadCount()); m_Renderer->Transparency(s->Transparency()); - + if (m_Renderer->RendererType() == CPU_RENDERER) m_Renderer->InteractiveFilter(s->CpuDEFilter() ? FILTER_DE : FILTER_LOG); else m_Renderer->InteractiveFilter(s->OpenCLDEFilter() ? FILTER_DE : FILTER_LOG); if ((m_Renderer->EarlyClip() != m_PreviewRenderer->EarlyClip()) || - (m_Renderer->YAxisUp() != m_PreviewRenderer->YAxisUp())) + (m_Renderer->YAxisUp() != m_PreviewRenderer->YAxisUp())) { StopPreviewRender(); m_PreviewRenderer->EarlyClip(m_Renderer->EarlyClip()); @@ -635,9 +624,9 @@ void Fractorium::ShutdownAndRecreateFromOptions() bool Fractorium::CreateRendererFromOptions() { bool ok = true; - bool useOpenCL = m_Info.Ok() && m_Settings->OpenCL(); + bool useOpenCL = m_Info->Ok() && m_Settings->OpenCL(); auto v = Devices(m_Settings->Devices()); - + //The most important option to process is what kind of renderer is desired, so do it first. if (!m_Controller->CreateRenderer((useOpenCL && !v.empty()) ? OPENCL_RENDERER : CPU_RENDERER, v)) { @@ -660,13 +649,12 @@ bool Fractorium::CreateRendererFromOptions() bool Fractorium::CreateControllerFromOptions() { bool ok = true; - size_t elementSize = #ifdef DO_DOUBLE m_Settings->Double() ? sizeof(double) : #endif sizeof(float); - + if (!m_Controller.get() || (m_Controller->SizeOfT() != elementSize)) { double hue = m_PaletteHueSpin->value(); @@ -690,11 +678,9 @@ bool Fractorium::CreateControllerFromOptions() if (m_Controller.get()) { m_Controller->CopyTempPalette(tempPalette);//Convert float to double or save double verbatim; - //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, [&](Ember& ember) { }); @@ -706,6 +692,7 @@ bool Fractorium::CreateControllerFromOptions() } #ifdef DO_DOUBLE + if (m_Settings->Double()) m_Controller = unique_ptr(new FractoriumEmberController(this)); else @@ -718,7 +705,6 @@ bool Fractorium::CreateControllerFromOptions() ed.m_Palette = tempPalette;//Restore base temp palette. Adjustments will be then be applied and stored back in in m_Ember.m_Palette below. m_Controller->SetEmber(ed);//Convert float to double or set double verbatim. This will assign m_Ember.m_Palette (which was just tempPalette) to m_TempPalette. m_Controller->SetEmberFile(efd); - //Setting these and updating the GUI overwrites the work of clearing them done in SetEmber() above. //It's a corner case, but doesn't seem to matter. m_PaletteHueSpin->SetValueStealth(hue); @@ -728,7 +714,6 @@ bool Fractorium::CreateControllerFromOptions() m_PaletteBlurSpin->SetValueStealth(blur); m_PaletteFrequencySpin->SetValueStealth(freq); m_Controller->PaletteAdjust();//Applies the adjustments to temp and saves in m_Ember.m_Palette, then fills in the palette preview widget. - //Template specific palette table and variations tree setup in controller constructor, but //must manually setup the library tree here because it's after the embers were assigned. //Passing row re-selects the item that was previously selected. @@ -775,5 +760,5 @@ bool Fractorium::ControllersOk() { return m_Controller.get() && m_Controller->GL template class FractoriumEmberController; #ifdef DO_DOUBLE - template class FractoriumEmberController; +template class FractoriumEmberController; #endif diff --git a/Source/Fractorium/FractoriumToolbar.cpp b/Source/Fractorium/FractoriumToolbar.cpp index 181c2fe..94278a6 100644 --- a/Source/Fractorium/FractoriumToolbar.cpp +++ b/Source/Fractorium/FractoriumToolbar.cpp @@ -10,11 +10,9 @@ void Fractorium::InitToolbarUI() auto clGroup = new QActionGroup(this); clGroup->addAction(ui.ActionCpu); clGroup->addAction(ui.ActionCL); - auto spGroup = new QActionGroup(this); spGroup->addAction(ui.ActionSP); spGroup->addAction(ui.ActionDP); - SyncOptionsToToolbar(); connect(ui.ActionCpu, SIGNAL(triggered(bool)), this, SLOT(OnActionCpu(bool)), Qt::QueuedConnection); connect(ui.ActionCL, SIGNAL(triggered(bool)), this, SLOT(OnActionCL(bool)), Qt::QueuedConnection); @@ -90,7 +88,7 @@ void Fractorium::OnActionStyle(bool checked) /// void Fractorium::SyncOptionsToToolbar() { - static bool openCL = !OpenCLInfo::Instance().Devices().empty(); + static bool openCL = !m_Info->Devices().empty(); if (!openCL) { diff --git a/Source/Fractorium/OptionsDialog.cpp b/Source/Fractorium/OptionsDialog.cpp index 78d96f1..49c68a7 100644 --- a/Source/Fractorium/OptionsDialog.cpp +++ b/Source/Fractorium/OptionsDialog.cpp @@ -9,36 +9,30 @@ /// The parent widget. Default: nullptr. /// The window flags. Default: 0. FractoriumOptionsDialog::FractoriumOptionsDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) - : QDialog(p, f), - m_Info(OpenCLInfo::Instance()) + : QDialog(p, f) { int i, row = 0, spinHeight = 20; - ui.setupUi(this); m_Settings = settings; + m_Info = OpenCLInfo::Instance(); QTableWidget* table = ui.OptionsXmlSavingTable; ui.ThreadCountSpin->setRange(1, Timing::ProcessorCount()); connect(ui.OpenCLCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnOpenCLCheckBoxStateChanged(int)), Qt::QueuedConnection); connect(ui.DeviceTable, SIGNAL(cellChanged(int, int)), this, SLOT(OnDeviceTableCellChanged(int, int)), Qt::QueuedConnection); - SetupSpinner(table, this, row, 1, m_XmlTemporalSamplesSpin, spinHeight, 1, 1000, 100, "", "", true, 1000); SetupSpinner(table, this, row, 1, m_XmlQualitySpin, spinHeight, 1, 200000, 50, "", "", true, 1000); SetupSpinner(table, this, row, 1, m_XmlSupersampleSpin, spinHeight, 1, 4, 1, "", "", true, 2); - m_IdEdit = new QLineEdit(ui.OptionsIdentityTable); ui.OptionsIdentityTable->setCellWidget(0, 1, m_IdEdit); - m_UrlEdit = new QLineEdit(ui.OptionsIdentityTable); ui.OptionsIdentityTable->setCellWidget(1, 1, m_UrlEdit); - m_NickEdit = new QLineEdit(ui.OptionsIdentityTable); ui.OptionsIdentityTable->setCellWidget(2, 1, m_NickEdit); - table = ui.DeviceTable; table->clearContents(); table->setRowCount(0); - if (m_Info.Ok() && !m_Info.Devices().empty()) + if (m_Info->Ok() && !m_Info->Devices().empty()) { SetupDeviceTable(table, m_Settings->Devices()); @@ -122,7 +116,6 @@ void FractoriumOptionsDialog::OnDeviceTableRadioToggled(bool checked) void FractoriumOptionsDialog::OnOpenCLCheckBoxStateChanged(int state) { bool checked = state == Qt::Checked; - ui.DeviceTable->setEnabled(checked); ui.ThreadCountSpin->setEnabled(!checked); ui.CpuSubBatchSpin->setEnabled(!checked); @@ -186,13 +179,11 @@ void FractoriumOptionsDialog::GuiToData() m_Settings->CpuDEFilter(ui.CpuFilteringDERadioButton->isChecked()); m_Settings->OpenCLDEFilter(ui.OpenCLFilteringDERadioButton->isChecked()); m_Settings->Devices(DeviceTableToSettings(ui.DeviceTable)); - //Xml saving. m_Settings->XmlTemporalSamples(m_XmlTemporalSamplesSpin->value()); m_Settings->XmlQuality(m_XmlQualitySpin->value()); m_Settings->XmlSupersample(m_XmlSupersampleSpin->value()); m_Settings->SaveAutoUnique(AutoUnique()); - //Identity. m_Settings->Id(m_IdEdit->text()); m_Settings->Url(m_UrlEdit->text()); @@ -206,7 +197,6 @@ void FractoriumOptionsDialog::DataToGui() { //Interactive rendering. auto devices = m_Settings->Devices(); - ui.EarlyClipCheckBox->setChecked(m_Settings->EarlyClip()); ui.YAxisUpCheckBox->setChecked(m_Settings->YAxisUp()); ui.TransparencyCheckBox->setChecked(m_Settings->Transparency()); @@ -235,7 +225,6 @@ void FractoriumOptionsDialog::DataToGui() m_XmlQualitySpin->setValue(m_Settings->XmlQuality()); m_XmlSupersampleSpin->setValue(m_Settings->XmlSupersample()); ui.AutoUniqueCheckBox->setChecked(m_Settings->SaveAutoUnique()); - //Identity. m_IdEdit->setText(m_Settings->Id()); m_UrlEdit->setText(m_Settings->Url()); diff --git a/Source/Fractorium/OptionsDialog.h b/Source/Fractorium/OptionsDialog.h index 790e96f..dd4cf37 100644 --- a/Source/Fractorium/OptionsDialog.h +++ b/Source/Fractorium/OptionsDialog.h @@ -52,7 +52,7 @@ private: void GuiToData(); Ui::OptionsDialog ui; - OpenCLInfo& m_Info; + shared_ptr m_Info; SpinBox* m_XmlTemporalSamplesSpin; SpinBox* m_XmlQualitySpin; SpinBox* m_XmlSupersampleSpin;