--User changes

-Add new variations: crackle, dc_perlin.
 -Make default palette interp mode be linear instead of step.
 -Make summary tab the selected one in the Info tab.
 -Allow for highlight power of up to 10. It was previously limited to 2.

--Bug fixes
 -Direct color calculations were wrong.
 -Flattening was not applied to final xform.
 -Fix "pure virtual function call" error on shutdown.

--Code changes
 -Allow for array precalc params in variations by adding a size member to the ParamWithName class.
  -In IterOpenCLKernelCreator, memcpy precalc params instead of a direct assign since they can now be of variable length.
 -Add new file VarFuncs to consolidate some functions that are common to multiple variations. This also contains texture data for crackle and dc_perlin.
  -Place OpenCL versions of these functions in the FunctionMapper class in the EmberCL project.
 -Add new Singleton class that uses CRTP, is thread safe, and deletes after the last reference goes away. This fixes the usual "delete after main()" problem with singletons that use the static local function variable pattern.
 -Began saving files with AStyle autoformatter turned on. This will eventually touch all files as they are worked on.
 -Add missing backslash to CUDA include and library paths for builds on Nvidia systems.
 -Add missing gl.h include for Windows.
 -Remove glew include paths from Fractorium, it's not used.
 -Remove any Nvidia specific #defines and build targets, they are no longer needed with OpenCL 1.2.
 -Fix bad paths on linux build.
 -General cleanup.
This commit is contained in:
mfeemster 2015-12-31 13:41:59 -08:00
parent 914b5412c3
commit 6ba16888e3
57 changed files with 3444 additions and 2433 deletions

View File

@ -30,12 +30,13 @@
*GeneratedFiles* *GeneratedFiles*
*.unsuccessfulbuild *.unsuccessfulbuild
*\Obj\* *\Obj\*
Builds/MSVC/VS2010/Obj/x64/Debug/EmberCL_manifest.rc Builds/MSVC/VS2013/Obj/x64/Debug/EmberCL_manifest.rc
Builds/MSVC/VS2010/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc Builds/MSVC/VS2013/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc
Builds/MSVC/VS2010/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc Builds/MSVC/VS2013/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc
Builds/MSVC/VS2010/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc Builds/MSVC/VS2013/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc
Builds/MSVC/VS2010/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc Builds/MSVC/VS2013/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc
Builds/MSVC/VS2010/Obj/Ember/x64/Debug/Ember_manifest.rc Builds/MSVC/VS2013/Obj/Ember/x64/Debug/Ember_manifest.rc
Builds/MSVC/Installer/obj/
Bin/x64/Release/testallvarsout.flame Bin/x64/Release/testallvarsout.flame
Data/~$Bench.xlsx Data/~$Bench.xlsx
*.ps1 *.ps1

13
.gitignore vendored
View File

@ -30,12 +30,13 @@
*GeneratedFiles* *GeneratedFiles*
*.unsuccessfulbuild *.unsuccessfulbuild
*\Obj\* *\Obj\*
Builds/MSVC/VS2010/Obj/x64/Debug/EmberCL_manifest.rc Builds/MSVC/VS2013/Obj/x64/Debug/EmberCL_manifest.rc
Builds/MSVC/VS2010/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc Builds/MSVC/VS2013/Obj/EmberTester/x64/Debug/EmberTester_manifest.rc
Builds/MSVC/VS2010/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc Builds/MSVC/VS2013/Obj/EmberRender/x64/Debug/EmberRender_manifest.rc
Builds/MSVC/VS2010/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc Builds/MSVC/VS2013/Obj/EmberGenome/x64/Debug/EmberGenome_manifest.rc
Builds/MSVC/VS2010/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc Builds/MSVC/VS2013/Obj/EmberAnimate/x64/Debug/EmberAnimate_manifest.rc
Builds/MSVC/VS2010/Obj/Ember/x64/Debug/Ember_manifest.rc Builds/MSVC/VS2013/Obj/Ember/x64/Debug/Ember_manifest.rc
Builds/MSVC/Installer/obj/
Bin/x64/Release/testallvarsout.flame Bin/x64/Release/testallvarsout.flame
Data/~$Bench.xlsx Data/~$Bench.xlsx
*.ps1 *.ps1

View File

@ -279,6 +279,7 @@
<ClInclude Include="..\..\..\Source\Ember\Ember.h" /> <ClInclude Include="..\..\..\Source\Ember\Ember.h" />
<ClInclude Include="..\..\..\Source\Ember\DensityFilter.h" /> <ClInclude Include="..\..\..\Source\Ember\DensityFilter.h" />
<ClInclude Include="..\..\..\Source\Ember\Interpolate.h" /> <ClInclude Include="..\..\..\Source\Ember\Interpolate.h" />
<ClInclude Include="..\..\..\Source\Ember\VarFuncs.h" />
<ClInclude Include="..\..\..\Source\Ember\PaletteList.h" /> <ClInclude Include="..\..\..\Source\Ember\PaletteList.h" />
<ClInclude Include="..\..\..\Source\Ember\Renderer.h" /> <ClInclude Include="..\..\..\Source\Ember\Renderer.h" />
<ClInclude Include="..\..\..\Source\Ember\RendererBase.h" /> <ClInclude Include="..\..\..\Source\Ember\RendererBase.h" />

View File

@ -119,6 +119,9 @@
<ClInclude Include="..\..\..\Source\Ember\Variations06.h"> <ClInclude Include="..\..\..\Source\Ember\Variations06.h">
<Filter>Header Files\Variations</Filter> <Filter>Header Files\Variations</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\Source\Ember\VarFuncs.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\..\Source\Ember\DllMain.cpp"> <ClCompile Include="..\..\..\Source\Ember\DllMain.cpp">

View File

@ -154,7 +154,7 @@
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings> <DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include</AdditionalIncludeDirectories>
<StructMemberAlignment>Default</StructMemberAlignment> <StructMemberAlignment>Default</StructMemberAlignment>
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -166,7 +166,7 @@
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -227,7 +227,7 @@
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_EMBERCL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<DisableSpecificWarnings>4251;4661</DisableSpecificWarnings> <DisableSpecificWarnings>4251;4661</DisableSpecificWarnings>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(ProjectDir)..\..\..\Source\Ember\;$(ProjectDir)..\..\..\..\glm;$(ProjectDir)..\..\..\..\tbb\include;$(ProjectDir)..\..\..\..\libxml2\include;$(AMDAPPSDKROOT)\include;$(CUDA_PATH)\include</AdditionalIncludeDirectories>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCLPch.h</PrecompiledHeaderFile>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
@ -243,7 +243,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">

View File

@ -158,7 +158,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4251</DisableSpecificWarnings> <DisableSpecificWarnings>4251</DisableSpecificWarnings>
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -170,7 +170,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" <Command>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)"</
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4251</DisableSpecificWarnings> <DisableSpecificWarnings>4251</DisableSpecificWarnings>
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -258,7 +258,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" <Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"

View File

@ -158,7 +158,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4251</DisableSpecificWarnings> <DisableSpecificWarnings>4251</DisableSpecificWarnings>
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -170,7 +170,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" <Command>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)"</
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4251</DisableSpecificWarnings> <DisableSpecificWarnings>4251</DisableSpecificWarnings>
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
<FloatingPointModel>Precise</FloatingPointModel> <FloatingPointModel>Precise</FloatingPointModel>
@ -259,7 +259,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" <Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"

View File

@ -158,7 +158,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4251</DisableSpecificWarnings> <DisableSpecificWarnings>4251</DisableSpecificWarnings>
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -170,7 +170,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" <Command>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)"</
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName> <ProgramDataBaseFileName>$(TargetDir)$(TargetName).pdb</ProgramDataBaseFileName>
<AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(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</AdditionalIncludeDirectories>
<DisableSpecificWarnings>4251</DisableSpecificWarnings> <DisableSpecificWarnings>4251</DisableSpecificWarnings>
<PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>EmberCommonPch.h</PrecompiledHeaderFile>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -258,7 +258,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>opencl.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName)</AdditionalLibraryDirectories>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)" <Command>xcopy /F /Y /R /D "$(SolutionDir)$(Platform)\$(Configuration)\*.dll" "$(OutDir)"

View File

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2013
VisualStudioVersion = 12.0.30723.0 VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ember", "Ember.vcxproj", "{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ember", "Ember.vcxproj", "{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}"
EndProject EndProject
@ -119,10 +119,6 @@ Global
Release-MT|Win32 = Release-MT|Win32 Release-MT|Win32 = Release-MT|Win32
Release-MT|x64 = Release-MT|x64 Release-MT|x64 = Release-MT|x64
Release-MT|x86 = Release-MT|x86 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|Mixed Platforms = ReleaseWithoutAsm|Mixed Platforms
ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 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.ActiveCfg = Release|x64
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{2BDB7A54-BB1A-476B-A6E5-F81E90AD4E67}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release|x64
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{320F611A-F9CE-4196-A8DC-FA24B2E8A320}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release|x64
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{6547D5FA-64CE-44BA-9D3C-B6E217456445}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release|x64
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{4A191F4C-03AC-4F1B-AFFD-F5483ECEBD29}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release|x64
{35285FCF-6FA8-410E-841B-70AE744D38B8}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{35285FCF-6FA8-410E-841B-70AE744D38B8}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release|x64
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{7930CAAC-9FC4-4202-B6A3-E760F73F88B7}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release|x64
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{F6A9102C-69A9-48FB-BC4B-49E49AF43236}.ReleaseWithoutAsm|Win32.ActiveCfg = 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.ActiveCfg = Release-MT|x64
{F62787DD-1327-448B-9818-030062BCFAA5}.Release-MT|x64.Build.0 = 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}.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.ActiveCfg = Release|x64
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64 {F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|x64
{F62787DD-1327-448B-9818-030062BCFAA5}.ReleaseWithoutAsm|Win32.ActiveCfg = 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|Win32.Build.0 = Release|Win32
{60F89955-91C6-3A36-8000-13C592FEC2DF}.Release-MT|x64.ActiveCfg = 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}.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.ActiveCfg = Release|Win32
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
{60F89955-91C6-3A36-8000-13C592FEC2DF}.ReleaseWithoutAsm|Win32.ActiveCfg = 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|Win32.Build.0 = Release|Win32
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.Release-MT|x64.ActiveCfg = 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}.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.ActiveCfg = Release|Win32
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
{EB33566E-DA7F-4D28-9077-88C0B7C77E35}.ReleaseWithoutAsm|Win32.ActiveCfg = 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|Win32.Build.0 = Release|Win32
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.Release-MT|x64.ActiveCfg = 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}.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.ActiveCfg = Release|Win32
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
{D6973076-9317-4EF2-A0B8-B7A18AC0713E}.ReleaseWithoutAsm|Win32.ActiveCfg = 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|Win32.Build.0 = Release|Win32
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release-MT|x64.ActiveCfg = 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}.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.ActiveCfg = Release|Win32
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.ReleaseWithoutAsm|Win32.ActiveCfg = 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|Win32.Build.0 = Release|Win32
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release-MT|x64.ActiveCfg = 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}.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.ActiveCfg = Release|Win32
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32 {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = Release|Win32
{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.ReleaseWithoutAsm|Win32.ActiveCfg = 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|x64.Build.0 = ReleaseNvidia|x64
{C8096C47-E358-438C-A520-146D46B0637D}.Release-MT|x86.ActiveCfg = ReleaseNvidia|x86 {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}.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.ActiveCfg = ReleaseNvidia|x86
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = ReleaseNvidia|x86 {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Mixed Platforms.Build.0 = ReleaseNvidia|x86
{C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseNvidia|x86 {C8096C47-E358-438C-A520-146D46B0637D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseNvidia|x86

View File

@ -147,7 +147,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile> <ClCompile>
<PreprocessorDefinitions>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)</PreprocessorDefinitions> <PreprocessorDefinitions>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)</PreprocessorDefinitions>
<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;$(ProjectDir)..\..\..\..\glew\include;$(AMDAPPSDKROOT)\include;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <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)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@ -165,7 +165,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile> <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5OpenGLd.lib;opengl32.lib;glu32.lib;opencl.lib;Qt5Widgetsd.lib;Qt5Xmld.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5OpenGLd.lib;opengl32.lib;glu32.lib;opencl.lib;Qt5Widgetsd.lib;Qt5Xmld.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
@ -233,7 +233,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile> <ClCompile>
<PreprocessorDefinitions>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)</PreprocessorDefinitions> <PreprocessorDefinitions>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)</PreprocessorDefinitions>
<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;$(ProjectDir)..\..\..\..\glew\include;$(AMDAPPSDKROOT)\include;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <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)</AdditionalIncludeDirectories>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType> <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
@ -251,7 +251,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile> <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)lib\$(PlatformName);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(QTDIR)\lib;$(AMDAPPSDKROOT)\lib\x86_64;$(CUDA_PATH)\lib\$(PlatformName);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5OpenGL.lib;opengl32.lib;glu32.lib;opencl.lib;Qt5Widgets.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5OpenGL.lib;opengl32.lib;glu32.lib;opencl.lib;Qt5Widgets.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<Version>0.1</Version> <Version>0.1</Version>
@ -680,7 +680,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing VariationsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing VariationsDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing VariationsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing VariationsDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -688,7 +688,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing VariationsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing VariationsDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing VariationsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing VariationsDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -706,7 +706,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing QssDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing QssDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing QssDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing QssDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -714,7 +714,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing QssDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing QssDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing QssDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing QssDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -732,7 +732,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing csshighlighter.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing csshighlighter.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing csshighlighter.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing csshighlighter.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -740,7 +740,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing csshighlighter.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing csshighlighter.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing csshighlighter.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing csshighlighter.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -760,7 +760,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing QssTextEdit.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing QssTextEdit.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing QssTextEdit.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing QssTextEdit.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -768,7 +768,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing QssTextEdit.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing QssTextEdit.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing QssTextEdit.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing QssTextEdit.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -788,7 +788,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing OptionsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing OptionsDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing OptionsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing OptionsDialog.h...</Message>
@ -803,7 +803,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing OptionsDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing OptionsDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\AboutDialog.h"> <CustomBuild Include="..\..\..\Source\Fractorium\AboutDialog.h">
@ -814,7 +814,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing AboutDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing AboutDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing AboutDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing AboutDialog.h...</Message>
@ -829,7 +829,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing AboutDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing AboutDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\FinalRenderDialog.h"> <CustomBuild Include="..\..\..\Source\Fractorium\FinalRenderDialog.h">
@ -840,7 +840,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing FinalRenderDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing FinalRenderDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing FinalRenderDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing FinalRenderDialog.h...</Message>
@ -855,7 +855,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing FinalRenderDialog.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing FinalRenderDialog.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\EmberTreeWidgetItem.h"> <CustomBuild Include="..\..\..\Source\Fractorium\EmberTreeWidgetItem.h">
@ -910,7 +910,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing FractoriumSettings.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing FractoriumSettings.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing FractoriumSettings.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing FractoriumSettings.h...</Message>
@ -925,7 +925,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing FractoriumSettings.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing FractoriumSettings.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\TwoButtonComboWidget.h"> <CustomBuild Include="..\..\..\Source\Fractorium\TwoButtonComboWidget.h">
@ -963,7 +963,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing CurvesGraphicsView.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing CurvesGraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing CurvesGraphicsView.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing CurvesGraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -971,7 +971,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing CurvesGraphicsView.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing CurvesGraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing CurvesGraphicsView.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing CurvesGraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
@ -1024,7 +1024,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing GLWidget.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing GLWidget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing GLWidget.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing GLWidget.h...</Message>
@ -1039,7 +1039,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing GLWidget.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing GLWidget.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<ClInclude Include="..\..\..\..\glm\glm\glm.hpp" /> <ClInclude Include="..\..\..\..\glm\glm\glm.hpp" />
@ -1051,7 +1051,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing DoubleSpinBox.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing DoubleSpinBox.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing DoubleSpinBox.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing DoubleSpinBox.h...</Message>
@ -1066,7 +1066,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing DoubleSpinBox.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing DoubleSpinBox.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\SpinBox.h"> <CustomBuild Include="..\..\..\Source\Fractorium\SpinBox.h">
@ -1077,7 +1077,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing SpinBox.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing SpinBox.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing SpinBox.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing SpinBox.h...</Message>
@ -1092,7 +1092,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing SpinBox.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing SpinBox.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\StealthComboBox.h"> <CustomBuild Include="..\..\..\Source\Fractorium\StealthComboBox.h">
@ -1201,7 +1201,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing Fractorium.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing Fractorium.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(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"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs> <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath);%(AdditionalInputs)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing Fractorium.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing Fractorium.h...</Message>
@ -1216,7 +1216,7 @@ xcopy /F /Y /R /D "$(SolutionDir)..\..\..\Data\flam3-palettes.xml" "$(OutDir)"</
<Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing Fractorium.h...</Message> <Message Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">Moc%27ing Fractorium.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command> <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(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"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command> <Command Condition="'$(Configuration)|$(Platform)'=='ReleaseNvidia|x64'">"$(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)\."</Command>
</CustomBuild> </CustomBuild>
<ClInclude Include="..\..\..\Source\Fractorium\FractoriumPch.h" /> <ClInclude Include="..\..\..\Source\Fractorium\FractoriumPch.h" />

View File

@ -301,9 +301,6 @@
<ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_QssTextEdit.cpp"> <ClCompile Include="GeneratedFiles\ReleaseNvidia\moc_QssTextEdit.cpp">
<Filter>Generated Files\ReleaseNvidia</Filter> <Filter>Generated Files\ReleaseNvidia</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\Source\Fractorium\qcssscanner.h">
<Filter>Dialogs\Qss</Filter>
</ClCompile>
<ClCompile Include="..\..\..\Source\Fractorium\qcssscanner.cpp"> <ClCompile Include="..\..\..\Source\Fractorium\qcssscanner.cpp">
<Filter>Dialogs\Qss</Filter> <Filter>Dialogs\Qss</Filter>
</ClCompile> </ClCompile>

View File

@ -60,6 +60,7 @@ HEADERS += \
$$PRJ_DIR/Variations05.h \ $$PRJ_DIR/Variations05.h \
$$PRJ_DIR/Variations06.h \ $$PRJ_DIR/Variations06.h \
$$PRJ_DIR/VariationsDC.h \ $$PRJ_DIR/VariationsDC.h \
$$PRJ_DIR/VarFuncs.h \
$$PRJ_DIR/Xform.h \ $$PRJ_DIR/Xform.h \
$$PRJ_DIR/XmlToEmber.h $$PRJ_DIR/XmlToEmber.h

View File

@ -12,19 +12,20 @@ unix|macx {
SHARE_INSTALL_DIR = /usr/share/fractorium 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(release, debug|release) {
CONFIG += warn_off CONFIG += warn_off
DESTDIR = $$(PWD)/../../../Bin/release DESTDIR = $$EMBER_ROOT/Bin/release
} }
CONFIG(debug, debug|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 { macx {
LIBS += -framework OpenGL LIBS += -framework OpenGL
LIBS += -framework OpenCL LIBS += -framework OpenCL
@ -48,10 +49,6 @@ macx {
QMAKE_LFLAGS_RELEASE += -s QMAKE_LFLAGS_RELEASE += -s
} }
nvidia {
QMAKE_CXXFLAGS += -DNVIDIA
}
native { native {
QMAKE_CXXFLAGS += -march=native QMAKE_CXXFLAGS += -march=native
} else { } else {

Binary file not shown.

View File

@ -15,6 +15,7 @@ template<> CriticalSection QTIsaac<ISAAC_SIZE, ISAAC_INT>::m_CS = CriticalSectio
#include "Palette.h" #include "Palette.h"
#include "PaletteList.h" #include "PaletteList.h"
#include "Point.h" #include "Point.h"
#include "VarFuncs.h"
#include "Variation.h" #include "Variation.h"
#include "Variations01.h" #include "Variations01.h"
#include "Variations02.h" #include "Variations02.h"
@ -42,7 +43,6 @@ template<> CriticalSection QTIsaac<ISAAC_SIZE, ISAAC_INT>::m_CS = CriticalSectio
/// All new templated classes, such as new variations, must be added here. /// All new templated classes, such as new variations, must be added here.
/// Additional instances of static class member variables. /// Additional instances of static class member variables.
/// </summary> /// </summary>
namespace EmberNs namespace EmberNs
{ {
bool Timing::m_TimingInit = false; bool Timing::m_TimingInit = false;
@ -71,6 +71,7 @@ uint Timing::m_ProcessorCount;
template EMBER_API class MotionParam<T>; \ template EMBER_API class MotionParam<T>; \
template EMBER_API class EmberMotion<T>; \ template EMBER_API class EmberMotion<T>; \
template EMBER_API class IteratorHelper<T>; \ template EMBER_API class IteratorHelper<T>; \
template EMBER_API class VarFuncs<T>; \
template EMBER_API class Variation<T>; \ template EMBER_API class Variation<T>; \
template EMBER_API class ParamWithName<T>; \ template EMBER_API class ParamWithName<T>; \
template EMBER_API class ParametricVariation<T>; \ template EMBER_API class ParametricVariation<T>; \
@ -377,12 +378,14 @@ uint Timing::m_ProcessorCount;
EXPORTPREPOSTREGVAR(Crob, T) \ EXPORTPREPOSTREGVAR(Crob, T) \
EXPORTPREPOSTREGVAR(BubbleT3D, T) \ EXPORTPREPOSTREGVAR(BubbleT3D, T) \
EXPORTPREPOSTREGVAR(Synth, T) \ EXPORTPREPOSTREGVAR(Synth, T) \
EXPORTPREPOSTREGVAR(Crackle, T) \
EXPORTPREPOSTREGVAR(DCBubble, T) \ EXPORTPREPOSTREGVAR(DCBubble, T) \
EXPORTPREPOSTREGVAR(DCCarpet, T) \ EXPORTPREPOSTREGVAR(DCCarpet, T) \
EXPORTPREPOSTREGVAR(DCCube, T) \ EXPORTPREPOSTREGVAR(DCCube, T) \
EXPORTPREPOSTREGVAR(DCCylinder, T) \ EXPORTPREPOSTREGVAR(DCCylinder, T) \
EXPORTPREPOSTREGVAR(DCGridOut, T) \ EXPORTPREPOSTREGVAR(DCGridOut, T) \
EXPORTPREPOSTREGVAR(DCLinear, T) \ EXPORTPREPOSTREGVAR(DCLinear, T) \
EXPORTPREPOSTREGVAR(DCPerlin, T) \
EXPORTPREPOSTREGVAR(DCZTransl, T) \ EXPORTPREPOSTREGVAR(DCZTransl, T) \
EXPORTPREPOSTREGVAR(DCTriangle, T) \ EXPORTPREPOSTREGVAR(DCTriangle, T) \
template EMBER_API class VariationList<T>; \ template EMBER_API class VariationList<T>; \
@ -410,7 +413,6 @@ uint Timing::m_ProcessorCount;
template EMBER_API class TemporalFilterCreator<T>; \ template EMBER_API class TemporalFilterCreator<T>; \
template EMBER_API class Interpolater<T>; \ template EMBER_API class Interpolater<T>; \
template EMBER_API class Ember<T>; \ template EMBER_API class Ember<T>; \
/*template EMBER_API class RenderCallback<T>;*/ \
template EMBER_API class CarToRas<T>; \ template EMBER_API class CarToRas<T>; \
template EMBER_API class Curves<T>; \ template EMBER_API class Curves<T>; \
template EMBER_API class XmlToEmber<T>; \ template EMBER_API class XmlToEmber<T>; \

View File

@ -107,7 +107,6 @@ public:
m_Supersample = ember.m_Supersample; m_Supersample = ember.m_Supersample;
m_TemporalSamples = ember.m_TemporalSamples; m_TemporalSamples = ember.m_TemporalSamples;
m_Symmetry = ember.m_Symmetry; m_Symmetry = ember.m_Symmetry;
m_Quality = T(ember.m_Quality); m_Quality = T(ember.m_Quality);
m_PixelsPerUnit = T(ember.m_PixelsPerUnit); m_PixelsPerUnit = T(ember.m_PixelsPerUnit);
m_Zoom = T(ember.m_Zoom); m_Zoom = T(ember.m_Zoom);
@ -130,29 +129,22 @@ public:
m_Background = ember.m_Background; m_Background = ember.m_Background;
m_Interp = ember.m_Interp; m_Interp = ember.m_Interp;
m_AffineInterp = ember.m_AffineInterp; m_AffineInterp = ember.m_AffineInterp;
m_MinRadDE = T(ember.m_MinRadDE); m_MinRadDE = T(ember.m_MinRadDE);
m_MaxRadDE = T(ember.m_MaxRadDE); m_MaxRadDE = T(ember.m_MaxRadDE);
m_CurveDE = T(ember.m_CurveDE); m_CurveDE = T(ember.m_CurveDE);
m_SpatialFilterType = ember.m_SpatialFilterType; m_SpatialFilterType = ember.m_SpatialFilterType;
m_SpatialFilterRadius = T(ember.m_SpatialFilterRadius); m_SpatialFilterRadius = T(ember.m_SpatialFilterRadius);
m_TemporalFilterType = ember.m_TemporalFilterType; m_TemporalFilterType = ember.m_TemporalFilterType;
m_TemporalFilterExp = T(ember.m_TemporalFilterExp); m_TemporalFilterExp = T(ember.m_TemporalFilterExp);
m_TemporalFilterWidth = T(ember.m_TemporalFilterWidth); m_TemporalFilterWidth = T(ember.m_TemporalFilterWidth);
m_PaletteMode = ember.m_PaletteMode; m_PaletteMode = ember.m_PaletteMode;
m_PaletteInterp = ember.m_PaletteInterp; m_PaletteInterp = ember.m_PaletteInterp;
m_Name = ember.m_Name; m_Name = ember.m_Name;
m_ParentFilename = ember.m_ParentFilename; m_ParentFilename = ember.m_ParentFilename;
m_Index = ember.m_Index; m_Index = ember.m_Index;
m_ScaleType = ember.ScaleType(); m_ScaleType = ember.ScaleType();
m_Palette = ember.m_Palette; m_Palette = ember.m_Palette;
m_Curves = ember.m_Curves; m_Curves = ember.m_Curves;
m_Xforms.clear(); m_Xforms.clear();
for (size_t i = 0; i < ember.XformCount(); i++) for (size_t i = 0; i < ember.XformCount(); i++)
@ -160,13 +152,11 @@ public:
if (Xform<U>* p = ember.GetXform(i)) if (Xform<U>* p = ember.GetXform(i))
{ {
Xform<T> xform = *p;//Will call assignment operator to convert between types T and U. Xform<T> xform = *p;//Will call assignment operator to convert between types T and U.
AddXform(xform); AddXform(xform);
} }
} }
Xform<T> finalXform = *ember.FinalXform();//Will call assignment operator to convert between types T and U. Xform<T> finalXform = *ember.FinalXform();//Will call assignment operator to convert between types T and U.
SetFinalXform(finalXform); SetFinalXform(finalXform);
//Interpolated-against final xforms need animate & color speed set to 0. //Interpolated-against final xforms need animate & color speed set to 0.
@ -184,7 +174,6 @@ public:
m_Edits = xmlCopyDoc(ember.m_Edits, 1); m_Edits = xmlCopyDoc(ember.m_Edits, 1);
CopyVec(m_EmberMotionElements, ember.m_EmberMotionElements); CopyVec(m_EmberMotionElements, ember.m_EmberMotionElements);
return *this; return *this;
} }
@ -227,36 +216,28 @@ public:
m_Background.Reset(); m_Background.Reset();
m_Interp = EMBER_INTERP_LINEAR; m_Interp = EMBER_INTERP_LINEAR;
m_AffineInterp = AFFINE_INTERP_LOG; m_AffineInterp = AFFINE_INTERP_LOG;
//DE filter. //DE filter.
m_MinRadDE = 0; m_MinRadDE = 0;
m_MaxRadDE = 9; m_MaxRadDE = 9;
m_CurveDE = T(0.4); m_CurveDE = T(0.4);
//Spatial filter. //Spatial filter.
m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER; m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER;
m_SpatialFilterRadius = T(0.5); m_SpatialFilterRadius = T(0.5);
//Temporal filter. //Temporal filter.
m_TemporalFilterType = BOX_TEMPORAL_FILTER; m_TemporalFilterType = BOX_TEMPORAL_FILTER;
m_TemporalFilterExp = 0; m_TemporalFilterExp = 0;
m_TemporalFilterWidth = 1; m_TemporalFilterWidth = 1;
//Palette. //Palette.
m_PaletteMode = PALETTE_STEP; m_PaletteMode = PALETTE_LINEAR;
m_PaletteInterp = INTERP_HSV; m_PaletteInterp = INTERP_HSV;
//Curves. //Curves.
m_Curves.Init(); m_Curves.Init();
m_Name = "No name"; m_Name = "No name";
m_ParentFilename = "No parent"; m_ParentFilename = "No parent";
//Internal values. //Internal values.
m_Index = 0; m_Index = 0;
m_ScaleType = eScaleType::SCALE_NONE; m_ScaleType = eScaleType::SCALE_NONE;
m_Xforms.reserve(12); m_Xforms.reserve(12);
m_Edits = nullptr; m_Edits = nullptr;
} }
@ -280,7 +261,6 @@ public:
for (size_t i = 0; i < count; i++) for (size_t i = 0; i < count; i++)
{ {
Xform<T> xform; Xform<T> xform;
AddXform(xform); AddXform(xform);
} }
} }
@ -304,7 +284,6 @@ public:
Ember<T> Copy(size_t xformPad = 0, bool doFinal = false) Ember<T> Copy(size_t xformPad = 0, bool doFinal = false)
{ {
Ember<T> ember(*this); Ember<T> ember(*this);
ember.PadXforms(xformPad); ember.PadXforms(xformPad);
if (doFinal) if (doFinal)
@ -367,7 +346,7 @@ public:
bool DeleteTotalXform(size_t i) bool DeleteTotalXform(size_t i)
{ {
if (DeleteXform(i)) if (DeleteXform(i))
{ } { }
else if (i == XformCount() && UseFinalXform()) else if (i == XformCount() && UseFinalXform())
m_FinalXform.Clear(); m_FinalXform.Clear();
else else
@ -485,7 +464,6 @@ public:
for (size_t i = 0; i < TotalXformCount(); i++) for (size_t i = 0; i < TotalXformCount(); i++)
{ {
Xform<T>* xform = GetTotalXform(i); Xform<T>* xform = GetTotalXform(i);
xform->CacheColorVals(); xform->CacheColorVals();
xform->SetPrecalcFlags(); xform->SetPrecalcFlags();
} }
@ -624,6 +602,7 @@ public:
normalizedWeights.resize(m_Xforms.size()); normalizedWeights.resize(m_Xforms.size());
for (auto& xform : m_Xforms) norm += xform.m_Weight; 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++; } 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<Variation<T>*>& variations, bool baseOnly = true) const void GetPresentVariations(vector<Variation<T>*>& variations, bool baseOnly = true) const
{ {
size_t i = 0, xformIndex = 0, totalVarCount = m_FinalXform.TotalVariationCount(); size_t i = 0, xformIndex = 0, totalVarCount = m_FinalXform.TotalVariationCount();
variations.clear(); variations.clear();
for (auto& xform : m_Xforms) totalVarCount += xform.TotalVariationCount();
while (auto xform = GetTotalXform(xformIndex++))
totalVarCount += xform->TotalVariationCount();
xformIndex = 0;
variations.reserve(totalVarCount); variations.reserve(totalVarCount);
while (Xform<T>* xform = GetTotalXform(xformIndex++)) while (auto xform = GetTotalXform(xformIndex++))
{ {
i = 0; i = 0;
totalVarCount = xform->TotalVariationCount(); totalVarCount = xform->TotalVariationCount();
@ -654,7 +635,7 @@ public:
string tempVarBaseName = tempVar->BaseName(); string tempVarBaseName = tempVar->BaseName();
if (!FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVar->VariationId() == var->VariationId(); }) && if (!FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVar->VariationId() == var->VariationId(); }) &&
!FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVarBaseName == var->BaseName(); })) !FindIf(variations, [&] (const Variation<T>* var) -> bool { return tempVarBaseName == var->BaseName(); }))
variations.push_back(tempVar); variations.push_back(tempVar);
} }
else else
@ -676,24 +657,29 @@ public:
{ {
bool flattened = false; 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; return flattened;
} }
/// <summary> /// <summary>
/// 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.
/// </summary> /// </summary>
/// <returns>True if flatten was removed, false if it wasn't present.</returns> /// <returns>True if any flatten was removed, false if it wasn't present.</returns>
bool Unflatten() bool Unflatten()
{ {
size_t xformIndex = 0;
bool unflattened = false; bool unflattened = false;
for (auto& xform : m_Xforms) while (auto xform = GetTotalXform(xformIndex++))
{ {
unflattened |= xform.DeleteVariationById(VAR_PRE_FLATTEN); unflattened |= xform->DeleteVariationById(VAR_PRE_FLATTEN);
unflattened |= xform.DeleteVariationById(VAR_FLATTEN); unflattened |= xform->DeleteVariationById(VAR_FLATTEN);
unflattened |= xform.DeleteVariationById(VAR_POST_FLATTEN); unflattened |= xform->DeleteVariationById(VAR_POST_FLATTEN);
} }
return unflattened; return unflattened;
@ -770,7 +756,6 @@ public:
m_TemporalFilterType = embers[0].m_TemporalFilterType; m_TemporalFilterType = embers[0].m_TemporalFilterType;
m_PaletteMode = embers[0].m_PaletteMode; m_PaletteMode = embers[0].m_PaletteMode;
m_AffineInterp = embers[0].m_AffineInterp; m_AffineInterp = embers[0].m_AffineInterp;
//Interpolate ember parameters, these should be in the same order the members are declared. //Interpolate ember parameters, these should be in the same order the members are declared.
InterpI<&Ember<T>::m_FinalRasW>(embers, coefs, size); InterpI<&Ember<T>::m_FinalRasW>(embers, coefs, size);
InterpI<&Ember<T>::m_FinalRasH>(embers, coefs, size); InterpI<&Ember<T>::m_FinalRasH>(embers, coefs, size);
@ -804,10 +789,8 @@ public:
InterpT<&Ember<T>::m_CurveDE>(embers, coefs, size); InterpT<&Ember<T>::m_CurveDE>(embers, coefs, size);
InterpT<&Ember<T>::m_SpatialFilterRadius>(embers, coefs, size); InterpT<&Ember<T>::m_SpatialFilterRadius>(embers, coefs, size);
InterpX<Curves<T>, &Ember<T>::m_Curves>(embers, coefs, size); InterpX<Curves<T>, &Ember<T>::m_Curves>(embers, coefs, size);
//Normally done in assignment, must manually do here. //Normally done in assignment, must manually do here.
SetProjFunc(); SetProjFunc();
//An extra step needed here due to the OOD that was not needed in the original. //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. //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. //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<T>* var = thisXform->GetVariation(j); Variation<T>* var = thisXform->GetVariation(j);
ParametricVariation<T>* parVar = dynamic_cast<ParametricVariation<T>*>(var);//Will use below if it's parametric. ParametricVariation<T>* parVar = dynamic_cast<ParametricVariation<T>*>(var);//Will use below if it's parametric.
var->m_Weight = 0; var->m_Weight = 0;
if (parVar) if (parVar)
@ -901,7 +883,6 @@ public:
InterpXform<&Xform<T>::m_ColorSpeed>(thisXform, i, embers, coefs, size); InterpXform<&Xform<T>::m_ColorSpeed>(thisXform, i, embers, coefs, size);
InterpXform<&Xform<T>::m_Opacity> (thisXform, i, embers, coefs, size); InterpXform<&Xform<T>::m_Opacity> (thisXform, i, embers, coefs, size);
InterpXform<&Xform<T>::m_Animate> (thisXform, i, embers, coefs, size); InterpXform<&Xform<T>::m_Animate> (thisXform, i, embers, coefs, size);
ClampGte0Ref(thisXform->m_Weight); ClampGte0Ref(thisXform->m_Weight);
ClampRef<T>(thisXform->m_ColorX, 0, 1); ClampRef<T>(thisXform->m_ColorX, 0, 1);
ClampRef<T>(thisXform->m_ColorSpeed, -1, 1); ClampRef<T>(thisXform->m_ColorSpeed, -1, 1);
@ -912,13 +893,10 @@ public:
vector<v2T> cxMag(size); vector<v2T> cxMag(size);
vector<v2T> cxAng(size); vector<v2T> cxAng(size);
vector<v2T> cxTrn(size); vector<v2T> cxTrn(size);
thisXform->m_Affine.m_Mat = m23T(0); thisXform->m_Affine.m_Mat = m23T(0);
//Affine part. //Affine part.
Interpolater<T>::ConvertLinearToPolar(embers, size, i, 0, cxAng, cxMag, cxTrn); Interpolater<T>::ConvertLinearToPolar(embers, size, i, 0, cxAng, cxMag, cxTrn);
Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Affine); Interpolater<T>::InterpAndConvertBack(coefs, cxAng, cxMag, cxTrn, thisXform->m_Affine);
//Post part. //Post part.
allID = true; allID = true;
@ -1032,12 +1010,10 @@ public:
T t2 = t * t; T t2 = t * t;
T t3 = t2 * t; T t3 = t2 * t;
vector<T> cmc(4); vector<T> cmc(4);
cmc[0] = (2 * t2 - t - t3) / 2; cmc[0] = (2 * t2 - t - t3) / 2;
cmc[1] = (3 * t3 - 5 * t2 + 2) / 2; cmc[1] = (3 * t3 - 5 * t2 + 2) / 2;
cmc[2] = (4 * t2 - 3 * t3 + t) / 2; cmc[2] = (4 * t2 - 3 * t3 + t) / 2;
cmc[3] = (t3 - t2) / 2; cmc[3] = (t3 - t2) / 2;
Interpolate(embers, size, cmc, 0); Interpolate(embers, size, cmc, 0);
} }
@ -1083,13 +1059,14 @@ public:
if (sym == 0) if (sym == 0)
{ {
static intmax_t symDistrib[] = { static intmax_t symDistrib[] =
{
-4, -3, -4, -3,
-2, -2, -2, -2, -2, -2,
-1, -1, -1, -1, -1, -1,
2, 2, 2, 2, 2, 2,
3, 3, 3, 3,
4, 4, 4, 4,
}; };
if (rand.Rand() & 1) if (rand.Rand() & 1)
@ -1110,7 +1087,6 @@ public:
i = XformCount();//Don't apply sym to final. i = XformCount();//Don't apply sym to final.
Xform<T> xform; Xform<T> xform;
AddXform(xform); AddXform(xform);
m_Xforms[i].m_Weight = 1; m_Xforms[i].m_Weight = 1;
m_Xforms[i].m_ColorSpeed = 0; m_Xforms[i].m_ColorSpeed = 0;
m_Xforms[i].m_Animate = 0; m_Xforms[i].m_Animate = 0;
@ -1123,7 +1099,6 @@ public:
m_Xforms[i].m_Affine.E(1); m_Xforms[i].m_Affine.E(1);
m_Xforms[i].m_Affine.F(0); m_Xforms[i].m_Affine.F(0);
m_Xforms[i].AddVariation(new LinearVariation<T>()); m_Xforms[i].AddVariation(new LinearVariation<T>());
result++; result++;
sym = -sym; sym = -sym;
} }
@ -1135,7 +1110,6 @@ public:
i = XformCount(); i = XformCount();
Xform<T> xform; Xform<T> xform;
AddXform(xform); AddXform(xform);
m_Xforms[i].m_Weight = 1; m_Xforms[i].m_Weight = 1;
m_Xforms[i].m_ColorSpeed = 0; m_Xforms[i].m_ColorSpeed = 0;
m_Xforms[i].m_Animate = 0; m_Xforms[i].m_Animate = 0;
@ -1147,7 +1121,6 @@ public:
m_Xforms[i].m_Affine.C(0); m_Xforms[i].m_Affine.C(0);
m_Xforms[i].m_Affine.F(0); m_Xforms[i].m_Affine.F(0);
m_Xforms[i].AddVariation(new LinearVariation<T>()); m_Xforms[i].AddVariation(new LinearVariation<T>());
result++; result++;
} }
@ -1164,9 +1137,13 @@ public:
size_t val = 0; size_t val = 0;
if (m_CamZPos != 0) val |= PROJBITS_ZPOS; if (m_CamZPos != 0) val |= PROJBITS_ZPOS;
if (m_CamPerspective != 0) val |= PROJBITS_PERSP; if (m_CamPerspective != 0) val |= PROJBITS_PERSP;
if (m_CamPitch != 0) val |= PROJBITS_PITCH; if (m_CamPitch != 0) val |= PROJBITS_PITCH;
if (m_CamYaw != 0) val |= PROJBITS_YAW; if (m_CamYaw != 0) val |= PROJBITS_YAW;
if (m_CamDepthBlur != 0) val |= PROJBITS_BLUR; if (m_CamDepthBlur != 0) val |= PROJBITS_BLUR;
return val; return val;
@ -1199,7 +1176,6 @@ public:
void ProjectZPerspective(Point<T>& point, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) void ProjectZPerspective(Point<T>& point, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
{ {
T zr = Zeps(1 - m_CamPerspective * (point.m_Z - m_CamZPos)); T zr = Zeps(1 - m_CamPerspective * (point.m_Z - m_CamZPos));
point.m_X /= zr; point.m_X /= zr;
point.m_Y /= zr; point.m_Y /= zr;
point.m_Z -= m_CamZPos; point.m_Z -= m_CamZPos;
@ -1215,7 +1191,6 @@ public:
T z = point.m_Z - m_CamZPos; T z = point.m_Z - m_CamZPos;
T y = m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z; 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)); T zr = Zeps(1 - m_CamPerspective * (m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z));
point.m_X /= zr; point.m_X /= zr;
point.m_Y = y / zr; point.m_Y = y / zr;
point.m_Z -= m_CamZPos; point.m_Z -= m_CamZPos;
@ -1231,16 +1206,12 @@ public:
T y, z, zr; T y, z, zr;
T dsin, dcos; T dsin, dcos;
T t = rand.Frand01<T>() * M_2PI; T t = rand.Frand01<T>() * M_2PI;
z = point.m_Z - m_CamZPos; z = point.m_Z - m_CamZPos;
y = m_CamMat[1][1] * point.m_Y + m_CamMat[2][1] * z; 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; z = m_CamMat[1][2] * point.m_Y + m_CamMat[2][2] * z;
zr = Zeps(1 - m_CamPerspective * z); zr = Zeps(1 - m_CamPerspective * z);
sincos(t, &dsin, &dcos); sincos(t, &dsin, &dcos);
T dr = rand.Frand01<T>() * m_BlurCoef * z; T dr = rand.Frand01<T>() * m_BlurCoef * z;
point.m_X = (point.m_X + dr * dcos) / zr; point.m_X = (point.m_X + dr * dcos) / zr;
point.m_Y = (y + dr * dsin) / zr; point.m_Y = (y + dr * dsin) / zr;
point.m_Z -= m_CamZPos; point.m_Z -= m_CamZPos;
@ -1258,14 +1229,10 @@ public:
T z = point.m_Z - m_CamZPos; T z = point.m_Z - m_CamZPos;
T x = m_CamMat[0][0] * point.m_X + m_CamMat[1][0] * point.m_Y; 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 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; 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 zr = Zeps(1 - m_CamPerspective * z);
T dr = rand.Frand01<T>() * m_BlurCoef * z; T dr = rand.Frand01<T>() * m_BlurCoef * z;
sincos(t, &dsin, &dcos); sincos(t, &dsin, &dcos);
point.m_X = (x + dr * dcos) / zr; point.m_X = (x + dr * dcos) / zr;
point.m_Y = (y + dr * dsin) / zr; point.m_Y = (y + dr * dsin) / zr;
point.m_Z -= m_CamZPos; 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 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 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)); 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_X = x / zr;
point.m_Y = y / zr; point.m_Y = y / zr;
point.m_Z -= m_CamZPos; point.m_Z -= m_CamZPos;
@ -1306,60 +1272,77 @@ public:
switch (param.first) switch (param.first)
{ {
case FLAME_MOTION_ZOOM: case FLAME_MOTION_ZOOM:
APP_FMP(m_Zoom); APP_FMP(m_Zoom);
break; break;
case FLAME_MOTION_ZPOS:
APP_FMP(m_CamZPos); case FLAME_MOTION_ZPOS:
break; APP_FMP(m_CamZPos);
case FLAME_MOTION_PERSPECTIVE: break;
APP_FMP(m_CamPerspective);
break; case FLAME_MOTION_PERSPECTIVE:
case FLAME_MOTION_YAW: APP_FMP(m_CamPerspective);
APP_FMP(m_CamYaw); break;
break;
case FLAME_MOTION_PITCH: case FLAME_MOTION_YAW:
APP_FMP(m_CamPitch); APP_FMP(m_CamYaw);
break; break;
case FLAME_MOTION_DEPTH_BLUR:
APP_FMP(m_CamDepthBlur); case FLAME_MOTION_PITCH:
break; APP_FMP(m_CamPitch);
case FLAME_MOTION_CENTER_X: break;
APP_FMP(m_CenterX);
break; case FLAME_MOTION_DEPTH_BLUR:
case FLAME_MOTION_CENTER_Y: APP_FMP(m_CamDepthBlur);
APP_FMP(m_CenterY); break;
break;
case FLAME_MOTION_ROTATE: case FLAME_MOTION_CENTER_X:
APP_FMP(m_Rotate); APP_FMP(m_CenterX);
break; break;
case FLAME_MOTION_BRIGHTNESS:
APP_FMP(m_Brightness); case FLAME_MOTION_CENTER_Y:
break; APP_FMP(m_CenterY);
case FLAME_MOTION_GAMMA: break;
APP_FMP(m_Gamma);
break; case FLAME_MOTION_ROTATE:
case FLAME_MOTION_GAMMA_THRESH: APP_FMP(m_Rotate);
APP_FMP(m_GammaThresh); break;
break;
case FLAME_MOTION_HIGHLIGHT_POWER: case FLAME_MOTION_BRIGHTNESS:
APP_FMP(m_HighlightPower); APP_FMP(m_Brightness);
break; break;
case FLAME_MOTION_BACKGROUND_R:
APP_FMP(m_Background.r); case FLAME_MOTION_GAMMA:
break; APP_FMP(m_Gamma);
case FLAME_MOTION_BACKGROUND_G: break;
APP_FMP(m_Background.g);
break; case FLAME_MOTION_GAMMA_THRESH:
case FLAME_MOTION_BACKGROUND_B: APP_FMP(m_GammaThresh);
APP_FMP(m_Background.b); break;
break;
case FLAME_MOTION_VIBRANCY: case FLAME_MOTION_HIGHLIGHT_POWER:
APP_FMP(m_Vibrancy); APP_FMP(m_HighlightPower);
break; break;
case FLAME_MOTION_NONE:
default: case FLAME_MOTION_BACKGROUND_R:
break; 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; size_t i;
ostringstream ss; ostringstream ss;
ss << "Final Raster Width: " << m_FinalRasW << "\n"
ss << "Final Raster Width: " << m_FinalRasW << endl << "Final Raster Height: " << m_FinalRasH << "\n"
<< "Final Raster Height: " << m_FinalRasH << endl << "Original Raster Width: " << m_OrigFinalRasW << "\n"
<< "Original Raster Width: " << m_OrigFinalRasW << endl << "Original Raster Height: " << m_OrigFinalRasH << "\n"
<< "Original Raster Height: " << m_OrigFinalRasH << endl << "Supersample: " << m_Supersample << "\n"
<< "Supersample: " << m_Supersample << endl << "Temporal Samples: " << m_TemporalSamples << "\n"
<< "Temporal Samples: " << m_TemporalSamples << endl << "Symmetry: " << m_Symmetry << "\n"
<< "Symmetry: " << m_Symmetry << endl << "Quality: " << m_Quality << "\n"
<< "Pixels Per Unit: " << m_PixelsPerUnit << "\n"
<< "Quality: " << m_Quality << endl << "Original Pixels Per Unit: " << m_OrigPixPerUnit << "\n"
<< "Pixels Per Unit: " << m_PixelsPerUnit << endl << "Sub Batch Size: " << m_SubBatchSize << "\n"
<< "Original Pixels Per Unit: " << m_OrigPixPerUnit << endl << "Fuse Count: " << m_FuseCount << "\n"
<< "Sub Batch Size: " << m_SubBatchSize << endl << "Zoom: " << m_Zoom << "\n"
<< "Fuse Count: " << m_FuseCount << endl << "ZPos: " << m_CamZPos << "\n"
<< "Zoom: " << m_Zoom << endl << "Perspective: " << m_CamPerspective << "\n"
<< "ZPos: " << m_CamZPos << endl << "Yaw: " << m_CamYaw << "\n"
<< "Perspective: " << m_CamPerspective << endl << "Pitch: " << m_CamPitch << "\n"
<< "Yaw: " << m_CamYaw << endl << "Depth Blur: " << m_CamDepthBlur << "\n"
<< "Pitch: " << m_CamPitch << endl << "CenterX: " << m_CenterX << "\n"
<< "Depth Blur: " << m_CamDepthBlur << endl << "CenterY: " << m_CenterY << "\n"
<< "CenterX: " << m_CenterX << endl << "RotCenterY: " << m_RotCenterY << "\n"
<< "CenterY: " << m_CenterY << endl << "Rotate: " << m_Rotate << "\n"
<< "RotCenterY: " << m_RotCenterY << endl << "Brightness: " << m_Brightness << "\n"
<< "Rotate: " << m_Rotate << endl << "Gamma: " << m_Gamma << "\n"
<< "Brightness: " << m_Brightness << endl << "Vibrancy: " << m_Vibrancy << "\n"
<< "Gamma: " << m_Gamma << endl << "Gamma Threshold: " << m_GammaThresh << "\n"
<< "Vibrancy: " << m_Vibrancy << endl << "Highlight Power: " << m_HighlightPower << "\n"
<< "Gamma Threshold: " << m_GammaThresh << endl << "Time: " << m_Time << "\n"
<< "Highlight Power: " << m_HighlightPower << endl << "Background: " << m_Background.r << ", " << m_Background.g << ", " << m_Background.b << ", " << m_Background.a << "\n"
<< "Time: " << m_Time << endl << "Interp: " << m_Interp << "\n"
<< "Background: " << m_Background.r << ", " << m_Background.g << ", " << m_Background.b << ", " << m_Background.a << endl << "Affine Interp Type: " << m_AffineInterp << "\n"
<< "Minimum DE Radius: " << m_MinRadDE << "\n"
<< "Interp: " << m_Interp << endl << "Maximum DE Radius: " << m_MaxRadDE << "\n"
<< "Affine Interp Type: " << m_AffineInterp << endl << "DE Curve: " << m_CurveDE << "\n"
<< "Spatial Filter Type: " << m_SpatialFilterType << "\n"
<< "Minimum DE Radius: " << m_MinRadDE << endl << "Spatial Filter Radius: " << m_SpatialFilterRadius << "\n"
<< "Maximum DE Radius: " << m_MaxRadDE << endl << "Temporal Filter Type: " << m_TemporalFilterType << "\n"
<< "DE Curve: " << m_CurveDE << endl << "Temporal Filter Exp: " << m_TemporalFilterExp << "\n"
<< "Temporal Filter Width: " << m_TemporalFilterWidth << "\n"
<< "Spatial Filter Type: " << m_SpatialFilterType << endl << "Palette Mode: " << m_PaletteMode << "\n"
<< "Spatial Filter Radius: " << m_SpatialFilterRadius << endl << "Palette Interp: " << m_PaletteInterp << "\n"
<< "Palette Index: " << m_Palette.m_Index << "\n"
<< "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
//Add palette info here if needed. //Add palette info here if needed.
<< "Name: " << m_Name << "\n"
<< "Name: " << m_Name << endl << "Index: " << m_Index << "\n"
<< "Index: " << m_Index << endl << "Scale Type: " << m_ScaleType << "\n"
<< "Scale Type: " << m_ScaleType << endl << "Parent Filename: " << m_ParentFilename << "\n"
<< "Parent Filename: " << m_ParentFilename << endl << "\n";
<< endl;
for (i = 0; i < XformCount(); i++) 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()) if (UseFinalXform())
ss << "Final Xform: " << m_FinalXform.ToString() << endl; ss << "Final Xform: " << m_FinalXform.ToString() << "\n";
return ss.str(); return ss.str();
} }

View File

@ -28,6 +28,7 @@
//Standard headers. //Standard headers.
#include <algorithm> #include <algorithm>
#include <array>
#include <chrono> #include <chrono>
#include <complex> #include <complex>
#include <cstdint> #include <cstdint>
@ -38,9 +39,9 @@
#include <iomanip> #include <iomanip>
#include <limits> #include <limits>
#ifdef __APPLE__ #ifdef __APPLE__
#include <malloc/malloc.h> #include <malloc/malloc.h>
#else #else
#include <malloc.h> #include <malloc.h>
#endif #endif
#include <map> #include <map>
#include <math.h> #include <math.h>
@ -57,9 +58,9 @@
//Third party headers. //Third party headers.
#ifdef _WIN32 #ifdef _WIN32
#include "libxml/parser.h" #include "libxml/parser.h"
#else #else
#include "libxml2/libxml/parser.h" #include "libxml2/libxml/parser.h"
#endif #endif
//Intel's Threading Building Blocks is what's used for all threading. //Intel's Threading Building Blocks is what's used for all threading.
@ -69,7 +70,7 @@
#define GLM_FORCE_RADIANS 1 #define GLM_FORCE_RADIANS 1
#ifndef __APPLE__ #ifndef __APPLE__
#define GLM_FORCE_INLINE 1 #define GLM_FORCE_INLINE 1
#endif #endif
//glm is what's used for matrix math. //glm is what's used for matrix math.

View File

@ -124,7 +124,6 @@ public:
//Original returned false if all were 0, but it's allowed here //Original returned false if all were 0, but it's allowed here
//which will just end up setting all elements to 0 which means //which will just end up setting all elements to 0 which means
//only the first xform will get used. //only the first xform will get used.
//Calculate how much of a fraction of a the total density each element represents. //Calculate how much of a fraction of a the total density each element represents.
size_t j = 0; size_t j = 0;
//These must be double, else roundoff error will prevent the last element of m_XformDistributions from being set. //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) while (tempDensity < currentDensityLimit && j < CHOOSE_XFORM_GRAIN)
{ {
#ifdef _DEBUG #ifdef _DEBUG
//Ensure distribution contains no out of bounds indices. //Ensure distribution contains no out of bounds indices.
if (byte(i) >= ember.XformCount()) if (byte(i) >= ember.XformCount())
throw "Out of bounds xform index in selection distribution."; throw "Out of bounds xform index in selection distribution.";
#endif #endif
//printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity); //printf("offset = %d, xform = %d, running sum = %f\n", j, i, tempDensity);
m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i); m_XformDistributions[(distrib * CHOOSE_XFORM_GRAIN) + j] = byte(i);
@ -159,10 +160,16 @@ public:
} }
#ifdef _DEBUG #ifdef _DEBUG
//Ensure every element of the distribution was populated. //Ensure every element of the distribution was populated.
if (j < CHOOSE_XFORM_GRAIN) if (j < CHOOSE_XFORM_GRAIN)
throw "Not all distribution elements set, undefined behavior."; throw "Not all distribution elements set, undefined behavior.";
#endif #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. //Flam3 did this, which gives the same result.
//T t = xforms[0].m_Weight; //T t = xforms[0].m_Weight;
// //
@ -217,7 +224,6 @@ protected:
firstBadPoint.m_Z = 0; firstBadPoint.m_Z = 0;
firstBadPoint.m_ColorX = point->m_ColorX; firstBadPoint.m_ColorX = point->m_ColorX;
firstBadPoint.m_VizAdjusted = point->m_VizAdjusted; firstBadPoint.m_VizAdjusted = point->m_VizAdjusted;
xformIndex = NextXformFromIndex(rand.Rand()); xformIndex = NextXformFromIndex(rand.Rand());
if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand)) if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand))
@ -250,7 +256,6 @@ protected:
if (IsClose<T>(ember.FinalXform()->m_Opacity, 1) || rand.Frand01<T>() < ember.FinalXform()->m_Opacity) if (IsClose<T>(ember.FinalXform()->m_Opacity, 1) || rand.Frand01<T>() < ember.FinalXform()->m_Opacity)
{ {
T tempVizAdjusted = tempPoint.m_VizAdjusted; T tempVizAdjusted = tempPoint.m_VizAdjusted;
ember.NonConstFinalXform()->Apply(&tempPoint, sample, rand); ember.NonConstFinalXform()->Apply(&tempPoint, sample, rand);
sample->m_VizAdjusted = tempVizAdjusted; sample->m_VizAdjusted = tempVizAdjusted;
} }
@ -282,7 +287,7 @@ protected:
template <typename T> template <typename T>
class EMBER_API StandardIterator : public Iterator<T> class EMBER_API StandardIterator : public Iterator<T>
{ {
ITERATORUSINGS ITERATORUSINGS
public: public:
/// <summary> /// <summary>
/// Empty constructor. /// Empty constructor.
@ -405,7 +410,7 @@ public:
template <typename T> template <typename T>
class EMBER_API XaosIterator : public Iterator<T> class EMBER_API XaosIterator : public Iterator<T>
{ {
ITERATORUSINGS ITERATORUSINGS
public: public:
/// <summary> /// <summary>
/// Empty constructor. /// Empty constructor.
@ -439,7 +444,6 @@ public:
firstBadPoint.m_Z = 0; firstBadPoint.m_Z = 0;
firstBadPoint.m_ColorX = point->m_ColorX; firstBadPoint.m_ColorX = point->m_ColorX;
firstBadPoint.m_VizAdjusted = point->m_VizAdjusted; firstBadPoint.m_VizAdjusted = point->m_VizAdjusted;
xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed); xformIndex = NextXformFromIndex(rand.Rand(), lastXformUsed);
if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand)) if (!xforms[xformIndex].Apply(&firstBadPoint, point, rand))

View File

@ -50,7 +50,7 @@ static inline bool FindIf(c& container, pr pred)
template<class c, class T> template<class c, class T>
static inline bool Contains(c& container, const T& val) 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();
} }
/// <summary> /// <summary>
@ -178,6 +178,67 @@ private:
vector<string> m_ErrorReport; vector<string> m_ErrorReport;
}; };
/// <summary>
/// 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
/// </summary>
template <class T>
class Singleton
{
public:
/// <summary>
/// Create and return an instance of T.
/// </summary>
/// <param name="...args">The args to forward to the constructor of T</param>
/// <returns>A shared_ptr<T></returns>
template <typename... Args>
static shared_ptr<T> Instance(Args... args)
{
static weak_ptr<T> staticInstance;
auto temp = staticInstance.lock();
if (!temp)
{
temp.reset(new T(std::forward<Args>(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<x>; \
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<x>; \
public: \
~x(){} \
\
private: \
x(const x& other) = delete; \
const x& operator=(const x& other) = delete
/// <summary> /// <summary>
/// Open a file in binary mode and read its entire contents into a vector of bytes. Optionally null terminate. /// Open a file in binary mode and read its entire contents into a vector of bytes. Optionally null terminate.
/// </summary> /// </summary>
@ -197,7 +258,6 @@ static bool ReadFile(const char* filename, string& buf, bool nullTerminate = tru
if (f) if (f)
{ {
struct _stat statBuf; struct _stat statBuf;
#if defined(_WIN32) || defined(__APPLE__) #if defined(_WIN32) || defined(__APPLE__)
int statResult = _fstat(f->_file, &statBuf);//Get data associated with file. int statResult = _fstat(f->_file, &statBuf);//Get data associated with file.
#else #else
@ -582,7 +642,7 @@ static inline T SafeTan(T x)
template <> template <>
#ifdef _WIN32 #ifdef _WIN32
static static
#endif #endif
float SafeTan<float>(float x) float SafeTan<float>(float x)
{ {
@ -591,7 +651,7 @@ float SafeTan<float>(float x)
template <> template <>
#ifdef _WIN32 #ifdef _WIN32
static static
#endif #endif
double SafeTan<double>(double x) double SafeTan<double>(double x)
{ {
@ -694,7 +754,6 @@ template <typename T>
static inline T Fabsmod(T v) static inline T Fabsmod(T v)
{ {
T dummy; T dummy;
return modf(v, &dummy); return modf(v, &dummy);
} }
@ -831,7 +890,6 @@ static inline T NormalizeDeg360(T angle)
static string ToLower(const string& str) static string ToLower(const string& str)
{ {
string lower; string lower;
lower.resize(str.size());//Allocate the destination space. 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. 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; return lower;
@ -845,7 +903,6 @@ static string ToLower(const string& str)
static string ToUpper(const string& str) static string ToUpper(const string& str)
{ {
string upper; string upper;
upper.resize(str.size());//Allocate the destination space. 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. 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; return upper;
@ -924,7 +981,6 @@ static inline T Arg(char* name, T def)
{ {
T tempVal; T tempVal;
istringstream istr(ch); istringstream istr(ch);
istr >> tempVal; istr >> tempVal;
if (!istr.bad() && !istr.fail()) if (!istr.bad() && !istr.fail())
@ -947,7 +1003,7 @@ static inline T Arg(char* name, T def)
/// <returns>The value of the specified environment variable if found, else default</returns> /// <returns>The value of the specified environment variable if found, else default</returns>
template <> template <>
#ifdef _WIN32 #ifdef _WIN32
static static
#endif #endif
bool Arg<bool>(char* name, bool def) bool Arg<bool>(char* name, bool def)
{ {
@ -962,7 +1018,7 @@ bool Arg<bool>(char* name, bool def)
/// <returns>The value of the specified environment variable if found, else default</returns> /// <returns>The value of the specified environment variable if found, else default</returns>
template <> template <>
#ifdef _WIN32 #ifdef _WIN32
static static
#endif #endif
string Arg<string>(char* name, string def) string Arg<string>(char* name, string def)
{ {

710
Source/Ember/VarFuncs.h Normal file
View File

@ -0,0 +1,710 @@
#pragma once
#include "Utils.h"
/// <summary>
/// VarFuncs class.
/// </summary>
namespace EmberNs
{
/// <summary>
/// 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.
/// </summary>
template <typename T>
class EMBER_API VarFuncs : public Singleton<VarFuncs<T>>
{
public:
/// <summary>
/// Retrieve information about a piece of shared data by looking
/// up its name.
/// </summary>
/// <param name="name">The name of the shared data to retrieve</param>
/// <returns>A pointer to the beginning of the data and its size in terms of sizeof(T)</returns>
std::pair<const T*, size_t>* GetSharedData(const string& name)
{
const auto& data = m_GlobalMap.find(name);
if (data != m_GlobalMap.end())
return &data->second;
else
return nullptr;
}
/// <summary>
/// The size of the index array.
/// </summary>
/// <returns>size_t</returns>
inline size_t IndexCount() const
{
return m_P.size();
}
/// <summary>
/// Get the index value at the specified index.
/// </summary>
/// <param name="i">The index to retrieve</param>
/// <returns>int</returns>
inline int Index(int i) const
{
return m_P[i];
}
/// <summary>
/// Get a const reference to the 3 component vector at the specified index.
/// </summary>
/// <param name="i">The index to retrieve</param>
/// <returns>v3T&</returns>
inline v3T& Grad(int i)
{
return m_Grad[i];
}
/// <summary>
/// Get the size of the gradient vector.
/// </summary>
/// <returns>size_t</returns>
inline size_t GradCount() const
{
return m_Grad.size();
}
/// <summary>
/// Get a pointer to the floating point index values.
/// </summary>
/// <returns>T*</returns>
inline T* IndexFloats() const
{
return const_cast<T*>(m_PFloats.data());
}
/// <summary>
/// Compute 3D simplex nosie value based on the 3 component vector passed in.
/// </summary>
/// <param name="v">The vector to use to compute the value</param>
/// <returns>T</returns>
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<T>(v.x + skewIn);
intmax_t j = Floor<T>(v.y + skewIn);
intmax_t k = Floor<T>(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<z0
{
if (c[0].x >= 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<y0
{
if (c[0].y < c[0].z)
{
i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;
}
else
{
if (c[0].x < c[0].z)
{
i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;
}
else
{
i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
}
}
}
// A step of 1i in (i,j,k) is a step of (1-T(0.16666), -T(0.16666), -T(0.16666)) in (x,y,z),
// and this is similar for j and k . . .
// Offsets for second corner in (x,y,z) coords
c[1].x = c[0].x - i1 + T(0.16666);
c[1].y = c[0].y - j1 + T(0.16666);
c[1].z = c[0].z - k1 + T(0.16666);
// Offsets for third corner in (x,y,z) coords
c[2].x = c[0].x - i2 + 2 * T(0.16666);
c[2].y = c[0].y - j2 + 2 * T(0.16666);
c[2].z = c[0].z - k2 + 2 * T(0.16666);
// Offsets for last corner in (x,y,z) coords
c[3].x = c[0].x - 1 + 3 * T(0.16666);
c[3].y = c[0].y - 1 + 3 * T(0.16666);
c[3].z = c[0].z - 1 + 3 * T(0.16666);
// Work out the hashed gradient indices of the four simplex corners
int ii = i & 0x3ff;
int jj = j & 0x3ff;
int kk = k & 0x3ff;
gi[0] = m_P[ii + m_P[jj + m_P[kk]]];
gi[1] = m_P[ii + i1 + m_P[jj + j1 + m_P[kk + k1]]];
gi[2] = m_P[ii + i2 + m_P[jj + j2 + m_P[kk + k2]]];
gi[3] = m_P[ii + 1 + m_P[jj + 1 + m_P[kk + 1]]];
// Calculate the contribution from the four corners, and add to total
for (int corner = 0; corner < 4; corner++)
{
t = T(0.6) - c[corner].x * c[corner].x - c[corner].y * c[corner].y - c[corner].z * c[corner].z;
if (t > 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;
}
/// <summary>
/// Compute a perlin noise value based on the values passed in.
/// This will iteratively call SimplexNoise3D().
/// </summary>
/// <param name="v">The vector</param>
/// <param name="aScale">A value to scale a by</param>
/// <param name="fScale">A value to scale f by</param>
/// <param name="octaves">The number of iterations to perform</param>
/// <returns>T</returns>
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;
}
/// <summary>
/// Find the element in p which is closest to u and return
/// the index of that element.
/// </summary>
/// <param name="p">The vector of points to examine</param>
/// <param name="n">The number of points in p to examine</param>
/// <param name="u">The point to compare p gainst</param>
/// <returns>Integer index in p which contained the closest point</returns>
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<T>(p[i].x - u.x) + Sqr<T>(p[i].y - u.y);
if (d2 < d2min)
{
d2min = d2;
j = i;
}
}
return j;
}
/// <summary>
/// Unsure.
/// </summary>
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);
}
/// <summary>
/// Unsure.
/// </summary>
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<T>);
private:
/// <summary>
/// Constructor which initializes data and adds information about them to a global map.
/// </summary>
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<T*>(&(m_Grad[0].x)), SizeOf(m_Grad) / sizeof(T));
}
/// <summary>
/// Initializes integer indices via initializer list.
/// Called once from the constructor.
/// </summary>
/// <returns>A copy of the locally declared vector</returns>
std::vector<int> InitInts()
{
std::vector<int> 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;
}
/// <summary>
/// Initializes the gradient texture.
/// </summary>
/// <returns>A copy of the locally declared vector</returns>
std::vector<v3T> InitGrad()
{
std::vector<v3T> 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<int> m_P;
std::vector<T> m_PFloats;
std::vector<v3T> m_Grad;
std::unordered_map<string, pair<const T*, size_t>> m_GlobalMap;
};
}

View File

@ -2,6 +2,7 @@
#include "Point.h" #include "Point.h"
#include "Isaac.h" #include "Isaac.h"
#include "VarFuncs.h"
/// <summary> /// <summary>
/// Base variation classes. Individual variations will be grouped into files of roughly 50 /// Base variation classes. Individual variations will be grouped into files of roughly 50
@ -101,6 +102,7 @@ enum eVariationId
VAR_COTQ , VAR_COTQ ,
VAR_CPOW , VAR_CPOW ,
VAR_CPOW2 , VAR_CPOW2 ,
VAR_CRACKLE ,
VAR_CRESCENTS , VAR_CRESCENTS ,
VAR_CROB , VAR_CROB ,
VAR_CROP , VAR_CROP ,
@ -409,6 +411,7 @@ enum eVariationId
VAR_PRE_COTQ, VAR_PRE_COTQ,
VAR_PRE_CPOW, VAR_PRE_CPOW,
VAR_PRE_CPOW2, VAR_PRE_CPOW2,
VAR_PRE_CRACKLE,
VAR_PRE_CRESCENTS, VAR_PRE_CRESCENTS,
VAR_PRE_CROB, VAR_PRE_CROB,
VAR_PRE_CROP, VAR_PRE_CROP,
@ -717,6 +720,7 @@ enum eVariationId
VAR_POST_COTQ, VAR_POST_COTQ,
VAR_POST_CPOW, VAR_POST_CPOW,
VAR_POST_CPOW2, VAR_POST_CPOW2,
VAR_POST_CRACKLE,
VAR_POST_CRESCENTS, VAR_POST_CRESCENTS,
VAR_POST_CROB, VAR_POST_CROB,
VAR_POST_CROP, VAR_POST_CROP,
@ -974,6 +978,7 @@ enum eVariationId
VAR_DC_CYLINDER, VAR_DC_CYLINDER,
VAR_DC_GRIDOUT, VAR_DC_GRIDOUT,
VAR_DC_LINEAR, VAR_DC_LINEAR,
VAR_DC_PERLIN,
VAR_DC_TRIANGLE, VAR_DC_TRIANGLE,
VAR_DC_ZTRANSL, VAR_DC_ZTRANSL,
@ -983,6 +988,7 @@ enum eVariationId
VAR_PRE_DC_CYLINDER, VAR_PRE_DC_CYLINDER,
VAR_PRE_DC_GRIDOUT, VAR_PRE_DC_GRIDOUT,
VAR_PRE_DC_LINEAR, VAR_PRE_DC_LINEAR,
VAR_PRE_DC_PERLIN,
VAR_PRE_DC_TRIANGLE, VAR_PRE_DC_TRIANGLE,
VAR_PRE_DC_ZTRANSL, VAR_PRE_DC_ZTRANSL,
@ -992,6 +998,7 @@ enum eVariationId
VAR_POST_DC_CYLINDER, VAR_POST_DC_CYLINDER,
VAR_POST_DC_GRIDOUT, VAR_POST_DC_GRIDOUT,
VAR_POST_DC_LINEAR, VAR_POST_DC_LINEAR,
VAR_POST_DC_PERLIN,
VAR_POST_DC_TRIANGLE, VAR_POST_DC_TRIANGLE,
VAR_POST_DC_ZTRANSL, VAR_POST_DC_ZTRANSL,
@ -1049,7 +1056,7 @@ public:
bool needPrecalcAngles = false, bool needPrecalcAngles = false,
bool needPrecalcAtanXY = false, bool needPrecalcAtanXY = false,
bool needPrecalcAtanYX = false) bool needPrecalcAtanYX = false)
: m_Name(name)//Omit unnecessary default constructor call. : m_Name(name)//Omit unnecessary default constructor call.
{ {
m_Xform = nullptr; m_Xform = nullptr;
m_VariationId = id; m_VariationId = id;
@ -1133,7 +1140,6 @@ public:
m_NeedPrecalcAngles = variation.NeedPrecalcAngles(); m_NeedPrecalcAngles = variation.NeedPrecalcAngles();
m_NeedPrecalcAtanXY = variation.NeedPrecalcAtanXY(); m_NeedPrecalcAtanXY = variation.NeedPrecalcAtanXY();
m_NeedPrecalcAtanYX = variation.NeedPrecalcAtanYX(); m_NeedPrecalcAtanYX = variation.NeedPrecalcAtanYX();
return *this; return *this;
} }
@ -1288,9 +1294,7 @@ public:
virtual string ToString() const virtual string ToString() const
{ {
ostringstream ss; ostringstream ss;
ss << m_Name << "(" << m_Weight << ")"; ss << m_Name << "(" << m_Weight << ")";
return ss.str(); return ss.str();
} }
@ -1346,6 +1350,12 @@ public:
/// <returns>The names for global OpenCL functions specific to this variation</returns> /// <returns>The names for global OpenCL functions specific to this variation</returns>
virtual vector<string> OpenCLGlobalFuncNames() const { return vector<string>(); } virtual vector<string> OpenCLGlobalFuncNames() const { return vector<string>(); }
/// <summary>
/// If the OpenCL string depends on any global static data specific to this variation, and possibly shared among others, return their names.
/// </summary>
/// <returns>The names for global OpenCL data specific to this variation</returns>
virtual vector<string> OpenCLGlobalDataNames() const { return vector<string>(); }
/// <summary> /// <summary>
/// If the OpenCL string depends on any functions specific to this variation, return them. /// If the OpenCL string depends on any functions specific to this variation, return them.
/// </summary> /// </summary>
@ -1462,6 +1472,7 @@ template <typename T> class ParametricVariation;
/// Also, some of them can be considered precalculated values, rather than /// Also, some of them can be considered precalculated values, rather than
/// formal parameters. /// formal parameters.
/// Further, some can change state between iterations. /// Further, some can change state between iterations.
/// The constructors for each case are deliberately different to prevent errors.
/// This class encapsulates a single parameter. /// This class encapsulates a single parameter.
/// Template argument expected to be float or double. /// Template argument expected to be float or double.
/// </summary> /// </summary>
@ -1485,11 +1496,13 @@ public:
/// <param name="isPrecalc">Whether the parameter is actually a precalculated value. Always true.</param> /// <param name="isPrecalc">Whether the parameter is actually a precalculated value. Always true.</param>
/// <param name="param">A pointer to the parameter</param> /// <param name="param">A pointer to the parameter</param>
/// <param name="name">The name of the parameter</param> /// <param name="name">The name of the parameter</param>
/// <param name="size">The length of the underlying memory in bytes. Needed for array types. Default: sizeof(T).</param>
ParamWithName(bool isPrecalc, ParamWithName(bool isPrecalc,
T* param, T* param,
string name) 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);
} }
/// <summary> /// <summary>
@ -1500,9 +1513,9 @@ public:
/// <param name="param">A pointer to the parameter</param> /// <param name="param">A pointer to the parameter</param>
/// <param name="name">The name of the parameter</param> /// <param name="name">The name of the parameter</param>
ParamWithName(bool isPrecalc, ParamWithName(bool isPrecalc,
bool isState, bool isState,
T* param, T* param,
string name) string name)
{ {
Init(param, name, 0, REAL, TLOW, TMAX, true, true); Init(param, name, 0, REAL, TLOW, TMAX, true, true);
} }
@ -1555,6 +1568,7 @@ public:
m_Name = paramWithName.m_Name; m_Name = paramWithName.m_Name;
m_IsPrecalc = paramWithName.m_IsPrecalc; m_IsPrecalc = paramWithName.m_IsPrecalc;
m_IsState = paramWithName.m_IsState; m_IsState = paramWithName.m_IsState;
m_Size = paramWithName.m_Size;
} }
return *this; return *this;
@ -1571,7 +1585,8 @@ public:
/// <param name="max">The maximum value the parameter can be</param> /// <param name="max">The maximum value the parameter can be</param>
/// <param name="isPrecalc">Whether the parameter is actually a precalculated value. Default: false.</param> /// <param name="isPrecalc">Whether the parameter is actually a precalculated value. Default: false.</param>
/// <param name="isState">Whether the parameter changes state between iterations. Default: false.</param> /// <param name="isState">Whether the parameter changes state between iterations. Default: false.</param>
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) /// <param name="size">The length of the underlying memory in bytes. Needed for array types. Default: sizeof(T).</param>
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_Param = param;
m_Def = def; m_Def = def;
@ -1581,7 +1596,7 @@ public:
m_Name = name; m_Name = name;
m_IsPrecalc = isPrecalc; m_IsPrecalc = isPrecalc;
m_IsState = isState; m_IsState = isState;
m_Size = size;
Set(m_Def);//Initial value. Set(m_Def);//Initial value.
} }
@ -1652,17 +1667,16 @@ public:
string ToString() const string ToString() const
{ {
ostringstream ss; ostringstream ss;
ss << "Param Name: " << m_Name << "\n"
ss << "Param Name: " << m_Name << endl << "Param Pointer: " << m_Param << "\n"
<< "Param Pointer: " << m_Param << endl << "Param Value: " << *m_Param << "\n"
<< "Param Value: " << *m_Param << endl << "Param Def: " << m_Def << "\n"
<< "Param Def: " << m_Def << endl << "Param Min: " << m_Min << "\n"
<< "Param Min: " << m_Min << endl << "Param Max: " << m_Max << "\n"
<< "Param Max: " << m_Max << endl << "Param Type: " << m_Type << "\n"
<< "Param Type: " << m_Type << endl << "Is Precalc: " << m_IsPrecalc << "\n"
<< "Is Precalc: " << m_IsPrecalc << endl << "Is State: " << m_IsState << "\n"
<< "Is State: " << m_IsState << endl; << "Size: " << m_Size << "\n";
return ss.str(); return ss.str();
} }
@ -1678,6 +1692,7 @@ public:
string Name() const { return m_Name; } string Name() const { return m_Name; }
bool IsPrecalc() const { return m_IsPrecalc; } bool IsPrecalc() const { return m_IsPrecalc; }
bool IsState() const { return m_IsState; } bool IsState() const { return m_IsState; }
size_t Size() const { return m_Size; }
private: private:
T* m_Param;//Pointer to the parameter value. T* m_Param;//Pointer to the parameter value.
@ -1688,6 +1703,7 @@ private:
string m_Name;//Name of the parameter. string m_Name;//Name of the parameter.
bool m_IsPrecalc;//Whether the parameter is actually a precalculated value. 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. 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 \ #define VARUSINGS \
@ -1729,17 +1745,17 @@ public:
/// <param name="needPrecalcAtanXY">Whether it uses the precalc atan XY value in its calculations. Default: false.</param> /// <param name="needPrecalcAtanXY">Whether it uses the precalc atan XY value in its calculations. Default: false.</param>
/// <param name="needPrecalcAtanYX">Whether it uses the precalc atan YX value in its calculations. Default: false.</param> /// <param name="needPrecalcAtanYX">Whether it uses the precalc atan YX value in its calculations. Default: false.</param>
ParametricVariation(const char* name, eVariationId id, T weight = 1.0, ParametricVariation(const char* name, eVariationId id, T weight = 1.0,
bool needPrecalcSumSquares = false, bool needPrecalcSumSquares = false,
bool needPrecalcSqrtSumSquares = false, bool needPrecalcSqrtSumSquares = false,
bool needPrecalcAngles = false, bool needPrecalcAngles = false,
bool needPrecalcAtanXY = false, bool needPrecalcAtanXY = false,
bool needPrecalcAtanYX = false) bool needPrecalcAtanYX = false)
: Variation<T>(name, id, weight, : Variation<T>(name, id, weight,
needPrecalcSumSquares, needPrecalcSumSquares,
needPrecalcSqrtSumSquares, needPrecalcSqrtSumSquares,
needPrecalcAngles, needPrecalcAngles,
needPrecalcAtanXY, needPrecalcAtanXY,
needPrecalcAtanYX) needPrecalcAtanYX)
{ {
m_Params.reserve(5); m_Params.reserve(5);
} }
@ -1884,7 +1900,9 @@ public:
virtual void Random(QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override virtual void Random(QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) override
{ {
Variation<T>::Random(rand); Variation<T>::Random(rand);
for (auto& param : m_Params) param.Set(rand.Frand11<T>()); for (auto& param : m_Params) param.Set(rand.Frand11<T>());
this->Precalc(); this->Precalc();
} }
@ -1894,6 +1912,7 @@ public:
void Clear() void Clear()
{ {
for (auto& param : m_Params) *(param.Param()) = 0; for (auto& param : m_Params) *(param.Param()) = 0;
this->Precalc(); this->Precalc();
} }
@ -1905,8 +1924,8 @@ public:
vector<string> ParamNames(bool includePrecalcs = false) vector<string> ParamNames(bool includePrecalcs = false)
{ {
vector<string> vec; vector<string> vec;
vec.reserve(m_Params.size()); vec.reserve(m_Params.size());
for (auto& param : m_Params) for (auto& param : m_Params)
{ {
if ((includePrecalcs && param.IsPrecalc()) || !param.IsPrecalc()) if ((includePrecalcs && param.IsPrecalc()) || !param.IsPrecalc())
@ -1947,8 +1966,8 @@ public:
virtual string ToString() const override virtual string ToString() const override
{ {
ostringstream ss; ostringstream ss;
ss << Variation<T>::ToString() << endl; ss << Variation<T>::ToString() << endl;
for (auto& param : m_Params) ss << param.ToString() << endl; for (auto& param : m_Params) ss << param.ToString() << endl;
return ss.str(); return ss.str();
@ -2084,7 +2103,7 @@ protected:
template <typename T> \ template <typename T> \
class EMBER_API Pre##varName##Variation : public varName##Variation<T> \ class EMBER_API Pre##varName##Variation : public varName##Variation<T> \
{ \ { \
VARUSINGS \ VARUSINGS \
public: \ public: \
Pre##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \ Pre##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \ { \
@ -2100,7 +2119,7 @@ protected:
template <typename T> \ template <typename T> \
class EMBER_API Post##varName##Variation : public varName##Variation<T> \ class EMBER_API Post##varName##Variation : public varName##Variation<T> \
{ \ { \
VARUSINGS \ VARUSINGS \
public:\ public:\
Post##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \ Post##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \ { \
@ -2203,9 +2222,9 @@ protected:
template <typename T> \ template <typename T> \
class EMBER_API Pre##varName##Variation : public varName##Variation <T> \ class EMBER_API Pre##varName##Variation : public varName##Variation <T> \
{ \ { \
VARUSINGS \ VARUSINGS \
PARVARUSINGS \ PARVARUSINGS \
using varName##Variation<T>::Init; \ using varName##Variation<T>::Init; \
public:\ public:\
Pre##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \ Pre##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \ { \
@ -2222,9 +2241,9 @@ protected:
template <typename T> \ template <typename T> \
class EMBER_API Post##varName##Variation : public varName##Variation<T> \ class EMBER_API Post##varName##Variation : public varName##Variation<T> \
{ \ { \
VARUSINGS \ VARUSINGS \
PARVARUSINGS \ PARVARUSINGS \
using varName##Variation<T>::Init; \ using varName##Variation<T>::Init; \
public:\ public:\
Post##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \ Post##varName##Variation(T weight = 1.0) : varName##Variation<T>(weight) \
{ \ { \
@ -2237,4 +2256,4 @@ protected:
\ \
PREPOSTPARVARCOPY(Post##varName##Variation, varName##Variation) \ PREPOSTPARVARCOPY(Post##varName##Variation, varName##Variation) \
}; };
} }

View File

@ -341,9 +341,9 @@ public:
ADDPREPOSTREGVAR(Crob) ADDPREPOSTREGVAR(Crob)
ADDPREPOSTREGVAR(BubbleT3D) ADDPREPOSTREGVAR(BubbleT3D)
ADDPREPOSTREGVAR(Synth) ADDPREPOSTREGVAR(Synth)
ADDPREPOSTREGVAR(Crackle)
//ADDPREPOSTREGVAR(LinearXZ) //ADDPREPOSTREGVAR(LinearXZ)
//ADDPREPOSTREGVAR(LinearYZ) //ADDPREPOSTREGVAR(LinearYZ)
//DC are special. //DC are special.
ADDPREPOSTREGVAR(DCBubble) ADDPREPOSTREGVAR(DCBubble)
ADDPREPOSTREGVAR(DCCarpet) ADDPREPOSTREGVAR(DCCarpet)
@ -351,19 +351,22 @@ public:
ADDPREPOSTREGVAR(DCCylinder) ADDPREPOSTREGVAR(DCCylinder)
ADDPREPOSTREGVAR(DCGridOut) ADDPREPOSTREGVAR(DCGridOut)
ADDPREPOSTREGVAR(DCLinear) ADDPREPOSTREGVAR(DCLinear)
ADDPREPOSTREGVAR(DCPerlin)
ADDPREPOSTREGVAR(DCTriangle) ADDPREPOSTREGVAR(DCTriangle)
ADDPREPOSTREGVAR(DCZTransl) ADDPREPOSTREGVAR(DCZTransl)
for (auto var : m_Variations) var->Precalc(); for (auto var : m_Variations) var->Precalc();
std::sort(m_Variations.begin(), m_Variations.end(), [&](const Variation<T>* var1, const Variation<T>* var2) { return var1->VariationId() < var2->VariationId(); });
std::sort(m_Variations.begin(), m_Variations.end(), [&](const Variation<T>* var1, const Variation<T>* var2) { return var1->VariationId() < var2->VariationId(); });
m_RegVariations.reserve(m_Variations.size() / 3); m_RegVariations.reserve(m_Variations.size() / 3);
m_PreVariations.reserve(m_Variations.size() / 3); m_PreVariations.reserve(m_Variations.size() / 3);
m_PostVariations.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. 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_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_PRE) m_PreVariations.push_back(var);
for (auto var : m_Variations) if (var->VarType() == VARTYPE_POST) m_PostVariations.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. //Keep a list of which variations derive from ParametricVariation.
@ -522,7 +525,6 @@ private:
if (var) if (var)
{ {
Variation<T>* var2 = var->Copy(); Variation<T>* var2 = var->Copy();
var2->m_Weight = weight; var2->m_Weight = weight;
return var2; return var2;
} }

View File

@ -38,8 +38,8 @@ public:
static const v2T offset[4] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }; static const v2T offset[4] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } };
int i = 0; int i = 0;
T di, dj; T di, dj;
T XCh, YCh, XCo, YCo, DXo, DYo, L, L1, L2, R, s, trgL, Vx, Vy; T XCh, YCh, XCo, YCo, DXo, DYo, L, L1, L2, R, s, trgL;
v2T U; v2T u, v;
v2T P[7]; v2T P[7];
//For speed/convenience. //For speed/convenience.
s = m_Cellsize; s = m_Cellsize;
@ -49,10 +49,10 @@ public:
return; return;
//Get co-ordinates, and convert to hex co-ordinates. //Get co-ordinates, and convert to hex co-ordinates.
U.x = helper.In.x; u.x = helper.In.x;
U.y = helper.In.y; u.y = helper.In.y;
XCh = T(Floor((AXhXo * U.x + AXhYo * U.y) / s)); XCh = T(Floor((AXhXo * u.x + AXhYo * u.y) / s));
YCh = T(Floor((AYhXo * U.x + AYhYo * 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 // Get a set of 4 hex center points, based around the one above
for (di = XCh; di < XCh + T(1.1); di += 1) 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). //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. //First adjust centers according to which one was found to be closest.
XCh += offset[q].x; XCh += offset[q].x;
@ -90,20 +90,19 @@ public:
P[5].y = YCo - (AYoXh + AYoYh) * s; P[5].y = YCo - (AYoXh + AYoYh) * s;
P[6].x = XCo - AXoXh * s; P[6].x = XCo - AXoXh * s;
P[6].y = YCo - AYoXh * 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. //Delta vector from center of hex.
DXo = U.x - P[0].x; DXo = u.x - P[0].x;
DYo = U.y - P[0].y; DYo = u.y - P[0].y;
//Apply "interesting bit" to cell's DXo and DYo co-ordinates. //Apply "interesting bit" to cell's DXo and DYo co-ordinates.
//trgL is the defined value of l, independent of any rotation. //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. trgL = std::pow(Zeps(L1), m_Power) * m_Scale;//Original added 1e-100, use Zeps to be more precise.
//Rotate. //Rotate.
Vx = DXo * m_RotCos + DYo * m_RotSin; v.x = DXo * m_RotCos + DYo * m_RotSin;
Vy = -DXo * m_RotSin + DYo * m_RotCos; v.y = -DXo * m_RotSin + DYo * m_RotCos;
//Measure voronoi distance again. //Measure voronoi distance again.
U.x = Vx + P[0].x; u = v + P[0];
U.y = Vy + P[0].y; L2 = m_VarFuncs->Voronoi(&P[0], 7, 0, u);
L2 = Voronoi(&P[0], 7, 0, U);
//Scale to meet target size . . . adjust according to how close //Scale to meet target size . . . adjust according to how close
//we are to the edge. //we are to the edge.
//Code here attempts to remove the "rosette" effect caused by //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); R = ((trgL / L1) * (T(0.8) - L) + (trgL / L2) * (L - T(0.5))) / T(0.3);
} }
Vx *= R; v *= R;
Vy *= R;
//Add cell center co-ordinates back in. //Add cell center co-ordinates back in.
Vx += P[0].x; v += P[0];
Vy += P[0].y;
//Finally add values in. //Finally add values in.
helper.Out.x = m_Weight * Vx; helper.Out.x = m_Weight * v.x;
helper.Out.y = m_Weight * Vy; helper.Out.y = m_Weight * v.y;
helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z; helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z;
} }
@ -242,7 +239,7 @@ public:
virtual vector<string> OpenCLGlobalFuncNames() const override virtual vector<string> OpenCLGlobalFuncNames() const override
{ {
return vector<string> { "Zeps" }; return vector<string> { "Zeps", "Sqr", "Vratio", "Closest", "Vratio" };
} }
virtual string OpenCLFuncsString() const override virtual string OpenCLFuncsString() const override
@ -257,60 +254,7 @@ public:
"constant real_t AYoXh = (real_t)(1.7320508075688772935 / 2.0);\n" "constant real_t AYoXh = (real_t)(1.7320508075688772935 / 2.0);\n"
"constant real_t AYoYh = (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" "constant real2 offset[4] = { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } };\n"
"\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"
;
} }
virtual void Precalc() override virtual void Precalc() override
@ -325,72 +269,22 @@ protected:
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Cellsize, prefix + "hexes_cellsize", 1)); m_Params.push_back(ParamWithName<T>(&m_Cellsize, prefix + "hexes_cellsize", 1));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "hexes_power", 1)); m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "hexes_power", 1));
m_Params.push_back(ParamWithName<T>(&m_Rotate, prefix + "hexes_rotate", T(0.166))); m_Params.push_back(ParamWithName<T>(&m_Rotate, prefix + "hexes_rotate", T(0.166)));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "hexes_scale", 1)); m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "hexes_scale", 1));
m_Params.push_back(ParamWithName<T>(true, &m_RotSin, prefix + "hexes_rotsin"));//Precalc. m_Params.push_back(ParamWithName<T>(true, &m_RotSin, prefix + "hexes_rotsin"));//Precalc.
m_Params.push_back(ParamWithName<T>(true, &m_RotCos, prefix + "hexes_rotcos")); m_Params.push_back(ParamWithName<T>(true, &m_RotCos, prefix + "hexes_rotcos"));
m_VarFuncs = VarFuncs<T>::Instance();
} }
private: 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_Cellsize;
T m_Power; T m_Power;
T m_Rotate; T m_Rotate;
T m_Scale; T m_Scale;
T m_RotSin;//Precalc. T m_RotSin;//Precalc.
T m_RotCos; T m_RotCos;
std::shared_ptr<VarFuncs<T>> m_VarFuncs;
}; };
/// <summary> /// <summary>
@ -1916,34 +1810,34 @@ protected:
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Top, prefix + "crob_top", -1)); m_Params.push_back(ParamWithName<T>(&m_Top, prefix + "crob_top", -1));
m_Params.push_back(ParamWithName<T>(&m_Bottom, prefix + "crob_bottom", 1)); m_Params.push_back(ParamWithName<T>(&m_Bottom, prefix + "crob_bottom", 1));
m_Params.push_back(ParamWithName<T>(&m_Left, prefix + "crob_left", -1)); m_Params.push_back(ParamWithName<T>(&m_Left, prefix + "crob_left", -1));
m_Params.push_back(ParamWithName<T>(&m_Right, prefix + "crob_right", 1)); m_Params.push_back(ParamWithName<T>(&m_Right, prefix + "crob_right", 1));
m_Params.push_back(ParamWithName<T>(&m_Blur, prefix + "crob_blur", 1, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_Blur, prefix + "crob_blur", 1, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_RatioBlur, prefix + "crob_ratioBlur", T(0.5), REAL, 0, 1)); m_Params.push_back(ParamWithName<T>(&m_RatioBlur, prefix + "crob_ratioBlur", T(0.5), REAL, 0, 1));
m_Params.push_back(ParamWithName<T>(&m_DirectBlur, prefix + "crob_directBlur", 2)); m_Params.push_back(ParamWithName<T>(&m_DirectBlur, prefix + "crob_directBlur", 2));
m_Params.push_back(ParamWithName<T>(true, &m_XInterval, prefix + "crob_xinterval")); m_Params.push_back(ParamWithName<T>(true, &m_XInterval, prefix + "crob_xinterval"));
m_Params.push_back(ParamWithName<T>(true, &m_YInterval, prefix + "crob_yinterval")); m_Params.push_back(ParamWithName<T>(true, &m_YInterval, prefix + "crob_yinterval"));
m_Params.push_back(ParamWithName<T>(true, &m_XInt2, prefix + "crob_xint2")); m_Params.push_back(ParamWithName<T>(true, &m_XInt2, prefix + "crob_xint2"));
m_Params.push_back(ParamWithName<T>(true, &m_YInt2, prefix + "crob_yint2")); m_Params.push_back(ParamWithName<T>(true, &m_YInt2, prefix + "crob_yint2"));
m_Params.push_back(ParamWithName<T>(true, &m_MinInt2, prefix + "crob_minint2")); m_Params.push_back(ParamWithName<T>(true, &m_MinInt2, prefix + "crob_minint2"));
m_Params.push_back(ParamWithName<T>(true, &m_X0, prefix + "crob_x0")); m_Params.push_back(ParamWithName<T>(true, &m_X0, prefix + "crob_x0"));
m_Params.push_back(ParamWithName<T>(true, &m_Y0, prefix + "crob_y0")); m_Params.push_back(ParamWithName<T>(true, &m_Y0, prefix + "crob_y0"));
m_Params.push_back(ParamWithName<T>(true, &m_X0c, prefix + "crob_x0c")); m_Params.push_back(ParamWithName<T>(true, &m_X0c, prefix + "crob_x0c"));
m_Params.push_back(ParamWithName<T>(true, &m_Y0c, prefix + "crob_y0c")); m_Params.push_back(ParamWithName<T>(true, &m_Y0c, prefix + "crob_y0c"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProb, prefix + "crob_set_prob")); m_Params.push_back(ParamWithName<T>(true, &m_SetProb, prefix + "crob_set_prob"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbH, prefix + "crob_set_prob_h")); m_Params.push_back(ParamWithName<T>(true, &m_SetProbH, prefix + "crob_set_prob_h"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbQ, prefix + "crob_set_prob_q")); m_Params.push_back(ParamWithName<T>(true, &m_SetProbQ, prefix + "crob_set_prob_q"));
m_Params.push_back(ParamWithName<T>(true, &m_SetProbTQ, prefix + "crob_set_prob_tq")); m_Params.push_back(ParamWithName<T>(true, &m_SetProbTQ, prefix + "crob_set_prob_tq"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProb, prefix + "crob_set_comp_prob")); m_Params.push_back(ParamWithName<T>(true, &m_SetCompProb, prefix + "crob_set_comp_prob"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbH, prefix + "crob_set_comp_prob_h")); m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbH, prefix + "crob_set_comp_prob_h"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbQ, prefix + "crob_set_comp_prob_q")); m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbQ, prefix + "crob_set_comp_prob_q"));
m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbTQ, prefix + "crob_set_comp_prob_tq")); m_Params.push_back(ParamWithName<T>(true, &m_SetCompProbTQ, prefix + "crob_set_comp_prob_tq"));
m_Params.push_back(ParamWithName<T>(true, &m_TopBorder, prefix + "crob_top_border")); m_Params.push_back(ParamWithName<T>(true, &m_TopBorder, prefix + "crob_top_border"));
m_Params.push_back(ParamWithName<T>(true, &m_BottomBorder, prefix + "crob_bottom_border")); m_Params.push_back(ParamWithName<T>(true, &m_BottomBorder, prefix + "crob_bottom_border"));
m_Params.push_back(ParamWithName<T>(true, &m_LeftBorder, prefix + "crob_left_border")); m_Params.push_back(ParamWithName<T>(true, &m_LeftBorder, prefix + "crob_left_border"));
m_Params.push_back(ParamWithName<T>(true, &m_RightBorder, prefix + "crob_right_border")); m_Params.push_back(ParamWithName<T>(true, &m_RightBorder, prefix + "crob_right_border"));
} }
private: private:
@ -2210,7 +2104,7 @@ public:
"\t\t{\n" "\t\t{\n"
"\t\t while (angXY > " << angStrip2 << ")\n" "\t\t while (angXY > " << angStrip2 << ")\n"
"\t\t {\n" "\t\t {\n"
"\t\t angXY -= " << angStrip2 << "; \n" "\t\t angXY -= " << angStrip2 << ";\n"
"\t\t }\n" "\t\t }\n"
"\t\t\n" "\t\t\n"
"\t\t if (" << invStripes << " == 0)\n" "\t\t if (" << invStripes << " == 0)\n"
@ -2282,7 +2176,7 @@ public:
"\t\t\n" "\t\t\n"
"\t\tif ((x != 0) || (y != 0))\n" "\t\tif ((x != 0) || (y != 0))\n"
"\t\t{\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\n"
"\t\t if (" << exponentZ << " <= 2)\n" "\t\t if (" << exponentZ << " <= 2)\n"
"\t\t angZ = M_PI - acos((z / (Sqr(x) + Sqr(y) + Sqr(z))));\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 }\n"
"\t\t else\n" "\t\t else\n"
"\t\t {\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 angZ -= M_PI_2;\n"
"\t\t fac = cos(angTmp) / cos(angZ);\n" "\t\t fac = cos(angTmp) / cos(angZ);\n"
"\t\t x = x * fac;\n" "\t\t x = x * fac;\n"
@ -2330,7 +2224,7 @@ public:
"\t\t }\n" "\t\t }\n"
"\t\t else\n" "\t\t else\n"
"\t\t {\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 angZ -= M_PI_2;\n"
"\t\t fac = cos(angTmp) / cos(angZ);\n" "\t\t fac = cos(angTmp) / cos(angZ);\n"
"\t\t x = x * fac;\n" "\t\t x = x * fac;\n"
@ -2354,7 +2248,7 @@ public:
"\t\t {\n" "\t\t {\n"
"\t\t if (angZ > " << angHoleTemp << ")\n" "\t\t if (angZ > " << angHoleTemp << ")\n"
"\t\t {\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 }\n"
"\t\t else\n" "\t\t else\n"
"\t\t {\n" "\t\t {\n"
@ -2903,7 +2797,7 @@ public:
<< "\t\treal_t Vx, Vy, radius, theta;\n" << "\t\treal_t Vx, Vy, radius, theta;\n"
<< "\t\treal_t thetaFactor;\n" << "\t\treal_t thetaFactor;\n"
<< "\t\treal_t s, c, mu;\n" << "\t\treal_t s, c, mu;\n"
<< "\t\tint synthMode = (int)" << synthMode << "; \n" << "\t\tint synthMode = (int)" << synthMode << ";\n"
<< "\t\tSynthStruct synth;\n" << "\t\tSynthStruct synth;\n"
<< "\n" << "\n"
<< "\t\tsynth.SynthA = " << synthA << ";\n" << "\t\tsynth.SynthA = " << synthA << ";\n"
@ -3419,40 +3313,40 @@ protected:
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.reserve(34); m_Params.reserve(34);
m_Params.push_back(ParamWithName<T>(&m_SynthA, prefix + "synth_a")); m_Params.push_back(ParamWithName<T>(&m_SynthA, prefix + "synth_a"));
m_Params.push_back(ParamWithName<T>(&m_SynthMode, prefix + "synth_mode", 3, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthMode, prefix + "synth_mode", 3, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthPower, prefix + "synth_power", -2)); m_Params.push_back(ParamWithName<T>(&m_SynthPower, prefix + "synth_power", -2));
m_Params.push_back(ParamWithName<T>(&m_SynthMix, prefix + "synth_mix")); m_Params.push_back(ParamWithName<T>(&m_SynthMix, prefix + "synth_mix"));
m_Params.push_back(ParamWithName<T>(&m_SynthSmooth, prefix + "synth_smooth", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthSmooth, prefix + "synth_smooth", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthB, prefix + "synth_b")); m_Params.push_back(ParamWithName<T>(&m_SynthB, prefix + "synth_b"));
m_Params.push_back(ParamWithName<T>(&m_SynthBType, prefix + "synth_b_type", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthBType, prefix + "synth_b_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthBSkew, prefix + "synth_b_skew")); m_Params.push_back(ParamWithName<T>(&m_SynthBSkew, prefix + "synth_b_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthBFrq, prefix + "synth_b_frq", 1, REAL)); m_Params.push_back(ParamWithName<T>(&m_SynthBFrq, prefix + "synth_b_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthBPhs, prefix + "synth_b_phs")); m_Params.push_back(ParamWithName<T>(&m_SynthBPhs, prefix + "synth_b_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthBLayer, prefix + "synth_b_layer", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthBLayer, prefix + "synth_b_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthC, prefix + "synth_c")); m_Params.push_back(ParamWithName<T>(&m_SynthC, prefix + "synth_c"));
m_Params.push_back(ParamWithName<T>(&m_SynthCType, prefix + "synth_c_type", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthCType, prefix + "synth_c_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthCSkew, prefix + "synth_c_skew")); m_Params.push_back(ParamWithName<T>(&m_SynthCSkew, prefix + "synth_c_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthCFrq, prefix + "synth_c_frq", 1, REAL)); m_Params.push_back(ParamWithName<T>(&m_SynthCFrq, prefix + "synth_c_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthCPhs, prefix + "synth_c_phs")); m_Params.push_back(ParamWithName<T>(&m_SynthCPhs, prefix + "synth_c_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthCLayer, prefix + "synth_c_layer", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthCLayer, prefix + "synth_c_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthD, prefix + "synth_d")); m_Params.push_back(ParamWithName<T>(&m_SynthD, prefix + "synth_d"));
m_Params.push_back(ParamWithName<T>(&m_SynthDType, prefix + "synth_d_type", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthDType, prefix + "synth_d_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthDSkew, prefix + "synth_d_skew")); m_Params.push_back(ParamWithName<T>(&m_SynthDSkew, prefix + "synth_d_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthDFrq, prefix + "synth_d_frq", 1, REAL)); m_Params.push_back(ParamWithName<T>(&m_SynthDFrq, prefix + "synth_d_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthDPhs, prefix + "synth_d_phs")); m_Params.push_back(ParamWithName<T>(&m_SynthDPhs, prefix + "synth_d_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthDLayer, prefix + "synth_d_layer", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthDLayer, prefix + "synth_d_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthE, prefix + "synth_e")); m_Params.push_back(ParamWithName<T>(&m_SynthE, prefix + "synth_e"));
m_Params.push_back(ParamWithName<T>(&m_SynthEType, prefix + "synth_e_type", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthEType, prefix + "synth_e_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthESkew, prefix + "synth_e_skew")); m_Params.push_back(ParamWithName<T>(&m_SynthESkew, prefix + "synth_e_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthEFrq, prefix + "synth_e_frq", 1, REAL)); m_Params.push_back(ParamWithName<T>(&m_SynthEFrq, prefix + "synth_e_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthEPhs, prefix + "synth_e_phs")); m_Params.push_back(ParamWithName<T>(&m_SynthEPhs, prefix + "synth_e_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthELayer, prefix + "synth_e_layer", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthELayer, prefix + "synth_e_layer", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthF, prefix + "synth_f")); m_Params.push_back(ParamWithName<T>(&m_SynthF, prefix + "synth_f"));
m_Params.push_back(ParamWithName<T>(&m_SynthFType, prefix + "synth_f_type", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthFType, prefix + "synth_f_type", 0, INTEGER));
m_Params.push_back(ParamWithName<T>(&m_SynthFSkew, prefix + "synth_f_skew")); m_Params.push_back(ParamWithName<T>(&m_SynthFSkew, prefix + "synth_f_skew"));
m_Params.push_back(ParamWithName<T>(&m_SynthFFrq, prefix + "synth_f_frq", 1, REAL)); m_Params.push_back(ParamWithName<T>(&m_SynthFFrq, prefix + "synth_f_frq", 1, REAL));
m_Params.push_back(ParamWithName<T>(&m_SynthFPhs, prefix + "synth_f_phs")); m_Params.push_back(ParamWithName<T>(&m_SynthFPhs, prefix + "synth_f_phs"));
m_Params.push_back(ParamWithName<T>(&m_SynthFLayer, prefix + "synth_f_layer", 0, INTEGER)); m_Params.push_back(ParamWithName<T>(&m_SynthFLayer, prefix + "synth_f_layer", 0, INTEGER));
} }
@ -3736,10 +3630,244 @@ private:
T m_SynthFLayer; T m_SynthFLayer;
}; };
#define CACHE_NUM 10
#define CACHE_WIDTH 21
#define VORONOI_MAXPOINTS 10
/// <summary>
/// crackle.
/// </summary>
template <typename T>
class EMBER_API CrackleVariation : public ParametricVariation<T>
{
public:
CrackleVariation(T weight = 1.0) : ParametricVariation<T>("crackle", VAR_CRACKLE, weight)
{
Init();
}
PARVARCOPY(CrackleVariation)
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& 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<T>() + rand.Frand01<T>()) / 2 + (rand.Frand01<T>() - T(0.5)) / 4;
T theta = M_2PI * rand.Frand01<T>();
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<T>(l), m_Power) * m_Scale;
r = trgL / Zeps<T>(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<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps", "Sqr", "Closest", "Vratio", "Voronoi", "SimplexNoise3D" };
}
virtual vector<string> OpenCLGlobalDataNames() const override
{
return vector<string> { "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<T>(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<T>::Instance();
m_Params.clear();
m_Params.reserve(8);
m_Params.push_back(ParamWithName<T>(&m_CellSize, prefix + "crackle_cellsize", 1));
m_Params.push_back(ParamWithName<T>(&m_Power, prefix + "crackle_power", T(0.2)));
m_Params.push_back(ParamWithName<T>(&m_Distort, prefix + "crackle_distort"));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "crackle_scale", 1));
m_Params.push_back(ParamWithName<T>(&m_Z, prefix + "crackle_z"));
m_Params.push_back(ParamWithName<T>(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<VarFuncs<T>> m_VarFuncs;
};
MAKEPREPOSTPARVAR(Hexes, hexes, HEXES) MAKEPREPOSTPARVAR(Hexes, hexes, HEXES)
MAKEPREPOSTPARVAR(Nblur, nBlur, NBLUR) MAKEPREPOSTPARVAR(Nblur, nBlur, NBLUR)
MAKEPREPOSTPARVAR(Octapol, octapol, OCTAPOL) MAKEPREPOSTPARVAR(Octapol, octapol, OCTAPOL)
MAKEPREPOSTPARVAR(Crob, crob, CROB) MAKEPREPOSTPARVAR(Crob, crob, CROB)
MAKEPREPOSTPARVAR(BubbleT3D, bubbleT3D, BUBBLET3D) MAKEPREPOSTPARVAR(BubbleT3D, bubbleT3D, BUBBLET3D)
MAKEPREPOSTPARVAR(Synth, synth, SYNTH) MAKEPREPOSTPARVAR(Synth, synth, SYNTH)
MAKEPREPOSTPARVAR(Crackle, crackle, CRACKLE)
} }

View File

@ -24,11 +24,9 @@ public:
T r = helper.m_PrecalcSumSquares; T r = helper.m_PrecalcSumSquares;
T r4_1 = Zeps(r / 4 + 1); T r4_1 = Zeps(r / 4 + 1);
r4_1 = m_Weight / r4_1; r4_1 = m_Weight / r4_1;
helper.Out.x = r4_1 * helper.In.x; helper.Out.x = r4_1 * helper.In.x;
helper.Out.y = r4_1 * helper.In.y; helper.Out.y = r4_1 * helper.In.y;
helper.Out.z = m_Weight * (2 / r4_1 - 1); helper.Out.z = m_Weight * (2 / r4_1 - 1);
T sumX, sumY; T sumX, sumY;
if (m_VarType == VARTYPE_PRE) if (m_VarType == VARTYPE_PRE)
@ -44,7 +42,6 @@ public:
T tempX = helper.Out.x + sumX; T tempX = helper.Out.x + sumX;
T tempY = helper.Out.y + sumY; T tempY = helper.Out.y + sumY;
outPoint.m_ColorX = fmod(fabs(m_Bdcs * (Sqr<T>(tempX + m_CenterX) + Sqr<T>(tempY + m_CenterY))), T(1.0)); outPoint.m_ColorX = fmod(fabs(m_Bdcs * (Sqr<T>(tempX + m_CenterX) + Sqr<T>(tempY + m_CenterY))), T(1.0));
} }
@ -58,7 +55,6 @@ public:
string centerX = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string centerX = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string centerY = "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. string bdcs = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n" ss << "\t{\n"
<< "\t\treal_t r = precalcSumSquares;\n" << "\t\treal_t r = precalcSumSquares;\n"
<< "\t\treal_t r4_1 = Zeps(r / 4 + 1);\n" << "\t\treal_t r4_1 = Zeps(r / 4 + 1);\n"
@ -73,23 +69,22 @@ public:
if (m_VarType == VARTYPE_PRE) if (m_VarType == VARTYPE_PRE)
{ {
ss ss
<< "\t\tsumX = vIn.x;\n" << "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n"; << "\t\tsumY = vIn.y;\n";
} }
else else
{ {
ss ss
<< "\t\tsumX = outPoint->m_X;\n" << "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n"; << "\t\tsumY = outPoint->m_Y;\n";
} }
ss ss
<< "\t\treal_t tempX = vOut.x + sumX;\n" << "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n" << "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\n" << "\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs(" << bdcs << " * (Sqr(tempX + " << centerX << ") + Sqr(tempY + " << centerY << "))), (real_t)(1.0));\n" << "\t\toutPoint->m_ColorX = fmod(fabs(" << bdcs << " * (Sqr(tempX + " << centerX << ") + Sqr(tempY + " << centerY << "))), (real_t)(1.0));\n"
<< "\t}\n"; << "\t}\n";
return ss.str(); return ss.str();
} }
@ -107,7 +102,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_CenterX, prefix + "dc_bubble_centerx"));//Params. m_Params.push_back(ParamWithName<T>(&m_CenterX, prefix + "dc_bubble_centerx"));//Params.
m_Params.push_back(ParamWithName<T>(&m_CenterY, prefix + "dc_bubble_centery")); m_Params.push_back(ParamWithName<T>(&m_CenterY, prefix + "dc_bubble_centery"));
@ -144,7 +138,6 @@ public:
T y = helper.In.y + y0; T y = helper.In.y + y0;
T x0_xor_y0 = T(x0 ^ y0); T x0_xor_y0 = T(x0 ^ y0);
T h = -m_H + (1 - x0_xor_y0) * m_H; 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.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.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; helper.Out.z = (m_VarType == VARTYPE_REG) ? 0 : helper.In.z;
@ -159,7 +152,6 @@ public:
string index = ss2.str(); string index = ss2.str();
string origin = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params. string origin = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params.
string h = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc. string h = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n" ss << "\t{\n"
<< "\t\tint x0 = (MwcNext(mwc) & 1) ? -1 : 1;\n" << "\t\tint x0 = (MwcNext(mwc) & 1) ? -1 : 1;\n"
<< "\t\tint y0 = (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\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\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"; << "\t}\n";
return ss.str(); return ss.str();
} }
@ -186,7 +177,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Origin, prefix + "dc_carpet_origin"));//Params. m_Params.push_back(ParamWithName<T>(&m_Origin, prefix + "dc_carpet_origin"));//Params.
m_Params.push_back(ParamWithName<T>(true, &m_H, prefix + "dc_carpet_h"));//Precalc. m_Params.push_back(ParamWithName<T>(true, &m_H, prefix + "dc_carpet_h"));//Precalc.
@ -232,6 +222,7 @@ public:
outPoint.m_ColorX = m_ClampC2; outPoint.m_ColorX = m_ClampC2;
break; break;
case 1: case 1:
x = m_Weight * p; x = m_Weight * p;
y = m_Weight * (j ? -1 : 1); y = m_Weight * (j ? -1 : 1);
@ -243,6 +234,7 @@ public:
outPoint.m_ColorX = m_ClampC4; outPoint.m_ColorX = m_ClampC4;
break; break;
case 2: case 2:
default: default:
x = m_Weight * p; x = m_Weight * p;
@ -283,7 +275,6 @@ public:
string clampC4 = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string clampC4 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string clampC5 = "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; string clampC6 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n" ss << "\t{\n"
<< "\t\treal_t x, y, z;\n" << "\t\treal_t x, y, z;\n"
<< "\t\treal_t p = 2 * MwcNext01(mwc) - 1;\n" << "\t\treal_t p = 2 * MwcNext01(mwc) - 1;\n"
@ -332,7 +323,6 @@ public:
<< "\t\tvOut.y = y * " << cubeY << ";\n" << "\t\tvOut.y = y * " << cubeY << ";\n"
<< "\t\tvOut.z = z * " << cubeZ << ";\n" << "\t\tvOut.z = z * " << cubeZ << ";\n"
<< "\t}\n"; << "\t}\n";
return ss.str(); return ss.str();
} }
@ -350,7 +340,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_DcCubeC1, prefix + "dc_cube_c1"));//Params. m_Params.push_back(ParamWithName<T>(&m_DcCubeC1, prefix + "dc_cube_c1"));//Params.
m_Params.push_back(ParamWithName<T>(&m_DcCubeC2, prefix + "dc_cube_c2")); m_Params.push_back(ParamWithName<T>(&m_DcCubeC2, prefix + "dc_cube_c2"));
@ -408,11 +397,9 @@ public:
T sr = std::sin(temp); T sr = std::sin(temp);
T cr = std::cos(temp); T cr = std::cos(temp);
T r = m_Blur * (rand.Frand01<T>() + rand.Frand01<T>() + rand.Frand01<T>() + rand.Frand01<T>() - 2); T r = m_Blur * (rand.Frand01<T>() + rand.Frand01<T>() + rand.Frand01<T>() + rand.Frand01<T>() - 2);
helper.Out.x = m_Weight * std::sin(helper.In.x + r * sr) * m_X; 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.y = r + helper.In.y * m_Y;
helper.Out.z = m_Weight * std::cos(helper.In.x + r * cr); helper.Out.z = m_Weight * std::cos(helper.In.x + r * cr);
T sumX, sumY; T sumX, sumY;
if (m_VarType == VARTYPE_PRE) if (m_VarType == VARTYPE_PRE)
@ -428,7 +415,6 @@ public:
T tempX = helper.Out.x + sumX; T tempX = helper.Out.x + sumX;
T tempY = helper.Out.y + sumY; 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)); 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 cosa = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string ldcs = "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; string ldca = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n" ss << "\t{\n"
<< "\t\treal_t temp = MwcNext(mwc) * M_2PI;\n" << "\t\treal_t temp = MwcNext(mwc) * M_2PI;\n"
<< "\t\treal_t sr = sin(temp);\n" << "\t\treal_t sr = sin(temp);\n"
@ -463,23 +448,22 @@ public:
if (m_VarType == VARTYPE_PRE) if (m_VarType == VARTYPE_PRE)
{ {
ss ss
<< "\t\tsumX = vIn.x;\n" << "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n"; << "\t\tsumY = vIn.y;\n";
} }
else else
{ {
ss ss
<< "\t\tsumX = outPoint->m_X;\n" << "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n"; << "\t\tsumY = outPoint->m_Y;\n";
} }
ss ss
<< "\t\treal_t tempX = vOut.x + sumX;\n" << "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n" << "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\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\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}\n";
return ss.str(); return ss.str();
} }
@ -494,7 +478,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Offset, prefix + "dc_cylinder_offset"));//Params. m_Params.push_back(ParamWithName<T>(&m_Offset, prefix + "dc_cylinder_offset"));//Params.
m_Params.push_back(ParamWithName<T>(&m_Angle, prefix + "dc_cylinder_angle"));//Original used a prefix of dc_cyl_, which is incompatible with Ember's design. m_Params.push_back(ParamWithName<T>(&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; ostringstream ss;
intmax_t varIndex = IndexInXform(); intmax_t varIndex = IndexInXform();
ss << "\t{\n" ss << "\t{\n"
<< "\t\treal_t x = LRint(vIn.x);\n" << "\t\treal_t x = LRint(vIn.x);\n"
<< "\t\treal_t y = LRint(vIn.y);\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\tvOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n"
<< "\t\toutPoint->m_ColorX = fmod(c, (real_t)(1.0));\n" << "\t\toutPoint->m_ColorX = fmod(c, (real_t)(1.0));\n"
<< "\t}\n"; << "\t}\n";
return ss.str(); return ss.str();
} }
@ -719,7 +700,6 @@ public:
helper.Out.x = m_Weight * helper.In.x; helper.Out.x = m_Weight * helper.In.x;
helper.Out.y = m_Weight * helper.In.y; helper.Out.y = m_Weight * helper.In.y;
helper.Out.z = m_Weight * helper.In.z; helper.Out.z = m_Weight * helper.In.z;
T sumX, sumY; T sumX, sumY;
if (m_VarType == VARTYPE_PRE) if (m_VarType == VARTYPE_PRE)
@ -735,7 +715,6 @@ public:
T tempX = helper.Out.x + sumX; T tempX = helper.Out.x + sumX;
T tempY = helper.Out.y + sumY; 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)); 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 ldca = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string sina = "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; string cosa = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n" ss << "\t{\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * vIn.x;\n" << "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * vIn.x;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vIn.y;\n" << "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vIn.y;\n"
@ -763,23 +741,22 @@ public:
if (m_VarType == VARTYPE_PRE) if (m_VarType == VARTYPE_PRE)
{ {
ss ss
<< "\t\tsumX = vIn.x;\n" << "\t\tsumX = vIn.x;\n"
<< "\t\tsumY = vIn.y;\n"; << "\t\tsumY = vIn.y;\n";
} }
else else
{ {
ss ss
<< "\t\tsumX = outPoint->m_X;\n" << "\t\tsumX = outPoint->m_X;\n"
<< "\t\tsumY = outPoint->m_Y;\n"; << "\t\tsumY = outPoint->m_Y;\n";
} }
ss ss
<< "\t\treal_t tempX = vOut.x + sumX;\n" << "\t\treal_t tempX = vOut.x + sumX;\n"
<< "\t\treal_t tempY = vOut.y + sumY;\n" << "\t\treal_t tempY = vOut.y + sumY;\n"
<< "\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\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}\n";
return ss.str(); return ss.str();
} }
@ -794,7 +771,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_Offset, prefix + "dc_linear_offset"));//Params. m_Params.push_back(ParamWithName<T>(&m_Offset, prefix + "dc_linear_offset"));//Params.
m_Params.push_back(ParamWithName<T>(&m_Angle, prefix + "dc_linear_angle")); m_Params.push_back(ParamWithName<T>(&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 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 ox = m_Xform->m_Affine.E(), oy = m_Xform->m_Affine.F(), // O
px = helper.In.x - ox, py = helper.In.y - oy; // P px = helper.In.x - ox, py = helper.In.y - oy; // P
// calculate dot products // calculate dot products
const T dot00 = xx * xx + xy * xy; // X * X const T dot00 = xx * xx + xy * xy; // X * X
const T dot01 = xx * yx + xy * yy; // X * Y const T dot01 = xx * yx + xy * yy; // X * Y
const T dot02 = xx * px + xy * py; // X * P const T dot02 = xx * px + xy * py; // X * P
const T dot11 = yx * yx + yy * yy; // Y * Y const T dot11 = yx * yx + yy * yy; // Y * Y
const T dot12 = yx * px + yy * py; // Y * P const T dot12 = yx * px + yy * py; // Y * P
// calculate barycentric coordinates // calculate barycentric coordinates
const T denom = (dot00 * dot11 - dot01 * dot01); const T denom = (dot00 * dot11 - dot01 * dot01);
const T num_u = (dot11 * dot02 - dot01 * dot12); const T num_u = (dot11 * dot02 - dot01 * dot12);
const T num_v = (dot00 * dot12 - dot01 * dot02); const T num_v = (dot00 * dot12 - dot01 * dot02);
// u, v must not be constant // u, v must not be constant
T u = num_u / denom; T u = num_u / denom;
T v = num_v / denom; T v = num_v / denom;
@ -890,7 +863,6 @@ public:
{ {
u = (u + rand.Frand01<T>() * m_A * f); u = (u + rand.Frand01<T>() * m_A * f);
v = (v + rand.Frand01<T>() * m_A * f); v = (v + rand.Frand01<T>() * m_A * f);
ClampRef<T>(u, -1, 1); ClampRef<T>(u, -1, 1);
ClampRef<T>(v, -1, 1); ClampRef<T>(v, -1, 1);
@ -925,7 +897,6 @@ public:
string scatterArea = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params. string scatterArea = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Params.
string zeroEdges = "parVars[" + ToUpper(m_Params[i++].Name()) + index; string zeroEdges = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string a = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc. string a = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n" ss << "\t{\n"
<< "\t\tconst real_t\n" << "\t\tconst real_t\n"
<< "\t\txx = xform->m_A, xy = xform->m_B,\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\tvOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n"
<< "\t\toutPoint->m_ColorX = fmod(fabs(u + v), (real_t)(1.0));\n" << "\t\toutPoint->m_ColorX = fmod(fabs(u + v), (real_t)(1.0));\n"
<< "\t}\n"; << "\t}\n";
return ss.str(); return ss.str();
} }
@ -1016,7 +986,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_ScatterArea, prefix + "dc_triangle_scatter_area", 0, REAL, -1, 1));//Params. m_Params.push_back(ParamWithName<T>(&m_ScatterArea, prefix + "dc_triangle_scatter_area", 0, REAL, -1, 1));//Params.
m_Params.push_back(ParamWithName<T>(&m_ZeroEdges, prefix + "dc_triangle_zero_edges", 0, INTEGER, 0, 1)); m_Params.push_back(ParamWithName<T>(&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 x0_ = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string x1_ = "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; string x1_m_x0 = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n" ss << "\t{\n"
<< "\t\treal_t zf = " << factor << " * (outPoint->m_ColorX - " << x0_ << ") / " << x1_m_x0 << ";\n" << "\t\treal_t zf = " << factor << " * (outPoint->m_ColorX - " << x0_ << ") / " << x1_m_x0 << ";\n"
<< "\n" << "\n"
@ -1090,7 +1058,6 @@ public:
<< "\t\telse\n" << "\t\telse\n"
<< "\t\t vOut.z = xform->m_VariationWeights[" << varIndex << "] * zf;\n" << "\t\t vOut.z = xform->m_VariationWeights[" << varIndex << "] * zf;\n"
<< "\t}\n"; << "\t}\n";
return ss.str(); return ss.str();
} }
@ -1105,7 +1072,6 @@ protected:
void Init() void Init()
{ {
string prefix = Prefix(); string prefix = Prefix();
m_Params.clear(); m_Params.clear();
m_Params.push_back(ParamWithName<T>(&m_X0, prefix + "dc_ztransl_x0", 0, REAL, 0, 1));//Params. m_Params.push_back(ParamWithName<T>(&m_X0, prefix + "dc_ztransl_x0", 0, REAL, 0, 1));//Params.
m_Params.push_back(ParamWithName<T>(&m_X1, prefix + "dc_ztransl_x1", 1, REAL, 0, 1)); m_Params.push_back(ParamWithName<T>(&m_X1, prefix + "dc_ztransl_x1", 1, REAL, 0, 1));
@ -1128,6 +1094,363 @@ private:
T m_X1_m_x0; 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
/// <summary>
/// dc_perlin.
/// </summary>
template <typename T>
class EMBER_API DCPerlinVariation : public ParametricVariation <T>
{
public:
DCPerlinVariation(T weight = 1.0) : ParametricVariation<T>("dc_perlin", VAR_DC_PERLIN, weight)
{
Init();
}
PARVARCOPY(DCPerlinVariation)
virtual void Func(IteratorHelper<T>& helper, Point<T>& outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& 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>() - T(0.5));
vy = (1 + m_Edge) * (rand.Frand01<T>() - 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<T>() + rand.Frand01<T>();
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<T>() * 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<T>();
if (r > 1 - m_Edge)
e = T(0.5) * (r - 1 + m_Edge) / m_Edge;
theta = rand.Frand01<T>() * 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<T>(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<T>(col);
}
virtual vector<string> OpenCLGlobalFuncNames() const override
{
return vector<string> { "Zeps", "SimplexNoise3D", "PerlinNoise3D" };
}
virtual vector<string> OpenCLGlobalDataNames() const override
{
return vector<string> { "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<T>::Instance();
m_Params.clear();
m_Params.reserve(15);
m_Params.push_back(ParamWithName<T>(&m_Shape, prefix + "dc_perlin_shape", 0, INTEGER, 0, 2));//Params.
m_Params.push_back(ParamWithName<T>(&m_Map, prefix + "dc_perlin_map", 0, INTEGER, 0, 5));
m_Params.push_back(ParamWithName<T>(&m_SelectCentre, prefix + "dc_perlin_select_centre", 0, REAL, -1, 1));
m_Params.push_back(ParamWithName<T>(&m_SelectRange, prefix + "dc_perlin_select_range", 1, REAL, T(0.1), 2));
m_Params.push_back(ParamWithName<T>(&m_Centre, prefix + "dc_perlin_centre", T(0.25)));
m_Params.push_back(ParamWithName<T>(&m_Range, prefix + "dc_perlin_range", T(0.25)));
m_Params.push_back(ParamWithName<T>(&m_Edge, prefix + "dc_perlin_edge"));
m_Params.push_back(ParamWithName<T>(&m_Scale, prefix + "dc_perlin_scale", 1));
m_Params.push_back(ParamWithName<T>(&m_Octaves, prefix + "dc_perlin_octaves", 2, INTEGER, 1, 5));
m_Params.push_back(ParamWithName<T>(&m_Amps, prefix + "dc_perlin_amps", 2));
m_Params.push_back(ParamWithName<T>(&m_Freqs, prefix + "dc_perlin_freqs", 2));
m_Params.push_back(ParamWithName<T>(&m_Z, prefix + "dc_perlin_z"));
m_Params.push_back(ParamWithName<T>(&m_SelectBailout, prefix + "dc_perlin_select_bailout", 10, INTEGER, 2, 1000));
m_Params.push_back(ParamWithName<T>(true, &m_NotchBottom, prefix + "dc_perlin_notch_bottom"));
m_Params.push_back(ParamWithName<T>(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<VarFuncs<T>> m_VarFuncs;
};
MAKEPREPOSTPARVAR(DCBubble, dc_bubble, DC_BUBBLE) MAKEPREPOSTPARVAR(DCBubble, dc_bubble, DC_BUBBLE)
MAKEPREPOSTPARVAR(DCCarpet, dc_carpet, DC_CARPET) MAKEPREPOSTPARVAR(DCCarpet, dc_carpet, DC_CARPET)
MAKEPREPOSTPARVARASSIGN(DCCube, dc_cube, DC_CUBE, ASSIGNTYPE_SUM) 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(DCLinear, dc_linear, DC_LINEAR)
MAKEPREPOSTPARVAR(DCTriangle, dc_triangle, DC_TRIANGLE) MAKEPREPOSTPARVAR(DCTriangle, dc_triangle, DC_TRIANGLE)
MAKEPREPOSTPARVAR(DCZTransl, dc_ztransl, DC_ZTRANSL) MAKEPREPOSTPARVAR(DCZTransl, dc_ztransl, DC_ZTRANSL)
MAKEPREPOSTPARVAR(DCPerlin, dc_perlin, DC_PERLIN)
} }

View File

@ -72,19 +72,16 @@ public:
{ {
Init(); Init();
m_Weight = weight; m_Weight = weight;
m_ColorX = colorX; m_ColorX = colorX;
m_ColorSpeed = colorSpeed; m_ColorSpeed = colorSpeed;
m_Opacity = opacity; m_Opacity = opacity;
m_Affine.A(a); m_Affine.A(a);
m_Affine.B(b); m_Affine.B(b);
m_Affine.C(c); m_Affine.C(c);
m_Affine.D(d); m_Affine.D(d);
m_Affine.E(e); m_Affine.E(e);
m_Affine.F(f); m_Affine.F(f);
m_Post.A(pa); m_Post.A(pa);
m_Post.B(pb); m_Post.B(pb);
m_Post.C(pc); m_Post.C(pc);
@ -93,7 +90,6 @@ public:
m_Post.F(pf); m_Post.F(pf);
m_HasPost = !m_Post.IsID(); m_HasPost = !m_Post.IsID();
m_HasPreOrRegularVars = PreVariationCount() > 0 || VariationCount() > 0; m_HasPreOrRegularVars = PreVariationCount() > 0 || VariationCount() > 0;
CacheColorVals();//Init already called this, but must call again since color was assigned above. 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_MotionFreq = xform.m_MotionFreq;
m_MotionFunc = xform.m_MotionFunc; m_MotionFunc = xform.m_MotionFunc;
m_MotionOffset = xform.m_MotionOffset; m_MotionOffset = xform.m_MotionOffset;
ClearAndDeleteVariations(); ClearAndDeleteVariations();
//Must manually add them via the AddVariation() function so that //Must manually add them via the AddVariation() function so that
@ -192,15 +187,14 @@ public:
CopyVec<T, U>(m_Xaos, xform.XaosVec()); CopyVec<T, U>(m_Xaos, xform.XaosVec());
CopyVec(m_Motion, xform.m_Motion); CopyVec(m_Motion, xform.m_Motion);
m_Name = xform.m_Name; m_Name = xform.m_Name;
return *this; return *this;
} }
/// <summary> /// <summary>
/// Init default values. /// 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 /// 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. /// it is clear which fields are intended to have motion applied to them.
/// </summary> /// </summary>
/// <param name="useDefaults">Use reasonable default if true, else use out of bounds values.</param> /// <param name="useDefaults">Use reasonable default if true, else use out of bounds values.</param>
@ -217,21 +211,18 @@ public:
m_ColorY = 0; m_ColorY = 0;
m_DirectColor = 1; m_DirectColor = 1;
m_Opacity = 1; m_Opacity = 1;
m_Affine.A(1); m_Affine.A(1);
m_Affine.B(0); m_Affine.B(0);
m_Affine.C(0); m_Affine.C(0);
m_Affine.D(0); m_Affine.D(0);
m_Affine.E(1); m_Affine.E(1);
m_Affine.F(0); m_Affine.F(0);
m_Post.A(1); m_Post.A(1);
m_Post.B(0); m_Post.B(0);
m_Post.C(0); m_Post.C(0);
m_Post.D(0); m_Post.D(0);
m_Post.E(1); m_Post.E(1);
m_Post.F(0); m_Post.F(0);
m_Wind[0] = 0; m_Wind[0] = 0;
m_Wind[1] = 0; m_Wind[1] = 0;
m_MotionFreq = 0; m_MotionFreq = 0;
@ -246,21 +237,18 @@ public:
m_ColorY = EMPTYFIELD; m_ColorY = EMPTYFIELD;
m_DirectColor = EMPTYFIELD; m_DirectColor = EMPTYFIELD;
m_Opacity = EMPTYFIELD; m_Opacity = EMPTYFIELD;
m_Affine.A(EMPTYFIELD); m_Affine.A(EMPTYFIELD);
m_Affine.B(EMPTYFIELD); m_Affine.B(EMPTYFIELD);
m_Affine.C(EMPTYFIELD); m_Affine.C(EMPTYFIELD);
m_Affine.D(EMPTYFIELD); m_Affine.D(EMPTYFIELD);
m_Affine.E(EMPTYFIELD); m_Affine.E(EMPTYFIELD);
m_Affine.F(EMPTYFIELD); m_Affine.F(EMPTYFIELD);
m_Post.A(EMPTYFIELD); m_Post.A(EMPTYFIELD);
m_Post.B(EMPTYFIELD); m_Post.B(EMPTYFIELD);
m_Post.C(EMPTYFIELD); m_Post.C(EMPTYFIELD);
m_Post.D(EMPTYFIELD); m_Post.D(EMPTYFIELD);
m_Post.E(EMPTYFIELD); m_Post.E(EMPTYFIELD);
m_Post.F(EMPTYFIELD); m_Post.F(EMPTYFIELD);
m_Wind[0] = EMPTYFIELD; m_Wind[0] = EMPTYFIELD;
m_Wind[1] = EMPTYFIELD; m_Wind[1] = EMPTYFIELD;
m_MotionFreq = EMPTYFIELD; m_MotionFreq = EMPTYFIELD;
@ -269,7 +257,6 @@ public:
m_MotionFunc = MOTION_SIN; m_MotionFunc = MOTION_SIN;
m_Motion.clear(); m_Motion.clear();
m_NeedPrecalcSumSquares = false; m_NeedPrecalcSumSquares = false;
m_NeedPrecalcSqrtSumSquares = false; m_NeedPrecalcSqrtSumSquares = false;
m_NeedPrecalcAngles = false; m_NeedPrecalcAngles = false;
@ -340,8 +327,7 @@ public:
{ {
size_t count = 0; size_t count = 0;
Variation<T>* var = nullptr; Variation<T>* var = nullptr;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
{ {
for (size_t i = 0; i < variations.size(); i++, count++) for (size_t i = 0; i < variations.size(); i++, count++)
{ {
@ -353,7 +339,6 @@ public:
} }
} }
}); });
return var; return var;
} }
@ -365,8 +350,7 @@ public:
Variation<T>* GetVariationById(eVariationId id) const Variation<T>* GetVariationById(eVariationId id) const
{ {
Variation<T>* var = nullptr; Variation<T>* var = nullptr;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
{ {
for (auto v : variations) for (auto v : variations)
{ {
@ -378,7 +362,6 @@ public:
} }
} }
}); });
return var; return var;
} }
@ -390,8 +373,7 @@ public:
Variation<T>* GetVariationByName(const string& name) const Variation<T>* GetVariationByName(const string& name) const
{ {
Variation<T>* var = nullptr; Variation<T>* var = nullptr;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
{ {
for (auto v : variations) for (auto v : variations)
{ {
@ -403,7 +385,6 @@ public:
} }
} }
}); });
return var; return var;
} }
@ -416,8 +397,7 @@ public:
intmax_t GetVariationIndex(Variation<T>* var) const intmax_t GetVariationIndex(Variation<T>* var) const
{ {
intmax_t count = 0, index = -1; intmax_t count = 0, index = -1;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
{ {
for (size_t i = 0; i < variations.size(); i++, count++) for (size_t i = 0; i < variations.size(); i++, count++)
{ {
@ -429,7 +409,6 @@ public:
} }
} }
}); });
return index; return index;
} }
@ -442,8 +421,7 @@ public:
bool DeleteVariationById(eVariationId id) bool DeleteVariationById(eVariationId id)
{ {
bool found = false; bool found = false;
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
{ {
for (size_t i = 0; i < variations.size(); i++) for (size_t i = 0; i < variations.size(); i++)
{ {
@ -475,7 +453,7 @@ public:
/// </summary> /// </summary>
void ClearAndDeleteVariations() void ClearAndDeleteVariations()
{ {
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing) { ClearVec<Variation<T>>(variations); }); AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing) { ClearVec<Variation<T>>(variations); });
SetPrecalcFlags(); SetPrecalcFlags();
} }
@ -511,7 +489,6 @@ public:
//Figure out which is right. //TODO. //Figure out which is right. //TODO.
//m_ColorSpeedCache = m_ColorX * (1 - m_ColorSpeed) / 2;//Apo style. //m_ColorSpeedCache = m_ColorX * (1 - m_ColorSpeed) / 2;//Apo style.
//m_OneMinusColorCache = (1 + m_ColorSpeed) / 2; //m_OneMinusColorCache = (1 + m_ColorSpeed) / 2;
m_ColorSpeedCache = m_ColorSpeed * m_ColorX;//Flam3 style. m_ColorSpeedCache = m_ColorSpeed * m_ColorX;//Flam3 style.
m_OneMinusColorCache = T(1.0) - m_ColorSpeed; m_OneMinusColorCache = T(1.0) - m_ColorSpeed;
m_VizAdjusted = AdjustOpacityPercentage(m_Opacity); m_VizAdjusted = AdjustOpacityPercentage(m_Opacity);
@ -592,11 +569,12 @@ public:
/// </summary> /// </summary>
void NormalizeVariationWeights() void NormalizeVariationWeights()
{ {
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing) AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{ {
T norm = 0; T norm = 0;
for (auto var : variations) norm += var->m_Weight; for (auto var : variations) norm += var->m_Weight;
for (auto var : variations) var->m_Weight /= norm; for (auto var : variations) var->m_Weight /= norm;
}); });
} }
@ -613,11 +591,9 @@ public:
bool Apply(Point<T>* inPoint, Point<T>* outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand) bool Apply(Point<T>* inPoint, Point<T>* outPoint, QTIsaac<ISAAC_SIZE, ISAAC_INT>& rand)
{ {
size_t i; size_t i;
//This must be local, rather than a member, because this function can be called //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. //from multiple threads. If it were a member, they'd be clobbering each others' values.
IteratorHelper<T> iterHelper; IteratorHelper<T> iterHelper;
//Calculate the color coordinate/index in the palette to look up later when accumulating the output point //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 //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 //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.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.y = iterHelper.m_TransY;
iterHelper.In.z = iterHelper.m_TransZ; iterHelper.In.z = iterHelper.m_TransZ;
//Since these get summed, initialize them to zero. //Since these get summed, initialize them to zero.
outPoint->m_X = outPoint->m_Y = outPoint->m_Z = 0; 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. //There are no variations, so the affine transformed points can be assigned directly to the output points.
T inX = inPoint->m_X; T inX = inPoint->m_X;
outPoint->m_X = (m_Affine.A() * inX) + (m_Affine.B() * inPoint->m_Y) + m_Affine.C(); 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_Y = (m_Affine.D() * inX) + (m_Affine.E() * inPoint->m_Y) + m_Affine.F();
outPoint->m_Z = inPoint->m_Z; outPoint->m_Z = inPoint->m_Z;
@ -703,13 +677,11 @@ public:
if (m_HasPost) if (m_HasPost)
{ {
T postX = outPoint->m_X; T postX = outPoint->m_X;
outPoint->m_X = (m_Post.A() * postX) + (m_Post.B() * outPoint->m_Y) + m_Post.C(); 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_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? //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)*/; return BadVal(outPoint->m_X) || BadVal(outPoint->m_Y)/* || BadVal(outPoint->m_Z)*/;
} }
@ -737,7 +709,6 @@ public:
T freq = currentMot.m_MotionFreq; T freq = currentMot.m_MotionFreq;
eMotion func = currentMot.m_MotionFunc; eMotion func = currentMot.m_MotionFunc;
T offset = currentMot.m_MotionOffset; T offset = currentMot.m_MotionOffset;
//Clamp these to the appropriate range after all are applied. //Clamp these to the appropriate range after all are applied.
APPMOT(m_Weight); APPMOT(m_Weight);
APPMOT(m_ColorX); APPMOT(m_ColorX);
@ -751,7 +722,6 @@ public:
{ {
Variation<T>* motVar = currentMot.GetVariation(j);//Get the variation, which may or may not be present in this xform. Variation<T>* motVar = currentMot.GetVariation(j);//Get the variation, which may or may not be present in this xform.
ParametricVariation<T>* motParVar = dynamic_cast<ParametricVariation<T>*>(motVar); ParametricVariation<T>* motParVar = dynamic_cast<ParametricVariation<T>*>(motVar);
Variation<T>* var = GetVariationById(motVar->VariationId());//See if the variation in the motion xform was present in the xform. Variation<T>* 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. if (!var)//It wasn't present, so add it and set the weight.
@ -861,7 +831,7 @@ public:
m_NeedPrecalcAtanYX = true; m_NeedPrecalcAtanYX = true;
} }
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing) AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{ {
for (auto var : variations) for (auto var : variations)
{ {
@ -912,13 +882,13 @@ public:
if (GetVariationById(VAR_FLATTEN) == nullptr) if (GetVariationById(VAR_FLATTEN) == nullptr)
{ {
AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing) AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
{ {
for (auto var : variations) for (auto var : variations)
{ {
if (var->m_Weight != 0)//This should never happen, but just to be safe. 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; shouldFlatten = false;
keepGoing = false; keepGoing = false;
@ -973,20 +943,21 @@ public:
switch (varType) switch (varType)
{ {
case VARTYPE_REG: case VARTYPE_REG:
case VARTYPE_PRE: case VARTYPE_PRE:
s = s =
"\tvIn.x = transX;\n" "\tvIn.x = transX;\n"
"\tvIn.y = transY;\n" "\tvIn.y = transY;\n"
"\tvIn.z = transZ;\n"; "\tvIn.z = transZ;\n";
break; break;
case VARTYPE_POST:
default: case VARTYPE_POST:
s = default:
"\tvIn.x = outPoint->m_X;\n" s =
"\tvIn.y = outPoint->m_Y;\n" "\tvIn.x = outPoint->m_X;\n"
"\tvIn.z = outPoint->m_Z;\n"; "\tvIn.y = outPoint->m_Y;\n"
break; "\tvIn.z = outPoint->m_Z;\n";
break;
} }
return s; return s;
@ -1008,6 +979,7 @@ public:
helper.m_TransZ = helper.Out.z; helper.m_TransZ = helper.Out.z;
break; break;
} }
case ASSIGNTYPE_SUM: case ASSIGNTYPE_SUM:
default: default:
{ {
@ -1035,6 +1007,7 @@ public:
outPoint.m_Z = helper.Out.z; outPoint.m_Z = helper.Out.z;
break; break;
} }
case ASSIGNTYPE_SUM: case ASSIGNTYPE_SUM:
default: default:
{ {
@ -1061,11 +1034,12 @@ public:
case VARTYPE_REG: case VARTYPE_REG:
{ {
s = s =
"\toutPoint->m_X += vOut.x;\n" "\toutPoint->m_X += vOut.x;\n"
"\toutPoint->m_Y += vOut.y;\n" "\toutPoint->m_Y += vOut.y;\n"
"\toutPoint->m_Z += vOut.z;\n"; "\toutPoint->m_Z += vOut.z;\n";
break; break;
} }
case VARTYPE_PRE: case VARTYPE_PRE:
{ {
switch (assignType) switch (assignType)
@ -1073,24 +1047,26 @@ public:
case ASSIGNTYPE_SET: case ASSIGNTYPE_SET:
{ {
s = s =
"\ttransX = vOut.x;\n" "\ttransX = vOut.x;\n"
"\ttransY = vOut.y;\n" "\ttransY = vOut.y;\n"
"\ttransZ = vOut.z;\n"; "\ttransZ = vOut.z;\n";
break; break;
} }
case ASSIGNTYPE_SUM: case ASSIGNTYPE_SUM:
default: default:
{ {
s = s =
"\ttransX += vOut.x;\n" "\ttransX += vOut.x;\n"
"\ttransY += vOut.y;\n" "\ttransY += vOut.y;\n"
"\ttransZ += vOut.z;\n"; "\ttransZ += vOut.z;\n";
break; break;
} }
} }
break; break;
} }
case VARTYPE_POST: case VARTYPE_POST:
default: default:
{ {
@ -1099,18 +1075,19 @@ public:
case ASSIGNTYPE_SET: case ASSIGNTYPE_SET:
{ {
s = s =
"\toutPoint->m_X = vOut.x;\n" "\toutPoint->m_X = vOut.x;\n"
"\toutPoint->m_Y = vOut.y;\n" "\toutPoint->m_Y = vOut.y;\n"
"\toutPoint->m_Z = vOut.z;\n"; "\toutPoint->m_Z = vOut.z;\n";
break; break;
} }
case ASSIGNTYPE_SUM: case ASSIGNTYPE_SUM:
default: default:
{ {
s = s =
"\toutPoint->m_X += vOut.x;\n" "\toutPoint->m_X += vOut.x;\n"
"\toutPoint->m_Y += vOut.y;\n" "\toutPoint->m_Y += vOut.y;\n"
"\toutPoint->m_Z += vOut.z;\n"; "\toutPoint->m_Z += vOut.z;\n";
break; break;
} }
} }
@ -1131,7 +1108,6 @@ public:
string ToString() const string ToString() const
{ {
ostringstream ss; ostringstream ss;
ss << "A: " << m_Affine.A() << " " ss << "A: " << m_Affine.A() << " "
<< "B: " << m_Affine.B() << " " << "B: " << m_Affine.B() << " "
<< "C: " << m_Affine.C() << " " << "C: " << m_Affine.C() << " "
@ -1161,8 +1137,7 @@ public:
ss << "Motion Frequency: " << m_MotionFreq << endl; ss << "Motion Frequency: " << m_MotionFreq << endl;
ss << "Motion Func: " << m_MotionFunc << endl; ss << "Motion Func: " << m_MotionFunc << endl;
ss << "Motion Offset: " << m_MotionOffset << endl; ss << "Motion Offset: " << m_MotionOffset << endl;
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool & keepGoing)
const_cast<Xform<T>*>(this)->AllVarsFunc([&] (vector<Variation<T>*>& variations, bool& keepGoing)
{ {
for (auto var : variations) for (auto var : variations)
ss << var->ToString() << endl; ss << var->ToString() << endl;
@ -1252,7 +1227,6 @@ private:
void AllVarsFunc(std::function<void (vector<Variation<T>*>&, bool&)> func) void AllVarsFunc(std::function<void (vector<Variation<T>*>&, bool&)> func)
{ {
bool keepGoing = true; bool keepGoing = true;
func(m_PreVariations, keepGoing); func(m_PreVariations, keepGoing);
if (keepGoing) if (keepGoing)

View File

@ -11,8 +11,7 @@
template <typename T> template <typename T>
bool EmberAnimate(EmberOptions& opt) bool EmberAnimate(EmberOptions& opt)
{ {
OpenCLInfo& info(OpenCLInfo::Instance()); auto info = OpenCLInfo::Instance();
std::cout.imbue(std::locale("")); std::cout.imbue(std::locale(""));
if (opt.DumpArgs()) if (opt.DumpArgs())
@ -21,7 +20,7 @@ bool EmberAnimate(EmberOptions& opt)
if (opt.OpenCLInfo()) if (opt.OpenCLInfo())
{ {
cout << "\nOpenCL Info: " << endl; cout << "\nOpenCL Info: " << endl;
cout << info.DumpInfo(); cout << info->DumpInfo();
return true; return true;
} }
@ -69,8 +68,8 @@ bool EmberAnimate(EmberOptions& opt)
{ {
for (auto& device : devices) for (auto& device : devices)
{ {
cout << "Platform: " << info.PlatformName(device.first) << endl; cout << "Platform: " << info->PlatformName(device.first) << endl;
cout << "Device: " << info.DeviceName(device.first, device.second) << endl; cout << "Device: " << info->DeviceName(device.first, device.second) << endl;
} }
} }
@ -135,9 +134,9 @@ bool EmberAnimate(EmberOptions& opt)
} }
if (opt.Format() != "jpg" && if (opt.Format() != "jpg" &&
opt.Format() != "png" && opt.Format() != "png" &&
opt.Format() != "ppm" && opt.Format() != "ppm" &&
opt.Format() != "bmp") opt.Format() != "bmp")
{ {
cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg." << endl; 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_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_FinalRasH = size_t(T(embers[i].m_FinalRasH) * opt.SizeScale());
embers[i].m_PixelsPerUnit *= T(opt.SizeScale()); embers[i].m_PixelsPerUnit *= T(opt.SizeScale());
//Cast to double in case the value exceeds 2^32. //Cast to double in case the value exceeds 2^32.
double imageMem = double(channels) * double(embers[i].m_FinalRasW) 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)); 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. 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) || 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 << 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_FinalRasW = embers[0].m_FinalRasW;
embers[i].m_FinalRasH = embers[0].m_FinalRasH; embers[i].m_FinalRasH = embers[0].m_FinalRasH;
} }
@ -279,7 +276,7 @@ bool EmberAnimate(EmberOptions& opt)
if (opt.LastFrame() == UINT_MAX) if (opt.LastFrame() == UINT_MAX)
opt.LastFrame(ClampGte<size_t>(size_t(embers.back().m_Time),//Make sure time - 1 is positive before converting to size_t. opt.LastFrame(ClampGte<size_t>(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()) if (!opt.Out().empty())
@ -306,11 +303,11 @@ bool EmberAnimate(EmberOptions& opt)
} }
std::function<void (vector<byte>&, string, EmberImageComments, size_t, size_t, size_t)> saveFunc = [&](vector<byte>& finalImage, std::function<void (vector<byte>&, string, EmberImageComments, size_t, size_t, size_t)> saveFunc = [&](vector<byte>& finalImage,
string filename,//These are copies because this will be launched in a thread. string filename,//These are copies because this will be launched in a thread.
EmberImageComments comments, EmberImageComments comments,
size_t w, size_t w,
size_t h, size_t h,
size_t chan) size_t chan)
{ {
bool writeSuccess = false; bool writeSuccess = false;
byte* finalImagep = finalImage.data(); byte* finalImagep = finalImage.data();
@ -330,9 +327,7 @@ bool EmberAnimate(EmberOptions& opt)
if (!writeSuccess) if (!writeSuccess)
cout << "Error writing " << filename << endl; cout << "Error writing " << filename << endl;
}; };
atomfTime.store(opt.FirstFrame()); atomfTime.store(opt.FirstFrame());
std::function<void(size_t)> iterFunc = [&](size_t index) std::function<void(size_t)> iterFunc = [&](size_t index)
{ {
size_t ftime, finalImageIndex = 0; size_t ftime, finalImageIndex = 0;
@ -344,7 +339,6 @@ bool EmberAnimate(EmberOptions& opt)
Ember<T> centerEmber; Ember<T> centerEmber;
vector<byte> finalImages[2]; vector<byte> finalImages[2];
std::thread writeThread; std::thread writeThread;
os.imbue(std::locale("")); os.imbue(std::locale(""));
while (atomfTime.fetch_add(opt.Dtime()), ((ftime = atomfTime.load()) <= opt.LastFrame())) while (atomfTime.fetch_add(opt.Dtime()), ((ftime = atomfTime.load()) <= opt.LastFrame()))
@ -398,7 +392,9 @@ bool EmberAnimate(EmberOptions& opt)
{ {
verboseCs.Enter(); verboseCs.Enter();
cout << "\nIters ran/requested: " + os.str() << endl; cout << "\nIters ran/requested: " + os.str() << endl;
if (!opt.EmberCL()) cout << "Bad values: " << stats.m_Badvals << endl; if (!opt.EmberCL()) cout << "Bad values: " << stats.m_Badvals << endl;
cout << "Render time: " << t.Format(stats.m_RenderMs) << endl; cout << "Render time: " << t.Format(stats.m_RenderMs) << endl;
cout << "Pure iter time: " << t.Format(stats.m_IterMs) << 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; 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. if (writeThread.joinable())//One final check to make sure all writing is done before exiting this thread.
writeThread.join(); writeThread.join();
}; };
threadVec.reserve(renderers.size()); threadVec.reserve(renderers.size());
for (size_t r = 0; r < renderers.size(); r++) for (size_t r = 0; r < renderers.size(); r++)
@ -441,7 +436,6 @@ bool EmberAnimate(EmberOptions& opt)
th.join(); th.join();
t.Toc("\nFinished in: ", true); t.Toc("\nFinished in: ", true);
return true; return true;
} }
@ -455,7 +449,6 @@ int _tmain(int argc, _TCHAR* argv[])
{ {
bool b = false; bool b = false;
EmberOptions opt; EmberOptions opt;
//Required for large allocs, else GPU memory usage will be severely limited to small sizes. //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. //This must be done in the application and not in the EmberCL DLL.
#ifdef WIN32 #ifdef WIN32
@ -466,23 +459,23 @@ int _tmain(int argc, _TCHAR* argv[])
if (!opt.Populate(argc, argv, OPT_USE_ANIMATE)) if (!opt.Populate(argc, argv, OPT_USE_ANIMATE))
{ {
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
if (opt.Bits() == 64) if (opt.Bits() == 64)
{ {
b = EmberAnimate<double>(opt); b = EmberAnimate<double>(opt);
} }
else else
#endif #endif
if (opt.Bits() == 33) if (opt.Bits() == 33)
{ {
b = EmberAnimate<float>(opt); b = EmberAnimate<float>(opt);
} }
else if (opt.Bits() == 32) else if (opt.Bits() == 32)
{ {
cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl;
b = EmberAnimate<float>(opt); b = EmberAnimate<float>(opt);
} }
} }
return b ? 0 : 1; return b ? 0 : 1;

View File

@ -16,6 +16,7 @@
#if defined(_WIN32) #if defined(_WIN32)
#include <windows.h> #include <windows.h>
#include <SDKDDKVer.h> #include <SDKDDKVer.h>
#include "GL/gl.h"
#elif defined(__APPLE__) #elif defined(__APPLE__)
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#else #else
@ -23,21 +24,7 @@
#endif #endif
#include <utility> #include <utility>
#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 <CL/cl.hpp> #include <CL/cl.hpp>
#include <algorithm> #include <algorithm>
#include <atomic> #include <atomic>
#include <cstdio> #include <cstdio>

View File

@ -23,100 +23,101 @@ static string ConstantDefinesString(bool doublePrecision)
if (doublePrecision) if (doublePrecision)
{ {
os << "#if defined(cl_amd_fp64)\n"//AMD extension available? os << "#if defined(cl_amd_fp64)\n"//AMD extension available?
" #pragma OPENCL EXTENSION cl_amd_fp64 : enable\n" " #pragma OPENCL EXTENSION cl_amd_fp64 : enable\n"
"#endif\n" "#endif\n"
"#if defined(cl_khr_fp64)\n"//Khronos extension available? "#if defined(cl_khr_fp64)\n"//Khronos extension available?
" #pragma OPENCL EXTENSION cl_khr_fp64 : enable\n" " #pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
"#endif\n" "#endif\n"
"#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable\n"//Only supported on nVidia. "#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable\n"//Only supported on nVidia.
"typedef long intPrec;\n" "typedef long intPrec;\n"
"typedef uint atomi;\n"//Same size as real_bucket_t, always 4 bytes. "typedef uint atomi;\n"//Same size as real_bucket_t, always 4 bytes.
"typedef double real_t;\n" "typedef double real_t;\n"
"typedef float real_bucket_t;\n"//Assume buckets are always float, even though iter calcs are in double. "typedef float real_bucket_t;\n"//Assume buckets are always float, even though iter calcs are in double.
"typedef double2 real2;\n" "typedef double2 real2;\n"
"typedef double4 real4;\n" "typedef double3 real3;\n"
"typedef float4 real4_bucket;\n"//And here too. "typedef double4 real4;\n"
"#define EPS (DBL_EPSILON)\n" "typedef float4 real4_bucket;\n"//And here too.
"#define TLOW (DBL_MIN)\n" "#define EPS (DBL_EPSILON)\n"
"#define TMAX (DBL_MAX)\n" "#define TLOW (DBL_MIN)\n"
; "#define TMAX (DBL_MAX)\n"
;
} }
else else
{ {
os << "typedef int intPrec;\n" os << "typedef int intPrec;\n"
"typedef uint atomi;\n" "typedef uint atomi;\n"
"typedef float real_t;\n" "typedef float real_t;\n"
"typedef float real_bucket_t;\n" "typedef float real_bucket_t;\n"
"typedef float2 real2;\n" "typedef float2 real2;\n"
"typedef float4 real4;\n" "typedef float3 real3;\n"
"typedef float4 real4_bucket;\n" "typedef float4 real4;\n"
"#define EPS (FLT_EPSILON)\n" "typedef float4 real4_bucket;\n"
"#define TLOW (FLT_MIN)\n" "#define EPS (FLT_EPSILON)\n"
"#define TMAX (FLT_MAX)\n" "#define TLOW (FLT_MIN)\n"
; "#define TMAX (FLT_MAX)\n"
;
} }
os << os <<
"typedef long int int64;\n" "typedef long int int64;\n"
"typedef unsigned long int uint64;\n" "typedef unsigned long int uint64;\n"
"\n" "\n"
"#define EPS6 ((1e-6))\n" "#define EPS6 ((1e-6))\n"
"\n" "\n"
"//The number of threads per block used in the iteration function. Don't change\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" "//it lightly; the block size is hard coded to be exactly 32 x 8.\n"
"#define NTHREADS 256u\n" "#define NTHREADS 256u\n"
"#define THREADS_PER_WARP 32u\n" "#define THREADS_PER_WARP 32u\n"
"#define NWARPS (NTHREADS / THREADS_PER_WARP)\n" "#define NWARPS (NTHREADS / THREADS_PER_WARP)\n"
"#define COLORMAP_LENGTH 256u\n" "#define COLORMAP_LENGTH 256u\n"
"#define COLORMAP_LENGTH_MINUS_1 255u\n" "#define COLORMAP_LENGTH_MINUS_1 255u\n"
"#define DE_THRESH 100u\n" "#define DE_THRESH 100u\n"
"#define BadVal(x) (((x) != (x)) || ((x) > 1e10) || ((x) < -1e10))\n" "#define BadVal(x) (((x) != (x)) || ((x) > 1e10) || ((x) < -1e10))\n"
"#define Rint(A) floor((A) + (((A) < 0) ? -0.5 : 0.5))\n" "#define Rint(A) floor((A) + (((A) < 0) ? -0.5 : 0.5))\n"
"#define SQR(x) ((x) * (x))\n" "#define SQR(x) ((x) * (x))\n"
"#define CUBE(x) ((x) * (x) * (x))\n" "#define CUBE(x) ((x) * (x) * (x))\n"
"#define M_2PI (M_PI * 2)\n" "#define M_2PI (M_PI * 2)\n"
"#define M_3PI (M_PI * 3)\n" "#define M_3PI (M_PI * 3)\n"
"#define SQRT5 2.2360679774997896964091736687313\n" "#define SQRT5 2.2360679774997896964091736687313\n"
"#define M_PHI 1.61803398874989484820458683436563\n" "#define M_PHI 1.61803398874989484820458683436563\n"
"#define DEG_2_RAD (M_PI / 180)\n" "#define DEG_2_RAD (M_PI / 180)\n"
"\n" "\n"
"//Index in each dimension of a thread within a block.\n" "//Index in each dimension of a thread within a block.\n"
"#define THREAD_ID_X (get_local_id(0))\n" "#define THREAD_ID_X (get_local_id(0))\n"
"#define THREAD_ID_Y (get_local_id(1))\n" "#define THREAD_ID_Y (get_local_id(1))\n"
"#define THREAD_ID_Z (get_local_id(2))\n" "#define THREAD_ID_Z (get_local_id(2))\n"
"\n" "\n"
"//Index in each dimension of a block within a grid.\n" "//Index in each dimension of a block within a grid.\n"
"#define BLOCK_ID_X (get_group_id(0))\n" "#define BLOCK_ID_X (get_group_id(0))\n"
"#define BLOCK_ID_Y (get_group_id(1))\n" "#define BLOCK_ID_Y (get_group_id(1))\n"
"#define BLOCK_ID_Z (get_group_id(2))\n" "#define BLOCK_ID_Z (get_group_id(2))\n"
"\n" "\n"
"//Absolute index in each dimension of a thread within a grid.\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_X (get_global_id(0))\n"
"#define GLOBAL_ID_Y (get_global_id(1))\n" "#define GLOBAL_ID_Y (get_global_id(1))\n"
"#define GLOBAL_ID_Z (get_global_id(2))\n" "#define GLOBAL_ID_Z (get_global_id(2))\n"
"\n" "\n"
"//Dimensions of a block.\n" "//Dimensions of a block.\n"
"#define BLOCK_SIZE_X (get_local_size(0))\n" "#define BLOCK_SIZE_X (get_local_size(0))\n"
"#define BLOCK_SIZE_Y (get_local_size(1))\n" "#define BLOCK_SIZE_Y (get_local_size(1))\n"
"#define BLOCK_SIZE_Z (get_local_size(2))\n" "#define BLOCK_SIZE_Z (get_local_size(2))\n"
"\n" "\n"
"//Dimensions of a grid, in terms of blocks.\n" "//Dimensions of a grid, in terms of blocks.\n"
"#define GRID_SIZE_X (get_num_groups(0))\n" "#define GRID_SIZE_X (get_num_groups(0))\n"
"#define GRID_SIZE_Y (get_num_groups(1))\n" "#define GRID_SIZE_Y (get_num_groups(1))\n"
"#define GRID_SIZE_Z (get_num_groups(2))\n" "#define GRID_SIZE_Z (get_num_groups(2))\n"
"\n" "\n"
"//Dimensions of a grid, in terms of threads.\n" "//Dimensions of a grid, in terms of threads.\n"
"#define GLOBAL_SIZE_X (get_global_size(0))\n" "#define GLOBAL_SIZE_X (get_global_size(0))\n"
"#define GLOBAL_SIZE_Y (get_global_size(1))\n" "#define GLOBAL_SIZE_Y (get_global_size(1))\n"
"#define GLOBAL_SIZE_Z (get_global_size(2))\n" "#define GLOBAL_SIZE_Z (get_global_size(2))\n"
"\n" "\n"
"#define INDEX_IN_BLOCK_2D (THREAD_ID_Y * BLOCK_SIZE_X + THREAD_ID_X)\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" "#define INDEX_IN_BLOCK_3D ((BLOCK_SIZE_X * BLOCK_SIZE_Y * THREAD_ID_Z) + INDEX_IN_BLOCK_2D)\n"
"\n" "\n"
"#define INDEX_IN_GRID_2D (GLOBAL_ID_Y * GLOBAL_SIZE_X + GLOBAL_ID_X)\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" "#define INDEX_IN_GRID_3D ((GLOBAL_SIZE_X * GLOBAL_SIZE_Y * GLOBAL_ID_Z) + INDEX_IN_GRID_2D)\n"
"\n"; "\n";
return os.str(); return os.str();
} }
@ -141,15 +142,15 @@ struct ALIGN PointCL
/// be supported, which will make it more than 4 members. /// be supported, which will make it more than 4 members.
/// </summary> /// </summary>
static const char* PointCLStructString = static const char* PointCLStructString =
"typedef struct __attribute__ " ALIGN_CL " _Point\n" "typedef struct __attribute__ " ALIGN_CL " _Point\n"
"{\n" "{\n"
" real_t m_X;\n" " real_t m_X;\n"
" real_t m_Y;\n" " real_t m_Y;\n"
" real_t m_Z;\n" " real_t m_Z;\n"
" real_t m_ColorX;\n" " real_t m_ColorX;\n"
" uint m_LastXfUsed;\n" " uint m_LastXfUsed;\n"
"} Point;\n" "} Point;\n"
"\n"; "\n";
#define MAX_CL_VARS 8//These must always match. #define MAX_CL_VARS 8//These must always match.
#define MAX_CL_VARS_STRING "8" #define MAX_CL_VARS_STRING "8"
@ -175,18 +176,18 @@ struct ALIGN XformCL
/// The xform structure used to iterate in OpenCL. /// The xform structure used to iterate in OpenCL.
/// </summary> /// </summary>
static const char* XformCLStructString = static const char* XformCLStructString =
"typedef struct __attribute__ " ALIGN_CL " _XformCL\n" "typedef struct __attribute__ " ALIGN_CL " _XformCL\n"
"{\n" "{\n"
" real_t m_A, m_B, m_C, m_D, m_E, m_F;\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_VariationWeights[" MAX_CL_VARS_STRING "];\n"
" real_t m_PostA, m_PostB, m_PostC, m_PostD, m_PostE, m_PostF;\n" " real_t m_PostA, m_PostB, m_PostC, m_PostD, m_PostE, m_PostF;\n"
" real_t m_DirectColor;\n" " real_t m_DirectColor;\n"
" real_t m_ColorSpeedCache;\n" " real_t m_ColorSpeedCache;\n"
" real_t m_OneMinusColorCache;\n" " real_t m_OneMinusColorCache;\n"
" real_t m_Opacity;\n" " real_t m_Opacity;\n"
" real_t m_VizAdjusted;\n" " real_t m_VizAdjusted;\n"
"} XformCL;\n" "} XformCL;\n"
"\n"; "\n";
/// <summary> /// <summary>
/// A structure on the host used to hold all of the needed information for an ember used on the device to iterate in OpenCL. /// 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. /// The ember structure used to iterate in OpenCL.
/// </summary> /// </summary>
static const char* EmberCLStructString = static const char* EmberCLStructString =
"typedef struct __attribute__ " ALIGN_CL " _EmberCL\n" "typedef struct __attribute__ " ALIGN_CL " _EmberCL\n"
"{\n" "{\n"
" real_t m_CamZPos;\n" " real_t m_CamZPos;\n"
" real_t m_CamPerspective;\n" " real_t m_CamPerspective;\n"
" real_t m_CamYaw;\n" " real_t m_CamYaw;\n"
" real_t m_CamPitch;\n" " real_t m_CamPitch;\n"
" real_t m_CamDepthBlur;\n" " real_t m_CamDepthBlur;\n"
" real_t m_BlurCoef;\n" " real_t m_BlurCoef;\n"
" real_t m_C00;\n" " real_t m_C00;\n"
" real_t m_C01;\n" " real_t m_C01;\n"
" real_t m_C02;\n" " real_t m_C02;\n"
" real_t m_C10;\n" " real_t m_C10;\n"
" real_t m_C11;\n" " real_t m_C11;\n"
" real_t m_C12;\n" " real_t m_C12;\n"
" real_t m_C20;\n" " real_t m_C20;\n"
" real_t m_C21;\n" " real_t m_C21;\n"
" real_t m_C22;\n" " real_t m_C22;\n"
" real_t m_CenterX, m_CenterY;\n" " real_t m_CenterX, m_CenterY;\n"
" real_t m_RotA, m_RotB, m_RotD, m_RotE;\n" " real_t m_RotA, m_RotB, m_RotD, m_RotE;\n"
"} EmberCL;\n" "} EmberCL;\n"
"\n"; "\n";
/// <summary> /// <summary>
/// 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. /// 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. /// The cartesian to raster structure used to iterate in OpenCL.
/// </summary> /// </summary>
static const char* CarToRasCLStructString = static const char* CarToRasCLStructString =
"typedef struct __attribute__ " ALIGN_CL " _CarToRasCL\n" "typedef struct __attribute__ " ALIGN_CL " _CarToRasCL\n"
"{\n" "{\n"
" real_t m_PixPerImageUnitW, m_RasLlX;\n" " real_t m_PixPerImageUnitW, m_RasLlX;\n"
" uint m_RasWidth;\n" " uint m_RasWidth;\n"
" real_t m_PixPerImageUnitH, m_RasLlY;\n" " real_t m_PixPerImageUnitH, m_RasLlY;\n"
" real_t m_CarLlX, m_CarUrX, m_CarUrY, m_CarLlY;\n" " real_t m_CarLlX, m_CarUrX, m_CarUrY, m_CarLlY;\n"
"} CarToRasCL;\n" "} CarToRasCL;\n"
"\n"; "\n";
/// <summary> /// <summary>
/// A structure on the host used to hold all of the needed information for density filtering used on the device to iterate in OpenCL. /// 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. /// Note that the actual filter buffer is held elsewhere.
/// </summary> /// </summary>
static const char* DensityFilterCLStructString = static const char* DensityFilterCLStructString =
"typedef struct __attribute__ " ALIGN_CL " _DensityFilterCL\n" "typedef struct __attribute__ " ALIGN_CL " _DensityFilterCL\n"
"{\n" "{\n"
" real_bucket_t m_Curve;\n" " real_bucket_t m_Curve;\n"
" real_bucket_t m_K1;\n" " real_bucket_t m_K1;\n"
" real_bucket_t m_K2;\n" " real_bucket_t m_K2;\n"
" uint m_Supersample;\n" " uint m_Supersample;\n"
" uint m_SuperRasW;\n" " uint m_SuperRasW;\n"
" uint m_SuperRasH;\n" " uint m_SuperRasH;\n"
" uint m_KernelSize;\n" " uint m_KernelSize;\n"
" uint m_MaxFilterIndex;\n" " uint m_MaxFilterIndex;\n"
" uint m_MaxFilteredCounts;\n" " uint m_MaxFilteredCounts;\n"
" uint m_FilterWidth;\n" " uint m_FilterWidth;\n"
"} DensityFilterCL;\n" "} DensityFilterCL;\n"
"\n"; "\n";
/// <summary> /// <summary>
/// A structure on the host used to hold all of the needed information for spatial filtering used on the device to iterate in OpenCL. /// 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. /// Note that the actual filter buffer is held elsewhere.
/// </summary> /// </summary>
static const char* SpatialFilterCLStructString = static const char* SpatialFilterCLStructString =
"typedef struct __attribute__ ((aligned (16))) _SpatialFilterCL\n" "typedef struct __attribute__ ((aligned (16))) _SpatialFilterCL\n"
"{\n" "{\n"
" uint m_SuperRasW;\n" " uint m_SuperRasW;\n"
" uint m_SuperRasH;\n" " uint m_SuperRasH;\n"
" uint m_FinalRasW;\n" " uint m_FinalRasW;\n"
" uint m_FinalRasH;\n" " uint m_FinalRasH;\n"
" uint m_Supersample;\n" " uint m_Supersample;\n"
" uint m_FilterWidth;\n" " uint m_FilterWidth;\n"
" uint m_NumChannels;\n" " uint m_NumChannels;\n"
" uint m_BytesPerChannel;\n" " uint m_BytesPerChannel;\n"
" uint m_DensityFilterOffset;\n" " uint m_DensityFilterOffset;\n"
" uint m_Transparency;\n" " uint m_Transparency;\n"
" uint m_YAxisUp;\n" " uint m_YAxisUp;\n"
" real_bucket_t m_Vibrancy;\n" " real_bucket_t m_Vibrancy;\n"
" real_bucket_t m_HighlightPower;\n" " real_bucket_t m_HighlightPower;\n"
" real_bucket_t m_Gamma;\n" " real_bucket_t m_Gamma;\n"
" real_bucket_t m_LinRange;\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. " 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" "} SpatialFilterCL;\n"
"\n"; "\n";
/// <summary> /// <summary>
/// EmberCL makes extensive use of the build in vector types, however accessing /// 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. /// Declaring them in a union with a buffer resolves this problem.
/// </summary> /// </summary>
static const char* UnionCLStructString = static const char* UnionCLStructString =
"typedef union\n" "typedef union\n"
"{\n" "{\n"
" uchar3 m_Uchar3;\n" " uchar3 m_Uchar3;\n"
" uchar m_Uchars[3];\n" " uchar m_Uchars[3];\n"
"} uchar3uchars;\n" "} uchar3uchars;\n"
"\n" "\n"
"typedef union\n" "typedef union\n"
"{\n" "{\n"
" uchar4 m_Uchar4;\n" " uchar4 m_Uchar4;\n"
" uchar m_Uchars[4];\n" " uchar m_Uchars[4];\n"
"} uchar4uchars;\n" "} uchar4uchars;\n"
"\n" "\n"
"typedef union\n" "typedef union\n"
"{\n" "{\n"
" uint4 m_Uint4;\n" " uint4 m_Uint4;\n"
" uint m_Uints[4];\n" " uint m_Uints[4];\n"
"} uint4uints;\n" "} uint4uints;\n"
"\n" "\n"
"typedef union\n"//Use in places where float is required. "typedef union\n"//Use in places where float is required.
"{\n" "{\n"
" float4 m_Float4;\n" " float4 m_Float4;\n"
" float m_Floats[4];\n" " float m_Floats[4];\n"
"} float4floats;\n" "} float4floats;\n"
"\n" "\n"
"typedef union\n"//Use in places where float or double can be used depending on the template type. "typedef union\n"//Use in places where float or double can be used depending on the template type.
"{\n" "{\n"
" real4 m_Real4;\n" " real4 m_Real4;\n"
" real_t m_Reals[4];\n" " real_t m_Reals[4];\n"
"} real4reals;\n" "} real4reals;\n"
"\n" "\n"
"typedef union\n"//Used to match the bucket template type. "typedef union\n"//Used to match the bucket template type.
"{\n" "{\n"
" real4_bucket m_Real4;\n" " real4_bucket m_Real4;\n"
" real_bucket_t m_Reals[4];\n" " real_bucket_t m_Reals[4];\n"
"} real4reals_bucket;\n" "} real4reals_bucket;\n"
"\n"; "\n";
} }

View File

@ -15,31 +15,26 @@ FunctionMapper::FunctionMapper()
" intPrec temp = (x >= 0.0 ? (intPrec)(x + 0.5) : (intPrec)(x - 0.5));\n" " intPrec temp = (x >= 0.0 ? (intPrec)(x + 0.5) : (intPrec)(x - 0.5));\n"
" return (real_t)temp;\n" " return (real_t)temp;\n"
"}\n"; "}\n";
m_GlobalMap["Round"] = m_GlobalMap["Round"] =
"inline real_t Round(real_t r)\n" "inline real_t Round(real_t r)\n"
"{\n" "{\n"
" return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);\n" " return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);\n"
"}\n"; "}\n";
m_GlobalMap["Sign"] = m_GlobalMap["Sign"] =
"inline real_t Sign(real_t v)\n" "inline real_t Sign(real_t v)\n"
"{\n" "{\n"
" return (v < 0.0) ? -1 : (v > 0.0) ? 1 : 0.0;\n" " return (v < 0.0) ? -1 : (v > 0.0) ? 1 : 0.0;\n"
"}\n"; "}\n";
m_GlobalMap["SignNz"] = m_GlobalMap["SignNz"] =
"inline real_t SignNz(real_t v)\n" "inline real_t SignNz(real_t v)\n"
"{\n" "{\n"
" return (v < 0.0) ? -1.0 : 1.0;\n" " return (v < 0.0) ? -1.0 : 1.0;\n"
"}\n"; "}\n";
m_GlobalMap["Sqr"] = m_GlobalMap["Sqr"] =
"inline real_t Sqr(real_t v)\n" "inline real_t Sqr(real_t v)\n"
"{\n" "{\n"
" return v * v;\n" " return v * v;\n"
"}\n"; "}\n";
m_GlobalMap["SafeSqrt"] = m_GlobalMap["SafeSqrt"] =
"inline real_t SafeSqrt(real_t x)\n" "inline real_t SafeSqrt(real_t x)\n"
"{\n" "{\n"
@ -48,49 +43,41 @@ FunctionMapper::FunctionMapper()
"\n" "\n"
" return sqrt(x);\n" " return sqrt(x);\n"
"}\n"; "}\n";
m_GlobalMap["Cube"] = m_GlobalMap["Cube"] =
"inline real_t Cube(real_t v)\n" "inline real_t Cube(real_t v)\n"
"{\n" "{\n"
" return v * v * v;\n" " return v * v * v;\n"
"}\n"; "}\n";
m_GlobalMap["Hypot"] = m_GlobalMap["Hypot"] =
"inline real_t Hypot(real_t x, real_t y)\n" "inline real_t Hypot(real_t x, real_t y)\n"
"{\n" "{\n"
" return sqrt(SQR(x) + SQR(y));\n" " return sqrt(SQR(x) + SQR(y));\n"
"}\n"; "}\n";
m_GlobalMap["Spread"] = m_GlobalMap["Spread"] =
"inline real_t Spread(real_t x, real_t y)\n" "inline real_t Spread(real_t x, real_t y)\n"
"{\n" "{\n"
" return Hypot(x, y) * ((x) > 0.0 ? 1.0 : -1.0);\n" " return Hypot(x, y) * ((x) > 0.0 ? 1.0 : -1.0);\n"
"}\n"; "}\n";
m_GlobalMap["Powq4"] = m_GlobalMap["Powq4"] =
"inline real_t Powq4(real_t x, real_t y)\n" "inline real_t Powq4(real_t x, real_t y)\n"
"{\n" "{\n"
" return pow(fabs(x), y) * SignNz(x);\n" " return pow(fabs(x), y) * SignNz(x);\n"
"}\n"; "}\n";
m_GlobalMap["Powq4c"] = m_GlobalMap["Powq4c"] =
"inline real_t Powq4c(real_t x, real_t y)\n" "inline real_t Powq4c(real_t x, real_t y)\n"
"{\n" "{\n"
" return y == 1.0 ? x : Powq4(x, y);\n" " return y == 1.0 ? x : Powq4(x, y);\n"
"}\n"; "}\n";
m_GlobalMap["Zeps"] = m_GlobalMap["Zeps"] =
"inline real_t Zeps(real_t x)\n" "inline real_t Zeps(real_t x)\n"
"{\n" "{\n"
" return x == 0.0 ? EPS : x;\n" " return x == 0.0 ? EPS : x;\n"
"}\n"; "}\n";
m_GlobalMap["Lerp"] = m_GlobalMap["Lerp"] =
"inline real_t Lerp(real_t a, real_t b, real_t p)\n" "inline real_t Lerp(real_t a, real_t b, real_t p)\n"
"{\n" "{\n"
" return a + (b - a) * p;\n" " return a + (b - a) * p;\n"
"}\n"; "}\n";
m_GlobalMap["Fabsmod"] = m_GlobalMap["Fabsmod"] =
"inline real_t Fabsmod(real_t v)\n" "inline real_t Fabsmod(real_t v)\n"
"{\n" "{\n"
@ -98,37 +85,31 @@ FunctionMapper::FunctionMapper()
"\n" "\n"
" return modf(v, &dummy);\n" " return modf(v, &dummy);\n"
"}\n"; "}\n";
m_GlobalMap["Fosc"] = m_GlobalMap["Fosc"] =
"inline real_t Fosc(real_t p, real_t amp, real_t ph)\n" "inline real_t Fosc(real_t p, real_t amp, real_t ph)\n"
"{\n" "{\n"
" return 0.5 - cos(p * amp + ph) * 0.5;\n" " return 0.5 - cos(p * amp + ph) * 0.5;\n"
"}\n"; "}\n";
m_GlobalMap["Foscn"] = m_GlobalMap["Foscn"] =
"inline real_t Foscn(real_t p, real_t ph)\n" "inline real_t Foscn(real_t p, real_t ph)\n"
"{\n" "{\n"
" return 0.5 - cos(p + ph) * 0.5;\n" " return 0.5 - cos(p + ph) * 0.5;\n"
"}\n"; "}\n";
m_GlobalMap["LogScale"] = m_GlobalMap["LogScale"] =
"inline real_t LogScale(real_t x)\n" "inline real_t LogScale(real_t x)\n"
"{\n" "{\n"
" return x == 0.0 ? 0.0 : log((fabs(x) + 1) * M_E) * SignNz(x) / M_E;\n" " return x == 0.0 ? 0.0 : log((fabs(x) + 1) * M_E) * SignNz(x) / M_E;\n"
"}\n"; "}\n";
m_GlobalMap["LogMap"] = m_GlobalMap["LogMap"] =
"inline real_t LogMap(real_t x)\n" "inline real_t LogMap(real_t x)\n"
"{\n" "{\n"
" return x == 0.0 ? 0.0 : (M_E + log(x * M_E)) * 0.25 * SignNz(x);\n" " return x == 0.0 ? 0.0 : (M_E + log(x * M_E)) * 0.25 * SignNz(x);\n"
"}\n"; "}\n";
m_GlobalMap["ClampGte"] = m_GlobalMap["ClampGte"] =
"inline real_t ClampGte(real_t val, real_t gte)\n" "inline real_t ClampGte(real_t val, real_t gte)\n"
"{\n" "{\n"
" return (val < gte) ? gte : val;\n" " return (val < gte) ? gte : val;\n"
"}\n"; "}\n";
m_GlobalMap["Swap"] = m_GlobalMap["Swap"] =
"inline void Swap(real_t* val1, real_t* val2)\n" "inline void Swap(real_t* val1, real_t* val2)\n"
"{\n" "{\n"
@ -136,13 +117,172 @@ FunctionMapper::FunctionMapper()
" *val1 = *val2;\n" " *val1 = *val2;\n"
" *val2 = tmp;\n" " *val2 = tmp;\n"
"}\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 string* FunctionMapper::GetGlobalFunc(const string& func)
{ {
const auto& text = m_GlobalMap.find(func); const auto& text = m_GlobalMap.find(func);
if (text != m_GlobalMap.end()) if (text != m_GlobalMap.end())
return &text->second; return &text->second;
else else

File diff suppressed because it is too large Load Diff

View File

@ -30,9 +30,10 @@ public:
const string& SumHistKernel() const; const string& SumHistKernel() const;
const string& SumHistEntryPoint() const; const string& SumHistEntryPoint() const;
const string& IterEntryPoint() const; const string& IterEntryPoint() const;
string CreateIterKernelString(const Ember<T>& ember, string& parVarDefines, bool lockAccum = false, bool doAccum = true); string CreateIterKernelString(const Ember<T>& ember, const string& parVarDefines, const string& globalSharedDefines, bool lockAccum = false, bool doAccum = true);
string GlobalFunctionsString(const Ember<T>& ember); string GlobalFunctionsString(const Ember<T>& ember);
static void ParVarIndexDefines(const Ember<T>& ember, pair<string, vector<T>>& params, bool doVals = true, bool doString = true); static void ParVarIndexDefines(const Ember<T>& ember, pair<string, vector<T>>& params, bool doVals = true, bool doString = true);
static void SharedDataIndexDefines(const Ember<T>& ember, pair<string, vector<T>>& params, bool doVals = true, bool doString = true);
static string VariationStateString(const Ember<T>& ember); static string VariationStateString(const Ember<T>& ember);
static string VariationStateInitString(const Ember<T>& ember); static string VariationStateInitString(const Ember<T>& ember);
static bool IsBuildRequired(const Ember<T>& ember1, const Ember<T>& ember2); static bool IsBuildRequired(const Ember<T>& ember1, const Ember<T>& ember2);

View File

@ -3,17 +3,6 @@
namespace EmberCLns namespace EmberCLns
{ {
/// <summary>
/// Initialize and return a reference to the one and only OpenCLInfo object.
/// </summary>
/// <returns>A reference to the only OpenCLInfo object.</returns>
OpenCLInfo& OpenCLInfo::Instance()
{
static OpenCLInfo instance;
return instance;
}
/// <summary> /// <summary>
/// Initialize the all platforms and devices and keep information about them in lists. /// Initialize the all platforms and devices and keep information about them in lists.
/// </summary> /// </summary>
@ -23,7 +12,6 @@ OpenCLInfo::OpenCLInfo()
vector<cl::Platform> platforms; vector<cl::Platform> platforms;
vector<vector<cl::Device>> devices; vector<vector<cl::Device>> devices;
intmax_t workingPlatformIndex = -1; intmax_t workingPlatformIndex = -1;
m_Init = false; m_Init = false;
cl::Platform::get(&platforms); cl::Platform::get(&platforms);
devices.resize(platforms.size()); devices.resize(platforms.size());
@ -210,39 +198,36 @@ bool OpenCLInfo::CreateContext(const cl::Platform& platform, cl::Context& contex
if (shared) if (shared)
{ {
//Define OS-specific context properties and create the OpenCL context. //Define OS-specific context properties and create the OpenCL context.
#if defined (__APPLE__) || defined(MACOSX) #if defined (__APPLE__) || defined(MACOSX)
CGLContextObj kCGLContext = CGLGetCurrentContext(); CGLContextObj kCGLContext = CGLGetCurrentContext();
CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext); CGLShareGroupObj kCGLShareGroup = CGLGetShareGroup(kCGLContext);
cl_context_properties props[] = cl_context_properties props[] =
{ {
CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup,
0 0
}; };
context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);//May need to tinker with this on Mac.
context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);//May need to tinker with this on Mac. #else
#else #if defined WIN32
#if defined WIN32 cl_context_properties props[] =
cl_context_properties props[] = {
{ CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(),
CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(),
CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>((platform)()),
CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>((platform)()), 0
0 };
}; context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);
#else
context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err); cl_context_properties props[] =
#else {
cl_context_properties props[] = CL_GL_CONTEXT_KHR, cl_context_properties(glXGetCurrentContext()),
{ CL_GLX_DISPLAY_KHR, cl_context_properties(glXGetCurrentDisplay()),
CL_GL_CONTEXT_KHR, cl_context_properties(glXGetCurrentContext()), CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>((platform)()),
CL_GLX_DISPLAY_KHR, cl_context_properties(glXGetCurrentDisplay()), 0
CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>((platform)()), };
0 context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);
}; #endif
#endif
context = cl::Context(CL_DEVICE_TYPE_GPU, props, nullptr, nullptr, &err);
#endif
#endif
} }
else else
{ {
@ -252,7 +237,6 @@ bool OpenCLInfo::CreateContext(const cl::Platform& platform, cl::Context& contex
reinterpret_cast<cl_context_properties>((platform)()), reinterpret_cast<cl_context_properties>((platform)()),
0 0
}; };
context = cl::Context(CL_DEVICE_TYPE_ALL, props, nullptr, nullptr, &err); context = cl::Context(CL_DEVICE_TYPE_ALL, props, nullptr, nullptr, &err);
} }
@ -276,7 +260,6 @@ string OpenCLInfo::DumpInfo() const
{ {
ostringstream os; ostringstream os;
vector<size_t> sizes; vector<size_t> sizes;
os.imbue(locale("")); os.imbue(locale(""));
for (size_t platform = 0; platform < m_Platforms.size(); platform++) 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<cl_uint>(platform, device, CL_DEVICE_MAX_WRITE_IMAGE_ARGS) << endl; os << "CL_DEVICE_MAX_WRITE_IMAGE_ARGS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_MAX_WRITE_IMAGE_ARGS) << endl;
os << "CL_DEVICE_MAX_MEM_ALLOC_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_MAX_MEM_ALLOC_SIZE) << endl; os << "CL_DEVICE_MAX_MEM_ALLOC_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_MAX_MEM_ALLOC_SIZE) << endl;
os << "CL_DEVICE_ADDRESS_BITS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_ADDRESS_BITS) << endl; os << "CL_DEVICE_ADDRESS_BITS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_ADDRESS_BITS) << endl;
os << "CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE) << endl; os << "CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE) << endl;
os << "CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE) << endl; os << "CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE) << endl;
os << "CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE) << endl; os << "CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE) << endl;
os << "CL_DEVICE_GLOBAL_MEM_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_GLOBAL_MEM_SIZE) << endl; os << "CL_DEVICE_GLOBAL_MEM_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_GLOBAL_MEM_SIZE) << endl;
os << "CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE) << endl; os << "CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: " << GetInfo<cl_ulong>(platform, device, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE) << endl;
os << "CL_DEVICE_MAX_CONSTANT_ARGS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_MAX_CONSTANT_ARGS) << endl; os << "CL_DEVICE_MAX_CONSTANT_ARGS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_MAX_CONSTANT_ARGS) << endl;
os << "CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS) << endl; os << "CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: " << GetInfo<cl_uint>(platform, device, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS) << endl;
os << "CL_DEVICE_MAX_WORK_GROUP_SIZE: " << GetInfo<size_t>(platform, device, CL_DEVICE_MAX_WORK_GROUP_SIZE) << endl; os << "CL_DEVICE_MAX_WORK_GROUP_SIZE: " << GetInfo<size_t>(platform, device, CL_DEVICE_MAX_WORK_GROUP_SIZE) << endl;
sizes = GetInfo<vector<size_t>>(platform, device, CL_DEVICE_MAX_WORK_ITEM_SIZES); sizes = GetInfo<vector<size_t>>(platform, device, CL_DEVICE_MAX_WORK_ITEM_SIZES);
os << "CL_DEVICE_MAX_WORK_ITEM_SIZES: " << sizes[0] << ", " << sizes[1] << ", " << sizes[2] << endl << endl; 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) switch (err)
{ {
case CL_SUCCESS: return "Success"; case CL_SUCCESS: return "Success";
case CL_DEVICE_NOT_FOUND: return "Device not found"; case CL_DEVICE_NOT_FOUND: return "Device not found";
case CL_DEVICE_NOT_AVAILABLE: return "Device not available"; case CL_DEVICE_NOT_AVAILABLE: return "Device not available";
case CL_COMPILER_NOT_AVAILABLE: return "Compiler not available"; case CL_COMPILER_NOT_AVAILABLE: return "Compiler not available";
case CL_MEM_OBJECT_ALLOCATION_FAILURE: return "Memory object allocation failure"; case CL_MEM_OBJECT_ALLOCATION_FAILURE: return "Memory object allocation failure";
case CL_OUT_OF_RESOURCES: return "Out of resources"; case CL_OUT_OF_RESOURCES: return "Out of resources";
case CL_OUT_OF_HOST_MEMORY: return "Out of host memory"; case CL_OUT_OF_HOST_MEMORY: return "Out of host memory";
case CL_PROFILING_INFO_NOT_AVAILABLE: return "Profiling information not available"; case CL_PROFILING_INFO_NOT_AVAILABLE: return "Profiling information not available";
case CL_MEM_COPY_OVERLAP: return "Memory copy overlap"; case CL_MEM_COPY_OVERLAP: return "Memory copy overlap";
case CL_IMAGE_FORMAT_MISMATCH: return "Image format mismatch"; case CL_IMAGE_FORMAT_MISMATCH: return "Image format mismatch";
case CL_IMAGE_FORMAT_NOT_SUPPORTED: return "Image format not supported"; case CL_IMAGE_FORMAT_NOT_SUPPORTED: return "Image format not supported";
case CL_BUILD_PROGRAM_FAILURE: return "Program build failure"; case CL_BUILD_PROGRAM_FAILURE: return "Program build failure";
case CL_MAP_FAILURE: return "Map failure"; case CL_MAP_FAILURE: return "Map failure";
case CL_MISALIGNED_SUB_BUFFER_OFFSET: return "Misaligned sub buffer offset"; 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_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_VALUE: return "Invalid value";
case CL_INVALID_DEVICE_TYPE: return "Invalid device type"; case CL_INVALID_DEVICE_TYPE: return "Invalid device type";
case CL_INVALID_PLATFORM: return "Invalid platform"; case CL_INVALID_PLATFORM: return "Invalid platform";
case CL_INVALID_DEVICE: return "Invalid device"; case CL_INVALID_DEVICE: return "Invalid device";
case CL_INVALID_CONTEXT: return "Invalid context"; case CL_INVALID_CONTEXT: return "Invalid context";
case CL_INVALID_QUEUE_PROPERTIES: return "Invalid queue properties"; case CL_INVALID_QUEUE_PROPERTIES: return "Invalid queue properties";
case CL_INVALID_COMMAND_QUEUE: return "Invalid command queue"; case CL_INVALID_COMMAND_QUEUE: return "Invalid command queue";
case CL_INVALID_HOST_PTR: return "Invalid host pointer"; case CL_INVALID_HOST_PTR: return "Invalid host pointer";
case CL_INVALID_MEM_OBJECT: return "Invalid memory object"; case CL_INVALID_MEM_OBJECT: return "Invalid memory object";
case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return "Invalid image format descriptor"; case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return "Invalid image format descriptor";
case CL_INVALID_IMAGE_SIZE: return "Invalid image size"; case CL_INVALID_IMAGE_SIZE: return "Invalid image size";
case CL_INVALID_SAMPLER: return "Invalid sampler"; case CL_INVALID_SAMPLER: return "Invalid sampler";
case CL_INVALID_BINARY: return "Invalid binary"; case CL_INVALID_BINARY: return "Invalid binary";
case CL_INVALID_BUILD_OPTIONS: return "Invalid build options"; case CL_INVALID_BUILD_OPTIONS: return "Invalid build options";
case CL_INVALID_PROGRAM: return "Invalid program"; case CL_INVALID_PROGRAM: return "Invalid program";
case CL_INVALID_PROGRAM_EXECUTABLE: return "Invalid program executable"; case CL_INVALID_PROGRAM_EXECUTABLE: return "Invalid program executable";
case CL_INVALID_KERNEL_NAME: return "Invalid kernel name"; case CL_INVALID_KERNEL_NAME: return "Invalid kernel name";
case CL_INVALID_KERNEL_DEFINITION: return "Invalid kernel definition"; case CL_INVALID_KERNEL_DEFINITION: return "Invalid kernel definition";
case CL_INVALID_KERNEL: return "Invalid kernel"; case CL_INVALID_KERNEL: return "Invalid kernel";
case CL_INVALID_ARG_INDEX: return "Invalid argument index"; case CL_INVALID_ARG_INDEX: return "Invalid argument index";
case CL_INVALID_ARG_VALUE: return "Invalid argument value"; case CL_INVALID_ARG_VALUE: return "Invalid argument value";
case CL_INVALID_ARG_SIZE: return "Invalid argument size"; case CL_INVALID_ARG_SIZE: return "Invalid argument size";
case CL_INVALID_KERNEL_ARGS: return "Invalid kernel arguments"; case CL_INVALID_KERNEL_ARGS: return "Invalid kernel arguments";
case CL_INVALID_WORK_DIMENSION: return "Invalid work dimension"; case CL_INVALID_WORK_DIMENSION: return "Invalid work dimension";
case CL_INVALID_WORK_GROUP_SIZE: return "Invalid work group size"; 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_WORK_ITEM_SIZE: return "Invalid work item size";
case CL_INVALID_GLOBAL_OFFSET: return "Invalid global offset"; case CL_INVALID_GLOBAL_OFFSET: return "Invalid global offset";
case CL_INVALID_EVENT_WAIT_LIST: return "Invalid event wait list"; case CL_INVALID_EVENT_WAIT_LIST: return "Invalid event wait list";
case CL_INVALID_EVENT: return "Invalid event"; case CL_INVALID_EVENT: return "Invalid event";
case CL_INVALID_OPERATION: return "Invalid operation"; case CL_INVALID_OPERATION: return "Invalid operation";
case CL_INVALID_GL_OBJECT: return "Invalid OpenGL object"; case CL_INVALID_GL_OBJECT: return "Invalid OpenGL object";
case CL_INVALID_BUFFER_SIZE: return "Invalid buffer size"; case CL_INVALID_BUFFER_SIZE: return "Invalid buffer size";
case CL_INVALID_MIP_LEVEL: return "Invalid mip-map level"; case CL_INVALID_MIP_LEVEL: return "Invalid mip-map level";
case CL_INVALID_GLOBAL_WORK_SIZE: return "Invalid global work size"; case CL_INVALID_GLOBAL_WORK_SIZE: return "Invalid global work size";
case CL_INVALID_PROPERTY: return "Invalid property"; case CL_INVALID_PROPERTY: return "Invalid property";
default: default:
{ {
ostringstream ss; ostringstream ss;
@ -403,4 +433,4 @@ string OpenCLInfo::ErrorToStringCL(cl_int err)
} }
} }
} }
} }

View File

@ -17,10 +17,9 @@ namespace EmberCLns
/// This class derives from EmberReport, so the caller is able /// This class derives from EmberReport, so the caller is able
/// to retrieve a text dump of error information if any errors occur. /// to retrieve a text dump of error information if any errors occur.
/// </summary> /// </summary>
class EMBERCL_API OpenCLInfo : public EmberReport class EMBERCL_API OpenCLInfo : public EmberReport, public Singleton<OpenCLInfo>
{ {
public: public:
static OpenCLInfo& Instance();
const vector<cl::Platform>& Platforms() const; const vector<cl::Platform>& Platforms() const;
const string& PlatformName(size_t platform) const; const string& PlatformName(size_t platform) const;
const vector<string>& PlatformNames() const; const vector<string>& PlatformNames() const;
@ -55,6 +54,8 @@ public:
return val; return val;
} }
SINGLETON_DERIVED_IMPL(OpenCLInfo);
private: private:
OpenCLInfo(); OpenCLInfo();

View File

@ -9,19 +9,18 @@ namespace EmberCLns
/// global OpenCLInfo object. The caller must explicitly do it. /// global OpenCLInfo object. The caller must explicitly do it.
/// </summary> /// </summary>
OpenCLWrapper::OpenCLWrapper() OpenCLWrapper::OpenCLWrapper()
: m_Info(OpenCLInfo::Instance())
{ {
m_Init = false; m_Init = false;
m_Shared = false; m_Shared = false;
m_PlatformIndex = 0; m_PlatformIndex = 0;
m_DeviceIndex = 0; m_DeviceIndex = 0;
m_LocalMemSize = 0; m_LocalMemSize = 0;
//Pre-allocate some space to avoid temporary copying. //Pre-allocate some space to avoid temporary copying.
m_Programs.reserve(4); m_Programs.reserve(4);
m_Buffers.reserve(4); m_Buffers.reserve(4);
m_Images.reserve(4); m_Images.reserve(4);
m_GLImages.reserve(4); m_GLImages.reserve(4);
m_Info = OpenCLInfo::Instance();
} }
/// <summary> /// <summary>
@ -35,25 +34,24 @@ OpenCLWrapper::OpenCLWrapper()
bool OpenCLWrapper::Init(size_t platformIndex, size_t deviceIndex, bool shared) bool OpenCLWrapper::Init(size_t platformIndex, size_t deviceIndex, bool shared)
{ {
cl_int err; cl_int err;
auto& platforms = m_Info.Platforms(); auto& platforms = m_Info->Platforms();
auto& devices = m_Info.Devices(); auto& devices = m_Info->Devices();
m_Init = false; m_Init = false;
ClearErrorReport(); ClearErrorReport();
if (m_Info.Ok()) if (m_Info->Ok())
{ {
if (platformIndex < platforms.size() && platformIndex < devices.size()) if (platformIndex < platforms.size() && platformIndex < devices.size())
{ {
cl::Context context; 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. 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. 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_Platform = platforms[platformIndex];
m_Device = devices[platformIndex][deviceIndex]; m_Device = devices[platformIndex][deviceIndex];
@ -63,9 +61,9 @@ bool OpenCLWrapper::Init(size_t platformIndex, size_t deviceIndex, bool shared)
m_DeviceIndex = deviceIndex; m_DeviceIndex = deviceIndex;
m_DeviceVec.clear(); m_DeviceVec.clear();
m_DeviceVec.push_back(m_Device); m_DeviceVec.push_back(m_Device);
m_LocalMemSize = size_t(m_Info.GetInfo<cl_ulong>(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_LOCAL_MEM_SIZE)); m_LocalMemSize = size_t(m_Info->GetInfo<cl_ulong>(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_LOCAL_MEM_SIZE));
m_GlobalMemSize = size_t(m_Info.GetInfo<cl_ulong>(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_GLOBAL_MEM_SIZE)); m_GlobalMemSize = size_t(m_Info->GetInfo<cl_ulong>(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_GLOBAL_MEM_SIZE));
m_MaxAllocSize = size_t(m_Info.GetInfo<cl_ulong>(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_MAX_MEM_ALLOC_SIZE)); m_MaxAllocSize = size_t(m_Info->GetInfo<cl_ulong>(m_PlatformIndex, m_DeviceIndex, CL_DEVICE_MAX_MEM_ALLOC_SIZE));
m_Shared = shared; m_Shared = shared;
m_Init = true;//Command queue is ok, it's now ok to begin building and running programs. 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); 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; return false;
NamedBuffer nb(buff, name); NamedBuffer nb(buff, name);
m_Buffers.push_back(nb); m_Buffers.push_back(nb);
} }
else if (GetBufferSize(bufferIndex) != size)//If it did exist, only create and add if the sizes were different. 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. 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. 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; return false;
NamedBuffer nb(buff, name);//Make a named buffer out of the new buffer. NamedBuffer nb(buff, name);//Make a named buffer out of the new buffer.
m_Buffers[bufferIndex] = nb;//Finally, assign. 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; 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) bool OpenCLWrapper::WriteBuffer(const string& name, void* data, size_t size)
{ {
int bufferIndex = FindBufferIndex(name); int bufferIndex = FindBufferIndex(name);
return bufferIndex != -1 ? WriteBuffer(bufferIndex, data, size) : false; 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::Event e;
cl_int err = m_Queue.enqueueWriteBuffer(m_Buffers[bufferIndex].m_Buffer, CL_TRUE, 0, size, data, nullptr, &e); cl_int err = m_Queue.enqueueWriteBuffer(m_Buffers[bufferIndex].m_Buffer, CL_TRUE, 0, size, data, nullptr, &e);
e.wait(); e.wait();
m_Queue.finish(); m_Queue.finish();
if (m_Info.CheckCL(err, "cl::CommandQueue::enqueueWriteBuffer()")) if (m_Info->CheckCL(err, "cl::CommandQueue::enqueueWriteBuffer()"))
return true; 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) bool OpenCLWrapper::ReadBuffer(const string& name, void* data, size_t size)
{ {
int bufferIndex = FindBufferIndex(name); int bufferIndex = FindBufferIndex(name);
return bufferIndex != -1 ? ReadBuffer(bufferIndex, data, size) : false; 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::Event e;
cl_int err = m_Queue.enqueueReadBuffer(m_Buffers[bufferIndex].m_Buffer, CL_TRUE, 0, size, data, nullptr, &e); cl_int err = m_Queue.enqueueReadBuffer(m_Buffers[bufferIndex].m_Buffer, CL_TRUE, 0, size, data, nullptr, &e);
e.wait(); e.wait();
m_Queue.finish(); m_Queue.finish();
if (m_Info.CheckCL(err, "cl::CommandQueue::enqueueReadBuffer()")) if (m_Info->CheckCL(err, "cl::CommandQueue::enqueueReadBuffer()"))
return true; return true;
} }
@ -287,7 +278,6 @@ int OpenCLWrapper::FindBufferIndex(const string& name)
size_t OpenCLWrapper::GetBufferSize(const string& name) size_t OpenCLWrapper::GetBufferSize(const string& name)
{ {
int bufferIndex = FindBufferIndex(name); int bufferIndex = FindBufferIndex(name);
return bufferIndex != -1 ? GetBufferSize(bufferIndex) : 0; 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); IMAGEGL2D imageGL(m_Context, flags, GL_TEXTURE_2D, 0, texName, &err);
NamedImage2DGL namedImageGL(imageGL, name); NamedImage2DGL namedImageGL(imageGL, name);
if (m_Info.CheckCL(err, "cl::ImageGL()")) if (m_Info->CheckCL(err, "cl::ImageGL()"))
{ {
m_GLImages.push_back(namedImageGL); 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); 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); m_Images.push_back(namedImage);
return true; 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. 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; 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)) 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. 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); 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; m_Images[imageIndex] = namedImage;
return true; return true;
@ -432,11 +421,9 @@ bool OpenCLWrapper::WriteImage2D(size_t index, bool shared, ::size_t width, ::si
cl_int err; cl_int err;
cl::Event e; cl::Event e;
cl::size_t<3> origin, region; cl::size_t<3> origin, region;
origin[0] = 0; origin[0] = 0;
origin[1] = 0; origin[1] = 0;
origin[2] = 0; origin[2] = 0;
region[0] = width; region[0] = width;
region[1] = height; region[1] = height;
region[2] = 1; 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); err = m_Queue.enqueueWriteImage(imageGL, CL_TRUE, origin, region, row_pitch, 0, data, nullptr, &e);
e.wait(); e.wait();
m_Queue.finish(); m_Queue.finish();
bool b = EnqueueReleaseGLObjects(imageGL); 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()) 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); err = m_Queue.enqueueWriteImage(m_Images[index].m_Image, CL_TRUE, origin, region, row_pitch, 0, data, nullptr, &e);
e.wait(); e.wait();
m_Queue.finish(); 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_int err;
cl::Event e; cl::Event e;
cl::size_t<3> origin, region; cl::size_t<3> origin, region;
origin[0] = 0; origin[0] = 0;
origin[1] = 0; origin[1] = 0;
origin[2] = 0; origin[2] = 0;
region[0] = width; region[0] = width;
region[1] = height; region[1] = height;
region[2] = 1; 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); err = m_Queue.enqueueReadImage(m_GLImages[imageIndex].m_Image, true, origin, region, row_pitch, 0, data);
bool b = EnqueueReleaseGLObjects(m_GLImages[imageIndex].m_Image); 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()) else if (!shared && imageIndex < m_Images.size())
{ {
err = m_Queue.enqueueReadImage(m_Images[imageIndex].m_Image, true, origin, region, row_pitch, 0, data); 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()) if (shared && imageIndex < m_GLImages.size())
{ {
vector<cl::Memory> images; vector<cl::Memory> images;
images.push_back(m_GLImages[imageIndex].m_Image); images.push_back(m_GLImages[imageIndex].m_Image);
IMAGEGL2D image = 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) 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<CL_IMAGE_FORMAT>(nullptr); cl_image_format tempFormat = image.getImageInfo<CL_IMAGE_FORMAT>(nullptr);
return (/*image.getImageInfo<CL_MEM_FLAGS>() == flags &&*/ return (/*image.getImageInfo<CL_MEM_FLAGS>() == flags &&*/
tempFormat.image_channel_data_type == format.image_channel_data_type && tempFormat.image_channel_data_type == format.image_channel_data_type &&
tempFormat.image_channel_order == format.image_channel_order && tempFormat.image_channel_order == format.image_channel_order &&
image.getImageInfo<CL_IMAGE_WIDTH>(nullptr) == width && image.getImageInfo<CL_IMAGE_WIDTH>(nullptr) == width &&
image.getImageInfo<CL_IMAGE_HEIGHT>(nullptr) == height/* && image.getImageInfo<CL_IMAGE_HEIGHT>(nullptr) == height/* &&
image.getImageInfo<CL_IMAGE_ROW_PITCH>() == row_pitch*/);//Pitch will be (width * bytes per pixel) + padding. image.getImageInfo<CL_IMAGE_ROW_PITCH>() == 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) if (m_Init)
{ {
cl_int err; cl_int err;
image2D = cl::Image2D(m_Context, image2D = cl::Image2D(m_Context,
flags, flags,
format, format,
width, width,
height, height,
row_pitch, row_pitch,
data, data,
&err); &err);
return m_Info->CheckCL(err, "cl::Image2D()");
return m_Info.CheckCL(err, "cl::Image2D()");
} }
return false; return false;
@ -687,15 +667,13 @@ bool OpenCLWrapper::CreateImage2DGL(IMAGEGL2D& image2DGL, cl_mem_flags flags, GL
if (m_Init) if (m_Init)
{ {
cl_int err; cl_int err;
image2DGL = IMAGEGL2D(m_Context, image2DGL = IMAGEGL2D(m_Context,
flags, flags,
target, target,
miplevel, miplevel,
texobj, texobj,
&err); &err);
return m_Info->CheckCL(err, "cl::ImageGL()");
return m_Info.CheckCL(err, "cl::ImageGL()");
} }
return false; return false;
@ -726,11 +704,10 @@ bool OpenCLWrapper::EnqueueAcquireGLObjects(IMAGEGL2D& image)
if (m_Init && m_Shared) if (m_Init && m_Shared)
{ {
vector<cl::Memory> images; vector<cl::Memory> images;
images.push_back(image); images.push_back(image);
cl_int err = m_Queue.enqueueAcquireGLObjects(&images); cl_int err = m_Queue.enqueueAcquireGLObjects(&images);
m_Queue.finish(); m_Queue.finish();
return m_Info.CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()"); return m_Info->CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()");
} }
return false; return false;
@ -761,11 +738,10 @@ bool OpenCLWrapper::EnqueueReleaseGLObjects(IMAGEGL2D& image)
if (m_Init && m_Shared) if (m_Init && m_Shared)
{ {
vector<cl::Memory> images; vector<cl::Memory> images;
images.push_back(image); images.push_back(image);
cl_int err = m_Queue.enqueueReleaseGLObjects(&images); cl_int err = m_Queue.enqueueReleaseGLObjects(&images);
m_Queue.finish(); m_Queue.finish();
return m_Info.CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()"); return m_Info->CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()");
} }
return false; return false;
@ -781,9 +757,8 @@ bool OpenCLWrapper::EnqueueAcquireGLObjects(const VECTOR_CLASS<cl::Memory>* memO
if (m_Init && m_Shared) if (m_Init && m_Shared)
{ {
cl_int err = m_Queue.enqueueAcquireGLObjects(memObjects); cl_int err = m_Queue.enqueueAcquireGLObjects(memObjects);
m_Queue.finish(); m_Queue.finish();
return m_Info.CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()"); return m_Info->CheckCL(err, "cl::CommandQueue::enqueueAcquireGLObjects()");
} }
return false; return false;
@ -799,9 +774,8 @@ bool OpenCLWrapper::EnqueueReleaseGLObjects(const VECTOR_CLASS<cl::Memory>* memO
if (m_Init && m_Shared) if (m_Init && m_Shared)
{ {
cl_int err = m_Queue.enqueueReleaseGLObjects(memObjects); cl_int err = m_Queue.enqueueReleaseGLObjects(memObjects);
m_Queue.finish(); m_Queue.finish();
return m_Info.CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()"); return m_Info->CheckCL(err, "cl::CommandQueue::enqueueReleaseGLObjects()");
} }
return false; return false;
@ -818,14 +792,12 @@ bool OpenCLWrapper::EnqueueReleaseGLObjects(const VECTOR_CLASS<cl::Memory>* memO
bool OpenCLWrapper::CreateSampler(cl::Sampler& sampler, cl_bool normalizedCoords, cl_addressing_mode addressingMode, cl_filter_mode filterMode) bool OpenCLWrapper::CreateSampler(cl::Sampler& sampler, cl_bool normalizedCoords, cl_addressing_mode addressingMode, cl_filter_mode filterMode)
{ {
cl_int err; cl_int err;
sampler = cl::Sampler(m_Context, sampler = cl::Sampler(m_Context,
normalizedCoords, normalizedCoords,
addressingMode, addressingMode,
filterMode, filterMode,
&err); &err);
return m_Info->CheckCL(err, "cl::Sampler()");
return m_Info.CheckCL(err, "cl::Sampler()");
} }
/// <summary> /// <summary>
@ -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) bool OpenCLWrapper::SetBufferArg(size_t kernelIndex, cl_uint argIndex, const string& name)
{ {
int bufferIndex = OpenCLWrapper::FindBufferIndex(name); int bufferIndex = OpenCLWrapper::FindBufferIndex(name);
return bufferIndex != -1 ? SetBufferArg(kernelIndex, argIndex, bufferIndex) : false; 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()) if (shared && imageIndex < m_GLImages.size())
{ {
err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, m_GLImages[imageIndex].m_Image); 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()) else if (!shared && imageIndex < m_Images.size())
{ {
err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, m_Images[imageIndex].m_Image); 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)
/// <param name="blockDepth">Depth of each block</param> /// <param name="blockDepth">Depth of each block</param>
/// <returns>True if success, else false.</returns> /// <returns>True if success, else false.</returns>
bool OpenCLWrapper::RunKernel(size_t kernelIndex, size_t totalGridWidth, size_t totalGridHeight, size_t totalGridDepth, 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()) if (m_Init && kernelIndex < m_Programs.size())
{ {
cl::Event e; cl::Event e;
cl_int err = m_Queue.enqueueNDRangeKernel(m_Programs[kernelIndex].m_Kernel, cl_int err = m_Queue.enqueueNDRangeKernel(m_Programs[kernelIndex].m_Kernel,
cl::NullRange, cl::NullRange,
cl::NDRange(totalGridWidth, totalGridHeight, totalGridDepth), cl::NDRange(totalGridWidth, totalGridHeight, totalGridDepth),
cl::NDRange(blockWidth, blockHeight, blockDepth), cl::NDRange(blockWidth, blockHeight, blockDepth),
nullptr, nullptr,
&e); &e);
e.wait(); e.wait();
m_Queue.finish(); m_Queue.finish();
return m_Info.CheckCL(err, "cl::CommandQueue::enqueueNDRangeKernel()"); return m_Info->CheckCL(err, "cl::CommandQueue::enqueueNDRangeKernel()");
} }
return false; return false;
@ -963,7 +933,7 @@ bool OpenCLWrapper::Shared() const { return m_Shared; }
const cl::Context& OpenCLWrapper::Context() const { return m_Context; } const cl::Context& OpenCLWrapper::Context() const { return m_Context; }
size_t OpenCLWrapper::PlatformIndex() const { return m_PlatformIndex; } size_t OpenCLWrapper::PlatformIndex() const { return m_PlatformIndex; }
size_t OpenCLWrapper::DeviceIndex() const { return m_DeviceIndex; } 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::LocalMemSize() const { return m_LocalMemSize; }
size_t OpenCLWrapper::GlobalMemSize() const { return m_GlobalMemSize; } size_t OpenCLWrapper::GlobalMemSize() const { return m_GlobalMemSize; }
size_t OpenCLWrapper::MaxAllocSize() const { return m_MaxAllocSize; } 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) if (m_Init)
{ {
cl_int err; cl_int err;
spk.m_Name = name; spk.m_Name = name;
spk.m_Source = cl::Program::Sources(1, std::make_pair(program.c_str(), program.length() + 1)); 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); 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. err = spk.m_Program.build(m_DeviceVec, "-cl-mad-enable");//Tinker with other options later.
else 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-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. //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); 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. return true;//Everything is ok.
} }
else else

View File

@ -9,11 +9,7 @@
namespace EmberCLns namespace EmberCLns
{ {
#if CL_VERSION_1_2
#define IMAGEGL2D cl::ImageGL #define IMAGEGL2D cl::ImageGL
#else
#define IMAGEGL2D cl::Image2DGL
#endif
/// <summary> /// <summary>
/// Class to contain all of the things needed to store an OpenCL program. /// 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()) if (m_Init && kernelIndex < m_Programs.size())
{ {
cl_int err = m_Programs[kernelIndex].m_Kernel.setArg(argIndex, arg); 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; return false;
@ -201,7 +196,7 @@ private:
cl::Context m_Context; cl::Context m_Context;
cl::Device m_Device; cl::Device m_Device;
cl::CommandQueue m_Queue; cl::CommandQueue m_Queue;
OpenCLInfo& m_Info; shared_ptr<OpenCLInfo> m_Info;
std::vector<cl::Device> m_DeviceVec; std::vector<cl::Device> m_DeviceVec;
std::vector<Spk> m_Programs; std::vector<Spk> m_Programs;
std::vector<NamedBuffer> m_Buffers; std::vector<NamedBuffer> m_Buffers;

View File

@ -41,11 +41,11 @@ void RendererCL<T, bucketT>::Init()
m_Init = false; m_Init = false;
m_DoublePrecision = typeid(T) == typeid(double); m_DoublePrecision = typeid(T) == typeid(double);
m_NumChannels = 4; m_NumChannels = 4;
//Buffer names. //Buffer names.
m_EmberBufferName = "Ember"; m_EmberBufferName = "Ember";
m_XformsBufferName = "Xforms"; m_XformsBufferName = "Xforms";
m_ParVarsBufferName = "ParVars"; m_ParVarsBufferName = "ParVars";
m_GlobalSharedBufferName = "GlobalShared";
m_SeedsBufferName = "Seeds"; m_SeedsBufferName = "Seeds";
m_DistBufferName = "Dist"; m_DistBufferName = "Dist";
m_CarToRasBufferName = "CarToRas"; m_CarToRasBufferName = "CarToRas";
@ -60,7 +60,6 @@ void RendererCL<T, bucketT>::Init()
m_AccumBufferName = "Accum"; m_AccumBufferName = "Accum";
m_FinalImageName = "Final"; m_FinalImageName = "Final";
m_PointsBufferName = "Points"; m_PointsBufferName = "Points";
//It's critical that these numbers never change. They are //It's critical that these numbers never change. They are
//based on the cuburn model of each kernel launch containing //based on the cuburn model of each kernel launch containing
//256 threads. 32 wide by 8 high. Everything done in the OpenCL //256 threads. 32 wide by 8 high. Everything done in the OpenCL
@ -70,7 +69,6 @@ void RendererCL<T, bucketT>::Init()
m_IterBlockHeight = 8; m_IterBlockHeight = 8;
m_IterBlocksWide = 64; m_IterBlocksWide = 64;
m_IterBlocksHigh = 2; m_IterBlocksHigh = 2;
m_PaletteFormat.image_channel_order = CL_RGBA; m_PaletteFormat.image_channel_order = CL_RGBA;
m_PaletteFormat.image_channel_data_type = CL_FLOAT; m_PaletteFormat.image_channel_data_type = CL_FLOAT;
m_FinalFormat.image_channel_order = CL_RGBA; m_FinalFormat.image_channel_order = CL_RGBA;
@ -111,11 +109,11 @@ bool RendererCL<T, bucketT>::Init(const vector<pair<size_t, size_t>>& devices, b
auto& zeroizeProgram = m_IterOpenCLKernelCreator.ZeroizeKernel(); auto& zeroizeProgram = m_IterOpenCLKernelCreator.ZeroizeKernel();
auto& sumHistProgram = m_IterOpenCLKernelCreator.SumHistKernel(); auto& sumHistProgram = m_IterOpenCLKernelCreator.SumHistKernel();
ostringstream os; ostringstream os;
m_Init = false; m_Init = false;
m_Devices.clear(); m_Devices.clear();
m_Devices.reserve(devices.size()); m_Devices.reserve(devices.size());
m_OutputTexID = outputTexID; 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++) for (size_t i = 0; i < devices.size(); i++)
{ {
@ -126,8 +124,11 @@ bool RendererCL<T, bucketT>::Init(const vector<pair<size_t, size_t>>& devices, b
if ((b = cld->Init()))//Build a simple program to ensure OpenCL is working right. 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.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.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) 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. 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<T, bucketT>::Init(const vector<pair<size_t, size_t>>& devices, b
{ {
auto& firstWrapper = m_Devices[0]->m_Wrapper; auto& firstWrapper = m_Devices[0]->m_Wrapper;
m_DEOpenCLKernelCreator = DEOpenCLKernelCreator(m_DoublePrecision, m_Devices[0]->Nvidia()); m_DEOpenCLKernelCreator = DEOpenCLKernelCreator(m_DoublePrecision, m_Devices[0]->Nvidia());
//Build a simple program to ensure OpenCL is working right. //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_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 && !(b = firstWrapper.AddProgram(m_IterOpenCLKernelCreator.SumHistEntryPoint(), sumHistProgram, m_IterOpenCLKernelCreator.SumHistEntryPoint(), m_DoublePrecision))) { AddToReport(loc); }
if (b) if (b)
@ -170,7 +172,6 @@ bool RendererCL<T, bucketT>::Init(const vector<pair<size_t, size_t>>& devices, b
//AMD is further limited because of less local memory so these have to be 16 on AMD. //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_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; m_MaxDEBlockSizeH = m_Devices[0]->Nvidia() ? 24 : 16;
FillSeeds(); FillSeeds();
for (size_t device = 0; device < m_Devices.size(); device++) for (size_t device = 0; device < m_Devices.size(); device++)
@ -533,7 +534,9 @@ bool RendererCL<T, bucketT>::CreateDEFilter(bool& newAlloc)
auto& wrapper = m_Devices[0]->m_Wrapper; auto& wrapper = m_Devices[0]->m_Wrapper;
if (b && !(b = wrapper.AddAndWriteBuffer(m_DECoefsBufferName, reinterpret_cast<void*>(const_cast<bucketT*>(m_DensityFilter->Coefs())), m_DensityFilter->CoefsSizeBytes()))) { AddToReport(loc); } if (b && !(b = wrapper.AddAndWriteBuffer(m_DECoefsBufferName, reinterpret_cast<void*>(const_cast<bucketT*>(m_DensityFilter->Coefs())), m_DensityFilter->CoefsSizeBytes()))) { AddToReport(loc); }
if (b && !(b = wrapper.AddAndWriteBuffer(m_DEWidthsBufferName, reinterpret_cast<void*>(const_cast<bucketT*>(m_DensityFilter->Widths())), m_DensityFilter->WidthsSizeBytes()))) { AddToReport(loc); } if (b && !(b = wrapper.AddAndWriteBuffer(m_DEWidthsBufferName, reinterpret_cast<void*>(const_cast<bucketT*>(m_DensityFilter->Widths())), m_DensityFilter->WidthsSizeBytes()))) { AddToReport(loc); }
if (b && !(b = wrapper.AddAndWriteBuffer(m_DECoefIndicesBufferName, reinterpret_cast<void*>(const_cast<uint*>(m_DensityFilter->CoefIndices())), m_DensityFilter->CoefsIndicesSizeBytes()))) { AddToReport(loc); } if (b && !(b = wrapper.AddAndWriteBuffer(m_DECoefIndicesBufferName, reinterpret_cast<void*>(const_cast<uint*>(m_DensityFilter->CoefIndices())), m_DensityFilter->CoefsIndicesSizeBytes()))) { AddToReport(loc); }
} }
} }
@ -606,7 +609,7 @@ vector<string> RendererCL<T, bucketT>::ErrorReport()
auto s = device->m_Wrapper.ErrorReport(); auto s = device->m_Wrapper.ErrorReport();
ours.insert(ours.end(), s.begin(), s.end()); ours.insert(ours.end(), s.begin(), s.end());
} }
return ours; return ours;
} }
@ -655,28 +658,37 @@ bool RendererCL<T, bucketT>::Alloc(bool histOnly)
EnterResize(); EnterResize();
m_XformsCL.resize(m_Ember.TotalXformCount()); m_XformsCL.resize(m_Ember.TotalXformCount());
bool b = true; bool b = true;
size_t histLength = SuperSize() * sizeof(v4bT); size_t histLength = SuperSize() * sizeof(v4bT);
size_t accumLength = SuperSize() * sizeof(v4bT); size_t accumLength = SuperSize() * sizeof(v4bT);
const char* loc = __FUNCTION__; const char* loc = __FUNCTION__;
auto& wrapper = m_Devices[0]->m_Wrapper; 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_DEFilterParamsBufferName, sizeof(m_DensityFilterCL)))) { AddToReport(loc); }
if (b && !(b = wrapper.AddBuffer(m_SpatialFilterParamsBufferName, sizeof(m_SpatialFilterCL)))) { 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_CurvesCsaName, SizeOf(m_Csa.m_Entries)))) { AddToReport(loc); }
if (b && !(b = wrapper.AddBuffer(m_AccumBufferName, accumLength))) { AddToReport(loc); }//Accum buffer. if (b && !(b = wrapper.AddBuffer(m_AccumBufferName, accumLength))) { AddToReport(loc); }//Accum buffer.
for (auto& device : m_Devices) 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_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_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_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_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_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_HistBufferName, histLength))) { AddToReport(loc); break; }//Histogram. Will memset to zero later.
if (b && !(b = device->m_Wrapper.AddBuffer(m_PointsBufferName, IterGridKernelCount() * sizeof(PointCL<T>)))) { AddToReport(loc); break; }//Points between iter calls. if (b && !(b = device->m_Wrapper.AddBuffer(m_PointsBufferName, IterGridKernelCount() * sizeof(PointCL<T>)))) { AddToReport(loc); break; }//Points between iter calls.
//Global shared is allocated once and written when building the kernel.
} }
LeaveResize(); LeaveResize();
@ -739,12 +751,9 @@ eRenderStatus RendererCL<T, bucketT>::GaussianDensityFilter()
//} //}
//else //else
// return RENDER_ERROR; // return RENDER_ERROR;
//Timing t(4); //Timing t(4);
eRenderStatus status = RunDensityFilter(); eRenderStatus status = RunDensityFilter();
//t.Toc(__FUNCTION__ " RunKernel()"); //t.Toc(__FUNCTION__ " RunKernel()");
return status; return status;
} }
@ -802,36 +811,41 @@ EmberStats RendererCL<T, bucketT>::Iterate(size_t iterCount, size_t temporalSamp
if (IterOpenCLKernelCreator<T>::IsBuildRequired(m_Ember, m_LastBuiltEmber)) if (IterOpenCLKernelCreator<T>::IsBuildRequired(m_Ember, m_LastBuiltEmber))
b = BuildIterProgramForEmber(true); b = BuildIterProgramForEmber(true);
//Setup buffers on all devices. if (b)
for (auto& device : m_Devices)
{ {
auto& wrapper = device->m_Wrapper; //Setup buffers on all devices.
for (auto& device : m_Devices)
if (b && !(b = wrapper.WriteBuffer (m_EmberBufferName, reinterpret_cast<void*>(&m_EmberCL), sizeof(m_EmberCL)))) { AddToReport(loc); }
if (b && !(b = wrapper.WriteBuffer (m_XformsBufferName, reinterpret_cast<void*>(m_XformsCL.data()), sizeof(m_XformsCL[0]) * m_XformsCL.size()))) { AddToReport(loc); }
if (b && !(b = wrapper.AddAndWriteBuffer(m_DistBufferName, reinterpret_cast<void*>(const_cast<byte*>(XformDistributions())), XformDistributionsSize()))) { AddToReport(loc); }//Will be resized for xaos.
if (b && !(b = wrapper.WriteBuffer (m_CarToRasBufferName, reinterpret_cast<void*>(&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)
{ {
IterOpenCLKernelCreator<T>::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. if (b && !(b = wrapper.WriteBuffer(m_EmberBufferName, reinterpret_cast<void*>(&m_EmberCL), sizeof(m_EmberCL))))
//So set it up right before the run. break;
if (!m_Params.second.empty())
if (b && !(b = wrapper.WriteBuffer(m_XformsBufferName, reinterpret_cast<void*>(m_XformsCL.data()), sizeof(m_XformsCL[0]) * m_XformsCL.size())))
break;
if (b && !(b = wrapper.AddAndWriteBuffer(m_DistBufferName, reinterpret_cast<void*>(const_cast<byte*>(XformDistributions())), XformDistributionsSize())))//Will be resized for xaos.
break;
if (b && !(b = wrapper.WriteBuffer(m_CarToRasBufferName, reinterpret_cast<void*>(&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]))) IterOpenCLKernelCreator<T>::ParVarIndexDefines(m_Ember, m_Params, true, false);//Always do this to get the values (but no string), regardless of whether a rebuild is necessary.
{
m_Abort = true; //Don't know the size of the parametric varations parameters buffer until the ember is examined.
AddToReport(loc); //So set it up right before the run.
return stats; 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<T, bucketT>::BuildIterProgramForEmber(bool doAccum)
bool b = !m_Devices.empty(); bool b = !m_Devices.empty();
const char* loc = __FUNCTION__; const char* loc = __FUNCTION__;
IterOpenCLKernelCreator<T>::ParVarIndexDefines(m_Ember, m_Params, false, true);//Do with string and no vals. IterOpenCLKernelCreator<T>::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); IterOpenCLKernelCreator<T>::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.
//cout << "Building: " << endl << iterProgram << endl;
vector<std::thread> threads;
std::function<void(RendererClDevice*)> 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();
if (b) if (b)
{ {
//t.Toc(__FUNCTION__ " program build"); m_IterKernel = m_IterOpenCLKernelCreator.CreateIterKernelString(m_Ember, m_Params.first, m_GlobalShared.first, m_LockAccum, doAccum);
//cout << string(loc) << "():\nBuilding the following program succeeded: \n" << iterProgram << endl; //cout << "Building: " << endl << iterProgram << endl;
m_LastBuiltEmber = m_Ember; vector<std::thread> threads;
std::function<void(RendererClDevice*)> 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; return b;
@ -935,7 +963,6 @@ bool RendererCL<T, bucketT>::RunIter(size_t iterCount, size_t temporalSample, si
std::atomic<size_t> atomLaunchesRan; std::atomic<size_t> atomLaunchesRan;
std::atomic<intmax_t> atomItersRan, atomItersRemaining; std::atomic<intmax_t> atomItersRan, atomItersRemaining;
size_t adjustedIterCountPerKernel = m_IterCountPerKernel; size_t adjustedIterCountPerKernel = m_IterCountPerKernel;
itersRan = 0; itersRan = 0;
atomItersRan.store(0); atomItersRan.store(0);
atomItersRemaining.store(iterCount); atomItersRemaining.store(iterCount);
@ -954,11 +981,9 @@ bool RendererCL<T, bucketT>::RunIter(size_t iterCount, size_t temporalSample, si
} }
size_t fuseFreq = Renderer<T, bucketT>::SubBatchSize() / adjustedIterCountPerKernel;//Use the base sbs to determine when to fuse. size_t fuseFreq = Renderer<T, bucketT>::SubBatchSize() / adjustedIterCountPerKernel;//Use the base sbs to determine when to fuse.
#ifdef TEST_CL #ifdef TEST_CL
m_Abort = false; m_Abort = false;
#endif #endif
std::function<void(size_t, int)> iterFunc = [&](size_t dev, int kernelIndex) std::function<void(size_t, int)> iterFunc = [&](size_t dev, int kernelIndex)
{ {
bool b = true; bool b = true;
@ -979,18 +1004,31 @@ bool RendererCL<T, bucketT>::RunIter(size_t iterCount, size_t temporalSample, si
size_t iterCountThisLaunch = iterCountPerKernel * IterGridKernelWidth() * IterGridKernelHeight(); size_t iterCountThisLaunch = iterCountPerKernel * IterGridKernelWidth() * IterGridKernelHeight();
//cout << "itersRemaining " << itersRemaining << ", iterCountPerKernel " << iterCountPerKernel << ", iterCountThisLaunch " << iterCountThisLaunch << endl; //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++, 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.SetArg (kernelIndex, argIndex++, fuse))) { AddToReport(loc); }//Number of iters to fuse.
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_SeedsBufferName))) { AddToReport(loc); }//Seeds.
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_EmberBufferName))) { AddToReport(loc); }//Ember.
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.SetBufferArg(kernelIndex, argIndex++, m_XformsBufferName))) { AddToReport(loc); }//Xforms.
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_ParVarsBufferName))) { AddToReport(loc); }//Parametric variation parameters.
if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_PointsBufferName))) { AddToReport(loc); }//Random start points.
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, if (b && !(b = wrapper.RunKernel(kernelIndex,
IterGridKernelWidth(),//Total grid dims. IterGridKernelWidth(),//Total grid dims.
@ -1014,17 +1052,16 @@ bool RendererCL<T, bucketT>::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. 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 percent = 100.0 *
double double
( (
double double
( (
double double
( (
double(m_LastIter + atomItersRan.load()) / double(ItersPerTemporalSample()) double(m_LastIter + atomItersRan.load()) / double(ItersPerTemporalSample())
) + temporalSample ) + temporalSample
) / double(TemporalSamples()) ) / double(TemporalSamples())
); );
double percentDiff = percent - m_LastIterPercent; double percentDiff = percent - m_LastIterPercent;
double toc = m_ProgressTimer.Toc(); double toc = m_ProgressTimer.Toc();
@ -1072,7 +1109,7 @@ bool RendererCL<T, bucketT>::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 (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... 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. 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<T, bucketT>::RunLogScaleFilter()
size_t blockH = 4;//A height of 4 seems to run the fastest. size_t blockH = 4;//A height of 4 seems to run the fastest.
size_t gridW = m_DensityFilterCL.m_SuperRasW; size_t gridW = m_DensityFilterCL.m_SuperRasW;
size_t gridH = m_DensityFilterCL.m_SuperRasH; size_t gridH = m_DensityFilterCL.m_SuperRasH;
OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH);
if (b && !(b = wrapper.AddAndWriteBuffer(m_DEFilterParamsBufferName, reinterpret_cast<void*>(&m_DensityFilterCL), sizeof(m_DensityFilterCL)))) { AddToReport(loc); } if (b && !(b = wrapper.AddAndWriteBuffer(m_DEFilterParamsBufferName, reinterpret_cast<void*>(&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_HistBufferName))) { AddToReport(loc); }//Histogram.
if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_AccumBufferName))) { AddToReport(loc); }//Accumulator. if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_AccumBufferName))) { AddToReport(loc); }//Accumulator.
if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_DEFilterParamsBufferName))) { AddToReport(loc); }//DensityFilterCL. if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_DEFilterParamsBufferName))) { AddToReport(loc); }//DensityFilterCL.
//t.Tic(); //t.Tic();
if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); } if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); }
//t.Toc(loc); //t.Toc(loc);
} }
else else
@ -1164,7 +1203,6 @@ eRenderStatus RendererCL<T, bucketT>::RunDensityFilter()
//Can't just blindly pass dimension in vals. Must adjust them first to evenly divide the block count //Can't just blindly pass dimension in vals. Must adjust them first to evenly divide the block count
//into the total grid dimensions. //into the total grid dimensions.
OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH); OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH);
//t.Tic(); //t.Tic();
//The classic problem with performing DE on adjacent pixels is that the filter will overlap. //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. //This can be solved in 2 ways. One is to use atomics, which is unacceptably slow.
@ -1188,7 +1226,6 @@ eRenderStatus RendererCL<T, bucketT>::RunDensityFilter()
gapH = (uint)ceil((m_DensityFilterCL.m_FilterWidth * 2.0) / (double)32);//Block height is 1, but iterates over 32 rows. gapH = (uint)ceil((m_DensityFilterCL.m_FilterWidth * 2.0) / (double)32);//Block height is 1, but iterates over 32 rows.
chunkSizeH = gapH + 1; chunkSizeH = gapH + 1;
totalChunks = chunkSizeW * chunkSizeH; totalChunks = chunkSizeW * chunkSizeH;
OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH); OpenCLWrapper::MakeEvenGridDims(blockSizeW, blockSizeH, gridW, gridH);
gridW /= chunkSizeW; gridW /= chunkSizeW;
gridH /= chunkSizeH; gridH /= chunkSizeH;
@ -1199,6 +1236,7 @@ eRenderStatus RendererCL<T, bucketT>::RunDensityFilter()
{ {
//t2.Tic(); //t2.Tic();
if (b && !(b = RunDensityFilterPrivate(kernelIndex, gridW, gridH, blockSizeW, blockSizeH, chunkSizeW, chunkSizeH, colChunk, rowChunk))) { m_Abort = true; AddToReport(loc); } if (b && !(b = RunDensityFilterPrivate(kernelIndex, gridW, gridH, blockSizeW, blockSizeH, chunkSizeW, chunkSizeH, colChunk, rowChunk))) { m_Abort = true; AddToReport(loc); }
//t2.Toc(loc); //t2.Toc(loc);
if (b && m_Callback) if (b && m_Callback)
@ -1211,6 +1249,7 @@ eRenderStatus RendererCL<T, bucketT>::RunDensityFilter()
} }
} }
} }
#else #else
gridW /= chunkSizeW; gridW /= chunkSizeW;
gridH /= chunkSizeH; gridH /= chunkSizeH;
@ -1222,6 +1261,7 @@ eRenderStatus RendererCL<T, bucketT>::RunDensityFilter()
{ {
//t2.Tic(); //t2.Tic();
if (b && !(b = RunDensityFilterPrivate(kernelIndex, gridW, gridH, blockSizeW, blockSizeH, chunkSizeW, chunkSizeH, colChunk, rowChunk))) { m_Abort = true; AddToReport(loc); } if (b && !(b = RunDensityFilterPrivate(kernelIndex, gridW, gridH, blockSizeW, blockSizeH, chunkSizeW, chunkSizeH, colChunk, rowChunk))) { m_Abort = true; AddToReport(loc); }
//t2.Toc(loc); //t2.Toc(loc);
if (b && m_Callback) if (b && m_Callback)
@ -1234,6 +1274,7 @@ eRenderStatus RendererCL<T, bucketT>::RunDensityFilter()
} }
} }
} }
#endif #endif
if (b && m_Callback) if (b && m_Callback)
@ -1273,11 +1314,11 @@ eRenderStatus RendererCL<T, bucketT>::RunFinalAccum()
if (!m_Abort && accumKernelIndex != -1) if (!m_Abort && accumKernelIndex != -1)
{ {
auto& wrapper = m_Devices[0]->m_Wrapper; auto& wrapper = m_Devices[0]->m_Wrapper;
//This is needed with or without early clip. //This is needed with or without early clip.
ConvertSpatialFilter(); ConvertSpatialFilter();
if (b && !(b = wrapper.AddAndWriteBuffer(m_SpatialFilterParamsBufferName, reinterpret_cast<void*>(&m_SpatialFilterCL), sizeof(m_SpatialFilterCL)))) { AddToReport(loc); } if (b && !(b = wrapper.AddAndWriteBuffer(m_SpatialFilterParamsBufferName, reinterpret_cast<void*>(&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); } 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, //Since early clip requires gamma correcting the entire accumulator first,
@ -1297,6 +1338,7 @@ eRenderStatus RendererCL<T, bucketT>::RunFinalAccum()
OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); 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_AccumBufferName))) { AddToReport(loc); }//Accumulator.
if (b && !(b = wrapper.SetBufferArg(gammaCorrectKernelIndex, argIndex++, m_SpatialFilterParamsBufferName))) { AddToReport(loc); }//SpatialFilterCL. 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); } if (b && !(b = wrapper.RunKernel(gammaCorrectKernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); }
@ -1316,13 +1358,19 @@ eRenderStatus RendererCL<T, bucketT>::RunFinalAccum()
OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH);
if (b && !(b = wrapper.SetBufferArg(accumKernelIndex, argIndex++, m_AccumBufferName))) { AddToReport(loc); }//Accumulator. 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.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_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_SpatialFilterCoefsBufferName))) { AddToReport(loc); }//Filter coefs.
if (b && !(b = wrapper.SetBufferArg(accumKernelIndex, argIndex++, m_CurvesCsaName))) { AddToReport(loc); }//Curve points. 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++, 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(alphaBase)))) { AddToReport(loc); }//Alpha base.
if (b && !(b = wrapper.SetArg (accumKernelIndex, argIndex++, bucketT(alphaScale)))) { AddToReport(loc); }//Alpha scale. if (b && !(b = wrapper.SetArg (accumKernelIndex, argIndex++, bucketT(alphaScale)))) { AddToReport(loc); }//Alpha scale.
if (b && wrapper.Shared()) if (b && wrapper.Shared())
@ -1371,13 +1419,15 @@ bool RendererCL<T, bucketT>::ClearBuffer(size_t device, const string& bufferName
size_t blockH = m_Devices[device]->Nvidia() ? 32 : 16; size_t blockH = m_Devices[device]->Nvidia() ? 32 : 16;
size_t gridW = width * elementSize; size_t gridW = width * elementSize;
size_t gridH = height; size_t gridH = height;
b = true; b = true;
OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH); OpenCLWrapper::MakeEvenGridDims(blockW, blockH, gridW, gridH);
if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, bufferName))) { AddToReport(loc); }//Buffer of byte. 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++, width * elementSize))) { AddToReport(loc); }//Width.
if (b && !(b = wrapper.SetArg(kernelIndex, argIndex++, height))) { AddToReport(loc); }//Height. 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); } if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); }
} }
else else
@ -1416,21 +1466,31 @@ bool RendererCL<T, bucketT>::RunDensityFilterPrivate(size_t kernelIndex, size_t
auto& wrapper = m_Devices[0]->m_Wrapper; 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_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_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_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_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_DEWidthsBufferName))) { AddToReport(loc); } argIndex++;//Widths.
if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex, m_DECoefIndicesBufferName))) { AddToReport(loc); } argIndex++;//Coef indices. 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, 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, 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, chunkW))) { AddToReport(loc); } argIndex++;//Column chunk.
if (b && !(b = wrapper.SetArg(kernelIndex, argIndex, chunkH))) { AddToReport(loc); } argIndex++;//Row chunk. if (b && !(b = wrapper.SetArg(kernelIndex, argIndex, chunkH))) { AddToReport(loc); } argIndex++;//Row chunk.
//t.Toc(__FUNCTION__ " set args"); //t.Toc(__FUNCTION__ " set args");
//t.Tic(); //t.Tic();
if (b && !(b = wrapper.RunKernel(kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { AddToReport(loc); }//Method 7, accumulating to temp box area. 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; return b;
} }
@ -1490,6 +1550,7 @@ int RendererCL<T, bucketT>::MakeAndGetFinalAccumProgram(double& alphaBase, doubl
if ((kernelIndex = wrapper.FindKernelIndex(finalAccumEntryPoint)) == -1)//Has not been built yet. if ((kernelIndex = wrapper.FindKernelIndex(finalAccumEntryPoint)) == -1)//Has not been built yet.
{ {
auto& kernel = m_FinalAccumOpenCLKernelCreator.FinalAccumKernel(EarlyClip(), Renderer<T, bucketT>::NumChannels(), Transparency()); auto& kernel = m_FinalAccumOpenCLKernelCreator.FinalAccumKernel(EarlyClip(), Renderer<T, bucketT>::NumChannels(), Transparency());
if (wrapper.AddProgram(finalAccumEntryPoint, kernel, finalAccumEntryPoint, m_DoublePrecision)) if (wrapper.AddProgram(finalAccumEntryPoint, kernel, finalAccumEntryPoint, m_DoublePrecision))
kernelIndex = wrapper.FindKernelIndex(finalAccumEntryPoint);//Try to find it again, it will be present if successfully built. kernelIndex = wrapper.FindKernelIndex(finalAccumEntryPoint);//Try to find it again, it will be present if successfully built.
else else
@ -1562,10 +1623,15 @@ bool RendererCL<T, bucketT>::SumDeviceHist()
cl_uint argIndex = 0; 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_AccumBufferName))) { break; }//Source buffer of v4bT.
if (b && !(b = wrapper.SetBufferArg(kernelIndex, argIndex++, m_HistBufferName))) { break; }//Dest 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(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++, 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.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; } if (b && !(b = wrapper.RunKernel (kernelIndex, gridW, gridH, 1, blockW, blockH, 1))) { break; }
} }
else else
@ -1579,11 +1645,10 @@ bool RendererCL<T, bucketT>::SumDeviceHist()
} }
} }
} }
if (!b) if (!b)
{ {
ostringstream os; ostringstream os;
os << loc << ": failed to sum histograms from the secondary device(s) to the primary device."; os << loc << ": failed to sum histograms from the secondary device(s) to the primary device.";
AddToReport(os.str()); AddToReport(os.str());
} }
@ -1639,7 +1704,6 @@ void RendererCL<T, bucketT>::ConvertSpatialFilter()
if (m_SpatialFilter.get()) if (m_SpatialFilter.get())
{ {
this->PrepFinalAccumVals(background, g, linRange, vibrancy); this->PrepFinalAccumVals(background, g, linRange, vibrancy);
m_SpatialFilterCL.m_SuperRasW = uint(SuperRasW()); m_SpatialFilterCL.m_SuperRasW = uint(SuperRasW());
m_SpatialFilterCL.m_SuperRasH = uint(SuperRasH()); m_SpatialFilterCL.m_SuperRasH = uint(SuperRasH());
m_SpatialFilterCL.m_FinalRasW = uint(FinalRasW()); m_SpatialFilterCL.m_FinalRasW = uint(FinalRasW());
@ -1670,7 +1734,6 @@ template <typename T, typename bucketT>
void RendererCL<T, bucketT>::ConvertEmber(Ember<T>& ember, EmberCL<T>& emberCL, vector<XformCL<T>>& xformsCL) void RendererCL<T, bucketT>::ConvertEmber(Ember<T>& ember, EmberCL<T>& emberCL, vector<XformCL<T>>& xformsCL)
{ {
memset(&emberCL, 0, sizeof(EmberCL<T>));//Might not really be needed. memset(&emberCL, 0, sizeof(EmberCL<T>));//Might not really be needed.
emberCL.m_RotA = m_RotMat.A(); emberCL.m_RotA = m_RotMat.A();
emberCL.m_RotB = m_RotMat.B(); emberCL.m_RotB = m_RotMat.B();
emberCL.m_RotD = m_RotMat.D(); emberCL.m_RotD = m_RotMat.D();
@ -1688,21 +1751,18 @@ void RendererCL<T, bucketT>::ConvertEmber(Ember<T>& ember, EmberCL<T>& emberCL,
for (size_t i = 0; i < ember.TotalXformCount() && i < xformsCL.size(); i++) for (size_t i = 0; i < ember.TotalXformCount() && i < xformsCL.size(); i++)
{ {
Xform<T>* xform = ember.GetTotalXform(i); Xform<T>* xform = ember.GetTotalXform(i);
xformsCL[i].m_A = xform->m_Affine.A(); xformsCL[i].m_A = xform->m_Affine.A();
xformsCL[i].m_B = xform->m_Affine.B(); xformsCL[i].m_B = xform->m_Affine.B();
xformsCL[i].m_C = xform->m_Affine.C(); xformsCL[i].m_C = xform->m_Affine.C();
xformsCL[i].m_D = xform->m_Affine.D(); xformsCL[i].m_D = xform->m_Affine.D();
xformsCL[i].m_E = xform->m_Affine.E(); xformsCL[i].m_E = xform->m_Affine.E();
xformsCL[i].m_F = xform->m_Affine.F(); xformsCL[i].m_F = xform->m_Affine.F();
xformsCL[i].m_PostA = xform->m_Post.A(); xformsCL[i].m_PostA = xform->m_Post.A();
xformsCL[i].m_PostB = xform->m_Post.B(); xformsCL[i].m_PostB = xform->m_Post.B();
xformsCL[i].m_PostC = xform->m_Post.C(); xformsCL[i].m_PostC = xform->m_Post.C();
xformsCL[i].m_PostD = xform->m_Post.D(); xformsCL[i].m_PostD = xform->m_Post.D();
xformsCL[i].m_PostE = xform->m_Post.E(); xformsCL[i].m_PostE = xform->m_Post.E();
xformsCL[i].m_PostF = xform->m_Post.F(); xformsCL[i].m_PostF = xform->m_Post.F();
xformsCL[i].m_DirectColor = xform->m_DirectColor; xformsCL[i].m_DirectColor = xform->m_DirectColor;
xformsCL[i].m_ColorSpeedCache = xform->ColorSpeedCache(); xformsCL[i].m_ColorSpeedCache = xform->ColorSpeedCache();
xformsCL[i].m_OneMinusColorCache = xform->OneMinusColorCache(); xformsCL[i].m_OneMinusColorCache = xform->OneMinusColorCache();

View File

@ -41,57 +41,57 @@ public:
template <typename T, typename bucketT> template <typename T, typename bucketT>
class EMBERCL_API RendererCL : public Renderer<T, bucketT>, public RendererCLBase class EMBERCL_API RendererCL : public Renderer<T, bucketT>, public RendererCLBase
{ {
using EmberNs::Renderer<T, bucketT>::RendererBase::Abort; using EmberNs::Renderer<T, bucketT>::RendererBase::Abort;
using EmberNs::Renderer<T, bucketT>::RendererBase::EarlyClip; using EmberNs::Renderer<T, bucketT>::RendererBase::EarlyClip;
using EmberNs::Renderer<T, bucketT>::RendererBase::Transparency; using EmberNs::Renderer<T, bucketT>::RendererBase::Transparency;
using EmberNs::Renderer<T, bucketT>::RendererBase::EnterResize; using EmberNs::Renderer<T, bucketT>::RendererBase::EnterResize;
using EmberNs::Renderer<T, bucketT>::RendererBase::LeaveResize; using EmberNs::Renderer<T, bucketT>::RendererBase::LeaveResize;
using EmberNs::Renderer<T, bucketT>::RendererBase::FinalRasW; using EmberNs::Renderer<T, bucketT>::RendererBase::FinalRasW;
using EmberNs::Renderer<T, bucketT>::RendererBase::FinalRasH; using EmberNs::Renderer<T, bucketT>::RendererBase::FinalRasH;
using EmberNs::Renderer<T, bucketT>::RendererBase::SuperRasW; using EmberNs::Renderer<T, bucketT>::RendererBase::SuperRasW;
using EmberNs::Renderer<T, bucketT>::RendererBase::SuperRasH; using EmberNs::Renderer<T, bucketT>::RendererBase::SuperRasH;
using EmberNs::Renderer<T, bucketT>::RendererBase::SuperSize; using EmberNs::Renderer<T, bucketT>::RendererBase::SuperSize;
using EmberNs::Renderer<T, bucketT>::RendererBase::BytesPerChannel; using EmberNs::Renderer<T, bucketT>::RendererBase::BytesPerChannel;
using EmberNs::Renderer<T, bucketT>::RendererBase::TemporalSamples; using EmberNs::Renderer<T, bucketT>::RendererBase::TemporalSamples;
using EmberNs::Renderer<T, bucketT>::RendererBase::ItersPerTemporalSample; using EmberNs::Renderer<T, bucketT>::RendererBase::ItersPerTemporalSample;
using EmberNs::Renderer<T, bucketT>::RendererBase::FuseCount; using EmberNs::Renderer<T, bucketT>::RendererBase::FuseCount;
using EmberNs::Renderer<T, bucketT>::RendererBase::DensityFilterOffset; using EmberNs::Renderer<T, bucketT>::RendererBase::DensityFilterOffset;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_ProgressParameter; using EmberNs::Renderer<T, bucketT>::RendererBase::m_ProgressParameter;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_YAxisUp; using EmberNs::Renderer<T, bucketT>::RendererBase::m_YAxisUp;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_LockAccum; using EmberNs::Renderer<T, bucketT>::RendererBase::m_LockAccum;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_Abort; using EmberNs::Renderer<T, bucketT>::RendererBase::m_Abort;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_NumChannels; using EmberNs::Renderer<T, bucketT>::RendererBase::m_NumChannels;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_LastIter; using EmberNs::Renderer<T, bucketT>::RendererBase::m_LastIter;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_LastIterPercent; using EmberNs::Renderer<T, bucketT>::RendererBase::m_LastIterPercent;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_Stats; using EmberNs::Renderer<T, bucketT>::RendererBase::m_Stats;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_Callback; using EmberNs::Renderer<T, bucketT>::RendererBase::m_Callback;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_Rand; using EmberNs::Renderer<T, bucketT>::RendererBase::m_Rand;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_RenderTimer; using EmberNs::Renderer<T, bucketT>::RendererBase::m_RenderTimer;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_IterTimer; using EmberNs::Renderer<T, bucketT>::RendererBase::m_IterTimer;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_ProgressTimer; using EmberNs::Renderer<T, bucketT>::RendererBase::m_ProgressTimer;
using EmberNs::Renderer<T, bucketT>::RendererBase::EmberReport::AddToReport; using EmberNs::Renderer<T, bucketT>::RendererBase::EmberReport::AddToReport;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_ResizeCs; using EmberNs::Renderer<T, bucketT>::RendererBase::m_ResizeCs;
using EmberNs::Renderer<T, bucketT>::RendererBase::m_ProcessAction; using EmberNs::Renderer<T, bucketT>::RendererBase::m_ProcessAction;
using EmberNs::Renderer<T, bucketT>::m_RotMat; using EmberNs::Renderer<T, bucketT>::m_RotMat;
using EmberNs::Renderer<T, bucketT>::m_Ember; using EmberNs::Renderer<T, bucketT>::m_Ember;
using EmberNs::Renderer<T, bucketT>::m_Csa; using EmberNs::Renderer<T, bucketT>::m_Csa;
using EmberNs::Renderer<T, bucketT>::m_CurvesSet; using EmberNs::Renderer<T, bucketT>::m_CurvesSet;
using EmberNs::Renderer<T, bucketT>::CenterX; using EmberNs::Renderer<T, bucketT>::CenterX;
using EmberNs::Renderer<T, bucketT>::CenterY; using EmberNs::Renderer<T, bucketT>::CenterY;
using EmberNs::Renderer<T, bucketT>::K1; using EmberNs::Renderer<T, bucketT>::K1;
using EmberNs::Renderer<T, bucketT>::K2; using EmberNs::Renderer<T, bucketT>::K2;
using EmberNs::Renderer<T, bucketT>::Supersample; using EmberNs::Renderer<T, bucketT>::Supersample;
using EmberNs::Renderer<T, bucketT>::HighlightPower; using EmberNs::Renderer<T, bucketT>::HighlightPower;
using EmberNs::Renderer<T, bucketT>::HistBuckets; using EmberNs::Renderer<T, bucketT>::HistBuckets;
using EmberNs::Renderer<T, bucketT>::AccumulatorBuckets; using EmberNs::Renderer<T, bucketT>::AccumulatorBuckets;
using EmberNs::Renderer<T, bucketT>::GetDensityFilter; using EmberNs::Renderer<T, bucketT>::GetDensityFilter;
using EmberNs::Renderer<T, bucketT>::GetSpatialFilter; using EmberNs::Renderer<T, bucketT>::GetSpatialFilter;
using EmberNs::Renderer<T, bucketT>::CoordMap; using EmberNs::Renderer<T, bucketT>::CoordMap;
using EmberNs::Renderer<T, bucketT>::XformDistributions; using EmberNs::Renderer<T, bucketT>::XformDistributions;
using EmberNs::Renderer<T, bucketT>::XformDistributionsSize; using EmberNs::Renderer<T, bucketT>::XformDistributionsSize;
using EmberNs::Renderer<T, bucketT>::m_Dmap; using EmberNs::Renderer<T, bucketT>::m_Dmap;
using EmberNs::Renderer<T, bucketT>::m_DensityFilter; using EmberNs::Renderer<T, bucketT>::m_DensityFilter;
using EmberNs::Renderer<T, bucketT>::m_SpatialFilter; using EmberNs::Renderer<T, bucketT>::m_SpatialFilter;
public: public:
RendererCL(const vector<pair<size_t, size_t>>& devices, bool shared = false, GLuint outputTexID = 0); RendererCL(const vector<pair<size_t, size_t>>& devices, bool shared = false, GLuint outputTexID = 0);
@ -200,6 +200,7 @@ private:
string m_EmberBufferName; string m_EmberBufferName;
string m_XformsBufferName; string m_XformsBufferName;
string m_ParVarsBufferName; string m_ParVarsBufferName;
string m_GlobalSharedBufferName;
string m_SeedsBufferName; string m_SeedsBufferName;
string m_DistBufferName; string m_DistBufferName;
string m_CarToRasBufferName; string m_CarToRasBufferName;
@ -233,6 +234,7 @@ private:
DEOpenCLKernelCreator m_DEOpenCLKernelCreator; DEOpenCLKernelCreator m_DEOpenCLKernelCreator;
FinalAccumOpenCLKernelCreator m_FinalAccumOpenCLKernelCreator; FinalAccumOpenCLKernelCreator m_FinalAccumOpenCLKernelCreator;
pair<string, vector<T>> m_Params; pair<string, vector<T>> m_Params;
pair<string, vector<T>> m_GlobalShared;
vector<unique_ptr<RendererClDevice>> m_Devices; vector<unique_ptr<RendererClDevice>> m_Devices;
Ember<T> m_LastBuiltEmber; Ember<T> m_LastBuiltEmber;
}; };

View File

@ -13,7 +13,6 @@ namespace EmberCLns
/// <param name="shared">True if shared with OpenGL, else false.</param> /// <param name="shared">True if shared with OpenGL, else false.</param>
/// <returns>True if success, else false.</returns> /// <returns>True if success, else false.</returns>
RendererClDevice::RendererClDevice(bool doublePrec, size_t platform, size_t device, bool shared) RendererClDevice::RendererClDevice(bool doublePrec, size_t platform, size_t device, bool shared)
: m_Info(OpenCLInfo::Instance())
{ {
m_Init = false; m_Init = false;
m_Shared = shared; m_Shared = shared;
@ -22,6 +21,7 @@ RendererClDevice::RendererClDevice(bool doublePrec, size_t platform, size_t devi
m_Calls = 0; m_Calls = 0;
m_PlatformIndex = platform; m_PlatformIndex = platform;
m_DeviceIndex = device; m_DeviceIndex = device;
m_Info = OpenCLInfo::Instance();
} }
/// <summary> /// <summary>
@ -40,7 +40,7 @@ bool RendererClDevice::Init()
if (b && m_Wrapper.Ok() && !m_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_WarpSize = m_NVidia ? 32 : 64;
m_Init = true; m_Init = true;
} }

View File

@ -37,6 +37,6 @@ private:
size_t m_WarpSize; size_t m_WarpSize;
size_t m_PlatformIndex; size_t m_PlatformIndex;
size_t m_DeviceIndex; size_t m_DeviceIndex;
OpenCLInfo& m_Info; shared_ptr<OpenCLInfo> m_Info;
}; };
} }

View File

@ -166,7 +166,6 @@ static uint CalcStrips(double memRequired, double memAvailable, double useMem)
return 1; return 1;
strips = uint(ceil(memRequired / memAvailable)); strips = uint(ceil(memRequired / memAvailable));
return strips; return strips;
} }
@ -210,7 +209,6 @@ static T NextLowestEvenDiv(T numerator, T denominator)
{ {
T result = 1; T result = 1;
T numDiv2 = numerator / 2; T numDiv2 = numerator / 2;
denominator--; denominator--;
if (denominator > numDiv2) if (denominator > numDiv2)
@ -239,9 +237,8 @@ static T NextLowestEvenDiv(T numerator, T denominator)
static vector<pair<size_t, size_t>> Devices(const vector<size_t>& selectedDevices) static vector<pair<size_t, size_t>> Devices(const vector<size_t>& selectedDevices)
{ {
vector<pair<size_t, size_t>> vec; vector<pair<size_t, size_t>> vec;
OpenCLInfo& info = OpenCLInfo::Instance(); auto info = OpenCLInfo::Instance();
auto& devices = info.DeviceIndices(); auto& devices = info->DeviceIndices();
vec.reserve(selectedDevices.size()); vec.reserve(selectedDevices.size());
for (size_t i = 0; i < selectedDevices.size(); i++) for (size_t i = 0; i < selectedDevices.size(); i++)
@ -400,10 +397,10 @@ static vector<unique_ptr<Renderer<T, float>>> CreateRenderers(eRendererType rend
/// <returns>True if all rendering was successful, else false.</returns> /// <returns>True if all rendering was successful, else false.</returns>
template <typename T> template <typename T>
static bool StripsRender(RendererBase* renderer, Ember<T>& ember, vector<byte>& finalImage, double time, size_t strips, bool yAxisUp, static bool StripsRender(RendererBase* renderer, Ember<T>& ember, vector<byte>& finalImage, double time, size_t strips, bool yAxisUp,
std::function<void(size_t strip)> perStripStart, std::function<void(size_t strip)> perStripStart,
std::function<void(size_t strip)> perStripFinish, std::function<void(size_t strip)> perStripFinish,
std::function<void(size_t strip)> perStripError, std::function<void(size_t strip)> perStripError,
std::function<void(Ember<T>& finalEmber)> allStripsFinished) std::function<void(Ember<T>& finalEmber)> allStripsFinished)
{ {
bool success = false; bool success = false;
size_t origHeight, realHeight = ember.m_FinalRasH; size_t origHeight, realHeight = ember.m_FinalRasH;
@ -412,7 +409,6 @@ static bool StripsRender(RendererBase* renderer, Ember<T>& ember, vector<byte>&
T zoomScale = pow(T(2), ember.m_Zoom); T zoomScale = pow(T(2), ember.m_Zoom);
T centerBase = centerY - ((strips - 1) * floatStripH) / (2 * ember.m_PixelsPerUnit * zoomScale); T centerBase = centerY - ((strips - 1) * floatStripH) / (2 * ember.m_PixelsPerUnit * zoomScale);
vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>> randVec; vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>> randVec;
ember.m_Quality *= strips; ember.m_Quality *= strips;
ember.m_FinalRasH = size_t(ceil(floatStripH)); ember.m_FinalRasH = size_t(ceil(floatStripH));
@ -469,7 +465,6 @@ static bool StripsRender(RendererBase* renderer, Ember<T>& ember, vector<byte>&
allStripsFinished(ember); allStripsFinished(ember);
Memset(finalImage); Memset(finalImage);
return success; return success;
} }
@ -485,9 +480,9 @@ static bool StripsRender(RendererBase* renderer, Ember<T>& ember, vector<byte>&
/// <param name="stripError3">Called if for any reason the number of strips used will differ from the value passed in</param> /// <param name="stripError3">Called if for any reason the number of strips used will differ from the value passed in</param>
/// <returns>The actual number of strips that will be used</returns> /// <returns>The actual number of strips that will be used</returns>
static size_t VerifyStrips(size_t height, size_t strips, static size_t VerifyStrips(size_t height, size_t strips,
std::function<void(const string& s)> stripError1, std::function<void(const string& s)> stripError1,
std::function<void(const string& s)> stripError2, std::function<void(const string& s)> stripError2,
std::function<void(const string& s)> stripError3) std::function<void(const string& s)> stripError3)
{ {
ostringstream os; 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 << "."; os << "A strips value of " << strips << " does not divide evenly into a height of " << height << ".";
stripError2(os.str()); os.str(""); stripError2(os.str()); os.str("");
strips = NextHighestEvenDiv(height, strips); strips = NextHighestEvenDiv(height, strips);
if (strips == 1)//No higher divisor, check for a lower one. if (strips == 1)//No higher divisor, check for a lower one.

View File

@ -10,28 +10,28 @@
template <typename T> template <typename T>
void SetDefaultTestValues(Ember<T>& ember) void SetDefaultTestValues(Ember<T>& ember)
{ {
ember.m_Time = 0.0; ember.m_Time = 0.0;
ember.m_Interp = EMBER_INTERP_LINEAR; ember.m_Interp = EMBER_INTERP_LINEAR;
ember.m_PaletteInterp = INTERP_HSV; ember.m_PaletteInterp = INTERP_HSV;
ember.m_Background[0] = 0; ember.m_Background[0] = 0;
ember.m_Background[1] = 0; ember.m_Background[1] = 0;
ember.m_Background[2] = 0; ember.m_Background[2] = 0;
ember.m_Background[3] = 255; ember.m_Background[3] = 255;
ember.m_CenterX = 0; ember.m_CenterX = 0;
ember.m_CenterY = 0; ember.m_CenterY = 0;
ember.m_Rotate = 0; ember.m_Rotate = 0;
ember.m_PixelsPerUnit = 64; ember.m_PixelsPerUnit = 64;
ember.m_FinalRasW = 128; ember.m_FinalRasW = 128;
ember.m_FinalRasH = 128; ember.m_FinalRasH = 128;
ember.m_Supersample = 1; ember.m_Supersample = 1;
ember.m_SpatialFilterRadius = T(0.5); ember.m_SpatialFilterRadius = T(0.5);
ember.m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER; ember.m_SpatialFilterType = GAUSSIAN_SPATIAL_FILTER;
ember.m_Zoom = 0; ember.m_Zoom = 0;
ember.m_Quality = 1; ember.m_Quality = 1;
ember.m_TemporalSamples = 1; ember.m_TemporalSamples = 1;
ember.m_MaxRadDE = 0; ember.m_MaxRadDE = 0;
ember.m_MinRadDE = 0; ember.m_MinRadDE = 0;
ember.m_CurveDE = T(0.6); ember.m_CurveDE = T(0.6);
} }
/// <summary> /// <summary>
@ -43,8 +43,7 @@ void SetDefaultTestValues(Ember<T>& ember)
template <typename T> template <typename T>
bool EmberGenome(EmberOptions& opt) bool EmberGenome(EmberOptions& opt)
{ {
OpenCLInfo& info(OpenCLInfo::Instance()); auto info = OpenCLInfo::Instance();
std::cout.imbue(std::locale("")); std::cout.imbue(std::locale(""));
if (opt.DumpArgs()) if (opt.DumpArgs())
@ -53,7 +52,7 @@ bool EmberGenome(EmberOptions& opt)
if (opt.OpenCLInfo()) if (opt.OpenCLInfo())
{ {
cerr << "\nOpenCL Info: " << endl; cerr << "\nOpenCL Info: " << endl;
cerr << info.DumpInfo(); cerr << info->DumpInfo();
return true; return true;
} }
@ -83,7 +82,6 @@ bool EmberGenome(EmberOptions& opt)
unique_ptr<Renderer<T, float>> renderer(CreateRenderer<T>(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, devices, false, 0, emberReport)); unique_ptr<Renderer<T, float>> renderer(CreateRenderer<T>(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, devices, false, 0, emberReport));
QTIsaac<ISAAC_SIZE, ISAAC_INT> rand(ISAAC_INT(t.Tic()), ISAAC_INT(t.Tic() * 2), ISAAC_INT(t.Tic() * 3)); QTIsaac<ISAAC_SIZE, ISAAC_INT> rand(ISAAC_INT(t.Tic()), ISAAC_INT(t.Tic() * 2), ISAAC_INT(t.Tic() * 3));
vector<string> errorReport = emberReport.ErrorReport(); vector<string> errorReport = emberReport.ErrorReport();
os.imbue(std::locale("")); os.imbue(std::locale(""));
os2.imbue(std::locale("")); os2.imbue(std::locale(""));
@ -112,15 +110,14 @@ bool EmberGenome(EmberOptions& opt)
{ {
for (auto& device : devices) for (auto& device : devices)
{ {
cerr << "Platform: " << info.PlatformName(device.first) << endl; cerr << "Platform: " << info->PlatformName(device.first) << endl;
cerr << "Device: " << info.DeviceName(device.first, device.second) << 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 will own the created renderer and will take care of cleaning it up.
SheepTools<T, float> tools(opt.PalettePath(), CreateRenderer<T>(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, devices, false, 0, emberReport2)); SheepTools<T, float> tools(opt.PalettePath(), CreateRenderer<T>(opt.EmberCL() ? OPENCL_RENDERER : CPU_RENDERER, devices, false, 0, emberReport2));
tools.SetSpinParams(!opt.UnsmoothEdge(), tools.SetSpinParams(!opt.UnsmoothEdge(),
T(opt.Stagger()), T(opt.Stagger()),
T(opt.OffsetX()), T(opt.OffsetX()),
@ -217,7 +214,6 @@ bool EmberGenome(EmberOptions& opt)
bool doStrip = opt.Strip() != ""; bool doStrip = opt.Strip() != "";
bool doCross0 = opt.Cross0() != ""; bool doCross0 = opt.Cross0() != "";
bool doCross1 = opt.Cross1() != ""; bool doCross1 = opt.Cross1() != "";
count += (doMutate ? 1 : 0); count += (doMutate ? 1 : 0);
count += (doInter ? 1 : 0); count += (doInter ? 1 : 0);
count += (doRotate ? 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, result1, frame - 1, blend - spread);
tools.Spin(embers[0], pTemplate, result2, frame , blend ); tools.Spin(embers[0], pTemplate, result2, frame , blend );
tools.Spin(embers[0], pTemplate, result3, frame + 1, blend + spread); 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(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(result2, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette());
cout << emberToXml.ToString(result3, 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, result1, frame - 1, 0, blend - spread);
tools.SpinInter(embers.data(), pTemplate, result2, frame , 0, blend ); tools.SpinInter(embers.data(), pTemplate, result2, frame , 0, blend );
tools.SpinInter(embers.data(), pTemplate, result3, frame + 1, 0, blend + spread); 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(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(result2, opt.Extras(), opt.PrintEditDepth(), !opt.NoEdits(), false, opt.HexPalette());
cout << emberToXml.ToString(result3, 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++) for (i = 0; i < embers.size(); i++)
{ {
T oldX, oldY; T oldX, oldY;
embers[i].DeleteMotionElements(); embers[i].DeleteMotionElements();
oldX = embers[i].m_CenterX; oldX = embers[i].m_CenterX;
oldY = embers[i].m_CenterY; oldY = embers[i].m_CenterY;
embers[i].m_FinalRasH = size_t(T(embers[i].m_FinalRasH) / T(opt.Frames())); 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) / 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)); 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); tools.RotateOldCenterBy(embers[i].m_CenterX, embers[i].m_CenterY, oldX, oldY, embers[i].m_Rotate);
if (pTemplate) if (pTemplate)
@ -602,10 +592,8 @@ bool EmberGenome(EmberOptions& opt)
{ {
i0 = rand.Rand() % embers.size(); i0 = rand.Rand() % embers.size();
i1 = rand.Rand() % embers2.size(); i1 = rand.Rand() % embers2.size();
selp0 = embers[i0]; selp0 = embers[i0];
selp1 = embers2[i1]; selp1 = embers2[i1];
aselp0 = &selp0; aselp0 = &selp0;
aselp1 = &selp1; aselp1 = &selp1;
@ -711,6 +699,7 @@ bool EmberGenome(EmberOptions& opt)
tot += (finalImage[i] + finalImage[i + 1] + finalImage[i + 2]); tot += (finalImage[i] + finalImage[i + 1] + finalImage[i + 2]);
if (0 == finalImage[i] && 0 == finalImage[i + 1] && 0 == finalImage[i + 2]) totb++; 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++; if (255 == finalImage[i] && 255 == finalImage[i + 1] && 255 == finalImage[i + 2]) totw++;
} }
@ -723,10 +712,11 @@ bool EmberGenome(EmberOptions& opt)
orig.Clear(); orig.Clear();
count++; count++;
} while ((avgPix < opt.AvgThresh() || }
fractionBlack < opt.BlackThresh() || while ((avgPix < opt.AvgThresh() ||
fractionWhite > opt.WhiteLimit()) && fractionBlack < opt.BlackThresh() ||
count < opt.Tries()); fractionWhite > opt.WhiteLimit()) &&
count < opt.Tries());
if (count == opt.Tries()) if (count == opt.Tries())
cerr << "Warning: reached maximum attempts, giving up." << endl; cerr << "Warning: reached maximum attempts, giving up." << endl;
@ -767,7 +757,6 @@ int _tmain(int argc, _TCHAR* argv[])
{ {
bool b = false; bool b = false;
EmberOptions opt; EmberOptions opt;
//Required for large allocs, else GPU memory usage will be severely limited to small sizes. //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. //This must be done in the application and not in the EmberCL DLL.
#ifdef WIN32 #ifdef WIN32
@ -778,23 +767,23 @@ int _tmain(int argc, _TCHAR* argv[])
if (!opt.Populate(argc, argv, OPT_USE_GENOME)) if (!opt.Populate(argc, argv, OPT_USE_GENOME))
{ {
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
if (opt.Bits() == 64) if (opt.Bits() == 64)
{ {
b = EmberGenome<double>(opt); b = EmberGenome<double>(opt);
} }
else else
#endif #endif
if (opt.Bits() == 33) if (opt.Bits() == 33)
{ {
b = EmberGenome<float>(opt); b = EmberGenome<float>(opt);
} }
else if (opt.Bits() == 32) else if (opt.Bits() == 32)
{ {
cerr << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; cerr << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl;
b = EmberGenome<float>(opt); b = EmberGenome<float>(opt);
} }
} }
return b ? 0 : 1; return b ? 0 : 1;

View File

@ -2,6 +2,8 @@
#include "EmberRender.h" #include "EmberRender.h"
#include "JpegUtils.h" #include "JpegUtils.h"
//template <class OpenCLInfo> weak_ptr<OpenCLInfo> Singleton<OpenCLInfo>::m_Instance = weak_ptr<OpenCLInfo>();
/// <summary> /// <summary>
/// The core of the EmberRender.exe program. /// The core of the EmberRender.exe program.
/// Template argument expected to be float or double. /// Template argument expected to be float or double.
@ -11,8 +13,7 @@
template <typename T> template <typename T>
bool EmberRender(EmberOptions& opt) bool EmberRender(EmberOptions& opt)
{ {
EmberCLns::OpenCLInfo& info(EmberCLns::OpenCLInfo::Instance()); auto info = EmberCLns::OpenCLInfo::Instance();
std::cout.imbue(std::locale("")); std::cout.imbue(std::locale(""));
if (opt.DumpArgs()) if (opt.DumpArgs())
@ -21,7 +22,7 @@ bool EmberRender(EmberOptions& opt)
if (opt.OpenCLInfo()) if (opt.OpenCLInfo())
{ {
cout << "\nOpenCL Info: " << endl; cout << "\nOpenCL Info: " << endl;
cout << info.DumpInfo(); cout << info->DumpInfo();
return true; return true;
} }
@ -89,8 +90,8 @@ bool EmberRender(EmberOptions& opt)
{ {
for (auto& device : devices) for (auto& device : devices)
{ {
cout << "Platform: " << info.PlatformName(device.first) << endl; cout << "Platform: " << info->PlatformName(device.first) << endl;
cout << "Device: " << info.DeviceName(device.first, device.second) << endl; cout << "Device: " << info->DeviceName(device.first, device.second) << endl;
} }
} }
@ -108,9 +109,9 @@ bool EmberRender(EmberOptions& opt)
} }
if (opt.Format() != "jpg" && if (opt.Format() != "jpg" &&
opt.Format() != "png" && opt.Format() != "png" &&
opt.Format() != "ppm" && opt.Format() != "ppm" &&
opt.Format() != "bmp") opt.Format() != "bmp")
{ {
cout << "Format must be jpg, png, ppm, or bmp not " << opt.Format() << ". Setting to jpg." << endl; 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. //Cast to double in case the value exceeds 2^32.
double imageMem = double(renderer->NumChannels()) * double(embers[i].m_FinalRasW) 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)); 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. 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, strips = VerifyStrips(embers[i].m_FinalRasH, strips,
[&](const string& s) { cout << s << endl; },//Greater than height. [&](const string & s) { cout << s << endl; }, //Greater than height.
[&](const string& s) { cout << s << endl; },//Mod height != 0. [&](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; }); //Final strips value to be set.
//For testing incremental renderer. //For testing incremental renderer.
//int sb = 1; //int sb = 1;
//bool resume = false, success = false; //bool resume = false, success = false;
@ -231,9 +231,8 @@ bool EmberRender(EmberOptions& opt)
// resume = true; // resume = true;
//} //}
//while (success && renderer->ProcessState() != ACCUM_DONE); //while (success && renderer->ProcessState() != ACCUM_DONE);
StripsRender<T>(renderer.get(), embers[i], finalImage, 0, strips, opt.YAxisUp(), StripsRender<T>(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) if (opt.Verbose() && (strips > 1) && strip > 0)
cout << endl; cout << endl;
@ -267,7 +266,6 @@ bool EmberRender(EmberOptions& opt)
else else
{ {
ostringstream fnstream; ostringstream fnstream;
fnstream << inputPath << opt.Prefix() << setfill('0') << setw(padding) << i << opt.Suffix() << "." << opt.Format(); fnstream << inputPath << opt.Prefix() << setfill('0') << setw(padding) << i << opt.Suffix() << "." << opt.Format();
filename = fnstream.str(); filename = fnstream.str();
} }
@ -278,9 +276,10 @@ bool EmberRender(EmberOptions& opt)
comments = renderer->ImageComments(stats, opt.PrintEditDepth(), opt.IntPalette(), opt.HexPalette()); comments = renderer->ImageComments(stats, opt.PrintEditDepth(), opt.IntPalette(), opt.HexPalette());
os.str(""); os.str("");
os << comments.m_NumIters << " / " << iterCount << " (" << std::fixed << std::setprecision(2) << ((double(stats.m_Iters) / double(iterCount)) * 100) << "%)"; os << comments.m_NumIters << " / " << iterCount << " (" << std::fixed << std::setprecision(2) << ((double(stats.m_Iters) / double(iterCount)) * 100) << "%)";
VerbosePrint("\nIters ran/requested: " + os.str()); VerbosePrint("\nIters ran/requested: " + os.str());
if (!opt.EmberCL()) VerbosePrint("Bad values: " << stats.m_Badvals); if (!opt.EmberCL()) VerbosePrint("Bad values: " << stats.m_Badvals);
VerbosePrint("Render time: " + t.Format(stats.m_RenderMs)); VerbosePrint("Render time: " + t.Format(stats.m_RenderMs));
VerbosePrint("Pure iter time: " + t.Format(stats.m_IterMs)); VerbosePrint("Pure iter time: " + t.Format(stats.m_IterMs));
VerbosePrint("Iters/sec: " << size_t(stats.m_Iters / (stats.m_IterMs / 1000.0)) << endl); 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<RendererCL<T, float>*>(renderer.get())) if (auto rendererCL = dynamic_cast<RendererCL<T, float>*>(renderer.get()))
{ {
cout << "Iteration kernel:\n" << cout << "Iteration kernel:\n" <<
rendererCL->IterKernel() << "\n\n" << rendererCL->IterKernel() << "\n\n" <<
"Density filter kernel:\n" << "Density filter kernel:\n" <<
rendererCL->DEKernel() << "\n\n" << rendererCL->DEKernel() << "\n\n" <<
"Final accumulation kernel:\n" << "Final accumulation kernel:\n" <<
rendererCL->FinalAccumKernel() << endl; rendererCL->FinalAccumKernel() << endl;
} }
} }
@ -322,7 +321,6 @@ bool EmberRender(EmberOptions& opt)
} }
t.Toc("\nFinished in: ", true); t.Toc("\nFinished in: ", true);
return true; return true;
} }
@ -336,7 +334,6 @@ int _tmain(int argc, _TCHAR* argv[])
{ {
bool b = false; bool b = false;
EmberOptions opt; EmberOptions opt;
//Required for large allocs, else GPU memory usage will be severely limited to small sizes. //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. //This must be done in the application and not in the EmberCL DLL.
#ifdef WIN32 #ifdef WIN32
@ -348,23 +345,23 @@ int _tmain(int argc, _TCHAR* argv[])
if (!opt.Populate(argc, argv, OPT_USE_RENDER)) if (!opt.Populate(argc, argv, OPT_USE_RENDER))
{ {
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
if (opt.Bits() == 64) if (opt.Bits() == 64)
{ {
b = EmberRender<double>(opt); b = EmberRender<double>(opt);
} }
else else
#endif #endif
if (opt.Bits() == 33) if (opt.Bits() == 33)
{ {
b = EmberRender<float>(opt); b = EmberRender<float>(opt);
} }
else if (opt.Bits() == 32) else if (opt.Bits() == 32)
{ {
cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl; cout << "Bits 32/int histogram no longer supported. Using bits == 33 (float)." << endl;
b = EmberRender<float>(opt); b = EmberRender<float>(opt);
} }
} }
return b ? 0 : 1; return b ? 0 : 1;

File diff suppressed because it is too large Load Diff

View File

@ -11,17 +11,15 @@
/// <param name="p">The parent widget</param> /// <param name="p">The parent widget</param>
/// <param name="f">The window flags. Default: 0.</param> /// <param name="f">The window flags. Default: 0.</param>
FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f)
: QDialog(p, f), : QDialog(p, f)
m_Info(OpenCLInfo::Instance()) {
{
ui.setupUi(this); ui.setupUi(this);
int row = 0, spinHeight = 20; int row = 0, spinHeight = 20;
uint i; uint i;
double dmax = numeric_limits<double>::max(); double dmax = numeric_limits<double>::max();
QTableWidget* table = ui.FinalRenderParamsTable; QTableWidget* table = ui.FinalRenderParamsTable;
QTableWidgetItem* item = nullptr; QTableWidgetItem* item = nullptr;
m_Info = OpenCLInfo::Instance();
m_Fractorium = qobject_cast<Fractorium*>(p); m_Fractorium = qobject_cast<Fractorium*>(p);
m_Settings = settings; m_Settings = settings;
ui.FinalRenderThreadCountSpin->setRange(1, Timing::ProcessorCount()); 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.FinalRenderScaleWidthRadioButton, SIGNAL(toggled(bool)), this, SLOT(OnScaleRadioButtonChanged(bool)), Qt::QueuedConnection);
connect(ui.FinalRenderScaleHeightRadioButton, 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); connect(ui.FinalRenderDeviceTable, SIGNAL(cellChanged(int, int)), this, SLOT(OnDeviceTableCellChanged(int, int)), Qt::QueuedConnection);
SetupSpinner<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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); SetupSpinner<DoubleSpinBox, double>(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); m_WidthScaleSpin->setDecimals(3);
@ -48,46 +45,37 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set
m_HeightScaleSpin->setSuffix(" ( )"); m_HeightScaleSpin->setSuffix(" ( )");
m_WidthScaleSpin->SmallStep(0.001); m_WidthScaleSpin->SmallStep(0.001);
m_HeightScaleSpin->SmallStep(0.001); m_HeightScaleSpin->SmallStep(0.001);
row = 0; row = 0;
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_QualitySpin, spinHeight, 1, dmax, 50, SIGNAL(valueChanged(double)), SLOT(OnQualityChanged(double)), true, 1000, 1000, 1000); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_QualitySpin, spinHeight, 1, dmax, 50, SIGNAL(valueChanged(double)), SLOT(OnQualityChanged(double)), true, 1000, 1000, 1000);
SetupSpinner<SpinBox, int> (table, this, row, 1, m_TemporalSamplesSpin, spinHeight, 1, 5000, 50, SIGNAL(valueChanged(int)), SLOT(OnTemporalSamplesChanged(int)), true, 1000, 1000, 1000); SetupSpinner<SpinBox, int> (table, this, row, 1, m_TemporalSamplesSpin, spinHeight, 1, 5000, 50, SIGNAL(valueChanged(int)), SLOT(OnTemporalSamplesChanged(int)), true, 1000, 1000, 1000);
SetupSpinner<SpinBox, int> (table, this, row, 1, m_SupersampleSpin, spinHeight, 1, 4, 1, SIGNAL(valueChanged(int)), SLOT(OnSupersampleChanged(int)), true, 2, 1, 1); SetupSpinner<SpinBox, int> (table, this, row, 1, m_SupersampleSpin, spinHeight, 1, 4, 1, SIGNAL(valueChanged(int)), SLOT(OnSupersampleChanged(int)), true, 2, 1, 1);
SetupSpinner<SpinBox, int> (table, this, row, 1, m_StripsSpin, spinHeight, 1, 64, 1, SIGNAL(valueChanged(int)), SLOT(OnStripsChanged(int)), true, 1, 1, 1); SetupSpinner<SpinBox, int> (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_MemoryCellIndex = row++;//Memory usage.
m_ItersCellIndex = row++;//Iters. m_ItersCellIndex = row++;//Iters.
m_PathCellIndex = row; m_PathCellIndex = row;
QStringList comboList; QStringList comboList;
comboList.append("jpg"); comboList.append("jpg");
comboList.append("png"); comboList.append("png");
m_Tbcw = new TwoButtonComboWidget("...", "Open", comboList, 22, 40, 22, table); m_Tbcw = new TwoButtonComboWidget("...", "Open", comboList, 22, 40, 22, table);
table->setCellWidget(row, 1, m_Tbcw); table->setCellWidget(row, 1, m_Tbcw);
table->item(row++, 1)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); 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_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_Button2, SIGNAL(clicked(bool)), this, SLOT(OnShowFolderButtonClicked(bool)), Qt::QueuedConnection);
connect(m_Tbcw->m_Combo, SIGNAL(currentIndexChanged(int)), this, SLOT(OnExtIndexChanged(int)), Qt::QueuedConnection); connect(m_Tbcw->m_Combo, SIGNAL(currentIndexChanged(int)), this, SLOT(OnExtIndexChanged(int)), Qt::QueuedConnection);
m_PrefixEdit = new QLineEdit(table); m_PrefixEdit = new QLineEdit(table);
table->setCellWidget(row++, 1, m_PrefixEdit); table->setCellWidget(row++, 1, m_PrefixEdit);
m_SuffixEdit = new QLineEdit(table); m_SuffixEdit = new QLineEdit(table);
table->setCellWidget(row++, 1, m_SuffixEdit); table->setCellWidget(row++, 1, m_SuffixEdit);
connect(m_PrefixEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnPrefixChanged(const QString&)), Qt::QueuedConnection); 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); connect(m_SuffixEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnSuffixChanged(const QString&)), Qt::QueuedConnection);
ui.FinalRenderStartButton->disconnect(SIGNAL(clicked(bool))); ui.FinalRenderStartButton->disconnect(SIGNAL(clicked(bool)));
connect(ui.FinalRenderStartButton, SIGNAL(clicked(bool)), this, SLOT(OnRenderClicked(bool)), Qt::QueuedConnection); connect(ui.FinalRenderStartButton, SIGNAL(clicked(bool)), this, SLOT(OnRenderClicked(bool)), Qt::QueuedConnection);
connect(ui.FinalRenderStopButton, SIGNAL(clicked(bool)), this, SLOT(OnCancelRenderClicked(bool)), Qt::QueuedConnection); connect(ui.FinalRenderStopButton, SIGNAL(clicked(bool)), this, SLOT(OnCancelRenderClicked(bool)), Qt::QueuedConnection);
table = ui.FinalRenderDeviceTable; table = ui.FinalRenderDeviceTable;
table->clearContents(); table->clearContents();
table->setRowCount(0); table->setRowCount(0);
if (m_Info.Ok() && !m_Info.Devices().empty()) if (m_Info->Ok() && !m_Info->Devices().empty())
{ {
SetupDeviceTable(table, m_Settings->FinalDevices()); SetupDeviceTable(table, m_Settings->FinalDevices());
@ -124,28 +112,25 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(tpc); ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(tpc);
else else
ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(Clamp<int>(m_Settings->FinalThreadPriority() / 25, 0, tpc)); ui.FinalRenderThreadPriorityComboBox->setCurrentIndex(Clamp<int>(m_Settings->FinalThreadPriority() / 25, 0, tpc));
#endif
#endif
m_QualitySpin->setValue(m_Settings->FinalQuality()); m_QualitySpin->setValue(m_Settings->FinalQuality());
m_TemporalSamplesSpin->setValue(m_Settings->FinalTemporalSamples()); m_TemporalSamplesSpin->setValue(m_Settings->FinalTemporalSamples());
m_SupersampleSpin->setValue(m_Settings->FinalSupersample()); m_SupersampleSpin->setValue(m_Settings->FinalSupersample());
m_StripsSpin->setValue(m_Settings->FinalStrips()); m_StripsSpin->setValue(m_Settings->FinalStrips());
Scale(eScaleType(m_Settings->FinalScale())); Scale(eScaleType(m_Settings->FinalScale()));
if (m_Settings->FinalExt() == "jpg") if (m_Settings->FinalExt() == "jpg")
m_Tbcw->m_Combo->setCurrentIndex(0); m_Tbcw->m_Combo->setCurrentIndex(0);
else else
m_Tbcw->m_Combo->setCurrentIndex(1); m_Tbcw->m_Combo->setCurrentIndex(1);
//Explicitly call these to enable/disable the appropriate controls. //Explicitly call these to enable/disable the appropriate controls.
OnOpenCLCheckBoxStateChanged(ui.FinalRenderOpenCLCheckBox->isChecked()); OnOpenCLCheckBoxStateChanged(ui.FinalRenderOpenCLCheckBox->isChecked());
OnDoAllCheckBoxStateChanged(ui.FinalRenderDoAllCheckBox->isChecked()); OnDoAllCheckBoxStateChanged(ui.FinalRenderDoAllCheckBox->isChecked());
OnDoSequenceCheckBoxStateChanged(ui.FinalRenderDoSequenceCheckBox->isChecked()); OnDoSequenceCheckBoxStateChanged(ui.FinalRenderDoSequenceCheckBox->isChecked());
QSize s = size(); QSize s = size();
int desktopHeight = qApp->desktop()->availableGeometry().height(); int desktopHeight = qApp->desktop()->availableGeometry().height();
s.setHeight(std::min(s.height(), int(double(desktopHeight * 0.90)))); s.setHeight(std::min(s.height(), int(double(desktopHeight * 0.90))));
setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, qApp->desktop()->availableGeometry())); setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, s, qApp->desktop()->availableGeometry()));
ui.FinalRenderThreadHorizontalLayout->setAlignment(Qt::AlignLeft); ui.FinalRenderThreadHorizontalLayout->setAlignment(Qt::AlignLeft);
@ -153,7 +138,6 @@ FractoriumFinalRenderDialog::FractoriumFinalRenderDialog(FractoriumSettings* set
ui.FinalRenderThreadHorizontalLayout->setAlignment(ui.FinalRenderThreadPriorityLabel, Qt::AlignLeft); ui.FinalRenderThreadHorizontalLayout->setAlignment(ui.FinalRenderThreadPriorityLabel, Qt::AlignLeft);
ui.FinalRenderThreadHorizontalLayout->setAlignment(ui.FinalRenderThreadPriorityComboBox, Qt::AlignLeft); ui.FinalRenderThreadHorizontalLayout->setAlignment(ui.FinalRenderThreadPriorityComboBox, Qt::AlignLeft);
QWidget* w = SetTabOrder(this, ui.FinalRenderEarlyClipCheckBox, ui.FinalRenderYAxisUpCheckBox); QWidget* w = SetTabOrder(this, ui.FinalRenderEarlyClipCheckBox, ui.FinalRenderYAxisUpCheckBox);
//Update these with new controls. //Update these with new controls.
w = SetTabOrder(this, w, ui.FinalRenderTransparencyCheckBox); w = SetTabOrder(this, w, ui.FinalRenderTransparencyCheckBox);
w = SetTabOrder(this, w, ui.FinalRenderOpenCLCheckBox); w = SetTabOrder(this, w, ui.FinalRenderOpenCLCheckBox);
@ -238,7 +222,6 @@ QList<QVariant> FractoriumFinalRenderDialog::Devices() { return DeviceTableToSet
FinalRenderGuiState FractoriumFinalRenderDialog::State() FinalRenderGuiState FractoriumFinalRenderDialog::State()
{ {
FinalRenderGuiState state; FinalRenderGuiState state;
state.m_EarlyClip = EarlyClip(); state.m_EarlyClip = EarlyClip();
state.m_YAxisUp = YAxisUp(); state.m_YAxisUp = YAxisUp();
state.m_Transparency = Transparency(); state.m_Transparency = Transparency();
@ -262,7 +245,6 @@ FinalRenderGuiState FractoriumFinalRenderDialog::State()
state.m_TemporalSamples = TemporalSamples(); state.m_TemporalSamples = TemporalSamples();
state.m_Supersample = Supersample(); state.m_Supersample = Supersample();
state.m_Strips = Strips(); state.m_Strips = Strips();
return state; return state;
} }
@ -346,7 +328,6 @@ void FractoriumFinalRenderDialog::OnTransparencyCheckBoxStateChanged(int state)
void FractoriumFinalRenderDialog::OnOpenCLCheckBoxStateChanged(int state) void FractoriumFinalRenderDialog::OnOpenCLCheckBoxStateChanged(int state)
{ {
bool checked = state == Qt::Checked; bool checked = state == Qt::Checked;
ui.FinalRenderDeviceTable->setEnabled(checked); ui.FinalRenderDeviceTable->setEnabled(checked);
ui.FinalRenderThreadCountSpin->setEnabled(!checked); ui.FinalRenderThreadCountSpin->setEnabled(!checked);
ui.FinalRenderThreadPriorityLabel->setEnabled(!checked); ui.FinalRenderThreadPriorityLabel->setEnabled(!checked);
@ -387,7 +368,6 @@ void FractoriumFinalRenderDialog::OnDoAllCheckBoxStateChanged(int state)
void FractoriumFinalRenderDialog::OnDoSequenceCheckBoxStateChanged(int state) void FractoriumFinalRenderDialog::OnDoSequenceCheckBoxStateChanged(int state)
{ {
bool checked = ui.FinalRenderDoSequenceCheckBox->isChecked(); bool checked = ui.FinalRenderDoSequenceCheckBox->isChecked();
m_TemporalSamplesSpin->setEnabled(checked); m_TemporalSamplesSpin->setEnabled(checked);
if (checked) if (checked)
@ -428,7 +408,7 @@ void FractoriumFinalRenderDialog::OnApplyAllCheckBoxStateChanged(int state)
void FractoriumFinalRenderDialog::OnWidthScaleChanged(double d) void FractoriumFinalRenderDialog::OnWidthScaleChanged(double d)
{ {
if (ui.FinalRenderKeepAspectCheckBox->isChecked() && m_Controller.get()) if (ui.FinalRenderKeepAspectCheckBox->isChecked() && m_Controller.get())
m_HeightScaleSpin->SetValueStealth(m_WidthScaleSpin->value()); m_HeightScaleSpin->SetValueStealth(m_WidthScaleSpin->value());
if (SetMemory()) if (SetMemory())
m_Controller->SyncCurrentToSizeSpinners(false, true); m_Controller->SyncCurrentToSizeSpinners(false, true);
@ -443,7 +423,7 @@ void FractoriumFinalRenderDialog::OnWidthScaleChanged(double d)
void FractoriumFinalRenderDialog::OnHeightScaleChanged(double d) void FractoriumFinalRenderDialog::OnHeightScaleChanged(double d)
{ {
if (ui.FinalRenderKeepAspectCheckBox->isChecked() && m_Controller.get()) if (ui.FinalRenderKeepAspectCheckBox->isChecked() && m_Controller.get())
m_WidthScaleSpin->SetValueStealth(m_HeightScaleSpin->value()); m_WidthScaleSpin->SetValueStealth(m_HeightScaleSpin->value());
if (SetMemory()) if (SetMemory())
m_Controller->SyncCurrentToSizeSpinners(false, true); m_Controller->SyncCurrentToSizeSpinners(false, true);
@ -578,7 +558,7 @@ void FractoriumFinalRenderDialog::OnFileButtonClicked(bool checked)
void FractoriumFinalRenderDialog::OnShowFolderButtonClicked(bool checked) void FractoriumFinalRenderDialog::OnShowFolderButtonClicked(bool checked)
{ {
QString s = m_Settings->SaveFolder(); QString s = m_Settings->SaveFolder();
if (Exists(s)) if (Exists(s))
QDesktopServices::openUrl(QUrl::fromLocalFile(s)); QDesktopServices::openUrl(QUrl::fromLocalFile(s));
else else
@ -673,13 +653,12 @@ void FractoriumFinalRenderDialog::showEvent(QShowEvent* e)
m_Controller->m_ImageCount = 0; m_Controller->m_ImageCount = 0;
SetMemory(); SetMemory();
m_Controller->ResetProgress(); m_Controller->ResetProgress();
QString s = m_Settings->SaveFolder(); QString s = m_Settings->SaveFolder();
if (Exists(s)) if (Exists(s))
Path(m_Controller->ComposePath(m_Controller->Name()));//Update the GUI. Path(m_Controller->ComposePath(m_Controller->Name()));//Update the GUI.
} }
ui.FinalRenderTextOutput->clear(); ui.FinalRenderTextOutput->clear();
QDialog::showEvent(e); QDialog::showEvent(e);
} }
@ -708,13 +687,12 @@ bool FractoriumFinalRenderDialog::CreateControllerFromGUI(bool createRenderer)
{ {
bool ok = true; bool ok = true;
int index = Current() - 1; int index = Current() - 1;
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
size_t elementSize = Double() ? sizeof(double) : sizeof(float); size_t elementSize = Double() ? sizeof(double) : sizeof(float);
#else #else
size_t elementSize = sizeof(float); size_t elementSize = sizeof(float);
#endif #endif
if (!m_Controller.get() || (m_Controller->SizeOfT() != elementSize)) if (!m_Controller.get() || (m_Controller->SizeOfT() != elementSize))
{ {
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
@ -740,6 +718,7 @@ bool FractoriumFinalRenderDialog::CreateControllerFromGUI(bool createRenderer)
//Create a float or double controller based on the GUI. //Create a float or double controller based on the GUI.
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
if (Double()) if (Double())
m_Controller = unique_ptr<FinalRenderEmberControllerBase>(new FinalRenderEmberController<double>(this)); m_Controller = unique_ptr<FinalRenderEmberControllerBase>(new FinalRenderEmberController<double>(this));
else else
@ -778,10 +757,9 @@ bool FractoriumFinalRenderDialog::SetMemory()
bool error = false; bool error = false;
tuple<size_t, size_t, size_t> p = m_Controller->SyncAndComputeMemory(); tuple<size_t, size_t, size_t> p = m_Controller->SyncAndComputeMemory();
QString s; QString s;
ui.FinalRenderParamsTable->item(m_MemoryCellIndex, 1)->setText(ToString<qulonglong>(get<1>(p))); ui.FinalRenderParamsTable->item(m_MemoryCellIndex, 1)->setText(ToString<qulonglong>(get<1>(p)));
ui.FinalRenderParamsTable->item(m_ItersCellIndex, 1)->setText(ToString<qulonglong>(get<2>(p))); ui.FinalRenderParamsTable->item(m_ItersCellIndex, 1)->setText(ToString<qulonglong>(get<2>(p)));
if (OpenCL() && !m_Wrappers.empty()) if (OpenCL() && !m_Wrappers.empty())
{ {
auto devices = Devices(); auto devices = Devices();
@ -799,13 +777,13 @@ bool FractoriumFinalRenderDialog::SetMemory()
if (histSize > maxAlloc) if (histSize > maxAlloc)
{ {
temp = "Histogram/Accumulator memory size of " + ToString<qulonglong>(histSize) + temp = "Histogram/Accumulator memory size of " + ToString<qulonglong>(histSize) +
" is greater than the max OpenCL allocation size of " + ToString<qulonglong>(maxAlloc); " is greater than the max OpenCL allocation size of " + ToString<qulonglong>(maxAlloc);
} }
if (totalSize > totalAvail) if (totalSize > totalAvail)
{ {
temp += "\n\nTotal required memory size of " + ToString<qulonglong>(totalSize) + temp += "\n\nTotal required memory size of " + ToString<qulonglong>(totalSize) +
" is greater than the max OpenCL available memory of " + ToString<qulonglong>(totalAvail); " is greater than the max OpenCL available memory of " + ToString<qulonglong>(totalAvail);
} }
if (!temp.isEmpty()) if (!temp.isEmpty())

View File

@ -40,7 +40,7 @@ class FractoriumFinalRenderDialog : public QDialog
friend Fractorium; friend Fractorium;
friend FinalRenderEmberControllerBase; friend FinalRenderEmberControllerBase;
friend FinalRenderEmberController<float>; friend FinalRenderEmberController<float>;
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
friend FinalRenderEmberController<double>; friend FinalRenderEmberController<double>;
#endif #endif
@ -112,7 +112,7 @@ protected:
private: private:
bool CreateControllerFromGUI(bool createRenderer); bool CreateControllerFromGUI(bool createRenderer);
bool SetMemory(); bool SetMemory();
int m_MemoryCellIndex; int m_MemoryCellIndex;
int m_ItersCellIndex; int m_ItersCellIndex;
int m_PathCellIndex; int m_PathCellIndex;
@ -128,7 +128,7 @@ private:
QLineEdit* m_SuffixEdit; QLineEdit* m_SuffixEdit;
FractoriumSettings* m_Settings; FractoriumSettings* m_Settings;
Fractorium* m_Fractorium; Fractorium* m_Fractorium;
OpenCLInfo& m_Info; shared_ptr<OpenCLInfo> m_Info;
vector<OpenCLWrapper> m_Wrappers; vector<OpenCLWrapper> m_Wrappers;
unique_ptr<FinalRenderEmberControllerBase> m_Controller; unique_ptr<FinalRenderEmberControllerBase> m_Controller;
Ui::FinalRenderDialog ui; Ui::FinalRenderDialog ui;

View File

@ -32,7 +32,6 @@ void FinalRenderEmberController<T>::CancelRender()
if (m_Result.isRunning()) if (m_Result.isRunning())
{ {
tbb::task_group g; tbb::task_group g;
g.run([&] g.run([&]
{ {
m_Run = false; m_Run = false;
@ -65,7 +64,6 @@ void FinalRenderEmberController<T>::CancelRender()
} }
} }
}); });
g.wait(); g.wait();
while (m_Result.isRunning()) while (m_Result.isRunning())
@ -82,9 +80,8 @@ void FinalRenderEmberController<T>::CancelRender()
/// <returns>True if a valid renderer is created or if no action is taken, else false.</returns> /// <returns>True if a valid renderer is created or if no action is taken, else false.</returns>
bool FinalRenderEmberControllerBase::CreateRendererFromGUI() 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()); auto v = Devices(m_FinalRenderDialog->Devices());
return CreateRenderer((useOpenCL && !v.empty()) ? OPENCL_RENDERER : CPU_RENDERER, return CreateRenderer((useOpenCL && !v.empty()) ? OPENCL_RENDERER : CPU_RENDERER,
v, v,
false);//Not shared. false);//Not shared.
@ -111,13 +108,11 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
m_FinalPreviewRenderer = unique_ptr<EmberNs::Renderer<T, float>>(new EmberNs::Renderer<T, float>()); m_FinalPreviewRenderer = unique_ptr<EmberNs::Renderer<T, float>>(new EmberNs::Renderer<T, float>());
m_FinalPreviewRenderer->Callback(nullptr); m_FinalPreviewRenderer->Callback(nullptr);
m_FinalPreviewRenderer->NumChannels(4); m_FinalPreviewRenderer->NumChannels(4);
m_FinalPreviewRenderFunc = [&]() m_FinalPreviewRenderFunc = [&]()
{ {
m_PreviewCs.Enter();//Thread prep. m_PreviewCs.Enter();//Thread prep.
m_PreviewRun = true; m_PreviewRun = true;
m_FinalPreviewRenderer->Abort(); m_FinalPreviewRenderer->Abort();
T scalePercentage; T scalePercentage;
size_t maxDim = 100; size_t maxDim = 100;
QLabel* widget = m_FinalRenderDialog->ui.FinalRenderPreviewLabel; QLabel* widget = m_FinalRenderDialog->ui.FinalRenderPreviewLabel;
@ -134,32 +129,27 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
m_PreviewEmber.m_FinalRasW = std::max<size_t>(1, std::min<size_t>(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasW)));//Ensure neither is zero. m_PreviewEmber.m_FinalRasW = std::max<size_t>(1, std::min<size_t>(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasW)));//Ensure neither is zero.
m_PreviewEmber.m_FinalRasH = std::max<size_t>(1, std::min<size_t>(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasH))); m_PreviewEmber.m_FinalRasH = std::max<size_t>(1, std::min<size_t>(maxDim, size_t(scalePercentage * m_Ember->m_FinalRasH)));
m_PreviewEmber.m_PixelsPerUnit = scalePercentage * m_Ember->m_PixelsPerUnit; m_PreviewEmber.m_PixelsPerUnit = scalePercentage * m_Ember->m_PixelsPerUnit;
m_FinalPreviewRenderer->EarlyClip(m_FinalRenderDialog->EarlyClip()); m_FinalPreviewRenderer->EarlyClip(m_FinalRenderDialog->EarlyClip());
m_FinalPreviewRenderer->YAxisUp(m_FinalRenderDialog->YAxisUp()); m_FinalPreviewRenderer->YAxisUp(m_FinalRenderDialog->YAxisUp());
m_FinalPreviewRenderer->Transparency(m_FinalRenderDialog->Transparency()); m_FinalPreviewRenderer->Transparency(m_FinalRenderDialog->Transparency());
m_FinalPreviewRenderer->SetEmber(m_PreviewEmber); 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(). 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(), 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<T>(m_FinalPreviewRenderer.get(), m_PreviewEmber, m_PreviewFinalImage, 0, strips, m_FinalRenderDialog->YAxisUp(), StripsRender<T>(m_FinalPreviewRenderer.get(), m_PreviewEmber, m_PreviewFinalImage, 0, strips, m_FinalRenderDialog->YAxisUp(),
[&](size_t strip) { },//Pre strip. [&](size_t strip) { },//Pre strip.
[&](size_t strip) { },//Post strip. [&](size_t strip) { },//Post strip.
[&](size_t strip) { },//Error. [&](size_t strip) { },//Error.
[&](Ember<T>& finalEmber)//Final strip. [&](Ember<T>& finalEmber)//Final strip.
{ {
QImage image(finalEmber.m_FinalRasW, finalEmber.m_FinalRasH, QImage::Format_RGBA8888);//The label wants RGBA. 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. memcpy(image.scanLine(0), m_PreviewFinalImage.data(), finalEmber.m_FinalRasW * finalEmber.m_FinalRasH * 4);//Memcpy the data in.
QPixmap pixmap = QPixmap::fromImage(image); QPixmap pixmap = QPixmap::fromImage(image);
QMetaObject::invokeMethod(widget, "setPixmap", Qt::QueuedConnection, Q_ARG(QPixmap, pixmap)); QMetaObject::invokeMethod(widget, "setPixmap", Qt::QueuedConnection, Q_ARG(QPixmap, pixmap));
}); });
m_PreviewRun = false; m_PreviewRun = false;
m_PreviewCs.Leave(); m_PreviewCs.Leave();
}; };
//The main rendering function which will be called in a Qt thread. //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. //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. //If it finishes successfully, delete the backup file.
@ -168,7 +158,6 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
m_Run = true; m_Run = true;
m_TotalTimer.Tic();//Begin timing for progress of all operations. m_TotalTimer.Tic();//Begin timing for progress of all operations.
m_GuiState = m_FinalRenderDialog->State();//Cache render settings from the GUI before running. m_GuiState = m_FinalRenderDialog->State();//Cache render settings from the GUI before running.
size_t i; size_t i;
bool doAll = m_GuiState.m_DoAll && m_EmberFile.Size() > 1; 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. size_t currentStripForProgress = 0;//Sort of a hack to get the strip value to the progress function.
@ -184,11 +173,10 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
m_FinishedImageCount.store(0); m_FinishedImageCount.store(0);
SyncGuiToRenderer(); SyncGuiToRenderer();
FirstOrDefaultRenderer()->m_ProgressParameter = reinterpret_cast<void*>(&currentStripForProgress);//When animating, only the first (primary) device has a progress parameter. FirstOrDefaultRenderer()->m_ProgressParameter = reinterpret_cast<void*>(&currentStripForProgress);//When animating, only the first (primary) device has a progress parameter.
m_GuiState.m_Strips = VerifyStrips(m_Ember->m_FinalRasH, m_GuiState.m_Strips, 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)); }, //Greater than height.
[&](const string& s) { Output(QString::fromStdString(s)); },//Mod height != 0. [&](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) + "\n"); }); //Final strips value to be set.
ResetProgress(); ResetProgress();
//The rendering process is different between doing a single image, and doing multiple. //The rendering process is different between doing a single image, and doing multiple.
@ -205,7 +193,7 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
for (i = 0; i < m_EmberFile.Size() && m_Run; i++) for (i = 0; i < m_EmberFile.Size() && m_Run; i++)
{ {
SyncGuiToEmber(m_EmberFile.m_Embers[i], firstEmber->m_FinalRasW, firstEmber->m_FinalRasH); SyncGuiToEmber(m_EmberFile.m_Embers[i], firstEmber->m_FinalRasW, firstEmber->m_FinalRasH);
if (i > 0) if (i > 0)
{ {
if (m_EmberFile.m_Embers[i].m_Time <= m_EmberFile.m_Embers[i - 1].m_Time) if (m_EmberFile.m_Embers[i].m_Time <= m_EmberFile.m_Embers[i - 1].m_Time)
@ -221,13 +209,11 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
std::atomic<size_t> atomfTime; std::atomic<size_t> atomfTime;
vector<std::thread> threadVec; vector<std::thread> threadVec;
//Not supporting strips with animation. //Not supporting strips with animation.
//Shouldn't be a problem because animations will be at max 4k x 2k which will take about 1GB //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; m_GuiState.m_Strips = 1;
atomfTime.store(0); atomfTime.store(0);
std::function<void(size_t)> iterFunc = [&](size_t index) std::function<void(size_t)> iterFunc = [&](size_t index)
{ {
size_t ftime; size_t ftime;
@ -244,7 +230,6 @@ FinalRenderEmberController<T>::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. 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); T localTime = T(ftime);
Output("Image " + ToString(ftime + 1ULL) + ":\n" + ComposePath(QString::fromStdString(m_EmberFile.m_Embers[ftime].m_Name))); 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. renderer->Reset();//Have to manually set this since the ember is not set each time through.
renderTimer.Tic();//Toc() is called in RenderComplete(). renderTimer.Tic();//Toc() is called in RenderComplete().
@ -264,18 +249,16 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
stats = renderer->Stats(); stats = renderer->Stats();
comments = renderer->ImageComments(stats, 0, false, true); comments = renderer->ImageComments(stats, 0, false, true);
writeThread = std::thread([&](size_t tempTime, size_t threadFinalImageIndex) writeThread = std::thread([&](size_t tempTime, size_t threadFinalImageIndex)
{ {
SaveCurrentRender(m_EmberFile.m_Embers[tempTime], 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. comments,//These all don't change during the renders, so it's ok to access them in the thread.
finalImages[threadFinalImageIndex], finalImages[threadFinalImageIndex],
renderer->FinalRasW(), renderer->FinalRasW(),
renderer->FinalRasH(), renderer->FinalRasH(),
renderer->NumChannels(), renderer->NumChannels(),
renderer->BytesPerChannel()); renderer->BytesPerChannel());
}, ftime, finalImageIndex); }, ftime, finalImageIndex);
m_FinishedImageCount.fetch_add(1); m_FinishedImageCount.fetch_add(1);
RenderComplete(m_EmberFile.m_Embers[ftime], stats, renderTimer); RenderComplete(m_EmberFile.m_Embers[ftime], stats, renderTimer);
@ -289,7 +272,6 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
if (writeThread.joinable())//One final check to make sure all writing is done before exiting this thread. if (writeThread.joinable())//One final check to make sure all writing is done before exiting this thread.
writeThread.join(); writeThread.join();
}; };
threadVec.reserve(m_Renderers.size()); threadVec.reserve(m_Renderers.size());
for (size_t r = 0; r < m_Renderers.size(); r++) for (size_t r = 0; r < m_Renderers.size(); r++)
@ -318,7 +300,6 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
m_Stats.Clear(); m_Stats.Clear();
Memset(m_FinalImage); Memset(m_FinalImage);
m_RenderTimer.Tic();//Toc() is called in RenderComplete(). m_RenderTimer.Tic();//Toc() is called in RenderComplete().
StripsRender<T>(m_Renderer.get(), m_EmberFile.m_Embers[i], m_FinalImage, 0, m_GuiState.m_Strips, m_GuiState.m_YAxisUp, StripsRender<T>(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) { currentStripForProgress = strip; },//Pre strip.
[&](size_t strip) { m_Stats += m_Renderer->Stats(); },//Post strip. [&](size_t strip) { m_Stats += m_Renderer->Stats(); },//Post strip.
@ -351,7 +332,6 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
Memset(m_FinalImage); Memset(m_FinalImage);
Output(ComposePath(QString::fromStdString(m_Ember->m_Name))); Output(ComposePath(QString::fromStdString(m_Ember->m_Name)));
m_RenderTimer.Tic();//Toc() is called in RenderComplete(). m_RenderTimer.Tic();//Toc() is called in RenderComplete().
StripsRender<T>(m_Renderer.get(), *m_Ember, m_FinalImage, 0, m_GuiState.m_Strips, m_GuiState.m_YAxisUp, StripsRender<T>(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) { currentStripForProgress = strip; },//Pre strip.
[&](size_t strip) { m_Stats += m_Renderer->Stats(); },//Post strip. [&](size_t strip) { m_Stats += m_Renderer->Stats(); },//Post strip.
@ -375,7 +355,6 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
QString totalTimeString = "All renders completed in: " + QString::fromStdString(m_TotalTimer.Format(m_TotalTimer.Toc())) + "."; QString totalTimeString = "All renders completed in: " + QString::fromStdString(m_TotalTimer.Format(m_TotalTimer.Toc())) + ".";
Output(totalTimeString); Output(totalTimeString);
QFile::remove(backup); QFile::remove(backup);
m_Run = false; m_Run = false;
}; };
@ -457,7 +436,6 @@ bool FinalRenderEmberController<T>::Render()
if (CreateRendererFromGUI()) if (CreateRendererFromGUI())
{ {
m_FinalRenderDialog->ui.FinalRenderTextOutput->setText("Preparing all parameters.\n"); m_FinalRenderDialog->ui.FinalRenderTextOutput->setText("Preparing all parameters.\n");
//Note that a Qt thread must be used, rather than a tbb task. //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 //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 //and dedicates an entire core just to this thread which does nothing waiting for the
@ -486,18 +464,16 @@ bool FinalRenderEmberController<T>::CreateRenderer(eRendererType renderType, con
bool deviceDiff = false; bool deviceDiff = false;
//uint channels = m_FinalRenderDialog->Ext().endsWith("png", Qt::CaseInsensitive) ? 4 : 3; //uint channels = m_FinalRenderDialog->Ext().endsWith("png", Qt::CaseInsensitive) ? 4 : 3;
bool renderTypeMismatch = (m_Renderer.get() && (m_Renderer->RendererType() != renderType)) || 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(); CancelRender();
if ((!m_FinalRenderDialog->DoSequence() && (!m_Renderer.get() || !m_Renderer->Ok())) || if ((!m_FinalRenderDialog->DoSequence() && (!m_Renderer.get() || !m_Renderer->Ok())) ||
(m_FinalRenderDialog->DoSequence() && m_Renderers.empty()) || (m_FinalRenderDialog->DoSequence() && m_Renderers.empty()) ||
renderTypeMismatch || renderTypeMismatch ||
!Equal(m_Devices, devices)) !Equal(m_Devices, devices))
{ {
EmberReport emberReport; EmberReport emberReport;
vector<string> errorReport; vector<string> errorReport;
m_Devices = devices;//Store values for re-creation later on. m_Devices = devices;//Store values for re-creation later on.
m_OutputTexID = 0;//Don't care about tex ID when doing final render. m_OutputTexID = 0;//Don't care about tex ID when doing final render.
m_Shared = shared;//So shared is of course false. m_Shared = shared;//So shared is of course false.
@ -555,7 +531,6 @@ int FinalRenderEmberController<T>::ProgressFunc(Ember<T>& ember, void* foo, doub
QMetaObject::invokeMethod(m_FinalRenderDialog->ui.FinalRenderImageCountLabel, "setText", Qt::QueuedConnection, Q_ARG(const QString&, ToString<qulonglong>(m_FinishedImageCount.load() + 1) + " / " + ToString<qulonglong>(m_ImageCount) + " Eta: " + QString::fromStdString(m_RenderTimer.Format(etaMs)))); QMetaObject::invokeMethod(m_FinalRenderDialog->ui.FinalRenderImageCountLabel, "setText", Qt::QueuedConnection, Q_ARG(const QString&, ToString<qulonglong>(m_FinishedImageCount.load() + 1) + " / " + ToString<qulonglong>(m_ImageCount) + " Eta: " + QString::fromStdString(m_RenderTimer.Format(etaMs))));
QMetaObject::invokeMethod(m_FinalRenderDialog->ui.FinalRenderTextOutput, "update", Qt::QueuedConnection); QMetaObject::invokeMethod(m_FinalRenderDialog->ui.FinalRenderTextOutput, "update", Qt::QueuedConnection);
return m_Run ? 1 : 0; return m_Run ? 1 : 0;
} }
@ -698,14 +673,12 @@ tuple<size_t, size_t, size_t> FinalRenderEmberController<T>::SyncAndComputeMemor
size_t strips; size_t strips;
bool b = false; bool b = false;
uint channels = m_FinalRenderDialog->Ext() == "png" ? 4 : 3;//4 channels for Png, else 3. uint channels = m_FinalRenderDialog->Ext() == "png" ? 4 : 3;//4 channels for Png, else 3.
SyncGuiToEmbers(); SyncGuiToEmbers();
if (m_Renderer.get()) if (m_Renderer.get())
{ {
strips = VerifyStrips(m_Ember->m_FinalRasH, m_FinalRenderDialog->Strips(), 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->SetEmber(*m_Ember);
m_Renderer->CreateSpatialFilter(b); m_Renderer->CreateSpatialFilter(b);
m_Renderer->CreateTemporalFilter(b); m_Renderer->CreateTemporalFilter(b);
@ -715,7 +688,6 @@ tuple<size_t, size_t, size_t> FinalRenderEmberController<T>::SyncAndComputeMemor
m_Renderer->ComputeCamera(); m_Renderer->ComputeCamera();
CancelPreviewRender(); CancelPreviewRender();
m_FinalPreviewRenderFunc(); m_FinalPreviewRenderFunc();
p = m_Renderer->MemoryRequired(strips, true, m_FinalRenderDialog->DoSequence()); p = m_Renderer->MemoryRequired(strips, true, m_FinalRenderDialog->DoSequence());
iterCount = m_Renderer->TotalIterCount(strips); iterCount = m_Renderer->TotalIterCount(strips);
} }
@ -734,14 +706,12 @@ tuple<size_t, size_t, size_t> FinalRenderEmberController<T>::SyncAndComputeMemor
CancelPreviewRender(); CancelPreviewRender();
m_FinalPreviewRenderFunc(); m_FinalPreviewRenderFunc();
strips = 1; strips = 1;
p = m_Renderers[0]->MemoryRequired(1, true, m_FinalRenderDialog->DoSequence()); p = m_Renderers[0]->MemoryRequired(1, true, m_FinalRenderDialog->DoSequence());
iterCount = m_Renderers[0]->TotalIterCount(strips); iterCount = m_Renderers[0]->TotalIterCount(strips);
} }
m_FinalRenderDialog->m_StripsSpin->setSuffix(" (" + ToString<qulonglong>(strips) +")"); m_FinalRenderDialog->m_StripsSpin->setSuffix(" (" + ToString<qulonglong>(strips) + ")");
return tuple<size_t, size_t, size_t>(p.first, p.second, iterCount); return tuple<size_t, size_t, size_t>(p.first, p.second, iterCount);
} }
@ -757,7 +727,6 @@ QString FinalRenderEmberController<T>::ComposePath(const QString& name)
{ {
QString path = MakeEnd(m_Settings->SaveFolder(), '/');//Base path. QString path = MakeEnd(m_Settings->SaveFolder(), '/');//Base path.
QString full = path + m_FinalRenderDialog->Prefix() + name + m_FinalRenderDialog->Suffix() + "." + m_FinalRenderDialog->Ext(); QString full = path + m_FinalRenderDialog->Prefix() + name + m_FinalRenderDialog->Suffix() + "." + m_FinalRenderDialog->Ext();
return EmberFile<T>::UniqueFilename(full); return EmberFile<T>::UniqueFilename(full);
} }
@ -794,7 +763,9 @@ void FinalRenderEmberController<T>::CancelPreviewRender()
m_FinalPreviewRenderer->Abort(); m_FinalPreviewRenderer->Abort();
while (m_FinalPreviewRenderer->InRender()) { QApplication::processEvents(); } while (m_FinalPreviewRenderer->InRender()) { QApplication::processEvents(); }
while (m_PreviewRun) { QApplication::processEvents(); } while (m_PreviewRun) { QApplication::processEvents(); }
while (m_FinalPreviewResult.isRunning()) { QApplication::processEvents(); } while (m_FinalPreviewResult.isRunning()) { QApplication::processEvents(); }
} }
@ -871,13 +842,12 @@ void FinalRenderEmberController<T>::RenderComplete(Ember<T>& ember, const EmberS
QString status, filename = ComposePath(QString::fromStdString(ember.m_Name)); QString status, filename = ComposePath(QString::fromStdString(ember.m_Name));
QString itersString = ToString<qulonglong>(stats.m_Iters); QString itersString = ToString<qulonglong>(stats.m_Iters);
QString itersPerSecString = ToString<qulonglong>(size_t(stats.m_Iters / (stats.m_IterMs / 1000.0))); QString itersPerSecString = ToString<qulonglong>(size_t(stats.m_Iters / (stats.m_IterMs / 1000.0)));
if (m_GuiState.m_SaveXml) if (m_GuiState.m_SaveXml)
{ {
QFileInfo xmlFileInfo(filename);//Create another one in case it was modified for batch rendering. QFileInfo xmlFileInfo(filename);//Create another one in case it was modified for batch rendering.
QString newPath = xmlFileInfo.absolutePath() + '/' + xmlFileInfo.completeBaseName() + ".flame"; QString newPath = xmlFileInfo.absolutePath() + '/' + xmlFileInfo.completeBaseName() + ".flame";
xmlDocPtr tempEdit = ember.m_Edits; 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); 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. 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<T>::RenderComplete(Ember<T>& ember, const EmberS
status = "Pure render time: " + QString::fromStdString(renderTimeString); status = "Pure render time: " + QString::fromStdString(renderTimeString);
Output(status); Output(status);
totalTimeString = renderTimer.Format(renderTimer.Toc()); totalTimeString = renderTimer.Format(renderTimer.Toc());
status = "Total time: " + QString::fromStdString(totalTimeString) + "\nTotal iters: " + itersString + "\nIters/second: " + itersPerSecString + "\n"; status = "Total time: " + QString::fromStdString(totalTimeString) + "\nTotal iters: " + itersString + "\nIters/second: " + itersPerSecString + "\n";
Output(status); Output(status);
@ -940,14 +909,12 @@ void FinalRenderEmberController<T>::SyncGuiToEmber(Ember<T>& ember, size_t width
{ {
double wScale = m_FinalRenderDialog->m_WidthScaleSpin->value(); double wScale = m_FinalRenderDialog->m_WidthScaleSpin->value();
double hScale = m_FinalRenderDialog->m_HeightScaleSpin->value(); double hScale = m_FinalRenderDialog->m_HeightScaleSpin->value();
w = ember.m_OrigFinalRasW * wScale; w = ember.m_OrigFinalRasW * wScale;
h = ember.m_OrigFinalRasH * hScale; h = ember.m_OrigFinalRasH * hScale;
} }
w = std::max<size_t>(w, 10); w = std::max<size_t>(w, 10);
h = std::max<size_t>(h, 10); h = std::max<size_t>(h, 10);
ember.SetSizeAndAdjustScale(w, h, false, m_FinalRenderDialog->Scale()); ember.SetSizeAndAdjustScale(w, h, false, m_FinalRenderDialog->Scale());
ember.m_Quality = m_FinalRenderDialog->m_QualitySpin->value(); ember.m_Quality = m_FinalRenderDialog->m_QualitySpin->value();
ember.m_Supersample = m_FinalRenderDialog->m_SupersampleSpin->value(); ember.m_Supersample = m_FinalRenderDialog->m_SupersampleSpin->value();

View File

@ -14,20 +14,18 @@
/// is present here, it's safe to assume it can't be done in the designer. /// is present here, it's safe to assume it can't be done in the designer.
/// </summary> /// </summary>
/// <param name="p">The parent widget of this item</param> /// <param name="p">The parent widget of this item</param>
Fractorium::Fractorium(QWidget* p) Fractorium::Fractorium(QWidget* p)
: QMainWindow(p), : QMainWindow(p)
m_Info(OpenCLInfo::Instance())
{ {
int spinHeight = 20, iconSize_ = 9; int spinHeight = 20, iconSize_ = 9;
size_t i = 0; size_t i = 0;
string s; string s;
Timing t; Timing t;
ui.setupUi(this); ui.setupUi(this);
m_Info = OpenCLInfo::Instance();
qRegisterMetaType<QVector<int>>("QVector<int>");//For previews. qRegisterMetaType<QVector<int>>("QVector<int>");//For previews.
qRegisterMetaType<vector<byte>>("vector<byte>"); qRegisterMetaType<vector<byte>>("vector<byte>");
qRegisterMetaType<EmberTreeWidgetItemBase*>("EmberTreeWidgetItemBase*"); qRegisterMetaType<EmberTreeWidgetItemBase*>("EmberTreeWidgetItemBase*");
setDockOptions(DockOption::AllowNestedDocks | DockOption::AllowTabbedDocks); setDockOptions(DockOption::AllowNestedDocks | DockOption::AllowTabbedDocks);
setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::TabPosition::North); setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::TabPosition::North);
setTabShape(QTabWidget::TabShape::Triangular); setTabShape(QTabWidget::TabShape::Triangular);
@ -36,7 +34,6 @@ Fractorium::Fractorium(QWidget* p)
tabifyDockWidget(ui.XformsDockWidget, ui.XaosDockWidget); tabifyDockWidget(ui.XformsDockWidget, ui.XaosDockWidget);
tabifyDockWidget(ui.XaosDockWidget, ui.PaletteDockWidget); tabifyDockWidget(ui.XaosDockWidget, ui.PaletteDockWidget);
tabifyDockWidget(ui.PaletteDockWidget, ui.InfoDockWidget); tabifyDockWidget(ui.PaletteDockWidget, ui.InfoDockWidget);
m_Docks.reserve(8); m_Docks.reserve(8);
m_Docks.push_back(ui.LibraryDockWidget); m_Docks.push_back(ui.LibraryDockWidget);
m_Docks.push_back(ui.FlameDockWidget); 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.XaosDockWidget);
m_Docks.push_back(ui.PaletteDockWidget); m_Docks.push_back(ui.PaletteDockWidget);
m_Docks.push_back(ui.InfoDockWidget); m_Docks.push_back(ui.InfoDockWidget);
m_FontSize = 9; m_FontSize = 9;
m_VarSortMode = 1;//Sort by weight by default. m_VarSortMode = 1;//Sort by weight by default.
m_PaletteSortMode = 0;//Sort by palette ascending by default. m_PaletteSortMode = 0;//Sort by palette ascending by default.
m_ColorDialog = new QColorDialog(this); m_ColorDialog = new QColorDialog(this);
m_Settings = new FractoriumSettings(this); m_Settings = new FractoriumSettings(this);
m_QssDialog = new QssDialog(this); m_QssDialog = new QssDialog(this);
m_FileDialog = nullptr;//Use lazy instantiation upon first use. m_FileDialog = nullptr;//Use lazy instantiation upon first use.
m_FolderDialog = nullptr; m_FolderDialog = nullptr;
m_FinalRenderDialog = new FractoriumFinalRenderDialog(m_Settings, this); m_FinalRenderDialog = new FractoriumFinalRenderDialog(m_Settings, this);
m_OptionsDialog = new FractoriumOptionsDialog(m_Settings, this); m_OptionsDialog = new FractoriumOptionsDialog(m_Settings, this);
m_VarDialog = new FractoriumVariationsDialog(m_Settings, this); m_VarDialog = new FractoriumVariationsDialog(m_Settings, this);
m_AboutDialog = new FractoriumAboutDialog(this); m_AboutDialog = new FractoriumAboutDialog(this);
//Put the about dialog in the screen center. //Put the about dialog in the screen center.
const QRect screen = QApplication::desktop()->screenGeometry(); const QRect screen = QApplication::desktop()->screenGeometry();
m_AboutDialog->move(screen.center() - m_AboutDialog->rect().center()); m_AboutDialog->move(screen.center() - m_AboutDialog->rect().center());
connect(m_ColorDialog, SIGNAL(colorSelected(const QColor&)), this, SLOT(OnColorSelected(const QColor&)), Qt::QueuedConnection); 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(0XFF, 0X00, 0X00);
m_XformComboColors[i++] = QColor(0XCC, 0XCC, 0X00); m_XformComboColors[i++] = QColor(0XCC, 0XCC, 0X00);
m_XformComboColors[i++] = QColor(0X00, 0XCC, 0X00); m_XformComboColors[i++] = QColor(0X00, 0XCC, 0X00);
m_XformComboColors[i++] = QColor(0X00, 0XCC, 0XCC); m_XformComboColors[i++] = QColor(0X00, 0XCC, 0XCC);
m_XformComboColors[i++] = QColor(0X40, 0X40, 0XFF); m_XformComboColors[i++] = QColor(0X40, 0X40, 0XFF);
m_XformComboColors[i++] = QColor(0XCC, 0X00, 0XCC); m_XformComboColors[i++] = QColor(0XCC, 0X00, 0XCC);
m_XformComboColors[i++] = QColor(0XCC, 0X80, 0X00); m_XformComboColors[i++] = QColor(0XCC, 0X80, 0X00);
m_XformComboColors[i++] = QColor(0X80, 0X00, 0X4F); m_XformComboColors[i++] = QColor(0X80, 0X00, 0X4F);
m_XformComboColors[i++] = QColor(0X80, 0X80, 0X22); m_XformComboColors[i++] = QColor(0X80, 0X80, 0X22);
m_XformComboColors[i++] = QColor(0X60, 0X80, 0X60); m_XformComboColors[i++] = QColor(0X60, 0X80, 0X60);
m_XformComboColors[i++] = QColor(0X50, 0X80, 0X80); m_XformComboColors[i++] = QColor(0X50, 0X80, 0X80);
m_XformComboColors[i++] = QColor(0X4F, 0X4F, 0X80); m_XformComboColors[i++] = QColor(0X4F, 0X4F, 0X80);
m_XformComboColors[i++] = QColor(0X80, 0X50, 0X80); m_XformComboColors[i++] = QColor(0X80, 0X50, 0X80);
m_XformComboColors[i++] = QColor(0X80, 0X60, 0X22); m_XformComboColors[i++] = QColor(0X80, 0X60, 0X22);
m_FinalXformComboColor = QColor(0x7F, 0x7F, 0x7F); m_FinalXformComboColor = QColor(0x7F, 0x7F, 0x7F);
for (i = 0; i < XFORM_COLOR_COUNT; i++) for (i = 0; i < XFORM_COLOR_COUNT; i++)
{ {
QPixmap pixmap(iconSize_, iconSize_); QPixmap pixmap(iconSize_, iconSize_);
pixmap.fill(m_XformComboColors[i]); pixmap.fill(m_XformComboColors[i]);
m_XformComboIcons[i] = QIcon(pixmap); m_XformComboIcons[i] = QIcon(pixmap);
} }
QPixmap pixmap(iconSize_, iconSize_); QPixmap pixmap(iconSize_, iconSize_);
pixmap.fill(m_FinalXformComboColor); pixmap.fill(m_FinalXformComboColor);
m_FinalXformComboIcon = QIcon(pixmap); m_FinalXformComboIcon = QIcon(pixmap);
InitToolbarUI(); InitToolbarUI();
InitParamsUI(); InitParamsUI();
InitXformsUI(); InitXformsUI();
@ -108,10 +95,10 @@ Fractorium::Fractorium(QWidget* p)
InitLibraryUI(); InitLibraryUI();
InitInfoUI(); InitInfoUI();
InitMenusUI(); InitMenusUI();
//This will init the controller and fill in the variations and palette tables with template specific instances //This will init the controller and fill in the variations and palette tables with template specific instances
//of their respective objects. //of their respective objects.
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
if (m_Settings->Double()) if (m_Settings->Double())
m_Controller = unique_ptr<FractoriumEmberControllerBase>(new FractoriumEmberController<double>(this)); m_Controller = unique_ptr<FractoriumEmberControllerBase>(new FractoriumEmberController<double>(this));
else else
@ -121,24 +108,21 @@ Fractorium::Fractorium(QWidget* p)
m_Controller->SetupVariationTree(); m_Controller->SetupVariationTree();
m_Controller->FilteredVariations(); 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()); m_QualitySpin->setValue(30 * m_Settings->Devices().size());
int statusBarHeight = 20 * devicePixelRatio(); int statusBarHeight = 20 * devicePixelRatio();
ui.StatusBar->setMinimumHeight(statusBarHeight); ui.StatusBar->setMinimumHeight(statusBarHeight);
ui.StatusBar->setMaximumHeight(statusBarHeight); ui.StatusBar->setMaximumHeight(statusBarHeight);
m_RenderStatusLabel = new QLabel(this); m_RenderStatusLabel = new QLabel(this);
m_RenderStatusLabel->setMinimumWidth(200); m_RenderStatusLabel->setMinimumWidth(200);
m_RenderStatusLabel->setAlignment(Qt::AlignRight); m_RenderStatusLabel->setAlignment(Qt::AlignRight);
ui.StatusBar->addPermanentWidget(m_RenderStatusLabel); ui.StatusBar->addPermanentWidget(m_RenderStatusLabel);
m_CoordinateStatusLabel = new QLabel(this); m_CoordinateStatusLabel = new QLabel(this);
m_CoordinateStatusLabel->setMinimumWidth(300); m_CoordinateStatusLabel->setMinimumWidth(300);
m_CoordinateStatusLabel->setMaximumWidth(300); m_CoordinateStatusLabel->setMaximumWidth(300);
m_CoordinateStatusLabel->setAlignment(Qt::AlignLeft); m_CoordinateStatusLabel->setAlignment(Qt::AlignLeft);
ui.StatusBar->addWidget(m_CoordinateStatusLabel); ui.StatusBar->addWidget(m_CoordinateStatusLabel);
int progressBarHeight = 15; int progressBarHeight = 15;
int progressBarWidth = 300; int progressBarWidth = 300;
m_ProgressBar = new QProgressBar(this); m_ProgressBar = new QProgressBar(this);
@ -149,15 +133,13 @@ Fractorium::Fractorium(QWidget* p)
m_ProgressBar->setMinimumWidth(progressBarWidth); m_ProgressBar->setMinimumWidth(progressBarWidth);
m_ProgressBar->setMaximumWidth(progressBarWidth); m_ProgressBar->setMaximumWidth(progressBarWidth);
ui.StatusBar->addPermanentWidget(m_ProgressBar); ui.StatusBar->addPermanentWidget(m_ProgressBar);
//Setup pointer in the GL window to point back to here. //Setup pointer in the GL window to point back to here.
ui.GLDisplay->SetMainWindow(this); ui.GLDisplay->SetMainWindow(this);
bool restored = restoreState(m_Settings->value("windowState").toByteArray()); bool restored = restoreState(m_Settings->value("windowState").toByteArray());
showMaximized();//This won't fully set things up and show them until after this constructor exits. 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(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(dockLocationChanged(Qt::DockWidgetArea)));
connect(ui.LibraryDockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(OnDockTopLevelChanged(bool))); connect(ui.LibraryDockWidget, SIGNAL(topLevelChanged(bool)), this, SLOT(OnDockTopLevelChanged(bool)));
//Always ensure the library tab is selected, which will show preview renders. //Always ensure the library tab is selected, which will show preview renders.
if (!restored) if (!restored)
{ {
@ -243,7 +225,6 @@ void Fractorium::CenterScrollbars()
{ {
QScrollBar* w = ui.GLParentScrollArea->horizontalScrollBar(); QScrollBar* w = ui.GLParentScrollArea->horizontalScrollBar();
QScrollBar* h = ui.GLParentScrollArea->verticalScrollBar(); QScrollBar* h = ui.GLParentScrollArea->verticalScrollBar();
w->setValue(w->maximum() / 2); w->setValue(w->maximum() / 2);
h->setValue(h->maximum() / 2); h->setValue(h->maximum() / 2);
} }
@ -267,7 +248,6 @@ void FractoriumEmberController<T>::ApplyXmlSavingTemplate(Ember<T>& ember)
bool Fractorium::HaveFinal() bool Fractorium::HaveFinal()
{ {
QComboBox* combo = ui.CurrentXformCombo; QComboBox* combo = ui.CurrentXformCombo;
return (combo->count() > 0 && combo->itemText(combo->count() - 1) == "Final"); 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 /// but telling it that this window has become the focus window forces
/// it to refresh this. /// it to refresh this.
/// <param name="e">The event</param> /// <param name="e">The event</param>
void Fractorium::showEvent(QShowEvent *e) void Fractorium::showEvent(QShowEvent* e)
{ {
//Tell Qt to refresh the native menubar from this widget. //Tell Qt to refresh the native menubar from this widget.
emit qGuiApp->focusWindowChanged(windowHandle()); 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<string>& vals, const char* signal, const char* slot, Qt::ConnectionType connectionType) void Fractorium::SetupCombo(QTableWidget* table, const QObject* receiver, int& row, int col, StealthComboBox*& comboBox, const vector<string>& vals, const char* signal, const char* slot, Qt::ConnectionType connectionType)
{ {
comboBox = new StealthComboBox(table); comboBox = new StealthComboBox(table);
for (auto& s : vals) comboBox->addItem(s.c_str()); for (auto& s : vals) comboBox->addItem(s.c_str());
table->setCellWidget(row, col, comboBox); table->setCellWidget(row, col, comboBox);
connect(comboBox, signal, receiver, slot, connectionType); connect(comboBox, signal, receiver, slot, connectionType);
row++; row++;
@ -507,14 +489,13 @@ QStringList Fractorium::SetupOpenXmlDialog()
m_FileDialog = new QFileDialog(this); m_FileDialog = new QFileDialog(this);
m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setViewMode(QFileDialog::List);
} }
if (!m_FileDialog) if (!m_FileDialog)
return QStringList(""); return QStringList("");
QStringList filenames; QStringList filenames;
m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); 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->setFileMode(QFileDialog::ExistingFiles);
m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen); m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen);
m_FileDialog->setNameFilter("Flam3 (*.flam3);;Flame (*.flame);;Xml (*.xml)"); 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 = new QFileDialog(this);
m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setViewMode(QFileDialog::List);
} }
if (!m_FileDialog) if (!m_FileDialog)
return ""; return "";
QString filename; QString filename;
m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); 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 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. //This is most likely a bug in QFileDialog.
m_FileDialog->setAcceptMode(QFileDialog::AcceptSave); m_FileDialog->setAcceptMode(QFileDialog::AcceptSave);
@ -585,15 +564,13 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename)
m_FileDialog = new QFileDialog(this); m_FileDialog = new QFileDialog(this);
m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setViewMode(QFileDialog::List);
} }
if (!m_FileDialog) if (!m_FileDialog)
return ""; return "";
QString filename; QString filename;
m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); 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 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. //This is most likely a bug in QFileDialog.
m_FileDialog->setAcceptMode(QFileDialog::AcceptSave); m_FileDialog->setAcceptMode(QFileDialog::AcceptSave);
@ -625,12 +602,11 @@ QString Fractorium::SetupSaveFolderDialog()
m_FolderDialog = new QFileDialog(this); m_FolderDialog = new QFileDialog(this);
m_FolderDialog->setViewMode(QFileDialog::List); m_FolderDialog->setViewMode(QFileDialog::List);
} }
if (!m_FolderDialog) if (!m_FolderDialog)
return ""; return "";
QString filename; QString filename;
//This must come first because it clears various internal states which allow the file text to be properly set. //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. //This is most likely a bug in QFileDialog.
m_FolderDialog->setAcceptMode(QFileDialog::AcceptSave); m_FolderDialog->setAcceptMode(QFileDialog::AcceptSave);
@ -672,14 +648,12 @@ void Fractorium::ShowCritical(const QString& title, const QString& text, bool in
void Fractorium::SetTabOrders() void Fractorium::SetTabOrders()
{ {
QWidget* w = SetTabOrder(this, ui.ColorTable, m_BrightnessSpin);//Flame. QWidget* w = SetTabOrder(this, ui.ColorTable, m_BrightnessSpin);//Flame.
w = SetTabOrder(this, w, m_GammaSpin); w = SetTabOrder(this, w, m_GammaSpin);
w = SetTabOrder(this, w, m_GammaThresholdSpin); w = SetTabOrder(this, w, m_GammaThresholdSpin);
w = SetTabOrder(this, w, m_VibrancySpin); w = SetTabOrder(this, w, m_VibrancySpin);
w = SetTabOrder(this, w, m_HighlightSpin); w = SetTabOrder(this, w, m_HighlightSpin);
w = SetTabOrder(this, w, m_BackgroundColorButton); w = SetTabOrder(this, w, m_BackgroundColorButton);
w = SetTabOrder(this, w, m_PaletteModeCombo); w = SetTabOrder(this, w, m_PaletteModeCombo);
w = SetTabOrder(this, w, m_CenterXSpin); w = SetTabOrder(this, w, m_CenterXSpin);
w = SetTabOrder(this, w, m_CenterYSpin); w = SetTabOrder(this, w, m_CenterYSpin);
w = SetTabOrder(this, w, m_ScaleSpin); w = SetTabOrder(this, w, m_ScaleSpin);
@ -690,20 +664,17 @@ void Fractorium::SetTabOrders()
w = SetTabOrder(this, w, m_PitchSpin); w = SetTabOrder(this, w, m_PitchSpin);
w = SetTabOrder(this, w, m_YawSpin); w = SetTabOrder(this, w, m_YawSpin);
w = SetTabOrder(this, w, m_DepthBlurSpin); w = SetTabOrder(this, w, m_DepthBlurSpin);
w = SetTabOrder(this, w, m_SpatialFilterWidthSpin); w = SetTabOrder(this, w, m_SpatialFilterWidthSpin);
w = SetTabOrder(this, w, m_SpatialFilterTypeCombo); w = SetTabOrder(this, w, m_SpatialFilterTypeCombo);
w = SetTabOrder(this, w, m_TemporalFilterTypeCombo); w = SetTabOrder(this, w, m_TemporalFilterTypeCombo);
w = SetTabOrder(this, w, m_DEFilterMinRadiusSpin); w = SetTabOrder(this, w, m_DEFilterMinRadiusSpin);
w = SetTabOrder(this, w, m_DEFilterMaxRadiusSpin); w = SetTabOrder(this, w, m_DEFilterMaxRadiusSpin);
w = SetTabOrder(this, w, m_DECurveSpin); w = SetTabOrder(this, w, m_DECurveSpin);
w = SetTabOrder(this, w, m_TemporalSamplesSpin); w = SetTabOrder(this, w, m_TemporalSamplesSpin);
w = SetTabOrder(this, w, m_QualitySpin); w = SetTabOrder(this, w, m_QualitySpin);
w = SetTabOrder(this, w, m_SupersampleSpin); w = SetTabOrder(this, w, m_SupersampleSpin);
w = SetTabOrder(this, w, m_AffineInterpTypeCombo); w = SetTabOrder(this, w, m_AffineInterpTypeCombo);
w = SetTabOrder(this, w, m_InterpTypeCombo); w = SetTabOrder(this, w, m_InterpTypeCombo);
w = SetTabOrder(this, ui.CurrentXformCombo, ui.AddXformButton);//Xforms. w = SetTabOrder(this, ui.CurrentXformCombo, ui.AddXformButton);//Xforms.
w = SetTabOrder(this, w, ui.DuplicateXformButton); w = SetTabOrder(this, w, ui.DuplicateXformButton);
w = SetTabOrder(this, w, ui.ClearXformButton); w = SetTabOrder(this, w, ui.ClearXformButton);
@ -711,13 +682,11 @@ void Fractorium::SetTabOrders()
w = SetTabOrder(this, w, ui.AddFinalXformButton); w = SetTabOrder(this, w, ui.AddFinalXformButton);
w = SetTabOrder(this, w, m_XformWeightSpin); w = SetTabOrder(this, w, m_XformWeightSpin);
w = SetTabOrder(this, w, m_XformWeightSpinnerButtonWidget->m_Button); w = SetTabOrder(this, w, m_XformWeightSpinnerButtonWidget->m_Button);
w = SetTabOrder(this, m_XformColorIndexSpin, ui.XformColorScroll);//Xforms color. w = SetTabOrder(this, m_XformColorIndexSpin, ui.XformColorScroll);//Xforms color.
w = SetTabOrder(this, w, m_XformColorSpeedSpin); w = SetTabOrder(this, w, m_XformColorSpeedSpin);
w = SetTabOrder(this, w, m_XformOpacitySpin); w = SetTabOrder(this, w, m_XformOpacitySpin);
w = SetTabOrder(this, w, m_XformDirectColorSpin); w = SetTabOrder(this, w, m_XformDirectColorSpin);
w = SetTabOrder(this, w, ui.SoloXformCheckBox); w = SetTabOrder(this, w, ui.SoloXformCheckBox);
w = SetTabOrder(this, ui.PreAffineGroupBox, m_PreX1Spin);//Xforms affine. w = SetTabOrder(this, ui.PreAffineGroupBox, m_PreX1Spin);//Xforms affine.
w = SetTabOrder(this, w, m_PreX2Spin); w = SetTabOrder(this, w, m_PreX2Spin);
w = SetTabOrder(this, w, m_PreY1Spin); w = SetTabOrder(this, w, m_PreY1Spin);
@ -769,12 +738,9 @@ void Fractorium::SetTabOrders()
w = SetTabOrder(this, w, ui.ShowPostAffineAllRadio); w = SetTabOrder(this, w, ui.ShowPostAffineAllRadio);
w = SetTabOrder(this, w, ui.LocalPivotRadio); w = SetTabOrder(this, w, ui.LocalPivotRadio);
w = SetTabOrder(this, w, ui.WorldPivotRadio); w = SetTabOrder(this, w, ui.WorldPivotRadio);
w = SetTabOrder(this, ui.VariationsFilterLineEdit, ui.VariationsFilterClearButton);//Xforms variation. w = SetTabOrder(this, ui.VariationsFilterLineEdit, ui.VariationsFilterClearButton);//Xforms variation.
w = SetTabOrder(this, w, ui.VariationsTree); w = SetTabOrder(this, w, ui.VariationsTree);
//Xforms xaos is done dynamically every time. //Xforms xaos is done dynamically every time.
w = SetTabOrder(this, m_PaletteHueSpin, m_PaletteContrastSpin);//Palette. w = SetTabOrder(this, m_PaletteHueSpin, m_PaletteContrastSpin);//Palette.
w = SetTabOrder(this, w, m_PaletteSaturationSpin); w = SetTabOrder(this, w, m_PaletteSaturationSpin);
w = SetTabOrder(this, w, m_PaletteBlurSpin); w = SetTabOrder(this, w, m_PaletteBlurSpin);
@ -783,12 +749,8 @@ void Fractorium::SetTabOrders()
w = SetTabOrder(this, w, ui.PaletteFilterLineEdit); w = SetTabOrder(this, w, ui.PaletteFilterLineEdit);
w = SetTabOrder(this, w, ui.PaletteFilterClearButton); w = SetTabOrder(this, w, ui.PaletteFilterClearButton);
w = SetTabOrder(this, w, ui.PaletteListTable); w = SetTabOrder(this, w, ui.PaletteListTable);
w = SetTabOrder(this, ui.SummaryTable, ui.SummaryTree);//Info summary. w = SetTabOrder(this, ui.SummaryTable, ui.SummaryTree);//Info summary.
w = SetTabOrder(this, ui.InfoBoundsGroupBox, ui.InfoBoundsFrame);//Info bounds. w = SetTabOrder(this, ui.InfoBoundsGroupBox, ui.InfoBoundsFrame);//Info bounds.
w = SetTabOrder(this, w, ui.InfoBoundsTable); w = SetTabOrder(this, w, ui.InfoBoundsTable);
w = SetTabOrder(this, w, ui.InfoFileOpeningGroupBox); w = SetTabOrder(this, w, ui.InfoFileOpeningGroupBox);
w = SetTabOrder(this, w, ui.InfoFileOpeningTextEdit); w = SetTabOrder(this, w, ui.InfoFileOpeningTextEdit);
@ -872,7 +834,6 @@ void Fractorium::ToggleTableCol(QTableView* table, int logicalIndex)
auto model = table->model(); auto model = table->model();
int rows = model->rowCount(); int rows = model->rowCount();
bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier); bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier);
auto tableWidget = qobject_cast<QTableWidget*>(table); auto tableWidget = qobject_cast<QTableWidget*>(table);
if (tableWidget) if (tableWidget)

View File

@ -50,7 +50,7 @@ template <typename T> class FinalRenderEmberController;
/// upon first use with lazy instantiation and then kept around for the remainder of the program. /// 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. /// 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 /// 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. /// 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. /// The order of the functions in each .cpp file should roughly match the order they appear in the .h file.
/// Future todo list: /// Future todo list:
@ -74,13 +74,13 @@ class Fractorium : public QMainWindow
friend FractoriumEmberController<float>; friend FractoriumEmberController<float>;
friend FinalRenderEmberControllerBase; friend FinalRenderEmberControllerBase;
friend FinalRenderEmberController<float>; friend FinalRenderEmberController<float>;
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
friend GLEmberController<double>; friend GLEmberController<double>;
friend FractoriumEmberController<double>; friend FractoriumEmberController<double>;
friend FinalRenderEmberController<double>; friend FinalRenderEmberController<double>;
#endif #endif
public: public:
Fractorium(QWidget* p = 0); Fractorium(QWidget* p = 0);
~Fractorium(); ~Fractorium();
@ -99,7 +99,7 @@ public:
bool DrawAllPre(); bool DrawAllPre();
bool DrawAllPost(); bool DrawAllPost();
bool LocalPivot(); bool LocalPivot();
public slots: public slots:
//Dock. //Dock.
void OnDockTopLevelChanged(bool topLevel); void OnDockTopLevelChanged(bool topLevel);
@ -306,7 +306,7 @@ protected:
virtual void dragEnterEvent(QDragEnterEvent* e) override; virtual void dragEnterEvent(QDragEnterEvent* e) override;
virtual void dragMoveEvent(QDragMoveEvent* e) override; virtual void dragMoveEvent(QDragMoveEvent* e) override;
virtual void dropEvent(QDropEvent* e) override; virtual void dropEvent(QDropEvent* e) override;
virtual void showEvent(QShowEvent *e) override; virtual void showEvent(QShowEvent* e) override;
private: private:
void InitMenusUI(); void InitMenusUI();
@ -353,7 +353,7 @@ private:
//Xaos. //Xaos.
void FillXaosTable(); void FillXaosTable();
//Palette. //Palette.
void ResetPaletteControls(); void ResetPaletteControls();
void SetPaletteFileComboIndex(const string& filename); void SetPaletteFileComboIndex(const string& filename);
@ -415,7 +415,7 @@ private:
SpinBox* m_TemporalSamplesSpin; SpinBox* m_TemporalSamplesSpin;
StealthComboBox* m_AffineInterpTypeCombo; StealthComboBox* m_AffineInterpTypeCombo;
StealthComboBox* m_InterpTypeCombo; StealthComboBox* m_InterpTypeCombo;
//Xforms. //Xforms.
DoubleSpinBox* m_XformWeightSpin; DoubleSpinBox* m_XformWeightSpin;
SpinnerButtonWidget* m_XformWeightSpinnerButtonWidget; SpinnerButtonWidget* m_XformWeightSpinnerButtonWidget;
@ -444,7 +444,7 @@ private:
DoubleSpinBox* m_PostY2Spin; DoubleSpinBox* m_PostY2Spin;
DoubleSpinBox* m_PostO1Spin; DoubleSpinBox* m_PostO1Spin;
DoubleSpinBox* m_PostO2Spin; DoubleSpinBox* m_PostO2Spin;
DoubleSpinBox* m_PreSpins[6]; DoubleSpinBox* m_PreSpins[6];
DoubleSpinBox* m_PostSpins[6]; DoubleSpinBox* m_PostSpins[6];
@ -499,7 +499,7 @@ private:
int m_VarSortMode; int m_VarSortMode;
int m_PaletteSortMode; int m_PaletteSortMode;
int m_PreviousPaletteRow; int m_PreviousPaletteRow;
OpenCLInfo& m_Info; shared_ptr<OpenCLInfo> m_Info;
unique_ptr<FractoriumEmberControllerBase> m_Controller; unique_ptr<FractoriumEmberControllerBase> m_Controller;
Ui::FractoriumClass ui; Ui::FractoriumClass ui;
}; };

View File

@ -71,7 +71,7 @@ static QWidget* SetTabOrder(QWidget* p, QWidget* w1, QWidget* w2)
/// <param name="s">The string to convert</param> /// <param name="s">The string to convert</param>
/// <param name="ok">Pointer to boolean which stores the success value of the conversion</param> /// <param name="ok">Pointer to boolean which stores the success value of the conversion</param>
/// <returns>The converted value if successful, else 0.</returns> /// <returns>The converted value if successful, else 0.</returns>
static double ToDouble(const QString &s, bool *ok) static double ToDouble(const QString& s, bool* ok)
{ {
return QLocale::system().toDouble(s, ok); return QLocale::system().toDouble(s, ok);
} }
@ -109,7 +109,7 @@ static QString MakeEnd(const QString& s, T e)
/// <returns>True if s was not empty and existed, else false.</returns> /// <returns>True if s was not empty and existed, else false.</returns>
static bool Exists(const QString& s) static bool Exists(const QString& s)
{ {
return s != "" && QDir(s).exists(); return s != "" && QDir(s).exists();
} }
/// <summary> /// <summary>
@ -121,9 +121,8 @@ static QColor VisibleColor(const QColor& color)
{ {
int threshold = 105; int threshold = 105;
int delta = (color.red() * 0.299) + //Magic numbers gotten from a Stack Overflow post. int delta = (color.red() * 0.299) + //Magic numbers gotten from a Stack Overflow post.
(color.green() * 0.587) + (color.green() * 0.587) +
(color.blue() * 0.114); (color.blue() * 0.114);
QColor textColor = (255 - delta < threshold) ? QColor(0, 0, 0) : QColor(255, 255, 255); QColor textColor = (255 - delta < threshold) ? QColor(0, 0, 0) : QColor(255, 255, 255);
return textColor; return textColor;
} }
@ -196,9 +195,7 @@ static intmax_t IsXformLinked(Ember<T>& ember, Xform<T>* xform)
static vector<pair<size_t, size_t>> Devices(const QList<QVariant>& selectedDevices) static vector<pair<size_t, size_t>> Devices(const QList<QVariant>& selectedDevices)
{ {
vector<pair<size_t, size_t>> vec; vector<pair<size_t, size_t>> vec;
OpenCLInfo& info = OpenCLInfo::Instance(); auto& devices = OpenCLInfo::Instance()->DeviceIndices();
auto& devices = info.DeviceIndices();
vec.reserve(selectedDevices.size()); vec.reserve(selectedDevices.size());
for (size_t i = 0; i < selectedDevices.size(); i++) for (size_t i = 0; i < selectedDevices.size(); i++)
@ -223,8 +220,7 @@ static vector<pair<size_t, size_t>> Devices(const QList<QVariant>& selectedDevic
static void SetupDeviceTable(QTableWidget* table, const QList<QVariant>& settingsDevices) static void SetupDeviceTable(QTableWidget* table, const QList<QVariant>& settingsDevices)
{ {
bool primary = false; bool primary = false;
auto& deviceNames = OpenCLInfo::Instance().AllDeviceNames(); auto& deviceNames = OpenCLInfo::Instance()->AllDeviceNames();
table->clearContents(); table->clearContents();
table->setRowCount(deviceNames.size()); table->setRowCount(deviceNames.size());
@ -233,7 +229,6 @@ static void SetupDeviceTable(QTableWidget* table, const QList<QVariant>& setting
auto checkItem = new QTableWidgetItem(); auto checkItem = new QTableWidgetItem();
auto radio = new QRadioButton(); auto radio = new QRadioButton();
auto deviceItem = new QTableWidgetItem(QString::fromStdString(deviceNames[i])); auto deviceItem = new QTableWidgetItem(QString::fromStdString(deviceNames[i]));
table->setItem(i, 0, checkItem); table->setItem(i, 0, checkItem);
table->setCellWidget(i, 1, radio); table->setCellWidget(i, 1, radio);
table->setItem(i, 2, deviceItem); table->setItem(i, 2, deviceItem);
@ -365,17 +360,17 @@ static void HandleDeviceTableCheckChanged(QTableWidget* table, int row, int col)
static QString BaseStyle() static QString BaseStyle()
{ {
return "/*---Base Style---\n" 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" "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." "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" "You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/\n"
#ifndef WIN32 #ifndef WIN32
"QTabBar::tab { height: 3ex; }\n\n" "QTabBar::tab { height: 3ex; }\n\n"
#else #else
"QTabBar::tab { height: 5ex; }\n\n" "QTabBar::tab { height: 5ex; }\n\n"
#endif #endif
"/*This is needed to give the labels on the status bar some padding.*/\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" "QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }\n\n"
; ;
} }
/// <summary> /// <summary>

View File

@ -3,18 +3,14 @@
#include "Fractorium.h" #include "Fractorium.h"
#include "GLEmberController.h" #include "GLEmberController.h"
#define SAVE_EACH 1
/// <summary> /// <summary>
/// Constructor which initializes the non-templated members contained in this class. /// 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. /// The renderer, other templated members and GUI setup will be done in the templated derived controller class.
/// </summary> /// </summary>
/// <param name="fractorium">Pointer to the main window.</param> /// <param name="fractorium">Pointer to the main window.</param>
FractoriumEmberControllerBase::FractoriumEmberControllerBase(Fractorium* fractorium) FractoriumEmberControllerBase::FractoriumEmberControllerBase(Fractorium* fractorium)
: m_Info(OpenCLInfo::Instance())
{ {
Timing t; Timing t;
m_Rendering = false; m_Rendering = false;
m_Shared = true; m_Shared = true;
m_FailedRenders = 0; m_FailedRenders = 0;
@ -25,12 +21,11 @@ FractoriumEmberControllerBase::FractoriumEmberControllerBase(Fractorium* fractor
m_Fractorium = fractorium; m_Fractorium = fractorium;
m_RenderTimer = nullptr; m_RenderTimer = nullptr;
m_RenderRestartTimer = nullptr; m_RenderRestartTimer = nullptr;
m_Info = OpenCLInfo::Instance();
m_Rand = QTIsaac<ISAAC_SIZE, ISAAC_INT>(ISAAC_INT(t.Tic()), ISAAC_INT(t.Tic() * 2), ISAAC_INT(t.Tic() * 3));//Ensure a different rand seed on each instance. m_Rand = QTIsaac<ISAAC_SIZE, ISAAC_INT>(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 = new QTimer(m_Fractorium);
m_RenderTimer->setInterval(0); m_RenderTimer->setInterval(0);
m_Fractorium->connect(m_RenderTimer, SIGNAL(timeout()), SLOT(IdleTimer())); m_Fractorium->connect(m_RenderTimer, SIGNAL(timeout()), SLOT(IdleTimer()));
m_RenderRestartTimer = new QTimer(m_Fractorium); m_RenderRestartTimer = new QTimer(m_Fractorium);
m_Fractorium->connect(m_RenderRestartTimer, SIGNAL(timeout()), SLOT(StartRenderTimer())); m_Fractorium->connect(m_RenderRestartTimer, SIGNAL(timeout()), SLOT(StartRenderTimer()));
} }
@ -71,42 +66,34 @@ FractoriumEmberController<T>::FractoriumEmberController(Fractorium* fractorium)
m_PreviewRun = false; m_PreviewRun = false;
m_PreviewRunning = false; m_PreviewRunning = false;
m_SheepTools = unique_ptr<SheepTools<T, float>>(new SheepTools<T, float>( m_SheepTools = unique_ptr<SheepTools<T, float>>(new SheepTools<T, float>(
QString(QApplication::applicationDirPath() + "flam3-palettes.xml").toLocal8Bit().data(), QString(QApplication::applicationDirPath() + "flam3-palettes.xml").toLocal8Bit().data(),
new EmberNs::Renderer<T, float>())); new EmberNs::Renderer<T, float>()));
m_GLController = unique_ptr<GLEmberController<T>>(new GLEmberController<T>(fractorium, fractorium->ui.GLDisplay, this)); m_GLController = unique_ptr<GLEmberController<T>>(new GLEmberController<T>(fractorium, fractorium->ui.GLDisplay, this));
m_PreviewRenderer = unique_ptr<EmberNs::Renderer<T, float>>(new EmberNs::Renderer<T, float>()); m_PreviewRenderer = unique_ptr<EmberNs::Renderer<T, float>>(new EmberNs::Renderer<T, float>());
//Initial combo change event to fill the palette table will be called automatically later. //Initial combo change event to fill the palette table will be called automatically later.
// Look hard for a palette. //Look hard for a palette.
if (!(InitPaletteList(QDir::currentPath().toLocal8Bit().data()) ||
// TODO InitPaletteList(QDir::homePath().toLocal8Bit().data()) ||
// QStandardPaths::AppConfigLocation -- errors out, not a member. InitPaletteList(QCoreApplication::applicationDirPath().toLocal8Bit().data()) ||
// QStandardPaths::DataLocation -- how to parse this? It should include "/usr/share/fractorium" on Linux. InitPaletteList(QString("/usr/local/share/fractorium").toLocal8Bit().data()) ||
InitPaletteList(QString("/usr/share/fractorium").toLocal8Bit().data())) )
if ( ! (InitPaletteList(QDir::currentPath().toLocal8Bit().data()) || {
InitPaletteList(QDir::homePath().toLocal8Bit().data()) || throw "No palettes found, exiting.";
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.";
}
BackgroundChanged(QColor(0, 0, 0));//Default to black. BackgroundChanged(QColor(0, 0, 0));//Default to black.
ClearUndo(); ClearUndo();
m_PreviewRenderer->Callback(nullptr); m_PreviewRenderer->Callback(nullptr);
m_PreviewRenderer->NumChannels(4); m_PreviewRenderer->NumChannels(4);
m_PreviewRenderer->EarlyClip(m_Fractorium->m_Settings->EarlyClip()); m_PreviewRenderer->EarlyClip(m_Fractorium->m_Settings->EarlyClip());
m_PreviewRenderer->YAxisUp(m_Fractorium->m_Settings->YAxisUp()); 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->SetEmber(m_Ember);//Give it an initial ember, will be updated many times later.
//m_PreviewRenderer->ThreadCount(1);//For debugging. //m_PreviewRenderer->ThreadCount(1);//For debugging.
m_PreviewRenderFunc = [&](uint start, uint end) m_PreviewRenderFunc = [&](uint start, uint end)
{ {
while(m_PreviewRun || m_PreviewRunning) while (m_PreviewRun || m_PreviewRunning)
{ {
} }
@ -120,7 +107,6 @@ FractoriumEmberController<T>::FractoriumEmberController(Fractorium* fractorium)
for (size_t i = start; m_PreviewRun && i < end && i < m_EmberFile.Size(); i++) for (size_t i = start; m_PreviewRun && i < end && i < m_EmberFile.Size(); i++)
{ {
Ember<T> ember = m_EmberFile.m_Embers[i]; Ember<T> ember = m_EmberFile.m_Embers[i];
ember.SyncSize(); ember.SyncSize();
ember.SetSizeAndAdjustScale(PREVIEW_SIZE, PREVIEW_SIZE, false, SCALE_WIDTH); ember.SetSizeAndAdjustScale(PREVIEW_SIZE, PREVIEW_SIZE, false, SCALE_WIDTH);
ember.m_TemporalSamples = 1; ember.m_TemporalSamples = 1;
@ -136,11 +122,10 @@ FractoriumEmberController<T>::FractoriumEmberController(Fractorium* fractorium)
//This ensures the events are processed in order as each preview is updated, and that control does not return here //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. //until the update is complete.
QMetaObject::invokeMethod(m_Fractorium, "SetLibraryTreeItemData", Qt::BlockingQueuedConnection, QMetaObject::invokeMethod(m_Fractorium, "SetLibraryTreeItemData", Qt::BlockingQueuedConnection,
Q_ARG(EmberTreeWidgetItemBase*, dynamic_cast<EmberTreeWidgetItemBase*>(treeItem)), Q_ARG(EmberTreeWidgetItemBase*, dynamic_cast<EmberTreeWidgetItemBase*>(treeItem)),
Q_ARG(vector<byte>&, m_PreviewFinalImage), Q_ARG(vector<byte>&, m_PreviewFinalImage),
Q_ARG(uint, PREVIEW_SIZE), Q_ARG(uint, PREVIEW_SIZE),
Q_ARG(uint, PREVIEW_SIZE)); Q_ARG(uint, PREVIEW_SIZE));
//treeItem->SetImage(m_PreviewFinalImage, PREVIEW_SIZE, PREVIEW_SIZE); //treeItem->SetImage(m_PreviewFinalImage, PREVIEW_SIZE, PREVIEW_SIZE);
} }
} }
@ -287,7 +272,6 @@ void FractoriumEmberController<T>::UpdateXform(std::function<void(Xform<T>*)> fu
if (Xform<T>* xform = CurrentXform()) if (Xform<T>* xform = CurrentXform())
func(xform); func(xform);
} }
break; break;
case eXformUpdate::UPDATE_ALL: case eXformUpdate::UPDATE_ALL:
@ -295,7 +279,6 @@ void FractoriumEmberController<T>::UpdateXform(std::function<void(Xform<T>*)> fu
while (Xform<T>* xform = m_Ember.GetTotalXform(i++)) while (Xform<T>* xform = m_Ember.GetTotalXform(i++))
func(xform); func(xform);
} }
break; break;
case eXformUpdate::UPDATE_ALL_EXCEPT_FINAL: case eXformUpdate::UPDATE_ALL_EXCEPT_FINAL:
@ -304,7 +287,6 @@ void FractoriumEmberController<T>::UpdateXform(std::function<void(Xform<T>*)> fu
while (Xform<T>* xform = m_Ember.GetXform(i++)) while (Xform<T>* xform = m_Ember.GetXform(i++))
func(xform); func(xform);
} }
break; break;
} }
@ -326,10 +308,9 @@ void FractoriumEmberController<T>::SetEmberPrivate(const Ember<U>& ember, bool v
{ {
if (ember.m_Name != m_Ember.m_Name) if (ember.m_Name != m_Ember.m_Name)
m_LastSaveCurrent = ""; m_LastSaveCurrent = "";
size_t w = m_Ember.m_FinalRasW;//Cache values for use below. size_t w = m_Ember.m_FinalRasW;//Cache values for use below.
size_t h = m_Ember.m_FinalRasH; size_t h = m_Ember.m_FinalRasH;
m_Ember = ember; m_Ember = ember;
if (!verbatim) if (!verbatim)
@ -340,20 +321,16 @@ void FractoriumEmberController<T>::SetEmberPrivate(const Ember<U>& ember, bool v
m_Ember.m_Supersample = m_Fractorium->m_SupersampleSpin->value(); m_Ember.m_Supersample = m_Fractorium->m_SupersampleSpin->value();
} }
#ifdef SAVE_EACH static EmberToXml<T> writer;//Save parameters of last full render just in case there is a crash.
static EmberToXml<T> writer;
string filename = "last.flame"; string filename = "last.flame";
writer.Save(filename.c_str(), m_Ember, 0, true, false, true); writer.Save(filename.c_str(), m_Ember, 0, true, false, true);
#endif
m_GLController->ResetMouseState(); m_GLController->ResetMouseState();
FillXforms();//Must do this first because the palette setup in FillParamTablesAndPalette() uses the xforms combo. FillXforms();//Must do this first because the palette setup in FillParamTablesAndPalette() uses the xforms combo.
FillParamTablesAndPalette(); FillParamTablesAndPalette();
FillSummary(); FillSummary();
//If a resize happened, this won't do anything because the new size is not reflected in the scroll area yet. //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. //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) if (m_Ember.m_FinalRasW == w && m_Ember.m_FinalRasH == h)
m_Fractorium->CenterScrollbars(); m_Fractorium->CenterScrollbars();

View File

@ -206,7 +206,7 @@ public:
//Info. //Info.
virtual void FillSummary() { } virtual void FillSummary() { }
//Rendering/progress. //Rendering/progress.
virtual bool Render() { return false; } virtual bool Render() { return false; }
virtual bool CreateRenderer(eRendererType renderType, const vector<pair<size_t, size_t>>& devices, bool shared = true) { return false; } virtual bool CreateRenderer(eRendererType renderType, const vector<pair<size_t, size_t>>& devices, bool shared = true) { return false; }
@ -232,7 +232,7 @@ protected:
void AddProcessAction(eProcessAction action); void AddProcessAction(eProcessAction action);
eProcessAction CondenseAndClearProcessActions(); eProcessAction CondenseAndClearProcessActions();
eProcessState ProcessState() { return m_Renderer.get() ? m_Renderer->ProcessState() : NONE; } eProcessState ProcessState() { return m_Renderer.get() ? m_Renderer->ProcessState() : NONE; }
//Non-templated members. //Non-templated members.
bool m_Rendering; bool m_Rendering;
bool m_Shared; bool m_Shared;
@ -261,7 +261,7 @@ protected:
Fractorium* m_Fractorium; Fractorium* m_Fractorium;
QTimer* m_RenderTimer; QTimer* m_RenderTimer;
QTimer* m_RenderRestartTimer; QTimer* m_RenderRestartTimer;
OpenCLInfo& m_Info; shared_ptr<OpenCLInfo> m_Info;
}; };
/// <summary> /// <summary>
@ -434,7 +434,7 @@ public:
virtual void XaosChanged(int x, int y, double val) override; virtual void XaosChanged(int x, int y, double val) override;
virtual void ClearXaos() override; virtual void ClearXaos() override;
virtual void RandomXaos() override; virtual void RandomXaos() override;
//Palette. //Palette.
virtual int InitPaletteList(const string& s) override; virtual int InitPaletteList(const string& s) override;
virtual bool FillPaletteTable(const string& s) override; virtual bool FillPaletteTable(const string& s) override;

View File

@ -8,20 +8,19 @@ void Fractorium::InitInfoUI()
{ {
auto treeHeader = ui.SummaryTree->header(); auto treeHeader = ui.SummaryTree->header();
auto tableHeader = ui.SummaryTable->horizontalHeader(); auto tableHeader = ui.SummaryTable->horizontalHeader();
treeHeader->setVisible(true); treeHeader->setVisible(true);
treeHeader->setSectionsClickable(true); treeHeader->setSectionsClickable(true);
treeHeader->setSectionResizeMode(QHeaderView::ResizeToContents); treeHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
connect(treeHeader, SIGNAL(sectionClicked(int)), this, SLOT(OnSummaryTreeHeaderSectionClicked(int)), Qt::QueuedConnection); 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); connect(tableHeader, SIGNAL(sectionResized(int, int, int)), this, SLOT(OnSummaryTableHeaderResized(int, int, int)), Qt::QueuedConnection);
SetFixedTableHeader(ui.SummaryTable->verticalHeader()); SetFixedTableHeader(ui.SummaryTable->verticalHeader());
ui.SummaryTable->setItem(0, 0, m_InfoNameItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(0, 0, m_InfoNameItem = new QTableWidgetItem(""));
ui.SummaryTable->setItem(1, 0, m_InfoPaletteItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(1, 0, m_InfoPaletteItem = new QTableWidgetItem(""));
ui.SummaryTable->setItem(2, 0, m_Info3dItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(2, 0, m_Info3dItem = new QTableWidgetItem(""));
ui.SummaryTable->setItem(3, 0, m_InfoXaosItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(3, 0, m_InfoXaosItem = new QTableWidgetItem(""));
ui.SummaryTable->setItem(4, 0, m_InfoXformCountItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(4, 0, m_InfoXformCountItem = new QTableWidgetItem(""));
ui.SummaryTable->setItem(5, 0, m_InfoFinalXformItem = new QTableWidgetItem("")); ui.SummaryTable->setItem(5, 0, m_InfoFinalXformItem = new QTableWidgetItem(""));
ui.InfoTabWidget->setCurrentIndex(0);//Make summary tab focused by default.
} }
/// <summary> /// <summary>
@ -93,7 +92,6 @@ void FractoriumEmberController<T>::FillSummary()
m_Fractorium->m_InfoXaosItem->setText(m_Ember.XaosPresent() ? "Yes" : "No"); m_Fractorium->m_InfoXaosItem->setText(m_Ember.XaosPresent() ? "Yes" : "No");
m_Fractorium->m_InfoXformCountItem->setText(QString::number(m_Ember.XformCount())); m_Fractorium->m_InfoXformCountItem->setText(QString::number(m_Ember.XformCount()));
m_Fractorium->m_InfoFinalXformItem->setText(m_Ember.UseFinalXform() ? "Yes" : "No"); m_Fractorium->m_InfoFinalXformItem->setText(m_Ember.UseFinalXform() ? "Yes" : "No");
QPixmap pixmap = QPixmap::fromImage(m_FinalPaletteImage);//Create a QPixmap out of the QImage. QPixmap pixmap = QPixmap::fromImage(m_FinalPaletteImage);//Create a QPixmap out of the QImage.
QSize size(table->columnWidth(0), table->rowHeight(1) + 1); QSize size(table->columnWidth(0), table->rowHeight(1) + 1);
m_Fractorium->m_InfoPaletteItem->setData(Qt::DecorationRole, pixmap.scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); m_Fractorium->m_InfoPaletteItem->setData(Qt::DecorationRole, pixmap.scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
@ -112,19 +110,18 @@ void FractoriumEmberController<T>::FillSummary()
if (!m_Ember.IsFinalXform(xform) && index != -1) if (!m_Ember.IsFinalXform(xform) && index != -1)
{ {
item1->setText(0, "Xform " + item1->setText(0, "Xform " +
QString::number(x + 1) + QString::number(x + 1) +
" (" + QLocale::system().toString(xform->m_Weight, pc, p) + ") (" + " (" + QLocale::system().toString(xform->m_Weight, pc, p) + ") (" +
QLocale::system().toString(double(m_NormalizedWeights[index]), pc, p) + ") " + QLocale::system().toString(double(m_NormalizedWeights[index]), pc, p) + ") " +
linked); linked);
} }
else else
item1->setText(0, "Final xform"); item1->setText(0, "Final xform");
item1->setText(1, xform->m_Name.c_str()); item1->setText(1, xform->m_Name.c_str());
auto affineItem = new QTreeWidgetItem(item1); auto affineItem = new QTreeWidgetItem(item1);
affineItem->setText(0, "Affine"); affineItem->setText(0, "Affine");
if (xform->m_Affine.IsZero()) if (xform->m_Affine.IsZero())
as += " Empty"; as += " Empty";
else if (xform->m_Affine.IsID()) else if (xform->m_Affine.IsID())
@ -139,7 +136,6 @@ void FractoriumEmberController<T>::FillSummary()
} }
affineItem->setText(1, as); affineItem->setText(1, as);
auto colorIndexItem = new QTreeWidgetItem(item1); auto colorIndexItem = new QTreeWidgetItem(item1);
colorIndexItem->setText(0, "Color index"); colorIndexItem->setText(0, "Color index");
colorIndexItem->setText(1, QLocale::system().toString(xform->m_ColorX, pc, p)); colorIndexItem->setText(1, QLocale::system().toString(xform->m_ColorX, pc, p));
@ -147,15 +143,12 @@ void FractoriumEmberController<T>::FillSummary()
color.setAlphaF(xform->m_Opacity); color.setAlphaF(xform->m_Opacity);
colorIndexItem->setBackgroundColor(1, color); colorIndexItem->setBackgroundColor(1, color);
colorIndexItem->setTextColor(1, VisibleColor(color)); colorIndexItem->setTextColor(1, VisibleColor(color));
auto colorSpeedItem = new QTreeWidgetItem(item1); auto colorSpeedItem = new QTreeWidgetItem(item1);
colorSpeedItem->setText(0, "Color speed"); colorSpeedItem->setText(0, "Color speed");
colorSpeedItem->setText(1, QLocale::system().toString(xform->m_ColorSpeed, pc, p)); colorSpeedItem->setText(1, QLocale::system().toString(xform->m_ColorSpeed, pc, p));
auto opacityItem = new QTreeWidgetItem(item1); auto opacityItem = new QTreeWidgetItem(item1);
opacityItem->setText(0, "Opacity"); opacityItem->setText(0, "Opacity");
opacityItem->setText(1, QLocale::system().toString(xform->m_Opacity, pc, p)); opacityItem->setText(1, QLocale::system().toString(xform->m_Opacity, pc, p));
auto dcItem = new QTreeWidgetItem(item1); auto dcItem = new QTreeWidgetItem(item1);
dcItem->setText(0, "Direct color"); dcItem->setText(0, "Direct color");
dcItem->setText(1, QLocale::system().toString(xform->m_DirectColor, pc, p)); dcItem->setText(1, QLocale::system().toString(xform->m_DirectColor, pc, p));
@ -163,7 +156,6 @@ void FractoriumEmberController<T>::FillSummary()
while (auto var = xform->GetVariation(i++)) while (auto var = xform->GetVariation(i++))
{ {
auto vitem = new QTreeWidgetItem(item1); auto vitem = new QTreeWidgetItem(item1);
vitem->setText(0, QString::fromStdString(var->Name())); vitem->setText(0, QString::fromStdString(var->Name()));
vitem->setText(1, QLocale::system().toString(var->m_Weight, pc, vp).rightJustified(vlen, ' ')); vitem->setText(1, QLocale::system().toString(var->m_Weight, pc, vp).rightJustified(vlen, ' '));
@ -176,7 +168,6 @@ void FractoriumEmberController<T>::FillSummary()
if (!params[j].IsPrecalc()) if (!params[j].IsPrecalc())
{ {
auto pitem = new QTreeWidgetItem(vitem); auto pitem = new QTreeWidgetItem(vitem);
pitem->setText(0, params[j].Name().c_str()); pitem->setText(0, params[j].Name().c_str());
pitem->setText(1, QLocale::system().toString(params[j].ParamVal(), pc, vp).rightJustified(vlen, ' ')); 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_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_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()); sprintf_s(m_WHString, 32, "W x H: %4lu x %4lu", r->SuperRasW(), r->SuperRasH());
ui.InfoBoundsLabelUL->setText(QString(m_ULString)); ui.InfoBoundsLabelUL->setText(QString(m_ULString));
ui.InfoBoundsLabelUR->setText(QString(m_URString)); ui.InfoBoundsLabelUR->setText(QString(m_URString));
ui.InfoBoundsLabelLR->setText(QString(m_LRString)); ui.InfoBoundsLabelLR->setText(QString(m_LRString));
ui.InfoBoundsLabelLL->setText(QString(m_LLString)); ui.InfoBoundsLabelLL->setText(QString(m_LLString));
ui.InfoBoundsLabelWH->setText(QString(m_WHString)); ui.InfoBoundsLabelWH->setText(QString(m_WHString));
ui.InfoBoundsTable->item(0, 1)->setText(ToString<qulonglong>(r->GutterWidth())); ui.InfoBoundsTable->item(0, 1)->setText(ToString<qulonglong>(r->GutterWidth()));
if (r->GetDensityFilter()) if (r->GetDensityFilter())
{ {
uint deWidth = (r->GetDensityFilter()->FilterWidth() * 2) + 1; uint deWidth = (r->GetDensityFilter()->FilterWidth() * 2) + 1;
sprintf_s(m_DEString, 16, "%d x %d", deWidth, deWidth); sprintf_s(m_DEString, 16, "%d x %d", deWidth, deWidth);
ui.InfoBoundsTable->item(1, 1)->setText(QString(m_DEString)); ui.InfoBoundsTable->item(1, 1)->setText(QString(m_DEString));
} }

View File

@ -11,7 +11,6 @@ void Fractorium::InitParamsUI()
double dmax = numeric_limits<double>::max(); double dmax = numeric_limits<double>::max();
vector<string> comboVals; vector<string> comboVals;
QTableWidget* table = ui.ColorTable; QTableWidget* table = ui.ColorTable;
//Because QTableWidget does not allow for a single title bar/header //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 //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 //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.GeometryTableHeader->horizontalHeader());
SetFixedTableHeader(ui.FilterTableHeader->horizontalHeader()); SetFixedTableHeader(ui.FilterTableHeader->horizontalHeader());
SetFixedTableHeader(ui.IterationTableHeader->horizontalHeader()); SetFixedTableHeader(ui.IterationTableHeader->horizontalHeader());
//Color. //Color.
SetupSpinner<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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<DoubleSpinBox, double>(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_GammaThresholdSpin->setDecimals(4);
m_BackgroundColorButton = new QPushButton("...", table); m_BackgroundColorButton = new QPushButton("...", table);
m_BackgroundColorButton->setMinimumWidth(21); m_BackgroundColorButton->setMinimumWidth(21);
@ -37,11 +34,10 @@ void Fractorium::InitParamsUI()
table->item(row, 1)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); table->item(row, 1)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
connect(m_BackgroundColorButton, SIGNAL(clicked(bool)), this, SLOT(OnBackgroundColorButtonClicked(bool)), Qt::QueuedConnection); connect(m_BackgroundColorButton, SIGNAL(clicked(bool)), this, SLOT(OnBackgroundColorButtonClicked(bool)), Qt::QueuedConnection);
row++; row++;
comboVals.push_back("Step"); comboVals.push_back("Step");
comboVals.push_back("Linear"); comboVals.push_back("Linear");
SetupCombo(table, this, row, 1, m_PaletteModeCombo, comboVals, SIGNAL(currentIndexChanged(int)), SLOT(OnPaletteModeComboCurrentIndexChanged(int))); SetupCombo(table, this, row, 1, m_PaletteModeCombo, comboVals, SIGNAL(currentIndexChanged(int)), SLOT(OnPaletteModeComboCurrentIndexChanged(int)));
m_PaletteModeCombo->SetCurrentIndexStealth(PALETTE_LINEAR);
//Geometry. //Geometry.
row = 0; row = 0;
table = ui.GeometryTable; table = ui.GeometryTable;
@ -57,31 +53,24 @@ void Fractorium::InitParamsUI()
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_PitchSpin, spinHeight, -180, 180, 1, SIGNAL(valueChanged(double)), SLOT(OnPitchChanged(double)), true, 0, 45, 0); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_PitchSpin, spinHeight, -180, 180, 1, SIGNAL(valueChanged(double)), SLOT(OnPitchChanged(double)), true, 0, 45, 0);
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_YawSpin, spinHeight, -180, 180, 1, SIGNAL(valueChanged(double)), SLOT(OnYawChanged(double)), true, 0, 45, 0); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_YawSpin, spinHeight, -180, 180, 1, SIGNAL(valueChanged(double)), SLOT(OnYawChanged(double)), true, 0, 45, 0);
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_DepthBlurSpin, spinHeight, -100, 100, 0.01, SIGNAL(valueChanged(double)), SLOT(OnDepthBlurChanged(double)), true, 0, 1, 0); SetupSpinner<DoubleSpinBox, double>(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. //Set w/h max values.
m_CenterXSpin->setDecimals(3); m_CenterXSpin->setDecimals(3);
m_CenterYSpin->setDecimals(3); m_CenterYSpin->setDecimals(3);
m_ZPosSpin->setDecimals(3); m_ZPosSpin->setDecimals(3);
m_PerspectiveSpin->setDecimals(4); m_PerspectiveSpin->setDecimals(4);
m_DepthBlurSpin->setDecimals(3); m_DepthBlurSpin->setDecimals(3);
//Filter. //Filter.
row = 0; row = 0;
table = ui.FilterTable; table = ui.FilterTable;
SetupSpinner<DoubleSpinBox, double>(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); SetupSpinner<DoubleSpinBox, double>(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<float>::FilterTypes(); comboVals = SpatialFilterCreator<float>::FilterTypes();
SetupCombo(table, this, row, 1, m_SpatialFilterTypeCombo, comboVals, SIGNAL(currentIndexChanged(const QString&)), SLOT(OnSpatialFilterTypeComboCurrentIndexChanged(const QString&))); SetupCombo(table, this, row, 1, m_SpatialFilterTypeCombo, comboVals, SIGNAL(currentIndexChanged(const QString&)), SLOT(OnSpatialFilterTypeComboCurrentIndexChanged(const QString&)));
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_TemporalFilterWidthSpin, spinHeight, 1, 10, 1, SIGNAL(valueChanged(double)), SLOT(OnTemporalFilterWidthChanged(double)), true, 1); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_TemporalFilterWidthSpin, spinHeight, 1, 10, 1, SIGNAL(valueChanged(double)), SLOT(OnTemporalFilterWidthChanged(double)), true, 1);
comboVals = TemporalFilterCreator<float>::FilterTypes(); comboVals = TemporalFilterCreator<float>::FilterTypes();
SetupCombo(table, this, row, 1, m_TemporalFilterTypeCombo, comboVals, SIGNAL(currentIndexChanged(const QString&)), SLOT(OnTemporalFilterTypeComboCurrentIndexChanged(const QString&))); SetupCombo(table, this, row, 1, m_TemporalFilterTypeCombo, comboVals, SIGNAL(currentIndexChanged(const QString&)), SLOT(OnTemporalFilterTypeComboCurrentIndexChanged(const QString&)));
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_DEFilterMinRadiusSpin, spinHeight, 0, 25, 1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterMinRadiusWidthChanged(double)), true, 0, 0, 0); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_DEFilterMinRadiusSpin, spinHeight, 0, 25, 1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterMinRadiusWidthChanged(double)), true, 0, 0, 0);
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_DEFilterMaxRadiusSpin, spinHeight, 0, 25, 1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterMaxRadiusWidthChanged(double)), true, 0.0, 9.0, 0); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_DEFilterMaxRadiusSpin, spinHeight, 0, 25, 1, SIGNAL(valueChanged(double)), SLOT(OnDEFilterMaxRadiusWidthChanged(double)), true, 0.0, 9.0, 0);
SetupSpinner<DoubleSpinBox, double>(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); SetupSpinner<DoubleSpinBox, double>(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. //Iteration.
row = 0; row = 0;
table = ui.IterationTable; table = ui.IterationTable;
@ -90,12 +79,10 @@ void Fractorium::InitParamsUI()
SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_QualitySpin, spinHeight, 1, dmax, 50, SIGNAL(valueChanged(double)), SLOT(OnQualityChanged(double)), true, 10, 10, 10); SetupSpinner<DoubleSpinBox, double>(table, this, row, 1, m_QualitySpin, spinHeight, 1, dmax, 50, SIGNAL(valueChanged(double)), SLOT(OnQualityChanged(double)), true, 10, 10, 10);
SetupSpinner<SpinBox, int>( table, this, row, 1, m_SupersampleSpin, spinHeight, 1, 4, 1, SIGNAL(valueChanged(int)), SLOT(OnSupersampleChanged(int)), true, 1, 1, 1); SetupSpinner<SpinBox, int>( table, this, row, 1, m_SupersampleSpin, spinHeight, 1, 4, 1, SIGNAL(valueChanged(int)), SLOT(OnSupersampleChanged(int)), true, 1, 1, 1);
SetupSpinner<SpinBox, int>( table, this, row, 1, m_TemporalSamplesSpin, spinHeight, 1, 5000, 1, SIGNAL(valueChanged(int)), SLOT(OnTemporalSamplesChanged(int)), true, 1000); SetupSpinner<SpinBox, int>( table, this, row, 1, m_TemporalSamplesSpin, spinHeight, 1, 5000, 1, SIGNAL(valueChanged(int)), SLOT(OnTemporalSamplesChanged(int)), true, 1000);
comboVals.clear(); comboVals.clear();
comboVals.push_back("Step"); comboVals.push_back("Step");
comboVals.push_back("Linear"); comboVals.push_back("Linear");
SetupCombo(table, this, row, 1, m_AffineInterpTypeCombo, comboVals, SIGNAL(currentIndexChanged(int)), SLOT(OnAffineInterpTypeComboCurrentIndexChanged(int))); SetupCombo(table, this, row, 1, m_AffineInterpTypeCombo, comboVals, SIGNAL(currentIndexChanged(int)), SLOT(OnAffineInterpTypeComboCurrentIndexChanged(int)));
comboVals.clear(); comboVals.clear();
comboVals.push_back("Linear"); comboVals.push_back("Linear");
comboVals.push_back("Smooth"); comboVals.push_back("Smooth");
@ -277,10 +264,10 @@ void Fractorium::OnZPosChanged(double d) { m_Controller->ZPosChanged(d); }
template <typename T> void FractoriumEmberController<T>::PerspectiveChanged(double d) { Update([&] { m_Ember.m_CamPerspective = d; }); } template <typename T> void FractoriumEmberController<T>::PerspectiveChanged(double d) { Update([&] { m_Ember.m_CamPerspective = d; }); }
void Fractorium::OnPerspectiveChanged(double d) { m_Controller->PerspectiveChanged(d); } void Fractorium::OnPerspectiveChanged(double d) { m_Controller->PerspectiveChanged(d); }
template <typename T> void FractoriumEmberController<T>::PitchChanged(double d) { Update([&] { m_Ember.m_CamPitch = d * DEG_2_RAD; }); } template <typename T> void FractoriumEmberController<T>::PitchChanged(double d) { Update([&] { m_Ember.m_CamPitch = d* DEG_2_RAD; }); }
void Fractorium::OnPitchChanged(double d) { m_Controller->PitchChanged(d); } void Fractorium::OnPitchChanged(double d) { m_Controller->PitchChanged(d); }
template <typename T> void FractoriumEmberController<T>::YawChanged(double d) { Update([&] { m_Ember.m_CamYaw = d * DEG_2_RAD; }); } template <typename T> void FractoriumEmberController<T>::YawChanged(double d) { Update([&] { m_Ember.m_CamYaw = d* DEG_2_RAD; }); }
void Fractorium::OnYawChanged(double d) { m_Controller->YawChanged(d); } void Fractorium::OnYawChanged(double d) { m_Controller->YawChanged(d); }
template <typename T> void FractoriumEmberController<T>::DepthBlurChanged(double d) { Update([&] { m_Ember.m_CamDepthBlur = d; }); } template <typename T> void FractoriumEmberController<T>::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. /// 20-50 is good for OpenCL.
/// Above 500 seems to offer little additional value for final renders. /// Above 500 seems to offer little additional value for final renders.
/// Called when the quality spinner is changed. /// 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 rendering process is continued, else it's reset.
/// </summary> /// </summary>
/// <param name="d">The quality in terms of iterations per pixel</param> /// <param name="d">The quality in terms of iterations per pixel</param>
@ -545,20 +532,17 @@ void FractoriumEmberController<T>::FillParamTablesAndPalette()
m_Fractorium->m_TemporalSamplesSpin->SetValueStealth(m_Ember.m_TemporalSamples); m_Fractorium->m_TemporalSamplesSpin->SetValueStealth(m_Ember.m_TemporalSamples);
m_Fractorium->m_AffineInterpTypeCombo->SetCurrentIndexStealth(m_Ember.m_AffineInterp); m_Fractorium->m_AffineInterpTypeCombo->SetCurrentIndexStealth(m_Ember.m_AffineInterp);
m_Fractorium->m_InterpTypeCombo->SetCurrentIndexStealth(m_Ember.m_Interp); m_Fractorium->m_InterpTypeCombo->SetCurrentIndexStealth(m_Ember.m_Interp);
//Palette related items: //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. //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. //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 //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. //called in response to that event, it is skipped here so must do it manually.
m_TempPalette = m_Ember.m_Palette; 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 //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. //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() //To fix this, the caller must preserve the temp palette and the adjustment values and reassign. See Fractorium::CreateControllerFromOptions()
//for an example. //for an example.
m_Fractorium->ResetPaletteControls(); m_Fractorium->ResetPaletteControls();
auto temp = m_Ember.m_Palette.m_Filename; auto temp = m_Ember.m_Palette.m_Filename;
if (temp.get()) if (temp.get())
@ -578,7 +562,6 @@ template <typename T>
void FractoriumEmberController<T>::ParamsToEmber(Ember<T>& ember) void FractoriumEmberController<T>::ParamsToEmber(Ember<T>& ember)
{ {
QColor color = m_Fractorium->ui.ColorTable->item(5, 1)->backgroundColor(); QColor color = m_Fractorium->ui.ColorTable->item(5, 1)->backgroundColor();
ember.m_Brightness = m_Fractorium->m_BrightnessSpin->value();//Color. ember.m_Brightness = m_Fractorium->m_BrightnessSpin->value();//Color.
ember.m_Gamma = m_Fractorium->m_GammaSpin->value(); ember.m_Gamma = m_Fractorium->m_GammaSpin->value();
ember.m_GammaThresh = m_Fractorium->m_GammaThresholdSpin->value(); ember.m_GammaThresh = m_Fractorium->m_GammaThresholdSpin->value();
@ -614,7 +597,6 @@ void FractoriumEmberController<T>::ParamsToEmber(Ember<T>& ember)
ember.m_TemporalSamples = m_Fractorium->m_TemporalSamplesSpin->value(); ember.m_TemporalSamples = m_Fractorium->m_TemporalSamplesSpin->value();
ember.m_AffineInterp = eAffineInterp(m_Fractorium->m_AffineInterpTypeCombo->currentIndex()); ember.m_AffineInterp = eAffineInterp(m_Fractorium->m_AffineInterpTypeCombo->currentIndex());
ember.m_Interp = eInterp(m_Fractorium->m_InterpTypeCombo->currentIndex()); ember.m_Interp = eInterp(m_Fractorium->m_InterpTypeCombo->currentIndex());
ember.SyncSize(); ember.SyncSize();
} }
@ -648,5 +630,5 @@ void Fractorium::SetScale(double scale)
template class FractoriumEmberController<float>; template class FractoriumEmberController<float>;
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
template class FractoriumEmberController<double>; template class FractoriumEmberController<double>;
#endif #endif

View File

@ -69,7 +69,7 @@ void FractoriumEmberControllerBase::Shutdown()
StopRenderTimer(true); StopRenderTimer(true);
ClearFinalImages(); ClearFinalImages();
while(m_Fractorium->ui.GLDisplay->Drawing()) while (m_Fractorium->ui.GLDisplay->Drawing())
QApplication::processEvents(); QApplication::processEvents();
} }
@ -136,7 +136,7 @@ void FractoriumEmberControllerBase::SaveCurrentRender(const QString& filename, c
QFileInfo fileInfo(filename); QFileInfo fileInfo(filename);
QString suffix = fileInfo.suffix(); QString suffix = fileInfo.suffix();
FractoriumSettings* settings = m_Fractorium->m_Settings; FractoriumSettings* settings = m_Fractorium->m_Settings;
//Ensure dimensions are valid. //Ensure dimensions are valid.
if (pixels.size() < (width * height * channels * bpc)) 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. data = pixels.data();//Png and channels == 4.
if ((suffix == "jpg" || suffix == "bmp") && channels) if ((suffix == "jpg" || suffix == "bmp") && channels)
{ {
RgbaToRgb(pixels, vecRgb, width, height); RgbaToRgb(pixels, vecRgb, width, height);
data = vecRgb.data(); data = vecRgb.data();
} }
string s = filename.toStdString(); string s = filename.toStdString();
string id = settings->Id().toStdString(); string id = settings->Id().toStdString();
string url = settings->Url().toStdString(); string url = settings->Url().toStdString();
@ -207,7 +206,7 @@ eProcessAction FractoriumEmberControllerBase::CondenseAndClearProcessActions()
for (auto a : m_ProcessActions) for (auto a : m_ProcessActions)
if (a > action) if (a > action)
action = a; action = a;
m_ProcessActions.clear(); m_ProcessActions.clear();
m_Cs.Leave(); m_Cs.Leave();
return action; return action;
@ -226,7 +225,6 @@ template <typename T>
int FractoriumEmberController<T>::ProgressFunc(Ember<T>& ember, void* foo, double fraction, int stage, double etaMs) int FractoriumEmberController<T>::ProgressFunc(Ember<T>& ember, void* foo, double fraction, int stage, double etaMs)
{ {
QString status; 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. 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) if (stage == 0)
@ -297,12 +295,10 @@ template <typename T>
bool FractoriumEmberController<T>::Render() bool FractoriumEmberController<T>::Render()
{ {
m_Rendering = true; m_Rendering = true;
bool success = true; bool success = true;
GLWidget* gl = m_Fractorium->ui.GLDisplay; GLWidget* gl = m_Fractorium->ui.GLDisplay;
RendererCL<T, float>* rendererCL = nullptr; RendererCL<T, float>* rendererCL = nullptr;
eProcessAction qualityAction, action; eProcessAction qualityAction, action;
//Quality is the only parameter we update inside the timer. //Quality is the only parameter we update inside the timer.
//This is to allow the user to rapidly increase the quality spinner //This is to allow the user to rapidly increase the quality spinner
//without fully resetting the render. Instead, it will just keep iterating //without fully resetting the render. Instead, it will just keep iterating
@ -411,7 +407,6 @@ bool FractoriumEmberController<T>::Render()
QString iters = ToString<qulonglong>(stats.m_Iters); QString iters = ToString<qulonglong>(stats.m_Iters);
QString scaledQuality = ToString(uint(m_Renderer->ScaledQuality())); QString scaledQuality = ToString(uint(m_Renderer->ScaledQuality()));
string renderTime = m_RenderElapsedTimer.Format(m_RenderElapsedTimer.Toc()); string renderTime = m_RenderElapsedTimer.Format(m_RenderElapsedTimer.Toc());
m_Fractorium->m_ProgressBar->setValue(100); m_Fractorium->m_ProgressBar->setValue(100);
//Only certain stats can be reported with OpenCL. //Only certain stats can be reported with OpenCL.
@ -424,10 +419,9 @@ bool FractoriumEmberController<T>::Render()
double percent = double(stats.m_Badvals) / double(stats.m_Iters); double percent = double(stats.m_Badvals) / double(stats.m_Iters);
QString badVals = ToString<qulonglong>(stats.m_Badvals); QString badVals = ToString<qulonglong>(stats.m_Badvals);
QString badPercent = QLocale::system().toString(percent * 100, 'f', 2); 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) + "."); 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. 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; m_EditState = REGULAR_EDIT;
@ -445,7 +439,6 @@ bool FractoriumEmberController<T>::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. 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<T> ember(m_UndoList[m_UndoIndex]); Ember<T> ember(m_UndoList[m_UndoIndex]);
ClearUndo(); ClearUndo();
m_UndoList.push_back(ember); m_UndoList.push_back(ember);
m_UndoList.push_back(m_Ember); m_UndoList.push_back(m_Ember);
@ -458,15 +451,15 @@ bool FractoriumEmberController<T>::Render()
m_Fractorium->UpdateHistogramBounds();//Mostly of engineering interest. 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. 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 the GL window on start because the output will be forced.
//Update it on finish because the rendering process is completely done. //Update it on finish because the rendering process is completely done.
if (iterBegin || ProcessState() == ACCUM_DONE) if (iterBegin || ProcessState() == ACCUM_DONE)
{ {
if (m_FinalImage.size() == m_Renderer->FinalBufferSize())//Make absolutely sure the correct amount of data is passed. if (m_FinalImage.size() == m_Renderer->FinalBufferSize())//Make absolutely sure the correct amount of data is passed.
gl->update(); gl->update();
//gl->repaint();
//gl->repaint();
//m_Fractorium->update(); //m_Fractorium->update();
//m_Fractorium->ui.GLParentScrollArea->update(); //m_Fractorium->ui.GLParentScrollArea->update();
//Uncomment for debugging kernel build and execution errors. //Uncomment for debugging kernel build and execution errors.
@ -482,13 +475,12 @@ bool FractoriumEmberController<T>::Render()
else//Something went very wrong, show error report. else//Something went very wrong, show error report.
{ {
vector<string> errors = m_Renderer->ErrorReport(); vector<string> errors = m_Renderer->ErrorReport();
success = false; success = false;
m_FailedRenders++; m_FailedRenders++;
m_Fractorium->m_RenderStatusLabel->setText("Rendering failed, see info tab. Try changing parameters."); m_Fractorium->m_RenderStatusLabel->setText("Rendering failed, see info tab. Try changing parameters.");
m_Fractorium->ErrorReportToQTextEdit(errors, m_Fractorium->ui.InfoRenderingTextEdit); m_Fractorium->ErrorReportToQTextEdit(errors, m_Fractorium->ui.InfoRenderingTextEdit);
m_Renderer->ClearErrorReport(); m_Renderer->ClearErrorReport();
if (m_FailedRenders >= 3) if (m_FailedRenders >= 3)
{ {
m_Rendering = false; m_Rendering = false;
@ -500,19 +492,18 @@ bool FractoriumEmberController<T>::Render()
if (rendererCL) if (rendererCL)
{ {
//string s = "OpenCL Kernels: \r\n" + rendererCL->IterKernel() + "\r\n" + rendererCL->DEKernel() + "\r\n" + rendererCL->FinalAccumKernel(); //string s = "OpenCL Kernels: \r\n" + rendererCL->IterKernel() + "\r\n" + rendererCL->DEKernel() + "\r\n" + rendererCL->FinalAccumKernel();
rendererCL->ClearFinal(); rendererCL->ClearFinal();
//QMetaObject::invokeMethod(m_Fractorium->ui.InfoRenderingTextEdit, "setText", Qt::QueuedConnection, Q_ARG(const QString&, QString::fromStdString(s))); //QMetaObject::invokeMethod(m_Fractorium->ui.InfoRenderingTextEdit, "setText", Qt::QueuedConnection, Q_ARG(const QString&, QString::fromStdString(s)));
} }
} }
} }
} }
//Upon finishing, or having nothing to do, rest. //Upon finishing, or having nothing to do, rest.
if (ProcessState() == ACCUM_DONE) if (ProcessState() == ACCUM_DONE)
QThread::msleep(1); QThread::msleep(1);
//QApplication::processEvents();
//QApplication::processEvents();
m_Rendering = false; m_Rendering = false;
return success; return success;
} }
@ -536,7 +527,6 @@ bool FractoriumEmberController<T>::CreateRenderer(eRendererType renderType, cons
{ {
EmberReport emberReport; EmberReport emberReport;
vector<string> errorReport; vector<string> errorReport;
DeleteRenderer();//Delete the renderer and refresh the textures. DeleteRenderer();//Delete the renderer and refresh the textures.
//Before starting, must take care of allocations. //Before starting, must take care of allocations.
gl->Allocate(true);//Forcing a realloc of the texture is necessary on AMD, but not on nVidia. gl->Allocate(true);//Forcing a realloc of the texture is necessary on AMD, but not on nVidia.
@ -564,7 +554,6 @@ bool FractoriumEmberController<T>::CreateRenderer(eRendererType renderType, cons
if (m_RenderType == OPENCL_RENDERER) if (m_RenderType == OPENCL_RENDERER)
{ {
auto val = 30 * m_Fractorium->m_Settings->Devices().size(); auto val = 30 * m_Fractorium->m_Settings->Devices().size();
m_Fractorium->m_QualitySpin->DoubleClickZero(val); m_Fractorium->m_QualitySpin->DoubleClickZero(val);
m_Fractorium->m_QualitySpin->DoubleClickNonZero(val); m_Fractorium->m_QualitySpin->DoubleClickNonZero(val);
@ -588,14 +577,14 @@ bool FractoriumEmberController<T>::CreateRenderer(eRendererType renderType, cons
m_Renderer->YAxisUp(s->YAxisUp()); m_Renderer->YAxisUp(s->YAxisUp());
m_Renderer->ThreadCount(s->ThreadCount()); m_Renderer->ThreadCount(s->ThreadCount());
m_Renderer->Transparency(s->Transparency()); m_Renderer->Transparency(s->Transparency());
if (m_Renderer->RendererType() == CPU_RENDERER) if (m_Renderer->RendererType() == CPU_RENDERER)
m_Renderer->InteractiveFilter(s->CpuDEFilter() ? FILTER_DE : FILTER_LOG); m_Renderer->InteractiveFilter(s->CpuDEFilter() ? FILTER_DE : FILTER_LOG);
else else
m_Renderer->InteractiveFilter(s->OpenCLDEFilter() ? FILTER_DE : FILTER_LOG); m_Renderer->InteractiveFilter(s->OpenCLDEFilter() ? FILTER_DE : FILTER_LOG);
if ((m_Renderer->EarlyClip() != m_PreviewRenderer->EarlyClip()) || if ((m_Renderer->EarlyClip() != m_PreviewRenderer->EarlyClip()) ||
(m_Renderer->YAxisUp() != m_PreviewRenderer->YAxisUp())) (m_Renderer->YAxisUp() != m_PreviewRenderer->YAxisUp()))
{ {
StopPreviewRender(); StopPreviewRender();
m_PreviewRenderer->EarlyClip(m_Renderer->EarlyClip()); m_PreviewRenderer->EarlyClip(m_Renderer->EarlyClip());
@ -635,9 +624,9 @@ void Fractorium::ShutdownAndRecreateFromOptions()
bool Fractorium::CreateRendererFromOptions() bool Fractorium::CreateRendererFromOptions()
{ {
bool ok = true; 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()); auto v = Devices(m_Settings->Devices());
//The most important option to process is what kind of renderer is desired, so do it first. //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)) if (!m_Controller->CreateRenderer((useOpenCL && !v.empty()) ? OPENCL_RENDERER : CPU_RENDERER, v))
{ {
@ -660,13 +649,12 @@ bool Fractorium::CreateRendererFromOptions()
bool Fractorium::CreateControllerFromOptions() bool Fractorium::CreateControllerFromOptions()
{ {
bool ok = true; bool ok = true;
size_t elementSize = size_t elementSize =
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
m_Settings->Double() ? sizeof(double) : m_Settings->Double() ? sizeof(double) :
#endif #endif
sizeof(float); sizeof(float);
if (!m_Controller.get() || (m_Controller->SizeOfT() != elementSize)) if (!m_Controller.get() || (m_Controller->SizeOfT() != elementSize))
{ {
double hue = m_PaletteHueSpin->value(); double hue = m_PaletteHueSpin->value();
@ -690,11 +678,9 @@ bool Fractorium::CreateControllerFromOptions()
if (m_Controller.get()) if (m_Controller.get())
{ {
m_Controller->CopyTempPalette(tempPalette);//Convert float to double or save double verbatim; 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 //Replace below with this once LLVM fixes a crash in their compiler with default lambda parameters.//TODO
//m_Controller->CopyEmber(ed); //m_Controller->CopyEmber(ed);
//m_Controller->CopyEmberFile(efd); //m_Controller->CopyEmberFile(efd);
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
m_Controller->CopyEmber(ed, [&](Ember<double>& ember) { }); m_Controller->CopyEmber(ed, [&](Ember<double>& ember) { });
m_Controller->CopyEmberFile(efd, [&](Ember<double>& ember) { }); m_Controller->CopyEmberFile(efd, [&](Ember<double>& ember) { });
@ -706,6 +692,7 @@ bool Fractorium::CreateControllerFromOptions()
} }
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
if (m_Settings->Double()) if (m_Settings->Double())
m_Controller = unique_ptr<FractoriumEmberControllerBase>(new FractoriumEmberController<double>(this)); m_Controller = unique_ptr<FractoriumEmberControllerBase>(new FractoriumEmberController<double>(this));
else 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. 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->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); m_Controller->SetEmberFile(efd);
//Setting these and updating the GUI overwrites the work of clearing them done in SetEmber() above. //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. //It's a corner case, but doesn't seem to matter.
m_PaletteHueSpin->SetValueStealth(hue); m_PaletteHueSpin->SetValueStealth(hue);
@ -728,7 +714,6 @@ bool Fractorium::CreateControllerFromOptions()
m_PaletteBlurSpin->SetValueStealth(blur); m_PaletteBlurSpin->SetValueStealth(blur);
m_PaletteFrequencySpin->SetValueStealth(freq); 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. 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 //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. //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. //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<float>; template class FractoriumEmberController<float>;
#ifdef DO_DOUBLE #ifdef DO_DOUBLE
template class FractoriumEmberController<double>; template class FractoriumEmberController<double>;
#endif #endif

View File

@ -10,11 +10,9 @@ void Fractorium::InitToolbarUI()
auto clGroup = new QActionGroup(this); auto clGroup = new QActionGroup(this);
clGroup->addAction(ui.ActionCpu); clGroup->addAction(ui.ActionCpu);
clGroup->addAction(ui.ActionCL); clGroup->addAction(ui.ActionCL);
auto spGroup = new QActionGroup(this); auto spGroup = new QActionGroup(this);
spGroup->addAction(ui.ActionSP); spGroup->addAction(ui.ActionSP);
spGroup->addAction(ui.ActionDP); spGroup->addAction(ui.ActionDP);
SyncOptionsToToolbar(); SyncOptionsToToolbar();
connect(ui.ActionCpu, SIGNAL(triggered(bool)), this, SLOT(OnActionCpu(bool)), Qt::QueuedConnection); connect(ui.ActionCpu, SIGNAL(triggered(bool)), this, SLOT(OnActionCpu(bool)), Qt::QueuedConnection);
connect(ui.ActionCL, SIGNAL(triggered(bool)), this, SLOT(OnActionCL(bool)), Qt::QueuedConnection); connect(ui.ActionCL, SIGNAL(triggered(bool)), this, SLOT(OnActionCL(bool)), Qt::QueuedConnection);
@ -90,7 +88,7 @@ void Fractorium::OnActionStyle(bool checked)
/// </summary> /// </summary>
void Fractorium::SyncOptionsToToolbar() void Fractorium::SyncOptionsToToolbar()
{ {
static bool openCL = !OpenCLInfo::Instance().Devices().empty(); static bool openCL = !m_Info->Devices().empty();
if (!openCL) if (!openCL)
{ {

View File

@ -9,36 +9,30 @@
/// <param name="p">The parent widget. Default: nullptr.</param> /// <param name="p">The parent widget. Default: nullptr.</param>
/// <param name="f">The window flags. Default: 0.</param> /// <param name="f">The window flags. Default: 0.</param>
FractoriumOptionsDialog::FractoriumOptionsDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f) FractoriumOptionsDialog::FractoriumOptionsDialog(FractoriumSettings* settings, QWidget* p, Qt::WindowFlags f)
: QDialog(p, f), : QDialog(p, f)
m_Info(OpenCLInfo::Instance())
{ {
int i, row = 0, spinHeight = 20; int i, row = 0, spinHeight = 20;
ui.setupUi(this); ui.setupUi(this);
m_Settings = settings; m_Settings = settings;
m_Info = OpenCLInfo::Instance();
QTableWidget* table = ui.OptionsXmlSavingTable; QTableWidget* table = ui.OptionsXmlSavingTable;
ui.ThreadCountSpin->setRange(1, Timing::ProcessorCount()); ui.ThreadCountSpin->setRange(1, Timing::ProcessorCount());
connect(ui.OpenCLCheckBox, SIGNAL(stateChanged(int)), this, SLOT(OnOpenCLCheckBoxStateChanged(int)), Qt::QueuedConnection); 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); connect(ui.DeviceTable, SIGNAL(cellChanged(int, int)), this, SLOT(OnDeviceTableCellChanged(int, int)), Qt::QueuedConnection);
SetupSpinner<SpinBox, int>(table, this, row, 1, m_XmlTemporalSamplesSpin, spinHeight, 1, 1000, 100, "", "", true, 1000); SetupSpinner<SpinBox, int>(table, this, row, 1, m_XmlTemporalSamplesSpin, spinHeight, 1, 1000, 100, "", "", true, 1000);
SetupSpinner<SpinBox, int>(table, this, row, 1, m_XmlQualitySpin, spinHeight, 1, 200000, 50, "", "", true, 1000); SetupSpinner<SpinBox, int>(table, this, row, 1, m_XmlQualitySpin, spinHeight, 1, 200000, 50, "", "", true, 1000);
SetupSpinner<SpinBox, int>(table, this, row, 1, m_XmlSupersampleSpin, spinHeight, 1, 4, 1, "", "", true, 2); SetupSpinner<SpinBox, int>(table, this, row, 1, m_XmlSupersampleSpin, spinHeight, 1, 4, 1, "", "", true, 2);
m_IdEdit = new QLineEdit(ui.OptionsIdentityTable); m_IdEdit = new QLineEdit(ui.OptionsIdentityTable);
ui.OptionsIdentityTable->setCellWidget(0, 1, m_IdEdit); ui.OptionsIdentityTable->setCellWidget(0, 1, m_IdEdit);
m_UrlEdit = new QLineEdit(ui.OptionsIdentityTable); m_UrlEdit = new QLineEdit(ui.OptionsIdentityTable);
ui.OptionsIdentityTable->setCellWidget(1, 1, m_UrlEdit); ui.OptionsIdentityTable->setCellWidget(1, 1, m_UrlEdit);
m_NickEdit = new QLineEdit(ui.OptionsIdentityTable); m_NickEdit = new QLineEdit(ui.OptionsIdentityTable);
ui.OptionsIdentityTable->setCellWidget(2, 1, m_NickEdit); ui.OptionsIdentityTable->setCellWidget(2, 1, m_NickEdit);
table = ui.DeviceTable; table = ui.DeviceTable;
table->clearContents(); table->clearContents();
table->setRowCount(0); table->setRowCount(0);
if (m_Info.Ok() && !m_Info.Devices().empty()) if (m_Info->Ok() && !m_Info->Devices().empty())
{ {
SetupDeviceTable(table, m_Settings->Devices()); SetupDeviceTable(table, m_Settings->Devices());
@ -122,7 +116,6 @@ void FractoriumOptionsDialog::OnDeviceTableRadioToggled(bool checked)
void FractoriumOptionsDialog::OnOpenCLCheckBoxStateChanged(int state) void FractoriumOptionsDialog::OnOpenCLCheckBoxStateChanged(int state)
{ {
bool checked = state == Qt::Checked; bool checked = state == Qt::Checked;
ui.DeviceTable->setEnabled(checked); ui.DeviceTable->setEnabled(checked);
ui.ThreadCountSpin->setEnabled(!checked); ui.ThreadCountSpin->setEnabled(!checked);
ui.CpuSubBatchSpin->setEnabled(!checked); ui.CpuSubBatchSpin->setEnabled(!checked);
@ -186,13 +179,11 @@ void FractoriumOptionsDialog::GuiToData()
m_Settings->CpuDEFilter(ui.CpuFilteringDERadioButton->isChecked()); m_Settings->CpuDEFilter(ui.CpuFilteringDERadioButton->isChecked());
m_Settings->OpenCLDEFilter(ui.OpenCLFilteringDERadioButton->isChecked()); m_Settings->OpenCLDEFilter(ui.OpenCLFilteringDERadioButton->isChecked());
m_Settings->Devices(DeviceTableToSettings(ui.DeviceTable)); m_Settings->Devices(DeviceTableToSettings(ui.DeviceTable));
//Xml saving. //Xml saving.
m_Settings->XmlTemporalSamples(m_XmlTemporalSamplesSpin->value()); m_Settings->XmlTemporalSamples(m_XmlTemporalSamplesSpin->value());
m_Settings->XmlQuality(m_XmlQualitySpin->value()); m_Settings->XmlQuality(m_XmlQualitySpin->value());
m_Settings->XmlSupersample(m_XmlSupersampleSpin->value()); m_Settings->XmlSupersample(m_XmlSupersampleSpin->value());
m_Settings->SaveAutoUnique(AutoUnique()); m_Settings->SaveAutoUnique(AutoUnique());
//Identity. //Identity.
m_Settings->Id(m_IdEdit->text()); m_Settings->Id(m_IdEdit->text());
m_Settings->Url(m_UrlEdit->text()); m_Settings->Url(m_UrlEdit->text());
@ -206,7 +197,6 @@ void FractoriumOptionsDialog::DataToGui()
{ {
//Interactive rendering. //Interactive rendering.
auto devices = m_Settings->Devices(); auto devices = m_Settings->Devices();
ui.EarlyClipCheckBox->setChecked(m_Settings->EarlyClip()); ui.EarlyClipCheckBox->setChecked(m_Settings->EarlyClip());
ui.YAxisUpCheckBox->setChecked(m_Settings->YAxisUp()); ui.YAxisUpCheckBox->setChecked(m_Settings->YAxisUp());
ui.TransparencyCheckBox->setChecked(m_Settings->Transparency()); ui.TransparencyCheckBox->setChecked(m_Settings->Transparency());
@ -235,7 +225,6 @@ void FractoriumOptionsDialog::DataToGui()
m_XmlQualitySpin->setValue(m_Settings->XmlQuality()); m_XmlQualitySpin->setValue(m_Settings->XmlQuality());
m_XmlSupersampleSpin->setValue(m_Settings->XmlSupersample()); m_XmlSupersampleSpin->setValue(m_Settings->XmlSupersample());
ui.AutoUniqueCheckBox->setChecked(m_Settings->SaveAutoUnique()); ui.AutoUniqueCheckBox->setChecked(m_Settings->SaveAutoUnique());
//Identity. //Identity.
m_IdEdit->setText(m_Settings->Id()); m_IdEdit->setText(m_Settings->Id());
m_UrlEdit->setText(m_Settings->Url()); m_UrlEdit->setText(m_Settings->Url());

View File

@ -52,7 +52,7 @@ private:
void GuiToData(); void GuiToData();
Ui::OptionsDialog ui; Ui::OptionsDialog ui;
OpenCLInfo& m_Info; shared_ptr<OpenCLInfo> m_Info;
SpinBox* m_XmlTemporalSamplesSpin; SpinBox* m_XmlTemporalSamplesSpin;
SpinBox* m_XmlQualitySpin; SpinBox* m_XmlQualitySpin;
SpinBox* m_XmlSupersampleSpin; SpinBox* m_XmlSupersampleSpin;